@norman-else/dsh-claude 0.1.14 → 0.1.16

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/lib/index.mjs.map CHANGED
@@ -1 +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","#userQuestions","#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","#attachments","#presetIdFor","safeMessage"],"sources":["../src/sidecar.ts","../src/async-queue.ts","../src/permission.ts","../src/user-question.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/update-routes.ts","../src/global-settings.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', 'question', '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'\nimport type { UserQuestionBridge } from './user-question.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 hasFullAccess?: () => Promise<boolean>\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 userQuestion?: UserQuestionBridge,\n): CanUseTool {\n return async (toolName, input, options) => {\n if (toolName === 'AskUserQuestion') {\n return userQuestion === undefined\n ? {\n behavior: 'deny',\n message: 'DeepSeek Harness user questions are unavailable; the question was cancelled.',\n toolUseID: options.toolUseID,\n decisionClassification: 'user_reject',\n }\n : userQuestion(input, options)\n }\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 alreadyFullAccess = await active.hasFullAccess?.() === true\n const outcome = alreadyFullAccess\n ? 'allowed-once'\n : await approval.request({\n agent: active.agent,\n toolName,\n reason,\n signal: options.signal,\n })\n // The access selector can change while the approval UI is open. Re-read\n // its durable state so an explicit Full access choice wins over the stale\n // request being closed as rejected/cancelled by that mode transition.\n const fullAccess = alreadyFullAccess || await active.hasFullAccess?.() === true\n const effectiveOutcome = fullAccess ? 'allowed-once' : outcome\n const result = mapApprovalOutcome(effectiveOutcome, input, options.toolUseID)\n if (result.behavior === 'deny') active.recordDenial?.(options.toolUseID)\n await active.appendActivity({\n kind: 'permission',\n phase: effectiveOutcome === 'allowed-once' ? 'completed' : 'denied',\n toolUseId: options.toolUseID,\n toolName,\n title: options.displayName ?? toolName,\n summary: fullAccess\n ? 'Allowed by Full access in DeepSeek Harness'\n : effectiveOutcome === 'allowed-once'\n ? 'Allowed once in DeepSeek Harness'\n : denialMessage(effectiveOutcome),\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 { CanUseTool, PermissionResult } from '@anthropic-ai/claude-agent-sdk'\nimport type { Agent } from '@deepseek-ai/dsh-agent'\nimport type {\n AskUserQuestionAnswerItem,\n AskUserQuestionItem,\n UserQuestionService,\n} from '@deepseek-ai/dsh-user-questions'\nimport type { ClaudeActivityInput, ClaudeActivityCursor } from './events.ts'\n\nexport type UserQuestionRequester = Pick<UserQuestionService, 'ask'>\n\nexport interface ActiveUserQuestionContext {\n agent: Agent\n cursor: ClaudeActivityCursor\n markActivity?: () => void\n appendActivity: (activity: ClaudeActivityInput) => Promise<void>\n}\n\nexport type ActiveUserQuestionContextProvider = () => ActiveUserQuestionContext | undefined\nexport type UserQuestionBridge = (\n input: Record<string, unknown>,\n options: Parameters<CanUseTool>[2],\n) => Promise<PermissionResult>\n\nconst FAILURE_MESSAGE = 'DeepSeek Harness could not collect an answer; the question was cancelled.'\nconst INVALID_MESSAGE = 'Claude Code sent an invalid user-question request; the question was cancelled.'\n\nfunction failureMessage(error: unknown): string {\n const code = error !== null && typeof error === 'object' && 'code' in error\n ? (error as { code?: unknown }).code\n : undefined\n return typeof code === 'string' && /^[A-Z][A-Z0-9_]*$/.test(code)\n ? `${FAILURE_MESSAGE} (${code})`\n : FAILURE_MESSAGE\n}\n\nfunction deny(message: string, toolUseID: string): PermissionResult {\n return {\n behavior: 'deny',\n message,\n toolUseID,\n decisionClassification: 'user_reject',\n }\n}\n\nfunction optionalText(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction parseQuestions(input: Record<string, unknown>, toolUseID: string): AskUserQuestionItem[] | undefined {\n if (!Array.isArray(input.questions) || input.questions.length === 0 || input.questions.length > 20) return undefined\n const seen = new Set<string>()\n const questions: AskUserQuestionItem[] = []\n for (const [index, value] of input.questions.entries()) {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return undefined\n const item = value as Record<string, unknown>\n if (typeof item.question !== 'string' || item.question.length === 0 || seen.has(item.question)) return undefined\n seen.add(item.question)\n if (item.options !== undefined && !Array.isArray(item.options)) return undefined\n const options = (item.options ?? []).map(option => {\n if (option === null || typeof option !== 'object' || Array.isArray(option)) return undefined\n const record = option as Record<string, unknown>\n if (typeof record.label !== 'string' || record.label.length === 0) return undefined\n const description = optionalText(record.description)\n return { label: record.label, ...(description === undefined ? {} : { description }) }\n })\n if (options.some(option => option === undefined)) return undefined\n const header = optionalText(item.header)\n questions.push({\n id: `${toolUseID}:${index}`,\n question: item.question,\n ...(header === undefined ? {} : { header }),\n options: options as NonNullable<AskUserQuestionItem['options']>,\n multiSelect: item.multiSelect === true,\n })\n }\n return questions\n}\n\nfunction answerText(answer: AskUserQuestionAnswerItem | undefined, multiSelect: boolean): string {\n if (answer === undefined) return ''\n const custom = optionalText(answer.custom)\n if (!multiSelect && custom !== undefined) return custom\n return [...answer.selected, ...(custom === undefined ? [] : [custom])].join(', ')\n}\n\nexport function createUserQuestionBridge(\n userQuestions: UserQuestionRequester,\n activeContext: ActiveUserQuestionContextProvider,\n): UserQuestionBridge {\n return async (input, options) => {\n const active = activeContext()\n if (active === undefined) return deny('No active DeepSeek Harness turn owns this Claude Code question.', options.toolUseID)\n\n const questions = parseQuestions(input, options.toolUseID)\n if (questions === undefined) return deny(INVALID_MESSAGE, options.toolUseID)\n\n active.markActivity?.()\n try {\n await active.appendActivity({\n kind: 'question',\n phase: 'started',\n toolUseId: options.toolUseID,\n toolName: 'AskUserQuestion',\n title: 'Claude asked a question',\n summary: questions.length === 1 ? questions[0]!.question : `Claude asked ${questions.length} questions`,\n })\n const response = await userQuestions.ask({\n questions,\n agent: active.agent,\n signal: options.signal,\n })\n const answersById = new Map(response.answers.map(answer => [answer.id, answer]))\n const answers = Object.fromEntries(questions.map(question => [\n question.question,\n answerText(answersById.get(question.id), question.multiSelect === true),\n ]))\n await active.appendActivity({\n kind: 'question',\n phase: 'completed',\n toolUseId: options.toolUseID,\n toolName: 'AskUserQuestion',\n title: 'Claude asked a question',\n summary: 'Answered in DeepSeek Harness',\n })\n return {\n behavior: 'allow',\n updatedInput: { ...input, answers },\n toolUseID: options.toolUseID,\n decisionClassification: 'user_temporary',\n }\n } catch (error) {\n const message = failureMessage(error)\n try {\n await active.appendActivity({\n kind: 'question',\n phase: 'failed',\n toolUseId: options.toolUseID,\n toolName: 'AskUserQuestion',\n title: 'Claude asked a question',\n summary: message,\n isError: true,\n })\n } catch {\n // The question path is fail-closed; a second audit failure cannot widen it.\n }\n return deny(message, options.toolUseID)\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 { UserQuestionService } from '@deepseek-ai/dsh-user-questions'\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 { createUserQuestionBridge } from './user-question.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: SDKUserMessage['message']['content']\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: SDKUserMessage['message']['content'], 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 #userQuestions: Pick<UserQuestionService, 'ask'>\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 userQuestions: Pick<UserQuestionService, 'ask'>\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.#userQuestions = dependencies.userQuestions\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 activeInteraction = () => {\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: string) => { active.deniedToolUseIds.add(toolUseId) },\n hasFullAccess: async () => {\n await this.#syncPermissionMode(entry)\n return entry.permissionMode === 'bypassPermissions'\n },\n appendActivity: (activity: ClaudeActivityInput) => this.#appendActivity(active, activity),\n }\n }\n const userQuestion = createUserQuestionBridge(this.#userQuestions, activeInteraction)\n const canUseTool = createPermissionBridge(this.#approval, activeInteraction, userQuestion)\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 const firstInitialization = !entry.initialized\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 // A newly created Query cannot retain tasks from the previous process,\n // but repeated init messages from this same long-lived Query are only\n // protocol refreshes and must not erase background work still running.\n if (firstInitialization && 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 if (!TASK_TOOL_NAMES.has(active.callNames.get(message.toolUseId) ?? message.toolName)) {\n await this.#appendNativeToolResult(active, {\n kind: 'tool-result',\n toolUseId: message.toolUseId,\n output: message.summary,\n isError: true,\n })\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 type { AttachmentStore, ImageAttachmentRef, ImageMediaType } from '@deepseek-ai/dsh-attachment'\nimport type { SDKUserMessage } from '@anthropic-ai/claude-agent-sdk'\nimport { CLAUDE_CODE_PRESET_ID, CLAUDE_CODE_PROVIDER } 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\ntype ClaudePrompt = SDKUserMessage['message']['content']\ntype ClaudePromptBlock = Exclude<ClaudePrompt, string>[number]\ntype AttachmentReader = Pick<AttachmentStore, 'imageLimits' | 'readImage'>\n\nfunction abortIfRequested(signal: AbortSignal | undefined): void {\n if (signal?.aborted !== true) return\n if (signal.reason instanceof Error) throw signal.reason\n const error = new Error('Claude Code input resolution aborted')\n error.name = 'AbortError'\n throw error\n}\n\nfunction finiteNonNegative(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0\n}\n\nfunction validateImageRef(ref: ImageAttachmentRef, attachments: AttachmentReader, imageIndex: number): void {\n const limits = attachments.imageLimits\n if (!limits.mediaTypes.includes(ref.mediaType)) {\n throw new Error(`dsh-claude: image ${imageIndex} has an unsupported media type`)\n }\n if (!finiteNonNegative(ref.bytes) || ref.bytes > limits.maxImageBytes) {\n throw new Error(`dsh-claude: image ${imageIndex} exceeds the configured byte limit`)\n }\n const maxDimension = 'maxImageDimension' in limits && finiteNonNegative(limits.maxImageDimension)\n ? limits.maxImageDimension\n : undefined\n if (!finiteNonNegative(ref.width) || !finiteNonNegative(ref.height)\n || ref.width * ref.height > limits.maxImagePixels\n || (maxDimension !== undefined && (ref.width > maxDimension || ref.height > maxDimension))) {\n throw new Error(`dsh-claude: image ${imageIndex} exceeds the configured dimension limit`)\n }\n}\n\nfunction imageBlock(data: Uint8Array, mediaType: ImageMediaType): ClaudePromptBlock {\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: mediaType,\n data: Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString('base64'),\n },\n }\n}\n\n/** Resolve only the newest direct human message; Claude's session owns history. */\nexport async function resolveDirectUserPrompt(\n messages: GenerateOptions['messages'],\n attachments: AttachmentReader,\n signal?: AbortSignal,\n): Promise<ClaudePrompt> {\n const message = [...messages].reverse().find(candidate => (\n candidate.role === 'user' && candidate.source.kind === 'user'\n ))\n if (message === undefined) {\n throw new Error('dsh-claude: no direct human input was present in this model step')\n }\n\n const imageRefs = message.content\n .filter((block): block is Extract<typeof block, { type: 'image' }> => block.type === 'image')\n .map(block => block.attachment)\n const limits = attachments.imageLimits\n if (imageRefs.length > limits.maxImagesPerMessage) {\n throw new Error('dsh-claude: prompt exceeds the configured image-count limit')\n }\n let declaredBytes = 0\n imageRefs.forEach((ref, index) => {\n validateImageRef(ref, attachments, index + 1)\n declaredBytes += ref.bytes\n if (!Number.isSafeInteger(declaredBytes) || declaredBytes > limits.maxMessageImageBytes) {\n throw new Error('dsh-claude: prompt exceeds the configured aggregate image-byte limit')\n }\n })\n\n if (imageRefs.length === 0) {\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 throw new Error('dsh-claude: the newest direct human message has no supported content')\n }\n\n const content: ClaudePromptBlock[] = []\n let imageIndex = 0\n let verifiedBytes = 0\n for (const block of message.content) {\n abortIfRequested(signal)\n if (block.type === 'text') {\n content.push({ type: 'text', text: block.text })\n continue\n }\n if (block.type !== 'image') continue\n imageIndex += 1\n let stored: Awaited<ReturnType<AttachmentStore['readImage']>>\n try {\n stored = await attachments.readImage(block.attachment, signal)\n } catch {\n abortIfRequested(signal)\n throw new Error(`dsh-claude: image ${imageIndex} could not be read or verified`)\n }\n abortIfRequested(signal)\n validateImageRef(stored.ref, attachments, imageIndex)\n if (stored.data.byteLength !== stored.ref.bytes || stored.ref.mediaType !== block.attachment.mediaType) {\n throw new Error(`dsh-claude: image ${imageIndex} failed attachment verification`)\n }\n verifiedBytes += stored.data.byteLength\n if (!Number.isSafeInteger(verifiedBytes) || verifiedBytes > limits.maxMessageImageBytes) {\n throw new Error('dsh-claude: prompt exceeds the configured aggregate image-byte limit')\n }\n content.push(imageBlock(stored.data, stored.ref.mediaType))\n }\n if (content.length === 0) {\n throw new Error('dsh-claude: the newest direct human message has no supported content')\n }\n return content\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 #attachments: AttachmentReader\n readonly #presetIdFor: (agent: Agent) => string | undefined\n\n constructor(\n supervisor: ClaudeSupervisor,\n agents: Pick<AgentRegistry, 'currentInitiator' | 'get'>,\n attachments: AttachmentReader,\n presetIdFor: (agent: Agent) => string | undefined,\n ) {\n super()\n this.#supervisor = supervisor\n this.#agents = agents\n this.#attachments = attachments\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(provider: string): Promise<readonly LlmModelInfo[]> {\n return MODELS.map(model => ({\n provider,\n id: model.id,\n name: model.name,\n description: model.description,\n inputModalities: ['text', 'image'],\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', 'image'],\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 (this.#presetIdFor(agent) !== CLAUDE_CODE_PRESET_ID) {\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 let prompt: ClaudePrompt\n try {\n prompt = await resolveDirectUserPrompt(options.messages, this.#attachments, options.signal)\n } catch (error) {\n if ((error as Error).name !== 'AbortError') throw error\n yield {\n type: 'finish',\n reason: {\n kind: 'aborted',\n failure: { code: 'aborted', message: error instanceof Error ? error.message : 'Claude Code input resolution aborted' },\n },\n }\n return\n }\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 attachments: AttachmentReader,\n presetIdFor: (agent: Agent) => string | undefined,\n): ClaudeCodeAdapter {\n return new ClaudeCodeAdapter(supervisor, agents, attachments, 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'\nimport type { ClaudeCommandView } from './command-bridge.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 commandsForSession: (sessionId: string) => readonly ClaudeCommandView[] = () => [],\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 commands: commandsForSession(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 type {} from '@deepseek-ai/dsh-host-webserver'\nimport type { SubprocessRuntime } from '@deepseek-ai/dsh-subprocess'\nimport { resolveDshHome } from '@deepseek-ai/dsh-home-paths'\nimport { opendir, readFile, realpath } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { CLAUDE_UPDATE_CHECK_PATH, CLAUDE_UPDATE_PATH } from './constants.ts'\nimport { redactText } from './events.ts'\nimport { json, trustedRequest } from './http.ts'\n\nexport const PLUGIN_PACKAGE_NAME = '@norman-else/dsh-claude'\nexport const UPDATE_TIMEOUT_MS = 30_000\nconst CHECK_TIMEOUT_MS = 10_000\nconst MAX_MANIFEST_BYTES = 256 * 1024\nconst MAX_UPDATE_OUTPUT_BYTES = 32 * 1024\nconst SEMVER = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/\nconst PROFILE_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/\n\nexport type InstallSource = 'registry' | 'link' | 'unsupported' | 'unknown'\nexport type UpdateState = 'current' | 'available' | 'linked' | 'unsupported' | 'unavailable' | 'error'\n\nexport interface PluginUpdateStatus {\n currentVersion: string\n latestVersion?: string\n source: InstallSource\n state: UpdateState\n canUpdate: boolean\n restartRequired: boolean\n message?: string\n}\n\ninterface PackageManifest {\n name?: unknown\n version?: unknown\n dependencies?: unknown\n}\n\nexport interface Installation {\n profile: string\n profileDir: string\n source: InstallSource\n spec: string\n}\n\nexport interface UpdateDependencies {\n packageDir?: string\n dshHome?: string\n fetchLatest?: (signal: AbortSignal) => Promise<string>\n resolveExecutable?: (name: string, env?: Readonly<Record<string, string>>, signal?: AbortSignal) => Promise<string>\n spawn?: SubprocessRuntime['spawn']\n requestRestart?: () => void\n}\n\nfunction safeMessage(error: unknown): string {\n return redactText(error instanceof Error ? error.message : String(error), 500)\n}\n\nasync function readManifest(path: string): Promise<PackageManifest> {\n const text = await readFile(path, 'utf8')\n if (Buffer.byteLength(text) > MAX_MANIFEST_BYTES) throw new Error('package manifest is too large')\n const value = JSON.parse(text) as unknown\n if (typeof value !== 'object' || value === null || Array.isArray(value)) throw new Error('package manifest is invalid')\n return value as PackageManifest\n}\n\nfunction dependencySpec(manifest: PackageManifest): string | undefined {\n if (typeof manifest.dependencies !== 'object' || manifest.dependencies === null || Array.isArray(manifest.dependencies)) return undefined\n const value = (manifest.dependencies as Record<string, unknown>)[PLUGIN_PACKAGE_NAME]\n return typeof value === 'string' && value.length <= 2_000 ? value : undefined\n}\n\nexport function classifyInstallSpec(spec: string): InstallSource {\n if (/^(?:link|file|workspace):/i.test(spec)) return 'link'\n if (/^(?:git(?:\\+[^:]+)?:|github:|https?:|npm:)/i.test(spec) || /\\.git(?:#|$)/i.test(spec)) return 'unsupported'\n return /^(?:\\^|~|>=?|<=?|=)?\\s*v?\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\s*\\|\\|\\s*(?:\\^|~|>=?|<=?|=)?\\s*v?\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?)*$/.test(spec.trim())\n ? 'registry'\n : 'unsupported'\n}\n\nasync function samePath(left: string, right: string): Promise<boolean> {\n try {\n const [a, b] = await Promise.all([realpath(left), realpath(right)])\n return process.platform === 'win32' ? a.toLowerCase() === b.toLowerCase() : a === b\n } catch {\n return false\n }\n}\n\nfunction linkedTarget(profileDir: string, spec: string): string | undefined {\n const match = /^(?:link|file):(.*)$/i.exec(spec)\n return match?.[1] === undefined ? undefined : resolve(profileDir, match[1])\n}\n\nexport async function discoverInstallation(dshHome: string, packageDir: string): Promise<Installation | undefined> {\n const profilesDir = join(dshHome, 'profiles')\n const matches: Installation[] = []\n let profiles\n try {\n profiles = await opendir(profilesDir)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined\n throw error\n }\n for await (const entry of profiles) {\n if (!entry.isDirectory() || !PROFILE_NAME.test(entry.name)) continue\n const profileDir = join(profilesDir, entry.name)\n let manifest: PackageManifest\n try {\n manifest = await readManifest(join(profileDir, 'package.json'))\n } catch {\n continue\n }\n const spec = dependencySpec(manifest)\n if (spec === undefined) continue\n const source = classifyInstallSpec(spec)\n const matchesPackage = source === 'link'\n ? linkedTarget(profileDir, spec) !== undefined && await samePath(linkedTarget(profileDir, spec)!, packageDir)\n : await samePath(join(profileDir, 'node_modules', ...PLUGIN_PACKAGE_NAME.split('/')), packageDir)\n if (matchesPackage) matches.push({ profile: entry.name, profileDir, source, spec })\n }\n return matches.length === 1 ? matches[0] : undefined\n}\n\nfunction parseVersion(version: string): RegExpExecArray {\n const match = SEMVER.exec(version)\n if (match === null) throw new Error('package version is not valid semver')\n return match\n}\n\nexport function compareVersions(left: string, right: string): number {\n const a = parseVersion(left)\n const b = parseVersion(right)\n for (const index of [1, 2, 3]) {\n const difference = Number(a[index]) - Number(b[index])\n if (difference !== 0) return Math.sign(difference)\n }\n const aPre = a[4]\n const bPre = b[4]\n if (aPre === undefined) return bPre === undefined ? 0 : 1\n if (bPre === undefined) return -1\n return aPre.localeCompare(bPre, 'en', { numeric: true })\n}\n\nasync function registryLatest(signal: AbortSignal): Promise<string> {\n const response = await fetch('https://registry.npmjs.org/%40norman-else%2Fdsh-claude', {\n headers: { accept: 'application/vnd.npm.install-v1+json' },\n signal,\n })\n if (!response.ok) throw new Error(`npm registry returned HTTP ${response.status}`)\n const payload = await response.json() as { 'dist-tags'?: { latest?: unknown } }\n const latest = payload['dist-tags']?.latest\n if (typeof latest !== 'string') throw new Error('npm registry response has no latest version')\n parseVersion(latest)\n return latest\n}\n\nasync function resolvePackageContextDir(configured?: string): Promise<{ packageDir: string; manifest: PackageManifest }> {\n const moduleDir = dirname(fileURLToPath(import.meta.url))\n const candidates = configured === undefined ? [moduleDir, dirname(moduleDir)] : [configured]\n for (const packageDir of candidates) {\n try {\n const manifest = await readManifest(join(packageDir, 'package.json'))\n if (manifest.name === PLUGIN_PACKAGE_NAME) return { packageDir, manifest }\n } catch {\n // Continue until the owning package manifest is found.\n }\n }\n throw new Error('plugin package manifest is invalid')\n}\n\nasync function packageContext(deps: UpdateDependencies): Promise<{ version: string; installation?: Installation }> {\n const { packageDir, manifest } = await resolvePackageContextDir(deps.packageDir)\n if (typeof manifest.version !== 'string') throw new Error('plugin package manifest is invalid')\n parseVersion(manifest.version)\n const home = deps.dshHome ?? resolveDshHome()\n const installation = await discoverInstallation(home, packageDir)\n return { version: manifest.version, ...(installation === undefined ? {} : { installation }) }\n}\n\nexport async function checkPluginUpdate(deps: UpdateDependencies = {}): Promise<PluginUpdateStatus> {\n try {\n const { version, installation } = await packageContext(deps)\n if (installation === undefined) return { currentVersion: version, source: 'unknown', state: 'unavailable', canUpdate: false, restartRequired: false, message: 'Active DSH profile could not be identified uniquely' }\n if (installation.source === 'link') return { currentVersion: version, source: 'link', state: 'linked', canUpdate: false, restartRequired: false, message: 'Local development link; updates come from the linked checkout' }\n if (installation.source !== 'registry') return { currentVersion: version, source: installation.source, state: 'unsupported', canUpdate: false, restartRequired: false, message: 'This installation source cannot be updated from the npm registry' }\n const latest = await (deps.fetchLatest ?? registryLatest)(AbortSignal.timeout(CHECK_TIMEOUT_MS))\n const comparison = compareVersions(version, latest)\n return {\n currentVersion: version,\n latestVersion: latest,\n source: 'registry',\n state: comparison < 0 ? 'available' : 'current',\n canUpdate: comparison < 0,\n restartRequired: comparison < 0,\n }\n } catch (error) {\n return { currentVersion: 'unknown', source: 'unknown', state: 'error', canUpdate: false, restartRequired: false, message: safeMessage(error) }\n }\n}\n\nasync function verifyInstalledVersion(installation: Installation, expectedVersion: string): Promise<void> {\n const profileManifest = await readManifest(join(installation.profileDir, 'package.json'))\n if (dependencySpec(profileManifest) !== expectedVersion) {\n throw new Error('DSH plugin update completed without updating the profile dependency')\n }\n const installedManifest = await readManifest(join(\n installation.profileDir,\n 'node_modules',\n ...PLUGIN_PACKAGE_NAME.split('/'),\n 'package.json',\n ))\n if (installedManifest.name !== PLUGIN_PACKAGE_NAME || installedManifest.version !== expectedVersion) {\n throw new Error('DSH plugin update completed without installing the requested version')\n }\n}\n\nexport async function updatePlugin(deps: UpdateDependencies = {}): Promise<PluginUpdateStatus> {\n const { version, installation } = await packageContext(deps)\n if (installation === undefined || installation.source !== 'registry') throw new Error('Plugin update is unavailable for this installation')\n const latest = await (deps.fetchLatest ?? registryLatest)(AbortSignal.timeout(CHECK_TIMEOUT_MS))\n if (compareVersions(version, latest) >= 0) return { currentVersion: version, latestVersion: latest, source: 'registry', state: 'current', canUpdate: false, restartRequired: false }\n const resolveExecutable = deps.resolveExecutable\n const spawn = deps.spawn\n if (resolveExecutable === undefined || spawn === undefined) throw new Error('DSH update runtime is unavailable')\n const signal = AbortSignal.timeout(UPDATE_TIMEOUT_MS)\n const executable = await resolveExecutable('dsh', {}, signal)\n const handle = spawn({\n argv: [executable, 'plugin', '--profile', installation.profile, 'add', `${PLUGIN_PACKAGE_NAME}@${latest}`],\n cwd: installation.profileDir,\n env: {},\n stdio: { stdin: 'ignore', stdout: { maxBytes: MAX_UPDATE_OUTPUT_BYTES }, stderr: { maxBytes: MAX_UPDATE_OUTPUT_BYTES } },\n graceMs: 2_000,\n signal,\n })\n const outcome = await handle.done\n if (outcome.exitCode !== 0) {\n const detail = handle.collected.stderr?.readFrom(0).text ?? ''\n throw new Error(`DSH plugin update failed (${outcome.exitCode ?? outcome.signal ?? 'unknown exit'}): ${safeMessage(detail)}`)\n }\n await verifyInstalledVersion(installation, latest)\n if (deps.requestRestart !== undefined) setTimeout(() => deps.requestRestart?.(), 100).unref?.()\n return {\n currentVersion: latest,\n latestVersion: latest,\n source: 'registry',\n state: 'current',\n canUpdate: false,\n restartRequired: deps.requestRestart === undefined,\n message: deps.requestRestart === undefined\n ? 'Update installed; restart DSH Desktop to load it'\n : 'Update installed; DSH Desktop is restarting to load it',\n }\n}\n\nexport function registerClaudeUpdateRoutes(ctx: Context, runtime: Pick<SubprocessRuntime, 'resolveExecutable' | 'spawn'>, deps: UpdateDependencies = {}): void {\n const shared: UpdateDependencies = { ...deps, resolveExecutable: runtime.resolveExecutable.bind(runtime), spawn: runtime.spawn.bind(runtime) }\n for (const route of [\n { path: CLAUDE_UPDATE_CHECK_PATH, method: 'GET', run: () => checkPluginUpdate(shared) },\n { path: CLAUDE_UPDATE_PATH, method: 'POST', run: () => updatePlugin(shared) },\n ]) {\n ctx.effect(() => ctx.webServer.register({\n kind: 'exact',\n path: route.path,\n handler: async (req, res) => {\n if (req.method !== route.method) return json(res, 405, { error: 'method not allowed' })\n if (!trustedRequest(req)) return json(res, 403, { error: 'forbidden' })\n try {\n json(res, 200, await route.run())\n } catch (error) {\n json(res, 500, { error: safeMessage(error) })\n }\n },\n }), `dsh-claude: ${route.method} ${route.path}`)\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { homedir } from 'node:os'\nimport { chmod, mkdir, opendir, readFile, rename, rm, writeFile } from 'node:fs/promises'\nimport { dirname, extname, join } from 'node:path'\nimport type { IncomingMessage } from 'node:http'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-host-webserver'\nimport { CLAUDE_GLOBAL_SETTINGS_PATH } from './constants.ts'\nimport { json, trustedRequest } from './http.ts'\n\nconst MAX_SETTINGS_BYTES = 256 * 1024\nconst MAX_REQUEST_BYTES = 8 * 1024\nconst MAX_STYLE_BYTES = 64 * 1024\nconst MAX_STYLE_FILES = 256\nconst BUILTIN_OUTPUT_STYLES = ['Default', 'Proactive', 'Concise', 'Explanatory', 'Learning'] as const\nconst STYLE_NAME = /^[\\p{L}\\p{N}][\\p{L}\\p{N} ._()\\[\\]-]{0,127}$/u\n\ntype JsonObject = Record<string, unknown>\nexport type GlobalSettingEffect = 'new-session' | 'restart'\n\nexport interface GlobalSettingOption {\n value: string\n label: string\n source: 'built-in' | 'user' | 'configured'\n}\n\nexport interface GlobalSettingView {\n key: string\n kind: 'select'\n value: string\n options: readonly GlobalSettingOption[]\n effect: GlobalSettingEffect\n}\n\nexport interface GlobalSettingsView {\n settings: readonly GlobalSettingView[]\n}\n\ninterface GlobalSettingsPaths {\n settingsFile: string\n outputStylesDir: string\n}\n\nexport interface GlobalSettingsDependencies {\n paths?: Partial<GlobalSettingsPaths>\n}\n\ninterface SettingDescriptor {\n key: string\n kind: 'select'\n effect: GlobalSettingEffect\n options(paths: GlobalSettingsPaths): Promise<readonly GlobalSettingOption[]>\n read(document: JsonObject, options: readonly GlobalSettingOption[]): string\n apply(document: JsonObject, value: unknown, options: readonly GlobalSettingOption[]): void\n}\n\nfunction pathsFor(deps: GlobalSettingsDependencies): GlobalSettingsPaths {\n const root = join(homedir(), '.claude')\n return {\n settingsFile: deps.paths?.settingsFile ?? join(root, 'settings.json'),\n outputStylesDir: deps.paths?.outputStylesDir ?? join(root, 'output-styles'),\n }\n}\n\nfunction object(value: unknown): JsonObject | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value as JsonObject\n : undefined\n}\n\nasync function readDocument(path: string): Promise<JsonObject> {\n try {\n const text = await readFile(path, 'utf8')\n if (Buffer.byteLength(text) > MAX_SETTINGS_BYTES) throw new Error('Claude Code settings file is too large')\n const parsed = object(JSON.parse(text))\n if (parsed === undefined) throw new Error('Claude Code settings file must contain a JSON object')\n return parsed\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return {}\n throw error\n }\n}\n\nfunction frontmatterName(text: string): string | undefined {\n if (!text.startsWith('---\\n') && !text.startsWith('---\\r\\n')) return undefined\n const normalized = text.replaceAll('\\r\\n', '\\n')\n const end = normalized.indexOf('\\n---\\n', 4)\n if (end < 0) return undefined\n for (const line of normalized.slice(4, end).split('\\n')) {\n const match = /^name:\\s*(.+?)\\s*$/.exec(line)\n if (match?.[1] === undefined) continue\n const raw = match[1]\n const value = (raw.startsWith('\"') && raw.endsWith('\"')) || (raw.startsWith(\"'\") && raw.endsWith(\"'\"))\n ? raw.slice(1, -1)\n : raw\n return STYLE_NAME.test(value) ? value : undefined\n }\n return undefined\n}\n\nasync function userOutputStyleOptions(directory: string): Promise<GlobalSettingOption[]> {\n const options: GlobalSettingOption[] = []\n let entries\n try {\n entries = await opendir(directory)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return options\n throw error\n }\n for await (const entry of entries) {\n if (options.length >= MAX_STYLE_FILES) break\n if (!entry.isFile() || extname(entry.name).toLowerCase() !== '.md') continue\n try {\n const text = await readFile(join(directory, entry.name), 'utf8')\n if (Buffer.byteLength(text) > MAX_STYLE_BYTES) continue\n const name = frontmatterName(text) ?? entry.name.slice(0, -3)\n if (STYLE_NAME.test(name)) options.push({ value: name, label: name, source: 'user' })\n } catch {\n // Ignore unreadable or malformed optional style files.\n }\n }\n return options\n}\n\nconst OUTPUT_STYLE: SettingDescriptor = {\n key: 'outputStyle',\n kind: 'select',\n effect: 'new-session',\n async options(paths) {\n const builtIn = BUILTIN_OUTPUT_STYLES.map(value => ({ value, label: value, source: 'built-in' as const }))\n const user = await userOutputStyleOptions(paths.outputStylesDir)\n const seen = new Set<string>(builtIn.map(option => option.value))\n return [...builtIn, ...user.filter(option => !seen.has(option.value)).sort((a, b) => a.label.localeCompare(b.label))]\n },\n read(document, options) {\n const value = document.outputStyle\n return typeof value === 'string' && STYLE_NAME.test(value) ? value : 'Default'\n },\n apply(document, value, options) {\n if (typeof value !== 'string' || !options.some(option => option.value === value)) {\n throw new Error('Invalid value for global setting outputStyle')\n }\n if (value === 'Default') delete document.outputStyle\n else document.outputStyle = value\n },\n}\n\nconst DESCRIPTORS: readonly SettingDescriptor[] = [OUTPUT_STYLE]\nconst DESCRIPTOR_BY_KEY = new Map(DESCRIPTORS.map(descriptor => [descriptor.key, descriptor]))\nlet pendingWrite: Promise<unknown> = Promise.resolve()\n\nasync function views(document: JsonObject, paths: GlobalSettingsPaths): Promise<GlobalSettingsView> {\n return {\n settings: await Promise.all(DESCRIPTORS.map(async descriptor => {\n const discovered = await descriptor.options(paths)\n const value = descriptor.read(document, discovered)\n const options = discovered.some(option => option.value === value)\n ? discovered\n : [...discovered, { value, label: value, source: 'configured' as const }]\n return {\n key: descriptor.key,\n kind: descriptor.kind,\n value,\n options,\n effect: descriptor.effect,\n }\n })),\n }\n}\n\nexport async function readGlobalSettings(deps: GlobalSettingsDependencies = {}): Promise<GlobalSettingsView> {\n const paths = pathsFor(deps)\n return views(await readDocument(paths.settingsFile), paths)\n}\n\nasync function atomicWrite(path: string, document: JsonObject): Promise<void> {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 })\n const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`\n try {\n await writeFile(temporary, `${JSON.stringify(document, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600, flag: 'wx' })\n await chmod(temporary, 0o600)\n await rename(temporary, path)\n await chmod(path, 0o600)\n } finally {\n await rm(temporary, { force: true }).catch(() => undefined)\n }\n}\n\nexport function updateGlobalSettings(changes: unknown, deps: GlobalSettingsDependencies = {}): Promise<GlobalSettingsView> {\n const changeObject = object(changes)\n if (changeObject === undefined || Object.keys(changeObject).length === 0) {\n return Promise.reject(new Error('Global settings changes must be a non-empty object'))\n }\n for (const key of Object.keys(changeObject)) {\n if (!DESCRIPTOR_BY_KEY.has(key)) return Promise.reject(new Error(`Unsupported global setting: ${key}`))\n }\n const paths = pathsFor(deps)\n const operation = pendingWrite.catch(() => undefined).then(async () => {\n const document = await readDocument(paths.settingsFile)\n for (const [key, value] of Object.entries(changeObject)) {\n const descriptor = DESCRIPTOR_BY_KEY.get(key)!\n descriptor.apply(document, value, await descriptor.options(paths))\n }\n await atomicWrite(paths.settingsFile, document)\n return views(document, paths)\n })\n pendingWrite = operation\n return operation\n}\n\nasync function requestJson(req: IncomingMessage): Promise<unknown> {\n const declared = Number(req.headers['content-length'] ?? 0)\n if (!Number.isFinite(declared) || declared < 0 || declared > MAX_REQUEST_BYTES) throw new Error('Request body is too large')\n const chunks: Buffer[] = []\n let bytes = 0\n for await (const chunk of req) {\n const data = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n bytes += data.byteLength\n if (bytes > MAX_REQUEST_BYTES) throw new Error('Request body is too large')\n chunks.push(data)\n }\n const value = JSON.parse(Buffer.concat(chunks).toString('utf8')) as unknown\n const body = object(value)\n if (body === undefined || Object.keys(body).some(key => key !== 'changes')) throw new Error('Invalid global settings request')\n return body.changes\n}\n\nexport function registerClaudeGlobalSettingsRoute(ctx: Context, deps: GlobalSettingsDependencies = {}): void {\n ctx.effect(() => ctx.webServer.register({\n kind: 'exact',\n path: CLAUDE_GLOBAL_SETTINGS_PATH,\n handler: async (req, res) => {\n if (req.method !== 'GET' && req.method !== 'PATCH') return json(res, 405, { error: 'method not allowed' })\n if (!trustedRequest(req)) return json(res, 403, { error: 'forbidden' })\n try {\n const result = req.method === 'GET'\n ? await readGlobalSettings(deps)\n : await updateGlobalSettings(await requestJson(req), deps)\n json(res, 200, result)\n } catch (error) {\n json(res, 400, { error: error instanceof Error ? error.message : 'Invalid global settings request' })\n }\n },\n }), 'dsh-claude: global settings')\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-attachment'\nimport z from '@deepseek-ai/schemastery'\nimport type { Agent } from '@deepseek-ai/dsh-agent'\nimport type {} from '@deepseek-ai/dsh-commands'\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 type {} from '@deepseek-ai/dsh-user-questions'\nimport { CLAUDE_CODE_PRESET_ID, CLAUDE_CODE_PROVIDER_IDS } from './constants.ts'\nimport { CLAUDE_COMMANDS_SERVICE, projectClaudeCommands, type ClaudeAgentCommandService, type ClaudeCommandView } 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, ManagedPresetConflictError } from './preset-installer.ts'\nimport { claudeBridgeDiagnostics, registerClaudeDoctorRoutes, type ClaudeBridgeDiagnostic } from './doctor-routes.ts'\nimport { registerClaudeProjectionRoute } from './projection-routes.ts'\nimport { registerClaudeUpdateRoutes } from './update-routes.ts'\nimport { registerClaudeGlobalSettingsRoute } from './global-settings.ts'\n\nexport const name = 'llm-claude'\nexport const inject = ['llm', 'agents', 'agentPresets', 'commands', 'subprocess', 'approval', 'userQuestions', 'attachments']\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 publishCommands: (commands: readonly ClaudeCommandView[]) => void = () => {},\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 (ctx.agentPresets.composedPreset(agent.ctx) !== CLAUDE_CODE_PRESET_ID) 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 commandTarget = {\n list: () => scopedCommands().list(agent),\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 const commands = projectClaudeCommands(catalog, commandTarget)\n publishCommands(commands)\n diagnostic.registered = commands.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 publishCommands([])\n if (retryTimer !== undefined) clearTimeout(retryTimer)\n stopStatus()\n await pending\n }\n }, 'dsh-claude: agent metadata bridge')\n}\n\nexport async function installManagedPresetCompatibility(\n logger: Pick<Context['logger'], 'warn'>,\n install: typeof ensureManagedPreset = ensureManagedPreset,\n): Promise<'installed' | 'unchanged' | 'conflict'> {\n try {\n return await install()\n } catch (error) {\n if (!(error instanceof ManagedPresetConflictError)) throw error\n logger.warn(`dsh-claude: preserving user-modified preset at ${error.path}`)\n return 'conflict'\n }\n}\n\nexport async function apply(ctx: Context, config: Config): Promise<void> {\n // DSH rc.6-rc.8 replaces third-party preset roots during profile boot. Keep\n // the package-contained preset for compatible Hosts, and install this guarded\n // copy into DSH's always-loaded user preset root for affected Hosts.\n await installManagedPresetCompatibility(ctx.logger)\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 commandCatalogs = new Map<string, readonly ClaudeCommandView[]>()\n const supervisor = new ClaudeSupervisor({\n runtime: ctx.subprocess,\n approval: ctx.approval,\n userQuestions: ctx.userQuestions,\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, ctx.attachments, 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 sessionId = agent.id as string\n const dispose = mountClaudeMetadata(\n ctx,\n supervisor,\n agent,\n supervisorConfig.defaultModel,\n sidecar,\n commands => {\n if (commands.length === 0) commandCatalogs.delete(sessionId)\n else commandCatalogs.set(sessionId, commands)\n },\n )\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 (preset !== CLAUDE_CODE_PRESET_ID) 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 const desktopActions = webCtx.get('desktopActions') as { requestRestart?: () => void } | undefined\n registerClaudeUpdateRoutes(webCtx, webCtx.subprocess, {\n ...(typeof desktopActions?.requestRestart === 'function'\n ? { requestRestart: desktopActions.requestRestart.bind(desktopActions) }\n : {}),\n })\n registerClaudeGlobalSettingsRoute(webCtx)\n registerClaudeProjectionRoute(webCtx, sidecar, sessionId => {\n const agent = webCtx.agents.get(sessionId as never)\n return agent !== undefined && webCtx.agentPresets.composedPreset(agent.ctx) === CLAUDE_CODE_PRESET_ID\n }, sessionId => commandCatalogs.get(sessionId) ?? [])\n })\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":["record","string","#pending","#readNow","#update","#writeNow","#path","#values","#pending","#closed","#failure","#exitCode","#signalCode","#killed","#entries","#runtime","#approval","#userQuestions","#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","#continueAfterTasks","#hasRunningTasks","#appendSafely","#supervisor","#agents","#attachments","#presetIdFor","safeMessage"],"sources":["../src/sidecar.ts","../src/async-queue.ts","../src/permission.ts","../src/user-question.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/update-routes.ts","../src/global-settings.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', 'question', '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'\nimport type { UserQuestionBridge } from './user-question.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 hasFullAccess?: () => Promise<boolean>\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 userQuestion?: UserQuestionBridge,\n): CanUseTool {\n return async (toolName, input, options) => {\n if (toolName === 'AskUserQuestion') {\n return userQuestion === undefined\n ? {\n behavior: 'deny',\n message: 'DeepSeek Harness user questions are unavailable; the question was cancelled.',\n toolUseID: options.toolUseID,\n decisionClassification: 'user_reject',\n }\n : userQuestion(input, options)\n }\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 alreadyFullAccess = await active.hasFullAccess?.() === true\n const outcome = alreadyFullAccess\n ? 'allowed-once'\n : await approval.request({\n agent: active.agent,\n toolName,\n reason,\n signal: options.signal,\n })\n // The access selector can change while the approval UI is open. Re-read\n // its durable state so an explicit Full access choice wins over the stale\n // request being closed as rejected/cancelled by that mode transition.\n const fullAccess = alreadyFullAccess || await active.hasFullAccess?.() === true\n const effectiveOutcome = fullAccess ? 'allowed-once' : outcome\n const result = mapApprovalOutcome(effectiveOutcome, input, options.toolUseID)\n if (result.behavior === 'deny') active.recordDenial?.(options.toolUseID)\n await active.appendActivity({\n kind: 'permission',\n phase: effectiveOutcome === 'allowed-once' ? 'completed' : 'denied',\n toolUseId: options.toolUseID,\n toolName,\n title: options.displayName ?? toolName,\n summary: fullAccess\n ? 'Allowed by Full access in DeepSeek Harness'\n : effectiveOutcome === 'allowed-once'\n ? 'Allowed once in DeepSeek Harness'\n : denialMessage(effectiveOutcome),\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 { CanUseTool, PermissionResult } from '@anthropic-ai/claude-agent-sdk'\nimport type { Agent } from '@deepseek-ai/dsh-agent'\nimport type {\n AskUserQuestionAnswerItem,\n AskUserQuestionItem,\n UserQuestionService,\n} from '@deepseek-ai/dsh-user-questions'\nimport type { ClaudeActivityInput, ClaudeActivityCursor } from './events.ts'\n\nexport type UserQuestionRequester = Pick<UserQuestionService, 'ask'>\n\nexport interface ActiveUserQuestionContext {\n agent: Agent\n cursor: ClaudeActivityCursor\n markActivity?: () => void\n appendActivity: (activity: ClaudeActivityInput) => Promise<void>\n}\n\nexport type ActiveUserQuestionContextProvider = () => ActiveUserQuestionContext | undefined\nexport type UserQuestionBridge = (\n input: Record<string, unknown>,\n options: Parameters<CanUseTool>[2],\n) => Promise<PermissionResult>\n\nconst FAILURE_MESSAGE = 'DeepSeek Harness could not collect an answer; the question was cancelled.'\nconst INVALID_MESSAGE = 'Claude Code sent an invalid user-question request; the question was cancelled.'\n\nfunction failureMessage(error: unknown): string {\n const code = error !== null && typeof error === 'object' && 'code' in error\n ? (error as { code?: unknown }).code\n : undefined\n return typeof code === 'string' && /^[A-Z][A-Z0-9_]*$/.test(code)\n ? `${FAILURE_MESSAGE} (${code})`\n : FAILURE_MESSAGE\n}\n\nfunction deny(message: string, toolUseID: string): PermissionResult {\n return {\n behavior: 'deny',\n message,\n toolUseID,\n decisionClassification: 'user_reject',\n }\n}\n\nfunction optionalText(value: unknown): string | undefined {\n return typeof value === 'string' && value.length > 0 ? value : undefined\n}\n\nfunction parseQuestions(input: Record<string, unknown>, toolUseID: string): AskUserQuestionItem[] | undefined {\n if (!Array.isArray(input.questions) || input.questions.length === 0 || input.questions.length > 20) return undefined\n const seen = new Set<string>()\n const questions: AskUserQuestionItem[] = []\n for (const [index, value] of input.questions.entries()) {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return undefined\n const item = value as Record<string, unknown>\n if (typeof item.question !== 'string' || item.question.length === 0 || seen.has(item.question)) return undefined\n seen.add(item.question)\n if (item.options !== undefined && !Array.isArray(item.options)) return undefined\n const options = (item.options ?? []).map(option => {\n if (option === null || typeof option !== 'object' || Array.isArray(option)) return undefined\n const record = option as Record<string, unknown>\n if (typeof record.label !== 'string' || record.label.length === 0) return undefined\n const description = optionalText(record.description)\n return { label: record.label, ...(description === undefined ? {} : { description }) }\n })\n if (options.some(option => option === undefined)) return undefined\n const header = optionalText(item.header)\n questions.push({\n id: `${toolUseID}:${index}`,\n question: item.question,\n ...(header === undefined ? {} : { header }),\n options: options as NonNullable<AskUserQuestionItem['options']>,\n multiSelect: item.multiSelect === true,\n })\n }\n return questions\n}\n\nfunction answerText(answer: AskUserQuestionAnswerItem | undefined, multiSelect: boolean): string {\n if (answer === undefined) return ''\n const custom = optionalText(answer.custom)\n if (!multiSelect && custom !== undefined) return custom\n return [...answer.selected, ...(custom === undefined ? [] : [custom])].join(', ')\n}\n\nexport function createUserQuestionBridge(\n userQuestions: UserQuestionRequester,\n activeContext: ActiveUserQuestionContextProvider,\n): UserQuestionBridge {\n return async (input, options) => {\n const active = activeContext()\n if (active === undefined) return deny('No active DeepSeek Harness turn owns this Claude Code question.', options.toolUseID)\n\n const questions = parseQuestions(input, options.toolUseID)\n if (questions === undefined) return deny(INVALID_MESSAGE, options.toolUseID)\n\n active.markActivity?.()\n try {\n await active.appendActivity({\n kind: 'question',\n phase: 'started',\n toolUseId: options.toolUseID,\n toolName: 'AskUserQuestion',\n title: 'Claude asked a question',\n summary: questions.length === 1 ? questions[0]!.question : `Claude asked ${questions.length} questions`,\n })\n const response = await userQuestions.ask({\n questions,\n agent: active.agent,\n signal: options.signal,\n })\n const answersById = new Map(response.answers.map(answer => [answer.id, answer]))\n const answers = Object.fromEntries(questions.map(question => [\n question.question,\n answerText(answersById.get(question.id), question.multiSelect === true),\n ]))\n await active.appendActivity({\n kind: 'question',\n phase: 'completed',\n toolUseId: options.toolUseID,\n toolName: 'AskUserQuestion',\n title: 'Claude asked a question',\n summary: 'Answered in DeepSeek Harness',\n })\n return {\n behavior: 'allow',\n updatedInput: { ...input, answers },\n toolUseID: options.toolUseID,\n decisionClassification: 'user_temporary',\n }\n } catch (error) {\n const message = failureMessage(error)\n try {\n await active.appendActivity({\n kind: 'question',\n phase: 'failed',\n toolUseId: options.toolUseID,\n toolName: 'AskUserQuestion',\n title: 'Claude asked a question',\n summary: message,\n isError: true,\n })\n } catch {\n // The question path is fail-closed; a second audit failure cannot widen it.\n }\n return deny(message, options.toolUseID)\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 { UserQuestionService } from '@deepseek-ai/dsh-user-questions'\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 { createUserQuestionBridge } from './user-question.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: 'segment-complete'; text: string }\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: SDKUserMessage['message']['content']\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 phase: 'primary' | 'waiting-tasks' | 'follow-up'\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: SDKUserMessage['message']['content'], 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\nconst BACKGROUND_TASK_REPORT_PROMPT = [\n 'The background tasks launched by your preceding response have now all settled.',\n 'Report their final completed or failed outcomes concisely to the user.',\n 'Do not start new tools or tasks, and do not repeat the earlier progress update.',\n].join(' ')\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 #userQuestions: Pick<UserQuestionService, 'ask'>\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 userQuestions: Pick<UserQuestionService, 'ask'>\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.#userQuestions = dependencies.userQuestions\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 phase: 'primary',\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 activeInteraction = () => {\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: string) => { active.deniedToolUseIds.add(toolUseId) },\n hasFullAccess: async () => {\n await this.#syncPermissionMode(entry)\n return entry.permissionMode === 'bypassPermissions'\n },\n appendActivity: (activity: ClaudeActivityInput) => this.#appendActivity(active, activity),\n }\n }\n const userQuestion = createUserQuestionBridge(this.#userQuestions, activeInteraction)\n const canUseTool = createPermissionBridge(this.#approval, activeInteraction, userQuestion)\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 const firstInitialization = !entry.initialized\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 // A newly created Query cannot retain tasks from the previous process,\n // but repeated init messages from this same long-lived Query are only\n // protocol refreshes and must not erase background work still running.\n if (firstInitialization && 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 await 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 if (!TASK_TOOL_NAMES.has(active.callNames.get(message.toolUseId) ?? message.toolName)) {\n await this.#appendNativeToolResult(active, {\n kind: 'tool-result',\n toolUseId: message.toolUseId,\n output: message.summary,\n isError: true,\n })\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 if (settled) await this.#continueAfterTasks(entry)\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 async #trackBackgroundLevel(\n entry: SupervisorEntry,\n tasks: readonly { taskId: string; taskType?: string; description: string }[],\n originTurn: number | undefined,\n ): Promise<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) {\n await this.#scheduleTasksSnapshot(entry, true)\n await this.#continueAfterTasks(entry)\n }\n }\n\n #hasRunningTasks(entry: SupervisorEntry, active: ActiveTurn): boolean {\n return [...entry.tasks.values()].some(task => (\n task.originTurn === active.cursor.turn && task.backgrounded === true && task.status === 'running'\n ))\n }\n\n async #continueAfterTasks(entry: SupervisorEntry): Promise<void> {\n const active = entry.active\n if (active === undefined || active.phase !== 'waiting-tasks' || this.#hasRunningTasks(entry, active)) return\n active.phase = 'follow-up'\n active.promptUuid = randomUUID()\n active.sawTextDelta = false\n active.text = ''\n active.thinking = ''\n await this.#appendSafely(active, {\n kind: 'status',\n phase: 'updated',\n title: 'Claude Code is reporting background task results',\n })\n entry.input.push(sdkUserMessage(BACKGROUND_TASK_REPORT_PROMPT, active.promptUuid))\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.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 if (active.phase === 'primary' && this.#hasRunningTasks(entry, active)) {\n active.phase = 'waiting-tasks'\n await this.#appendSafely(active, {\n kind: 'status',\n phase: 'updated',\n title: 'Claude Code is waiting for background tasks',\n })\n active.output.push({ type: 'segment-complete', text: active.text })\n return\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 if (active.signal !== undefined && active.abortListener !== undefined) {\n active.signal.removeEventListener('abort', active.abortListener)\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 type { AttachmentStore, ImageAttachmentRef, ImageMediaType } from '@deepseek-ai/dsh-attachment'\nimport type { SDKUserMessage } from '@anthropic-ai/claude-agent-sdk'\nimport { CLAUDE_CODE_PRESET_ID, CLAUDE_CODE_PROVIDER } 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\ntype ClaudePrompt = SDKUserMessage['message']['content']\ntype ClaudePromptBlock = Exclude<ClaudePrompt, string>[number]\ntype AttachmentReader = Pick<AttachmentStore, 'imageLimits' | 'readImage'>\n\nfunction abortIfRequested(signal: AbortSignal | undefined): void {\n if (signal?.aborted !== true) return\n if (signal.reason instanceof Error) throw signal.reason\n const error = new Error('Claude Code input resolution aborted')\n error.name = 'AbortError'\n throw error\n}\n\nfunction finiteNonNegative(value: unknown): value is number {\n return typeof value === 'number' && Number.isFinite(value) && value >= 0\n}\n\nfunction validateImageRef(ref: ImageAttachmentRef, attachments: AttachmentReader, imageIndex: number): void {\n const limits = attachments.imageLimits\n if (!limits.mediaTypes.includes(ref.mediaType)) {\n throw new Error(`dsh-claude: image ${imageIndex} has an unsupported media type`)\n }\n if (!finiteNonNegative(ref.bytes) || ref.bytes > limits.maxImageBytes) {\n throw new Error(`dsh-claude: image ${imageIndex} exceeds the configured byte limit`)\n }\n const maxDimension = 'maxImageDimension' in limits && finiteNonNegative(limits.maxImageDimension)\n ? limits.maxImageDimension\n : undefined\n if (!finiteNonNegative(ref.width) || !finiteNonNegative(ref.height)\n || ref.width * ref.height > limits.maxImagePixels\n || (maxDimension !== undefined && (ref.width > maxDimension || ref.height > maxDimension))) {\n throw new Error(`dsh-claude: image ${imageIndex} exceeds the configured dimension limit`)\n }\n}\n\nfunction imageBlock(data: Uint8Array, mediaType: ImageMediaType): ClaudePromptBlock {\n return {\n type: 'image',\n source: {\n type: 'base64',\n media_type: mediaType,\n data: Buffer.from(data.buffer, data.byteOffset, data.byteLength).toString('base64'),\n },\n }\n}\n\n/** Resolve only the newest direct human message; Claude's session owns history. */\nexport async function resolveDirectUserPrompt(\n messages: GenerateOptions['messages'],\n attachments: AttachmentReader,\n signal?: AbortSignal,\n): Promise<ClaudePrompt> {\n const message = [...messages].reverse().find(candidate => (\n candidate.role === 'user' && candidate.source.kind === 'user'\n ))\n if (message === undefined) {\n throw new Error('dsh-claude: no direct human input was present in this model step')\n }\n\n const imageRefs = message.content\n .filter((block): block is Extract<typeof block, { type: 'image' }> => block.type === 'image')\n .map(block => block.attachment)\n const limits = attachments.imageLimits\n if (imageRefs.length > limits.maxImagesPerMessage) {\n throw new Error('dsh-claude: prompt exceeds the configured image-count limit')\n }\n let declaredBytes = 0\n imageRefs.forEach((ref, index) => {\n validateImageRef(ref, attachments, index + 1)\n declaredBytes += ref.bytes\n if (!Number.isSafeInteger(declaredBytes) || declaredBytes > limits.maxMessageImageBytes) {\n throw new Error('dsh-claude: prompt exceeds the configured aggregate image-byte limit')\n }\n })\n\n if (imageRefs.length === 0) {\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 throw new Error('dsh-claude: the newest direct human message has no supported content')\n }\n\n const content: ClaudePromptBlock[] = []\n let imageIndex = 0\n let verifiedBytes = 0\n for (const block of message.content) {\n abortIfRequested(signal)\n if (block.type === 'text') {\n content.push({ type: 'text', text: block.text })\n continue\n }\n if (block.type !== 'image') continue\n imageIndex += 1\n let stored: Awaited<ReturnType<AttachmentStore['readImage']>>\n try {\n stored = await attachments.readImage(block.attachment, signal)\n } catch {\n abortIfRequested(signal)\n throw new Error(`dsh-claude: image ${imageIndex} could not be read or verified`)\n }\n abortIfRequested(signal)\n validateImageRef(stored.ref, attachments, imageIndex)\n if (stored.data.byteLength !== stored.ref.bytes || stored.ref.mediaType !== block.attachment.mediaType) {\n throw new Error(`dsh-claude: image ${imageIndex} failed attachment verification`)\n }\n verifiedBytes += stored.data.byteLength\n if (!Number.isSafeInteger(verifiedBytes) || verifiedBytes > limits.maxMessageImageBytes) {\n throw new Error('dsh-claude: prompt exceeds the configured aggregate image-byte limit')\n }\n content.push(imageBlock(stored.data, stored.ref.mediaType))\n }\n if (content.length === 0) {\n throw new Error('dsh-claude: the newest direct human message has no supported content')\n }\n return content\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 #attachments: AttachmentReader\n readonly #presetIdFor: (agent: Agent) => string | undefined\n\n constructor(\n supervisor: ClaudeSupervisor,\n agents: Pick<AgentRegistry, 'currentInitiator' | 'get'>,\n attachments: AttachmentReader,\n presetIdFor: (agent: Agent) => string | undefined,\n ) {\n super()\n this.#supervisor = supervisor\n this.#agents = agents\n this.#attachments = attachments\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(provider: string): Promise<readonly LlmModelInfo[]> {\n return MODELS.map(model => ({\n provider,\n id: model.id,\n name: model.name,\n description: model.description,\n inputModalities: ['text', 'image'],\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', 'image'],\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 (this.#presetIdFor(agent) !== CLAUDE_CODE_PRESET_ID) {\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 let prompt: ClaudePrompt\n try {\n prompt = await resolveDirectUserPrompt(options.messages, this.#attachments, options.signal)\n } catch (error) {\n if ((error as Error).name !== 'AbortError') throw error\n yield {\n type: 'finish',\n reason: {\n kind: 'aborted',\n failure: { code: 'aborted', message: error instanceof Error ? error.message : 'Claude Code input resolution aborted' },\n },\n }\n return\n }\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 let blockIndex = 0\n try {\n for await (const event of events) {\n if (event.type === 'text-delta') {\n // Buffer each Claude result as one block so tool activity stays ahead\n // of its prose while a background-task report can follow in-block 1.\n text += event.text\n } else if (event.type === 'usage') {\n pendingUsage = tokenUsage(event.usage)\n } else {\n if (text.length > 0) {\n yield { type: 'block-start', index: blockIndex, blockType: 'text' }\n yield { type: 'text-delta', index: blockIndex, text }\n yield { type: 'block-end', index: blockIndex, block: { type: 'text', text } }\n blockIndex += 1\n }\n text = ''\n if (event.type === 'segment-complete') continue\n completed = true\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: blockIndex, blockType: 'text' }\n yield { type: 'text-delta', index: blockIndex, text }\n yield { type: 'block-end', index: blockIndex, 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 attachments: AttachmentReader,\n presetIdFor: (agent: Agent) => string | undefined,\n): ClaudeCodeAdapter {\n return new ClaudeCodeAdapter(supervisor, agents, attachments, 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'\nimport type { ClaudeCommandView } from './command-bridge.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 commandsForSession: (sessionId: string) => readonly ClaudeCommandView[] = () => [],\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 commands: commandsForSession(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 type {} from '@deepseek-ai/dsh-host-webserver'\nimport type { SubprocessRuntime } from '@deepseek-ai/dsh-subprocess'\nimport { resolveDshHome } from '@deepseek-ai/dsh-home-paths'\nimport { opendir, readFile, realpath } from 'node:fs/promises'\nimport { dirname, join, resolve } from 'node:path'\nimport { fileURLToPath } from 'node:url'\nimport { CLAUDE_UPDATE_CHECK_PATH, CLAUDE_UPDATE_PATH } from './constants.ts'\nimport { redactText } from './events.ts'\nimport { json, trustedRequest } from './http.ts'\n\nexport const PLUGIN_PACKAGE_NAME = '@norman-else/dsh-claude'\nexport const UPDATE_TIMEOUT_MS = 30_000\nconst CHECK_TIMEOUT_MS = 10_000\nconst MAX_MANIFEST_BYTES = 256 * 1024\nconst MAX_UPDATE_OUTPUT_BYTES = 32 * 1024\nconst SEMVER = /^(0|[1-9]\\d*)\\.(0|[1-9]\\d*)\\.(0|[1-9]\\d*)(?:-([0-9A-Za-z.-]+))?(?:\\+[0-9A-Za-z.-]+)?$/\nconst PROFILE_NAME = /^[A-Za-z0-9][A-Za-z0-9._-]{0,63}$/\n\nexport type InstallSource = 'registry' | 'link' | 'unsupported' | 'unknown'\nexport type UpdateState = 'current' | 'available' | 'linked' | 'unsupported' | 'unavailable' | 'error'\n\nexport interface PluginUpdateStatus {\n currentVersion: string\n latestVersion?: string\n source: InstallSource\n state: UpdateState\n canUpdate: boolean\n restartRequired: boolean\n message?: string\n}\n\ninterface PackageManifest {\n name?: unknown\n version?: unknown\n dependencies?: unknown\n}\n\nexport interface Installation {\n profile: string\n profileDir: string\n source: InstallSource\n spec: string\n}\n\nexport interface UpdateDependencies {\n packageDir?: string\n dshHome?: string\n fetchLatest?: (signal: AbortSignal) => Promise<string>\n resolveExecutable?: (name: string, env?: Readonly<Record<string, string>>, signal?: AbortSignal) => Promise<string>\n spawn?: SubprocessRuntime['spawn']\n requestRestart?: () => void\n}\n\nfunction safeMessage(error: unknown): string {\n return redactText(error instanceof Error ? error.message : String(error), 500)\n}\n\nasync function readManifest(path: string): Promise<PackageManifest> {\n const text = await readFile(path, 'utf8')\n if (Buffer.byteLength(text) > MAX_MANIFEST_BYTES) throw new Error('package manifest is too large')\n const value = JSON.parse(text) as unknown\n if (typeof value !== 'object' || value === null || Array.isArray(value)) throw new Error('package manifest is invalid')\n return value as PackageManifest\n}\n\nfunction dependencySpec(manifest: PackageManifest): string | undefined {\n if (typeof manifest.dependencies !== 'object' || manifest.dependencies === null || Array.isArray(manifest.dependencies)) return undefined\n const value = (manifest.dependencies as Record<string, unknown>)[PLUGIN_PACKAGE_NAME]\n return typeof value === 'string' && value.length <= 2_000 ? value : undefined\n}\n\nexport function classifyInstallSpec(spec: string): InstallSource {\n if (/^(?:link|file|workspace):/i.test(spec)) return 'link'\n if (/^(?:git(?:\\+[^:]+)?:|github:|https?:|npm:)/i.test(spec) || /\\.git(?:#|$)/i.test(spec)) return 'unsupported'\n return /^(?:\\^|~|>=?|<=?|=)?\\s*v?\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?(?:\\s*\\|\\|\\s*(?:\\^|~|>=?|<=?|=)?\\s*v?\\d+\\.\\d+\\.\\d+(?:-[0-9A-Za-z.-]+)?)*$/.test(spec.trim())\n ? 'registry'\n : 'unsupported'\n}\n\nasync function samePath(left: string, right: string): Promise<boolean> {\n try {\n const [a, b] = await Promise.all([realpath(left), realpath(right)])\n return process.platform === 'win32' ? a.toLowerCase() === b.toLowerCase() : a === b\n } catch {\n return false\n }\n}\n\nfunction linkedTarget(profileDir: string, spec: string): string | undefined {\n const match = /^(?:link|file):(.*)$/i.exec(spec)\n return match?.[1] === undefined ? undefined : resolve(profileDir, match[1])\n}\n\nexport async function discoverInstallation(dshHome: string, packageDir: string): Promise<Installation | undefined> {\n const profilesDir = join(dshHome, 'profiles')\n const matches: Installation[] = []\n let profiles\n try {\n profiles = await opendir(profilesDir)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return undefined\n throw error\n }\n for await (const entry of profiles) {\n if (!entry.isDirectory() || !PROFILE_NAME.test(entry.name)) continue\n const profileDir = join(profilesDir, entry.name)\n let manifest: PackageManifest\n try {\n manifest = await readManifest(join(profileDir, 'package.json'))\n } catch {\n continue\n }\n const spec = dependencySpec(manifest)\n if (spec === undefined) continue\n const source = classifyInstallSpec(spec)\n const matchesPackage = source === 'link'\n ? linkedTarget(profileDir, spec) !== undefined && await samePath(linkedTarget(profileDir, spec)!, packageDir)\n : await samePath(join(profileDir, 'node_modules', ...PLUGIN_PACKAGE_NAME.split('/')), packageDir)\n if (matchesPackage) matches.push({ profile: entry.name, profileDir, source, spec })\n }\n return matches.length === 1 ? matches[0] : undefined\n}\n\nfunction parseVersion(version: string): RegExpExecArray {\n const match = SEMVER.exec(version)\n if (match === null) throw new Error('package version is not valid semver')\n return match\n}\n\nexport function compareVersions(left: string, right: string): number {\n const a = parseVersion(left)\n const b = parseVersion(right)\n for (const index of [1, 2, 3]) {\n const difference = Number(a[index]) - Number(b[index])\n if (difference !== 0) return Math.sign(difference)\n }\n const aPre = a[4]\n const bPre = b[4]\n if (aPre === undefined) return bPre === undefined ? 0 : 1\n if (bPre === undefined) return -1\n return aPre.localeCompare(bPre, 'en', { numeric: true })\n}\n\nasync function registryLatest(signal: AbortSignal): Promise<string> {\n const response = await fetch('https://registry.npmjs.org/%40norman-else%2Fdsh-claude', {\n headers: { accept: 'application/vnd.npm.install-v1+json' },\n signal,\n })\n if (!response.ok) throw new Error(`npm registry returned HTTP ${response.status}`)\n const payload = await response.json() as { 'dist-tags'?: { latest?: unknown } }\n const latest = payload['dist-tags']?.latest\n if (typeof latest !== 'string') throw new Error('npm registry response has no latest version')\n parseVersion(latest)\n return latest\n}\n\nasync function resolvePackageContextDir(configured?: string): Promise<{ packageDir: string; manifest: PackageManifest }> {\n const moduleDir = dirname(fileURLToPath(import.meta.url))\n const candidates = configured === undefined ? [moduleDir, dirname(moduleDir)] : [configured]\n for (const packageDir of candidates) {\n try {\n const manifest = await readManifest(join(packageDir, 'package.json'))\n if (manifest.name === PLUGIN_PACKAGE_NAME) return { packageDir, manifest }\n } catch {\n // Continue until the owning package manifest is found.\n }\n }\n throw new Error('plugin package manifest is invalid')\n}\n\nasync function packageContext(deps: UpdateDependencies): Promise<{ version: string; installation?: Installation }> {\n const { packageDir, manifest } = await resolvePackageContextDir(deps.packageDir)\n if (typeof manifest.version !== 'string') throw new Error('plugin package manifest is invalid')\n parseVersion(manifest.version)\n const home = deps.dshHome ?? resolveDshHome()\n const installation = await discoverInstallation(home, packageDir)\n return { version: manifest.version, ...(installation === undefined ? {} : { installation }) }\n}\n\nexport async function checkPluginUpdate(deps: UpdateDependencies = {}): Promise<PluginUpdateStatus> {\n try {\n const { version, installation } = await packageContext(deps)\n if (installation === undefined) return { currentVersion: version, source: 'unknown', state: 'unavailable', canUpdate: false, restartRequired: false, message: 'Active DSH profile could not be identified uniquely' }\n if (installation.source === 'link') return { currentVersion: version, source: 'link', state: 'linked', canUpdate: false, restartRequired: false, message: 'Local development link; updates come from the linked checkout' }\n if (installation.source !== 'registry') return { currentVersion: version, source: installation.source, state: 'unsupported', canUpdate: false, restartRequired: false, message: 'This installation source cannot be updated from the npm registry' }\n const latest = await (deps.fetchLatest ?? registryLatest)(AbortSignal.timeout(CHECK_TIMEOUT_MS))\n const comparison = compareVersions(version, latest)\n return {\n currentVersion: version,\n latestVersion: latest,\n source: 'registry',\n state: comparison < 0 ? 'available' : 'current',\n canUpdate: comparison < 0,\n restartRequired: comparison < 0,\n }\n } catch (error) {\n return { currentVersion: 'unknown', source: 'unknown', state: 'error', canUpdate: false, restartRequired: false, message: safeMessage(error) }\n }\n}\n\nasync function verifyInstalledVersion(installation: Installation, expectedVersion: string): Promise<void> {\n const profileManifest = await readManifest(join(installation.profileDir, 'package.json'))\n if (dependencySpec(profileManifest) !== expectedVersion) {\n throw new Error('DSH plugin update completed without updating the profile dependency')\n }\n const installedManifest = await readManifest(join(\n installation.profileDir,\n 'node_modules',\n ...PLUGIN_PACKAGE_NAME.split('/'),\n 'package.json',\n ))\n if (installedManifest.name !== PLUGIN_PACKAGE_NAME || installedManifest.version !== expectedVersion) {\n throw new Error('DSH plugin update completed without installing the requested version')\n }\n}\n\nexport async function updatePlugin(deps: UpdateDependencies = {}): Promise<PluginUpdateStatus> {\n const { version, installation } = await packageContext(deps)\n if (installation === undefined || installation.source !== 'registry') throw new Error('Plugin update is unavailable for this installation')\n const latest = await (deps.fetchLatest ?? registryLatest)(AbortSignal.timeout(CHECK_TIMEOUT_MS))\n if (compareVersions(version, latest) >= 0) return { currentVersion: version, latestVersion: latest, source: 'registry', state: 'current', canUpdate: false, restartRequired: false }\n const resolveExecutable = deps.resolveExecutable\n const spawn = deps.spawn\n if (resolveExecutable === undefined || spawn === undefined) throw new Error('DSH update runtime is unavailable')\n const signal = AbortSignal.timeout(UPDATE_TIMEOUT_MS)\n const executable = await resolveExecutable('dsh', {}, signal)\n const handle = spawn({\n argv: [executable, 'plugin', '--profile', installation.profile, 'add', `${PLUGIN_PACKAGE_NAME}@${latest}`],\n cwd: installation.profileDir,\n env: {},\n stdio: { stdin: 'ignore', stdout: { maxBytes: MAX_UPDATE_OUTPUT_BYTES }, stderr: { maxBytes: MAX_UPDATE_OUTPUT_BYTES } },\n graceMs: 2_000,\n signal,\n })\n const outcome = await handle.done\n if (outcome.exitCode !== 0) {\n const detail = handle.collected.stderr?.readFrom(0).text ?? ''\n throw new Error(`DSH plugin update failed (${outcome.exitCode ?? outcome.signal ?? 'unknown exit'}): ${safeMessage(detail)}`)\n }\n await verifyInstalledVersion(installation, latest)\n if (deps.requestRestart !== undefined) setTimeout(() => deps.requestRestart?.(), 100).unref?.()\n return {\n currentVersion: latest,\n latestVersion: latest,\n source: 'registry',\n state: 'current',\n canUpdate: false,\n restartRequired: deps.requestRestart === undefined,\n message: deps.requestRestart === undefined\n ? 'Update installed; restart DSH Desktop to load it'\n : 'Update installed; DSH Desktop is restarting to load it',\n }\n}\n\nexport function registerClaudeUpdateRoutes(ctx: Context, runtime: Pick<SubprocessRuntime, 'resolveExecutable' | 'spawn'>, deps: UpdateDependencies = {}): void {\n const shared: UpdateDependencies = { ...deps, resolveExecutable: runtime.resolveExecutable.bind(runtime), spawn: runtime.spawn.bind(runtime) }\n for (const route of [\n { path: CLAUDE_UPDATE_CHECK_PATH, method: 'GET', run: () => checkPluginUpdate(shared) },\n { path: CLAUDE_UPDATE_PATH, method: 'POST', run: () => updatePlugin(shared) },\n ]) {\n ctx.effect(() => ctx.webServer.register({\n kind: 'exact',\n path: route.path,\n handler: async (req, res) => {\n if (req.method !== route.method) return json(res, 405, { error: 'method not allowed' })\n if (!trustedRequest(req)) return json(res, 403, { error: 'forbidden' })\n try {\n json(res, 200, await route.run())\n } catch (error) {\n json(res, 500, { error: safeMessage(error) })\n }\n },\n }), `dsh-claude: ${route.method} ${route.path}`)\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { homedir } from 'node:os'\nimport { chmod, mkdir, opendir, readFile, rename, rm, writeFile } from 'node:fs/promises'\nimport { dirname, extname, join } from 'node:path'\nimport type { IncomingMessage } from 'node:http'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-host-webserver'\nimport { CLAUDE_GLOBAL_SETTINGS_PATH } from './constants.ts'\nimport { json, trustedRequest } from './http.ts'\n\nconst MAX_SETTINGS_BYTES = 256 * 1024\nconst MAX_REQUEST_BYTES = 8 * 1024\nconst MAX_STYLE_BYTES = 64 * 1024\nconst MAX_STYLE_FILES = 256\nconst BUILTIN_OUTPUT_STYLES = ['Default', 'Proactive', 'Concise', 'Explanatory', 'Learning'] as const\nconst STYLE_NAME = /^[\\p{L}\\p{N}][\\p{L}\\p{N} ._()\\[\\]-]{0,127}$/u\n\ntype JsonObject = Record<string, unknown>\nexport type GlobalSettingEffect = 'new-session' | 'restart'\n\nexport interface GlobalSettingOption {\n value: string\n label: string\n source: 'built-in' | 'user' | 'configured'\n}\n\nexport interface GlobalSettingView {\n key: string\n kind: 'select'\n value: string\n options: readonly GlobalSettingOption[]\n effect: GlobalSettingEffect\n}\n\nexport interface GlobalSettingsView {\n settings: readonly GlobalSettingView[]\n}\n\ninterface GlobalSettingsPaths {\n settingsFile: string\n outputStylesDir: string\n}\n\nexport interface GlobalSettingsDependencies {\n paths?: Partial<GlobalSettingsPaths>\n}\n\ninterface SettingDescriptor {\n key: string\n kind: 'select'\n effect: GlobalSettingEffect\n options(paths: GlobalSettingsPaths): Promise<readonly GlobalSettingOption[]>\n read(document: JsonObject, options: readonly GlobalSettingOption[]): string\n apply(document: JsonObject, value: unknown, options: readonly GlobalSettingOption[]): void\n}\n\nfunction pathsFor(deps: GlobalSettingsDependencies): GlobalSettingsPaths {\n const root = join(homedir(), '.claude')\n return {\n settingsFile: deps.paths?.settingsFile ?? join(root, 'settings.json'),\n outputStylesDir: deps.paths?.outputStylesDir ?? join(root, 'output-styles'),\n }\n}\n\nfunction object(value: unknown): JsonObject | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value)\n ? value as JsonObject\n : undefined\n}\n\nasync function readDocument(path: string): Promise<JsonObject> {\n try {\n const text = await readFile(path, 'utf8')\n if (Buffer.byteLength(text) > MAX_SETTINGS_BYTES) throw new Error('Claude Code settings file is too large')\n const parsed = object(JSON.parse(text))\n if (parsed === undefined) throw new Error('Claude Code settings file must contain a JSON object')\n return parsed\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return {}\n throw error\n }\n}\n\nfunction frontmatterName(text: string): string | undefined {\n if (!text.startsWith('---\\n') && !text.startsWith('---\\r\\n')) return undefined\n const normalized = text.replaceAll('\\r\\n', '\\n')\n const end = normalized.indexOf('\\n---\\n', 4)\n if (end < 0) return undefined\n for (const line of normalized.slice(4, end).split('\\n')) {\n const match = /^name:\\s*(.+?)\\s*$/.exec(line)\n if (match?.[1] === undefined) continue\n const raw = match[1]\n const value = (raw.startsWith('\"') && raw.endsWith('\"')) || (raw.startsWith(\"'\") && raw.endsWith(\"'\"))\n ? raw.slice(1, -1)\n : raw\n return STYLE_NAME.test(value) ? value : undefined\n }\n return undefined\n}\n\nasync function userOutputStyleOptions(directory: string): Promise<GlobalSettingOption[]> {\n const options: GlobalSettingOption[] = []\n let entries\n try {\n entries = await opendir(directory)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return options\n throw error\n }\n for await (const entry of entries) {\n if (options.length >= MAX_STYLE_FILES) break\n if (!entry.isFile() || extname(entry.name).toLowerCase() !== '.md') continue\n try {\n const text = await readFile(join(directory, entry.name), 'utf8')\n if (Buffer.byteLength(text) > MAX_STYLE_BYTES) continue\n const name = frontmatterName(text) ?? entry.name.slice(0, -3)\n if (STYLE_NAME.test(name)) options.push({ value: name, label: name, source: 'user' })\n } catch {\n // Ignore unreadable or malformed optional style files.\n }\n }\n return options\n}\n\nconst OUTPUT_STYLE: SettingDescriptor = {\n key: 'outputStyle',\n kind: 'select',\n effect: 'new-session',\n async options(paths) {\n const builtIn = BUILTIN_OUTPUT_STYLES.map(value => ({ value, label: value, source: 'built-in' as const }))\n const user = await userOutputStyleOptions(paths.outputStylesDir)\n const seen = new Set<string>(builtIn.map(option => option.value))\n return [...builtIn, ...user.filter(option => !seen.has(option.value)).sort((a, b) => a.label.localeCompare(b.label))]\n },\n read(document, options) {\n const value = document.outputStyle\n return typeof value === 'string' && STYLE_NAME.test(value) ? value : 'Default'\n },\n apply(document, value, options) {\n if (typeof value !== 'string' || !options.some(option => option.value === value)) {\n throw new Error('Invalid value for global setting outputStyle')\n }\n if (value === 'Default') delete document.outputStyle\n else document.outputStyle = value\n },\n}\n\nconst DESCRIPTORS: readonly SettingDescriptor[] = [OUTPUT_STYLE]\nconst DESCRIPTOR_BY_KEY = new Map(DESCRIPTORS.map(descriptor => [descriptor.key, descriptor]))\nlet pendingWrite: Promise<unknown> = Promise.resolve()\n\nasync function views(document: JsonObject, paths: GlobalSettingsPaths): Promise<GlobalSettingsView> {\n return {\n settings: await Promise.all(DESCRIPTORS.map(async descriptor => {\n const discovered = await descriptor.options(paths)\n const value = descriptor.read(document, discovered)\n const options = discovered.some(option => option.value === value)\n ? discovered\n : [...discovered, { value, label: value, source: 'configured' as const }]\n return {\n key: descriptor.key,\n kind: descriptor.kind,\n value,\n options,\n effect: descriptor.effect,\n }\n })),\n }\n}\n\nexport async function readGlobalSettings(deps: GlobalSettingsDependencies = {}): Promise<GlobalSettingsView> {\n const paths = pathsFor(deps)\n return views(await readDocument(paths.settingsFile), paths)\n}\n\nasync function atomicWrite(path: string, document: JsonObject): Promise<void> {\n await mkdir(dirname(path), { recursive: true, mode: 0o700 })\n const temporary = `${path}.${process.pid}.${randomUUID()}.tmp`\n try {\n await writeFile(temporary, `${JSON.stringify(document, null, 2)}\\n`, { encoding: 'utf8', mode: 0o600, flag: 'wx' })\n await chmod(temporary, 0o600)\n await rename(temporary, path)\n await chmod(path, 0o600)\n } finally {\n await rm(temporary, { force: true }).catch(() => undefined)\n }\n}\n\nexport function updateGlobalSettings(changes: unknown, deps: GlobalSettingsDependencies = {}): Promise<GlobalSettingsView> {\n const changeObject = object(changes)\n if (changeObject === undefined || Object.keys(changeObject).length === 0) {\n return Promise.reject(new Error('Global settings changes must be a non-empty object'))\n }\n for (const key of Object.keys(changeObject)) {\n if (!DESCRIPTOR_BY_KEY.has(key)) return Promise.reject(new Error(`Unsupported global setting: ${key}`))\n }\n const paths = pathsFor(deps)\n const operation = pendingWrite.catch(() => undefined).then(async () => {\n const document = await readDocument(paths.settingsFile)\n for (const [key, value] of Object.entries(changeObject)) {\n const descriptor = DESCRIPTOR_BY_KEY.get(key)!\n descriptor.apply(document, value, await descriptor.options(paths))\n }\n await atomicWrite(paths.settingsFile, document)\n return views(document, paths)\n })\n pendingWrite = operation\n return operation\n}\n\nasync function requestJson(req: IncomingMessage): Promise<unknown> {\n const declared = Number(req.headers['content-length'] ?? 0)\n if (!Number.isFinite(declared) || declared < 0 || declared > MAX_REQUEST_BYTES) throw new Error('Request body is too large')\n const chunks: Buffer[] = []\n let bytes = 0\n for await (const chunk of req) {\n const data = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n bytes += data.byteLength\n if (bytes > MAX_REQUEST_BYTES) throw new Error('Request body is too large')\n chunks.push(data)\n }\n const value = JSON.parse(Buffer.concat(chunks).toString('utf8')) as unknown\n const body = object(value)\n if (body === undefined || Object.keys(body).some(key => key !== 'changes')) throw new Error('Invalid global settings request')\n return body.changes\n}\n\nexport function registerClaudeGlobalSettingsRoute(ctx: Context, deps: GlobalSettingsDependencies = {}): void {\n ctx.effect(() => ctx.webServer.register({\n kind: 'exact',\n path: CLAUDE_GLOBAL_SETTINGS_PATH,\n handler: async (req, res) => {\n if (req.method !== 'GET' && req.method !== 'PATCH') return json(res, 405, { error: 'method not allowed' })\n if (!trustedRequest(req)) return json(res, 403, { error: 'forbidden' })\n try {\n const result = req.method === 'GET'\n ? await readGlobalSettings(deps)\n : await updateGlobalSettings(await requestJson(req), deps)\n json(res, 200, result)\n } catch (error) {\n json(res, 400, { error: error instanceof Error ? error.message : 'Invalid global settings request' })\n }\n },\n }), 'dsh-claude: global settings')\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-attachment'\nimport z from '@deepseek-ai/schemastery'\nimport type { Agent } from '@deepseek-ai/dsh-agent'\nimport type {} from '@deepseek-ai/dsh-commands'\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 type {} from '@deepseek-ai/dsh-user-questions'\nimport { CLAUDE_CODE_PRESET_ID, CLAUDE_CODE_PROVIDER_IDS } from './constants.ts'\nimport { CLAUDE_COMMANDS_SERVICE, projectClaudeCommands, type ClaudeAgentCommandService, type ClaudeCommandView } 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, ManagedPresetConflictError } from './preset-installer.ts'\nimport { claudeBridgeDiagnostics, registerClaudeDoctorRoutes, type ClaudeBridgeDiagnostic } from './doctor-routes.ts'\nimport { registerClaudeProjectionRoute } from './projection-routes.ts'\nimport { registerClaudeUpdateRoutes } from './update-routes.ts'\nimport { registerClaudeGlobalSettingsRoute } from './global-settings.ts'\n\nexport const name = 'llm-claude'\nexport const inject = ['llm', 'agents', 'agentPresets', 'commands', 'subprocess', 'approval', 'userQuestions', 'attachments']\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 publishCommands: (commands: readonly ClaudeCommandView[]) => void = () => {},\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 (ctx.agentPresets.composedPreset(agent.ctx) !== CLAUDE_CODE_PRESET_ID) 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 commandTarget = {\n list: () => scopedCommands().list(agent),\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 const commands = projectClaudeCommands(catalog, commandTarget)\n publishCommands(commands)\n diagnostic.registered = commands.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 publishCommands([])\n if (retryTimer !== undefined) clearTimeout(retryTimer)\n stopStatus()\n await pending\n }\n }, 'dsh-claude: agent metadata bridge')\n}\n\nexport async function installManagedPresetCompatibility(\n logger: Pick<Context['logger'], 'warn'>,\n install: typeof ensureManagedPreset = ensureManagedPreset,\n): Promise<'installed' | 'unchanged' | 'conflict'> {\n try {\n return await install()\n } catch (error) {\n if (!(error instanceof ManagedPresetConflictError)) throw error\n logger.warn(`dsh-claude: preserving user-modified preset at ${error.path}`)\n return 'conflict'\n }\n}\n\nexport async function apply(ctx: Context, config: Config): Promise<void> {\n // DSH rc.6-rc.8 replaces third-party preset roots during profile boot. Keep\n // the package-contained preset for compatible Hosts, and install this guarded\n // copy into DSH's always-loaded user preset root for affected Hosts.\n await installManagedPresetCompatibility(ctx.logger)\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 commandCatalogs = new Map<string, readonly ClaudeCommandView[]>()\n const supervisor = new ClaudeSupervisor({\n runtime: ctx.subprocess,\n approval: ctx.approval,\n userQuestions: ctx.userQuestions,\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, ctx.attachments, 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 sessionId = agent.id as string\n const dispose = mountClaudeMetadata(\n ctx,\n supervisor,\n agent,\n supervisorConfig.defaultModel,\n sidecar,\n commands => {\n if (commands.length === 0) commandCatalogs.delete(sessionId)\n else commandCatalogs.set(sessionId, commands)\n },\n )\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 (preset !== CLAUDE_CODE_PRESET_ID) 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 const desktopActions = webCtx.get('desktopActions') as { requestRestart?: () => void } | undefined\n registerClaudeUpdateRoutes(webCtx, webCtx.subprocess, {\n ...(typeof desktopActions?.requestRestart === 'function'\n ? { requestRestart: desktopActions.requestRestart.bind(desktopActions) }\n : {}),\n })\n registerClaudeGlobalSettingsRoute(webCtx)\n registerClaudeProjectionRoute(webCtx, sidecar, sessionId => {\n const agent = webCtx.agents.get(sessionId as never)\n return agent !== undefined && webCtx.agentPresets.composedPreset(agent.ctx) === CLAUDE_CODE_PRESET_ID\n }, sessionId => commandCatalogs.get(sessionId) ?? [])\n })\n}\n"],"mappings":"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"}