Unify protocol types and modes

This commit is contained in:
weishu
2026-01-03 14:43:59 +08:00
parent bfca058967
commit e2028b6914
20 changed files with 360 additions and 393 deletions
@@ -1,3 +1,4 @@
import { getPermissionModesForFlavor, MODEL_MODE_LABELS, MODEL_MODES, PERMISSION_MODE_LABELS } from '@hapi/protocol'
import { ComposerPrimitive, useAssistantApi, useAssistantState } from '@assistant-ui/react'
import {
type ChangeEvent as ReactChangeEvent,
@@ -26,25 +27,6 @@ export interface TextInputState {
selection: { start: number; end: number }
}
const CLAUDE_PERMISSION_MODES = ['default', 'acceptEdits', 'plan', 'bypassPermissions'] as const
const CODEX_PERMISSION_MODES = ['default', 'read-only', 'safe-yolo', 'yolo'] as const
const PERMISSION_MODE_LABELS: Record<string, string> = {
default: 'Default',
acceptEdits: 'Accept Edits',
plan: 'Plan Mode',
bypassPermissions: 'Yolo',
'read-only': 'Read Only',
'safe-yolo': 'Safe Yolo',
yolo: 'Yolo'
}
const MODEL_MODES = ['default', 'sonnet', 'opus'] as const
const MODEL_MODE_LABELS: Record<string, string> = {
default: 'Default',
sonnet: 'Sonnet',
opus: 'Opus'
}
const defaultSuggestionHandler = async (): Promise<Suggestion[]> => []
export function HappyComposer(props: {
@@ -225,15 +207,10 @@ export function HappyComposer(props: {
}
}, [switchDisabled, onSwitchToRemote, haptic])
const permissionModes = useMemo(() => {
if (agentFlavor === 'codex') {
return CODEX_PERMISSION_MODES as readonly PermissionMode[]
}
if (agentFlavor === 'gemini') {
return [] as readonly PermissionMode[]
}
return CLAUDE_PERMISSION_MODES as readonly PermissionMode[]
}, [agentFlavor])
const permissionModes = useMemo(
() => getPermissionModesForFlavor(agentFlavor),
[agentFlavor]
)
const handleKeyDown = useCallback((e: ReactKeyboardEvent<HTMLTextAreaElement>) => {
const key = e.key
+12 -19
View File
@@ -1,17 +1,8 @@
import { PERMISSION_MODE_LABELS } from '@hapi/protocol'
import { useMemo } from 'react'
import type { AgentState, ModelMode, PermissionMode } from '@/types/api'
import { getContextBudgetTokens } from '@/chat/modelConfig'
const PERMISSION_MODE_LABELS: Record<string, string> = {
default: 'Default',
acceptEdits: 'Accept Edits',
plan: 'Plan Mode',
bypassPermissions: 'Yolo',
'read-only': 'Read Only',
'safe-yolo': 'Safe Yolo',
yolo: 'Yolo'
}
// Vibing messages for thinking state
const VIBING_MESSAGES = [
"Accomplishing", "Actioning", "Actualizing", "Baking", "Booping", "Brewing",
@@ -112,9 +103,11 @@ export function StatusBar(props: {
)
const permissionMode = props.permissionMode
const shouldShowPermissionMode = props.agentFlavor !== 'gemini'
const displayPermissionMode = props.agentFlavor !== 'gemini'
&& permissionMode
&& permissionMode !== 'default'
? permissionMode
: null
return (
<div className="flex items-center justify-between px-2 pb-1">
@@ -134,17 +127,17 @@ export function StatusBar(props: {
) : null}
</div>
{shouldShowPermissionMode ? (
{displayPermissionMode ? (
<span className={`text-xs ${
permissionMode === 'acceptEdits' ? 'text-amber-500' :
permissionMode === 'bypassPermissions' ? 'text-red-500' :
permissionMode === 'plan' ? 'text-blue-500' :
permissionMode === 'read-only' ? 'text-amber-500' :
permissionMode === 'safe-yolo' ? 'text-amber-500' :
permissionMode === 'yolo' ? 'text-red-500' :
displayPermissionMode === 'acceptEdits' ? 'text-amber-500' :
displayPermissionMode === 'bypassPermissions' ? 'text-red-500' :
displayPermissionMode === 'plan' ? 'text-blue-500' :
displayPermissionMode === 'read-only' ? 'text-amber-500' :
displayPermissionMode === 'safe-yolo' ? 'text-amber-500' :
displayPermissionMode === 'yolo' ? 'text-red-500' :
'text-[var(--app-hint)]'
}`}>
{PERMISSION_MODE_LABELS[permissionMode]}
{PERMISSION_MODE_LABELS[displayPermissionMode]}
</span>
) : null}
</div>