@rzx/ohs 0.1.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,65 +1,65 @@
1
1
  {
2
2
  "version": 3,
3
- "sources": ["..\\..\\..\\frontend\\src\\theme\\builtinThemes.ts", "..\\..\\..\\..\\packages\\protocol\\src\\session.ts", "..\\..\\..\\..\\packages\\protocol\\src\\runtime-config.ts", "..\\..\\..\\..\\packages\\protocol\\src\\serialization.ts", "..\\..\\..\\..\\packages\\protocol\\src\\attachment.ts", "..\\..\\..\\..\\packages\\protocol\\src\\capabilities.ts", "..\\..\\..\\..\\packages\\protocol\\src\\index.ts", "..\\..\\..\\..\\packages\\client\\src\\transport\\http-client.ts", "..\\..\\..\\..\\packages\\client\\src\\transport\\index.ts", "..\\..\\..\\..\\packages\\client\\src\\state\\reducer.ts", "..\\..\\..\\..\\packages\\client\\src\\state\\selectors.ts", "..\\..\\..\\..\\packages\\client\\src\\state\\sync.ts", "..\\..\\..\\..\\packages\\client\\src\\state\\index.ts", "..\\..\\..\\..\\packages\\client\\src\\commands\\session-commands.ts", "..\\..\\..\\..\\packages\\client\\src\\commands\\index.ts", "..\\..\\..\\..\\packages\\client\\src\\index.ts", "..\\..\\..\\frontend\\src\\jobs\\job-remote-state.ts", "..\\..\\..\\frontend\\src\\hooks\\transcript.ts", "..\\..\\..\\frontend\\src\\hooks\\sessionSlashCommands.ts", "..\\..\\..\\frontend\\src\\hooks\\useServerSync.ts", "..\\..\\..\\frontend\\src\\ui\\constants.ts", "..\\..\\..\\frontend\\src\\hooks\\useEscToCancel.ts", "..\\..\\..\\frontend\\src\\theme\\ThemeContext.tsx", "..\\..\\..\\frontend\\src\\ui\\fuzzy.ts", "..\\..\\..\\frontend\\src\\hooks\\useListNavigation.ts", "..\\..\\..\\frontend\\src\\ui\\DialogSelect.tsx", "..\\..\\..\\frontend\\src\\ui\\DialogText.tsx", "..\\..\\..\\frontend\\src\\components\\dialogs\\DiffView.tsx", "..\\..\\..\\frontend\\src\\components\\dialogs\\PermissionDialog.tsx", "..\\..\\..\\frontend\\src\\components\\dialogs\\QuestionDialog.tsx", "..\\..\\..\\frontend\\src\\hooks\\useModalWiring.tsx", "..\\..\\..\\frontend\\src\\ui\\DialogContext.tsx", "..\\..\\..\\frontend\\src\\ui\\Toast.tsx", "..\\..\\..\\frontend\\src\\ui\\ModelPickerDialog.tsx", "..\\..\\..\\frontend\\src\\keymap\\commands.ts", "..\\..\\..\\frontend\\src\\keymap\\permissionModes.ts", "..\\..\\..\\frontend\\src\\components\\Logo.tsx", "..\\..\\..\\frontend\\src\\routes\\Home.tsx", "..\\..\\..\\frontend\\src\\theme\\syntax.ts", "..\\..\\..\\frontend\\src\\components\\messages\\ToolDiff.tsx", "..\\..\\..\\frontend\\src\\routes\\session\\parts.tsx", "..\\..\\..\\frontend\\src\\routes\\session\\Session.tsx", "..\\..\\..\\frontend\\src\\routes\\session\\Sidebar.tsx", "..\\..\\..\\frontend\\src\\services\\status.ts", "..\\..\\..\\frontend\\src\\routes\\session\\Footer.tsx", "..\\..\\..\\frontend\\src\\components\\prompt\\Autocomplete.tsx", "..\\..\\..\\frontend\\src\\services\\frecency.ts", "..\\..\\..\\frontend\\src\\ui\\commandRanking.ts", "..\\..\\..\\frontend\\src\\components\\prompt\\fileCompletion.ts", "..\\..\\..\\frontend\\src\\components\\prompt\\Prompt.tsx", "..\\..\\..\\frontend\\src\\routes\\session\\AppView.tsx", "..\\..\\..\\frontend\\src\\components\\JobsPanel.tsx", "..\\..\\..\\frontend\\src\\utils\\selection.ts", "..\\..\\..\\frontend\\src\\App.tsx", "..\\..\\..\\frontend\\src\\index.tsx", "..\\..\\..\\frontend\\src\\runtime.ts"],
3
+ "sources": ["../../../frontend/src/theme/builtinThemes.ts", "../../../../packages/protocol/src/session.ts", "../../../../packages/protocol/src/runtime-config.ts", "../../../../packages/protocol/src/serialization.ts", "../../../../packages/protocol/src/attachment.ts", "../../../../packages/protocol/src/capabilities.ts", "../../../../packages/protocol/src/index.ts", "../../../../packages/client/src/transport/http-client.ts", "../../../../packages/client/src/transport/index.ts", "../../../../packages/client/src/state/reducer.ts", "../../../../packages/client/src/state/selectors.ts", "../../../../packages/client/src/state/sync.ts", "../../../../packages/client/src/state/index.ts", "../../../../packages/client/src/commands/session-commands.ts", "../../../../packages/client/src/commands/index.ts", "../../../../packages/client/src/index.ts", "../../../frontend/src/jobs/job-remote-state.ts", "../../../frontend/src/hooks/transcript.ts", "../../../frontend/src/hooks/sessionSlashCommands.ts", "../../../frontend/src/hooks/useServerSync.ts", "../../../frontend/src/ui/constants.ts", "../../../frontend/src/hooks/useEscToCancel.ts", "../../../frontend/src/theme/ThemeContext.tsx", "../../../frontend/src/ui/fuzzy.ts", "../../../frontend/src/hooks/useListNavigation.ts", "../../../frontend/src/ui/DialogSelect.tsx", "../../../frontend/src/ui/DialogText.tsx", "../../../frontend/src/components/dialogs/DiffView.tsx", "../../../frontend/src/components/dialogs/PermissionDialog.tsx", "../../../frontend/src/components/dialogs/QuestionDialog.tsx", "../../../frontend/src/hooks/useModalWiring.tsx", "../../../frontend/src/ui/DialogContext.tsx", "../../../frontend/src/ui/Toast.tsx", "../../../frontend/src/ui/ModelPickerDialog.tsx", "../../../frontend/src/keymap/commands.ts", "../../../frontend/src/keymap/permissionModes.ts", "../../../frontend/src/components/Logo.tsx", "../../../frontend/src/routes/Home.tsx", "../../../frontend/src/theme/syntax.ts", "../../../frontend/src/components/messages/ToolDiff.tsx", "../../../frontend/src/routes/session/parts.tsx", "../../../frontend/src/routes/session/Session.tsx", "../../../frontend/src/routes/session/Sidebar.tsx", "../../../frontend/src/services/status.ts", "../../../frontend/src/routes/session/Footer.tsx", "../../../frontend/src/components/prompt/Autocomplete.tsx", "../../../frontend/src/services/frecency.ts", "../../../frontend/src/ui/commandRanking.ts", "../../../frontend/src/components/prompt/fileCompletion.ts", "../../../frontend/src/components/prompt/Prompt.tsx", "../../../frontend/src/routes/session/AppView.tsx", "../../../frontend/src/components/JobsPanel.tsx", "../../../frontend/src/utils/selection.ts", "../../../frontend/src/App.tsx", "../../../frontend/src/index.tsx", "../../../frontend/src/runtime.ts"],
4
4
  "sourcesContent": [
5
- "export type ThemeConfig = {\r\n name: string;\r\n colors: {\r\n primary: string;\r\n secondary: string;\r\n accent: string;\r\n foreground: string;\r\n background: string;\r\n backgroundPanel: string;\r\n backgroundPrompt: string;\r\n muted: string;\r\n success: string;\r\n warning: string;\r\n error: string;\r\n info: string;\r\n };\r\n icons: {\r\n spinner: string[];\r\n tool: string;\r\n assistant: string;\r\n user: string;\r\n system: string;\r\n success: string;\r\n error: string;\r\n };\r\n};\r\n\r\n/** One Dark — default dark theme */\r\nexport const defaultTheme: ThemeConfig = {\r\n name: \"default\",\r\n colors: {\r\n primary: \"#56b6c2\",\r\n secondary: \"#abb2bf\",\r\n accent: \"#61afef\",\r\n foreground: \"#abb2bf\",\r\n background: \"#000000\",\r\n backgroundPanel: \"#262a33\",\r\n backgroundPrompt: \"#262626\",\r\n muted: \"#5c6370\",\r\n success: \"#98c379\",\r\n warning: \"#e5c07b\",\r\n error: \"#e06c75\",\r\n info: \"#61afef\",\r\n },\r\n icons: {\r\n spinner: [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"],\r\n tool: \" ⏵ \",\r\n assistant: \"⏺ \",\r\n user: \"> \",\r\n system: \"ℹ \",\r\n success: \"✓ \",\r\n error: \"✗ \",\r\n },\r\n};\r\n\r\n/** GitHub Light — bright theme */\r\nexport const lightTheme: ThemeConfig = {\r\n name: \"light\",\r\n colors: {\r\n primary: \"#0550ae\",\r\n secondary: \"#24292f\",\r\n accent: \"#0969da\",\r\n foreground: \"#24292f\",\r\n background: \"#ffffff\",\r\n backgroundPanel: \"#f6f8fa\",\r\n backgroundPrompt: \"#f3f4f6\",\r\n muted: \"#6e7781\",\r\n success: \"#1a7f37\",\r\n warning: \"#9a6700\",\r\n error: \"#cf222e\",\r\n info: \"#0969da\",\r\n },\r\n icons: {\r\n spinner: [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"],\r\n tool: \" ⏵ \",\r\n assistant: \"⏺ \",\r\n user: \"> \",\r\n system: \"ℹ \",\r\n success: \"✓ \",\r\n error: \"✗ \",\r\n },\r\n};\r\n\r\n/** Dracula — high-contrast dark theme */\r\nexport const draculaTheme: ThemeConfig = {\r\n name: \"dracula\",\r\n colors: {\r\n primary: \"#bd93f9\",\r\n secondary: \"#f8f8f2\",\r\n accent: \"#8be9fd\",\r\n foreground: \"#f8f8f2\",\r\n background: \"#282a36\",\r\n backgroundPanel: \"#343746\",\r\n backgroundPrompt: \"#2f313d\",\r\n muted: \"#6272a4\",\r\n success: \"#50fa7b\",\r\n warning: \"#ffb86c\",\r\n error: \"#ff5555\",\r\n info: \"#8be9fd\",\r\n },\r\n icons: {\r\n spinner: [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"],\r\n tool: \" ⏵ \",\r\n assistant: \"⏺ \",\r\n user: \"> \",\r\n system: \"ℹ \",\r\n success: \"✓ \",\r\n error: \"✗ \",\r\n },\r\n};\r\n\r\nexport const BUILTIN_THEMES: Record<string, ThemeConfig> = {\r\n default: defaultTheme,\r\n light: lightTheme,\r\n dracula: draculaTheme,\r\n};\r\n\r\nexport function getTheme(name: string): ThemeConfig {\r\n return BUILTIN_THEMES[name] ?? defaultTheme;\r\n}\r\n",
6
- "/**\r\n * `closing` 表示 Session 正在停止当前工作并等待资源释放,此时不再接收新工作。\r\n * 等待结束后,Session 会进入不可逆的 archived 状态。\r\n */\r\nexport type SessionStatus =\r\n \"idle\" | \"running\" | \"closing\" | \"archived\" | \"error\";\r\nexport type InputDelivery = \"queue\" | \"steer\";\r\nexport type RunStatus =\r\n \"pending\" | \"running\" | \"completed\" | \"failed\" | \"interrupted\";\r\nexport type RunAttemptStatus = \"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\";\r\nexport type SessionTaskStatus =\r\n \"pending\" | \"running\" | \"completed\" | \"failed\" | \"stopped\" | \"interrupted\";\r\nexport type PermissionStatus = \"pending\" | \"approved\" | \"denied\" | \"expired\";\r\nexport type SessionMessageRole = \"system\" | \"user\" | \"assistant\";\r\nexport type SessionMessagePartType =\r\n | \"text\"\r\n | \"attachment\"\r\n | \"transformation\"\r\n | \"reasoning\"\r\n | \"tool\"\r\n | \"tool_result\"\r\n | \"error\"\r\n | \"log\";\r\nexport type SessionMessagePartStatus =\r\n \"pending\" | \"running\" | \"completed\" | \"failed\" | \"interrupted\";\r\nexport type ProjectionSettlementAction = \"retry-terminal-projection\" | \"compensate-child\";\r\nexport type ProjectionSettlementStatus = \"pending\" | \"retrying\" | \"resolved\" | \"abandoned\";\n\n/** A user explicitly selected a skill before submitting a normal prompt. */\nexport interface SkillInvocationMetadata {\n name: string;\n commandName?: string;\n displayName?: string;\n source?: \"bundled\" | \"user\" | \"project\" | \"plugin\";\n invocationSource: \"slash\";\n}\n\r\n/** Current durable session-event envelope version. Payload versions are added by the event registry. */\r\nexport const SESSION_EVENT_SCHEMA_VERSION = 1;\r\n\r\nexport interface SessionRecord {\r\n id: string;\r\n parentId?: string;\r\n projectId?: string;\r\n cwd: string;\r\n cwdRelative?: string;\r\n title: string;\r\n model: string;\r\n agent?: string;\r\n status: SessionStatus;\r\n metadata: Record<string, unknown>;\r\n createdAt: number;\r\n updatedAt: number;\r\n archivedAt?: number;\r\n}\r\n\r\nexport interface ProjectRecord {\r\n id: string;\r\n name: string;\r\n path: string;\r\n pinnedAt?: number;\r\n defaultShell?: string;\r\n lastOpenedAt: number;\r\n archivedAt?: number;\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface ProjectLocationRecord {\r\n id: string;\r\n projectId: string;\r\n path: string;\r\n normalizedPath: string;\r\n status: \"active\" | \"historical\";\r\n boundAt: number;\r\n lastVerifiedAt?: number;\r\n}\r\n\r\nexport interface SessionInputRecord {\r\n id: string;\r\n sessionId: string;\r\n seq: number;\r\n delivery: InputDelivery;\r\n content: string;\r\n attachments: SessionInputAttachmentRecord[];\r\n promotedMessageId?: string;\r\n metadata: Record<string, unknown>;\r\n createdAt: number;\r\n}\r\n\r\nexport interface SessionMessageRecord {\r\n id: string;\r\n sessionId: string;\r\n seq: number;\r\n role: SessionMessageRole;\r\n runId?: string;\r\n inputId?: string;\r\n metadata: Record<string, unknown>;\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface SessionMessagePartRecord {\r\n id: string;\r\n sessionId: string;\r\n messageId: string;\r\n seq: number;\r\n type: SessionMessagePartType;\r\n status: SessionMessagePartStatus;\r\n text?: string;\r\n toolUseId?: string;\r\n toolName?: string;\r\n input?: Record<string, unknown>;\r\n output?: unknown;\r\n isError?: boolean;\r\n assetId?: string;\r\n intent?: AttachmentIntent;\r\n displayName?: string;\r\n mediaType?: string;\r\n sizeBytes?: number;\r\n kind?: \"direct\" | \"document_extract\" | \"tool_mount\";\r\n representationId?: string;\r\n processor?: string;\r\n transformationError?: string;\r\n metadata: Record<string, unknown>;\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface SessionEventRecord {\r\n id: string;\r\n seq: number;\r\n type: string;\r\n schemaVersion: number;\r\n sessionId?: string;\r\n payload: Record<string, unknown>;\r\n createdAt: number;\r\n}\r\n\r\nexport interface SessionAttachmentMessagePartRecord\r\n extends SessionMessagePartRecord {\r\n type: \"attachment\";\r\n assetId: string;\r\n intent: AttachmentIntent;\r\n displayName: string;\r\n mediaType: string;\r\n sizeBytes: number;\r\n}\r\n\r\nexport interface SessionTransformationMessagePartRecord\r\n extends SessionMessagePartRecord {\r\n type: \"transformation\";\r\n assetId: string;\r\n kind: \"direct\" | \"document_extract\" | \"tool_mount\";\r\n representationId?: string;\r\n processor?: string;\r\n transformationError?: string;\r\n}\r\n\r\nexport interface ProjectionSettlementRecord {\r\n id: string;\r\n projector: string;\r\n rootSessionId: string;\r\n eventSequence: number;\r\n action: ProjectionSettlementAction;\r\n payload: Record<string, unknown>;\r\n status: ProjectionSettlementStatus;\r\n attemptCount: number;\r\n lastError?: string;\r\n nextRetryAt?: number;\r\n createdAt: number;\r\n updatedAt: number;\r\n resolvedAt?: number;\r\n}\r\n\r\nexport interface SessionRunRecord {\r\n id: string;\r\n sessionId: string;\r\n inputId?: string;\r\n status: RunStatus;\r\n startedAt?: number;\r\n finishedAt?: number;\r\n error?: string;\r\n metadata: Record<string, unknown>;\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface SessionRunAttemptRecord {\r\n id: string;\r\n runId: string;\r\n sequence: number;\r\n status: RunAttemptStatus;\r\n provider?: string;\r\n model?: string;\r\n retryReason?: string;\r\n errorKind?: string;\r\n error?: string;\r\n inputTokens?: number;\r\n outputTokens?: number;\r\n startedAt?: number;\r\n finishedAt?: number;\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\n/** Daemon-owned execution projection. Live handles stay in their backend runtime and are never persisted. */\r\nexport interface SessionExecutionRecord {\r\n id: string;\r\n sessionId: string;\r\n /** Producer namespace plus requestId uniquely identify one logical admission. */\r\n requestNamespace?: string;\r\n requestId?: string;\r\n childSessionId?: string;\r\n runId?: string;\r\n type: string;\r\n status: SessionTaskStatus;\r\n description: string;\r\n cwd: string;\r\n output?: string;\r\n error?: string;\r\n metadata: Record<string, unknown>;\r\n createdAt: number;\r\n startedAt?: number;\r\n finishedAt?: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface PermissionRequestRecord {\r\n id: string;\r\n sessionId: string;\r\n runId?: string;\r\n toolName: string;\r\n payload: Record<string, unknown>;\r\n status: PermissionStatus;\r\n decision?: string;\r\n decidedByClientId?: string;\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\n/** Atomic, server-owned state used when a client attaches to one session. */\r\nexport interface SessionStateSnapshot {\r\n cursor: number;\r\n session: SessionRecord;\r\n inputs: SessionInputRecord[];\r\n messages: SessionMessageRecord[];\r\n parts: SessionMessagePartRecord[];\r\n runs: SessionRunRecord[];\r\n attempts: SessionRunAttemptRecord[];\r\n tasks?: SessionExecutionRecord[];\r\n permissions: PermissionRequestRecord[];\r\n}\r\n\r\nexport type ScheduledTaskStatus = \"active\" | \"paused\" | \"completed\";\r\nexport type ScheduledTaskDestination = \"standalone\" | \"chat\";\r\nexport type ScheduledTaskExecutionMode = \"local\" | \"worktree\";\r\nexport type ScheduledRecurrenceFormat = \"rrule\" | \"once\";\r\nexport type ScheduledOverlapPolicy = \"skip\" | \"queue\";\r\nexport type ScheduledMissedRunPolicy = \"skip\" | \"run_once\";\r\n\r\nexport interface ScheduledPermissionProfile {\r\n mode: \"read_only\" | \"workspace_write\" | \"full_access\";\r\n network?: boolean;\r\n allowedTools?: string[];\r\n deniedTools?: string[];\r\n}\r\n\r\nexport interface ScheduledStopPolicy {\r\n runOnce?: boolean;\r\n maxRuns?: number;\r\n stopWhenCompleted?: boolean;\r\n expiresAt?: number;\r\n}\r\n\r\nexport interface ScheduledTaskRecord {\r\n id: string;\r\n name: string;\r\n description?: string;\r\n prompt: string;\r\n recurrence: string;\r\n recurrenceFormat: ScheduledRecurrenceFormat;\r\n timezone: string;\r\n status: ScheduledTaskStatus;\r\n destination: ScheduledTaskDestination;\r\n sessionId?: string;\r\n projectPaths: string[];\r\n executionMode: ScheduledTaskExecutionMode;\r\n model?: string;\r\n effort?: string;\r\n skillNames: string[];\r\n pluginNames: string[];\r\n permissionProfile: ScheduledPermissionProfile;\r\n overlapPolicy: ScheduledOverlapPolicy;\r\n missedRunPolicy: ScheduledMissedRunPolicy;\r\n stopPolicy?: ScheduledStopPolicy;\r\n createdBy: \"user\" | \"agent\" | \"migration\";\r\n createdFromSessionId?: string;\r\n lastRunAt?: number;\r\n nextRunAt?: number;\r\n runCount: number;\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport type ScheduledRunCause = \"scheduled\" | \"manual\" | \"missed_run\";\r\nexport type ScheduledRunStatus =\r\n | \"queued\"\r\n | \"running\"\r\n | \"succeeded\"\r\n | \"failed\"\r\n | \"interrupted\"\r\n | \"needs_attention\"\r\n | \"skipped\";\r\n\r\nexport interface ScheduledRunRecord {\r\n id: string;\r\n taskId: string;\r\n cause: ScheduledRunCause;\r\n status: ScheduledRunStatus;\r\n scheduledFor: number;\r\n sessionId?: string;\r\n runId?: string;\r\n summary?: string;\r\n error?: string;\r\n unread: boolean;\r\n attentionReason?: string;\r\n createdAt: number;\r\n startedAt?: number;\r\n finishedAt?: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface CreateScheduledTaskInput {\r\n id?: string;\r\n name: string;\r\n description?: string;\r\n prompt: string;\r\n recurrence: string;\r\n recurrenceFormat: ScheduledRecurrenceFormat;\r\n timezone: string;\r\n status?: ScheduledTaskStatus;\r\n destination: ScheduledTaskDestination;\r\n sessionId?: string;\r\n projectPaths?: string[];\r\n executionMode?: ScheduledTaskExecutionMode;\r\n model?: string;\r\n effort?: string;\r\n skillNames?: string[];\r\n pluginNames?: string[];\r\n permissionProfile?: ScheduledPermissionProfile;\r\n overlapPolicy?: ScheduledOverlapPolicy;\r\n missedRunPolicy?: ScheduledMissedRunPolicy;\r\n stopPolicy?: ScheduledStopPolicy;\r\n createdBy?: ScheduledTaskRecord[\"createdBy\"];\r\n createdFromSessionId?: string;\r\n nextRunAt?: number;\r\n}\r\n\r\nexport type UpdateScheduledTaskInput = Partial<\r\n Omit<CreateScheduledTaskInput, \"id\" | \"nextRunAt\">\r\n> & {\r\n lastRunAt?: number | null;\r\n nextRunAt?: number | null;\r\n runCount?: number;\r\n};\r\n\r\nexport interface CreateScheduledRunInput {\r\n id?: string;\r\n taskId: string;\r\n cause: ScheduledRunCause;\r\n scheduledFor: number;\r\n}\r\n\r\nexport interface UpdateScheduledRunInput {\r\n status?: ScheduledRunStatus;\r\n sessionId?: string;\r\n runId?: string;\r\n summary?: string;\r\n error?: string;\r\n unread?: boolean;\r\n attentionReason?: string;\r\n startedAt?: number;\r\n finishedAt?: number;\r\n}\r\n\r\nexport interface CreateSessionInput {\r\n id?: string;\r\n parentId?: string;\r\n projectId?: string;\r\n cwd: string;\r\n title?: string;\r\n model: string;\r\n agent?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface UpdateSessionInput {\r\n title?: string;\r\n model?: string;\r\n agent?: string | null;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface AdmitPromptInput {\r\n id?: string;\r\n sessionId: string;\r\n delivery?: InputDelivery;\r\n content: string;\r\n attachments?: AdmitPromptAttachmentInput[];\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface AdmitPromptAttachmentInput {\r\n assetId: string;\r\n intent?: AttachmentIntent;\r\n displayName?: string;\r\n}\r\n\r\nexport interface CreateProjectionSettlementInput {\r\n id?: string;\r\n projector: string;\r\n rootSessionId: string;\r\n eventSequence: number;\r\n action: ProjectionSettlementAction;\r\n payload: Record<string, unknown>;\r\n error?: string;\r\n}\r\n\r\nexport interface ListProjectionSettlementsOptions {\r\n projector?: string;\r\n rootSessionId?: string;\r\n status?: ProjectionSettlementStatus | readonly ProjectionSettlementStatus[];\r\n}\r\n\r\nexport interface AdmitPromptWithRunInput {\r\n prompt: AdmitPromptInput;\r\n run?: {\r\n id?: string;\r\n metadata?: Record<string, unknown>;\r\n };\r\n}\r\n\r\nexport interface CreateMessageInput {\r\n id?: string;\r\n sessionId: string;\r\n role: SessionMessageRole;\r\n runId?: string;\r\n inputId?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface ReplaceTranscriptPartInput {\r\n type: SessionMessagePartType;\r\n status?: SessionMessagePartStatus;\r\n text?: string;\r\n toolUseId?: string;\r\n toolName?: string;\r\n input?: Record<string, unknown>;\r\n output?: unknown;\r\n isError?: boolean;\r\n assetId?: string;\r\n intent?: AttachmentIntent;\r\n displayName?: string;\r\n mediaType?: string;\r\n sizeBytes?: number;\r\n kind?: \"direct\" | \"document_extract\" | \"tool_mount\";\r\n representationId?: string;\r\n processor?: string;\r\n transformationError?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface ReplaceTranscriptMessageInput {\r\n role: SessionMessageRole;\r\n parts: ReplaceTranscriptPartInput[];\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface ReplaceTranscriptInput {\r\n sessionId: string;\r\n messages: ReplaceTranscriptMessageInput[];\r\n}\r\n\r\nexport interface UpsertMessagePartInput {\r\n id?: string;\r\n sessionId: string;\r\n messageId: string;\r\n type: SessionMessagePartType;\r\n status?: SessionMessagePartStatus;\r\n text?: string;\r\n toolUseId?: string;\r\n toolName?: string;\r\n input?: Record<string, unknown>;\r\n output?: unknown;\r\n isError?: boolean;\r\n assetId?: string;\r\n intent?: AttachmentIntent;\r\n displayName?: string;\r\n mediaType?: string;\r\n sizeBytes?: number;\r\n kind?: \"direct\" | \"document_extract\" | \"tool_mount\";\r\n representationId?: string;\r\n processor?: string;\r\n transformationError?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface AppendMessagePartDeltaInput {\r\n sessionId: string;\r\n messageId: string;\r\n partId: string;\r\n field: \"text\";\r\n delta: string;\r\n}\r\n\r\nexport interface AppendEventInput {\r\n id?: string;\r\n type: string;\r\n sessionId?: string;\r\n payload?: Record<string, unknown>;\r\n}\r\n\r\nexport interface CreateRunInput {\r\n id?: string;\r\n sessionId: string;\r\n inputId?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface UpdateRunInput {\r\n status?: RunStatus;\r\n error?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface CreateRunAttemptInput {\r\n id?: string;\r\n runId: string;\r\n sequence?: number;\r\n provider?: string;\r\n model?: string;\r\n retryReason?: string;\r\n}\r\n\r\nexport interface UpdateRunAttemptInput {\r\n status?: RunAttemptStatus;\r\n errorKind?: string;\r\n error?: string;\r\n inputTokens?: number;\r\n outputTokens?: number;\r\n}\r\n\r\nexport interface CreateSessionTaskInput {\r\n id?: string;\r\n sessionId: string;\r\n childSessionId?: string;\r\n runId?: string;\r\n type: string;\r\n description: string;\r\n cwd: string;\r\n status?: SessionTaskStatus;\r\n requestNamespace?: string;\r\n requestId?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface UpdateSessionTaskInput {\r\n status?: SessionTaskStatus;\r\n runId?: string;\r\n output?: string;\r\n error?: string;\r\n metadata?: Record<string, unknown>;\r\n}\r\n\r\nexport interface CreatePermissionRequestInput {\r\n id?: string;\r\n sessionId: string;\r\n runId?: string;\r\n toolName: string;\r\n payload?: Record<string, unknown>;\r\n}\r\n\r\nexport interface ReplyPermissionInput {\r\n requestId: string;\r\n status: Extract<PermissionStatus, \"approved\" | \"denied\" | \"expired\">;\r\n decision?: string;\r\n clientId?: string;\r\n}\r\n\r\nexport interface ListPermissionRequestsOptions {\r\n sessionId?: string;\r\n status?: PermissionStatus;\r\n toolName?: string;\r\n limit?: number;\r\n}\r\n\r\nexport interface ListEventsOptions {\r\n afterSeq?: number;\r\n sessionId?: string;\r\n limit?: number;\r\n}\r\n\r\nexport interface ListSessionsOptions {\r\n cwd?: string;\r\n includeArchived?: boolean;\r\n limit?: number;\r\n}\r\n\r\nexport interface ListMessagesOptions {\r\n afterSeq?: number;\r\n limit?: number;\r\n}\r\n\r\nexport interface ListMessagePartsOptions {\r\n afterSeq?: number;\r\n messageId?: string;\r\n limit?: number;\r\n}\r\nimport type {\r\n AttachmentIntent,\r\n SessionInputAttachmentRecord,\r\n} from \"./attachment.js\";\r\n",
5
+ "export type ThemeConfig = {\n name: string;\n colors: {\n primary: string;\n secondary: string;\n accent: string;\n foreground: string;\n background: string;\n backgroundPanel: string;\n backgroundPrompt: string;\n muted: string;\n success: string;\n warning: string;\n error: string;\n info: string;\n };\n icons: {\n spinner: string[];\n tool: string;\n assistant: string;\n user: string;\n system: string;\n success: string;\n error: string;\n };\n};\n\n/** One Dark — default dark theme */\nexport const defaultTheme: ThemeConfig = {\n name: \"default\",\n colors: {\n primary: \"#56b6c2\",\n secondary: \"#abb2bf\",\n accent: \"#61afef\",\n foreground: \"#abb2bf\",\n background: \"#000000\",\n backgroundPanel: \"#262a33\",\n backgroundPrompt: \"#262626\",\n muted: \"#5c6370\",\n success: \"#98c379\",\n warning: \"#e5c07b\",\n error: \"#e06c75\",\n info: \"#61afef\",\n },\n icons: {\n spinner: [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"],\n tool: \" ⏵ \",\n assistant: \"⏺ \",\n user: \"> \",\n system: \"ℹ \",\n success: \"✓ \",\n error: \"✗ \",\n },\n};\n\n/** GitHub Light — bright theme */\nexport const lightTheme: ThemeConfig = {\n name: \"light\",\n colors: {\n primary: \"#0550ae\",\n secondary: \"#24292f\",\n accent: \"#0969da\",\n foreground: \"#24292f\",\n background: \"#ffffff\",\n backgroundPanel: \"#f6f8fa\",\n backgroundPrompt: \"#f3f4f6\",\n muted: \"#6e7781\",\n success: \"#1a7f37\",\n warning: \"#9a6700\",\n error: \"#cf222e\",\n info: \"#0969da\",\n },\n icons: {\n spinner: [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"],\n tool: \" ⏵ \",\n assistant: \"⏺ \",\n user: \"> \",\n system: \"ℹ \",\n success: \"✓ \",\n error: \"✗ \",\n },\n};\n\n/** Dracula — high-contrast dark theme */\nexport const draculaTheme: ThemeConfig = {\n name: \"dracula\",\n colors: {\n primary: \"#bd93f9\",\n secondary: \"#f8f8f2\",\n accent: \"#8be9fd\",\n foreground: \"#f8f8f2\",\n background: \"#282a36\",\n backgroundPanel: \"#343746\",\n backgroundPrompt: \"#2f313d\",\n muted: \"#6272a4\",\n success: \"#50fa7b\",\n warning: \"#ffb86c\",\n error: \"#ff5555\",\n info: \"#8be9fd\",\n },\n icons: {\n spinner: [\"⠋\", \"⠙\", \"⠹\", \"⠸\", \"⠼\", \"⠴\", \"⠦\", \"⠧\", \"⠇\", \"⠏\"],\n tool: \" ⏵ \",\n assistant: \"⏺ \",\n user: \"> \",\n system: \"ℹ \",\n success: \"✓ \",\n error: \"✗ \",\n },\n};\n\nexport const BUILTIN_THEMES: Record<string, ThemeConfig> = {\n default: defaultTheme,\n light: lightTheme,\n dracula: draculaTheme,\n};\n\nexport function getTheme(name: string): ThemeConfig {\n return BUILTIN_THEMES[name] ?? defaultTheme;\n}\n",
6
+ "/**\n * `closing` 表示 Session 正在停止当前工作并等待资源释放,此时不再接收新工作。\n * 等待结束后,Session 会进入不可逆的 archived 状态。\n */\nexport type SessionStatus =\n \"idle\" | \"running\" | \"closing\" | \"archived\" | \"error\";\nexport type InputDelivery = \"queue\" | \"steer\";\nexport type RunStatus =\n \"pending\" | \"running\" | \"completed\" | \"failed\" | \"interrupted\";\nexport type RunAttemptStatus = \"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\";\nexport type SessionTaskStatus =\n \"pending\" | \"running\" | \"completed\" | \"failed\" | \"stopped\" | \"interrupted\";\nexport type PermissionStatus = \"pending\" | \"approved\" | \"denied\" | \"expired\";\nexport type SessionMessageRole = \"system\" | \"user\" | \"assistant\";\nexport type SessionMessagePartType =\n | \"text\"\n | \"attachment\"\n | \"transformation\"\n | \"reasoning\"\n | \"tool\"\n | \"tool_result\"\n | \"error\"\n | \"log\";\nexport type SessionMessagePartStatus =\n \"pending\" | \"running\" | \"completed\" | \"failed\" | \"interrupted\";\nexport type ProjectionSettlementAction = \"retry-terminal-projection\" | \"compensate-child\";\nexport type ProjectionSettlementStatus = \"pending\" | \"retrying\" | \"resolved\" | \"abandoned\";\n\n/** A user explicitly selected a skill before submitting a normal prompt. */\nexport interface SkillInvocationMetadata {\n name: string;\n commandName?: string;\n displayName?: string;\n source?: \"bundled\" | \"user\" | \"project\" | \"plugin\";\n invocationSource: \"slash\";\n}\n\n/** Current durable session-event envelope version. Payload versions are added by the event registry. */\nexport const SESSION_EVENT_SCHEMA_VERSION = 1;\n\nexport interface SessionRecord {\n id: string;\n parentId?: string;\n projectId?: string;\n cwd: string;\n cwdRelative?: string;\n title: string;\n model: string;\n agent?: string;\n status: SessionStatus;\n metadata: Record<string, unknown>;\n createdAt: number;\n updatedAt: number;\n archivedAt?: number;\n}\n\nexport interface ProjectRecord {\n id: string;\n name: string;\n path: string;\n pinnedAt?: number;\n defaultShell?: string;\n lastOpenedAt: number;\n archivedAt?: number;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface ProjectLocationRecord {\n id: string;\n projectId: string;\n path: string;\n normalizedPath: string;\n status: \"active\" | \"historical\";\n boundAt: number;\n lastVerifiedAt?: number;\n}\n\nexport interface SessionInputRecord {\n id: string;\n sessionId: string;\n seq: number;\n delivery: InputDelivery;\n content: string;\n attachments: SessionInputAttachmentRecord[];\n promotedMessageId?: string;\n metadata: Record<string, unknown>;\n createdAt: number;\n}\n\nexport interface SessionMessageRecord {\n id: string;\n sessionId: string;\n seq: number;\n role: SessionMessageRole;\n runId?: string;\n inputId?: string;\n metadata: Record<string, unknown>;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface SessionMessagePartRecord {\n id: string;\n sessionId: string;\n messageId: string;\n seq: number;\n type: SessionMessagePartType;\n status: SessionMessagePartStatus;\n text?: string;\n toolUseId?: string;\n toolName?: string;\n input?: Record<string, unknown>;\n output?: unknown;\n isError?: boolean;\n assetId?: string;\n intent?: AttachmentIntent;\n displayName?: string;\n mediaType?: string;\n sizeBytes?: number;\n kind?: \"direct\" | \"document_extract\" | \"tool_mount\";\n representationId?: string;\n processor?: string;\n transformationError?: string;\n metadata: Record<string, unknown>;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface SessionEventRecord {\n id: string;\n seq: number;\n type: string;\n schemaVersion: number;\n sessionId?: string;\n payload: Record<string, unknown>;\n createdAt: number;\n}\n\nexport interface SessionAttachmentMessagePartRecord\n extends SessionMessagePartRecord {\n type: \"attachment\";\n assetId: string;\n intent: AttachmentIntent;\n displayName: string;\n mediaType: string;\n sizeBytes: number;\n}\n\nexport interface SessionTransformationMessagePartRecord\n extends SessionMessagePartRecord {\n type: \"transformation\";\n assetId: string;\n kind: \"direct\" | \"document_extract\" | \"tool_mount\";\n representationId?: string;\n processor?: string;\n transformationError?: string;\n}\n\nexport interface ProjectionSettlementRecord {\n id: string;\n projector: string;\n rootSessionId: string;\n eventSequence: number;\n action: ProjectionSettlementAction;\n payload: Record<string, unknown>;\n status: ProjectionSettlementStatus;\n attemptCount: number;\n lastError?: string;\n nextRetryAt?: number;\n createdAt: number;\n updatedAt: number;\n resolvedAt?: number;\n}\n\nexport interface SessionRunRecord {\n id: string;\n sessionId: string;\n inputId?: string;\n status: RunStatus;\n startedAt?: number;\n finishedAt?: number;\n error?: string;\n metadata: Record<string, unknown>;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface SessionRunAttemptRecord {\n id: string;\n runId: string;\n sequence: number;\n status: RunAttemptStatus;\n provider?: string;\n model?: string;\n retryReason?: string;\n errorKind?: string;\n error?: string;\n inputTokens?: number;\n outputTokens?: number;\n startedAt?: number;\n finishedAt?: number;\n createdAt: number;\n updatedAt: number;\n}\n\n/** Daemon-owned execution projection. Live handles stay in their backend runtime and are never persisted. */\nexport interface SessionExecutionRecord {\n id: string;\n sessionId: string;\n /** Producer namespace plus requestId uniquely identify one logical admission. */\n requestNamespace?: string;\n requestId?: string;\n childSessionId?: string;\n runId?: string;\n type: string;\n status: SessionTaskStatus;\n description: string;\n cwd: string;\n output?: string;\n error?: string;\n metadata: Record<string, unknown>;\n createdAt: number;\n startedAt?: number;\n finishedAt?: number;\n updatedAt: number;\n}\n\nexport interface PermissionRequestRecord {\n id: string;\n sessionId: string;\n runId?: string;\n toolName: string;\n payload: Record<string, unknown>;\n status: PermissionStatus;\n decision?: string;\n decidedByClientId?: string;\n createdAt: number;\n updatedAt: number;\n}\n\n/** Atomic, server-owned state used when a client attaches to one session. */\nexport interface SessionStateSnapshot {\n cursor: number;\n session: SessionRecord;\n inputs: SessionInputRecord[];\n messages: SessionMessageRecord[];\n parts: SessionMessagePartRecord[];\n runs: SessionRunRecord[];\n attempts: SessionRunAttemptRecord[];\n tasks?: SessionExecutionRecord[];\n permissions: PermissionRequestRecord[];\n}\n\nexport type ScheduledTaskStatus = \"active\" | \"paused\" | \"completed\";\nexport type ScheduledTaskDestination = \"standalone\" | \"chat\";\nexport type ScheduledTaskExecutionMode = \"local\" | \"worktree\";\nexport type ScheduledRecurrenceFormat = \"rrule\" | \"once\";\nexport type ScheduledOverlapPolicy = \"skip\" | \"queue\";\nexport type ScheduledMissedRunPolicy = \"skip\" | \"run_once\";\n\nexport interface ScheduledPermissionProfile {\n mode: \"read_only\" | \"workspace_write\" | \"full_access\";\n network?: boolean;\n allowedTools?: string[];\n deniedTools?: string[];\n}\n\nexport interface ScheduledStopPolicy {\n runOnce?: boolean;\n maxRuns?: number;\n stopWhenCompleted?: boolean;\n expiresAt?: number;\n}\n\nexport interface ScheduledTaskRecord {\n id: string;\n name: string;\n description?: string;\n prompt: string;\n recurrence: string;\n recurrenceFormat: ScheduledRecurrenceFormat;\n timezone: string;\n status: ScheduledTaskStatus;\n destination: ScheduledTaskDestination;\n sessionId?: string;\n projectPaths: string[];\n executionMode: ScheduledTaskExecutionMode;\n model?: string;\n effort?: string;\n skillNames: string[];\n pluginNames: string[];\n permissionProfile: ScheduledPermissionProfile;\n overlapPolicy: ScheduledOverlapPolicy;\n missedRunPolicy: ScheduledMissedRunPolicy;\n stopPolicy?: ScheduledStopPolicy;\n createdBy: \"user\" | \"agent\" | \"migration\";\n createdFromSessionId?: string;\n lastRunAt?: number;\n nextRunAt?: number;\n runCount: number;\n createdAt: number;\n updatedAt: number;\n}\n\nexport type ScheduledRunCause = \"scheduled\" | \"manual\" | \"missed_run\";\nexport type ScheduledRunStatus =\n | \"queued\"\n | \"running\"\n | \"succeeded\"\n | \"failed\"\n | \"interrupted\"\n | \"needs_attention\"\n | \"skipped\";\n\nexport interface ScheduledRunRecord {\n id: string;\n taskId: string;\n cause: ScheduledRunCause;\n status: ScheduledRunStatus;\n scheduledFor: number;\n sessionId?: string;\n runId?: string;\n summary?: string;\n error?: string;\n unread: boolean;\n attentionReason?: string;\n createdAt: number;\n startedAt?: number;\n finishedAt?: number;\n updatedAt: number;\n}\n\nexport interface CreateScheduledTaskInput {\n id?: string;\n name: string;\n description?: string;\n prompt: string;\n recurrence: string;\n recurrenceFormat: ScheduledRecurrenceFormat;\n timezone: string;\n status?: ScheduledTaskStatus;\n destination: ScheduledTaskDestination;\n sessionId?: string;\n projectPaths?: string[];\n executionMode?: ScheduledTaskExecutionMode;\n model?: string;\n effort?: string;\n skillNames?: string[];\n pluginNames?: string[];\n permissionProfile?: ScheduledPermissionProfile;\n overlapPolicy?: ScheduledOverlapPolicy;\n missedRunPolicy?: ScheduledMissedRunPolicy;\n stopPolicy?: ScheduledStopPolicy;\n createdBy?: ScheduledTaskRecord[\"createdBy\"];\n createdFromSessionId?: string;\n nextRunAt?: number;\n}\n\nexport type UpdateScheduledTaskInput = Partial<\n Omit<CreateScheduledTaskInput, \"id\" | \"nextRunAt\">\n> & {\n lastRunAt?: number | null;\n nextRunAt?: number | null;\n runCount?: number;\n};\n\nexport interface CreateScheduledRunInput {\n id?: string;\n taskId: string;\n cause: ScheduledRunCause;\n scheduledFor: number;\n}\n\nexport interface UpdateScheduledRunInput {\n status?: ScheduledRunStatus;\n sessionId?: string;\n runId?: string;\n summary?: string;\n error?: string;\n unread?: boolean;\n attentionReason?: string;\n startedAt?: number;\n finishedAt?: number;\n}\n\nexport interface CreateSessionInput {\n id?: string;\n parentId?: string;\n projectId?: string;\n cwd: string;\n title?: string;\n model: string;\n agent?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdateSessionInput {\n title?: string;\n model?: string;\n agent?: string | null;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AdmitPromptInput {\n id?: string;\n sessionId: string;\n delivery?: InputDelivery;\n content: string;\n attachments?: AdmitPromptAttachmentInput[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface AdmitPromptAttachmentInput {\n assetId: string;\n intent?: AttachmentIntent;\n displayName?: string;\n}\n\nexport interface CreateProjectionSettlementInput {\n id?: string;\n projector: string;\n rootSessionId: string;\n eventSequence: number;\n action: ProjectionSettlementAction;\n payload: Record<string, unknown>;\n error?: string;\n}\n\nexport interface ListProjectionSettlementsOptions {\n projector?: string;\n rootSessionId?: string;\n status?: ProjectionSettlementStatus | readonly ProjectionSettlementStatus[];\n}\n\nexport interface AdmitPromptWithRunInput {\n prompt: AdmitPromptInput;\n run?: {\n id?: string;\n metadata?: Record<string, unknown>;\n };\n}\n\nexport interface CreateMessageInput {\n id?: string;\n sessionId: string;\n role: SessionMessageRole;\n runId?: string;\n inputId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ReplaceTranscriptPartInput {\n type: SessionMessagePartType;\n status?: SessionMessagePartStatus;\n text?: string;\n toolUseId?: string;\n toolName?: string;\n input?: Record<string, unknown>;\n output?: unknown;\n isError?: boolean;\n assetId?: string;\n intent?: AttachmentIntent;\n displayName?: string;\n mediaType?: string;\n sizeBytes?: number;\n kind?: \"direct\" | \"document_extract\" | \"tool_mount\";\n representationId?: string;\n processor?: string;\n transformationError?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface ReplaceTranscriptMessageInput {\n role: SessionMessageRole;\n parts: ReplaceTranscriptPartInput[];\n metadata?: Record<string, unknown>;\n}\n\nexport interface ReplaceTranscriptInput {\n sessionId: string;\n messages: ReplaceTranscriptMessageInput[];\n}\n\nexport interface UpsertMessagePartInput {\n id?: string;\n sessionId: string;\n messageId: string;\n type: SessionMessagePartType;\n status?: SessionMessagePartStatus;\n text?: string;\n toolUseId?: string;\n toolName?: string;\n input?: Record<string, unknown>;\n output?: unknown;\n isError?: boolean;\n assetId?: string;\n intent?: AttachmentIntent;\n displayName?: string;\n mediaType?: string;\n sizeBytes?: number;\n kind?: \"direct\" | \"document_extract\" | \"tool_mount\";\n representationId?: string;\n processor?: string;\n transformationError?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface AppendMessagePartDeltaInput {\n sessionId: string;\n messageId: string;\n partId: string;\n field: \"text\";\n delta: string;\n}\n\nexport interface AppendEventInput {\n id?: string;\n type: string;\n sessionId?: string;\n payload?: Record<string, unknown>;\n}\n\nexport interface CreateRunInput {\n id?: string;\n sessionId: string;\n inputId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdateRunInput {\n status?: RunStatus;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreateRunAttemptInput {\n id?: string;\n runId: string;\n sequence?: number;\n provider?: string;\n model?: string;\n retryReason?: string;\n}\n\nexport interface UpdateRunAttemptInput {\n status?: RunAttemptStatus;\n errorKind?: string;\n error?: string;\n inputTokens?: number;\n outputTokens?: number;\n}\n\nexport interface CreateSessionTaskInput {\n id?: string;\n sessionId: string;\n childSessionId?: string;\n runId?: string;\n type: string;\n description: string;\n cwd: string;\n status?: SessionTaskStatus;\n requestNamespace?: string;\n requestId?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface UpdateSessionTaskInput {\n status?: SessionTaskStatus;\n runId?: string;\n output?: string;\n error?: string;\n metadata?: Record<string, unknown>;\n}\n\nexport interface CreatePermissionRequestInput {\n id?: string;\n sessionId: string;\n runId?: string;\n toolName: string;\n payload?: Record<string, unknown>;\n}\n\nexport interface ReplyPermissionInput {\n requestId: string;\n status: Extract<PermissionStatus, \"approved\" | \"denied\" | \"expired\">;\n decision?: string;\n clientId?: string;\n}\n\nexport interface ListPermissionRequestsOptions {\n sessionId?: string;\n status?: PermissionStatus;\n toolName?: string;\n limit?: number;\n}\n\nexport interface ListEventsOptions {\n afterSeq?: number;\n sessionId?: string;\n limit?: number;\n}\n\nexport interface ListSessionsOptions {\n cwd?: string;\n includeArchived?: boolean;\n limit?: number;\n}\n\nexport interface ListMessagesOptions {\n afterSeq?: number;\n limit?: number;\n}\n\nexport interface ListMessagePartsOptions {\n afterSeq?: number;\n messageId?: string;\n limit?: number;\n}\nimport type {\n AttachmentIntent,\n SessionInputAttachmentRecord,\n} from \"./attachment.js\";\n",
7
7
  "import type { SessionRecord } from \"./session.js\";\n\nexport type SessionApiFormat = \"anthropic\" | \"openai\";\n\nexport type SessionRuntimeConfig = {\n model: string;\n provider?: string;\n baseUrl?: string;\n apiFormat?: SessionApiFormat;\n permissionMode?: \"default\" | \"plan\" | \"full_auto\";\n maxTurns?: number;\n effort?: \"low\" | \"medium\" | \"high\";\n sessionMode?: \"direct\" | \"coordinator\";\n systemPrompt?: string;\n allowedTools?: string[];\n disallowedTools?: string[];\n pluginsEnabled?: boolean;\n};\n\nexport type SessionRuntimeConfigPatch = Partial<SessionRuntimeConfig>;\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction stringArrayValue(value: unknown): string[] | undefined {\n if (!Array.isArray(value)) return undefined;\n const items = value.filter((item): item is string => typeof item === \"string\" && item.trim().length > 0);\n return items.length > 0 ? items : undefined;\n}\n\nfunction permissionModeValue(value: unknown): SessionRuntimeConfig[\"permissionMode\"] | undefined {\n return value === \"default\" || value === \"plan\" || value === \"full_auto\" ? value : undefined;\n}\n\nfunction effortValue(value: unknown): SessionRuntimeConfig[\"effort\"] | undefined {\n return value === \"low\" || value === \"medium\" || value === \"high\" ? value : undefined;\n}\n\nfunction sessionModeValue(value: unknown): SessionRuntimeConfig[\"sessionMode\"] | undefined {\n return value === \"coordinator\" ? \"coordinator\" : value === \"direct\" ? \"direct\" : undefined;\n}\n\nfunction apiFormatValue(value: unknown): SessionApiFormat | undefined {\n return value === \"anthropic\" || value === \"openai\" ? value : undefined;\n}\n\nfunction booleanValue(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nexport function readRuntimeMetadata(metadata: Record<string, unknown> | undefined): Record<string, unknown> {\n return isRecord(metadata?.runtime) ? metadata.runtime : {};\n}\n\nexport function readSessionRuntimeConfig(\n session: SessionRecord,\n defaults?: Partial<SessionRuntimeConfig>,\n): SessionRuntimeConfig {\n const runtime = readRuntimeMetadata(session.metadata);\n const model = stringValue(runtime.model);\n if (!model) {\n throw new Error(`Session runtime config is missing metadata.runtime.model: ${session.id}`);\n }\n return {\n model,\n ...(stringValue(runtime.provider) ?? defaults?.provider\n ? { provider: stringValue(runtime.provider) ?? defaults?.provider }\n : {}),\n ...(stringValue(runtime.baseUrl) ?? defaults?.baseUrl\n ? { baseUrl: stringValue(runtime.baseUrl) ?? defaults?.baseUrl }\n : {}),\n ...(apiFormatValue(runtime.apiFormat) ?? defaults?.apiFormat\n ? { apiFormat: apiFormatValue(runtime.apiFormat) ?? defaults?.apiFormat }\n : {}),\n ...(permissionModeValue(runtime.permissionMode) ?? defaults?.permissionMode\n ? { permissionMode: permissionModeValue(runtime.permissionMode) ?? defaults?.permissionMode }\n : {}),\n ...(numberValue(runtime.maxTurns) ?? defaults?.maxTurns\n ? { maxTurns: numberValue(runtime.maxTurns) ?? defaults?.maxTurns }\n : {}),\n ...(effortValue(runtime.effort) ?? defaults?.effort\n ? { effort: effortValue(runtime.effort) ?? defaults?.effort }\n : {}),\n ...(sessionModeValue(runtime.sessionMode) ?? defaults?.sessionMode\n ? { sessionMode: sessionModeValue(runtime.sessionMode) ?? defaults?.sessionMode }\n : {}),\n ...(stringValue(runtime.systemPrompt) ?? defaults?.systemPrompt\n ? { systemPrompt: stringValue(runtime.systemPrompt) ?? defaults?.systemPrompt }\n : {}),\n ...(stringArrayValue(runtime.allowedTools) ?? defaults?.allowedTools\n ? { allowedTools: stringArrayValue(runtime.allowedTools) ?? defaults?.allowedTools }\n : {}),\n ...(stringArrayValue(runtime.disallowedTools) ?? defaults?.disallowedTools\n ? { disallowedTools: stringArrayValue(runtime.disallowedTools) ?? defaults?.disallowedTools }\n : {}),\n ...((booleanValue(runtime.pluginsEnabled) ?? defaults?.pluginsEnabled) !== undefined\n ? { pluginsEnabled: booleanValue(runtime.pluginsEnabled) ?? defaults?.pluginsEnabled }\n : {}),\n };\n}\n\nexport function patchSessionRuntimeMetadata(\n metadata: Record<string, unknown>,\n patch: SessionRuntimeConfigPatch,\n): Record<string, unknown> {\n const runtime = {\n ...readRuntimeMetadata(metadata),\n ...stripUndefined(patch),\n };\n return {\n ...metadata,\n runtime,\n };\n}\n\nexport function runtimeMetadataChanged(\n before: Record<string, unknown>,\n after: Record<string, unknown>,\n): boolean {\n return JSON.stringify(readRuntimeMetadata(before)) !== JSON.stringify(readRuntimeMetadata(after));\n}\n\nfunction stripUndefined<T extends Record<string, unknown>>(input: T): Partial<T> {\n return Object.fromEntries(Object.entries(input).filter(([, value]) => value !== undefined)) as Partial<T>;\n}\n",
8
- "import type {\r\n PermissionRequestRecord,\r\n SessionEventRecord,\r\n SessionExecutionRecord,\r\n SessionInputRecord,\r\n SessionMessagePartRecord,\r\n SessionMessageRecord,\r\n SessionRunAttemptRecord,\r\n SessionRunRecord,\r\n SessionStateSnapshot,\r\n} from \"./session.js\";\r\nimport type { AttachmentIntent } from \"./attachment.js\";\r\nimport type { JobReadResult, JobSnapshot, JobWaitResult } from \"./job.js\";\r\nimport type {\r\n TerminalEvent,\r\n TerminalReadResult,\r\n TerminalSessionInfo,\r\n TerminalWaitResult,\r\n} from \"./terminal.js\";\r\nimport type { ProtocolError } from \"./requests.js\";\r\n\r\nexport class ProtocolDataError extends Error {\r\n readonly code = \"invalid_protocol_data\";\r\n readonly details?: Record<string, unknown>;\r\n\r\n constructor(message: string, path?: string) {\r\n super(message);\r\n this.name = \"ProtocolDataError\";\r\n this.details = path ? { path } : undefined;\r\n }\r\n\r\n toProtocolError(): ProtocolError {\r\n return {\r\n code: this.code,\r\n message: this.message,\r\n ...(this.details ? { details: this.details } : {}),\r\n };\r\n }\r\n}\r\n\r\ntype DataRecord = Record<string, unknown>;\r\ntype Validator<T> = (value: unknown, path: string) => T;\r\n\r\nfunction parseJson(text: string): unknown {\r\n try {\r\n return JSON.parse(text) as unknown;\r\n } catch {\r\n throw new ProtocolDataError(\"Protocol data must be valid JSON\");\r\n }\r\n}\r\n\r\nfunction object(value: unknown, path: string): DataRecord {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\r\n throw new ProtocolDataError(`${path} must be an object`, path);\r\n }\r\n return value as DataRecord;\r\n}\r\n\r\nfunction stringField(value: DataRecord, field: string, path: string): string {\r\n const fieldPath = `${path}.${field}`;\r\n if (typeof value[field] !== \"string\") {\r\n throw new ProtocolDataError(`${fieldPath} must be a string`, fieldPath);\r\n }\r\n return value[field] as string;\r\n}\r\n\r\nfunction optionalString(value: DataRecord, field: string, path: string): void {\r\n const fieldValue = value[field];\r\n if (fieldValue !== undefined && typeof fieldValue !== \"string\") {\r\n const fieldPath = `${path}.${field}`;\r\n throw new ProtocolDataError(`${fieldPath} must be a string`, fieldPath);\r\n }\r\n}\r\n\r\nfunction numberField(value: DataRecord, field: string, path: string): number {\r\n const fieldPath = `${path}.${field}`;\r\n const fieldValue = value[field];\r\n if (typeof fieldValue !== \"number\" || !Number.isFinite(fieldValue)) {\r\n throw new ProtocolDataError(`${fieldPath} must be a finite number`, fieldPath);\r\n }\r\n return fieldValue;\r\n}\r\n\r\nfunction optionalNumber(\r\n value: DataRecord,\r\n field: string,\r\n path: string,\r\n nullable = false,\r\n): void {\r\n const fieldValue = value[field];\r\n if (fieldValue === undefined || (nullable && fieldValue === null)) return;\r\n if (typeof fieldValue !== \"number\" || !Number.isFinite(fieldValue)) {\r\n const fieldPath = `${path}.${field}`;\r\n throw new ProtocolDataError(`${fieldPath} must be a finite number`, fieldPath);\r\n }\r\n}\r\n\r\nfunction booleanField(value: DataRecord, field: string, path: string): boolean {\r\n const fieldPath = `${path}.${field}`;\r\n if (typeof value[field] !== \"boolean\") {\r\n throw new ProtocolDataError(`${fieldPath} must be a boolean`, fieldPath);\r\n }\r\n return value[field] as boolean;\r\n}\r\n\r\nfunction recordField(value: DataRecord, field: string, path: string): DataRecord {\r\n return object(value[field], `${path}.${field}`);\r\n}\r\n\r\nfunction optionalRecord(value: DataRecord, field: string, path: string): void {\r\n if (value[field] !== undefined) object(value[field], `${path}.${field}`);\r\n}\r\n\r\nfunction enumField<const T extends readonly string[]>(\r\n value: DataRecord,\r\n field: string,\r\n path: string,\r\n allowed: T,\r\n): T[number] {\r\n const fieldPath = `${path}.${field}`;\r\n const fieldValue = value[field];\r\n if (typeof fieldValue !== \"string\" || !allowed.includes(fieldValue)) {\r\n throw new ProtocolDataError(\r\n `${fieldPath} must be one of: ${allowed.join(\", \")}`,\r\n fieldPath,\r\n );\r\n }\r\n return fieldValue as T[number];\r\n}\r\n\r\nfunction arrayField<T>(\r\n value: DataRecord,\r\n field: string,\r\n path: string,\r\n validate: Validator<T>,\r\n): T[] {\r\n const fieldPath = `${path}.${field}`;\r\n const items = value[field];\r\n if (!Array.isArray(items)) {\r\n throw new ProtocolDataError(`${fieldPath} must be an array`, fieldPath);\r\n }\r\n return items.map((item, index) => validate(item, `${fieldPath}[${index}]`));\r\n}\r\n\r\nfunction validateSession(value: unknown, path: string) {\r\n const item = object(value, path);\r\n stringField(item, \"id\", path);\r\n stringField(item, \"cwd\", path);\r\n stringField(item, \"title\", path);\r\n stringField(item, \"model\", path);\r\n enumField(item, \"status\", path, [\"idle\", \"running\", \"closing\", \"archived\", \"error\"] as const);\r\n recordField(item, \"metadata\", path);\r\n numberField(item, \"createdAt\", path);\r\n numberField(item, \"updatedAt\", path);\r\n for (const field of [\"parentId\", \"projectId\", \"cwdRelative\", \"agent\"] as const) {\r\n optionalString(item, field, path);\r\n }\r\n optionalNumber(item, \"archivedAt\", path);\r\n return item;\r\n}\r\n\r\nfunction validateInput(value: unknown, path: string): SessionInputRecord {\r\n const item = object(value, path);\r\n stringField(item, \"id\", path);\r\n stringField(item, \"sessionId\", path);\r\n numberField(item, \"seq\", path);\r\n enumField(item, \"delivery\", path, [\"queue\", \"steer\"] as const);\r\n stringField(item, \"content\", path);\r\n const attachments = arrayField(item, \"attachments\", path, validateInputAttachment);\r\n const assetIds = new Set<string>();\r\n for (const [index, attachment] of attachments.entries()) {\r\n const attachmentPath = `${path}.attachments[${index}]`;\r\n if (attachment.sessionId !== item.sessionId) {\r\n throw new ProtocolDataError(\r\n `${attachmentPath}.sessionId must match ${path}.sessionId`,\r\n `${attachmentPath}.sessionId`,\r\n );\r\n }\r\n if (attachment.inputId !== item.id) {\r\n throw new ProtocolDataError(\r\n `${attachmentPath}.inputId must match ${path}.id`,\r\n `${attachmentPath}.inputId`,\r\n );\r\n }\r\n if (attachment.seq !== index) {\r\n throw new ProtocolDataError(\r\n `${attachmentPath}.seq must equal its array index`,\r\n `${attachmentPath}.seq`,\r\n );\r\n }\r\n if (assetIds.has(attachment.assetId)) {\r\n throw new ProtocolDataError(\r\n `${attachmentPath}.assetId must be unique within the input`,\r\n `${attachmentPath}.assetId`,\r\n );\r\n }\r\n assetIds.add(attachment.assetId);\r\n }\r\n optionalString(item, \"promotedMessageId\", path);\r\n recordField(item, \"metadata\", path);\r\n numberField(item, \"createdAt\", path);\r\n return item as unknown as SessionInputRecord;\r\n}\r\n\r\nfunction validateInputAttachment(value: unknown, path: string) {\r\n const item = object(value, path);\r\n for (const field of [\"id\", \"sessionId\", \"inputId\", \"assetId\", \"displayName\", \"mediaType\"] as const) {\r\n stringField(item, field, path);\r\n }\r\n numberField(item, \"seq\", path);\r\n enumField(item, \"intent\", path, [\r\n \"auto\",\r\n \"vision\",\r\n \"ocr\",\r\n \"document\",\r\n \"tool_resource\",\r\n \"workspace_reference\",\r\n ] as const satisfies readonly AttachmentIntent[]);\r\n numberField(item, \"sizeBytes\", path);\r\n recordField(item, \"metadata\", path);\r\n numberField(item, \"createdAt\", path);\r\n return item as unknown as SessionInputRecord[\"attachments\"][number];\r\n}\r\n\r\nfunction validateMessage(value: unknown, path: string): SessionMessageRecord {\r\n const item = object(value, path);\r\n stringField(item, \"id\", path);\r\n stringField(item, \"sessionId\", path);\r\n numberField(item, \"seq\", path);\r\n enumField(item, \"role\", path, [\"system\", \"user\", \"assistant\"] as const);\r\n optionalString(item, \"runId\", path);\r\n optionalString(item, \"inputId\", path);\r\n recordField(item, \"metadata\", path);\r\n numberField(item, \"createdAt\", path);\r\n numberField(item, \"updatedAt\", path);\r\n return item as unknown as SessionMessageRecord;\r\n}\r\n\r\nfunction validatePart(value: unknown, path: string): SessionMessagePartRecord {\r\n const item = object(value, path);\r\n stringField(item, \"id\", path);\r\n stringField(item, \"sessionId\", path);\r\n stringField(item, \"messageId\", path);\r\n numberField(item, \"seq\", path);\r\n const type = enumField(item, \"type\", path, [\r\n \"text\",\r\n \"attachment\",\r\n \"transformation\",\r\n \"reasoning\",\r\n \"tool\",\r\n \"tool_result\",\r\n \"error\",\r\n \"log\",\r\n ] as const);\r\n enumField(item, \"status\", path, [\"pending\", \"running\", \"completed\", \"failed\", \"interrupted\"] as const);\r\n for (const field of [\"text\", \"toolUseId\", \"toolName\"] as const) optionalString(item, field, path);\r\n optionalRecord(item, \"input\", path);\r\n if (item.isError !== undefined && typeof item.isError !== \"boolean\") {\r\n throw new ProtocolDataError(`${path}.isError must be a boolean`, `${path}.isError`);\r\n }\r\n if (type === \"attachment\") {\r\n for (const field of [\"assetId\", \"displayName\", \"mediaType\"] as const) {\r\n stringField(item, field, path);\r\n }\r\n enumField(item, \"intent\", path, [\r\n \"auto\",\r\n \"vision\",\r\n \"ocr\",\r\n \"document\",\r\n \"tool_resource\",\r\n \"workspace_reference\",\r\n ] as const);\r\n numberField(item, \"sizeBytes\", path);\r\n }\r\n if (type === \"transformation\") {\r\n stringField(item, \"assetId\", path);\r\n enumField(item, \"kind\", path, [\"direct\", \"document_extract\", \"tool_mount\"] as const);\r\n for (const field of [\"representationId\", \"processor\", \"transformationError\"] as const) {\r\n optionalString(item, field, path);\r\n }\r\n }\r\n recordField(item, \"metadata\", path);\r\n numberField(item, \"createdAt\", path);\r\n numberField(item, \"updatedAt\", path);\r\n return item as unknown as SessionMessagePartRecord;\r\n}\r\n\r\nfunction validateRun(value: unknown, path: string): SessionRunRecord {\r\n const item = object(value, path);\r\n stringField(item, \"id\", path);\r\n stringField(item, \"sessionId\", path);\r\n optionalString(item, \"inputId\", path);\r\n enumField(item, \"status\", path, [\"pending\", \"running\", \"completed\", \"failed\", \"interrupted\"] as const);\r\n optionalNumber(item, \"startedAt\", path);\r\n optionalNumber(item, \"finishedAt\", path);\r\n optionalString(item, \"error\", path);\r\n recordField(item, \"metadata\", path);\r\n numberField(item, \"createdAt\", path);\r\n numberField(item, \"updatedAt\", path);\r\n return item as unknown as SessionRunRecord;\r\n}\r\n\r\nfunction validateAttempt(value: unknown, path: string): SessionRunAttemptRecord {\r\n const item = object(value, path);\r\n stringField(item, \"id\", path);\r\n stringField(item, \"runId\", path);\r\n numberField(item, \"sequence\", path);\r\n enumField(item, \"status\", path, [\"pending\", \"running\", \"completed\", \"failed\", \"cancelled\"] as const);\r\n for (const field of [\"provider\", \"model\", \"retryReason\", \"errorKind\", \"error\"] as const) {\r\n optionalString(item, field, path);\r\n }\r\n for (const field of [\"inputTokens\", \"outputTokens\", \"startedAt\", \"finishedAt\"] as const) {\r\n optionalNumber(item, field, path);\r\n }\r\n numberField(item, \"createdAt\", path);\r\n numberField(item, \"updatedAt\", path);\r\n return item as unknown as SessionRunAttemptRecord;\r\n}\r\n\r\nfunction validateTask(value: unknown, path: string): SessionExecutionRecord {\r\n const item = object(value, path);\r\n for (const field of [\"id\", \"sessionId\", \"type\", \"description\", \"cwd\"] as const) {\r\n stringField(item, field, path);\r\n }\r\n for (const field of [\"childSessionId\", \"runId\", \"requestNamespace\", \"requestId\", \"output\", \"error\"] as const) {\r\n optionalString(item, field, path);\r\n }\r\n enumField(item, \"status\", path, [\"pending\", \"running\", \"completed\", \"failed\", \"stopped\", \"interrupted\"] as const);\r\n recordField(item, \"metadata\", path);\r\n numberField(item, \"createdAt\", path);\r\n optionalNumber(item, \"startedAt\", path);\r\n optionalNumber(item, \"finishedAt\", path);\r\n numberField(item, \"updatedAt\", path);\r\n return item as unknown as SessionExecutionRecord;\r\n}\r\n\r\nfunction validatePermission(value: unknown, path: string): PermissionRequestRecord {\r\n const item = object(value, path);\r\n for (const field of [\"id\", \"sessionId\", \"toolName\"] as const) stringField(item, field, path);\r\n optionalString(item, \"runId\", path);\r\n recordField(item, \"payload\", path);\r\n enumField(item, \"status\", path, [\"pending\", \"approved\", \"denied\", \"expired\"] as const);\r\n optionalString(item, \"decision\", path);\r\n optionalString(item, \"decidedByClientId\", path);\r\n numberField(item, \"createdAt\", path);\r\n numberField(item, \"updatedAt\", path);\r\n return item as unknown as PermissionRequestRecord;\r\n}\r\n\r\nexport function decodeSessionEventRecord(value: unknown): SessionEventRecord {\r\n const event = object(value, \"event\");\r\n stringField(event, \"id\", \"event\");\r\n numberField(event, \"seq\", \"event\");\r\n stringField(event, \"type\", \"event\");\r\n numberField(event, \"schemaVersion\", \"event\");\r\n optionalString(event, \"sessionId\", \"event\");\r\n recordField(event, \"payload\", \"event\");\r\n numberField(event, \"createdAt\", \"event\");\r\n return event as unknown as SessionEventRecord;\r\n}\r\n\r\nexport function deserializeSessionEventRecord(text: string): SessionEventRecord {\r\n return decodeSessionEventRecord(parseJson(text));\r\n}\r\n\r\nexport function serializeSessionEventRecord(event: SessionEventRecord): string {\r\n decodeSessionEventRecord(event);\r\n return JSON.stringify(event);\r\n}\r\n\r\nexport function decodeSessionStateSnapshot(value: unknown): SessionStateSnapshot {\r\n const snapshot = object(value, \"snapshot\");\r\n numberField(snapshot, \"cursor\", \"snapshot\");\r\n validateSession(snapshot.session, \"snapshot.session\");\r\n arrayField(snapshot, \"inputs\", \"snapshot\", validateInput);\r\n arrayField(snapshot, \"messages\", \"snapshot\", validateMessage);\r\n arrayField(snapshot, \"parts\", \"snapshot\", validatePart);\r\n arrayField(snapshot, \"runs\", \"snapshot\", validateRun);\r\n arrayField(snapshot, \"attempts\", \"snapshot\", validateAttempt);\r\n if (snapshot.tasks !== undefined) arrayField(snapshot, \"tasks\", \"snapshot\", validateTask);\r\n arrayField(snapshot, \"permissions\", \"snapshot\", validatePermission);\r\n return snapshot as unknown as SessionStateSnapshot;\r\n}\r\n\r\nexport function deserializeSessionStateSnapshot(text: string): SessionStateSnapshot {\r\n return decodeSessionStateSnapshot(parseJson(text));\r\n}\r\n\r\nexport function serializeSessionStateSnapshot(snapshot: SessionStateSnapshot): string {\r\n decodeSessionStateSnapshot(snapshot);\r\n return JSON.stringify(snapshot);\r\n}\r\n\r\nexport function decodeJobSnapshot(value: unknown): JobSnapshot {\r\n const job = object(value, \"job\");\r\n for (const field of [\"id\", \"label\", \"ownerSession\", \"cwd\"] as const) stringField(job, field, \"job\");\r\n enumField(job, \"kind\", \"job\", [\"terminal\", \"shell\", \"agent\", \"dream\", \"workflow\"] as const);\r\n enumField(job, \"status\", \"job\", [\"running\", \"stopping\", \"completed\", \"killed\", \"failed\"] as const);\r\n const capabilities = recordField(job, \"capabilities\", \"job\");\r\n for (const field of [\"read\", \"wait\", \"send\", \"cancel\"] as const) {\r\n booleanField(capabilities, field, \"job.capabilities\");\r\n }\r\n numberField(job, \"startedAt\", \"job\");\r\n numberField(job, \"updatedAt\", \"job\");\r\n optionalNumber(job, \"finishedAt\", \"job\");\r\n optionalString(job, \"detail\", \"job\");\r\n optionalRecord(job, \"metadata\", \"job\");\r\n return job as unknown as JobSnapshot;\r\n}\r\n\r\nexport function decodeJobReadResult(value: unknown): JobReadResult {\r\n const result = object(value, \"jobReadResult\");\r\n stringField(result, \"text\", \"jobReadResult\");\r\n numberField(result, \"cursor\", \"jobReadResult\");\r\n booleanField(result, \"truncated\", \"jobReadResult\");\r\n decodeJobSnapshot(result.snapshot);\r\n optionalRecord(result, \"details\", \"jobReadResult\");\r\n return result as unknown as JobReadResult;\r\n}\r\n\r\nexport function decodeJobWaitResult(value: unknown): JobWaitResult {\r\n const result = object(value, \"jobWaitResult\");\r\n decodeJobReadResult(result);\r\n booleanField(result, \"timedOut\", \"jobWaitResult\");\r\n return result as unknown as JobWaitResult;\r\n}\r\n\r\nexport function decodeTerminalSessionInfo(value: unknown): TerminalSessionInfo {\r\n const terminal = object(value, \"terminal\");\r\n for (const field of [\"id\", \"name\", \"projectId\", \"cwd\", \"shell\", \"createdAt\"] as const) {\r\n stringField(terminal, field, \"terminal\");\r\n }\r\n enumField(terminal, \"runtime\", \"terminal\", [\"local\", \"sandbox\"] as const);\r\n enumField(terminal, \"source\", \"terminal\", [\"user\", \"agent\"] as const);\r\n enumField(terminal, \"status\", \"terminal\", [\"running\", \"stopping\", \"completed\", \"killed\", \"failed\"] as const);\r\n optionalString(terminal, \"sessionId\", \"terminal\");\r\n numberField(terminal, \"cols\", \"terminal\");\r\n numberField(terminal, \"rows\", \"terminal\");\r\n optionalString(terminal, \"exitedAt\", \"terminal\");\r\n optionalNumber(terminal, \"exitCode\", \"terminal\", true);\r\n return terminal as unknown as TerminalSessionInfo;\r\n}\r\n\r\nexport function decodeTerminalEvent(value: unknown): TerminalEvent {\r\n const event = object(value, \"terminalEvent\");\r\n const type = enumField(event, \"type\", \"terminalEvent\", [\"data\", \"status\", \"exit\", \"title\", \"error\"] as const);\r\n stringField(event, \"terminalId\", \"terminalEvent\");\r\n if (type === \"data\") {\r\n stringField(event, \"data\", \"terminalEvent\");\r\n numberField(event, \"sequence\", \"terminalEvent\");\r\n } else if (type === \"status\") {\r\n enumField(event, \"status\", \"terminalEvent\", [\"stopping\", \"killed\"] as const);\r\n } else if (type === \"exit\") {\r\n optionalNumber(event, \"exitCode\", \"terminalEvent\", true);\r\n if (!(\"exitCode\" in event)) {\r\n throw new ProtocolDataError(\"terminalEvent.exitCode is required\", \"terminalEvent.exitCode\");\r\n }\r\n } else if (type === \"title\") {\r\n stringField(event, \"title\", \"terminalEvent\");\r\n } else {\r\n stringField(event, \"message\", \"terminalEvent\");\r\n }\r\n return event as unknown as TerminalEvent;\r\n}\r\n\r\nexport function decodeTerminalReadResult(value: unknown): TerminalReadResult {\r\n const result = object(value, \"terminalReadResult\");\r\n stringField(result, \"terminalId\", \"terminalReadResult\");\r\n stringField(result, \"data\", \"terminalReadResult\");\r\n numberField(result, \"sequence\", \"terminalReadResult\");\r\n booleanField(result, \"truncated\", \"terminalReadResult\");\r\n return result as unknown as TerminalReadResult;\r\n}\r\n\r\nexport function decodeTerminalWaitResult(value: unknown): TerminalWaitResult {\r\n const result = object(value, \"terminalWaitResult\");\r\n decodeTerminalReadResult(result);\r\n decodeTerminalSessionInfo(result.terminal);\r\n booleanField(result, \"timedOut\", \"terminalWaitResult\");\r\n return result as unknown as TerminalWaitResult;\r\n}\r\n",
9
- "export type AttachmentAssetStatus =\r\n | \"importing\"\r\n | \"ready\"\r\n | \"failed\"\r\n | \"deleted\";\r\n\r\nexport type AttachmentIntent =\r\n | \"auto\"\r\n | \"vision\"\r\n | \"ocr\"\r\n | \"document\"\r\n | \"tool_resource\"\r\n | \"workspace_reference\";\r\n\r\nexport type AttachmentRepresentationStatus =\r\n | \"pending\"\r\n | \"running\"\r\n | \"completed\"\r\n | \"failed\";\r\n\r\nexport type AttachmentRepresentationKind =\r\n | \"thumbnail\"\r\n | \"ocr_text\"\r\n | \"plain_text\"\r\n | \"pdf_text\"\r\n | \"pdf_page_image\"\r\n | \"archive_manifest\"\r\n | \"directory_manifest\";\r\n\r\nexport interface AttachmentAssetRecord {\r\n id: string;\r\n displayName: string;\r\n declaredMediaType?: string;\r\n mediaType?: string;\r\n sizeBytes?: number;\r\n sha256?: string;\r\n status: AttachmentAssetStatus;\r\n failureCode?: string;\r\n createdAt: number;\r\n updatedAt: number;\r\n deletedAt?: number;\r\n}\r\n\r\nexport interface SessionInputAttachmentRecord {\r\n id: string;\r\n sessionId: string;\r\n inputId: string;\r\n assetId: string;\r\n seq: number;\r\n intent: AttachmentIntent;\r\n displayName: string;\r\n mediaType: string;\r\n sizeBytes: number;\r\n metadata: Record<string, unknown>;\r\n createdAt: number;\r\n}\r\n\r\nexport interface AttachmentRepresentationRecord {\r\n id: string;\r\n assetId: string;\r\n kind: AttachmentRepresentationKind;\r\n status: AttachmentRepresentationStatus;\r\n processor: string;\r\n processorVersion: string;\r\n cacheKey: string;\r\n mediaType: string;\r\n text?: string;\r\n error?: string;\r\n metadata: Record<string, unknown>;\r\n createdAt: number;\r\n updatedAt: number;\r\n}\r\n\r\nexport interface AttachmentLimits {\r\n maxFilesPerPrompt: number;\r\n maxBytesPerFile: number;\r\n maxBytesPerPrompt: number;\r\n maxSessionReferencedBytes: number;\r\n resumableThresholdBytes: number;\r\n uploadSessionTtlMs: number;\r\n stagingTtlMs: number;\r\n}\r\n\r\nexport const DEFAULT_ATTACHMENT_LIMITS: Readonly<AttachmentLimits> = {\r\n maxFilesPerPrompt: 20,\r\n maxBytesPerFile: 100 * 1024 * 1024,\r\n maxBytesPerPrompt: 250 * 1024 * 1024,\r\n maxSessionReferencedBytes: 2 * 1024 * 1024 * 1024,\r\n resumableThresholdBytes: 25 * 1024 * 1024,\r\n uploadSessionTtlMs: 24 * 60 * 60 * 1_000,\r\n stagingTtlMs: 24 * 60 * 60 * 1_000,\r\n};\r\n\r\nexport function parseAttachmentLimits(value: unknown): AttachmentLimits {\r\n const record = recordValue(value, \"attachment limits\");\r\n const limits: AttachmentLimits = {\r\n maxFilesPerPrompt: positiveInteger(\r\n record.maxFilesPerPrompt,\r\n \"maxFilesPerPrompt\",\r\n ),\r\n maxBytesPerFile: positiveInteger(record.maxBytesPerFile, \"maxBytesPerFile\"),\r\n maxBytesPerPrompt: positiveInteger(\r\n record.maxBytesPerPrompt,\r\n \"maxBytesPerPrompt\",\r\n ),\r\n maxSessionReferencedBytes: positiveInteger(\r\n record.maxSessionReferencedBytes,\r\n \"maxSessionReferencedBytes\",\r\n ),\r\n resumableThresholdBytes: positiveInteger(\r\n record.resumableThresholdBytes,\r\n \"resumableThresholdBytes\",\r\n ),\r\n uploadSessionTtlMs: positiveInteger(\r\n record.uploadSessionTtlMs,\r\n \"uploadSessionTtlMs\",\r\n ),\r\n stagingTtlMs: positiveInteger(record.stagingTtlMs, \"stagingTtlMs\"),\r\n };\r\n if (limits.resumableThresholdBytes > limits.maxBytesPerFile) {\r\n throw new Error(\"resumableThresholdBytes must not exceed maxBytesPerFile\");\r\n }\r\n if (limits.maxBytesPerFile > limits.maxBytesPerPrompt) {\r\n throw new Error(\"maxBytesPerFile must not exceed maxBytesPerPrompt\");\r\n }\r\n if (limits.maxBytesPerPrompt > limits.maxSessionReferencedBytes) {\r\n throw new Error(\r\n \"maxBytesPerPrompt must not exceed maxSessionReferencedBytes\",\r\n );\r\n }\r\n return limits;\r\n}\r\n\r\nexport function parseAttachmentAssetRecord(\r\n value: unknown,\r\n): AttachmentAssetRecord {\r\n const record = recordValue(value, \"attachment asset\");\r\n const status = enumValue(\r\n record.status,\r\n [\"importing\", \"ready\", \"failed\", \"deleted\"] as const,\r\n \"status\",\r\n );\r\n const asset: AttachmentAssetRecord = {\r\n id: nonEmptyString(record.id, \"id\"),\r\n displayName: nonEmptyString(record.displayName, \"displayName\"),\r\n status,\r\n createdAt: nonNegativeInteger(record.createdAt, \"createdAt\"),\r\n updatedAt: nonNegativeInteger(record.updatedAt, \"updatedAt\"),\r\n };\r\n\r\n const declaredMediaType = optionalNonEmptyString(\r\n record.declaredMediaType,\r\n \"declaredMediaType\",\r\n );\r\n const mediaType = optionalNonEmptyString(record.mediaType, \"mediaType\");\r\n const sizeBytes = optionalNonNegativeInteger(record.sizeBytes, \"sizeBytes\");\r\n const sha256 = optionalSha256(record.sha256);\r\n const failureCode = optionalNonEmptyString(record.failureCode, \"failureCode\");\r\n const deletedAt = optionalNonNegativeInteger(record.deletedAt, \"deletedAt\");\r\n\r\n if (declaredMediaType !== undefined) asset.declaredMediaType = declaredMediaType;\r\n if (mediaType !== undefined) asset.mediaType = mediaType;\r\n if (sizeBytes !== undefined) asset.sizeBytes = sizeBytes;\r\n if (sha256 !== undefined) asset.sha256 = sha256;\r\n if (failureCode !== undefined) asset.failureCode = failureCode;\r\n if (deletedAt !== undefined) asset.deletedAt = deletedAt;\r\n\r\n if (status === \"ready\" || status === \"deleted\") {\r\n if (asset.mediaType === undefined) throw new Error(\"mediaType is required\");\r\n if (asset.sizeBytes === undefined) throw new Error(\"sizeBytes is required\");\r\n if (asset.sha256 === undefined) throw new Error(\"sha256 is required\");\r\n }\r\n if (status === \"failed\" && asset.failureCode === undefined) {\r\n throw new Error(\"failureCode is required\");\r\n }\r\n if (status === \"deleted\" && asset.deletedAt === undefined) {\r\n throw new Error(\"deletedAt is required\");\r\n }\r\n return asset;\r\n}\r\n\r\nfunction recordValue(value: unknown, field: string): Record<string, unknown> {\r\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\r\n throw new Error(`${field} must be an object`);\r\n }\r\n return value as Record<string, unknown>;\r\n}\r\n\r\nfunction positiveInteger(value: unknown, field: string): number {\r\n if (!Number.isSafeInteger(value) || Number(value) < 1) {\r\n throw new Error(`${field} must be a positive safe integer`);\r\n }\r\n return Number(value);\r\n}\r\n\r\nfunction nonNegativeInteger(value: unknown, field: string): number {\r\n if (!Number.isSafeInteger(value) || Number(value) < 0) {\r\n throw new Error(`${field} must be a non-negative safe integer`);\r\n }\r\n return Number(value);\r\n}\r\n\r\nfunction optionalNonNegativeInteger(\r\n value: unknown,\r\n field: string,\r\n): number | undefined {\r\n return value === undefined ? undefined : nonNegativeInteger(value, field);\r\n}\r\n\r\nfunction nonEmptyString(value: unknown, field: string): string {\r\n if (typeof value !== \"string\" || value.length === 0) {\r\n throw new Error(`${field} must be a non-empty string`);\r\n }\r\n return value;\r\n}\r\n\r\nfunction optionalNonEmptyString(\r\n value: unknown,\r\n field: string,\r\n): string | undefined {\r\n return value === undefined ? undefined : nonEmptyString(value, field);\r\n}\r\n\r\nfunction optionalSha256(value: unknown): string | undefined {\r\n if (value === undefined) return undefined;\r\n if (typeof value !== \"string\" || !/^[a-f0-9]{64}$/.test(value)) {\r\n throw new Error(\"sha256 must be 64 lowercase hexadecimal characters\");\r\n }\r\n return value;\r\n}\r\n\r\nfunction enumValue<const T extends readonly string[]>(\r\n value: unknown,\r\n allowed: T,\r\n field: string,\r\n): T[number] {\r\n if (typeof value !== \"string\" || !allowed.includes(value)) {\r\n throw new Error(`${field} must be one of: ${allowed.join(\", \")}`);\r\n }\r\n return value as T[number];\r\n}\r\n",
10
- "import {\r\n parseAttachmentLimits,\r\n type AttachmentLimits,\r\n} from \"./attachment.js\";\r\n\r\nexport interface ProtocolVersion {\r\n version: number;\r\n}\r\n\r\nexport interface ServerCapabilities {\r\n serverVersion: string;\r\n protocol: ProtocolVersion;\r\n features: Record<string, number>;\r\n attachments?: AttachmentTransferCapabilities;\r\n}\r\n\r\nexport type AttachmentUploadMode = \"single\" | \"resumable\";\r\n\r\nexport interface AttachmentTransferCapabilities {\r\n limits: AttachmentLimits;\r\n uploadModes: readonly [\"single\"] | readonly [\"single\", \"resumable\"];\r\n}\r\n\r\nexport interface ClientProtocolSupport {\r\n version: number;\r\n}\r\n\r\nexport interface ProtocolCompatibility {\r\n compatible: boolean;\r\n reason?: string;\r\n}\r\n\r\nexport function parseServerCapabilities(value: unknown): ServerCapabilities {\r\n if (!isRecord(value)) throw new Error(\"Capabilities response must be an object\");\r\n if (typeof value.serverVersion !== \"string\") throw new Error(\"serverVersion must be a string\");\r\n if (!isRecord(value.protocol)) throw new Error(\"protocol must be an object\");\r\n const version = positiveInteger(value.protocol.version, \"protocol.version\");\r\n if (!isRecord(value.features)) throw new Error(\"features must be an object\");\r\n const features: Record<string, number> = {};\r\n for (const [name, version] of Object.entries(value.features)) {\r\n features[name] = positiveInteger(version, `features.${name}`);\r\n }\r\n const attachments = parseAttachmentTransferCapabilities(value.attachments);\r\n return {\r\n serverVersion: value.serverVersion,\r\n protocol: { version },\r\n features,\r\n ...(attachments ? { attachments } : {}),\r\n };\r\n}\r\n\r\nexport function checkProtocolCompatibility(\r\n server: ServerCapabilities,\r\n client: ClientProtocolSupport,\r\n): ProtocolCompatibility {\r\n if (client.version !== server.protocol.version) {\r\n return {\r\n compatible: false,\r\n reason: `Client protocol ${client.version} does not match server protocol ${server.protocol.version}`,\r\n };\r\n }\r\n return { compatible: true };\r\n}\r\n\r\nexport function supportsFeature(\r\n capabilities: ServerCapabilities,\r\n feature: string,\r\n minimumVersion = 1,\r\n): boolean {\r\n return (capabilities.features[feature] ?? 0) >= minimumVersion;\r\n}\r\n\r\nfunction positiveInteger(value: unknown, field: string): number {\r\n if (!Number.isInteger(value) || Number(value) < 1) throw new Error(`${field} must be a positive integer`);\r\n return Number(value);\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction parseAttachmentTransferCapabilities(\r\n value: unknown,\r\n): AttachmentTransferCapabilities | undefined {\r\n if (value === undefined) return undefined;\r\n if (!isRecord(value)) throw new Error(\"attachments must be an object\");\r\n if (!Array.isArray(value.uploadModes) || value.uploadModes.length === 0) {\r\n throw new Error(\"attachments.uploadModes must be a non-empty array\");\r\n }\r\n if (\r\n value.uploadModes[0] !== \"single\" ||\r\n value.uploadModes.length > 2 ||\r\n (value.uploadModes.length === 2 && value.uploadModes[1] !== \"resumable\")\r\n ) {\r\n throw new Error(\r\n 'attachments.uploadModes must be [\"single\"] or [\"single\", \"resumable\"]',\r\n );\r\n }\r\n const uploadModes = value.uploadModes as [\"single\"] | [\"single\", \"resumable\"];\r\n return {\r\n limits: parseAttachmentLimits(value.limits),\r\n uploadModes,\r\n };\r\n}\r\n",
11
- "export * from \"./session.js\";\r\nexport * from \"./runtime-config.js\";\r\nexport * from \"./requests.js\";\r\nexport * from \"./job.js\";\r\nexport * from \"./terminal.js\";\r\nexport * from \"./serialization.js\";\r\nexport * from \"./channel.js\";\r\nexport * from \"./capabilities.js\";\r\nexport * from \"./attachment.js\";\r\n",
12
- "/**\r\n * daemon HTTP/SSE 客户端。\r\n *\r\n * 包装 `@openharness/server` 的 REST 路由与 `/events/stream` SSE;\r\n * 不含本地状态归并(见 `reducer.ts` / `sync.ts`)。\r\n */\r\n\r\nimport type {\r\n AdmitClientPromptInput,\r\n CommandCatalogEntry,\r\n CreateClientSessionInput,\r\n EditLatestClientPromptInput,\r\n CancelQueuedClientPromptInput,\r\n CancelQueuedPromptResponse,\r\n EventSyncOptions,\r\n ForkClientSessionInput,\r\n InterruptSessionResponse,\r\n ListClientMessagePartsOptions,\r\n ListCommandsOptions,\r\n ListEventsOptions,\r\n ListMessagesOptions,\r\n ListPermissionsOptions,\r\n ListSessionsOptions,\r\n ListProjectsOptions,\r\n ProjectRecord,\r\n AgentPersonaInfo,\r\n AuthStatus,\r\n CompactSessionResponse,\r\n CreateBackgroundShellInput,\r\n CreateBackgroundShellResult,\r\n CustomProviderInput,\r\n CreateScheduledTaskInput,\r\n HookInfo,\r\n ReloadPluginsResponse,\r\n RewindSessionResponse,\r\n McpServerStatus,\r\n MemoryEntryRecord,\r\n MemoryListResponse,\r\n ModelProviderInfo,\r\n OpenHarnessClientOptions,\r\n OpenHarnessServerHealth,\r\n PermissionRequestRecord,\r\n PluginInfo,\r\n PromoteQueuedClientPromptInput,\r\n PromoteQueuedPromptResponse,\r\n PromptResponse,\r\n ResumeInterruptedRunInput,\r\n ResumeInterruptedRunResponse,\r\n ProviderInfo,\r\n OutputStyleInfo,\r\n RememberSessionResponse,\r\n ScheduledRunRecord,\r\n ScheduledTaskRecord,\r\n ScheduledTaskStatusSummary,\r\n ReplyPermissionInput,\r\n SessionEventRecord,\r\n SessionExportResponse,\r\n SessionMessagePartRecord,\r\n SessionMessageRecord,\r\n SessionRecord,\r\n SessionStateSnapshot,\r\n SessionUsageResponse,\r\n StartDreamResponse,\r\n UpdateClientSessionInput,\r\n UpdateScheduledTaskInput,\r\n UploadAttachmentInput,\r\n DownloadAttachmentOptions,\r\n AttachmentAssetRecord,\r\n AttachmentStorageGcResult,\r\n AttachmentStorageRepairResult,\r\n AttachmentStorageReport,\r\n} from \"../types/index.js\";\r\nimport type {\r\n JobKind,\r\n JobReadResult,\r\n JobSnapshot,\r\n JobStatus,\r\n JobWaitResult,\r\n TerminalCreateRequest,\r\n TerminalEvent,\r\n TerminalReadResult,\r\n TerminalResizeRequest,\r\n TerminalSessionInfo,\r\n TerminalSignal,\r\n TerminalSource,\r\n TerminalWriteRequest,\r\n DurableChannelMessageInput,\r\n DurableChannelMessageResult,\r\n RecordChannelDeliveryInput,\r\n ChannelDeliveryRecord,\r\n ChannelStatusSnapshot,\r\n ClientProtocolSupport,\r\n ServerCapabilities,\r\n} from \"@openharness/protocol\";\r\nimport {\r\n checkProtocolCompatibility,\r\n decodeJobReadResult,\r\n decodeJobSnapshot,\r\n decodeJobWaitResult,\r\n decodeSessionEventRecord,\r\n decodeSessionStateSnapshot,\r\n decodeTerminalEvent,\r\n decodeTerminalReadResult,\r\n decodeTerminalSessionInfo,\r\n ProtocolDataError,\r\n parseServerCapabilities,\r\n parseAttachmentAssetRecord,\r\n} from \"@openharness/protocol\";\r\n\r\nlet promptRequestCounter = 0;\r\n\r\nfunction responseField(value: unknown, field: string): unknown {\r\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\r\n throw new ProtocolDataError(\"Response body must be an object\");\r\n }\r\n if (!(field in value)) {\r\n throw new ProtocolDataError(`Response body is missing ${field}`, field);\r\n }\r\n return (value as Record<string, unknown>)[field];\r\n}\r\n\r\nfunction responseArray<T>(\r\n value: unknown,\r\n field: string,\r\n decode: (item: unknown) => T,\r\n): T[] {\r\n const items = responseField(value, field);\r\n if (!Array.isArray(items)) {\r\n throw new ProtocolDataError(`Response ${field} must be an array`, field);\r\n }\r\n return items.map(decode);\r\n}\r\n\r\n/** Normalize a daemon base URL without accepting credentials or request fragments. */\r\nexport function normalizeDaemonBaseUrl(value: string): string {\r\n const raw = value.trim();\r\n if (!raw) throw new Error(\"Daemon URL is required\");\r\n\r\n let url: URL;\r\n try {\r\n url = new URL(raw);\r\n } catch {\r\n throw new Error(\"Daemon URL must be an absolute http or https URL\");\r\n }\r\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\r\n throw new Error(\"Daemon URL must use http or https\");\r\n }\r\n if (url.username || url.password) {\r\n throw new Error(\r\n \"Daemon URL must not contain credentials; use a bearer token instead\",\r\n );\r\n }\r\n if (url.search || url.hash) {\r\n throw new Error(\r\n \"Daemon URL must not contain query parameters or a fragment\",\r\n );\r\n }\r\n\r\n const pathname = url.pathname.replace(/\\/+$/, \"\");\r\n return `${url.origin}${pathname === \"/\" ? \"\" : pathname}`;\r\n}\r\n\r\n/** Generate a caller-stable id for one prompt admission attempt. */\r\nexport function createPromptRequestId(): string {\r\n if (typeof globalThis.crypto?.randomUUID === \"function\")\r\n return globalThis.crypto.randomUUID();\r\n promptRequestCounter += 1;\r\n return `prompt-${Date.now().toString(36)}-${promptRequestCounter.toString(36)}`;\r\n}\r\n\r\n/** HTTP API 非 2xx 时抛出;携带 status 与原始响应体。 */\r\nexport class OpenHarnessApiError extends Error {\r\n constructor(\r\n message: string,\r\n readonly status: number,\r\n readonly body: unknown,\r\n ) {\r\n super(message);\r\n this.name = \"OpenHarnessApiError\";\r\n }\r\n}\r\n\r\n/**\r\n * 面向 daemon 的 typed fetch 客户端。\r\n * 构造时传入 `baseUrl` 与可选 Bearer `token`(通常来自 daemon registry)。\r\n */\r\nexport class OpenHarnessClient {\r\n private readonly baseUrl: string;\r\n private readonly token?: string;\r\n private readonly fetchImpl: typeof fetch;\r\n\r\n constructor(options: OpenHarnessClientOptions) {\r\n this.baseUrl = normalizeDaemonBaseUrl(options.baseUrl);\r\n this.token = options.token;\r\n this.fetchImpl = options.fetch ?? fetch;\r\n }\r\n\r\n /** `GET /health` */\r\n async health(\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<OpenHarnessServerHealth> {\r\n return this.request<OpenHarnessServerHealth>(\"/health\", {\r\n auth: false,\r\n signal: options.signal,\r\n });\r\n }\r\n\r\n /** 连接产品应先调用它,再根据 features 决定显示哪些功能。 */\r\n async capabilities(\r\n options: { signal?: AbortSignal; support?: ClientProtocolSupport } = {},\r\n ): Promise<ServerCapabilities> {\r\n const value = await this.request<unknown>(\"/capabilities\", {\r\n auth: false,\r\n signal: options.signal,\r\n });\r\n const capabilities = parseServerCapabilities(value);\r\n const compatibility = checkProtocolCompatibility(\r\n capabilities,\r\n options.support ?? { version: 2 },\r\n );\r\n if (!compatibility.compatible) {\r\n throw new IncompatibleProtocolError(\r\n capabilities,\r\n compatibility.reason ??\r\n \"Client and server protocol versions are incompatible\",\r\n );\r\n }\r\n return capabilities;\r\n }\r\n\r\n /** `POST /attachments` — upload bytes without JSON or multipart buffering. */\r\n async uploadAttachment(\r\n input: UploadAttachmentInput,\r\n ): Promise<AttachmentAssetRecord> {\r\n const headers = this.headers();\r\n headers[\"x-openharness-filename\"] = encodeURIComponent(input.displayName);\r\n if (input.mediaType) headers[\"content-type\"] = input.mediaType;\r\n const init: RequestInit & { duplex?: \"half\" } = {\r\n method: \"POST\",\r\n headers,\r\n body: input.body as RequestInit[\"body\"],\r\n signal: input.signal,\r\n };\r\n if (isReadableStream(input.body)) init.duplex = \"half\";\r\n const response = await this.fetchImpl(`${this.baseUrl}/attachments`, init);\r\n if (!response.ok) await this.throwResponseError(response);\r\n return parseAttachmentAssetRecord(await response.json());\r\n }\r\n\r\n async getAttachment(\r\n id: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<AttachmentAssetRecord> {\r\n const value = await this.request<unknown>(\r\n `/attachments/${encodeURIComponent(id)}`,\r\n { signal: options.signal },\r\n );\r\n return parseAttachmentAssetRecord(value);\r\n }\r\n\r\n /** Returns the raw response so callers can consume the body as a stream. */\r\n async downloadAttachment(\r\n id: string,\r\n options: DownloadAttachmentOptions = {},\r\n ): Promise<Response> {\r\n const range = attachmentRangeHeader(options.range);\r\n const headers = this.headers();\r\n if (range) headers.range = range;\r\n const response = await this.fetchImpl(\r\n `${this.baseUrl}/attachments/${encodeURIComponent(id)}/content`,\r\n { method: \"GET\", headers, signal: options.signal },\r\n );\r\n if (!response.ok) await this.throwResponseError(response);\r\n return response;\r\n }\r\n\r\n async deleteAttachment(\r\n id: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<AttachmentAssetRecord> {\r\n const value = await this.request<unknown>(\r\n `/attachments/${encodeURIComponent(id)}`,\r\n { method: \"DELETE\", signal: options.signal },\r\n );\r\n return parseAttachmentAssetRecord(value);\r\n }\r\n\r\n async scanAttachmentStorage(\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<AttachmentStorageReport> {\r\n return await this.request<AttachmentStorageReport>(\"/attachments/storage\", {\r\n signal: options.signal,\r\n });\r\n }\r\n\r\n async repairAttachmentStorage(\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<AttachmentStorageRepairResult> {\r\n return await this.request<AttachmentStorageRepairResult>(\"/attachments/storage/actions\", {\r\n method: \"POST\",\r\n body: { action: \"repair-safe\" },\r\n signal: options.signal,\r\n });\r\n }\r\n\r\n async gcAttachmentStorage(\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<AttachmentStorageGcResult> {\r\n return await this.request<AttachmentStorageGcResult>(\"/attachments/storage/actions\", {\r\n method: \"POST\",\r\n body: { action: \"gc\" },\r\n signal: options.signal,\r\n });\r\n }\r\n\r\n async handleChannelMessage(\r\n input: DurableChannelMessageInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<DurableChannelMessageResult> {\r\n return await this.request<DurableChannelMessageResult>(\r\n \"/channels/messages\",\r\n { method: \"POST\", body: input, signal: options.signal },\r\n );\r\n }\r\n\r\n async recordChannelDelivery(\r\n deliveryId: string,\r\n input: RecordChannelDeliveryInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ChannelDeliveryRecord> {\r\n const response = await this.request<{ delivery: ChannelDeliveryRecord }>(\r\n `/channels/deliveries/${encodeURIComponent(deliveryId)}/result`,\r\n { method: \"POST\", body: input, signal: options.signal },\r\n );\r\n return response.delivery;\r\n }\r\n\r\n async getChannelStatus(\r\n options: { connector?: string; limit?: number; signal?: AbortSignal } = {},\r\n ): Promise<ChannelStatusSnapshot> {\r\n const { signal, ...query } = options;\r\n return await this.request<ChannelStatusSnapshot>(\r\n this.path(\"/channels/status\", query),\r\n { signal },\r\n );\r\n }\r\n\r\n async listPendingChannelDeliveries(\r\n options: { connector?: string; limit?: number; signal?: AbortSignal } = {},\r\n ): Promise<ChannelDeliveryRecord[]> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<{\r\n deliveries: ChannelDeliveryRecord[];\r\n }>(this.path(\"/channels/deliveries/pending\", query), { signal });\r\n return response.deliveries;\r\n }\r\n\r\n /** `GET /commands?cwd=` — cwd-scoped slash command catalog for autocomplete. */\r\n async listCommands(\r\n options: ListCommandsOptions & { signal?: AbortSignal },\r\n ): Promise<CommandCatalogEntry[]> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<{ commands: CommandCatalogEntry[] }>(\r\n this.path(\"/commands\", query),\r\n { signal },\r\n );\r\n return response.commands;\r\n }\r\n\r\n /** `GET /settings` */\r\n async getSettings(\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<Record<string, unknown>> {\r\n const response = await this.request<{ settings: Record<string, unknown> }>(\r\n \"/settings\",\r\n { signal: options.signal },\r\n );\r\n return response.settings;\r\n }\r\n\r\n /** `PATCH /settings` */\r\n async patchSettings(\r\n patch: Record<string, unknown>,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<Record<string, unknown>> {\r\n const response = await this.request<{ settings: Record<string, unknown> }>(\r\n \"/settings\",\r\n {\r\n method: \"PATCH\",\r\n body: patch,\r\n signal: options.signal,\r\n },\r\n );\r\n return response.settings;\r\n }\r\n\r\n /** `GET /providers` */\r\n async listProviders(\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ProviderInfo[]> {\r\n const response = await this.request<{ providers: ProviderInfo[] }>(\r\n \"/providers\",\r\n { signal: options.signal },\r\n );\r\n return response.providers;\r\n }\r\n\r\n async createCustomProvider(\r\n input: CustomProviderInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ProviderInfo> {\r\n const response = await this.request<{ provider: ProviderInfo }>(\r\n \"/providers/custom\",\r\n {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n },\r\n );\r\n return response.provider;\r\n }\r\n\r\n async connectCatalogProvider(\r\n id: string,\r\n apiKey: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ProviderInfo> {\r\n const response = await this.request<{ provider: ProviderInfo }>(\r\n `/providers/catalog/${encodeURIComponent(id)}/connect`,\r\n { method: \"POST\", body: { apiKey }, signal: options.signal },\r\n );\r\n return response.provider;\r\n }\r\n\r\n async disconnectCatalogProvider(\r\n id: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<void> {\r\n await this.request<{ ok: true }>(\r\n `/providers/catalog/${encodeURIComponent(id)}/connect`,\r\n { method: \"DELETE\", signal: options.signal },\r\n );\r\n }\r\n\r\n async updateCustomProvider(\r\n id: string,\r\n input: CustomProviderInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ProviderInfo> {\r\n const response = await this.request<{ provider: ProviderInfo }>(\r\n `/providers/custom/${encodeURIComponent(id)}`,\r\n { method: \"PATCH\", body: input, signal: options.signal },\r\n );\r\n return response.provider;\r\n }\r\n\r\n async removeCustomProvider(\r\n id: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<void> {\r\n await this.request<{ ok: true }>(\r\n `/providers/custom/${encodeURIComponent(id)}`,\r\n {\r\n method: \"DELETE\",\r\n signal: options.signal,\r\n },\r\n );\r\n }\r\n\r\n /** `GET /models` */\r\n async listModels(\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ModelProviderInfo[]> {\r\n const response = await this.request<{ providers: ModelProviderInfo[] }>(\r\n \"/models\",\r\n { signal: options.signal },\r\n );\r\n return response.providers;\r\n }\r\n\r\n /** `GET /sessions/:id/mcp` */\r\n async getSessionMcp(\r\n sessionId: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<McpServerStatus[]> {\r\n const response = await this.request<{ servers: McpServerStatus[] }>(\r\n `/sessions/${encodeURIComponent(sessionId)}/mcp`,\r\n { signal: options.signal },\r\n );\r\n return response.servers;\r\n }\r\n\r\n /** `GET /memory?cwd=` */\r\n async listMemory(options: {\r\n cwd: string;\r\n signal?: AbortSignal;\r\n }): Promise<MemoryListResponse> {\r\n const { signal, ...query } = options;\r\n return await this.request<MemoryListResponse>(this.path(\"/memory\", query), {\r\n signal,\r\n });\r\n }\r\n\r\n /** `GET /memory/:id?cwd=` */\r\n async getMemory(\r\n entryId: string,\r\n options: { cwd: string; signal?: AbortSignal },\r\n ): Promise<MemoryEntryRecord> {\r\n const { signal, cwd } = options;\r\n const response = await this.request<{ entry: MemoryEntryRecord }>(\r\n this.path(`/memory/${encodeURIComponent(entryId)}`, { cwd }),\r\n { signal },\r\n );\r\n return response.entry;\r\n }\r\n\r\n /** `POST /memory` */\r\n async addMemory(\r\n input: { cwd: string; content: string; tags?: string[] },\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<MemoryEntryRecord> {\r\n const response = await this.request<{ entry: MemoryEntryRecord }>(\r\n \"/memory\",\r\n {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n },\r\n );\r\n return response.entry;\r\n }\r\n\r\n /** `DELETE /memory/:id?cwd=` */\r\n async removeMemory(\r\n entryId: string,\r\n options: { cwd: string; signal?: AbortSignal },\r\n ): Promise<void> {\r\n const { signal, cwd } = options;\r\n await this.request<{ deleted: boolean }>(\r\n this.path(`/memory/${encodeURIComponent(entryId)}`, { cwd }),\r\n { method: \"DELETE\", signal },\r\n );\r\n }\r\n\r\n /** `GET /auth` */\r\n async getAuthStatus(\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<AuthStatus> {\r\n const response = await this.request<{ auth: AuthStatus }>(\"/auth\", {\r\n signal: options.signal,\r\n });\r\n return response.auth;\r\n }\r\n\r\n /** `POST /auth/login` */\r\n async authLogin(\r\n input: { provider: string; apiKey?: string },\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<{ message: string }> {\r\n return await this.request<{ message: string }>(\"/auth/login\", {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n });\r\n }\r\n\r\n /** `POST /auth/logout` */\r\n async authLogout(\r\n input: { provider: string },\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<{ message: string }> {\r\n return await this.request<{ message: string }>(\"/auth/logout\", {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n });\r\n }\r\n\r\n /** `GET /context?cwd=` */\r\n async getContextPreview(options: {\r\n cwd: string;\r\n signal?: AbortSignal;\r\n }): Promise<string> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<{ report: string }>(\r\n this.path(\"/context\", query),\r\n { signal },\r\n );\r\n return response.report;\r\n }\r\n\r\n /** `GET /context/status?cwd=` */\r\n async getContextStatus(options: {\r\n cwd: string;\r\n signal?: AbortSignal;\r\n }): Promise<string> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<{ report: string }>(\r\n this.path(\"/context/status\", query),\r\n { signal },\r\n );\r\n return response.report;\r\n }\r\n\r\n /** `POST /sessions/:id/compact` */\r\n async compactSession(\r\n sessionId: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<CompactSessionResponse> {\r\n return await this.request<CompactSessionResponse>(\r\n `/sessions/${encodeURIComponent(sessionId)}/compact`,\r\n { method: \"POST\", signal: options.signal },\r\n );\r\n }\r\n\r\n /** `POST /sessions/:id/rewind` */\r\n async rewindSession(\r\n sessionId: string,\r\n input: { count?: number } = {},\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<RewindSessionResponse> {\r\n return await this.request<RewindSessionResponse>(\r\n `/sessions/${encodeURIComponent(sessionId)}/rewind`,\r\n { method: \"POST\", body: input, signal: options.signal },\r\n );\r\n }\r\n\r\n /** `POST /sessions/:id/remember` */\r\n async rememberSession(\r\n sessionId: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<RememberSessionResponse> {\r\n return await this.request<RememberSessionResponse>(\r\n `/sessions/${encodeURIComponent(sessionId)}/remember`,\r\n { method: \"POST\", signal: options.signal },\r\n );\r\n }\r\n\r\n /** `POST /dream` */\r\n async startDream(\r\n input: { cwd: string; sessionId?: string; preview?: boolean },\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<StartDreamResponse> {\r\n return await this.request<StartDreamResponse>(\"/dream\", {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n });\r\n }\r\n\r\n /** `GET /profile` */\r\n async getProfileStatus(\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<string> {\r\n const response = await this.request<{ report: string }>(\"/profile\", {\r\n signal: options.signal,\r\n });\r\n return response.report;\r\n }\r\n\r\n /** `POST /profile/init` */\r\n async initProfile(options: { signal?: AbortSignal } = {}): Promise<string> {\r\n const response = await this.request<{ report: string }>(\"/profile/init\", {\r\n method: \"POST\",\r\n signal: options.signal,\r\n });\r\n return response.report;\r\n }\r\n\r\n /** `GET /output-styles` */\r\n async listOutputStyles(\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<OutputStyleInfo[]> {\r\n const response = await this.request<{ styles: OutputStyleInfo[] }>(\r\n \"/output-styles\",\r\n {\r\n signal: options.signal,\r\n },\r\n );\r\n return response.styles;\r\n }\r\n\r\n /** `POST /project/init` */\r\n async initProject(\r\n input: { cwd: string },\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<string> {\r\n const response = await this.request<{ report: string }>(\"/project/init\", {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n });\r\n return response.report;\r\n }\r\n\r\n /** `GET /plugins?cwd=` */\r\n async listPlugins(options: { cwd: string; signal?: AbortSignal }): Promise<{\r\n plugins: PluginInfo[];\r\n warnings: string[];\r\n }> {\r\n const { signal, ...query } = options;\r\n return await this.request<{ plugins: PluginInfo[]; warnings: string[] }>(\r\n this.path(\"/plugins\", query),\r\n { signal },\r\n );\r\n }\r\n\r\n /** `POST /plugins/:id/enable` */\r\n async enablePlugin(\r\n id: string,\r\n input: { cwd: string },\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<{ message: string }> {\r\n return await this.request<{ message: string }>(\r\n `/plugins/${encodeURIComponent(id)}/enable`,\r\n { method: \"POST\", body: input, signal: options.signal },\r\n );\r\n }\r\n\r\n /** `POST /plugins/:id/disable` */\r\n async disablePlugin(\r\n id: string,\r\n input: { cwd: string },\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<{ message: string }> {\r\n return await this.request<{ message: string }>(\r\n `/plugins/${encodeURIComponent(id)}/disable`,\r\n { method: \"POST\", body: input, signal: options.signal },\r\n );\r\n }\r\n\r\n async installLocalPlugin(input: {\r\n cwd: string;\n sourcePath: string;\n scope: \"user\";\n approvedPermissions: string[];\r\n link?: boolean;\r\n }): Promise<{ message: string }> {\r\n return await this.request<{ message: string }>(\r\n input.link ? \"/plugins/link-local\" : \"/plugins/install-local\",\r\n { method: \"POST\", body: input },\r\n );\r\n }\r\n\r\n async uninstallPlugin(\r\n id: string,\r\n input: { cwd: string },\r\n ): Promise<{ message: string }> {\r\n return await this.request<{ message: string }>(\r\n `/plugins/${encodeURIComponent(id)}`,\r\n { method: \"DELETE\", body: input },\r\n );\r\n }\r\n\r\n /** `POST /plugins/reload` */\r\n async reloadPlugins(\r\n input: { cwd: string },\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ReloadPluginsResponse> {\r\n return await this.request<ReloadPluginsResponse>(\"/plugins/reload\", {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n });\r\n }\r\n\r\n /** `GET /agent-personas` */\r\n async listAgentPersonas(\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<AgentPersonaInfo[]> {\r\n const response = await this.request<{ agents: AgentPersonaInfo[] }>(\r\n \"/agent-personas\",\r\n {\r\n signal: options.signal,\r\n },\r\n );\r\n return response.agents;\r\n }\r\n\r\n /** `GET /hooks?cwd=&sessionId=` */\r\n async listHooks(options: {\r\n cwd: string;\r\n sessionId?: string;\r\n signal?: AbortSignal;\r\n }): Promise<HookInfo[]> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<{ hooks: HookInfo[] }>(\r\n this.path(\"/hooks\", query),\r\n { signal },\r\n );\r\n return response.hooks;\r\n }\r\n\r\n /** `GET /git/diff?cwd=&full=` */\r\n async getGitDiff(options: {\r\n cwd: string;\r\n full?: boolean;\r\n signal?: AbortSignal;\r\n }): Promise<string> {\r\n const { signal, cwd, full } = options;\r\n const response = await this.request<{ output: string }>(\r\n this.path(\"/git/diff\", { cwd, ...(full ? { full: \"true\" } : {}) }),\r\n { signal },\r\n );\r\n return response.output;\r\n }\r\n\r\n /** `GET /git/branch?cwd=&list=` */\r\n async getGitBranch(options: {\r\n cwd: string;\r\n list?: boolean;\r\n signal?: AbortSignal;\r\n }): Promise<string> {\r\n const { signal, cwd, list } = options;\r\n const response = await this.request<{ output: string }>(\r\n this.path(\"/git/branch\", { cwd, ...(list ? { list: \"true\" } : {}) }),\r\n { signal },\r\n );\r\n return response.output;\r\n }\r\n\r\n /** `GET /git/status?cwd=` */\r\n async getGitStatus(options: {\r\n cwd: string;\r\n signal?: AbortSignal;\r\n }): Promise<string> {\r\n const { signal, cwd } = options;\r\n const response = await this.request<{ output: string }>(\r\n this.path(\"/git/status\", { cwd }),\r\n { signal },\r\n );\r\n return response.output;\r\n }\r\n\r\n /** `POST /git/commit` */\r\n async gitCommit(\r\n input: { cwd: string; message: string },\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<string> {\r\n const response = await this.request<{ output: string }>(\"/git/commit\", {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n });\r\n return response.output;\r\n }\r\n\r\n /** `GET /sessions/:id/usage` */\r\n async getSessionUsage(\r\n sessionId: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<SessionUsageResponse> {\r\n return await this.request<SessionUsageResponse>(\r\n `/sessions/${encodeURIComponent(sessionId)}/usage`,\r\n { signal: options.signal },\r\n );\r\n }\r\n\r\n /** `POST /sessions/:id/export` */\r\n async exportSession(\r\n sessionId: string,\r\n input: { filename?: string; json?: boolean } = {},\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<SessionExportResponse> {\r\n return await this.request<SessionExportResponse>(\r\n `/sessions/${encodeURIComponent(sessionId)}/export`,\r\n { method: \"POST\", body: input, signal: options.signal },\r\n );\r\n }\r\n\r\n /** `GET /sessions` */\r\n async listSessions(\r\n options: ListSessionsOptions & { signal?: AbortSignal } = {},\r\n ): Promise<SessionRecord[]> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<{ sessions: SessionRecord[] }>(\r\n this.path(\"/sessions\", query),\r\n { signal },\r\n );\r\n return response.sessions;\r\n }\r\n\r\n async listProjects(\r\n options: ListProjectsOptions & { signal?: AbortSignal } = {},\r\n ): Promise<ProjectRecord[]> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<{ projects: ProjectRecord[] }>(\r\n this.path(\"/projects\", query),\r\n { signal },\r\n );\r\n return response.projects;\r\n }\r\n\r\n async inspectProject(path: string): Promise<ProjectRecord> {\r\n return (\r\n await this.request<{ project: ProjectRecord }>(\"/projects/inspect\", {\r\n method: \"POST\",\r\n body: { path },\r\n })\r\n ).project;\r\n }\r\n\r\n async renameProject(projectId: string, name: string): Promise<ProjectRecord> {\r\n return (\r\n await this.request<{ project: ProjectRecord }>(\r\n `/projects/${encodeURIComponent(projectId)}`,\r\n { method: \"PATCH\", body: { name } },\r\n )\r\n ).project;\r\n }\r\n\r\n async setProjectPinned(\r\n projectId: string,\r\n pinned: boolean,\r\n ): Promise<ProjectRecord> {\r\n return (\r\n await this.request<{ project: ProjectRecord }>(\r\n `/projects/${encodeURIComponent(projectId)}`,\r\n { method: \"PATCH\", body: { pinned } },\r\n )\r\n ).project;\r\n }\r\n\r\n async setProjectDefaultShell(\r\n projectId: string,\r\n defaultShell: string | null,\r\n ): Promise<ProjectRecord> {\r\n return (\r\n await this.request<{ project: ProjectRecord }>(\r\n `/projects/${encodeURIComponent(projectId)}`,\r\n { method: \"PATCH\", body: { defaultShell } },\r\n )\r\n ).project;\r\n }\r\n\r\n async rebindProject(projectId: string, path: string): Promise<ProjectRecord> {\r\n return (\r\n await this.request<{ project: ProjectRecord }>(\r\n `/projects/${encodeURIComponent(projectId)}/rebind`,\r\n { method: \"POST\", body: { path } },\r\n )\r\n ).project;\r\n }\r\n\r\n async archiveProject(projectId: string): Promise<ProjectRecord> {\r\n return (\r\n await this.request<{ project: ProjectRecord }>(\r\n `/projects/${encodeURIComponent(projectId)}`,\r\n { method: \"DELETE\" },\r\n )\r\n ).project;\r\n }\r\n\r\n /** `POST /sessions` */\r\n async createSession(\r\n input: CreateClientSessionInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<SessionRecord> {\r\n const response = await this.request<{ session: SessionRecord }>(\r\n \"/sessions\",\r\n {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n },\r\n );\r\n return response.session;\r\n }\r\n\r\n /** `GET /sessions/:id` */\r\n async getSession(\r\n sessionId: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<SessionRecord> {\r\n const response = await this.request<{ session: SessionRecord }>(\r\n `/sessions/${encodeURIComponent(sessionId)}`,\r\n {\r\n signal: options.signal,\r\n },\r\n );\r\n return response.session;\r\n }\r\n\r\n /** `POST /sessions/:id/fork` */\r\n async forkSession(\r\n sessionId: string,\r\n input: ForkClientSessionInput = {},\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<SessionRecord> {\r\n const response = await this.request<{ session: SessionRecord }>(\r\n `/sessions/${encodeURIComponent(sessionId)}/fork`,\r\n {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n },\r\n );\r\n return response.session;\r\n }\r\n\r\n /** `GET /sessions/:id/state` - atomic attach snapshot plus SSE cursor. */\r\n async getSessionState(\r\n sessionId: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<SessionStateSnapshot> {\r\n const response = await this.request<unknown>(\r\n `/sessions/${encodeURIComponent(sessionId)}/state`,\r\n {\r\n signal: options.signal,\r\n },\r\n );\r\n return decodeSessionStateSnapshot(response);\r\n }\r\n\r\n /** `DELETE /sessions/:id` */\r\n async archiveSession(\r\n sessionId: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<SessionRecord> {\r\n const response = await this.request<{ session: SessionRecord }>(\r\n `/sessions/${encodeURIComponent(sessionId)}`,\r\n {\r\n method: \"DELETE\",\r\n signal: options.signal,\r\n },\r\n );\r\n return response.session;\r\n }\r\n\r\n /** `DELETE /sessions/:id/hard` */\r\n async deleteSession(\r\n sessionId: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<string[]> {\r\n const response = await this.request<{ deletedSessionIds: string[] }>(\r\n `/sessions/${encodeURIComponent(sessionId)}/hard`,\r\n {\r\n method: \"DELETE\",\r\n signal: options.signal,\r\n },\r\n );\r\n return response.deletedSessionIds;\r\n }\r\n\r\n /** `PATCH /sessions/:id` - update title, agent, or metadata.runtime fields. */\r\n async updateSession(\r\n sessionId: string,\r\n input: UpdateClientSessionInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<SessionRecord> {\r\n const response = await this.request<{ session: SessionRecord }>(\r\n `/sessions/${encodeURIComponent(sessionId)}`,\r\n {\r\n method: \"PATCH\",\r\n body: input,\r\n signal: options.signal,\r\n },\r\n );\r\n return response.session;\r\n }\r\n\r\n /** `GET /sessions/:id/messages` */\r\n async listMessages(\r\n sessionId: string,\r\n options: ListMessagesOptions & { signal?: AbortSignal } = {},\r\n ): Promise<SessionMessageRecord[]> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<{ messages: SessionMessageRecord[] }>(\r\n this.path(`/sessions/${encodeURIComponent(sessionId)}/messages`, query),\r\n { signal },\r\n );\r\n return response.messages;\r\n }\r\n\r\n /** `GET /sessions/:id/parts` */\r\n async listMessageParts(\r\n sessionId: string,\r\n options: ListClientMessagePartsOptions & { signal?: AbortSignal } = {},\r\n ): Promise<SessionMessagePartRecord[]> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<{ parts: SessionMessagePartRecord[] }>(\r\n this.path(`/sessions/${encodeURIComponent(sessionId)}/parts`, query),\r\n { signal },\r\n );\r\n return response.parts;\r\n }\r\n\r\n /** `POST /sessions/:id/prompts` — 提交用户输入并触发/排队一次 run。 */\r\n async admitPrompt(\r\n sessionId: string,\r\n input: AdmitClientPromptInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<PromptResponse> {\r\n return await this.request<PromptResponse>(\r\n `/sessions/${encodeURIComponent(sessionId)}/prompts`,\r\n {\r\n method: \"POST\",\r\n body: { ...input, id: input.id ?? createPromptRequestId() },\r\n signal: options.signal,\r\n },\r\n );\r\n }\r\n\r\n /** `POST /sessions/:id/prompts/latest/edit` */\r\n async editLatestPrompt(\r\n sessionId: string,\r\n input: EditLatestClientPromptInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<PromptResponse> {\r\n return await this.request<PromptResponse>(\r\n `/sessions/${encodeURIComponent(sessionId)}/prompts/latest/edit`,\r\n {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n },\r\n );\r\n }\r\n\r\n /** Promote one durable queued prompt into the exact active run. */\r\n async promoteQueuedPrompt(\r\n sessionId: string,\r\n inputId: string,\r\n input: PromoteQueuedClientPromptInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<PromoteQueuedPromptResponse> {\r\n return await this.request<PromoteQueuedPromptResponse>(\r\n `/sessions/${encodeURIComponent(sessionId)}/prompts/${encodeURIComponent(inputId)}/promote`,\r\n { method: \"POST\", body: input, signal: options.signal },\r\n );\r\n }\r\n\r\n /** Cancel one durable prompt that is still waiting in the run queue. */\r\n async cancelQueuedPrompt(\r\n sessionId: string,\r\n inputId: string,\r\n input: CancelQueuedClientPromptInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<CancelQueuedPromptResponse> {\r\n return await this.request<CancelQueuedPromptResponse>(\r\n `/sessions/${encodeURIComponent(sessionId)}/prompts/${encodeURIComponent(inputId)}/cancel`,\r\n { method: \"POST\", body: input, signal: options.signal },\r\n );\r\n }\r\n\r\n /**\r\n * `POST /sessions/:id/runs/:runId/resume` — 显式重放一次中断 run 的原始 prompt。\r\n * 不会继续旧 provider stream;服务端会创建一个带恢复溯源的新 input/run。\r\n */\r\n async resumeInterruptedRun(\r\n sessionId: string,\r\n runId: string,\r\n input: ResumeInterruptedRunInput = {},\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ResumeInterruptedRunResponse> {\r\n return await this.request<ResumeInterruptedRunResponse>(\r\n `/sessions/${encodeURIComponent(sessionId)}/runs/${encodeURIComponent(runId)}/resume`,\r\n {\r\n method: \"POST\",\r\n body: { ...input, id: input.id ?? createPromptRequestId() },\r\n signal: options.signal,\r\n },\r\n );\r\n }\r\n\r\n /** `POST /sessions/:id/interrupt` — 中断当前/排队中的 run。 */\r\n async interruptSession(\r\n sessionId: string,\r\n options: { signal?: AbortSignal; expectedRunId?: string } = {},\r\n ): Promise<InterruptSessionResponse> {\r\n return await this.request<InterruptSessionResponse>(\r\n `/sessions/${encodeURIComponent(sessionId)}/interrupt`,\r\n {\r\n method: \"POST\",\r\n body: options.expectedRunId\r\n ? { expectedRunId: options.expectedRunId }\r\n : undefined,\r\n signal: options.signal,\r\n },\r\n );\r\n }\r\n\r\n /** `GET /events` — 用于 attach 时的历史 replay。 */\r\n async listEvents(\r\n options: ListEventsOptions & { signal?: AbortSignal } = {},\r\n ): Promise<SessionEventRecord[]> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<unknown>(this.path(\"/events\", query), {\r\n signal,\r\n });\r\n return responseArray(response, \"events\", decodeSessionEventRecord);\r\n }\r\n\r\n /** `GET /permissions` */\r\n async listPermissions(\r\n options: ListPermissionsOptions & { signal?: AbortSignal } = {},\r\n ): Promise<PermissionRequestRecord[]> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<{\r\n requests: PermissionRequestRecord[];\r\n }>(this.path(\"/permissions\", query), { signal });\r\n return response.requests;\r\n }\r\n\r\n /** `POST /permissions/:id/reply` — 批准/拒绝工具权限请求。 */\r\n async replyPermission(\r\n requestId: string,\r\n input: ReplyPermissionInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<PermissionRequestRecord> {\r\n const response = await this.request<{ request: PermissionRequestRecord }>(\r\n `/permissions/${encodeURIComponent(requestId)}/reply`,\r\n {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n },\r\n );\r\n return response.request;\r\n }\r\n\r\n async getScheduledTaskStatus(\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ScheduledTaskStatusSummary> {\r\n return await this.request<ScheduledTaskStatusSummary>(\"/schedules/status\", {\r\n signal: options.signal,\r\n });\r\n }\r\n\r\n async listScheduledTasks(\r\n options: {\r\n status?: ScheduledTaskRecord[\"status\"];\r\n signal?: AbortSignal;\r\n } = {},\r\n ): Promise<ScheduledTaskRecord[]> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<{ tasks: ScheduledTaskRecord[] }>(\r\n this.path(\"/schedules/tasks\", query),\r\n { signal },\r\n );\r\n return response.tasks;\r\n }\r\n\r\n async getScheduledTask(\r\n id: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ScheduledTaskRecord> {\r\n const response = await this.request<{ task: ScheduledTaskRecord }>(\r\n `/schedules/tasks/${encodeURIComponent(id)}`,\r\n { signal: options.signal },\r\n );\r\n return response.task;\r\n }\r\n\r\n async createScheduledTask(\r\n input: CreateScheduledTaskInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ScheduledTaskRecord> {\r\n const response = await this.request<{ task: ScheduledTaskRecord }>(\r\n \"/schedules/tasks\",\r\n {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n },\r\n );\r\n return response.task;\r\n }\r\n\r\n async updateScheduledTask(\r\n id: string,\r\n input: UpdateScheduledTaskInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ScheduledTaskRecord> {\r\n const response = await this.request<{ task: ScheduledTaskRecord }>(\r\n `/schedules/tasks/${encodeURIComponent(id)}`,\r\n { method: \"PATCH\", body: input, signal: options.signal },\r\n );\r\n return response.task;\r\n }\r\n\r\n async removeScheduledTask(\r\n id: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<void> {\r\n await this.request<{ removed: true }>(\r\n `/schedules/tasks/${encodeURIComponent(id)}`,\r\n {\r\n method: \"DELETE\",\r\n signal: options.signal,\r\n },\r\n );\r\n }\r\n\r\n async triggerScheduledTask(\r\n id: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ScheduledRunRecord> {\r\n const response = await this.request<{ run: ScheduledRunRecord }>(\r\n `/schedules/tasks/${encodeURIComponent(id)}/run`,\r\n { method: \"POST\", signal: options.signal },\r\n );\r\n return response.run;\r\n }\r\n\r\n async listScheduledRuns(\r\n options: {\r\n taskId?: string;\r\n unread?: boolean;\r\n limit?: number;\r\n signal?: AbortSignal;\r\n } = {},\r\n ): Promise<ScheduledRunRecord[]> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<{ runs: ScheduledRunRecord[] }>(\r\n this.path(\"/schedules/runs\", query),\r\n { signal },\r\n );\r\n return response.runs;\r\n }\r\n\r\n async setScheduledRunUnread(\r\n id: string,\r\n unread: boolean,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<ScheduledRunRecord> {\r\n const response = await this.request<{ run: ScheduledRunRecord }>(\r\n `/schedules/runs/${encodeURIComponent(id)}/read`,\r\n { method: \"PATCH\", body: { unread }, signal: options.signal },\r\n );\r\n return response.run;\r\n }\r\n\r\n async createTerminal(\r\n input: TerminalCreateRequest,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<TerminalSessionInfo> {\r\n const response = await this.request<unknown>(\"/terminals\", {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n });\r\n return decodeTerminalSessionInfo(responseField(response, \"terminal\"));\r\n }\r\n\r\n async listJobs(options: {\r\n sessionId: string;\r\n kinds?: JobKind[];\r\n statuses?: JobStatus[];\r\n startedAfter?: number;\r\n startedBefore?: number;\r\n updatedAfter?: number;\r\n updatedBefore?: number;\r\n includeFinished?: boolean;\r\n limit?: number;\r\n signal?: AbortSignal;\r\n }): Promise<JobSnapshot[]> {\r\n const { signal, kinds, statuses, includeFinished, ...query } = options;\r\n const response = await this.request<unknown>(\r\n this.path(\"/jobs\", {\r\n ...query,\r\n ...(kinds ? { kinds: kinds.join(\",\") } : {}),\r\n ...(statuses ? { statuses: statuses.join(\",\") } : {}),\r\n ...(includeFinished !== undefined\r\n ? { includeFinished: String(includeFinished) }\r\n : {}),\r\n }),\r\n { signal },\r\n );\r\n return responseArray(response, \"jobs\", decodeJobSnapshot);\r\n }\r\n\r\n async createBackgroundShell(\r\n input: CreateBackgroundShellInput,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<CreateBackgroundShellResult> {\r\n return await this.request<CreateBackgroundShellResult>(\r\n \"/background-shells\",\r\n {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n },\r\n );\r\n }\r\n\r\n async readJob(\r\n jobId: string,\r\n options: {\r\n sessionId: string;\r\n after?: number;\r\n maxChars?: number;\r\n signal?: AbortSignal;\r\n },\r\n ): Promise<JobReadResult> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<unknown>(\r\n this.path(`/jobs/${encodeURIComponent(jobId)}`, query),\r\n { signal },\r\n );\r\n return decodeJobReadResult(response);\r\n }\r\n\r\n async waitJob(\r\n jobId: string,\r\n input: {\r\n sessionId: string;\r\n timeoutMs?: number;\r\n after?: number;\r\n maxChars?: number;\r\n },\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<JobWaitResult> {\r\n const response = await this.request<unknown>(\r\n `/jobs/${encodeURIComponent(jobId)}/wait`,\r\n {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n },\r\n );\r\n return decodeJobWaitResult(response);\r\n }\r\n\r\n async sendJob(\r\n jobId: string,\r\n input: { sessionId: string; data: string },\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<void> {\r\n await this.request(`/jobs/${encodeURIComponent(jobId)}/input`, {\r\n method: \"POST\",\r\n body: input,\r\n signal: options.signal,\r\n });\r\n }\r\n\r\n async cancelJob(\r\n jobId: string,\r\n input: { sessionId: string; reason?: string },\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<JobSnapshot> {\r\n const response = await this.request<unknown>(\r\n `/jobs/${encodeURIComponent(jobId)}/cancel`,\r\n { method: \"POST\", body: input, signal: options.signal },\r\n );\r\n return decodeJobSnapshot(responseField(response, \"snapshot\"));\r\n }\r\n\r\n async listTerminals(\r\n options: {\r\n projectId?: string;\r\n sessionId?: string;\r\n source?: TerminalSource;\r\n signal?: AbortSignal;\r\n } = {},\r\n ): Promise<TerminalSessionInfo[]> {\r\n const { signal, ...query } = options;\r\n const response = await this.request<unknown>(\r\n this.path(\"/terminals\", query),\r\n { signal },\r\n );\r\n return responseArray(response, \"terminals\", decodeTerminalSessionInfo);\r\n }\r\n\r\n async getTerminal(\r\n terminalId: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<TerminalSessionInfo> {\r\n const response = await this.request<unknown>(\r\n `/terminals/${encodeURIComponent(terminalId)}`,\r\n { signal: options.signal },\r\n );\r\n return decodeTerminalSessionInfo(responseField(response, \"terminal\"));\r\n }\r\n\r\n async readTerminal(\r\n terminalId: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<TerminalReadResult> {\r\n const response = await this.request<unknown>(\r\n `/terminals/${encodeURIComponent(terminalId)}/output`,\r\n { signal: options.signal },\r\n );\r\n return decodeTerminalReadResult(responseField(response, \"snapshot\"));\r\n }\r\n\r\n async writeTerminal(\r\n input: TerminalWriteRequest,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<void> {\r\n await this.request<{ written: true }>(\r\n `/terminals/${encodeURIComponent(input.terminalId)}/input`,\r\n { method: \"POST\", body: { data: input.data }, signal: options.signal },\r\n );\r\n }\r\n\r\n async resizeTerminal(\r\n input: TerminalResizeRequest,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<void> {\r\n await this.request<{ resized: true }>(\r\n `/terminals/${encodeURIComponent(input.terminalId)}/resize`,\r\n {\r\n method: \"POST\",\r\n body: { cols: input.cols, rows: input.rows },\r\n signal: options.signal,\r\n },\r\n );\r\n }\r\n\r\n async signalTerminal(\r\n terminalId: string,\r\n signal: TerminalSignal,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<void> {\r\n await this.request<{ signaled: true }>(\r\n `/terminals/${encodeURIComponent(terminalId)}/signal`,\r\n { method: \"POST\", body: { signal }, signal: options.signal },\r\n );\r\n }\r\n\r\n async closeTerminal(\r\n terminalId: string,\r\n options: { signal?: AbortSignal } = {},\r\n ): Promise<void> {\r\n await this.request<{ removed: true }>(\r\n `/terminals/${encodeURIComponent(terminalId)}`,\r\n {\r\n method: \"DELETE\",\r\n signal: options.signal,\r\n },\r\n );\r\n }\r\n\r\n streamTerminalEvents(\r\n options: { signal?: AbortSignal } = {},\r\n ): AsyncIterable<TerminalEvent> {\r\n return streamServerSentEvents(async () => {\r\n const response = await this.fetchImpl(\r\n `${this.baseUrl}/terminals/stream`,\r\n {\r\n headers: this.headers(),\r\n signal: options.signal,\r\n },\r\n );\r\n if (!response.ok) await this.throwResponseError(response);\r\n if (!response.body)\r\n throw new Error(\"Terminal event stream response has no body\");\r\n return response.body;\r\n }, decodeTerminalEvent);\r\n }\r\n\r\n streamEvents(\r\n options: EventSyncOptions = {},\r\n ): AsyncIterable<SessionEventRecord> {\r\n return streamServerSentEvents(async () => {\r\n const query = {\r\n cursor: options.cursor,\r\n sessionId: options.sessionId,\r\n };\r\n const response = await this.fetchImpl(\r\n `${this.baseUrl}${this.path(\"/events/stream\", query)}`,\r\n {\r\n headers: this.headers(),\r\n signal: options.signal,\r\n },\r\n );\r\n if (!response.ok) await this.throwResponseError(response);\r\n if (!response.body) throw new Error(\"Event stream response has no body\");\r\n return response.body;\r\n }, decodeSessionEventRecord);\r\n }\r\n\r\n private async request<T>(\r\n path: string,\r\n options: {\r\n method?: string;\r\n body?: unknown;\r\n signal?: AbortSignal;\r\n auth?: boolean;\r\n } = {},\r\n ): Promise<T> {\r\n const response = await this.fetchImpl(`${this.baseUrl}${path}`, {\r\n method: options.method ?? \"GET\",\r\n headers: this.headers(options.body !== undefined, options.auth ?? true),\r\n body:\r\n options.body === undefined ? undefined : JSON.stringify(options.body),\r\n signal: options.signal,\r\n });\r\n if (!response.ok) await this.throwResponseError(response);\r\n return (await response.json()) as T;\r\n }\r\n\r\n private headers(json = false, auth = true): Record<string, string> {\r\n return {\r\n ...(auth && this.token ? { authorization: `Bearer ${this.token}` } : {}),\r\n ...(json ? { \"content-type\": \"application/json\" } : {}),\r\n };\r\n }\r\n\r\n /** 拼 query;跳过 undefined / null / false。 */\r\n private path(pathname: string, query: Record<string, unknown> = {}): string {\r\n const params = new URLSearchParams();\r\n for (const [key, value] of Object.entries(query)) {\r\n if (value === undefined || value === null || value === false) continue;\r\n params.set(key, String(value));\r\n }\r\n const qs = params.toString();\r\n return qs ? `${pathname}?${qs}` : pathname;\r\n }\r\n\r\n private async throwResponseError(response: Response): Promise<never> {\r\n let body: unknown;\r\n try {\r\n body = await response.json();\r\n } catch {\r\n body = await response.text().catch(() => \"\");\r\n }\r\n const message =\r\n body &&\r\n typeof body === \"object\" &&\r\n \"error\" in body &&\r\n typeof body.error === \"string\"\r\n ? body.error\r\n : body &&\r\n typeof body === \"object\" &&\r\n \"message\" in body &&\r\n typeof body.message === \"string\"\r\n ? body.message\r\n : `OpenHarness API request failed with ${response.status}`;\r\n throw new OpenHarnessApiError(message, response.status, body);\r\n }\r\n}\r\n\r\nfunction isReadableStream(value: unknown): value is ReadableStream<Uint8Array> {\r\n return (\r\n typeof ReadableStream !== \"undefined\" && value instanceof ReadableStream\r\n );\r\n}\r\n\r\nfunction attachmentRangeHeader(\r\n range: DownloadAttachmentOptions[\"range\"],\r\n): string | undefined {\r\n if (!range) return undefined;\r\n const { start, end, suffixBytes } = range;\r\n if (suffixBytes !== undefined) {\r\n if (start !== undefined || end !== undefined) {\r\n throw new Error(\"suffixBytes cannot be combined with start or end\");\r\n }\r\n assertPositiveSafeInteger(suffixBytes, \"suffixBytes\");\r\n return `bytes=-${suffixBytes}`;\r\n }\r\n if (start === undefined && end === undefined) return undefined;\r\n if (start === undefined) {\r\n throw new Error(\"range start is required when end is provided\");\r\n }\r\n assertNonNegativeSafeInteger(start, \"start\");\r\n if (end === undefined) return `bytes=${start}-`;\r\n assertNonNegativeSafeInteger(end, \"end\");\r\n if (end < start) throw new Error(\"range end must not be less than start\");\r\n return `bytes=${start}-${end}`;\r\n}\r\n\r\nfunction assertNonNegativeSafeInteger(value: number, field: string): void {\r\n if (!Number.isSafeInteger(value) || value < 0) {\r\n throw new Error(`${field} must be a non-negative safe integer`);\r\n }\r\n}\r\n\r\nfunction assertPositiveSafeInteger(value: number, field: string): void {\r\n if (!Number.isSafeInteger(value) || value < 1) {\r\n throw new Error(`${field} must be a positive safe integer`);\r\n }\r\n}\r\n\r\n/**\r\n * 将 SSE 字节流解析为 `SessionEventRecord` 异步迭代。\r\n * `open` 负责建立连接并返回 response body,便于重试或注入。\r\n */\r\nexport async function* streamServerSentEvents<T = SessionEventRecord>(\r\n open: () => Promise<ReadableStream<Uint8Array>>,\r\n decode: (value: unknown) => T = (value) => value as T,\r\n): AsyncIterable<T> {\r\n const reader = (await open()).getReader();\r\n const decoder = new TextDecoder();\r\n let buffer = \"\";\r\n try {\r\n while (true) {\r\n const chunk = await reader.read();\r\n if (chunk.done) break;\r\n buffer += decoder.decode(chunk.value, { stream: true });\r\n // SSE 事件以空行分隔\r\n const frames = buffer.split(/\\r?\\n\\r?\\n/);\r\n buffer = frames.pop() ?? \"\";\r\n for (const frame of frames) {\r\n const event = parseSseFrame(frame);\r\n if (event !== undefined) yield decode(event);\r\n }\r\n }\r\n buffer += decoder.decode();\r\n const event = parseSseFrame(buffer);\r\n if (event !== undefined) yield decode(event);\r\n } finally {\r\n reader.releaseLock();\r\n }\r\n}\r\n\r\n/** 解析单个 SSE frame 的 `data:` 行,得到事件 JSON。 */\r\nfunction parseSseFrame(frame: string): unknown | undefined {\r\n let data = \"\";\r\n for (const line of frame.split(/\\r?\\n/)) {\r\n if (!line || line.startsWith(\":\")) continue;\r\n if (line.startsWith(\"data:\")) data += line.slice(5).trimStart();\r\n }\r\n if (!data) return undefined;\r\n return JSON.parse(data) as unknown;\r\n}\r\n\r\nexport class IncompatibleProtocolError extends Error {\r\n constructor(\r\n readonly capabilities: ServerCapabilities,\r\n message: string,\r\n ) {\r\n super(message);\r\n this.name = \"IncompatibleProtocolError\";\r\n }\r\n}\r\n",
8
+ "import type {\n PermissionRequestRecord,\n SessionEventRecord,\n SessionExecutionRecord,\n SessionInputRecord,\n SessionMessagePartRecord,\n SessionMessageRecord,\n SessionRunAttemptRecord,\n SessionRunRecord,\n SessionStateSnapshot,\n} from \"./session.js\";\nimport type { AttachmentIntent } from \"./attachment.js\";\nimport type { JobReadResult, JobSnapshot, JobWaitResult } from \"./job.js\";\nimport type {\n TerminalEvent,\n TerminalReadResult,\n TerminalSessionInfo,\n TerminalWaitResult,\n} from \"./terminal.js\";\nimport type { ProtocolError } from \"./requests.js\";\n\nexport class ProtocolDataError extends Error {\n readonly code = \"invalid_protocol_data\";\n readonly details?: Record<string, unknown>;\n\n constructor(message: string, path?: string) {\n super(message);\n this.name = \"ProtocolDataError\";\n this.details = path ? { path } : undefined;\n }\n\n toProtocolError(): ProtocolError {\n return {\n code: this.code,\n message: this.message,\n ...(this.details ? { details: this.details } : {}),\n };\n }\n}\n\ntype DataRecord = Record<string, unknown>;\ntype Validator<T> = (value: unknown, path: string) => T;\n\nfunction parseJson(text: string): unknown {\n try {\n return JSON.parse(text) as unknown;\n } catch {\n throw new ProtocolDataError(\"Protocol data must be valid JSON\");\n }\n}\n\nfunction object(value: unknown, path: string): DataRecord {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new ProtocolDataError(`${path} must be an object`, path);\n }\n return value as DataRecord;\n}\n\nfunction stringField(value: DataRecord, field: string, path: string): string {\n const fieldPath = `${path}.${field}`;\n if (typeof value[field] !== \"string\") {\n throw new ProtocolDataError(`${fieldPath} must be a string`, fieldPath);\n }\n return value[field] as string;\n}\n\nfunction optionalString(value: DataRecord, field: string, path: string): void {\n const fieldValue = value[field];\n if (fieldValue !== undefined && typeof fieldValue !== \"string\") {\n const fieldPath = `${path}.${field}`;\n throw new ProtocolDataError(`${fieldPath} must be a string`, fieldPath);\n }\n}\n\nfunction numberField(value: DataRecord, field: string, path: string): number {\n const fieldPath = `${path}.${field}`;\n const fieldValue = value[field];\n if (typeof fieldValue !== \"number\" || !Number.isFinite(fieldValue)) {\n throw new ProtocolDataError(`${fieldPath} must be a finite number`, fieldPath);\n }\n return fieldValue;\n}\n\nfunction optionalNumber(\n value: DataRecord,\n field: string,\n path: string,\n nullable = false,\n): void {\n const fieldValue = value[field];\n if (fieldValue === undefined || (nullable && fieldValue === null)) return;\n if (typeof fieldValue !== \"number\" || !Number.isFinite(fieldValue)) {\n const fieldPath = `${path}.${field}`;\n throw new ProtocolDataError(`${fieldPath} must be a finite number`, fieldPath);\n }\n}\n\nfunction booleanField(value: DataRecord, field: string, path: string): boolean {\n const fieldPath = `${path}.${field}`;\n if (typeof value[field] !== \"boolean\") {\n throw new ProtocolDataError(`${fieldPath} must be a boolean`, fieldPath);\n }\n return value[field] as boolean;\n}\n\nfunction recordField(value: DataRecord, field: string, path: string): DataRecord {\n return object(value[field], `${path}.${field}`);\n}\n\nfunction optionalRecord(value: DataRecord, field: string, path: string): void {\n if (value[field] !== undefined) object(value[field], `${path}.${field}`);\n}\n\nfunction enumField<const T extends readonly string[]>(\n value: DataRecord,\n field: string,\n path: string,\n allowed: T,\n): T[number] {\n const fieldPath = `${path}.${field}`;\n const fieldValue = value[field];\n if (typeof fieldValue !== \"string\" || !allowed.includes(fieldValue)) {\n throw new ProtocolDataError(\n `${fieldPath} must be one of: ${allowed.join(\", \")}`,\n fieldPath,\n );\n }\n return fieldValue as T[number];\n}\n\nfunction arrayField<T>(\n value: DataRecord,\n field: string,\n path: string,\n validate: Validator<T>,\n): T[] {\n const fieldPath = `${path}.${field}`;\n const items = value[field];\n if (!Array.isArray(items)) {\n throw new ProtocolDataError(`${fieldPath} must be an array`, fieldPath);\n }\n return items.map((item, index) => validate(item, `${fieldPath}[${index}]`));\n}\n\nfunction validateSession(value: unknown, path: string) {\n const item = object(value, path);\n stringField(item, \"id\", path);\n stringField(item, \"cwd\", path);\n stringField(item, \"title\", path);\n stringField(item, \"model\", path);\n enumField(item, \"status\", path, [\"idle\", \"running\", \"closing\", \"archived\", \"error\"] as const);\n recordField(item, \"metadata\", path);\n numberField(item, \"createdAt\", path);\n numberField(item, \"updatedAt\", path);\n for (const field of [\"parentId\", \"projectId\", \"cwdRelative\", \"agent\"] as const) {\n optionalString(item, field, path);\n }\n optionalNumber(item, \"archivedAt\", path);\n return item;\n}\n\nfunction validateInput(value: unknown, path: string): SessionInputRecord {\n const item = object(value, path);\n stringField(item, \"id\", path);\n stringField(item, \"sessionId\", path);\n numberField(item, \"seq\", path);\n enumField(item, \"delivery\", path, [\"queue\", \"steer\"] as const);\n stringField(item, \"content\", path);\n const attachments = arrayField(item, \"attachments\", path, validateInputAttachment);\n const assetIds = new Set<string>();\n for (const [index, attachment] of attachments.entries()) {\n const attachmentPath = `${path}.attachments[${index}]`;\n if (attachment.sessionId !== item.sessionId) {\n throw new ProtocolDataError(\n `${attachmentPath}.sessionId must match ${path}.sessionId`,\n `${attachmentPath}.sessionId`,\n );\n }\n if (attachment.inputId !== item.id) {\n throw new ProtocolDataError(\n `${attachmentPath}.inputId must match ${path}.id`,\n `${attachmentPath}.inputId`,\n );\n }\n if (attachment.seq !== index) {\n throw new ProtocolDataError(\n `${attachmentPath}.seq must equal its array index`,\n `${attachmentPath}.seq`,\n );\n }\n if (assetIds.has(attachment.assetId)) {\n throw new ProtocolDataError(\n `${attachmentPath}.assetId must be unique within the input`,\n `${attachmentPath}.assetId`,\n );\n }\n assetIds.add(attachment.assetId);\n }\n optionalString(item, \"promotedMessageId\", path);\n recordField(item, \"metadata\", path);\n numberField(item, \"createdAt\", path);\n return item as unknown as SessionInputRecord;\n}\n\nfunction validateInputAttachment(value: unknown, path: string) {\n const item = object(value, path);\n for (const field of [\"id\", \"sessionId\", \"inputId\", \"assetId\", \"displayName\", \"mediaType\"] as const) {\n stringField(item, field, path);\n }\n numberField(item, \"seq\", path);\n enumField(item, \"intent\", path, [\n \"auto\",\n \"vision\",\n \"ocr\",\n \"document\",\n \"tool_resource\",\n \"workspace_reference\",\n ] as const satisfies readonly AttachmentIntent[]);\n numberField(item, \"sizeBytes\", path);\n recordField(item, \"metadata\", path);\n numberField(item, \"createdAt\", path);\n return item as unknown as SessionInputRecord[\"attachments\"][number];\n}\n\nfunction validateMessage(value: unknown, path: string): SessionMessageRecord {\n const item = object(value, path);\n stringField(item, \"id\", path);\n stringField(item, \"sessionId\", path);\n numberField(item, \"seq\", path);\n enumField(item, \"role\", path, [\"system\", \"user\", \"assistant\"] as const);\n optionalString(item, \"runId\", path);\n optionalString(item, \"inputId\", path);\n recordField(item, \"metadata\", path);\n numberField(item, \"createdAt\", path);\n numberField(item, \"updatedAt\", path);\n return item as unknown as SessionMessageRecord;\n}\n\nfunction validatePart(value: unknown, path: string): SessionMessagePartRecord {\n const item = object(value, path);\n stringField(item, \"id\", path);\n stringField(item, \"sessionId\", path);\n stringField(item, \"messageId\", path);\n numberField(item, \"seq\", path);\n const type = enumField(item, \"type\", path, [\n \"text\",\n \"attachment\",\n \"transformation\",\n \"reasoning\",\n \"tool\",\n \"tool_result\",\n \"error\",\n \"log\",\n ] as const);\n enumField(item, \"status\", path, [\"pending\", \"running\", \"completed\", \"failed\", \"interrupted\"] as const);\n for (const field of [\"text\", \"toolUseId\", \"toolName\"] as const) optionalString(item, field, path);\n optionalRecord(item, \"input\", path);\n if (item.isError !== undefined && typeof item.isError !== \"boolean\") {\n throw new ProtocolDataError(`${path}.isError must be a boolean`, `${path}.isError`);\n }\n if (type === \"attachment\") {\n for (const field of [\"assetId\", \"displayName\", \"mediaType\"] as const) {\n stringField(item, field, path);\n }\n enumField(item, \"intent\", path, [\n \"auto\",\n \"vision\",\n \"ocr\",\n \"document\",\n \"tool_resource\",\n \"workspace_reference\",\n ] as const);\n numberField(item, \"sizeBytes\", path);\n }\n if (type === \"transformation\") {\n stringField(item, \"assetId\", path);\n enumField(item, \"kind\", path, [\"direct\", \"document_extract\", \"tool_mount\"] as const);\n for (const field of [\"representationId\", \"processor\", \"transformationError\"] as const) {\n optionalString(item, field, path);\n }\n }\n recordField(item, \"metadata\", path);\n numberField(item, \"createdAt\", path);\n numberField(item, \"updatedAt\", path);\n return item as unknown as SessionMessagePartRecord;\n}\n\nfunction validateRun(value: unknown, path: string): SessionRunRecord {\n const item = object(value, path);\n stringField(item, \"id\", path);\n stringField(item, \"sessionId\", path);\n optionalString(item, \"inputId\", path);\n enumField(item, \"status\", path, [\"pending\", \"running\", \"completed\", \"failed\", \"interrupted\"] as const);\n optionalNumber(item, \"startedAt\", path);\n optionalNumber(item, \"finishedAt\", path);\n optionalString(item, \"error\", path);\n recordField(item, \"metadata\", path);\n numberField(item, \"createdAt\", path);\n numberField(item, \"updatedAt\", path);\n return item as unknown as SessionRunRecord;\n}\n\nfunction validateAttempt(value: unknown, path: string): SessionRunAttemptRecord {\n const item = object(value, path);\n stringField(item, \"id\", path);\n stringField(item, \"runId\", path);\n numberField(item, \"sequence\", path);\n enumField(item, \"status\", path, [\"pending\", \"running\", \"completed\", \"failed\", \"cancelled\"] as const);\n for (const field of [\"provider\", \"model\", \"retryReason\", \"errorKind\", \"error\"] as const) {\n optionalString(item, field, path);\n }\n for (const field of [\"inputTokens\", \"outputTokens\", \"startedAt\", \"finishedAt\"] as const) {\n optionalNumber(item, field, path);\n }\n numberField(item, \"createdAt\", path);\n numberField(item, \"updatedAt\", path);\n return item as unknown as SessionRunAttemptRecord;\n}\n\nfunction validateTask(value: unknown, path: string): SessionExecutionRecord {\n const item = object(value, path);\n for (const field of [\"id\", \"sessionId\", \"type\", \"description\", \"cwd\"] as const) {\n stringField(item, field, path);\n }\n for (const field of [\"childSessionId\", \"runId\", \"requestNamespace\", \"requestId\", \"output\", \"error\"] as const) {\n optionalString(item, field, path);\n }\n enumField(item, \"status\", path, [\"pending\", \"running\", \"completed\", \"failed\", \"stopped\", \"interrupted\"] as const);\n recordField(item, \"metadata\", path);\n numberField(item, \"createdAt\", path);\n optionalNumber(item, \"startedAt\", path);\n optionalNumber(item, \"finishedAt\", path);\n numberField(item, \"updatedAt\", path);\n return item as unknown as SessionExecutionRecord;\n}\n\nfunction validatePermission(value: unknown, path: string): PermissionRequestRecord {\n const item = object(value, path);\n for (const field of [\"id\", \"sessionId\", \"toolName\"] as const) stringField(item, field, path);\n optionalString(item, \"runId\", path);\n recordField(item, \"payload\", path);\n enumField(item, \"status\", path, [\"pending\", \"approved\", \"denied\", \"expired\"] as const);\n optionalString(item, \"decision\", path);\n optionalString(item, \"decidedByClientId\", path);\n numberField(item, \"createdAt\", path);\n numberField(item, \"updatedAt\", path);\n return item as unknown as PermissionRequestRecord;\n}\n\nexport function decodeSessionEventRecord(value: unknown): SessionEventRecord {\n const event = object(value, \"event\");\n stringField(event, \"id\", \"event\");\n numberField(event, \"seq\", \"event\");\n stringField(event, \"type\", \"event\");\n numberField(event, \"schemaVersion\", \"event\");\n optionalString(event, \"sessionId\", \"event\");\n recordField(event, \"payload\", \"event\");\n numberField(event, \"createdAt\", \"event\");\n return event as unknown as SessionEventRecord;\n}\n\nexport function deserializeSessionEventRecord(text: string): SessionEventRecord {\n return decodeSessionEventRecord(parseJson(text));\n}\n\nexport function serializeSessionEventRecord(event: SessionEventRecord): string {\n decodeSessionEventRecord(event);\n return JSON.stringify(event);\n}\n\nexport function decodeSessionStateSnapshot(value: unknown): SessionStateSnapshot {\n const snapshot = object(value, \"snapshot\");\n numberField(snapshot, \"cursor\", \"snapshot\");\n validateSession(snapshot.session, \"snapshot.session\");\n arrayField(snapshot, \"inputs\", \"snapshot\", validateInput);\n arrayField(snapshot, \"messages\", \"snapshot\", validateMessage);\n arrayField(snapshot, \"parts\", \"snapshot\", validatePart);\n arrayField(snapshot, \"runs\", \"snapshot\", validateRun);\n arrayField(snapshot, \"attempts\", \"snapshot\", validateAttempt);\n if (snapshot.tasks !== undefined) arrayField(snapshot, \"tasks\", \"snapshot\", validateTask);\n arrayField(snapshot, \"permissions\", \"snapshot\", validatePermission);\n return snapshot as unknown as SessionStateSnapshot;\n}\n\nexport function deserializeSessionStateSnapshot(text: string): SessionStateSnapshot {\n return decodeSessionStateSnapshot(parseJson(text));\n}\n\nexport function serializeSessionStateSnapshot(snapshot: SessionStateSnapshot): string {\n decodeSessionStateSnapshot(snapshot);\n return JSON.stringify(snapshot);\n}\n\nexport function decodeJobSnapshot(value: unknown): JobSnapshot {\n const job = object(value, \"job\");\n for (const field of [\"id\", \"label\", \"ownerSession\", \"cwd\"] as const) stringField(job, field, \"job\");\n enumField(job, \"kind\", \"job\", [\"terminal\", \"shell\", \"agent\", \"dream\", \"workflow\"] as const);\n enumField(job, \"status\", \"job\", [\"running\", \"stopping\", \"completed\", \"killed\", \"failed\"] as const);\n const capabilities = recordField(job, \"capabilities\", \"job\");\n for (const field of [\"read\", \"wait\", \"send\", \"cancel\"] as const) {\n booleanField(capabilities, field, \"job.capabilities\");\n }\n numberField(job, \"startedAt\", \"job\");\n numberField(job, \"updatedAt\", \"job\");\n optionalNumber(job, \"finishedAt\", \"job\");\n optionalString(job, \"detail\", \"job\");\n optionalRecord(job, \"metadata\", \"job\");\n return job as unknown as JobSnapshot;\n}\n\nexport function decodeJobReadResult(value: unknown): JobReadResult {\n const result = object(value, \"jobReadResult\");\n stringField(result, \"text\", \"jobReadResult\");\n numberField(result, \"cursor\", \"jobReadResult\");\n booleanField(result, \"truncated\", \"jobReadResult\");\n decodeJobSnapshot(result.snapshot);\n optionalRecord(result, \"details\", \"jobReadResult\");\n return result as unknown as JobReadResult;\n}\n\nexport function decodeJobWaitResult(value: unknown): JobWaitResult {\n const result = object(value, \"jobWaitResult\");\n decodeJobReadResult(result);\n booleanField(result, \"timedOut\", \"jobWaitResult\");\n return result as unknown as JobWaitResult;\n}\n\nexport function decodeTerminalSessionInfo(value: unknown): TerminalSessionInfo {\n const terminal = object(value, \"terminal\");\n for (const field of [\"id\", \"name\", \"projectId\", \"cwd\", \"shell\", \"createdAt\"] as const) {\n stringField(terminal, field, \"terminal\");\n }\n enumField(terminal, \"runtime\", \"terminal\", [\"local\", \"sandbox\"] as const);\n enumField(terminal, \"source\", \"terminal\", [\"user\", \"agent\"] as const);\n enumField(terminal, \"status\", \"terminal\", [\"running\", \"stopping\", \"completed\", \"killed\", \"failed\"] as const);\n optionalString(terminal, \"sessionId\", \"terminal\");\n numberField(terminal, \"cols\", \"terminal\");\n numberField(terminal, \"rows\", \"terminal\");\n optionalString(terminal, \"exitedAt\", \"terminal\");\n optionalNumber(terminal, \"exitCode\", \"terminal\", true);\n return terminal as unknown as TerminalSessionInfo;\n}\n\nexport function decodeTerminalEvent(value: unknown): TerminalEvent {\n const event = object(value, \"terminalEvent\");\n const type = enumField(event, \"type\", \"terminalEvent\", [\"data\", \"status\", \"exit\", \"title\", \"error\"] as const);\n stringField(event, \"terminalId\", \"terminalEvent\");\n if (type === \"data\") {\n stringField(event, \"data\", \"terminalEvent\");\n numberField(event, \"sequence\", \"terminalEvent\");\n } else if (type === \"status\") {\n enumField(event, \"status\", \"terminalEvent\", [\"stopping\", \"killed\"] as const);\n } else if (type === \"exit\") {\n optionalNumber(event, \"exitCode\", \"terminalEvent\", true);\n if (!(\"exitCode\" in event)) {\n throw new ProtocolDataError(\"terminalEvent.exitCode is required\", \"terminalEvent.exitCode\");\n }\n } else if (type === \"title\") {\n stringField(event, \"title\", \"terminalEvent\");\n } else {\n stringField(event, \"message\", \"terminalEvent\");\n }\n return event as unknown as TerminalEvent;\n}\n\nexport function decodeTerminalReadResult(value: unknown): TerminalReadResult {\n const result = object(value, \"terminalReadResult\");\n stringField(result, \"terminalId\", \"terminalReadResult\");\n stringField(result, \"data\", \"terminalReadResult\");\n numberField(result, \"sequence\", \"terminalReadResult\");\n booleanField(result, \"truncated\", \"terminalReadResult\");\n return result as unknown as TerminalReadResult;\n}\n\nexport function decodeTerminalWaitResult(value: unknown): TerminalWaitResult {\n const result = object(value, \"terminalWaitResult\");\n decodeTerminalReadResult(result);\n decodeTerminalSessionInfo(result.terminal);\n booleanField(result, \"timedOut\", \"terminalWaitResult\");\n return result as unknown as TerminalWaitResult;\n}\n",
9
+ "export type AttachmentAssetStatus =\n | \"importing\"\n | \"ready\"\n | \"failed\"\n | \"deleted\";\n\nexport type AttachmentIntent =\n | \"auto\"\n | \"vision\"\n | \"ocr\"\n | \"document\"\n | \"tool_resource\"\n | \"workspace_reference\";\n\nexport type AttachmentRepresentationStatus =\n | \"pending\"\n | \"running\"\n | \"completed\"\n | \"failed\";\n\nexport type AttachmentRepresentationKind =\n | \"thumbnail\"\n | \"ocr_text\"\n | \"plain_text\"\n | \"pdf_text\"\n | \"pdf_page_image\"\n | \"archive_manifest\"\n | \"directory_manifest\";\n\nexport interface AttachmentAssetRecord {\n id: string;\n displayName: string;\n declaredMediaType?: string;\n mediaType?: string;\n sizeBytes?: number;\n sha256?: string;\n status: AttachmentAssetStatus;\n failureCode?: string;\n createdAt: number;\n updatedAt: number;\n deletedAt?: number;\n}\n\nexport interface SessionInputAttachmentRecord {\n id: string;\n sessionId: string;\n inputId: string;\n assetId: string;\n seq: number;\n intent: AttachmentIntent;\n displayName: string;\n mediaType: string;\n sizeBytes: number;\n metadata: Record<string, unknown>;\n createdAt: number;\n}\n\nexport interface AttachmentRepresentationRecord {\n id: string;\n assetId: string;\n kind: AttachmentRepresentationKind;\n status: AttachmentRepresentationStatus;\n processor: string;\n processorVersion: string;\n cacheKey: string;\n mediaType: string;\n text?: string;\n error?: string;\n metadata: Record<string, unknown>;\n createdAt: number;\n updatedAt: number;\n}\n\nexport interface AttachmentLimits {\n maxFilesPerPrompt: number;\n maxBytesPerFile: number;\n maxBytesPerPrompt: number;\n maxSessionReferencedBytes: number;\n resumableThresholdBytes: number;\n uploadSessionTtlMs: number;\n stagingTtlMs: number;\n}\n\nexport const DEFAULT_ATTACHMENT_LIMITS: Readonly<AttachmentLimits> = {\n maxFilesPerPrompt: 20,\n maxBytesPerFile: 100 * 1024 * 1024,\n maxBytesPerPrompt: 250 * 1024 * 1024,\n maxSessionReferencedBytes: 2 * 1024 * 1024 * 1024,\n resumableThresholdBytes: 25 * 1024 * 1024,\n uploadSessionTtlMs: 24 * 60 * 60 * 1_000,\n stagingTtlMs: 24 * 60 * 60 * 1_000,\n};\n\nexport function parseAttachmentLimits(value: unknown): AttachmentLimits {\n const record = recordValue(value, \"attachment limits\");\n const limits: AttachmentLimits = {\n maxFilesPerPrompt: positiveInteger(\n record.maxFilesPerPrompt,\n \"maxFilesPerPrompt\",\n ),\n maxBytesPerFile: positiveInteger(record.maxBytesPerFile, \"maxBytesPerFile\"),\n maxBytesPerPrompt: positiveInteger(\n record.maxBytesPerPrompt,\n \"maxBytesPerPrompt\",\n ),\n maxSessionReferencedBytes: positiveInteger(\n record.maxSessionReferencedBytes,\n \"maxSessionReferencedBytes\",\n ),\n resumableThresholdBytes: positiveInteger(\n record.resumableThresholdBytes,\n \"resumableThresholdBytes\",\n ),\n uploadSessionTtlMs: positiveInteger(\n record.uploadSessionTtlMs,\n \"uploadSessionTtlMs\",\n ),\n stagingTtlMs: positiveInteger(record.stagingTtlMs, \"stagingTtlMs\"),\n };\n if (limits.resumableThresholdBytes > limits.maxBytesPerFile) {\n throw new Error(\"resumableThresholdBytes must not exceed maxBytesPerFile\");\n }\n if (limits.maxBytesPerFile > limits.maxBytesPerPrompt) {\n throw new Error(\"maxBytesPerFile must not exceed maxBytesPerPrompt\");\n }\n if (limits.maxBytesPerPrompt > limits.maxSessionReferencedBytes) {\n throw new Error(\n \"maxBytesPerPrompt must not exceed maxSessionReferencedBytes\",\n );\n }\n return limits;\n}\n\nexport function parseAttachmentAssetRecord(\n value: unknown,\n): AttachmentAssetRecord {\n const record = recordValue(value, \"attachment asset\");\n const status = enumValue(\n record.status,\n [\"importing\", \"ready\", \"failed\", \"deleted\"] as const,\n \"status\",\n );\n const asset: AttachmentAssetRecord = {\n id: nonEmptyString(record.id, \"id\"),\n displayName: nonEmptyString(record.displayName, \"displayName\"),\n status,\n createdAt: nonNegativeInteger(record.createdAt, \"createdAt\"),\n updatedAt: nonNegativeInteger(record.updatedAt, \"updatedAt\"),\n };\n\n const declaredMediaType = optionalNonEmptyString(\n record.declaredMediaType,\n \"declaredMediaType\",\n );\n const mediaType = optionalNonEmptyString(record.mediaType, \"mediaType\");\n const sizeBytes = optionalNonNegativeInteger(record.sizeBytes, \"sizeBytes\");\n const sha256 = optionalSha256(record.sha256);\n const failureCode = optionalNonEmptyString(record.failureCode, \"failureCode\");\n const deletedAt = optionalNonNegativeInteger(record.deletedAt, \"deletedAt\");\n\n if (declaredMediaType !== undefined) asset.declaredMediaType = declaredMediaType;\n if (mediaType !== undefined) asset.mediaType = mediaType;\n if (sizeBytes !== undefined) asset.sizeBytes = sizeBytes;\n if (sha256 !== undefined) asset.sha256 = sha256;\n if (failureCode !== undefined) asset.failureCode = failureCode;\n if (deletedAt !== undefined) asset.deletedAt = deletedAt;\n\n if (status === \"ready\" || status === \"deleted\") {\n if (asset.mediaType === undefined) throw new Error(\"mediaType is required\");\n if (asset.sizeBytes === undefined) throw new Error(\"sizeBytes is required\");\n if (asset.sha256 === undefined) throw new Error(\"sha256 is required\");\n }\n if (status === \"failed\" && asset.failureCode === undefined) {\n throw new Error(\"failureCode is required\");\n }\n if (status === \"deleted\" && asset.deletedAt === undefined) {\n throw new Error(\"deletedAt is required\");\n }\n return asset;\n}\n\nfunction recordValue(value: unknown, field: string): Record<string, unknown> {\n if (typeof value !== \"object\" || value === null || Array.isArray(value)) {\n throw new Error(`${field} must be an object`);\n }\n return value as Record<string, unknown>;\n}\n\nfunction positiveInteger(value: unknown, field: string): number {\n if (!Number.isSafeInteger(value) || Number(value) < 1) {\n throw new Error(`${field} must be a positive safe integer`);\n }\n return Number(value);\n}\n\nfunction nonNegativeInteger(value: unknown, field: string): number {\n if (!Number.isSafeInteger(value) || Number(value) < 0) {\n throw new Error(`${field} must be a non-negative safe integer`);\n }\n return Number(value);\n}\n\nfunction optionalNonNegativeInteger(\n value: unknown,\n field: string,\n): number | undefined {\n return value === undefined ? undefined : nonNegativeInteger(value, field);\n}\n\nfunction nonEmptyString(value: unknown, field: string): string {\n if (typeof value !== \"string\" || value.length === 0) {\n throw new Error(`${field} must be a non-empty string`);\n }\n return value;\n}\n\nfunction optionalNonEmptyString(\n value: unknown,\n field: string,\n): string | undefined {\n return value === undefined ? undefined : nonEmptyString(value, field);\n}\n\nfunction optionalSha256(value: unknown): string | undefined {\n if (value === undefined) return undefined;\n if (typeof value !== \"string\" || !/^[a-f0-9]{64}$/.test(value)) {\n throw new Error(\"sha256 must be 64 lowercase hexadecimal characters\");\n }\n return value;\n}\n\nfunction enumValue<const T extends readonly string[]>(\n value: unknown,\n allowed: T,\n field: string,\n): T[number] {\n if (typeof value !== \"string\" || !allowed.includes(value)) {\n throw new Error(`${field} must be one of: ${allowed.join(\", \")}`);\n }\n return value as T[number];\n}\n",
10
+ "import {\n parseAttachmentLimits,\n type AttachmentLimits,\n} from \"./attachment.js\";\n\nexport interface ProtocolVersion {\n version: number;\n}\n\nexport interface ServerCapabilities {\n serverVersion: string;\n protocol: ProtocolVersion;\n features: Record<string, number>;\n attachments?: AttachmentTransferCapabilities;\n}\n\nexport type AttachmentUploadMode = \"single\" | \"resumable\";\n\nexport interface AttachmentTransferCapabilities {\n limits: AttachmentLimits;\n uploadModes: readonly [\"single\"] | readonly [\"single\", \"resumable\"];\n}\n\nexport interface ClientProtocolSupport {\n version: number;\n}\n\nexport interface ProtocolCompatibility {\n compatible: boolean;\n reason?: string;\n}\n\nexport function parseServerCapabilities(value: unknown): ServerCapabilities {\n if (!isRecord(value)) throw new Error(\"Capabilities response must be an object\");\n if (typeof value.serverVersion !== \"string\") throw new Error(\"serverVersion must be a string\");\n if (!isRecord(value.protocol)) throw new Error(\"protocol must be an object\");\n const version = positiveInteger(value.protocol.version, \"protocol.version\");\n if (!isRecord(value.features)) throw new Error(\"features must be an object\");\n const features: Record<string, number> = {};\n for (const [name, version] of Object.entries(value.features)) {\n features[name] = positiveInteger(version, `features.${name}`);\n }\n const attachments = parseAttachmentTransferCapabilities(value.attachments);\n return {\n serverVersion: value.serverVersion,\n protocol: { version },\n features,\n ...(attachments ? { attachments } : {}),\n };\n}\n\nexport function checkProtocolCompatibility(\n server: ServerCapabilities,\n client: ClientProtocolSupport,\n): ProtocolCompatibility {\n if (client.version !== server.protocol.version) {\n return {\n compatible: false,\n reason: `Client protocol ${client.version} does not match server protocol ${server.protocol.version}`,\n };\n }\n return { compatible: true };\n}\n\nexport function supportsFeature(\n capabilities: ServerCapabilities,\n feature: string,\n minimumVersion = 1,\n): boolean {\n return (capabilities.features[feature] ?? 0) >= minimumVersion;\n}\n\nfunction positiveInteger(value: unknown, field: string): number {\n if (!Number.isInteger(value) || Number(value) < 1) throw new Error(`${field} must be a positive integer`);\n return Number(value);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction parseAttachmentTransferCapabilities(\n value: unknown,\n): AttachmentTransferCapabilities | undefined {\n if (value === undefined) return undefined;\n if (!isRecord(value)) throw new Error(\"attachments must be an object\");\n if (!Array.isArray(value.uploadModes) || value.uploadModes.length === 0) {\n throw new Error(\"attachments.uploadModes must be a non-empty array\");\n }\n if (\n value.uploadModes[0] !== \"single\" ||\n value.uploadModes.length > 2 ||\n (value.uploadModes.length === 2 && value.uploadModes[1] !== \"resumable\")\n ) {\n throw new Error(\n 'attachments.uploadModes must be [\"single\"] or [\"single\", \"resumable\"]',\n );\n }\n const uploadModes = value.uploadModes as [\"single\"] | [\"single\", \"resumable\"];\n return {\n limits: parseAttachmentLimits(value.limits),\n uploadModes,\n };\n}\n",
11
+ "export * from \"./session.js\";\nexport * from \"./runtime-config.js\";\nexport * from \"./requests.js\";\nexport * from \"./job.js\";\nexport * from \"./terminal.js\";\nexport * from \"./serialization.js\";\nexport * from \"./channel.js\";\nexport * from \"./capabilities.js\";\nexport * from \"./attachment.js\";\n",
12
+ "/**\n * daemon HTTP/SSE 客户端。\n *\n * 包装 `@openharness/server` 的 REST 路由与 `/events/stream` SSE;\n * 不含本地状态归并(见 `reducer.ts` / `sync.ts`)。\n */\n\nimport type {\n AdmitClientPromptInput,\n CommandCatalogEntry,\n CreateClientSessionInput,\n EditLatestClientPromptInput,\n CancelQueuedClientPromptInput,\n CancelQueuedPromptResponse,\n EventSyncOptions,\n ForkClientSessionInput,\n InterruptSessionResponse,\n ListClientMessagePartsOptions,\n ListCommandsOptions,\n ListEventsOptions,\n ListMessagesOptions,\n ListPermissionsOptions,\n ListSessionsOptions,\n ListProjectsOptions,\n ProjectRecord,\n AgentPersonaInfo,\n AuthStatus,\n CompactSessionResponse,\n CreateBackgroundShellInput,\n CreateBackgroundShellResult,\n CustomProviderInput,\n CreateScheduledTaskInput,\n HookInfo,\n ReloadPluginsResponse,\n RewindSessionResponse,\n McpServerStatus,\n MemoryEntryRecord,\n MemoryListResponse,\n ModelProviderInfo,\n OpenHarnessClientOptions,\n OpenHarnessServerHealth,\n PermissionRequestRecord,\n PluginInfo,\n PromoteQueuedClientPromptInput,\n PromoteQueuedPromptResponse,\n PromptResponse,\n ResumeInterruptedRunInput,\n ResumeInterruptedRunResponse,\n ProviderInfo,\n OutputStyleInfo,\n RememberSessionResponse,\n ScheduledRunRecord,\n ScheduledTaskRecord,\n ScheduledTaskStatusSummary,\n ReplyPermissionInput,\n SessionEventRecord,\n SessionExportResponse,\n SessionMessagePartRecord,\n SessionMessageRecord,\n SessionRecord,\n SessionStateSnapshot,\n SessionUsageResponse,\n StartDreamResponse,\n UpdateClientSessionInput,\n UpdateScheduledTaskInput,\n UploadAttachmentInput,\n DownloadAttachmentOptions,\n AttachmentAssetRecord,\n AttachmentStorageGcResult,\n AttachmentStorageRepairResult,\n AttachmentStorageReport,\n} from \"../types/index.js\";\nimport type {\n JobKind,\n JobReadResult,\n JobSnapshot,\n JobStatus,\n JobWaitResult,\n TerminalCreateRequest,\n TerminalEvent,\n TerminalReadResult,\n TerminalResizeRequest,\n TerminalSessionInfo,\n TerminalSignal,\n TerminalSource,\n TerminalWriteRequest,\n DurableChannelMessageInput,\n DurableChannelMessageResult,\n RecordChannelDeliveryInput,\n ChannelDeliveryRecord,\n ChannelStatusSnapshot,\n ClientProtocolSupport,\n ServerCapabilities,\n} from \"@openharness/protocol\";\nimport {\n checkProtocolCompatibility,\n decodeJobReadResult,\n decodeJobSnapshot,\n decodeJobWaitResult,\n decodeSessionEventRecord,\n decodeSessionStateSnapshot,\n decodeTerminalEvent,\n decodeTerminalReadResult,\n decodeTerminalSessionInfo,\n ProtocolDataError,\n parseServerCapabilities,\n parseAttachmentAssetRecord,\n} from \"@openharness/protocol\";\n\nlet promptRequestCounter = 0;\n\nfunction responseField(value: unknown, field: string): unknown {\n if (!value || typeof value !== \"object\" || Array.isArray(value)) {\n throw new ProtocolDataError(\"Response body must be an object\");\n }\n if (!(field in value)) {\n throw new ProtocolDataError(`Response body is missing ${field}`, field);\n }\n return (value as Record<string, unknown>)[field];\n}\n\nfunction responseArray<T>(\n value: unknown,\n field: string,\n decode: (item: unknown) => T,\n): T[] {\n const items = responseField(value, field);\n if (!Array.isArray(items)) {\n throw new ProtocolDataError(`Response ${field} must be an array`, field);\n }\n return items.map(decode);\n}\n\n/** Normalize a daemon base URL without accepting credentials or request fragments. */\nexport function normalizeDaemonBaseUrl(value: string): string {\n const raw = value.trim();\n if (!raw) throw new Error(\"Daemon URL is required\");\n\n let url: URL;\n try {\n url = new URL(raw);\n } catch {\n throw new Error(\"Daemon URL must be an absolute http or https URL\");\n }\n if (url.protocol !== \"http:\" && url.protocol !== \"https:\") {\n throw new Error(\"Daemon URL must use http or https\");\n }\n if (url.username || url.password) {\n throw new Error(\n \"Daemon URL must not contain credentials; use a bearer token instead\",\n );\n }\n if (url.search || url.hash) {\n throw new Error(\n \"Daemon URL must not contain query parameters or a fragment\",\n );\n }\n\n const pathname = url.pathname.replace(/\\/+$/, \"\");\n return `${url.origin}${pathname === \"/\" ? \"\" : pathname}`;\n}\n\n/** Generate a caller-stable id for one prompt admission attempt. */\nexport function createPromptRequestId(): string {\n if (typeof globalThis.crypto?.randomUUID === \"function\")\n return globalThis.crypto.randomUUID();\n promptRequestCounter += 1;\n return `prompt-${Date.now().toString(36)}-${promptRequestCounter.toString(36)}`;\n}\n\n/** HTTP API 非 2xx 时抛出;携带 status 与原始响应体。 */\nexport class OpenHarnessApiError extends Error {\n constructor(\n message: string,\n readonly status: number,\n readonly body: unknown,\n ) {\n super(message);\n this.name = \"OpenHarnessApiError\";\n }\n}\n\n/**\n * 面向 daemon 的 typed fetch 客户端。\n * 构造时传入 `baseUrl` 与可选 Bearer `token`(通常来自 daemon registry)。\n */\nexport class OpenHarnessClient {\n private readonly baseUrl: string;\n private readonly token?: string;\n private readonly fetchImpl: typeof fetch;\n\n constructor(options: OpenHarnessClientOptions) {\n this.baseUrl = normalizeDaemonBaseUrl(options.baseUrl);\n this.token = options.token;\n this.fetchImpl = options.fetch ?? fetch;\n }\n\n /** `GET /health` */\n async health(\n options: { signal?: AbortSignal } = {},\n ): Promise<OpenHarnessServerHealth> {\n return this.request<OpenHarnessServerHealth>(\"/health\", {\n auth: false,\n signal: options.signal,\n });\n }\n\n /** 连接产品应先调用它,再根据 features 决定显示哪些功能。 */\n async capabilities(\n options: { signal?: AbortSignal; support?: ClientProtocolSupport } = {},\n ): Promise<ServerCapabilities> {\n const value = await this.request<unknown>(\"/capabilities\", {\n auth: false,\n signal: options.signal,\n });\n const capabilities = parseServerCapabilities(value);\n const compatibility = checkProtocolCompatibility(\n capabilities,\n options.support ?? { version: 2 },\n );\n if (!compatibility.compatible) {\n throw new IncompatibleProtocolError(\n capabilities,\n compatibility.reason ??\n \"Client and server protocol versions are incompatible\",\n );\n }\n return capabilities;\n }\n\n /** `POST /attachments` — upload bytes without JSON or multipart buffering. */\n async uploadAttachment(\n input: UploadAttachmentInput,\n ): Promise<AttachmentAssetRecord> {\n const headers = this.headers();\n headers[\"x-openharness-filename\"] = encodeURIComponent(input.displayName);\n if (input.mediaType) headers[\"content-type\"] = input.mediaType;\n const init: RequestInit & { duplex?: \"half\" } = {\n method: \"POST\",\n headers,\n body: input.body as RequestInit[\"body\"],\n signal: input.signal,\n };\n if (isReadableStream(input.body)) init.duplex = \"half\";\n const response = await this.fetchImpl(`${this.baseUrl}/attachments`, init);\n if (!response.ok) await this.throwResponseError(response);\n return parseAttachmentAssetRecord(await response.json());\n }\n\n async getAttachment(\n id: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<AttachmentAssetRecord> {\n const value = await this.request<unknown>(\n `/attachments/${encodeURIComponent(id)}`,\n { signal: options.signal },\n );\n return parseAttachmentAssetRecord(value);\n }\n\n /** Returns the raw response so callers can consume the body as a stream. */\n async downloadAttachment(\n id: string,\n options: DownloadAttachmentOptions = {},\n ): Promise<Response> {\n const range = attachmentRangeHeader(options.range);\n const headers = this.headers();\n if (range) headers.range = range;\n const response = await this.fetchImpl(\n `${this.baseUrl}/attachments/${encodeURIComponent(id)}/content`,\n { method: \"GET\", headers, signal: options.signal },\n );\n if (!response.ok) await this.throwResponseError(response);\n return response;\n }\n\n async deleteAttachment(\n id: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<AttachmentAssetRecord> {\n const value = await this.request<unknown>(\n `/attachments/${encodeURIComponent(id)}`,\n { method: \"DELETE\", signal: options.signal },\n );\n return parseAttachmentAssetRecord(value);\n }\n\n async scanAttachmentStorage(\n options: { signal?: AbortSignal } = {},\n ): Promise<AttachmentStorageReport> {\n return await this.request<AttachmentStorageReport>(\"/attachments/storage\", {\n signal: options.signal,\n });\n }\n\n async repairAttachmentStorage(\n options: { signal?: AbortSignal } = {},\n ): Promise<AttachmentStorageRepairResult> {\n return await this.request<AttachmentStorageRepairResult>(\"/attachments/storage/actions\", {\n method: \"POST\",\n body: { action: \"repair-safe\" },\n signal: options.signal,\n });\n }\n\n async gcAttachmentStorage(\n options: { signal?: AbortSignal } = {},\n ): Promise<AttachmentStorageGcResult> {\n return await this.request<AttachmentStorageGcResult>(\"/attachments/storage/actions\", {\n method: \"POST\",\n body: { action: \"gc\" },\n signal: options.signal,\n });\n }\n\n async handleChannelMessage(\n input: DurableChannelMessageInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<DurableChannelMessageResult> {\n return await this.request<DurableChannelMessageResult>(\n \"/channels/messages\",\n { method: \"POST\", body: input, signal: options.signal },\n );\n }\n\n async recordChannelDelivery(\n deliveryId: string,\n input: RecordChannelDeliveryInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<ChannelDeliveryRecord> {\n const response = await this.request<{ delivery: ChannelDeliveryRecord }>(\n `/channels/deliveries/${encodeURIComponent(deliveryId)}/result`,\n { method: \"POST\", body: input, signal: options.signal },\n );\n return response.delivery;\n }\n\n async getChannelStatus(\n options: { connector?: string; limit?: number; signal?: AbortSignal } = {},\n ): Promise<ChannelStatusSnapshot> {\n const { signal, ...query } = options;\n return await this.request<ChannelStatusSnapshot>(\n this.path(\"/channels/status\", query),\n { signal },\n );\n }\n\n async listPendingChannelDeliveries(\n options: { connector?: string; limit?: number; signal?: AbortSignal } = {},\n ): Promise<ChannelDeliveryRecord[]> {\n const { signal, ...query } = options;\n const response = await this.request<{\n deliveries: ChannelDeliveryRecord[];\n }>(this.path(\"/channels/deliveries/pending\", query), { signal });\n return response.deliveries;\n }\n\n /** `GET /commands?cwd=` — cwd-scoped slash command catalog for autocomplete. */\n async listCommands(\n options: ListCommandsOptions & { signal?: AbortSignal },\n ): Promise<CommandCatalogEntry[]> {\n const { signal, ...query } = options;\n const response = await this.request<{ commands: CommandCatalogEntry[] }>(\n this.path(\"/commands\", query),\n { signal },\n );\n return response.commands;\n }\n\n /** `GET /settings` */\n async getSettings(\n options: { signal?: AbortSignal } = {},\n ): Promise<Record<string, unknown>> {\n const response = await this.request<{ settings: Record<string, unknown> }>(\n \"/settings\",\n { signal: options.signal },\n );\n return response.settings;\n }\n\n /** `PATCH /settings` */\n async patchSettings(\n patch: Record<string, unknown>,\n options: { signal?: AbortSignal } = {},\n ): Promise<Record<string, unknown>> {\n const response = await this.request<{ settings: Record<string, unknown> }>(\n \"/settings\",\n {\n method: \"PATCH\",\n body: patch,\n signal: options.signal,\n },\n );\n return response.settings;\n }\n\n /** `GET /providers` */\n async listProviders(\n options: { signal?: AbortSignal } = {},\n ): Promise<ProviderInfo[]> {\n const response = await this.request<{ providers: ProviderInfo[] }>(\n \"/providers\",\n { signal: options.signal },\n );\n return response.providers;\n }\n\n async createCustomProvider(\n input: CustomProviderInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<ProviderInfo> {\n const response = await this.request<{ provider: ProviderInfo }>(\n \"/providers/custom\",\n {\n method: \"POST\",\n body: input,\n signal: options.signal,\n },\n );\n return response.provider;\n }\n\n async connectCatalogProvider(\n id: string,\n apiKey: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<ProviderInfo> {\n const response = await this.request<{ provider: ProviderInfo }>(\n `/providers/catalog/${encodeURIComponent(id)}/connect`,\n { method: \"POST\", body: { apiKey }, signal: options.signal },\n );\n return response.provider;\n }\n\n async disconnectCatalogProvider(\n id: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<void> {\n await this.request<{ ok: true }>(\n `/providers/catalog/${encodeURIComponent(id)}/connect`,\n { method: \"DELETE\", signal: options.signal },\n );\n }\n\n async updateCustomProvider(\n id: string,\n input: CustomProviderInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<ProviderInfo> {\n const response = await this.request<{ provider: ProviderInfo }>(\n `/providers/custom/${encodeURIComponent(id)}`,\n { method: \"PATCH\", body: input, signal: options.signal },\n );\n return response.provider;\n }\n\n async removeCustomProvider(\n id: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<void> {\n await this.request<{ ok: true }>(\n `/providers/custom/${encodeURIComponent(id)}`,\n {\n method: \"DELETE\",\n signal: options.signal,\n },\n );\n }\n\n /** `GET /models` */\n async listModels(\n options: { signal?: AbortSignal } = {},\n ): Promise<ModelProviderInfo[]> {\n const response = await this.request<{ providers: ModelProviderInfo[] }>(\n \"/models\",\n { signal: options.signal },\n );\n return response.providers;\n }\n\n /** `GET /sessions/:id/mcp` */\n async getSessionMcp(\n sessionId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<McpServerStatus[]> {\n const response = await this.request<{ servers: McpServerStatus[] }>(\n `/sessions/${encodeURIComponent(sessionId)}/mcp`,\n { signal: options.signal },\n );\n return response.servers;\n }\n\n /** `GET /memory?cwd=` */\n async listMemory(options: {\n cwd: string;\n signal?: AbortSignal;\n }): Promise<MemoryListResponse> {\n const { signal, ...query } = options;\n return await this.request<MemoryListResponse>(this.path(\"/memory\", query), {\n signal,\n });\n }\n\n /** `GET /memory/:id?cwd=` */\n async getMemory(\n entryId: string,\n options: { cwd: string; signal?: AbortSignal },\n ): Promise<MemoryEntryRecord> {\n const { signal, cwd } = options;\n const response = await this.request<{ entry: MemoryEntryRecord }>(\n this.path(`/memory/${encodeURIComponent(entryId)}`, { cwd }),\n { signal },\n );\n return response.entry;\n }\n\n /** `POST /memory` */\n async addMemory(\n input: { cwd: string; content: string; tags?: string[] },\n options: { signal?: AbortSignal } = {},\n ): Promise<MemoryEntryRecord> {\n const response = await this.request<{ entry: MemoryEntryRecord }>(\n \"/memory\",\n {\n method: \"POST\",\n body: input,\n signal: options.signal,\n },\n );\n return response.entry;\n }\n\n /** `DELETE /memory/:id?cwd=` */\n async removeMemory(\n entryId: string,\n options: { cwd: string; signal?: AbortSignal },\n ): Promise<void> {\n const { signal, cwd } = options;\n await this.request<{ deleted: boolean }>(\n this.path(`/memory/${encodeURIComponent(entryId)}`, { cwd }),\n { method: \"DELETE\", signal },\n );\n }\n\n /** `GET /auth` */\n async getAuthStatus(\n options: { signal?: AbortSignal } = {},\n ): Promise<AuthStatus> {\n const response = await this.request<{ auth: AuthStatus }>(\"/auth\", {\n signal: options.signal,\n });\n return response.auth;\n }\n\n /** `POST /auth/login` */\n async authLogin(\n input: { provider: string; apiKey?: string },\n options: { signal?: AbortSignal } = {},\n ): Promise<{ message: string }> {\n return await this.request<{ message: string }>(\"/auth/login\", {\n method: \"POST\",\n body: input,\n signal: options.signal,\n });\n }\n\n /** `POST /auth/logout` */\n async authLogout(\n input: { provider: string },\n options: { signal?: AbortSignal } = {},\n ): Promise<{ message: string }> {\n return await this.request<{ message: string }>(\"/auth/logout\", {\n method: \"POST\",\n body: input,\n signal: options.signal,\n });\n }\n\n /** `GET /context?cwd=` */\n async getContextPreview(options: {\n cwd: string;\n signal?: AbortSignal;\n }): Promise<string> {\n const { signal, ...query } = options;\n const response = await this.request<{ report: string }>(\n this.path(\"/context\", query),\n { signal },\n );\n return response.report;\n }\n\n /** `GET /context/status?cwd=` */\n async getContextStatus(options: {\n cwd: string;\n signal?: AbortSignal;\n }): Promise<string> {\n const { signal, ...query } = options;\n const response = await this.request<{ report: string }>(\n this.path(\"/context/status\", query),\n { signal },\n );\n return response.report;\n }\n\n /** `POST /sessions/:id/compact` */\n async compactSession(\n sessionId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<CompactSessionResponse> {\n return await this.request<CompactSessionResponse>(\n `/sessions/${encodeURIComponent(sessionId)}/compact`,\n { method: \"POST\", signal: options.signal },\n );\n }\n\n /** `POST /sessions/:id/rewind` */\n async rewindSession(\n sessionId: string,\n input: { count?: number } = {},\n options: { signal?: AbortSignal } = {},\n ): Promise<RewindSessionResponse> {\n return await this.request<RewindSessionResponse>(\n `/sessions/${encodeURIComponent(sessionId)}/rewind`,\n { method: \"POST\", body: input, signal: options.signal },\n );\n }\n\n /** `POST /sessions/:id/remember` */\n async rememberSession(\n sessionId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<RememberSessionResponse> {\n return await this.request<RememberSessionResponse>(\n `/sessions/${encodeURIComponent(sessionId)}/remember`,\n { method: \"POST\", signal: options.signal },\n );\n }\n\n /** `POST /dream` */\n async startDream(\n input: { cwd: string; sessionId?: string; preview?: boolean },\n options: { signal?: AbortSignal } = {},\n ): Promise<StartDreamResponse> {\n return await this.request<StartDreamResponse>(\"/dream\", {\n method: \"POST\",\n body: input,\n signal: options.signal,\n });\n }\n\n /** `GET /profile` */\n async getProfileStatus(\n options: { signal?: AbortSignal } = {},\n ): Promise<string> {\n const response = await this.request<{ report: string }>(\"/profile\", {\n signal: options.signal,\n });\n return response.report;\n }\n\n /** `POST /profile/init` */\n async initProfile(options: { signal?: AbortSignal } = {}): Promise<string> {\n const response = await this.request<{ report: string }>(\"/profile/init\", {\n method: \"POST\",\n signal: options.signal,\n });\n return response.report;\n }\n\n /** `GET /output-styles` */\n async listOutputStyles(\n options: { signal?: AbortSignal } = {},\n ): Promise<OutputStyleInfo[]> {\n const response = await this.request<{ styles: OutputStyleInfo[] }>(\n \"/output-styles\",\n {\n signal: options.signal,\n },\n );\n return response.styles;\n }\n\n /** `POST /project/init` */\n async initProject(\n input: { cwd: string },\n options: { signal?: AbortSignal } = {},\n ): Promise<string> {\n const response = await this.request<{ report: string }>(\"/project/init\", {\n method: \"POST\",\n body: input,\n signal: options.signal,\n });\n return response.report;\n }\n\n /** `GET /plugins?cwd=` */\n async listPlugins(options: { cwd: string; signal?: AbortSignal }): Promise<{\n plugins: PluginInfo[];\n warnings: string[];\n }> {\n const { signal, ...query } = options;\n return await this.request<{ plugins: PluginInfo[]; warnings: string[] }>(\n this.path(\"/plugins\", query),\n { signal },\n );\n }\n\n /** `POST /plugins/:id/enable` */\n async enablePlugin(\n id: string,\n input: { cwd: string },\n options: { signal?: AbortSignal } = {},\n ): Promise<{ message: string }> {\n return await this.request<{ message: string }>(\n `/plugins/${encodeURIComponent(id)}/enable`,\n { method: \"POST\", body: input, signal: options.signal },\n );\n }\n\n /** `POST /plugins/:id/disable` */\n async disablePlugin(\n id: string,\n input: { cwd: string },\n options: { signal?: AbortSignal } = {},\n ): Promise<{ message: string }> {\n return await this.request<{ message: string }>(\n `/plugins/${encodeURIComponent(id)}/disable`,\n { method: \"POST\", body: input, signal: options.signal },\n );\n }\n\n async installLocalPlugin(input: {\n cwd: string;\n sourcePath: string;\n scope: \"user\";\n approvedPermissions: string[];\n link?: boolean;\n }): Promise<{ message: string }> {\n return await this.request<{ message: string }>(\n input.link ? \"/plugins/link-local\" : \"/plugins/install-local\",\n { method: \"POST\", body: input },\n );\n }\n\n async uninstallPlugin(\n id: string,\n input: { cwd: string },\n ): Promise<{ message: string }> {\n return await this.request<{ message: string }>(\n `/plugins/${encodeURIComponent(id)}`,\n { method: \"DELETE\", body: input },\n );\n }\n\n /** `POST /plugins/reload` */\n async reloadPlugins(\n input: { cwd: string },\n options: { signal?: AbortSignal } = {},\n ): Promise<ReloadPluginsResponse> {\n return await this.request<ReloadPluginsResponse>(\"/plugins/reload\", {\n method: \"POST\",\n body: input,\n signal: options.signal,\n });\n }\n\n /** `GET /agent-personas` */\n async listAgentPersonas(\n options: { signal?: AbortSignal } = {},\n ): Promise<AgentPersonaInfo[]> {\n const response = await this.request<{ agents: AgentPersonaInfo[] }>(\n \"/agent-personas\",\n {\n signal: options.signal,\n },\n );\n return response.agents;\n }\n\n /** `GET /hooks?cwd=&sessionId=` */\n async listHooks(options: {\n cwd: string;\n sessionId?: string;\n signal?: AbortSignal;\n }): Promise<HookInfo[]> {\n const { signal, ...query } = options;\n const response = await this.request<{ hooks: HookInfo[] }>(\n this.path(\"/hooks\", query),\n { signal },\n );\n return response.hooks;\n }\n\n /** `GET /git/diff?cwd=&full=` */\n async getGitDiff(options: {\n cwd: string;\n full?: boolean;\n signal?: AbortSignal;\n }): Promise<string> {\n const { signal, cwd, full } = options;\n const response = await this.request<{ output: string }>(\n this.path(\"/git/diff\", { cwd, ...(full ? { full: \"true\" } : {}) }),\n { signal },\n );\n return response.output;\n }\n\n /** `GET /git/branch?cwd=&list=` */\n async getGitBranch(options: {\n cwd: string;\n list?: boolean;\n signal?: AbortSignal;\n }): Promise<string> {\n const { signal, cwd, list } = options;\n const response = await this.request<{ output: string }>(\n this.path(\"/git/branch\", { cwd, ...(list ? { list: \"true\" } : {}) }),\n { signal },\n );\n return response.output;\n }\n\n /** `GET /git/status?cwd=` */\n async getGitStatus(options: {\n cwd: string;\n signal?: AbortSignal;\n }): Promise<string> {\n const { signal, cwd } = options;\n const response = await this.request<{ output: string }>(\n this.path(\"/git/status\", { cwd }),\n { signal },\n );\n return response.output;\n }\n\n /** `POST /git/commit` */\n async gitCommit(\n input: { cwd: string; message: string },\n options: { signal?: AbortSignal } = {},\n ): Promise<string> {\n const response = await this.request<{ output: string }>(\"/git/commit\", {\n method: \"POST\",\n body: input,\n signal: options.signal,\n });\n return response.output;\n }\n\n /** `GET /sessions/:id/usage` */\n async getSessionUsage(\n sessionId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<SessionUsageResponse> {\n return await this.request<SessionUsageResponse>(\n `/sessions/${encodeURIComponent(sessionId)}/usage`,\n { signal: options.signal },\n );\n }\n\n /** `POST /sessions/:id/export` */\n async exportSession(\n sessionId: string,\n input: { filename?: string; json?: boolean } = {},\n options: { signal?: AbortSignal } = {},\n ): Promise<SessionExportResponse> {\n return await this.request<SessionExportResponse>(\n `/sessions/${encodeURIComponent(sessionId)}/export`,\n { method: \"POST\", body: input, signal: options.signal },\n );\n }\n\n /** `GET /sessions` */\n async listSessions(\n options: ListSessionsOptions & { signal?: AbortSignal } = {},\n ): Promise<SessionRecord[]> {\n const { signal, ...query } = options;\n const response = await this.request<{ sessions: SessionRecord[] }>(\n this.path(\"/sessions\", query),\n { signal },\n );\n return response.sessions;\n }\n\n async listProjects(\n options: ListProjectsOptions & { signal?: AbortSignal } = {},\n ): Promise<ProjectRecord[]> {\n const { signal, ...query } = options;\n const response = await this.request<{ projects: ProjectRecord[] }>(\n this.path(\"/projects\", query),\n { signal },\n );\n return response.projects;\n }\n\n async inspectProject(path: string): Promise<ProjectRecord> {\n return (\n await this.request<{ project: ProjectRecord }>(\"/projects/inspect\", {\n method: \"POST\",\n body: { path },\n })\n ).project;\n }\n\n async renameProject(projectId: string, name: string): Promise<ProjectRecord> {\n return (\n await this.request<{ project: ProjectRecord }>(\n `/projects/${encodeURIComponent(projectId)}`,\n { method: \"PATCH\", body: { name } },\n )\n ).project;\n }\n\n async setProjectPinned(\n projectId: string,\n pinned: boolean,\n ): Promise<ProjectRecord> {\n return (\n await this.request<{ project: ProjectRecord }>(\n `/projects/${encodeURIComponent(projectId)}`,\n { method: \"PATCH\", body: { pinned } },\n )\n ).project;\n }\n\n async setProjectDefaultShell(\n projectId: string,\n defaultShell: string | null,\n ): Promise<ProjectRecord> {\n return (\n await this.request<{ project: ProjectRecord }>(\n `/projects/${encodeURIComponent(projectId)}`,\n { method: \"PATCH\", body: { defaultShell } },\n )\n ).project;\n }\n\n async rebindProject(projectId: string, path: string): Promise<ProjectRecord> {\n return (\n await this.request<{ project: ProjectRecord }>(\n `/projects/${encodeURIComponent(projectId)}/rebind`,\n { method: \"POST\", body: { path } },\n )\n ).project;\n }\n\n async archiveProject(projectId: string): Promise<ProjectRecord> {\n return (\n await this.request<{ project: ProjectRecord }>(\n `/projects/${encodeURIComponent(projectId)}`,\n { method: \"DELETE\" },\n )\n ).project;\n }\n\n /** `POST /sessions` */\n async createSession(\n input: CreateClientSessionInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<SessionRecord> {\n const response = await this.request<{ session: SessionRecord }>(\n \"/sessions\",\n {\n method: \"POST\",\n body: input,\n signal: options.signal,\n },\n );\n return response.session;\n }\n\n /** `GET /sessions/:id` */\n async getSession(\n sessionId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<SessionRecord> {\n const response = await this.request<{ session: SessionRecord }>(\n `/sessions/${encodeURIComponent(sessionId)}`,\n {\n signal: options.signal,\n },\n );\n return response.session;\n }\n\n /** `POST /sessions/:id/fork` */\n async forkSession(\n sessionId: string,\n input: ForkClientSessionInput = {},\n options: { signal?: AbortSignal } = {},\n ): Promise<SessionRecord> {\n const response = await this.request<{ session: SessionRecord }>(\n `/sessions/${encodeURIComponent(sessionId)}/fork`,\n {\n method: \"POST\",\n body: input,\n signal: options.signal,\n },\n );\n return response.session;\n }\n\n /** `GET /sessions/:id/state` - atomic attach snapshot plus SSE cursor. */\n async getSessionState(\n sessionId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<SessionStateSnapshot> {\n const response = await this.request<unknown>(\n `/sessions/${encodeURIComponent(sessionId)}/state`,\n {\n signal: options.signal,\n },\n );\n return decodeSessionStateSnapshot(response);\n }\n\n /** `DELETE /sessions/:id` */\n async archiveSession(\n sessionId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<SessionRecord> {\n const response = await this.request<{ session: SessionRecord }>(\n `/sessions/${encodeURIComponent(sessionId)}`,\n {\n method: \"DELETE\",\n signal: options.signal,\n },\n );\n return response.session;\n }\n\n /** `DELETE /sessions/:id/hard` */\n async deleteSession(\n sessionId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<string[]> {\n const response = await this.request<{ deletedSessionIds: string[] }>(\n `/sessions/${encodeURIComponent(sessionId)}/hard`,\n {\n method: \"DELETE\",\n signal: options.signal,\n },\n );\n return response.deletedSessionIds;\n }\n\n /** `PATCH /sessions/:id` - update title, agent, or metadata.runtime fields. */\n async updateSession(\n sessionId: string,\n input: UpdateClientSessionInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<SessionRecord> {\n const response = await this.request<{ session: SessionRecord }>(\n `/sessions/${encodeURIComponent(sessionId)}`,\n {\n method: \"PATCH\",\n body: input,\n signal: options.signal,\n },\n );\n return response.session;\n }\n\n /** `GET /sessions/:id/messages` */\n async listMessages(\n sessionId: string,\n options: ListMessagesOptions & { signal?: AbortSignal } = {},\n ): Promise<SessionMessageRecord[]> {\n const { signal, ...query } = options;\n const response = await this.request<{ messages: SessionMessageRecord[] }>(\n this.path(`/sessions/${encodeURIComponent(sessionId)}/messages`, query),\n { signal },\n );\n return response.messages;\n }\n\n /** `GET /sessions/:id/parts` */\n async listMessageParts(\n sessionId: string,\n options: ListClientMessagePartsOptions & { signal?: AbortSignal } = {},\n ): Promise<SessionMessagePartRecord[]> {\n const { signal, ...query } = options;\n const response = await this.request<{ parts: SessionMessagePartRecord[] }>(\n this.path(`/sessions/${encodeURIComponent(sessionId)}/parts`, query),\n { signal },\n );\n return response.parts;\n }\n\n /** `POST /sessions/:id/prompts` — 提交用户输入并触发/排队一次 run。 */\n async admitPrompt(\n sessionId: string,\n input: AdmitClientPromptInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<PromptResponse> {\n return await this.request<PromptResponse>(\n `/sessions/${encodeURIComponent(sessionId)}/prompts`,\n {\n method: \"POST\",\n body: { ...input, id: input.id ?? createPromptRequestId() },\n signal: options.signal,\n },\n );\n }\n\n /** `POST /sessions/:id/prompts/latest/edit` */\n async editLatestPrompt(\n sessionId: string,\n input: EditLatestClientPromptInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<PromptResponse> {\n return await this.request<PromptResponse>(\n `/sessions/${encodeURIComponent(sessionId)}/prompts/latest/edit`,\n {\n method: \"POST\",\n body: input,\n signal: options.signal,\n },\n );\n }\n\n /** Promote one durable queued prompt into the exact active run. */\n async promoteQueuedPrompt(\n sessionId: string,\n inputId: string,\n input: PromoteQueuedClientPromptInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<PromoteQueuedPromptResponse> {\n return await this.request<PromoteQueuedPromptResponse>(\n `/sessions/${encodeURIComponent(sessionId)}/prompts/${encodeURIComponent(inputId)}/promote`,\n { method: \"POST\", body: input, signal: options.signal },\n );\n }\n\n /** Cancel one durable prompt that is still waiting in the run queue. */\n async cancelQueuedPrompt(\n sessionId: string,\n inputId: string,\n input: CancelQueuedClientPromptInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<CancelQueuedPromptResponse> {\n return await this.request<CancelQueuedPromptResponse>(\n `/sessions/${encodeURIComponent(sessionId)}/prompts/${encodeURIComponent(inputId)}/cancel`,\n { method: \"POST\", body: input, signal: options.signal },\n );\n }\n\n /**\n * `POST /sessions/:id/runs/:runId/resume` — 显式重放一次中断 run 的原始 prompt。\n * 不会继续旧 provider stream;服务端会创建一个带恢复溯源的新 input/run。\n */\n async resumeInterruptedRun(\n sessionId: string,\n runId: string,\n input: ResumeInterruptedRunInput = {},\n options: { signal?: AbortSignal } = {},\n ): Promise<ResumeInterruptedRunResponse> {\n return await this.request<ResumeInterruptedRunResponse>(\n `/sessions/${encodeURIComponent(sessionId)}/runs/${encodeURIComponent(runId)}/resume`,\n {\n method: \"POST\",\n body: { ...input, id: input.id ?? createPromptRequestId() },\n signal: options.signal,\n },\n );\n }\n\n /** `POST /sessions/:id/interrupt` — 中断当前/排队中的 run。 */\n async interruptSession(\n sessionId: string,\n options: { signal?: AbortSignal; expectedRunId?: string } = {},\n ): Promise<InterruptSessionResponse> {\n return await this.request<InterruptSessionResponse>(\n `/sessions/${encodeURIComponent(sessionId)}/interrupt`,\n {\n method: \"POST\",\n body: options.expectedRunId\n ? { expectedRunId: options.expectedRunId }\n : undefined,\n signal: options.signal,\n },\n );\n }\n\n /** `GET /events` — 用于 attach 时的历史 replay。 */\n async listEvents(\n options: ListEventsOptions & { signal?: AbortSignal } = {},\n ): Promise<SessionEventRecord[]> {\n const { signal, ...query } = options;\n const response = await this.request<unknown>(this.path(\"/events\", query), {\n signal,\n });\n return responseArray(response, \"events\", decodeSessionEventRecord);\n }\n\n /** `GET /permissions` */\n async listPermissions(\n options: ListPermissionsOptions & { signal?: AbortSignal } = {},\n ): Promise<PermissionRequestRecord[]> {\n const { signal, ...query } = options;\n const response = await this.request<{\n requests: PermissionRequestRecord[];\n }>(this.path(\"/permissions\", query), { signal });\n return response.requests;\n }\n\n /** `POST /permissions/:id/reply` — 批准/拒绝工具权限请求。 */\n async replyPermission(\n requestId: string,\n input: ReplyPermissionInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<PermissionRequestRecord> {\n const response = await this.request<{ request: PermissionRequestRecord }>(\n `/permissions/${encodeURIComponent(requestId)}/reply`,\n {\n method: \"POST\",\n body: input,\n signal: options.signal,\n },\n );\n return response.request;\n }\n\n async getScheduledTaskStatus(\n options: { signal?: AbortSignal } = {},\n ): Promise<ScheduledTaskStatusSummary> {\n return await this.request<ScheduledTaskStatusSummary>(\"/schedules/status\", {\n signal: options.signal,\n });\n }\n\n async listScheduledTasks(\n options: {\n status?: ScheduledTaskRecord[\"status\"];\n signal?: AbortSignal;\n } = {},\n ): Promise<ScheduledTaskRecord[]> {\n const { signal, ...query } = options;\n const response = await this.request<{ tasks: ScheduledTaskRecord[] }>(\n this.path(\"/schedules/tasks\", query),\n { signal },\n );\n return response.tasks;\n }\n\n async getScheduledTask(\n id: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<ScheduledTaskRecord> {\n const response = await this.request<{ task: ScheduledTaskRecord }>(\n `/schedules/tasks/${encodeURIComponent(id)}`,\n { signal: options.signal },\n );\n return response.task;\n }\n\n async createScheduledTask(\n input: CreateScheduledTaskInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<ScheduledTaskRecord> {\n const response = await this.request<{ task: ScheduledTaskRecord }>(\n \"/schedules/tasks\",\n {\n method: \"POST\",\n body: input,\n signal: options.signal,\n },\n );\n return response.task;\n }\n\n async updateScheduledTask(\n id: string,\n input: UpdateScheduledTaskInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<ScheduledTaskRecord> {\n const response = await this.request<{ task: ScheduledTaskRecord }>(\n `/schedules/tasks/${encodeURIComponent(id)}`,\n { method: \"PATCH\", body: input, signal: options.signal },\n );\n return response.task;\n }\n\n async removeScheduledTask(\n id: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<void> {\n await this.request<{ removed: true }>(\n `/schedules/tasks/${encodeURIComponent(id)}`,\n {\n method: \"DELETE\",\n signal: options.signal,\n },\n );\n }\n\n async triggerScheduledTask(\n id: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<ScheduledRunRecord> {\n const response = await this.request<{ run: ScheduledRunRecord }>(\n `/schedules/tasks/${encodeURIComponent(id)}/run`,\n { method: \"POST\", signal: options.signal },\n );\n return response.run;\n }\n\n async listScheduledRuns(\n options: {\n taskId?: string;\n unread?: boolean;\n limit?: number;\n signal?: AbortSignal;\n } = {},\n ): Promise<ScheduledRunRecord[]> {\n const { signal, ...query } = options;\n const response = await this.request<{ runs: ScheduledRunRecord[] }>(\n this.path(\"/schedules/runs\", query),\n { signal },\n );\n return response.runs;\n }\n\n async setScheduledRunUnread(\n id: string,\n unread: boolean,\n options: { signal?: AbortSignal } = {},\n ): Promise<ScheduledRunRecord> {\n const response = await this.request<{ run: ScheduledRunRecord }>(\n `/schedules/runs/${encodeURIComponent(id)}/read`,\n { method: \"PATCH\", body: { unread }, signal: options.signal },\n );\n return response.run;\n }\n\n async createTerminal(\n input: TerminalCreateRequest,\n options: { signal?: AbortSignal } = {},\n ): Promise<TerminalSessionInfo> {\n const response = await this.request<unknown>(\"/terminals\", {\n method: \"POST\",\n body: input,\n signal: options.signal,\n });\n return decodeTerminalSessionInfo(responseField(response, \"terminal\"));\n }\n\n async listJobs(options: {\n sessionId: string;\n kinds?: JobKind[];\n statuses?: JobStatus[];\n startedAfter?: number;\n startedBefore?: number;\n updatedAfter?: number;\n updatedBefore?: number;\n includeFinished?: boolean;\n limit?: number;\n signal?: AbortSignal;\n }): Promise<JobSnapshot[]> {\n const { signal, kinds, statuses, includeFinished, ...query } = options;\n const response = await this.request<unknown>(\n this.path(\"/jobs\", {\n ...query,\n ...(kinds ? { kinds: kinds.join(\",\") } : {}),\n ...(statuses ? { statuses: statuses.join(\",\") } : {}),\n ...(includeFinished !== undefined\n ? { includeFinished: String(includeFinished) }\n : {}),\n }),\n { signal },\n );\n return responseArray(response, \"jobs\", decodeJobSnapshot);\n }\n\n async createBackgroundShell(\n input: CreateBackgroundShellInput,\n options: { signal?: AbortSignal } = {},\n ): Promise<CreateBackgroundShellResult> {\n return await this.request<CreateBackgroundShellResult>(\n \"/background-shells\",\n {\n method: \"POST\",\n body: input,\n signal: options.signal,\n },\n );\n }\n\n async readJob(\n jobId: string,\n options: {\n sessionId: string;\n after?: number;\n maxChars?: number;\n signal?: AbortSignal;\n },\n ): Promise<JobReadResult> {\n const { signal, ...query } = options;\n const response = await this.request<unknown>(\n this.path(`/jobs/${encodeURIComponent(jobId)}`, query),\n { signal },\n );\n return decodeJobReadResult(response);\n }\n\n async waitJob(\n jobId: string,\n input: {\n sessionId: string;\n timeoutMs?: number;\n after?: number;\n maxChars?: number;\n },\n options: { signal?: AbortSignal } = {},\n ): Promise<JobWaitResult> {\n const response = await this.request<unknown>(\n `/jobs/${encodeURIComponent(jobId)}/wait`,\n {\n method: \"POST\",\n body: input,\n signal: options.signal,\n },\n );\n return decodeJobWaitResult(response);\n }\n\n async sendJob(\n jobId: string,\n input: { sessionId: string; data: string },\n options: { signal?: AbortSignal } = {},\n ): Promise<void> {\n await this.request(`/jobs/${encodeURIComponent(jobId)}/input`, {\n method: \"POST\",\n body: input,\n signal: options.signal,\n });\n }\n\n async cancelJob(\n jobId: string,\n input: { sessionId: string; reason?: string },\n options: { signal?: AbortSignal } = {},\n ): Promise<JobSnapshot> {\n const response = await this.request<unknown>(\n `/jobs/${encodeURIComponent(jobId)}/cancel`,\n { method: \"POST\", body: input, signal: options.signal },\n );\n return decodeJobSnapshot(responseField(response, \"snapshot\"));\n }\n\n async listTerminals(\n options: {\n projectId?: string;\n sessionId?: string;\n source?: TerminalSource;\n signal?: AbortSignal;\n } = {},\n ): Promise<TerminalSessionInfo[]> {\n const { signal, ...query } = options;\n const response = await this.request<unknown>(\n this.path(\"/terminals\", query),\n { signal },\n );\n return responseArray(response, \"terminals\", decodeTerminalSessionInfo);\n }\n\n async getTerminal(\n terminalId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<TerminalSessionInfo> {\n const response = await this.request<unknown>(\n `/terminals/${encodeURIComponent(terminalId)}`,\n { signal: options.signal },\n );\n return decodeTerminalSessionInfo(responseField(response, \"terminal\"));\n }\n\n async readTerminal(\n terminalId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<TerminalReadResult> {\n const response = await this.request<unknown>(\n `/terminals/${encodeURIComponent(terminalId)}/output`,\n { signal: options.signal },\n );\n return decodeTerminalReadResult(responseField(response, \"snapshot\"));\n }\n\n async writeTerminal(\n input: TerminalWriteRequest,\n options: { signal?: AbortSignal } = {},\n ): Promise<void> {\n await this.request<{ written: true }>(\n `/terminals/${encodeURIComponent(input.terminalId)}/input`,\n { method: \"POST\", body: { data: input.data }, signal: options.signal },\n );\n }\n\n async resizeTerminal(\n input: TerminalResizeRequest,\n options: { signal?: AbortSignal } = {},\n ): Promise<void> {\n await this.request<{ resized: true }>(\n `/terminals/${encodeURIComponent(input.terminalId)}/resize`,\n {\n method: \"POST\",\n body: { cols: input.cols, rows: input.rows },\n signal: options.signal,\n },\n );\n }\n\n async signalTerminal(\n terminalId: string,\n signal: TerminalSignal,\n options: { signal?: AbortSignal } = {},\n ): Promise<void> {\n await this.request<{ signaled: true }>(\n `/terminals/${encodeURIComponent(terminalId)}/signal`,\n { method: \"POST\", body: { signal }, signal: options.signal },\n );\n }\n\n async closeTerminal(\n terminalId: string,\n options: { signal?: AbortSignal } = {},\n ): Promise<void> {\n await this.request<{ removed: true }>(\n `/terminals/${encodeURIComponent(terminalId)}`,\n {\n method: \"DELETE\",\n signal: options.signal,\n },\n );\n }\n\n streamTerminalEvents(\n options: { signal?: AbortSignal } = {},\n ): AsyncIterable<TerminalEvent> {\n return streamServerSentEvents(async () => {\n const response = await this.fetchImpl(\n `${this.baseUrl}/terminals/stream`,\n {\n headers: this.headers(),\n signal: options.signal,\n },\n );\n if (!response.ok) await this.throwResponseError(response);\n if (!response.body)\n throw new Error(\"Terminal event stream response has no body\");\n return response.body;\n }, decodeTerminalEvent);\n }\n\n streamEvents(\n options: EventSyncOptions = {},\n ): AsyncIterable<SessionEventRecord> {\n return streamServerSentEvents(async () => {\n const query = {\n cursor: options.cursor,\n sessionId: options.sessionId,\n };\n const response = await this.fetchImpl(\n `${this.baseUrl}${this.path(\"/events/stream\", query)}`,\n {\n headers: this.headers(),\n signal: options.signal,\n },\n );\n if (!response.ok) await this.throwResponseError(response);\n if (!response.body) throw new Error(\"Event stream response has no body\");\n return response.body;\n }, decodeSessionEventRecord);\n }\n\n private async request<T>(\n path: string,\n options: {\n method?: string;\n body?: unknown;\n signal?: AbortSignal;\n auth?: boolean;\n } = {},\n ): Promise<T> {\n const response = await this.fetchImpl(`${this.baseUrl}${path}`, {\n method: options.method ?? \"GET\",\n headers: this.headers(options.body !== undefined, options.auth ?? true),\n body:\n options.body === undefined ? undefined : JSON.stringify(options.body),\n signal: options.signal,\n });\n if (!response.ok) await this.throwResponseError(response);\n return (await response.json()) as T;\n }\n\n private headers(json = false, auth = true): Record<string, string> {\n return {\n ...(auth && this.token ? { authorization: `Bearer ${this.token}` } : {}),\n ...(json ? { \"content-type\": \"application/json\" } : {}),\n };\n }\n\n /** 拼 query;跳过 undefined / null / false。 */\n private path(pathname: string, query: Record<string, unknown> = {}): string {\n const params = new URLSearchParams();\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined || value === null || value === false) continue;\n params.set(key, String(value));\n }\n const qs = params.toString();\n return qs ? `${pathname}?${qs}` : pathname;\n }\n\n private async throwResponseError(response: Response): Promise<never> {\n let body: unknown;\n try {\n body = await response.json();\n } catch {\n body = await response.text().catch(() => \"\");\n }\n const message =\n body &&\n typeof body === \"object\" &&\n \"error\" in body &&\n typeof body.error === \"string\"\n ? body.error\n : body &&\n typeof body === \"object\" &&\n \"message\" in body &&\n typeof body.message === \"string\"\n ? body.message\n : `OpenHarness API request failed with ${response.status}`;\n throw new OpenHarnessApiError(message, response.status, body);\n }\n}\n\nfunction isReadableStream(value: unknown): value is ReadableStream<Uint8Array> {\n return (\n typeof ReadableStream !== \"undefined\" && value instanceof ReadableStream\n );\n}\n\nfunction attachmentRangeHeader(\n range: DownloadAttachmentOptions[\"range\"],\n): string | undefined {\n if (!range) return undefined;\n const { start, end, suffixBytes } = range;\n if (suffixBytes !== undefined) {\n if (start !== undefined || end !== undefined) {\n throw new Error(\"suffixBytes cannot be combined with start or end\");\n }\n assertPositiveSafeInteger(suffixBytes, \"suffixBytes\");\n return `bytes=-${suffixBytes}`;\n }\n if (start === undefined && end === undefined) return undefined;\n if (start === undefined) {\n throw new Error(\"range start is required when end is provided\");\n }\n assertNonNegativeSafeInteger(start, \"start\");\n if (end === undefined) return `bytes=${start}-`;\n assertNonNegativeSafeInteger(end, \"end\");\n if (end < start) throw new Error(\"range end must not be less than start\");\n return `bytes=${start}-${end}`;\n}\n\nfunction assertNonNegativeSafeInteger(value: number, field: string): void {\n if (!Number.isSafeInteger(value) || value < 0) {\n throw new Error(`${field} must be a non-negative safe integer`);\n }\n}\n\nfunction assertPositiveSafeInteger(value: number, field: string): void {\n if (!Number.isSafeInteger(value) || value < 1) {\n throw new Error(`${field} must be a positive safe integer`);\n }\n}\n\n/**\n * 将 SSE 字节流解析为 `SessionEventRecord` 异步迭代。\n * `open` 负责建立连接并返回 response body,便于重试或注入。\n */\nexport async function* streamServerSentEvents<T = SessionEventRecord>(\n open: () => Promise<ReadableStream<Uint8Array>>,\n decode: (value: unknown) => T = (value) => value as T,\n): AsyncIterable<T> {\n const reader = (await open()).getReader();\n const decoder = new TextDecoder();\n let buffer = \"\";\n try {\n while (true) {\n const chunk = await reader.read();\n if (chunk.done) break;\n buffer += decoder.decode(chunk.value, { stream: true });\n // SSE 事件以空行分隔\n const frames = buffer.split(/\\r?\\n\\r?\\n/);\n buffer = frames.pop() ?? \"\";\n for (const frame of frames) {\n const event = parseSseFrame(frame);\n if (event !== undefined) yield decode(event);\n }\n }\n buffer += decoder.decode();\n const event = parseSseFrame(buffer);\n if (event !== undefined) yield decode(event);\n } finally {\n reader.releaseLock();\n }\n}\n\n/** 解析单个 SSE frame 的 `data:` 行,得到事件 JSON。 */\nfunction parseSseFrame(frame: string): unknown | undefined {\n let data = \"\";\n for (const line of frame.split(/\\r?\\n/)) {\n if (!line || line.startsWith(\":\")) continue;\n if (line.startsWith(\"data:\")) data += line.slice(5).trimStart();\n }\n if (!data) return undefined;\n return JSON.parse(data) as unknown;\n}\n\nexport class IncompatibleProtocolError extends Error {\n constructor(\n readonly capabilities: ServerCapabilities,\n message: string,\n ) {\n super(message);\n this.name = \"IncompatibleProtocolError\";\n }\n}\n",
13
13
  "export * from \"./http-client.js\";\n",
14
- "/**\r\n * 事件 → 客户端状态 reducer。\r\n *\r\n * 幂等:同一 `seq` 只应用一次。多端用同一套事件流应收敛到相同状态。\r\n */\r\n\r\nimport { SESSION_EVENT_SCHEMA_VERSION } from \"@openharness/protocol\";\r\n\r\nimport type {\r\n OpenHarnessClientState,\r\n PermissionRequestRecord,\r\n SessionBucket,\r\n SessionEventRecord,\r\n SessionInputRecord,\r\n SessionMessagePartRecord,\r\n SessionMessageRecord,\r\n SessionRecord,\r\n SessionRunRecord,\r\n SessionRunAttemptRecord,\r\n SessionExecutionRecord,\r\n SessionStateSnapshot,\r\n} from \"../types/index.js\";\r\n\r\nexport class UnsupportedSessionEventSchemaVersionError extends Error {\r\n readonly event: Pick<SessionEventRecord, \"seq\" | \"type\" | \"schemaVersion\">;\r\n\r\n constructor(event: SessionEventRecord) {\r\n super(\r\n `Unsupported session event schema version ${event.schemaVersion} for ${event.type} at sequence ${event.seq}; expected ${SESSION_EVENT_SCHEMA_VERSION}`,\r\n );\r\n this.name = \"UnsupportedSessionEventSchemaVersionError\";\r\n this.event = {\r\n seq: event.seq,\r\n type: event.type,\r\n schemaVersion: event.schemaVersion,\r\n };\r\n }\r\n}\r\n\r\n/** 空客户端状态,作为 replay/hydrate 起点。 */\r\nexport function createInitialClientState(): OpenHarnessClientState {\r\n return {\r\n sessions: {},\r\n sessionOrder: [],\r\n buckets: {},\r\n eventsBySeq: {},\r\n snapshotCursorBySession: {},\r\n transientCursor: 0,\r\n lastSeq: 0,\r\n };\r\n}\r\n\r\n/** 按序批量应用事件。 */\r\nexport function applyEvents(\r\n state: OpenHarnessClientState,\r\n events: Iterable<SessionEventRecord>,\r\n): OpenHarnessClientState {\r\n let next = state;\r\n for (const event of events) next = applyEvent(next, event);\r\n return next;\r\n}\r\n\r\n/** Replace one session bucket with an atomic server snapshot. */\r\nexport function applySessionSnapshot(\r\n state: OpenHarnessClientState,\r\n snapshot: SessionStateSnapshot,\r\n): OpenHarnessClientState {\r\n const partsByMessageId: SessionBucket[\"partsByMessageId\"] = {};\r\n for (const part of snapshot.parts) {\r\n const parts = partsByMessageId[part.messageId] ?? [];\r\n parts.push(part);\r\n partsByMessageId[part.messageId] = parts;\r\n }\r\n for (const parts of Object.values(partsByMessageId)) parts.sort((a, b) => a.seq - b.seq);\r\n\r\n const sessions = { ...state.sessions, [snapshot.session.id]: snapshot.session };\r\n return {\r\n ...state,\r\n sessions,\r\n sessionOrder: sortSessionOrder(sessions),\r\n buckets: {\r\n ...state.buckets,\r\n [snapshot.session.id]: {\r\n session: snapshot.session,\r\n inputs: [...snapshot.inputs].sort((a, b) => a.seq - b.seq),\r\n messages: [...snapshot.messages].sort((a, b) => a.seq - b.seq),\r\n partsByMessageId,\r\n runs: Object.fromEntries(snapshot.runs.map((run) => [run.id, run])),\r\n attempts: Object.fromEntries((snapshot.attempts ?? []).map((attempt) => [attempt.id, attempt])),\r\n tasks: Object.fromEntries((snapshot.tasks ?? []).map((task) => [task.id, task])),\r\n permissions: Object.fromEntries(snapshot.permissions.map((request) => [request.id, request])),\r\n },\r\n },\r\n snapshotCursorBySession: {\r\n ...state.snapshotCursorBySession,\r\n [snapshot.session.id]: Math.max(\r\n state.snapshotCursorBySession[snapshot.session.id] ?? 0,\r\n snapshot.cursor,\r\n ),\r\n },\r\n transientCursor: Math.max(state.transientCursor, snapshot.cursor),\r\n lastSeq: Math.max(state.lastSeq, snapshot.cursor),\r\n };\r\n}\r\n\r\n/**\r\n * 应用单条事件。已见过的 `seq` 直接返回原 state(引用相等,便于 live 去重)。\r\n */\r\nexport function applyEvent(\r\n state: OpenHarnessClientState,\r\n event: SessionEventRecord,\r\n): OpenHarnessClientState {\r\n if (event.schemaVersion !== SESSION_EVENT_SCHEMA_VERSION) {\r\n throw new UnsupportedSessionEventSchemaVersionError(event);\r\n }\r\n const transient = event.type === \"session.message.part.delta\";\r\n const snapshotCursor = event.sessionId\r\n ? state.snapshotCursorBySession[event.sessionId] ?? 0\r\n : 0;\r\n if (event.seq <= snapshotCursor) return state;\r\n if (transient && event.seq <= state.transientCursor) return state;\r\n if (!transient && state.eventsBySeq[event.seq]) return state;\r\n if (!transient) state.eventsBySeq[event.seq] = event;\r\n\r\n let next: OpenHarnessClientState = {\r\n ...state,\r\n eventsBySeq: state.eventsBySeq,\r\n transientCursor: transient ? event.seq : state.transientCursor,\r\n lastSeq: Math.max(state.lastSeq, event.seq),\r\n };\r\n\r\n switch (event.type) {\r\n case \"session.created\":\r\n case \"session.updated\":\r\n next = upsertSession(next, readPayloadRecord<SessionRecord>(event, \"session\"));\r\n break;\r\n case \"session.archived\":\r\n next = archiveSession(next, event);\r\n break;\r\n case \"session.input.admitted\":\r\n next = upsertInput(next, readPayloadRecord<SessionInputRecord>(event, \"input\"));\r\n break;\r\n case \"session.message.created\":\r\n next = upsertMessage(next, readPayloadRecord<SessionMessageRecord>(event, \"message\"));\r\n break;\r\n case \"session.transcript.replaced\":\r\n next = replaceTranscript(next, event);\r\n break;\r\n case \"session.message.part.updated\":\r\n next = upsertPart(next, readPayloadRecord<SessionMessagePartRecord>(event, \"part\"));\r\n break;\r\n case \"session.message.part.delta\":\r\n next = appendPartDelta(next, event);\r\n break;\r\n case \"session.run.created\":\r\n case \"session.run.updated\":\r\n next = upsertRun(next, readPayloadRecord<SessionRunRecord>(event, \"run\"));\r\n break;\r\n case \"session.run_attempt.created\":\r\n case \"session.run_attempt.updated\":\r\n next = upsertRunAttempt(next, readPayloadRecord<SessionRunAttemptRecord>(event, \"attempt\"));\r\n break;\r\n case \"session.task.created\":\r\n case \"session.task.updated\":\r\n next = upsertTask(next, readPayloadRecord<SessionExecutionRecord>(event, \"task\"));\r\n break;\r\n case \"permission.asked\":\r\n case \"permission.replied\":\r\n next = upsertPermission(next, readPayloadRecord<PermissionRequestRecord>(event, \"request\"));\r\n break;\r\n }\r\n\r\n return next;\r\n}\r\n\r\nfunction readPayloadRecord<T>(event: SessionEventRecord, key: string): T | undefined {\r\n const value = event.payload[key];\r\n return value && typeof value === \"object\" && !Array.isArray(value) ? value as T : undefined;\r\n}\r\n\r\nfunction upsertSession(state: OpenHarnessClientState, session: SessionRecord | undefined): OpenHarnessClientState {\r\n if (!session) return state;\r\n const bucket = cloneBucket(state.buckets[session.id]);\r\n bucket.session = session;\r\n const sessions = { ...state.sessions, [session.id]: session };\r\n return {\r\n ...state,\r\n sessions,\r\n sessionOrder: sortSessionOrder(sessions),\r\n buckets: { ...state.buckets, [session.id]: bucket },\r\n };\r\n}\r\n\r\nfunction archiveSession(state: OpenHarnessClientState, event: SessionEventRecord): OpenHarnessClientState {\r\n const sessionId = typeof event.payload.sessionId === \"string\" ? event.payload.sessionId : event.sessionId;\r\n if (!sessionId) return state;\r\n const current = state.sessions[sessionId];\r\n if (!current) return state;\r\n const archived: SessionRecord = {\r\n ...current,\r\n status: \"archived\",\r\n archivedAt: current.archivedAt ?? event.createdAt,\r\n updatedAt: Math.max(current.updatedAt, event.createdAt),\r\n };\r\n return upsertSession(state, archived);\r\n}\r\n\r\nfunction upsertInput(state: OpenHarnessClientState, input: SessionInputRecord | undefined): OpenHarnessClientState {\r\n if (!input) return state;\r\n const bucket = cloneBucket(state.buckets[input.sessionId]);\r\n bucket.inputs = upsertSorted(bucket.inputs, input, (row) => row.seq);\r\n return { ...state, buckets: { ...state.buckets, [input.sessionId]: bucket } };\r\n}\r\n\r\nfunction upsertMessage(state: OpenHarnessClientState, message: SessionMessageRecord | undefined): OpenHarnessClientState {\r\n if (!message) return state;\r\n const bucket = cloneBucket(state.buckets[message.sessionId]);\r\n bucket.messages = upsertSorted(bucket.messages, message, (row) => row.seq);\r\n return { ...state, buckets: { ...state.buckets, [message.sessionId]: bucket } };\r\n}\r\n\r\nfunction replaceTranscript(state: OpenHarnessClientState, event: SessionEventRecord): OpenHarnessClientState {\r\n const sessionId = event.sessionId;\r\n if (!sessionId) return state;\r\n const messages = Array.isArray(event.payload.messages)\r\n ? event.payload.messages.filter((row): row is SessionMessageRecord =>\r\n !!row && typeof row === \"object\" && !Array.isArray(row) && typeof (row as SessionMessageRecord).id === \"string\")\r\n : [];\r\n const parts = Array.isArray(event.payload.parts)\r\n ? event.payload.parts.filter((row): row is SessionMessagePartRecord =>\r\n !!row && typeof row === \"object\" && !Array.isArray(row) && typeof (row as SessionMessagePartRecord).id === \"string\")\r\n : [];\r\n const bucket = cloneBucket(state.buckets[sessionId]);\r\n const partsByMessageId: SessionBucket[\"partsByMessageId\"] = {};\r\n for (const part of parts) {\r\n const rows = partsByMessageId[part.messageId] ?? [];\r\n rows.push(part);\r\n partsByMessageId[part.messageId] = rows;\r\n }\r\n for (const rows of Object.values(partsByMessageId)) rows.sort((a, b) => a.seq - b.seq);\r\n bucket.messages = [...messages].sort((a, b) => a.seq - b.seq);\r\n bucket.partsByMessageId = partsByMessageId;\r\n if (bucket.session) {\r\n bucket.session = {\r\n ...bucket.session,\r\n updatedAt: Math.max(bucket.session.updatedAt, event.createdAt),\r\n };\r\n }\r\n const sessions = bucket.session\r\n ? { ...state.sessions, [sessionId]: bucket.session }\r\n : state.sessions;\r\n return {\r\n ...state,\r\n sessions,\r\n sessionOrder: sortSessionOrder(sessions),\r\n buckets: { ...state.buckets, [sessionId]: bucket },\r\n };\r\n}\r\n\r\nfunction upsertPart(state: OpenHarnessClientState, part: SessionMessagePartRecord | undefined): OpenHarnessClientState {\r\n if (!part) return state;\r\n const bucket = cloneBucketForPartWrite(state.buckets[part.sessionId]);\r\n const existing = bucket.partsByMessageId[part.messageId] ?? [];\r\n bucket.partsByMessageId = {\r\n ...bucket.partsByMessageId,\r\n [part.messageId]: upsertSorted(existing, part, (row) => row.seq),\r\n };\r\n return { ...state, buckets: { ...state.buckets, [part.sessionId]: bucket } };\r\n}\r\n\r\nfunction appendPartDelta(state: OpenHarnessClientState, event: SessionEventRecord): OpenHarnessClientState {\r\n const sessionId = typeof event.payload.sessionId === \"string\" ? event.payload.sessionId : event.sessionId;\r\n const messageId = typeof event.payload.messageId === \"string\" ? event.payload.messageId : undefined;\r\n const partId = typeof event.payload.partId === \"string\" ? event.payload.partId : undefined;\r\n const field = event.payload.field;\r\n const delta = typeof event.payload.delta === \"string\" ? event.payload.delta : undefined;\r\n if (!sessionId || !messageId || !partId || field !== \"text\" || delta === undefined) return state;\r\n\r\n const bucket = cloneBucketForPartWrite(state.buckets[sessionId]);\r\n const currentParts = bucket.partsByMessageId[messageId] ?? [];\r\n const index = currentParts.findIndex((part) => part.id === partId);\r\n const nextParts = [...currentParts];\r\n if (index >= 0) {\r\n const current = nextParts[index]!;\r\n nextParts[index] = {\r\n ...current,\r\n text: `${current.text ?? \"\"}${delta}`,\r\n updatedAt: Math.max(current.updatedAt, event.createdAt),\r\n };\r\n } else {\r\n const seq = currentParts.reduce((max, part) => Math.max(max, part.seq), 0) + 1;\r\n nextParts.push({\r\n id: partId,\r\n sessionId,\r\n messageId,\r\n seq,\r\n type: \"text\",\r\n status: \"running\",\r\n text: delta,\r\n metadata: {},\r\n createdAt: event.createdAt,\r\n updatedAt: event.createdAt,\r\n });\r\n }\r\n const sortedParts = index >= 0\r\n ? nextParts\r\n : nextParts.sort((a, b) => a.seq - b.seq);\r\n bucket.partsByMessageId = {\r\n ...bucket.partsByMessageId,\r\n [messageId]: sortedParts,\r\n };\r\n return { ...state, buckets: { ...state.buckets, [sessionId]: bucket } };\r\n}\r\n\r\nfunction upsertRun(state: OpenHarnessClientState, run: SessionRunRecord | undefined): OpenHarnessClientState {\r\n if (!run) return state;\r\n const bucket = cloneBucket(state.buckets[run.sessionId]);\r\n bucket.runs = { ...bucket.runs, [run.id]: run };\r\n const session = refreshSessionStatusFromRuns(bucket.session, bucket.runs, run.updatedAt);\r\n bucket.session = session;\r\n const sessions = session ? { ...state.sessions, [run.sessionId]: session } : state.sessions;\r\n return {\r\n ...state,\r\n sessions,\r\n sessionOrder: session ? sortSessionOrder(sessions) : state.sessionOrder,\r\n buckets: { ...state.buckets, [run.sessionId]: bucket },\r\n };\r\n}\r\n\r\nfunction upsertRunAttempt(\r\n state: OpenHarnessClientState,\r\n attempt: SessionRunAttemptRecord | undefined,\r\n): OpenHarnessClientState {\r\n if (!attempt) return state;\r\n const run = Object.values(state.buckets)\r\n .flatMap((bucket) => Object.values(bucket.runs))\r\n .find((candidate) => candidate.id === attempt.runId);\r\n if (!run) return state;\r\n const bucket = cloneBucket(state.buckets[run.sessionId]);\r\n bucket.attempts = { ...bucket.attempts, [attempt.id]: attempt };\r\n return { ...state, buckets: { ...state.buckets, [run.sessionId]: bucket } };\r\n}\r\n\r\nfunction refreshSessionStatusFromRuns(\r\n session: SessionRecord | undefined,\r\n runs: SessionBucket[\"runs\"],\r\n updatedAt: number,\r\n): SessionRecord | undefined {\r\n if (!session || session.status === \"archived\" || session.status === \"closing\") return session;\r\n const running = Object.values(runs).some(\r\n (candidate) => candidate.status === \"pending\" || candidate.status === \"running\",\r\n );\r\n return {\r\n ...session,\r\n status: running ? \"running\" : \"idle\",\r\n updatedAt: Math.max(session.updatedAt, updatedAt),\r\n };\r\n}\r\n\r\nfunction upsertPermission(\r\n state: OpenHarnessClientState,\r\n request: PermissionRequestRecord | undefined,\r\n): OpenHarnessClientState {\r\n if (!request) return state;\r\n const bucket = cloneBucket(state.buckets[request.sessionId]);\r\n bucket.permissions = { ...bucket.permissions, [request.id]: request };\r\n return { ...state, buckets: { ...state.buckets, [request.sessionId]: bucket } };\r\n}\r\n\r\nfunction upsertTask(state: OpenHarnessClientState, task: SessionExecutionRecord | undefined): OpenHarnessClientState {\r\n if (!task) return state;\r\n const bucket = cloneBucket(state.buckets[task.sessionId]);\r\n bucket.tasks = { ...bucket.tasks, [task.id]: task };\r\n return { ...state, buckets: { ...state.buckets, [task.sessionId]: bucket } };\r\n}\r\n\r\nfunction cloneBucket(bucket: SessionBucket | undefined): SessionBucket {\r\n return {\r\n session: bucket?.session,\r\n inputs: bucket?.inputs ? [...bucket.inputs] : [],\r\n messages: bucket?.messages ? [...bucket.messages] : [],\r\n partsByMessageId: bucket?.partsByMessageId\r\n ? Object.fromEntries(Object.entries(bucket.partsByMessageId).map(([id, parts]) => [id, [...parts]]))\r\n : {},\r\n runs: bucket?.runs ? { ...bucket.runs } : {},\r\n attempts: bucket?.attempts ? { ...bucket.attempts } : {},\r\n tasks: bucket?.tasks ? { ...bucket.tasks } : {},\r\n permissions: bucket?.permissions ? { ...bucket.permissions } : {},\r\n };\r\n}\r\n\r\nfunction cloneBucketForPartWrite(bucket: SessionBucket | undefined): SessionBucket {\r\n return {\r\n session: bucket?.session,\r\n inputs: bucket?.inputs ?? [],\r\n messages: bucket?.messages ?? [],\r\n partsByMessageId: bucket?.partsByMessageId ?? {},\r\n runs: bucket?.runs ?? {},\r\n attempts: bucket?.attempts ?? {},\r\n tasks: bucket?.tasks ?? {},\r\n permissions: bucket?.permissions ?? {},\r\n };\r\n}\r\n\r\n/** 按 id 覆盖后按 sortKey 升序排列。 */\r\nfunction upsertSorted<T extends { id: string }>(rows: T[], row: T, sortKey: (row: T) => number): T[] {\r\n const without = rows.filter((existing) => existing.id !== row.id);\r\n without.push(row);\r\n return without.sort((a, b) => sortKey(a) - sortKey(b));\r\n}\r\n\r\n/** session 列表排序:最近更新优先。 */\r\nfunction sortSessionOrder(sessions: Record<string, SessionRecord>): string[] {\r\n return Object.values(sessions)\r\n .sort((a, b) => b.updatedAt - a.updatedAt || a.id.localeCompare(b.id))\r\n .map((session) => session.id);\r\n}\r\n",
14
+ "/**\n * 事件 → 客户端状态 reducer。\n *\n * 幂等:同一 `seq` 只应用一次。多端用同一套事件流应收敛到相同状态。\n */\n\nimport { SESSION_EVENT_SCHEMA_VERSION } from \"@openharness/protocol\";\n\nimport type {\n OpenHarnessClientState,\n PermissionRequestRecord,\n SessionBucket,\n SessionEventRecord,\n SessionInputRecord,\n SessionMessagePartRecord,\n SessionMessageRecord,\n SessionRecord,\n SessionRunRecord,\n SessionRunAttemptRecord,\n SessionExecutionRecord,\n SessionStateSnapshot,\n} from \"../types/index.js\";\n\nexport class UnsupportedSessionEventSchemaVersionError extends Error {\n readonly event: Pick<SessionEventRecord, \"seq\" | \"type\" | \"schemaVersion\">;\n\n constructor(event: SessionEventRecord) {\n super(\n `Unsupported session event schema version ${event.schemaVersion} for ${event.type} at sequence ${event.seq}; expected ${SESSION_EVENT_SCHEMA_VERSION}`,\n );\n this.name = \"UnsupportedSessionEventSchemaVersionError\";\n this.event = {\n seq: event.seq,\n type: event.type,\n schemaVersion: event.schemaVersion,\n };\n }\n}\n\n/** 空客户端状态,作为 replay/hydrate 起点。 */\nexport function createInitialClientState(): OpenHarnessClientState {\n return {\n sessions: {},\n sessionOrder: [],\n buckets: {},\n eventsBySeq: {},\n snapshotCursorBySession: {},\n transientCursor: 0,\n lastSeq: 0,\n };\n}\n\n/** 按序批量应用事件。 */\nexport function applyEvents(\n state: OpenHarnessClientState,\n events: Iterable<SessionEventRecord>,\n): OpenHarnessClientState {\n let next = state;\n for (const event of events) next = applyEvent(next, event);\n return next;\n}\n\n/** Replace one session bucket with an atomic server snapshot. */\nexport function applySessionSnapshot(\n state: OpenHarnessClientState,\n snapshot: SessionStateSnapshot,\n): OpenHarnessClientState {\n const partsByMessageId: SessionBucket[\"partsByMessageId\"] = {};\n for (const part of snapshot.parts) {\n const parts = partsByMessageId[part.messageId] ?? [];\n parts.push(part);\n partsByMessageId[part.messageId] = parts;\n }\n for (const parts of Object.values(partsByMessageId)) parts.sort((a, b) => a.seq - b.seq);\n\n const sessions = { ...state.sessions, [snapshot.session.id]: snapshot.session };\n return {\n ...state,\n sessions,\n sessionOrder: sortSessionOrder(sessions),\n buckets: {\n ...state.buckets,\n [snapshot.session.id]: {\n session: snapshot.session,\n inputs: [...snapshot.inputs].sort((a, b) => a.seq - b.seq),\n messages: [...snapshot.messages].sort((a, b) => a.seq - b.seq),\n partsByMessageId,\n runs: Object.fromEntries(snapshot.runs.map((run) => [run.id, run])),\n attempts: Object.fromEntries((snapshot.attempts ?? []).map((attempt) => [attempt.id, attempt])),\n tasks: Object.fromEntries((snapshot.tasks ?? []).map((task) => [task.id, task])),\n permissions: Object.fromEntries(snapshot.permissions.map((request) => [request.id, request])),\n },\n },\n snapshotCursorBySession: {\n ...state.snapshotCursorBySession,\n [snapshot.session.id]: Math.max(\n state.snapshotCursorBySession[snapshot.session.id] ?? 0,\n snapshot.cursor,\n ),\n },\n transientCursor: Math.max(state.transientCursor, snapshot.cursor),\n lastSeq: Math.max(state.lastSeq, snapshot.cursor),\n };\n}\n\n/**\n * 应用单条事件。已见过的 `seq` 直接返回原 state(引用相等,便于 live 去重)。\n */\nexport function applyEvent(\n state: OpenHarnessClientState,\n event: SessionEventRecord,\n): OpenHarnessClientState {\n if (event.schemaVersion !== SESSION_EVENT_SCHEMA_VERSION) {\n throw new UnsupportedSessionEventSchemaVersionError(event);\n }\n const transient = event.type === \"session.message.part.delta\";\n const snapshotCursor = event.sessionId\n ? state.snapshotCursorBySession[event.sessionId] ?? 0\n : 0;\n if (event.seq <= snapshotCursor) return state;\n if (transient && event.seq <= state.transientCursor) return state;\n if (!transient && state.eventsBySeq[event.seq]) return state;\n if (!transient) state.eventsBySeq[event.seq] = event;\n\n let next: OpenHarnessClientState = {\n ...state,\n eventsBySeq: state.eventsBySeq,\n transientCursor: transient ? event.seq : state.transientCursor,\n lastSeq: Math.max(state.lastSeq, event.seq),\n };\n\n switch (event.type) {\n case \"session.created\":\n case \"session.updated\":\n next = upsertSession(next, readPayloadRecord<SessionRecord>(event, \"session\"));\n break;\n case \"session.archived\":\n next = archiveSession(next, event);\n break;\n case \"session.input.admitted\":\n next = upsertInput(next, readPayloadRecord<SessionInputRecord>(event, \"input\"));\n break;\n case \"session.message.created\":\n next = upsertMessage(next, readPayloadRecord<SessionMessageRecord>(event, \"message\"));\n break;\n case \"session.transcript.replaced\":\n next = replaceTranscript(next, event);\n break;\n case \"session.message.part.updated\":\n next = upsertPart(next, readPayloadRecord<SessionMessagePartRecord>(event, \"part\"));\n break;\n case \"session.message.part.delta\":\n next = appendPartDelta(next, event);\n break;\n case \"session.run.created\":\n case \"session.run.updated\":\n next = upsertRun(next, readPayloadRecord<SessionRunRecord>(event, \"run\"));\n break;\n case \"session.run_attempt.created\":\n case \"session.run_attempt.updated\":\n next = upsertRunAttempt(next, readPayloadRecord<SessionRunAttemptRecord>(event, \"attempt\"));\n break;\n case \"session.task.created\":\n case \"session.task.updated\":\n next = upsertTask(next, readPayloadRecord<SessionExecutionRecord>(event, \"task\"));\n break;\n case \"permission.asked\":\n case \"permission.replied\":\n next = upsertPermission(next, readPayloadRecord<PermissionRequestRecord>(event, \"request\"));\n break;\n }\n\n return next;\n}\n\nfunction readPayloadRecord<T>(event: SessionEventRecord, key: string): T | undefined {\n const value = event.payload[key];\n return value && typeof value === \"object\" && !Array.isArray(value) ? value as T : undefined;\n}\n\nfunction upsertSession(state: OpenHarnessClientState, session: SessionRecord | undefined): OpenHarnessClientState {\n if (!session) return state;\n const bucket = cloneBucket(state.buckets[session.id]);\n bucket.session = session;\n const sessions = { ...state.sessions, [session.id]: session };\n return {\n ...state,\n sessions,\n sessionOrder: sortSessionOrder(sessions),\n buckets: { ...state.buckets, [session.id]: bucket },\n };\n}\n\nfunction archiveSession(state: OpenHarnessClientState, event: SessionEventRecord): OpenHarnessClientState {\n const sessionId = typeof event.payload.sessionId === \"string\" ? event.payload.sessionId : event.sessionId;\n if (!sessionId) return state;\n const current = state.sessions[sessionId];\n if (!current) return state;\n const archived: SessionRecord = {\n ...current,\n status: \"archived\",\n archivedAt: current.archivedAt ?? event.createdAt,\n updatedAt: Math.max(current.updatedAt, event.createdAt),\n };\n return upsertSession(state, archived);\n}\n\nfunction upsertInput(state: OpenHarnessClientState, input: SessionInputRecord | undefined): OpenHarnessClientState {\n if (!input) return state;\n const bucket = cloneBucket(state.buckets[input.sessionId]);\n bucket.inputs = upsertSorted(bucket.inputs, input, (row) => row.seq);\n return { ...state, buckets: { ...state.buckets, [input.sessionId]: bucket } };\n}\n\nfunction upsertMessage(state: OpenHarnessClientState, message: SessionMessageRecord | undefined): OpenHarnessClientState {\n if (!message) return state;\n const bucket = cloneBucket(state.buckets[message.sessionId]);\n bucket.messages = upsertSorted(bucket.messages, message, (row) => row.seq);\n return { ...state, buckets: { ...state.buckets, [message.sessionId]: bucket } };\n}\n\nfunction replaceTranscript(state: OpenHarnessClientState, event: SessionEventRecord): OpenHarnessClientState {\n const sessionId = event.sessionId;\n if (!sessionId) return state;\n const messages = Array.isArray(event.payload.messages)\n ? event.payload.messages.filter((row): row is SessionMessageRecord =>\n !!row && typeof row === \"object\" && !Array.isArray(row) && typeof (row as SessionMessageRecord).id === \"string\")\n : [];\n const parts = Array.isArray(event.payload.parts)\n ? event.payload.parts.filter((row): row is SessionMessagePartRecord =>\n !!row && typeof row === \"object\" && !Array.isArray(row) && typeof (row as SessionMessagePartRecord).id === \"string\")\n : [];\n const bucket = cloneBucket(state.buckets[sessionId]);\n const partsByMessageId: SessionBucket[\"partsByMessageId\"] = {};\n for (const part of parts) {\n const rows = partsByMessageId[part.messageId] ?? [];\n rows.push(part);\n partsByMessageId[part.messageId] = rows;\n }\n for (const rows of Object.values(partsByMessageId)) rows.sort((a, b) => a.seq - b.seq);\n bucket.messages = [...messages].sort((a, b) => a.seq - b.seq);\n bucket.partsByMessageId = partsByMessageId;\n if (bucket.session) {\n bucket.session = {\n ...bucket.session,\n updatedAt: Math.max(bucket.session.updatedAt, event.createdAt),\n };\n }\n const sessions = bucket.session\n ? { ...state.sessions, [sessionId]: bucket.session }\n : state.sessions;\n return {\n ...state,\n sessions,\n sessionOrder: sortSessionOrder(sessions),\n buckets: { ...state.buckets, [sessionId]: bucket },\n };\n}\n\nfunction upsertPart(state: OpenHarnessClientState, part: SessionMessagePartRecord | undefined): OpenHarnessClientState {\n if (!part) return state;\n const bucket = cloneBucketForPartWrite(state.buckets[part.sessionId]);\n const existing = bucket.partsByMessageId[part.messageId] ?? [];\n bucket.partsByMessageId = {\n ...bucket.partsByMessageId,\n [part.messageId]: upsertSorted(existing, part, (row) => row.seq),\n };\n return { ...state, buckets: { ...state.buckets, [part.sessionId]: bucket } };\n}\n\nfunction appendPartDelta(state: OpenHarnessClientState, event: SessionEventRecord): OpenHarnessClientState {\n const sessionId = typeof event.payload.sessionId === \"string\" ? event.payload.sessionId : event.sessionId;\n const messageId = typeof event.payload.messageId === \"string\" ? event.payload.messageId : undefined;\n const partId = typeof event.payload.partId === \"string\" ? event.payload.partId : undefined;\n const field = event.payload.field;\n const delta = typeof event.payload.delta === \"string\" ? event.payload.delta : undefined;\n if (!sessionId || !messageId || !partId || field !== \"text\" || delta === undefined) return state;\n\n const bucket = cloneBucketForPartWrite(state.buckets[sessionId]);\n const currentParts = bucket.partsByMessageId[messageId] ?? [];\n const index = currentParts.findIndex((part) => part.id === partId);\n const nextParts = [...currentParts];\n if (index >= 0) {\n const current = nextParts[index]!;\n nextParts[index] = {\n ...current,\n text: `${current.text ?? \"\"}${delta}`,\n updatedAt: Math.max(current.updatedAt, event.createdAt),\n };\n } else {\n const seq = currentParts.reduce((max, part) => Math.max(max, part.seq), 0) + 1;\n nextParts.push({\n id: partId,\n sessionId,\n messageId,\n seq,\n type: \"text\",\n status: \"running\",\n text: delta,\n metadata: {},\n createdAt: event.createdAt,\n updatedAt: event.createdAt,\n });\n }\n const sortedParts = index >= 0\n ? nextParts\n : nextParts.sort((a, b) => a.seq - b.seq);\n bucket.partsByMessageId = {\n ...bucket.partsByMessageId,\n [messageId]: sortedParts,\n };\n return { ...state, buckets: { ...state.buckets, [sessionId]: bucket } };\n}\n\nfunction upsertRun(state: OpenHarnessClientState, run: SessionRunRecord | undefined): OpenHarnessClientState {\n if (!run) return state;\n const bucket = cloneBucket(state.buckets[run.sessionId]);\n bucket.runs = { ...bucket.runs, [run.id]: run };\n const session = refreshSessionStatusFromRuns(bucket.session, bucket.runs, run.updatedAt);\n bucket.session = session;\n const sessions = session ? { ...state.sessions, [run.sessionId]: session } : state.sessions;\n return {\n ...state,\n sessions,\n sessionOrder: session ? sortSessionOrder(sessions) : state.sessionOrder,\n buckets: { ...state.buckets, [run.sessionId]: bucket },\n };\n}\n\nfunction upsertRunAttempt(\n state: OpenHarnessClientState,\n attempt: SessionRunAttemptRecord | undefined,\n): OpenHarnessClientState {\n if (!attempt) return state;\n const run = Object.values(state.buckets)\n .flatMap((bucket) => Object.values(bucket.runs))\n .find((candidate) => candidate.id === attempt.runId);\n if (!run) return state;\n const bucket = cloneBucket(state.buckets[run.sessionId]);\n bucket.attempts = { ...bucket.attempts, [attempt.id]: attempt };\n return { ...state, buckets: { ...state.buckets, [run.sessionId]: bucket } };\n}\n\nfunction refreshSessionStatusFromRuns(\n session: SessionRecord | undefined,\n runs: SessionBucket[\"runs\"],\n updatedAt: number,\n): SessionRecord | undefined {\n if (!session || session.status === \"archived\" || session.status === \"closing\") return session;\n const running = Object.values(runs).some(\n (candidate) => candidate.status === \"pending\" || candidate.status === \"running\",\n );\n return {\n ...session,\n status: running ? \"running\" : \"idle\",\n updatedAt: Math.max(session.updatedAt, updatedAt),\n };\n}\n\nfunction upsertPermission(\n state: OpenHarnessClientState,\n request: PermissionRequestRecord | undefined,\n): OpenHarnessClientState {\n if (!request) return state;\n const bucket = cloneBucket(state.buckets[request.sessionId]);\n bucket.permissions = { ...bucket.permissions, [request.id]: request };\n return { ...state, buckets: { ...state.buckets, [request.sessionId]: bucket } };\n}\n\nfunction upsertTask(state: OpenHarnessClientState, task: SessionExecutionRecord | undefined): OpenHarnessClientState {\n if (!task) return state;\n const bucket = cloneBucket(state.buckets[task.sessionId]);\n bucket.tasks = { ...bucket.tasks, [task.id]: task };\n return { ...state, buckets: { ...state.buckets, [task.sessionId]: bucket } };\n}\n\nfunction cloneBucket(bucket: SessionBucket | undefined): SessionBucket {\n return {\n session: bucket?.session,\n inputs: bucket?.inputs ? [...bucket.inputs] : [],\n messages: bucket?.messages ? [...bucket.messages] : [],\n partsByMessageId: bucket?.partsByMessageId\n ? Object.fromEntries(Object.entries(bucket.partsByMessageId).map(([id, parts]) => [id, [...parts]]))\n : {},\n runs: bucket?.runs ? { ...bucket.runs } : {},\n attempts: bucket?.attempts ? { ...bucket.attempts } : {},\n tasks: bucket?.tasks ? { ...bucket.tasks } : {},\n permissions: bucket?.permissions ? { ...bucket.permissions } : {},\n };\n}\n\nfunction cloneBucketForPartWrite(bucket: SessionBucket | undefined): SessionBucket {\n return {\n session: bucket?.session,\n inputs: bucket?.inputs ?? [],\n messages: bucket?.messages ?? [],\n partsByMessageId: bucket?.partsByMessageId ?? {},\n runs: bucket?.runs ?? {},\n attempts: bucket?.attempts ?? {},\n tasks: bucket?.tasks ?? {},\n permissions: bucket?.permissions ?? {},\n };\n}\n\n/** 按 id 覆盖后按 sortKey 升序排列。 */\nfunction upsertSorted<T extends { id: string }>(rows: T[], row: T, sortKey: (row: T) => number): T[] {\n const without = rows.filter((existing) => existing.id !== row.id);\n without.push(row);\n return without.sort((a, b) => sortKey(a) - sortKey(b));\n}\n\n/** session 列表排序:最近更新优先。 */\nfunction sortSessionOrder(sessions: Record<string, SessionRecord>): string[] {\n return Object.values(sessions)\n .sort((a, b) => b.updatedAt - a.updatedAt || a.id.localeCompare(b.id))\n .map((session) => session.id);\n}\n",
15
15
  "/**\n * Read-only selectors over the reducer state.\n *\n * These stay UI-agnostic so TUI/Web/Desktop can share the canonical\n * message/part view and map it to their own presentation models.\n */\n\nimport type { SessionBucket, SessionMessagePartRecord, SessionMessageRecord } from \"../types/index.js\";\n\nexport interface SessionMessageWithParts {\n message: SessionMessageRecord;\n parts: SessionMessagePartRecord[];\n}\n\nexport function selectSessionMessagesWithParts(\n bucket: SessionBucket | undefined,\n): SessionMessageWithParts[] {\n if (!bucket) return [];\n return [...bucket.messages]\n .sort((a, b) => a.seq - b.seq)\n .map((message) => ({\n message,\n parts: [...(bucket.partsByMessageId[message.id] ?? [])].sort((a, b) => a.seq - b.seq),\n }));\n}\n",
16
- "/**\r\n * 客户端事件同步:session 使用原子 HTTP snapshot + SSE live;\r\n * 无 sessionId 的全局视图使用 HTTP replay + SSE live。\r\n *\r\n * UI(如 `useServerSync`)通常消费 `syncEvents`,而不是分别调 listEvents / streamEvents。\r\n * live SSE 非 abort 断流后按 `state.lastSeq` 指数退避重连;session 路径遇 seq 空洞会 re-snapshot。\r\n */\r\n\r\nimport {\n applyEvent,\n applyEvents,\n applySessionSnapshot,\n createInitialClientState,\n UnsupportedSessionEventSchemaVersionError,\n} from \"./reducer.js\";\nimport type {\r\n EventSyncOptions,\r\n OpenHarnessClientState,\r\n SessionEventRecord,\r\n SyncEventUpdate,\r\n} from \"../types/index.js\";\r\nimport type { OpenHarnessClient } from \"../transport/http-client.js\";\r\n\r\nconst DEFAULT_RECONNECT_DELAY_MS = (attempt: number): number =>\r\n Math.min(30_000, 250 * 2 ** Math.max(0, attempt));\r\n\r\n/** 用已有事件列表一次性 hydrate 出客户端状态(离线/测试常用)。 */\r\nexport function hydrateState(events: Iterable<SessionEventRecord>): OpenHarnessClientState {\r\n return applyEvents(createInitialClientState(), events);\r\n}\r\n\r\n/**\r\n * session attach 主路径:`getSessionState` snapshot → `streamEvents` live。\r\n * 每应用一条(或 live 下状态确有变化的)事件就 yield `{ event, state, source }`。\r\n * live 阶段若 `applyEvent` 因重复 seq 返回同一引用,则跳过 yield。\r\n */\r\nexport async function* syncEvents(\r\n client: OpenHarnessClient,\r\n options: EventSyncOptions = {},\r\n): AsyncIterable<SyncEventUpdate> {\r\n let state = createInitialClientState();\r\n if (options.sessionId) {\r\n const snapshot = await client.getSessionState(options.sessionId, { signal: options.signal });\r\n state = applySessionSnapshot(state, snapshot);\r\n yield { state, source: \"snapshot\" };\r\n\r\n yield* liveWithReconnect(client, state, options, snapshot.cursor);\r\n return;\r\n }\r\n const replay = await client.listEvents({\r\n cursor: options.cursor,\r\n sessionId: options.sessionId,\r\n signal: options.signal,\r\n });\r\n\r\n for (const event of replay) {\r\n state = applyEvent(state, event);\r\n yield { event, state, source: \"replay\" };\r\n }\r\n\r\n yield* liveWithReconnect(client, state, options, state.lastSeq);\r\n}\r\n\r\nasync function* liveWithReconnect(\r\n client: OpenHarnessClient,\r\n initialState: OpenHarnessClientState,\r\n options: EventSyncOptions,\r\n initialCursor: number,\r\n): AsyncIterable<SyncEventUpdate> {\r\n let state = initialState;\r\n let cursor = initialCursor;\r\n let attempt = 0;\r\n const delayMs = options.reconnectDelayMs ?? DEFAULT_RECONNECT_DELAY_MS;\r\n\r\n while (!options.signal?.aborted) {\r\n try {\r\n for await (const event of client.streamEvents({\r\n cursor,\r\n sessionId: options.sessionId,\r\n signal: options.signal,\r\n })) {\r\n attempt = 0;\r\n if (event.seq > state.lastSeq + 1 && !options.sessionId) {\r\n const gap = await client.listEvents({\r\n cursor: state.lastSeq,\r\n signal: options.signal,\r\n });\r\n for (const missed of gap) {\r\n const beforeGap = state;\r\n state = applyEvent(state, missed);\r\n if (state !== beforeGap) yield { event: missed, state, source: \"replay\" };\r\n }\r\n cursor = state.lastSeq;\r\n }\r\n\r\n const before = state;\r\n state = applyEvent(state, event);\r\n cursor = state.lastSeq;\r\n if (state !== before) yield { event, state, source: \"live\" };\r\n }\r\n\r\n // Clean stream end is treated as a disconnect that should resume.\r\n if (options.signal?.aborted) return;\r\n yield { state, source: \"reconnecting\" };\r\n if (!(await waitForReconnect(delayMs(attempt), options.signal))) return;\r\n attempt += 1;\r\n cursor = state.lastSeq;\r\n } catch (error) {\n if (error instanceof UnsupportedSessionEventSchemaVersionError) throw error;\n if (isAbortError(error) || options.signal?.aborted) return;\n yield { state, source: \"reconnecting\" };\r\n if (!(await waitForReconnect(delayMs(attempt), options.signal))) return;\r\n attempt += 1;\r\n cursor = state.lastSeq;\r\n }\r\n }\r\n}\r\n\r\nasync function waitForReconnect(ms: number, signal?: AbortSignal): Promise<boolean> {\r\n try {\r\n await sleep(ms, signal);\r\n return !signal?.aborted;\r\n } catch (error) {\r\n if (isAbortError(error) || signal?.aborted) return false;\r\n throw error;\r\n }\r\n}\r\n\r\nfunction isAbortError(error: unknown): boolean {\r\n if (!error || typeof error !== \"object\") return false;\r\n if (\"name\" in error && (error as { name?: string }).name === \"AbortError\") return true;\r\n return false;\r\n}\r\n\r\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\r\n if (ms <= 0) {\r\n if (signal?.aborted) return Promise.reject(abortError(signal));\r\n return Promise.resolve();\r\n }\r\n return new Promise<void>((resolve, reject) => {\r\n if (signal?.aborted) {\r\n reject(abortError(signal));\r\n return;\r\n }\r\n const timer = setTimeout(() => {\r\n signal?.removeEventListener(\"abort\", onAbort);\r\n resolve();\r\n }, ms);\r\n const onAbort = () => {\r\n clearTimeout(timer);\r\n reject(abortError(signal!));\r\n };\r\n signal?.addEventListener(\"abort\", onAbort, { once: true });\r\n });\r\n}\r\n\r\nfunction abortError(signal: AbortSignal): Error {\r\n if (signal.reason instanceof Error) return signal.reason;\r\n return new DOMException(\"Aborted\", \"AbortError\");\r\n}\r\n",
16
+ "/**\n * 客户端事件同步:session 使用原子 HTTP snapshot + SSE live;\n * 无 sessionId 的全局视图使用 HTTP replay + SSE live。\n *\n * UI(如 `useServerSync`)通常消费 `syncEvents`,而不是分别调 listEvents / streamEvents。\n * live SSE 非 abort 断流后按 `state.lastSeq` 指数退避重连;session 路径遇 seq 空洞会 re-snapshot。\n */\n\nimport {\n applyEvent,\n applyEvents,\n applySessionSnapshot,\n createInitialClientState,\n UnsupportedSessionEventSchemaVersionError,\n} from \"./reducer.js\";\nimport type {\n EventSyncOptions,\n OpenHarnessClientState,\n SessionEventRecord,\n SyncEventUpdate,\n} from \"../types/index.js\";\nimport type { OpenHarnessClient } from \"../transport/http-client.js\";\n\nconst DEFAULT_RECONNECT_DELAY_MS = (attempt: number): number =>\n Math.min(30_000, 250 * 2 ** Math.max(0, attempt));\n\n/** 用已有事件列表一次性 hydrate 出客户端状态(离线/测试常用)。 */\nexport function hydrateState(events: Iterable<SessionEventRecord>): OpenHarnessClientState {\n return applyEvents(createInitialClientState(), events);\n}\n\n/**\n * session attach 主路径:`getSessionState` snapshot → `streamEvents` live。\n * 每应用一条(或 live 下状态确有变化的)事件就 yield `{ event, state, source }`。\n * live 阶段若 `applyEvent` 因重复 seq 返回同一引用,则跳过 yield。\n */\nexport async function* syncEvents(\n client: OpenHarnessClient,\n options: EventSyncOptions = {},\n): AsyncIterable<SyncEventUpdate> {\n let state = createInitialClientState();\n if (options.sessionId) {\n const snapshot = await client.getSessionState(options.sessionId, { signal: options.signal });\n state = applySessionSnapshot(state, snapshot);\n yield { state, source: \"snapshot\" };\n\n yield* liveWithReconnect(client, state, options, snapshot.cursor);\n return;\n }\n const replay = await client.listEvents({\n cursor: options.cursor,\n sessionId: options.sessionId,\n signal: options.signal,\n });\n\n for (const event of replay) {\n state = applyEvent(state, event);\n yield { event, state, source: \"replay\" };\n }\n\n yield* liveWithReconnect(client, state, options, state.lastSeq);\n}\n\nasync function* liveWithReconnect(\n client: OpenHarnessClient,\n initialState: OpenHarnessClientState,\n options: EventSyncOptions,\n initialCursor: number,\n): AsyncIterable<SyncEventUpdate> {\n let state = initialState;\n let cursor = initialCursor;\n let attempt = 0;\n const delayMs = options.reconnectDelayMs ?? DEFAULT_RECONNECT_DELAY_MS;\n\n while (!options.signal?.aborted) {\n try {\n for await (const event of client.streamEvents({\n cursor,\n sessionId: options.sessionId,\n signal: options.signal,\n })) {\n attempt = 0;\n if (event.seq > state.lastSeq + 1 && !options.sessionId) {\n const gap = await client.listEvents({\n cursor: state.lastSeq,\n signal: options.signal,\n });\n for (const missed of gap) {\n const beforeGap = state;\n state = applyEvent(state, missed);\n if (state !== beforeGap) yield { event: missed, state, source: \"replay\" };\n }\n cursor = state.lastSeq;\n }\n\n const before = state;\n state = applyEvent(state, event);\n cursor = state.lastSeq;\n if (state !== before) yield { event, state, source: \"live\" };\n }\n\n // Clean stream end is treated as a disconnect that should resume.\n if (options.signal?.aborted) return;\n yield { state, source: \"reconnecting\" };\n if (!(await waitForReconnect(delayMs(attempt), options.signal))) return;\n attempt += 1;\n cursor = state.lastSeq;\n } catch (error) {\n if (error instanceof UnsupportedSessionEventSchemaVersionError) throw error;\n if (isAbortError(error) || options.signal?.aborted) return;\n yield { state, source: \"reconnecting\" };\n if (!(await waitForReconnect(delayMs(attempt), options.signal))) return;\n attempt += 1;\n cursor = state.lastSeq;\n }\n }\n}\n\nasync function waitForReconnect(ms: number, signal?: AbortSignal): Promise<boolean> {\n try {\n await sleep(ms, signal);\n return !signal?.aborted;\n } catch (error) {\n if (isAbortError(error) || signal?.aborted) return false;\n throw error;\n }\n}\n\nfunction isAbortError(error: unknown): boolean {\n if (!error || typeof error !== \"object\") return false;\n if (\"name\" in error && (error as { name?: string }).name === \"AbortError\") return true;\n return false;\n}\n\nfunction sleep(ms: number, signal?: AbortSignal): Promise<void> {\n if (ms <= 0) {\n if (signal?.aborted) return Promise.reject(abortError(signal));\n return Promise.resolve();\n }\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortError(signal));\n return;\n }\n const timer = setTimeout(() => {\n signal?.removeEventListener(\"abort\", onAbort);\n resolve();\n }, ms);\n const onAbort = () => {\n clearTimeout(timer);\n reject(abortError(signal!));\n };\n signal?.addEventListener(\"abort\", onAbort, { once: true });\n });\n}\n\nfunction abortError(signal: AbortSignal): Error {\n if (signal.reason instanceof Error) return signal.reason;\n return new DOMException(\"Aborted\", \"AbortError\");\n}\n",
17
17
  "export * from \"./reducer.js\";\nexport * from \"./selectors.js\";\nexport * from \"./sync.js\";\n",
18
- "import type { OpenHarnessClient } from \"../transport/http-client.js\";\r\nimport type { CommandCatalogEntry, OpenHarnessClientState } from \"../types/index.js\";\r\nimport type { JobReadResult, JobSnapshot } from \"@openharness/protocol\";\r\nimport { patchSessionRuntimeMetadata } from \"@openharness/protocol\";\r\n\r\nexport type SlashLine = { name: string; args: string };\r\n\r\nexport type PresentationReadRequest = {\r\n key: string;\r\n title: string;\r\n load: () => Promise<string>;\r\n};\r\n\r\nexport type RuntimeDiagnostics = {\r\n runtime?: string;\r\n platform?: string;\r\n architecture?: string;\r\n};\r\n\r\nexport type SessionCommandHost = {\r\n client: OpenHarnessClient;\r\n sessionId?: string;\r\n /** Project cwd for memory/git/plugins/etc. */\r\n cwd: string;\r\n /** Values used by /status */\r\n model?: string;\r\n permissionMode?: string;\r\n statusSessionId?: string;\r\n commandCatalog: CommandCatalogEntry[];\r\n clientState: OpenHarnessClientState;\r\n busy: boolean;\r\n /** Present a system/notice message to the user */\r\n emit(text: string): void;\r\n /** Present read-only output in a transient UI surface when available. */\r\n present?(title: string, content: string): void;\r\n /** Present cached read-only output immediately and refresh it asynchronously. */\r\n cacheFirstRead?(request: PresentationReadRequest): void;\r\n /** Optional status patch for /plan /provider */\r\n patchStatus?(patch: Record<string, unknown>): void;\r\n /** Host-specific runtime information used by /doctor. Browsers may omit it. */\r\n getRuntimeDiagnostics?(): RuntimeDiagnostics | Promise<RuntimeDiagnostics>;\r\n};\r\n\r\nexport type SessionCommandOutcome =\r\n | \"handled\"\r\n | \"unhandled\"\r\n | \"local_ui\";\r\n\r\n/** Client-local UI commands; never forwarded as model prompts. */\r\nexport const LOCAL_COMMAND_DETAILS: Array<{ name: string; description?: string }> = [\r\n { name: \"/new\", description: \"Start a new session\" },\r\n { name: \"/sessions\", description: \"List and switch sessions\" },\r\n { name: \"/resume\", description: \"Replay an interrupted prompt run\" },\r\n { name: \"/permissions\", description: \"Change permission mode\" },\r\n { name: \"/plan\", description: \"Toggle plan mode\" },\r\n { name: \"/theme\", description: \"Change TUI theme\" },\r\n { name: \"/models\", description: \"Select model\" },\r\n { name: \"/workflow\", description: \"Open Jobs panel with Workflow details\" },\r\n { name: \"/workflows\", description: \"Open Jobs panel with Workflow details\" },\r\n];\r\n\r\nexport const LOCAL_COMMAND_NAMES = new Set(LOCAL_COMMAND_DETAILS.map((entry) => entry.name));\r\n\r\nexport function parseSlashLine(line: string): SlashLine | null {\r\n const trimmed = line.trim();\r\n if (!trimmed.startsWith(\"/\")) return null;\r\n const spaceIdx = trimmed.search(/\\s/);\r\n if (spaceIdx === -1) return { name: trimmed, args: \"\" };\r\n return { name: trimmed.slice(0, spaceIdx), args: trimmed.slice(spaceIdx + 1).trim() };\r\n}\r\n\r\nexport function mergeCommandDetails(\r\n catalog: CommandCatalogEntry[],\r\n): Array<{ name: string; description?: string }> {\r\n const byName = new Map<string, { name: string; description?: string }>();\r\n for (const entry of LOCAL_COMMAND_DETAILS) byName.set(entry.name, entry);\r\n for (const entry of catalog) {\r\n if (byName.has(entry.name)) continue;\r\n byName.set(entry.name, {\r\n name: entry.name,\r\n ...(entry.description ? { description: entry.description } : {}),\r\n });\r\n }\r\n return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));\r\n}\r\n\r\nexport function hasActiveRun(state: OpenHarnessClientState, sessionId?: string): boolean {\r\n if (!sessionId) return false;\r\n const bucket = state.buckets[sessionId];\r\n if (!bucket) return false;\r\n return Object.values(bucket.runs).some((run) => run.status === \"pending\" || run.status === \"running\");\r\n}\r\n\r\nexport function resolveSessionCwd(input: {\r\n statusCwd?: unknown;\r\n daemonCwd?: string;\r\n fallback?: string;\r\n}): string {\r\n if (typeof input.statusCwd === \"string\" && input.statusCwd) return input.statusCwd;\r\n if (input.daemonCwd) return input.daemonCwd;\r\n return input.fallback ?? \".\";\r\n}\r\n\r\nfunction firstArg(args: string): string | undefined {\r\n return args.trim().split(/\\s+/).filter(Boolean)[0];\r\n}\r\n\r\nfunction shouldPresentSlashOutput(slash: SlashLine): boolean {\r\n switch (slash.name) {\r\n case \"/help\":\r\n case \"/version\":\r\n case \"/status\":\r\n case \"/mcp\":\r\n case \"/context\":\r\n case \"/stats\":\r\n case \"/agents\":\r\n case \"/doctor\":\r\n case \"/usage\":\r\n case \"/cost\":\r\n case \"/hooks\":\r\n case \"/subagents\":\r\n case \"/diff\":\r\n case \"/skills\":\r\n return true;\r\n case \"/config\": {\r\n const args = slash.args.trim();\r\n return !args || args === \"show\";\r\n }\r\n case \"/provider\":\r\n return !slash.args.trim();\r\n case \"/jobs\": {\r\n const sub = firstArg(slash.args);\r\n return !sub || sub === \"list\" || sub === \"show\";\r\n }\r\n case \"/memory\": {\r\n const sub = firstArg(slash.args);\r\n return !sub || sub === \"list\" || sub === \"show\";\r\n }\r\n case \"/auth\": {\r\n const sub = firstArg(slash.args);\r\n return !sub || sub === \"status\";\r\n }\r\n case \"/profile\": {\r\n const action = firstArg(slash.args) ?? \"status\";\r\n return action === \"status\" || action === \"show\";\r\n }\r\n case \"/effort\":\r\n case \"/turns\":\r\n return !slash.args.trim();\r\n case \"/output-style\": {\r\n const sub = firstArg(slash.args);\r\n return !sub || sub === \"show\" || sub === \"list\";\r\n }\r\n case \"/plugin\": {\r\n const sub = firstArg(slash.args);\r\n return !sub || sub === \"list\";\r\n }\r\n case \"/branch\":\r\n return !slash.args.trim() || slash.args.trim().split(/\\s+/).includes(\"list\");\r\n case \"/commit\":\r\n return !slash.args.trim();\r\n default:\r\n return false;\r\n }\r\n}\r\n\r\nfunction formatJobReadResult(result: JobReadResult): string {\r\n const snapshot: JobSnapshot = result.snapshot;\r\n const capabilities = [\r\n `read=${snapshot.capabilities.read}`,\r\n `wait=${snapshot.capabilities.wait}`,\r\n `send=${snapshot.capabilities.send}`,\r\n `cancel=${snapshot.capabilities.cancel}`,\r\n ].join(\", \");\r\n return [\r\n `Job: ${snapshot.id}`,\r\n ` Kind: ${snapshot.kind}`,\r\n ` Status: ${snapshot.status}`,\r\n ` Label: ${snapshot.label}`,\r\n ` Owner session: ${snapshot.ownerSession}`,\r\n ` CWD: ${snapshot.cwd}`,\r\n ` Started at: ${snapshot.startedAt}`,\r\n ` Updated at: ${snapshot.updatedAt}`,\r\n ` Finished at: ${snapshot.finishedAt ?? \"(n/a)\"}`,\r\n ` Detail: ${snapshot.detail ?? \"(none)\"}`,\r\n ` Capabilities: ${capabilities}`,\r\n ` Metadata: ${snapshot.metadata ? JSON.stringify(snapshot.metadata) : \"(none)\"}`,\r\n ` Cursor: ${result.cursor}`,\r\n ` Truncated: ${result.truncated}`,\r\n \"\",\r\n \"Output:\",\r\n result.text || \"(no output)\",\r\n ].join(\"\\n\");\r\n}\r\n\r\nfunction slashOutputTitle(slash: SlashLine): string {\r\n const name = slash.name.startsWith(\"/\") ? slash.name.slice(1) : slash.name;\r\n return name ? name[0]!.toUpperCase() + name.slice(1) : \"Output\";\r\n}\r\n\r\nexport async function dispatchSessionCommand(\r\n slash: SlashLine | null,\r\n host: SessionCommandHost,\r\n): Promise<SessionCommandOutcome> {\r\n const {\r\n client,\r\n sessionId,\r\n cwd,\r\n model,\r\n permissionMode,\r\n statusSessionId,\r\n commandCatalog,\r\n clientState,\r\n busy,\r\n } = host;\r\n const emit = (text: string) => {\r\n if (slash && host.present && shouldPresentSlashOutput(slash)) {\r\n host.present(slashOutputTitle(slash), text);\r\n return;\r\n }\r\n host.emit(text);\r\n };\r\n const readPresentation = async (\r\n key: string,\r\n title: string,\r\n load: () => Promise<string>,\r\n ): Promise<void> => {\r\n if (slash && host.cacheFirstRead && shouldPresentSlashOutput(slash)) {\r\n host.cacheFirstRead({ key, title, load });\r\n return;\r\n }\r\n emit(await load());\r\n };\r\n const patchStatus = (patch: Record<string, unknown>) => host.patchStatus?.(patch);\r\n\r\n if (slash?.name === \"/plan\") {\r\n const next =\r\n slash.args === \"on\" ? \"plan\"\r\n : slash.args === \"off\" ? \"default\"\r\n : undefined;\r\n if (!next) {\r\n emit(\"Usage: /plan [on|off]\");\r\n return \"handled\";\r\n }\r\n patchStatus({ permission_mode: next });\r\n if (sessionId) {\r\n await client.updateSession(sessionId, {\r\n metadata: patchSessionRuntimeMetadata({}, { permissionMode: next }),\r\n });\r\n }\r\n emit(`Permission mode: ${next}`);\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/skills\") {\r\n const templates = commandCatalog.filter((entry) => entry.kind === \"template\");\r\n if (slash.args) {\r\n const name = slash.args.startsWith(\"/\") ? slash.args : `/${slash.args}`;\r\n const match = templates.find((entry) => entry.name === name || entry.name === `/${slash.args}`);\r\n if (!match) {\r\n emit(`Unknown skill: ${slash.args}`);\r\n return \"handled\";\r\n }\r\n emit(`${match.name}${match.description ? ` — ${match.description}` : \"\"}`);\r\n return \"handled\";\r\n }\r\n if (templates.length === 0) {\r\n emit(\"No user-invocable skills available.\");\r\n return \"handled\";\r\n }\r\n emit(\r\n [\"Skills:\", ...templates.map((entry) =>\r\n `- ${entry.name}${entry.description ? ` — ${entry.description}` : \"\"}`)].join(\"\\n\"),\r\n );\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/help\") {\r\n const details = mergeCommandDetails(commandCatalog);\r\n emit(\r\n [\"Available commands:\", ...details.map((entry) =>\r\n `${entry.name}${entry.description ? ` — ${entry.description}` : \"\"}`)].join(\"\\n\"),\r\n );\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/version\") {\r\n await readPresentation(\"version\", \"Version\", async () => {\r\n const health = await client.health();\r\n return `OpenHarness${health.version ? ` v${health.version}` : \"\"}`;\r\n });\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/status\") {\r\n emit([\r\n \"Session status:\",\r\n ` session: ${statusSessionId ?? \"(none)\"}`,\r\n ` model: ${model ?? \"(unknown)\"}`,\r\n ` cwd: ${cwd || \"(unknown)\"}`,\r\n ` mode: ${permissionMode ?? \"default\"}`,\r\n ` busy: ${busy || hasActiveRun(clientState, sessionId) ? \"yes\" : \"no\"}`,\r\n ].join(\"\\n\"));\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/config\") {\r\n const args = slash.args.trim();\r\n if (!args || args === \"show\") {\r\n await readPresentation(`config:${cwd}`, \"Config\", async () => {\r\n const settings = await client.getSettings();\r\n return JSON.stringify(settings, null, 2);\r\n });\r\n return \"handled\";\r\n }\r\n const setMatch = args.match(/^set\\s+(\\S+)\\s+([\\s\\S]+)$/);\r\n if (!setMatch?.[1] || setMatch[2] === undefined) {\r\n emit(\"Usage: /config [show | set KEY VALUE]\");\r\n return \"handled\";\r\n }\r\n await client.patchSettings({ path: setMatch[1], value: setMatch[2].trim() });\r\n emit(`Set ${setMatch[1]} = ${setMatch[2].trim()}`);\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/provider\") {\r\n if (!slash.args) {\r\n await readPresentation(\"providers\", \"Provider\", async () => {\r\n const providers = await client.listProviders();\r\n const lines = [\"Available providers:\", \"\"];\r\n for (const provider of providers) {\r\n const marker = provider.active ? \" (active)\" : \"\";\r\n const keyStatus = provider.local ? \"[local]\" : provider.hasKey ? \"[key]\" : \"[no key]\";\r\n lines.push(` ${provider.name.padEnd(14)} ${provider.displayName.padEnd(14)} ${keyStatus}${marker}`);\r\n }\r\n return lines.join(\"\\n\");\r\n });\r\n return \"handled\";\r\n }\r\n const settings = await client.patchSettings(\r\n slash.args === \"auto\"\r\n ? { provider: \"auto\" }\r\n : { provider: slash.args },\r\n );\r\n if (typeof settings.model === \"string\") {\r\n patchStatus({ model: settings.model });\r\n }\r\n emit(`Provider switched to: ${slash.args}`);\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/mcp\") {\r\n if (!sessionId) return \"handled\";\r\n await readPresentation(`mcp:${sessionId}`, \"MCP\", async () => {\r\n const servers = await client.getSessionMcp(sessionId);\r\n if (servers.length === 0) return \"No MCP servers connected.\";\r\n return [\r\n `MCP Servers (${servers.length}):`,\r\n \"\",\r\n ...servers.flatMap((server) => [\r\n ` ${server.name}: ${server.status}`,\r\n ...(server.command ? [` Command: ${server.command}`] : []),\r\n ` Tools: ${server.toolCount} Resources: ${server.resourceCount}`,\r\n ...(server.error ? [` Error: ${server.error}`] : []),\r\n \"\",\r\n ]),\r\n ].join(\"\\n\");\r\n });\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/jobs\") {\r\n if (!sessionId) return \"handled\";\r\n const args = slash.args.trim();\r\n const [sub, id, ...extra] = args.split(/\\s+/).filter(Boolean);\r\n if ((!sub || sub === \"list\") && !id) {\r\n await readPresentation(`jobs:${sessionId}`, \"Jobs\", async () => {\r\n const jobs = await client.listJobs({\r\n sessionId,\r\n includeFinished: true,\r\n limit: 100,\r\n });\r\n if (jobs.length === 0) return \"No Jobs.\";\r\n return [\r\n `Jobs (${jobs.length}):`,\r\n \"\",\r\n ...jobs.map((job) => ` ${job.id} [${job.status}] ${job.kind}: ${job.label}`),\r\n ].join(\"\\n\");\r\n });\r\n return \"handled\";\r\n }\r\n if (sub === \"show\" && id && extra.length === 0) {\r\n await readPresentation(`job:${sessionId}:${id}`, \"Jobs\", async () => {\r\n const result = await client.readJob(id, { sessionId });\r\n return formatJobReadResult(result);\r\n });\r\n return \"handled\";\r\n }\r\n if (sub === \"cancel\" && id && extra.length === 0) {\r\n const snapshot = await client.cancelJob(id, {\r\n sessionId,\r\n reason: \"Cancelled from slash command\",\r\n });\r\n emit(`Job ${snapshot.id} status: ${snapshot.status}.`);\r\n return \"handled\";\r\n }\r\n emit(\"Usage: /jobs [list | show ID | cancel ID]\");\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/background\") {\r\n const command = slash.args.trim();\r\n if (!command) {\r\n emit(\"Usage: /background <command>\");\r\n return \"handled\";\r\n }\r\n if (!sessionId) return \"handled\";\r\n const result = await client.createBackgroundShell({ sessionId, command });\r\n emit(`Background shell started: ${result.jobId}. Use /jobs to inspect it.`);\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/memory\") {\r\n const args = slash.args.trim();\r\n const [sub, ...rest] = args.split(/\\s+/).filter(Boolean);\r\n if (!sub || sub === \"list\") {\r\n await readPresentation(`memory:${cwd}:list`, \"Memory\", async () => {\r\n const listed = await client.listMemory({ cwd });\r\n if (listed.entries.length === 0) return `Memory directory: ${listed.directory}\\nNo entries found.`;\r\n return [\r\n `Memory entries (${listed.entries.length}):`,\r\n \"\",\r\n ...listed.entries.map((entry) => {\r\n const tags = entry.tags?.length ? ` [${entry.tags.join(\", \")}]` : \"\";\r\n const preview = entry.content.length > 80\r\n ? `${entry.content.slice(0, 80)}...`\r\n : entry.content;\r\n return ` ${entry.id}${tags}: ${preview}`;\r\n }),\r\n ].join(\"\\n\");\r\n });\r\n return \"handled\";\r\n }\r\n if (sub === \"show\" && rest[0]) {\r\n const memoryId = rest[0];\r\n await readPresentation(`memory:${cwd}:show:${memoryId}`, \"Memory\", async () => {\r\n const entry = await client.getMemory(memoryId, { cwd });\r\n return [\r\n `ID: ${entry.id}`,\r\n `Created: ${new Date(entry.createdAt).toISOString()}`,\r\n `Updated: ${new Date(entry.updatedAt).toISOString()}`,\r\n `Tags: ${entry.tags?.join(\", \") ?? \"(none)\"}`,\r\n \"\",\r\n entry.content,\r\n ].join(\"\\n\");\r\n });\r\n return \"handled\";\r\n }\r\n if (sub === \"add\") {\r\n const content = rest.join(\" \").trim();\r\n if (!content) {\r\n emit(\"Usage: /memory add <content>\");\r\n return \"handled\";\r\n }\r\n const entry = await client.addMemory({ cwd, content });\r\n emit(`Memory added: ${entry.id}`);\r\n return \"handled\";\r\n }\r\n if (sub === \"remove\" && rest[0]) {\r\n await client.removeMemory(rest[0], { cwd });\r\n emit(`Memory removed: ${rest[0]}`);\r\n return \"handled\";\r\n }\r\n emit(\"Usage: /memory [list | show ID | add CONTENT | remove ID]\");\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/auth\") {\r\n const args = slash.args.trim();\r\n const [sub, provider, apiKey] = args.split(/\\s+/).filter(Boolean);\r\n if (!sub || sub === \"status\") {\r\n await readPresentation(\"auth:status\", \"Auth\", async () => {\r\n const auth = await client.getAuthStatus();\r\n const lines = [\"Credential status:\", \"\", \" Auth sources:\"];\r\n lines.push(\r\n ` codex_subscription: ${auth.codex.configured ? \"ready\" : auth.codex.state} (${auth.codex.source})`,\r\n );\r\n if (auth.storedProviders.length > 0) {\r\n lines.push(\"\", \" Stored credentials:\");\r\n for (const name of auth.storedProviders) lines.push(` ${name}: configured`);\r\n }\r\n if (auth.envProviders.length > 0) {\r\n lines.push(\" Environment variables:\");\r\n for (const env of auth.envProviders) lines.push(` ${env.name}: ${env.envKey}`);\r\n }\r\n if (auth.storedProviders.length === 0 && auth.envProviders.length === 0) {\r\n lines.push(\"\", \" No credentials configured.\");\r\n lines.push(\" Use /auth login <provider> <api-key> to store an API key.\");\r\n lines.push(\" Use /auth login codex to use a Codex subscription.\");\r\n }\r\n return lines.join(\"\\n\");\r\n });\r\n return \"handled\";\r\n }\r\n if (sub === \"login\") {\r\n if (!provider) {\r\n emit(\"Usage: /auth login <provider> <api-key> or /auth login codex\");\r\n return \"handled\";\r\n }\r\n const result = await client.authLogin({ provider, apiKey });\r\n emit(result.message);\r\n return \"handled\";\r\n }\r\n if (sub === \"logout\") {\r\n if (!provider) {\r\n emit(\"Usage: /auth logout <provider>\");\r\n return \"handled\";\r\n }\r\n const result = await client.authLogout({ provider });\r\n emit(result.message);\r\n return \"handled\";\r\n }\r\n emit(\"Unknown subcommand. Use login, logout, or status.\");\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/context\") {\r\n const action = slash.args.trim().split(/\\s+/).filter(Boolean)[0] ?? \"preview\";\r\n if (action === \"status\") {\r\n await readPresentation(`context:${cwd}:status`, \"Context\", async () => await client.getContextStatus({ cwd }));\r\n return \"handled\";\r\n }\r\n if (action !== \"preview\") {\r\n emit(\"Usage: /context [status]\");\r\n return \"handled\";\r\n }\r\n await readPresentation(`context:${cwd}`, \"Context\", async () => await client.getContextPreview({ cwd }));\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/stats\") {\r\n if (!sessionId) return \"handled\";\r\n const bucket = clientState.buckets[sessionId];\r\n const messageCount = bucket?.messages.length ?? 0;\r\n const text = (bucket?.messages ?? [])\r\n .flatMap((message) => bucket?.partsByMessageId[message.id] ?? [])\r\n .map((part) => part.text ?? \"\")\r\n .join(\" \");\r\n const estimatedTokens = Math.max(1, Math.ceil(text.length / 4));\r\n const [memory, jobsResult, settings] = await Promise.all([\r\n client.listMemory({ cwd }).catch(() => ({ entries: [] as Array<{ id: string }> })),\r\n client.listJobs({ sessionId, includeFinished: true, limit: 100 })\r\n .then((jobs) => ({ jobs }))\r\n .catch((error: unknown) => ({\r\n error: error instanceof Error ? error.message : String(error),\r\n })),\r\n client.getSettings().catch(() => ({} as Record<string, unknown>)),\r\n ]);\r\n const jobsSummary = \"jobs\" in jobsResult\r\n ? String(jobsResult.jobs.length)\r\n : `unavailable (${jobsResult.error})`;\r\n emit([\r\n \"Session stats:\",\r\n `- messages: ${messageCount}`,\r\n `- estimated_tokens: ${estimatedTokens}`,\r\n `- memory_entries: ${memory.entries.length}`,\r\n `- jobs: ${jobsSummary}`,\r\n `- output_style: ${typeof settings.outputStyle === \"string\" ? settings.outputStyle : \"default\"}`,\r\n ].join(\"\\n\"));\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/agents\") {\r\n if (!sessionId) return \"handled\";\r\n const agents = await client.listJobs({\r\n sessionId,\r\n kinds: [\"agent\"],\r\n includeFinished: true,\r\n limit: 100,\r\n });\r\n if (agents.length === 0) {\r\n emit(\"No Agent Jobs.\");\r\n return \"handled\";\r\n }\r\n emit(\r\n [\r\n `Agent Jobs (${agents.length}):`,\r\n \"\",\r\n ...agents.map((job) => ` ${job.id} [${job.status}] ${job.label}`),\r\n ].join(\"\\n\"),\r\n );\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/rewind\") {\r\n if (!sessionId) return \"handled\";\r\n const raw = slash.args.trim().split(/\\s+/).filter(Boolean)[0] ?? \"1\";\r\n const count = Number.parseInt(raw, 10);\r\n if (!Number.isInteger(count) || count < 1) {\r\n emit(\"Count must be a positive integer\");\r\n return \"handled\";\r\n }\r\n const result = await client.rewindSession(sessionId, { count });\r\n emit(`Rewound ${result.turns} turn(s), removed ${result.removed} message(s).`);\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/compact\") {\r\n if (!sessionId) return \"handled\";\r\n const result = await client.compactSession(sessionId);\r\n emit(`Conversation compacted (${result.messageCount} messages retained).`);\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/remember\") {\r\n if (!sessionId) return \"handled\";\r\n const result = await client.rememberSession(sessionId);\r\n if (result.skipped) {\r\n emit(`未写入记忆:${result.reason ?? \"skipped\"}`);\r\n return \"handled\";\r\n }\r\n emit(`已写入 ${result.writtenIds.length} 条记忆:${result.titles.join(\"、\")}`);\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/dream\") {\r\n const preview = slash.args.includes(\"--preview\");\r\n const result = await client.startDream({\r\n cwd,\r\n ...(sessionId ? { sessionId } : {}),\r\n preview,\r\n });\r\n emit(`Dream started as Job ${result.taskId}. Use /jobs to inspect it.`);\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/profile\") {\r\n const action = slash.args.trim().split(/\\s+/).filter(Boolean)[0] ?? \"status\";\r\n if (action === \"status\" || action === \"show\") {\r\n emit(await client.getProfileStatus());\r\n return \"handled\";\r\n }\r\n if (action === \"init\") {\r\n emit(await client.initProfile());\r\n return \"handled\";\r\n }\r\n emit(\"Usage: /profile [status|init]\");\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/doctor\") {\r\n const [settings, auth, memory, mcp, jobsResult] = await Promise.all([\r\n client.getSettings().catch(() => ({}) as Record<string, unknown>),\r\n client.getAuthStatus().catch(() => null),\r\n client.listMemory({ cwd }).catch(() => ({ directory: \"(unavailable)\", entries: [] as Array<{ id: string }> })),\r\n sessionId ? client.getSessionMcp(sessionId).catch(() => []) : Promise.resolve([]),\r\n sessionId\r\n ? client.listJobs({ sessionId, includeFinished: true, limit: 100 })\r\n .then((jobs) => ({ jobs }))\r\n .catch((error: unknown) => ({\r\n error: error instanceof Error ? error.message : String(error),\r\n }))\r\n : Promise.resolve({ jobs: [] as JobSnapshot[] }),\r\n ]);\r\n const jobsSummary = \"jobs\" in jobsResult\r\n ? String(jobsResult.jobs.length)\r\n : `unavailable (${jobsResult.error})`;\r\n const bucket = sessionId ? clientState.buckets[sessionId] : undefined;\r\n const diagnostics = await host.getRuntimeDiagnostics?.();\r\n const runtime = diagnostics?.runtime ?? \"(not provided by this host)\";\r\n const platform = [diagnostics?.platform, diagnostics?.architecture]\r\n .filter(Boolean)\r\n .join(\" \") || \"(not provided by this host)\";\r\n const lines = [\r\n \"OpenHarness Environment Diagnostic\",\r\n \"═\".repeat(40),\r\n \"\",\r\n `CWD: ${cwd}`,\r\n `Runtime: ${runtime}`,\r\n `Platform: ${platform}`,\r\n `Model: ${model ?? String(settings.model ?? \"(unknown)\")}`,\r\n `API Format: ${String(settings.apiFormat ?? \"(default)\")}`,\r\n `Base URL: ${String(settings.baseUrl ?? \"(default)\")}`,\r\n `Permission: ${typeof settings.permission === \"object\" && settings.permission && \"mode\" in settings.permission\r\n ? String((settings.permission as { mode?: string }).mode ?? \"default\")\r\n : \"default\"}`,\r\n `Max Turns: ${String(settings.maxTurns ?? \"(default)\")}`,\r\n `Effort: ${String(settings.effort ?? \"medium\")}`,\r\n `Passes: ${String(settings.passes ?? 1)}`,\r\n `Fast Mode: ${settings.fastMode ? \"on\" : \"off\"}`,\r\n `Theme: ${String(settings.theme ?? \"default\")}`,\r\n \"\",\r\n `Messages: ${bucket?.messages.length ?? 0}`,\r\n `Jobs: ${jobsSummary}`,\r\n \"\",\r\n `Memory dir: ${memory.directory}`,\r\n `Memory entries: ${memory.entries.length}`,\r\n ];\r\n if (auth) {\r\n lines.push(\r\n \"\",\r\n `Codex auth: ${auth.codex.configured ? \"ready\" : auth.codex.state} (${auth.codex.source})`,\r\n `Stored keys: ${auth.storedProviders.length ? auth.storedProviders.join(\", \") : \"(none)\"}`,\r\n );\r\n }\r\n lines.push(\"\", \"MCP Servers:\");\r\n if (mcp.length === 0) lines.push(\" (none)\");\r\n else {\r\n for (const server of mcp) {\r\n lines.push(` ${server.name}: ${server.status} (${server.toolCount} tools)`);\r\n }\r\n }\r\n emit(lines.join(\"\\n\"));\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/effort\") {\r\n const level = slash.args.trim().split(/\\s+/).filter(Boolean)[0];\r\n if (!level) {\r\n const settings = await client.getSettings();\r\n emit(`Current effort: ${String(settings.effort ?? \"medium\")}`);\r\n return \"handled\";\r\n }\r\n if (level !== \"low\" && level !== \"medium\" && level !== \"high\") {\r\n emit(\"Invalid effort. Use: low, medium, or high\");\r\n return \"handled\";\r\n }\r\n await client.patchSettings({ effort: level });\r\n emit(`Effort set to: ${level}`);\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/fast\") {\r\n const arg = slash.args.trim().split(/\\s+/).filter(Boolean)[0];\r\n const settings = await client.getSettings();\r\n const current = settings.fastMode === true;\r\n let next: boolean;\r\n if (arg === \"on\") next = true;\r\n else if (arg === \"off\") next = false;\r\n else next = !current;\r\n await client.patchSettings({ fastMode: next });\r\n emit(`Fast mode: ${next ? \"ON\" : \"OFF\"}`);\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/turns\") {\r\n const value = slash.args.trim().split(/\\s+/).filter(Boolean)[0];\r\n if (!value) {\r\n const settings = await client.getSettings();\r\n emit(`Current max turns: ${String(settings.maxTurns ?? \"(default)\")}`);\r\n return \"handled\";\r\n }\r\n const n = Number.parseInt(value, 10);\r\n if (!Number.isFinite(n) || n < 1 || n > 512) {\r\n emit(\"Value must be between 1 and 512\");\r\n return \"handled\";\r\n }\r\n await client.patchSettings({ maxTurns: n });\r\n emit(`Max turns set to: ${n}`);\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/usage\" || slash?.name === \"/cost\") {\r\n if (!sessionId) return \"handled\";\r\n if (slash.name === \"/cost\") {\r\n await readPresentation(`cost:${sessionId}`, \"Cost\", async () => {\r\n const usage = await client.getSessionUsage(sessionId);\r\n return [\r\n \"Cost estimate:\",\r\n ` Model: ${usage.model}`,\r\n ` Input tokens: ${usage.inputTokens.toLocaleString()}`,\r\n ` Output tokens: ${usage.outputTokens.toLocaleString()}`,\r\n ` Est. cost: ${usage.estimatedCost}`,\r\n ...(usage.cacheCreationTokens\r\n ? [` Cache write: ${usage.cacheCreationTokens.toLocaleString()}`]\r\n : []),\r\n ...(usage.cacheReadTokens\r\n ? [` Cache read: ${usage.cacheReadTokens.toLocaleString()}`]\r\n : []),\r\n ].join(\"\\n\");\r\n });\r\n return \"handled\";\r\n }\r\n await readPresentation(`usage:${sessionId}`, \"Usage\", async () => {\r\n const usage = await client.getSessionUsage(sessionId);\r\n return [\r\n \"Token usage:\",\r\n ` Input: ${usage.inputTokens.toLocaleString()}`,\r\n ` Output: ${usage.outputTokens.toLocaleString()}`,\r\n ` Total: ${(usage.inputTokens + usage.outputTokens).toLocaleString()}`,\r\n ` Cache write: ${usage.cacheCreationTokens.toLocaleString()}`,\r\n ` Cache read: ${usage.cacheReadTokens.toLocaleString()}`,\r\n ` Messages: ${usage.messageCount}`,\r\n ` Est. cost: ${usage.estimatedCost}`,\r\n ].join(\"\\n\");\r\n });\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/export\") {\r\n if (!sessionId) return \"handled\";\r\n const args = slash.args.trim().split(/\\s+/).filter(Boolean);\r\n const forceJson = args.includes(\"--json\");\r\n const filename = args.find((arg) => !arg.startsWith(\"--\"));\r\n const result = await client.exportSession(sessionId, {\r\n ...(filename ? { filename } : {}),\r\n json: forceJson,\r\n });\r\n emit(`Exported ${result.format === \"json\" ? \"JSON\" : \"Markdown\"} to: ${result.filepath}`);\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/output-style\") {\r\n const args = slash.args.trim();\r\n const styles = await client.listOutputStyles();\r\n const settings = await client.getSettings();\r\n const current = typeof settings.outputStyle === \"string\" ? settings.outputStyle : \"default\";\r\n const firstSpace = args.search(/\\s/);\r\n const first = firstSpace === -1 ? args : args.slice(0, firstSpace);\r\n const rest = firstSpace === -1 ? \"\" : args.slice(firstSpace + 1).trim();\r\n\r\n if (!first || first === \"show\") {\r\n emit(`Output style: ${current}`);\r\n return \"handled\";\r\n }\r\n if (first === \"list\") {\r\n emit(\r\n styles\r\n .map((style) => `${style.name === current ? \"* \" : \" \"}${style.name} [${style.source}]`)\r\n .join(\"\\n\"),\r\n );\r\n return \"handled\";\r\n }\r\n\r\n const styleName = first === \"set\" && rest ? rest : rest === \"\" ? first : undefined;\r\n if (!styleName) {\r\n emit(\"Usage: /output-style [show|list|NAME]\");\r\n return \"handled\";\r\n }\r\n if (!styles.some((style) => style.name === styleName)) {\r\n emit(`Unknown output style: ${styleName}`);\r\n return \"handled\";\r\n }\r\n await client.patchSettings({ outputStyle: styleName });\r\n emit(`Output style set to ${styleName}`);\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/init\") {\r\n emit(await client.initProject({ cwd }));\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/plugin\") {\r\n const args = slash.args.trim().split(/\\s+/).filter(Boolean);\r\n const sub = args[0];\r\n if (!sub || sub === \"list\") {\r\n await readPresentation(`plugins:${cwd}`, \"Plugin\", async () => {\r\n const listed = await client.listPlugins({ cwd });\r\n if (listed.plugins.length === 0) return \"No plugins discovered.\";\r\n return [\r\n ...listed.plugins.map(\r\n (plugin) =>\r\n `- ${plugin.identity.id} (${plugin.identity.name}@${plugin.identity.version}) ` +\r\n `[${plugin.origin}/${plugin.scope}/${plugin.enabled ? \"enabled\" : \"disabled\"}/${plugin.activation}] ` +\r\n Object.entries(plugin.inventory).map(([kind, count]) => `${kind}=${count}`).join(\" \") +\r\n plugin.diagnostics.map((item) => `\\n ! ${item.code}: ${item.message}`).join(\"\"),\r\n ),\r\n ...listed.warnings.map((warning) => `! ${warning}`),\r\n ].join(\"\\n\");\r\n });\r\n return \"handled\";\r\n }\r\n if ((sub === \"enable\" || sub === \"disable\") && args[1]) {\r\n const result = sub === \"enable\"\r\n ? await client.enablePlugin(args[1], { cwd })\r\n : await client.disablePlugin(args[1], { cwd });\r\n emit(result.message);\r\n return \"handled\";\r\n }\r\n emit(\"Usage: /plugin [list|enable ID|disable ID]\");\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/reload-plugins\") {\r\n const result = await client.reloadPlugins({ cwd });\r\n if (result.plugins.length === 0) {\r\n emit(`${result.message}\\nNo plugins discovered.`);\r\n return \"handled\";\r\n }\r\n emit(\r\n [\r\n result.message,\r\n \"Reloaded plugins:\",\r\n ...result.plugins.map(\r\n (plugin) => `- ${plugin.identity.id} [${plugin.enabled ? \"enabled\" : \"disabled\"}]`,\r\n ),\r\n ...result.warnings.map((warning) => `! ${warning}`),\r\n ].join(\"\\n\"),\r\n );\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/hooks\") {\r\n await readPresentation(`hooks:${cwd}:${sessionId ?? \"global\"}`, \"Hooks\", async () => {\r\n const hooks = await client.listHooks({\r\n cwd,\r\n ...(sessionId ? { sessionId } : {}),\r\n });\r\n if (hooks.length === 0) return \"No hooks configured.\";\r\n const settingsHooks = hooks.filter((hook) => hook.origin === \"settings\");\r\n const runtimeHooks = hooks.filter((hook) => hook.origin === \"runtime\");\r\n const lines = [\"Hooks:\", \"\"];\r\n if (runtimeHooks.length > 0) {\r\n lines.push(\"Runtime hooks:\");\r\n for (const hook of runtimeHooks) {\r\n lines.push(` ${hook.id}: ${hook.event} (${hook.type}) [${hook.enabled ? \"enabled\" : \"disabled\"}]`);\r\n }\r\n lines.push(\"\");\r\n }\r\n if (settingsHooks.length > 0) {\r\n lines.push(\"Settings hooks:\");\r\n for (const hook of settingsHooks) {\r\n lines.push(` ${hook.id}: ${hook.event} (${hook.type}) [${hook.enabled ? \"enabled\" : \"disabled\"}]`);\r\n }\r\n }\r\n return lines.join(\"\\n\");\r\n });\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/subagents\") {\r\n const agents = await client.listAgentPersonas();\r\n emit(\r\n [\r\n `Available subagent personas (${agents.length}):`,\r\n \"\",\r\n ...agents.flatMap((agent) => [\r\n `- ${agent.name} [${agent.source ?? \"builtin\"}]${agent.model ? ` model=${agent.model}` : \"\"}`,\r\n ` ${agent.description.split(\"\\n\")[0]?.slice(0, 100) ?? \"\"}`,\r\n ]),\r\n \"\",\r\n '用法: Agent 工具 subagentType=\"<name>\" 派发;/agents 查看 Agent Jobs。',\r\n ].join(\"\\n\"),\r\n );\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/diff\") {\r\n const full = slash.args.trim().split(/\\s+/).includes(\"full\");\r\n await readPresentation(`git:diff:${cwd}:${full ? \"full\" : \"summary\"}`, \"Diff\", async () =>\r\n await client.getGitDiff({ cwd, full }));\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/branch\") {\r\n const list = slash.args.trim().split(/\\s+/).includes(\"list\");\r\n await readPresentation(`git:branch:${cwd}:${list ? \"list\" : \"current\"}`, \"Branch\", async () =>\r\n await client.getGitBranch({ cwd, list }));\r\n return \"handled\";\r\n }\r\n\r\n if (slash?.name === \"/commit\") {\r\n const message = slash.args.trim();\r\n if (!message) {\r\n await readPresentation(`git:status:${cwd}`, \"Commit\", async () => await client.getGitStatus({ cwd }));\r\n return \"handled\";\r\n }\r\n emit(await client.gitCommit({ cwd, message }));\r\n return \"handled\";\r\n }\r\n\r\n if (slash && LOCAL_COMMAND_NAMES.has(slash.name)) {\r\n // UI-only commands are handled by the host UI layer; ignore accidental falls-through.\r\n return \"local_ui\";\r\n }\r\n\r\n return \"unhandled\";\r\n}\r\n",
18
+ "import type { OpenHarnessClient } from \"../transport/http-client.js\";\nimport type { CommandCatalogEntry, OpenHarnessClientState } from \"../types/index.js\";\nimport type { JobReadResult, JobSnapshot } from \"@openharness/protocol\";\nimport { patchSessionRuntimeMetadata } from \"@openharness/protocol\";\n\nexport type SlashLine = { name: string; args: string };\n\nexport type PresentationReadRequest = {\n key: string;\n title: string;\n load: () => Promise<string>;\n};\n\nexport type RuntimeDiagnostics = {\n runtime?: string;\n platform?: string;\n architecture?: string;\n};\n\nexport type SessionCommandHost = {\n client: OpenHarnessClient;\n sessionId?: string;\n /** Project cwd for memory/git/plugins/etc. */\n cwd: string;\n /** Values used by /status */\n model?: string;\n permissionMode?: string;\n statusSessionId?: string;\n commandCatalog: CommandCatalogEntry[];\n clientState: OpenHarnessClientState;\n busy: boolean;\n /** Present a system/notice message to the user */\n emit(text: string): void;\n /** Present read-only output in a transient UI surface when available. */\n present?(title: string, content: string): void;\n /** Present cached read-only output immediately and refresh it asynchronously. */\n cacheFirstRead?(request: PresentationReadRequest): void;\n /** Optional status patch for /plan /provider */\n patchStatus?(patch: Record<string, unknown>): void;\n /** Host-specific runtime information used by /doctor. Browsers may omit it. */\n getRuntimeDiagnostics?(): RuntimeDiagnostics | Promise<RuntimeDiagnostics>;\n};\n\nexport type SessionCommandOutcome =\n | \"handled\"\n | \"unhandled\"\n | \"local_ui\";\n\n/** Client-local UI commands; never forwarded as model prompts. */\nexport const LOCAL_COMMAND_DETAILS: Array<{ name: string; description?: string }> = [\n { name: \"/new\", description: \"Start a new session\" },\n { name: \"/sessions\", description: \"List and switch sessions\" },\n { name: \"/resume\", description: \"Replay an interrupted prompt run\" },\n { name: \"/permissions\", description: \"Change permission mode\" },\n { name: \"/plan\", description: \"Toggle plan mode\" },\n { name: \"/theme\", description: \"Change TUI theme\" },\n { name: \"/models\", description: \"Select model\" },\n { name: \"/workflow\", description: \"Open Jobs panel with Workflow details\" },\n { name: \"/workflows\", description: \"Open Jobs panel with Workflow details\" },\n];\n\nexport const LOCAL_COMMAND_NAMES = new Set(LOCAL_COMMAND_DETAILS.map((entry) => entry.name));\n\nexport function parseSlashLine(line: string): SlashLine | null {\n const trimmed = line.trim();\n if (!trimmed.startsWith(\"/\")) return null;\n const spaceIdx = trimmed.search(/\\s/);\n if (spaceIdx === -1) return { name: trimmed, args: \"\" };\n return { name: trimmed.slice(0, spaceIdx), args: trimmed.slice(spaceIdx + 1).trim() };\n}\n\nexport function mergeCommandDetails(\n catalog: CommandCatalogEntry[],\n): Array<{ name: string; description?: string }> {\n const byName = new Map<string, { name: string; description?: string }>();\n for (const entry of LOCAL_COMMAND_DETAILS) byName.set(entry.name, entry);\n for (const entry of catalog) {\n if (byName.has(entry.name)) continue;\n byName.set(entry.name, {\n name: entry.name,\n ...(entry.description ? { description: entry.description } : {}),\n });\n }\n return [...byName.values()].sort((a, b) => a.name.localeCompare(b.name));\n}\n\nexport function hasActiveRun(state: OpenHarnessClientState, sessionId?: string): boolean {\n if (!sessionId) return false;\n const bucket = state.buckets[sessionId];\n if (!bucket) return false;\n return Object.values(bucket.runs).some((run) => run.status === \"pending\" || run.status === \"running\");\n}\n\nexport function resolveSessionCwd(input: {\n statusCwd?: unknown;\n daemonCwd?: string;\n fallback?: string;\n}): string {\n if (typeof input.statusCwd === \"string\" && input.statusCwd) return input.statusCwd;\n if (input.daemonCwd) return input.daemonCwd;\n return input.fallback ?? \".\";\n}\n\nfunction firstArg(args: string): string | undefined {\n return args.trim().split(/\\s+/).filter(Boolean)[0];\n}\n\nfunction shouldPresentSlashOutput(slash: SlashLine): boolean {\n switch (slash.name) {\n case \"/help\":\n case \"/version\":\n case \"/status\":\n case \"/mcp\":\n case \"/context\":\n case \"/stats\":\n case \"/agents\":\n case \"/doctor\":\n case \"/usage\":\n case \"/cost\":\n case \"/hooks\":\n case \"/subagents\":\n case \"/diff\":\n case \"/skills\":\n return true;\n case \"/config\": {\n const args = slash.args.trim();\n return !args || args === \"show\";\n }\n case \"/provider\":\n return !slash.args.trim();\n case \"/jobs\": {\n const sub = firstArg(slash.args);\n return !sub || sub === \"list\" || sub === \"show\";\n }\n case \"/memory\": {\n const sub = firstArg(slash.args);\n return !sub || sub === \"list\" || sub === \"show\";\n }\n case \"/auth\": {\n const sub = firstArg(slash.args);\n return !sub || sub === \"status\";\n }\n case \"/profile\": {\n const action = firstArg(slash.args) ?? \"status\";\n return action === \"status\" || action === \"show\";\n }\n case \"/effort\":\n case \"/turns\":\n return !slash.args.trim();\n case \"/output-style\": {\n const sub = firstArg(slash.args);\n return !sub || sub === \"show\" || sub === \"list\";\n }\n case \"/plugin\": {\n const sub = firstArg(slash.args);\n return !sub || sub === \"list\";\n }\n case \"/branch\":\n return !slash.args.trim() || slash.args.trim().split(/\\s+/).includes(\"list\");\n case \"/commit\":\n return !slash.args.trim();\n default:\n return false;\n }\n}\n\nfunction formatJobReadResult(result: JobReadResult): string {\n const snapshot: JobSnapshot = result.snapshot;\n const capabilities = [\n `read=${snapshot.capabilities.read}`,\n `wait=${snapshot.capabilities.wait}`,\n `send=${snapshot.capabilities.send}`,\n `cancel=${snapshot.capabilities.cancel}`,\n ].join(\", \");\n return [\n `Job: ${snapshot.id}`,\n ` Kind: ${snapshot.kind}`,\n ` Status: ${snapshot.status}`,\n ` Label: ${snapshot.label}`,\n ` Owner session: ${snapshot.ownerSession}`,\n ` CWD: ${snapshot.cwd}`,\n ` Started at: ${snapshot.startedAt}`,\n ` Updated at: ${snapshot.updatedAt}`,\n ` Finished at: ${snapshot.finishedAt ?? \"(n/a)\"}`,\n ` Detail: ${snapshot.detail ?? \"(none)\"}`,\n ` Capabilities: ${capabilities}`,\n ` Metadata: ${snapshot.metadata ? JSON.stringify(snapshot.metadata) : \"(none)\"}`,\n ` Cursor: ${result.cursor}`,\n ` Truncated: ${result.truncated}`,\n \"\",\n \"Output:\",\n result.text || \"(no output)\",\n ].join(\"\\n\");\n}\n\nfunction slashOutputTitle(slash: SlashLine): string {\n const name = slash.name.startsWith(\"/\") ? slash.name.slice(1) : slash.name;\n return name ? name[0]!.toUpperCase() + name.slice(1) : \"Output\";\n}\n\nexport async function dispatchSessionCommand(\n slash: SlashLine | null,\n host: SessionCommandHost,\n): Promise<SessionCommandOutcome> {\n const {\n client,\n sessionId,\n cwd,\n model,\n permissionMode,\n statusSessionId,\n commandCatalog,\n clientState,\n busy,\n } = host;\n const emit = (text: string) => {\n if (slash && host.present && shouldPresentSlashOutput(slash)) {\n host.present(slashOutputTitle(slash), text);\n return;\n }\n host.emit(text);\n };\n const readPresentation = async (\n key: string,\n title: string,\n load: () => Promise<string>,\n ): Promise<void> => {\n if (slash && host.cacheFirstRead && shouldPresentSlashOutput(slash)) {\n host.cacheFirstRead({ key, title, load });\n return;\n }\n emit(await load());\n };\n const patchStatus = (patch: Record<string, unknown>) => host.patchStatus?.(patch);\n\n if (slash?.name === \"/plan\") {\n const next =\n slash.args === \"on\" ? \"plan\"\n : slash.args === \"off\" ? \"default\"\n : undefined;\n if (!next) {\n emit(\"Usage: /plan [on|off]\");\n return \"handled\";\n }\n patchStatus({ permission_mode: next });\n if (sessionId) {\n await client.updateSession(sessionId, {\n metadata: patchSessionRuntimeMetadata({}, { permissionMode: next }),\n });\n }\n emit(`Permission mode: ${next}`);\n return \"handled\";\n }\n\n if (slash?.name === \"/skills\") {\n const templates = commandCatalog.filter((entry) => entry.kind === \"template\");\n if (slash.args) {\n const name = slash.args.startsWith(\"/\") ? slash.args : `/${slash.args}`;\n const match = templates.find((entry) => entry.name === name || entry.name === `/${slash.args}`);\n if (!match) {\n emit(`Unknown skill: ${slash.args}`);\n return \"handled\";\n }\n emit(`${match.name}${match.description ? ` — ${match.description}` : \"\"}`);\n return \"handled\";\n }\n if (templates.length === 0) {\n emit(\"No user-invocable skills available.\");\n return \"handled\";\n }\n emit(\n [\"Skills:\", ...templates.map((entry) =>\n `- ${entry.name}${entry.description ? ` — ${entry.description}` : \"\"}`)].join(\"\\n\"),\n );\n return \"handled\";\n }\n\n if (slash?.name === \"/help\") {\n const details = mergeCommandDetails(commandCatalog);\n emit(\n [\"Available commands:\", ...details.map((entry) =>\n `${entry.name}${entry.description ? ` — ${entry.description}` : \"\"}`)].join(\"\\n\"),\n );\n return \"handled\";\n }\n\n if (slash?.name === \"/version\") {\n await readPresentation(\"version\", \"Version\", async () => {\n const health = await client.health();\n return `OpenHarness${health.version ? ` v${health.version}` : \"\"}`;\n });\n return \"handled\";\n }\n\n if (slash?.name === \"/status\") {\n emit([\n \"Session status:\",\n ` session: ${statusSessionId ?? \"(none)\"}`,\n ` model: ${model ?? \"(unknown)\"}`,\n ` cwd: ${cwd || \"(unknown)\"}`,\n ` mode: ${permissionMode ?? \"default\"}`,\n ` busy: ${busy || hasActiveRun(clientState, sessionId) ? \"yes\" : \"no\"}`,\n ].join(\"\\n\"));\n return \"handled\";\n }\n\n if (slash?.name === \"/config\") {\n const args = slash.args.trim();\n if (!args || args === \"show\") {\n await readPresentation(`config:${cwd}`, \"Config\", async () => {\n const settings = await client.getSettings();\n return JSON.stringify(settings, null, 2);\n });\n return \"handled\";\n }\n const setMatch = args.match(/^set\\s+(\\S+)\\s+([\\s\\S]+)$/);\n if (!setMatch?.[1] || setMatch[2] === undefined) {\n emit(\"Usage: /config [show | set KEY VALUE]\");\n return \"handled\";\n }\n await client.patchSettings({ path: setMatch[1], value: setMatch[2].trim() });\n emit(`Set ${setMatch[1]} = ${setMatch[2].trim()}`);\n return \"handled\";\n }\n\n if (slash?.name === \"/provider\") {\n if (!slash.args) {\n await readPresentation(\"providers\", \"Provider\", async () => {\n const providers = await client.listProviders();\n const lines = [\"Available providers:\", \"\"];\n for (const provider of providers) {\n const marker = provider.active ? \" (active)\" : \"\";\n const keyStatus = provider.local ? \"[local]\" : provider.hasKey ? \"[key]\" : \"[no key]\";\n lines.push(` ${provider.name.padEnd(14)} ${provider.displayName.padEnd(14)} ${keyStatus}${marker}`);\n }\n return lines.join(\"\\n\");\n });\n return \"handled\";\n }\n const settings = await client.patchSettings(\n slash.args === \"auto\"\n ? { provider: \"auto\" }\n : { provider: slash.args },\n );\n if (typeof settings.model === \"string\") {\n patchStatus({ model: settings.model });\n }\n emit(`Provider switched to: ${slash.args}`);\n return \"handled\";\n }\n\n if (slash?.name === \"/mcp\") {\n if (!sessionId) return \"handled\";\n await readPresentation(`mcp:${sessionId}`, \"MCP\", async () => {\n const servers = await client.getSessionMcp(sessionId);\n if (servers.length === 0) return \"No MCP servers connected.\";\n return [\n `MCP Servers (${servers.length}):`,\n \"\",\n ...servers.flatMap((server) => [\n ` ${server.name}: ${server.status}`,\n ...(server.command ? [` Command: ${server.command}`] : []),\n ` Tools: ${server.toolCount} Resources: ${server.resourceCount}`,\n ...(server.error ? [` Error: ${server.error}`] : []),\n \"\",\n ]),\n ].join(\"\\n\");\n });\n return \"handled\";\n }\n\n if (slash?.name === \"/jobs\") {\n if (!sessionId) return \"handled\";\n const args = slash.args.trim();\n const [sub, id, ...extra] = args.split(/\\s+/).filter(Boolean);\n if ((!sub || sub === \"list\") && !id) {\n await readPresentation(`jobs:${sessionId}`, \"Jobs\", async () => {\n const jobs = await client.listJobs({\n sessionId,\n includeFinished: true,\n limit: 100,\n });\n if (jobs.length === 0) return \"No Jobs.\";\n return [\n `Jobs (${jobs.length}):`,\n \"\",\n ...jobs.map((job) => ` ${job.id} [${job.status}] ${job.kind}: ${job.label}`),\n ].join(\"\\n\");\n });\n return \"handled\";\n }\n if (sub === \"show\" && id && extra.length === 0) {\n await readPresentation(`job:${sessionId}:${id}`, \"Jobs\", async () => {\n const result = await client.readJob(id, { sessionId });\n return formatJobReadResult(result);\n });\n return \"handled\";\n }\n if (sub === \"cancel\" && id && extra.length === 0) {\n const snapshot = await client.cancelJob(id, {\n sessionId,\n reason: \"Cancelled from slash command\",\n });\n emit(`Job ${snapshot.id} status: ${snapshot.status}.`);\n return \"handled\";\n }\n emit(\"Usage: /jobs [list | show ID | cancel ID]\");\n return \"handled\";\n }\n\n if (slash?.name === \"/background\") {\n const command = slash.args.trim();\n if (!command) {\n emit(\"Usage: /background <command>\");\n return \"handled\";\n }\n if (!sessionId) return \"handled\";\n const result = await client.createBackgroundShell({ sessionId, command });\n emit(`Background shell started: ${result.jobId}. Use /jobs to inspect it.`);\n return \"handled\";\n }\n\n if (slash?.name === \"/memory\") {\n const args = slash.args.trim();\n const [sub, ...rest] = args.split(/\\s+/).filter(Boolean);\n if (!sub || sub === \"list\") {\n await readPresentation(`memory:${cwd}:list`, \"Memory\", async () => {\n const listed = await client.listMemory({ cwd });\n if (listed.entries.length === 0) return `Memory directory: ${listed.directory}\\nNo entries found.`;\n return [\n `Memory entries (${listed.entries.length}):`,\n \"\",\n ...listed.entries.map((entry) => {\n const tags = entry.tags?.length ? ` [${entry.tags.join(\", \")}]` : \"\";\n const preview = entry.content.length > 80\n ? `${entry.content.slice(0, 80)}...`\n : entry.content;\n return ` ${entry.id}${tags}: ${preview}`;\n }),\n ].join(\"\\n\");\n });\n return \"handled\";\n }\n if (sub === \"show\" && rest[0]) {\n const memoryId = rest[0];\n await readPresentation(`memory:${cwd}:show:${memoryId}`, \"Memory\", async () => {\n const entry = await client.getMemory(memoryId, { cwd });\n return [\n `ID: ${entry.id}`,\n `Created: ${new Date(entry.createdAt).toISOString()}`,\n `Updated: ${new Date(entry.updatedAt).toISOString()}`,\n `Tags: ${entry.tags?.join(\", \") ?? \"(none)\"}`,\n \"\",\n entry.content,\n ].join(\"\\n\");\n });\n return \"handled\";\n }\n if (sub === \"add\") {\n const content = rest.join(\" \").trim();\n if (!content) {\n emit(\"Usage: /memory add <content>\");\n return \"handled\";\n }\n const entry = await client.addMemory({ cwd, content });\n emit(`Memory added: ${entry.id}`);\n return \"handled\";\n }\n if (sub === \"remove\" && rest[0]) {\n await client.removeMemory(rest[0], { cwd });\n emit(`Memory removed: ${rest[0]}`);\n return \"handled\";\n }\n emit(\"Usage: /memory [list | show ID | add CONTENT | remove ID]\");\n return \"handled\";\n }\n\n if (slash?.name === \"/auth\") {\n const args = slash.args.trim();\n const [sub, provider, apiKey] = args.split(/\\s+/).filter(Boolean);\n if (!sub || sub === \"status\") {\n await readPresentation(\"auth:status\", \"Auth\", async () => {\n const auth = await client.getAuthStatus();\n const lines = [\"Credential status:\", \"\", \" Auth sources:\"];\n lines.push(\n ` codex_subscription: ${auth.codex.configured ? \"ready\" : auth.codex.state} (${auth.codex.source})`,\n );\n if (auth.storedProviders.length > 0) {\n lines.push(\"\", \" Stored credentials:\");\n for (const name of auth.storedProviders) lines.push(` ${name}: configured`);\n }\n if (auth.envProviders.length > 0) {\n lines.push(\" Environment variables:\");\n for (const env of auth.envProviders) lines.push(` ${env.name}: ${env.envKey}`);\n }\n if (auth.storedProviders.length === 0 && auth.envProviders.length === 0) {\n lines.push(\"\", \" No credentials configured.\");\n lines.push(\" Use /auth login <provider> <api-key> to store an API key.\");\n lines.push(\" Use /auth login codex to use a Codex subscription.\");\n }\n return lines.join(\"\\n\");\n });\n return \"handled\";\n }\n if (sub === \"login\") {\n if (!provider) {\n emit(\"Usage: /auth login <provider> <api-key> or /auth login codex\");\n return \"handled\";\n }\n const result = await client.authLogin({ provider, apiKey });\n emit(result.message);\n return \"handled\";\n }\n if (sub === \"logout\") {\n if (!provider) {\n emit(\"Usage: /auth logout <provider>\");\n return \"handled\";\n }\n const result = await client.authLogout({ provider });\n emit(result.message);\n return \"handled\";\n }\n emit(\"Unknown subcommand. Use login, logout, or status.\");\n return \"handled\";\n }\n\n if (slash?.name === \"/context\") {\n const action = slash.args.trim().split(/\\s+/).filter(Boolean)[0] ?? \"preview\";\n if (action === \"status\") {\n await readPresentation(`context:${cwd}:status`, \"Context\", async () => await client.getContextStatus({ cwd }));\n return \"handled\";\n }\n if (action !== \"preview\") {\n emit(\"Usage: /context [status]\");\n return \"handled\";\n }\n await readPresentation(`context:${cwd}`, \"Context\", async () => await client.getContextPreview({ cwd }));\n return \"handled\";\n }\n\n if (slash?.name === \"/stats\") {\n if (!sessionId) return \"handled\";\n const bucket = clientState.buckets[sessionId];\n const messageCount = bucket?.messages.length ?? 0;\n const text = (bucket?.messages ?? [])\n .flatMap((message) => bucket?.partsByMessageId[message.id] ?? [])\n .map((part) => part.text ?? \"\")\n .join(\" \");\n const estimatedTokens = Math.max(1, Math.ceil(text.length / 4));\n const [memory, jobsResult, settings] = await Promise.all([\n client.listMemory({ cwd }).catch(() => ({ entries: [] as Array<{ id: string }> })),\n client.listJobs({ sessionId, includeFinished: true, limit: 100 })\n .then((jobs) => ({ jobs }))\n .catch((error: unknown) => ({\n error: error instanceof Error ? error.message : String(error),\n })),\n client.getSettings().catch(() => ({} as Record<string, unknown>)),\n ]);\n const jobsSummary = \"jobs\" in jobsResult\n ? String(jobsResult.jobs.length)\n : `unavailable (${jobsResult.error})`;\n emit([\n \"Session stats:\",\n `- messages: ${messageCount}`,\n `- estimated_tokens: ${estimatedTokens}`,\n `- memory_entries: ${memory.entries.length}`,\n `- jobs: ${jobsSummary}`,\n `- output_style: ${typeof settings.outputStyle === \"string\" ? settings.outputStyle : \"default\"}`,\n ].join(\"\\n\"));\n return \"handled\";\n }\n\n if (slash?.name === \"/agents\") {\n if (!sessionId) return \"handled\";\n const agents = await client.listJobs({\n sessionId,\n kinds: [\"agent\"],\n includeFinished: true,\n limit: 100,\n });\n if (agents.length === 0) {\n emit(\"No Agent Jobs.\");\n return \"handled\";\n }\n emit(\n [\n `Agent Jobs (${agents.length}):`,\n \"\",\n ...agents.map((job) => ` ${job.id} [${job.status}] ${job.label}`),\n ].join(\"\\n\"),\n );\n return \"handled\";\n }\n\n if (slash?.name === \"/rewind\") {\n if (!sessionId) return \"handled\";\n const raw = slash.args.trim().split(/\\s+/).filter(Boolean)[0] ?? \"1\";\n const count = Number.parseInt(raw, 10);\n if (!Number.isInteger(count) || count < 1) {\n emit(\"Count must be a positive integer\");\n return \"handled\";\n }\n const result = await client.rewindSession(sessionId, { count });\n emit(`Rewound ${result.turns} turn(s), removed ${result.removed} message(s).`);\n return \"handled\";\n }\n\n if (slash?.name === \"/compact\") {\n if (!sessionId) return \"handled\";\n const result = await client.compactSession(sessionId);\n emit(`Conversation compacted (${result.messageCount} messages retained).`);\n return \"handled\";\n }\n\n if (slash?.name === \"/remember\") {\n if (!sessionId) return \"handled\";\n const result = await client.rememberSession(sessionId);\n if (result.skipped) {\n emit(`未写入记忆:${result.reason ?? \"skipped\"}`);\n return \"handled\";\n }\n emit(`已写入 ${result.writtenIds.length} 条记忆:${result.titles.join(\"、\")}`);\n return \"handled\";\n }\n\n if (slash?.name === \"/dream\") {\n const preview = slash.args.includes(\"--preview\");\n const result = await client.startDream({\n cwd,\n ...(sessionId ? { sessionId } : {}),\n preview,\n });\n emit(`Dream started as Job ${result.taskId}. Use /jobs to inspect it.`);\n return \"handled\";\n }\n\n if (slash?.name === \"/profile\") {\n const action = slash.args.trim().split(/\\s+/).filter(Boolean)[0] ?? \"status\";\n if (action === \"status\" || action === \"show\") {\n emit(await client.getProfileStatus());\n return \"handled\";\n }\n if (action === \"init\") {\n emit(await client.initProfile());\n return \"handled\";\n }\n emit(\"Usage: /profile [status|init]\");\n return \"handled\";\n }\n\n if (slash?.name === \"/doctor\") {\n const [settings, auth, memory, mcp, jobsResult] = await Promise.all([\n client.getSettings().catch(() => ({}) as Record<string, unknown>),\n client.getAuthStatus().catch(() => null),\n client.listMemory({ cwd }).catch(() => ({ directory: \"(unavailable)\", entries: [] as Array<{ id: string }> })),\n sessionId ? client.getSessionMcp(sessionId).catch(() => []) : Promise.resolve([]),\n sessionId\n ? client.listJobs({ sessionId, includeFinished: true, limit: 100 })\n .then((jobs) => ({ jobs }))\n .catch((error: unknown) => ({\n error: error instanceof Error ? error.message : String(error),\n }))\n : Promise.resolve({ jobs: [] as JobSnapshot[] }),\n ]);\n const jobsSummary = \"jobs\" in jobsResult\n ? String(jobsResult.jobs.length)\n : `unavailable (${jobsResult.error})`;\n const bucket = sessionId ? clientState.buckets[sessionId] : undefined;\n const diagnostics = await host.getRuntimeDiagnostics?.();\n const runtime = diagnostics?.runtime ?? \"(not provided by this host)\";\n const platform = [diagnostics?.platform, diagnostics?.architecture]\n .filter(Boolean)\n .join(\" \") || \"(not provided by this host)\";\n const lines = [\n \"OpenHarness Environment Diagnostic\",\n \"═\".repeat(40),\n \"\",\n `CWD: ${cwd}`,\n `Runtime: ${runtime}`,\n `Platform: ${platform}`,\n `Model: ${model ?? String(settings.model ?? \"(unknown)\")}`,\n `API Format: ${String(settings.apiFormat ?? \"(default)\")}`,\n `Base URL: ${String(settings.baseUrl ?? \"(default)\")}`,\n `Permission: ${typeof settings.permission === \"object\" && settings.permission && \"mode\" in settings.permission\n ? String((settings.permission as { mode?: string }).mode ?? \"default\")\n : \"default\"}`,\n `Max Turns: ${String(settings.maxTurns ?? \"(default)\")}`,\n `Effort: ${String(settings.effort ?? \"medium\")}`,\n `Passes: ${String(settings.passes ?? 1)}`,\n `Fast Mode: ${settings.fastMode ? \"on\" : \"off\"}`,\n `Theme: ${String(settings.theme ?? \"default\")}`,\n \"\",\n `Messages: ${bucket?.messages.length ?? 0}`,\n `Jobs: ${jobsSummary}`,\n \"\",\n `Memory dir: ${memory.directory}`,\n `Memory entries: ${memory.entries.length}`,\n ];\n if (auth) {\n lines.push(\n \"\",\n `Codex auth: ${auth.codex.configured ? \"ready\" : auth.codex.state} (${auth.codex.source})`,\n `Stored keys: ${auth.storedProviders.length ? auth.storedProviders.join(\", \") : \"(none)\"}`,\n );\n }\n lines.push(\"\", \"MCP Servers:\");\n if (mcp.length === 0) lines.push(\" (none)\");\n else {\n for (const server of mcp) {\n lines.push(` ${server.name}: ${server.status} (${server.toolCount} tools)`);\n }\n }\n emit(lines.join(\"\\n\"));\n return \"handled\";\n }\n\n if (slash?.name === \"/effort\") {\n const level = slash.args.trim().split(/\\s+/).filter(Boolean)[0];\n if (!level) {\n const settings = await client.getSettings();\n emit(`Current effort: ${String(settings.effort ?? \"medium\")}`);\n return \"handled\";\n }\n if (level !== \"low\" && level !== \"medium\" && level !== \"high\") {\n emit(\"Invalid effort. Use: low, medium, or high\");\n return \"handled\";\n }\n await client.patchSettings({ effort: level });\n emit(`Effort set to: ${level}`);\n return \"handled\";\n }\n\n if (slash?.name === \"/fast\") {\n const arg = slash.args.trim().split(/\\s+/).filter(Boolean)[0];\n const settings = await client.getSettings();\n const current = settings.fastMode === true;\n let next: boolean;\n if (arg === \"on\") next = true;\n else if (arg === \"off\") next = false;\n else next = !current;\n await client.patchSettings({ fastMode: next });\n emit(`Fast mode: ${next ? \"ON\" : \"OFF\"}`);\n return \"handled\";\n }\n\n if (slash?.name === \"/turns\") {\n const value = slash.args.trim().split(/\\s+/).filter(Boolean)[0];\n if (!value) {\n const settings = await client.getSettings();\n emit(`Current max turns: ${String(settings.maxTurns ?? \"(default)\")}`);\n return \"handled\";\n }\n const n = Number.parseInt(value, 10);\n if (!Number.isFinite(n) || n < 1 || n > 512) {\n emit(\"Value must be between 1 and 512\");\n return \"handled\";\n }\n await client.patchSettings({ maxTurns: n });\n emit(`Max turns set to: ${n}`);\n return \"handled\";\n }\n\n if (slash?.name === \"/usage\" || slash?.name === \"/cost\") {\n if (!sessionId) return \"handled\";\n if (slash.name === \"/cost\") {\n await readPresentation(`cost:${sessionId}`, \"Cost\", async () => {\n const usage = await client.getSessionUsage(sessionId);\n return [\n \"Cost estimate:\",\n ` Model: ${usage.model}`,\n ` Input tokens: ${usage.inputTokens.toLocaleString()}`,\n ` Output tokens: ${usage.outputTokens.toLocaleString()}`,\n ` Est. cost: ${usage.estimatedCost}`,\n ...(usage.cacheCreationTokens\n ? [` Cache write: ${usage.cacheCreationTokens.toLocaleString()}`]\n : []),\n ...(usage.cacheReadTokens\n ? [` Cache read: ${usage.cacheReadTokens.toLocaleString()}`]\n : []),\n ].join(\"\\n\");\n });\n return \"handled\";\n }\n await readPresentation(`usage:${sessionId}`, \"Usage\", async () => {\n const usage = await client.getSessionUsage(sessionId);\n return [\n \"Token usage:\",\n ` Input: ${usage.inputTokens.toLocaleString()}`,\n ` Output: ${usage.outputTokens.toLocaleString()}`,\n ` Total: ${(usage.inputTokens + usage.outputTokens).toLocaleString()}`,\n ` Cache write: ${usage.cacheCreationTokens.toLocaleString()}`,\n ` Cache read: ${usage.cacheReadTokens.toLocaleString()}`,\n ` Messages: ${usage.messageCount}`,\n ` Est. cost: ${usage.estimatedCost}`,\n ].join(\"\\n\");\n });\n return \"handled\";\n }\n\n if (slash?.name === \"/export\") {\n if (!sessionId) return \"handled\";\n const args = slash.args.trim().split(/\\s+/).filter(Boolean);\n const forceJson = args.includes(\"--json\");\n const filename = args.find((arg) => !arg.startsWith(\"--\"));\n const result = await client.exportSession(sessionId, {\n ...(filename ? { filename } : {}),\n json: forceJson,\n });\n emit(`Exported ${result.format === \"json\" ? \"JSON\" : \"Markdown\"} to: ${result.filepath}`);\n return \"handled\";\n }\n\n if (slash?.name === \"/output-style\") {\n const args = slash.args.trim();\n const styles = await client.listOutputStyles();\n const settings = await client.getSettings();\n const current = typeof settings.outputStyle === \"string\" ? settings.outputStyle : \"default\";\n const firstSpace = args.search(/\\s/);\n const first = firstSpace === -1 ? args : args.slice(0, firstSpace);\n const rest = firstSpace === -1 ? \"\" : args.slice(firstSpace + 1).trim();\n\n if (!first || first === \"show\") {\n emit(`Output style: ${current}`);\n return \"handled\";\n }\n if (first === \"list\") {\n emit(\n styles\n .map((style) => `${style.name === current ? \"* \" : \" \"}${style.name} [${style.source}]`)\n .join(\"\\n\"),\n );\n return \"handled\";\n }\n\n const styleName = first === \"set\" && rest ? rest : rest === \"\" ? first : undefined;\n if (!styleName) {\n emit(\"Usage: /output-style [show|list|NAME]\");\n return \"handled\";\n }\n if (!styles.some((style) => style.name === styleName)) {\n emit(`Unknown output style: ${styleName}`);\n return \"handled\";\n }\n await client.patchSettings({ outputStyle: styleName });\n emit(`Output style set to ${styleName}`);\n return \"handled\";\n }\n\n if (slash?.name === \"/init\") {\n emit(await client.initProject({ cwd }));\n return \"handled\";\n }\n\n if (slash?.name === \"/plugin\") {\n const args = slash.args.trim().split(/\\s+/).filter(Boolean);\n const sub = args[0];\n if (!sub || sub === \"list\") {\n await readPresentation(`plugins:${cwd}`, \"Plugin\", async () => {\n const listed = await client.listPlugins({ cwd });\n if (listed.plugins.length === 0) return \"No plugins discovered.\";\n return [\n ...listed.plugins.map(\n (plugin) =>\n `- ${plugin.identity.id} (${plugin.identity.name}@${plugin.identity.version}) ` +\n `[${plugin.origin}/${plugin.scope}/${plugin.enabled ? \"enabled\" : \"disabled\"}/${plugin.activation}] ` +\n Object.entries(plugin.inventory).map(([kind, count]) => `${kind}=${count}`).join(\" \") +\n plugin.diagnostics.map((item) => `\\n ! ${item.code}: ${item.message}`).join(\"\"),\n ),\n ...listed.warnings.map((warning) => `! ${warning}`),\n ].join(\"\\n\");\n });\n return \"handled\";\n }\n if ((sub === \"enable\" || sub === \"disable\") && args[1]) {\n const result = sub === \"enable\"\n ? await client.enablePlugin(args[1], { cwd })\n : await client.disablePlugin(args[1], { cwd });\n emit(result.message);\n return \"handled\";\n }\n emit(\"Usage: /plugin [list|enable ID|disable ID]\");\n return \"handled\";\n }\n\n if (slash?.name === \"/reload-plugins\") {\n const result = await client.reloadPlugins({ cwd });\n if (result.plugins.length === 0) {\n emit(`${result.message}\\nNo plugins discovered.`);\n return \"handled\";\n }\n emit(\n [\n result.message,\n \"Reloaded plugins:\",\n ...result.plugins.map(\n (plugin) => `- ${plugin.identity.id} [${plugin.enabled ? \"enabled\" : \"disabled\"}]`,\n ),\n ...result.warnings.map((warning) => `! ${warning}`),\n ].join(\"\\n\"),\n );\n return \"handled\";\n }\n\n if (slash?.name === \"/hooks\") {\n await readPresentation(`hooks:${cwd}:${sessionId ?? \"global\"}`, \"Hooks\", async () => {\n const hooks = await client.listHooks({\n cwd,\n ...(sessionId ? { sessionId } : {}),\n });\n if (hooks.length === 0) return \"No hooks configured.\";\n const settingsHooks = hooks.filter((hook) => hook.origin === \"settings\");\n const runtimeHooks = hooks.filter((hook) => hook.origin === \"runtime\");\n const lines = [\"Hooks:\", \"\"];\n if (runtimeHooks.length > 0) {\n lines.push(\"Runtime hooks:\");\n for (const hook of runtimeHooks) {\n lines.push(` ${hook.id}: ${hook.event} (${hook.type}) [${hook.enabled ? \"enabled\" : \"disabled\"}]`);\n }\n lines.push(\"\");\n }\n if (settingsHooks.length > 0) {\n lines.push(\"Settings hooks:\");\n for (const hook of settingsHooks) {\n lines.push(` ${hook.id}: ${hook.event} (${hook.type}) [${hook.enabled ? \"enabled\" : \"disabled\"}]`);\n }\n }\n return lines.join(\"\\n\");\n });\n return \"handled\";\n }\n\n if (slash?.name === \"/subagents\") {\n const agents = await client.listAgentPersonas();\n emit(\n [\n `Available subagent personas (${agents.length}):`,\n \"\",\n ...agents.flatMap((agent) => [\n `- ${agent.name} [${agent.source ?? \"builtin\"}]${agent.model ? ` model=${agent.model}` : \"\"}`,\n ` ${agent.description.split(\"\\n\")[0]?.slice(0, 100) ?? \"\"}`,\n ]),\n \"\",\n '用法: Agent 工具 subagentType=\"<name>\" 派发;/agents 查看 Agent Jobs。',\n ].join(\"\\n\"),\n );\n return \"handled\";\n }\n\n if (slash?.name === \"/diff\") {\n const full = slash.args.trim().split(/\\s+/).includes(\"full\");\n await readPresentation(`git:diff:${cwd}:${full ? \"full\" : \"summary\"}`, \"Diff\", async () =>\n await client.getGitDiff({ cwd, full }));\n return \"handled\";\n }\n\n if (slash?.name === \"/branch\") {\n const list = slash.args.trim().split(/\\s+/).includes(\"list\");\n await readPresentation(`git:branch:${cwd}:${list ? \"list\" : \"current\"}`, \"Branch\", async () =>\n await client.getGitBranch({ cwd, list }));\n return \"handled\";\n }\n\n if (slash?.name === \"/commit\") {\n const message = slash.args.trim();\n if (!message) {\n await readPresentation(`git:status:${cwd}`, \"Commit\", async () => await client.getGitStatus({ cwd }));\n return \"handled\";\n }\n emit(await client.gitCommit({ cwd, message }));\n return \"handled\";\n }\n\n if (slash && LOCAL_COMMAND_NAMES.has(slash.name)) {\n // UI-only commands are handled by the host UI layer; ignore accidental falls-through.\n return \"local_ui\";\n }\n\n return \"unhandled\";\n}\n",
19
19
  "export * from \"./session-commands.js\";\n",
20
- "/**\r\n * @openharness/client 公共导出。\r\n *\r\n * 面向 TUI / Web / Desktop:typed HTTP API、SSE 解析、事件 reducer、replay+live 同步。\r\n * 客户端只做展示与控制,不拥有 agent runtime。\r\n */\r\n\r\nexport {\r\n createPromptRequestId,\r\n normalizeDaemonBaseUrl,\r\n OpenHarnessApiError,\r\n IncompatibleProtocolError,\r\n OpenHarnessClient,\r\n streamServerSentEvents,\r\n} from \"./transport/index.js\";\r\nexport type {\r\n AttachmentAssetRecord,\r\n ClientProtocolSupport,\r\n ProtocolCompatibility,\r\n ServerCapabilities,\r\n} from \"@openharness/protocol\";\r\nexport {\r\n checkProtocolCompatibility,\r\n supportsFeature,\r\n} from \"@openharness/protocol\";\r\nexport {\r\n applyEvent,\r\n applyEvents,\r\n applySessionSnapshot,\r\n createInitialClientState,\r\n hydrateState,\r\n selectSessionMessagesWithParts,\r\n syncEvents,\r\n UnsupportedSessionEventSchemaVersionError,\r\n} from \"./state/index.js\";\r\nexport {\r\n LOCAL_COMMAND_DETAILS,\r\n LOCAL_COMMAND_NAMES,\r\n dispatchSessionCommand,\r\n hasActiveRun,\r\n mergeCommandDetails,\r\n parseSlashLine,\r\n resolveSessionCwd,\r\n} from \"./commands/index.js\";\r\nexport {\r\n patchSessionRuntimeMetadata,\r\n readRuntimeMetadata,\r\n readSessionRuntimeConfig,\r\n} from \"@openharness/protocol\";\r\nexport type {\r\n SessionRuntimeConfig,\r\n SessionRuntimeConfigPatch,\r\n} from \"@openharness/protocol\";\r\nexport type {\r\n PresentationReadRequest,\r\n SessionCommandHost,\r\n SessionCommandOutcome,\r\n SlashLine,\r\n} from \"./commands/index.js\";\r\nexport type {\r\n AdmitClientPromptInput,\r\n AgentPersonaInfo,\r\n AttachmentStorageGcResult,\r\n AttachmentStorageIssue,\r\n AttachmentStorageRepairResult,\r\n AttachmentStorageReport,\r\n AuthStatus,\r\n CommandCatalogEntry,\r\n CommandKind,\r\n CommandSource,\r\n CompactSessionResponse,\r\n CancelQueuedClientPromptInput,\r\n CancelQueuedPromptResponse,\r\n CreateBackgroundShellInput,\r\n CreateBackgroundShellResult,\r\n CreateScheduledTaskInput,\r\n AdmitPromptAttachmentInput,\r\n CreateClientSessionInput,\r\n EditLatestClientPromptInput,\r\n EventSyncOptions,\r\n ForkClientSessionInput,\r\n HookInfo,\r\n ReloadPluginsResponse,\r\n RewindSessionResponse,\r\n InputDelivery,\r\n InterruptSessionResponse,\r\n ListClientMessagePartsOptions,\r\n ListCommandsOptions,\r\n ListEventsOptions,\r\n ListMessagesOptions,\r\n ListPermissionsOptions,\r\n ListSessionsOptions,\r\n ListProjectsOptions,\r\n ProjectRecord,\r\n McpServerStatus,\r\n MemoryEntryRecord,\r\n MemoryListResponse,\r\n ModelInfo,\r\n ModelProviderInfo,\r\n OpenHarnessClientOptions,\r\n OpenHarnessClientState,\r\n OpenHarnessServerHealth,\r\n OutputStyleInfo,\r\n PermissionRequestRecord,\r\n PermissionStatus,\r\n PluginInfo,\r\n PromoteQueuedClientPromptInput,\r\n PromoteQueuedPromptResponse,\r\n PromptResponse,\r\n ProviderInfo,\r\n CustomProviderInput,\r\n RememberSessionResponse,\r\n ReplyPermissionInput,\r\n ScheduledRunRecord,\r\n ScheduledTaskRecord,\r\n ScheduledTaskStatusSummary,\r\n SessionBucket,\r\n UpdateScheduledTaskInput,\r\n SessionEventRecord,\r\n SessionAttachmentMessagePartRecord,\r\n SessionInputAttachmentRecord,\r\n SessionExportResponse,\r\n SessionInputRecord,\r\n SessionMessagePartRecord,\r\n SessionMessageRecord,\r\n SessionRecord,\r\n SessionRunRecord,\r\n SessionRunAttemptRecord,\r\n SessionExecutionRecord,\r\n SessionStateSnapshot,\r\n SessionTransformationMessagePartRecord,\r\n SkillInvocationMetadata,\r\n SessionUsageResponse,\r\n StartDreamResponse,\r\n SyncEventUpdate,\r\n UpdateClientSessionInput,\r\n UploadAttachmentInput,\r\n DownloadAttachmentOptions,\r\n} from \"./types/index.js\";\r\nexport type { SessionMessageWithParts } from \"./state/index.js\";\r\nexport type {\r\n TerminalCreateRequest,\r\n TerminalEvent,\r\n TerminalReadRequest,\r\n TerminalReadResult,\r\n TerminalResizeRequest,\r\n TerminalRuntime,\r\n TerminalSessionInfo,\r\n TerminalSessionStatus,\r\n TerminalSignal,\r\n TerminalSource,\r\n TerminalWriteRequest,\r\n JobCapabilities,\r\n JobKind,\r\n JobReadResult,\r\n JobSnapshot,\r\n JobStatus,\r\n JobWaitResult,\r\n DurableChannelMessageInput,\r\n DurableChannelMessageResult,\r\n ExternalConversationRecord,\r\n ChannelDeliveryRecord,\r\n ChannelDeliveryStatus,\r\n ChannelStatusSnapshot,\r\n RecordChannelDeliveryInput,\r\n} from \"@openharness/protocol\";\r\n",
21
- "import type { JobReadResult, JobSnapshot } from \"@openharness/client\";\r\n\r\nexport type JobRemoteState =\r\n | { status: \"idle\"; jobs: JobSnapshot[] }\r\n | { status: \"loading\"; jobs: JobSnapshot[] }\r\n | { status: \"ready\"; jobs: JobSnapshot[]; refreshedAt: number }\r\n | { status: \"error\"; jobs: JobSnapshot[]; error: string; refreshedAt?: number };\r\n\r\nexport type JobDetailRemoteState =\r\n | { status: \"idle\" }\r\n | { status: \"loading\"; jobId: string; previous?: JobReadResult }\r\n | { status: \"ready\"; jobId: string; result: JobReadResult; refreshedAt: number }\r\n | { status: \"error\"; jobId: string; error: string; previous?: JobReadResult };\r\n\r\nexport function beginJobList(previous: JobRemoteState): JobRemoteState {\r\n return { status: \"loading\", jobs: [...previous.jobs] };\r\n}\r\n\r\nexport function resolveJobList(\r\n jobs: JobSnapshot[],\r\n now: number,\r\n previous?: JobRemoteState,\r\n): JobRemoteState {\r\n const cachedById = new Map(previous?.jobs.map((job) => [job.id, job]) ?? []);\r\n return {\r\n status: \"ready\",\r\n jobs: jobs.map((snapshot) => preferMonotonicSnapshot(cachedById.get(snapshot.id), snapshot)),\r\n refreshedAt: now,\r\n };\r\n}\r\n\r\nexport function rejectJobList(previous: JobRemoteState, error: string): JobRemoteState {\r\n const refreshedAt = \"refreshedAt\" in previous ? previous.refreshedAt : undefined;\r\n return {\r\n status: \"error\",\r\n jobs: [...previous.jobs],\r\n error,\r\n ...(refreshedAt !== undefined ? { refreshedAt } : {}),\r\n };\r\n}\r\n\r\nexport function mergeJobSnapshot(\r\n state: JobRemoteState,\r\n snapshot: JobSnapshot,\r\n now: number,\r\n): JobRemoteState {\r\n const found = state.jobs.some((job) => job.id === snapshot.id);\r\n const jobs = found\r\n ? state.jobs.map((job) => job.id === snapshot.id ? preferMonotonicSnapshot(job, snapshot) : job)\r\n : [snapshot, ...state.jobs];\r\n return { status: \"ready\", jobs, refreshedAt: now };\r\n}\r\n\r\nfunction preferMonotonicSnapshot(\r\n cached: JobSnapshot | undefined,\r\n incoming: JobSnapshot,\r\n): JobSnapshot {\r\n if (!cached) return incoming;\r\n if (isTerminalStatus(cached.status) && !isTerminalStatus(incoming.status)) return cached;\r\n if (incoming.updatedAt < cached.updatedAt) return cached;\r\n return incoming;\r\n}\r\n\r\nfunction isTerminalStatus(status: JobSnapshot[\"status\"]): boolean {\r\n return status === \"completed\" || status === \"killed\" || status === \"failed\";\r\n}\r\n\r\nconst JOB_KINDS = [\"terminal\", \"shell\", \"agent\", \"dream\", \"workflow\"] as const;\r\nconst JOB_STATUSES = [\"running\", \"stopping\", \"completed\", \"killed\", \"failed\"] as const;\r\n\r\ntype UnknownRecord = Record<string, unknown>;\r\n\r\nfunction isRecord(value: unknown): value is UnknownRecord {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction isJobSnapshot(value: unknown, ownerSession: string): value is JobSnapshot {\r\n if (!isRecord(value)) {\r\n return false;\r\n }\r\n\r\n const capabilities = value.capabilities;\r\n return (\r\n typeof value.id === \"string\" &&\r\n value.id.trim().length > 0 &&\r\n value.ownerSession === ownerSession &&\r\n typeof value.label === \"string\" &&\r\n typeof value.cwd === \"string\" &&\r\n typeof value.kind === \"string\" &&\r\n JOB_KINDS.includes(value.kind as (typeof JOB_KINDS)[number]) &&\r\n typeof value.status === \"string\" &&\r\n JOB_STATUSES.includes(value.status as (typeof JOB_STATUSES)[number]) &&\r\n Number.isFinite(value.startedAt) &&\r\n Number.isFinite(value.updatedAt) &&\r\n (value.finishedAt === undefined || Number.isFinite(value.finishedAt)) &&\r\n (value.detail === undefined || typeof value.detail === \"string\") &&\r\n (value.metadata === undefined || isRecord(value.metadata)) &&\r\n isRecord(capabilities) &&\r\n typeof capabilities.read === \"boolean\" &&\r\n typeof capabilities.wait === \"boolean\" &&\r\n typeof capabilities.send === \"boolean\" &&\r\n typeof capabilities.cancel === \"boolean\"\r\n );\r\n}\r\n\r\nexport function validateJobSnapshot(\r\n value: unknown,\r\n ownerSession: string,\r\n expectedJobId?: string,\r\n): { snapshot?: JobSnapshot; error?: string } {\r\n if (!isRecord(value)) {\r\n return { error: \"Job snapshot has invalid fields.\" };\r\n }\r\n if (typeof value.id === \"string\" && expectedJobId !== undefined && value.id !== expectedJobId) {\r\n return { error: `Job snapshot id \"${value.id}\" does not match requested Job \"${expectedJobId}\".` };\r\n }\r\n if (typeof value.ownerSession === \"string\" && value.ownerSession !== ownerSession) {\r\n return { error: `Job snapshot ownerSession \"${value.ownerSession}\" does not match active session \"${ownerSession}\".` };\r\n }\r\n if (!isJobSnapshot(value, ownerSession)) {\r\n return { error: \"Job snapshot has invalid fields.\" };\r\n }\r\n return { snapshot: value };\r\n}\r\n\r\nexport function validateJobReadResult(\r\n value: unknown,\r\n ownerSession: string,\r\n expectedJobId: string,\r\n): { result?: JobReadResult; error?: string } {\r\n if (\r\n !isRecord(value) ||\r\n typeof value.text !== \"string\" ||\r\n !Number.isFinite(value.cursor) ||\r\n typeof value.truncated !== \"boolean\" ||\r\n (value.details !== undefined && !isRecord(value.details))\r\n ) {\r\n return { error: `Job read response for \"${expectedJobId}\" has invalid fields.` };\r\n }\r\n const snapshotValidation = validateJobSnapshot(value.snapshot, ownerSession, expectedJobId);\r\n if (!snapshotValidation.snapshot) {\r\n return { error: snapshotValidation.error ?? \"Job snapshot has invalid fields.\" };\r\n }\r\n return { result: value as unknown as JobReadResult };\r\n}\r\n\r\nexport function validateJobSnapshots(\r\n value: unknown,\r\n ownerSession: string,\r\n): { jobs: JobSnapshot[]; error?: string } {\r\n if (!Array.isArray(value)) {\r\n return { jobs: [], error: \"Jobs response must be an array.\" };\r\n }\r\n\r\n const jobs = value.filter((entry): entry is JobSnapshot => isJobSnapshot(entry, ownerSession));\r\n const invalidCount = value.length - jobs.length;\r\n if (invalidCount === 0) {\r\n return { jobs };\r\n }\r\n\r\n const noun = invalidCount === 1 ? \"snapshot\" : \"snapshots\";\r\n return { jobs, error: `Ignored ${invalidCount} invalid Job ${noun}.` };\r\n}\r\n",
22
- "import {\r\n selectSessionMessagesWithParts,\r\n type SessionBucket,\r\n type SessionMessagePartRecord,\r\n type SessionMessageRecord,\r\n} from \"@openharness/client\";\r\n\r\nimport type { TranscriptItem } from \"../types\";\r\n\r\nexport type TranscriptView = { items: TranscriptItem[]; assistantBuffer: string };\r\n\r\nfunction contentToText(content: unknown): string {\r\n if (typeof content === \"string\") return content;\r\n if (Array.isArray(content)) {\r\n return content\r\n .map((block) => {\r\n if (block && typeof block === \"object\" && \"text\" in block) return String(block.text ?? \"\");\r\n return JSON.stringify(block);\r\n })\r\n .join(\"\");\r\n }\r\n if (content == null) return \"\";\r\n return JSON.stringify(content);\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return !!value && typeof value === \"object\" && !Array.isArray(value);\r\n}\r\n\r\nfunction textFromParts(parts: SessionMessagePartRecord[]): string {\r\n return parts\r\n .filter((part) => part.type === \"text\" || part.type === \"reasoning\")\r\n .map((part) => part.text ?? \"\")\r\n .join(\"\");\r\n}\r\n\r\nfunction messageToTranscriptItems(\r\n message: SessionMessageRecord,\r\n parts: SessionMessagePartRecord[],\r\n inputText?: string,\r\n): TranscriptItem[] {\r\n if (message.role === \"user\") {\r\n return [{\r\n id: message.inputId ? `input:${message.inputId}` : message.id,\r\n role: \"user\",\r\n text: textFromParts(parts) || inputText || \"\",\r\n }];\r\n }\r\n if (message.role === \"system\") return [{ id: message.id, role: \"system\", text: textFromParts(parts) }];\r\n\r\n const items: TranscriptItem[] = [];\r\n for (const part of parts) {\r\n if (part.type === \"text\" || part.type === \"reasoning\") {\r\n if (part.text) items.push({\r\n id: `${message.id}:${part.id}`,\r\n role: \"assistant\",\r\n text: part.text,\r\n streaming: part.status === \"pending\" || part.status === \"running\",\r\n });\r\n continue;\r\n }\r\n if (part.type === \"tool\") {\r\n const toolName = part.toolName ?? \"tool\";\r\n items.push({\r\n id: `${message.id}:${part.id}:tool`,\r\n role: \"tool\",\r\n text: toolName,\r\n tool_name: toolName,\r\n tool_input: part.input,\r\n });\r\n if (part.output !== undefined) {\r\n const output = isRecord(part.output) ? part.output : {};\r\n items.push({\r\n id: `${message.id}:${part.id}:result`,\r\n role: \"tool_result\",\r\n text: contentToText(output.content),\r\n tool_name: toolName,\r\n is_error: part.isError === true,\r\n });\r\n }\r\n continue;\r\n }\r\n if (part.type === \"tool_result\") {\r\n items.push({\r\n id: `${message.id}:${part.id}:result`,\r\n role: \"tool_result\",\r\n text: contentToText(part.output ?? part.text ?? \"\"),\r\n tool_name: part.toolName,\r\n is_error: part.isError === true,\r\n });\r\n continue;\r\n }\r\n if (part.type === \"error\") {\r\n items.push({ id: `${message.id}:${part.id}`, role: \"system\", text: part.text ?? \"error\" });\r\n continue;\r\n }\r\n if (part.type === \"log\") {\r\n items.push({ id: `${message.id}:${part.id}`, role: \"log\", text: part.text ?? \"\" });\r\n }\r\n }\r\n return items;\r\n}\r\n\r\nexport function bucketToTranscript(bucket: SessionBucket | undefined): TranscriptItem[] {\r\n if (!bucket) return [];\r\n const inputById = new Map(bucket.inputs.map((input) => [input.id, input]));\r\n const projectedInputIds = new Set<string>();\r\n const items: TranscriptItem[] = [];\r\n const activeRuns = Object.values(bucket.runs)\r\n .filter((run) => run.status === \"pending\" || run.status === \"running\");\r\n const activeRunInputIds = new Set(activeRuns.flatMap((run) => run.inputId ? [run.inputId] : []));\r\n const transcriptUpdatedAt = bucket.messages.reduce(\r\n (latest, message) => Math.max(latest, message.updatedAt),\r\n bucket.session?.updatedAt ?? 0,\r\n );\r\n\r\n for (const { message, parts } of selectSessionMessagesWithParts(bucket)) {\r\n if (message.role === \"user\" && message.inputId) projectedInputIds.add(message.inputId);\r\n items.push(...messageToTranscriptItems(\r\n message,\r\n parts,\r\n message.inputId ? inputById.get(message.inputId)?.content : undefined,\r\n ));\r\n }\r\n\r\n // Admission and transcript projection are separate daemon steps. Until the user message\r\n // exists, keep its input-backed placeholder at the canonical transcript tail. input.seq\r\n // and message.seq are independent counters and must never be compared. Transcript rewrites\r\n // such as compact/rewind drop historical inputId links, so old inputs are not placeholders.\r\n for (const input of [...bucket.inputs].sort((a, b) => a.seq - b.seq)) {\r\n if (projectedInputIds.has(input.id)) continue;\r\n const belongsToActiveRun = activeRunInputIds.has(input.id)\r\n || (input.delivery === \"steer\" && activeRuns.some((run) => input.createdAt >= run.createdAt));\r\n const admittedAfterTranscript = input.createdAt >= transcriptUpdatedAt;\r\n if (!belongsToActiveRun && !admittedAfterTranscript) continue;\r\n items.push({ id: `input:${input.id}`, role: \"user\", text: input.content });\r\n }\r\n return items;\r\n}\r\n\r\nexport function splitStreamingAssistant(items: TranscriptItem[]): TranscriptView {\r\n for (let index = items.length - 1; index >= 0; index -= 1) {\r\n const item = items[index];\r\n if (!item) continue;\r\n if (item.role !== \"assistant\" || item.streaming !== true || !item.text) continue;\r\n return {\r\n items: [\r\n ...items.slice(0, index),\r\n ...items.slice(index + 1),\r\n ],\r\n assistantBuffer: item.text,\r\n };\r\n }\r\n return { items, assistantBuffer: \"\" };\r\n}\r\n",
23
- "import type {\r\n CommandCatalogEntry,\r\n OpenHarnessClient,\r\n OpenHarnessClientState,\r\n PresentationReadRequest,\r\n SlashLine,\r\n} from \"@openharness/client\";\r\nimport {\r\n LOCAL_COMMAND_DETAILS,\r\n LOCAL_COMMAND_NAMES,\r\n dispatchSessionCommand,\r\n hasActiveRun,\r\n mergeCommandDetails,\r\n parseSlashLine,\r\n resolveSessionCwd,\r\n} from \"@openharness/client\";\r\nimport type { Dispatch, MutableRefObject, SetStateAction } from \"react\";\r\n\r\nimport type { FrontendConfig } from \"../types\";\r\n\r\nexport {\r\n LOCAL_COMMAND_DETAILS,\r\n LOCAL_COMMAND_NAMES,\r\n hasActiveRun,\r\n mergeCommandDetails,\r\n parseSlashLine,\r\n};\r\n\r\nexport type SessionSlashCtx = {\r\n client: OpenHarnessClient;\r\n sessionId: string | undefined;\r\n pushSystem: (text: string) => void;\r\n presentSystem: (title: string, content: string) => void;\r\n statusRef: MutableRefObject<Record<string, unknown>>;\r\n commandCatalogRef: MutableRefObject<CommandCatalogEntry[]>;\r\n clientState: OpenHarnessClientState;\r\n localBusy: boolean;\r\n cacheFirstRead?: (request: PresentationReadRequest) => void;\r\n daemon?: FrontendConfig[\"daemon\"];\r\n setStatus: Dispatch<SetStateAction<Record<string, unknown>>>;\r\n};\r\n\r\nexport async function dispatchSessionSlashCommand(\r\n slash: SlashLine | null,\r\n ctx: SessionSlashCtx,\r\n): Promise<\"handled\" | \"unhandled\" | \"local_ui_ignored\"> {\r\n const {\r\n client,\r\n sessionId,\r\n pushSystem,\r\n presentSystem,\r\n statusRef,\r\n commandCatalogRef,\r\n clientState,\r\n localBusy,\r\n cacheFirstRead,\r\n daemon,\r\n setStatus,\r\n } = ctx;\r\n\r\n const outcome = await dispatchSessionCommand(slash, {\r\n client,\r\n sessionId,\r\n cwd: resolveSessionCwd({\r\n statusCwd: statusRef.current.cwd,\r\n daemonCwd: daemon?.cwd ?? undefined,\r\n }),\r\n model: statusRef.current.model != null\r\n ? String(statusRef.current.model)\r\n : daemon?.model ?? undefined,\r\n permissionMode: typeof statusRef.current.permission_mode === \"string\"\r\n ? statusRef.current.permission_mode\r\n : undefined,\r\n statusSessionId: typeof statusRef.current.session_id === \"string\"\r\n ? statusRef.current.session_id\r\n : sessionId,\r\n commandCatalog: commandCatalogRef.current,\r\n clientState,\r\n busy: localBusy,\r\n emit: pushSystem,\r\n present: presentSystem,\r\n cacheFirstRead,\n getRuntimeDiagnostics: () => ({\n runtime: `Node ${process.version}`,\n platform: process.platform,\n architecture: process.arch,\n }),\n patchStatus: (patch) => setStatus((current) => ({ ...current, ...patch })),\n });\r\n\r\n if (outcome === \"local_ui\") return \"local_ui_ignored\";\r\n return outcome;\r\n}\r\n",
24
- "import { useCallback, useEffect, useMemo, useRef, useState, type SetStateAction } from \"react\";\r\nimport {\r\n OpenHarnessClient,\r\n createPromptRequestId,\r\n createInitialClientState,\r\n patchSessionRuntimeMetadata,\r\n readSessionRuntimeConfig,\r\n syncEvents,\r\n type CommandCatalogEntry,\r\n type McpServerStatus,\r\n type ModelProviderInfo,\r\n type OpenHarnessClientState,\r\n type PermissionRequestRecord,\r\n type PresentationReadRequest,\r\n type SessionRuntimeConfigPatch,\r\n type SessionBucket,\r\n type SessionRecord,\r\n type SyncEventUpdate,\r\n} from \"@openharness/client\";\r\n\r\nimport type { FrontendConfig, McpServerSnapshot, TranscriptItem } from \"../types\";\r\nimport {\r\n beginJobList,\r\n mergeJobSnapshot,\r\n rejectJobList,\r\n resolveJobList,\r\n validateJobReadResult,\r\n validateJobSnapshot,\r\n validateJobSnapshots,\r\n type JobDetailRemoteState,\r\n type JobRemoteState,\r\n} from \"../jobs/job-remote-state\";\r\nimport type { TuiAction, TuiSessionController } from \"./sessionController\";\r\nimport { bucketToTranscript, splitStreamingAssistant } from \"./transcript\";\r\nimport {\r\n dispatchSessionSlashCommand,\r\n hasActiveRun,\r\n mergeCommandDetails,\r\n parseSlashLine\r\n} from \"./sessionSlashCommands\";\r\n\r\nconst JOBS_AUXILIARY_SLASH_COMMANDS = new Set([\r\n \"/agents\",\r\n \"/background\",\r\n \"/doctor\",\r\n \"/jobs\",\r\n \"/stats\",\r\n]);\r\n\r\ntype DisplayRequest = NonNullable<TuiSessionController[\"displayRequest\"]>;\r\ntype PresentationCacheEntry = {\r\n title: string;\r\n content: string;\r\n updatedAt: number;\r\n};\r\n\r\nconst LIVE_TEXT_DELTA_FLUSH_MS = 33;\r\nconst PRESENTATION_LOADING_TEXT = \"Loading...\";\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return !!value && typeof value === \"object\" && !Array.isArray(value);\r\n}\r\n\r\nexport function sessionRuntimeMetadata(input: {\n model?: unknown;\r\n provider?: unknown;\r\n baseUrl?: unknown;\r\n apiFormat?: unknown;\r\n permissionMode?: unknown;\r\n maxTurns?: unknown;\r\n sessionMode?: unknown;\n pluginsEnabled?: unknown;\n}): Record<string, unknown> {\r\n const runtime: SessionRuntimeConfigPatch = {};\r\n if (typeof input.model === \"string\" && input.model) {\r\n runtime.model = input.model;\r\n }\r\n if (typeof input.provider === \"string\" && input.provider) {\r\n runtime.provider = input.provider;\r\n }\r\n if (typeof input.baseUrl === \"string\" && input.baseUrl) {\r\n runtime.baseUrl = input.baseUrl;\r\n }\r\n if (input.apiFormat === \"anthropic\" || input.apiFormat === \"openai\") {\r\n runtime.apiFormat = input.apiFormat;\r\n }\r\n if (input.permissionMode === \"default\" || input.permissionMode === \"plan\" || input.permissionMode === \"full_auto\") {\r\n runtime.permissionMode = input.permissionMode;\r\n }\r\n if (typeof input.maxTurns === \"number\" && Number.isFinite(input.maxTurns)) {\r\n runtime.maxTurns = input.maxTurns;\r\n }\r\n if (input.sessionMode === \"coordinator\" || input.sessionMode === \"direct\") {\n runtime.sessionMode = input.sessionMode;\r\n }\n if (typeof input.pluginsEnabled === \"boolean\") {\n runtime.pluginsEnabled = input.pluginsEnabled;\n }\n return patchSessionRuntimeMetadata({}, runtime);\r\n}\r\n\r\nfunction mcpServerSnapshot(server: McpServerStatus): McpServerSnapshot {\r\n return {\r\n name: server.name,\r\n state: server.status,\r\n ...(server.error || server.command ? { detail: server.error ?? server.command } : {}),\r\n tool_count: server.toolCount,\r\n resource_count: server.resourceCount,\r\n };\r\n}\r\n\r\nfunction normalizeSessionMode(value: unknown): \"coordinator\" | null {\r\n return value === \"coordinator\" ? \"coordinator\" : null;\r\n}\r\n\r\nfunction statusSessionMode(value: unknown): \"coordinator\" | \"direct\" {\r\n return normalizeSessionMode(value) ?? \"direct\";\r\n}\r\n\r\nfunction stringSetting(value: unknown): string | undefined {\r\n return typeof value === \"string\" && value.trim() ? value : undefined;\r\n}\r\n\r\ntype RecoverableRun = {\r\n id: string;\r\n error?: string;\r\n prompt: string;\r\n};\r\n\r\nfunction archiveClientSession(\r\n state: OpenHarnessClientState,\r\n sessionId: string,\r\n archivedAt: number\r\n): OpenHarnessClientState {\r\n const current = state.sessions[sessionId];\r\n if (!current || current.status === \"archived\") return state;\r\n const archived: SessionRecord = {\r\n ...current,\r\n status: \"archived\",\r\n archivedAt,\r\n updatedAt: Math.max(current.updatedAt, archivedAt),\r\n };\r\n const bucket = state.buckets[sessionId];\r\n return {\r\n ...state,\r\n sessions: { ...state.sessions, [sessionId]: archived },\r\n buckets: bucket\r\n ? { ...state.buckets, [sessionId]: { ...bucket, session: archived } }\r\n : state.buckets,\r\n };\r\n}\r\n\r\nfunction listTopLevelSessions(\r\n sessions: Iterable<SessionRecord>,\r\n activeSessionId?: string\r\n): SessionRecord[] {\r\n return [...sessions]\r\n .filter((session) => !session.parentId && session.status !== \"archived\")\r\n .sort((a, b) => {\r\n if (a.id === activeSessionId) return -1;\r\n if (b.id === activeSessionId) return 1;\r\n return b.updatedAt - a.updatedAt;\r\n });\r\n}\r\n\r\nfunction sessionSelectOptions(\r\n sessions: Iterable<SessionRecord>,\r\n activeSessionId?: string\r\n): NonNullable<TuiSessionController[\"selectRequest\"]>[\"options\"] {\r\n return listTopLevelSessions(sessions, activeSessionId).map((session) => ({\r\n value: session.id,\r\n label: `${session.id === activeSessionId ? \"* \" : \"\"}${session.title || session.id}`,\r\n description: `${session.model} | ${session.status}`,\r\n }));\r\n}\r\n\r\nexport function shouldAutoActivateSession(\n session: SessionRecord,\n defaultModel: string,\n pluginsEnabled: boolean | undefined | null,\n): boolean {\n const runtime = readSessionRuntimeConfig(session);\n return runtime.model === defaultModel\n && (pluginsEnabled == null || (runtime.pluginsEnabled ?? true) === pluginsEnabled);\n}\r\n\r\nfunction recoverableInterruptedRuns(bucket?: SessionBucket): RecoverableRun[] {\r\n if (!bucket) return [];\r\n const recoveredSourceRunIds = new Set(bucket.inputs.flatMap((input) => (isRecord(input.metadata.recovery) && typeof input.metadata.recovery.sourceRunId === \"string\" ? [input.metadata.recovery.sourceRunId] : [])));\r\n return Object.values(bucket.runs)\r\n .filter((run) => run.status === \"interrupted\" && !!run.inputId && !recoveredSourceRunIds.has(run.id))\r\n .sort((a, b) => b.updatedAt - a.updatedAt)\r\n .flatMap((run) => {\r\n const input = bucket.inputs.find((candidate) => candidate.id === run.inputId);\r\n return input ? [{ id: run.id, error: run.error, prompt: input.content }] : [];\r\n });\r\n}\r\n\r\nfunction shouldCoalesceClientState(update: SyncEventUpdate): boolean {\r\n return update.source === \"live\" && update.event?.type === \"session.message.part.delta\";\r\n}\r\n\r\nfunction permissionToModal(request: PermissionRequestRecord): Record<string, unknown> {\r\n const input = request.payload.input && typeof request.payload.input === \"object\" ? (request.payload.input as Record<string, unknown>) : {};\r\n return {\r\n kind: \"permission\",\r\n request_id: request.id,\r\n tool_name: request.toolName,\r\n reason: typeof request.payload.reason === \"string\" ? request.payload.reason : null,\r\n input,\r\n };\r\n}\r\n\r\nfunction firstPendingPermission(state: OpenHarnessClientState, sessionId?: string): PermissionRequestRecord | undefined {\r\n if (!sessionId) return undefined;\r\n const bucket = state.buckets[sessionId];\r\n if (!bucket) return undefined;\r\n return Object.values(bucket.permissions)\r\n .filter((request) => request.status === \"pending\")\r\n .sort((a, b) => a.createdAt - b.createdAt)\r\n .at(0);\r\n}\r\n\r\nexport function useServerSync(config: FrontendConfig, onError?: (message: string) => void): TuiSessionController {\r\n const daemon = config.daemon;\r\n const [clientState, setClientState] = useState<OpenHarnessClientState>(() => createInitialClientState());\r\n const [activeSessionId, setActiveSessionId] = useState<string | undefined>();\r\n const [status, setStatus] = useState<Record<string, unknown>>({\r\n permission_mode: daemon?.permissionMode ?? \"default\",\r\n model: daemon?.model ?? \"default\",\r\n session_mode: statusSessionMode(daemon?.sessionMode),\r\n ...(typeof daemon?.maxTurns === \"number\" ? { max_turns: daemon.maxTurns } : {}),\r\n });\r\n const [modal, setModal] = useState<Record<string, unknown> | null>(null);\r\n const [selectRequest, setSelectRequest] = useState<TuiSessionController[\"selectRequest\"]>(null);\r\n const [displayRequest, setDisplayRequest] = useState<TuiSessionController[\"displayRequest\"]>(null);\r\n const [localBusy, setLocalBusy] = useState(false);\r\n const [submittedRun, setSubmittedRun] = useState<{\r\n sessionId: string;\r\n runId: string;\r\n } | null>(null);\r\n const [ready, setReady] = useState(false);\r\n const [globalSystemItems, setGlobalSystemItems] = useState<TranscriptItem[]>([]);\r\n const [systemItemsBySession, setSystemItemsBySession] = useState<Record<string, TranscriptItem[]>>({});\r\n const [commandCatalog, setCommandCatalog] = useState<CommandCatalogEntry[]>([]);\r\n const [jobState, setJobState] = useState<JobRemoteState>({ status: \"idle\", jobs: [] });\r\n const [jobDetailState, setJobDetailState] = useState<JobDetailRemoteState>({ status: \"idle\" });\r\n const [mcpServers, setMcpServers] = useState<McpServerSnapshot[]>([]);\r\n const clientRef = useRef<OpenHarnessClient | null>(null);\r\n const activeSessionIdRef = useRef<string | undefined>(undefined);\r\n const commandCatalogRef = useRef<CommandCatalogEntry[]>([]);\r\n const defaultRuntimeRef = useRef<{\r\n model: string;\r\n provider?: string;\r\n baseUrl?: string;\r\n apiFormat?: \"anthropic\" | \"openai\";\r\n }>({\r\n model: daemon?.model ?? \"default\",\r\n });\r\n const nextSessionModeRef = useRef<\"coordinator\" | \"direct\">(statusSessionMode(daemon?.sessionMode));\r\n const statusRef = useRef(status);\r\n const sentInitialPromptRef = useRef(false);\r\n const pendingNewSessionTitleRef = useRef<string | undefined>(undefined);\r\n const listedSessionsRef = useRef<Record<string, SessionRecord>>({});\r\n const presentationCacheRef = useRef<Record<string, PresentationCacheEntry>>({});\r\n const displayRequestRef = useRef<TuiSessionController[\"displayRequest\"]>(null);\r\n const pendingClientStateRef = useRef<OpenHarnessClientState | null>(null);\r\n const pendingClientStateTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const shownPermissionIdRef = useRef<string | undefined>(undefined);\r\n const auxiliaryGenerationRef = useRef(0);\r\n const jobStateRef = useRef(jobState);\r\n const jobDetailStateRef = useRef(jobDetailState);\r\n const jobGenerationRef = useRef(0);\r\n const jobDetailGenerationRef = useRef(0);\r\n const jobsAbortRef = useRef<AbortController | null>(null);\r\n const jobDetailAbortRef = useRef<AbortController | null>(null);\r\n const jobControlAbortRef = useRef<AbortController | null>(null);\r\n const jobControlGenerationRef = useRef(0);\r\n const mcpAbortRef = useRef<AbortController | null>(null);\r\n const onErrorRef = useRef(onError);\r\n onErrorRef.current = onError;\r\n\r\n useEffect(() => {\r\n activeSessionIdRef.current = activeSessionId;\r\n }, [activeSessionId]);\r\n\r\n useEffect(() => {\r\n commandCatalogRef.current = commandCatalog;\r\n }, [commandCatalog]);\r\n\r\n useEffect(() => {\r\n statusRef.current = status;\r\n }, [status]);\r\n\r\n useEffect(() => {\r\n displayRequestRef.current = displayRequest;\r\n }, [displayRequest]);\r\n\r\n useEffect(() => {\r\n jobStateRef.current = jobState;\r\n }, [jobState]);\r\n\r\n useEffect(() => {\r\n jobDetailStateRef.current = jobDetailState;\r\n }, [jobDetailState]);\r\n\r\n const clearDisplayRequest = useCallback(() => {\r\n displayRequestRef.current = null;\r\n setDisplayRequest(null);\r\n }, []);\r\n\r\n const showDisplayRequest = useCallback((request: DisplayRequest) => {\r\n displayRequestRef.current = request;\r\n setSelectRequest(null);\r\n setDisplayRequest(request);\r\n }, []);\r\n\r\n const clearAuxiliaryState = useCallback((): void => {\r\n auxiliaryGenerationRef.current += 1;\r\n jobGenerationRef.current += 1;\r\n jobDetailGenerationRef.current += 1;\r\n jobControlGenerationRef.current += 1;\r\n mcpAbortRef.current?.abort();\r\n jobsAbortRef.current?.abort();\r\n jobDetailAbortRef.current?.abort();\r\n jobControlAbortRef.current?.abort();\r\n mcpAbortRef.current = null;\r\n jobsAbortRef.current = null;\r\n jobDetailAbortRef.current = null;\r\n jobControlAbortRef.current = null;\r\n const emptyJobState: JobRemoteState = { status: \"idle\", jobs: [] };\r\n const emptyJobDetailState: JobDetailRemoteState = { status: \"idle\" };\r\n jobStateRef.current = emptyJobState;\r\n jobDetailStateRef.current = emptyJobDetailState;\r\n setJobState(emptyJobState);\r\n setJobDetailState(emptyJobDetailState);\r\n setMcpServers([]);\r\n }, []);\r\n\r\n const setStatusAndDefault = useCallback((value: SetStateAction<Record<string, unknown>>) => {\r\n setStatus((current) => {\r\n const next = typeof value === \"function\" ? value(current) : value;\r\n if (typeof next.model === \"string\" && !activeSessionIdRef.current) {\r\n defaultRuntimeRef.current = {\r\n ...defaultRuntimeRef.current,\r\n model: next.model,\r\n ...(typeof next.provider === \"string\" ? { provider: next.provider } : {}),\r\n ...(typeof next.baseUrl === \"string\" ? { baseUrl: next.baseUrl } : {}),\r\n ...(next.apiFormat === \"anthropic\" || next.apiFormat === \"openai\" ? { apiFormat: next.apiFormat } : {}),\r\n };\r\n }\r\n return next;\r\n });\r\n }, []);\r\n\r\n const pushSystem = useCallback((text: string) => {\r\n const sessionId = activeSessionIdRef.current;\r\n if (!sessionId) {\r\n setGlobalSystemItems((items) => [...items, { role: \"system\", text }]);\r\n return;\r\n }\r\n setSystemItemsBySession((itemsBySession) => ({\r\n ...itemsBySession,\r\n [sessionId]: [...(itemsBySession[sessionId] ?? []), { role: \"system\", text }],\r\n }));\r\n }, []);\r\n\r\n const reportError = useCallback(\r\n (message: string) => {\r\n pushSystem(`error: ${message}`);\r\n onErrorRef.current?.(message);\r\n setLocalBusy(false);\r\n setSubmittedRun(null);\r\n },\r\n [pushSystem],\r\n );\r\n\r\n const reportAuxiliaryError = useCallback((scope: string, error: unknown): void => {\r\n const message = error instanceof Error ? error.message : String(error);\r\n onErrorRef.current?.(`${scope}: ${message}`);\r\n }, []);\r\n\r\n const refreshJobs = useCallback(async (): Promise<void> => {\r\n const client = clientRef.current;\r\n const sessionId = activeSessionIdRef.current;\r\n const generation = ++jobGenerationRef.current;\r\n if (!client || !sessionId) {\r\n const idle: JobRemoteState = { status: \"idle\", jobs: [] };\r\n jobStateRef.current = idle;\r\n setJobState(idle);\r\n return;\r\n }\r\n\r\n jobsAbortRef.current?.abort();\r\n const controller = new AbortController();\r\n jobsAbortRef.current = controller;\r\n setJobState((current) => {\r\n const next = beginJobList(current);\r\n jobStateRef.current = next;\r\n return next;\r\n });\r\n\r\n try {\r\n const response = await client.listJobs({\r\n sessionId,\r\n includeFinished: true,\r\n limit: 100,\r\n signal: controller.signal,\r\n });\r\n if (activeSessionIdRef.current !== sessionId || jobGenerationRef.current !== generation) return;\r\n const validated = validateJobSnapshots(response, sessionId);\r\n if (validated.error) {\r\n const validationError = validated.error;\r\n const now = Date.now();\r\n setJobState((current) => {\r\n const next: JobRemoteState = validated.jobs.length > 0\r\n ? {\r\n ...resolveJobList(validated.jobs, now, current),\r\n status: \"error\",\r\n error: validationError,\r\n }\r\n : rejectJobList(current, validationError);\r\n jobStateRef.current = next;\r\n return next;\r\n });\r\n reportAuxiliaryError(\"Jobs\", validationError);\r\n } else {\r\n const next = resolveJobList(validated.jobs, Date.now(), jobStateRef.current);\r\n jobStateRef.current = next;\r\n setJobState(next);\r\n }\r\n } catch (error) {\r\n if (controller.signal.aborted) return;\r\n if (activeSessionIdRef.current !== sessionId || jobGenerationRef.current !== generation) return;\r\n const message = error instanceof Error ? error.message : String(error);\r\n setJobState((current) => {\r\n const next = rejectJobList(current, message);\r\n jobStateRef.current = next;\r\n return next;\r\n });\r\n reportAuxiliaryError(\"Jobs\", message);\r\n } finally {\r\n if (jobsAbortRef.current === controller) jobsAbortRef.current = null;\r\n }\r\n }, [reportAuxiliaryError]);\r\n\r\n const loadJobDetail = useCallback(async (\r\n client: OpenHarnessClient,\r\n sessionId: string,\r\n jobId: string,\r\n ): Promise<void> => {\r\n const generation = ++jobDetailGenerationRef.current;\r\n jobDetailAbortRef.current?.abort();\r\n const controller = new AbortController();\r\n jobDetailAbortRef.current = controller;\r\n const current = jobDetailStateRef.current;\r\n const previous = current.status !== \"idle\" && current.jobId === jobId\r\n ? current.status === \"ready\"\r\n ? current.result\r\n : current.previous\r\n : undefined;\r\n const loading: JobDetailRemoteState = {\r\n status: \"loading\",\r\n jobId,\r\n ...(previous ? { previous } : {}),\r\n };\r\n jobDetailStateRef.current = loading;\r\n setJobDetailState(loading);\r\n\r\n try {\r\n const response = await client.readJob(jobId, {\r\n sessionId,\r\n signal: controller.signal,\r\n });\r\n if (activeSessionIdRef.current !== sessionId || jobDetailGenerationRef.current !== generation) return;\r\n const validated = validateJobReadResult(response, sessionId, jobId);\r\n if (!validated.result) {\r\n throw new Error(validated.error ?? `Job read response for \"${jobId}\" has invalid fields.`);\r\n }\r\n const result = validated.result;\r\n const readyState: JobDetailRemoteState = {\r\n status: \"ready\",\r\n jobId,\r\n result,\r\n refreshedAt: Date.now(),\r\n };\r\n jobDetailStateRef.current = readyState;\r\n setJobDetailState(readyState);\r\n } catch (error) {\r\n if (controller.signal.aborted) return;\r\n if (activeSessionIdRef.current !== sessionId || jobDetailGenerationRef.current !== generation) return;\r\n const message = error instanceof Error ? error.message : String(error);\r\n const errorState: JobDetailRemoteState = {\r\n status: \"error\",\r\n jobId,\r\n error: message,\r\n ...(previous ? { previous } : {}),\r\n };\r\n jobDetailStateRef.current = errorState;\r\n setJobDetailState(errorState);\r\n reportAuxiliaryError(\"Jobs\", message);\r\n } finally {\r\n if (jobDetailAbortRef.current === controller) jobDetailAbortRef.current = null;\r\n }\r\n }, [reportAuxiliaryError]);\r\n\r\n const loadModels = useCallback(async (): Promise<ModelProviderInfo[]> => {\r\n const client = clientRef.current;\r\n if (!client) return [];\r\n return await client.listModels();\r\n }, []);\r\n\r\n const cacheFirstRead = useCallback(\r\n (request: PresentationReadRequest): void => {\r\n const cached = presentationCacheRef.current[request.key];\r\n showDisplayRequest({\r\n key: request.key,\r\n title: request.title,\r\n content: cached?.content ?? PRESENTATION_LOADING_TEXT,\r\n });\r\n\r\n void request\r\n .load()\r\n .then((content) => {\r\n presentationCacheRef.current = {\r\n ...presentationCacheRef.current,\r\n [request.key]: {\r\n title: request.title,\r\n content,\r\n updatedAt: Date.now(),\r\n },\r\n };\r\n if (displayRequestRef.current?.key !== request.key) return;\r\n showDisplayRequest({\r\n key: request.key,\r\n title: request.title,\r\n content,\r\n });\r\n })\r\n .catch((error) => {\r\n const message = error instanceof Error ? error.message : String(error);\r\n const content = cached ? `${cached.content}\\n\\nRefresh failed: ${message}` : `Failed to load ${request.title}: ${message}`;\r\n if (displayRequestRef.current?.key !== request.key) return;\r\n showDisplayRequest({\r\n key: request.key,\r\n title: request.title,\r\n content,\r\n });\r\n });\r\n },\r\n [showDisplayRequest],\r\n );\r\n\r\n const clearPendingClientState = useCallback(() => {\r\n if (pendingClientStateTimerRef.current) {\r\n clearTimeout(pendingClientStateTimerRef.current);\r\n pendingClientStateTimerRef.current = null;\r\n }\r\n pendingClientStateRef.current = null;\r\n }, []);\r\n\r\n const commitClientState = useCallback(\r\n (state: OpenHarnessClientState, coalesce: boolean) => {\r\n if (!coalesce) {\r\n clearPendingClientState();\r\n setClientState(state);\r\n return;\r\n }\r\n\r\n pendingClientStateRef.current = state;\r\n if (pendingClientStateTimerRef.current) return;\r\n pendingClientStateTimerRef.current = setTimeout(() => {\r\n pendingClientStateTimerRef.current = null;\r\n const pending = pendingClientStateRef.current;\r\n pendingClientStateRef.current = null;\r\n if (pending) setClientState(pending);\r\n }, LIVE_TEXT_DELTA_FLUSH_MS);\r\n },\r\n [clearPendingClientState],\r\n );\r\n\r\n useEffect(() => clearPendingClientState, [clearPendingClientState]);\r\n\r\n const activateSession = useCallback(\r\n (session: SessionRecord): void => {\r\n const runtime = readSessionRuntimeConfig(session, defaultRuntimeRef.current);\r\n activeSessionIdRef.current = session.id;\r\n setActiveSessionId(session.id);\r\n clearAuxiliaryState();\r\n setStatus((current) => ({\r\n ...current,\r\n model: runtime.model,\r\n ...(runtime.provider ? { provider: runtime.provider } : {}),\r\n session_id: session.id,\r\n cwd: session.cwd,\r\n permission_mode: typeof runtime.permissionMode === \"string\" ? runtime.permissionMode : current.permission_mode,\r\n ...(typeof runtime.maxTurns === \"number\" ? { max_turns: runtime.maxTurns } : {}),\r\n session_mode: statusSessionMode(runtime.sessionMode),\r\n }));\r\n },\r\n [clearAuxiliaryState],\r\n );\r\n\r\n const returnToHome = useCallback(\r\n (title?: string): void => {\r\n pendingNewSessionTitleRef.current = title?.trim() || undefined;\r\n activeSessionIdRef.current = undefined;\r\n setActiveSessionId(undefined);\r\n clearAuxiliaryState();\r\n setLocalBusy(false);\r\n setSubmittedRun(null);\r\n setSelectRequest(null);\r\n clearDisplayRequest();\r\n setModal(null);\r\n setStatus((current) => {\r\n const next = { ...current };\r\n delete next.session_id;\r\n next.model = defaultRuntimeRef.current.model;\r\n if (defaultRuntimeRef.current.provider) next.provider = defaultRuntimeRef.current.provider;\r\n else delete next.provider;\r\n next.session_mode = nextSessionModeRef.current;\r\n return next;\r\n });\r\n },\r\n [clearAuxiliaryState, clearDisplayRequest],\r\n );\r\n\r\n useEffect(() => {\r\n if (!daemon?.url) {\r\n setReady(true);\r\n reportError(\"Daemon URL is required for TUI. Launch with `ohs` or `ohs --tui` so the CLI can start or attach the daemon.\");\r\n return;\r\n }\r\n let cancelled = false;\r\n const client = new OpenHarnessClient({\r\n baseUrl: daemon.url,\r\n token: daemon.token ?? undefined,\r\n });\r\n clientRef.current = client;\r\n\r\n void (async () => {\r\n try {\r\n await client.health();\r\n const cwd = daemon.cwd ?? process.cwd();\r\n const [settings, sessions, commands] = await Promise.all([client.getSettings().catch(() => ({}) as Record<string, unknown>), client.listSessions({ cwd, limit: 20 }), client.listCommands({ cwd }).catch(() => [] as CommandCatalogEntry[])]);\r\n const model = daemon.model ?? stringSetting(settings.model) ?? \"default\";\r\n const provider = stringSetting(settings.provider);\r\n const baseUrl = stringSetting(settings.baseUrl);\r\n const apiFormat = settings.apiFormat === \"anthropic\" || settings.apiFormat === \"openai\" ? settings.apiFormat : undefined;\r\n defaultRuntimeRef.current = {\r\n model,\r\n ...(provider ? { provider } : {}),\r\n ...(baseUrl ? { baseUrl } : {}),\r\n ...(apiFormat ? { apiFormat } : {}),\r\n };\r\n if (cancelled) return;\r\n listedSessionsRef.current = Object.fromEntries(sessions.map((session) => [session.id, session]));\r\n setCommandCatalog(commands);\r\n setStatus((current) => ({\r\n ...current,\r\n model,\r\n ...(provider ? { provider } : {}),\r\n cwd,\r\n permission_mode: daemon?.permissionMode ?? current.permission_mode,\r\n ...(typeof daemon?.maxTurns === \"number\" ? { max_turns: daemon.maxTurns } : {}),\r\n session_mode: statusSessionMode(daemon?.sessionMode),\r\n }));\r\n const session = sessions[0];\r\n if (session && shouldAutoActivateSession(session, model, daemon?.pluginsEnabled)) {\n activateSession(session);\r\n void client.getSession(session.id).catch(() => {});\r\n }\r\n setReady(true);\r\n } catch (error) {\r\n if (cancelled) return;\r\n setReady(true);\r\n reportError(error instanceof Error ? error.message : String(error));\r\n }\r\n })();\r\n\r\n return () => {\r\n cancelled = true;\r\n clientRef.current = null;\r\n };\r\n }, [activateSession, daemon?.cwd, daemon?.maxTurns, daemon?.model, daemon?.permissionMode, daemon?.pluginsEnabled, daemon?.sessionMode, daemon?.token, daemon?.url, reportError]);\n\r\n useEffect(() => {\r\n const client = clientRef.current;\r\n if (!client || !activeSessionId) return;\r\n const controller = new AbortController();\r\n\r\n void (async () => {\r\n let reconnectNotice = false;\r\n try {\r\n for await (const update of syncEvents(client, {\r\n sessionId: activeSessionId,\r\n signal: controller.signal,\r\n })) {\r\n if (update.source === \"reconnecting\") {\r\n if (!reconnectNotice) {\r\n reconnectNotice = true;\r\n pushSystem(\"reconnecting...\");\r\n }\r\n continue;\r\n }\r\n if (reconnectNotice) reconnectNotice = false;\r\n commitClientState(update.state, shouldCoalesceClientState(update));\r\n }\r\n } catch (error) {\r\n if (controller.signal.aborted) return;\r\n reportError(error instanceof Error ? error.message : String(error));\r\n }\r\n })();\r\n\r\n return () => {\r\n clearPendingClientState();\r\n controller.abort();\r\n };\r\n }, [activeSessionId, clearPendingClientState, commitClientState, pushSystem, reportError]);\r\n\r\n useEffect(() => {\r\n const client = clientRef.current;\r\n const sessionId = activeSessionId;\r\n if (!client || !sessionId) return;\r\n const generation = ++auxiliaryGenerationRef.current;\r\n mcpAbortRef.current?.abort();\r\n const controller = new AbortController();\r\n mcpAbortRef.current = controller;\r\n const isCurrent = () => activeSessionIdRef.current === sessionId && auxiliaryGenerationRef.current === generation;\r\n\r\n void client.getSessionMcp(sessionId, { signal: controller.signal })\r\n .then((servers) => {\r\n if (!isCurrent()) return;\r\n setMcpServers(Array.isArray(servers) ? servers.map(mcpServerSnapshot) : []);\r\n })\r\n .catch((error) => {\r\n if (controller.signal.aborted) return;\r\n if (!isCurrent()) return;\r\n setMcpServers([]);\r\n reportAuxiliaryError(\"MCP\", error);\r\n })\r\n .finally(() => {\r\n if (mcpAbortRef.current === controller) mcpAbortRef.current = null;\r\n });\r\n\r\n return () => {\r\n controller.abort();\r\n };\r\n }, [activeSessionId, reportAuxiliaryError]);\r\n\r\n useEffect(() => {\r\n jobDetailGenerationRef.current += 1;\r\n jobDetailAbortRef.current?.abort();\r\n jobDetailAbortRef.current = null;\r\n const idle: JobDetailRemoteState = { status: \"idle\" };\r\n jobDetailStateRef.current = idle;\r\n setJobDetailState(idle);\r\n void refreshJobs();\r\n return () => {\r\n jobsAbortRef.current?.abort();\r\n };\r\n }, [activeSessionId, refreshJobs]);\r\n\r\n useEffect(() => {\r\n const pending = firstPendingPermission(clientState, activeSessionId);\r\n if (!pending) {\r\n shownPermissionIdRef.current = undefined;\r\n if (modal?.kind === \"permission\") setModal(null);\r\n return;\r\n }\r\n if (shownPermissionIdRef.current === pending.id) return;\r\n shownPermissionIdRef.current = pending.id;\r\n setModal(permissionToModal(pending));\r\n }, [activeSessionId, clientState, modal?.kind]);\r\n\r\n const running = hasActiveRun(clientState, activeSessionId);\r\n useEffect(() => {\r\n if (!submittedRun) return;\r\n const run = clientState.buckets[submittedRun.sessionId]?.runs[submittedRun.runId];\r\n if (!run || run.status === \"pending\" || run.status === \"running\") return;\r\n void refreshJobs();\r\n if (run.status === \"failed\") {\r\n reportError(run.error ?? \"Agent run failed\");\r\n return;\r\n }\r\n setSubmittedRun(null);\r\n }, [clientState, refreshJobs, reportError, submittedRun]);\r\n\r\n const createAndSwitchSession = useCallback(\r\n async (title?: string): Promise<SessionRecord | undefined> => {\r\n const client = clientRef.current;\r\n if (!client) return undefined;\r\n setLocalBusy(true);\r\n const cwd = daemon?.cwd ?? process.cwd();\r\n const model = defaultRuntimeRef.current.model;\r\n const metadata = sessionRuntimeMetadata({\r\n model,\r\n provider: defaultRuntimeRef.current.provider,\r\n baseUrl: defaultRuntimeRef.current.baseUrl,\r\n apiFormat: defaultRuntimeRef.current.apiFormat,\r\n permissionMode: statusRef.current.permission_mode ?? daemon?.permissionMode ?? \"default\",\r\n maxTurns: statusRef.current.max_turns ?? daemon?.maxTurns,\r\n sessionMode: nextSessionModeRef.current,\n pluginsEnabled: daemon?.pluginsEnabled,\n });\r\n const session = await client.createSession({\r\n cwd,\r\n model,\r\n title: title?.trim() || \"TUI\",\r\n metadata,\r\n });\r\n activateSession(session);\r\n setSelectRequest(null);\r\n setLocalBusy(false);\r\n setSubmittedRun(null);\r\n pendingNewSessionTitleRef.current = undefined;\r\n return session;\r\n },\r\n [activateSession, daemon?.cwd, daemon?.maxTurns, daemon?.model, daemon?.permissionMode, daemon?.pluginsEnabled, daemon?.sessionMode],\n );\r\n\r\n useEffect(() => {\r\n if (!ready || sentInitialPromptRef.current || !config.initial_prompt) return;\r\n sentInitialPromptRef.current = true;\r\n const client = clientRef.current;\r\n if (!client) return;\r\n setLocalBusy(true);\r\n void (async () => {\r\n const session = activeSessionId ? (clientState.sessions[activeSessionId] ?? (await client.getSession(activeSessionId))) : await createAndSwitchSession();\r\n if (!session) {\r\n setLocalBusy(false);\r\n return;\r\n }\r\n const response = await client.admitPrompt(session.id, {\r\n id: createPromptRequestId(),\r\n content: config.initial_prompt!,\r\n });\r\n setLocalBusy(false);\r\n setSubmittedRun(response.run ? { sessionId: session.id, runId: response.run.id } : null);\r\n })().catch((error) => reportError(error instanceof Error ? error.message : String(error)));\r\n }, [activeSessionId, clientState.sessions, config.initial_prompt, createAndSwitchSession, ready, reportError]);\r\n\r\n const sendRequest = useCallback(\r\n (action: TuiAction): void => {\r\n const client = clientRef.current;\r\n let sessionId = activeSessionIdRef.current;\r\n\r\n void (async () => {\r\n const runtimeAction = action as TuiAction | { type?: unknown };\r\n const runtimeType = typeof runtimeAction.type === \"string\" ? runtimeAction.type : \"unknown\";\r\n switch (action.type) {\r\n case \"select_model\": {\r\n if (!client) return;\r\n const model = action.model.trim();\r\n const provider = action.provider?.trim() ?? \"\";\r\n if (!model) return;\r\n\r\n if (sessionId) {\r\n const session = await client.updateSession(sessionId, {\r\n metadata: patchSessionRuntimeMetadata(\r\n {},\r\n {\r\n model,\r\n ...(provider ? { provider } : {}),\r\n },\r\n ),\r\n });\r\n activateSession(session);\r\n } else {\r\n const settingsPatch: Record<string, unknown> = { model };\r\n if (provider) settingsPatch.provider = provider;\r\n await client.patchSettings(settingsPatch);\r\n defaultRuntimeRef.current = {\r\n ...defaultRuntimeRef.current,\r\n model,\r\n ...(provider ? { provider } : {}),\r\n };\r\n setStatus((current) => ({\r\n ...current,\r\n model,\r\n ...(provider ? { provider } : {}),\r\n }));\r\n }\r\n pushSystem(`Model selected: ${model}`);\r\n return;\r\n }\r\n\r\n case \"submit_line\": {\r\n if (!client) return;\r\n const line = action.line;\r\n const slash = parseSlashLine(line);\r\n\r\n const newSession = line.match(/^\\/new(?:\\s+(.+))?$/);\r\n if (newSession) {\r\n returnToHome(newSession[1]);\r\n return;\r\n }\r\n const switchSession = line.match(/^\\/sessions\\s+open\\s+(.+)$/);\r\n if (switchSession?.[1]) {\r\n const target = switchSession[1].trim();\r\n setLocalBusy(false);\r\n setSubmittedRun(null);\r\n pendingNewSessionTitleRef.current = undefined;\r\n setSelectRequest(null);\r\n const knownSession = clientState.sessions[target] ?? listedSessionsRef.current[target];\r\n if (knownSession) {\r\n activateSession(knownSession);\r\n return;\r\n }\r\n const session = await client.getSession(target);\r\n activateSession(session);\r\n return;\r\n }\r\n\r\n if (slash?.name === \"/resume\") {\r\n if (!sessionId) {\r\n pushSystem(\"No active session to resume.\");\r\n return;\r\n }\r\n const recoverable = recoverableInterruptedRuns(clientState.buckets[sessionId]);\r\n if (!slash.args) {\r\n if (recoverable.length === 0) {\r\n pushSystem(\"No interrupted prompt runs are available to resume.\");\r\n return;\r\n }\r\n clearDisplayRequest();\r\n setSelectRequest({\r\n title: \"Resume interrupted run\",\r\n submitPrefix: \"/resume \",\r\n options: recoverable.map((run) => ({\r\n value: run.id,\r\n label: run.prompt.length > 72 ? `${run.prompt.slice(0, 72)}...` : run.prompt,\r\n description: run.error ?? \"Interrupted before completion\",\r\n })),\r\n });\r\n return;\r\n }\r\n const runId = slash.args.trim();\r\n if (!recoverable.some((run) => run.id === runId)) {\r\n pushSystem(`Run is not available for recovery: ${runId}`);\r\n return;\r\n }\r\n setLocalBusy(true);\r\n const response = await client.resumeInterruptedRun(sessionId, runId, { id: createPromptRequestId() });\r\n setLocalBusy(false);\r\n setSubmittedRun(response.run ? { sessionId, runId: response.run.id } : null);\r\n setSelectRequest(null);\r\n return;\r\n }\r\n\r\n let slashResult: Awaited<ReturnType<typeof dispatchSessionSlashCommand>>;\r\n try {\r\n slashResult = await dispatchSessionSlashCommand(slash, {\r\n client,\r\n sessionId,\r\n pushSystem,\r\n presentSystem: (title, content) => showDisplayRequest({ title, content }),\r\n statusRef,\r\n commandCatalogRef,\r\n clientState,\r\n localBusy,\r\n cacheFirstRead,\r\n daemon,\r\n setStatus: setStatusAndDefault,\r\n });\r\n } catch (error) {\r\n if (slash && JOBS_AUXILIARY_SLASH_COMMANDS.has(slash.name)) {\r\n reportAuxiliaryError(\"Jobs\", error);\r\n return;\r\n }\r\n throw error;\r\n }\r\n if (slashResult === \"handled\") {\r\n if (slash?.name === \"/background\" && slash.args.trim() && sessionId) {\r\n await refreshJobs();\r\n }\r\n return;\r\n }\r\n if (slashResult === \"local_ui_ignored\") return;\r\n\r\n if (slash) {\r\n const catalogEntry = commandCatalogRef.current.find((entry) => entry.name === slash.name);\r\n if (catalogEntry?.kind === \"template\") {\r\n if (!sessionId) return;\r\n setLocalBusy(true);\r\n const commandName = slash.name.replace(/^\\//, \"\");\n const response = await client.admitPrompt(sessionId, {\n id: createPromptRequestId(),\n content: slash.args,\n metadata: {\n skillInvocation: {\n name: commandName,\n commandName,\n ...(catalogEntry.displayName ? { displayName: catalogEntry.displayName } : {}),\n source: catalogEntry.source,\n invocationSource: \"slash\",\n },\n },\n });\n setLocalBusy(false);\r\n setSubmittedRun(response.run ? { sessionId, runId: response.run.id } : null);\r\n return;\r\n }\r\n pushSystem(`Unknown command: ${slash.name}`);\r\n return;\r\n }\r\n\r\n if (!sessionId) {\r\n const session = await createAndSwitchSession(pendingNewSessionTitleRef.current);\r\n if (!session) return;\r\n sessionId = session.id;\r\n }\r\n setLocalBusy(true);\r\n const response = await client.admitPrompt(sessionId, {\r\n id: createPromptRequestId(),\r\n content: line,\r\n });\r\n setLocalBusy(false);\r\n setSubmittedRun(response.run ? { sessionId, runId: response.run.id } : null);\r\n return;\r\n }\r\n\r\n case \"delete_session\": {\r\n if (!client) return;\r\n const target = action.session_id;\r\n if (!target) return;\r\n const archived = await client.archiveSession(target);\r\n const archivedAt = archived.archivedAt ?? Date.now();\r\n delete listedSessionsRef.current[target];\r\n setClientState((current) => archiveClientSession(current, target, archivedAt));\r\n setLocalBusy(false);\r\n setSubmittedRun(null);\r\n setSelectRequest((current) =>\r\n current\r\n ? {\r\n ...current,\r\n options: current.options.filter((option) => option.value !== target),\r\n }\r\n : current,\r\n );\r\n if (target === activeSessionIdRef.current) {\r\n const remaining = listTopLevelSessions(\r\n Object.values({\r\n ...clientState.sessions,\r\n ...listedSessionsRef.current,\r\n [target]: { ...archived, status: \"archived\", archivedAt },\r\n }),\r\n );\r\n if (remaining[0]) {\r\n activateSession(remaining[0]);\r\n } else {\r\n const sessions = await client.listSessions({\r\n cwd: daemon?.cwd ?? undefined,\r\n includeArchived: false,\r\n limit: 20,\r\n });\r\n listedSessionsRef.current = Object.fromEntries(sessions.map((session) => [session.id, session]));\r\n const remoteNext = sessions.find((session) => session.id !== target);\r\n if (remoteNext) activateSession(remoteNext);\r\n else returnToHome();\r\n }\r\n }\r\n return;\r\n }\r\n\r\n case \"interrupt\": {\r\n if (!client) return;\r\n if (sessionId) await client.interruptSession(sessionId);\r\n setLocalBusy(false);\r\n setSubmittedRun(null);\r\n return;\r\n }\r\n\r\n case \"permission_response\": {\r\n if (!client) return;\r\n const requestId = action.request_id;\r\n const allowed = action.allowed;\r\n await client.replyPermission(requestId, {\r\n status: allowed ? \"approved\" : \"denied\",\r\n decision: action.scope === \"session\" ? \"session\" : \"once\",\r\n clientId: \"tui\",\r\n });\r\n setModal(null);\r\n return;\r\n }\r\n\r\n case \"list_sessions\": {\r\n if (!client) return;\r\n const cachedSessions = {\r\n ...listedSessionsRef.current,\r\n ...clientState.sessions,\r\n };\r\n const cachedOptions = sessionSelectOptions(Object.values(cachedSessions), activeSessionIdRef.current);\r\n clearDisplayRequest();\r\n setSelectRequest({\r\n title: \"Sessions\",\r\n submitPrefix: \"/sessions open \",\r\n options: cachedOptions,\r\n });\r\n const sessions = await client.listSessions({\r\n cwd: daemon?.cwd ?? undefined,\r\n includeArchived: false,\r\n limit: 20,\r\n });\r\n listedSessionsRef.current = Object.fromEntries(sessions.map((session) => [session.id, session]));\r\n setSelectRequest((current) =>\r\n current?.submitPrefix === \"/sessions open \"\r\n ? {\r\n title: \"Sessions\",\r\n submitPrefix: \"/sessions open \",\r\n options: sessionSelectOptions(sessions, activeSessionIdRef.current),\r\n }\r\n : current,\r\n );\r\n return;\r\n }\r\n\r\n case \"set_permission_mode\": {\r\n if (!client) return;\r\n const mode = action.permission_mode;\r\n setStatus((current) => ({ ...current, permission_mode: mode }));\r\n if (sessionId) {\r\n await client.updateSession(sessionId, {\r\n metadata: patchSessionRuntimeMetadata({}, { permissionMode: mode }),\r\n });\r\n }\r\n return;\r\n }\r\n\r\n case \"question_response\": {\r\n if (!client) return;\r\n reportError(\"Interactive question responses are not available through the daemon client.\");\r\n return;\r\n }\r\n\r\n case \"set_session_mode\": {\r\n if (!client) return;\r\n if (sessionId) {\r\n pushSystem(\"Coordinator mode can only be changed before starting a new session. Use /new first.\");\r\n return;\r\n }\r\n const mode = normalizeSessionMode(action.session_mode);\r\n nextSessionModeRef.current = statusSessionMode(mode);\r\n setStatus((current) => ({\r\n ...current,\r\n session_mode: nextSessionModeRef.current,\r\n }));\r\n return;\r\n }\r\n\r\n case \"job_request\": {\r\n if (!client) {\r\n reportAuxiliaryError(\"Jobs\", \"The daemon client is not connected.\");\r\n return;\r\n }\r\n const currentSessionId = activeSessionIdRef.current;\r\n if (!currentSessionId) return;\r\n try {\r\n switch (action.job_action) {\r\n case \"open\":\r\n await refreshJobs();\r\n return;\r\n case \"refresh\": {\r\n jobControlGenerationRef.current += 1;\r\n jobControlAbortRef.current?.abort();\r\n jobControlAbortRef.current = null;\r\n const detail = jobDetailStateRef.current;\r\n const detailJobId = detail.status === \"idle\" ? undefined : detail.jobId;\r\n await Promise.all([\r\n refreshJobs(),\r\n detailJobId\r\n ? loadJobDetail(client, currentSessionId, detailJobId)\r\n : Promise.resolve(),\r\n ]);\r\n return;\r\n }\r\n case \"select\":\r\n jobControlGenerationRef.current += 1;\r\n jobControlAbortRef.current?.abort();\r\n jobControlAbortRef.current = null;\r\n await loadJobDetail(client, currentSessionId, action.job_id);\r\n return;\r\n case \"cancel\": {\r\n const controlGeneration = ++jobControlGenerationRef.current;\r\n const detailGeneration = jobDetailGenerationRef.current;\r\n jobControlAbortRef.current?.abort();\r\n const controller = new AbortController();\r\n jobControlAbortRef.current = controller;\r\n let response: Awaited<ReturnType<OpenHarnessClient[\"cancelJob\"]>>;\r\n try {\r\n response = await client.cancelJob(\r\n action.job_id,\r\n {\r\n sessionId: currentSessionId,\r\n reason: action.reason,\r\n },\r\n { signal: controller.signal },\r\n );\r\n } catch (error) {\r\n if (activeSessionIdRef.current !== currentSessionId) return;\r\n if (controller.signal.aborted || jobControlGenerationRef.current !== controlGeneration) {\r\n await refreshJobs();\r\n return;\r\n }\r\n throw error;\r\n } finally {\r\n if (jobControlAbortRef.current === controller) jobControlAbortRef.current = null;\r\n }\r\n if (activeSessionIdRef.current !== currentSessionId) return;\r\n const ownsDetail = !controller.signal.aborted &&\r\n jobControlGenerationRef.current === controlGeneration &&\r\n jobDetailGenerationRef.current === detailGeneration;\r\n const validated = validateJobSnapshot(response, currentSessionId, action.job_id);\r\n if (!validated.snapshot) {\r\n if (controller.signal.aborted || jobControlGenerationRef.current !== controlGeneration) {\r\n await refreshJobs();\r\n return;\r\n }\r\n throw new Error(validated.error ?? \"Job snapshot has invalid fields.\");\r\n }\r\n const snapshot = validated.snapshot;\r\n const next = mergeJobSnapshot(jobStateRef.current, snapshot, Date.now());\r\n jobStateRef.current = next;\r\n setJobState(next);\r\n if (ownsDetail) {\r\n await loadJobDetail(client, currentSessionId, action.job_id);\r\n }\r\n await refreshJobs();\r\n return;\r\n }\r\n case \"send\": {\r\n const controlGeneration = ++jobControlGenerationRef.current;\r\n const detailGeneration = jobDetailGenerationRef.current;\r\n jobControlAbortRef.current?.abort();\r\n const controller = new AbortController();\r\n jobControlAbortRef.current = controller;\r\n try {\r\n await client.sendJob(\r\n action.job_id,\r\n {\r\n sessionId: currentSessionId,\r\n data: action.data,\r\n },\r\n { signal: controller.signal },\r\n );\r\n } catch (error) {\r\n if (activeSessionIdRef.current !== currentSessionId) return;\r\n if (controller.signal.aborted || jobControlGenerationRef.current !== controlGeneration) {\r\n await refreshJobs();\r\n return;\r\n }\r\n throw error;\r\n } finally {\r\n if (jobControlAbortRef.current === controller) jobControlAbortRef.current = null;\r\n }\r\n if (activeSessionIdRef.current !== currentSessionId) return;\r\n const ownsDetail = !controller.signal.aborted &&\r\n jobControlGenerationRef.current === controlGeneration &&\r\n jobDetailGenerationRef.current === detailGeneration;\r\n if (ownsDetail) {\r\n await loadJobDetail(client, currentSessionId, action.job_id);\r\n }\r\n await refreshJobs();\r\n return;\r\n }\r\n }\r\n } catch (error) {\r\n reportAuxiliaryError(\"Jobs\", error);\r\n return;\r\n }\r\n }\r\n\r\n default: {\r\n const exhaustive: never = action;\r\n void exhaustive;\r\n reportError(`Unsupported TUI action: ${runtimeType}`);\r\n return;\r\n }\r\n }\r\n })().catch((error) => {\r\n reportError(error instanceof Error ? error.message : String(error));\r\n });\r\n },\r\n [activeSessionId, activateSession, cacheFirstRead, clearDisplayRequest, clientState, createAndSwitchSession, daemon, loadJobDetail, localBusy, pushSystem, refreshJobs, reportAuxiliaryError, reportError, returnToHome, showDisplayRequest],\r\n );\r\n\r\n const bucket = activeSessionId ? clientState.buckets[activeSessionId] : undefined;\r\n const recoveryItems = useMemo(\r\n () =>\r\n recoverableInterruptedRuns(bucket).map((run) => ({\r\n id: `recovery:${run.id}`,\r\n role: \"system\" as const,\r\n text: `Run interrupted${run.error ? `: ${run.error}` : \"\"}\\nUse /resume ${run.id} to replay its original prompt.`,\r\n })),\r\n [bucket],\r\n );\r\n const transcriptView = useMemo(() => {\r\n const base = splitStreamingAssistant(bucketToTranscript(bucket));\r\n return {\r\n transcript: [...base.items, ...recoveryItems, ...(activeSessionId ? (systemItemsBySession[activeSessionId] ?? []) : globalSystemItems)],\r\n assistantBuffer: base.assistantBuffer,\r\n };\r\n }, [activeSessionId, bucket, globalSystemItems, recoveryItems, systemItemsBySession]);\r\n const submittedRunRecord = submittedRun ? clientState.buckets[submittedRun.sessionId]?.runs[submittedRun.runId] : undefined;\r\n const waitingForSubmittedRun = !!submittedRun && (!submittedRunRecord || submittedRunRecord.status === \"pending\" || submittedRunRecord.status === \"running\");\r\n const commandDetails = useMemo(() => mergeCommandDetails(commandCatalog), [commandCatalog]);\r\n const commands = useMemo(() => commandDetails.map((entry) => entry.name), [commandDetails]);\r\n\r\n return useMemo(\r\n () => ({\r\n transcript: transcriptView.transcript,\r\n assistantBuffer: transcriptView.assistantBuffer,\r\n status,\r\n jobState,\r\n jobs: jobState.jobs,\r\n jobDetailState,\r\n commands,\r\n commandDetails,\r\n mcpServers,\r\n modal,\r\n selectRequest,\r\n displayRequest,\r\n busy: localBusy || running || waitingForSubmittedRun,\r\n ready,\r\n setModal,\r\n setSelectRequest,\r\n setDisplayRequest,\r\n setBusy: setLocalBusy,\r\n loadModels,\r\n sendRequest,\r\n }),\r\n [commandDetails, commands, displayRequest, jobDetailState, jobState, loadModels, localBusy, mcpServers, modal, ready, running, selectRequest, sendRequest, status, transcriptView, waitingForSubmittedRun],\r\n );\r\n}\r\n",
25
- "// ─── 列表/视口 ────────────────────────────────────────────────────────────────\r\n/** 补全浮窗(命令 / 文件)和 DialogSelect 的最大可见行数 */\r\nexport const AC_VISIBLE_ITEMS = 10;\r\n\r\n// ─── 上限 ────────────────────────────────────────────────────────────────────\r\n/** 输入历史保留条数 */\r\nexport const HISTORY_LIMIT = 100;\r\n/** Swarm 通知队列保留条数(slice tail) */\r\nexport const SWARM_NOTIFICATION_TAIL = 20;\r\n\r\n// ─── 计时器 ──────────────────────────────────────────────────────────────────\r\n/** 双击 Esc 取消:第一次 Esc 后提示的显示时长 (ms) */\r\nexport const ESC_HINT_TIMEOUT_MS = 2000;\r\n/** Spinner 动画帧间隔 (ms) */\r\nexport const SPINNER_INTERVAL_MS = 100;\r\n\r\n// ─── 布局 ────────────────────────────────────────────────────────────────────\r\n/** 终端宽度达到此值时自动展开 Sidebar */\r\nexport const SIDEBAR_AUTO_OPEN_WIDTH = 110;\r\n/** Footer cwd 缩略最大字符数 */\r\nexport const CWD_DISPLAY_MAX_LEN = 40;\r\n\r\n// ─── 显示格式 ─────────────────────────────────────────────────────────────────\r\n/** Token 计数超过此值时显示为 \"Nk\" */\r\nexport const TOKEN_K_THRESHOLD = 1000;\r\n/** 多行输入框最大行高 */\r\nexport const TEXTAREA_MAX_LINES = 6;\n/** Minimum prompt textarea rows; keeps the prompt chrome from jumping on single-line edits. */\nexport const TEXTAREA_MIN_LINES = 2;\n",
26
- "import { useEffect, useRef, useState } from \"react\";\r\nimport { ESC_HINT_TIMEOUT_MS } from \"../ui/constants\";\r\n\r\n/**\r\n * 双击 Esc 取消运行中的对话(对齐 opencode)。\r\n *\r\n * 第一次按 Esc 在 2s 内显示提示(escHint=true),期间再按 Esc 触发 onInterrupt;\r\n * 超时或对话结束(busy→false)自动复位。调用方在全局键盘处理里转发 Esc 到 handleEscape。\r\n *\r\n * @param busy 当前是否有运行中的对话\r\n * @param onInterrupt 第二次 Esc 时的中断回调(通常向后端发 interrupt 请求)\r\n */\r\nexport function useEscToCancel(busy: boolean, onInterrupt: () => void) {\r\n const [escHint, setEscHint] = useState(false);\r\n const escHintRef = useRef(false);\r\n const escTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n // 对话结束即复位,避免提示残留到下一轮。\r\n useEffect(() => {\r\n if (!busy) {\r\n if (escTimerRef.current) clearTimeout(escTimerRef.current);\r\n escTimerRef.current = null;\r\n escHintRef.current = false;\r\n setEscHint(false);\r\n }\r\n }, [busy]);\r\n\r\n const handleEscape = (): void => {\r\n if (escHintRef.current) {\r\n // 第二次 Esc — 中断\r\n if (escTimerRef.current) clearTimeout(escTimerRef.current);\r\n escTimerRef.current = null;\r\n escHintRef.current = false;\r\n setEscHint(false);\r\n onInterrupt();\r\n } else {\r\n // 第一次 Esc — 显示提示 2s\r\n escHintRef.current = true;\r\n setEscHint(true);\r\n escTimerRef.current = setTimeout(() => {\r\n escHintRef.current = false;\r\n setEscHint(false);\r\n escTimerRef.current = null;\r\n }, ESC_HINT_TIMEOUT_MS);\r\n }\r\n };\r\n\r\n return { escHint, handleEscape };\r\n}\r\n",
27
- "import type { UiNode } from \"../types/ui\";\r\nimport { createContext, useContext, useState } from \"react\";\r\nimport { type ThemeConfig, BUILTIN_THEMES, defaultTheme, getTheme } from \"./builtinThemes\";\r\n\r\nexport type { ThemeConfig };\r\n\r\ntype ThemeContextValue = {\r\n theme: ThemeConfig;\r\n setThemeName: (name: string) => void;\r\n};\r\n\r\nconst ThemeContext = createContext<ThemeContextValue>({\r\n theme: defaultTheme,\r\n setThemeName: () => undefined,\r\n});\r\n\r\nexport function ThemeProvider({\r\n children,\r\n initialTheme = \"default\",\r\n}: {\r\n children: UiNode;\r\n initialTheme?: string;\r\n}) {\r\n const [theme, setTheme] = useState<ThemeConfig>(() => getTheme(initialTheme));\r\n\r\n const setThemeName = (name: string): void => {\r\n const resolved = BUILTIN_THEMES[name] ?? defaultTheme;\r\n setTheme(resolved);\r\n };\r\n\r\n return (\r\n <ThemeContext.Provider value={{ theme, setThemeName }}>\r\n {children}\r\n </ThemeContext.Provider>\r\n );\r\n}\r\n\r\nexport function useTheme(): ThemeContextValue {\r\n return useContext(ThemeContext);\r\n}\r\n",
28
- "/**\r\n * Fuzzy filter: case-insensitive matching with scoring.\r\n *\r\n * Matching strategy:\r\n * - If query contains a word separator (`/`), apply prefix filtering:\r\n * the label must start with the query (case-insensitive). This supports\r\n * slash-command prefix filtering like `/p` → `/permissions`, `/plan`.\r\n * - Otherwise, use subsequence matching across the full label.\r\n * Score: consecutive run bonus + label-prefix bonus.\r\n *\r\n * Sort order: descending by score, stable (same-score items preserve input order).\r\n */\r\nexport function fuzzyFilter<T>(\r\n items: T[],\r\n query: string,\r\n key: (t: T) => string,\r\n): T[] {\r\n if (query === \"\") return items;\r\n const q = query.toLowerCase();\r\n\r\n const hasSeparator = q.includes(\"/\");\r\n\r\n const scored: Array<{ item: T; score: number; index: number }> = [];\r\n\r\n for (let i = 0; i < items.length; i++) {\r\n const item = items[i]!;\r\n const label = key(item).toLowerCase();\r\n\r\n let score: number;\r\n if (hasSeparator) {\r\n // Prefix filter: label must start with the query\r\n score = label.startsWith(q) ? 100 + (q.length === label.length ? 10 : 0) : 0;\r\n } else {\r\n score = scoreSubsequence(label, q);\r\n }\r\n\r\n if (score > 0) {\r\n scored.push({ item, score, index: i });\r\n }\r\n }\r\n\r\n // Stable descending sort by score\r\n scored.sort((a, b) => b.score - a.score || a.index - b.index);\r\n return scored.map((s) => s.item);\r\n}\r\n\r\n/**\r\n * Like fuzzyFilter but returns items with their scores, useful for frecency tie-breaking.\r\n * Reuses the private scoreSubsequence function already defined below.\r\n */\r\nexport function fuzzyFilterScored<T>(\r\n items: T[],\r\n query: string,\r\n key: (t: T) => string,\r\n): Array<{ item: T; score: number }> {\r\n if (query === \"\") return items.map((item) => ({ item, score: 0 }));\r\n const q = query.toLowerCase();\r\n const hasSeparator = q.includes(\"/\");\r\n\r\n const scored: Array<{ item: T; score: number; index: number }> = [];\r\n for (let i = 0; i < items.length; i++) {\r\n const item = items[i]!;\r\n const label = key(item).toLowerCase();\r\n let score: number;\r\n if (hasSeparator) {\r\n score = label.startsWith(q) ? 100 + (q.length === label.length ? 10 : 0) : 0;\r\n } else {\r\n score = scoreSubsequence(label, q);\r\n }\r\n if (score > 0) scored.push({ item, score, index: i });\r\n }\r\n scored.sort((a, b) => b.score - a.score || a.index - b.index);\r\n return scored.map(({ item, score }) => ({ item, score }));\r\n}\r\n\r\nfunction scoreSubsequence(label: string, query: string): number {\r\n let qi = 0;\r\n let score = 0;\r\n let consecutive = 0;\r\n\r\n for (let li = 0; li < label.length && qi < query.length; li++) {\r\n if (label[li] === query[qi]) {\r\n consecutive++;\r\n score += consecutive * 2;\r\n // Bonus for matching at label start\r\n if (li === 0 && qi === 0) score += 10;\r\n qi++;\r\n } else {\r\n consecutive = 0;\r\n }\r\n }\r\n\r\n if (qi < query.length) return 0; // Not a full subsequence match\r\n return score;\r\n}\r\n",
29
- "import { useState, useCallback } from \"react\";\r\n\r\n/**\r\n * 管理可滚动列表的高亮下标。\r\n * count 变化时 moveDown 会自动 clamp,但 index 不自动重置——\r\n * 调用者在列表内容变化时自行调用 setIndex(0)。\r\n */\r\nexport function useListNavigation(count: number) {\r\n const [index, setIndex] = useState(0);\r\n\r\n const moveUp = useCallback(() => {\r\n setIndex((prev) => Math.max(0, prev - 1));\r\n }, []);\r\n\r\n const moveDown = useCallback(() => {\r\n setIndex((prev) => Math.max(0, Math.min(count - 1, prev + 1)));\r\n }, [count]);\r\n\r\n return { index, setIndex, moveUp, moveDown };\r\n}\r\n",
20
+ "/**\n * @openharness/client 公共导出。\n *\n * 面向 TUI / Web / Desktop:typed HTTP API、SSE 解析、事件 reducer、replay+live 同步。\n * 客户端只做展示与控制,不拥有 agent runtime。\n */\n\nexport {\n createPromptRequestId,\n normalizeDaemonBaseUrl,\n OpenHarnessApiError,\n IncompatibleProtocolError,\n OpenHarnessClient,\n streamServerSentEvents,\n} from \"./transport/index.js\";\nexport type {\n AttachmentAssetRecord,\n ClientProtocolSupport,\n ProtocolCompatibility,\n ServerCapabilities,\n} from \"@openharness/protocol\";\nexport {\n checkProtocolCompatibility,\n supportsFeature,\n} from \"@openharness/protocol\";\nexport {\n applyEvent,\n applyEvents,\n applySessionSnapshot,\n createInitialClientState,\n hydrateState,\n selectSessionMessagesWithParts,\n syncEvents,\n UnsupportedSessionEventSchemaVersionError,\n} from \"./state/index.js\";\nexport {\n LOCAL_COMMAND_DETAILS,\n LOCAL_COMMAND_NAMES,\n dispatchSessionCommand,\n hasActiveRun,\n mergeCommandDetails,\n parseSlashLine,\n resolveSessionCwd,\n} from \"./commands/index.js\";\nexport {\n patchSessionRuntimeMetadata,\n readRuntimeMetadata,\n readSessionRuntimeConfig,\n} from \"@openharness/protocol\";\nexport type {\n SessionRuntimeConfig,\n SessionRuntimeConfigPatch,\n} from \"@openharness/protocol\";\nexport type {\n PresentationReadRequest,\n SessionCommandHost,\n SessionCommandOutcome,\n SlashLine,\n} from \"./commands/index.js\";\nexport type {\n AdmitClientPromptInput,\n AgentPersonaInfo,\n AttachmentStorageGcResult,\n AttachmentStorageIssue,\n AttachmentStorageRepairResult,\n AttachmentStorageReport,\n AuthStatus,\n CommandCatalogEntry,\n CommandKind,\n CommandSource,\n CompactSessionResponse,\n CancelQueuedClientPromptInput,\n CancelQueuedPromptResponse,\n CreateBackgroundShellInput,\n CreateBackgroundShellResult,\n CreateScheduledTaskInput,\n AdmitPromptAttachmentInput,\n CreateClientSessionInput,\n EditLatestClientPromptInput,\n EventSyncOptions,\n ForkClientSessionInput,\n HookInfo,\n ReloadPluginsResponse,\n RewindSessionResponse,\n InputDelivery,\n InterruptSessionResponse,\n ListClientMessagePartsOptions,\n ListCommandsOptions,\n ListEventsOptions,\n ListMessagesOptions,\n ListPermissionsOptions,\n ListSessionsOptions,\n ListProjectsOptions,\n ProjectRecord,\n McpServerStatus,\n MemoryEntryRecord,\n MemoryListResponse,\n ModelInfo,\n ModelProviderInfo,\n OpenHarnessClientOptions,\n OpenHarnessClientState,\n OpenHarnessServerHealth,\n OutputStyleInfo,\n PermissionRequestRecord,\n PermissionStatus,\n PluginInfo,\n PromoteQueuedClientPromptInput,\n PromoteQueuedPromptResponse,\n PromptResponse,\n ProviderInfo,\n CustomProviderInput,\n RememberSessionResponse,\n ReplyPermissionInput,\n ScheduledRunRecord,\n ScheduledTaskRecord,\n ScheduledTaskStatusSummary,\n SessionBucket,\n UpdateScheduledTaskInput,\n SessionEventRecord,\n SessionAttachmentMessagePartRecord,\n SessionInputAttachmentRecord,\n SessionExportResponse,\n SessionInputRecord,\n SessionMessagePartRecord,\n SessionMessageRecord,\n SessionRecord,\n SessionRunRecord,\n SessionRunAttemptRecord,\n SessionExecutionRecord,\n SessionStateSnapshot,\n SessionTransformationMessagePartRecord,\n SkillInvocationMetadata,\n SessionUsageResponse,\n StartDreamResponse,\n SyncEventUpdate,\n UpdateClientSessionInput,\n UploadAttachmentInput,\n DownloadAttachmentOptions,\n} from \"./types/index.js\";\nexport type { SessionMessageWithParts } from \"./state/index.js\";\nexport type {\n TerminalCreateRequest,\n TerminalEvent,\n TerminalReadRequest,\n TerminalReadResult,\n TerminalResizeRequest,\n TerminalRuntime,\n TerminalSessionInfo,\n TerminalSessionStatus,\n TerminalSignal,\n TerminalSource,\n TerminalWriteRequest,\n JobCapabilities,\n JobKind,\n JobReadResult,\n JobSnapshot,\n JobStatus,\n JobWaitResult,\n DurableChannelMessageInput,\n DurableChannelMessageResult,\n ExternalConversationRecord,\n ChannelDeliveryRecord,\n ChannelDeliveryStatus,\n ChannelStatusSnapshot,\n RecordChannelDeliveryInput,\n} from \"@openharness/protocol\";\n",
21
+ "import type { JobReadResult, JobSnapshot } from \"@openharness/client\";\n\nexport type JobRemoteState =\n | { status: \"idle\"; jobs: JobSnapshot[] }\n | { status: \"loading\"; jobs: JobSnapshot[] }\n | { status: \"ready\"; jobs: JobSnapshot[]; refreshedAt: number }\n | { status: \"error\"; jobs: JobSnapshot[]; error: string; refreshedAt?: number };\n\nexport type JobDetailRemoteState =\n | { status: \"idle\" }\n | { status: \"loading\"; jobId: string; previous?: JobReadResult }\n | { status: \"ready\"; jobId: string; result: JobReadResult; refreshedAt: number }\n | { status: \"error\"; jobId: string; error: string; previous?: JobReadResult };\n\nexport function beginJobList(previous: JobRemoteState): JobRemoteState {\n return { status: \"loading\", jobs: [...previous.jobs] };\n}\n\nexport function resolveJobList(\n jobs: JobSnapshot[],\n now: number,\n previous?: JobRemoteState,\n): JobRemoteState {\n const cachedById = new Map(previous?.jobs.map((job) => [job.id, job]) ?? []);\n return {\n status: \"ready\",\n jobs: jobs.map((snapshot) => preferMonotonicSnapshot(cachedById.get(snapshot.id), snapshot)),\n refreshedAt: now,\n };\n}\n\nexport function rejectJobList(previous: JobRemoteState, error: string): JobRemoteState {\n const refreshedAt = \"refreshedAt\" in previous ? previous.refreshedAt : undefined;\n return {\n status: \"error\",\n jobs: [...previous.jobs],\n error,\n ...(refreshedAt !== undefined ? { refreshedAt } : {}),\n };\n}\n\nexport function mergeJobSnapshot(\n state: JobRemoteState,\n snapshot: JobSnapshot,\n now: number,\n): JobRemoteState {\n const found = state.jobs.some((job) => job.id === snapshot.id);\n const jobs = found\n ? state.jobs.map((job) => job.id === snapshot.id ? preferMonotonicSnapshot(job, snapshot) : job)\n : [snapshot, ...state.jobs];\n return { status: \"ready\", jobs, refreshedAt: now };\n}\n\nfunction preferMonotonicSnapshot(\n cached: JobSnapshot | undefined,\n incoming: JobSnapshot,\n): JobSnapshot {\n if (!cached) return incoming;\n if (isTerminalStatus(cached.status) && !isTerminalStatus(incoming.status)) return cached;\n if (incoming.updatedAt < cached.updatedAt) return cached;\n return incoming;\n}\n\nfunction isTerminalStatus(status: JobSnapshot[\"status\"]): boolean {\n return status === \"completed\" || status === \"killed\" || status === \"failed\";\n}\n\nconst JOB_KINDS = [\"terminal\", \"shell\", \"agent\", \"dream\", \"workflow\"] as const;\nconst JOB_STATUSES = [\"running\", \"stopping\", \"completed\", \"killed\", \"failed\"] as const;\n\ntype UnknownRecord = Record<string, unknown>;\n\nfunction isRecord(value: unknown): value is UnknownRecord {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction isJobSnapshot(value: unknown, ownerSession: string): value is JobSnapshot {\n if (!isRecord(value)) {\n return false;\n }\n\n const capabilities = value.capabilities;\n return (\n typeof value.id === \"string\" &&\n value.id.trim().length > 0 &&\n value.ownerSession === ownerSession &&\n typeof value.label === \"string\" &&\n typeof value.cwd === \"string\" &&\n typeof value.kind === \"string\" &&\n JOB_KINDS.includes(value.kind as (typeof JOB_KINDS)[number]) &&\n typeof value.status === \"string\" &&\n JOB_STATUSES.includes(value.status as (typeof JOB_STATUSES)[number]) &&\n Number.isFinite(value.startedAt) &&\n Number.isFinite(value.updatedAt) &&\n (value.finishedAt === undefined || Number.isFinite(value.finishedAt)) &&\n (value.detail === undefined || typeof value.detail === \"string\") &&\n (value.metadata === undefined || isRecord(value.metadata)) &&\n isRecord(capabilities) &&\n typeof capabilities.read === \"boolean\" &&\n typeof capabilities.wait === \"boolean\" &&\n typeof capabilities.send === \"boolean\" &&\n typeof capabilities.cancel === \"boolean\"\n );\n}\n\nexport function validateJobSnapshot(\n value: unknown,\n ownerSession: string,\n expectedJobId?: string,\n): { snapshot?: JobSnapshot; error?: string } {\n if (!isRecord(value)) {\n return { error: \"Job snapshot has invalid fields.\" };\n }\n if (typeof value.id === \"string\" && expectedJobId !== undefined && value.id !== expectedJobId) {\n return { error: `Job snapshot id \"${value.id}\" does not match requested Job \"${expectedJobId}\".` };\n }\n if (typeof value.ownerSession === \"string\" && value.ownerSession !== ownerSession) {\n return { error: `Job snapshot ownerSession \"${value.ownerSession}\" does not match active session \"${ownerSession}\".` };\n }\n if (!isJobSnapshot(value, ownerSession)) {\n return { error: \"Job snapshot has invalid fields.\" };\n }\n return { snapshot: value };\n}\n\nexport function validateJobReadResult(\n value: unknown,\n ownerSession: string,\n expectedJobId: string,\n): { result?: JobReadResult; error?: string } {\n if (\n !isRecord(value) ||\n typeof value.text !== \"string\" ||\n !Number.isFinite(value.cursor) ||\n typeof value.truncated !== \"boolean\" ||\n (value.details !== undefined && !isRecord(value.details))\n ) {\n return { error: `Job read response for \"${expectedJobId}\" has invalid fields.` };\n }\n const snapshotValidation = validateJobSnapshot(value.snapshot, ownerSession, expectedJobId);\n if (!snapshotValidation.snapshot) {\n return { error: snapshotValidation.error ?? \"Job snapshot has invalid fields.\" };\n }\n return { result: value as unknown as JobReadResult };\n}\n\nexport function validateJobSnapshots(\n value: unknown,\n ownerSession: string,\n): { jobs: JobSnapshot[]; error?: string } {\n if (!Array.isArray(value)) {\n return { jobs: [], error: \"Jobs response must be an array.\" };\n }\n\n const jobs = value.filter((entry): entry is JobSnapshot => isJobSnapshot(entry, ownerSession));\n const invalidCount = value.length - jobs.length;\n if (invalidCount === 0) {\n return { jobs };\n }\n\n const noun = invalidCount === 1 ? \"snapshot\" : \"snapshots\";\n return { jobs, error: `Ignored ${invalidCount} invalid Job ${noun}.` };\n}\n",
22
+ "import {\n selectSessionMessagesWithParts,\n type SessionBucket,\n type SessionMessagePartRecord,\n type SessionMessageRecord,\n} from \"@openharness/client\";\n\nimport type { TranscriptItem } from \"../types\";\n\nexport type TranscriptView = { items: TranscriptItem[]; assistantBuffer: string };\n\nfunction contentToText(content: unknown): string {\n if (typeof content === \"string\") return content;\n if (Array.isArray(content)) {\n return content\n .map((block) => {\n if (block && typeof block === \"object\" && \"text\" in block) return String(block.text ?? \"\");\n return JSON.stringify(block);\n })\n .join(\"\");\n }\n if (content == null) return \"\";\n return JSON.stringify(content);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nfunction textFromParts(parts: SessionMessagePartRecord[]): string {\n return parts\n .filter((part) => part.type === \"text\" || part.type === \"reasoning\")\n .map((part) => part.text ?? \"\")\n .join(\"\");\n}\n\nfunction messageToTranscriptItems(\n message: SessionMessageRecord,\n parts: SessionMessagePartRecord[],\n inputText?: string,\n): TranscriptItem[] {\n if (message.role === \"user\") {\n return [{\n id: message.inputId ? `input:${message.inputId}` : message.id,\n role: \"user\",\n text: textFromParts(parts) || inputText || \"\",\n }];\n }\n if (message.role === \"system\") return [{ id: message.id, role: \"system\", text: textFromParts(parts) }];\n\n const items: TranscriptItem[] = [];\n for (const part of parts) {\n if (part.type === \"text\" || part.type === \"reasoning\") {\n if (part.text) items.push({\n id: `${message.id}:${part.id}`,\n role: \"assistant\",\n text: part.text,\n streaming: part.status === \"pending\" || part.status === \"running\",\n });\n continue;\n }\n if (part.type === \"tool\") {\n const toolName = part.toolName ?? \"tool\";\n items.push({\n id: `${message.id}:${part.id}:tool`,\n role: \"tool\",\n text: toolName,\n tool_name: toolName,\n tool_input: part.input,\n });\n if (part.output !== undefined) {\n const output = isRecord(part.output) ? part.output : {};\n items.push({\n id: `${message.id}:${part.id}:result`,\n role: \"tool_result\",\n text: contentToText(output.content),\n tool_name: toolName,\n is_error: part.isError === true,\n });\n }\n continue;\n }\n if (part.type === \"tool_result\") {\n items.push({\n id: `${message.id}:${part.id}:result`,\n role: \"tool_result\",\n text: contentToText(part.output ?? part.text ?? \"\"),\n tool_name: part.toolName,\n is_error: part.isError === true,\n });\n continue;\n }\n if (part.type === \"error\") {\n items.push({ id: `${message.id}:${part.id}`, role: \"system\", text: part.text ?? \"error\" });\n continue;\n }\n if (part.type === \"log\") {\n items.push({ id: `${message.id}:${part.id}`, role: \"log\", text: part.text ?? \"\" });\n }\n }\n return items;\n}\n\nexport function bucketToTranscript(bucket: SessionBucket | undefined): TranscriptItem[] {\n if (!bucket) return [];\n const inputById = new Map(bucket.inputs.map((input) => [input.id, input]));\n const projectedInputIds = new Set<string>();\n const items: TranscriptItem[] = [];\n const activeRuns = Object.values(bucket.runs)\n .filter((run) => run.status === \"pending\" || run.status === \"running\");\n const activeRunInputIds = new Set(activeRuns.flatMap((run) => run.inputId ? [run.inputId] : []));\n const transcriptUpdatedAt = bucket.messages.reduce(\n (latest, message) => Math.max(latest, message.updatedAt),\n bucket.session?.updatedAt ?? 0,\n );\n\n for (const { message, parts } of selectSessionMessagesWithParts(bucket)) {\n if (message.role === \"user\" && message.inputId) projectedInputIds.add(message.inputId);\n items.push(...messageToTranscriptItems(\n message,\n parts,\n message.inputId ? inputById.get(message.inputId)?.content : undefined,\n ));\n }\n\n // Admission and transcript projection are separate daemon steps. Until the user message\n // exists, keep its input-backed placeholder at the canonical transcript tail. input.seq\n // and message.seq are independent counters and must never be compared. Transcript rewrites\n // such as compact/rewind drop historical inputId links, so old inputs are not placeholders.\n for (const input of [...bucket.inputs].sort((a, b) => a.seq - b.seq)) {\n if (projectedInputIds.has(input.id)) continue;\n const belongsToActiveRun = activeRunInputIds.has(input.id)\n || (input.delivery === \"steer\" && activeRuns.some((run) => input.createdAt >= run.createdAt));\n const admittedAfterTranscript = input.createdAt >= transcriptUpdatedAt;\n if (!belongsToActiveRun && !admittedAfterTranscript) continue;\n items.push({ id: `input:${input.id}`, role: \"user\", text: input.content });\n }\n return items;\n}\n\nexport function splitStreamingAssistant(items: TranscriptItem[]): TranscriptView {\n for (let index = items.length - 1; index >= 0; index -= 1) {\n const item = items[index];\n if (!item) continue;\n if (item.role !== \"assistant\" || item.streaming !== true || !item.text) continue;\n return {\n items: [\n ...items.slice(0, index),\n ...items.slice(index + 1),\n ],\n assistantBuffer: item.text,\n };\n }\n return { items, assistantBuffer: \"\" };\n}\n",
23
+ "import type {\n CommandCatalogEntry,\n OpenHarnessClient,\n OpenHarnessClientState,\n PresentationReadRequest,\n SlashLine,\n} from \"@openharness/client\";\nimport {\n LOCAL_COMMAND_DETAILS,\n LOCAL_COMMAND_NAMES,\n dispatchSessionCommand,\n hasActiveRun,\n mergeCommandDetails,\n parseSlashLine,\n resolveSessionCwd,\n} from \"@openharness/client\";\nimport type { Dispatch, MutableRefObject, SetStateAction } from \"react\";\n\nimport type { FrontendConfig } from \"../types\";\n\nexport {\n LOCAL_COMMAND_DETAILS,\n LOCAL_COMMAND_NAMES,\n hasActiveRun,\n mergeCommandDetails,\n parseSlashLine,\n};\n\nexport type SessionSlashCtx = {\n client: OpenHarnessClient;\n sessionId: string | undefined;\n pushSystem: (text: string) => void;\n presentSystem: (title: string, content: string) => void;\n statusRef: MutableRefObject<Record<string, unknown>>;\n commandCatalogRef: MutableRefObject<CommandCatalogEntry[]>;\n clientState: OpenHarnessClientState;\n localBusy: boolean;\n cacheFirstRead?: (request: PresentationReadRequest) => void;\n daemon?: FrontendConfig[\"daemon\"];\n setStatus: Dispatch<SetStateAction<Record<string, unknown>>>;\n};\n\nexport async function dispatchSessionSlashCommand(\n slash: SlashLine | null,\n ctx: SessionSlashCtx,\n): Promise<\"handled\" | \"unhandled\" | \"local_ui_ignored\"> {\n const {\n client,\n sessionId,\n pushSystem,\n presentSystem,\n statusRef,\n commandCatalogRef,\n clientState,\n localBusy,\n cacheFirstRead,\n daemon,\n setStatus,\n } = ctx;\n\n const outcome = await dispatchSessionCommand(slash, {\n client,\n sessionId,\n cwd: resolveSessionCwd({\n statusCwd: statusRef.current.cwd,\n daemonCwd: daemon?.cwd ?? undefined,\n }),\n model: statusRef.current.model != null\n ? String(statusRef.current.model)\n : daemon?.model ?? undefined,\n permissionMode: typeof statusRef.current.permission_mode === \"string\"\n ? statusRef.current.permission_mode\n : undefined,\n statusSessionId: typeof statusRef.current.session_id === \"string\"\n ? statusRef.current.session_id\n : sessionId,\n commandCatalog: commandCatalogRef.current,\n clientState,\n busy: localBusy,\n emit: pushSystem,\n present: presentSystem,\n cacheFirstRead,\n getRuntimeDiagnostics: () => ({\n runtime: `Node ${process.version}`,\n platform: process.platform,\n architecture: process.arch,\n }),\n patchStatus: (patch) => setStatus((current) => ({ ...current, ...patch })),\n });\n\n if (outcome === \"local_ui\") return \"local_ui_ignored\";\n return outcome;\n}\n",
24
+ "import { useCallback, useEffect, useMemo, useRef, useState, type SetStateAction } from \"react\";\nimport {\n OpenHarnessClient,\n createPromptRequestId,\n createInitialClientState,\n patchSessionRuntimeMetadata,\n readSessionRuntimeConfig,\n syncEvents,\n type CommandCatalogEntry,\n type McpServerStatus,\n type ModelProviderInfo,\n type OpenHarnessClientState,\n type PermissionRequestRecord,\n type PresentationReadRequest,\n type SessionRuntimeConfigPatch,\n type SessionBucket,\n type SessionRecord,\n type SyncEventUpdate,\n} from \"@openharness/client\";\n\nimport type { FrontendConfig, McpServerSnapshot, TranscriptItem } from \"../types\";\nimport {\n beginJobList,\n mergeJobSnapshot,\n rejectJobList,\n resolveJobList,\n validateJobReadResult,\n validateJobSnapshot,\n validateJobSnapshots,\n type JobDetailRemoteState,\n type JobRemoteState,\n} from \"../jobs/job-remote-state\";\nimport type { TuiAction, TuiSessionController } from \"./sessionController\";\nimport { bucketToTranscript, splitStreamingAssistant } from \"./transcript\";\nimport {\n dispatchSessionSlashCommand,\n hasActiveRun,\n mergeCommandDetails,\n parseSlashLine\n} from \"./sessionSlashCommands\";\n\nconst JOBS_AUXILIARY_SLASH_COMMANDS = new Set([\n \"/agents\",\n \"/background\",\n \"/doctor\",\n \"/jobs\",\n \"/stats\",\n]);\n\ntype DisplayRequest = NonNullable<TuiSessionController[\"displayRequest\"]>;\ntype PresentationCacheEntry = {\n title: string;\n content: string;\n updatedAt: number;\n};\n\nconst LIVE_TEXT_DELTA_FLUSH_MS = 33;\nconst PRESENTATION_LOADING_TEXT = \"Loading...\";\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return !!value && typeof value === \"object\" && !Array.isArray(value);\n}\n\nexport function sessionRuntimeMetadata(input: {\n model?: unknown;\n provider?: unknown;\n baseUrl?: unknown;\n apiFormat?: unknown;\n permissionMode?: unknown;\n maxTurns?: unknown;\n sessionMode?: unknown;\n pluginsEnabled?: unknown;\n}): Record<string, unknown> {\n const runtime: SessionRuntimeConfigPatch = {};\n if (typeof input.model === \"string\" && input.model) {\n runtime.model = input.model;\n }\n if (typeof input.provider === \"string\" && input.provider) {\n runtime.provider = input.provider;\n }\n if (typeof input.baseUrl === \"string\" && input.baseUrl) {\n runtime.baseUrl = input.baseUrl;\n }\n if (input.apiFormat === \"anthropic\" || input.apiFormat === \"openai\") {\n runtime.apiFormat = input.apiFormat;\n }\n if (input.permissionMode === \"default\" || input.permissionMode === \"plan\" || input.permissionMode === \"full_auto\") {\n runtime.permissionMode = input.permissionMode;\n }\n if (typeof input.maxTurns === \"number\" && Number.isFinite(input.maxTurns)) {\n runtime.maxTurns = input.maxTurns;\n }\n if (input.sessionMode === \"coordinator\" || input.sessionMode === \"direct\") {\n runtime.sessionMode = input.sessionMode;\n }\n if (typeof input.pluginsEnabled === \"boolean\") {\n runtime.pluginsEnabled = input.pluginsEnabled;\n }\n return patchSessionRuntimeMetadata({}, runtime);\n}\n\nfunction mcpServerSnapshot(server: McpServerStatus): McpServerSnapshot {\n return {\n name: server.name,\n state: server.status,\n ...(server.error || server.command ? { detail: server.error ?? server.command } : {}),\n tool_count: server.toolCount,\n resource_count: server.resourceCount,\n };\n}\n\nfunction normalizeSessionMode(value: unknown): \"coordinator\" | null {\n return value === \"coordinator\" ? \"coordinator\" : null;\n}\n\nfunction statusSessionMode(value: unknown): \"coordinator\" | \"direct\" {\n return normalizeSessionMode(value) ?? \"direct\";\n}\n\nfunction stringSetting(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim() ? value : undefined;\n}\n\ntype RecoverableRun = {\n id: string;\n error?: string;\n prompt: string;\n};\n\nfunction archiveClientSession(\n state: OpenHarnessClientState,\n sessionId: string,\n archivedAt: number\n): OpenHarnessClientState {\n const current = state.sessions[sessionId];\n if (!current || current.status === \"archived\") return state;\n const archived: SessionRecord = {\n ...current,\n status: \"archived\",\n archivedAt,\n updatedAt: Math.max(current.updatedAt, archivedAt),\n };\n const bucket = state.buckets[sessionId];\n return {\n ...state,\n sessions: { ...state.sessions, [sessionId]: archived },\n buckets: bucket\n ? { ...state.buckets, [sessionId]: { ...bucket, session: archived } }\n : state.buckets,\n };\n}\n\nfunction listTopLevelSessions(\n sessions: Iterable<SessionRecord>,\n activeSessionId?: string\n): SessionRecord[] {\n return [...sessions]\n .filter((session) => !session.parentId && session.status !== \"archived\")\n .sort((a, b) => {\n if (a.id === activeSessionId) return -1;\n if (b.id === activeSessionId) return 1;\n return b.updatedAt - a.updatedAt;\n });\n}\n\nfunction sessionSelectOptions(\n sessions: Iterable<SessionRecord>,\n activeSessionId?: string\n): NonNullable<TuiSessionController[\"selectRequest\"]>[\"options\"] {\n return listTopLevelSessions(sessions, activeSessionId).map((session) => ({\n value: session.id,\n label: `${session.id === activeSessionId ? \"* \" : \"\"}${session.title || session.id}`,\n description: `${session.model} | ${session.status}`,\n }));\n}\n\nexport function shouldAutoActivateSession(\n session: SessionRecord,\n defaultModel: string,\n pluginsEnabled: boolean | undefined | null,\n): boolean {\n const runtime = readSessionRuntimeConfig(session);\n return runtime.model === defaultModel\n && (pluginsEnabled == null || (runtime.pluginsEnabled ?? true) === pluginsEnabled);\n}\n\nfunction recoverableInterruptedRuns(bucket?: SessionBucket): RecoverableRun[] {\n if (!bucket) return [];\n const recoveredSourceRunIds = new Set(bucket.inputs.flatMap((input) => (isRecord(input.metadata.recovery) && typeof input.metadata.recovery.sourceRunId === \"string\" ? [input.metadata.recovery.sourceRunId] : [])));\n return Object.values(bucket.runs)\n .filter((run) => run.status === \"interrupted\" && !!run.inputId && !recoveredSourceRunIds.has(run.id))\n .sort((a, b) => b.updatedAt - a.updatedAt)\n .flatMap((run) => {\n const input = bucket.inputs.find((candidate) => candidate.id === run.inputId);\n return input ? [{ id: run.id, error: run.error, prompt: input.content }] : [];\n });\n}\n\nfunction shouldCoalesceClientState(update: SyncEventUpdate): boolean {\n return update.source === \"live\" && update.event?.type === \"session.message.part.delta\";\n}\n\nfunction permissionToModal(request: PermissionRequestRecord): Record<string, unknown> {\n const input = request.payload.input && typeof request.payload.input === \"object\" ? (request.payload.input as Record<string, unknown>) : {};\n return {\n kind: \"permission\",\n request_id: request.id,\n tool_name: request.toolName,\n reason: typeof request.payload.reason === \"string\" ? request.payload.reason : null,\n input,\n };\n}\n\nfunction firstPendingPermission(state: OpenHarnessClientState, sessionId?: string): PermissionRequestRecord | undefined {\n if (!sessionId) return undefined;\n const bucket = state.buckets[sessionId];\n if (!bucket) return undefined;\n return Object.values(bucket.permissions)\n .filter((request) => request.status === \"pending\")\n .sort((a, b) => a.createdAt - b.createdAt)\n .at(0);\n}\n\nexport function useServerSync(config: FrontendConfig, onError?: (message: string) => void): TuiSessionController {\n const daemon = config.daemon;\n const [clientState, setClientState] = useState<OpenHarnessClientState>(() => createInitialClientState());\n const [activeSessionId, setActiveSessionId] = useState<string | undefined>();\n const [status, setStatus] = useState<Record<string, unknown>>({\n permission_mode: daemon?.permissionMode ?? \"default\",\n model: daemon?.model ?? \"default\",\n session_mode: statusSessionMode(daemon?.sessionMode),\n ...(typeof daemon?.maxTurns === \"number\" ? { max_turns: daemon.maxTurns } : {}),\n });\n const [modal, setModal] = useState<Record<string, unknown> | null>(null);\n const [selectRequest, setSelectRequest] = useState<TuiSessionController[\"selectRequest\"]>(null);\n const [displayRequest, setDisplayRequest] = useState<TuiSessionController[\"displayRequest\"]>(null);\n const [localBusy, setLocalBusy] = useState(false);\n const [submittedRun, setSubmittedRun] = useState<{\n sessionId: string;\n runId: string;\n } | null>(null);\n const [ready, setReady] = useState(false);\n const [globalSystemItems, setGlobalSystemItems] = useState<TranscriptItem[]>([]);\n const [systemItemsBySession, setSystemItemsBySession] = useState<Record<string, TranscriptItem[]>>({});\n const [commandCatalog, setCommandCatalog] = useState<CommandCatalogEntry[]>([]);\n const [jobState, setJobState] = useState<JobRemoteState>({ status: \"idle\", jobs: [] });\n const [jobDetailState, setJobDetailState] = useState<JobDetailRemoteState>({ status: \"idle\" });\n const [mcpServers, setMcpServers] = useState<McpServerSnapshot[]>([]);\n const clientRef = useRef<OpenHarnessClient | null>(null);\n const activeSessionIdRef = useRef<string | undefined>(undefined);\n const commandCatalogRef = useRef<CommandCatalogEntry[]>([]);\n const defaultRuntimeRef = useRef<{\n model: string;\n provider?: string;\n baseUrl?: string;\n apiFormat?: \"anthropic\" | \"openai\";\n }>({\n model: daemon?.model ?? \"default\",\n });\n const nextSessionModeRef = useRef<\"coordinator\" | \"direct\">(statusSessionMode(daemon?.sessionMode));\n const statusRef = useRef(status);\n const sentInitialPromptRef = useRef(false);\n const pendingNewSessionTitleRef = useRef<string | undefined>(undefined);\n const listedSessionsRef = useRef<Record<string, SessionRecord>>({});\n const presentationCacheRef = useRef<Record<string, PresentationCacheEntry>>({});\n const displayRequestRef = useRef<TuiSessionController[\"displayRequest\"]>(null);\n const pendingClientStateRef = useRef<OpenHarnessClientState | null>(null);\n const pendingClientStateTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n const shownPermissionIdRef = useRef<string | undefined>(undefined);\n const auxiliaryGenerationRef = useRef(0);\n const jobStateRef = useRef(jobState);\n const jobDetailStateRef = useRef(jobDetailState);\n const jobGenerationRef = useRef(0);\n const jobDetailGenerationRef = useRef(0);\n const jobsAbortRef = useRef<AbortController | null>(null);\n const jobDetailAbortRef = useRef<AbortController | null>(null);\n const jobControlAbortRef = useRef<AbortController | null>(null);\n const jobControlGenerationRef = useRef(0);\n const mcpAbortRef = useRef<AbortController | null>(null);\n const onErrorRef = useRef(onError);\n onErrorRef.current = onError;\n\n useEffect(() => {\n activeSessionIdRef.current = activeSessionId;\n }, [activeSessionId]);\n\n useEffect(() => {\n commandCatalogRef.current = commandCatalog;\n }, [commandCatalog]);\n\n useEffect(() => {\n statusRef.current = status;\n }, [status]);\n\n useEffect(() => {\n displayRequestRef.current = displayRequest;\n }, [displayRequest]);\n\n useEffect(() => {\n jobStateRef.current = jobState;\n }, [jobState]);\n\n useEffect(() => {\n jobDetailStateRef.current = jobDetailState;\n }, [jobDetailState]);\n\n const clearDisplayRequest = useCallback(() => {\n displayRequestRef.current = null;\n setDisplayRequest(null);\n }, []);\n\n const showDisplayRequest = useCallback((request: DisplayRequest) => {\n displayRequestRef.current = request;\n setSelectRequest(null);\n setDisplayRequest(request);\n }, []);\n\n const clearAuxiliaryState = useCallback((): void => {\n auxiliaryGenerationRef.current += 1;\n jobGenerationRef.current += 1;\n jobDetailGenerationRef.current += 1;\n jobControlGenerationRef.current += 1;\n mcpAbortRef.current?.abort();\n jobsAbortRef.current?.abort();\n jobDetailAbortRef.current?.abort();\n jobControlAbortRef.current?.abort();\n mcpAbortRef.current = null;\n jobsAbortRef.current = null;\n jobDetailAbortRef.current = null;\n jobControlAbortRef.current = null;\n const emptyJobState: JobRemoteState = { status: \"idle\", jobs: [] };\n const emptyJobDetailState: JobDetailRemoteState = { status: \"idle\" };\n jobStateRef.current = emptyJobState;\n jobDetailStateRef.current = emptyJobDetailState;\n setJobState(emptyJobState);\n setJobDetailState(emptyJobDetailState);\n setMcpServers([]);\n }, []);\n\n const setStatusAndDefault = useCallback((value: SetStateAction<Record<string, unknown>>) => {\n setStatus((current) => {\n const next = typeof value === \"function\" ? value(current) : value;\n if (typeof next.model === \"string\" && !activeSessionIdRef.current) {\n defaultRuntimeRef.current = {\n ...defaultRuntimeRef.current,\n model: next.model,\n ...(typeof next.provider === \"string\" ? { provider: next.provider } : {}),\n ...(typeof next.baseUrl === \"string\" ? { baseUrl: next.baseUrl } : {}),\n ...(next.apiFormat === \"anthropic\" || next.apiFormat === \"openai\" ? { apiFormat: next.apiFormat } : {}),\n };\n }\n return next;\n });\n }, []);\n\n const pushSystem = useCallback((text: string) => {\n const sessionId = activeSessionIdRef.current;\n if (!sessionId) {\n setGlobalSystemItems((items) => [...items, { role: \"system\", text }]);\n return;\n }\n setSystemItemsBySession((itemsBySession) => ({\n ...itemsBySession,\n [sessionId]: [...(itemsBySession[sessionId] ?? []), { role: \"system\", text }],\n }));\n }, []);\n\n const reportError = useCallback(\n (message: string) => {\n pushSystem(`error: ${message}`);\n onErrorRef.current?.(message);\n setLocalBusy(false);\n setSubmittedRun(null);\n },\n [pushSystem],\n );\n\n const reportAuxiliaryError = useCallback((scope: string, error: unknown): void => {\n const message = error instanceof Error ? error.message : String(error);\n onErrorRef.current?.(`${scope}: ${message}`);\n }, []);\n\n const refreshJobs = useCallback(async (): Promise<void> => {\n const client = clientRef.current;\n const sessionId = activeSessionIdRef.current;\n const generation = ++jobGenerationRef.current;\n if (!client || !sessionId) {\n const idle: JobRemoteState = { status: \"idle\", jobs: [] };\n jobStateRef.current = idle;\n setJobState(idle);\n return;\n }\n\n jobsAbortRef.current?.abort();\n const controller = new AbortController();\n jobsAbortRef.current = controller;\n setJobState((current) => {\n const next = beginJobList(current);\n jobStateRef.current = next;\n return next;\n });\n\n try {\n const response = await client.listJobs({\n sessionId,\n includeFinished: true,\n limit: 100,\n signal: controller.signal,\n });\n if (activeSessionIdRef.current !== sessionId || jobGenerationRef.current !== generation) return;\n const validated = validateJobSnapshots(response, sessionId);\n if (validated.error) {\n const validationError = validated.error;\n const now = Date.now();\n setJobState((current) => {\n const next: JobRemoteState = validated.jobs.length > 0\n ? {\n ...resolveJobList(validated.jobs, now, current),\n status: \"error\",\n error: validationError,\n }\n : rejectJobList(current, validationError);\n jobStateRef.current = next;\n return next;\n });\n reportAuxiliaryError(\"Jobs\", validationError);\n } else {\n const next = resolveJobList(validated.jobs, Date.now(), jobStateRef.current);\n jobStateRef.current = next;\n setJobState(next);\n }\n } catch (error) {\n if (controller.signal.aborted) return;\n if (activeSessionIdRef.current !== sessionId || jobGenerationRef.current !== generation) return;\n const message = error instanceof Error ? error.message : String(error);\n setJobState((current) => {\n const next = rejectJobList(current, message);\n jobStateRef.current = next;\n return next;\n });\n reportAuxiliaryError(\"Jobs\", message);\n } finally {\n if (jobsAbortRef.current === controller) jobsAbortRef.current = null;\n }\n }, [reportAuxiliaryError]);\n\n const loadJobDetail = useCallback(async (\n client: OpenHarnessClient,\n sessionId: string,\n jobId: string,\n ): Promise<void> => {\n const generation = ++jobDetailGenerationRef.current;\n jobDetailAbortRef.current?.abort();\n const controller = new AbortController();\n jobDetailAbortRef.current = controller;\n const current = jobDetailStateRef.current;\n const previous = current.status !== \"idle\" && current.jobId === jobId\n ? current.status === \"ready\"\n ? current.result\n : current.previous\n : undefined;\n const loading: JobDetailRemoteState = {\n status: \"loading\",\n jobId,\n ...(previous ? { previous } : {}),\n };\n jobDetailStateRef.current = loading;\n setJobDetailState(loading);\n\n try {\n const response = await client.readJob(jobId, {\n sessionId,\n signal: controller.signal,\n });\n if (activeSessionIdRef.current !== sessionId || jobDetailGenerationRef.current !== generation) return;\n const validated = validateJobReadResult(response, sessionId, jobId);\n if (!validated.result) {\n throw new Error(validated.error ?? `Job read response for \"${jobId}\" has invalid fields.`);\n }\n const result = validated.result;\n const readyState: JobDetailRemoteState = {\n status: \"ready\",\n jobId,\n result,\n refreshedAt: Date.now(),\n };\n jobDetailStateRef.current = readyState;\n setJobDetailState(readyState);\n } catch (error) {\n if (controller.signal.aborted) return;\n if (activeSessionIdRef.current !== sessionId || jobDetailGenerationRef.current !== generation) return;\n const message = error instanceof Error ? error.message : String(error);\n const errorState: JobDetailRemoteState = {\n status: \"error\",\n jobId,\n error: message,\n ...(previous ? { previous } : {}),\n };\n jobDetailStateRef.current = errorState;\n setJobDetailState(errorState);\n reportAuxiliaryError(\"Jobs\", message);\n } finally {\n if (jobDetailAbortRef.current === controller) jobDetailAbortRef.current = null;\n }\n }, [reportAuxiliaryError]);\n\n const loadModels = useCallback(async (): Promise<ModelProviderInfo[]> => {\n const client = clientRef.current;\n if (!client) return [];\n return await client.listModels();\n }, []);\n\n const cacheFirstRead = useCallback(\n (request: PresentationReadRequest): void => {\n const cached = presentationCacheRef.current[request.key];\n showDisplayRequest({\n key: request.key,\n title: request.title,\n content: cached?.content ?? PRESENTATION_LOADING_TEXT,\n });\n\n void request\n .load()\n .then((content) => {\n presentationCacheRef.current = {\n ...presentationCacheRef.current,\n [request.key]: {\n title: request.title,\n content,\n updatedAt: Date.now(),\n },\n };\n if (displayRequestRef.current?.key !== request.key) return;\n showDisplayRequest({\n key: request.key,\n title: request.title,\n content,\n });\n })\n .catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n const content = cached ? `${cached.content}\\n\\nRefresh failed: ${message}` : `Failed to load ${request.title}: ${message}`;\n if (displayRequestRef.current?.key !== request.key) return;\n showDisplayRequest({\n key: request.key,\n title: request.title,\n content,\n });\n });\n },\n [showDisplayRequest],\n );\n\n const clearPendingClientState = useCallback(() => {\n if (pendingClientStateTimerRef.current) {\n clearTimeout(pendingClientStateTimerRef.current);\n pendingClientStateTimerRef.current = null;\n }\n pendingClientStateRef.current = null;\n }, []);\n\n const commitClientState = useCallback(\n (state: OpenHarnessClientState, coalesce: boolean) => {\n if (!coalesce) {\n clearPendingClientState();\n setClientState(state);\n return;\n }\n\n pendingClientStateRef.current = state;\n if (pendingClientStateTimerRef.current) return;\n pendingClientStateTimerRef.current = setTimeout(() => {\n pendingClientStateTimerRef.current = null;\n const pending = pendingClientStateRef.current;\n pendingClientStateRef.current = null;\n if (pending) setClientState(pending);\n }, LIVE_TEXT_DELTA_FLUSH_MS);\n },\n [clearPendingClientState],\n );\n\n useEffect(() => clearPendingClientState, [clearPendingClientState]);\n\n const activateSession = useCallback(\n (session: SessionRecord): void => {\n const runtime = readSessionRuntimeConfig(session, defaultRuntimeRef.current);\n activeSessionIdRef.current = session.id;\n setActiveSessionId(session.id);\n clearAuxiliaryState();\n setStatus((current) => ({\n ...current,\n model: runtime.model,\n ...(runtime.provider ? { provider: runtime.provider } : {}),\n session_id: session.id,\n cwd: session.cwd,\n permission_mode: typeof runtime.permissionMode === \"string\" ? runtime.permissionMode : current.permission_mode,\n ...(typeof runtime.maxTurns === \"number\" ? { max_turns: runtime.maxTurns } : {}),\n session_mode: statusSessionMode(runtime.sessionMode),\n }));\n },\n [clearAuxiliaryState],\n );\n\n const returnToHome = useCallback(\n (title?: string): void => {\n pendingNewSessionTitleRef.current = title?.trim() || undefined;\n activeSessionIdRef.current = undefined;\n setActiveSessionId(undefined);\n clearAuxiliaryState();\n setLocalBusy(false);\n setSubmittedRun(null);\n setSelectRequest(null);\n clearDisplayRequest();\n setModal(null);\n setStatus((current) => {\n const next = { ...current };\n delete next.session_id;\n next.model = defaultRuntimeRef.current.model;\n if (defaultRuntimeRef.current.provider) next.provider = defaultRuntimeRef.current.provider;\n else delete next.provider;\n next.session_mode = nextSessionModeRef.current;\n return next;\n });\n },\n [clearAuxiliaryState, clearDisplayRequest],\n );\n\n useEffect(() => {\n if (!daemon?.url) {\n setReady(true);\n reportError(\"Daemon URL is required for TUI. Launch with `ohs` or `ohs --tui` so the CLI can start or attach the daemon.\");\n return;\n }\n let cancelled = false;\n const client = new OpenHarnessClient({\n baseUrl: daemon.url,\n token: daemon.token ?? undefined,\n });\n clientRef.current = client;\n\n void (async () => {\n try {\n await client.health();\n const cwd = daemon.cwd ?? process.cwd();\n const [settings, sessions, commands] = await Promise.all([client.getSettings().catch(() => ({}) as Record<string, unknown>), client.listSessions({ cwd, limit: 20 }), client.listCommands({ cwd }).catch(() => [] as CommandCatalogEntry[])]);\n const model = daemon.model ?? stringSetting(settings.model) ?? \"default\";\n const provider = stringSetting(settings.provider);\n const baseUrl = stringSetting(settings.baseUrl);\n const apiFormat = settings.apiFormat === \"anthropic\" || settings.apiFormat === \"openai\" ? settings.apiFormat : undefined;\n defaultRuntimeRef.current = {\n model,\n ...(provider ? { provider } : {}),\n ...(baseUrl ? { baseUrl } : {}),\n ...(apiFormat ? { apiFormat } : {}),\n };\n if (cancelled) return;\n listedSessionsRef.current = Object.fromEntries(sessions.map((session) => [session.id, session]));\n setCommandCatalog(commands);\n setStatus((current) => ({\n ...current,\n model,\n ...(provider ? { provider } : {}),\n cwd,\n permission_mode: daemon?.permissionMode ?? current.permission_mode,\n ...(typeof daemon?.maxTurns === \"number\" ? { max_turns: daemon.maxTurns } : {}),\n session_mode: statusSessionMode(daemon?.sessionMode),\n }));\n const session = sessions[0];\n if (session && shouldAutoActivateSession(session, model, daemon?.pluginsEnabled)) {\n activateSession(session);\n void client.getSession(session.id).catch(() => {});\n }\n setReady(true);\n } catch (error) {\n if (cancelled) return;\n setReady(true);\n reportError(error instanceof Error ? error.message : String(error));\n }\n })();\n\n return () => {\n cancelled = true;\n clientRef.current = null;\n };\n }, [activateSession, daemon?.cwd, daemon?.maxTurns, daemon?.model, daemon?.permissionMode, daemon?.pluginsEnabled, daemon?.sessionMode, daemon?.token, daemon?.url, reportError]);\n\n useEffect(() => {\n const client = clientRef.current;\n if (!client || !activeSessionId) return;\n const controller = new AbortController();\n\n void (async () => {\n let reconnectNotice = false;\n try {\n for await (const update of syncEvents(client, {\n sessionId: activeSessionId,\n signal: controller.signal,\n })) {\n if (update.source === \"reconnecting\") {\n if (!reconnectNotice) {\n reconnectNotice = true;\n pushSystem(\"reconnecting...\");\n }\n continue;\n }\n if (reconnectNotice) reconnectNotice = false;\n commitClientState(update.state, shouldCoalesceClientState(update));\n }\n } catch (error) {\n if (controller.signal.aborted) return;\n reportError(error instanceof Error ? error.message : String(error));\n }\n })();\n\n return () => {\n clearPendingClientState();\n controller.abort();\n };\n }, [activeSessionId, clearPendingClientState, commitClientState, pushSystem, reportError]);\n\n useEffect(() => {\n const client = clientRef.current;\n const sessionId = activeSessionId;\n if (!client || !sessionId) return;\n const generation = ++auxiliaryGenerationRef.current;\n mcpAbortRef.current?.abort();\n const controller = new AbortController();\n mcpAbortRef.current = controller;\n const isCurrent = () => activeSessionIdRef.current === sessionId && auxiliaryGenerationRef.current === generation;\n\n void client.getSessionMcp(sessionId, { signal: controller.signal })\n .then((servers) => {\n if (!isCurrent()) return;\n setMcpServers(Array.isArray(servers) ? servers.map(mcpServerSnapshot) : []);\n })\n .catch((error) => {\n if (controller.signal.aborted) return;\n if (!isCurrent()) return;\n setMcpServers([]);\n reportAuxiliaryError(\"MCP\", error);\n })\n .finally(() => {\n if (mcpAbortRef.current === controller) mcpAbortRef.current = null;\n });\n\n return () => {\n controller.abort();\n };\n }, [activeSessionId, reportAuxiliaryError]);\n\n useEffect(() => {\n jobDetailGenerationRef.current += 1;\n jobDetailAbortRef.current?.abort();\n jobDetailAbortRef.current = null;\n const idle: JobDetailRemoteState = { status: \"idle\" };\n jobDetailStateRef.current = idle;\n setJobDetailState(idle);\n void refreshJobs();\n return () => {\n jobsAbortRef.current?.abort();\n };\n }, [activeSessionId, refreshJobs]);\n\n useEffect(() => {\n const pending = firstPendingPermission(clientState, activeSessionId);\n if (!pending) {\n shownPermissionIdRef.current = undefined;\n if (modal?.kind === \"permission\") setModal(null);\n return;\n }\n if (shownPermissionIdRef.current === pending.id) return;\n shownPermissionIdRef.current = pending.id;\n setModal(permissionToModal(pending));\n }, [activeSessionId, clientState, modal?.kind]);\n\n const running = hasActiveRun(clientState, activeSessionId);\n useEffect(() => {\n if (!submittedRun) return;\n const run = clientState.buckets[submittedRun.sessionId]?.runs[submittedRun.runId];\n if (!run || run.status === \"pending\" || run.status === \"running\") return;\n void refreshJobs();\n if (run.status === \"failed\") {\n reportError(run.error ?? \"Agent run failed\");\n return;\n }\n setSubmittedRun(null);\n }, [clientState, refreshJobs, reportError, submittedRun]);\n\n const createAndSwitchSession = useCallback(\n async (title?: string): Promise<SessionRecord | undefined> => {\n const client = clientRef.current;\n if (!client) return undefined;\n setLocalBusy(true);\n const cwd = daemon?.cwd ?? process.cwd();\n const model = defaultRuntimeRef.current.model;\n const metadata = sessionRuntimeMetadata({\n model,\n provider: defaultRuntimeRef.current.provider,\n baseUrl: defaultRuntimeRef.current.baseUrl,\n apiFormat: defaultRuntimeRef.current.apiFormat,\n permissionMode: statusRef.current.permission_mode ?? daemon?.permissionMode ?? \"default\",\n maxTurns: statusRef.current.max_turns ?? daemon?.maxTurns,\n sessionMode: nextSessionModeRef.current,\n pluginsEnabled: daemon?.pluginsEnabled,\n });\n const session = await client.createSession({\n cwd,\n model,\n title: title?.trim() || \"TUI\",\n metadata,\n });\n activateSession(session);\n setSelectRequest(null);\n setLocalBusy(false);\n setSubmittedRun(null);\n pendingNewSessionTitleRef.current = undefined;\n return session;\n },\n [activateSession, daemon?.cwd, daemon?.maxTurns, daemon?.model, daemon?.permissionMode, daemon?.pluginsEnabled, daemon?.sessionMode],\n );\n\n useEffect(() => {\n if (!ready || sentInitialPromptRef.current || !config.initial_prompt) return;\n sentInitialPromptRef.current = true;\n const client = clientRef.current;\n if (!client) return;\n setLocalBusy(true);\n void (async () => {\n const session = activeSessionId ? (clientState.sessions[activeSessionId] ?? (await client.getSession(activeSessionId))) : await createAndSwitchSession();\n if (!session) {\n setLocalBusy(false);\n return;\n }\n const response = await client.admitPrompt(session.id, {\n id: createPromptRequestId(),\n content: config.initial_prompt!,\n });\n setLocalBusy(false);\n setSubmittedRun(response.run ? { sessionId: session.id, runId: response.run.id } : null);\n })().catch((error) => reportError(error instanceof Error ? error.message : String(error)));\n }, [activeSessionId, clientState.sessions, config.initial_prompt, createAndSwitchSession, ready, reportError]);\n\n const sendRequest = useCallback(\n (action: TuiAction): void => {\n const client = clientRef.current;\n let sessionId = activeSessionIdRef.current;\n\n void (async () => {\n const runtimeAction = action as TuiAction | { type?: unknown };\n const runtimeType = typeof runtimeAction.type === \"string\" ? runtimeAction.type : \"unknown\";\n switch (action.type) {\n case \"select_model\": {\n if (!client) return;\n const model = action.model.trim();\n const provider = action.provider?.trim() ?? \"\";\n if (!model) return;\n\n if (sessionId) {\n const session = await client.updateSession(sessionId, {\n metadata: patchSessionRuntimeMetadata(\n {},\n {\n model,\n ...(provider ? { provider } : {}),\n },\n ),\n });\n activateSession(session);\n } else {\n const settingsPatch: Record<string, unknown> = { model };\n if (provider) settingsPatch.provider = provider;\n await client.patchSettings(settingsPatch);\n defaultRuntimeRef.current = {\n ...defaultRuntimeRef.current,\n model,\n ...(provider ? { provider } : {}),\n };\n setStatus((current) => ({\n ...current,\n model,\n ...(provider ? { provider } : {}),\n }));\n }\n pushSystem(`Model selected: ${model}`);\n return;\n }\n\n case \"submit_line\": {\n if (!client) return;\n const line = action.line;\n const slash = parseSlashLine(line);\n\n const newSession = line.match(/^\\/new(?:\\s+(.+))?$/);\n if (newSession) {\n returnToHome(newSession[1]);\n return;\n }\n const switchSession = line.match(/^\\/sessions\\s+open\\s+(.+)$/);\n if (switchSession?.[1]) {\n const target = switchSession[1].trim();\n setLocalBusy(false);\n setSubmittedRun(null);\n pendingNewSessionTitleRef.current = undefined;\n setSelectRequest(null);\n const knownSession = clientState.sessions[target] ?? listedSessionsRef.current[target];\n if (knownSession) {\n activateSession(knownSession);\n return;\n }\n const session = await client.getSession(target);\n activateSession(session);\n return;\n }\n\n if (slash?.name === \"/resume\") {\n if (!sessionId) {\n pushSystem(\"No active session to resume.\");\n return;\n }\n const recoverable = recoverableInterruptedRuns(clientState.buckets[sessionId]);\n if (!slash.args) {\n if (recoverable.length === 0) {\n pushSystem(\"No interrupted prompt runs are available to resume.\");\n return;\n }\n clearDisplayRequest();\n setSelectRequest({\n title: \"Resume interrupted run\",\n submitPrefix: \"/resume \",\n options: recoverable.map((run) => ({\n value: run.id,\n label: run.prompt.length > 72 ? `${run.prompt.slice(0, 72)}...` : run.prompt,\n description: run.error ?? \"Interrupted before completion\",\n })),\n });\n return;\n }\n const runId = slash.args.trim();\n if (!recoverable.some((run) => run.id === runId)) {\n pushSystem(`Run is not available for recovery: ${runId}`);\n return;\n }\n setLocalBusy(true);\n const response = await client.resumeInterruptedRun(sessionId, runId, { id: createPromptRequestId() });\n setLocalBusy(false);\n setSubmittedRun(response.run ? { sessionId, runId: response.run.id } : null);\n setSelectRequest(null);\n return;\n }\n\n let slashResult: Awaited<ReturnType<typeof dispatchSessionSlashCommand>>;\n try {\n slashResult = await dispatchSessionSlashCommand(slash, {\n client,\n sessionId,\n pushSystem,\n presentSystem: (title, content) => showDisplayRequest({ title, content }),\n statusRef,\n commandCatalogRef,\n clientState,\n localBusy,\n cacheFirstRead,\n daemon,\n setStatus: setStatusAndDefault,\n });\n } catch (error) {\n if (slash && JOBS_AUXILIARY_SLASH_COMMANDS.has(slash.name)) {\n reportAuxiliaryError(\"Jobs\", error);\n return;\n }\n throw error;\n }\n if (slashResult === \"handled\") {\n if (slash?.name === \"/background\" && slash.args.trim() && sessionId) {\n await refreshJobs();\n }\n return;\n }\n if (slashResult === \"local_ui_ignored\") return;\n\n if (slash) {\n const catalogEntry = commandCatalogRef.current.find((entry) => entry.name === slash.name);\n if (catalogEntry?.kind === \"template\") {\n if (!sessionId) return;\n setLocalBusy(true);\n const commandName = slash.name.replace(/^\\//, \"\");\n const response = await client.admitPrompt(sessionId, {\n id: createPromptRequestId(),\n content: slash.args,\n metadata: {\n skillInvocation: {\n name: commandName,\n commandName,\n ...(catalogEntry.displayName ? { displayName: catalogEntry.displayName } : {}),\n source: catalogEntry.source,\n invocationSource: \"slash\",\n },\n },\n });\n setLocalBusy(false);\n setSubmittedRun(response.run ? { sessionId, runId: response.run.id } : null);\n return;\n }\n pushSystem(`Unknown command: ${slash.name}`);\n return;\n }\n\n if (!sessionId) {\n const session = await createAndSwitchSession(pendingNewSessionTitleRef.current);\n if (!session) return;\n sessionId = session.id;\n }\n setLocalBusy(true);\n const response = await client.admitPrompt(sessionId, {\n id: createPromptRequestId(),\n content: line,\n });\n setLocalBusy(false);\n setSubmittedRun(response.run ? { sessionId, runId: response.run.id } : null);\n return;\n }\n\n case \"delete_session\": {\n if (!client) return;\n const target = action.session_id;\n if (!target) return;\n const archived = await client.archiveSession(target);\n const archivedAt = archived.archivedAt ?? Date.now();\n delete listedSessionsRef.current[target];\n setClientState((current) => archiveClientSession(current, target, archivedAt));\n setLocalBusy(false);\n setSubmittedRun(null);\n setSelectRequest((current) =>\n current\n ? {\n ...current,\n options: current.options.filter((option) => option.value !== target),\n }\n : current,\n );\n if (target === activeSessionIdRef.current) {\n const remaining = listTopLevelSessions(\n Object.values({\n ...clientState.sessions,\n ...listedSessionsRef.current,\n [target]: { ...archived, status: \"archived\", archivedAt },\n }),\n );\n if (remaining[0]) {\n activateSession(remaining[0]);\n } else {\n const sessions = await client.listSessions({\n cwd: daemon?.cwd ?? undefined,\n includeArchived: false,\n limit: 20,\n });\n listedSessionsRef.current = Object.fromEntries(sessions.map((session) => [session.id, session]));\n const remoteNext = sessions.find((session) => session.id !== target);\n if (remoteNext) activateSession(remoteNext);\n else returnToHome();\n }\n }\n return;\n }\n\n case \"interrupt\": {\n if (!client) return;\n if (sessionId) await client.interruptSession(sessionId);\n setLocalBusy(false);\n setSubmittedRun(null);\n return;\n }\n\n case \"permission_response\": {\n if (!client) return;\n const requestId = action.request_id;\n const allowed = action.allowed;\n await client.replyPermission(requestId, {\n status: allowed ? \"approved\" : \"denied\",\n decision: action.scope === \"session\" ? \"session\" : \"once\",\n clientId: \"tui\",\n });\n setModal(null);\n return;\n }\n\n case \"list_sessions\": {\n if (!client) return;\n const cachedSessions = {\n ...listedSessionsRef.current,\n ...clientState.sessions,\n };\n const cachedOptions = sessionSelectOptions(Object.values(cachedSessions), activeSessionIdRef.current);\n clearDisplayRequest();\n setSelectRequest({\n title: \"Sessions\",\n submitPrefix: \"/sessions open \",\n options: cachedOptions,\n });\n const sessions = await client.listSessions({\n cwd: daemon?.cwd ?? undefined,\n includeArchived: false,\n limit: 20,\n });\n listedSessionsRef.current = Object.fromEntries(sessions.map((session) => [session.id, session]));\n setSelectRequest((current) =>\n current?.submitPrefix === \"/sessions open \"\n ? {\n title: \"Sessions\",\n submitPrefix: \"/sessions open \",\n options: sessionSelectOptions(sessions, activeSessionIdRef.current),\n }\n : current,\n );\n return;\n }\n\n case \"set_permission_mode\": {\n if (!client) return;\n const mode = action.permission_mode;\n setStatus((current) => ({ ...current, permission_mode: mode }));\n if (sessionId) {\n await client.updateSession(sessionId, {\n metadata: patchSessionRuntimeMetadata({}, { permissionMode: mode }),\n });\n }\n return;\n }\n\n case \"question_response\": {\n if (!client) return;\n reportError(\"Interactive question responses are not available through the daemon client.\");\n return;\n }\n\n case \"set_session_mode\": {\n if (!client) return;\n if (sessionId) {\n pushSystem(\"Coordinator mode can only be changed before starting a new session. Use /new first.\");\n return;\n }\n const mode = normalizeSessionMode(action.session_mode);\n nextSessionModeRef.current = statusSessionMode(mode);\n setStatus((current) => ({\n ...current,\n session_mode: nextSessionModeRef.current,\n }));\n return;\n }\n\n case \"job_request\": {\n if (!client) {\n reportAuxiliaryError(\"Jobs\", \"The daemon client is not connected.\");\n return;\n }\n const currentSessionId = activeSessionIdRef.current;\n if (!currentSessionId) return;\n try {\n switch (action.job_action) {\n case \"open\":\n await refreshJobs();\n return;\n case \"refresh\": {\n jobControlGenerationRef.current += 1;\n jobControlAbortRef.current?.abort();\n jobControlAbortRef.current = null;\n const detail = jobDetailStateRef.current;\n const detailJobId = detail.status === \"idle\" ? undefined : detail.jobId;\n await Promise.all([\n refreshJobs(),\n detailJobId\n ? loadJobDetail(client, currentSessionId, detailJobId)\n : Promise.resolve(),\n ]);\n return;\n }\n case \"select\":\n jobControlGenerationRef.current += 1;\n jobControlAbortRef.current?.abort();\n jobControlAbortRef.current = null;\n await loadJobDetail(client, currentSessionId, action.job_id);\n return;\n case \"cancel\": {\n const controlGeneration = ++jobControlGenerationRef.current;\n const detailGeneration = jobDetailGenerationRef.current;\n jobControlAbortRef.current?.abort();\n const controller = new AbortController();\n jobControlAbortRef.current = controller;\n let response: Awaited<ReturnType<OpenHarnessClient[\"cancelJob\"]>>;\n try {\n response = await client.cancelJob(\n action.job_id,\n {\n sessionId: currentSessionId,\n reason: action.reason,\n },\n { signal: controller.signal },\n );\n } catch (error) {\n if (activeSessionIdRef.current !== currentSessionId) return;\n if (controller.signal.aborted || jobControlGenerationRef.current !== controlGeneration) {\n await refreshJobs();\n return;\n }\n throw error;\n } finally {\n if (jobControlAbortRef.current === controller) jobControlAbortRef.current = null;\n }\n if (activeSessionIdRef.current !== currentSessionId) return;\n const ownsDetail = !controller.signal.aborted &&\n jobControlGenerationRef.current === controlGeneration &&\n jobDetailGenerationRef.current === detailGeneration;\n const validated = validateJobSnapshot(response, currentSessionId, action.job_id);\n if (!validated.snapshot) {\n if (controller.signal.aborted || jobControlGenerationRef.current !== controlGeneration) {\n await refreshJobs();\n return;\n }\n throw new Error(validated.error ?? \"Job snapshot has invalid fields.\");\n }\n const snapshot = validated.snapshot;\n const next = mergeJobSnapshot(jobStateRef.current, snapshot, Date.now());\n jobStateRef.current = next;\n setJobState(next);\n if (ownsDetail) {\n await loadJobDetail(client, currentSessionId, action.job_id);\n }\n await refreshJobs();\n return;\n }\n case \"send\": {\n const controlGeneration = ++jobControlGenerationRef.current;\n const detailGeneration = jobDetailGenerationRef.current;\n jobControlAbortRef.current?.abort();\n const controller = new AbortController();\n jobControlAbortRef.current = controller;\n try {\n await client.sendJob(\n action.job_id,\n {\n sessionId: currentSessionId,\n data: action.data,\n },\n { signal: controller.signal },\n );\n } catch (error) {\n if (activeSessionIdRef.current !== currentSessionId) return;\n if (controller.signal.aborted || jobControlGenerationRef.current !== controlGeneration) {\n await refreshJobs();\n return;\n }\n throw error;\n } finally {\n if (jobControlAbortRef.current === controller) jobControlAbortRef.current = null;\n }\n if (activeSessionIdRef.current !== currentSessionId) return;\n const ownsDetail = !controller.signal.aborted &&\n jobControlGenerationRef.current === controlGeneration &&\n jobDetailGenerationRef.current === detailGeneration;\n if (ownsDetail) {\n await loadJobDetail(client, currentSessionId, action.job_id);\n }\n await refreshJobs();\n return;\n }\n }\n } catch (error) {\n reportAuxiliaryError(\"Jobs\", error);\n return;\n }\n }\n\n default: {\n const exhaustive: never = action;\n void exhaustive;\n reportError(`Unsupported TUI action: ${runtimeType}`);\n return;\n }\n }\n })().catch((error) => {\n reportError(error instanceof Error ? error.message : String(error));\n });\n },\n [activeSessionId, activateSession, cacheFirstRead, clearDisplayRequest, clientState, createAndSwitchSession, daemon, loadJobDetail, localBusy, pushSystem, refreshJobs, reportAuxiliaryError, reportError, returnToHome, showDisplayRequest],\n );\n\n const bucket = activeSessionId ? clientState.buckets[activeSessionId] : undefined;\n const recoveryItems = useMemo(\n () =>\n recoverableInterruptedRuns(bucket).map((run) => ({\n id: `recovery:${run.id}`,\n role: \"system\" as const,\n text: `Run interrupted${run.error ? `: ${run.error}` : \"\"}\\nUse /resume ${run.id} to replay its original prompt.`,\n })),\n [bucket],\n );\n const transcriptView = useMemo(() => {\n const base = splitStreamingAssistant(bucketToTranscript(bucket));\n return {\n transcript: [...base.items, ...recoveryItems, ...(activeSessionId ? (systemItemsBySession[activeSessionId] ?? []) : globalSystemItems)],\n assistantBuffer: base.assistantBuffer,\n };\n }, [activeSessionId, bucket, globalSystemItems, recoveryItems, systemItemsBySession]);\n const submittedRunRecord = submittedRun ? clientState.buckets[submittedRun.sessionId]?.runs[submittedRun.runId] : undefined;\n const waitingForSubmittedRun = !!submittedRun && (!submittedRunRecord || submittedRunRecord.status === \"pending\" || submittedRunRecord.status === \"running\");\n const commandDetails = useMemo(() => mergeCommandDetails(commandCatalog), [commandCatalog]);\n const commands = useMemo(() => commandDetails.map((entry) => entry.name), [commandDetails]);\n\n return useMemo(\n () => ({\n transcript: transcriptView.transcript,\n assistantBuffer: transcriptView.assistantBuffer,\n status,\n jobState,\n jobs: jobState.jobs,\n jobDetailState,\n commands,\n commandDetails,\n mcpServers,\n modal,\n selectRequest,\n displayRequest,\n busy: localBusy || running || waitingForSubmittedRun,\n ready,\n setModal,\n setSelectRequest,\n setDisplayRequest,\n setBusy: setLocalBusy,\n loadModels,\n sendRequest,\n }),\n [commandDetails, commands, displayRequest, jobDetailState, jobState, loadModels, localBusy, mcpServers, modal, ready, running, selectRequest, sendRequest, status, transcriptView, waitingForSubmittedRun],\n );\n}\n",
25
+ "// ─── 列表/视口 ────────────────────────────────────────────────────────────────\n/** 补全浮窗(命令 / 文件)和 DialogSelect 的最大可见行数 */\nexport const AC_VISIBLE_ITEMS = 10;\n\n// ─── 上限 ────────────────────────────────────────────────────────────────────\n/** 输入历史保留条数 */\nexport const HISTORY_LIMIT = 100;\n/** Swarm 通知队列保留条数(slice tail) */\nexport const SWARM_NOTIFICATION_TAIL = 20;\n\n// ─── 计时器 ──────────────────────────────────────────────────────────────────\n/** 双击 Esc 取消:第一次 Esc 后提示的显示时长 (ms) */\nexport const ESC_HINT_TIMEOUT_MS = 2000;\n/** Spinner 动画帧间隔 (ms) */\nexport const SPINNER_INTERVAL_MS = 100;\n\n// ─── 布局 ────────────────────────────────────────────────────────────────────\n/** 终端宽度达到此值时自动展开 Sidebar */\nexport const SIDEBAR_AUTO_OPEN_WIDTH = 110;\n/** Footer cwd 缩略最大字符数 */\nexport const CWD_DISPLAY_MAX_LEN = 40;\n\n// ─── 显示格式 ─────────────────────────────────────────────────────────────────\n/** Token 计数超过此值时显示为 \"Nk\" */\nexport const TOKEN_K_THRESHOLD = 1000;\n/** 多行输入框最大行高 */\nexport const TEXTAREA_MAX_LINES = 6;\n/** Minimum prompt textarea rows; keeps the prompt chrome from jumping on single-line edits. */\nexport const TEXTAREA_MIN_LINES = 2;\n",
26
+ "import { useEffect, useRef, useState } from \"react\";\nimport { ESC_HINT_TIMEOUT_MS } from \"../ui/constants\";\n\n/**\n * 双击 Esc 取消运行中的对话(对齐 opencode)。\n *\n * 第一次按 Esc 在 2s 内显示提示(escHint=true),期间再按 Esc 触发 onInterrupt;\n * 超时或对话结束(busy→false)自动复位。调用方在全局键盘处理里转发 Esc 到 handleEscape。\n *\n * @param busy 当前是否有运行中的对话\n * @param onInterrupt 第二次 Esc 时的中断回调(通常向后端发 interrupt 请求)\n */\nexport function useEscToCancel(busy: boolean, onInterrupt: () => void) {\n const [escHint, setEscHint] = useState(false);\n const escHintRef = useRef(false);\n const escTimerRef = useRef<ReturnType<typeof setTimeout> | null>(null);\n\n // 对话结束即复位,避免提示残留到下一轮。\n useEffect(() => {\n if (!busy) {\n if (escTimerRef.current) clearTimeout(escTimerRef.current);\n escTimerRef.current = null;\n escHintRef.current = false;\n setEscHint(false);\n }\n }, [busy]);\n\n const handleEscape = (): void => {\n if (escHintRef.current) {\n // 第二次 Esc — 中断\n if (escTimerRef.current) clearTimeout(escTimerRef.current);\n escTimerRef.current = null;\n escHintRef.current = false;\n setEscHint(false);\n onInterrupt();\n } else {\n // 第一次 Esc — 显示提示 2s\n escHintRef.current = true;\n setEscHint(true);\n escTimerRef.current = setTimeout(() => {\n escHintRef.current = false;\n setEscHint(false);\n escTimerRef.current = null;\n }, ESC_HINT_TIMEOUT_MS);\n }\n };\n\n return { escHint, handleEscape };\n}\n",
27
+ "import type { UiNode } from \"../types/ui\";\nimport { createContext, useContext, useState } from \"react\";\nimport { type ThemeConfig, BUILTIN_THEMES, defaultTheme, getTheme } from \"./builtinThemes\";\n\nexport type { ThemeConfig };\n\ntype ThemeContextValue = {\n theme: ThemeConfig;\n setThemeName: (name: string) => void;\n};\n\nconst ThemeContext = createContext<ThemeContextValue>({\n theme: defaultTheme,\n setThemeName: () => undefined,\n});\n\nexport function ThemeProvider({\n children,\n initialTheme = \"default\",\n}: {\n children: UiNode;\n initialTheme?: string;\n}) {\n const [theme, setTheme] = useState<ThemeConfig>(() => getTheme(initialTheme));\n\n const setThemeName = (name: string): void => {\n const resolved = BUILTIN_THEMES[name] ?? defaultTheme;\n setTheme(resolved);\n };\n\n return (\n <ThemeContext.Provider value={{ theme, setThemeName }}>\n {children}\n </ThemeContext.Provider>\n );\n}\n\nexport function useTheme(): ThemeContextValue {\n return useContext(ThemeContext);\n}\n",
28
+ "/**\n * Fuzzy filter: case-insensitive matching with scoring.\n *\n * Matching strategy:\n * - If query contains a word separator (`/`), apply prefix filtering:\n * the label must start with the query (case-insensitive). This supports\n * slash-command prefix filtering like `/p` → `/permissions`, `/plan`.\n * - Otherwise, use subsequence matching across the full label.\n * Score: consecutive run bonus + label-prefix bonus.\n *\n * Sort order: descending by score, stable (same-score items preserve input order).\n */\nexport function fuzzyFilter<T>(\n items: T[],\n query: string,\n key: (t: T) => string,\n): T[] {\n if (query === \"\") return items;\n const q = query.toLowerCase();\n\n const hasSeparator = q.includes(\"/\");\n\n const scored: Array<{ item: T; score: number; index: number }> = [];\n\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n const label = key(item).toLowerCase();\n\n let score: number;\n if (hasSeparator) {\n // Prefix filter: label must start with the query\n score = label.startsWith(q) ? 100 + (q.length === label.length ? 10 : 0) : 0;\n } else {\n score = scoreSubsequence(label, q);\n }\n\n if (score > 0) {\n scored.push({ item, score, index: i });\n }\n }\n\n // Stable descending sort by score\n scored.sort((a, b) => b.score - a.score || a.index - b.index);\n return scored.map((s) => s.item);\n}\n\n/**\n * Like fuzzyFilter but returns items with their scores, useful for frecency tie-breaking.\n * Reuses the private scoreSubsequence function already defined below.\n */\nexport function fuzzyFilterScored<T>(\n items: T[],\n query: string,\n key: (t: T) => string,\n): Array<{ item: T; score: number }> {\n if (query === \"\") return items.map((item) => ({ item, score: 0 }));\n const q = query.toLowerCase();\n const hasSeparator = q.includes(\"/\");\n\n const scored: Array<{ item: T; score: number; index: number }> = [];\n for (let i = 0; i < items.length; i++) {\n const item = items[i]!;\n const label = key(item).toLowerCase();\n let score: number;\n if (hasSeparator) {\n score = label.startsWith(q) ? 100 + (q.length === label.length ? 10 : 0) : 0;\n } else {\n score = scoreSubsequence(label, q);\n }\n if (score > 0) scored.push({ item, score, index: i });\n }\n scored.sort((a, b) => b.score - a.score || a.index - b.index);\n return scored.map(({ item, score }) => ({ item, score }));\n}\n\nfunction scoreSubsequence(label: string, query: string): number {\n let qi = 0;\n let score = 0;\n let consecutive = 0;\n\n for (let li = 0; li < label.length && qi < query.length; li++) {\n if (label[li] === query[qi]) {\n consecutive++;\n score += consecutive * 2;\n // Bonus for matching at label start\n if (li === 0 && qi === 0) score += 10;\n qi++;\n } else {\n consecutive = 0;\n }\n }\n\n if (qi < query.length) return 0; // Not a full subsequence match\n return score;\n}\n",
29
+ "import { useState, useCallback } from \"react\";\n\n/**\n * 管理可滚动列表的高亮下标。\n * count 变化时 moveDown 会自动 clamp,但 index 不自动重置——\n * 调用者在列表内容变化时自行调用 setIndex(0)。\n */\nexport function useListNavigation(count: number) {\n const [index, setIndex] = useState(0);\n\n const moveUp = useCallback(() => {\n setIndex((prev) => Math.max(0, prev - 1));\n }, []);\n\n const moveDown = useCallback(() => {\n setIndex((prev) => Math.max(0, Math.min(count - 1, prev + 1)));\n }, [count]);\n\n return { index, setIndex, moveUp, moveDown };\n}\n",
30
30
  "import { useState, useEffect, useRef } from \"react\";\nimport { useKeyboard } from \"@opentui/react\";\nimport { TextAttributes, type ScrollBoxRenderable } from \"@opentui/core\";\nimport { useTheme } from \"../theme/ThemeContext\";\nimport { fuzzyFilter } from \"./fuzzy\";\nimport { useListNavigation } from \"../hooks/useListNavigation\";\nimport { AC_VISIBLE_ITEMS } from \"./constants\";\n\nconst SCROLLBOX_CHROME_ROWS = 3;\n\nexport type DialogSelectItem = {\n value: string;\n label: string;\n description?: string;\n hint?: string;\n active?: boolean;\n};\n\nexport function DialogSelect(props: {\n title: string;\n items: DialogSelectItem[];\n onSelect: (value: string) => void;\n onDelete?: (value: string) => void;\n searchable?: boolean;\n initialIndex?: number;\n}) {\n const { title, items, onSelect, onDelete, searchable = true, initialIndex = 0 } = props;\n const { theme } = useTheme();\n\n const [query, setQuery] = useState(\"\");\n const mountedRef = useRef(false);\n const listRef = useRef<ScrollBoxRenderable | null>(null);\n\n const filtered = searchable\n ? fuzzyFilter(items, query, (i) => i.label)\n : items;\n\n const { index: selectedIndex, setIndex: setSelectedIndex, moveUp, moveDown } =\n useListNavigation(filtered.length);\n\n // Keep the caller's initial preselection on mount, then reset filtered lists to the top.\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n setSelectedIndex(initialIndex);\n return;\n }\n setSelectedIndex(0);\n listRef.current?.scrollTo(0);\n }, [query, initialIndex, setSelectedIndex]);\n\n // After deleting/filtering items, keep the highlighted row inside the list.\n useEffect(() => {\n if (filtered.length === 0) return;\n if (selectedIndex >= filtered.length) setSelectedIndex(filtered.length - 1);\n }, [filtered.length, selectedIndex, setSelectedIndex]);\n\n useEffect(() => {\n if (filtered.length === 0) return;\n listRef.current?.scrollChildIntoView(`dialog-select-row-${selectedIndex}`);\n }, [filtered.length, selectedIndex]);\n\n const listHeight = Math.min(filtered.length, AC_VISIBLE_ITEMS) + SCROLLBOX_CHROME_ROWS;\n\n useKeyboard((key) => {\n if (filtered.length === 0) return;\n\n if (key.name === \"up\") { moveUp(); return; }\n if (key.name === \"down\") { moveDown(); return; }\n if (key.name === \"return\") {\n const item = filtered[selectedIndex];\n if (item) onSelect(item.value);\n return;\n }\n if (key.ctrl && key.name === \"d\" && onDelete) {\n const item = filtered[selectedIndex];\n if (item) onDelete(item.value);\n return;\n }\n if (key.name === \"pageup\") {\n listRef.current?.scrollBy(-1, \"viewport\");\n return;\n }\n if (key.name === \"pagedown\") {\n listRef.current?.scrollBy(1, \"viewport\");\n return;\n }\n\n // Digit shortcuts 1-9 only when not searchable.\n if (!searchable) {\n const digit = key.name ? parseInt(key.name, 10) : NaN;\n if (!isNaN(digit) && digit >= 1 && digit <= 9) {\n const targetIndex = digit - 1;\n const item = filtered[targetIndex];\n if (item) onSelect(item.value);\n }\n }\n });\n\n return (\n <box flexDirection=\"column\">\n <text attributes={TextAttributes.BOLD} fg={theme.colors.accent}>\n {title}\n </text>\n\n {searchable && (\n <input\n focused\n placeholder=\"Search...\"\n onInput={(value: string) => setQuery(value)}\n />\n )}\n\n {filtered.length === 0 ? (\n <text fg={theme.colors.muted}>no matches</text>\n ) : (\n <>\n <scrollbox\n ref={listRef}\n scrollY\n width=\"100%\"\n height={listHeight}\n flexDirection=\"column\"\n viewportCulling={false}\n horizontalScrollbarOptions={{ visible: false }}\n >\n {filtered.map((item, index) => {\n const isSelected = index === selectedIndex;\n const prefix = item.active ? \"✓ \" : \" \";\n\n return (\n <box\n key={item.value}\n id={`dialog-select-row-${index}`}\n flexDirection=\"row\"\n width=\"100%\"\n height={1}\n flexShrink={0}\n backgroundColor={isSelected ? theme.colors.accent : undefined}\n onMouseUp={() => {\n setSelectedIndex(index);\n onSelect(item.value);\n }}\n >\n <text fg={isSelected ? theme.colors.background : theme.colors.foreground}>\n {prefix}\n {item.label}\n </text>\n {item.description != null && (\n <text fg={theme.colors.muted}> {item.description}</text>\n )}\n {item.hint != null && (\n <text fg={theme.colors.muted}> {item.hint}</text>\n )}\n </box>\n );\n })}\n </scrollbox>\n {onDelete && (\n <text fg={theme.colors.muted}> ctrl+d delete</text>\n )}\n </>\n )}\n </box>\n );\n}\n",
31
- "import { TextAttributes } from \"@opentui/core\";\r\nimport { useTheme } from \"../theme/ThemeContext\";\r\n\r\nconst MAX_VISIBLE_LINES = 18;\r\n\r\nexport function DialogText({ title, content }: { title: string; content: string }) {\r\n const { theme } = useTheme();\r\n const c = theme.colors;\r\n const lines = content.replace(/\\n$/, \"\").split(\"\\n\");\r\n\r\n return (\r\n <box flexDirection=\"column\">\r\n <text attributes={TextAttributes.BOLD} fg={c.accent}>{title}</text>\r\n <scrollbox\r\n focused\r\n scrollY\r\n height={Math.min(Math.max(lines.length, 1), MAX_VISIBLE_LINES)}\r\n flexDirection=\"column\"\r\n >\r\n {lines.map((line, index) => (\r\n <text key={index} fg={c.foreground} wrapMode=\"word\">\r\n {line.length > 0 ? line : \" \"}\r\n </text>\r\n ))}\r\n </scrollbox>\r\n <text fg={c.muted}>esc close</text>\r\n </box>\r\n );\r\n}\r\n",
31
+ "import { TextAttributes } from \"@opentui/core\";\nimport { useTheme } from \"../theme/ThemeContext\";\n\nconst MAX_VISIBLE_LINES = 18;\n\nexport function DialogText({ title, content }: { title: string; content: string }) {\n const { theme } = useTheme();\n const c = theme.colors;\n const lines = content.replace(/\\n$/, \"\").split(\"\\n\");\n\n return (\n <box flexDirection=\"column\">\n <text attributes={TextAttributes.BOLD} fg={c.accent}>{title}</text>\n <scrollbox\n focused\n scrollY\n height={Math.min(Math.max(lines.length, 1), MAX_VISIBLE_LINES)}\n flexDirection=\"column\"\n >\n {lines.map((line, index) => (\n <text key={index} fg={c.foreground} wrapMode=\"word\">\n {line.length > 0 ? line : \" \"}\n </text>\n ))}\n </scrollbox>\n <text fg={c.muted}>esc close</text>\n </box>\n );\n}\n",
32
32
  "import { useTheme } from \"../../theme/ThemeContext\";\n\nconst MAX_VISIBLE_LINES = 16;\n\n/** 渲染统一 diff:增/删/hunk 头分色,超出可视高度可上下滚动。 */\nexport function DiffView({ diff }: { diff: string }) {\n const { theme } = useTheme();\n const c = theme.colors;\n const lines = diff\n .replace(/\\n$/, \"\")\n .split(\"\\n\")\n .filter((l) => !l.startsWith(\"\\\\ No newline\"));\n\n return (\n <scrollbox\n focused\n scrollY\n height={Math.min(lines.length, MAX_VISIBLE_LINES)}\n flexDirection=\"column\"\n >\n {lines.map((line, i) => {\n if (line.startsWith(\"+++\") || line.startsWith(\"---\")) {\n return <text key={i} fg={c.muted}>{line}</text>;\n }\n if (line.startsWith(\"@@\")) return <text key={i} fg={c.primary}>{line}</text>;\n if (line.startsWith(\"+\")) return <text key={i} fg={c.success}>{line}</text>;\n if (line.startsWith(\"-\")) return <text key={i} fg={c.error}>{line}</text>;\n return <text key={i} fg={c.muted}>{line}</text>;\n })}\n </scrollbox>\n );\n}\n",
33
- "import { useCallback, useRef } from \"react\";\nimport { useKeyboard } from \"@opentui/react\";\r\nimport { TextAttributes } from \"@opentui/core\";\r\nimport { useTheme } from \"../../theme/ThemeContext\";\r\nimport { DiffView } from \"./DiffView\";\r\n\r\n/** 工具授权弹层:y=本次放行,a=整个会话放行,n=拒绝。带可选 reason 与 diff 预览。 */\r\nexport function PermissionDialog({\r\n modal,\r\n onRespond,\r\n}: {\r\n modal: Record<string, unknown>;\r\n onRespond: (allowed: boolean, scope: \"once\" | \"session\") => void;\r\n}) {\r\n const { theme } = useTheme();\r\n const respondedRef = useRef(false);\r\n\r\n const respond = useCallback(\r\n (allowed: boolean, scope: \"once\" | \"session\") => {\r\n if (respondedRef.current) return;\r\n respondedRef.current = true;\r\n onRespond(allowed, scope);\r\n },\r\n [onRespond],\r\n );\r\n\r\n useKeyboard((key) => {\r\n if (key.name === \"y\") {\r\n respond(true, \"once\");\r\n } else if (key.name === \"a\") {\r\n respond(true, \"session\");\r\n } else if (key.name === \"n\" || key.name === \"escape\") {\r\n respond(false, \"once\");\r\n }\r\n });\r\n\r\n const toolName = modal.tool_name ? String(modal.tool_name) : \"tool\";\r\n const reason = modal.reason ? String(modal.reason) : null;\r\n const diff = modal.diff ? String(modal.diff) : null;\r\n const diffPath = modal.diff_path ? String(modal.diff_path) : null;\r\n\r\n return (\r\n <box flexDirection=\"column\">\r\n <text>\r\n <span fg={theme.colors.warning} attributes={TextAttributes.BOLD}>{\"┌ \"}</span>\r\n <span attributes={TextAttributes.BOLD}>{\"Allow \"}</span>\r\n <span fg={theme.colors.info} attributes={TextAttributes.BOLD}>{toolName}</span>\r\n <span attributes={TextAttributes.BOLD}>{\"?\"}</span>\r\n </text>\r\n {reason ? (\r\n <text>\r\n <span fg={theme.colors.warning}>{\"│ \"}</span>\r\n <span fg={theme.colors.muted}>{reason}</span>\r\n </text>\r\n ) : null}\r\n {diff ? (\r\n <box flexDirection=\"column\">\r\n {diffPath ? <text fg={theme.colors.muted}>{` ${diffPath}`}</text> : null}\r\n <DiffView diff={diff} />\r\n </box>\r\n ) : null}\r\n <text>\r\n <span fg={theme.colors.warning}>{\"└ \"}</span>\r\n <span fg={theme.colors.success}>{\"[y] Allow\"}</span>\r\n <span>{\" \"}</span>\r\n <span fg={theme.colors.success}>{\"[a] Allow for session\"}</span>\r\n <span>{\" \"}</span>\r\n <span fg={theme.colors.error}>{\"[n/esc] Deny\"}</span>\r\n </text>\r\n </box>\r\n );\r\n}\r\n",
34
- "import { useState } from \"react\";\nimport { useKeyboard } from \"@opentui/react\";\r\nimport { TextAttributes } from \"@opentui/core\";\r\nimport { useTheme } from \"../../theme/ThemeContext\";\r\n\r\n/** 工具向用户提问的弹层:单行输入,enter 提交。带可选 tool/reason 提示。 */\r\nexport function QuestionDialog({\r\n modal,\r\n onSubmit,\r\n}: {\r\n modal: Record<string, unknown>;\r\n onSubmit: (answer: string) => void;\r\n}) {\r\n const { theme } = useTheme();\r\n const [inputValue, setInputValue] = useState(\"\");\r\n const question = String(modal.question ?? \"Question\");\r\n const toolName = modal.tool_name ? String(modal.tool_name) : null;\r\n const reason = modal.reason ? String(modal.reason) : null;\r\n\r\n useKeyboard((key) => {\r\n if (key.name === \"escape\") {\r\n onSubmit(\"\");\r\n return;\r\n }\r\n if (key.name === \"return\") {\r\n onSubmit(inputValue);\r\n }\r\n });\r\n\r\n return (\r\n <box flexDirection=\"column\">\r\n <text fg={theme.colors.accent} attributes={TextAttributes.BOLD}>\r\n {\"? \" + question}\r\n </text>\r\n {toolName ? (\r\n <text fg={theme.colors.muted}>{` Tool: ${toolName}`}</text>\r\n ) : null}\r\n {reason ? (\r\n <text fg={theme.colors.muted}>{` Reason: ${reason}`}</text>\r\n ) : null}\r\n <input\r\n focused\r\n placeholder=\"Answer...\"\r\n onInput={(value: string) => setInputValue(value)}\r\n />\r\n <text fg={theme.colors.muted}>{\" enter: submit esc: cancel\"}</text>\r\n </box>\r\n );\r\n}\r\n",
35
- "import { useEffect, useRef } from \"react\";\nimport { DialogSelect } from \"../ui/DialogSelect\";\r\nimport { DialogText } from \"../ui/DialogText\";\r\nimport { PermissionDialog } from \"../components/dialogs/PermissionDialog\";\r\nimport { QuestionDialog } from \"../components/dialogs/QuestionDialog\";\r\nimport type { useDialog } from \"../ui/DialogContext\";\r\nimport type { TuiSessionController } from \"./sessionController\";\r\n\r\ntype Session = TuiSessionController;\r\ntype Dialog = ReturnType<typeof useDialog>;\r\n\r\n/**\r\n * 把后端发来的 modal / select 请求接到 Dialog 栈上。\r\n *\r\n * - permission:渲染 PermissionDialog;ESC 兜底按拒绝回应(否则后端挂起)。\r\n * - question:渲染 QuestionDialog;ESC 兜底回空串(否则后端 questionRequests 永久挂起)。\r\n * - select:空选项直接丢弃;否则渲染 DialogSelect,选中后提交 `${submitPrefix}${value}`。\r\n */\r\nexport function useModalWiring(session: Session, dialog: Dialog): void {\r\n // ── Dialog wiring for modal (permission / question) ─────────────────────────\r\n useEffect(() => {\r\n const modal = session.modal;\r\n if (!modal) return;\r\n\r\n if (modal.kind === \"permission\") {\n const requestId = modal.request_id;\n if (typeof requestId !== \"string\" || !requestId) return;\n const respondedRef = { current: false };\r\n\r\n const sendResponse = (allowed: boolean, scope: \"once\" | \"session\"): void => {\r\n if (respondedRef.current) return;\r\n respondedRef.current = true;\r\n session.sendRequest({\r\n type: \"permission_response\",\r\n request_id: requestId,\r\n allowed,\r\n scope,\r\n });\r\n session.setModal(null);\r\n dialog.close();\r\n };\r\n\r\n const onClose = (): void => {\r\n // ESC fallback: deny if not already responded\r\n if (!respondedRef.current) {\r\n respondedRef.current = true;\r\n session.sendRequest({\r\n type: \"permission_response\",\r\n request_id: requestId,\r\n allowed: false,\r\n scope: \"once\",\r\n });\r\n session.setModal(null);\r\n }\r\n };\r\n\r\n dialog.replace(\r\n <PermissionDialog modal={modal} onRespond={sendResponse} />,\r\n onClose,\r\n );\r\n return;\r\n }\r\n\r\n if (modal.kind === \"question\") {\n const requestId = modal.request_id;\n if (typeof requestId !== \"string\" || !requestId) return;\n const respondedRef = { current: false };\r\n\r\n const sendAnswer = (answer: string): void => {\r\n if (respondedRef.current) return;\r\n respondedRef.current = true;\r\n session.sendRequest({\r\n type: \"question_response\",\r\n request_id: requestId,\r\n answer,\r\n });\r\n session.setModal(null);\r\n };\r\n\r\n const onClose = (): void => {\r\n // esc 兜底:必须应答,否则后端 questionRequests 永久挂起。\r\n sendAnswer(\"\");\r\n };\r\n\r\n dialog.replace(\r\n <QuestionDialog\r\n modal={modal}\r\n onSubmit={(answer) => {\r\n sendAnswer(answer);\r\n dialog.close();\r\n }}\r\n />,\r\n onClose,\r\n );\r\n }\r\n }, [session.modal]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n useEffect(() => {\r\n const req = session.displayRequest;\r\n if (!req) return;\r\n\r\n dialog.replace(\r\n <DialogText title={req.title} content={req.content} />,\r\n () => session.setDisplayRequest(null),\r\n );\r\n }, [session.displayRequest]); // eslint-disable-line react-hooks/exhaustive-deps\r\n\r\n // ── Dialog wiring for selectRequest ─────────────────────────────────────────\r\n // replace() 会触发旧弹层 onClose;ctrl+d 删会话只是更新 options,必须用 update()\r\n // 热刷新,否则 selectRequest 会被清掉,列表看起来没变。\r\n const selectOpenRef = useRef(false);\r\n useEffect(() => {\r\n const req = session.selectRequest;\r\n if (!req) {\r\n if (selectOpenRef.current) {\r\n selectOpenRef.current = false;\r\n dialog.close();\r\n }\r\n return;\r\n }\r\n\r\n const isSessions = req.submitPrefix === \"/sessions open \";\r\n const node = (\r\n <DialogSelect\r\n title={req.title}\r\n items={req.options.map((opt) => ({\r\n value: opt.value,\r\n label: opt.label ?? opt.value,\r\n description: opt.description,\r\n }))}\r\n onSelect={(value) => {\r\n selectOpenRef.current = false;\r\n session.sendRequest({\r\n type: \"submit_line\",\r\n line: `${req.submitPrefix}${value}`,\r\n });\r\n session.setSelectRequest(null);\r\n dialog.close();\r\n }}\r\n onDelete={isSessions ? (value) => {\r\n session.sendRequest({ type: \"delete_session\", session_id: value });\r\n } : undefined}\r\n />\r\n );\r\n\r\n if (selectOpenRef.current) {\r\n dialog.update(node);\r\n return;\r\n }\r\n\r\n selectOpenRef.current = true;\r\n dialog.replace(node, () => {\r\n selectOpenRef.current = false;\r\n session.setSelectRequest(null);\r\n });\r\n }, [session.selectRequest]); // eslint-disable-line react-hooks/exhaustive-deps\r\n}\r\n",
36
- "import type { UiNode } from \"../types/ui\";\r\nimport {\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useMemo,\r\n useRef,\r\n useState,\r\n} from \"react\";\r\nimport { useKeyboard, useTerminalDimensions } from \"@opentui/react\";\r\nimport { useTheme } from \"../theme/ThemeContext\";\r\n\r\ntype DialogEntry = { node: UiNode; onClose?: () => void };\r\n\r\nexport type DialogApi = {\r\n push: (node: UiNode, onClose?: () => void) => void;\r\n /** Close the whole stack and push a new entry (for mutually exclusive dialogs like command palette). */\r\n replace: (node: UiNode, onClose?: () => void) => void;\r\n /** Update the top dialog node without firing onClose. Use this to refresh items in-place. */\r\n update: (node: UiNode) => void;\r\n close: () => void;\r\n closeAll: () => void;\r\n isOpen: boolean;\r\n};\r\n\r\nconst DialogContext = createContext<DialogApi>({\r\n push: () => undefined,\r\n replace: () => undefined,\r\n update: () => undefined,\r\n close: () => undefined,\r\n closeAll: () => undefined,\r\n isOpen: false,\r\n});\r\n\r\nexport function useDialog(): DialogApi {\r\n return useContext(DialogContext);\r\n}\r\n\r\nexport function DialogProvider({\r\n children,\r\n}: {\r\n children: UiNode;\r\n}) {\r\n const [stack, setStack] = useState<DialogEntry[]>([]);\r\n // Ref for stack length to avoid stale closure in useKeyboard handler\r\n const stackLenRef = useRef(0);\r\n stackLenRef.current = stack.length;\r\n const { theme } = useTheme();\r\n const { width, height } = useTerminalDimensions();\r\n\r\n const push = useCallback(\r\n (node: UiNode, onClose?: () => void) => {\r\n setStack((prev) => [...prev, { node, onClose }]);\r\n },\r\n [],\r\n );\r\n\r\n const replace = useCallback(\r\n (node: UiNode, onClose?: () => void) => {\r\n setStack((prev) => {\r\n // Call onClose for all existing entries being removed\r\n for (const entry of prev) {\r\n entry.onClose?.();\r\n }\r\n return [{ node, onClose }];\r\n });\r\n },\r\n [],\r\n );\r\n\r\n const update = useCallback((node: UiNode) => {\r\n setStack((prev) => {\r\n if (prev.length === 0) return prev;\r\n const top = prev[prev.length - 1]!;\r\n return [...prev.slice(0, -1), { ...top, node }];\r\n });\r\n }, []);\r\n\r\n const close = useCallback(() => {\r\n setStack((prev) => {\r\n if (prev.length === 0) return prev;\r\n const top = prev[prev.length - 1]!;\r\n top.onClose?.();\r\n return prev.slice(0, -1);\r\n });\r\n }, []);\r\n\r\n const closeAll = useCallback(() => {\r\n setStack((prev) => {\r\n for (const entry of prev) {\r\n entry.onClose?.();\r\n }\r\n return [];\r\n });\r\n }, []);\r\n\r\n // Fallback ESC handler — only consume when stack is non-empty.\r\n // Uses a ref to avoid stale closure (stack.length captured at registration time).\r\n useKeyboard((key) => {\r\n if (key.name === \"escape\" && stackLenRef.current > 0) {\r\n close();\r\n }\r\n });\r\n\r\n const isOpen = stack.length > 0;\r\n const topEntry = stack.length > 0 ? (stack[stack.length - 1] ?? null) : null;\r\n\r\n // Compute dialog box dimensions\r\n const dialogWidth = Math.min(64, Math.max(40, Math.floor(width * 0.6)));\r\n const dialogTop = Math.max(1, Math.floor(height / 4));\r\n const dialogLeft = Math.max(0, Math.floor((width - dialogWidth) / 2));\r\n\r\n const api = useMemo<DialogApi>(\r\n () => ({ push, replace, update, close, closeAll, isOpen }),\r\n [push, replace, update, close, closeAll, isOpen],\r\n );\r\n\r\n return (\r\n <DialogContext.Provider value={api}>\r\n <box position=\"relative\" width=\"100%\" height=\"100%\">\r\n {children}\r\n {topEntry !== null && (\r\n <box\r\n position=\"absolute\"\r\n top={dialogTop}\r\n left={dialogLeft}\r\n width={dialogWidth}\r\n zIndex={100}\r\n border={true}\r\n borderColor={theme.colors.accent}\r\n backgroundColor={theme.colors.backgroundPanel}\r\n padding={1}\r\n flexDirection=\"column\"\r\n >\r\n {topEntry.node}\r\n </box>\r\n )}\r\n </box>\r\n </DialogContext.Provider>\r\n );\r\n}\r\n",
37
- "import type { UiNode } from \"../types/ui\";\r\nimport {\r\n createContext,\r\n useCallback,\r\n useContext,\r\n useEffect,\r\n useMemo,\r\n useState,\r\n} from \"react\";\r\nimport { useTerminalDimensions } from \"@opentui/react\";\r\nimport { useTheme } from \"../theme/ThemeContext\";\r\n\r\nexport type ToastLevel = \"info\" | \"error\";\r\n\r\ntype ToastEntry = {\r\n id: number;\r\n message: string;\r\n level: ToastLevel;\r\n};\r\n\r\nexport type ToastApi = {\r\n toast: (message: string, level?: ToastLevel, ttlMs?: number) => void;\r\n};\r\n\r\nconst ToastContext = createContext<ToastApi>({\r\n toast: () => undefined,\r\n});\r\n\r\nexport function useToast(): ToastApi {\r\n return useContext(ToastContext);\r\n}\r\n\r\nconst TOAST_WIDTH = 36;\r\nconst DEFAULT_TTL_MS = 3000;\r\n\r\nlet nextId = 0;\r\n\r\nfunction ToastItem({\r\n entry,\r\n top,\r\n left,\r\n zIndex,\r\n onExpire,\r\n ttlMs,\r\n}: {\r\n entry: ToastEntry;\r\n top: number;\r\n left: number;\r\n zIndex: number;\r\n onExpire: (id: number) => void;\r\n ttlMs: number;\r\n}) {\r\n const { theme } = useTheme();\r\n\r\n useEffect(() => {\r\n const timer = setTimeout(() => {\r\n onExpire(entry.id);\r\n }, ttlMs);\r\n return () => clearTimeout(timer);\r\n }, [entry.id, ttlMs, onExpire]);\r\n\r\n const borderColor =\r\n entry.level === \"error\" ? theme.colors.error : theme.colors.info;\r\n\r\n return (\r\n <box\r\n position=\"absolute\"\r\n top={top}\r\n left={left}\r\n width={TOAST_WIDTH}\r\n zIndex={zIndex}\r\n border={true}\r\n borderColor={borderColor}\r\n backgroundColor={theme.colors.backgroundPanel}\r\n padding={1}\r\n flexDirection=\"column\"\r\n >\r\n <text>{entry.message}</text>\r\n </box>\r\n );\r\n}\r\n\r\ntype ToastWithTtl = ToastEntry & { ttlMs: number };\r\n\r\nexport function ToastProvider({\r\n children,\r\n}: {\r\n children: UiNode;\r\n}) {\r\n const [toasts, setToasts] = useState<ToastWithTtl[]>([]);\r\n const { width } = useTerminalDimensions();\r\n\r\n const removeToast = useCallback((id: number) => {\r\n setToasts((prev) => prev.filter((t) => t.id !== id));\r\n }, []);\r\n\r\n const toast = useCallback(\r\n (message: string, level: ToastLevel = \"info\", ttlMs = DEFAULT_TTL_MS) => {\r\n const id = nextId++;\r\n setToasts((prev) => [...prev, { id, message, level, ttlMs }]);\r\n },\r\n [],\r\n );\r\n\r\n const api = useMemo<ToastApi>(() => ({ toast }), [toast]);\r\n\r\n // Right-align toasts: left = width - TOAST_WIDTH - 1\r\n const toastLeft = Math.max(0, width - TOAST_WIDTH - 1);\r\n\r\n return (\r\n <ToastContext.Provider value={api}>\r\n {children}\r\n {toasts.map((entry, index) => (\r\n <ToastItem\r\n key={entry.id}\r\n entry={entry}\r\n top={1 + index * 4}\r\n left={toastLeft}\r\n zIndex={200 + index}\r\n onExpire={removeToast}\r\n ttlMs={entry.ttlMs}\r\n />\r\n ))}\r\n </ToastContext.Provider>\r\n );\r\n}\r\n",
33
+ "import { useCallback, useRef } from \"react\";\nimport { useKeyboard } from \"@opentui/react\";\nimport { TextAttributes } from \"@opentui/core\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport { DiffView } from \"./DiffView\";\n\n/** 工具授权弹层:y=本次放行,a=整个会话放行,n=拒绝。带可选 reason 与 diff 预览。 */\nexport function PermissionDialog({\n modal,\n onRespond,\n}: {\n modal: Record<string, unknown>;\n onRespond: (allowed: boolean, scope: \"once\" | \"session\") => void;\n}) {\n const { theme } = useTheme();\n const respondedRef = useRef(false);\n\n const respond = useCallback(\n (allowed: boolean, scope: \"once\" | \"session\") => {\n if (respondedRef.current) return;\n respondedRef.current = true;\n onRespond(allowed, scope);\n },\n [onRespond],\n );\n\n useKeyboard((key) => {\n if (key.name === \"y\") {\n respond(true, \"once\");\n } else if (key.name === \"a\") {\n respond(true, \"session\");\n } else if (key.name === \"n\" || key.name === \"escape\") {\n respond(false, \"once\");\n }\n });\n\n const toolName = modal.tool_name ? String(modal.tool_name) : \"tool\";\n const reason = modal.reason ? String(modal.reason) : null;\n const diff = modal.diff ? String(modal.diff) : null;\n const diffPath = modal.diff_path ? String(modal.diff_path) : null;\n\n return (\n <box flexDirection=\"column\">\n <text>\n <span fg={theme.colors.warning} attributes={TextAttributes.BOLD}>{\"┌ \"}</span>\n <span attributes={TextAttributes.BOLD}>{\"Allow \"}</span>\n <span fg={theme.colors.info} attributes={TextAttributes.BOLD}>{toolName}</span>\n <span attributes={TextAttributes.BOLD}>{\"?\"}</span>\n </text>\n {reason ? (\n <text>\n <span fg={theme.colors.warning}>{\"│ \"}</span>\n <span fg={theme.colors.muted}>{reason}</span>\n </text>\n ) : null}\n {diff ? (\n <box flexDirection=\"column\">\n {diffPath ? <text fg={theme.colors.muted}>{` ${diffPath}`}</text> : null}\n <DiffView diff={diff} />\n </box>\n ) : null}\n <text>\n <span fg={theme.colors.warning}>{\"└ \"}</span>\n <span fg={theme.colors.success}>{\"[y] Allow\"}</span>\n <span>{\" \"}</span>\n <span fg={theme.colors.success}>{\"[a] Allow for session\"}</span>\n <span>{\" \"}</span>\n <span fg={theme.colors.error}>{\"[n/esc] Deny\"}</span>\n </text>\n </box>\n );\n}\n",
34
+ "import { useState } from \"react\";\nimport { useKeyboard } from \"@opentui/react\";\nimport { TextAttributes } from \"@opentui/core\";\nimport { useTheme } from \"../../theme/ThemeContext\";\n\n/** 工具向用户提问的弹层:单行输入,enter 提交。带可选 tool/reason 提示。 */\nexport function QuestionDialog({\n modal,\n onSubmit,\n}: {\n modal: Record<string, unknown>;\n onSubmit: (answer: string) => void;\n}) {\n const { theme } = useTheme();\n const [inputValue, setInputValue] = useState(\"\");\n const question = String(modal.question ?? \"Question\");\n const toolName = modal.tool_name ? String(modal.tool_name) : null;\n const reason = modal.reason ? String(modal.reason) : null;\n\n useKeyboard((key) => {\n if (key.name === \"escape\") {\n onSubmit(\"\");\n return;\n }\n if (key.name === \"return\") {\n onSubmit(inputValue);\n }\n });\n\n return (\n <box flexDirection=\"column\">\n <text fg={theme.colors.accent} attributes={TextAttributes.BOLD}>\n {\"? \" + question}\n </text>\n {toolName ? (\n <text fg={theme.colors.muted}>{` Tool: ${toolName}`}</text>\n ) : null}\n {reason ? (\n <text fg={theme.colors.muted}>{` Reason: ${reason}`}</text>\n ) : null}\n <input\n focused\n placeholder=\"Answer...\"\n onInput={(value: string) => setInputValue(value)}\n />\n <text fg={theme.colors.muted}>{\" enter: submit esc: cancel\"}</text>\n </box>\n );\n}\n",
35
+ "import { useEffect, useRef } from \"react\";\nimport { DialogSelect } from \"../ui/DialogSelect\";\nimport { DialogText } from \"../ui/DialogText\";\nimport { PermissionDialog } from \"../components/dialogs/PermissionDialog\";\nimport { QuestionDialog } from \"../components/dialogs/QuestionDialog\";\nimport type { useDialog } from \"../ui/DialogContext\";\nimport type { TuiSessionController } from \"./sessionController\";\n\ntype Session = TuiSessionController;\ntype Dialog = ReturnType<typeof useDialog>;\n\n/**\n * 把后端发来的 modal / select 请求接到 Dialog 栈上。\n *\n * - permission:渲染 PermissionDialog;ESC 兜底按拒绝回应(否则后端挂起)。\n * - question:渲染 QuestionDialog;ESC 兜底回空串(否则后端 questionRequests 永久挂起)。\n * - select:空选项直接丢弃;否则渲染 DialogSelect,选中后提交 `${submitPrefix}${value}`。\n */\nexport function useModalWiring(session: Session, dialog: Dialog): void {\n // ── Dialog wiring for modal (permission / question) ─────────────────────────\n useEffect(() => {\n const modal = session.modal;\n if (!modal) return;\n\n if (modal.kind === \"permission\") {\n const requestId = modal.request_id;\n if (typeof requestId !== \"string\" || !requestId) return;\n const respondedRef = { current: false };\n\n const sendResponse = (allowed: boolean, scope: \"once\" | \"session\"): void => {\n if (respondedRef.current) return;\n respondedRef.current = true;\n session.sendRequest({\n type: \"permission_response\",\n request_id: requestId,\n allowed,\n scope,\n });\n session.setModal(null);\n dialog.close();\n };\n\n const onClose = (): void => {\n // ESC fallback: deny if not already responded\n if (!respondedRef.current) {\n respondedRef.current = true;\n session.sendRequest({\n type: \"permission_response\",\n request_id: requestId,\n allowed: false,\n scope: \"once\",\n });\n session.setModal(null);\n }\n };\n\n dialog.replace(\n <PermissionDialog modal={modal} onRespond={sendResponse} />,\n onClose,\n );\n return;\n }\n\n if (modal.kind === \"question\") {\n const requestId = modal.request_id;\n if (typeof requestId !== \"string\" || !requestId) return;\n const respondedRef = { current: false };\n\n const sendAnswer = (answer: string): void => {\n if (respondedRef.current) return;\n respondedRef.current = true;\n session.sendRequest({\n type: \"question_response\",\n request_id: requestId,\n answer,\n });\n session.setModal(null);\n };\n\n const onClose = (): void => {\n // esc 兜底:必须应答,否则后端 questionRequests 永久挂起。\n sendAnswer(\"\");\n };\n\n dialog.replace(\n <QuestionDialog\n modal={modal}\n onSubmit={(answer) => {\n sendAnswer(answer);\n dialog.close();\n }}\n />,\n onClose,\n );\n }\n }, [session.modal]); // eslint-disable-line react-hooks/exhaustive-deps\n\n useEffect(() => {\n const req = session.displayRequest;\n if (!req) return;\n\n dialog.replace(\n <DialogText title={req.title} content={req.content} />,\n () => session.setDisplayRequest(null),\n );\n }, [session.displayRequest]); // eslint-disable-line react-hooks/exhaustive-deps\n\n // ── Dialog wiring for selectRequest ─────────────────────────────────────────\n // replace() 会触发旧弹层 onClose;ctrl+d 删会话只是更新 options,必须用 update()\n // 热刷新,否则 selectRequest 会被清掉,列表看起来没变。\n const selectOpenRef = useRef(false);\n useEffect(() => {\n const req = session.selectRequest;\n if (!req) {\n if (selectOpenRef.current) {\n selectOpenRef.current = false;\n dialog.close();\n }\n return;\n }\n\n const isSessions = req.submitPrefix === \"/sessions open \";\n const node = (\n <DialogSelect\n title={req.title}\n items={req.options.map((opt) => ({\n value: opt.value,\n label: opt.label ?? opt.value,\n description: opt.description,\n }))}\n onSelect={(value) => {\n selectOpenRef.current = false;\n session.sendRequest({\n type: \"submit_line\",\n line: `${req.submitPrefix}${value}`,\n });\n session.setSelectRequest(null);\n dialog.close();\n }}\n onDelete={isSessions ? (value) => {\n session.sendRequest({ type: \"delete_session\", session_id: value });\n } : undefined}\n />\n );\n\n if (selectOpenRef.current) {\n dialog.update(node);\n return;\n }\n\n selectOpenRef.current = true;\n dialog.replace(node, () => {\n selectOpenRef.current = false;\n session.setSelectRequest(null);\n });\n }, [session.selectRequest]); // eslint-disable-line react-hooks/exhaustive-deps\n}\n",
36
+ "import type { UiNode } from \"../types/ui\";\nimport {\n createContext,\n useCallback,\n useContext,\n useMemo,\n useRef,\n useState,\n} from \"react\";\nimport { useKeyboard, useTerminalDimensions } from \"@opentui/react\";\nimport { useTheme } from \"../theme/ThemeContext\";\n\ntype DialogEntry = { node: UiNode; onClose?: () => void };\n\nexport type DialogApi = {\n push: (node: UiNode, onClose?: () => void) => void;\n /** Close the whole stack and push a new entry (for mutually exclusive dialogs like command palette). */\n replace: (node: UiNode, onClose?: () => void) => void;\n /** Update the top dialog node without firing onClose. Use this to refresh items in-place. */\n update: (node: UiNode) => void;\n close: () => void;\n closeAll: () => void;\n isOpen: boolean;\n};\n\nconst DialogContext = createContext<DialogApi>({\n push: () => undefined,\n replace: () => undefined,\n update: () => undefined,\n close: () => undefined,\n closeAll: () => undefined,\n isOpen: false,\n});\n\nexport function useDialog(): DialogApi {\n return useContext(DialogContext);\n}\n\nexport function DialogProvider({\n children,\n}: {\n children: UiNode;\n}) {\n const [stack, setStack] = useState<DialogEntry[]>([]);\n // Ref for stack length to avoid stale closure in useKeyboard handler\n const stackLenRef = useRef(0);\n stackLenRef.current = stack.length;\n const { theme } = useTheme();\n const { width, height } = useTerminalDimensions();\n\n const push = useCallback(\n (node: UiNode, onClose?: () => void) => {\n setStack((prev) => [...prev, { node, onClose }]);\n },\n [],\n );\n\n const replace = useCallback(\n (node: UiNode, onClose?: () => void) => {\n setStack((prev) => {\n // Call onClose for all existing entries being removed\n for (const entry of prev) {\n entry.onClose?.();\n }\n return [{ node, onClose }];\n });\n },\n [],\n );\n\n const update = useCallback((node: UiNode) => {\n setStack((prev) => {\n if (prev.length === 0) return prev;\n const top = prev[prev.length - 1]!;\n return [...prev.slice(0, -1), { ...top, node }];\n });\n }, []);\n\n const close = useCallback(() => {\n setStack((prev) => {\n if (prev.length === 0) return prev;\n const top = prev[prev.length - 1]!;\n top.onClose?.();\n return prev.slice(0, -1);\n });\n }, []);\n\n const closeAll = useCallback(() => {\n setStack((prev) => {\n for (const entry of prev) {\n entry.onClose?.();\n }\n return [];\n });\n }, []);\n\n // Fallback ESC handler — only consume when stack is non-empty.\n // Uses a ref to avoid stale closure (stack.length captured at registration time).\n useKeyboard((key) => {\n if (key.name === \"escape\" && stackLenRef.current > 0) {\n close();\n }\n });\n\n const isOpen = stack.length > 0;\n const topEntry = stack.length > 0 ? (stack[stack.length - 1] ?? null) : null;\n\n // Compute dialog box dimensions\n const dialogWidth = Math.min(64, Math.max(40, Math.floor(width * 0.6)));\n const dialogTop = Math.max(1, Math.floor(height / 4));\n const dialogLeft = Math.max(0, Math.floor((width - dialogWidth) / 2));\n\n const api = useMemo<DialogApi>(\n () => ({ push, replace, update, close, closeAll, isOpen }),\n [push, replace, update, close, closeAll, isOpen],\n );\n\n return (\n <DialogContext.Provider value={api}>\n <box position=\"relative\" width=\"100%\" height=\"100%\">\n {children}\n {topEntry !== null && (\n <box\n position=\"absolute\"\n top={dialogTop}\n left={dialogLeft}\n width={dialogWidth}\n zIndex={100}\n border={true}\n borderColor={theme.colors.accent}\n backgroundColor={theme.colors.backgroundPanel}\n padding={1}\n flexDirection=\"column\"\n >\n {topEntry.node}\n </box>\n )}\n </box>\n </DialogContext.Provider>\n );\n}\n",
37
+ "import type { UiNode } from \"../types/ui\";\nimport {\n createContext,\n useCallback,\n useContext,\n useEffect,\n useMemo,\n useState,\n} from \"react\";\nimport { useTerminalDimensions } from \"@opentui/react\";\nimport { useTheme } from \"../theme/ThemeContext\";\n\nexport type ToastLevel = \"info\" | \"error\";\n\ntype ToastEntry = {\n id: number;\n message: string;\n level: ToastLevel;\n};\n\nexport type ToastApi = {\n toast: (message: string, level?: ToastLevel, ttlMs?: number) => void;\n};\n\nconst ToastContext = createContext<ToastApi>({\n toast: () => undefined,\n});\n\nexport function useToast(): ToastApi {\n return useContext(ToastContext);\n}\n\nconst TOAST_WIDTH = 36;\nconst DEFAULT_TTL_MS = 3000;\n\nlet nextId = 0;\n\nfunction ToastItem({\n entry,\n top,\n left,\n zIndex,\n onExpire,\n ttlMs,\n}: {\n entry: ToastEntry;\n top: number;\n left: number;\n zIndex: number;\n onExpire: (id: number) => void;\n ttlMs: number;\n}) {\n const { theme } = useTheme();\n\n useEffect(() => {\n const timer = setTimeout(() => {\n onExpire(entry.id);\n }, ttlMs);\n return () => clearTimeout(timer);\n }, [entry.id, ttlMs, onExpire]);\n\n const borderColor =\n entry.level === \"error\" ? theme.colors.error : theme.colors.info;\n\n return (\n <box\n position=\"absolute\"\n top={top}\n left={left}\n width={TOAST_WIDTH}\n zIndex={zIndex}\n border={true}\n borderColor={borderColor}\n backgroundColor={theme.colors.backgroundPanel}\n padding={1}\n flexDirection=\"column\"\n >\n <text>{entry.message}</text>\n </box>\n );\n}\n\ntype ToastWithTtl = ToastEntry & { ttlMs: number };\n\nexport function ToastProvider({\n children,\n}: {\n children: UiNode;\n}) {\n const [toasts, setToasts] = useState<ToastWithTtl[]>([]);\n const { width } = useTerminalDimensions();\n\n const removeToast = useCallback((id: number) => {\n setToasts((prev) => prev.filter((t) => t.id !== id));\n }, []);\n\n const toast = useCallback(\n (message: string, level: ToastLevel = \"info\", ttlMs = DEFAULT_TTL_MS) => {\n const id = nextId++;\n setToasts((prev) => [...prev, { id, message, level, ttlMs }]);\n },\n [],\n );\n\n const api = useMemo<ToastApi>(() => ({ toast }), [toast]);\n\n // Right-align toasts: left = width - TOAST_WIDTH - 1\n const toastLeft = Math.max(0, width - TOAST_WIDTH - 1);\n\n return (\n <ToastContext.Provider value={api}>\n {children}\n {toasts.map((entry, index) => (\n <ToastItem\n key={entry.id}\n entry={entry}\n top={1 + index * 4}\n left={toastLeft}\n zIndex={200 + index}\n onExpire={removeToast}\n ttlMs={entry.ttlMs}\n />\n ))}\n </ToastContext.Provider>\n );\n}\n",
38
38
  "import { useEffect, useMemo, useRef, useState } from \"react\";\nimport { TextAttributes, type ScrollBoxRenderable } from \"@opentui/core\";\nimport { useKeyboard } from \"@opentui/react\";\nimport type { ModelInfo, ModelProviderInfo } from \"@openharness/client\";\n\nimport { useTheme } from \"../theme/ThemeContext\";\nimport { AC_VISIBLE_ITEMS } from \"./constants\";\n\ntype Row =\n | { kind: \"spacer\"; key: string }\n | { kind: \"provider\"; key: string; label: string }\n | { kind: \"model\"; key: string; provider: ModelProviderInfo; model: ModelInfo };\n\nconst SCROLLBOX_CHROME_ROWS = 4;\nconst MODEL_LIST_HEIGHT = AC_VISIBLE_ITEMS + SCROLLBOX_CHROME_ROWS;\n\nfunction matches(value: string, query: string): boolean {\n return value.toLowerCase().includes(query.toLowerCase());\n}\n\nfunction modelSearchText(provider: ModelProviderInfo, model: ModelInfo): string {\n return [\n provider.displayName,\n provider.name,\n model.label,\n model.id,\n model.hint ?? \"\",\n ].join(\" \");\n}\n\nfunction buildRows(providers: ModelProviderInfo[], query: string): Row[] {\n const rows: Row[] = [];\n for (const provider of providers) {\n const providerMatches = matches(`${provider.displayName} ${provider.name}`, query);\n const models = query\n ? provider.models.filter((model) => providerMatches || matches(modelSearchText(provider, model), query))\n : provider.models;\n if (models.length === 0) continue;\n if (rows.length > 0) rows.push({ kind: \"spacer\", key: `spacer:${provider.name}` });\n rows.push({ kind: \"provider\", key: `provider:${provider.name}`, label: provider.displayName });\n for (const model of models) {\n rows.push({ kind: \"model\", key: `model:${provider.name}:${model.id}`, provider, model });\n }\n }\n return rows;\n}\n\nfunction closestModelIndex(rows: Row[], currentModel?: string): number {\n const exact = rows.findIndex((row) => row.kind === \"model\" && row.model.id === currentModel);\n if (exact >= 0) return exact;\n return rows.findIndex((row) => row.kind === \"model\");\n}\n\nfunction nextModelIndex(rows: Row[], current: number, direction: 1 | -1): number {\n if (rows.length === 0) return -1;\n let index = current;\n for (let step = 0; step < rows.length; step += 1) {\n index = (index + direction + rows.length) % rows.length;\n if (rows[index]?.kind === \"model\") return index;\n }\n return -1;\n}\n\nexport function ModelPickerDialog(props: {\n providers: ModelProviderInfo[];\n currentModel?: string;\n onSelect(model: ModelInfo): void;\n}) {\n const { providers, currentModel, onSelect } = props;\n const { theme } = useTheme();\n const [query, setQuery] = useState(\"\");\n const rows = useMemo(() => buildRows(providers, query.trim()), [providers, query]);\n const [selectedIndex, setSelectedIndex] = useState(() => closestModelIndex(rows, currentModel));\n const mountedRef = useRef(false);\n const listRef = useRef<ScrollBoxRenderable | null>(null);\n\n useEffect(() => {\n if (!mountedRef.current) {\n mountedRef.current = true;\n return;\n }\n setSelectedIndex(closestModelIndex(rows, currentModel));\n }, [currentModel, rows]);\n\n useEffect(() => {\n if (selectedIndex < 0) return;\n listRef.current?.scrollChildIntoView(`model-picker-row-${selectedIndex}`);\n }, [selectedIndex, rows]);\n\n useKeyboard((key) => {\n if (rows.length === 0) return;\n if (key.name === \"up\") {\n setSelectedIndex((index) => nextModelIndex(rows, index, -1));\n return;\n }\n if (key.name === \"down\") {\n setSelectedIndex((index) => nextModelIndex(rows, index, 1));\n return;\n }\n if (key.name === \"return\") {\n const row = rows[selectedIndex];\n if (row?.kind === \"model\") onSelect(row.model);\n return;\n }\n if (key.name === \"pageup\") {\n listRef.current?.scrollBy(-1, \"viewport\");\n return;\n }\n if (key.name === \"pagedown\") {\n listRef.current?.scrollBy(1, \"viewport\");\n }\n });\n\n const isScrollable = rows.length > AC_VISIBLE_ITEMS;\n const listHeight = MODEL_LIST_HEIGHT;\n\n const rowNodes = rows.map((row, index) => {\n if (row.kind === \"spacer\") {\n return (\n <box\n key={row.key}\n id={`model-picker-row-${index}`}\n width=\"100%\"\n height={1}\n flexShrink={0}\n />\n );\n }\n\n if (row.kind === \"provider\") {\n return (\n <box\n key={row.key}\n id={`model-picker-row-${index}`}\n flexDirection=\"row\"\n width=\"100%\"\n height={1}\n flexShrink={0}\n >\n <text attributes={TextAttributes.BOLD} fg={theme.colors.accent}>\n {row.label}\n </text>\n </box>\n );\n }\n\n const isSelected = index === selectedIndex;\n const isCurrent = row.model.id === currentModel;\n return (\n <box\n key={row.key}\n id={`model-picker-row-${index}`}\n flexDirection=\"row\"\n width=\"100%\"\n paddingLeft={1}\n height={1}\n flexShrink={0}\n backgroundColor={isSelected ? theme.colors.accent : undefined}\n onMouseUp={() => {\n setSelectedIndex(index);\n onSelect(row.model);\n }}\n >\n <text\n attributes={isCurrent ? TextAttributes.BOLD : undefined}\n fg={isSelected ? theme.colors.background : theme.colors.foreground}\n >\n {row.model.label}\n </text>\n <box flexGrow={1} />\n {row.model.hint ? (\n <text fg={isSelected ? theme.colors.background : theme.colors.muted}>\n {row.model.hint}\n </text>\n ) : null}\n </box>\n );\n });\n\n return (\n <box flexDirection=\"column\" gap={1}>\n <box flexDirection=\"row\" paddingBottom={1}>\n <text attributes={TextAttributes.BOLD} fg={theme.colors.accent}>Select model</text>\n <box flexGrow={1} />\n <text fg={theme.colors.muted}> esc</text>\n </box>\n\n <input\n focused\n placeholder=\"Search\"\n onInput={(value: string) => setQuery(value)}\n />\n\n {rows.length === 0 ? (\n <text fg={theme.colors.muted}>No connected providers.</text>\n ) : !isScrollable ? (\n <box flexDirection=\"column\" width=\"100%\">\n {rowNodes}\n </box>\n ) : (\n <scrollbox\n ref={listRef}\n scrollY\n width=\"100%\"\n height={listHeight}\n flexDirection=\"column\"\n viewportCulling={false}\n horizontalScrollbarOptions={{ visible: false }}\n >\n {rowNodes}\n </scrollbox>\n )}\n\n <box flexDirection=\"row\" paddingTop={1}>\n <text fg={theme.colors.foreground}>Connect provider </text>\n <text fg={theme.colors.muted}>ctrl+a </text>\n <text fg={theme.colors.foreground}>Favorite </text>\n <text fg={theme.colors.muted}>ctrl+f</text>\n </box>\n </box>\n );\n}\n",
39
39
  "/**\n * Command registry: merges backend slash commands with local UI commands.\n *\n * Backend provides a list of slash-command strings (e.g., [\"/help\", \"/theme\"]).\n * Local commands are UI-driven entries (e.g., { id: \"app.exit\", title: \"Exit\", ... }).\n * Both paths feed into ctrl+p command palette, `/` autocomplete, and global hotkeys.\n *\n * Merge strategy:\n * - Backend commands are wrapped as { id: cmd, title: cmd, run: () => submitLine(cmd) }\n * - Local commands override any backend command with the same id\n * - Order: backend entries first (with overrides in place), then pure local entries\n * - slashCommands() filters to entries with id starting with \"/\"\n */\n\nexport type Command = {\n /** Slash command: raw string \"/help\". Local command: \"app.xxx\" */\n id: string;\n /** Display name in command palette */\n title: string;\n /** Keybinding hint (display only; dispatch happens at App layer) */\n keybinding?: string;\n /** Action to execute on Enter */\n run: () => void;\n};\n\nexport type CommandRegistry = {\n /** All commands (backend + local) */\n all: () => Command[];\n /** Get a single command by id */\n get: (id: string) => Command | undefined;\n /** Filter to slash-prefixed commands only */\n slashCommands: () => Command[];\n};\n\nexport type BackendCommandDetail = { name: string; description?: string };\n\nexport function buildRegistry(opts: {\n backendCommands: BackendCommandDetail[];\n local: Command[];\n submitLine: (line: string) => void;\n}): CommandRegistry {\n const { local, submitLine } = opts;\n const backendCommands = opts.backendCommands;\n\n // Build a map of local commands by id for quick lookup\n const localMap = new Map<string, Command>();\n for (const cmd of local) {\n localMap.set(cmd.id, cmd);\n }\n\n // Wrap backend commands, allowing local overrides\n const mergedCommands: Command[] = [];\n const seenIds = new Set<string>();\n\n // Add backend commands first (or their local overrides if present)\n for (const backendCmd of backendCommands) {\n seenIds.add(backendCmd.name);\n const localOverride = localMap.get(backendCmd.name);\n if (localOverride) {\n mergedCommands.push(localOverride);\n } else {\n mergedCommands.push({\n id: backendCmd.name,\n title: backendCmd.description || backendCmd.name,\n run: () => submitLine(backendCmd.name),\n });\n }\n }\n\n // Add pure local commands (not in backend)\n for (const localCmd of local) {\n if (!seenIds.has(localCmd.id)) {\n mergedCommands.push(localCmd);\n }\n }\n\n return {\n all: () => mergedCommands,\n get: (id: string) => mergedCommands.find((c) => c.id === id),\n slashCommands: () => mergedCommands.filter((c) => c.id.startsWith(\"/\")),\n };\n}\n",
40
- "/** 权限模式选项(/permissions 选择器与 Tab 循环共用)。 */\r\nexport const PERMISSION_MODES = [\r\n {\r\n value: \"default\",\r\n label: \"default\",\r\n description: \"Ask for approval on sensitive operations\",\r\n },\r\n {\r\n value: \"full_auto\",\r\n label: \"full_auto\",\r\n description: \"Allow all operations without asking\",\r\n },\r\n {\r\n value: \"plan\",\r\n label: \"plan\",\r\n description: \"Plan mode — propose changes before executing\",\r\n },\r\n] as const;\r\n\r\n/** Tab 循环顺序(与 PERMISSION_MODES 的 value 对应)。 */\r\nexport const PERMISSION_MODE_ORDER: string[] = [\"default\", \"full_auto\", \"plan\"];\r\n",
41
- "import { useTerminalDimensions } from \"@opentui/react\";\r\nimport { TextAttributes } from \"@opentui/core\";\r\nimport { useTheme } from \"../theme/ThemeContext\";\r\n\r\n// 实测(bun probe):\"openharness\" block 字体共 102 列 ×6 行;slick 约 77 列。\r\n// 对齐 opencode 的实心 block 观感,宽度不足时逐级降级。\r\nconst BLOCK_MIN_WIDTH = 104;\r\nconst SLICK_MIN_WIDTH = 78;\r\n\r\nexport function Logo() {\r\n const { theme } = useTheme();\r\n const { width } = useTerminalDimensions();\r\n\r\n if (width < SLICK_MIN_WIDTH) {\r\n // Narrow fallback: single-line bold text with span dual-color\r\n return (\r\n <text attributes={TextAttributes.BOLD}>\r\n <span fg={theme.colors.muted}>open</span>\r\n <span fg={theme.colors.foreground}>harness</span>\r\n </text>\r\n );\r\n }\r\n\r\n const font = width >= BLOCK_MIN_WIDTH ? \"block\" : \"slick\";\r\n // Two side-by-side ascii-font elements for dual-color effect\r\n return (\r\n <box flexDirection=\"row\">\r\n <ascii-font text=\"open\" font={font} color={theme.colors.muted} />\r\n <ascii-font text=\"harness\" font={font} color={theme.colors.foreground} />\r\n </box>\r\n );\r\n}\r\n",
42
- "import type { UiNode } from \"../types/ui\";\r\nimport { useTerminalDimensions } from \"@opentui/react\";\r\nimport { useTheme } from \"../theme/ThemeContext\";\r\nimport { Logo } from \"../components/Logo\";\r\n\r\nexport function Home({ children }: { children?: UiNode }) {\r\n const { theme } = useTheme();\r\n const { width } = useTerminalDimensions();\r\n\r\n // Prompt container width: min(80, max(40, floor(width * 0.6)))\r\n const promptWidth = Math.min(80, Math.max(40, Math.floor(width * 0.6)));\r\n\r\n return (\r\n <box flexDirection=\"column\" width=\"100%\" height=\"100%\" backgroundColor={theme.colors.background}>\r\n {/* Top spacer */}\r\n <box flexGrow={1} />\r\n\r\n {/* Logo centered horizontally */}\r\n <box flexDirection=\"row\" justifyContent=\"center\">\r\n <Logo />\r\n </box>\r\n\r\n {/* 1-line gap */}\r\n <text>{\"\"}</text>\r\n\r\n {/* Children container centered */}\r\n <box flexDirection=\"row\" justifyContent=\"center\">\r\n <box width={promptWidth}>{children}</box>\r\n </box>\r\n\r\n {/* Hint row: 对齐输入框右缘(与 opencode 一致),不是屏幕右缘 */}\r\n <box flexDirection=\"row\" justifyContent=\"center\">\r\n <box width={promptWidth} flexDirection=\"row\" justifyContent=\"flex-end\">\r\n <text fg={theme.colors.muted}>\r\n <span fg={theme.colors.foreground}>tab</span>\r\n <span fg={theme.colors.muted}>{\" mode \"}</span>\r\n <span fg={theme.colors.foreground}>ctrl+p</span>\r\n <span fg={theme.colors.muted}>{\" commands\"}</span>\r\n </text>\r\n </box>\r\n </box>\r\n\r\n {/* Bottom spacer */}\r\n <box flexGrow={1} />\r\n </box>\r\n );\r\n}\r\n",
43
- "import { SyntaxStyle, RGBA } from \"@opentui/core\";\r\nimport type { ThemeConfig } from \"./builtinThemes\";\r\n\r\n/** 由主题色生成 <markdown>/<code> 用的 SyntaxStyle。 */\r\nexport function createSyntaxStyle(theme: ThemeConfig): SyntaxStyle {\r\n const c = theme.colors;\r\n return SyntaxStyle.fromStyles({\r\n \"markup.heading.1\": { fg: RGBA.fromHex(c.primary), bold: true },\r\n \"markup.heading\": { fg: RGBA.fromHex(c.primary), bold: true },\r\n \"markup.list\": { fg: RGBA.fromHex(c.accent) },\r\n \"markup.raw\": { fg: RGBA.fromHex(c.warning) },\r\n \"markup.bold\": { fg: RGBA.fromHex(c.foreground), bold: true },\r\n \"markup.italic\": { fg: RGBA.fromHex(c.foreground), italic: true },\r\n \"markup.link.url\": { fg: RGBA.fromHex(c.info), underline: true },\r\n comment: { fg: RGBA.fromHex(c.muted), italic: true },\r\n string: { fg: RGBA.fromHex(c.success) },\r\n keyword: { fg: RGBA.fromHex(c.accent) },\r\n function: { fg: RGBA.fromHex(c.info) },\r\n number: { fg: RGBA.fromHex(c.warning) },\r\n type: { fg: RGBA.fromHex(c.primary) },\r\n default: { fg: RGBA.fromHex(c.foreground) },\r\n });\r\n}\r\n",
44
- "import { createTwoFilesPatch } from \"diff\";\r\nimport type { SyntaxStyle } from \"@opentui/core\";\r\nimport { useTheme } from \"../../theme/ThemeContext\";\r\n\r\nconst MAX_PATCH_LINES = 20;\r\n\r\nfunction filetypeFromPath(filePath: string): string | undefined {\r\n const ext = filePath.split(\".\").pop()?.toLowerCase();\r\n const map: Record<string, string> = {\r\n ts: \"typescript\",\r\n tsx: \"typescript\",\r\n js: \"javascript\",\r\n jsx: \"javascript\",\r\n py: \"python\",\r\n rs: \"rust\",\r\n go: \"go\",\r\n json: \"json\",\r\n md: \"markdown\",\r\n css: \"css\",\r\n html: \"html\",\r\n sh: \"bash\",\r\n yaml: \"yaml\",\r\n yml: \"yaml\",\r\n };\r\n return ext ? map[ext] : undefined;\r\n}\r\n\r\nexport function truncatePatch(patch: string, maxLines = MAX_PATCH_LINES): string {\r\n const lines = patch.split(\"\\n\");\r\n if (lines.length <= maxLines) return patch;\r\n const kept = lines.slice(0, maxLines);\r\n const remaining = lines.length - maxLines;\r\n kept.push(`… +${remaining} more lines`);\r\n return kept.join(\"\\n\");\r\n}\r\n\r\nexport type ToolDiffProps = {\r\n filePath: string;\r\n oldText: string;\r\n newText: string;\r\n syntaxStyle?: SyntaxStyle;\r\n};\r\n\r\nexport function ToolDiff({ filePath, oldText, newText, syntaxStyle }: ToolDiffProps) {\r\n const { theme } = useTheme();\r\n const c = theme.colors;\r\n\r\n const rawPatch = createTwoFilesPatch(filePath, filePath, oldText, newText, \"\", \"\");\r\n const patch = truncatePatch(rawPatch);\r\n const filetype = filetypeFromPath(filePath);\r\n\r\n // Derive faint row backgrounds (~15% opacity) so text stays legible.\r\n // Signs (+/-) and line-number gutters carry the full theme color instead.\r\n const toFaintBg = (hex: string) => hex.replace(/^(#[\\da-fA-F]{6}).*$/, \"$126\");\r\n\r\n return (\r\n <diff\r\n diff={patch}\r\n view=\"unified\"\r\n showLineNumbers={true}\r\n filetype={filetype}\r\n syntaxStyle={syntaxStyle}\r\n addedBg={toFaintBg(c.success)}\r\n removedBg={toFaintBg(c.error)}\r\n addedSignColor={c.success}\r\n removedSignColor={c.error}\r\n addedLineNumberBg={toFaintBg(c.success)}\r\n removedLineNumberBg={toFaintBg(c.error)}\r\n />\r\n );\r\n}\r\n",
45
- "import React from \"react\";\r\nimport { KeyEvent, TextAttributes } from \"@opentui/core\";\r\nimport type { SyntaxStyle } from \"@opentui/core\";\r\nimport { useTheme } from \"../../theme/ThemeContext\";\r\nimport type { TranscriptItem } from \"../../types\";\r\nimport { ToolDiff } from \"../../components/messages/ToolDiff\";\r\n\r\n/**\r\n * Pick the first \"summary\" value from a tool_input record.\r\n * Priority: command > file_path > path > pattern > url; then first key.\r\n * Result is truncated to `maxLen` chars.\r\n */\r\nfunction summarizeToolInput(\r\n toolInput: Record<string, unknown> | undefined,\r\n maxLen = 60,\r\n): string {\r\n if (!toolInput) return \"\";\r\n const priority = [\"command\", \"file_path\", \"path\", \"pattern\", \"url\"];\r\n for (const key of priority) {\r\n const val = toolInput[key];\r\n if (val !== undefined && val !== null && typeof val === \"string\") {\r\n return val.slice(0, maxLen);\r\n }\r\n }\r\n // Fallback: first string-valued key\r\n for (const [, val] of Object.entries(toolInput)) {\r\n if (typeof val === \"string\") {\r\n return val.slice(0, maxLen);\r\n }\r\n }\r\n return \"\";\r\n}\r\n\r\nfunction summarizeText(text: string, maxLen = 72): string {\r\n const firstLine = text.split(\"\\n\")[0] ?? \"\";\r\n if (firstLine.length <= maxLen) return firstLine;\r\n return firstLine.slice(0, Math.max(0, maxLen - 1)) + \"...\";\r\n}\r\n\r\nfunction countLines(text: string): number {\r\n return Math.max(1, text.split(\"\\n\").length);\r\n}\r\n\r\nfunction CollapsibleTranscriptBlock({\r\n summary,\r\n children,\r\n tone,\r\n}: {\r\n summary: React.ReactNode;\r\n children: React.ReactNode;\r\n tone: string;\r\n}) {\r\n const { theme } = useTheme();\r\n const [expanded, setExpanded] = React.useState(false);\r\n\r\n const toggle = React.useCallback(() => {\r\n setExpanded((value) => !value);\r\n }, []);\r\n\r\n const handleKeyDown = React.useCallback((event: KeyEvent) => {\r\n if (event.name === \"enter\" || event.name === \"space\") {\r\n toggle();\r\n }\r\n }, [toggle]);\r\n\r\n return (\r\n <box flexDirection=\"column\">\r\n <box\r\n focusable\r\n onMouseUp={toggle}\r\n onKeyDown={handleKeyDown}\r\n backgroundColor={expanded ? theme.colors.backgroundPanel : undefined}\r\n >\r\n <text fg={tone}>\r\n <span fg={theme.colors.muted}>{expanded ? \"[-] \" : \"[+] \"}</span>\r\n {summary}\r\n </text>\r\n </box>\r\n {expanded ? (\r\n <box\r\n paddingLeft={2}\r\n paddingTop={1}\r\n paddingBottom={1}\r\n >\r\n {children}\r\n </box>\r\n ) : null}\r\n </box>\r\n );\r\n}\r\n\r\nfunction TranscriptPartView({\r\n item,\r\n syntax,\r\n}: {\r\n item: TranscriptItem;\r\n syntax: SyntaxStyle;\r\n}) {\r\n const { theme } = useTheme();\r\n const c = theme.colors;\r\n const icons = theme.icons;\r\n\r\n switch (item.role) {\r\n case \"user\":\r\n return (\r\n <text fg={c.accent}>{icons.user + item.text}</text>\r\n );\r\n\r\n case \"assistant\":\r\n return <markdown content={item.text} syntaxStyle={syntax} streaming={item.streaming === true} />;\r\n\r\n case \"tool\": {\r\n const toolName = item.tool_name ?? \"tool\";\r\n\r\n const isEditTool = toolName === \"Edit\" || toolName === \"str_replace_editor\";\r\n const isWriteTool = toolName === \"Write\" || toolName === \"create_file\";\r\n\r\n if (isEditTool && item.tool_input?.old_string !== undefined && item.tool_input?.new_string !== undefined) {\r\n const filePath = String(item.tool_input.path ?? item.tool_input.file_path ?? \"file\");\r\n const oldText = String(item.tool_input.old_string);\r\n const newText = String(item.tool_input.new_string);\r\n const addedLines = newText.split(\"\\n\").length - oldText.split(\"\\n\").length;\r\n const sign = addedLines >= 0 ? `+${addedLines}` : `${addedLines}`;\r\n return (\r\n <CollapsibleTranscriptBlock\r\n tone={c.muted}\r\n summary={(\r\n <>\r\n <span fg={c.muted}>{icons.tool}</span>\r\n <span fg={c.foreground} attributes={TextAttributes.BOLD}>{filePath}</span>\r\n <span fg={addedLines >= 0 ? c.success : c.error}>{\" \" + sign}</span>\r\n </>\r\n )}\r\n >\r\n <ToolDiff filePath={filePath} oldText={oldText} newText={newText} syntaxStyle={syntax} />\r\n </CollapsibleTranscriptBlock>\r\n );\r\n }\r\n\r\n if (isWriteTool && item.tool_input?.content !== undefined) {\r\n const filePath = String(item.tool_input.path ?? item.tool_input.file_path ?? \"file\");\r\n const content = String(item.tool_input.content);\r\n return (\r\n <CollapsibleTranscriptBlock\r\n tone={c.muted}\r\n summary={(\r\n <>\r\n <span fg={c.muted}>{icons.tool}</span>\r\n <span fg={c.foreground} attributes={TextAttributes.BOLD}>{filePath}</span>\r\n <span fg={c.success}>{` +${content.split(\"\\n\").length}`}</span>\r\n </>\r\n )}\r\n >\r\n <ToolDiff filePath={filePath} oldText=\"\" newText={content} syntaxStyle={syntax} />\r\n </CollapsibleTranscriptBlock>\r\n );\r\n }\r\n\r\n const summary = summarizeToolInput(item.tool_input);\r\n return (\r\n <text fg={c.muted}>\r\n <span fg={c.muted}>{icons.tool}</span>\r\n <span fg={c.muted} attributes={TextAttributes.BOLD}>\r\n {toolName}\r\n </span>\r\n {summary ? <span fg={c.muted}>{\" \" + summary}</span> : null}\r\n </text>\r\n );\r\n }\r\n\r\n case \"tool_result\": {\r\n if (item.is_error) {\r\n return (\r\n <CollapsibleTranscriptBlock\r\n tone={c.error}\r\n summary={(\r\n <>\r\n <span fg={c.error}>{icons.error}</span>\r\n <span fg={c.foreground} attributes={TextAttributes.BOLD}>tool error</span>\r\n <span fg={c.muted}>{` ${countLines(item.text)} lines`}</span>\r\n {item.text ? <span fg={c.error}>{`: ${summarizeText(item.text)}`}</span> : null}\r\n </>\r\n )}\r\n >\r\n <text fg={c.error} wrapMode=\"word\">{item.text}</text>\r\n </CollapsibleTranscriptBlock>\r\n );\r\n }\r\n return (\r\n <CollapsibleTranscriptBlock\r\n tone={c.muted}\r\n summary={(\r\n <>\r\n <span fg={c.muted}>{icons.tool}</span>\r\n <span fg={c.foreground} attributes={TextAttributes.BOLD}>output</span>\r\n <span fg={c.muted}>{` ${countLines(item.text)} lines`}</span>\r\n {item.text ? <span fg={c.muted}>{`: ${summarizeText(item.text)}`}</span> : null}\r\n </>\r\n )}\r\n >\r\n <text fg={c.muted} wrapMode=\"word\">{item.text}</text>\r\n </CollapsibleTranscriptBlock>\r\n );\r\n }\r\n\r\n case \"system\":\r\n case \"log\":\r\n return <text fg={c.muted}>{item.text}</text>;\r\n\r\n default:\r\n return <text>{item.text}</text>;\r\n }\r\n}\r\n\r\nexport const TranscriptPart = React.memo(TranscriptPartView, (previous, next) => {\r\n const previousItem = previous.item;\r\n const nextItem = next.item;\r\n return previous.syntax === next.syntax\r\n && previousItem.id === nextItem.id\r\n && previousItem.role === nextItem.role\r\n && previousItem.text === nextItem.text\r\n && previousItem.streaming === nextItem.streaming\r\n && previousItem.tool_name === nextItem.tool_name\r\n && previousItem.tool_input === nextItem.tool_input\r\n && previousItem.is_error === nextItem.is_error;\r\n});\r\n",
46
- "import { useMemo } from \"react\";\nimport { useTheme } from \"../../theme/ThemeContext\";\r\nimport { createSyntaxStyle } from \"../../theme/syntax\";\r\nimport type { TranscriptItem } from \"../../types\";\r\nimport { TranscriptPart } from \"./parts\";\r\n\r\nexport type SessionProps = {\r\n items: TranscriptItem[];\r\n assistantBuffer: string;\r\n};\r\n\r\nexport function Session({ items, assistantBuffer }: SessionProps) {\r\n const { theme } = useTheme();\r\n const syntax = useMemo(() => createSyntaxStyle(theme), [theme]);\r\n\r\n return (\r\n <scrollbox\r\n flexGrow={1}\r\n stickyScroll\r\n stickyStart=\"bottom\"\r\n verticalScrollbarOptions={{\r\n trackOptions: {\r\n foregroundColor: theme.colors.muted,\r\n backgroundColor: theme.colors.backgroundPanel,\r\n },\r\n }}\r\n >\r\n <box\r\n flexDirection=\"column\"\r\n paddingLeft={2}\r\n paddingRight={2}\r\n paddingTop={1}\r\n paddingBottom={1}\r\n rowGap={1}\r\n >\r\n {items.map((item, i) => (\r\n <TranscriptPart key={item.id ?? i} item={item} syntax={syntax} />\r\n ))}\r\n {assistantBuffer ? (\r\n <text wrapMode=\"word\">{assistantBuffer}</text>\r\n ) : null}\r\n </box>\r\n </scrollbox>\r\n );\r\n}\r\n",
47
- "import { TextAttributes } from \"@opentui/core\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport type { TranscriptItem, McpServerSnapshot } from \"../../types\";\n\r\nexport type ModifiedFile = {\r\n path: string;\r\n added: number;\r\n removed: number;\r\n};\r\n\r\nexport function computeModifiedFiles(transcript: TranscriptItem[]): ModifiedFile[] {\n const map = new Map<string, ModifiedFile>();\r\n for (const item of transcript) {\r\n if (item.role !== \"tool\") continue;\r\n const name = item.tool_name ?? \"\";\r\n const isEdit = name === \"Edit\" || name === \"str_replace_editor\";\r\n const isWrite = name === \"Write\" || name === \"create_file\";\r\n if (!isEdit && !isWrite) continue;\r\n\r\n const path = String(item.tool_input?.path ?? item.tool_input?.file_path ?? \"\");\r\n if (!path) continue;\r\n\r\n if (isEdit) {\r\n const old = String(item.tool_input?.old_string ?? \"\");\r\n const next = String(item.tool_input?.new_string ?? \"\");\r\n map.set(path, { path, added: next.split(\"\\n\").length, removed: old.split(\"\\n\").length });\r\n } else {\r\n const content = String(item.tool_input?.content ?? \"\");\r\n map.set(path, { path, added: content.split(\"\\n\").length, removed: 0 });\r\n }\r\n }\r\n return Array.from(map.values());\n}\n\nexport type WorkflowPanelTask = {\n id: string;\n status: string;\n detail?: string;\n};\n\nexport type WorkflowPanelState = {\n runId?: string;\n status: string;\n summary?: string;\n mode?: string;\n totalTasks?: number;\n completedTasks?: number;\n failedTasks?: number;\n runningTasks?: number;\n pendingTasks?: number;\n blockedTasks?: number;\n needsReconciliation?: boolean;\n tasks: WorkflowPanelTask[];\n};\n\nexport function computeWorkflowPanel(transcript: TranscriptItem[]): WorkflowPanelState | undefined {\n for (let i = transcript.length - 1; i >= 0; i -= 1) {\n const text = transcript[i]?.text ?? \"\";\n const snapshotPayload = parseWorkflowPayload(text, \"workflow-run-snapshot\");\n const fromSnapshot = snapshotPayload ? workflowPanelFromSnapshotPayload(snapshotPayload) : undefined;\n if (fromSnapshot) return fromSnapshot;\n\n const notificationPayload = parseWorkflowPayload(text, \"workflow-notification\");\n const fromNotification = notificationPayload ? workflowPanelFromNotification(notificationPayload) : undefined;\n if (fromNotification) return fromNotification;\n }\n return undefined;\n}\n\nfunction parseWorkflowPayload(text: string, tag: string): Record<string, unknown> | undefined {\n const match = text.match(new RegExp(`<${tag}>\\\\s*<payload>([\\\\s\\\\S]*?)<\\\\/payload>\\\\s*<\\\\/${tag}>`));\n if (!match) return undefined;\n try {\n const payload = JSON.parse(unescapeXml(match[1]!));\n return isRecord(payload) ? payload : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction workflowPanelFromSnapshotPayload(payload: Record<string, unknown>): WorkflowPanelState | undefined {\n const snapshot = asRecord(payload.snapshot);\n if (!snapshot) return undefined;\n const plan = asRecord(snapshot.plan);\n const tasks = Array.isArray(plan?.tasks) ? plan.tasks.filter(isRecord) : [];\n const results = asRecord(snapshot.results) ?? {};\n const runningTasks = asRecord(snapshot.runningTasks) ?? {};\n const blockedTasks = asRecord(snapshot.blockedTasks) ?? {};\n const runningIds = new Set(stringArray(snapshot.runningTaskIds));\n const pendingIds = new Set(stringArray(snapshot.pendingTaskIds));\n const blockedIds = new Set(stringArray(snapshot.blockedTaskIds));\n\n return {\n runId: stringValue(snapshot.runId),\n status: stringValue(snapshot.status) ?? \"unknown\",\n summary: stringValue(snapshot.summary),\n mode: stringValue(plan?.mode),\n totalTasks: tasks.length,\n completedTasks: Object.values(results).filter((result) => stringValue(asRecord(result)?.status) === \"completed\").length,\n failedTasks: Object.values(results).filter((result) => {\n const status = stringValue(asRecord(result)?.status);\n return status === \"failed\" || status === \"skipped\";\n }).length,\n runningTasks: runningIds.size,\n pendingTasks: pendingIds.size,\n blockedTasks: blockedIds.size,\n tasks: tasks.map((task) => {\n const id = stringValue(task.id) ?? \"task\";\n const result = asRecord(results[id]);\n const running = asRecord(runningTasks[id]);\n const blocked = asRecord(blockedTasks[id]);\n const status = stringValue(result?.status)\n ?? (blockedIds.has(id) ? \"blocked\" : undefined)\n ?? (runningIds.has(id) ? \"running\" : undefined)\n ?? (pendingIds.has(id) ? \"pending\" : undefined)\n ?? \"pending\";\n return {\n id,\n status,\n detail: stringValue(result?.summary)\n ?? stringValue(running?.summary)\n ?? stringValue(blocked?.reason)\n ?? stringValue(task.description),\n };\n }),\n };\n}\n\nfunction workflowPanelFromNotification(payload: Record<string, unknown>): WorkflowPanelState | undefined {\n const tasks = Array.isArray(payload.tasks) ? payload.tasks.filter(isRecord) : [];\n const totalTasks = numberValue(payload.totalTasks);\n const completedTasks = numberValue(payload.completedTasks);\n const failedTasks = numberValue(payload.failedTasks);\n return {\n runId: stringValue(payload.runId),\n status: stringValue(payload.status) ?? \"unknown\",\n summary: stringValue(payload.summary),\n mode: stringValue(payload.mode),\n totalTasks,\n completedTasks,\n failedTasks,\n runningTasks: 0,\n pendingTasks: totalTasks !== undefined && completedTasks !== undefined && failedTasks !== undefined\n ? Math.max(0, totalTasks - completedTasks - failedTasks)\n : undefined,\n blockedTasks: 0,\n needsReconciliation: booleanValue(payload.needsReconciliation),\n tasks: tasks.map((task) => ({\n id: stringValue(task.taskId) ?? \"task\",\n status: stringValue(task.status) ?? \"unknown\",\n detail: stringValue(task.summary) ?? stringValue(task.error) ?? stringValue(task.skippedReason),\n })),\n };\n}\n\nfunction unescapeXml(value: string): string {\n return value\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, \"\\\"\")\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, \"&\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction booleanValue(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : [];\n}\n\nfunction truncate(value: string, max: number): string {\n if (value.length <= max) return value;\n if (max <= 3) return value.slice(0, max);\n return `${value.slice(0, max - 3)}...`;\n}\n\nfunction workflowTaskCounts(workflow: WorkflowPanelState): string {\n const parts = [\n workflow.completedTasks !== undefined ? `${workflow.completedTasks} done` : undefined,\n workflow.runningTasks ? `${workflow.runningTasks} running` : undefined,\n workflow.blockedTasks ? `${workflow.blockedTasks} blocked` : undefined,\n workflow.pendingTasks ? `${workflow.pendingTasks} pending` : undefined,\n workflow.failedTasks ? `${workflow.failedTasks} failed` : undefined,\n ].filter((part): part is string => part !== undefined);\n return parts.join(\" \");\n}\n\nfunction statusColor(status: string, colors: { success: string; warning: string; error: string; muted: string; foreground: string }): string {\n if (status === \"done\" || status === \"completed\") return colors.success;\n if (status === \"running\") return colors.success;\n if (status === \"idle\" || status === \"pending\" || status === \"blocked\" || status === \"skipped\") return colors.warning;\n if (status === \"error\" || status === \"failed\" || status === \"timed-out\") return colors.error;\n return colors.muted;\n}\n\nfunction SectionHeader({ title, muted }: { title: string; muted: string }) {\n return (\r\n <text fg={muted} attributes={TextAttributes.BOLD}>\r\n {\" \" + title.toUpperCase()}\r\n </text>\r\n );\r\n}\r\n\r\nexport type SidebarProps = {\r\n status: Record<string, unknown>;\n transcript: TranscriptItem[];\n mcpServers: McpServerSnapshot[];\n version?: string | null;\n};\r\n\r\nexport function Sidebar({\r\n status,\n transcript,\n mcpServers,\n}: SidebarProps) {\n const { theme } = useTheme();\r\n const c = theme.colors;\r\n\r\n const mode = String(status.permission_mode ?? \"\");\r\n const model = String(status.model ?? \"\");\r\n const effort = String(status.effort ?? \"\");\r\n const inputTokens = Number(status.input_tokens ?? 0);\r\n const outputTokens = Number(status.output_tokens ?? 0);\r\n\r\n const modifiedFiles = computeModifiedFiles(transcript);\n const workflow = computeWorkflowPanel(transcript);\n const shownFiles = modifiedFiles.slice(0, 15);\n const extraFiles = modifiedFiles.length - shownFiles.length;\n\r\n return (\r\n <box\r\n flexDirection=\"column\"\r\n width={40}\r\n flexShrink={0}\r\n borderColor={c.muted}\r\n border={[\"left\"]}\r\n customBorderChars={{\r\n topLeft: \"\", bottomLeft: \"\", vertical: \"│\",\r\n topRight: \"\", bottomRight: \"\", horizontal: \" \",\r\n bottomT: \"\", topT: \"\", cross: \"\", leftT: \"\", rightT: \"\",\r\n }}\r\n >\r\n <SectionHeader title=\"Session\" muted={c.muted} />\r\n {model ? <text fg={c.foreground}>{\" \" + model}</text> : null}\r\n {mode ? <text fg={c.muted}>{\" mode: \" + mode}</text> : null}\r\n {effort ? <text fg={c.warning}>{\" effort: \" + effort}</text> : null}\r\n {(inputTokens > 0 || outputTokens > 0) ? (\r\n <text fg={c.muted}>{` ${inputTokens}↓ ${outputTokens}↑`}</text>\r\n ) : null}\r\n\r\n {shownFiles.length > 0 ? (\r\n <box flexDirection=\"column\">\r\n <text>{\" \"}</text>\r\n <SectionHeader title=\"Modified\" muted={c.muted} />\r\n {shownFiles.map((f) => (\r\n <text key={f.path} fg={c.muted}>\r\n <span fg={c.success}>{`+${f.added}`}</span>\r\n <span fg={c.error}>{`-${f.removed}`}</span>\r\n {\" \" + f.path.split(\"/\").pop()}\r\n </text>\r\n ))}\r\n {extraFiles > 0 ? <text fg={c.muted}>{` +${extraFiles} more`}</text> : null}\r\n </box>\r\n ) : null}\r\n\r\n {workflow ? (\n <box flexDirection=\"column\">\n <text>{\" \"}</text>\n <SectionHeader title=\"Workflow\" muted={c.muted} />\n <text fg={c.muted}>\n <span fg={statusColor(workflow.status, c)}>{\" ●\"}</span>\n {\" \" + truncate(workflow.runId ?? \"latest\", 18)}\n {\" \" + truncate(workflow.status, 10)}\n </text>\n {workflow.mode ? <text fg={c.muted}>{\" mode: \" + workflow.mode}</text> : null}\n {workflowTaskCounts(workflow) ? <text fg={c.muted}>{\" \" + truncate(workflowTaskCounts(workflow), 34)}</text> : null}\n {workflow.needsReconciliation ? <text fg={c.warning}>{\" needs reconciliation\"}</text> : null}\n {workflow.tasks.slice(0, 5).map((task) => (\n <box key={task.id} flexDirection=\"column\">\n <text fg={c.muted}>\n <span fg={statusColor(task.status, c)}>{\" ●\"}</span>\n {\" \" + truncate(task.id, 18)}\n {\" \" + truncate(task.status, 10)}\n </text>\n {task.detail ? <text fg={c.foreground}>{\" \" + truncate(task.detail, 32)}</text> : null}\n </box>\n ))}\n {workflow.tasks.length > 5 ? <text fg={c.muted}>{` +${workflow.tasks.length - 5} more`}</text> : null}\n </box>\n ) : null}\n\n {mcpServers.length > 0 ? (\n <box flexDirection=\"column\">\r\n <text>{\" \"}</text>\r\n <SectionHeader title=\"MCP\" muted={c.muted} />\r\n {mcpServers.map((s) => {\r\n const dot = s.state === \"connected\" || s.state === \"ok\" ? \"●\" : \"○\";\r\n const dotColor = s.state === \"error\" ? c.error\r\n : (s.state === \"connected\" || s.state === \"ok\") ? c.success\r\n : c.muted;\r\n const tools = s.tool_count ? ` (${s.tool_count})` : \"\";\r\n return (\r\n <text key={s.name} fg={c.muted}>\r\n <span fg={dotColor}>{dot}</span>\r\n {\" \" + s.name.slice(0, 32) + tools}\r\n </text>\r\n );\r\n })}\r\n </box>\r\n ) : null}\r\n </box>\r\n );\r\n}\r\n",
48
- "/**\r\n * 解析后端 state_snapshot 的 status 字段。\r\n *\r\n * status 是 Record<string, unknown>(协议宽松),此前 App / Footer / Sidebar /\r\n * AppView 各自 String(status.x ?? ...) 解析,默认值还不统一。集中到这里:\r\n * mode 统一缺省 \"default\",token 统一 Number(... ?? 0)。\r\n */\r\nexport interface ParsedStatus {\r\n /** 权限模式,缺省 \"default\" */\r\n mode: string;\r\n model: string;\r\n /** 推理强度(空串表示无) */\r\n effort: string;\r\n inputTokens: number;\r\n outputTokens: number;\r\n}\r\n\r\nexport function parseStatus(status: Record<string, unknown>): ParsedStatus {\r\n return {\r\n mode: String(status.permission_mode ?? \"default\"),\r\n model: String(status.model ?? \"\"),\r\n effort: String(status.effort ?? \"\"),\r\n inputTokens: Number(status.input_tokens ?? 0),\r\n outputTokens: Number(status.output_tokens ?? 0),\r\n };\r\n}\r\n",
49
- "import { useEffect, useState } from \"react\";\nimport { readFileSync } from \"node:fs\";\r\nimport { join } from \"node:path\";\r\nimport { useTheme } from \"../../theme/ThemeContext\";\r\nimport { parseStatus } from \"../../services/status\";\r\nimport { CWD_DISPLAY_MAX_LEN, TOKEN_K_THRESHOLD } from \"../../ui/constants\";\r\nimport type { McpServerSnapshot } from \"../../types\";\r\n\r\n/** Read current git branch from .git/HEAD. Returns branch name or null. */\r\nfunction readGitBranch(): string | null {\r\n try {\r\n const headPath = join(process.cwd(), \".git\", \"HEAD\");\r\n const content = readFileSync(headPath, \"utf8\").trim();\r\n const match = content.match(/^ref: refs\\/heads\\/(.+)$/);\r\n return match ? (match[1] ?? null) : null;\r\n } catch {\r\n return null;\r\n }\r\n}\r\n\r\nconst BRANCH_POLL_MS = 10_000;\r\n\r\n/** 低频轮询 .git/HEAD:会话中切分支后 Footer 跟着刷新(同值 setState 会被 React 跳过) */\r\nfunction useGitBranch(): string | null {\r\n const [branch, setBranch] = useState<string | null>(() => readGitBranch());\r\n useEffect(() => {\r\n const id = setInterval(() => {\r\n setBranch(readGitBranch());\r\n }, BRANCH_POLL_MS);\r\n return () => clearInterval(id);\r\n }, []);\r\n return branch;\r\n}\r\n\r\nfunction formatTokens(n: number): string {\r\n if (n >= TOKEN_K_THRESHOLD) return `${(n / TOKEN_K_THRESHOLD).toFixed(1)}k`;\r\n return String(n);\r\n}\r\n\r\nfunction truncateCwd(cwd: string, maxLen = CWD_DISPLAY_MAX_LEN): string {\r\n // home 目录前缀缩写为 ~(对齐 opencode 的 \"~\\Desktop\" 风格)\r\n const home = process.env.USERPROFILE ?? process.env.HOME ?? \"\";\r\n if (home && cwd.startsWith(home)) {\r\n cwd = \"~\" + cwd.slice(home.length);\r\n }\r\n if (cwd.length <= maxLen) return cwd;\r\n return \"…\" + cwd.slice(cwd.length - (maxLen - 1));\r\n}\r\n\r\nexport type FooterProps = {\r\n status: Record<string, unknown>;\r\n mcpServers: McpServerSnapshot[];\r\n version?: string | null;\r\n};\r\n\r\nexport function Footer({ status, mcpServers, version }: FooterProps) {\r\n const { theme } = useTheme();\r\n const c = theme.colors;\r\n const gitBranch = useGitBranch();\r\n\r\n const { mode, inputTokens, outputTokens } = parseStatus(status);\n const isPlan = mode === \"plan\" || mode === \"Plan Mode\";\n const isCoordinator = status.session_mode === \"coordinator\";\n const hasTokens = inputTokens > 0 || outputTokens > 0;\n\r\n const mcpCount = mcpServers.length;\r\n const allConnected =\r\n mcpCount > 0 &&\r\n mcpServers.every(\r\n (s) => s.state === \"connected\" || s.state === \"ok\",\r\n );\r\n const hasError = mcpServers.some(\r\n (s) => s.state === \"error\" || s.state === \"failed\",\r\n );\r\n const mcpColor = hasError ? c.error : allConnected ? c.success : c.muted;\r\n\r\n const cwd = truncateCwd(process.cwd());\r\n const branchSuffix = gitBranch ? `:${gitBranch}` : \"\";\r\n const leftLabel = cwd + branchSuffix;\r\n\r\n return (\r\n <box flexDirection=\"row\" justifyContent=\"space-between\" paddingLeft={1} paddingRight={1}>\r\n {/* Left: cwd:branch ⊙N MCP /status(对齐 opencode 左侧信息区) */}\r\n <text fg={c.muted}>\r\n {leftLabel}\n {isPlan ? <span fg={c.warning}>{\" [PLAN]\"}</span> : null}\n {isCoordinator ? <span fg={c.accent}>{\" [COORDINATOR]\"}</span> : null}\n {mcpCount > 0 ? <span fg={mcpColor}>{` ⊙ ${mcpCount} MCP`}</span> : null}\r\n <span fg={c.muted}>{\" /status\"}</span>\r\n </text>\r\n\r\n {/* Right: tokens · version */}\r\n <text fg={c.muted}>\r\n {hasTokens ? (\r\n <span fg={c.muted}>{`${formatTokens(inputTokens)}↓ ${formatTokens(outputTokens)}↑`}</span>\r\n ) : null}\r\n {hasTokens && version ? <span fg={c.muted}>{\" · \"}</span> : null}\r\n {version ? <span fg={c.muted}>{version}</span> : null}\r\n </text>\r\n </box>\r\n );\r\n}\r\n",
50
- "import { useTheme } from \"../../theme/ThemeContext\";\r\nimport { AC_VISIBLE_ITEMS } from \"../../ui/constants\";\r\n\r\nexport type AutocompleteItem = {\r\n id: string;\r\n label: string;\r\n detail?: string;\r\n};\r\n\r\nexport type AutocompleteProps = {\r\n items: AutocompleteItem[];\r\n selectedIndex: number;\r\n};\r\n\r\nexport function Autocomplete({ items, selectedIndex }: AutocompleteProps) {\r\n const { theme } = useTheme();\r\n const total = items.length;\r\n if (total === 0) return null;\r\n\r\n // 滑动视口:始终让选中项保持可见(居中优先)\r\n const windowStart = Math.max(\r\n 0,\r\n Math.min(\r\n selectedIndex - Math.floor(AC_VISIBLE_ITEMS / 2),\r\n total - AC_VISIBLE_ITEMS,\r\n ),\r\n );\r\n const visible = items.slice(windowStart, windowStart + AC_VISIBLE_ITEMS);\r\n\r\n const nameColWidth = Math.max(...visible.map((c) => c.label.length)) + 4;\r\n\r\n return (\r\n <box flexDirection=\"column\" backgroundColor={theme.colors.backgroundPanel}>\r\n {visible.map((item, localIdx) => {\r\n const isSelected = windowStart + localIdx === selectedIndex;\r\n return (\r\n <box\r\n key={item.id}\r\n flexDirection=\"row\"\r\n width=\"100%\"\r\n paddingLeft={1}\r\n paddingRight={1}\r\n backgroundColor={isSelected ? theme.colors.accent : undefined}\r\n >\r\n <text\r\n fg={isSelected ? theme.colors.background : theme.colors.foreground}\r\n flexShrink={0}\r\n >\r\n {item.label.padEnd(nameColWidth)}\r\n </text>\r\n {item.detail ? (\r\n <text fg={isSelected ? theme.colors.background : theme.colors.muted}>\r\n {item.detail}\r\n </text>\r\n ) : null}\r\n </box>\r\n );\r\n })}\r\n </box>\r\n );\r\n}\r\n",
51
- "import { readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\r\nimport { join } from \"node:path\";\r\nimport { homedir } from \"node:os\";\r\n\r\nconst HALF_LIFE_MS = 14 * 24 * 60 * 60 * 1000;\r\n\r\ntype FrecencyStore = {\r\n command: Record<string, number[]>;\r\n file: Record<string, number[]>;\r\n};\r\n\r\nlet store: FrecencyStore | null = null;\r\nlet dirty = false;\r\nlet debounceTimer: ReturnType<typeof setTimeout> | null = null;\r\n\r\nfunction configPath(): string {\r\n const dir = process.env.OPENHARNESS_CONFIG_DIR ?? join(homedir(), \".openharness-ts\");\n mkdirSync(dir, { recursive: true });\r\n return join(dir, \"frecency.json\");\r\n}\r\n\r\nfunction load(): FrecencyStore {\r\n if (store !== null) return store;\r\n try {\r\n const raw = readFileSync(configPath(), \"utf-8\");\r\n store = JSON.parse(raw) as FrecencyStore;\r\n if (!store.command) store.command = {};\r\n if (!store.file) store.file = {};\r\n } catch {\r\n store = { command: {}, file: {} };\r\n }\r\n return store;\r\n}\r\n\r\nfunction scheduleSave(): void {\r\n if (debounceTimer !== null) clearTimeout(debounceTimer);\r\n debounceTimer = setTimeout(() => {\r\n if (store && dirty) {\r\n try {\r\n writeFileSync(configPath(), JSON.stringify(store));\r\n } catch { /* silent */ }\r\n dirty = false;\r\n }\r\n }, 500);\r\n}\r\n\r\nexport function computeScore(timestamps: number[]): number {\n const now = Date.now();\n return timestamps.reduce((sum, ts) => {\n return sum + Math.pow(2, -(now - ts) / HALF_LIFE_MS);\n }, 0);\n}\n\r\nexport function record(kind: \"command\" | \"file\", key: string): void {\r\n const s = load();\r\n if (!s[kind][key]) s[kind][key] = [];\r\n s[kind][key]!.push(Date.now());\r\n dirty = true;\r\n scheduleSave();\r\n}\r\n\r\nexport function rank(kind: \"command\" | \"file\"): Map<string, number> {\r\n const s = load();\r\n const map = new Map<string, number>();\r\n for (const [key, timestamps] of Object.entries(s[kind])) {\r\n map.set(key, computeScore(timestamps));\r\n }\r\n return map;\r\n}\r\n",
52
- "import { fuzzyFilterScored } from \"./fuzzy\";\r\nimport { rank as frecencyRank } from \"../services/frecency\";\r\nimport type { Command } from \"../keymap/commands\";\r\n\r\n/**\r\n * 斜杠命令排序:先按 fuzzy 匹配分,分数相同再按 frecency(最近+高频)排序。\r\n *\r\n * Prompt 的补全浮窗(展示项)与回车执行(原始 Command)共用这一份排序结果,\r\n * 避免把 fuzzyFilterScored + frecencyRank + sort 重复计算两遍。\r\n */\r\nexport function rankSlashCommands(commands: Command[], query: string): Command[] {\r\n const scores = frecencyRank(\"command\");\r\n return fuzzyFilterScored(commands, query, (c) => c.id)\r\n .sort((a, b) => {\r\n if (b.score !== a.score) return b.score - a.score;\r\n return (scores.get(b.item.id) ?? 0) - (scores.get(a.item.id) ?? 0);\r\n })\r\n .map(({ item }) => item);\r\n}\r\n",
53
- "import { join, relative } from \"node:path\";\r\nimport { readdirSync, statSync } from \"node:fs\";\r\nimport type { AutocompleteItem } from \"./Autocomplete\";\r\n\r\nimport { AC_VISIBLE_ITEMS } from \"../../ui/constants\";\r\n\r\nconst MAX_FILES = 5000;\r\n\r\nconst SKIP_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \".next\", \".turbo\", \"build\", \"coverage\"]);\r\n\r\nconst cache = new Map<string, string[]>();\r\n\r\nexport async function listProjectFiles(cwd: string): Promise<string[]> {\r\n if (cache.has(cwd)) return cache.get(cwd)!;\r\n\r\n let files: string[] = [];\r\n try {\r\n const proc = Bun.spawn(\n [\"git\", \"ls-files\", \"--cached\", \"--others\", \"--exclude-standard\"],\n { cwd, stdout: \"pipe\", stderr: \"pipe\", windowsHide: true },\n );\n const text = await new Response(proc.stdout).text();\r\n await proc.exited;\r\n files = text.split(\"\\n\").filter(Boolean).slice(0, MAX_FILES);\r\n } catch {\r\n files = fsWalk(cwd, cwd, 0).slice(0, MAX_FILES);\r\n }\r\n\r\n cache.set(cwd, files);\r\n return files;\r\n}\r\n\r\nfunction fsWalk(root: string, dir: string, depth: number): string[] {\r\n if (depth > 6) return [];\r\n const entries: string[] = [];\r\n try {\r\n for (const entry of readdirSync(dir)) {\r\n const full = join(dir, entry);\r\n try {\r\n const stat = statSync(full);\r\n if (stat.isDirectory()) {\r\n if (!SKIP_DIRS.has(entry)) {\r\n entries.push(...fsWalk(root, full, depth + 1));\r\n }\r\n } else {\r\n entries.push(relative(root, full).replace(/\\\\/g, \"/\"));\r\n }\r\n } catch { /* skip unreadable entries */ }\r\n }\r\n } catch { /* skip unreadable directories */ }\r\n return entries;\r\n}\r\n\r\nexport function detectAtToken(\r\n text: string,\r\n): { token: string; atStart: number; atEnd: number } | null {\r\n // Find the last @ that is at start or preceded by whitespace, followed by non-space chars\r\n // An @ followed immediately by a space (and not at end) is not a valid token\r\n const re = /(^|\\s)@(\\S*)/g;\r\n let last: RegExpExecArray | null = null;\r\n let m: RegExpExecArray | null;\r\n while ((m = re.exec(text)) !== null) {\r\n last = m;\r\n }\r\n if (!last) return null;\r\n const token = last[2]!;\r\n const prefix = last[1]!;\r\n const matchStart = last.index!;\r\n const atStart = matchStart + prefix.length;\r\n const atEnd = atStart + 1 + token.length; // 1 for '@'\r\n // If token is empty and there is non-whitespace text after the @, return null\r\n // e.g. \"hello @ world\" — the @ is followed by space so token=\"\" but it's not at end\r\n if (token === \"\" && atEnd < text.length) return null;\r\n return { token, atStart, atEnd };\r\n}\r\n\r\nexport function buildAtItems(\r\n files: string[],\r\n token: string,\r\n frecencyScores?: Map<string, number>,\r\n): AutocompleteItem[] {\r\n const lower = token.toLowerCase();\r\n const filtered = token === \"\"\r\n ? [...files].sort((a, b) => (frecencyScores?.get(b) ?? 0) - (frecencyScores?.get(a) ?? 0))\r\n : files.filter((f) => f.toLowerCase().includes(lower));\r\n return filtered.slice(0, AC_VISIBLE_ITEMS).map((f) => ({ id: f, label: f }));\r\n}\r\n",
54
- "import { useState, useEffect, useRef, useCallback } from \"react\";\nimport { useKeyboard } from \"@opentui/react\";\r\nimport { TextAttributes, decodePasteBytes, stripAnsiSequences } from \"@opentui/core\";\r\nimport type { PasteEvent, TextareaRenderable } from \"@opentui/core\";\r\nimport { useTheme } from \"../../theme/ThemeContext\";\r\nimport { Autocomplete } from \"./Autocomplete\";\r\nimport type { AutocompleteItem } from \"./Autocomplete\";\r\nimport type { Command } from \"../../keymap/commands\";\r\nimport { rankSlashCommands } from \"../../ui/commandRanking\";\r\nimport { listProjectFiles, detectAtToken, buildAtItems } from \"./fileCompletion\";\r\nimport { record as frecencyRecord, rank as frecencyRank } from \"../../services/frecency\";\r\nimport { useListNavigation } from \"../../hooks/useListNavigation\";\r\nimport { SPINNER_INTERVAL_MS, TEXTAREA_MAX_LINES, TEXTAREA_MIN_LINES } from \"../../ui/constants\";\n\r\nexport type PromptProps = {\r\n busy: boolean;\r\n placeholder?: string;\r\n mode: string;\r\n model: string;\r\n effort?: string;\r\n history: string[];\r\n slashCommands: Command[];\r\n onSubmit: (line: string) => void;\r\n onCycleMode: () => void;\r\n /** 草稿提升:弹层打开会卸载 Prompt,草稿由父级持有,重挂载时恢复 */\r\n draft?: string;\r\n onDraftChange?: (text: string) => void;\r\n /** 双击 Esc 取消:第一次 Esc 后显示提示 */\r\n escHint?: boolean;\r\n};\r\n\r\nconst DEFAULT_PLACEHOLDER = 'Ask anything... \"Fix broken tests\"';\r\n\r\nconst MODE_LABELS: Record<string, string> = {\r\n default: \"Default\",\r\n full_auto: \"Auto\",\r\n plan: \"Plan\",\r\n};\r\n\r\nfunction getModeLabel(mode: string): string {\r\n return MODE_LABELS[mode] ?? mode;\r\n}\r\n\r\nexport function Prompt({\r\n busy,\r\n placeholder = DEFAULT_PLACEHOLDER,\r\n mode,\r\n model,\r\n effort,\r\n history,\r\n slashCommands,\r\n onSubmit,\r\n onCycleMode,\r\n draft,\r\n onDraftChange,\r\n escHint,\r\n}: PromptProps) {\r\n const { theme } = useTheme();\r\n\r\n // Content state (synced from textarea via onContentChange)\r\n const [content, setContent] = useState(\"\");\r\n\r\n // Autocomplete state\r\n const [acOpen, setAcOpen] = useState(false);\r\n\r\n // File @ completion state\r\n const [fileAcOpen, setFileAcOpen] = useState(false);\r\n const [fileAcItems, setFileAcItems] = useState<AutocompleteItem[]>([]);\r\n const [filesLoaded, setFilesLoaded] = useState(false);\r\n const filesRef = useRef<string[]>([]);\r\n const fileAtRef = useRef<{ atStart: number; atEnd: number } | null>(null);\r\n\r\n // History navigation state\r\n const [histIdx, setHistIdx] = useState<number | null>(null);\r\n\r\n // Spinner state for busy\r\n const [spinnerFrame, setSpinnerFrame] = useState(0);\r\n\r\n // Dynamic textarea height (1–6 lines)\r\n const [textareaHeight, setTextareaHeight] = useState(TEXTAREA_MIN_LINES);\n\r\n // Textarea ref for imperative operations\r\n const textareaRef = useRef<TextareaRenderable | null>(null);\r\n\r\n // Restore lifted draft once on mount (Prompt is unmounted while dialogs are open)\r\n useEffect(() => {\r\n if (draft && textareaRef.current) {\r\n textareaRef.current.insertText(draft);\r\n setContent(draft);\r\n }\r\n // eslint-disable-next-line react-hooks/exhaustive-deps\r\n }, []);\r\n\r\n // 排序一次,补全浮窗(展示项)和回车执行(原始 Command)共用,避免重复计算。\r\n const acRawCommands: Command[] = acOpen ? rankSlashCommands(slashCommands, content) : [];\r\n const acSuggestions: AutocompleteItem[] = acRawCommands.map((cmd) => ({\r\n id: cmd.id,\r\n label: cmd.id,\r\n detail: cmd.title !== cmd.id ? cmd.title : undefined,\r\n }));\r\n\r\n // 列表导航钩子(count 跟随派生值动态更新)\r\n const acNav = useListNavigation(acRawCommands.length);\r\n const fileAcNav = useListNavigation(fileAcItems.length);\r\n\r\n // Determine if autocomplete should be open\r\n const shouldShowAc = content.startsWith(\"/\") && content.length > 0;\r\n\r\n // Sync acOpen with shouldShowAc\r\n useEffect(() => {\r\n if (!shouldShowAc) {\r\n setAcOpen(false);\r\n acNav.setIndex(0);\r\n } else {\r\n setAcOpen(true);\r\n }\r\n }, [shouldShowAc]);\r\n\r\n // Reset ac selection when content changes (new filter)\r\n useEffect(() => {\r\n acNav.setIndex(0);\r\n }, [content]);\r\n\r\n // Spinner interval when busy; reset frame when no longer busy (Bug 4)\r\n useEffect(() => {\r\n if (!busy) {\r\n setSpinnerFrame(0);\r\n return;\r\n }\r\n const frames = theme.icons.spinner;\r\n const id = setInterval(() => {\r\n setSpinnerFrame((f) => (f + 1) % frames.length);\r\n }, SPINNER_INTERVAL_MS);\r\n return () => clearInterval(id);\r\n }, [busy, theme.icons.spinner]);\r\n\r\n // 把 @token 替换为选中的文件路径;无法应用时返回 null\r\n const fileApplySelected = useCallback((text: string): string | null => {\r\n const at = fileAtRef.current;\r\n const selected = fileAcItems[fileAcNav.index];\r\n if (!at || !selected) return null;\r\n return text.slice(0, at.atStart) + selected.id + text.slice(at.atEnd);\r\n }, [fileAcItems, fileAcNav.index]);\r\n\r\n // 关闭文件补全浮窗并重置状态\r\n const fileClose = useCallback(() => {\r\n setFileAcOpen(false);\r\n fileAcNav.setIndex(0);\r\n fileAtRef.current = null;\r\n }, [fileAcNav.setIndex]);\r\n\r\n const syncTextareaContent = useCallback((): string => {\r\n const text = textareaRef.current?.plainText ?? \"\";\r\n setContent(text);\r\n onDraftChange?.(text);\r\n const lineCount = textareaRef.current?.lineCount ?? 1;\r\n setTextareaHeight(Math.min(TEXTAREA_MAX_LINES, Math.max(TEXTAREA_MIN_LINES, lineCount)));\n return text;\r\n }, [onDraftChange]);\r\n\r\n const updateFileCompletion = useCallback((text: string) => {\r\n const atResult = detectAtToken(text);\r\n if (atResult !== null) {\r\n if (!filesLoaded) {\r\n listProjectFiles(process.cwd()).then((files) => {\r\n filesRef.current = files;\r\n setFilesLoaded(true);\r\n });\r\n }\r\n fileAtRef.current = { atStart: atResult.atStart, atEnd: atResult.atEnd };\r\n const fileScores = frecencyRank(\"file\");\r\n setFileAcItems(buildAtItems(filesRef.current, atResult.token, fileScores));\r\n fileAcNav.setIndex(0);\r\n setFileAcOpen(true);\r\n setAcOpen(false);\r\n } else {\r\n setFileAcOpen(false);\r\n fileAtRef.current = null;\r\n }\r\n }, [filesLoaded, fileAcNav.setIndex]);\r\n\r\n // Clear textarea imperatively\r\n const clearTextarea = useCallback(() => {\r\n if (textareaRef.current) {\r\n textareaRef.current.clear();\r\n }\r\n setContent(\"\");\n setHistIdx(null);\n setTextareaHeight(TEXTAREA_MIN_LINES);\n onDraftChange?.(\"\");\n }, [onDraftChange]);\n\r\n // Handle textarea onSubmit (triggered by Return key)\r\n const handleTextareaSubmit = useCallback(() => {\r\n const text = textareaRef.current?.plainText ?? content;\r\n const trimmed = text.trim();\r\n const isSlashCommand = trimmed.startsWith(\"/\");\r\n if (text !== content) {\r\n setContent(text);\r\n onDraftChange?.(text);\r\n }\r\n\r\n // If file @ completion is open, insert the selected file path\r\n if (fileAcOpen) {\r\n if (textareaRef.current) {\r\n const next = fileApplySelected(text);\r\n if (next !== null) {\r\n textareaRef.current.setText(next);\r\n setContent(next);\r\n }\r\n }\r\n fileClose();\r\n return;\r\n }\r\n\r\n // Complete prefixes like \"/th\"; submit exact slash lines and slash lines with args.\r\n if (acOpen) {\r\n const exactCommand = acRawCommands.some((cmd) => cmd.id === trimmed);\r\n const slashWithArgs = /^\\/\\S+\\s+[\\s\\S]+$/.test(trimmed);\r\n if (exactCommand || slashWithArgs || acRawCommands.length === 0) {\r\n if (!busy || isSlashCommand) {\r\n onSubmit(trimmed);\r\n clearTextarea();\r\n }\r\n setAcOpen(false);\r\n return;\r\n }\r\n const suggestion = acRawCommands[acNav.index];\r\n if (suggestion) {\r\n suggestion.run();\r\n frecencyRecord(\"command\", suggestion.id);\r\n clearTextarea();\r\n setAcOpen(false);\r\n }\r\n return;\r\n }\r\n\r\n if (trimmed === \"\") return;\r\n if (busy && !isSlashCommand) return;\r\n\r\n onSubmit(trimmed);\r\n clearTextarea();\r\n }, [busy, fileAcOpen, fileApplySelected, fileClose, acOpen, acRawCommands, acNav.index, content, onDraftChange, onSubmit, clearTextarea]);\r\n\r\n const handleTextareaPaste = useCallback((event: PasteEvent) => {\r\n const text = stripAnsiSequences(decodePasteBytes(event.bytes))\r\n .replace(/\\r\\n/g, \"\\n\")\r\n .replace(/\\r/g, \"\\n\");\r\n\r\n event.preventDefault();\r\n if (!text || !textareaRef.current) return;\r\n\r\n textareaRef.current.insertText(text);\r\n setTimeout(() => {\r\n const current = syncTextareaContent();\r\n updateFileCompletion(current);\r\n }, 0);\r\n }, [syncTextareaContent, updateFileCompletion]);\r\n\r\n // Global keyboard handler\r\n useKeyboard((key) => {\r\n if (key.name === \"tab\") {\r\n if (fileAcOpen) {\r\n if (textareaRef.current) {\r\n const next = fileApplySelected(textareaRef.current.plainText);\r\n if (next !== null) {\r\n textareaRef.current.setText(next);\r\n setContent(next);\r\n }\r\n }\r\n fileClose();\r\n return;\r\n }\r\n if (acOpen) {\r\n // Complete with highlighted suggestion\r\n const suggestion = acSuggestions[acNav.index];\r\n if (suggestion && textareaRef.current) {\r\n const completed = suggestion.id + \" \";\r\n textareaRef.current.clear();\r\n textareaRef.current.insertText(completed);\r\n // Bug 2: sync content state immediately so derived acSuggestions/acOpen\r\n // use the updated value without waiting for the async onContentChange event.\r\n setContent(completed);\r\n }\r\n } else {\r\n onCycleMode();\r\n }\r\n return;\r\n }\r\n\r\n if (key.name === \"up\") {\r\n if (fileAcOpen) { fileAcNav.moveUp(); return; }\r\n if (acOpen) {\r\n acNav.moveUp();\r\n } else {\r\n // Bug 1: read from ref to avoid stale closure — content state may lag\r\n const currentText = textareaRef.current?.plainText ?? \"\";\r\n if (currentText === \"\") {\r\n // History navigation: up → older\r\n const newIdx =\r\n histIdx === null\r\n ? history.length - 1\r\n : Math.max(0, histIdx - 1);\r\n if (history.length > 0 && newIdx >= 0) {\r\n setHistIdx(newIdx);\r\n const entry = history[newIdx];\r\n if (entry !== undefined && textareaRef.current) {\r\n textareaRef.current.clear();\r\n textareaRef.current.insertText(entry);\r\n }\r\n }\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (key.name === \"down\") {\r\n if (fileAcOpen) { fileAcNav.moveDown(); return; }\r\n if (acOpen) {\r\n acNav.moveDown();\r\n } else {\r\n // Bug 1: read from ref to avoid stale closure\r\n const currentText = textareaRef.current?.plainText ?? \"\";\r\n if (currentText === \"\") {\r\n // History navigation: down → newer\r\n if (histIdx !== null) {\r\n const newIdx = histIdx + 1;\r\n if (newIdx >= history.length) {\r\n // Past the end: clear input\r\n setHistIdx(null);\r\n clearTextarea();\r\n } else {\r\n setHistIdx(newIdx);\r\n const entry = history[newIdx];\r\n if (entry !== undefined && textareaRef.current) {\r\n textareaRef.current.clear();\r\n textareaRef.current.insertText(entry);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n return;\r\n }\r\n\r\n if (key.name === \"escape\") {\r\n if (fileAcOpen) { fileClose(); return; }\r\n if (acOpen) {\r\n setAcOpen(false);\r\n acNav.setIndex(0);\r\n } else {\r\n clearTextarea();\r\n }\r\n return;\r\n }\r\n });\r\n\r\n const modeLabel = getModeLabel(mode);\r\n\r\n const keyBindings = [\r\n // shift+return → newline\r\n { name: \"return\", shift: true, action: \"newline\" as const },\r\n // return → submit\r\n { name: \"return\", action: \"submit\" as const },\r\n ];\r\n\r\n // flexShrink=0:防止 Session 路由下被 scrollbox 挤压裁掉 meta 行。\r\n // 左竖条对齐 opencode:border-left + 细线字符 ┃(半格宽字形),\r\n // 而非 width=1 实心背景块(整格填色观感过粗)。\r\n return (\r\n <box\r\n flexDirection=\"row\"\r\n flexShrink={0}\r\n border={[\"left\"]}\r\n borderColor={theme.colors.accent}\r\n customBorderChars={{\r\n topLeft: \"\",\r\n bottomLeft: \"\",\r\n vertical: \"┃\",\r\n topRight: \"\",\r\n bottomRight: \"\",\r\n horizontal: \" \",\r\n bottomT: \"\",\r\n topT: \"\",\r\n cross: \"\",\r\n leftT: \"\",\r\n rightT: \"\",\r\n }}\r\n >\r\n {/* Content column(padding 对齐 opencode:左右 2、上下 1) */}\r\n <box\r\n flexDirection=\"column\"\r\n flexGrow={1}\r\n backgroundColor={theme.colors.backgroundPrompt}\r\n paddingLeft={2}\r\n paddingRight={2}\r\n paddingTop={1}\r\n paddingBottom={1}\r\n >\r\n {/* File @ completion floats above textarea */}\r\n {fileAcOpen && fileAcItems.length > 0 && (\r\n <Autocomplete items={fileAcItems} selectedIndex={fileAcNav.index} />\r\n )}\r\n\r\n {/* Slash command autocomplete floats above textarea */}\r\n {acOpen && acSuggestions.length > 0 && (\r\n <Autocomplete\r\n items={acSuggestions}\r\n selectedIndex={acNav.index}\r\n />\r\n )}\r\n\r\n {/* Multiline textarea */}\r\n <textarea\r\n ref={textareaRef}\r\n focused={true}\r\n placeholder={placeholder}\r\n placeholderColor={theme.colors.muted}\r\n keyBindings={keyBindings}\r\n onSubmit={handleTextareaSubmit}\r\n onPaste={handleTextareaPaste}\r\n onContentChange={() => {\r\n // Read plainText from ref on next tick (event has no content)\r\n const text = syncTextareaContent();\r\n // Bug 3: update height based on line count (1–6 rows)\r\n // Detect @ token for file completion\r\n const atResult = detectAtToken(text);\r\n if (atResult !== null) {\r\n if (!filesLoaded) {\r\n listProjectFiles(process.cwd()).then((files) => {\r\n filesRef.current = files;\r\n setFilesLoaded(true);\r\n });\r\n }\r\n fileAtRef.current = { atStart: atResult.atStart, atEnd: atResult.atEnd };\r\n const fileScores = frecencyRank(\"file\");\r\n setFileAcItems(buildAtItems(filesRef.current, atResult.token, fileScores));\r\n fileAcNav.setIndex(0);\r\n setFileAcOpen(true);\r\n setAcOpen(false);\r\n } else {\r\n setFileAcOpen(false);\r\n fileAtRef.current = null;\r\n }\r\n }}\r\n height={textareaHeight}\r\n flexShrink={0}\r\n />\r\n\r\n {/* Meta info row(paddingTop=1 即输入区与元信息行之间的空隙,对齐 opencode) */}\r\n {busy ? (\r\n <box flexDirection=\"row\" paddingTop={1}>\r\n <text fg={theme.colors.accent}>\r\n {theme.icons.spinner[spinnerFrame] ?? \"⠋\"}\r\n </text>\r\n <text fg={theme.colors.muted}>{\" working...\"}</text>\r\n {escHint && (\r\n <text fg={theme.colors.warning}>{\" (再按 Esc 取消)\"}</text>\r\n )}\r\n </box>\r\n ) : (\r\n <box flexDirection=\"row\" paddingTop={1}>\r\n <text\r\n fg={theme.colors.accent}\r\n attributes={TextAttributes.BOLD}\r\n >\r\n {modeLabel}\r\n </text>\r\n <text fg={theme.colors.foreground}>{` · ${model}`}</text>\r\n {effort != null && effort !== \"\" && (\r\n <text fg={theme.colors.warning}>{` · ${effort}`}</text>\r\n )}\r\n </box>\r\n )}\r\n </box>\r\n </box>\r\n );\r\n}\r\n",
55
- "import { useTheme } from \"../../theme/ThemeContext\";\r\nimport { Home } from \"../Home\";\r\nimport { Session } from \"./Session\";\r\nimport { Sidebar } from \"./Sidebar\";\nimport { Footer } from \"./Footer\";\nimport { Prompt } from \"../../components/prompt/Prompt\";\nimport type { McpServerSnapshot, TranscriptItem } from \"../../types\";\nimport type { Command } from \"../../keymap/commands\";\r\nimport { parseStatus } from \"../../services/status\";\r\n\r\nexport type AppViewProps = {\r\n transcript: TranscriptItem[];\r\n assistantBuffer: string;\r\n ready: boolean;\r\n busy: boolean;\r\n status: Record<string, unknown>;\n mcpServers: McpServerSnapshot[];\n version?: string | null;\r\n history: string[];\r\n slashCommands: Command[];\r\n onSubmit: (line: string) => void;\r\n onCycleMode: () => void;\r\n dialogOpen: boolean;\r\n /** 草稿提升:dialogOpen 卸载 Prompt 时由 AppInner 持有,重挂载恢复 */\r\n draft?: string;\r\n onDraftChange?: (text: string) => void;\r\n sidebarOpen: boolean;\r\n onToggleSidebar: () => void;\r\n escHint?: boolean;\r\n};\r\n\r\n/**\r\n * 纯渲染层(无副作用、易测)。根据会话状态在三种布局间切换:\r\n * 未就绪占位 / Home 路由(无对话时)/ Session 路由(左栏消息流 + 右栏 Sidebar)。\r\n */\r\nexport function AppView({\r\n transcript,\r\n assistantBuffer,\r\n ready,\r\n busy,\r\n status,\n mcpServers,\n version,\r\n history,\r\n slashCommands,\r\n onSubmit,\r\n onCycleMode,\r\n dialogOpen,\r\n draft,\r\n onDraftChange,\r\n sidebarOpen,\r\n onToggleSidebar: _onToggleSidebar,\r\n escHint,\r\n}: AppViewProps) {\r\n const { theme } = useTheme();\r\n\r\n if (!ready) {\r\n return (\r\n <box flexDirection=\"column\" width=\"100%\" height=\"100%\" backgroundColor={theme.colors.background}>\r\n <text fg={theme.colors.warning}>Connecting to backend...</text>\r\n </box>\r\n );\r\n }\r\n\r\n // Route: Home if no user/assistant items yet and not busy and no streaming\r\n const hasConversation = transcript.some(\r\n (item) => item.role === \"user\" || item.role === \"assistant\",\r\n );\r\n const isHome = !hasConversation && !busy && !assistantBuffer;\r\n\r\n const { mode, model, effort } = parseStatus(status);\r\n\r\n const prompt = dialogOpen ? null : (\r\n <Prompt\r\n busy={busy}\r\n mode={mode}\r\n model={model}\r\n effort={effort}\r\n history={history}\r\n slashCommands={slashCommands}\r\n onSubmit={onSubmit}\r\n onCycleMode={onCycleMode}\r\n draft={draft}\r\n onDraftChange={onDraftChange}\r\n escHint={escHint}\r\n />\r\n );\r\n\r\n if (isHome) {\r\n return (\r\n <box flexDirection=\"column\" width=\"100%\" height=\"100%\" backgroundColor={theme.colors.background}>\r\n <Home>{prompt}</Home>\r\n <Footer status={status} mcpServers={mcpServers} version={version} />\r\n </box>\r\n );\r\n }\r\n\r\n return (\r\n <box flexDirection=\"row\" width=\"100%\" height=\"100%\" backgroundColor={theme.colors.background}>\r\n {/* Left column: messages + panels + prompt + footer */}\r\n <box flexDirection=\"column\" flexGrow={1} backgroundColor={theme.colors.background}>\r\n <Session items={transcript} assistantBuffer={assistantBuffer} />\n {prompt}\n <Footer status={status} mcpServers={mcpServers} version={version} />\r\n </box>\r\n {/* Right column: Sidebar */}\r\n {sidebarOpen ? (\r\n <Sidebar\r\n status={status}\r\n transcript={transcript}\n mcpServers={mcpServers}\n version={version}\n />\r\n ) : null}\r\n </box>\r\n );\r\n}\r\n",
56
- "import { useEffect, useMemo, useState } from \"react\";\r\nimport { TextAttributes } from \"@opentui/core\";\r\nimport { useKeyboard } from \"@opentui/react\";\r\nimport type { JobReadResult, JobSnapshot } from \"@openharness/client\";\r\nimport { useListNavigation } from \"../hooks/useListNavigation\";\r\nimport type { JobDetailRemoteState, JobRemoteState } from \"../jobs/job-remote-state\";\r\nimport { useTheme } from \"../theme/ThemeContext\";\r\n\r\nexport interface JobsPanelProps {\r\n state: JobRemoteState;\r\n detailState: JobDetailRemoteState;\r\n onRefresh(): void;\r\n onSelect(jobId: string): void;\r\n onCancel(jobId: string): void;\r\n}\r\n\r\ntype JobKindFilter = JobSnapshot[\"kind\"] | undefined;\r\ntype JobStatusFilter = JobSnapshot[\"status\"] | undefined;\r\ntype WorkflowStepRow = { taskId: string; status: string; summary?: string };\r\n\r\nconst VISIBLE_JOBS = 7;\r\nconst VISIBLE_OUTPUT_LINES = 6;\r\nconst VISIBLE_WORKFLOW_STEPS = 5;\r\nconst JOB_KINDS: JobSnapshot[\"kind\"][] = [\"terminal\", \"shell\", \"agent\", \"dream\", \"workflow\"];\r\nconst JOB_STATUSES: JobSnapshot[\"status\"][] = [\"running\", \"stopping\", \"completed\", \"killed\", \"failed\"];\r\n\r\nexport function JobsPanel({ state, detailState, onRefresh, onSelect, onCancel }: JobsPanelProps) {\r\n const { theme } = useTheme();\r\n const c = theme.colors;\r\n const [kindFilter, setKindFilter] = useState<JobKindFilter>();\r\n const [statusFilter, setStatusFilter] = useState<JobStatusFilter>();\r\n const visibleJobs = useMemo(\r\n () => state.jobs.filter((job) => (!kindFilter || job.kind === kindFilter) && (!statusFilter || job.status === statusFilter)),\r\n [kindFilter, state.jobs, statusFilter],\r\n );\r\n const { index, setIndex, moveUp, moveDown } = useListNavigation(visibleJobs.length);\r\n const cursorIndex = Math.min(index, Math.max(0, visibleJobs.length - 1));\r\n const selectedJob = visibleJobs[cursorIndex];\r\n\r\n useEffect(() => {\r\n if (index !== cursorIndex) setIndex(cursorIndex);\r\n }, [cursorIndex, index, setIndex]);\r\n\r\n useKeyboard((key) => {\r\n if (key.name === \"up\") { moveUp(); return; }\r\n if (key.name === \"down\") { moveDown(); return; }\r\n if (key.name === \"return\" && selectedJob) { onSelect(selectedJob.id); return; }\r\n if (key.name === \"r\") { onRefresh(); return; }\r\n if (key.name === \"c\" && selectedJob?.capabilities.cancel) { onCancel(selectedJob.id); return; }\r\n if (key.name === \"k\") {\r\n setKindFilter((current) => nextFilter(JOB_KINDS, current));\r\n setIndex(0);\r\n return;\r\n }\r\n if (key.name === \"f\") {\r\n setStatusFilter((current) => nextFilter(JOB_STATUSES, current));\r\n setIndex(0);\r\n }\r\n });\r\n\r\n const windowStart = Math.max(0, Math.min(cursorIndex - 3, Math.max(0, visibleJobs.length - VISIBLE_JOBS)));\r\n const jobWindow = visibleJobs.slice(windowStart, windowStart + VISIBLE_JOBS);\r\n\r\n return (\r\n <box flexDirection=\"column\">\r\n <text attributes={TextAttributes.BOLD} fg={c.accent}>Jobs</text>\r\n <text fg={c.muted}>r refresh enter detail c cancel k kind f status</text>\r\n <text fg={c.muted}>{formatListSummary(state.jobs.length, visibleJobs.length, kindFilter, statusFilter)}</text>\r\n <ListRemoteState state={state} />\r\n {visibleJobs.length > 0 ? (\r\n <box flexDirection=\"column\">\r\n {jobWindow.map((job, visibleIndex) => {\r\n const isCursor = windowStart + visibleIndex === cursorIndex;\r\n return <JobRow key={job.id} job={job} selected={isCursor} />;\r\n })}\r\n </box>\r\n ) : state.status === \"ready\" || state.status === \"idle\" ? (\r\n <text fg={c.muted}>{state.status === \"ready\" ? \"No Jobs in this session\" : \"Jobs have not been loaded\"}</text>\r\n ) : null}\r\n {detailState.status === \"idle\" ? null : <JobDetail state={detailState} />}\r\n </box>\r\n );\r\n}\r\n\r\nfunction ListRemoteState({ state }: { state: JobRemoteState }) {\r\n const { theme } = useTheme();\r\n const c = theme.colors;\r\n if (state.status === \"loading\") return <text fg={c.warning}>Loading Jobs</text>;\r\n if (state.status === \"error\") {\r\n return (\r\n <box flexDirection=\"column\">\r\n <text fg={c.error}>{`Jobs unavailable: ${state.error}`}</text>\r\n {state.jobs.length > 0 ? <text fg={c.warning}>Showing cached Jobs</text> : null}\r\n </box>\r\n );\r\n }\r\n return null;\r\n}\r\n\r\nfunction JobRow({ job, selected }: { job: JobSnapshot; selected: boolean }) {\r\n const { theme } = useTheme();\r\n const c = theme.colors;\r\n const marker = statusMarker(job.status);\r\n const foreground = selected ? c.background : statusColor(job.status, c);\r\n return (\r\n <box flexDirection=\"column\" backgroundColor={selected ? c.accent : undefined}>\r\n <text fg={foreground}>{`${marker} ${job.kind} ${job.status} ${truncate(job.label, 50)}`}</text>\r\n <text fg={selected ? c.background : c.muted}>{` ${truncate(job.id, 24)} ${truncate(job.cwd, 44)}`}</text>\r\n </box>\r\n );\r\n}\r\n\r\nfunction JobDetail({ state }: { state: Exclude<JobDetailRemoteState, { status: \"idle\" }> }) {\r\n const { theme } = useTheme();\r\n const c = theme.colors;\r\n if (state.status === \"loading\") {\r\n return (\r\n <box flexDirection=\"column\">\r\n <text fg={c.warning}>Loading detail…</text>\r\n {state.previous ? <DetailResult result={state.previous} /> : null}\r\n </box>\r\n );\r\n }\r\n if (state.status === \"error\") {\r\n return (\r\n <box flexDirection=\"column\">\r\n <text fg={c.error}>{`Detail unavailable: ${state.error}`}</text>\r\n {state.previous ? <DetailResult result={state.previous} /> : null}\r\n </box>\r\n );\r\n }\r\n return <DetailResult result={state.result} />;\r\n}\r\n\r\nfunction DetailResult({ result }: { result: JobReadResult }) {\r\n const { theme } = useTheme();\r\n const c = theme.colors;\r\n const { snapshot } = result;\r\n const steps = snapshot.kind === \"workflow\" ? workflowSteps(result.details) : [];\r\n const reconciliation = snapshot.kind === \"workflow\" ? reconciliationSummary(result.details) : undefined;\r\n return (\r\n <box flexDirection=\"column\">\r\n <text>{\" \"}</text>\r\n <text attributes={TextAttributes.BOLD} fg={c.muted}>DETAIL</text>\r\n <text fg={statusColor(snapshot.status, c)}>{`${snapshot.kind} ${snapshot.status} ${snapshot.label}`}</text>\r\n <text fg={c.muted}>{`id: ${snapshot.id}`}</text>\r\n <text fg={c.muted}>{`cwd: ${snapshot.cwd}`}</text>\r\n <text fg={c.muted}>{`started: ${new Date(snapshot.startedAt).toISOString()}`}</text>\r\n {lastOutputLines(result.text).map((line, index) => <text key={`${index}-${line}`} fg={c.foreground}>{line}</text>)}\r\n {snapshot.kind === \"workflow\" && steps.length > 0 ? (\r\n <box flexDirection=\"column\">\r\n <text attributes={TextAttributes.BOLD} fg={c.muted}>STEPS</text>\r\n {steps.slice(0, VISIBLE_WORKFLOW_STEPS).map((step) => (\r\n <text key={step.taskId} fg={statusColor(step.status, c)}>\r\n {`${step.taskId} ${step.status}${step.summary ? ` ${step.summary}` : \"\"}`}\r\n </text>\r\n ))}\r\n {steps.length > VISIBLE_WORKFLOW_STEPS ? <text fg={c.muted}>{`+${steps.length - VISIBLE_WORKFLOW_STEPS} steps`}</text> : null}\r\n </box>\r\n ) : null}\r\n {reconciliation ? <text fg={c.warning}>{reconciliation}</text> : null}\r\n </box>\r\n );\r\n}\r\n\r\nfunction nextFilter<T extends string>(values: readonly T[], current: T | undefined): T | undefined {\r\n if (!current) return values[0];\r\n const currentIndex = values.indexOf(current);\r\n if (currentIndex < 0 || currentIndex === values.length - 1) return undefined;\r\n return values[currentIndex + 1];\r\n}\r\n\r\nfunction formatListSummary(total: number, visible: number, kind: JobKindFilter, status: JobStatusFilter): string {\r\n const filters = [kind ? `kind=${kind}` : undefined, status ? `status=${status}` : undefined]\r\n .filter((value): value is string => value !== undefined);\r\n return `${visible}/${total} Jobs${filters.length ? ` ${filters.join(\" \")}` : \"\"}`;\r\n}\r\n\r\nfunction statusMarker(status: JobSnapshot[\"status\"]): string {\r\n if (status === \"completed\") return \"✓\";\r\n if (status === \"killed\") return \"■\";\r\n if (status === \"failed\") return \"✗\";\r\n return \"●\";\r\n}\r\n\r\nfunction statusColor(\r\n status: string,\r\n colors: { success: string; warning: string; error: string; muted: string },\r\n): string {\r\n if (status === \"running\" || status === \"completed\") return colors.success;\r\n if (status === \"failed\") return colors.error;\r\n if (status === \"stopping\" || status === \"killed\") return colors.warning;\r\n return colors.muted;\r\n}\r\n\r\nfunction lastOutputLines(text: string): string[] {\r\n if (!text) return [];\r\n return text.split(/\\r?\\n/).slice(-VISIBLE_OUTPUT_LINES);\r\n}\r\n\r\nfunction workflowSteps(details: Record<string, unknown> | undefined): WorkflowStepRow[] {\r\n if (!isRecord(details) || !isRecord(details.plan) || !Array.isArray(details.plan.tasks)) return [];\r\n const results = isRecord(details.results) ? details.results : {};\r\n const runningTasks = isRecord(details.runningTasks) ? details.runningTasks : {};\r\n const blockedTasks = isRecord(details.blockedTasks) ? details.blockedTasks : {};\r\n const pendingTaskIds = stringSet(details.pendingTaskIds);\r\n const runningTaskIds = stringSet(details.runningTaskIds);\r\n const blockedTaskIds = stringSet(details.blockedTaskIds);\r\n\r\n return details.plan.tasks.flatMap((task): WorkflowStepRow[] => {\r\n if (!isRecord(task)) return [];\r\n const taskId = nonEmptyString(task.taskId) ?? nonEmptyString(task.id);\r\n if (!taskId) return [];\r\n const result = isRecord(results[taskId]) ? results[taskId] : undefined;\r\n const running = isRecord(runningTasks[taskId]) ? runningTasks[taskId] : undefined;\r\n const blocked = isRecord(blockedTasks[taskId]) ? blockedTasks[taskId] : undefined;\r\n const status = nonEmptyString(task.status)\r\n ?? nonEmptyString(result?.status)\r\n ?? (blockedTaskIds.has(taskId) || blocked ? \"blocked\" : undefined)\r\n ?? (runningTaskIds.has(taskId) || running ? \"running\" : undefined)\r\n ?? (pendingTaskIds.has(taskId) ? \"pending\" : \"pending\");\r\n const summary = nonEmptyString(task.summary)\r\n ?? nonEmptyString(result?.summary)\r\n ?? nonEmptyString(running?.summary)\r\n ?? nonEmptyString(blocked?.reason)\r\n ?? nonEmptyString(task.description);\r\n return [{ taskId, status, ...(summary ? { summary } : {}) }];\r\n });\r\n}\r\n\r\nfunction reconciliationSummary(details: Record<string, unknown> | undefined): string | undefined {\r\n if (!isRecord(details)) return undefined;\r\n const reconciliation = isRecord(details.reconciliation) ? details.reconciliation : undefined;\r\n const plan = isRecord(details.reconciliationPlan) ? details.reconciliationPlan : undefined;\r\n const summary = isRecord(details.reconciliationSummary) ? details.reconciliationSummary : undefined;\r\n return nonEmptyString(reconciliation?.summary)\r\n ?? nonEmptyString(plan?.summary)\r\n ?? nonEmptyString(summary?.summary);\r\n}\r\n\r\nfunction stringSet(value: unknown): Set<string> {\r\n return new Set(Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : []);\r\n}\r\n\r\nfunction isRecord(value: unknown): value is Record<string, unknown> {\r\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\r\n}\r\n\r\nfunction nonEmptyString(value: unknown): string | undefined {\r\n return typeof value === \"string\" && value.trim().length > 0 ? value : undefined;\r\n}\r\n\r\nfunction truncate(value: string, max: number): string {\r\n return value.length <= max ? value : `${value.slice(0, Math.max(0, max - 3))}...`;\r\n}\r\n",
40
+ "/** 权限模式选项(/permissions 选择器与 Tab 循环共用)。 */\nexport const PERMISSION_MODES = [\n {\n value: \"default\",\n label: \"default\",\n description: \"Ask for approval on sensitive operations\",\n },\n {\n value: \"full_auto\",\n label: \"full_auto\",\n description: \"Allow all operations without asking\",\n },\n {\n value: \"plan\",\n label: \"plan\",\n description: \"Plan mode — propose changes before executing\",\n },\n] as const;\n\n/** Tab 循环顺序(与 PERMISSION_MODES 的 value 对应)。 */\nexport const PERMISSION_MODE_ORDER: string[] = [\"default\", \"full_auto\", \"plan\"];\n",
41
+ "import { useTerminalDimensions } from \"@opentui/react\";\nimport { TextAttributes } from \"@opentui/core\";\nimport { useTheme } from \"../theme/ThemeContext\";\n\n// 实测(bun probe):\"openharness\" block 字体共 102 列 ×6 行;slick 约 77 列。\n// 对齐 opencode 的实心 block 观感,宽度不足时逐级降级。\nconst BLOCK_MIN_WIDTH = 104;\nconst SLICK_MIN_WIDTH = 78;\n\nexport function Logo() {\n const { theme } = useTheme();\n const { width } = useTerminalDimensions();\n\n if (width < SLICK_MIN_WIDTH) {\n // Narrow fallback: single-line bold text with span dual-color\n return (\n <text attributes={TextAttributes.BOLD}>\n <span fg={theme.colors.muted}>open</span>\n <span fg={theme.colors.foreground}>harness</span>\n </text>\n );\n }\n\n const font = width >= BLOCK_MIN_WIDTH ? \"block\" : \"slick\";\n // Two side-by-side ascii-font elements for dual-color effect\n return (\n <box flexDirection=\"row\">\n <ascii-font text=\"open\" font={font} color={theme.colors.muted} />\n <ascii-font text=\"harness\" font={font} color={theme.colors.foreground} />\n </box>\n );\n}\n",
42
+ "import type { UiNode } from \"../types/ui\";\nimport { useTerminalDimensions } from \"@opentui/react\";\nimport { useTheme } from \"../theme/ThemeContext\";\nimport { Logo } from \"../components/Logo\";\n\nexport function Home({ children }: { children?: UiNode }) {\n const { theme } = useTheme();\n const { width } = useTerminalDimensions();\n\n // Prompt container width: min(80, max(40, floor(width * 0.6)))\n const promptWidth = Math.min(80, Math.max(40, Math.floor(width * 0.6)));\n\n return (\n <box flexDirection=\"column\" width=\"100%\" height=\"100%\" backgroundColor={theme.colors.background}>\n {/* Top spacer */}\n <box flexGrow={1} />\n\n {/* Logo centered horizontally */}\n <box flexDirection=\"row\" justifyContent=\"center\">\n <Logo />\n </box>\n\n {/* 1-line gap */}\n <text>{\"\"}</text>\n\n {/* Children container centered */}\n <box flexDirection=\"row\" justifyContent=\"center\">\n <box width={promptWidth}>{children}</box>\n </box>\n\n {/* Hint row: 对齐输入框右缘(与 opencode 一致),不是屏幕右缘 */}\n <box flexDirection=\"row\" justifyContent=\"center\">\n <box width={promptWidth} flexDirection=\"row\" justifyContent=\"flex-end\">\n <text fg={theme.colors.muted}>\n <span fg={theme.colors.foreground}>tab</span>\n <span fg={theme.colors.muted}>{\" mode \"}</span>\n <span fg={theme.colors.foreground}>ctrl+p</span>\n <span fg={theme.colors.muted}>{\" commands\"}</span>\n </text>\n </box>\n </box>\n\n {/* Bottom spacer */}\n <box flexGrow={1} />\n </box>\n );\n}\n",
43
+ "import { SyntaxStyle, RGBA } from \"@opentui/core\";\nimport type { ThemeConfig } from \"./builtinThemes\";\n\n/** 由主题色生成 <markdown>/<code> 用的 SyntaxStyle。 */\nexport function createSyntaxStyle(theme: ThemeConfig): SyntaxStyle {\n const c = theme.colors;\n return SyntaxStyle.fromStyles({\n \"markup.heading.1\": { fg: RGBA.fromHex(c.primary), bold: true },\n \"markup.heading\": { fg: RGBA.fromHex(c.primary), bold: true },\n \"markup.list\": { fg: RGBA.fromHex(c.accent) },\n \"markup.raw\": { fg: RGBA.fromHex(c.warning) },\n \"markup.bold\": { fg: RGBA.fromHex(c.foreground), bold: true },\n \"markup.italic\": { fg: RGBA.fromHex(c.foreground), italic: true },\n \"markup.link.url\": { fg: RGBA.fromHex(c.info), underline: true },\n comment: { fg: RGBA.fromHex(c.muted), italic: true },\n string: { fg: RGBA.fromHex(c.success) },\n keyword: { fg: RGBA.fromHex(c.accent) },\n function: { fg: RGBA.fromHex(c.info) },\n number: { fg: RGBA.fromHex(c.warning) },\n type: { fg: RGBA.fromHex(c.primary) },\n default: { fg: RGBA.fromHex(c.foreground) },\n });\n}\n",
44
+ "import { createTwoFilesPatch } from \"diff\";\nimport type { SyntaxStyle } from \"@opentui/core\";\nimport { useTheme } from \"../../theme/ThemeContext\";\n\nconst MAX_PATCH_LINES = 20;\n\nfunction filetypeFromPath(filePath: string): string | undefined {\n const ext = filePath.split(\".\").pop()?.toLowerCase();\n const map: Record<string, string> = {\n ts: \"typescript\",\n tsx: \"typescript\",\n js: \"javascript\",\n jsx: \"javascript\",\n py: \"python\",\n rs: \"rust\",\n go: \"go\",\n json: \"json\",\n md: \"markdown\",\n css: \"css\",\n html: \"html\",\n sh: \"bash\",\n yaml: \"yaml\",\n yml: \"yaml\",\n };\n return ext ? map[ext] : undefined;\n}\n\nexport function truncatePatch(patch: string, maxLines = MAX_PATCH_LINES): string {\n const lines = patch.split(\"\\n\");\n if (lines.length <= maxLines) return patch;\n const kept = lines.slice(0, maxLines);\n const remaining = lines.length - maxLines;\n kept.push(`… +${remaining} more lines`);\n return kept.join(\"\\n\");\n}\n\nexport type ToolDiffProps = {\n filePath: string;\n oldText: string;\n newText: string;\n syntaxStyle?: SyntaxStyle;\n};\n\nexport function ToolDiff({ filePath, oldText, newText, syntaxStyle }: ToolDiffProps) {\n const { theme } = useTheme();\n const c = theme.colors;\n\n const rawPatch = createTwoFilesPatch(filePath, filePath, oldText, newText, \"\", \"\");\n const patch = truncatePatch(rawPatch);\n const filetype = filetypeFromPath(filePath);\n\n // Derive faint row backgrounds (~15% opacity) so text stays legible.\n // Signs (+/-) and line-number gutters carry the full theme color instead.\n const toFaintBg = (hex: string) => hex.replace(/^(#[\\da-fA-F]{6}).*$/, \"$126\");\n\n return (\n <diff\n diff={patch}\n view=\"unified\"\n showLineNumbers={true}\n filetype={filetype}\n syntaxStyle={syntaxStyle}\n addedBg={toFaintBg(c.success)}\n removedBg={toFaintBg(c.error)}\n addedSignColor={c.success}\n removedSignColor={c.error}\n addedLineNumberBg={toFaintBg(c.success)}\n removedLineNumberBg={toFaintBg(c.error)}\n />\n );\n}\n",
45
+ "import React from \"react\";\nimport { KeyEvent, TextAttributes } from \"@opentui/core\";\nimport type { SyntaxStyle } from \"@opentui/core\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport type { TranscriptItem } from \"../../types\";\nimport { ToolDiff } from \"../../components/messages/ToolDiff\";\n\n/**\n * Pick the first \"summary\" value from a tool_input record.\n * Priority: command > file_path > path > pattern > url; then first key.\n * Result is truncated to `maxLen` chars.\n */\nfunction summarizeToolInput(\n toolInput: Record<string, unknown> | undefined,\n maxLen = 60,\n): string {\n if (!toolInput) return \"\";\n const priority = [\"command\", \"file_path\", \"path\", \"pattern\", \"url\"];\n for (const key of priority) {\n const val = toolInput[key];\n if (val !== undefined && val !== null && typeof val === \"string\") {\n return val.slice(0, maxLen);\n }\n }\n // Fallback: first string-valued key\n for (const [, val] of Object.entries(toolInput)) {\n if (typeof val === \"string\") {\n return val.slice(0, maxLen);\n }\n }\n return \"\";\n}\n\nfunction summarizeText(text: string, maxLen = 72): string {\n const firstLine = text.split(\"\\n\")[0] ?? \"\";\n if (firstLine.length <= maxLen) return firstLine;\n return firstLine.slice(0, Math.max(0, maxLen - 1)) + \"...\";\n}\n\nfunction countLines(text: string): number {\n return Math.max(1, text.split(\"\\n\").length);\n}\n\nfunction CollapsibleTranscriptBlock({\n summary,\n children,\n tone,\n}: {\n summary: React.ReactNode;\n children: React.ReactNode;\n tone: string;\n}) {\n const { theme } = useTheme();\n const [expanded, setExpanded] = React.useState(false);\n\n const toggle = React.useCallback(() => {\n setExpanded((value) => !value);\n }, []);\n\n const handleKeyDown = React.useCallback((event: KeyEvent) => {\n if (event.name === \"enter\" || event.name === \"space\") {\n toggle();\n }\n }, [toggle]);\n\n return (\n <box flexDirection=\"column\">\n <box\n focusable\n onMouseUp={toggle}\n onKeyDown={handleKeyDown}\n backgroundColor={expanded ? theme.colors.backgroundPanel : undefined}\n >\n <text fg={tone}>\n <span fg={theme.colors.muted}>{expanded ? \"[-] \" : \"[+] \"}</span>\n {summary}\n </text>\n </box>\n {expanded ? (\n <box\n paddingLeft={2}\n paddingTop={1}\n paddingBottom={1}\n >\n {children}\n </box>\n ) : null}\n </box>\n );\n}\n\nfunction TranscriptPartView({\n item,\n syntax,\n}: {\n item: TranscriptItem;\n syntax: SyntaxStyle;\n}) {\n const { theme } = useTheme();\n const c = theme.colors;\n const icons = theme.icons;\n\n switch (item.role) {\n case \"user\":\n return (\n <text fg={c.accent}>{icons.user + item.text}</text>\n );\n\n case \"assistant\":\n return <markdown content={item.text} syntaxStyle={syntax} streaming={item.streaming === true} />;\n\n case \"tool\": {\n const toolName = item.tool_name ?? \"tool\";\n\n const isEditTool = toolName === \"Edit\" || toolName === \"str_replace_editor\";\n const isWriteTool = toolName === \"Write\" || toolName === \"create_file\";\n\n if (isEditTool && item.tool_input?.old_string !== undefined && item.tool_input?.new_string !== undefined) {\n const filePath = String(item.tool_input.path ?? item.tool_input.file_path ?? \"file\");\n const oldText = String(item.tool_input.old_string);\n const newText = String(item.tool_input.new_string);\n const addedLines = newText.split(\"\\n\").length - oldText.split(\"\\n\").length;\n const sign = addedLines >= 0 ? `+${addedLines}` : `${addedLines}`;\n return (\n <CollapsibleTranscriptBlock\n tone={c.muted}\n summary={(\n <>\n <span fg={c.muted}>{icons.tool}</span>\n <span fg={c.foreground} attributes={TextAttributes.BOLD}>{filePath}</span>\n <span fg={addedLines >= 0 ? c.success : c.error}>{\" \" + sign}</span>\n </>\n )}\n >\n <ToolDiff filePath={filePath} oldText={oldText} newText={newText} syntaxStyle={syntax} />\n </CollapsibleTranscriptBlock>\n );\n }\n\n if (isWriteTool && item.tool_input?.content !== undefined) {\n const filePath = String(item.tool_input.path ?? item.tool_input.file_path ?? \"file\");\n const content = String(item.tool_input.content);\n return (\n <CollapsibleTranscriptBlock\n tone={c.muted}\n summary={(\n <>\n <span fg={c.muted}>{icons.tool}</span>\n <span fg={c.foreground} attributes={TextAttributes.BOLD}>{filePath}</span>\n <span fg={c.success}>{` +${content.split(\"\\n\").length}`}</span>\n </>\n )}\n >\n <ToolDiff filePath={filePath} oldText=\"\" newText={content} syntaxStyle={syntax} />\n </CollapsibleTranscriptBlock>\n );\n }\n\n const summary = summarizeToolInput(item.tool_input);\n return (\n <text fg={c.muted}>\n <span fg={c.muted}>{icons.tool}</span>\n <span fg={c.muted} attributes={TextAttributes.BOLD}>\n {toolName}\n </span>\n {summary ? <span fg={c.muted}>{\" \" + summary}</span> : null}\n </text>\n );\n }\n\n case \"tool_result\": {\n if (item.is_error) {\n return (\n <CollapsibleTranscriptBlock\n tone={c.error}\n summary={(\n <>\n <span fg={c.error}>{icons.error}</span>\n <span fg={c.foreground} attributes={TextAttributes.BOLD}>tool error</span>\n <span fg={c.muted}>{` ${countLines(item.text)} lines`}</span>\n {item.text ? <span fg={c.error}>{`: ${summarizeText(item.text)}`}</span> : null}\n </>\n )}\n >\n <text fg={c.error} wrapMode=\"word\">{item.text}</text>\n </CollapsibleTranscriptBlock>\n );\n }\n return (\n <CollapsibleTranscriptBlock\n tone={c.muted}\n summary={(\n <>\n <span fg={c.muted}>{icons.tool}</span>\n <span fg={c.foreground} attributes={TextAttributes.BOLD}>output</span>\n <span fg={c.muted}>{` ${countLines(item.text)} lines`}</span>\n {item.text ? <span fg={c.muted}>{`: ${summarizeText(item.text)}`}</span> : null}\n </>\n )}\n >\n <text fg={c.muted} wrapMode=\"word\">{item.text}</text>\n </CollapsibleTranscriptBlock>\n );\n }\n\n case \"system\":\n case \"log\":\n return <text fg={c.muted}>{item.text}</text>;\n\n default:\n return <text>{item.text}</text>;\n }\n}\n\nexport const TranscriptPart = React.memo(TranscriptPartView, (previous, next) => {\n const previousItem = previous.item;\n const nextItem = next.item;\n return previous.syntax === next.syntax\n && previousItem.id === nextItem.id\n && previousItem.role === nextItem.role\n && previousItem.text === nextItem.text\n && previousItem.streaming === nextItem.streaming\n && previousItem.tool_name === nextItem.tool_name\n && previousItem.tool_input === nextItem.tool_input\n && previousItem.is_error === nextItem.is_error;\n});\n",
46
+ "import { useMemo } from \"react\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport { createSyntaxStyle } from \"../../theme/syntax\";\nimport type { TranscriptItem } from \"../../types\";\nimport { TranscriptPart } from \"./parts\";\n\nexport type SessionProps = {\n items: TranscriptItem[];\n assistantBuffer: string;\n};\n\nexport function Session({ items, assistantBuffer }: SessionProps) {\n const { theme } = useTheme();\n const syntax = useMemo(() => createSyntaxStyle(theme), [theme]);\n\n return (\n <scrollbox\n flexGrow={1}\n stickyScroll\n stickyStart=\"bottom\"\n verticalScrollbarOptions={{\n trackOptions: {\n foregroundColor: theme.colors.muted,\n backgroundColor: theme.colors.backgroundPanel,\n },\n }}\n >\n <box\n flexDirection=\"column\"\n paddingLeft={2}\n paddingRight={2}\n paddingTop={1}\n paddingBottom={1}\n rowGap={1}\n >\n {items.map((item, i) => (\n <TranscriptPart key={item.id ?? i} item={item} syntax={syntax} />\n ))}\n {assistantBuffer ? (\n <text wrapMode=\"word\">{assistantBuffer}</text>\n ) : null}\n </box>\n </scrollbox>\n );\n}\n",
47
+ "import { TextAttributes } from \"@opentui/core\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport type { TranscriptItem, McpServerSnapshot } from \"../../types\";\n\nexport type ModifiedFile = {\n path: string;\n added: number;\n removed: number;\n};\n\nexport function computeModifiedFiles(transcript: TranscriptItem[]): ModifiedFile[] {\n const map = new Map<string, ModifiedFile>();\n for (const item of transcript) {\n if (item.role !== \"tool\") continue;\n const name = item.tool_name ?? \"\";\n const isEdit = name === \"Edit\" || name === \"str_replace_editor\";\n const isWrite = name === \"Write\" || name === \"create_file\";\n if (!isEdit && !isWrite) continue;\n\n const path = String(item.tool_input?.path ?? item.tool_input?.file_path ?? \"\");\n if (!path) continue;\n\n if (isEdit) {\n const old = String(item.tool_input?.old_string ?? \"\");\n const next = String(item.tool_input?.new_string ?? \"\");\n map.set(path, { path, added: next.split(\"\\n\").length, removed: old.split(\"\\n\").length });\n } else {\n const content = String(item.tool_input?.content ?? \"\");\n map.set(path, { path, added: content.split(\"\\n\").length, removed: 0 });\n }\n }\n return Array.from(map.values());\n}\n\nexport type WorkflowPanelTask = {\n id: string;\n status: string;\n detail?: string;\n};\n\nexport type WorkflowPanelState = {\n runId?: string;\n status: string;\n summary?: string;\n mode?: string;\n totalTasks?: number;\n completedTasks?: number;\n failedTasks?: number;\n runningTasks?: number;\n pendingTasks?: number;\n blockedTasks?: number;\n needsReconciliation?: boolean;\n tasks: WorkflowPanelTask[];\n};\n\nexport function computeWorkflowPanel(transcript: TranscriptItem[]): WorkflowPanelState | undefined {\n for (let i = transcript.length - 1; i >= 0; i -= 1) {\n const text = transcript[i]?.text ?? \"\";\n const snapshotPayload = parseWorkflowPayload(text, \"workflow-run-snapshot\");\n const fromSnapshot = snapshotPayload ? workflowPanelFromSnapshotPayload(snapshotPayload) : undefined;\n if (fromSnapshot) return fromSnapshot;\n\n const notificationPayload = parseWorkflowPayload(text, \"workflow-notification\");\n const fromNotification = notificationPayload ? workflowPanelFromNotification(notificationPayload) : undefined;\n if (fromNotification) return fromNotification;\n }\n return undefined;\n}\n\nfunction parseWorkflowPayload(text: string, tag: string): Record<string, unknown> | undefined {\n const match = text.match(new RegExp(`<${tag}>\\\\s*<payload>([\\\\s\\\\S]*?)<\\\\/payload>\\\\s*<\\\\/${tag}>`));\n if (!match) return undefined;\n try {\n const payload = JSON.parse(unescapeXml(match[1]!));\n return isRecord(payload) ? payload : undefined;\n } catch {\n return undefined;\n }\n}\n\nfunction workflowPanelFromSnapshotPayload(payload: Record<string, unknown>): WorkflowPanelState | undefined {\n const snapshot = asRecord(payload.snapshot);\n if (!snapshot) return undefined;\n const plan = asRecord(snapshot.plan);\n const tasks = Array.isArray(plan?.tasks) ? plan.tasks.filter(isRecord) : [];\n const results = asRecord(snapshot.results) ?? {};\n const runningTasks = asRecord(snapshot.runningTasks) ?? {};\n const blockedTasks = asRecord(snapshot.blockedTasks) ?? {};\n const runningIds = new Set(stringArray(snapshot.runningTaskIds));\n const pendingIds = new Set(stringArray(snapshot.pendingTaskIds));\n const blockedIds = new Set(stringArray(snapshot.blockedTaskIds));\n\n return {\n runId: stringValue(snapshot.runId),\n status: stringValue(snapshot.status) ?? \"unknown\",\n summary: stringValue(snapshot.summary),\n mode: stringValue(plan?.mode),\n totalTasks: tasks.length,\n completedTasks: Object.values(results).filter((result) => stringValue(asRecord(result)?.status) === \"completed\").length,\n failedTasks: Object.values(results).filter((result) => {\n const status = stringValue(asRecord(result)?.status);\n return status === \"failed\" || status === \"skipped\";\n }).length,\n runningTasks: runningIds.size,\n pendingTasks: pendingIds.size,\n blockedTasks: blockedIds.size,\n tasks: tasks.map((task) => {\n const id = stringValue(task.id) ?? \"task\";\n const result = asRecord(results[id]);\n const running = asRecord(runningTasks[id]);\n const blocked = asRecord(blockedTasks[id]);\n const status = stringValue(result?.status)\n ?? (blockedIds.has(id) ? \"blocked\" : undefined)\n ?? (runningIds.has(id) ? \"running\" : undefined)\n ?? (pendingIds.has(id) ? \"pending\" : undefined)\n ?? \"pending\";\n return {\n id,\n status,\n detail: stringValue(result?.summary)\n ?? stringValue(running?.summary)\n ?? stringValue(blocked?.reason)\n ?? stringValue(task.description),\n };\n }),\n };\n}\n\nfunction workflowPanelFromNotification(payload: Record<string, unknown>): WorkflowPanelState | undefined {\n const tasks = Array.isArray(payload.tasks) ? payload.tasks.filter(isRecord) : [];\n const totalTasks = numberValue(payload.totalTasks);\n const completedTasks = numberValue(payload.completedTasks);\n const failedTasks = numberValue(payload.failedTasks);\n return {\n runId: stringValue(payload.runId),\n status: stringValue(payload.status) ?? \"unknown\",\n summary: stringValue(payload.summary),\n mode: stringValue(payload.mode),\n totalTasks,\n completedTasks,\n failedTasks,\n runningTasks: 0,\n pendingTasks: totalTasks !== undefined && completedTasks !== undefined && failedTasks !== undefined\n ? Math.max(0, totalTasks - completedTasks - failedTasks)\n : undefined,\n blockedTasks: 0,\n needsReconciliation: booleanValue(payload.needsReconciliation),\n tasks: tasks.map((task) => ({\n id: stringValue(task.taskId) ?? \"task\",\n status: stringValue(task.status) ?? \"unknown\",\n detail: stringValue(task.summary) ?? stringValue(task.error) ?? stringValue(task.skippedReason),\n })),\n };\n}\n\nfunction unescapeXml(value: string): string {\n return value\n .replace(/&lt;/g, \"<\")\n .replace(/&gt;/g, \">\")\n .replace(/&quot;/g, \"\\\"\")\n .replace(/&apos;/g, \"'\")\n .replace(/&amp;/g, \"&\");\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction asRecord(value: unknown): Record<string, unknown> | undefined {\n return isRecord(value) ? value : undefined;\n}\n\nfunction stringValue(value: unknown): string | undefined {\n return typeof value === \"string\" && value.length > 0 ? value : undefined;\n}\n\nfunction numberValue(value: unknown): number | undefined {\n return typeof value === \"number\" && Number.isFinite(value) ? value : undefined;\n}\n\nfunction booleanValue(value: unknown): boolean | undefined {\n return typeof value === \"boolean\" ? value : undefined;\n}\n\nfunction stringArray(value: unknown): string[] {\n return Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : [];\n}\n\nfunction truncate(value: string, max: number): string {\n if (value.length <= max) return value;\n if (max <= 3) return value.slice(0, max);\n return `${value.slice(0, max - 3)}...`;\n}\n\nfunction workflowTaskCounts(workflow: WorkflowPanelState): string {\n const parts = [\n workflow.completedTasks !== undefined ? `${workflow.completedTasks} done` : undefined,\n workflow.runningTasks ? `${workflow.runningTasks} running` : undefined,\n workflow.blockedTasks ? `${workflow.blockedTasks} blocked` : undefined,\n workflow.pendingTasks ? `${workflow.pendingTasks} pending` : undefined,\n workflow.failedTasks ? `${workflow.failedTasks} failed` : undefined,\n ].filter((part): part is string => part !== undefined);\n return parts.join(\" \");\n}\n\nfunction statusColor(status: string, colors: { success: string; warning: string; error: string; muted: string; foreground: string }): string {\n if (status === \"done\" || status === \"completed\") return colors.success;\n if (status === \"running\") return colors.success;\n if (status === \"idle\" || status === \"pending\" || status === \"blocked\" || status === \"skipped\") return colors.warning;\n if (status === \"error\" || status === \"failed\" || status === \"timed-out\") return colors.error;\n return colors.muted;\n}\n\nfunction SectionHeader({ title, muted }: { title: string; muted: string }) {\n return (\n <text fg={muted} attributes={TextAttributes.BOLD}>\n {\" \" + title.toUpperCase()}\n </text>\n );\n}\n\nexport type SidebarProps = {\n status: Record<string, unknown>;\n transcript: TranscriptItem[];\n mcpServers: McpServerSnapshot[];\n version?: string | null;\n};\n\nexport function Sidebar({\n status,\n transcript,\n mcpServers,\n}: SidebarProps) {\n const { theme } = useTheme();\n const c = theme.colors;\n\n const mode = String(status.permission_mode ?? \"\");\n const model = String(status.model ?? \"\");\n const effort = String(status.effort ?? \"\");\n const inputTokens = Number(status.input_tokens ?? 0);\n const outputTokens = Number(status.output_tokens ?? 0);\n\n const modifiedFiles = computeModifiedFiles(transcript);\n const workflow = computeWorkflowPanel(transcript);\n const shownFiles = modifiedFiles.slice(0, 15);\n const extraFiles = modifiedFiles.length - shownFiles.length;\n\n return (\n <box\n flexDirection=\"column\"\n width={40}\n flexShrink={0}\n borderColor={c.muted}\n border={[\"left\"]}\n customBorderChars={{\n topLeft: \"\", bottomLeft: \"\", vertical: \"│\",\n topRight: \"\", bottomRight: \"\", horizontal: \" \",\n bottomT: \"\", topT: \"\", cross: \"\", leftT: \"\", rightT: \"\",\n }}\n >\n <SectionHeader title=\"Session\" muted={c.muted} />\n {model ? <text fg={c.foreground}>{\" \" + model}</text> : null}\n {mode ? <text fg={c.muted}>{\" mode: \" + mode}</text> : null}\n {effort ? <text fg={c.warning}>{\" effort: \" + effort}</text> : null}\n {(inputTokens > 0 || outputTokens > 0) ? (\n <text fg={c.muted}>{` ${inputTokens}↓ ${outputTokens}↑`}</text>\n ) : null}\n\n {shownFiles.length > 0 ? (\n <box flexDirection=\"column\">\n <text>{\" \"}</text>\n <SectionHeader title=\"Modified\" muted={c.muted} />\n {shownFiles.map((f) => (\n <text key={f.path} fg={c.muted}>\n <span fg={c.success}>{`+${f.added}`}</span>\n <span fg={c.error}>{`-${f.removed}`}</span>\n {\" \" + f.path.split(\"/\").pop()}\n </text>\n ))}\n {extraFiles > 0 ? <text fg={c.muted}>{` +${extraFiles} more`}</text> : null}\n </box>\n ) : null}\n\n {workflow ? (\n <box flexDirection=\"column\">\n <text>{\" \"}</text>\n <SectionHeader title=\"Workflow\" muted={c.muted} />\n <text fg={c.muted}>\n <span fg={statusColor(workflow.status, c)}>{\" ●\"}</span>\n {\" \" + truncate(workflow.runId ?? \"latest\", 18)}\n {\" \" + truncate(workflow.status, 10)}\n </text>\n {workflow.mode ? <text fg={c.muted}>{\" mode: \" + workflow.mode}</text> : null}\n {workflowTaskCounts(workflow) ? <text fg={c.muted}>{\" \" + truncate(workflowTaskCounts(workflow), 34)}</text> : null}\n {workflow.needsReconciliation ? <text fg={c.warning}>{\" needs reconciliation\"}</text> : null}\n {workflow.tasks.slice(0, 5).map((task) => (\n <box key={task.id} flexDirection=\"column\">\n <text fg={c.muted}>\n <span fg={statusColor(task.status, c)}>{\" ●\"}</span>\n {\" \" + truncate(task.id, 18)}\n {\" \" + truncate(task.status, 10)}\n </text>\n {task.detail ? <text fg={c.foreground}>{\" \" + truncate(task.detail, 32)}</text> : null}\n </box>\n ))}\n {workflow.tasks.length > 5 ? <text fg={c.muted}>{` +${workflow.tasks.length - 5} more`}</text> : null}\n </box>\n ) : null}\n\n {mcpServers.length > 0 ? (\n <box flexDirection=\"column\">\n <text>{\" \"}</text>\n <SectionHeader title=\"MCP\" muted={c.muted} />\n {mcpServers.map((s) => {\n const dot = s.state === \"connected\" || s.state === \"ok\" ? \"●\" : \"○\";\n const dotColor = s.state === \"error\" ? c.error\n : (s.state === \"connected\" || s.state === \"ok\") ? c.success\n : c.muted;\n const tools = s.tool_count ? ` (${s.tool_count})` : \"\";\n return (\n <text key={s.name} fg={c.muted}>\n <span fg={dotColor}>{dot}</span>\n {\" \" + s.name.slice(0, 32) + tools}\n </text>\n );\n })}\n </box>\n ) : null}\n </box>\n );\n}\n",
48
+ "/**\n * 解析后端 state_snapshot 的 status 字段。\n *\n * status 是 Record<string, unknown>(协议宽松),此前 App / Footer / Sidebar /\n * AppView 各自 String(status.x ?? ...) 解析,默认值还不统一。集中到这里:\n * mode 统一缺省 \"default\",token 统一 Number(... ?? 0)。\n */\nexport interface ParsedStatus {\n /** 权限模式,缺省 \"default\" */\n mode: string;\n model: string;\n /** 推理强度(空串表示无) */\n effort: string;\n inputTokens: number;\n outputTokens: number;\n}\n\nexport function parseStatus(status: Record<string, unknown>): ParsedStatus {\n return {\n mode: String(status.permission_mode ?? \"default\"),\n model: String(status.model ?? \"\"),\n effort: String(status.effort ?? \"\"),\n inputTokens: Number(status.input_tokens ?? 0),\n outputTokens: Number(status.output_tokens ?? 0),\n };\n}\n",
49
+ "import { useEffect, useState } from \"react\";\nimport { readFileSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport { parseStatus } from \"../../services/status\";\nimport { CWD_DISPLAY_MAX_LEN, TOKEN_K_THRESHOLD } from \"../../ui/constants\";\nimport type { McpServerSnapshot } from \"../../types\";\n\n/** Read current git branch from .git/HEAD. Returns branch name or null. */\nfunction readGitBranch(): string | null {\n try {\n const headPath = join(process.cwd(), \".git\", \"HEAD\");\n const content = readFileSync(headPath, \"utf8\").trim();\n const match = content.match(/^ref: refs\\/heads\\/(.+)$/);\n return match ? (match[1] ?? null) : null;\n } catch {\n return null;\n }\n}\n\nconst BRANCH_POLL_MS = 10_000;\n\n/** 低频轮询 .git/HEAD:会话中切分支后 Footer 跟着刷新(同值 setState 会被 React 跳过) */\nfunction useGitBranch(): string | null {\n const [branch, setBranch] = useState<string | null>(() => readGitBranch());\n useEffect(() => {\n const id = setInterval(() => {\n setBranch(readGitBranch());\n }, BRANCH_POLL_MS);\n return () => clearInterval(id);\n }, []);\n return branch;\n}\n\nfunction formatTokens(n: number): string {\n if (n >= TOKEN_K_THRESHOLD) return `${(n / TOKEN_K_THRESHOLD).toFixed(1)}k`;\n return String(n);\n}\n\nfunction truncateCwd(cwd: string, maxLen = CWD_DISPLAY_MAX_LEN): string {\n // home 目录前缀缩写为 ~(对齐 opencode 的 \"~\\Desktop\" 风格)\n const home = process.env.USERPROFILE ?? process.env.HOME ?? \"\";\n if (home && cwd.startsWith(home)) {\n cwd = \"~\" + cwd.slice(home.length);\n }\n if (cwd.length <= maxLen) return cwd;\n return \"…\" + cwd.slice(cwd.length - (maxLen - 1));\n}\n\nexport type FooterProps = {\n status: Record<string, unknown>;\n mcpServers: McpServerSnapshot[];\n version?: string | null;\n};\n\nexport function Footer({ status, mcpServers, version }: FooterProps) {\n const { theme } = useTheme();\n const c = theme.colors;\n const gitBranch = useGitBranch();\n\n const { mode, inputTokens, outputTokens } = parseStatus(status);\n const isPlan = mode === \"plan\" || mode === \"Plan Mode\";\n const isCoordinator = status.session_mode === \"coordinator\";\n const hasTokens = inputTokens > 0 || outputTokens > 0;\n\n const mcpCount = mcpServers.length;\n const allConnected =\n mcpCount > 0 &&\n mcpServers.every(\n (s) => s.state === \"connected\" || s.state === \"ok\",\n );\n const hasError = mcpServers.some(\n (s) => s.state === \"error\" || s.state === \"failed\",\n );\n const mcpColor = hasError ? c.error : allConnected ? c.success : c.muted;\n\n const cwd = truncateCwd(process.cwd());\n const branchSuffix = gitBranch ? `:${gitBranch}` : \"\";\n const leftLabel = cwd + branchSuffix;\n\n return (\n <box flexDirection=\"row\" justifyContent=\"space-between\" paddingLeft={1} paddingRight={1}>\n {/* Left: cwd:branch ⊙N MCP /status(对齐 opencode 左侧信息区) */}\n <text fg={c.muted}>\n {leftLabel}\n {isPlan ? <span fg={c.warning}>{\" [PLAN]\"}</span> : null}\n {isCoordinator ? <span fg={c.accent}>{\" [COORDINATOR]\"}</span> : null}\n {mcpCount > 0 ? <span fg={mcpColor}>{` ⊙ ${mcpCount} MCP`}</span> : null}\n <span fg={c.muted}>{\" /status\"}</span>\n </text>\n\n {/* Right: tokens · version */}\n <text fg={c.muted}>\n {hasTokens ? (\n <span fg={c.muted}>{`${formatTokens(inputTokens)}↓ ${formatTokens(outputTokens)}↑`}</span>\n ) : null}\n {hasTokens && version ? <span fg={c.muted}>{\" · \"}</span> : null}\n {version ? <span fg={c.muted}>{version}</span> : null}\n </text>\n </box>\n );\n}\n",
50
+ "import { useTheme } from \"../../theme/ThemeContext\";\nimport { AC_VISIBLE_ITEMS } from \"../../ui/constants\";\n\nexport type AutocompleteItem = {\n id: string;\n label: string;\n detail?: string;\n};\n\nexport type AutocompleteProps = {\n items: AutocompleteItem[];\n selectedIndex: number;\n};\n\nexport function Autocomplete({ items, selectedIndex }: AutocompleteProps) {\n const { theme } = useTheme();\n const total = items.length;\n if (total === 0) return null;\n\n // 滑动视口:始终让选中项保持可见(居中优先)\n const windowStart = Math.max(\n 0,\n Math.min(\n selectedIndex - Math.floor(AC_VISIBLE_ITEMS / 2),\n total - AC_VISIBLE_ITEMS,\n ),\n );\n const visible = items.slice(windowStart, windowStart + AC_VISIBLE_ITEMS);\n\n const nameColWidth = Math.max(...visible.map((c) => c.label.length)) + 4;\n\n return (\n <box flexDirection=\"column\" backgroundColor={theme.colors.backgroundPanel}>\n {visible.map((item, localIdx) => {\n const isSelected = windowStart + localIdx === selectedIndex;\n return (\n <box\n key={item.id}\n flexDirection=\"row\"\n width=\"100%\"\n paddingLeft={1}\n paddingRight={1}\n backgroundColor={isSelected ? theme.colors.accent : undefined}\n >\n <text\n fg={isSelected ? theme.colors.background : theme.colors.foreground}\n flexShrink={0}\n >\n {item.label.padEnd(nameColWidth)}\n </text>\n {item.detail ? (\n <text fg={isSelected ? theme.colors.background : theme.colors.muted}>\n {item.detail}\n </text>\n ) : null}\n </box>\n );\n })}\n </box>\n );\n}\n",
51
+ "import { readFileSync, writeFileSync, mkdirSync } from \"node:fs\";\nimport { join } from \"node:path\";\nimport { homedir } from \"node:os\";\n\nconst HALF_LIFE_MS = 14 * 24 * 60 * 60 * 1000;\n\ntype FrecencyStore = {\n command: Record<string, number[]>;\n file: Record<string, number[]>;\n};\n\nlet store: FrecencyStore | null = null;\nlet dirty = false;\nlet debounceTimer: ReturnType<typeof setTimeout> | null = null;\n\nfunction configPath(): string {\n const dir = process.env.OPENHARNESS_CONFIG_DIR ?? join(homedir(), \".openharness-ts\");\n mkdirSync(dir, { recursive: true });\n return join(dir, \"frecency.json\");\n}\n\nfunction load(): FrecencyStore {\n if (store !== null) return store;\n try {\n const raw = readFileSync(configPath(), \"utf-8\");\n store = JSON.parse(raw) as FrecencyStore;\n if (!store.command) store.command = {};\n if (!store.file) store.file = {};\n } catch {\n store = { command: {}, file: {} };\n }\n return store;\n}\n\nfunction scheduleSave(): void {\n if (debounceTimer !== null) clearTimeout(debounceTimer);\n debounceTimer = setTimeout(() => {\n if (store && dirty) {\n try {\n writeFileSync(configPath(), JSON.stringify(store));\n } catch { /* silent */ }\n dirty = false;\n }\n }, 500);\n}\n\nexport function computeScore(timestamps: number[]): number {\n const now = Date.now();\n return timestamps.reduce((sum, ts) => {\n return sum + Math.pow(2, -(now - ts) / HALF_LIFE_MS);\n }, 0);\n}\n\nexport function record(kind: \"command\" | \"file\", key: string): void {\n const s = load();\n if (!s[kind][key]) s[kind][key] = [];\n s[kind][key]!.push(Date.now());\n dirty = true;\n scheduleSave();\n}\n\nexport function rank(kind: \"command\" | \"file\"): Map<string, number> {\n const s = load();\n const map = new Map<string, number>();\n for (const [key, timestamps] of Object.entries(s[kind])) {\n map.set(key, computeScore(timestamps));\n }\n return map;\n}\n",
52
+ "import { fuzzyFilterScored } from \"./fuzzy\";\nimport { rank as frecencyRank } from \"../services/frecency\";\nimport type { Command } from \"../keymap/commands\";\n\n/**\n * 斜杠命令排序:先按 fuzzy 匹配分,分数相同再按 frecency(最近+高频)排序。\n *\n * Prompt 的补全浮窗(展示项)与回车执行(原始 Command)共用这一份排序结果,\n * 避免把 fuzzyFilterScored + frecencyRank + sort 重复计算两遍。\n */\nexport function rankSlashCommands(commands: Command[], query: string): Command[] {\n const scores = frecencyRank(\"command\");\n return fuzzyFilterScored(commands, query, (c) => c.id)\n .sort((a, b) => {\n if (b.score !== a.score) return b.score - a.score;\n return (scores.get(b.item.id) ?? 0) - (scores.get(a.item.id) ?? 0);\n })\n .map(({ item }) => item);\n}\n",
53
+ "import { join, relative } from \"node:path\";\nimport { readdirSync, statSync } from \"node:fs\";\nimport type { AutocompleteItem } from \"./Autocomplete\";\n\nimport { AC_VISIBLE_ITEMS } from \"../../ui/constants\";\n\nconst MAX_FILES = 5000;\n\nconst SKIP_DIRS = new Set([\"node_modules\", \".git\", \"dist\", \".next\", \".turbo\", \"build\", \"coverage\"]);\n\nconst cache = new Map<string, string[]>();\n\nexport async function listProjectFiles(cwd: string): Promise<string[]> {\n if (cache.has(cwd)) return cache.get(cwd)!;\n\n let files: string[] = [];\n try {\n const proc = Bun.spawn(\n [\"git\", \"ls-files\", \"--cached\", \"--others\", \"--exclude-standard\"],\n { cwd, stdout: \"pipe\", stderr: \"pipe\", windowsHide: true },\n );\n const text = await new Response(proc.stdout).text();\n await proc.exited;\n files = text.split(\"\\n\").filter(Boolean).slice(0, MAX_FILES);\n } catch {\n files = fsWalk(cwd, cwd, 0).slice(0, MAX_FILES);\n }\n\n cache.set(cwd, files);\n return files;\n}\n\nfunction fsWalk(root: string, dir: string, depth: number): string[] {\n if (depth > 6) return [];\n const entries: string[] = [];\n try {\n for (const entry of readdirSync(dir)) {\n const full = join(dir, entry);\n try {\n const stat = statSync(full);\n if (stat.isDirectory()) {\n if (!SKIP_DIRS.has(entry)) {\n entries.push(...fsWalk(root, full, depth + 1));\n }\n } else {\n entries.push(relative(root, full).replace(/\\\\/g, \"/\"));\n }\n } catch { /* skip unreadable entries */ }\n }\n } catch { /* skip unreadable directories */ }\n return entries;\n}\n\nexport function detectAtToken(\n text: string,\n): { token: string; atStart: number; atEnd: number } | null {\n // Find the last @ that is at start or preceded by whitespace, followed by non-space chars\n // An @ followed immediately by a space (and not at end) is not a valid token\n const re = /(^|\\s)@(\\S*)/g;\n let last: RegExpExecArray | null = null;\n let m: RegExpExecArray | null;\n while ((m = re.exec(text)) !== null) {\n last = m;\n }\n if (!last) return null;\n const token = last[2]!;\n const prefix = last[1]!;\n const matchStart = last.index!;\n const atStart = matchStart + prefix.length;\n const atEnd = atStart + 1 + token.length; // 1 for '@'\n // If token is empty and there is non-whitespace text after the @, return null\n // e.g. \"hello @ world\" — the @ is followed by space so token=\"\" but it's not at end\n if (token === \"\" && atEnd < text.length) return null;\n return { token, atStart, atEnd };\n}\n\nexport function buildAtItems(\n files: string[],\n token: string,\n frecencyScores?: Map<string, number>,\n): AutocompleteItem[] {\n const lower = token.toLowerCase();\n const filtered = token === \"\"\n ? [...files].sort((a, b) => (frecencyScores?.get(b) ?? 0) - (frecencyScores?.get(a) ?? 0))\n : files.filter((f) => f.toLowerCase().includes(lower));\n return filtered.slice(0, AC_VISIBLE_ITEMS).map((f) => ({ id: f, label: f }));\n}\n",
54
+ "import { useState, useEffect, useRef, useCallback } from \"react\";\nimport { useKeyboard } from \"@opentui/react\";\nimport { TextAttributes, decodePasteBytes, stripAnsiSequences } from \"@opentui/core\";\nimport type { PasteEvent, TextareaRenderable } from \"@opentui/core\";\nimport { useTheme } from \"../../theme/ThemeContext\";\nimport { Autocomplete } from \"./Autocomplete\";\nimport type { AutocompleteItem } from \"./Autocomplete\";\nimport type { Command } from \"../../keymap/commands\";\nimport { rankSlashCommands } from \"../../ui/commandRanking\";\nimport { listProjectFiles, detectAtToken, buildAtItems } from \"./fileCompletion\";\nimport { record as frecencyRecord, rank as frecencyRank } from \"../../services/frecency\";\nimport { useListNavigation } from \"../../hooks/useListNavigation\";\nimport { SPINNER_INTERVAL_MS, TEXTAREA_MAX_LINES, TEXTAREA_MIN_LINES } from \"../../ui/constants\";\n\nexport type PromptProps = {\n busy: boolean;\n placeholder?: string;\n mode: string;\n model: string;\n effort?: string;\n history: string[];\n slashCommands: Command[];\n onSubmit: (line: string) => void;\n onCycleMode: () => void;\n /** 草稿提升:弹层打开会卸载 Prompt,草稿由父级持有,重挂载时恢复 */\n draft?: string;\n onDraftChange?: (text: string) => void;\n /** 双击 Esc 取消:第一次 Esc 后显示提示 */\n escHint?: boolean;\n};\n\nconst DEFAULT_PLACEHOLDER = 'Ask anything... \"Fix broken tests\"';\n\nconst MODE_LABELS: Record<string, string> = {\n default: \"Default\",\n full_auto: \"Auto\",\n plan: \"Plan\",\n};\n\nfunction getModeLabel(mode: string): string {\n return MODE_LABELS[mode] ?? mode;\n}\n\nexport function Prompt({\n busy,\n placeholder = DEFAULT_PLACEHOLDER,\n mode,\n model,\n effort,\n history,\n slashCommands,\n onSubmit,\n onCycleMode,\n draft,\n onDraftChange,\n escHint,\n}: PromptProps) {\n const { theme } = useTheme();\n\n // Content state (synced from textarea via onContentChange)\n const [content, setContent] = useState(\"\");\n\n // Autocomplete state\n const [acOpen, setAcOpen] = useState(false);\n\n // File @ completion state\n const [fileAcOpen, setFileAcOpen] = useState(false);\n const [fileAcItems, setFileAcItems] = useState<AutocompleteItem[]>([]);\n const [filesLoaded, setFilesLoaded] = useState(false);\n const filesRef = useRef<string[]>([]);\n const fileAtRef = useRef<{ atStart: number; atEnd: number } | null>(null);\n\n // History navigation state\n const [histIdx, setHistIdx] = useState<number | null>(null);\n\n // Spinner state for busy\n const [spinnerFrame, setSpinnerFrame] = useState(0);\n\n // Dynamic textarea height (1–6 lines)\n const [textareaHeight, setTextareaHeight] = useState(TEXTAREA_MIN_LINES);\n\n // Textarea ref for imperative operations\n const textareaRef = useRef<TextareaRenderable | null>(null);\n\n // Restore lifted draft once on mount (Prompt is unmounted while dialogs are open)\n useEffect(() => {\n if (draft && textareaRef.current) {\n textareaRef.current.insertText(draft);\n setContent(draft);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, []);\n\n // 排序一次,补全浮窗(展示项)和回车执行(原始 Command)共用,避免重复计算。\n const acRawCommands: Command[] = acOpen ? rankSlashCommands(slashCommands, content) : [];\n const acSuggestions: AutocompleteItem[] = acRawCommands.map((cmd) => ({\n id: cmd.id,\n label: cmd.id,\n detail: cmd.title !== cmd.id ? cmd.title : undefined,\n }));\n\n // 列表导航钩子(count 跟随派生值动态更新)\n const acNav = useListNavigation(acRawCommands.length);\n const fileAcNav = useListNavigation(fileAcItems.length);\n\n // Determine if autocomplete should be open\n const shouldShowAc = content.startsWith(\"/\") && content.length > 0;\n\n // Sync acOpen with shouldShowAc\n useEffect(() => {\n if (!shouldShowAc) {\n setAcOpen(false);\n acNav.setIndex(0);\n } else {\n setAcOpen(true);\n }\n }, [shouldShowAc]);\n\n // Reset ac selection when content changes (new filter)\n useEffect(() => {\n acNav.setIndex(0);\n }, [content]);\n\n // Spinner interval when busy; reset frame when no longer busy (Bug 4)\n useEffect(() => {\n if (!busy) {\n setSpinnerFrame(0);\n return;\n }\n const frames = theme.icons.spinner;\n const id = setInterval(() => {\n setSpinnerFrame((f) => (f + 1) % frames.length);\n }, SPINNER_INTERVAL_MS);\n return () => clearInterval(id);\n }, [busy, theme.icons.spinner]);\n\n // 把 @token 替换为选中的文件路径;无法应用时返回 null\n const fileApplySelected = useCallback((text: string): string | null => {\n const at = fileAtRef.current;\n const selected = fileAcItems[fileAcNav.index];\n if (!at || !selected) return null;\n return text.slice(0, at.atStart) + selected.id + text.slice(at.atEnd);\n }, [fileAcItems, fileAcNav.index]);\n\n // 关闭文件补全浮窗并重置状态\n const fileClose = useCallback(() => {\n setFileAcOpen(false);\n fileAcNav.setIndex(0);\n fileAtRef.current = null;\n }, [fileAcNav.setIndex]);\n\n const syncTextareaContent = useCallback((): string => {\n const text = textareaRef.current?.plainText ?? \"\";\n setContent(text);\n onDraftChange?.(text);\n const lineCount = textareaRef.current?.lineCount ?? 1;\n setTextareaHeight(Math.min(TEXTAREA_MAX_LINES, Math.max(TEXTAREA_MIN_LINES, lineCount)));\n return text;\n }, [onDraftChange]);\n\n const updateFileCompletion = useCallback((text: string) => {\n const atResult = detectAtToken(text);\n if (atResult !== null) {\n if (!filesLoaded) {\n listProjectFiles(process.cwd()).then((files) => {\n filesRef.current = files;\n setFilesLoaded(true);\n });\n }\n fileAtRef.current = { atStart: atResult.atStart, atEnd: atResult.atEnd };\n const fileScores = frecencyRank(\"file\");\n setFileAcItems(buildAtItems(filesRef.current, atResult.token, fileScores));\n fileAcNav.setIndex(0);\n setFileAcOpen(true);\n setAcOpen(false);\n } else {\n setFileAcOpen(false);\n fileAtRef.current = null;\n }\n }, [filesLoaded, fileAcNav.setIndex]);\n\n // Clear textarea imperatively\n const clearTextarea = useCallback(() => {\n if (textareaRef.current) {\n textareaRef.current.clear();\n }\n setContent(\"\");\n setHistIdx(null);\n setTextareaHeight(TEXTAREA_MIN_LINES);\n onDraftChange?.(\"\");\n }, [onDraftChange]);\n\n // Handle textarea onSubmit (triggered by Return key)\n const handleTextareaSubmit = useCallback(() => {\n const text = textareaRef.current?.plainText ?? content;\n const trimmed = text.trim();\n const isSlashCommand = trimmed.startsWith(\"/\");\n if (text !== content) {\n setContent(text);\n onDraftChange?.(text);\n }\n\n // If file @ completion is open, insert the selected file path\n if (fileAcOpen) {\n if (textareaRef.current) {\n const next = fileApplySelected(text);\n if (next !== null) {\n textareaRef.current.setText(next);\n setContent(next);\n }\n }\n fileClose();\n return;\n }\n\n // Complete prefixes like \"/th\"; submit exact slash lines and slash lines with args.\n if (acOpen) {\n const exactCommand = acRawCommands.some((cmd) => cmd.id === trimmed);\n const slashWithArgs = /^\\/\\S+\\s+[\\s\\S]+$/.test(trimmed);\n if (exactCommand || slashWithArgs || acRawCommands.length === 0) {\n if (!busy || isSlashCommand) {\n onSubmit(trimmed);\n clearTextarea();\n }\n setAcOpen(false);\n return;\n }\n const suggestion = acRawCommands[acNav.index];\n if (suggestion) {\n suggestion.run();\n frecencyRecord(\"command\", suggestion.id);\n clearTextarea();\n setAcOpen(false);\n }\n return;\n }\n\n if (trimmed === \"\") return;\n if (busy && !isSlashCommand) return;\n\n onSubmit(trimmed);\n clearTextarea();\n }, [busy, fileAcOpen, fileApplySelected, fileClose, acOpen, acRawCommands, acNav.index, content, onDraftChange, onSubmit, clearTextarea]);\n\n const handleTextareaPaste = useCallback((event: PasteEvent) => {\n const text = stripAnsiSequences(decodePasteBytes(event.bytes))\n .replace(/\\r\\n/g, \"\\n\")\n .replace(/\\r/g, \"\\n\");\n\n event.preventDefault();\n if (!text || !textareaRef.current) return;\n\n textareaRef.current.insertText(text);\n setTimeout(() => {\n const current = syncTextareaContent();\n updateFileCompletion(current);\n }, 0);\n }, [syncTextareaContent, updateFileCompletion]);\n\n // Global keyboard handler\n useKeyboard((key) => {\n if (key.name === \"tab\") {\n if (fileAcOpen) {\n if (textareaRef.current) {\n const next = fileApplySelected(textareaRef.current.plainText);\n if (next !== null) {\n textareaRef.current.setText(next);\n setContent(next);\n }\n }\n fileClose();\n return;\n }\n if (acOpen) {\n // Complete with highlighted suggestion\n const suggestion = acSuggestions[acNav.index];\n if (suggestion && textareaRef.current) {\n const completed = suggestion.id + \" \";\n textareaRef.current.clear();\n textareaRef.current.insertText(completed);\n // Bug 2: sync content state immediately so derived acSuggestions/acOpen\n // use the updated value without waiting for the async onContentChange event.\n setContent(completed);\n }\n } else {\n onCycleMode();\n }\n return;\n }\n\n if (key.name === \"up\") {\n if (fileAcOpen) { fileAcNav.moveUp(); return; }\n if (acOpen) {\n acNav.moveUp();\n } else {\n // Bug 1: read from ref to avoid stale closure — content state may lag\n const currentText = textareaRef.current?.plainText ?? \"\";\n if (currentText === \"\") {\n // History navigation: up → older\n const newIdx =\n histIdx === null\n ? history.length - 1\n : Math.max(0, histIdx - 1);\n if (history.length > 0 && newIdx >= 0) {\n setHistIdx(newIdx);\n const entry = history[newIdx];\n if (entry !== undefined && textareaRef.current) {\n textareaRef.current.clear();\n textareaRef.current.insertText(entry);\n }\n }\n }\n }\n return;\n }\n\n if (key.name === \"down\") {\n if (fileAcOpen) { fileAcNav.moveDown(); return; }\n if (acOpen) {\n acNav.moveDown();\n } else {\n // Bug 1: read from ref to avoid stale closure\n const currentText = textareaRef.current?.plainText ?? \"\";\n if (currentText === \"\") {\n // History navigation: down → newer\n if (histIdx !== null) {\n const newIdx = histIdx + 1;\n if (newIdx >= history.length) {\n // Past the end: clear input\n setHistIdx(null);\n clearTextarea();\n } else {\n setHistIdx(newIdx);\n const entry = history[newIdx];\n if (entry !== undefined && textareaRef.current) {\n textareaRef.current.clear();\n textareaRef.current.insertText(entry);\n }\n }\n }\n }\n }\n return;\n }\n\n if (key.name === \"escape\") {\n if (fileAcOpen) { fileClose(); return; }\n if (acOpen) {\n setAcOpen(false);\n acNav.setIndex(0);\n } else {\n clearTextarea();\n }\n return;\n }\n });\n\n const modeLabel = getModeLabel(mode);\n\n const keyBindings = [\n // shift+return → newline\n { name: \"return\", shift: true, action: \"newline\" as const },\n // return → submit\n { name: \"return\", action: \"submit\" as const },\n ];\n\n // flexShrink=0:防止 Session 路由下被 scrollbox 挤压裁掉 meta 行。\n // 左竖条对齐 opencode:border-left + 细线字符 ┃(半格宽字形),\n // 而非 width=1 实心背景块(整格填色观感过粗)。\n return (\n <box\n flexDirection=\"row\"\n flexShrink={0}\n border={[\"left\"]}\n borderColor={theme.colors.accent}\n customBorderChars={{\n topLeft: \"\",\n bottomLeft: \"\",\n vertical: \"┃\",\n topRight: \"\",\n bottomRight: \"\",\n horizontal: \" \",\n bottomT: \"\",\n topT: \"\",\n cross: \"\",\n leftT: \"\",\n rightT: \"\",\n }}\n >\n {/* Content column(padding 对齐 opencode:左右 2、上下 1) */}\n <box\n flexDirection=\"column\"\n flexGrow={1}\n backgroundColor={theme.colors.backgroundPrompt}\n paddingLeft={2}\n paddingRight={2}\n paddingTop={1}\n paddingBottom={1}\n >\n {/* File @ completion floats above textarea */}\n {fileAcOpen && fileAcItems.length > 0 && (\n <Autocomplete items={fileAcItems} selectedIndex={fileAcNav.index} />\n )}\n\n {/* Slash command autocomplete floats above textarea */}\n {acOpen && acSuggestions.length > 0 && (\n <Autocomplete\n items={acSuggestions}\n selectedIndex={acNav.index}\n />\n )}\n\n {/* Multiline textarea */}\n <textarea\n ref={textareaRef}\n focused={true}\n placeholder={placeholder}\n placeholderColor={theme.colors.muted}\n keyBindings={keyBindings}\n onSubmit={handleTextareaSubmit}\n onPaste={handleTextareaPaste}\n onContentChange={() => {\n // Read plainText from ref on next tick (event has no content)\n const text = syncTextareaContent();\n // Bug 3: update height based on line count (1–6 rows)\n // Detect @ token for file completion\n const atResult = detectAtToken(text);\n if (atResult !== null) {\n if (!filesLoaded) {\n listProjectFiles(process.cwd()).then((files) => {\n filesRef.current = files;\n setFilesLoaded(true);\n });\n }\n fileAtRef.current = { atStart: atResult.atStart, atEnd: atResult.atEnd };\n const fileScores = frecencyRank(\"file\");\n setFileAcItems(buildAtItems(filesRef.current, atResult.token, fileScores));\n fileAcNav.setIndex(0);\n setFileAcOpen(true);\n setAcOpen(false);\n } else {\n setFileAcOpen(false);\n fileAtRef.current = null;\n }\n }}\n height={textareaHeight}\n flexShrink={0}\n />\n\n {/* Meta info row(paddingTop=1 即输入区与元信息行之间的空隙,对齐 opencode) */}\n {busy ? (\n <box flexDirection=\"row\" paddingTop={1}>\n <text fg={theme.colors.accent}>\n {theme.icons.spinner[spinnerFrame] ?? \"⠋\"}\n </text>\n <text fg={theme.colors.muted}>{\" working...\"}</text>\n {escHint && (\n <text fg={theme.colors.warning}>{\" (再按 Esc 取消)\"}</text>\n )}\n </box>\n ) : (\n <box flexDirection=\"row\" paddingTop={1}>\n <text\n fg={theme.colors.accent}\n attributes={TextAttributes.BOLD}\n >\n {modeLabel}\n </text>\n <text fg={theme.colors.foreground}>{` · ${model}`}</text>\n {effort != null && effort !== \"\" && (\n <text fg={theme.colors.warning}>{` · ${effort}`}</text>\n )}\n </box>\n )}\n </box>\n </box>\n );\n}\n",
55
+ "import { useTheme } from \"../../theme/ThemeContext\";\nimport { Home } from \"../Home\";\nimport { Session } from \"./Session\";\nimport { Sidebar } from \"./Sidebar\";\nimport { Footer } from \"./Footer\";\nimport { Prompt } from \"../../components/prompt/Prompt\";\nimport type { McpServerSnapshot, TranscriptItem } from \"../../types\";\nimport type { Command } from \"../../keymap/commands\";\nimport { parseStatus } from \"../../services/status\";\n\nexport type AppViewProps = {\n transcript: TranscriptItem[];\n assistantBuffer: string;\n ready: boolean;\n busy: boolean;\n status: Record<string, unknown>;\n mcpServers: McpServerSnapshot[];\n version?: string | null;\n history: string[];\n slashCommands: Command[];\n onSubmit: (line: string) => void;\n onCycleMode: () => void;\n dialogOpen: boolean;\n /** 草稿提升:dialogOpen 卸载 Prompt 时由 AppInner 持有,重挂载恢复 */\n draft?: string;\n onDraftChange?: (text: string) => void;\n sidebarOpen: boolean;\n onToggleSidebar: () => void;\n escHint?: boolean;\n};\n\n/**\n * 纯渲染层(无副作用、易测)。根据会话状态在三种布局间切换:\n * 未就绪占位 / Home 路由(无对话时)/ Session 路由(左栏消息流 + 右栏 Sidebar)。\n */\nexport function AppView({\n transcript,\n assistantBuffer,\n ready,\n busy,\n status,\n mcpServers,\n version,\n history,\n slashCommands,\n onSubmit,\n onCycleMode,\n dialogOpen,\n draft,\n onDraftChange,\n sidebarOpen,\n onToggleSidebar: _onToggleSidebar,\n escHint,\n}: AppViewProps) {\n const { theme } = useTheme();\n\n if (!ready) {\n return (\n <box flexDirection=\"column\" width=\"100%\" height=\"100%\" backgroundColor={theme.colors.background}>\n <text fg={theme.colors.warning}>Connecting to backend...</text>\n </box>\n );\n }\n\n // Route: Home if no user/assistant items yet and not busy and no streaming\n const hasConversation = transcript.some(\n (item) => item.role === \"user\" || item.role === \"assistant\",\n );\n const isHome = !hasConversation && !busy && !assistantBuffer;\n\n const { mode, model, effort } = parseStatus(status);\n\n const prompt = dialogOpen ? null : (\n <Prompt\n busy={busy}\n mode={mode}\n model={model}\n effort={effort}\n history={history}\n slashCommands={slashCommands}\n onSubmit={onSubmit}\n onCycleMode={onCycleMode}\n draft={draft}\n onDraftChange={onDraftChange}\n escHint={escHint}\n />\n );\n\n if (isHome) {\n return (\n <box flexDirection=\"column\" width=\"100%\" height=\"100%\" backgroundColor={theme.colors.background}>\n <Home>{prompt}</Home>\n <Footer status={status} mcpServers={mcpServers} version={version} />\n </box>\n );\n }\n\n return (\n <box flexDirection=\"row\" width=\"100%\" height=\"100%\" backgroundColor={theme.colors.background}>\n {/* Left column: messages + panels + prompt + footer */}\n <box flexDirection=\"column\" flexGrow={1} backgroundColor={theme.colors.background}>\n <Session items={transcript} assistantBuffer={assistantBuffer} />\n {prompt}\n <Footer status={status} mcpServers={mcpServers} version={version} />\n </box>\n {/* Right column: Sidebar */}\n {sidebarOpen ? (\n <Sidebar\n status={status}\n transcript={transcript}\n mcpServers={mcpServers}\n version={version}\n />\n ) : null}\n </box>\n );\n}\n",
56
+ "import { useEffect, useMemo, useState } from \"react\";\nimport { TextAttributes } from \"@opentui/core\";\nimport { useKeyboard } from \"@opentui/react\";\nimport type { JobReadResult, JobSnapshot } from \"@openharness/client\";\nimport { useListNavigation } from \"../hooks/useListNavigation\";\nimport type { JobDetailRemoteState, JobRemoteState } from \"../jobs/job-remote-state\";\nimport { useTheme } from \"../theme/ThemeContext\";\n\nexport interface JobsPanelProps {\n state: JobRemoteState;\n detailState: JobDetailRemoteState;\n onRefresh(): void;\n onSelect(jobId: string): void;\n onCancel(jobId: string): void;\n}\n\ntype JobKindFilter = JobSnapshot[\"kind\"] | undefined;\ntype JobStatusFilter = JobSnapshot[\"status\"] | undefined;\ntype WorkflowStepRow = { taskId: string; status: string; summary?: string };\n\nconst VISIBLE_JOBS = 7;\nconst VISIBLE_OUTPUT_LINES = 6;\nconst VISIBLE_WORKFLOW_STEPS = 5;\nconst JOB_KINDS: JobSnapshot[\"kind\"][] = [\"terminal\", \"shell\", \"agent\", \"dream\", \"workflow\"];\nconst JOB_STATUSES: JobSnapshot[\"status\"][] = [\"running\", \"stopping\", \"completed\", \"killed\", \"failed\"];\n\nexport function JobsPanel({ state, detailState, onRefresh, onSelect, onCancel }: JobsPanelProps) {\n const { theme } = useTheme();\n const c = theme.colors;\n const [kindFilter, setKindFilter] = useState<JobKindFilter>();\n const [statusFilter, setStatusFilter] = useState<JobStatusFilter>();\n const visibleJobs = useMemo(\n () => state.jobs.filter((job) => (!kindFilter || job.kind === kindFilter) && (!statusFilter || job.status === statusFilter)),\n [kindFilter, state.jobs, statusFilter],\n );\n const { index, setIndex, moveUp, moveDown } = useListNavigation(visibleJobs.length);\n const cursorIndex = Math.min(index, Math.max(0, visibleJobs.length - 1));\n const selectedJob = visibleJobs[cursorIndex];\n\n useEffect(() => {\n if (index !== cursorIndex) setIndex(cursorIndex);\n }, [cursorIndex, index, setIndex]);\n\n useKeyboard((key) => {\n if (key.name === \"up\") { moveUp(); return; }\n if (key.name === \"down\") { moveDown(); return; }\n if (key.name === \"return\" && selectedJob) { onSelect(selectedJob.id); return; }\n if (key.name === \"r\") { onRefresh(); return; }\n if (key.name === \"c\" && selectedJob?.capabilities.cancel) { onCancel(selectedJob.id); return; }\n if (key.name === \"k\") {\n setKindFilter((current) => nextFilter(JOB_KINDS, current));\n setIndex(0);\n return;\n }\n if (key.name === \"f\") {\n setStatusFilter((current) => nextFilter(JOB_STATUSES, current));\n setIndex(0);\n }\n });\n\n const windowStart = Math.max(0, Math.min(cursorIndex - 3, Math.max(0, visibleJobs.length - VISIBLE_JOBS)));\n const jobWindow = visibleJobs.slice(windowStart, windowStart + VISIBLE_JOBS);\n\n return (\n <box flexDirection=\"column\">\n <text attributes={TextAttributes.BOLD} fg={c.accent}>Jobs</text>\n <text fg={c.muted}>r refresh enter detail c cancel k kind f status</text>\n <text fg={c.muted}>{formatListSummary(state.jobs.length, visibleJobs.length, kindFilter, statusFilter)}</text>\n <ListRemoteState state={state} />\n {visibleJobs.length > 0 ? (\n <box flexDirection=\"column\">\n {jobWindow.map((job, visibleIndex) => {\n const isCursor = windowStart + visibleIndex === cursorIndex;\n return <JobRow key={job.id} job={job} selected={isCursor} />;\n })}\n </box>\n ) : state.status === \"ready\" || state.status === \"idle\" ? (\n <text fg={c.muted}>{state.status === \"ready\" ? \"No Jobs in this session\" : \"Jobs have not been loaded\"}</text>\n ) : null}\n {detailState.status === \"idle\" ? null : <JobDetail state={detailState} />}\n </box>\n );\n}\n\nfunction ListRemoteState({ state }: { state: JobRemoteState }) {\n const { theme } = useTheme();\n const c = theme.colors;\n if (state.status === \"loading\") return <text fg={c.warning}>Loading Jobs</text>;\n if (state.status === \"error\") {\n return (\n <box flexDirection=\"column\">\n <text fg={c.error}>{`Jobs unavailable: ${state.error}`}</text>\n {state.jobs.length > 0 ? <text fg={c.warning}>Showing cached Jobs</text> : null}\n </box>\n );\n }\n return null;\n}\n\nfunction JobRow({ job, selected }: { job: JobSnapshot; selected: boolean }) {\n const { theme } = useTheme();\n const c = theme.colors;\n const marker = statusMarker(job.status);\n const foreground = selected ? c.background : statusColor(job.status, c);\n return (\n <box flexDirection=\"column\" backgroundColor={selected ? c.accent : undefined}>\n <text fg={foreground}>{`${marker} ${job.kind} ${job.status} ${truncate(job.label, 50)}`}</text>\n <text fg={selected ? c.background : c.muted}>{` ${truncate(job.id, 24)} ${truncate(job.cwd, 44)}`}</text>\n </box>\n );\n}\n\nfunction JobDetail({ state }: { state: Exclude<JobDetailRemoteState, { status: \"idle\" }> }) {\n const { theme } = useTheme();\n const c = theme.colors;\n if (state.status === \"loading\") {\n return (\n <box flexDirection=\"column\">\n <text fg={c.warning}>Loading detail…</text>\n {state.previous ? <DetailResult result={state.previous} /> : null}\n </box>\n );\n }\n if (state.status === \"error\") {\n return (\n <box flexDirection=\"column\">\n <text fg={c.error}>{`Detail unavailable: ${state.error}`}</text>\n {state.previous ? <DetailResult result={state.previous} /> : null}\n </box>\n );\n }\n return <DetailResult result={state.result} />;\n}\n\nfunction DetailResult({ result }: { result: JobReadResult }) {\n const { theme } = useTheme();\n const c = theme.colors;\n const { snapshot } = result;\n const steps = snapshot.kind === \"workflow\" ? workflowSteps(result.details) : [];\n const reconciliation = snapshot.kind === \"workflow\" ? reconciliationSummary(result.details) : undefined;\n return (\n <box flexDirection=\"column\">\n <text>{\" \"}</text>\n <text attributes={TextAttributes.BOLD} fg={c.muted}>DETAIL</text>\n <text fg={statusColor(snapshot.status, c)}>{`${snapshot.kind} ${snapshot.status} ${snapshot.label}`}</text>\n <text fg={c.muted}>{`id: ${snapshot.id}`}</text>\n <text fg={c.muted}>{`cwd: ${snapshot.cwd}`}</text>\n <text fg={c.muted}>{`started: ${new Date(snapshot.startedAt).toISOString()}`}</text>\n {lastOutputLines(result.text).map((line, index) => <text key={`${index}-${line}`} fg={c.foreground}>{line}</text>)}\n {snapshot.kind === \"workflow\" && steps.length > 0 ? (\n <box flexDirection=\"column\">\n <text attributes={TextAttributes.BOLD} fg={c.muted}>STEPS</text>\n {steps.slice(0, VISIBLE_WORKFLOW_STEPS).map((step) => (\n <text key={step.taskId} fg={statusColor(step.status, c)}>\n {`${step.taskId} ${step.status}${step.summary ? ` ${step.summary}` : \"\"}`}\n </text>\n ))}\n {steps.length > VISIBLE_WORKFLOW_STEPS ? <text fg={c.muted}>{`+${steps.length - VISIBLE_WORKFLOW_STEPS} steps`}</text> : null}\n </box>\n ) : null}\n {reconciliation ? <text fg={c.warning}>{reconciliation}</text> : null}\n </box>\n );\n}\n\nfunction nextFilter<T extends string>(values: readonly T[], current: T | undefined): T | undefined {\n if (!current) return values[0];\n const currentIndex = values.indexOf(current);\n if (currentIndex < 0 || currentIndex === values.length - 1) return undefined;\n return values[currentIndex + 1];\n}\n\nfunction formatListSummary(total: number, visible: number, kind: JobKindFilter, status: JobStatusFilter): string {\n const filters = [kind ? `kind=${kind}` : undefined, status ? `status=${status}` : undefined]\n .filter((value): value is string => value !== undefined);\n return `${visible}/${total} Jobs${filters.length ? ` ${filters.join(\" \")}` : \"\"}`;\n}\n\nfunction statusMarker(status: JobSnapshot[\"status\"]): string {\n if (status === \"completed\") return \"✓\";\n if (status === \"killed\") return \"■\";\n if (status === \"failed\") return \"✗\";\n return \"●\";\n}\n\nfunction statusColor(\n status: string,\n colors: { success: string; warning: string; error: string; muted: string },\n): string {\n if (status === \"running\" || status === \"completed\") return colors.success;\n if (status === \"failed\") return colors.error;\n if (status === \"stopping\" || status === \"killed\") return colors.warning;\n return colors.muted;\n}\n\nfunction lastOutputLines(text: string): string[] {\n if (!text) return [];\n return text.split(/\\r?\\n/).slice(-VISIBLE_OUTPUT_LINES);\n}\n\nfunction workflowSteps(details: Record<string, unknown> | undefined): WorkflowStepRow[] {\n if (!isRecord(details) || !isRecord(details.plan) || !Array.isArray(details.plan.tasks)) return [];\n const results = isRecord(details.results) ? details.results : {};\n const runningTasks = isRecord(details.runningTasks) ? details.runningTasks : {};\n const blockedTasks = isRecord(details.blockedTasks) ? details.blockedTasks : {};\n const pendingTaskIds = stringSet(details.pendingTaskIds);\n const runningTaskIds = stringSet(details.runningTaskIds);\n const blockedTaskIds = stringSet(details.blockedTaskIds);\n\n return details.plan.tasks.flatMap((task): WorkflowStepRow[] => {\n if (!isRecord(task)) return [];\n const taskId = nonEmptyString(task.taskId) ?? nonEmptyString(task.id);\n if (!taskId) return [];\n const result = isRecord(results[taskId]) ? results[taskId] : undefined;\n const running = isRecord(runningTasks[taskId]) ? runningTasks[taskId] : undefined;\n const blocked = isRecord(blockedTasks[taskId]) ? blockedTasks[taskId] : undefined;\n const status = nonEmptyString(task.status)\n ?? nonEmptyString(result?.status)\n ?? (blockedTaskIds.has(taskId) || blocked ? \"blocked\" : undefined)\n ?? (runningTaskIds.has(taskId) || running ? \"running\" : undefined)\n ?? (pendingTaskIds.has(taskId) ? \"pending\" : \"pending\");\n const summary = nonEmptyString(task.summary)\n ?? nonEmptyString(result?.summary)\n ?? nonEmptyString(running?.summary)\n ?? nonEmptyString(blocked?.reason)\n ?? nonEmptyString(task.description);\n return [{ taskId, status, ...(summary ? { summary } : {}) }];\n });\n}\n\nfunction reconciliationSummary(details: Record<string, unknown> | undefined): string | undefined {\n if (!isRecord(details)) return undefined;\n const reconciliation = isRecord(details.reconciliation) ? details.reconciliation : undefined;\n const plan = isRecord(details.reconciliationPlan) ? details.reconciliationPlan : undefined;\n const summary = isRecord(details.reconciliationSummary) ? details.reconciliationSummary : undefined;\n return nonEmptyString(reconciliation?.summary)\n ?? nonEmptyString(plan?.summary)\n ?? nonEmptyString(summary?.summary);\n}\n\nfunction stringSet(value: unknown): Set<string> {\n return new Set(Array.isArray(value) ? value.filter((item): item is string => typeof item === \"string\") : []);\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === \"object\" && value !== null && !Array.isArray(value);\n}\n\nfunction nonEmptyString(value: unknown): string | undefined {\n return typeof value === \"string\" && value.trim().length > 0 ? value : undefined;\n}\n\nfunction truncate(value: string, max: number): string {\n return value.length <= max ? value : `${value.slice(0, Math.max(0, max - 3))}...`;\n}\n",
57
57
  "import { spawn } from \"node:child_process\";\nimport { platform } from \"node:os\";\n\ntype SelectionRenderer = {\n clearSelection: () => void;\n copyToClipboardOSC52: (text: string) => boolean;\n getSelection: () => { getSelectedText: () => string } | null;\n};\n\ntype Toast = (message: string, level?: \"info\" | \"error\") => void;\ntype ClipboardWriter = (text: string) => Promise<void>;\n\nfunction writeProcess(command: string, args: string[], text: string): Promise<void> {\n return new Promise((resolve, reject) => {\n const child = spawn(command, args, {\n stdio: [\"pipe\", \"ignore\", \"ignore\"],\n windowsHide: true,\n });\n\n child.once(\"error\", reject);\n child.once(\"close\", (code) => {\n if (code === 0) {\n resolve();\n return;\n }\n reject(new Error(`${command} exited with code ${code}`));\n });\n\n child.stdin.end(text);\n });\n}\n\nasync function tryClipboardCommands(\n candidates: Array<{ command: string; args: string[] }>,\n text: string,\n): Promise<void> {\n let lastError: unknown;\n for (const candidate of candidates) {\n try {\n await writeProcess(candidate.command, candidate.args, text);\n return;\n } catch (err) {\n lastError = err;\n }\n }\n throw lastError ?? new Error(\"No clipboard command available\");\n}\n\nexport async function writeTextToClipboard(text: string): Promise<void> {\n const os = platform();\n\n if (os === \"win32\") {\n await writeProcess(\n \"powershell.exe\",\n [\n \"-NonInteractive\",\n \"-NoProfile\",\n \"-Command\",\n \"[Console]::InputEncoding = [System.Text.Encoding]::UTF8; Set-Clipboard -Value ([Console]::In.ReadToEnd())\",\n ],\n text,\n );\n return;\n }\n\n if (os === \"darwin\") {\n await writeProcess(\"pbcopy\", [], text);\n return;\n }\n\n if (os === \"linux\") {\n await tryClipboardCommands(\n [\n ...(process.env.WAYLAND_DISPLAY\n ? [{ command: \"wl-copy\", args: [] }]\n : []),\n { command: \"xclip\", args: [\"-selection\", \"clipboard\"] },\n { command: \"xsel\", args: [\"--clipboard\", \"--input\"] },\n ],\n text,\n );\n return;\n }\n\n throw new Error(`Unsupported clipboard platform: ${os}`);\n}\n\nexport function copySelectionToClipboard(\n renderer: SelectionRenderer,\n toast: Toast,\n writeClipboard: ClipboardWriter = writeTextToClipboard,\n): boolean {\n const selection = renderer.getSelection();\n if (!selection) return false;\n\n const text = selection.getSelectedText();\n if (!text) {\n renderer.clearSelection();\n return true;\n }\n\n const osc52Accepted = renderer.copyToClipboardOSC52(text);\n void writeClipboard(text)\n .then(() => toast(\"Copied to clipboard\"))\n .catch(() => {\n if (osc52Accepted) {\n toast(\"Copied to clipboard\");\n return;\n }\n toast(\"Failed to copy selection\", \"error\");\n });\n\n renderer.clearSelection();\n return true;\n}\n",
58
- "import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\r\nimport { useKeyboard, useRenderer, useTerminalDimensions } from \"@opentui/react\";\r\nimport { useServerSync } from \"./hooks/useServerSync\";\r\nimport { useEscToCancel } from \"./hooks/useEscToCancel\";\r\nimport { useModalWiring } from \"./hooks/useModalWiring\";\r\nimport { ThemeProvider, useTheme } from \"./theme/ThemeContext\";\r\nimport { DialogProvider, useDialog } from \"./ui/DialogContext\";\r\nimport { ToastProvider, useToast } from \"./ui/Toast\";\r\nimport { DialogSelect } from \"./ui/DialogSelect\";\r\nimport { ModelPickerDialog } from \"./ui/ModelPickerDialog\";\r\nimport { buildRegistry, type CommandRegistry } from \"./keymap/commands\";\r\nimport { PERMISSION_MODES, PERMISSION_MODE_ORDER } from \"./keymap/permissionModes\";\r\nimport { HISTORY_LIMIT, SIDEBAR_AUTO_OPEN_WIDTH } from \"./ui/constants\";\r\nimport { BUILTIN_THEMES } from \"./theme/builtinThemes\";\r\nimport { AppView } from \"./routes/session/AppView\";\r\nimport { JobsPanel, type JobsPanelProps } from \"./components/JobsPanel\";\r\nimport type { FrontendConfig } from \"./types\";\r\nimport type { TuiAction } from \"./hooks/sessionController\";\r\nimport { copySelectionToClipboard } from \"./utils/selection\";\r\n\r\ntype JobsPanelCallbacks = Omit<JobsPanelProps, \"state\" | \"detailState\">;\r\n\r\nexport function createJobsPanelCallbacks(sendRequest: (action: TuiAction) => void): JobsPanelCallbacks {\r\n return {\r\n onRefresh: () => sendRequest({ type: \"job_request\", job_action: \"refresh\" }),\r\n onSelect: (jobId) => sendRequest({ type: \"job_request\", job_action: \"select\", job_id: jobId }),\r\n onCancel: (jobId) => sendRequest({\r\n type: \"job_request\",\r\n job_action: \"cancel\",\r\n job_id: jobId,\r\n reason: \"Cancelled from TUI\",\r\n }),\r\n };\r\n}\r\n\r\nexport function shouldOpenJobsPanel(line: string): boolean {\r\n return [\"/jobs\", \"/workflow\", \"/workflows\"].includes(line.trim());\r\n}\r\n\r\n// ─────────── AppInner — session + dialog wiring ─────────────\r\n\r\nfunction AppInner({ config }: { config: FrontendConfig }) {\r\n const renderer = useRenderer();\r\n const { width: terminalWidth } = useTerminalDimensions();\r\n const [sidebarOpen, setSidebarOpen] = useState(() => terminalWidth >= SIDEBAR_AUTO_OPEN_WIDTH);\r\n const [jobsPanelOpen, setJobsPanelOpen] = useState(false);\r\n const dialog = useDialog();\r\n const { setThemeName, theme } = useTheme();\r\n const { toast } = useToast();\r\n\r\n // 主题切换时同步 renderer 底色(含 OSC 11,避免透出终端背景)\r\n useEffect(() => {\r\n renderer.setBackgroundColor(theme.colors.background);\r\n }, [renderer, theme.colors.background]);\r\n\r\n const onSessionExit = useCallback((code?: number | null) => {\r\n process.exitCode = code ?? 0;\r\n renderer.destroy();\r\n }, [renderer],);\r\n const onSessionError = useCallback((message: string) => toast(message, \"error\"), [toast]);\r\n const session = useServerSync(config, onSessionError);\r\n const jobsPanelCallbacks = useMemo(() => createJobsPanelCallbacks(session.sendRequest), [session.sendRequest]);\r\n const activeSessionId = typeof session.status.session_id === \"string\"\r\n ? session.status.session_id\r\n : undefined;\r\n const previousSessionIdRef = useRef<string | undefined>(undefined);\r\n\r\n useEffect(() => {\r\n const previousSessionId = previousSessionIdRef.current;\r\n if (previousSessionId && previousSessionId !== activeSessionId) {\r\n dialog.closeAll();\r\n setJobsPanelOpen(false);\r\n setDraft(\"\");\r\n }\r\n previousSessionIdRef.current = activeSessionId;\r\n }, [activeSessionId, dialog.closeAll]);\r\n\r\n // Local input history (up to 100 entries)\r\n const [history, setHistory] = useState<string[]>([]);\r\n\r\n // Prompt 草稿:dialog 打开会卸载 Prompt,提升到这里保证弹层关闭后草稿不丢\r\n const [draft, setDraft] = useState(\"\");\r\n\r\n // 双击 Esc 取消运行中的对话\r\n const { escHint, handleEscape } = useEscToCancel(session.busy, () => {\r\n session.sendRequest({ type: \"interrupt\" });\r\n });\r\n\r\n const appendHistory = useCallback((line: string) => {\r\n setHistory((prev) => {\r\n const next = [...prev, line];\r\n return next.length > HISTORY_LIMIT ? next.slice(next.length - HISTORY_LIMIT) : next;\r\n });\r\n }, []);\r\n\r\n const setPermissionMode = useCallback(\r\n (mode: \"default\" | \"plan\" | \"full_auto\") => {\r\n session.sendRequest({ type: \"set_permission_mode\", permission_mode: mode, });\r\n },\r\n [session],\r\n );\r\n\r\n const openModelPicker = useCallback(() => {\r\n const currentModel = typeof session.status.model === \"string\"\r\n ? session.status.model\r\n : ( config.daemon?.model ?? undefined);\r\n\r\n dialog.replace(\r\n <box flexDirection=\"column\">\r\n <text>Loading models...</text>\r\n </box>,\r\n );\r\n\r\n void session.loadModels()\r\n .then((providers) => {\r\n dialog.replace(\r\n <ModelPickerDialog\r\n providers={providers}\r\n currentModel={currentModel}\r\n onSelect={(model) => {\r\n session.sendRequest({\r\n type: \"select_model\",\r\n model: model.id,\r\n provider: model.providerName,\r\n });\r\n dialog.close();\r\n toast(`Model: ${model.id}`);\r\n }}\r\n />,\r\n );\r\n })\r\n .catch((error) => {\r\n const message = error instanceof Error ? error.message : String(error);\r\n dialog.close();\r\n toast(`Models: ${message}`, \"error\");\r\n });\r\n }, [config.daemon?.model, dialog, session, toast]);\r\n\r\n // ──────────── handleCommand: intercept special slash commands ───────────────\r\n const handleCommand = useCallback(\r\n (line: string): boolean => {\r\n // /theme set X\r\n const themeSetMatch = line.match(/^\\/theme\\s+set\\s+(\\S+)$/);\r\n if (themeSetMatch?.[1]) {\r\n setThemeName(themeSetMatch[1]);\r\n toast(`Theme: ${themeSetMatch[1]}`);\r\n return true;\r\n }\r\n\r\n // /theme (no args) — open theme picker\r\n if (line.trim() === \"/theme\") {\r\n const themeKeys = Object.keys(BUILTIN_THEMES);\r\n const currentTheme = theme.name;\r\n dialog.replace(\r\n <DialogSelect\r\n title=\"Select Theme\"\r\n items={themeKeys.map((k) => ({\r\n value: k,\r\n label: k,\r\n active: k === currentTheme,\r\n }))}\r\n onSelect={(value) => {\r\n setThemeName(value);\r\n toast(`Theme: ${value}`);\r\n dialog.close();\r\n }}\r\n />,\r\n );\r\n return true;\r\n }\r\n\r\n if (line.trim() === \"/models\") {\r\n openModelPicker();\r\n return true;\r\n }\r\n\r\n // /permissions or /permissions show — open permissions picker\r\n if (line.trim() === \"/permissions\" || line.trim() === \"/permissions show\") {\r\n const currentMode = String(session.status.permission_mode ?? \"default\");\r\n const currentIndex = PERMISSION_MODES.findIndex((m) => m.value === currentMode);\r\n dialog.replace(\r\n <DialogSelect\r\n title=\"Permission Mode\"\r\n items={PERMISSION_MODES.map((m) => ({\r\n value: m.value,\r\n label: m.label,\r\n description: m.description,\r\n active: m.value === currentMode,\r\n }))}\r\n onSelect={(value) => {\r\n setPermissionMode(value as \"default\" | \"plan\" | \"full_auto\");\r\n dialog.close();\r\n }}\r\n searchable={false}\r\n initialIndex={currentIndex >= 0 ? currentIndex : 0}\r\n />,\r\n );\r\n return true;\r\n }\r\n\r\n // /plan — toggle plan mode\r\n if (line.trim() === \"/plan\") {\r\n const currentMode = String(session.status.permission_mode ?? \"default\");\r\n const isPlan = currentMode === \"plan\";\r\n session.sendRequest({\r\n type: \"submit_line\",\r\n line: isPlan ? \"/plan off\" : \"/plan on\",\r\n });\r\n return true;\r\n }\r\n\r\n const coordinatorMatch = line.trim().match(/^\\/coordinator(?:\\s+(on|off|status))?$/);\r\n if (coordinatorMatch) {\r\n const currentMode = String(session.status.session_mode ?? \"direct\");\r\n const action = coordinatorMatch[1] ?? (currentMode === \"coordinator\" ? \"off\" : \"on\");\r\n if (action === \"status\") {\r\n toast(`Coordinator mode: ${currentMode === \"coordinator\" ? \"on\" : \"off\"}`);\r\n return true;\r\n }\r\n if (activeSessionId) {\r\n toast(\"Use /new before changing coordinator mode\", \"error\");\r\n return true;\r\n }\r\n session.sendRequest({\r\n type: \"set_session_mode\",\r\n session_mode: action === \"on\" ? \"coordinator\" : \"direct\",\r\n });\r\n toast(`Coordinator mode: ${action}`);\r\n return true;\r\n }\r\n\r\n // /sessions — 列出并切换会话;/resume 专用于显式重放中断 run。\r\n if (line.trim() === \"/sessions\") {\r\n session.sendRequest({ type: \"list_sessions\" });\r\n return true;\r\n }\r\n\r\n if (shouldOpenJobsPanel(line)) {\r\n setJobsPanelOpen(true);\r\n session.sendRequest({ type: \"job_request\", job_action: \"open\" });\r\n return true;\r\n }\r\n\r\n return false;\r\n },\r\n [activeSessionId, dialog, openModelPicker, session, setThemeName, theme.name, toast],\r\n );\r\n\r\n // ─────────────────────── openCommandPalette helper ───────────────────────────\r\n // 复用下方 useMemo 的注册表(经 ref 解循环依赖:registry.local 里的\r\n // app.palette.run 也要能打开面板)。\r\n const registryRef = useRef<CommandRegistry | null>(null);\r\n const openCommandPalette = useCallback(() => {\r\n const registry = registryRef.current;\r\n if (!registry) return;\r\n const allCmds = registry.all();\r\n dialog.replace(\r\n <DialogSelect\r\n title=\"Commands\"\r\n items={allCmds.map((cmd) => ({\r\n value: cmd.id,\r\n label: cmd.id,\r\n description: cmd.title !== cmd.id ? cmd.title : undefined,\r\n hint: cmd.keybinding,\r\n }))}\r\n onSelect={(id) => {\r\n dialog.close();\r\n const cmd = registry.get(id);\r\n cmd?.run();\r\n }}\r\n />,\r\n );\r\n }, [dialog]);\r\n\r\n // ─────────────────────────────── onSubmit ────────────────────────────────────\r\n const onSubmit = useCallback(\r\n (line: string) => {\r\n if (handleCommand(line)) {\r\n appendHistory(line);\r\n return;\r\n }\r\n session.sendRequest({ type: \"submit_line\", line });\r\n appendHistory(line);\r\n },\r\n [appendHistory, handleCommand, session],\r\n );\r\n\r\n // ────────────────────────────────── onCycleMode ──────────────────────────────\r\n const onCycleMode = useCallback(() => {\r\n const currentMode = String(session.status.permission_mode ?? \"default\");\r\n const idx = PERMISSION_MODE_ORDER.indexOf(currentMode);\r\n const nextMode = PERMISSION_MODE_ORDER[(idx + 1) % PERMISSION_MODE_ORDER.length] ?? \"default\";\r\n setPermissionMode(nextMode as \"default\" | \"plan\" | \"full_auto\");\r\n }, [session.status.permission_mode, setPermissionMode]);\r\n\r\n // ──────────────── Command registry for slashCommands prop ────────────────────\r\n const registry = useMemo(\r\n () =>\r\n buildRegistry({\r\n // 优先用带描述的 command_details(补全/面板展示描述),旧后端回退纯名称;按名称排序对齐 opencode\r\n backendCommands: (session.commandDetails.length > 0 ? [...session.commandDetails] : session.commands.map((name) => ({ name }))).sort((a, b) => a.name.localeCompare(b.name)),\r\n local: [\r\n {\r\n id: \"app.palette\",\r\n title: \"Open Command Palette\",\r\n keybinding: \"ctrl+p\",\r\n run: openCommandPalette,\r\n },\r\n {\r\n // 必须用斜杠 id 覆盖后端 LOCAL 同名命令;否则补全回车走 submitLine → local_ui 被忽略,弹框不会开。\r\n id: \"/theme\",\r\n title: \"Change Theme\",\r\n run: () => handleCommand(\"/theme\"),\r\n },\r\n {\r\n id: \"/permissions\",\r\n title: \"Change Permission Mode\",\r\n run: () => handleCommand(\"/permissions\"),\r\n },\r\n {\r\n id: \"/models\",\r\n title: \"Select Model\",\r\n run: () => handleCommand(\"/models\"),\r\n },\r\n {\r\n id: \"/coordinator\",\r\n title: \"Toggle Coordinator Mode\",\r\n run: () => handleCommand(\"/coordinator\"),\r\n },\r\n {\r\n id: \"/sessions\",\r\n title: \"List & restore sessions\",\r\n run: () => handleCommand(\"/sessions\"),\r\n },\r\n {\r\n id: \"app.sidebar\",\r\n title: \"Toggle Sidebar\",\r\n run: () => setSidebarOpen((v) => !v),\r\n },\r\n {\r\n id: \"app.jobs\",\r\n title: \"Jobs\",\r\n run: () => {\r\n setJobsPanelOpen(true);\r\n session.sendRequest({ type: \"job_request\", job_action: \"open\" });\r\n },\r\n },\r\n {\r\n id: \"/jobs\",\r\n title: \"Open Jobs panel\",\r\n run: () => handleCommand(\"/jobs\"),\r\n },\r\n {\r\n id: \"/workflow\",\r\n title: \"Open Jobs panel\",\r\n run: () => handleCommand(\"/workflow\"),\r\n },\r\n {\r\n id: \"/workflows\",\r\n title: \"Open Jobs panel\",\r\n run: () => handleCommand(\"/workflows\"),\r\n },\r\n {\r\n id: \"app.exit\",\r\n title: \"Exit\",\r\n keybinding: \"ctrl+c\",\r\n run: () => onSessionExit(0),\r\n },\r\n ],\r\n submitLine: (line: string) => {\r\n session.sendRequest({ type: \"submit_line\", line });\r\n },\r\n }),\r\n [handleCommand, onSessionExit, openCommandPalette, session],\r\n );\r\n registryRef.current = registry;\r\n\r\n // ──────────── Dialog wiring for backend modal/select requests ────────────────\r\n useModalWiring(session, dialog);\r\n\r\n // ──────────────────────── Global keyboard handler ────────────────────────────\r\n useKeyboard((key) => {\r\n if (key.ctrl && key.name === \"c\") {\r\n if (copySelectionToClipboard(renderer, toast)) {\r\n key.preventDefault();\r\n key.stopPropagation();\r\n return;\r\n }\r\n key.preventDefault();\r\n key.stopPropagation();\r\n onSessionExit(0);\r\n }\r\n if (key.ctrl && key.name === \"p\") {\r\n // 已有弹层(含后端 permission/question/select)时不顶掉:\r\n // dialog.replace 会触发被顶层的 onClose(permission 会被当作拒绝)。\r\n if (dialog.isOpen) return;\r\n openCommandPalette();\r\n }\r\n if (key.name === \"escape\" && jobsPanelOpen) {\r\n setJobsPanelOpen(false);\r\n return;\r\n }\r\n if (key.ctrl && key.name === \"b\") {\r\n setSidebarOpen((v) => !v);\r\n }\r\n if (key.name === \"escape\" && session.busy && !dialog.isOpen) {\r\n handleEscape();\r\n }\r\n });\r\n\r\n const jobsPanelWidth = Math.min(78, Math.max(54, Math.floor(terminalWidth * 0.7)));\r\n const jobsPanelLeft = Math.max(0, Math.floor((terminalWidth - jobsPanelWidth) / 2));\r\n\r\n return (\r\n <>\r\n <AppView\r\n transcript={session.transcript}\r\n assistantBuffer={session.assistantBuffer}\r\n ready={session.ready}\r\n busy={session.busy}\r\n status={session.status}\r\n mcpServers={session.mcpServers}\r\n version={config.version ?? null}\r\n history={history}\r\n slashCommands={registry.slashCommands()}\r\n onSubmit={onSubmit}\r\n onCycleMode={onCycleMode}\r\n dialogOpen={dialog.isOpen || jobsPanelOpen}\r\n draft={draft}\r\n onDraftChange={setDraft}\r\n sidebarOpen={sidebarOpen}\r\n onToggleSidebar={() => setSidebarOpen((v) => !v)}\r\n escHint={escHint}\r\n />\r\n {jobsPanelOpen ? (\r\n <box position=\"absolute\" top={2} left={jobsPanelLeft} width={jobsPanelWidth} zIndex={90} border={true} borderColor={theme.colors.accent} backgroundColor={theme.colors.backgroundPanel} padding={1} flexDirection=\"column\">\r\n <JobsPanel\r\n state={session.jobState}\r\n detailState={session.jobDetailState}\r\n {...jobsPanelCallbacks}\r\n />\r\n </box>\r\n ) : null}\r\n </>\r\n );\r\n}\r\n\r\n// ───────────────────────── App — root with providers ─────────────────────────\r\n\r\nexport function App({ config }: { config: FrontendConfig }) {\r\n const initialTheme = String(config.theme ?? \"default\");\r\n return (\r\n <ThemeProvider initialTheme={initialTheme}>\r\n <DialogProvider>\r\n <ToastProvider>\r\n <AppInner config={config} />\r\n </ToastProvider>\r\n </DialogProvider>\r\n </ThemeProvider>\r\n );\r\n}\r\n",
59
- "/**\r\n * TUI 前端入口(进程 B,Bun 运行时)。配置经 OPENHARNESS_FRONTEND_CONFIG 注入;\r\n * daemon 主线由 useServerSync attach。\r\n * 详见 docs/tui-flow.md 与 docs/client-sync-flow.md。\r\n */\r\nimport { getTheme } from \"./theme/builtinThemes\";\r\nimport { assertSupportedTuiRuntime } from \"./runtime\";\r\nimport type { FrontendConfig } from \"./types\";\r\n\r\nconst rawConfig = process.env.OPENHARNESS_FRONTEND_CONFIG;\r\nlet config: FrontendConfig;\r\ntry {\r\n const parsed = rawConfig ? JSON.parse(rawConfig) : {};\r\n config = {\r\n daemon: parsed.daemon ?? (\r\n process.env.OPENHARNESS_DAEMON_URL\r\n ? {\r\n url: process.env.OPENHARNESS_DAEMON_URL,\r\n token: process.env.OPENHARNESS_DAEMON_TOKEN ?? null,\r\n cwd: process.env.OPENHARNESS_DAEMON_CWD ?? null,\r\n model: process.env.OPENHARNESS_DAEMON_MODEL ?? null,\r\n }\r\n : null\r\n ),\r\n initial_prompt: parsed.initial_prompt ?? process.env.OPENHARNESS_INITIAL_PROMPT ?? null,\r\n theme: parsed.theme ?? process.env.OPENHARNESS_THEME ?? \"default\",\r\n version: parsed.version ?? null,\r\n };\r\n} catch {\r\n config = { daemon: null, theme: \"default\" };\r\n}\r\n\r\ntry {\r\n // OpenTUI 默认 backgroundColor 为 transparent,会透出终端配色;启动时铺上主题底色。\r\n // Run before importing OpenTUI because its native DLL can crash an unsupported Bun.\r\n assertSupportedTuiRuntime();\r\n const [{ createCliRenderer }, { createElement, createRoot }, { App }] = await Promise.all([\r\n import(\"@opentui/core\"),\r\n import(\"@opentui/react\"),\r\n import(\"./App\"),\r\n ]);\r\n const initialBg = getTheme(String(config.theme ?? \"default\")).colors.background;\r\n const renderer = await createCliRenderer({\r\n exitOnCtrlC: false,\r\n backgroundColor: initialBg,\r\n onDestroy: () => process.exit(process.exitCode ?? 0),\r\n });\r\n renderer.setTerminalTitle(\"OpenHarness\");\r\n createRoot(renderer).render(createElement(App, { config }));\r\n} catch (err) {\r\n console.error(\"[openharness] 终端渲染器初始化失败(需要 Bun + 支持的平台):\", err);\r\n process.exit(1);\r\n}\r\n",
60
- "export const MIN_WINDOWS_BUN_VERSION = \"1.3.12\";\r\n\r\ntype RuntimeInfo = {\r\n platform: string;\r\n bunVersion: string | null;\r\n};\r\n\r\nfunction compareVersions(left: string, right: string): number {\r\n const leftParts = left.split(\".\").map((part) => Number.parseInt(part, 10) || 0);\r\n const rightParts = right.split(\".\").map((part) => Number.parseInt(part, 10) || 0);\r\n const length = Math.max(leftParts.length, rightParts.length);\r\n\r\n for (let index = 0; index < length; index += 1) {\r\n const difference = (leftParts[index] ?? 0) - (rightParts[index] ?? 0);\r\n if (difference !== 0) return difference;\r\n }\r\n\r\n return 0;\r\n}\r\n\r\nexport function assertSupportedTuiRuntime(runtime: RuntimeInfo = {\r\n platform: process.platform,\r\n bunVersion: typeof Bun === \"undefined\" ? null : Bun.version,\r\n}): void {\r\n if (runtime.platform !== \"win32\" || runtime.bunVersion === null) return;\r\n\r\n if (compareVersions(runtime.bunVersion, MIN_WINDOWS_BUN_VERSION) < 0) {\r\n throw new Error(\r\n `Windows TUI requires Bun ${MIN_WINDOWS_BUN_VERSION} or newer; found ${runtime.bunVersion}. Run: bun upgrade`,\r\n );\r\n }\r\n}\r\n"
58
+ "import { useCallback, useEffect, useMemo, useRef, useState } from \"react\";\nimport { useKeyboard, useRenderer, useTerminalDimensions } from \"@opentui/react\";\nimport { useServerSync } from \"./hooks/useServerSync\";\nimport { useEscToCancel } from \"./hooks/useEscToCancel\";\nimport { useModalWiring } from \"./hooks/useModalWiring\";\nimport { ThemeProvider, useTheme } from \"./theme/ThemeContext\";\nimport { DialogProvider, useDialog } from \"./ui/DialogContext\";\nimport { ToastProvider, useToast } from \"./ui/Toast\";\nimport { DialogSelect } from \"./ui/DialogSelect\";\nimport { ModelPickerDialog } from \"./ui/ModelPickerDialog\";\nimport { buildRegistry, type CommandRegistry } from \"./keymap/commands\";\nimport { PERMISSION_MODES, PERMISSION_MODE_ORDER } from \"./keymap/permissionModes\";\nimport { HISTORY_LIMIT, SIDEBAR_AUTO_OPEN_WIDTH } from \"./ui/constants\";\nimport { BUILTIN_THEMES } from \"./theme/builtinThemes\";\nimport { AppView } from \"./routes/session/AppView\";\nimport { JobsPanel, type JobsPanelProps } from \"./components/JobsPanel\";\nimport type { FrontendConfig } from \"./types\";\nimport type { TuiAction } from \"./hooks/sessionController\";\nimport { copySelectionToClipboard } from \"./utils/selection\";\n\ntype JobsPanelCallbacks = Omit<JobsPanelProps, \"state\" | \"detailState\">;\n\nexport function createJobsPanelCallbacks(sendRequest: (action: TuiAction) => void): JobsPanelCallbacks {\n return {\n onRefresh: () => sendRequest({ type: \"job_request\", job_action: \"refresh\" }),\n onSelect: (jobId) => sendRequest({ type: \"job_request\", job_action: \"select\", job_id: jobId }),\n onCancel: (jobId) => sendRequest({\n type: \"job_request\",\n job_action: \"cancel\",\n job_id: jobId,\n reason: \"Cancelled from TUI\",\n }),\n };\n}\n\nexport function shouldOpenJobsPanel(line: string): boolean {\n return [\"/jobs\", \"/workflow\", \"/workflows\"].includes(line.trim());\n}\n\n// ─────────── AppInner — session + dialog wiring ─────────────\n\nfunction AppInner({ config }: { config: FrontendConfig }) {\n const renderer = useRenderer();\n const { width: terminalWidth } = useTerminalDimensions();\n const [sidebarOpen, setSidebarOpen] = useState(() => terminalWidth >= SIDEBAR_AUTO_OPEN_WIDTH);\n const [jobsPanelOpen, setJobsPanelOpen] = useState(false);\n const dialog = useDialog();\n const { setThemeName, theme } = useTheme();\n const { toast } = useToast();\n\n // 主题切换时同步 renderer 底色(含 OSC 11,避免透出终端背景)\n useEffect(() => {\n renderer.setBackgroundColor(theme.colors.background);\n }, [renderer, theme.colors.background]);\n\n const onSessionExit = useCallback((code?: number | null) => {\n process.exitCode = code ?? 0;\n renderer.destroy();\n }, [renderer],);\n const onSessionError = useCallback((message: string) => toast(message, \"error\"), [toast]);\n const session = useServerSync(config, onSessionError);\n const jobsPanelCallbacks = useMemo(() => createJobsPanelCallbacks(session.sendRequest), [session.sendRequest]);\n const activeSessionId = typeof session.status.session_id === \"string\"\n ? session.status.session_id\n : undefined;\n const previousSessionIdRef = useRef<string | undefined>(undefined);\n\n useEffect(() => {\n const previousSessionId = previousSessionIdRef.current;\n if (previousSessionId && previousSessionId !== activeSessionId) {\n dialog.closeAll();\n setJobsPanelOpen(false);\n setDraft(\"\");\n }\n previousSessionIdRef.current = activeSessionId;\n }, [activeSessionId, dialog.closeAll]);\n\n // Local input history (up to 100 entries)\n const [history, setHistory] = useState<string[]>([]);\n\n // Prompt 草稿:dialog 打开会卸载 Prompt,提升到这里保证弹层关闭后草稿不丢\n const [draft, setDraft] = useState(\"\");\n\n // 双击 Esc 取消运行中的对话\n const { escHint, handleEscape } = useEscToCancel(session.busy, () => {\n session.sendRequest({ type: \"interrupt\" });\n });\n\n const appendHistory = useCallback((line: string) => {\n setHistory((prev) => {\n const next = [...prev, line];\n return next.length > HISTORY_LIMIT ? next.slice(next.length - HISTORY_LIMIT) : next;\n });\n }, []);\n\n const setPermissionMode = useCallback(\n (mode: \"default\" | \"plan\" | \"full_auto\") => {\n session.sendRequest({ type: \"set_permission_mode\", permission_mode: mode, });\n },\n [session],\n );\n\n const openModelPicker = useCallback(() => {\n const currentModel = typeof session.status.model === \"string\"\n ? session.status.model\n : ( config.daemon?.model ?? undefined);\n\n dialog.replace(\n <box flexDirection=\"column\">\n <text>Loading models...</text>\n </box>,\n );\n\n void session.loadModels()\n .then((providers) => {\n dialog.replace(\n <ModelPickerDialog\n providers={providers}\n currentModel={currentModel}\n onSelect={(model) => {\n session.sendRequest({\n type: \"select_model\",\n model: model.id,\n provider: model.providerName,\n });\n dialog.close();\n toast(`Model: ${model.id}`);\n }}\n />,\n );\n })\n .catch((error) => {\n const message = error instanceof Error ? error.message : String(error);\n dialog.close();\n toast(`Models: ${message}`, \"error\");\n });\n }, [config.daemon?.model, dialog, session, toast]);\n\n // ──────────── handleCommand: intercept special slash commands ───────────────\n const handleCommand = useCallback(\n (line: string): boolean => {\n // /theme set X\n const themeSetMatch = line.match(/^\\/theme\\s+set\\s+(\\S+)$/);\n if (themeSetMatch?.[1]) {\n setThemeName(themeSetMatch[1]);\n toast(`Theme: ${themeSetMatch[1]}`);\n return true;\n }\n\n // /theme (no args) — open theme picker\n if (line.trim() === \"/theme\") {\n const themeKeys = Object.keys(BUILTIN_THEMES);\n const currentTheme = theme.name;\n dialog.replace(\n <DialogSelect\n title=\"Select Theme\"\n items={themeKeys.map((k) => ({\n value: k,\n label: k,\n active: k === currentTheme,\n }))}\n onSelect={(value) => {\n setThemeName(value);\n toast(`Theme: ${value}`);\n dialog.close();\n }}\n />,\n );\n return true;\n }\n\n if (line.trim() === \"/models\") {\n openModelPicker();\n return true;\n }\n\n // /permissions or /permissions show — open permissions picker\n if (line.trim() === \"/permissions\" || line.trim() === \"/permissions show\") {\n const currentMode = String(session.status.permission_mode ?? \"default\");\n const currentIndex = PERMISSION_MODES.findIndex((m) => m.value === currentMode);\n dialog.replace(\n <DialogSelect\n title=\"Permission Mode\"\n items={PERMISSION_MODES.map((m) => ({\n value: m.value,\n label: m.label,\n description: m.description,\n active: m.value === currentMode,\n }))}\n onSelect={(value) => {\n setPermissionMode(value as \"default\" | \"plan\" | \"full_auto\");\n dialog.close();\n }}\n searchable={false}\n initialIndex={currentIndex >= 0 ? currentIndex : 0}\n />,\n );\n return true;\n }\n\n // /plan — toggle plan mode\n if (line.trim() === \"/plan\") {\n const currentMode = String(session.status.permission_mode ?? \"default\");\n const isPlan = currentMode === \"plan\";\n session.sendRequest({\n type: \"submit_line\",\n line: isPlan ? \"/plan off\" : \"/plan on\",\n });\n return true;\n }\n\n const coordinatorMatch = line.trim().match(/^\\/coordinator(?:\\s+(on|off|status))?$/);\n if (coordinatorMatch) {\n const currentMode = String(session.status.session_mode ?? \"direct\");\n const action = coordinatorMatch[1] ?? (currentMode === \"coordinator\" ? \"off\" : \"on\");\n if (action === \"status\") {\n toast(`Coordinator mode: ${currentMode === \"coordinator\" ? \"on\" : \"off\"}`);\n return true;\n }\n if (activeSessionId) {\n toast(\"Use /new before changing coordinator mode\", \"error\");\n return true;\n }\n session.sendRequest({\n type: \"set_session_mode\",\n session_mode: action === \"on\" ? \"coordinator\" : \"direct\",\n });\n toast(`Coordinator mode: ${action}`);\n return true;\n }\n\n // /sessions — 列出并切换会话;/resume 专用于显式重放中断 run。\n if (line.trim() === \"/sessions\") {\n session.sendRequest({ type: \"list_sessions\" });\n return true;\n }\n\n if (shouldOpenJobsPanel(line)) {\n setJobsPanelOpen(true);\n session.sendRequest({ type: \"job_request\", job_action: \"open\" });\n return true;\n }\n\n return false;\n },\n [activeSessionId, dialog, openModelPicker, session, setThemeName, theme.name, toast],\n );\n\n // ─────────────────────── openCommandPalette helper ───────────────────────────\n // 复用下方 useMemo 的注册表(经 ref 解循环依赖:registry.local 里的\n // app.palette.run 也要能打开面板)。\n const registryRef = useRef<CommandRegistry | null>(null);\n const openCommandPalette = useCallback(() => {\n const registry = registryRef.current;\n if (!registry) return;\n const allCmds = registry.all();\n dialog.replace(\n <DialogSelect\n title=\"Commands\"\n items={allCmds.map((cmd) => ({\n value: cmd.id,\n label: cmd.id,\n description: cmd.title !== cmd.id ? cmd.title : undefined,\n hint: cmd.keybinding,\n }))}\n onSelect={(id) => {\n dialog.close();\n const cmd = registry.get(id);\n cmd?.run();\n }}\n />,\n );\n }, [dialog]);\n\n // ─────────────────────────────── onSubmit ────────────────────────────────────\n const onSubmit = useCallback(\n (line: string) => {\n if (handleCommand(line)) {\n appendHistory(line);\n return;\n }\n session.sendRequest({ type: \"submit_line\", line });\n appendHistory(line);\n },\n [appendHistory, handleCommand, session],\n );\n\n // ────────────────────────────────── onCycleMode ──────────────────────────────\n const onCycleMode = useCallback(() => {\n const currentMode = String(session.status.permission_mode ?? \"default\");\n const idx = PERMISSION_MODE_ORDER.indexOf(currentMode);\n const nextMode = PERMISSION_MODE_ORDER[(idx + 1) % PERMISSION_MODE_ORDER.length] ?? \"default\";\n setPermissionMode(nextMode as \"default\" | \"plan\" | \"full_auto\");\n }, [session.status.permission_mode, setPermissionMode]);\n\n // ──────────────── Command registry for slashCommands prop ────────────────────\n const registry = useMemo(\n () =>\n buildRegistry({\n // 优先用带描述的 command_details(补全/面板展示描述),旧后端回退纯名称;按名称排序对齐 opencode\n backendCommands: (session.commandDetails.length > 0 ? [...session.commandDetails] : session.commands.map((name) => ({ name }))).sort((a, b) => a.name.localeCompare(b.name)),\n local: [\n {\n id: \"app.palette\",\n title: \"Open Command Palette\",\n keybinding: \"ctrl+p\",\n run: openCommandPalette,\n },\n {\n // 必须用斜杠 id 覆盖后端 LOCAL 同名命令;否则补全回车走 submitLine → local_ui 被忽略,弹框不会开。\n id: \"/theme\",\n title: \"Change Theme\",\n run: () => handleCommand(\"/theme\"),\n },\n {\n id: \"/permissions\",\n title: \"Change Permission Mode\",\n run: () => handleCommand(\"/permissions\"),\n },\n {\n id: \"/models\",\n title: \"Select Model\",\n run: () => handleCommand(\"/models\"),\n },\n {\n id: \"/coordinator\",\n title: \"Toggle Coordinator Mode\",\n run: () => handleCommand(\"/coordinator\"),\n },\n {\n id: \"/sessions\",\n title: \"List & restore sessions\",\n run: () => handleCommand(\"/sessions\"),\n },\n {\n id: \"app.sidebar\",\n title: \"Toggle Sidebar\",\n run: () => setSidebarOpen((v) => !v),\n },\n {\n id: \"app.jobs\",\n title: \"Jobs\",\n run: () => {\n setJobsPanelOpen(true);\n session.sendRequest({ type: \"job_request\", job_action: \"open\" });\n },\n },\n {\n id: \"/jobs\",\n title: \"Open Jobs panel\",\n run: () => handleCommand(\"/jobs\"),\n },\n {\n id: \"/workflow\",\n title: \"Open Jobs panel\",\n run: () => handleCommand(\"/workflow\"),\n },\n {\n id: \"/workflows\",\n title: \"Open Jobs panel\",\n run: () => handleCommand(\"/workflows\"),\n },\n {\n id: \"app.exit\",\n title: \"Exit\",\n keybinding: \"ctrl+c\",\n run: () => onSessionExit(0),\n },\n ],\n submitLine: (line: string) => {\n session.sendRequest({ type: \"submit_line\", line });\n },\n }),\n [handleCommand, onSessionExit, openCommandPalette, session],\n );\n registryRef.current = registry;\n\n // ──────────── Dialog wiring for backend modal/select requests ────────────────\n useModalWiring(session, dialog);\n\n // ──────────────────────── Global keyboard handler ────────────────────────────\n useKeyboard((key) => {\n if (key.ctrl && key.name === \"c\") {\n if (copySelectionToClipboard(renderer, toast)) {\n key.preventDefault();\n key.stopPropagation();\n return;\n }\n key.preventDefault();\n key.stopPropagation();\n onSessionExit(0);\n }\n if (key.ctrl && key.name === \"p\") {\n // 已有弹层(含后端 permission/question/select)时不顶掉:\n // dialog.replace 会触发被顶层的 onClose(permission 会被当作拒绝)。\n if (dialog.isOpen) return;\n openCommandPalette();\n }\n if (key.name === \"escape\" && jobsPanelOpen) {\n setJobsPanelOpen(false);\n return;\n }\n if (key.ctrl && key.name === \"b\") {\n setSidebarOpen((v) => !v);\n }\n if (key.name === \"escape\" && session.busy && !dialog.isOpen) {\n handleEscape();\n }\n });\n\n const jobsPanelWidth = Math.min(78, Math.max(54, Math.floor(terminalWidth * 0.7)));\n const jobsPanelLeft = Math.max(0, Math.floor((terminalWidth - jobsPanelWidth) / 2));\n\n return (\n <>\n <AppView\n transcript={session.transcript}\n assistantBuffer={session.assistantBuffer}\n ready={session.ready}\n busy={session.busy}\n status={session.status}\n mcpServers={session.mcpServers}\n version={config.version ?? null}\n history={history}\n slashCommands={registry.slashCommands()}\n onSubmit={onSubmit}\n onCycleMode={onCycleMode}\n dialogOpen={dialog.isOpen || jobsPanelOpen}\n draft={draft}\n onDraftChange={setDraft}\n sidebarOpen={sidebarOpen}\n onToggleSidebar={() => setSidebarOpen((v) => !v)}\n escHint={escHint}\n />\n {jobsPanelOpen ? (\n <box position=\"absolute\" top={2} left={jobsPanelLeft} width={jobsPanelWidth} zIndex={90} border={true} borderColor={theme.colors.accent} backgroundColor={theme.colors.backgroundPanel} padding={1} flexDirection=\"column\">\n <JobsPanel\n state={session.jobState}\n detailState={session.jobDetailState}\n {...jobsPanelCallbacks}\n />\n </box>\n ) : null}\n </>\n );\n}\n\n// ───────────────────────── App — root with providers ─────────────────────────\n\nexport function App({ config }: { config: FrontendConfig }) {\n const initialTheme = String(config.theme ?? \"default\");\n return (\n <ThemeProvider initialTheme={initialTheme}>\n <DialogProvider>\n <ToastProvider>\n <AppInner config={config} />\n </ToastProvider>\n </DialogProvider>\n </ThemeProvider>\n );\n}\n",
59
+ "/**\n * TUI 前端入口(进程 B,Bun 运行时)。配置经 OPENHARNESS_FRONTEND_CONFIG 注入;\n * daemon 主线由 useServerSync attach。\n * 详见 docs/tui-flow.md 与 docs/client-sync-flow.md。\n */\nimport { getTheme } from \"./theme/builtinThemes\";\nimport { assertSupportedTuiRuntime } from \"./runtime\";\nimport type { FrontendConfig } from \"./types\";\n\nconst rawConfig = process.env.OPENHARNESS_FRONTEND_CONFIG;\nlet config: FrontendConfig;\ntry {\n const parsed = rawConfig ? JSON.parse(rawConfig) : {};\n config = {\n daemon: parsed.daemon ?? (\n process.env.OPENHARNESS_DAEMON_URL\n ? {\n url: process.env.OPENHARNESS_DAEMON_URL,\n token: process.env.OPENHARNESS_DAEMON_TOKEN ?? null,\n cwd: process.env.OPENHARNESS_DAEMON_CWD ?? null,\n model: process.env.OPENHARNESS_DAEMON_MODEL ?? null,\n }\n : null\n ),\n initial_prompt: parsed.initial_prompt ?? process.env.OPENHARNESS_INITIAL_PROMPT ?? null,\n theme: parsed.theme ?? process.env.OPENHARNESS_THEME ?? \"default\",\n version: parsed.version ?? null,\n };\n} catch {\n config = { daemon: null, theme: \"default\" };\n}\n\ntry {\n // OpenTUI 默认 backgroundColor 为 transparent,会透出终端配色;启动时铺上主题底色。\n // Run before importing OpenTUI because its native DLL can crash an unsupported Bun.\n assertSupportedTuiRuntime();\n const [{ createCliRenderer }, { createElement, createRoot }, { App }] = await Promise.all([\n import(\"@opentui/core\"),\n import(\"@opentui/react\"),\n import(\"./App\"),\n ]);\n const initialBg = getTheme(String(config.theme ?? \"default\")).colors.background;\n const renderer = await createCliRenderer({\n exitOnCtrlC: false,\n backgroundColor: initialBg,\n onDestroy: () => process.exit(process.exitCode ?? 0),\n });\n renderer.setTerminalTitle(\"OpenHarness\");\n createRoot(renderer).render(createElement(App, { config }));\n} catch (err) {\n console.error(\"[openharness] 终端渲染器初始化失败(需要 Bun + 支持的平台):\", err);\n process.exit(1);\n}\n",
60
+ "export const MIN_WINDOWS_BUN_VERSION = \"1.3.12\";\n\ntype RuntimeInfo = {\n platform: string;\n bunVersion: string | null;\n};\n\nfunction compareVersions(left: string, right: string): number {\n const leftParts = left.split(\".\").map((part) => Number.parseInt(part, 10) || 0);\n const rightParts = right.split(\".\").map((part) => Number.parseInt(part, 10) || 0);\n const length = Math.max(leftParts.length, rightParts.length);\n\n for (let index = 0; index < length; index += 1) {\n const difference = (leftParts[index] ?? 0) - (rightParts[index] ?? 0);\n if (difference !== 0) return difference;\n }\n\n return 0;\n}\n\nexport function assertSupportedTuiRuntime(runtime: RuntimeInfo = {\n platform: process.platform,\n bunVersion: typeof Bun === \"undefined\" ? null : Bun.version,\n}): void {\n if (runtime.platform !== \"win32\" || runtime.bunVersion === null) return;\n\n if (compareVersions(runtime.bunVersion, MIN_WINDOWS_BUN_VERSION) < 0) {\n throw new Error(\n `Windows TUI requires Bun ${MIN_WINDOWS_BUN_VERSION} or newer; found ${runtime.bunVersion}. Run: bun upgrade`,\n );\n }\n}\n"
61
61
  ],
62
- "mappings": "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",
63
- "debugId": "CB1C21442334B24864756E2164756E21",
62
+ "mappings": "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",
63
+ "debugId": "355DB2EBFACF8ADB64756E2164756E21",
64
64
  "names": []
65
65
  }