@norman-else/dsh-claude 0.1.0
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.
- package/INSTALL.md +58 -0
- package/LICENSE +21 -0
- package/README.md +184 -0
- package/cordis.patch.yml +5 -0
- package/lib/bin.d.mts +1 -0
- package/lib/bin.mjs +116 -0
- package/lib/bin.mjs.map +1 -0
- package/lib/client.d.ts +84 -0
- package/lib/client.js +1417 -0
- package/lib/client.js.map +1 -0
- package/lib/events-qlmU1KrH.mjs +186 -0
- package/lib/events-qlmU1KrH.mjs.map +1 -0
- package/lib/index.d.mts +230 -0
- package/lib/index.mjs +2272 -0
- package/lib/index.mjs.map +1 -0
- package/lib/presenters-DbfG-9KQ.mjs +302 -0
- package/lib/presenters-DbfG-9KQ.mjs.map +1 -0
- package/lib/preset-installer-DUVN1J6P.mjs +291 -0
- package/lib/preset-installer-DUVN1J6P.mjs.map +1 -0
- package/lib/preset-route.d.mts +11 -0
- package/lib/preset-route.mjs +24 -0
- package/lib/preset-route.mjs.map +1 -0
- package/package.json +124 -0
- package/preset/agent.cordis.yml +14 -0
- package/preset/preset.yml +4 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["record","string","#pending","#readNow","#update","#writeNow","#path","#values","#pending","#closed","#failure","#exitCode","#signalCode","#killed","#entries","#runtime","#approval","#config","#queryFactory","#runDetached","#sidecar","#dynamicPresenterNames","#contextWindows","claudeQuery","#runMetadata","#admissionGate","#runTurnAdmitted","#disposed","#disposeEntry","#makeRoom","#createEntry","#armInitializationTimer","#syncPermissionMode","#appendActivity","#armIdleTimer","#interrupt","#metadataEntry","#whenInitialized","#pump","#handleMessage","#handleDisconnect","#flushTasksSnapshot","#trackTask","#trackBackgroundLevel","#completeTurn","#ensureDynamicPresenter","#appendNativeToolCall","#appendNativeToolResult","#scheduleTasksSnapshot","#appendSafely","#supervisor","#agents","#presetIdFor"],"sources":["../src/sidecar.ts","../src/async-queue.ts","../src/permission.ts","../src/sdk-messages.ts","../src/spawn.ts","../src/supervisor.ts","../src/adapter.ts","../src/http.ts","../src/doctor-routes.ts","../src/projection-routes.ts","../src/index.ts"],"sourcesContent":["import { randomUUID } from 'node:crypto'\nimport { chmod, mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises'\nimport { join } from 'node:path'\nimport { dshHomePath } from '@deepseek-ai/dsh-home-paths'\nimport type { SessionEvent } from '@deepseek-ai/dsh-session'\nimport {\n latestClaudeContextUsage,\n latestClaudeSessionBinding,\n latestClaudeTasks,\n normalizeActivity,\n normalizeContextUsage,\n normalizeTasksEvent,\n redactText,\n type ClaudeActivityEvent,\n type ClaudeActivityInput,\n type ClaudeContextUsageEvent,\n type ClaudeContextUsageInput,\n type ClaudeSessionBoundEvent,\n type ClaudeTaskInfo,\n type ClaudeTasksEvent,\n} from './events.ts'\nimport { CLAUDE_ACTIVITY_EVENT, SDK_VERSION } from './constants.ts'\n\nconst SIDECAR_SCHEMA_VERSION = 1\nconst MAX_ACTIVITIES = 10_000\n\nexport interface ClaudeSidecarProjection {\n readonly schemaVersion: typeof SIDECAR_SCHEMA_VERSION\n readonly revision: number\n readonly binding?: ClaudeSessionBoundEvent\n readonly activities: readonly ClaudeActivityEvent[]\n readonly contextUsage?: ClaudeContextUsageEvent\n readonly tasks?: ClaudeTasksEvent\n}\n\nexport interface ClaudeSidecarRepositoryOptions {\n readonly root?: string\n readonly legacyRoot?: string\n}\n\nfunction emptyProjection(): ClaudeSidecarProjection {\n return { schemaVersion: SIDECAR_SCHEMA_VERSION, revision: 0, activities: [] }\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value as Record<string, unknown>\n : undefined\n}\n\nfunction finiteInteger(value: unknown): value is number {\n return typeof value === 'number' && Number.isSafeInteger(value) && value >= 0\n}\n\nfunction string(value: unknown, max: number): value is string {\n return typeof value === 'string' && value.length > 0 && value.length <= max\n}\n\nfunction binding(value: unknown): ClaudeSessionBoundEvent | undefined {\n const input = record(value)\n if (input === undefined\n || !string(input.claudeSessionId, 512)\n || !string(input.sdkVersion, 128)\n || !string(input.cwd, 4_096)\n || (input.cliVersion !== undefined && !string(input.cliVersion, 128))) return undefined\n return {\n claudeSessionId: input.claudeSessionId,\n sdkVersion: input.sdkVersion,\n cwd: input.cwd,\n ...(input.cliVersion === undefined ? {} : { cliVersion: input.cliVersion }),\n }\n}\n\nconst ACTIVITY_KINDS = new Set(['status', 'thinking', 'tool-call', 'tool-result', 'permission', 'subagent', 'usage', 'warning', 'error'])\nconst ACTIVITY_PHASES = new Set(['started', 'updated', 'completed', 'denied', 'failed'])\n\nfunction activity(value: unknown): ClaudeActivityEvent | undefined {\n const input = record(value)\n if (input === undefined\n || !finiteInteger(input.turn)\n || !finiteInteger(input.step)\n || !finiteInteger(input.ordinal)\n || typeof input.kind !== 'string'\n || !ACTIVITY_KINDS.has(input.kind)\n || (input.phase !== undefined && (typeof input.phase !== 'string' || !ACTIVITY_PHASES.has(input.phase)))) return undefined\n return normalizeActivity(input as unknown as ClaudeActivityEvent)\n}\n\nfunction contextUsage(value: unknown): ClaudeContextUsageEvent | undefined {\n const input = record(value)\n if (input === undefined || !Array.isArray(input.categories)) return undefined\n return normalizeContextUsage(input as unknown as ClaudeContextUsageInput)\n}\n\nfunction tasks(value: unknown): ClaudeTasksEvent | undefined {\n const input = record(value)\n if (input === undefined || !Array.isArray(input.tasks)) return undefined\n return normalizeTasksEvent(input.tasks as ClaudeTaskInfo[])\n}\n\nexport function parseClaudeSidecar(value: unknown): ClaudeSidecarProjection {\n const input = record(value)\n if (input === undefined\n || input.schemaVersion !== SIDECAR_SCHEMA_VERSION\n || !finiteInteger(input.revision)\n || !Array.isArray(input.activities)\n || input.activities.length > MAX_ACTIVITIES) {\n throw new Error('dsh-claude: invalid sidecar document')\n }\n const activities = input.activities.map(activity)\n if (activities.some(item => item === undefined)) throw new Error('dsh-claude: invalid sidecar activity')\n const parsedBinding = input.binding === undefined ? undefined : binding(input.binding)\n const parsedUsage = input.contextUsage === undefined ? undefined : contextUsage(input.contextUsage)\n const parsedTasks = input.tasks === undefined ? undefined : tasks(input.tasks)\n if ((input.binding !== undefined && parsedBinding === undefined)\n || (input.contextUsage !== undefined && parsedUsage === undefined)\n || (input.tasks !== undefined && parsedTasks === undefined)) {\n throw new Error('dsh-claude: invalid sidecar projection')\n }\n return {\n schemaVersion: SIDECAR_SCHEMA_VERSION,\n revision: input.revision,\n activities: activities as ClaudeActivityEvent[],\n ...(parsedBinding === undefined ? {} : { binding: parsedBinding }),\n ...(parsedUsage === undefined ? {} : { contextUsage: parsedUsage }),\n ...(parsedTasks === undefined ? {} : { tasks: parsedTasks }),\n }\n}\n\nfunction compareActivity(left: ClaudeActivityEvent, right: ClaudeActivityEvent): number {\n return left.turn - right.turn || left.step - right.step || left.ordinal - right.ordinal\n}\n\nfunction activityKey(value: ClaudeActivityEvent): string {\n return `${value.turn}:${value.step}:${value.ordinal}`\n}\n\nfunction mergeActivities(\n existing: readonly ClaudeActivityEvent[],\n additions: readonly ClaudeActivityEvent[],\n): ClaudeActivityEvent[] {\n const merged = new Map(existing.map(item => [activityKey(item), item]))\n for (const item of additions) merged.set(activityKey(item), item)\n return [...merged.values()].sort(compareActivity).slice(-MAX_ACTIVITIES)\n}\n\nfunction normalizeBinding(\n input: Omit<ClaudeSessionBoundEvent, 'sdkVersion'> & { sdkVersion?: string },\n): ClaudeSessionBoundEvent {\n return {\n claudeSessionId: redactText(input.claudeSessionId, 512),\n sdkVersion: redactText(input.sdkVersion ?? SDK_VERSION, 128),\n cwd: redactText(input.cwd, 4_096),\n ...(input.cliVersion === undefined ? {} : { cliVersion: redactText(input.cliVersion, 128) }),\n }\n}\n\nexport class ClaudeSidecarRepository {\n readonly root: string\n readonly legacyRoot: string | undefined\n readonly #pending = new Map<string, Promise<unknown>>()\n\n constructor(options: ClaudeSidecarRepositoryOptions = {}) {\n this.root = options.root ?? dshHomePath('plugins', 'dsh-claude', 'sessions')\n this.legacyRoot = options.legacyRoot\n ?? (options.root === undefined ? dshHomePath('plugins', 'dsh-claude-code', 'sessions') : undefined)\n }\n\n async read(sessionId: string): Promise<ClaudeSidecarProjection> {\n await this.#pending.get(sessionId)?.catch(() => undefined)\n return this.#readNow(sessionId)\n }\n\n writeBinding(\n sessionId: string,\n value: Omit<ClaudeSessionBoundEvent, 'sdkVersion'> & { sdkVersion?: string },\n ): Promise<ClaudeSidecarProjection> {\n const normalized = normalizeBinding(value)\n return this.#update(sessionId, current => ({ ...current, binding: normalized }))\n }\n\n appendActivity(\n sessionId: string,\n value: ClaudeActivityInput & { turn: number; step: number; ordinal: number },\n ): Promise<ClaudeSidecarProjection> {\n const normalized = normalizeActivity(value)\n return this.#update(sessionId, current => ({\n ...current,\n activities: mergeActivities(current.activities, [normalized]),\n }))\n }\n\n writeContextUsage(sessionId: string, value: ClaudeContextUsageInput): Promise<ClaudeSidecarProjection> {\n const normalized = normalizeContextUsage(value)\n return this.#update(sessionId, current => ({ ...current, contextUsage: normalized }))\n }\n\n writeTasks(sessionId: string, value: readonly ClaudeTaskInfo[]): Promise<ClaudeSidecarProjection> {\n const normalized = normalizeTasksEvent(value)\n return this.#update(sessionId, current => ({ ...current, tasks: normalized }))\n }\n\n importLegacy(sessionId: string, events: readonly SessionEvent[]): Promise<ClaudeSidecarProjection> {\n const importedActivities = events\n .filter(event => event.type === CLAUDE_ACTIVITY_EVENT)\n .map(event => activity(event.data))\n .filter((item): item is ClaudeActivityEvent => item !== undefined)\n const importedBinding = latestClaudeSessionBinding(events)\n const importedUsage = latestClaudeContextUsage(events)\n const importedTasks = latestClaudeTasks(events)\n return this.#update(sessionId, current => ({\n ...current,\n activities: mergeActivities(importedActivities, current.activities),\n ...(current.binding !== undefined || importedBinding === undefined ? {} : { binding: normalizeBinding(importedBinding) }),\n ...(current.contextUsage !== undefined || importedUsage === undefined ? {} : { contextUsage: normalizeContextUsage(importedUsage) }),\n ...(current.tasks !== undefined || importedTasks === undefined ? {} : { tasks: normalizeTasksEvent(importedTasks.tasks) }),\n }), true)\n }\n\n #path(sessionId: string, root = this.root): string {\n if (sessionId.length === 0 || sessionId.length > 1_024) throw new Error('dsh-claude: invalid session id')\n return join(root, `${Buffer.from(sessionId).toString('base64url')}.json`)\n }\n\n #update(\n sessionId: string,\n change: (current: ClaudeSidecarProjection) => Omit<ClaudeSidecarProjection, 'revision' | 'schemaVersion'> & Partial<Pick<ClaudeSidecarProjection, 'revision' | 'schemaVersion'>>,\n skipUnchanged = false,\n ): Promise<ClaudeSidecarProjection> {\n const previous = this.#pending.get(sessionId) ?? Promise.resolve()\n const operation = previous.catch(() => undefined).then(async () => {\n const current = await this.#readNow(sessionId)\n const changed = parseClaudeSidecar({\n ...change(current),\n schemaVersion: SIDECAR_SCHEMA_VERSION,\n revision: current.revision,\n })\n if (skipUnchanged && JSON.stringify(changed) === JSON.stringify(current)) return current\n const next = { ...changed, revision: current.revision + 1 }\n await this.#writeNow(sessionId, next)\n return next\n })\n this.#pending.set(sessionId, operation)\n void operation.finally(() => {\n if (this.#pending.get(sessionId) === operation) this.#pending.delete(sessionId)\n }).catch(() => undefined)\n return operation\n }\n\n async #readNow(sessionId: string): Promise<ClaudeSidecarProjection> {\n try {\n return parseClaudeSidecar(JSON.parse(await readFile(this.#path(sessionId), 'utf8')))\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== 'ENOENT') throw error\n }\n if (this.legacyRoot === undefined) return emptyProjection()\n try {\n return parseClaudeSidecar(JSON.parse(await readFile(this.#path(sessionId, this.legacyRoot), 'utf8')))\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return emptyProjection()\n throw error\n }\n }\n\n async #writeNow(sessionId: string, projection: ClaudeSidecarProjection): Promise<void> {\n await mkdir(this.root, { recursive: true, mode: 0o700 })\n await chmod(this.root, 0o700)\n const target = this.#path(sessionId)\n const temporary = `${target}.${process.pid}.${randomUUID()}.tmp`\n try {\n await writeFile(temporary, `${JSON.stringify(projection)}\\n`, { mode: 0o600, flag: 'wx' })\n await chmod(temporary, 0o600)\n await rename(temporary, target)\n await chmod(target, 0o600)\n } finally {\n await rm(temporary, { force: true }).catch(() => undefined)\n }\n }\n}\n","export class AsyncQueueClosedError extends Error {\n constructor() {\n super('Async queue is closed')\n this.name = 'AsyncQueueClosedError'\n }\n}\n\ninterface Pending<T> {\n resolve: (result: IteratorResult<T>) => void\n reject: (error: unknown) => void\n}\n\nexport class AsyncQueue<T> implements AsyncIterable<T>, AsyncIterator<T> {\n readonly #values: T[] = []\n readonly #pending: Pending<T>[] = []\n #closed = false\n #failure: unknown\n\n get closed(): boolean {\n return this.#closed\n }\n\n push(value: T): void {\n if (this.#closed) throw new AsyncQueueClosedError()\n const waiter = this.#pending.shift()\n if (waiter !== undefined) waiter.resolve({ value, done: false })\n else this.#values.push(value)\n }\n\n close(): void {\n if (this.#closed) return\n this.#closed = true\n for (const waiter of this.#pending.splice(0)) waiter.resolve({ value: undefined, done: true })\n }\n\n fail(error: unknown): void {\n if (this.#closed) return\n this.#closed = true\n this.#failure = error\n for (const waiter of this.#pending.splice(0)) waiter.reject(error)\n }\n\n discard(error?: unknown): void {\n this.#values.splice(0)\n if (this.#closed) return\n this.#closed = true\n if (error === undefined) {\n for (const waiter of this.#pending.splice(0)) waiter.resolve({ value: undefined, done: true })\n return\n }\n this.#failure = error\n for (const waiter of this.#pending.splice(0)) waiter.resolve({ value: undefined, done: true })\n }\n\n next(): Promise<IteratorResult<T>> {\n const value = this.#values.shift()\n if (value !== undefined) return Promise.resolve({ value, done: false })\n if (this.#closed) {\n return this.#failure === undefined\n ? Promise.resolve({ value: undefined, done: true })\n : Promise.reject(this.#failure)\n }\n return new Promise<IteratorResult<T>>((resolve, reject) => {\n this.#pending.push({ resolve, reject })\n })\n }\n\n return(): Promise<IteratorResult<T>> {\n this.close()\n return Promise.resolve({ value: undefined, done: true })\n }\n\n [Symbol.asyncIterator](): AsyncIterator<T> {\n return this\n }\n}\n","import type { CanUseTool, PermissionResult } from '@anthropic-ai/claude-agent-sdk'\nimport type { Agent } from '@deepseek-ai/dsh-agent'\nimport type { ApprovalOutcome, ApprovalService } from '@deepseek-ai/dsh-user-approval'\nimport {\n boundText,\n safeDetail,\n type ClaudeActivityInput,\n type ClaudeActivityCursor,\n} from './events.ts'\n\nexport type ApprovalRequester = Pick<ApprovalService, 'request'>\n\nexport interface ActivePermissionContext {\n agent: Agent\n cursor: ClaudeActivityCursor\n markActivity?: () => void\n recordDenial?: (toolUseId: string) => void\n appendActivity: (activity: ClaudeActivityInput) => Promise<void>\n}\n\nexport type ActivePermissionContextProvider = () => ActivePermissionContext | undefined\n\nfunction denialMessage(outcome: ApprovalOutcome): string {\n switch (outcome) {\n case 'rejected': return 'The user rejected this action in DeepSeek Harness.'\n case 'cancelled': return 'The permission request was cancelled in DeepSeek Harness.'\n case 'unavailable': return 'No DeepSeek Harness approval surface was available; the action was denied.'\n case 'allowed-once': return ''\n }\n}\n\nexport function permissionReason(\n toolName: string,\n input: Readonly<Record<string, unknown>>,\n options: Parameters<CanUseTool>[2],\n): string {\n const prompt = options.title ?? options.description ?? options.decisionReason ?? `Claude Code wants to use ${toolName}.`\n const detail = safeDetail(input)\n return boundText(detail === undefined ? prompt : `${prompt}\\nInput: ${detail}`, 1_200)\n}\n\nexport function mapApprovalOutcome(\n outcome: ApprovalOutcome,\n input: Record<string, unknown>,\n toolUseID: string,\n): PermissionResult {\n if (outcome === 'allowed-once') {\n return {\n behavior: 'allow',\n updatedInput: input,\n toolUseID,\n decisionClassification: 'user_temporary',\n }\n }\n return {\n behavior: 'deny',\n message: denialMessage(outcome),\n toolUseID,\n decisionClassification: 'user_reject',\n }\n}\n\nexport function createPermissionBridge(\n approval: ApprovalRequester,\n activeContext: ActivePermissionContextProvider,\n): CanUseTool {\n return async (toolName, input, options) => {\n const active = activeContext()\n if (active === undefined) {\n return {\n behavior: 'deny',\n message: 'No active DeepSeek Harness turn owns this Claude Code action.',\n toolUseID: options.toolUseID,\n decisionClassification: 'user_reject',\n }\n }\n\n active.markActivity?.()\n const reason = permissionReason(toolName, input, options)\n try {\n await active.appendActivity({\n kind: 'permission',\n phase: 'started',\n toolUseId: options.toolUseID,\n toolName,\n title: options.displayName ?? toolName,\n summary: options.title ?? options.description ?? reason,\n detail: input,\n })\n const outcome = await approval.request({\n agent: active.agent,\n toolName,\n reason,\n signal: options.signal,\n })\n const result = mapApprovalOutcome(outcome, input, options.toolUseID)\n if (result.behavior === 'deny') active.recordDenial?.(options.toolUseID)\n await active.appendActivity({\n kind: 'permission',\n phase: outcome === 'allowed-once' ? 'completed' : 'denied',\n toolUseId: options.toolUseID,\n toolName,\n title: options.displayName ?? toolName,\n summary: outcome === 'allowed-once' ? 'Allowed once in DeepSeek Harness' : denialMessage(outcome),\n })\n return result\n } catch (error) {\n const message = options.signal.aborted\n ? 'The permission request was cancelled in DeepSeek Harness.'\n : 'DeepSeek Harness could not record or answer the permission request; the action was denied.'\n try {\n await active.appendActivity({\n kind: 'permission',\n phase: 'failed',\n toolUseId: options.toolUseID,\n toolName,\n title: options.displayName ?? toolName,\n summary: message,\n isError: true,\n detail: error,\n })\n } catch {\n // The permission path is already fail-closed; a second audit failure cannot widen it.\n }\n return {\n behavior: 'deny',\n message,\n toolUseID: options.toolUseID,\n decisionClassification: 'user_reject',\n }\n }\n }\n}\n","import type { SDKMessage } from '@anthropic-ai/claude-agent-sdk'\nimport type { ClaudeUsage } from './events.ts'\n\nexport type NormalizedSdkMessage =\n | { kind: 'init'; sessionId: string; cliVersion: string; cwd: string }\n | { kind: 'text-delta'; text: string; parentToolUseId?: string }\n | { kind: 'assistant-text'; text: string; parentToolUseId?: string }\n | { kind: 'thinking'; text: string; phase: 'updated' | 'completed'; parentToolUseId?: string }\n | { kind: 'tool-call'; toolUseId: string; toolName: string; input: unknown; parentToolUseId?: string }\n | { kind: 'tool-result'; toolUseId: string; output: unknown; isError: boolean; parentToolUseId?: string }\n | {\n kind: 'subagent'\n title: string\n summary?: string\n detail?: unknown\n phase: 'started' | 'updated' | 'completed' | 'failed'\n /** Structured task-board fields for task_started/progress/updated/notification. */\n taskId?: string\n taskStatus?: 'running' | 'completed' | 'failed' | 'stopped' | 'killed'\n description?: string\n subagentType?: string\n taskType?: string\n lastToolName?: string\n usage?: { totalTokens?: number; toolUses?: number; durationMs?: number }\n /** Ambient/housekeeping task: hide from chat rows, keep on the task board. */\n skipTranscript?: boolean\n }\n | {\n /** Level signal: full live background-task set (REPLACE semantics). */\n kind: 'background-tasks'\n tasks: readonly { taskId: string; taskType?: string; description: string }[]\n }\n | { kind: 'status'; title: string; summary?: string; detail?: unknown }\n | { kind: 'warning'; title: string; summary?: string; detail?: unknown }\n | { kind: 'permission-denied'; toolUseId: string; toolName: string; summary: string }\n | { kind: 'result'; success: boolean; text?: string; errors?: readonly string[]; usage: ClaudeUsage; sessionId: string; userMessageUuid?: string; terminalReason?: string; permissionDenials?: readonly { toolName: string; toolUseId: string }[] }\n | { kind: 'protocol-error'; title: string; detail: unknown }\n | { kind: 'unknown'; title: string; detail: unknown }\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' ? value as Record<string, unknown> : undefined\n}\n\nfunction string(value: unknown): string | undefined {\n return typeof value === 'string' ? value : undefined\n}\n\nfunction contentText(content: unknown): string {\n if (typeof content === 'string') return content\n if (!Array.isArray(content)) return ''\n return content.map(item => {\n const block = record(item)\n if (block?.type === 'text') return string(block.text) ?? ''\n return ''\n }).join('')\n}\n\nfunction taskUsageOf(usage: Record<string, unknown> | undefined): { totalTokens?: number; toolUses?: number; durationMs?: number } | undefined {\n if (usage === undefined) return undefined\n const normalized: { totalTokens?: number; toolUses?: number; durationMs?: number } = {}\n if (typeof usage.total_tokens === 'number') normalized.totalTokens = usage.total_tokens\n if (typeof usage.tool_uses === 'number') normalized.toolUses = usage.tool_uses\n if (typeof usage.duration_ms === 'number') normalized.durationMs = usage.duration_ms\n return Object.keys(normalized).length === 0 ? undefined : normalized\n}\n\nfunction resultUsage(message: Record<string, unknown>): ClaudeUsage {\n const usage = record(message.usage)\n const normalized: ClaudeUsage = {}\n if (usage !== undefined) {\n if (typeof usage.input_tokens === 'number') normalized.inputTokens = usage.input_tokens\n if (typeof usage.output_tokens === 'number') normalized.outputTokens = usage.output_tokens\n if (typeof usage.cache_read_input_tokens === 'number') normalized.cacheReadTokens = usage.cache_read_input_tokens\n if (typeof usage.cache_creation_input_tokens === 'number') normalized.cacheCreationTokens = usage.cache_creation_input_tokens\n }\n if (typeof message.total_cost_usd === 'number') normalized.cumulativeCostUsd = message.total_cost_usd\n return normalized\n}\n\nfunction normalizeAssistant(message: Record<string, unknown>): NormalizedSdkMessage[] {\n const envelope = record(message.message)\n const content = envelope?.content\n if (!Array.isArray(content)) return [{ kind: 'protocol-error', title: 'Malformed Claude assistant message', detail: message }]\n const parentToolUseId = string(message.parent_tool_use_id)\n const normalized: NormalizedSdkMessage[] = []\n for (const item of content) {\n const block = record(item)\n if (block === undefined) continue\n if (block.type === 'text') {\n const text = string(block.text)\n if (text !== undefined && text.length > 0) normalized.push({ kind: 'assistant-text', text, ...(parentToolUseId === undefined ? {} : { parentToolUseId }) })\n } else if (block.type === 'thinking') {\n const text = string(block.thinking)\n if (text !== undefined && text.length > 0) normalized.push({ kind: 'thinking', text, phase: 'completed', ...(parentToolUseId === undefined ? {} : { parentToolUseId }) })\n } else if (block.type === 'tool_use') {\n const toolUseId = string(block.id)\n const toolName = string(block.name)\n if (toolUseId !== undefined && toolName !== undefined) {\n normalized.push({\n kind: 'tool-call',\n toolUseId,\n toolName,\n input: block.input,\n ...(parentToolUseId === undefined ? {} : { parentToolUseId }),\n })\n }\n }\n }\n return normalized\n}\n\nfunction normalizeUser(message: Record<string, unknown>): NormalizedSdkMessage[] {\n const envelope = record(message.message)\n const content = envelope?.content\n if (!Array.isArray(content)) return [{ kind: 'protocol-error', title: 'Malformed Claude user message', detail: message }]\n const parentToolUseId = string(message.parent_tool_use_id)\n const normalized: NormalizedSdkMessage[] = []\n for (const item of content) {\n const block = record(item)\n if (block?.type !== 'tool_result') continue\n const toolUseId = string(block.tool_use_id)\n if (toolUseId === undefined) continue\n normalized.push({\n kind: 'tool-result',\n toolUseId,\n output: message.tool_use_result ?? block.content,\n isError: block.is_error === true,\n ...(parentToolUseId === undefined ? {} : { parentToolUseId }),\n })\n }\n return normalized\n}\n\nfunction normalizeSystem(message: Record<string, unknown>): NormalizedSdkMessage[] {\n const subtype = string(message.subtype)\n if (subtype === 'init') {\n const sessionId = string(message.session_id)\n const cliVersion = string(message.claude_code_version)\n const cwd = string(message.cwd)\n return sessionId !== undefined && cliVersion !== undefined && cwd !== undefined\n ? [{ kind: 'init', sessionId, cliVersion, cwd }]\n : [{ kind: 'protocol-error', title: 'Malformed Claude initialization message', detail: message }]\n }\n if (subtype === 'status') {\n const status = message.status\n if (status === null) return [{ kind: 'status', title: 'Claude Code is ready' }]\n return [{ kind: 'status', title: `Claude Code ${String(status)}`, detail: message }]\n }\n if (subtype === 'session_state_changed') {\n return [{ kind: 'status', title: `Claude session ${String(message.state)}` }]\n }\n if (subtype === 'permission_denied') {\n const toolUseId = string(message.tool_use_id)\n const toolName = string(message.tool_name)\n if (toolUseId !== undefined && toolName !== undefined) {\n return [{\n kind: 'permission-denied',\n toolUseId,\n toolName,\n summary: string(message.message) ?? 'Claude Code denied the action',\n }]\n }\n }\n if (subtype === 'task_started') {\n const taskId = string(message.task_id)\n const description = string(message.description)\n const subagentType = string(message.subagent_type)\n const taskType = string(message.task_type)\n return [{\n kind: 'subagent',\n title: description ?? taskId ?? 'Claude subagent started',\n phase: 'started',\n detail: message,\n ...(taskId === undefined ? {} : { taskId }),\n taskStatus: 'running' as const,\n ...(description === undefined ? {} : { description }),\n ...(subagentType === undefined ? {} : { subagentType }),\n ...(taskType === undefined ? {} : { taskType }),\n ...(message.skip_transcript === true ? { skipTranscript: true } : {}),\n }]\n }\n if (subtype === 'task_progress') {\n const taskId = string(message.task_id)\n const description = string(message.description)\n const summary = string(message.summary)\n const subagentType = string(message.subagent_type)\n const lastToolName = string(message.last_tool_name)\n const usage = taskUsageOf(record(message.usage))\n return [{\n kind: 'subagent',\n title: summary ?? description ?? 'Claude subagent update',\n phase: 'updated',\n detail: message,\n ...(taskId === undefined ? {} : { taskId }),\n taskStatus: 'running' as const,\n ...(description === undefined ? {} : { description }),\n ...(subagentType === undefined ? {} : { subagentType }),\n ...(lastToolName === undefined ? {} : { lastToolName }),\n ...(summary === undefined ? {} : { summary }),\n ...(usage === undefined ? {} : { usage }),\n }]\n }\n if (subtype === 'task_updated') {\n const patch = record(message.patch)\n const status = string(patch?.status)\n const taskId = string(message.task_id)\n const description = string(patch?.description)\n const error = string(patch?.error)\n const taskStatus = status === undefined\n ? undefined\n : status === 'killed'\n ? 'killed' as const\n : status === 'completed'\n ? 'completed' as const\n : status === 'failed'\n ? 'failed' as const\n : 'running' as const\n return [{\n kind: 'subagent',\n title: description ?? 'Claude subagent update',\n phase: status === 'failed' || status === 'killed' ? 'failed' : status === 'completed' ? 'completed' : 'updated',\n detail: message,\n ...(taskId === undefined ? {} : { taskId }),\n ...(taskStatus === undefined ? {} : { taskStatus }),\n ...(description === undefined ? {} : { description }),\n ...(error === undefined ? {} : { summary: error }),\n }]\n }\n if (subtype === 'task_notification') {\n const failed = message.status === 'failed'\n const stopped = message.status === 'stopped' || message.status === 'cancelled'\n const taskId = string(message.task_id)\n const summary = string(message.summary)\n const taskStatus = failed ? 'failed' as const : stopped ? 'stopped' as const : 'completed' as const\n const usage = taskUsageOf(record(message.usage))\n return [{\n kind: 'subagent',\n title: summary ?? taskId ?? 'Claude subagent finished',\n phase: failed || stopped ? 'failed' : 'completed',\n detail: message,\n ...(taskId === undefined ? {} : { taskId }),\n taskStatus,\n ...(summary === undefined ? {} : { summary }),\n ...(usage === undefined ? {} : { usage }),\n }]\n }\n if (subtype === 'background_tasks_changed') {\n const tasks = Array.isArray(message.tasks) ? message.tasks : []\n return [{\n kind: 'background-tasks',\n tasks: tasks.flatMap(item => {\n const entry = record(item)\n const taskId = string(entry?.task_id)\n const description = string(entry?.description)\n const taskType = string(entry?.task_type)\n if (taskId === undefined || description === undefined) return []\n return [{\n taskId,\n description,\n ...(taskType === undefined ? {} : { taskType }),\n }]\n }),\n }]\n }\n if (subtype === 'api_retry') {\n return [{ kind: 'warning', title: 'Claude API retry', detail: message }]\n }\n if (subtype === 'informational' || subtype === 'notification' || subtype === 'local_command_output') {\n return [{\n kind: message.level === 'warning' ? 'warning' : 'status',\n title: string(message.content) ?? string(message.text) ?? 'Claude Code notice',\n detail: message,\n }]\n }\n if (subtype?.startsWith('hook_') === true || subtype === 'plugin_install') {\n return [{ kind: 'status', title: `Claude Code ${subtype.replaceAll('_', ' ')}`, detail: message }]\n }\n if (subtype !== undefined) {\n // Preserve unknown system lifecycle evidence (background tasks, resets,\n // worker/mirror lifecycle) as a bounded activity instead of silently\n // dropping it; the activity layer redacts and bounds the detail.\n return [{ kind: 'status', title: `Claude Code ${subtype.replaceAll('_', ' ')}`, detail: message }]\n }\n return []\n}\n\nconst RESULT_ERROR_SUBTYPES = new Set([\n 'error_during_execution',\n 'error_max_turns',\n 'error_max_budget_usd',\n 'error_max_structured_output_retries',\n])\n\nexport function normalizeSdkMessage(message: SDKMessage): NormalizedSdkMessage[] {\n const value = message as unknown as Record<string, unknown>\n if (value.type === 'stream_event') {\n const event = record(value.event)\n const parentToolUseId = string(value.parent_tool_use_id)\n if (event?.type === 'content_block_delta') {\n const delta = record(event.delta)\n if (delta?.type === 'text_delta') {\n const text = string(delta.text)\n return text === undefined ? [] : [{ kind: 'text-delta', text, ...(parentToolUseId === undefined ? {} : { parentToolUseId }) }]\n }\n if (delta?.type === 'thinking_delta') {\n const text = string(delta.thinking)\n return text === undefined ? [] : [{ kind: 'thinking', text, phase: 'updated', ...(parentToolUseId === undefined ? {} : { parentToolUseId }) }]\n }\n }\n return []\n }\n if (value.type === 'assistant') return normalizeAssistant(value)\n if (value.type === 'user') return normalizeUser(value)\n if (value.type === 'system') return normalizeSystem(value)\n if (value.type === 'result') {\n const sessionId = string(value.session_id)\n if (sessionId === undefined || (value.subtype !== 'success' && !RESULT_ERROR_SUBTYPES.has(String(value.subtype)))) {\n return [{ kind: 'protocol-error', title: 'Malformed Claude result message', detail: value }]\n }\n // A result is a success only when it is not flagged as an error. Local\n // 2.1.233 emits subtype:\"success\" with is_error:true for API/auth failures\n // (e.g. terminal_reason:\"api_error\"), so subtype alone is not authoritative.\n const success = value.subtype === 'success' && value.is_error !== true\n const errors = Array.isArray(value.errors)\n ? value.errors.filter((item): item is string => typeof item === 'string')\n : undefined\n const terminalReason = string(value.terminal_reason)\n const userMessageUuid = string(value.user_message_uuid)\n const permissionDenials = Array.isArray(value.permission_denials)\n ? value.permission_denials\n .map(item => record(item))\n .filter((item): item is Record<string, unknown> => item !== undefined)\n .map(item => {\n const toolName = string(item.tool_name)\n const toolUseId = string(item.tool_use_id)\n return toolName === undefined || toolUseId === undefined ? undefined : { toolName, toolUseId }\n })\n .filter((item): item is { toolName: string; toolUseId: string } => item !== undefined)\n .slice(0, 40)\n : undefined\n return [{\n kind: 'result',\n success,\n ...(success && typeof value.result === 'string' ? { text: value.result } : {}),\n ...(errors === undefined ? {} : { errors }),\n ...(terminalReason === undefined ? {} : { terminalReason }),\n ...(permissionDenials === undefined || permissionDenials.length === 0 ? {} : { permissionDenials }),\n usage: resultUsage(value),\n sessionId,\n ...(userMessageUuid === undefined ? {} : { userMessageUuid }),\n }]\n }\n if (value.type === 'auth_status') {\n return [{\n kind: value.error === undefined ? 'status' : 'warning',\n title: value.error === undefined ? 'Claude authentication status changed' : 'Claude authentication failed',\n detail: value.error ?? value.output,\n }]\n }\n if (value.type === 'rate_limit_event') {\n // The CLI pushes subscription-quota status after API activity. Only a\n // non-allowed state is a real warning; healthy updates stay audit-only.\n const info = record(value.rate_limit_info)\n const status = string(info?.status)\n const blocking = status !== undefined && status !== 'allowed'\n return [{\n kind: blocking ? 'warning' : 'status',\n title: blocking ? 'Claude rate limit is blocking requests' : 'Claude rate limit status changed',\n detail: value.rate_limit_info,\n }]\n }\n return [{ kind: 'unknown', title: `Unknown Claude SDK message: ${String(value.type)}`, detail: value }]\n}\n\nexport function extractSdkContentText(content: unknown): string {\n return contentText(content)\n}\n","import { EventEmitter } from 'node:events'\nimport type { Readable, Writable } from 'node:stream'\nimport type { SpawnOptions, SpawnedProcess } from '@anthropic-ai/claude-agent-sdk'\nimport {\n DSH_ENV_PREFIX,\n SENSITIVE_ENV_PATTERN,\n type SubprocessHandle,\n type SubprocessRuntime,\n} from '@deepseek-ai/dsh-subprocess'\n\nexport const CLAUDE_PROCESS_GRACE_MS = 2_000\nexport const CLAUDE_STDERR_TAIL_BYTES = 32 * 1024\n\nconst ADDITIONAL_SENSITIVE_ENV_PATTERN = /(?:authorization|cookie|credential|database[_-]?url|private[_-]?key|netrc)/iu\n\nexport function scrubClaudeSpawnEnv(env: Readonly<Record<string, string | undefined>>): NodeJS.ProcessEnv {\n const safe: NodeJS.ProcessEnv = {}\n for (const [key, value] of Object.entries(env)) {\n if (value === undefined) continue\n if (key.toUpperCase().startsWith(DSH_ENV_PREFIX)) continue\n if (SENSITIVE_ENV_PATTERN.test(key)) continue\n if (ADDITIONAL_SENSITIVE_ENV_PATTERN.test(key)) continue\n safe[key] = value\n }\n return safe\n}\n\nexport class ManagedClaudeProcess extends EventEmitter implements SpawnedProcess {\n readonly stdin: Writable\n readonly stdout: Readable\n readonly handle: SubprocessHandle\n #killed = false\n #exitCode: number | null = null\n #signalCode: NodeJS.Signals | null = null\n\n constructor(handle: SubprocessHandle) {\n super()\n if (handle.stdin === undefined || handle.stdout === undefined) {\n throw new Error('dsh-claude: managed Claude process requires piped stdin/stdout')\n }\n this.handle = handle\n this.stdin = handle.stdin\n this.stdout = handle.stdout\n void handle.done.then(\n outcome => {\n this.#exitCode = outcome.exitCode\n this.#signalCode = outcome.signal\n this.emit('exit', outcome.exitCode, outcome.signal)\n },\n error => {\n this.emit('error', error instanceof Error ? error : new Error(String(error)))\n },\n )\n }\n\n get killed(): boolean {\n return this.#killed\n }\n\n get exitCode(): number | null {\n return this.#exitCode\n }\n\n get signalCode(): NodeJS.Signals | null {\n return this.#signalCode\n }\n\n kill(signal: NodeJS.Signals): boolean {\n if (this.#exitCode !== null || this.#signalCode !== null) return false\n this.#killed = true\n this.handle.terminate()\n return true\n }\n\n stderrTail(): string {\n return this.handle.collected.stderr?.readFrom(0).text ?? ''\n }\n}\n\nexport type SpawnObserver = (process: ManagedClaudeProcess, options: SpawnOptions) => void\n\nexport function createManagedClaudeSpawner(\n runtime: Pick<SubprocessRuntime, 'spawn'>,\n executablePath: string,\n observe?: SpawnObserver,\n): (options: SpawnOptions) => SpawnedProcess {\n return options => {\n if (options.command !== executablePath) {\n throw new Error(`dsh-claude: SDK requested unexpected executable ${JSON.stringify(options.command)}`)\n }\n const handle = runtime.spawn({\n argv: [executablePath, ...options.args],\n cwd: options.cwd ?? process.cwd(),\n stdio: {\n stdin: 'pipe',\n stdout: 'pipe',\n stderr: { maxBytes: CLAUDE_STDERR_TAIL_BYTES },\n },\n graceMs: CLAUDE_PROCESS_GRACE_MS,\n signal: options.signal,\n env: scrubClaudeSpawnEnv(options.env),\n })\n const managed = new ManagedClaudeProcess(handle)\n observe?.(managed, options)\n return managed\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport {\n query as claudeQuery,\n type EffortLevel,\n type Options as ClaudeOptions,\n type PermissionMode,\n type Query,\n type SDKControlGetContextUsageResponse,\n type SDKMessage,\n type SDKUserMessage,\n type Settings as ClaudeSettings,\n type SlashCommand,\n} from '@anthropic-ai/claude-agent-sdk'\nimport type { Agent } from '@deepseek-ai/dsh-agent'\nimport { CallId, createToolResultMessage } from '@deepseek-ai/dsh-llm'\nimport type { ApprovalService } from '@deepseek-ai/dsh-user-approval'\nimport type { SubprocessRuntime } from '@deepseek-ai/dsh-subprocess'\nimport { AsyncQueue } from './async-queue.ts'\nimport { TASK_TOOL_NAMES } from './constants.ts'\nimport {\n currentClaudeActivityCursor,\n redactText,\n safeDetail,\n type ClaudeActivityCursor,\n type ClaudeActivityInput,\n type ClaudeTaskInfo,\n type ClaudeUsage,\n} from './events.ts'\nimport { createPermissionBridge } from './permission.ts'\nimport { ClaudeSidecarRepository } from './sidecar.ts'\nimport { CLAUDE_PRESENTER_NAMES, dynamicPresenterDefinition } from './presenters.ts'\nimport { normalizeSdkMessage, type NormalizedSdkMessage } from './sdk-messages.ts'\nimport { createManagedClaudeSpawner, type ManagedClaudeProcess } from './spawn.ts'\n\nexport const CLAUDE_INITIALIZATION_TIMEOUT_MS = 30_000\nexport const CLAUDE_INTERRUPT_TIMEOUT_MS = 5_000\n/** Control requests must settle; a wedged one must not clog the metadata chain. */\nexport const CLAUDE_METADATA_TIMEOUT_MS = 15_000\n\nexport type ClaudeSupervisorState =\n | 'starting'\n | 'idle'\n | 'running'\n | 'interrupting'\n | 'disconnected'\n | 'outcome-unknown'\n | 'disposed'\n\nexport interface ClaudeSupervisorConfig {\n executablePath: string\n idleTimeoutMs: number\n maxProcesses: number\n defaultModel: string\n}\n\nexport type ClaudeTurnStreamEvent =\n | { type: 'text-delta'; text: string }\n | { type: 'usage'; usage: ClaudeUsage }\n | { type: 'complete'; text: string }\n\nexport type ClaudeThinkingMode = 'off' | 'ultracode' | EffortLevel\n\nexport type DshSandboxMode = 'read-only' | 'workspace-write' | 'danger-full-access'\n\nconst CLAUDE_MODE_BY_SANDBOX: Readonly<Record<DshSandboxMode, PermissionMode>> = {\n 'read-only': 'plan',\n 'workspace-write': 'acceptEdits',\n 'danger-full-access': 'bypassPermissions',\n}\n\n/** Fold DSH's native access selector into Claude Code's closest permission mode. */\nexport function claudePermissionMode(events: readonly { type: string; data: unknown }[]): PermissionMode {\n for (let index = events.length - 1; index >= 0; index -= 1) {\n const event = events[index]\n if (event?.type !== 'sandbox/mode') continue\n const mode = (event.data as { mode?: unknown }).mode\n return typeof mode === 'string' && mode in CLAUDE_MODE_BY_SANDBOX\n ? CLAUDE_MODE_BY_SANDBOX[mode as DshSandboxMode]\n : 'plan'\n }\n return 'plan'\n}\n\nexport interface ClaudeTurnRequest {\n agent: Agent\n prompt: string\n model?: string\n thinkingMode?: ClaudeThinkingMode\n signal?: AbortSignal\n}\n\nexport interface ClaudeSupervisorSnapshot {\n sessionId: string\n claudeSessionId?: string\n state: ClaudeSupervisorState\n cwd: string\n model: string\n thinkingMode?: ClaudeThinkingMode\n lastUsedAt: number\n pid?: number\n}\n\nexport class ClaudeTurnBusyError extends Error {\n constructor(sessionId: string) {\n super(`Claude Code session ${sessionId} already has an active or interrupting turn`)\n this.name = 'ClaudeTurnBusyError'\n }\n}\n\nexport class ClaudeOutcomeUnknownError extends Error {\n constructor(message = 'Claude Code exited after activity; side-effect outcome is unknown and the prompt was not replayed') {\n super(message)\n this.name = 'ClaudeOutcomeUnknownError'\n }\n}\n\nexport class ClaudeProtocolError extends Error {\n constructor(message: string) {\n super(message)\n this.name = 'ClaudeProtocolError'\n }\n}\n\nexport class ClaudeProcessLimitError extends Error {\n constructor(maxProcesses: number) {\n super(`Claude Code process limit reached (${maxProcesses}) and no idle session can be evicted`)\n this.name = 'ClaudeProcessLimitError'\n }\n}\n\nexport type ClaudeQueryFactory = (params: {\n prompt: AsyncIterable<SDKUserMessage>\n options: ClaudeOptions\n}) => Query\n\ninterface ActiveTurn {\n agent: Agent\n cursor: ClaudeActivityCursor\n output: AsyncQueue<ClaudeTurnStreamEvent>\n promptUuid: ReturnType<typeof randomUUID>\n sawActivity: boolean\n sawTextDelta: boolean\n text: string\n thinking: string\n aborted: boolean\n deniedToolUseIds: Set<string>\n /** Root call names by toolUseId; tool results carry none of their own. */\n callNames: Map<string, string>\n signal?: AbortSignal\n abortListener?: () => void\n}\n\ninterface SupervisorEntry {\n sessionId: string\n ownerAgent: Agent\n cwd: string\n model: string\n thinkingMode: ClaudeThinkingMode | undefined\n permissionMode: PermissionMode\n state: ClaudeSupervisorState\n lastUsedAt: number\n input: AsyncQueue<SDKUserMessage>\n query: Query\n lifetime: AbortController\n process: ManagedClaudeProcess | undefined\n claudeSessionId: string | undefined\n active: ActiveTurn | undefined\n idleTimer: ReturnType<typeof setTimeout> | undefined\n initTimer: ReturnType<typeof setTimeout> | undefined\n initialized: boolean\n expectedResume: string | undefined\n /** Settled when init arrives; rejected on disconnect before init. */\n initWaiters: Array<(error: unknown) => void>\n /** Uuid of the startup handshake prompt; its local-command result is never a DSH turn outcome. */\n handshakeUuid: ReturnType<typeof randomUUID>\n /** True until the handshake's settlement arrives; its output is swallowed. */\n handshakePending: boolean\n /** Live Claude task board (subagents and background tasks), keyed by task id. */\n tasks: Map<string, ClaudeTaskInfo>\n /** Last time a task snapshot was persisted (progress throttling). */\n taskSnapshotAt: number\n /** Pending throttled snapshot flush timer. */\n taskSnapshotTimer: ReturnType<typeof setTimeout> | undefined\n pump: Promise<void>\n}\n\nfunction abortFailure(): Error {\n const error = new Error('Claude Code turn aborted')\n error.name = 'AbortError'\n return error\n}\n\nfunction signalAborted(signal: AbortSignal | undefined): boolean {\n return signal?.aborted === true\n}\n\nasync function withTimeout<T>(operation: Promise<T>, timeoutMs: number, label: string): Promise<T> {\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n return await Promise.race([\n operation,\n new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => reject(new Error(`${label} timed out after ${timeoutMs}ms`)), timeoutMs)\n timer.unref?.()\n }),\n ])\n } finally {\n if (timer !== undefined) clearTimeout(timer)\n }\n}\n\nfunction sdkUserMessage(prompt: string, uuid: ReturnType<typeof randomUUID>): SDKUserMessage {\n return {\n type: 'user',\n message: { role: 'user', content: prompt },\n parent_tool_use_id: null,\n uuid,\n }\n}\n\n/** CLI ≥ 2.1.235 emits system/init only after its first stdin input, while\n * the supervisor must see init before submitting any real turn. A local\n * slash command nudges startup without costing a model call; its lifecycle\n * messages are ignored because no DSH turn is active while they arrive. */\nconst CLAUDE_HANDSHAKE_PROMPT = '/status'\n\nfunction usageSummary(usage: ClaudeUsage): string {\n const input = usage.inputTokens ?? 0\n const output = usage.outputTokens ?? 0\n const cost = usage.cumulativeCostUsd === undefined\n ? ''\n : ` · $${usage.cumulativeCostUsd.toFixed(4)} cumulative`\n return `${input} input / ${output} output tokens${cost}`\n}\n\nfunction errorSummary(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\n/** Root-call activity summary; subagent dispatches lead with Claude's own task description. */\nfunction rootCallSummary(toolName: string, input: unknown): string {\n if (TASK_TOOL_NAMES.has(toolName)) {\n const description = input !== null && typeof input === 'object'\n ? (input as Record<string, unknown>).description\n : undefined\n if (typeof description === 'string' && description.length > 0) return description\n return 'Claude dispatched a subagent'\n }\n return `Claude called ${toolName}`\n}\n\nexport class ClaudeSupervisor {\n readonly #entries = new Map<string, SupervisorEntry>()\n readonly #runtime: Pick<SubprocessRuntime, 'spawn'>\n readonly #approval: Pick<ApprovalService, 'request'>\n readonly #config: ClaudeSupervisorConfig\n readonly #queryFactory: ClaudeQueryFactory\n readonly #runDetached: <T>(operation: () => T) => T\n readonly #sidecar: ClaudeSidecarRepository\n readonly #dynamicPresenterNames = new WeakMap<Agent, Set<string>>()\n readonly #contextWindows = new Map<string, number>()\n #disposed = false\n #admissionGate: Promise<void> = Promise.resolve()\n\n constructor(dependencies: {\n runtime: Pick<SubprocessRuntime, 'spawn'>\n approval: Pick<ApprovalService, 'request'>\n config: ClaudeSupervisorConfig\n queryFactory?: ClaudeQueryFactory\n runDetached?: <T>(operation: () => T) => T\n sidecar?: ClaudeSidecarRepository\n }) {\n this.#runtime = dependencies.runtime\n this.#approval = dependencies.approval\n this.#config = dependencies.config\n this.#queryFactory = dependencies.queryFactory ?? (params => claudeQuery(params))\n this.#runDetached = dependencies.runDetached ?? (operation => operation())\n this.#sidecar = dependencies.sidecar ?? new ClaudeSidecarRepository()\n }\n\n snapshots(): ClaudeSupervisorSnapshot[] {\n return [...this.#entries.values()].map(entry => ({\n sessionId: entry.sessionId,\n ...(entry.claudeSessionId === undefined ? {} : { claudeSessionId: entry.claudeSessionId }),\n state: entry.state,\n cwd: entry.cwd,\n model: entry.model,\n ...(entry.thinkingMode === undefined ? {} : { thinkingMode: entry.thinkingMode }),\n lastUsedAt: entry.lastUsedAt,\n ...(entry.process === undefined ? {} : { pid: entry.process.handle.pid }),\n }))\n }\n\n supportedCommands(agent: Agent, model = this.#config.defaultModel): Promise<readonly SlashCommand[]> {\n return this.#runMetadata(agent, model, query => query.supportedCommands())\n }\n\n async contextUsage(agent: Agent, model = this.#config.defaultModel): Promise<SDKControlGetContextUsageResponse> {\n const usage = await this.#runMetadata(agent, model, query => query.getContextUsage())\n const contextWindow = usage.rawMaxTokens > 0 ? usage.rawMaxTokens : usage.maxTokens\n if (contextWindow > 0) {\n this.#contextWindows.set(model, contextWindow)\n this.#contextWindows.set(usage.model, contextWindow)\n }\n return usage\n }\n\n contextWindow(model: string): number | undefined {\n return this.#contextWindows.get(model)\n }\n\n runTurn(request: ClaudeTurnRequest): Promise<AsyncIterable<ClaudeTurnStreamEvent>> {\n const operation = this.#admissionGate.then(() => this.#runTurnAdmitted(request))\n this.#admissionGate = operation.then(() => undefined, () => undefined)\n return operation\n }\n\n async #runTurnAdmitted(request: ClaudeTurnRequest): Promise<AsyncIterable<ClaudeTurnStreamEvent>> {\n if (this.#disposed) throw new Error('dsh-claude: supervisor is disposed')\n if (signalAborted(request.signal)) throw abortFailure()\n const sessionId = request.agent.id as string\n let entry = this.#entries.get(sessionId)\n if (entry?.state === 'disposed' || entry?.state === 'disconnected' || entry?.state === 'outcome-unknown') {\n this.#entries.delete(sessionId)\n await this.#disposeEntry(entry)\n entry = undefined\n }\n if (entry === undefined) {\n await this.#makeRoom()\n entry = await this.#createEntry(request.agent, request.model ?? this.#config.defaultModel, request.thinkingMode)\n this.#entries.set(sessionId, entry)\n this.#armInitializationTimer(entry)\n }\n if (entry.ownerAgent !== request.agent) {\n throw new Error(`dsh-claude: live agent identity changed for session ${sessionId}`)\n }\n if (entry.active !== undefined || entry.state === 'interrupting') throw new ClaudeTurnBusyError(sessionId)\n\n if (entry.idleTimer !== undefined) {\n clearTimeout(entry.idleTimer)\n entry.idleTimer = undefined\n }\n const model = request.model ?? this.#config.defaultModel\n if (request.thinkingMode !== entry.thinkingMode) {\n // The SDK only accepts effort/thinking at query start, so rebuild the\n // query; the persisted Claude session binding keeps the context.\n this.#entries.delete(sessionId)\n await this.#disposeEntry(entry)\n entry = await this.#createEntry(request.agent, model, request.thinkingMode)\n this.#entries.set(sessionId, entry)\n this.#armInitializationTimer(entry)\n } else {\n await this.#syncPermissionMode(entry)\n if (model !== entry.model) {\n await entry.query.setModel(model)\n entry.model = model\n }\n }\n\n const promptUuid = randomUUID()\n const cursor = currentClaudeActivityCursor(request.agent.session.events)\n const projection = await this.#sidecar.read(sessionId)\n cursor.nextOrdinal = projection.activities.reduce((next, activity) => (\n activity.turn === cursor.turn && activity.step === cursor.step\n ? Math.max(next, activity.ordinal + 1)\n : next\n ), 0)\n const active: ActiveTurn = {\n agent: request.agent,\n cursor,\n output: new AsyncQueue<ClaudeTurnStreamEvent>(),\n promptUuid,\n sawActivity: false,\n sawTextDelta: false,\n text: '',\n thinking: '',\n aborted: false,\n deniedToolUseIds: new Set(),\n callNames: new Map(),\n ...(request.signal === undefined ? {} : { signal: request.signal }),\n }\n entry.active = active\n entry.state = 'running'\n entry.lastUsedAt = Date.now()\n try {\n await this.#appendActivity(active, {\n kind: 'status',\n phase: 'started',\n title: 'Claude Code turn started',\n })\n } catch (error) {\n active.output.fail(error)\n entry.active = undefined\n if (this.#entries.get(sessionId) === entry) this.#entries.delete(sessionId)\n await this.#disposeEntry(entry)\n throw error\n }\n if (signalAborted(request.signal)) {\n active.aborted = true\n active.output.fail(abortFailure())\n await this.#appendActivity(active, {\n kind: 'status',\n phase: 'failed',\n title: 'Claude Code turn cancelled before submission',\n })\n entry.active = undefined\n entry.state = 'idle'\n entry.lastUsedAt = Date.now()\n this.#armIdleTimer(entry)\n return active.output\n }\n if (request.signal !== undefined) {\n const abortListener = () => { void this.#interrupt(entry as SupervisorEntry) }\n active.abortListener = abortListener\n request.signal.addEventListener('abort', abortListener, { once: true })\n }\n entry.input.push(sdkUserMessage(request.prompt, promptUuid))\n return active.output\n }\n\n #runMetadata<T>(\n agent: Agent,\n model: string,\n operation: (query: Query, entry: SupervisorEntry) => Promise<T>,\n ): Promise<T> {\n const admitted = this.#admissionGate.then(async () => {\n if (this.#disposed) throw new Error('dsh-claude: supervisor is disposed')\n const entry = await this.#metadataEntry(agent, model)\n try {\n // Control requests go out only after the CLI finishes initializing;\n // issued earlier they can wedge and clog the caller's refresh chain.\n await withTimeout(this.#whenInitialized(entry), CLAUDE_INITIALIZATION_TIMEOUT_MS, 'Claude metadata initialization')\n return await withTimeout(operation(entry.query, entry), CLAUDE_METADATA_TIMEOUT_MS, 'Claude metadata request')\n } finally {\n entry.lastUsedAt = Date.now()\n if (entry.active === undefined && entry.state === 'idle') this.#armIdleTimer(entry)\n }\n })\n this.#admissionGate = admitted.then(() => undefined, () => undefined)\n return admitted\n }\n\n #whenInitialized(entry: SupervisorEntry): Promise<void> {\n if (entry.initialized) return Promise.resolve()\n if (entry.state === 'disposed' || entry.state === 'disconnected' || entry.state === 'outcome-unknown') {\n return Promise.reject(new Error(`dsh-claude: session ${entry.sessionId} is ${entry.state}`))\n }\n return new Promise<void>((resolve, reject) => {\n entry.initWaiters.push(error => (error === undefined ? resolve() : reject(error instanceof Error ? error : new Error(String(error)))))\n })\n }\n\n async #metadataEntry(agent: Agent, model: string): Promise<SupervisorEntry> {\n const sessionId = agent.id as string\n let entry = this.#entries.get(sessionId)\n if (entry?.state === 'disposed' || entry?.state === 'disconnected' || entry?.state === 'outcome-unknown') {\n this.#entries.delete(sessionId)\n await this.#disposeEntry(entry)\n entry = undefined\n }\n if (entry === undefined) {\n await this.#makeRoom()\n entry = await this.#createEntry(agent, model)\n this.#entries.set(sessionId, entry)\n this.#armInitializationTimer(entry)\n }\n if (entry.ownerAgent !== agent) {\n throw new Error(`dsh-claude: live agent identity changed for session ${sessionId}`)\n }\n if (entry.active !== undefined || entry.state === 'interrupting') throw new ClaudeTurnBusyError(sessionId)\n if (entry.idleTimer !== undefined) {\n clearTimeout(entry.idleTimer)\n entry.idleTimer = undefined\n }\n await this.#syncPermissionMode(entry)\n if (model !== entry.model) {\n await entry.query.setModel(model)\n entry.model = model\n }\n return entry\n }\n\n async #syncPermissionMode(entry: SupervisorEntry): Promise<void> {\n const mode = claudePermissionMode(entry.ownerAgent.session.events)\n if (mode === entry.permissionMode) return\n await entry.query.setPermissionMode(mode)\n entry.permissionMode = mode\n }\n\n async disposeSession(sessionId: string): Promise<void> {\n const entry = this.#entries.get(sessionId)\n if (entry === undefined) return\n this.#entries.delete(sessionId)\n await this.#disposeEntry(entry)\n }\n\n async dispose(): Promise<void> {\n if (this.#disposed) return\n this.#disposed = true\n const entries = [...this.#entries.values()]\n this.#entries.clear()\n await Promise.allSettled(entries.map(entry => this.#disposeEntry(entry)))\n }\n\n async #makeRoom(): Promise<void> {\n if (this.#entries.size < this.#config.maxProcesses) return\n const idle = [...this.#entries.values()]\n .filter(entry => entry.active === undefined && entry.state === 'idle')\n .sort((left, right) => left.lastUsedAt - right.lastUsedAt)[0]\n if (idle === undefined) throw new ClaudeProcessLimitError(this.#config.maxProcesses)\n this.#entries.delete(idle.sessionId)\n await this.#disposeEntry(idle)\n }\n\n async #createEntry(agent: Agent, model: string, thinkingMode?: ClaudeThinkingMode): Promise<SupervisorEntry> {\n const sessionId = agent.id as string\n const cwd = agent.session.header.cwd ?? process.cwd()\n const input = new AsyncQueue<SDKUserMessage>()\n const lifetime = new AbortController()\n const projection = await this.#sidecar.importLegacy(sessionId, agent.session.events)\n const binding = projection.binding\n const permissionMode = claudePermissionMode(agent.session.events)\n const entry = {\n sessionId,\n ownerAgent: agent,\n cwd,\n model,\n thinkingMode,\n permissionMode,\n state: 'starting' as ClaudeSupervisorState,\n lastUsedAt: Date.now(),\n input,\n lifetime,\n claudeSessionId: binding?.claudeSessionId,\n expectedResume: binding?.claudeSessionId,\n handshakeUuid: randomUUID(),\n handshakePending: true,\n initialized: false,\n initWaiters: [] as Array<(error: unknown) => void>,\n initTimer: undefined,\n idleTimer: undefined,\n tasks: new Map<string, ClaudeTaskInfo>(),\n taskSnapshotAt: 0,\n taskSnapshotTimer: undefined,\n } as SupervisorEntry\n\n const canUseTool = createPermissionBridge(this.#approval, () => {\n const active = entry.active\n return active === undefined ? undefined : {\n agent: active.agent,\n cursor: active.cursor,\n markActivity: () => { active.sawActivity = true },\n recordDenial: toolUseId => { active.deniedToolUseIds.add(toolUseId) },\n appendActivity: activity => this.#appendActivity(active, activity),\n }\n })\n const options: ClaudeOptions = {\n pathToClaudeCodeExecutable: this.#config.executablePath,\n cwd,\n settingSources: ['user', 'project', 'local'],\n systemPrompt: { type: 'preset', preset: 'claude_code' },\n tools: { type: 'preset', preset: 'claude_code' },\n includePartialMessages: true,\n permissionMode,\n allowDangerouslySkipPermissions: true,\n canUseTool,\n abortController: lifetime,\n spawnClaudeCodeProcess: createManagedClaudeSpawner(this.#runtime, this.#config.executablePath, process => {\n entry.process = process\n }),\n ...(binding === undefined ? {} : { resume: binding.claudeSessionId }),\n model,\n ...(thinkingMode === undefined\n ? {}\n : thinkingMode === 'off'\n ? { thinking: { type: 'disabled' } as const }\n : thinkingMode === 'ultracode'\n ? { settings: { ultracode: true } satisfies ClaudeSettings }\n : { effort: thinkingMode }),\n }\n entry.query = this.#queryFactory({ prompt: input, options })\n entry.input.push(sdkUserMessage(CLAUDE_HANDSHAKE_PROMPT, entry.handshakeUuid))\n entry.pump = this.#runDetached(() => this.#pump(entry))\n return entry\n }\n\n async #pump(entry: SupervisorEntry): Promise<void> {\n try {\n for await (const sdkMessage of entry.query) {\n for (const message of normalizeSdkMessage(sdkMessage as SDKMessage)) {\n await this.#handleMessage(entry, message)\n }\n }\n if (entry.state !== 'disposed') await this.#handleDisconnect(entry, new Error('Claude Code stream ended'))\n } catch (error) {\n if (entry.state !== 'disposed') await this.#handleDisconnect(entry, error)\n }\n }\n\n async #handleMessage(entry: SupervisorEntry, message: NormalizedSdkMessage): Promise<void> {\n if (message.kind === 'init') {\n // Claude Code can re-emit system/init across turns in long-lived\n // streaming-input mode (e.g. the auth-error path). Treat it idempotently:\n // refresh the session id/version and negotiated state, and only reject a\n // genuine identity/cwd mismatch.\n if (entry.expectedResume !== undefined && message.sessionId !== entry.expectedResume) {\n throw new ClaudeProtocolError(`Claude Code resumed unexpected session ${message.sessionId}; expected ${entry.expectedResume}`)\n }\n if (message.cwd !== entry.cwd) {\n throw new ClaudeProtocolError(`Claude Code initialized in unexpected cwd ${message.cwd}; expected ${entry.cwd}`)\n }\n if (entry.initTimer !== undefined) {\n clearTimeout(entry.initTimer)\n entry.initTimer = undefined\n }\n entry.initialized = true\n entry.claudeSessionId = message.sessionId\n entry.state = entry.active === undefined ? 'idle' : 'running'\n for (const waiter of entry.initWaiters.splice(0)) waiter(undefined)\n // The SDK emits no background-task level at startup; reset the board on\n // every (re)start and let membership changes repopulate it.\n if (entry.tasks.size > 0) {\n entry.tasks.clear()\n await this.#flushTasksSnapshot(entry)\n }\n await this.#sidecar.writeBinding(entry.sessionId, {\n claudeSessionId: message.sessionId,\n cliVersion: message.cliVersion,\n cwd: message.cwd,\n })\n return\n }\n\n // Task lifecycle is session-scoped, not turn-scoped: background tasks and\n // subagents settle while no DSH turn is active, and their notifications\n // must still reach the task board instead of being dropped with turn-less\n // messages below.\n const taskId = message.kind === 'subagent' ? message.taskId : undefined\n if (message.kind === 'subagent' && taskId !== undefined) {\n await this.#trackTask(entry, message, taskId, entry.active?.cursor.turn)\n } else if (message.kind === 'background-tasks') {\n this.#trackBackgroundLevel(entry, message.tasks, entry.active?.cursor.turn)\n }\n\n if (entry.handshakePending) {\n // Startup-handshake output of the local `/status` nudge: never part of\n // any DSH turn. Protocol failures stay loud; the settlement clears the\n // phase so subsequent messages belong to real turns.\n if (message.kind === 'protocol-error') {\n throw new ClaudeProtocolError(`${message.title}: ${JSON.stringify(message.detail).slice(0, 1_000)}`)\n }\n if (message.kind === 'result') entry.handshakePending = false\n return\n }\n\n const active = entry.active\n if (active === undefined) return\n if (message.kind === 'result') {\n if (message.userMessageUuid !== undefined && message.userMessageUuid === entry.handshakeUuid) {\n // Startup handshake settlement; never a DSH turn outcome.\n return\n }\n if (entry.claudeSessionId === undefined) {\n throw new ClaudeProtocolError('Claude Code sent a result before initialization')\n }\n if (message.sessionId !== entry.claudeSessionId) {\n throw new ClaudeProtocolError(`Claude Code result session ${message.sessionId} does not match ${entry.claudeSessionId}`)\n }\n if (message.userMessageUuid !== undefined && message.userMessageUuid !== active.promptUuid) {\n throw new ClaudeProtocolError(`Claude Code result for user message ${message.userMessageUuid} does not match active request ${active.promptUuid}`)\n }\n await this.#completeTurn(entry, active, message)\n return\n }\n if (message.kind === 'protocol-error') {\n throw new ClaudeProtocolError(`${message.title}: ${JSON.stringify(message.detail).slice(0, 1_000)}`)\n }\n active.sawActivity = true\n\n switch (message.kind) {\n case 'text-delta':\n if (message.parentToolUseId !== undefined) return\n active.sawTextDelta = true\n active.text += message.text\n active.output.push({ type: 'text-delta', text: message.text })\n return\n case 'assistant-text':\n if (message.parentToolUseId !== undefined) return\n if (!active.sawTextDelta) {\n // Complete assistant text is the fallback when no partial text delta\n // streamed. Mark text-delta seen so that additional complete\n // assistant records sharing the same message.id (one per completed\n // content block) do not duplicate the text.\n active.sawTextDelta = true\n active.text += message.text\n active.output.push({ type: 'text-delta', text: message.text })\n }\n return\n case 'thinking':\n if (message.parentToolUseId !== undefined) return\n if (message.phase === 'updated') {\n active.thinking += message.text\n return\n }\n active.thinking = message.text\n await this.#appendActivity(active, {\n kind: 'thinking',\n phase: 'completed',\n title: 'Claude thinking',\n summary: message.text,\n })\n return\n case 'tool-call':\n await this.#appendActivity(active, {\n kind: message.parentToolUseId === undefined ? 'tool-call' : 'subagent',\n phase: 'started',\n toolUseId: message.toolUseId,\n ...(message.parentToolUseId === undefined ? {} : { parentToolUseId: message.parentToolUseId }),\n toolName: message.toolName,\n title: message.toolName,\n summary: message.parentToolUseId === undefined ? rootCallSummary(message.toolName, message.input) : `Subagent called ${message.toolName}`,\n detail: message.input,\n })\n if (message.parentToolUseId === undefined) {\n active.callNames.set(message.toolUseId, message.toolName)\n this.#ensureDynamicPresenter(active.agent, message.toolName)\n // Task dispatches render as plugin-owned group cards gathering the\n // subagents' nested work; only ordinary tools mirror natively.\n if (!TASK_TOOL_NAMES.has(message.toolName)) await this.#appendNativeToolCall(active, message)\n }\n return\n case 'tool-result':\n await this.#appendActivity(active, {\n kind: message.parentToolUseId === undefined ? 'tool-result' : 'subagent',\n phase: message.isError ? 'failed' : 'completed',\n toolUseId: message.toolUseId,\n ...(message.parentToolUseId === undefined ? {} : { parentToolUseId: message.parentToolUseId }),\n title: message.isError ? 'Tool failed' : 'Tool completed',\n detail: message.output,\n isError: message.isError,\n })\n if (message.parentToolUseId === undefined\n && !TASK_TOOL_NAMES.has(active.callNames.get(message.toolUseId) ?? '')) {\n await this.#appendNativeToolResult(active, message)\n }\n return\n case 'subagent':\n await this.#appendActivity(active, {\n kind: 'subagent',\n phase: message.phase,\n ...(message.taskId === undefined ? {} : { taskId: message.taskId }),\n title: message.title,\n summary: message.summary,\n detail: message.detail,\n isError: message.phase === 'failed',\n })\n return\n case 'status':\n case 'warning':\n case 'unknown':\n await this.#appendActivity(active, {\n kind: message.kind === 'status' ? 'status' : 'warning',\n phase: 'updated',\n title: message.title,\n ...('summary' in message ? { summary: message.summary } : {}),\n ...('detail' in message ? { detail: message.detail } : {}),\n })\n return\n case 'permission-denied':\n await this.#appendActivity(active, {\n kind: 'permission',\n phase: 'denied',\n toolUseId: message.toolUseId,\n toolName: message.toolName,\n title: message.toolName,\n summary: message.summary,\n })\n return\n }\n }\n\n /** Merge one task lifecycle message into the session's task board. */\n async #trackTask(\n entry: SupervisorEntry,\n message: Extract<NormalizedSdkMessage, { kind: 'subagent' }>,\n taskId: string,\n originTurn: number | undefined,\n ): Promise<void> {\n const previous = entry.tasks.get(taskId)\n const next: ClaudeTaskInfo = {\n taskId,\n description: message.description ?? previous?.description ?? message.title,\n status: message.taskStatus ?? previous?.status ?? 'running',\n }\n const resolvedOriginTurn = previous?.originTurn ?? originTurn\n if (resolvedOriginTurn !== undefined) next.originTurn = resolvedOriginTurn\n const subagentType = message.subagentType ?? previous?.subagentType\n if (subagentType !== undefined) next.subagentType = subagentType\n const taskType = message.taskType ?? previous?.taskType\n if (taskType !== undefined) next.taskType = taskType\n const lastToolName = message.lastToolName ?? previous?.lastToolName\n if (lastToolName !== undefined) next.lastToolName = lastToolName\n const summary = message.summary ?? previous?.summary\n if (summary !== undefined) next.summary = summary\n const usage = message.usage ?? previous?.usage\n if (usage !== undefined) next.usage = usage\n if (previous?.backgrounded === true) next.backgrounded = true\n entry.tasks.set(taskId, next)\n const settled = next.status !== 'running'\n await this.#scheduleTasksSnapshot(entry, settled)\n }\n\n /** Fold the background-task level signal into the board (REPLACE semantics\n * for the backgrounded flag: only the listed tasks are detached). */\n #trackBackgroundLevel(\n entry: SupervisorEntry,\n tasks: readonly { taskId: string; taskType?: string; description: string }[],\n originTurn: number | undefined,\n ): void {\n const live = new Set(tasks.map(task => task.taskId))\n let changed = false\n for (const task of tasks) {\n const existing = entry.tasks.get(task.taskId)\n if (existing === undefined) {\n entry.tasks.set(task.taskId, {\n taskId: task.taskId,\n description: task.description,\n status: 'running',\n ...(originTurn === undefined ? {} : { originTurn }),\n ...(task.taskType === undefined ? {} : { taskType: task.taskType }),\n backgrounded: true,\n })\n changed = true\n } else if (existing.backgrounded !== true || existing.status !== 'running') {\n entry.tasks.set(task.taskId, { ...existing, status: 'running', backgrounded: true })\n changed = true\n }\n }\n for (const task of entry.tasks.values()) {\n if (task.backgrounded === true && task.status === 'running' && !live.has(task.taskId)) {\n entry.tasks.set(task.taskId, { ...task, status: 'completed' })\n changed = true\n }\n }\n if (changed) void this.#scheduleTasksSnapshot(entry, true)\n }\n\n /** Persist the task board. Settled transitions flush immediately; progress\n * ticks throttle to one snapshot per second to bound log volume. */\n async #scheduleTasksSnapshot(entry: SupervisorEntry, immediate: boolean): Promise<void> {\n const THROTTLE_MS = 1_000\n const elapsed = Date.now() - entry.taskSnapshotAt\n if (!immediate && elapsed < THROTTLE_MS) {\n if (entry.taskSnapshotTimer === undefined) {\n entry.taskSnapshotTimer = setTimeout(() => {\n entry.taskSnapshotTimer = undefined\n void this.#flushTasksSnapshot(entry)\n }, THROTTLE_MS - elapsed)\n entry.taskSnapshotTimer.unref?.()\n }\n return\n }\n await this.#flushTasksSnapshot(entry)\n }\n\n async #flushTasksSnapshot(entry: SupervisorEntry): Promise<void> {\n if (entry.taskSnapshotTimer !== undefined) {\n clearTimeout(entry.taskSnapshotTimer)\n entry.taskSnapshotTimer = undefined\n }\n entry.taskSnapshotAt = Date.now()\n // Snapshot persistence is best-effort: the in-memory board stays\n // authoritative and the next change re-flushes.\n await this.#sidecar.writeTasks(entry.sessionId, [...entry.tasks.values()]).catch(() => undefined)\n }\n\n async #completeTurn(\n entry: SupervisorEntry,\n active: ActiveTurn,\n result: Extract<NormalizedSdkMessage, { kind: 'result' }>,\n ): Promise<void> {\n if (entry.active !== active) return\n if (active.signal !== undefined && active.abortListener !== undefined) {\n active.signal.removeEventListener('abort', active.abortListener)\n }\n if (active.aborted) {\n await this.#appendSafely(active, {\n kind: 'status',\n phase: 'failed',\n title: 'Claude Code turn cancelled',\n })\n entry.active = undefined\n entry.state = 'idle'\n entry.lastUsedAt = Date.now()\n this.#armIdleTimer(entry)\n return\n }\n if (result.usage.inputTokens !== undefined || result.usage.outputTokens !== undefined || result.usage.cumulativeCostUsd !== undefined) {\n await this.#appendSafely(active, {\n kind: 'usage',\n phase: 'completed',\n title: 'Claude usage',\n summary: usageSummary(result.usage),\n usage: result.usage,\n })\n active.output.push({ type: 'usage', usage: result.usage })\n }\n const unmatchedDenials = (result.permissionDenials ?? [])\n .filter(denial => !active.deniedToolUseIds.has(denial.toolUseId))\n if (unmatchedDenials.length > 0) {\n await this.#appendSafely(active, {\n kind: 'permission',\n phase: 'denied',\n title: 'Claude Code auto-denied tool calls',\n summary: unmatchedDenials.map(denial => denial.toolName).join(', '),\n })\n }\n if (!result.success) {\n const message = result.errors?.join('\\n')\n ?? (result.terminalReason !== undefined ? `Claude Code failed the turn (${result.terminalReason})` : 'Claude Code failed the turn')\n await this.#appendSafely(active, {\n kind: 'error',\n phase: 'failed',\n title: 'Claude Code turn failed',\n summary: message,\n isError: true,\n })\n active.output.fail(new Error(message))\n } else {\n if (!active.sawTextDelta && active.text.length === 0 && result.text !== undefined) {\n active.text = result.text\n active.output.push({ type: 'text-delta', text: result.text })\n }\n await this.#appendSafely(active, {\n kind: 'status',\n phase: 'completed',\n title: 'Claude Code turn completed',\n })\n active.output.push({ type: 'complete', text: active.text })\n active.output.close()\n }\n entry.active = undefined\n entry.state = 'idle'\n entry.lastUsedAt = Date.now()\n this.#armIdleTimer(entry)\n }\n\n async #appendActivity(active: ActiveTurn, activity: ClaudeActivityInput): Promise<void> {\n const ordinal = active.cursor.nextOrdinal++\n await this.#sidecar.appendActivity(active.agent.id as string, {\n ...activity,\n turn: active.cursor.turn,\n step: active.cursor.step,\n ordinal,\n })\n }\n\n /** Persist durable activity without letting a storage failure unsettle the\n * in-memory turn or leak process ownership. Audit failure is best-effort. */\n async #appendSafely(active: ActiveTurn, activity: ClaudeActivityInput): Promise<void> {\n await this.#appendActivity(active, activity).catch(() => undefined)\n }\n\n /** Register one presenter-only mirror for a tool name the static preset\n * registry does not cover (MCP tools, newly added built-ins). Runs in the\n * agent scope so the mirror is visible only to this preset's sessions and\n * unwinds with the agent; failure keeps the generic card, never the turn. */\n #ensureDynamicPresenter(agent: Agent, name: string): void {\n if (CLAUDE_PRESENTER_NAMES.has(name)) return\n let known = this.#dynamicPresenterNames.get(agent)\n if (known === undefined) {\n known = new Set<string>()\n this.#dynamicPresenterNames.set(agent, known)\n }\n if (known.has(name)) return\n try {\n agent.ctx.tools.register(dynamicPresenterDefinition(name))\n known.add(name)\n } catch {\n // A late or disposed agent keeps the generic card; presentation must\n // never unsettle the Claude turn.\n }\n }\n\n /** Mirror one root Claude tool call into the durable native tool channel so\n * the host's tool presentation renders it exactly like a DSH-executed call.\n * Presentation duplication is best-effort and never unsettles the turn. */\n async #appendNativeToolCall(\n active: ActiveTurn,\n message: Extract<NormalizedSdkMessage, { kind: 'tool-call' }>,\n ): Promise<void> {\n try {\n await active.agent.session.append('tool/call', {\n turn: active.cursor.turn,\n step: active.cursor.step,\n callId: CallId(message.toolUseId),\n name: message.toolName,\n arguments: safeDetail(message.input) ?? '{}',\n })\n } catch {\n // Presentation duplication must never unsettle the Claude turn.\n }\n }\n\n async #appendNativeToolResult(\n active: ActiveTurn,\n message: Extract<NormalizedSdkMessage, { kind: 'tool-result' }>,\n ): Promise<void> {\n const text = typeof message.output === 'string' ? redactText(message.output) : safeDetail(message.output) ?? ''\n try {\n await active.agent.session.append('tool/result', {\n turn: active.cursor.turn,\n step: active.cursor.step,\n message: createToolResultMessage({\n callId: CallId(message.toolUseId),\n content: [{ type: 'text', text }],\n isError: message.isError,\n }),\n }, { surfaceOp: 'append' })\n } catch {\n // Presentation duplication must never unsettle the Claude turn.\n }\n }\n\n async #interrupt(entry: SupervisorEntry): Promise<void> {\n const active = entry.active\n if (active === undefined || entry.state === 'interrupting') return\n entry.state = 'interrupting'\n active.aborted = true\n active.output.fail(abortFailure())\n let interruptError: unknown\n try {\n const receipt = await withTimeout(entry.query.interrupt(), CLAUDE_INTERRUPT_TIMEOUT_MS, 'Claude Code interrupt')\n const queued = receipt?.still_queued ?? []\n if (queued.includes(active.promptUuid)) {\n throw new Error(`Claude Code interrupt left submitted prompt ${active.promptUuid} queued`)\n }\n } catch (error) {\n interruptError = error\n }\n try {\n await this.#appendActivity(active, {\n kind: 'status',\n phase: 'failed',\n title: interruptError === undefined ? 'Claude Code turn cancelled' : 'Claude Code cancelled; process entry reset',\n ...(interruptError === undefined ? {} : { summary: errorSummary(interruptError) }),\n })\n } catch {\n // The active output is already aborted; process cleanup cannot wait for audit availability.\n }\n if (this.#entries.get(entry.sessionId) === entry) this.#entries.delete(entry.sessionId)\n await this.#disposeEntry(entry)\n }\n\n async #handleDisconnect(entry: SupervisorEntry, error: unknown): Promise<void> {\n const active = entry.active\n const stderr = entry.process?.stderrTail()\n if (active !== undefined) {\n if (active.signal !== undefined && active.abortListener !== undefined) {\n active.signal.removeEventListener('abort', active.abortListener)\n }\n const unknown = active.sawActivity\n entry.state = unknown ? 'outcome-unknown' : 'disconnected'\n const failure = unknown\n ? new ClaudeOutcomeUnknownError(stderr === undefined || stderr.length === 0 ? undefined : `Claude Code exited after activity; outcome unknown. ${stderr}`)\n : new Error(stderr === undefined || stderr.length === 0 ? errorSummary(error) : stderr)\n await this.#appendSafely(active, {\n kind: 'error',\n phase: 'failed',\n title: unknown ? 'Claude Code outcome unknown' : 'Claude Code disconnected',\n summary: failure.message,\n isError: true,\n detail: error,\n })\n active.output.fail(failure)\n entry.active = undefined\n } else {\n entry.state = 'disconnected'\n }\n const waiters = entry.initWaiters.splice(0)\n const waiterError = error instanceof Error ? error : new Error(String(error))\n for (const waiter of waiters) waiter(waiterError)\n this.#entries.delete(entry.sessionId)\n await this.#disposeEntry(entry)\n }\n\n #armInitializationTimer(entry: SupervisorEntry): void {\n const timer = setTimeout(() => {\n if (entry.state !== 'starting' || entry.initialized) return\n void this.#handleDisconnect(entry, new Error('Claude Code initialization timed out'))\n }, CLAUDE_INITIALIZATION_TIMEOUT_MS)\n timer.unref?.()\n entry.initTimer = timer\n }\n\n #armIdleTimer(entry: SupervisorEntry): void {\n if (this.#config.idleTimeoutMs <= 0) return\n const timer = setTimeout(() => {\n if (entry.active !== undefined || entry.state !== 'idle') return\n this.#entries.delete(entry.sessionId)\n void this.#disposeEntry(entry)\n }, this.#config.idleTimeoutMs)\n timer.unref?.()\n entry.idleTimer = timer\n }\n\n async #disposeEntry(entry: SupervisorEntry): Promise<void> {\n if (entry.state === 'disposed') return\n if (entry.idleTimer !== undefined) clearTimeout(entry.idleTimer)\n if (entry.initTimer !== undefined) clearTimeout(entry.initTimer)\n entry.state = 'disposed'\n entry.input.discard(abortFailure())\n entry.query.close()\n entry.lifetime.abort()\n if (entry.active !== undefined) entry.active.output.fail(abortFailure())\n entry.process?.kill('SIGTERM')\n if (entry.process !== undefined) {\n try {\n await entry.process.handle.waitForExit(AbortSignal.timeout(5_000))\n } catch {\n // The DSH subprocess owner still holds the tree and will finish escalation.\n }\n }\n }\n}\n","import {\n LlmAdapter,\n ReasoningEffortId,\n type GenerateOptions,\n type LlmModelInfo,\n type LlmProviderInfo,\n type LlmResolvedModelInfo,\n type ResolvedRetryPolicy,\n type StreamChunk,\n type TokenUsage,\n} from '@deepseek-ai/dsh-llm'\nimport type { Agent, AgentRegistry } from '@deepseek-ai/dsh-agent'\nimport { CLAUDE_CODE_PRESET_ID, CLAUDE_CODE_PROVIDER, isClaudePresetId } from './constants.ts'\nimport type { ClaudeSupervisor, ClaudeThinkingMode } from './supervisor.ts'\nimport type { ClaudeUsage } from './events.ts'\n\nconst MODELS = [\n { id: 'default', name: 'Default (recommended)', description: 'Use Claude Code’s recommended default model.' },\n { id: 'opus[1m]', name: 'Opus (1M context)', description: 'Use Opus with a 1M-token context window.', contextWindow: 1_000_000 },\n { id: 'fable', name: 'Fable', description: 'Use Fable, Claude Code’s most capable coding model.' },\n { id: 'sonnet', name: 'Sonnet', description: 'Use Sonnet for efficient routine coding work.' },\n { id: 'haiku', name: 'Haiku', description: 'Use Haiku for fast, lightweight tasks.' },\n] as const\n\nconst THINKING_MODES = [\n { id: 'off', name: 'Off', description: 'No extended thinking.' },\n { id: 'low', name: 'Low', description: 'Minimal thinking, fastest responses.' },\n { id: 'medium', name: 'Medium', description: 'Moderate thinking.' },\n { id: 'high', name: 'High', description: 'Deep reasoning (Claude Code default).' },\n { id: 'xhigh', name: 'Extra High', description: 'Deeper than high; unsupported models silently downgrade to high.' },\n { id: 'max', name: 'Max', description: 'Maximum effort; unsupported models silently downgrade.' },\n { id: 'ultracode', name: 'Ultracode', description: 'Extra-high effort plus standing dynamic-workflow orchestration; requires an xhigh-capable model.' },\n] as const\n\nexport function thinkingModeFor(effort: ReasoningEffortId | undefined): ClaudeThinkingMode | undefined {\n if (effort === undefined) return undefined\n if (THINKING_MODES.some(mode => mode.id === (effort as string))) return effort as unknown as ClaudeThinkingMode\n throw new Error(`dsh-claude: unsupported reasoning effort ${JSON.stringify(effort)}`)\n}\n\nconst NO_RETRY_POLICY: ResolvedRetryPolicy = Object.freeze({\n mode: 'normal',\n maxRetries: 0,\n retryableCodes: Object.freeze([]),\n initialDelayMs: 500,\n maxDelayMs: 10_000,\n jitterRatio: 0.1,\n})\n\nexport function extractDirectUserText(messages: GenerateOptions['messages']): string {\n for (let index = messages.length - 1; index >= 0; index -= 1) {\n const message = messages[index]\n if (message?.role !== 'user' || message.source.kind !== 'user') continue\n const text = message.content\n .filter((block): block is Extract<typeof block, { type: 'text' }> => block.type === 'text')\n .map(block => block.text)\n .join('\\n')\n .trim()\n if (text.length > 0) return text\n if (message.content.some(block => block.type === 'image')) {\n throw new Error('dsh-claude: image-only prompts are not supported in v0.1; include a text prompt')\n }\n }\n throw new Error('dsh-claude: no direct human text was present in this model step')\n}\n\nfunction tokenUsage(usage: ClaudeUsage): TokenUsage {\n const normalized: TokenUsage = {\n inputTokens: usage.inputTokens ?? 0,\n outputTokens: usage.outputTokens ?? 0,\n }\n if (usage.cacheReadTokens !== undefined) normalized.cacheReadTokens = usage.cacheReadTokens\n if (usage.cacheCreationTokens !== undefined) normalized.cacheWriteTokens = usage.cacheCreationTokens\n return normalized\n}\n\nfunction resolveAgent(agents: Pick<AgentRegistry, 'currentInitiator' | 'get'>, options: GenerateOptions): Agent {\n const initiator = agents.currentInitiator()\n if (initiator !== undefined) return initiator\n if (options.sessionId !== undefined) {\n const agent = agents.get(options.sessionId)\n if (agent !== undefined) return agent\n }\n throw new Error('dsh-claude: the model request has no live owning DSH agent')\n}\n\nexport class ClaudeCodeAdapter extends LlmAdapter {\n readonly #supervisor: ClaudeSupervisor\n readonly #agents: Pick<AgentRegistry, 'currentInitiator' | 'get'>\n readonly #presetIdFor: (agent: Agent) => string | undefined\n\n constructor(\n supervisor: ClaudeSupervisor,\n agents: Pick<AgentRegistry, 'currentInitiator' | 'get'>,\n presetIdFor: (agent: Agent) => string | undefined,\n ) {\n super()\n this.#supervisor = supervisor\n this.#agents = agents\n this.#presetIdFor = presetIdFor\n }\n\n override providerInfo(provider: string): LlmProviderInfo {\n return { id: provider, name: 'Claude Code' }\n }\n\n override providerRetryPolicy(): ResolvedRetryPolicy {\n return NO_RETRY_POLICY\n }\n\n override async listModels(): Promise<readonly LlmModelInfo[]> {\n return MODELS.map(model => ({\n provider: CLAUDE_CODE_PROVIDER,\n id: model.id,\n name: model.name,\n description: model.description,\n inputModalities: ['text'],\n }))\n }\n\n override async resolveModel(provider: string, model: string): Promise<LlmResolvedModelInfo> {\n const known = MODELS.find(item => item.id === model)\n const observedContextWindow = this.#supervisor.contextWindow(model)\n const contextWindow = observedContextWindow ?? (known !== undefined && 'contextWindow' in known ? known.contextWindow : undefined)\n return {\n provider,\n id: model,\n name: known?.name ?? `Claude Code ${model}`,\n ...(known === undefined ? {} : { description: known.description }),\n ...(contextWindow === undefined ? {} : { context: { contextWindow } }),\n inputModalities: ['text'],\n reasoning: {\n efforts: THINKING_MODES.map(mode => ({\n id: ReasoningEffortId(mode.id),\n name: mode.name,\n description: mode.description,\n })),\n },\n }\n }\n\n override async *stream(options: GenerateOptions): AsyncIterable<StreamChunk> {\n if (options.purpose !== undefined) {\n throw new Error(`dsh-claude: auxiliary ${options.purpose} calls are not routed into the Claude session`)\n }\n const agent = resolveAgent(this.#agents, options)\n if (!isClaudePresetId(this.#presetIdFor(agent))) {\n throw new Error(`dsh-claude: provider ${CLAUDE_CODE_PROVIDER} is available only to the ${CLAUDE_CODE_PRESET_ID} preset`)\n }\n const thinkingMode = thinkingModeFor(options.reasoningEffort)\n const prompt = extractDirectUserText(options.messages)\n const events = await this.#supervisor.runTurn({\n agent,\n prompt,\n model: options.model,\n ...(thinkingMode === undefined ? {} : { thinkingMode }),\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n })\n\n let text = ''\n let pendingUsage: TokenUsage | undefined\n let completed = false\n try {\n for await (const event of events) {\n if (event.type === 'text-delta') {\n // Buffered, not live-streamed: Claude's intermediate prose and final\n // answer settle as one block at the turn's durable position, below\n // the step's mirrored tool cards, instead of jumping there at the end.\n text += event.text\n } else if (event.type === 'usage') {\n pendingUsage = tokenUsage(event.usage)\n } else {\n completed = true\n if (text.length > 0) {\n yield { type: 'block-start', index: 0, blockType: 'text' }\n yield { type: 'text-delta', index: 0, text }\n yield { type: 'block-end', index: 0, block: { type: 'text', text } }\n }\n if (pendingUsage !== undefined) yield { type: 'usage', usage: pendingUsage }\n yield { type: 'finish', reason: { kind: 'stop' } }\n }\n }\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n completed = true\n if (text.length > 0) {\n yield { type: 'block-start', index: 0, blockType: 'text' }\n yield { type: 'text-delta', index: 0, text }\n yield { type: 'block-end', index: 0, block: { type: 'text', text } }\n }\n yield {\n type: 'finish',\n reason: {\n kind: 'aborted',\n failure: { code: 'aborted', message: error instanceof Error ? error.message : 'Claude Code turn aborted' },\n },\n }\n return\n }\n throw error\n }\n if (!completed) throw new Error('dsh-claude: Claude turn stream ended without a result')\n }\n}\n\nexport function createClaudeCodeAdapter(\n supervisor: ClaudeSupervisor,\n agents: Pick<AgentRegistry, 'currentInitiator' | 'get'>,\n presetIdFor: (agent: Agent) => string | undefined,\n): ClaudeCodeAdapter {\n return new ClaudeCodeAdapter(supervisor, agents, presetIdFor)\n}\n","import type { IncomingMessage, ServerResponse } from 'node:http'\n\n/** Accept only loopback, same-origin browser requests to plugin-private routes. */\nexport function trustedRequest(req: IncomingMessage): boolean {\n const remote = req.socket.remoteAddress\n if (remote !== '127.0.0.1' && remote !== '::1' && remote !== '::ffff:127.0.0.1') return false\n const site = req.headers['sec-fetch-site']\n if (site === 'cross-site') return false\n const host = req.headers.host\n if (host === undefined) return false\n const authority = /^(?:127\\.0\\.0\\.1|\\[?::1\\]?|localhost)(?::\\d+)?$/i\n if (!authority.test(host)) return false\n const origin = req.headers.origin\n if (origin === undefined) return true\n try {\n const originUrl = new URL(origin)\n return originUrl.host === host && authority.test(originUrl.host)\n } catch {\n return false\n }\n}\n\n/** Send a non-cacheable JSON response with MIME sniffing disabled. */\nexport function json(res: ServerResponse, status: number, value: unknown): void {\n res.writeHead(status, {\n 'content-type': 'application/json; charset=utf-8',\n 'cache-control': 'no-store',\n 'x-content-type-options': 'nosniff',\n })\n res.end(JSON.stringify(value))\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport type { Agent } from '@deepseek-ai/dsh-agent'\nimport type {} from '@deepseek-ai/dsh-agent-presets'\nimport type {} from '@deepseek-ai/dsh-commands'\nimport type {} from '@deepseek-ai/dsh-host-webserver'\nimport { CLAUDE_DOCTOR_PATH } from './constants.ts'\nimport { runClaudeDoctor, type ExecutableRuntime } from './executable.ts'\nimport type { ClaudeSupervisor, ClaudeSupervisorConfig } from './supervisor.ts'\nimport { redactText } from './events.ts'\nimport { json, trustedRequest } from './http.ts'\n\nexport const CLAUDE_DOCTOR_PROBE_TIMEOUT_MS = 15_000\n\n/** Live metadata-bridge state per agent, maintained by the host plugin. */\nexport interface ClaudeBridgeDiagnostic {\n attempts: number\n lastError?: string\n lastCatalog?: number\n registered?: string[]\n}\n\nexport const claudeBridgeDiagnostics = new WeakMap<Agent, ClaudeBridgeDiagnostic>()\n\nfunction safeMessage(error: unknown): string {\n return redactText(error instanceof Error ? error.message : String(error), 1_000)\n}\n\n/** Live command-bridge diagnostics: which agents exist, their presets, and how\n * many slash commands each agent's registry layer resolves. */\nfunction commandDiagnostics(ctx: Context): unknown {\n try {\n const agents = ctx.agents.list()\n return {\n total: agents.length,\n agents: agents.map(agent => {\n const info: { id: string; preset?: string; commandCount?: number; sample?: string[]; error?: string; bridge?: ClaudeBridgeDiagnostic } = { id: String(agent.id) }\n try {\n const preset = ctx.agentPresets.composedPreset(agent.ctx)\n if (preset !== undefined) info.preset = preset\n } catch (error) {\n info.error = safeMessage(error)\n }\n try {\n const list = ctx.commands.list(agent)\n info.commandCount = list.length\n info.sample = list.slice(0, 10).map(command => command.name)\n } catch (error) {\n info.error = info.error === undefined ? safeMessage(error) : `${info.error}; ${safeMessage(error)}`\n }\n const bridge = claudeBridgeDiagnostics.get(agent)\n if (bridge !== undefined) info.bridge = bridge\n return info\n }),\n }\n } catch (error) {\n return { error: safeMessage(error) }\n }\n}\n\nexport function registerClaudeDoctorRoutes(\n ctx: Context,\n runtime: ExecutableRuntime,\n supervisor: ClaudeSupervisor,\n config: ClaudeSupervisorConfig,\n resolutionError?: unknown,\n): void {\n ctx.effect(() => ctx.webServer.register({\n kind: 'exact',\n path: CLAUDE_DOCTOR_PATH,\n handler: async (req, res) => {\n if (req.method !== 'GET') return json(res, 405, { error: 'method not allowed' })\n if (!trustedRequest(req)) return json(res, 403, { error: 'forbidden' })\n try {\n if (resolutionError !== undefined) {\n return json(res, 200, {\n executable: {\n status: 'missing',\n searched: config.executablePath.length > 0 ? [config.executablePath] : ['claude', '~/.local/bin/claude', '/opt/homebrew/bin/claude', '/usr/local/bin/claude'],\n },\n version: { status: 'not-run' },\n authentication: { status: 'not-run' },\n handshake: 'not-run',\n message: safeMessage(resolutionError),\n limits: {\n idleTimeoutMs: config.idleTimeoutMs,\n maxProcesses: config.maxProcesses,\n },\n processes: { count: 0, active: 0 },\n })\n }\n const report = await runClaudeDoctor(runtime, {\n configuredPath: config.executablePath,\n cwd: process.cwd(),\n signal: AbortSignal.timeout(CLAUDE_DOCTOR_PROBE_TIMEOUT_MS),\n })\n const processes = supervisor.snapshots()\n if (processes.some(process => process.claudeSessionId !== undefined)) report.handshake = 'ok'\n json(res, 200, {\n ...report,\n limits: {\n idleTimeoutMs: config.idleTimeoutMs,\n maxProcesses: config.maxProcesses,\n },\n processes: {\n count: processes.length,\n active: processes.filter(process => process.state === 'running' || process.state === 'starting').length,\n },\n commandBridge: commandDiagnostics(ctx),\n })\n } catch (error) {\n json(res, 500, { error: safeMessage(error) })\n }\n },\n }), 'dsh-claude: Doctor route')\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-host-webserver'\nimport { CLAUDE_PROJECTION_PATH } from './constants.ts'\nimport { json, trustedRequest } from './http.ts'\nimport type { ClaudeSidecarRepository } from './sidecar.ts'\n\nconst MAX_SESSION_ID_CHARS = 1_024\n\nfunction sessionIdFromUrl(rawUrl: string | undefined): string | undefined {\n try {\n const pathname = new URL(rawUrl ?? '/', 'http://localhost').pathname\n const prefix = `${CLAUDE_PROJECTION_PATH}/`\n if (!pathname.startsWith(prefix)) return undefined\n const encoded = pathname.slice(prefix.length)\n if (encoded.length === 0 || encoded.includes('/')) return undefined\n const sessionId = decodeURIComponent(encoded)\n if (sessionId.length === 0 || sessionId.length > MAX_SESSION_ID_CHARS) return undefined\n return sessionId\n } catch {\n return undefined\n }\n}\n\n/** Register the browser-readable, credential-free sidecar projection endpoint. */\nexport function registerClaudeProjectionRoute(\n ctx: Context,\n sidecar: ClaudeSidecarRepository,\n ownsSession: (sessionId: string) => boolean,\n): void {\n ctx.effect(() => ctx.webServer.register({\n kind: 'prefix',\n path: CLAUDE_PROJECTION_PATH,\n handler: async (req, res) => {\n if (req.method !== 'GET') return json(res, 405, { error: 'method not allowed' })\n if (!trustedRequest(req)) return json(res, 403, { error: 'forbidden' })\n const sessionId = sessionIdFromUrl(req.url)\n if (sessionId === undefined) return json(res, 400, { error: 'invalid session id' })\n try {\n const projection = await sidecar.read(sessionId)\n return json(res, 200, {\n schemaVersion: projection.schemaVersion,\n revision: projection.revision,\n owned: ownsSession(sessionId),\n activities: projection.activities,\n ...(projection.contextUsage === undefined ? {} : { contextUsage: projection.contextUsage }),\n ...(projection.tasks === undefined ? {} : { tasks: projection.tasks }),\n })\n } catch {\n return json(res, 500, { error: 'projection unavailable' })\n }\n },\n }), 'dsh-claude: sidecar projection route')\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport z from '@deepseek-ai/schemastery'\nimport type { Agent } from '@deepseek-ai/dsh-agent'\nimport type {} from '@deepseek-ai/dsh-commands'\nimport { createUserMessage } from '@deepseek-ai/dsh-llm'\nimport type {} from '@deepseek-ai/dsh-agent-presets'\nimport type {} from '@deepseek-ai/dsh-host-webserver'\nimport type {} from '@deepseek-ai/dsh-subprocess'\nimport type {} from '@deepseek-ai/dsh-user-approval'\nimport { CLAUDE_CODE_PRESET_ID, CLAUDE_CODE_PROVIDER_IDS, isClaudePresetId } from './constants.ts'\nimport { CLAUDE_COMMANDS_SERVICE, ClaudeCommandBridge, type ClaudeAgentCommandService } from './command-bridge.ts'\nimport { ClaudeSidecarRepository } from './sidecar.ts'\nimport { resolveClaudeExecutable } from './executable.ts'\nimport { ClaudeSupervisor } from './supervisor.ts'\nimport { createClaudeCodeAdapter } from './adapter.ts'\nimport { ensureManagedPreset } from './preset-installer.ts'\nimport { claudeBridgeDiagnostics, registerClaudeDoctorRoutes, type ClaudeBridgeDiagnostic } from './doctor-routes.ts'\nimport { registerClaudeProjectionRoute } from './projection-routes.ts'\n\nexport const name = 'llm-claude'\nexport const inject = ['llm', 'agents', 'agentPresets', 'commands', 'subprocess', 'approval']\n\nexport interface Config {\n executablePath?: string\n model?: string\n idleTimeoutMs?: number\n maxProcesses?: number\n}\n\nexport const Config: z<Config> = z.object({\n executablePath: z.string().default(''),\n model: z.string().default('default'),\n idleTimeoutMs: z.number().min(1_000).max(2_147_483_647).default(30 * 60 * 1_000),\n maxProcesses: z.number().step(1).min(1).default(4),\n})\n\nconst CLAUDE_SCOPE_UNAVAILABLE_MESSAGE = 'agent command scope unavailable (preset route not mounted?)'\nconst CATALOG_RETRY_MS = 5_000\nconst SCOPE_RETRY_MS = 500\nconst MAX_CATALOG_RETRIES = 3\nconst MAX_SCOPE_RETRIES = 24\n\nexport function mountClaudeMetadata(\n ctx: Context,\n supervisor: ClaudeSupervisor,\n agent: Agent,\n model: string,\n sidecar: ClaudeSidecarRepository,\n // IMPORTANT: call through the injected agentPresets SERVICE, never an\n // imported serviceForAgent() — a linked plugin resolves peer packages from\n // its own node_modules, which creates a second module instance with empty\n // module-level mount state. The service method runs on the app's instance.\n resolveCommands: () => ClaudeAgentCommandService | undefined =\n () => ctx.agentPresets.serviceFor(agent, CLAUDE_COMMANDS_SERVICE),\n): (() => Promise<void>) | undefined {\n if (!isClaudePresetId(ctx.agentPresets.composedPreset(agent.ctx))) return undefined\n\n let stopped = false\n let pending = Promise.resolve()\n let commandScope: ClaudeAgentCommandService | undefined\n\n // The commands service is unreachable from this host view of agent.ctx;\n // the preset route plugin provides it as an isolated per-session service.\n const scopedCommands = () => {\n const scoped = commandScope ?? resolveCommands()\n if (scoped === undefined) throw new Error(CLAUDE_SCOPE_UNAVAILABLE_MESSAGE)\n commandScope = scoped\n return scoped\n }\n\n const bridge = new ClaudeCommandBridge({\n list: () => scopedCommands().list(agent),\n register: definition => scopedCommands().register(definition),\n forward: line => {\n agent.followup(createUserMessage({\n content: [{ type: 'text', text: line }],\n source: { kind: 'user' },\n }))\n },\n })\n\n const warn = (area: string, error: unknown) => {\n ctx.logger.warn(`dsh-claude: ${area} refresh failed for ${String(agent.id)}: ${error instanceof Error ? error.message : String(error)}`)\n }\n\n const isScopeUnavailable = (error: unknown): boolean => {\n if (error instanceof Error) return error.message === CLAUDE_SCOPE_UNAVAILABLE_MESSAGE\n return String(error) === CLAUDE_SCOPE_UNAVAILABLE_MESSAGE\n }\n\n const diagnostic: ClaudeBridgeDiagnostic = claudeBridgeDiagnostics.get(agent) ?? { attempts: 0 }\n claudeBridgeDiagnostics.set(agent, diagnostic)\n\n // A fresh session's first catalog fetch races CLI startup (skills/plugins\n // can make init slow); retry with backoff so the command palette still\n // populates without waiting for the first completed turn.\n let catalogRetries = 0\n let scopeRetries = 0\n let retryTimer: ReturnType<typeof setTimeout> | undefined\n\n const scheduleRetry = (area: 'command catalog' | 'command scope', attempt: number) => {\n if (retryTimer !== undefined) clearTimeout(retryTimer)\n const delay = area === 'command catalog' ? CATALOG_RETRY_MS * attempt : Math.min(SCOPE_RETRY_MS * 2 ** attempt, 5_000)\n retryTimer = setTimeout(() => {\n if (!stopped) refresh()\n }, delay)\n retryTimer.unref?.()\n }\n\n const refresh = () => {\n pending = pending.then(async () => {\n if (stopped) return\n diagnostic.attempts += 1\n\n let catalog: Awaited<ReturnType<ClaudeSupervisor['supportedCommands']>> | undefined\n\n try {\n const result = await supervisor.supportedCommands(agent, model)\n catalog = result\n catalogRetries = 0\n scopeRetries = 0\n diagnostic.lastCatalog = catalog.length\n delete diagnostic.lastError\n } catch (error) {\n diagnostic.lastError = error instanceof Error ? error.message : String(error)\n warn('command catalog', error)\n if (!stopped && catalogRetries < MAX_CATALOG_RETRIES) {\n catalogRetries += 1\n scheduleRetry('command catalog', catalogRetries)\n }\n }\n\n if (stopped || catalog === undefined) return\n\n try {\n diagnostic.registered = bridge.refresh(catalog).map(view => view.publicName)\n if (!stopped) scopeRetries = 0\n } catch (error) {\n diagnostic.lastError = error instanceof Error ? error.message : String(error)\n warn('command catalog', error)\n if (!stopped && isScopeUnavailable(error) && scopeRetries < MAX_SCOPE_RETRIES) {\n scopeRetries += 1\n scheduleRetry('command scope', scopeRetries)\n }\n }\n\n if (stopped) return\n try {\n const usage = await supervisor.contextUsage(agent, model)\n if (!stopped) await sidecar.writeContextUsage(agent.id as string, usage)\n } catch (error) {\n warn('context usage', error)\n }\n })\n }\n\n return agent.ctx.effect(() => {\n const stopStatus = agent.ctx.on('agent/status', ({ status }) => {\n if (status === 'idle') refresh()\n })\n\n refresh()\n\n return async () => {\n stopped = true\n if (retryTimer !== undefined) clearTimeout(retryTimer)\n stopStatus()\n await pending\n bridge.dispose()\n }\n }, 'dsh-claude: agent metadata bridge')\n}\n\nexport async function apply(ctx: Context, config: Config): Promise<void> {\n await ensureManagedPreset()\n const supervisorConfig = {\n executablePath: '',\n defaultModel: config.model ?? 'default',\n idleTimeoutMs: config.idleTimeoutMs ?? 30 * 60 * 1_000,\n maxProcesses: config.maxProcesses ?? 4,\n }\n const sidecar = new ClaudeSidecarRepository()\n const supervisor = new ClaudeSupervisor({\n runtime: ctx.subprocess,\n approval: ctx.approval,\n config: supervisorConfig,\n runDetached: operation => ctx.agents.withoutInitiator(operation),\n sidecar,\n })\n let resolutionError: unknown\n try {\n const resolution = await resolveClaudeExecutable(\n ctx.subprocess,\n config.executablePath === undefined || config.executablePath.length === 0\n ? undefined\n : config.executablePath,\n )\n supervisorConfig.executablePath = resolution.path\n ctx.llm.registerAdapter(\n [...CLAUDE_CODE_PROVIDER_IDS],\n createClaudeCodeAdapter(supervisor, ctx.agents, agent => ctx.agentPresets.composedPreset(agent.ctx)),\n )\n ctx.effect(() => {\n const mounted = new Map<Agent, () => Promise<void>>()\n const pending = new Set<Agent>()\n const MOUNT_RETRY_MS = 200\n const MOUNT_RETRY_LIMIT = 50\n const mount = (agent: Agent) => {\n if (mounted.has(agent)) return\n const dispose = mountClaudeMetadata(ctx, supervisor, agent, supervisorConfig.defaultModel, sidecar)\n if (dispose !== undefined) mounted.set(agent, dispose)\n pending.delete(agent)\n }\n // The standing preset mount lands AFTER agent/created (the PresetTree is\n // applied asynchronously), so composedPreset is still undefined at that\n // point. Poll briefly until the join settles, then decide.\n const mountWhenPresetSettles = (agent: Agent) => {\n if (mounted.has(agent) || pending.has(agent)) return\n if (ctx.agentPresets.composedPreset(agent.ctx) !== undefined) {\n mount(agent)\n return\n }\n pending.add(agent)\n let attempts = 0\n const retry = () => {\n if (mounted.has(agent) || !pending.has(agent)) return\n if (ctx.agentPresets.composedPreset(agent.ctx) !== undefined) {\n mount(agent)\n return\n }\n attempts += 1\n if (attempts >= MOUNT_RETRY_LIMIT) {\n pending.delete(agent)\n return\n }\n const timer = setTimeout(retry, MOUNT_RETRY_MS)\n timer.unref?.()\n }\n const timer = setTimeout(retry, MOUNT_RETRY_MS)\n timer.unref?.()\n }\n const stopCreated = ctx.on('agent/created', ({ agent }) => { mountWhenPresetSettles(agent) })\n // Belt and suspenders: the session records its preset selection as a\n // durable event, which agent-presets republishes as agent-preset/selected.\n // agent-preset/selected is emitted by dsh-agent-presets but is not part\n // of the typed host event map yet; subscribe through a typed escape hatch.\n const onPresetSelected = ctx.on as (event: 'agent-preset/selected', handler: (sessionId: string, preset: string) => void) => () => void\n const stopSelected = onPresetSelected('agent-preset/selected', (sessionId, preset) => {\n if (!isClaudePresetId(preset)) return\n const agent = ctx.agents.get(sessionId as never)\n if (agent !== undefined) mountWhenPresetSettles(agent)\n })\n for (const agent of ctx.agents.list()) mountWhenPresetSettles(agent)\n return async () => {\n stopCreated()\n stopSelected()\n pending.clear()\n await Promise.allSettled([...mounted.values()].map(dispose => dispose()))\n mounted.clear()\n }\n }, 'dsh-claude: metadata bridges')\n } catch (error) {\n resolutionError = error\n }\n ctx.on('agent/disposed', async ({ agent }) => {\n await supervisor.disposeSession(agent.id as string)\n })\n ctx.effect(() => () => supervisor.dispose(), 'dsh-claude: process supervisor')\n ctx.inject(['webServer'], webCtx => {\n registerClaudeDoctorRoutes(webCtx, webCtx.subprocess, supervisor, supervisorConfig, resolutionError)\n registerClaudeProjectionRoute(webCtx, sidecar, sessionId => {\n const agent = webCtx.agents.get(sessionId as never)\n return agent !== undefined && isClaudePresetId(webCtx.agentPresets.composedPreset(agent.ctx))\n })\n })\n}\n"],"mappings":"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"}
|