@norman-else/dsh-claude 0.1.22 → 0.1.23
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/README.md +1 -1
- package/lib/bin.mjs +1 -1
- package/lib/client.d.ts +19 -1
- package/lib/client.js +836 -51
- package/lib/client.js.map +1 -1
- package/lib/{command-bridge-C10-lz6A.mjs → command-bridge-Br25ODdm.mjs} +2 -2
- package/lib/{command-bridge-C10-lz6A.mjs.map → command-bridge-Br25ODdm.mjs.map} +1 -1
- package/lib/{events-BdDs9ebF.mjs → events-DhrAr5gh.mjs} +3 -2
- package/lib/events-DhrAr5gh.mjs.map +1 -0
- package/lib/index.mjs +483 -100
- package/lib/index.mjs.map +1 -1
- package/lib/{preset-installer-DMANIjwu.mjs → preset-installer-B_Cb0RG6.mjs} +2 -2
- package/lib/{preset-installer-DMANIjwu.mjs.map → preset-installer-B_Cb0RG6.mjs.map} +1 -1
- package/lib/preset-route.mjs +2 -2
- package/package.json +1 -1
- package/lib/events-BdDs9ebF.mjs.map +0 -1
package/lib/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":["record","string","#pending","#latest","#listeners","#live","#boost","#flushTimers","#merged","#base","#notify","#scheduleTextFlush","#flushLive","#readNow","#update","#writeNow","#path","#values","#pending","#closed","#failure","record","string","#exitCode","#signalCode","#killed","#entries","#interruptions","#runtime","#approval","#userQuestions","#config","#queryFactory","#runDetached","#sidecar","#contextWindows","claudeQuery","#runMetadata","#admissionGate","#runTurnAdmitted","#disposed","#disposeEntry","#makeRoom","#createEntry","#armInitializationTimer","#syncPermissionMode","#appendActivity","#armIdleTimer","#startInterrupt","#metadataEntry","#whenInitialized","#pump","#handleMessage","#handleDisconnect","#flushTasksSnapshot","#trackTask","#trackBackgroundLevel","#completeProgressSegment","#completeTurn","#upsertTranscriptText","#closeTranscriptTextSegment","#scheduleTasksSnapshot","#continueAfterTasks","#hasRunningTasks","#appendSafely","#flushTranscript","#interrupt","MAX_TEXT_CHARS","MAX_PATH_CHARS","#comments","#supervisor","#agents","#attachments","#presetIdFor","#drainReviewComments","safeMessage","MAX_SESSION_ID_CHARS","MAX_OUTPUT_BYTES","GIT_TIMEOUT_MS","collect","record","#runtime","#cacheTtlMs","#cache","#lastReady","#inspect","#stabilize","#git","#gitExecutable","#gh","#ghExecutable","#pullRequest","#mergeBase","#diff","#untrackedDiff","MAX_OUTPUT_BYTES","GIT_TIMEOUT_MS","collect","#runtime","#leasePath","#worktreeRoot","#branchPrefix","#git","#repositoryRoot","#run","#createWorktree","#checkoutRemote","#checkout","#serialize","#readLeases","#writeLeases","#gitPath","#pending","#runtime","#claudeExecutable","#invalidate","#preview","#run","#pending","#execute","#git","#push","#gh","#rejectStagedWarp","#mustRun","#gitExecutable","#ghExecutable","MAX_BODY_BYTES","record","readJson","string","optionalString","MAX_BODY_BYTES","MAX_SESSION_ID_CHARS","record","readJson"],"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/review-comments.ts","../src/adapter.ts","../src/http.ts","../src/doctor-routes.ts","../src/projection-routes.ts","../src/repository-status.ts","../src/repository-setup.ts","../src/repository-actions.ts","../src/repository-setup-routes.ts","../src/repository-action-routes.ts","../src/review-comment-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/** Trailing window that coalesces per-token transcript persistence into one\n * atomic disk write; live subscribers are notified synchronously regardless. */\nconst TEXT_FLUSH_MS = 150\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\n/** Change notification published to live subscribers after each accepted write. */\nexport type ClaudeSidecarDelta =\n | { kind: 'text'; turn: number; step: number; ordinal: number; append?: string; text?: string }\n | { kind: 'activity'; activity: ClaudeActivityEvent }\n | { kind: 'contextUsage'; value: ClaudeContextUsageEvent }\n | { kind: 'tasks'; value: ClaudeTasksEvent }\n | { kind: 'sync' }\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(['text', '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 /** Latest durable projection per session; disk is read once and written through. */\n readonly #latest = new Map<string, ClaudeSidecarProjection>()\n readonly #listeners = new Map<string, Set<(delta: ClaudeSidecarDelta) => void>>()\n /** Streaming transcript segments not yet persisted, keyed by activity key. */\n readonly #live = new Map<string, Map<string, ClaudeActivityEvent>>()\n /** Monotonic revision boost so merged reads advance while text stays in memory. */\n readonly #boost = new Map<string, number>()\n readonly #flushTimers = new Map<string, ReturnType<typeof setTimeout>>()\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.#merged(sessionId, await this.#base(sessionId))\n }\n\n /** Observe accepted changes for one session; returns the unsubscriber. */\n subscribe(sessionId: string, listener: (delta: ClaudeSidecarDelta) => void): () => void {\n let set = this.#listeners.get(sessionId)\n if (set === undefined) {\n set = new Set()\n this.#listeners.set(sessionId, set)\n }\n set.add(listener)\n return () => {\n set.delete(listener)\n if (set.size === 0) this.#listeners.delete(sessionId)\n }\n }\n\n /** Record streaming assistant prose without touching the disk on the hot\n * path: subscribers are notified synchronously (as an append when the\n * redacted text grows in place) and persistence is coalesced. */\n appendTranscriptText(\n sessionId: string,\n value: { turn: number; step: number; ordinal: number; text: string },\n ): void {\n const normalized = normalizeActivity({ kind: 'text', phase: 'updated', ...value })\n const key = activityKey(normalized)\n let overlay = this.#live.get(sessionId)\n if (overlay === undefined) {\n overlay = new Map()\n this.#live.set(sessionId, overlay)\n }\n const previous = overlay.get(key)\n overlay.set(key, normalized)\n this.#boost.set(sessionId, (this.#boost.get(sessionId) ?? 0) + 1)\n const text = normalized.text ?? ''\n const base = { turn: normalized.turn, step: normalized.step, ordinal: normalized.ordinal }\n // Redaction may rewrite earlier characters once a secret completes, so a\n // non-prefix update falls back to a full-text replacement.\n this.#notify(sessionId, previous?.text !== undefined && text.startsWith(previous.text)\n ? { kind: 'text', ...base, append: text.slice(previous.text.length) }\n : { kind: 'text', ...base, text })\n this.#scheduleTextFlush(sessionId)\n }\n\n /** Persist any pending streaming transcript now (segment close, turn end). */\n flushTranscriptText(sessionId: string): Promise<void> {\n const timer = this.#flushTimers.get(sessionId)\n if (timer !== undefined) {\n clearTimeout(timer)\n this.#flushTimers.delete(sessionId)\n }\n return this.#flushLive(sessionId)\n }\n\n #notify(sessionId: string, delta: ClaudeSidecarDelta): void {\n const set = this.#listeners.get(sessionId)\n if (set === undefined) return\n for (const listener of [...set]) {\n try {\n listener(delta)\n } catch {\n // A subscriber failure must never affect durable state.\n }\n }\n }\n\n #merged(sessionId: string, base: ClaudeSidecarProjection): ClaudeSidecarProjection {\n const overlay = this.#live.get(sessionId)\n const boost = this.#boost.get(sessionId) ?? 0\n if ((overlay === undefined || overlay.size === 0) && boost === 0) return base\n return {\n ...base,\n revision: base.revision + boost,\n ...(overlay === undefined || overlay.size === 0\n ? {}\n : { activities: mergeActivities(base.activities, [...overlay.values()]) }),\n }\n }\n\n async #base(sessionId: string): Promise<ClaudeSidecarProjection> {\n const cached = this.#latest.get(sessionId)\n if (cached !== undefined) return cached\n const loaded = await this.#readNow(sessionId)\n this.#latest.set(sessionId, loaded)\n return loaded\n }\n\n #scheduleTextFlush(sessionId: string): void {\n if (this.#flushTimers.has(sessionId)) return\n const timer = setTimeout(() => {\n this.#flushTimers.delete(sessionId)\n void this.#flushLive(sessionId)\n }, TEXT_FLUSH_MS)\n timer.unref?.()\n this.#flushTimers.set(sessionId, timer)\n }\n\n async #flushLive(sessionId: string): Promise<void> {\n const overlay = this.#live.get(sessionId)\n if (overlay === undefined || overlay.size === 0) return\n const entries = [...overlay.entries()]\n try {\n await this.#update(sessionId, current => ({\n ...current,\n activities: mergeActivities(current.activities, entries.map(([, value]) => value)),\n }))\n } catch {\n // Keep the overlay; the next append or flush retries persistence.\n return\n }\n for (const [key, value] of entries) {\n if (overlay.get(key) === value) overlay.delete(key)\n }\n if (overlay.size === 0) this.#live.delete(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 }), false, { kind: 'activity', activity: normalized })\n }\n\n writeContextUsage(sessionId: string, value: ClaudeContextUsageInput): Promise<ClaudeSidecarProjection> {\n const normalized = normalizeContextUsage(value)\n return this.#update(sessionId, current => ({ ...current, contextUsage: normalized }), false, { kind: 'contextUsage', value: 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 }), false, { kind: 'tasks', value: 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, { kind: 'sync' })\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 delta?: ClaudeSidecarDelta,\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.#base(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 this.#latest.set(sessionId, next)\n if (delta !== undefined) this.#notify(sessionId, delta)\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 // CLI ≥ 2.1.238 replays prior user messages (including local-command output\n // echoes with plain string content) when resuming a session. Replays and\n // block-less string echoes carry no tool results; they are not protocol\n // failures and must never kill the session.\n if (message.isReplay === true) return []\n const envelope = record(message.message)\n const content = envelope?.content\n if (typeof content === 'string') return []\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. Every\n // update stays audit-only ('status' never enters the conversation flow);\n // a blocking state surfaces through the repository status bar badge that\n // reads these titles from the projection instead.\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: '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 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 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 { 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 /** Visible prose for the current top-level assistant segment. */\n transcriptText: string\n /** Stable sidecar ordinal reused while the current assistant segment grows. */\n transcriptTextOrdinal: number | undefined\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 #interruptions = new Map<string, Promise<void>>()\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 #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 interruption = this.#interruptions.get(request.agent.id as string)\n if (interruption !== undefined) return interruption.then(() => this.runTurn(request))\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 transcriptText: '',\n transcriptTextOrdinal: undefined,\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.#startInterrupt(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 (active.phase === 'waiting-tasks') {\n // The CLI may automatically react to each completed background task and\n // emit a top-level result, correlated or not. Publish that prose as a\n // completed progress block, but keep the original DSH turn open until\n // every owned task settles and the explicit final report returns.\n await this.#completeProgressSegment(active, message)\n return\n }\n if (message.userMessageUuid !== undefined && message.userMessageUuid !== active.promptUuid) {\n // A stale internal continuation must not settle the explicit final\n // report request. Primary-turn mismatches remain protocol failures.\n if (active.phase === 'follow-up') return\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.transcriptText += message.text\n await this.#upsertTranscriptText(active)\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.transcriptText += message.text\n await this.#upsertTranscriptText(active)\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 if (message.parentToolUseId === undefined) this.#closeTranscriptTextSegment(active)\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) active.callNames.set(message.toolUseId, message.toolName)\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 return\n case 'subagent':\n await this.#appendActivity(active, {\n kind: 'subagent',\n phase: message.phase,\n ...(message.taskId === undefined ? {} : { taskId: message.taskId }),\n title: message.title,\n summary: message.summary,\n detail: message.detail,\n isError: message.phase === 'failed',\n })\n return\n case 'status':\n case 'warning':\n case 'unknown':\n await this.#appendActivity(active, {\n kind: message.kind === 'status' ? 'status' : 'warning',\n phase: 'updated',\n title: message.title,\n ...('summary' in message ? { summary: message.summary } : {}),\n ...('detail' in message ? { detail: message.detail } : {}),\n })\n return\n case 'permission-denied':\n await this.#appendActivity(active, {\n kind: 'permission',\n phase: 'denied',\n toolUseId: message.toolUseId,\n toolName: message.toolName,\n title: message.toolName,\n summary: message.summary,\n })\n return\n }\n }\n\n /** Merge one task lifecycle message into the session's task board. */\n async #trackTask(\n entry: SupervisorEntry,\n message: Extract<NormalizedSdkMessage, { kind: 'subagent' }>,\n taskId: string,\n originTurn: number | undefined,\n ): Promise<void> {\n const previous = entry.tasks.get(taskId)\n const next: ClaudeTaskInfo = {\n taskId,\n description: message.description ?? previous?.description ?? message.title,\n status: message.taskStatus ?? previous?.status ?? 'running',\n }\n const resolvedOriginTurn = previous?.originTurn ?? originTurn\n if (resolvedOriginTurn !== undefined) next.originTurn = resolvedOriginTurn\n const subagentType = message.subagentType ?? previous?.subagentType\n if (subagentType !== undefined) next.subagentType = subagentType\n const taskType = message.taskType ?? previous?.taskType\n if (taskType !== undefined) next.taskType = taskType\n const lastToolName = message.lastToolName ?? previous?.lastToolName\n if (lastToolName !== undefined) next.lastToolName = lastToolName\n const summary = message.summary ?? previous?.summary\n if (summary !== undefined) next.summary = summary\n const usage = message.usage ?? previous?.usage\n if (usage !== undefined) next.usage = usage\n if (previous?.backgrounded === true) next.backgrounded = true\n entry.tasks.set(taskId, next)\n const settled = next.status !== 'running'\n await this.#scheduleTasksSnapshot(entry, settled)\n 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 this.#closeTranscriptTextSegment(active)\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 #completeProgressSegment(\n active: ActiveTurn,\n result: Extract<NormalizedSdkMessage, { kind: 'result' }>,\n recordUsage = true,\n ): Promise<void> {\n if (recordUsage && (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 if (!active.sawTextDelta && active.text.length === 0 && result.text !== undefined) {\n active.text = result.text\n active.transcriptText = result.text\n await this.#upsertTranscriptText(active)\n active.output.push({ type: 'text-delta', text: result.text })\n }\n await this.#upsertTranscriptText(active)\n active.output.push({ type: 'segment-complete', text: active.text })\n active.sawTextDelta = false\n active.text = ''\n this.#closeTranscriptTextSegment(active)\n active.thinking = ''\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.#upsertTranscriptText(active)\n await this.#flushTranscript(active)\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 if (!active.sawTextDelta && active.text.length === 0 && result.text !== undefined) {\n active.text = result.text\n active.transcriptText = result.text\n await this.#upsertTranscriptText(active)\n active.output.push({ type: 'text-delta', text: result.text })\n }\n await this.#upsertTranscriptText(active)\n await this.#flushTranscript(active)\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.transcriptText = result.text\n await this.#upsertTranscriptText(active)\n active.output.push({ type: 'text-delta', text: result.text })\n }\n await this.#upsertTranscriptText(active)\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 await this.#completeProgressSegment(active, result, false)\n return\n }\n await this.#appendSafely(active, {\n kind: 'status',\n phase: 'completed',\n title: 'Claude Code turn completed',\n })\n await this.#flushTranscript(active)\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 #upsertTranscriptText(active: ActiveTurn): Promise<void> {\n if (active.transcriptText.length === 0) return\n const ordinal = active.transcriptTextOrdinal ?? active.cursor.nextOrdinal++\n active.transcriptTextOrdinal = ordinal\n try {\n // Hot path: notify live subscribers synchronously; disk persistence is\n // coalesced inside the repository and flushed at segment/turn edges.\n this.#sidecar.appendTranscriptText(active.agent.id as string, {\n text: active.transcriptText,\n turn: active.cursor.turn,\n step: active.cursor.step,\n ordinal,\n })\n } catch {\n // Transcript persistence is presentational and must not change a Claude outcome.\n }\n }\n\n async #flushTranscript(active: ActiveTurn): Promise<void> {\n await this.#sidecar.flushTranscriptText(active.agent.id as string).catch(() => undefined)\n }\n\n #closeTranscriptTextSegment(active: ActiveTurn): void {\n void this.#flushTranscript(active)\n active.transcriptText = ''\n active.transcriptTextOrdinal = undefined\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 #startInterrupt(entry: SupervisorEntry): Promise<void> {\n const existing = this.#interruptions.get(entry.sessionId)\n if (existing !== undefined) return existing\n const interruption = this.#interrupt(entry).finally(() => {\n this.#interruptions.delete(entry.sessionId)\n })\n this.#interruptions.set(entry.sessionId, interruption)\n return interruption\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 await this.#upsertTranscriptText(active)\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 await this.#upsertTranscriptText(active)\n await this.#flushTranscript(active)\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 { randomUUID } from 'node:crypto'\n\nconst MAX_COMMENTS_PER_SESSION = 50\nconst MAX_TEXT_CHARS = 2_000\nconst MAX_PATH_CHARS = 1_024\nconst MAX_LINE = 10_000_000\n\nexport type ReviewCommentSide = 'old' | 'new'\n\nexport interface ReviewComment {\n readonly id: string\n readonly path: string\n readonly line: number\n readonly side: ReviewCommentSide\n readonly text: string\n}\n\nexport class ReviewCommentError extends Error {\n readonly code: string\n\n constructor(code: string, message: string) {\n super(message)\n this.name = 'ReviewCommentError'\n this.code = code\n }\n}\n\nfunction validSide(value: unknown): value is ReviewCommentSide {\n return value === 'old' || value === 'new'\n}\n\n/** Pending line comments queued per session until the next user turn drains them. */\nexport class ReviewCommentStore {\n readonly #comments = new Map<string, ReviewComment[]>()\n\n add(sessionId: string, input: { path: unknown; line: unknown; side: unknown; text: unknown }): ReviewComment {\n const path = typeof input.path === 'string' ? input.path.trim() : ''\n const text = typeof input.text === 'string' ? input.text.trim() : ''\n if (path.length === 0 || path.length > MAX_PATH_CHARS || /[\\0\\r\\n]/u.test(path)) {\n throw new ReviewCommentError('invalid-request', 'The comment path is invalid.')\n }\n if (text.length === 0 || text.length > MAX_TEXT_CHARS || text.includes('\\0')) {\n throw new ReviewCommentError('invalid-request', 'The comment text is invalid.')\n }\n if (typeof input.line !== 'number' || !Number.isSafeInteger(input.line) || input.line < 1 || input.line > MAX_LINE) {\n throw new ReviewCommentError('invalid-request', 'The comment line is invalid.')\n }\n if (!validSide(input.side)) throw new ReviewCommentError('invalid-request', 'The comment side is invalid.')\n const existing = this.#comments.get(sessionId) ?? []\n if (existing.length >= MAX_COMMENTS_PER_SESSION) {\n throw new ReviewCommentError('too-many-comments', 'Too many pending review comments. Remove one before adding another.')\n }\n const comment: ReviewComment = { id: randomUUID(), path, line: input.line, side: input.side, text }\n this.#comments.set(sessionId, [...existing, comment])\n return comment\n }\n\n remove(sessionId: string, id: string): boolean {\n const existing = this.#comments.get(sessionId)\n if (existing === undefined) return false\n const next = existing.filter(comment => comment.id !== id)\n if (next.length === existing.length) return false\n if (next.length === 0) this.#comments.delete(sessionId)\n else this.#comments.set(sessionId, next)\n return true\n }\n\n list(sessionId: string): readonly ReviewComment[] {\n return this.#comments.get(sessionId) ?? []\n }\n\n /** Remove and return every pending comment; called when a user turn consumes them. */\n drain(sessionId: string): readonly ReviewComment[] {\n const existing = this.#comments.get(sessionId) ?? []\n this.#comments.delete(sessionId)\n return existing\n }\n\n disposeSession(sessionId: string): void {\n this.#comments.delete(sessionId)\n }\n\n dispose(): void {\n this.#comments.clear()\n }\n}\n\n/** Render drained comments as the prompt block preceding the user's message text. */\nexport function formatReviewComments(comments: readonly ReviewComment[]): string {\n const lines = comments.map((comment, index) => (\n `${index + 1}. ${comment.path}:${comment.line}${comment.side === 'old' ? ' (old side)' : ''} — ${comment.text}`\n ))\n return [\n '<user-review-comments>',\n 'The user attached these code review comments to this message. Each references a file and line from the current working tree diff:',\n ...lines,\n '</user-review-comments>',\n ].join('\\n')\n}\n","import {\n LlmAdapter,\n ReasoningEffortId,\n type GenerateOptions,\n type LlmModelInfo,\n type LlmProviderInfo,\n type LlmResolvedModelInfo,\n type PreparedAdapterCall,\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'\nimport { formatReviewComments, type ReviewComment } from './review-comments.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\n/**\n * Prepend the session's pending diff-review comments to the outgoing user\n * prompt. The comments are drained once per turn: they are formatted into one\n * `<user-review-comments>` block placed ahead of the user's own text (or as a\n * leading text block for multi-part prompts) so Claude reads them in the same\n * turn that consumed them.\n */\nexport function injectReviewComments(prompt: ClaudePrompt, comments: readonly ReviewComment[]): ClaudePrompt {\n if (comments.length === 0) return prompt\n const block = formatReviewComments(comments)\n if (typeof prompt === 'string') return `${block}\\n\\n${prompt}`\n return [{ type: 'text', text: block }, ...prompt]\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 readonly #drainReviewComments: (sessionId: string) => readonly ReviewComment[]\n\n constructor(\n supervisor: ClaudeSupervisor,\n agents: Pick<AgentRegistry, 'currentInitiator' | 'get'>,\n attachments: AttachmentReader,\n presetIdFor: (agent: Agent) => string | undefined,\n drainReviewComments: (sessionId: string) => readonly ReviewComment[] = () => [],\n ) {\n super()\n this.#supervisor = supervisor\n this.#agents = agents\n this.#attachments = attachments\n this.#presetIdFor = presetIdFor\n this.#drainReviewComments = drainReviewComments\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, _signal?: AbortSignal): 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 prepareCall(\n provider: string,\n model: string,\n signal?: AbortSignal,\n ): Promise<PreparedAdapterCall> {\n return {\n model: await this.resolveModel(provider, model, signal),\n stream: options => this.stream(options),\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: injectReviewComments(prompt, this.#drainReviewComments(agent.id as string)),\n model: options.model,\n ...(thinkingMode === undefined ? {} : { thinkingMode }),\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n })\n\n let pendingUsage: TokenUsage | undefined\n let completed = false\n try {\n for await (const event of events) {\n // The sidecar owns the complete visible transcript so prose and Claude\n // tool groups can share one exact ordinal stream. DSH receives only an\n // empty assistant completion anchor plus usage/lifecycle metadata.\n if (event.type === 'text-delta' || event.type === 'segment-complete') continue\n if (event.type === 'usage') {\n pendingUsage = tokenUsage(event.usage)\n continue\n }\n completed = true\n if (pendingUsage !== undefined) yield { type: 'usage', usage: pendingUsage }\n yield { type: 'finish', reason: { kind: 'stop' } }\n }\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n completed = true\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 drainReviewComments: (sessionId: string) => readonly ReviewComment[] = () => [],\n): ClaudeCodeAdapter {\n return new ClaudeCodeAdapter(supervisor, agents, attachments, presetIdFor, drainReviewComments)\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 type { ServerResponse } from 'node:http'\nimport { CLAUDE_PROJECTION_PATH } from './constants.ts'\nimport { json, trustedRequest } from './http.ts'\nimport type { ClaudeSidecarProjection, ClaudeSidecarRepository } from './sidecar.ts'\nimport type { ClaudeCommandView } from './command-bridge.ts'\nimport type { RepositoryStatus } from './repository-status.ts'\nimport type { ReviewComment } from './review-comments.ts'\n\nconst MAX_SESSION_ID_CHARS = 1_024\n/** Slow-moving metadata refresh and stream heartbeat cadence; deliberately off\n * the transcript hot path so git/gh latency never delays visible text. */\nconst META_REFRESH_MS = 5_000\n\ninterface ProjectionTarget {\n readonly sessionId: string\n readonly stream: boolean\n}\n\nfunction targetFromUrl(rawUrl: string | undefined): ProjectionTarget | 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 let encoded = pathname.slice(prefix.length)\n const stream = encoded.endsWith('/stream')\n if (stream) encoded = encoded.slice(0, -'/stream'.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, stream }\n } catch {\n return undefined\n }\n}\n\ninterface ProjectionMeta {\n readonly owned: boolean\n readonly commands: readonly ClaudeCommandView[]\n readonly repository?: RepositoryStatus\n readonly reviewComments: readonly ReviewComment[]\n}\n\nfunction envelope(projection: ClaudeSidecarProjection, meta: ProjectionMeta): Record<string, unknown> {\n return {\n schemaVersion: projection.schemaVersion,\n revision: projection.revision,\n owned: meta.owned,\n commands: meta.commands,\n activities: projection.activities,\n ...(projection.contextUsage === undefined ? {} : { contextUsage: projection.contextUsage }),\n ...(projection.tasks === undefined ? {} : { tasks: projection.tasks }),\n ...(meta.repository === undefined ? {} : { repository: meta.repository }),\n reviewComments: meta.reviewComments,\n }\n}\n\n/** Register the browser-readable, credential-free sidecar projection endpoint.\n * `GET <path>/:sessionId` returns one snapshot; `GET <path>/:sessionId/stream`\n * returns an NDJSON stream: a full snapshot line followed by incremental\n * transcript/activity deltas and periodic metadata/heartbeat lines. */\nexport function registerClaudeProjectionRoute(\n ctx: Context,\n sidecar: ClaudeSidecarRepository,\n ownsSession: (sessionId: string) => boolean,\n commandsForSession: (sessionId: string) => readonly ClaudeCommandView[] = () => [],\n repositoryForSession: (sessionId: string) => Promise<RepositoryStatus | undefined> = async () => undefined,\n reviewCommentsForSession: (sessionId: string) => readonly ReviewComment[] = () => [],\n): void {\n const info = (message: string): void => {\n ctx.logger?.info?.(message)\n }\n\n const assembleMeta = async (sessionId: string): Promise<ProjectionMeta> => {\n const owned = ownsSession(sessionId)\n const repository = owned ? await repositoryForSession(sessionId) : undefined\n return {\n owned,\n commands: commandsForSession(sessionId),\n ...(repository === undefined ? {} : { repository }),\n reviewComments: owned ? reviewCommentsForSession(sessionId) : [],\n }\n }\n\n const streamProjection = async (res: ServerResponse, sessionId: string): Promise<void> => {\n info(`dsh-claude: projection stream opened for ${sessionId.slice(0, 64)}`)\n // Delta-cadence telemetry: reveals upstream text granularity in the log.\n let textDeltas = 0\n let textBytes = 0\n let textSince = Date.now()\n let meta = await assembleMeta(sessionId)\n res.writeHead(200, {\n 'content-type': 'application/x-ndjson; charset=utf-8',\n 'cache-control': 'no-store',\n 'x-content-type-options': 'nosniff',\n })\n res.flushHeaders?.()\n let closed = false\n const writeLine = (value: unknown): void => {\n if (closed) return\n try {\n res.write(`${JSON.stringify(value)}\\n`)\n } catch {\n closed = true\n }\n }\n const writeSnapshot = async (): Promise<void> => {\n const projection = await sidecar.read(sessionId)\n writeLine({ type: 'snapshot', ...envelope(projection, meta) })\n }\n await writeSnapshot()\n const unsubscribe = sidecar.subscribe(sessionId, delta => {\n switch (delta.kind) {\n case 'text':\n textDeltas += 1\n textBytes += (delta.append ?? delta.text ?? '').length\n if (textDeltas % 25 === 0) {\n const elapsed = Date.now() - textSince\n info(`dsh-claude: stream ${sessionId.slice(0, 24)} 25 text deltas ${textBytes}B in ${elapsed}ms`)\n textBytes = 0\n textSince = Date.now()\n }\n writeLine({\n type: 'text',\n turn: delta.turn,\n step: delta.step,\n ordinal: delta.ordinal,\n ...(delta.append === undefined ? {} : { append: delta.append }),\n ...(delta.text === undefined ? {} : { text: delta.text }),\n })\n return\n case 'activity':\n writeLine({ type: 'activity', activity: delta.activity })\n return\n case 'contextUsage':\n writeLine({ type: 'contextUsage', value: delta.value })\n return\n case 'tasks':\n writeLine({ type: 'tasks', value: delta.value })\n return\n case 'sync':\n void writeSnapshot().catch(() => undefined)\n }\n })\n const timer = setInterval(() => {\n void (async () => {\n const next = await assembleMeta(sessionId)\n if (closed) return\n if (JSON.stringify(next) === JSON.stringify(meta)) {\n writeLine({ type: 'ping' })\n return\n }\n meta = next\n writeLine({\n type: 'meta',\n owned: meta.owned,\n commands: meta.commands,\n ...(meta.repository === undefined ? {} : { repository: meta.repository }),\n reviewComments: meta.reviewComments,\n })\n })().catch(() => undefined)\n }, META_REFRESH_MS)\n timer.unref?.()\n await new Promise<void>(resolve => {\n res.on('close', () => {\n closed = true\n clearInterval(timer)\n unsubscribe()\n info(`dsh-claude: projection stream closed for ${sessionId.slice(0, 64)} after ${textDeltas} text deltas`)\n resolve()\n })\n })\n }\n\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 target = targetFromUrl(req.url)\n if (target === undefined) return json(res, 400, { error: 'invalid session id' })\n try {\n if (target.stream) return await streamProjection(res, target.sessionId)\n // A steady 2s cadence here means a stale (pre-streaming) client bundle.\n info(`dsh-claude: projection poll for ${target.sessionId.slice(0, 64)}`)\n const projection = await sidecar.read(target.sessionId)\n return json(res, 200, envelope(projection, await assembleMeta(target.sessionId)))\n } catch {\n if (!res.headersSent) return json(res, 500, { error: 'projection unavailable' })\n res.end()\n }\n },\n }), 'dsh-claude: sidecar projection route')\n}\n","import type { SubprocessHandle, SubprocessRuntime } from '@deepseek-ai/dsh-subprocess'\n\nconst MAX_OUTPUT_BYTES = 64 * 1024\nconst MAX_DIFF_BYTES = 256 * 1024\nconst MAX_UNTRACKED_DIFFS = 50\nconst GIT_TIMEOUT_MS = 5_000\nconst GH_TIMEOUT_MS = 8_000\nconst CACHE_TTL_MS = 5_000\nconst MAX_TEXT_CHARS = 1_024\n\nexport type RepositoryCheckState = 'passing' | 'pending' | 'failing' | 'none'\nexport type RepositoryReviewState = 'approved' | 'changes-requested' | 'review-required' | 'none'\n\nexport interface RepositoryPullRequestStatus {\n readonly number: number\n readonly title: string\n readonly url: string\n readonly state: 'open' | 'closed' | 'merged'\n readonly draft: boolean\n readonly review: RepositoryReviewState\n readonly checks: RepositoryCheckState\n readonly mergeState?: string\n readonly author?: string\n readonly createdAt?: string\n readonly mergedAt?: string\n readonly baseBranch?: string\n}\n\nexport interface RepositoryDiffStatus {\n readonly additions: number\n readonly deletions: number\n readonly files: number\n readonly patch?: string\n readonly truncated: boolean\n}\n\nexport interface RepositoryStatus {\n readonly status: 'ready' | 'not-repository' | 'unavailable'\n readonly cwd: string\n readonly root?: string\n readonly branch?: string\n readonly detached?: boolean\n readonly worktree?: boolean\n readonly dirty?: boolean\n readonly upstream?: boolean\n readonly ahead?: number\n readonly behind?: number\n readonly remote?: string\n readonly pullRequest?: RepositoryPullRequestStatus\n readonly diff?: RepositoryDiffStatus\n}\n\ntype RepositoryRuntime = Pick<SubprocessRuntime, 'resolveExecutable' | 'spawn'>\n\ninterface CommandResult {\n readonly exitCode: number | null\n readonly stdout: string\n readonly lossy: boolean\n}\n\nfunction bounded(value: string): string {\n return value.trim().slice(0, MAX_TEXT_CHARS)\n}\n\nasync function collect(handle: SubprocessHandle): Promise<CommandResult> {\n const outcome = await handle.done\n const stdout = handle.collected.stdout?.readFrom(0)\n return {\n exitCode: outcome.exitCode,\n stdout: stdout?.text ?? '',\n lossy: stdout?.lossy === true,\n }\n}\n\nasync function run(\n runtime: RepositoryRuntime,\n executable: string,\n args: readonly string[],\n cwd: string,\n timeoutMs: number,\n maxBytes = MAX_OUTPUT_BYTES,\n): Promise<CommandResult> {\n const signal = AbortSignal.timeout(timeoutMs)\n return collect(runtime.spawn({\n argv: [executable, ...args],\n cwd,\n stdio: {\n stdin: 'ignore',\n stdout: { maxBytes },\n stderr: { maxBytes: MAX_OUTPUT_BYTES },\n },\n graceMs: 1_000,\n signal,\n env: {},\n }))\n}\n\nfunction normalizedPath(value: string): string {\n return value.replaceAll('\\\\', '/').replace(/\\/+$/u, '').toLocaleLowerCase('en-US')\n}\n\nexport function parseGitStatus(output: string): {\n branch?: string\n detached: boolean\n dirty: boolean\n upstream: boolean\n ahead?: number\n behind?: number\n} {\n let branch: string | undefined\n let detached = false\n let dirty = false\n let upstream = false\n let ahead: number | undefined\n let behind: number | undefined\n for (const line of output.split(/\\r?\\n/u)) {\n if (line.startsWith('# branch.head ')) {\n const head = bounded(line.slice('# branch.head '.length))\n if (head === '(detached)') detached = true\n else if (head.length > 0 && head !== '(unknown)') branch = head\n continue\n }\n if (line.startsWith('# branch.upstream ')) {\n upstream = true\n continue\n }\n if (line.startsWith('# branch.ab ')) {\n const counts = /^# branch\\.ab \\+(\\d+) -(\\d+)$/u.exec(line)\n if (counts !== null) {\n ahead = Number(counts[1])\n behind = Number(counts[2])\n }\n continue\n }\n if (line.length > 0 && !line.startsWith('# ')) dirty = true\n }\n return {\n ...(branch === undefined ? {} : { branch }),\n detached,\n dirty,\n upstream,\n ...(ahead === undefined ? {} : { ahead }),\n ...(behind === undefined ? {} : { behind }),\n }\n}\n\nexport function parseDiffNumstat(value: string): Omit<RepositoryDiffStatus, 'patch' | 'truncated'> {\n let additions = 0\n let deletions = 0\n let files = 0\n for (const line of value.split(/\\r?\\n/u)) {\n if (line.length === 0) continue\n const [added, deleted] = line.split('\\t')\n files += 1\n if (added !== undefined && /^\\d+$/u.test(added)) additions += Number(added)\n if (deleted !== undefined && /^\\d+$/u.test(deleted)) deletions += Number(deleted)\n }\n return { additions, deletions, files }\n}\n\nexport function parseGitHubRemote(value: string): string | undefined {\n const remote = bounded(value)\n const match = /^(?:https:\\/\\/github\\.com\\/|git@github\\.com:|ssh:\\/\\/git@github\\.com\\/)([^/\\s]+)\\/([^/\\s]+?)(?:\\.git)?$/iu.exec(remote)\n if (match?.[1] === undefined || match[2] === undefined) return undefined\n return `${match[1]}/${match[2]}`\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\nexport function aggregateChecks(value: unknown): RepositoryCheckState {\n if (!Array.isArray(value) || value.length === 0) return 'none'\n let pending = false\n for (const item of value) {\n const check = record(item)\n if (check === undefined) continue\n const conclusion = typeof check.conclusion === 'string' ? check.conclusion.toUpperCase() : undefined\n const status = typeof check.status === 'string' ? check.status.toUpperCase() : undefined\n const state = typeof check.state === 'string' ? check.state.toUpperCase() : undefined\n if (['FAILURE', 'ERROR', 'CANCELLED', 'TIMED_OUT', 'ACTION_REQUIRED'].includes(conclusion ?? state ?? '')) return 'failing'\n if (status !== undefined && status !== 'COMPLETED') pending = true\n if (['PENDING', 'EXPECTED'].includes(state ?? '')) pending = true\n }\n return pending ? 'pending' : 'passing'\n}\n\nfunction reviewState(value: unknown): RepositoryReviewState {\n if (value === 'APPROVED') return 'approved'\n if (value === 'CHANGES_REQUESTED') return 'changes-requested'\n if (value === 'REVIEW_REQUIRED') return 'review-required'\n return 'none'\n}\n\nexport function parsePullRequest(value: unknown): RepositoryPullRequestStatus | undefined {\n const input = record(value)\n if (input === undefined\n || !Number.isSafeInteger(input.number)\n || Number(input.number) <= 0\n || typeof input.title !== 'string'\n || typeof input.url !== 'string') return undefined\n let url: URL\n try {\n url = new URL(input.url)\n } catch {\n return undefined\n }\n if (url.protocol !== 'https:' || url.hostname !== 'github.com') return undefined\n const rawState = typeof input.state === 'string' ? input.state.toUpperCase() : ''\n const state = input.mergedAt !== undefined && input.mergedAt !== null\n ? 'merged'\n : rawState === 'OPEN' ? 'open' : rawState === 'CLOSED' ? 'closed' : undefined\n if (state === undefined) return undefined\n return {\n number: Number(input.number),\n title: bounded(input.title),\n url: url.href,\n state,\n draft: input.isDraft === true,\n review: reviewState(input.reviewDecision),\n checks: aggregateChecks(input.statusCheckRollup),\n ...(typeof input.mergeStateStatus === 'string'\n ? { mergeState: bounded(input.mergeStateStatus) }\n : {}),\n ...(typeof record(input.author)?.login === 'string'\n ? { author: bounded(String(record(input.author)?.login)) }\n : {}),\n ...(typeof input.createdAt === 'string' && Number.isFinite(Date.parse(input.createdAt))\n ? { createdAt: new Date(input.createdAt).toISOString() }\n : {}),\n ...(typeof input.mergedAt === 'string' && Number.isFinite(Date.parse(input.mergedAt))\n ? { mergedAt: new Date(input.mergedAt).toISOString() }\n : {}),\n ...(typeof input.baseRefName === 'string' && bounded(input.baseRefName).length > 0\n ? { baseBranch: bounded(input.baseRefName) }\n : {}),\n }\n}\n\nexport class RepositoryStatusService {\n readonly #runtime: RepositoryRuntime\n readonly #cacheTtlMs: number\n readonly #cache = new Map<string, { expiresAt: number; value: Promise<RepositoryStatus> }>()\n readonly #lastReady = new Map<string, RepositoryStatus>()\n #gitExecutable?: Promise<string>\n #ghExecutable?: Promise<string | undefined>\n\n constructor(runtime: RepositoryRuntime, cacheTtlMs = CACHE_TTL_MS) {\n this.#runtime = runtime\n this.#cacheTtlMs = cacheTtlMs\n }\n\n inspect(cwd: string): Promise<RepositoryStatus> {\n const current = this.#cache.get(cwd)\n if (current !== undefined && current.expiresAt > Date.now()) return current.value\n const value = this.#inspect(cwd).then(next => this.#stabilize(cwd, next))\n this.#cache.set(cwd, { expiresAt: Date.now() + this.#cacheTtlMs, value })\n void value.catch(() => this.#cache.delete(cwd))\n return value\n }\n\n invalidate(cwd: string): void {\n this.#cache.delete(cwd)\n this.#lastReady.delete(cwd)\n }\n\n dispose(): void {\n this.#cache.clear()\n this.#lastReady.clear()\n }\n\n #stabilize(cwd: string, next: RepositoryStatus): RepositoryStatus {\n const previous = this.#lastReady.get(cwd)\n if (next.status !== 'ready') return previous ?? next\n const sameCheckout = previous?.status === 'ready'\n && previous.root === next.root\n && previous.branch === next.branch\n const stable = sameCheckout\n ? {\n ...next,\n ...(next.pullRequest === undefined && previous.pullRequest !== undefined ? { pullRequest: previous.pullRequest } : {}),\n ...(next.pullRequest === undefined && previous.pullRequest !== undefined && previous.diff !== undefined\n ? { diff: previous.diff }\n : next.diff === undefined && previous.diff !== undefined ? { diff: previous.diff } : {}),\n }\n : next\n this.#lastReady.set(cwd, stable)\n return stable\n }\n\n async #git(): Promise<string> {\n this.#gitExecutable ??= this.#runtime.resolveExecutable('git')\n return this.#gitExecutable\n }\n\n async #gh(): Promise<string | undefined> {\n this.#ghExecutable ??= this.#runtime.resolveExecutable('gh').catch(() => undefined)\n return this.#ghExecutable\n }\n\n async #inspect(cwd: string): Promise<RepositoryStatus> {\n const safeCwd = bounded(cwd)\n let git: string\n try {\n git = await this.#git()\n } catch {\n return { status: 'unavailable', cwd: safeCwd }\n }\n try {\n const paths = await run(this.#runtime, git, [\n 'rev-parse', '--path-format=absolute', '--show-toplevel', '--absolute-git-dir', '--git-common-dir',\n ], cwd, GIT_TIMEOUT_MS)\n if (paths.exitCode !== 0) return { status: 'not-repository', cwd: safeCwd }\n const [rootValue, gitDirValue, commonDirValue] = paths.stdout.split(/\\r?\\n/u)\n const root = bounded(rootValue ?? '')\n const gitDir = bounded(gitDirValue ?? '')\n const commonDir = bounded(commonDirValue ?? '')\n if (root.length === 0 || gitDir.length === 0 || commonDir.length === 0) return { status: 'unavailable', cwd: safeCwd }\n const statusResult = await run(this.#runtime, git, ['status', '--porcelain=v2', '--branch', '--untracked-files=normal'], cwd, GIT_TIMEOUT_MS)\n if (statusResult.exitCode !== 0) return { status: 'unavailable', cwd: safeCwd }\n const status = parseGitStatus(statusResult.stdout)\n const remoteResult = await run(this.#runtime, git, ['remote', 'get-url', 'origin'], cwd, GIT_TIMEOUT_MS)\n const remote = remoteResult.exitCode === 0 ? parseGitHubRemote(remoteResult.stdout) : undefined\n const pullRequest = status.branch === undefined || remote === undefined\n ? undefined\n : await this.#pullRequest(cwd, remote, status.branch)\n const diffBase = pullRequest?.baseBranch === undefined\n ? 'HEAD'\n : await this.#mergeBase(cwd, git, pullRequest.baseBranch) ?? 'HEAD'\n const diff = status.dirty || diffBase !== 'HEAD'\n ? await this.#diff(cwd, git, diffBase)\n : { additions: 0, deletions: 0, files: 0, truncated: false }\n return {\n status: 'ready',\n cwd: safeCwd,\n root,\n ...status,\n worktree: normalizedPath(gitDir) !== normalizedPath(commonDir),\n ...(remote === undefined ? {} : { remote }),\n ...(pullRequest === undefined ? {} : { pullRequest }),\n ...(diff === undefined ? {} : { diff }),\n }\n } catch {\n return { status: 'unavailable', cwd: safeCwd }\n }\n }\n\n async #mergeBase(cwd: string, git: string, baseBranch: string): Promise<string | undefined> {\n try {\n const result = await run(this.#runtime, git, ['merge-base', 'HEAD', `refs/remotes/origin/${baseBranch}`], cwd, GIT_TIMEOUT_MS)\n if (result.exitCode !== 0 || result.lossy) return undefined\n const oid = bounded(result.stdout)\n return /^[0-9a-f]{40}$/iu.test(oid) ? oid : undefined\n } catch {\n return undefined\n }\n }\n\n async #diff(cwd: string, git: string, base: string): Promise<RepositoryDiffStatus | undefined> {\n try {\n const numstat = await run(this.#runtime, git, ['diff', '--no-ext-diff', '--numstat', base, '--'], cwd, GIT_TIMEOUT_MS)\n if (numstat.exitCode !== 0 || numstat.lossy) return undefined\n const summary = parseDiffNumstat(numstat.stdout)\n const patch = await run(this.#runtime, git, ['diff', '--no-ext-diff', '--no-color', '--unified=3', base, '--'], cwd, GIT_TIMEOUT_MS, MAX_DIFF_BYTES)\n if (patch.exitCode !== 0) return { ...summary, truncated: true }\n const untracked = await this.#untrackedDiff(cwd, git)\n const combinedPatch = `${patch.stdout}${untracked.patch}`\n return {\n additions: summary.additions + untracked.additions,\n deletions: summary.deletions,\n files: summary.files + untracked.files,\n ...(patch.lossy ? {} : { patch: combinedPatch.slice(0, MAX_DIFF_BYTES) }),\n truncated: patch.lossy || untracked.truncated || combinedPatch.length > MAX_DIFF_BYTES,\n }\n } catch {\n return undefined\n }\n }\n\n async #untrackedDiff(cwd: string, git: string): Promise<{ additions: number; files: number; patch: string; truncated: boolean }> {\n const listed = await run(this.#runtime, git, ['ls-files', '--others', '--exclude-standard', '-z'], cwd, GIT_TIMEOUT_MS)\n if (listed.exitCode !== 0 || listed.lossy) return { additions: 0, files: 0, patch: '', truncated: listed.lossy }\n const paths = listed.stdout.split('\\0').filter(path => path.length > 0)\n let additions = 0\n let patch = ''\n let truncated = paths.length > MAX_UNTRACKED_DIFFS\n for (const path of paths.slice(0, MAX_UNTRACKED_DIFFS)) {\n const result = await run(this.#runtime, git, [\n 'diff', '--no-ext-diff', '--no-color', '--unified=3', '--numstat', '--patch', '--no-index', '--', '/dev/null', path,\n ], cwd, GIT_TIMEOUT_MS, MAX_DIFF_BYTES)\n if (result.exitCode !== 0 && result.exitCode !== 1) {\n truncated = true\n continue\n }\n const start = result.stdout.indexOf('diff --git ')\n additions += parseDiffNumstat(start >= 0 ? result.stdout.slice(0, start) : result.stdout).additions\n if (result.lossy) truncated = true\n else if (start >= 0) patch += result.stdout.slice(start)\n }\n return { additions, files: paths.length, patch, truncated }\n }\n\n async #pullRequest(cwd: string, repository: string, branch: string): Promise<RepositoryPullRequestStatus | undefined> {\n const gh = await this.#gh()\n if (gh === undefined) return undefined\n try {\n const result = await run(this.#runtime, gh, [\n 'pr', 'view', branch,\n '--repo', repository,\n '--json', 'number,title,url,state,isDraft,reviewDecision,mergeStateStatus,mergedAt,statusCheckRollup,author,createdAt,baseRefName',\n ], cwd, GH_TIMEOUT_MS)\n if (result.exitCode !== 0) return undefined\n return parsePullRequest(JSON.parse(result.stdout))\n } catch {\n return undefined\n }\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { mkdir, readFile, rename, rm, writeFile } from 'node:fs/promises'\nimport { basename, isAbsolute, join, resolve } from 'node:path'\nimport { dshHomePath } from '@deepseek-ai/dsh-home-paths'\nimport type { SubprocessHandle, SubprocessRuntime } from '@deepseek-ai/dsh-subprocess'\n\nconst MAX_OUTPUT_BYTES = 128 * 1024\nconst GIT_TIMEOUT_MS = 10_000\nconst GIT_FETCH_TIMEOUT_MS = 60_000\nconst MAX_PATH_CHARS = 4_096\nconst MAX_BRANCH_CHARS = 512\nconst LEASE_SCHEMA_VERSION = 1\n\ntype RepositorySetupRuntime = Pick<SubprocessRuntime, 'resolveExecutable' | 'spawn'>\n\ninterface CommandResult {\n readonly exitCode: number | null\n readonly stdout: string\n readonly stderr: string\n readonly lossy: boolean\n}\n\nexport interface RepositoryBranchList {\n readonly root: string\n readonly current?: string\n readonly dirty: boolean\n readonly branches: readonly string[]\n readonly remoteBranches: readonly string[]\n}\n\nexport type RepositorySetupStage = 'inspecting' | 'fetching' | 'creating-worktree' | 'saving-worktree' | 'switching-branch'\nexport type RepositorySetupProgress = (stage: RepositorySetupStage) => void\n\nexport interface RepositorySetupResult {\n readonly mode: 'checkout' | 'worktree'\n readonly root: string\n readonly path: string\n readonly branch: string\n readonly leaseId?: string\n}\n\ninterface WorktreeLease {\n readonly id: string\n readonly root: string\n readonly path: string\n readonly branch: string\n readonly createdAt: string\n readonly pluginGeneratedBranch: boolean\n readonly sessionId?: string\n}\n\ninterface LeaseDocument {\n readonly schemaVersion: typeof LEASE_SCHEMA_VERSION\n readonly leases: readonly WorktreeLease[]\n}\n\nexport interface RepositorySetupServiceOptions {\n readonly leasePath?: string\n readonly worktreeRoot?: string\n readonly branchPrefix?: () => Promise<string>\n}\n\nexport class RepositorySetupError extends Error {\n readonly code: string\n\n constructor(code: string, message: string) {\n super(message)\n this.name = 'RepositorySetupError'\n this.code = code\n }\n}\n\nasync function collect(handle: SubprocessHandle): Promise<CommandResult> {\n const outcome = await handle.done\n const stdout = handle.collected.stdout?.readFrom(0)\n const stderr = handle.collected.stderr?.readFrom(0)\n return {\n exitCode: outcome.exitCode,\n stdout: stdout?.text ?? '',\n stderr: stderr?.text ?? '',\n lossy: stdout?.lossy === true || stderr?.lossy === true,\n }\n}\n\nfunction safePath(value: string): string {\n if (value.length === 0 || value.length > MAX_PATH_CHARS || !isAbsolute(value) || value.includes('\\0')) {\n throw new RepositorySetupError('invalid-path', 'The workspace path is invalid.')\n }\n return resolve(value)\n}\n\nfunction safeBranch(value: string): string {\n if (value.length === 0 || value.length > MAX_BRANCH_CHARS || value.trim() !== value || /[\\0\\r\\n]/u.test(value)) {\n throw new RepositorySetupError('invalid-branch', 'The branch name is invalid.')\n }\n return value\n}\n\nfunction parseCurrentBranch(value: string): string | undefined {\n const branch = value.trim()\n return branch.length === 0 || branch === 'HEAD' ? undefined : branch\n}\n\nexport function parseWorktreeBranches(value: string): ReadonlyMap<string, string> {\n const occupied = new Map<string, string>()\n let path: string | undefined\n for (const line of `${value}\\n`.split(/\\r?\\n/u)) {\n if (line.startsWith('worktree ')) path = line.slice('worktree '.length)\n else if (line.startsWith('branch refs/heads/') && path !== undefined) {\n occupied.set(line.slice('branch refs/heads/'.length), path)\n } else if (line.length === 0) path = undefined\n }\n return occupied\n}\n\nfunction slug(value: string, fallback: string): string {\n const normalized = value.toLocaleLowerCase('en-US').replace(/[^a-z0-9._-]+/gu, '-').replace(/^-+|-+$/gu, '')\n return normalized.slice(0, 48) || fallback\n}\n\nfunction lease(value: unknown): WorktreeLease | undefined {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return undefined\n const input = value as Record<string, unknown>\n if (typeof input.id !== 'string' || typeof input.root !== 'string' || typeof input.path !== 'string'\n || typeof input.branch !== 'string' || typeof input.createdAt !== 'string'\n || (input.pluginGeneratedBranch !== undefined && typeof input.pluginGeneratedBranch !== 'boolean')\n || (input.sessionId !== undefined && typeof input.sessionId !== 'string')) return undefined\n return {\n id: input.id,\n root: input.root,\n path: input.path,\n branch: input.branch,\n createdAt: input.createdAt,\n pluginGeneratedBranch: input.pluginGeneratedBranch === true,\n ...(input.sessionId === undefined ? {} : { sessionId: input.sessionId }),\n }\n}\n\nexport class RepositorySetupService {\n readonly #runtime: RepositorySetupRuntime\n readonly #leasePath: string\n readonly #worktreeRoot: string\n readonly #branchPrefix: () => Promise<string>\n #gitPath: Promise<string> | undefined\n #pending: Promise<unknown> = Promise.resolve()\n\n constructor(runtime: RepositorySetupRuntime, options: RepositorySetupServiceOptions = {}) {\n this.#runtime = runtime\n this.#leasePath = options.leasePath ?? dshHomePath('plugins', 'dsh-claude', 'worktrees.json')\n this.#worktreeRoot = options.worktreeRoot ?? dshHomePath('plugins', 'dsh-claude', 'worktrees')\n this.#branchPrefix = options.branchPrefix ?? (async () => 'claude')\n }\n\n async listBranches(cwd: string): Promise<RepositoryBranchList> {\n const git = await this.#git()\n const root = await this.#repositoryRoot(git, safePath(cwd))\n const [status, refs, remoteRefs] = await Promise.all([\n this.#run(git, ['status', '--porcelain=v2', '--branch', '--untracked-files=normal'], root),\n this.#run(git, ['for-each-ref', '--format=%(refname:short)', 'refs/heads'], root),\n this.#run(git, ['for-each-ref', '--format=%(refname:short) %(symref)', 'refs/remotes'], root),\n ])\n if (status.exitCode !== 0 || status.lossy || refs.exitCode !== 0 || refs.lossy\n || remoteRefs.exitCode !== 0 || remoteRefs.lossy) {\n throw new RepositorySetupError('repository-unavailable', 'The repository state is unavailable.')\n }\n const current = status.stdout.split(/\\r?\\n/u)\n .find(line => line.startsWith('# branch.head '))\n ?.slice('# branch.head '.length)\n const branches = refs.stdout.split(/\\r?\\n/u).filter(Boolean).sort((left, right) => left.localeCompare(right))\n const remoteBranches = remoteRefs.stdout.split(/\\r?\\n/u)\n .map(line => line.trim().split(/\\s+/u))\n .filter(parts => parts[0] !== undefined && parts[0].length > 0 && parts.length === 1)\n .map(parts => parts[0]!)\n .sort((left, right) => left.localeCompare(right))\n const currentBranch = current === undefined ? undefined : parseCurrentBranch(current)\n return {\n root,\n ...(currentBranch === undefined ? {} : { current: currentBranch }),\n dirty: status.stdout.split(/\\r?\\n/u).some(line => line.length > 0 && !line.startsWith('# ')),\n branches,\n remoteBranches,\n }\n }\n\n async setup(\n cwd: string,\n branchValue: string,\n useWorktree: boolean,\n explicitBranchName?: string,\n progress: RepositorySetupProgress = () => {},\n ): Promise<RepositorySetupResult> {\n progress('inspecting')\n const branch = safeBranch(branchValue)\n const info = await this.listBranches(cwd)\n const local = info.branches.includes(branch)\n const remote = info.remoteBranches.includes(branch)\n if (!local && !remote) {\n throw new RepositorySetupError('branch-not-found', 'The selected local or remote-tracking branch does not exist.')\n }\n const requestedBranch = explicitBranchName === undefined ? undefined : safeBranch(explicitBranchName)\n if (useWorktree) {\n return this.#createWorktree(\n info.root,\n branch,\n local ? `refs/heads/${branch}` : `refs/remotes/${branch}`,\n requestedBranch,\n progress,\n )\n }\n progress('switching-branch')\n return !local && remote ? this.#checkoutRemote(info, branch) : this.#checkout(info, branch)\n }\n\n bindLease(leaseId: string, sessionId: string): Promise<void> {\n if (leaseId.length === 0 || leaseId.length > 128 || sessionId.length === 0 || sessionId.length > 1_024) {\n return Promise.reject(new RepositorySetupError('invalid-lease', 'The worktree lease is invalid.'))\n }\n return this.#serialize(async () => {\n const leases = await this.#readLeases()\n const index = leases.findIndex(item => item.id === leaseId)\n if (index < 0) throw new RepositorySetupError('lease-not-found', 'The worktree lease no longer exists.')\n const existing = leases[index]\n if (existing === undefined) throw new RepositorySetupError('lease-not-found', 'The worktree lease no longer exists.')\n leases[index] = { ...existing, sessionId }\n await this.#writeLeases(leases)\n })\n }\n\n cleanupSession(sessionId: string): Promise<void> {\n return this.#serialize(async () => {\n const leases = await this.#readLeases()\n const retained: WorktreeLease[] = []\n let changed = false\n const git = await this.#git()\n for (const item of leases) {\n if (item.sessionId !== sessionId) {\n retained.push(item)\n continue\n }\n try {\n const status = await this.#run(git, ['status', '--porcelain=v1', '--untracked-files=normal'], item.path)\n if (status.exitCode !== 0 || status.lossy || status.stdout.trim().length > 0) {\n retained.push(item)\n continue\n }\n const removed = await this.#run(git, ['worktree', 'remove', '--', item.path], item.root)\n if (removed.exitCode !== 0) {\n retained.push(item)\n continue\n }\n if (item.pluginGeneratedBranch) {\n await this.#run(git, ['branch', '-D', '--', item.branch], item.root).catch(() => undefined)\n }\n changed = true\n } catch {\n retained.push(item)\n }\n }\n if (changed) await this.#writeLeases(retained)\n })\n }\n\n async #checkoutRemote(info: RepositoryBranchList, remoteBranch: string): Promise<RepositorySetupResult> {\n const separator = remoteBranch.indexOf('/')\n if (separator <= 0 || separator === remoteBranch.length - 1) {\n throw new RepositorySetupError('invalid-branch', 'The remote-tracking branch name is invalid.')\n }\n const localBranch = safeBranch(remoteBranch.slice(separator + 1))\n if (info.branches.includes(localBranch)) {\n const git = await this.#git()\n const upstream = await this.#run(git, ['for-each-ref', '--format=%(upstream:short)', `refs/heads/${localBranch}`], info.root)\n if (upstream.exitCode !== 0 || upstream.lossy) {\n throw new RepositorySetupError('repository-unavailable', 'The local branch tracking state is unavailable.')\n }\n if (upstream.stdout.trim() !== remoteBranch) {\n throw new RepositorySetupError('branch-tracking-conflict', `The local branch ${localBranch} does not track ${remoteBranch}.`)\n }\n return this.#checkout(info, localBranch)\n }\n if (info.dirty) throw new RepositorySetupError('dirty-workspace', 'Commit or stash workspace changes before switching branches.')\n const git = await this.#git()\n const switched = await this.#run(git, ['switch', '--track', '-c', localBranch, `refs/remotes/${remoteBranch}`], info.root)\n if (switched.exitCode !== 0) throw new RepositorySetupError('checkout-failed', 'Git could not create the local tracking branch.')\n return { mode: 'checkout', root: info.root, path: info.root, branch: localBranch }\n }\n\n async #checkout(info: RepositoryBranchList, branch: string): Promise<RepositorySetupResult> {\n if (info.dirty) throw new RepositorySetupError('dirty-workspace', 'Commit or stash workspace changes before switching branches.')\n if (info.current !== branch) {\n const git = await this.#git()\n const worktrees = await this.#run(git, ['worktree', 'list', '--porcelain'], info.root)\n if (worktrees.exitCode !== 0 || worktrees.lossy) throw new RepositorySetupError('repository-unavailable', 'Worktree state is unavailable.')\n const occupiedPath = parseWorktreeBranches(worktrees.stdout).get(branch)\n if (occupiedPath !== undefined && resolve(occupiedPath) !== info.root) {\n throw new RepositorySetupError('branch-occupied', 'The selected branch is already checked out in another worktree.')\n }\n const switched = await this.#run(git, ['switch', '--', branch], info.root)\n if (switched.exitCode !== 0) throw new RepositorySetupError('checkout-failed', 'Git could not switch to the selected branch.')\n }\n return { mode: 'checkout', root: info.root, path: info.root, branch }\n }\n\n async #createWorktree(\n root: string,\n baseBranch: string,\n baseRef: string,\n explicitBranchName: string | undefined,\n progress: RepositorySetupProgress,\n ): Promise<RepositorySetupResult> {\n const git = await this.#git()\n progress('fetching')\n const fetched = await this.#run(\n git,\n ['-c', 'credential.interactive=never', 'fetch', '--all', '--prune'],\n root,\n GIT_FETCH_TIMEOUT_MS,\n )\n if (fetched.exitCode !== 0 || fetched.lossy) {\n throw new RepositorySetupError('fetch-failed', 'Git could not refresh remote references before creating the worktree.')\n }\n const suffix = randomUUID().slice(0, 8)\n const stamp = new Date().toISOString().replace(/[-:]/gu, '').replace(/\\.\\d{3}Z$/u, 'Z')\n const branch = explicitBranchName ?? `${safeBranch(await this.#branchPrefix())}/${slug(baseBranch, 'branch')}-${stamp}-${suffix}`\n const path = join(this.#worktreeRoot, `${slug(basename(root), 'repository')}-${stamp}-${suffix}`)\n progress('creating-worktree')\n await mkdir(this.#worktreeRoot, { recursive: true })\n const created = await this.#run(git, ['worktree', 'add', '-b', branch, path, baseRef], root)\n if (created.exitCode !== 0) throw new RepositorySetupError('worktree-failed', 'Git could not create the worktree.')\n const item: WorktreeLease = {\n id: randomUUID(),\n root,\n path,\n branch,\n createdAt: new Date().toISOString(),\n pluginGeneratedBranch: explicitBranchName === undefined,\n }\n progress('saving-worktree')\n try {\n await this.#serialize(async () => {\n const leases = await this.#readLeases()\n await this.#writeLeases([...leases, item])\n })\n } catch (error) {\n await this.#run(git, ['worktree', 'remove', '--force', '--', path], root).catch(() => undefined)\n throw error\n }\n return { mode: 'worktree', root, path, branch, leaseId: item.id }\n }\n\n async #repositoryRoot(git: string, cwd: string): Promise<string> {\n const result = await this.#run(git, ['rev-parse', '--path-format=absolute', '--show-toplevel'], cwd)\n const root = result.stdout.trim()\n if (result.exitCode !== 0 || result.lossy || root.length === 0 || !isAbsolute(root)) {\n throw new RepositorySetupError('not-repository', 'The workspace is not a Git repository.')\n }\n return resolve(root)\n }\n\n #git(): Promise<string> {\n this.#gitPath ??= this.#runtime.resolveExecutable('git')\n return this.#gitPath\n }\n\n async #run(executable: string, args: readonly string[], cwd: string, timeoutMs = GIT_TIMEOUT_MS): Promise<CommandResult> {\n return collect(this.#runtime.spawn({\n argv: [executable, ...args],\n cwd,\n stdio: {\n stdin: 'ignore',\n stdout: { maxBytes: MAX_OUTPUT_BYTES },\n stderr: { maxBytes: MAX_OUTPUT_BYTES },\n },\n graceMs: 1_000,\n signal: AbortSignal.timeout(timeoutMs),\n env: {},\n }))\n }\n\n async #readLeases(): Promise<WorktreeLease[]> {\n try {\n const parsed = JSON.parse(await readFile(this.#leasePath, 'utf8')) as unknown\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return []\n const input = parsed as Record<string, unknown>\n if (input.schemaVersion !== LEASE_SCHEMA_VERSION || !Array.isArray(input.leases)) return []\n return input.leases.map(lease).filter((item): item is WorktreeLease => item !== undefined)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return []\n throw error\n }\n }\n\n async #writeLeases(leases: readonly WorktreeLease[]): Promise<void> {\n await mkdir(resolve(this.#leasePath, '..'), { recursive: true })\n const temporary = `${this.#leasePath}.${process.pid}.${randomUUID()}.tmp`\n const document: LeaseDocument = { schemaVersion: LEASE_SCHEMA_VERSION, leases }\n try {\n await writeFile(temporary, `${JSON.stringify(document, null, 2)}\\n`, { mode: 0o600 })\n await rename(temporary, this.#leasePath)\n } finally {\n await rm(temporary, { force: true }).catch(() => undefined)\n }\n }\n\n #serialize<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.#pending.then(operation, operation)\n this.#pending = result.then(() => undefined, () => undefined)\n return result\n }\n}\n","import { createHash } from 'node:crypto'\nimport { basename } from 'node:path'\nimport type { SubprocessHandle, SubprocessRuntime } from '@deepseek-ai/dsh-subprocess'\n\nconst MAX_OUTPUT_BYTES = 256 * 1024\nconst MAX_PATCH_CHARS = 64 * 1024\nconst MAX_MESSAGE_CHARS = 512\nconst MAX_PR_TEXT_CHARS = 8 * 1024\nconst MAX_UNPUSHED_COMMITS = 20\nconst GIT_TIMEOUT_MS = 15_000\nconst REMOTE_TIMEOUT_MS = 60_000\nconst GENERATE_TIMEOUT_MS = 60_000\n\ntype RepositoryActionRuntime = Pick<SubprocessRuntime, 'resolveExecutable' | 'spawn'>\nexport type RepositoryActionKind = 'commit' | 'commit-push' | 'push' | 'create-pr' | 'merge-pr'\nexport type RepositoryMergeMethod = 'merge' | 'squash' | 'rebase'\n\ninterface CommandResult {\n readonly exitCode: number | null\n readonly stdout: string\n readonly stderr: string\n readonly lossy: boolean\n}\n\nexport interface RepositoryActionFile {\n readonly path: string\n readonly staged: boolean\n readonly unstaged: boolean\n readonly untracked: boolean\n}\n\nexport interface RepositoryActionCommit {\n readonly hash: string\n readonly subject: string\n}\n\nexport interface RepositoryActionPreview {\n readonly root: string\n readonly branch: string\n readonly head: string\n readonly fingerprint: string\n readonly files: readonly RepositoryActionFile[]\n readonly patch: string\n readonly truncated: boolean\n readonly hasStaged: boolean\n readonly hasUnstaged: boolean\n readonly hasUntracked: boolean\n readonly upstream?: string\n readonly unpushedCommits: readonly RepositoryActionCommit[]\n readonly unpushedTruncated: boolean\n}\n\nexport interface RepositoryActionRequest {\n readonly action: RepositoryActionKind\n readonly fingerprint: string\n readonly message: string\n readonly includeUnstaged: boolean\n readonly prTitle?: string\n readonly prBody?: string\n readonly baseBranch?: string\n readonly draft?: boolean\n readonly mergeMethod?: RepositoryMergeMethod\n}\n\nexport interface RepositoryActionResult {\n readonly commit: string\n readonly pushed: boolean\n readonly pullRequestUrl?: string\n}\n\nexport class RepositoryActionError extends Error {\n readonly code: string\n readonly commit?: string\n\n constructor(code: string, message: string, commit?: string) {\n super(message)\n this.name = 'RepositoryActionError'\n this.code = code\n if (commit !== undefined) this.commit = commit\n }\n}\n\nasync function collect(handle: SubprocessHandle): Promise<CommandResult> {\n const outcome = await handle.done\n const stdout = handle.collected.stdout?.readFrom(0)\n const stderr = handle.collected.stderr?.readFrom(0)\n return {\n exitCode: outcome.exitCode,\n stdout: stdout?.text ?? '',\n stderr: stderr?.text ?? '',\n lossy: stdout?.lossy === true || stderr?.lossy === true,\n }\n}\n\nfunction safeText(value: string, maximum: number, label: string): string {\n const text = value.trim()\n if (text.length === 0 || text.length > maximum || /[\\0\\r]/u.test(text)) {\n throw new RepositoryActionError('invalid-request', `${label} is invalid.`)\n }\n return text\n}\n\nexport function isProtectedWarpPath(path: string): boolean {\n return basename(path.replaceAll('\\\\', '/')).toLocaleLowerCase('en-US') === 'warp.md'\n}\n\nexport function parseRepositoryActionStatus(output: string): readonly RepositoryActionFile[] {\n const files = new Map<string, RepositoryActionFile>()\n const records = output.includes('\\0') ? output.split('\\0') : output.split(/\\r?\\n/u)\n for (let position = 0; position < records.length; position += 1) {\n const line = records[position] ?? ''\n if (line.length < 4) continue\n const index = line[0] ?? ' '\n const worktree = line[1] ?? ' '\n let path = line.slice(3)\n const rename = path.lastIndexOf(' -> ')\n if (rename >= 0) path = path.slice(rename + 4)\n if (output.includes('\\0') && (index === 'R' || index === 'C' || worktree === 'R' || worktree === 'C')) position += 1\n if (path.length === 0 || path.includes('\\0') || isProtectedWarpPath(path)) continue\n files.set(path, {\n path,\n staged: index !== ' ' && index !== '?',\n unstaged: worktree !== ' ' && worktree !== '?',\n untracked: index === '?' && worktree === '?',\n })\n }\n return [...files.values()].sort((left, right) => left.path.localeCompare(right.path))\n}\n\nfunction fallbackCommitMessage(files: readonly RepositoryActionFile[]): string {\n if (files.length === 1) return `Update ${files[0]?.path ?? 'repository files'}`\n return `Update ${files.length} repository files`\n}\n\nfunction normalizedGeneratedMessage(value: string, fallback: string): string {\n const first = value.split(/\\r?\\n/u).map(line => line.trim()).find(Boolean)\n if (first === undefined) return fallback\n const message = first.replace(/^['\"`]+|['\"`]+$/gu, '').replace(/[\\0\\r\\n]/gu, ' ').trim()\n return message.length === 0 || message.length > 72 ? fallback : message\n}\n\nfunction validPrUrl(value: string): string | undefined {\n try {\n const url = new URL(value.trim())\n return url.protocol === 'https:' && url.hostname === 'github.com' ? url.href : undefined\n } catch {\n return undefined\n }\n}\n\nexport function validPullRequestBody(value: string): boolean {\n const body = value.trim()\n const match = /^Summary:\\s+([^\\r\\n]+)\\r?\\n\\r?\\nChanges:\\s*\\r?\\n([\\s\\S]+)$/u.exec(body)\n const summary = match?.[1]?.trim()\n const changes = match?.[2]?.trim()\n if (summary === undefined || summary.length === 0 || changes === undefined || changes.length === 0) return false\n return !/^#{1,6}\\s|^[A-Za-z][A-Za-z ]+:\\s*$/mu.test(changes)\n}\n\nexport class RepositoryActionService {\n readonly #runtime: RepositoryActionRuntime\n readonly #claudeExecutable: string\n readonly #invalidate: (cwd: string) => void\n #gitExecutable?: Promise<string>\n #ghExecutable?: Promise<string>\n #pending: Promise<unknown> = Promise.resolve()\n\n constructor(runtime: RepositoryActionRuntime, claudeExecutable: string, invalidate: (cwd: string) => void = () => {}) {\n this.#runtime = runtime\n this.#claudeExecutable = claudeExecutable\n this.#invalidate = invalidate\n }\n\n preview(cwd: string): Promise<RepositoryActionPreview> {\n return this.#preview(cwd)\n }\n\n async generateMessage(cwd: string, fingerprint: string): Promise<string> {\n const preview = await this.#preview(cwd)\n if (preview.fingerprint !== fingerprint) throw new RepositoryActionError('repository-changed', 'Repository changes have changed. Refresh the commit panel.')\n const fallback = fallbackCommitMessage(preview.files)\n const prompt = [\n 'Write one concise English git commit subject (imperative mood, maximum 72 characters).',\n 'Return only the subject without quotes, markdown, body, or explanation.',\n `Files: ${preview.files.map(file => file.path).join(', ')}`,\n `Diff:\\n${preview.patch.slice(0, 24 * 1024)}`,\n ].join('\\n')\n try {\n const result = await this.#run(this.#claudeExecutable, ['-p', '--tools', '', '--output-format', 'text', prompt], preview.root, GENERATE_TIMEOUT_MS)\n return result.exitCode === 0 && !result.lossy ? normalizedGeneratedMessage(result.stdout, fallback) : fallback\n } catch {\n return fallback\n }\n }\n\n execute(cwd: string, request: RepositoryActionRequest): Promise<RepositoryActionResult> {\n const operation = this.#pending.then(() => this.#execute(cwd, request))\n this.#pending = operation.then(() => undefined, () => undefined)\n return operation\n }\n\n async #execute(cwd: string, request: RepositoryActionRequest): Promise<RepositoryActionResult> {\n const before = await this.#preview(cwd)\n if (before.fingerprint !== request.fingerprint) throw new RepositoryActionError('repository-changed', 'Repository changes have changed. Refresh the commit panel.')\n if (request.action === 'push') {\n const git = await this.#git()\n try {\n await this.#push(git, before.root, before.branch)\n } catch (error) {\n throw new RepositoryActionError('push-failed', error instanceof Error ? error.message : 'Git push failed.')\n }\n this.#invalidate(before.root)\n return { commit: before.head, pushed: true }\n }\n if (request.action === 'merge-pr') {\n const method = request.mergeMethod\n if (method !== 'merge' && method !== 'squash' && method !== 'rebase') {\n throw new RepositoryActionError('invalid-request', 'The merge method is invalid.')\n }\n let gh: string\n try {\n gh = await this.#gh()\n } catch (error) {\n throw new RepositoryActionError('gh-unavailable', error instanceof Error ? error.message : 'GitHub CLI is unavailable.')\n }\n const merged = await this.#run(gh, ['pr', 'merge', `--${method}`], before.root, REMOTE_TIMEOUT_MS)\n if (merged.exitCode !== 0 || merged.lossy) {\n const reason = merged.stderr.split(/\\r?\\n/u).map(line => line.trim()).filter(line => line.length > 0).at(-1)\n throw new RepositoryActionError('merge-failed', reason === undefined || reason.length === 0 ? 'The pull request could not be merged.' : reason)\n }\n this.#invalidate(before.root)\n return { commit: before.head, pushed: true }\n }\n const message = safeText(request.message, MAX_MESSAGE_CHARS, 'Commit message')\n if (before.files.length === 0 && request.action !== 'create-pr') {\n throw new RepositoryActionError('nothing-to-commit', 'There are no changes to commit.')\n }\n const git = await this.#git()\n let oid = before.head\n if (before.files.length > 0) {\n await this.#rejectStagedWarp(git, before.root)\n if (request.includeUnstaged) {\n const paths = before.files.filter(file => file.unstaged || file.untracked).map(file => file.path)\n if (paths.length > 0) await this.#mustRun(git, ['add', '--', ...paths], before.root, GIT_TIMEOUT_MS, 'stage-failed', 'Changes could not be staged.')\n }\n await this.#rejectStagedWarp(git, before.root)\n const staged = await this.#run(git, ['diff', '--cached', '--quiet', '--exit-code', '--'], before.root, GIT_TIMEOUT_MS)\n if (staged.exitCode === 0) throw new RepositoryActionError('nothing-to-commit', 'There are no staged changes to commit.')\n if (staged.exitCode !== 1) throw new RepositoryActionError('repository-unavailable', 'The staged changes could not be verified.')\n await this.#mustRun(git, ['commit', '-m', message, '--'], before.root, GIT_TIMEOUT_MS, 'commit-failed', 'Git commit failed.')\n oid = (await this.#mustRun(git, ['rev-parse', 'HEAD'], before.root, GIT_TIMEOUT_MS, 'commit-failed', 'The new commit could not be verified.')).stdout.trim()\n this.#invalidate(before.root)\n if (request.action === 'commit') return { commit: oid, pushed: false }\n }\n try {\n await this.#push(git, before.root, before.branch)\n } catch (error) {\n throw new RepositoryActionError('push-failed', error instanceof Error ? error.message : 'Git push failed.', oid)\n }\n this.#invalidate(before.root)\n if (request.action === 'commit-push') return { commit: oid, pushed: true }\n const title = safeText(request.prTitle ?? message, 256, 'Pull request title')\n const body = safeText(request.prBody ?? '', MAX_PR_TEXT_CHARS, 'Pull request description')\n if (!validPullRequestBody(body)) {\n throw new RepositoryActionError('invalid-pr-description', 'Pull request description must contain only Summary and Changes sections.', oid)\n }\n let gh: string\n try {\n gh = await this.#gh()\n } catch (error) {\n throw new RepositoryActionError('gh-unavailable', error instanceof Error ? error.message : 'GitHub CLI is unavailable.', oid)\n }\n const args = ['pr', 'create', '--title', title, '--body', body]\n if (request.draft !== false) args.push('--draft')\n if (request.baseBranch !== undefined) args.push('--base', safeText(request.baseBranch, 512, 'Base branch'))\n const created = await this.#run(gh, args, before.root, REMOTE_TIMEOUT_MS)\n const url = created.exitCode === 0 && !created.lossy ? validPrUrl(created.stdout) : undefined\n if (url === undefined) throw new RepositoryActionError('pr-failed', 'The pull request could not be created.', oid)\n return { commit: oid, pushed: true, pullRequestUrl: url }\n }\n\n async #preview(cwd: string): Promise<RepositoryActionPreview> {\n const git = await this.#git()\n const rootResult = await this.#mustRun(git, ['rev-parse', '--path-format=absolute', '--show-toplevel'], cwd, GIT_TIMEOUT_MS, 'not-repository', 'The session directory is not a Git repository.')\n const root = rootResult.stdout.trim()\n const [branchResult, headResult, statusResult, stagedPatch, unstagedPatch] = await Promise.all([\n this.#run(git, ['symbolic-ref', '--quiet', '--short', 'HEAD'], root, GIT_TIMEOUT_MS),\n this.#run(git, ['rev-parse', 'HEAD'], root, GIT_TIMEOUT_MS),\n this.#run(git, ['status', '--porcelain=v1', '-z', '--untracked-files=all'], root, GIT_TIMEOUT_MS),\n this.#run(git, ['diff', '--cached', '--no-ext-diff', '--no-color', '--unified=3', '--', ':(exclude)WARP.md', ':(exclude)**/WARP.md'], root, GIT_TIMEOUT_MS, MAX_OUTPUT_BYTES),\n this.#run(git, ['diff', '--no-ext-diff', '--no-color', '--unified=3', '--', ':(exclude)WARP.md', ':(exclude)**/WARP.md'], root, GIT_TIMEOUT_MS, MAX_OUTPUT_BYTES),\n ])\n if (branchResult.exitCode !== 0) throw new RepositoryActionError('detached-head', 'A detached HEAD cannot be committed from this panel.')\n if (headResult.exitCode !== 0 || statusResult.exitCode !== 0 || statusResult.lossy) throw new RepositoryActionError('repository-unavailable', 'Repository state is unavailable.')\n const files = parseRepositoryActionStatus(statusResult.stdout)\n const patch = `${stagedPatch.stdout}${stagedPatch.stdout.length > 0 && unstagedPatch.stdout.length > 0 ? '\\n' : ''}${unstagedPatch.stdout}`.slice(0, MAX_PATCH_CHARS)\n const branch = branchResult.stdout.trim()\n const head = headResult.stdout.trim()\n const fingerprint = createHash('sha256').update([head, branch, statusResult.stdout, stagedPatch.stdout, unstagedPatch.stdout].join('\\0')).digest('hex')\n const upstreamResult = await this.#run(git, ['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{upstream}'], root, GIT_TIMEOUT_MS)\n const upstream = upstreamResult.exitCode === 0 && !upstreamResult.lossy ? upstreamResult.stdout.trim() : undefined\n const logResult = await this.#run(git, [\n 'log', '--format=%H%x09%s', `-n`, String(MAX_UNPUSHED_COMMITS + 1), upstream === undefined ? 'HEAD' : '@{upstream}..HEAD', '--',\n ], root, GIT_TIMEOUT_MS)\n const commitLines = logResult.exitCode === 0 && !logResult.lossy\n ? logResult.stdout.split(/\\r?\\n/u).filter(line => line.includes('\\t'))\n : []\n const unpushedCommits = commitLines.slice(0, MAX_UNPUSHED_COMMITS).flatMap(line => {\n const tab = line.indexOf('\\t')\n const hash = line.slice(0, tab)\n return /^[0-9a-f]{40}$/iu.test(hash) ? [{ hash, subject: line.slice(tab + 1).slice(0, 140) }] : []\n })\n return {\n root,\n branch,\n head,\n fingerprint,\n files,\n patch,\n truncated: stagedPatch.lossy || unstagedPatch.lossy || stagedPatch.stdout.length + unstagedPatch.stdout.length > MAX_PATCH_CHARS,\n hasStaged: files.some(file => file.staged),\n hasUnstaged: files.some(file => file.unstaged),\n hasUntracked: files.some(file => file.untracked),\n ...(upstream === undefined ? {} : { upstream }),\n unpushedCommits,\n unpushedTruncated: commitLines.length > MAX_UNPUSHED_COMMITS,\n }\n }\n\n async #rejectStagedWarp(git: string, cwd: string): Promise<void> {\n const staged = await this.#run(git, ['diff', '--cached', '--name-only', '--'], cwd, GIT_TIMEOUT_MS)\n if (staged.exitCode !== 0 || staged.lossy) throw new RepositoryActionError('repository-unavailable', 'Staged files could not be verified.')\n if (staged.stdout.split(/\\r?\\n/u).some(path => path.length > 0 && isProtectedWarpPath(path))) {\n throw new RepositoryActionError('protected-warp-file', 'WARP.md files cannot be committed. Unstage them before continuing.')\n }\n }\n\n async #push(git: string, cwd: string, branch: string): Promise<void> {\n const upstream = await this.#run(git, ['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{upstream}'], cwd, GIT_TIMEOUT_MS)\n const args = upstream.exitCode === 0 ? ['push'] : ['push', '--set-upstream', 'origin', branch]\n await this.#mustRun(git, args, cwd, REMOTE_TIMEOUT_MS, 'push-failed', 'Git push failed.')\n }\n\n #git(): Promise<string> {\n this.#gitExecutable ??= this.#runtime.resolveExecutable('git')\n return this.#gitExecutable\n }\n\n #gh(): Promise<string> {\n this.#ghExecutable ??= this.#runtime.resolveExecutable('gh').catch(() => { throw new RepositoryActionError('gh-unavailable', 'GitHub CLI is unavailable.') })\n return this.#ghExecutable\n }\n\n async #mustRun(executable: string, args: readonly string[], cwd: string, timeoutMs: number, code: string, message: string): Promise<CommandResult> {\n const result = await this.#run(executable, args, cwd, timeoutMs)\n if (result.exitCode !== 0 || result.lossy) throw new RepositoryActionError(code, message)\n return result\n }\n\n #run(executable: string, args: readonly string[], cwd: string, timeoutMs: number, maxBytes = MAX_OUTPUT_BYTES): Promise<CommandResult> {\n return collect(this.#runtime.spawn({\n argv: [executable, ...args],\n cwd,\n stdio: { stdin: 'ignore', stdout: { maxBytes }, stderr: { maxBytes: MAX_OUTPUT_BYTES } },\n graceMs: 1_000,\n signal: AbortSignal.timeout(timeoutMs),\n env: {},\n }))\n }\n}\n","import type { IncomingMessage } from 'node:http'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-host-webserver'\nimport { CLAUDE_REPOSITORY_SETUP_PATH } from './constants.ts'\nimport { json, trustedRequest } from './http.ts'\nimport {\n RepositorySetupError,\n type RepositorySetupResult,\n type RepositorySetupService,\n type RepositorySetupStage,\n} from './repository-setup.ts'\n\nconst MAX_BODY_BYTES = 16 * 1024\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\nasync function readJson(req: IncomingMessage): Promise<Record<string, unknown>> {\n const chunks: Buffer[] = []\n let size = 0\n for await (const chunk of req) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n size += buffer.length\n if (size > MAX_BODY_BYTES) throw new RepositorySetupError('body-too-large', 'The request body is too large.')\n chunks.push(buffer)\n }\n const value = record(JSON.parse(Buffer.concat(chunks).toString('utf8')))\n if (value === undefined) throw new RepositorySetupError('invalid-request', 'The request body is invalid.')\n return value\n}\n\nfunction string(input: Record<string, unknown>, key: string): string {\n const value = input[key]\n if (typeof value !== 'string') throw new RepositorySetupError('invalid-request', `The ${key} field is required.`)\n return value\n}\n\nfunction optionalString(input: Record<string, unknown>, key: string): string | undefined {\n const value = input[key]\n if (value === undefined) return undefined\n if (typeof value !== 'string') throw new RepositorySetupError('invalid-request', `The ${key} field must be a string.`)\n return value\n}\n\nfunction ndjsonHeaders(res: import('node:http').ServerResponse): void {\n res.writeHead(200, {\n 'content-type': 'application/x-ndjson; charset=utf-8',\n 'cache-control': 'no-store',\n 'x-content-type-options': 'nosniff',\n })\n res.flushHeaders?.()\n}\n\nfunction ndjson(res: import('node:http').ServerResponse, value: unknown): void {\n res.write(`${JSON.stringify(value)}\\n`)\n}\n\nasync function streamSetup(\n res: import('node:http').ServerResponse,\n service: RepositorySetupService,\n input: Record<string, unknown>,\n): Promise<void> {\n ndjsonHeaders(res)\n let ended = false\n try {\n const result: RepositorySetupResult = await service.setup(\n string(input, 'cwd'),\n string(input, 'branch'),\n input.worktree as boolean,\n optionalString(input, 'branchName'),\n (stage: RepositorySetupStage) => { if (!ended) ndjson(res, { type: 'progress', stage }) },\n )\n ndjson(res, { type: 'complete', result })\n } catch (error) {\n const setupError = error instanceof RepositorySetupError ? error : undefined\n ndjson(res, {\n type: 'error',\n code: setupError?.code ?? 'repository-setup-unavailable',\n message: setupError?.message ?? 'Repository setup is unavailable.',\n })\n } finally {\n ended = true\n res.end()\n }\n}\n\n/** Register trusted browser routes for safe pre-session Git setup. */\nexport function registerRepositorySetupRoute(ctx: Context, service: RepositorySetupService): void {\n ctx.effect(() => ctx.webServer.register({\n kind: 'prefix',\n path: CLAUDE_REPOSITORY_SETUP_PATH,\n handler: async (req, res) => {\n if (!trustedRequest(req)) return json(res, 403, { error: 'forbidden' })\n const pathname = new URL(req.url ?? '/', 'http://localhost').pathname\n try {\n if (pathname === `${CLAUDE_REPOSITORY_SETUP_PATH}/branches`) {\n if (req.method !== 'GET') return json(res, 405, { error: 'method not allowed' })\n const cwd = new URL(req.url ?? '/', 'http://localhost').searchParams.get('cwd')\n if (cwd === null) throw new RepositorySetupError('invalid-request', 'The cwd query parameter is required.')\n return json(res, 200, await service.listBranches(cwd))\n }\n if (pathname === CLAUDE_REPOSITORY_SETUP_PATH) {\n if (req.method !== 'POST') return json(res, 405, { error: 'method not allowed' })\n const input = await readJson(req)\n if (typeof input.worktree !== 'boolean') throw new RepositorySetupError('invalid-request', 'The worktree field is required.')\n await streamSetup(res, service, input)\n return\n }\n if (pathname === `${CLAUDE_REPOSITORY_SETUP_PATH}/bind`) {\n if (req.method !== 'POST') return json(res, 405, { error: 'method not allowed' })\n const input = await readJson(req)\n await service.bindLease(string(input, 'leaseId'), string(input, 'sessionId'))\n return json(res, 200, { ok: true })\n }\n return json(res, 404, { error: 'not found' })\n } catch (error) {\n if (error instanceof RepositorySetupError) return json(res, 409, { error: error.code, message: error.message })\n if (error instanceof SyntaxError) return json(res, 400, { error: 'invalid json' })\n return json(res, 500, { error: 'repository setup unavailable' })\n }\n },\n }), 'dsh-claude: repository setup route')\n}\n","import type { IncomingMessage } from 'node:http'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-host-webserver'\nimport { CLAUDE_REPOSITORY_ACTION_PATH } from './constants.ts'\nimport { json, trustedRequest } from './http.ts'\nimport {\n RepositoryActionError,\n type RepositoryActionKind,\n type RepositoryActionRequest,\n type RepositoryMergeMethod,\n type RepositoryActionService,\n} from './repository-actions.ts'\n\nconst MAX_BODY_BYTES = 16 * 1024\nconst MAX_SESSION_ID_CHARS = 1_024\nconst ACTIONS = new Set<RepositoryActionKind>(['commit', 'commit-push', 'push', 'create-pr', 'merge-pr'])\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\n}\n\nasync function readJson(req: IncomingMessage): Promise<Record<string, unknown>> {\n const chunks: Buffer[] = []\n let size = 0\n for await (const chunk of req) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n size += buffer.length\n if (size > MAX_BODY_BYTES) throw new RepositoryActionError('body-too-large', 'The request body is too large.')\n chunks.push(buffer)\n }\n const value = record(JSON.parse(Buffer.concat(chunks).toString('utf8')))\n if (value === undefined) throw new RepositoryActionError('invalid-request', 'The request body is invalid.')\n return value\n}\n\nfunction sessionId(url: URL): string {\n const value = url.searchParams.get('sessionId')\n if (value === null || value.length === 0 || value.length > MAX_SESSION_ID_CHARS) {\n throw new RepositoryActionError('invalid-session', 'The session is invalid.')\n }\n return value\n}\n\nfunction string(input: Record<string, unknown>, key: string): string {\n const value = input[key]\n if (typeof value !== 'string') throw new RepositoryActionError('invalid-request', `The ${key} field is required.`)\n return value\n}\n\nfunction optionalString(input: Record<string, unknown>, key: string): string | undefined {\n const value = input[key]\n if (value === undefined) return undefined\n if (typeof value !== 'string') throw new RepositoryActionError('invalid-request', `The ${key} field must be a string.`)\n return value\n}\n\nfunction actionRequest(input: Record<string, unknown>): RepositoryActionRequest {\n const action = input.action\n if (typeof action !== 'string' || !ACTIONS.has(action as RepositoryActionKind)\n || typeof input.includeUnstaged !== 'boolean') {\n throw new RepositoryActionError('invalid-request', 'The repository action is invalid.')\n }\n return {\n action: action as RepositoryActionKind,\n fingerprint: string(input, 'fingerprint'),\n message: action === 'push' || action === 'merge-pr' ? optionalString(input, 'message') ?? '' : string(input, 'message'),\n includeUnstaged: input.includeUnstaged,\n ...(optionalString(input, 'prTitle') === undefined ? {} : { prTitle: optionalString(input, 'prTitle')! }),\n ...(optionalString(input, 'prBody') === undefined ? {} : { prBody: optionalString(input, 'prBody')! }),\n ...(optionalString(input, 'baseBranch') === undefined ? {} : { baseBranch: optionalString(input, 'baseBranch')! }),\n ...(input.draft === undefined ? {} : typeof input.draft === 'boolean' ? { draft: input.draft } : (() => { throw new RepositoryActionError('invalid-request', 'The draft field must be a boolean.') })()),\n ...(input.mergeMethod === undefined\n ? {}\n : input.mergeMethod === 'merge' || input.mergeMethod === 'squash' || input.mergeMethod === 'rebase'\n ? { mergeMethod: input.mergeMethod as RepositoryMergeMethod }\n : (() => { throw new RepositoryActionError('invalid-request', 'The mergeMethod field is invalid.') })()),\n }\n}\n\nexport function registerRepositoryActionRoute(\n ctx: Context,\n service: RepositoryActionService,\n cwdForSession: (sessionId: string) => string | undefined,\n): void {\n ctx.effect(() => ctx.webServer.register({\n kind: 'prefix',\n path: CLAUDE_REPOSITORY_ACTION_PATH,\n handler: async (req, res) => {\n if (!trustedRequest(req)) return json(res, 403, { error: 'forbidden' })\n const url = new URL(req.url ?? '/', 'http://localhost')\n try {\n const id = sessionId(url)\n const cwd = cwdForSession(id)\n if (cwd === undefined) throw new RepositoryActionError('session-unavailable', 'The Claude session is unavailable.')\n if (url.pathname === `${CLAUDE_REPOSITORY_ACTION_PATH}/preview`) {\n if (req.method !== 'GET') return json(res, 405, { error: 'method not allowed' })\n return json(res, 200, await service.preview(cwd))\n }\n if (url.pathname === `${CLAUDE_REPOSITORY_ACTION_PATH}/message`) {\n if (req.method !== 'POST') return json(res, 405, { error: 'method not allowed' })\n const input = await readJson(req)\n return json(res, 200, { message: await service.generateMessage(cwd, string(input, 'fingerprint')) })\n }\n if (url.pathname === CLAUDE_REPOSITORY_ACTION_PATH) {\n if (req.method !== 'POST') return json(res, 405, { error: 'method not allowed' })\n return json(res, 200, await service.execute(cwd, actionRequest(await readJson(req))))\n }\n return json(res, 404, { error: 'not found' })\n } catch (error) {\n if (error instanceof RepositoryActionError) {\n return json(res, 409, {\n error: error.code,\n message: error.message,\n ...(error.commit === undefined ? {} : { commit: error.commit }),\n })\n }\n if (error instanceof SyntaxError) return json(res, 400, { error: 'invalid-json' })\n return json(res, 500, { error: 'repository-action-unavailable', message: 'Repository action is unavailable.' })\n }\n },\n }), 'dsh-claude: repository action route')\n}\n","import type { IncomingMessage } from 'node:http'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-host-webserver'\nimport { CLAUDE_REVIEW_COMMENT_PATH } from './constants.ts'\nimport { json, trustedRequest } from './http.ts'\nimport { ReviewCommentError, type ReviewCommentStore } from './review-comments.ts'\n\nconst MAX_BODY_BYTES = 16 * 1024\nconst MAX_SESSION_ID_CHARS = 1_024\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\n}\n\nasync function readJson(req: IncomingMessage): Promise<Record<string, unknown>> {\n const chunks: Buffer[] = []\n let size = 0\n for await (const chunk of req) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n size += buffer.length\n if (size > MAX_BODY_BYTES) throw new ReviewCommentError('body-too-large', 'The request body is too large.')\n chunks.push(buffer)\n }\n const value = record(JSON.parse(Buffer.concat(chunks).toString('utf8')))\n if (value === undefined) throw new ReviewCommentError('invalid-request', 'The request body is invalid.')\n return value\n}\n\nfunction sessionIdFromUrl(url: URL): string {\n const value = url.searchParams.get('sessionId')\n if (value === null || value.length === 0 || value.length > MAX_SESSION_ID_CHARS) {\n throw new ReviewCommentError('invalid-session', 'The session is invalid.')\n }\n return value\n}\n\nexport function registerReviewCommentRoute(\n ctx: Context,\n store: ReviewCommentStore,\n ownsSession: (sessionId: string) => boolean,\n): void {\n ctx.effect(() => ctx.webServer.register({\n kind: 'prefix',\n path: CLAUDE_REVIEW_COMMENT_PATH,\n handler: async (req, res) => {\n if (!trustedRequest(req)) return json(res, 403, { error: 'forbidden' })\n const url = new URL(req.url ?? '/', 'http://localhost')\n try {\n const sessionId = sessionIdFromUrl(url)\n if (!ownsSession(sessionId)) throw new ReviewCommentError('session-unavailable', 'The Claude session is unavailable.')\n if (url.pathname === CLAUDE_REVIEW_COMMENT_PATH && req.method === 'POST') {\n const input = await readJson(req)\n const comment = store.add(sessionId, {\n path: input.path,\n line: input.line,\n side: input.side,\n text: input.text,\n })\n return json(res, 200, { comment })\n }\n if (url.pathname === `${CLAUDE_REVIEW_COMMENT_PATH}/clear` && req.method === 'POST') {\n return json(res, 200, { removed: store.drain(sessionId).length })\n }\n if (url.pathname === `${CLAUDE_REVIEW_COMMENT_PATH}/remove` && req.method === 'POST') {\n const input = await readJson(req)\n if (typeof input.id !== 'string' || input.id.length === 0 || input.id.length > 128) {\n throw new ReviewCommentError('invalid-request', 'The comment id is invalid.')\n }\n return json(res, 200, { removed: store.remove(sessionId, input.id) })\n }\n return json(res, 404, { error: 'not found' })\n } catch (error) {\n if (error instanceof ReviewCommentError) return json(res, 409, { error: error.code, message: error.message })\n if (error instanceof SyntaxError) return json(res, 400, { error: 'invalid-json' })\n return json(res, 500, { error: 'review-comment-unavailable', message: 'Review comments are unavailable.' })\n }\n },\n }), 'dsh-claude: review comment 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 { dshHomePath } from '@deepseek-ai/dsh-home-paths'\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\nconst DEFAULT_WORKTREE_BRANCH_PREFIX = 'claude'\nconst MAX_BRANCH_PREFIX_CHARS = 128\n\ntype JsonObject = Record<string, unknown>\nexport type GlobalSettingEffect = 'new-session' | 'next-worktree' | 'restart'\n\nexport interface GlobalSettingOption {\n value: string\n label: string\n source: 'built-in' | 'user' | 'configured'\n}\n\nexport type GlobalSettingView = {\n key: string\n kind: 'select'\n value: string\n options: readonly GlobalSettingOption[]\n effect: GlobalSettingEffect\n} | {\n key: string\n kind: 'text'\n value: string\n maxLength: number\n effect: GlobalSettingEffect\n}\n\nexport interface GlobalSettingsView {\n settings: readonly GlobalSettingView[]\n}\n\ninterface GlobalSettingsPaths {\n settingsFile: string\n outputStylesDir: string\n pluginSettingsFile: string\n}\n\nexport interface GlobalSettingsDependencies {\n paths?: Partial<GlobalSettingsPaths>\n}\n\ninterface SelectSettingDescriptor {\n key: string\n kind: 'select'\n document: 'claude' | 'plugin'\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\ninterface TextSettingDescriptor {\n key: string\n kind: 'text'\n document: 'claude' | 'plugin'\n effect: GlobalSettingEffect\n maxLength: number\n read(document: JsonObject): string\n apply(document: JsonObject, value: unknown): void\n}\n\ntype SettingDescriptor = SelectSettingDescriptor | TextSettingDescriptor\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 pluginSettingsFile: deps.paths?.pluginSettingsFile ?? dshHomePath('plugins', 'dsh-claude', 'settings.json'),\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 document: 'claude',\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\nexport function isValidWorktreeBranchPrefix(value: string): boolean {\n return value.length > 0\n && value.length <= MAX_BRANCH_PREFIX_CHARS\n && value.trim() === value\n && !value.startsWith('/')\n && !value.endsWith('/')\n && !value.includes('//')\n && !value.includes('..')\n && !value.includes('@{')\n && !/[\\0-\\x20\\x7f~^:?*[\\\\]/u.test(value)\n && value.split('/').every(segment => segment.length > 0 && !segment.startsWith('.') && !segment.endsWith('.lock'))\n}\n\nconst WORKTREE_BRANCH_PREFIX: TextSettingDescriptor = {\n key: 'worktreeBranchPrefix',\n kind: 'text',\n document: 'plugin',\n effect: 'next-worktree',\n maxLength: MAX_BRANCH_PREFIX_CHARS,\n read(document) {\n const value = document.worktreeBranchPrefix\n return typeof value === 'string' && isValidWorktreeBranchPrefix(value) ? value : DEFAULT_WORKTREE_BRANCH_PREFIX\n },\n apply(document, value) {\n if (typeof value !== 'string' || !isValidWorktreeBranchPrefix(value)) {\n throw new Error('Invalid value for global setting worktreeBranchPrefix')\n }\n if (value === DEFAULT_WORKTREE_BRANCH_PREFIX) delete document.worktreeBranchPrefix\n else document.worktreeBranchPrefix = value\n },\n}\n\nconst DESCRIPTORS: readonly SettingDescriptor[] = [OUTPUT_STYLE, WORKTREE_BRANCH_PREFIX]\nconst DESCRIPTOR_BY_KEY = new Map(DESCRIPTORS.map(descriptor => [descriptor.key, descriptor]))\nlet pendingWrite: Promise<unknown> = Promise.resolve()\n\nfunction documentFor(descriptor: SettingDescriptor, documents: { claude: JsonObject; plugin: JsonObject }): JsonObject {\n return documents[descriptor.document]\n}\n\nasync function views(documents: { claude: JsonObject; plugin: JsonObject }, paths: GlobalSettingsPaths): Promise<GlobalSettingsView> {\n return {\n settings: await Promise.all(DESCRIPTORS.map(async descriptor => {\n const document = documentFor(descriptor, documents)\n if (descriptor.kind === 'text') {\n return {\n key: descriptor.key,\n kind: descriptor.kind,\n value: descriptor.read(document),\n maxLength: descriptor.maxLength,\n effect: descriptor.effect,\n }\n }\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\nasync function readDocuments(paths: GlobalSettingsPaths): Promise<{ claude: JsonObject; plugin: JsonObject }> {\n const [claude, plugin] = await Promise.all([readDocument(paths.settingsFile), readDocument(paths.pluginSettingsFile)])\n return { claude, plugin }\n}\n\nexport async function readGlobalSettings(deps: GlobalSettingsDependencies = {}): Promise<GlobalSettingsView> {\n const paths = pathsFor(deps)\n return views(await readDocuments(paths), paths)\n}\n\nexport async function readWorktreeBranchPrefix(deps: GlobalSettingsDependencies = {}): Promise<string> {\n const paths = pathsFor(deps)\n return WORKTREE_BRANCH_PREFIX.read(await readDocument(paths.pluginSettingsFile))\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 documents = await readDocuments(paths)\n const changedDocuments = new Set<'claude' | 'plugin'>()\n for (const [key, value] of Object.entries(changeObject)) {\n const descriptor = DESCRIPTOR_BY_KEY.get(key)!\n const document = documentFor(descriptor, documents)\n if (descriptor.kind === 'select') descriptor.apply(document, value, await descriptor.options(paths))\n else descriptor.apply(document, value)\n changedDocuments.add(descriptor.document)\n }\n if (changedDocuments.has('claude')) await atomicWrite(paths.settingsFile, documents.claude)\n if (changedDocuments.has('plugin')) await atomicWrite(paths.pluginSettingsFile, documents.plugin)\n return views(documents, 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 { RepositoryStatusService } from './repository-status.ts'\nimport { RepositorySetupService } from './repository-setup.ts'\nimport { RepositoryActionService } from './repository-actions.ts'\nimport { registerRepositorySetupRoute } from './repository-setup-routes.ts'\nimport { registerRepositoryActionRoute } from './repository-action-routes.ts'\nimport { registerReviewCommentRoute } from './review-comment-routes.ts'\nimport { ReviewCommentStore } from './review-comments.ts'\nimport { registerClaudeUpdateRoutes } from './update-routes.ts'\nimport { readWorktreeBranchPrefix, 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 repositoryStatus = new RepositoryStatusService(ctx.subprocess)\n const repositorySetup = new RepositorySetupService(ctx.subprocess, { branchPrefix: () => readWorktreeBranchPrefix() })\n const reviewComments = new ReviewCommentStore()\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), sessionId => reviewComments.drain(sessionId)),\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 reviewComments.disposeSession(agent.id as string)\n await supervisor.disposeSession(agent.id as string)\n await repositorySetup.cleanupSession(agent.id as string)\n })\n ctx.effect(() => () => reviewComments.dispose(), 'dsh-claude: review comments store')\n ctx.effect(() => () => supervisor.dispose(), 'dsh-claude: process supervisor')\n ctx.effect(() => () => repositoryStatus.dispose(), 'dsh-claude: repository status cache')\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 registerRepositorySetupRoute(webCtx, repositorySetup)\n const repositoryActions = new RepositoryActionService(webCtx.subprocess, supervisorConfig.executablePath, cwd => repositoryStatus.invalidate(cwd))\n registerRepositoryActionRoute(webCtx, repositoryActions, sessionId => {\n const agent = webCtx.agents.get(sessionId as never)\n if (agent === undefined || webCtx.agentPresets.composedPreset(agent.ctx) !== CLAUDE_CODE_PRESET_ID) return undefined\n return agent.session.header.cwd\n })\n const ownsClaudeSession = (sessionId: string): boolean => {\n const agent = webCtx.agents.get(sessionId as never)\n return agent !== undefined && webCtx.agentPresets.composedPreset(agent.ctx) === CLAUDE_CODE_PRESET_ID\n }\n registerReviewCommentRoute(webCtx, reviewComments, ownsClaudeSession)\n registerClaudeProjectionRoute(webCtx, sidecar, ownsClaudeSession, sessionId => commandCatalogs.get(sessionId) ?? [], async sessionId => {\n const agent = webCtx.agents.get(sessionId as never)\n if (agent === undefined || webCtx.agentPresets.composedPreset(agent.ctx) !== CLAUDE_CODE_PRESET_ID) return undefined\n const cwd = agent.session.header.cwd\n return cwd === undefined ? undefined : repositoryStatus.inspect(cwd)\n }, sessionId => reviewComments.list(sessionId))\n })\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":["record","string","#pending","#latest","#listeners","#live","#boost","#flushTimers","#merged","#base","#notify","#scheduleTextFlush","#flushLive","#readNow","#update","#writeNow","#path","#values","#pending","#closed","#failure","record","string","#exitCode","#signalCode","#killed","#entries","#interruptions","#runtime","#approval","#userQuestions","#config","#queryFactory","#runDetached","#sidecar","#contextWindows","claudeQuery","#runMetadata","#admissionGate","#runTurnAdmitted","#disposed","#disposeEntry","#makeRoom","#createEntry","#armInitializationTimer","#syncPermissionMode","#appendActivity","#armIdleTimer","#startInterrupt","#metadataEntry","#whenInitialized","#pump","#handleMessage","#handleDisconnect","#flushTasksSnapshot","#trackTask","#trackBackgroundLevel","#completeProgressSegment","#completeTurn","#upsertTranscriptText","#closeTranscriptTextSegment","#scheduleTasksSnapshot","#continueAfterTasks","#hasRunningTasks","#appendSafely","#flushTranscript","#interrupt","MAX_TEXT_CHARS","MAX_PATH_CHARS","#comments","#supervisor","#agents","#attachments","#presetIdFor","#drainReviewComments","safeMessage","MAX_SESSION_ID_CHARS","MAX_OUTPUT_BYTES","GIT_TIMEOUT_MS","GH_TIMEOUT_MS","collect","record","#runtime","#cacheTtlMs","#cache","#lastReady","#inspect","#stabilize","#git","#gitExecutable","#gh","#ghExecutable","#pullRequest","#mergeBase","#diff","#baseBehind","#untrackedDiff","MAX_OUTPUT_BYTES","GIT_TIMEOUT_MS","collect","#runtime","#leasePath","#worktreeRoot","#branchPrefix","#cleanupGraceMs","#git","#repositoryRoot","#run","#createWorktree","#checkoutRemote","#checkout","#serialize","#readLeases","#writeLeases","#gitPath","#pending","MAX_OUTPUT_BYTES","GIT_TIMEOUT_MS","collect","#runtime","#claudeExecutable","#invalidate","#preview","#run","#pending","#execute","#git","#push","#gh","#mustRun","#rejectStagedWarp","#gitExecutable","#ghExecutable","MAX_BODY_BYTES","record","readJson","string","optionalString","MAX_BODY_BYTES","MAX_SESSION_ID_CHARS","record","readJson","sessionId","record","#runtime","#repository","#gh","#run","#git","#gitExecutable","#ghExecutable","MAX_SESSION_ID_CHARS"],"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/review-comments.ts","../src/adapter.ts","../src/http.ts","../src/doctor-routes.ts","../src/projection-routes.ts","../src/repository-status.ts","../src/repository-setup.ts","../src/repository-actions.ts","../src/repository-setup-routes.ts","../src/repository-action-routes.ts","../src/pr-feedback.ts","../src/pr-feedback-routes.ts","../src/review-comment-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/** Trailing window that coalesces per-token transcript persistence into one\n * atomic disk write; live subscribers are notified synchronously regardless. */\nconst TEXT_FLUSH_MS = 150\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\n/** Change notification published to live subscribers after each accepted write. */\nexport type ClaudeSidecarDelta =\n | { kind: 'text'; turn: number; step: number; ordinal: number; append?: string; text?: string }\n | { kind: 'activity'; activity: ClaudeActivityEvent }\n | { kind: 'contextUsage'; value: ClaudeContextUsageEvent }\n | { kind: 'tasks'; value: ClaudeTasksEvent }\n | { kind: 'sync' }\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(['text', '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 /** Latest durable projection per session; disk is read once and written through. */\n readonly #latest = new Map<string, ClaudeSidecarProjection>()\n readonly #listeners = new Map<string, Set<(delta: ClaudeSidecarDelta) => void>>()\n /** Streaming transcript segments not yet persisted, keyed by activity key. */\n readonly #live = new Map<string, Map<string, ClaudeActivityEvent>>()\n /** Monotonic revision boost so merged reads advance while text stays in memory. */\n readonly #boost = new Map<string, number>()\n readonly #flushTimers = new Map<string, ReturnType<typeof setTimeout>>()\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.#merged(sessionId, await this.#base(sessionId))\n }\n\n /** Observe accepted changes for one session; returns the unsubscriber. */\n subscribe(sessionId: string, listener: (delta: ClaudeSidecarDelta) => void): () => void {\n let set = this.#listeners.get(sessionId)\n if (set === undefined) {\n set = new Set()\n this.#listeners.set(sessionId, set)\n }\n set.add(listener)\n return () => {\n set.delete(listener)\n if (set.size === 0) this.#listeners.delete(sessionId)\n }\n }\n\n /** Record streaming assistant prose without touching the disk on the hot\n * path: subscribers are notified synchronously (as an append when the\n * redacted text grows in place) and persistence is coalesced. */\n appendTranscriptText(\n sessionId: string,\n value: { turn: number; step: number; ordinal: number; text: string },\n ): void {\n const normalized = normalizeActivity({ kind: 'text', phase: 'updated', ...value })\n const key = activityKey(normalized)\n let overlay = this.#live.get(sessionId)\n if (overlay === undefined) {\n overlay = new Map()\n this.#live.set(sessionId, overlay)\n }\n const previous = overlay.get(key)\n overlay.set(key, normalized)\n this.#boost.set(sessionId, (this.#boost.get(sessionId) ?? 0) + 1)\n const text = normalized.text ?? ''\n const base = { turn: normalized.turn, step: normalized.step, ordinal: normalized.ordinal }\n // Redaction may rewrite earlier characters once a secret completes, so a\n // non-prefix update falls back to a full-text replacement.\n this.#notify(sessionId, previous?.text !== undefined && text.startsWith(previous.text)\n ? { kind: 'text', ...base, append: text.slice(previous.text.length) }\n : { kind: 'text', ...base, text })\n this.#scheduleTextFlush(sessionId)\n }\n\n /** Persist any pending streaming transcript now (segment close, turn end). */\n flushTranscriptText(sessionId: string): Promise<void> {\n const timer = this.#flushTimers.get(sessionId)\n if (timer !== undefined) {\n clearTimeout(timer)\n this.#flushTimers.delete(sessionId)\n }\n return this.#flushLive(sessionId)\n }\n\n #notify(sessionId: string, delta: ClaudeSidecarDelta): void {\n const set = this.#listeners.get(sessionId)\n if (set === undefined) return\n for (const listener of [...set]) {\n try {\n listener(delta)\n } catch {\n // A subscriber failure must never affect durable state.\n }\n }\n }\n\n #merged(sessionId: string, base: ClaudeSidecarProjection): ClaudeSidecarProjection {\n const overlay = this.#live.get(sessionId)\n const boost = this.#boost.get(sessionId) ?? 0\n if ((overlay === undefined || overlay.size === 0) && boost === 0) return base\n return {\n ...base,\n revision: base.revision + boost,\n ...(overlay === undefined || overlay.size === 0\n ? {}\n : { activities: mergeActivities(base.activities, [...overlay.values()]) }),\n }\n }\n\n async #base(sessionId: string): Promise<ClaudeSidecarProjection> {\n const cached = this.#latest.get(sessionId)\n if (cached !== undefined) return cached\n const loaded = await this.#readNow(sessionId)\n this.#latest.set(sessionId, loaded)\n return loaded\n }\n\n #scheduleTextFlush(sessionId: string): void {\n if (this.#flushTimers.has(sessionId)) return\n const timer = setTimeout(() => {\n this.#flushTimers.delete(sessionId)\n void this.#flushLive(sessionId)\n }, TEXT_FLUSH_MS)\n timer.unref?.()\n this.#flushTimers.set(sessionId, timer)\n }\n\n async #flushLive(sessionId: string): Promise<void> {\n const overlay = this.#live.get(sessionId)\n if (overlay === undefined || overlay.size === 0) return\n const entries = [...overlay.entries()]\n try {\n await this.#update(sessionId, current => ({\n ...current,\n activities: mergeActivities(current.activities, entries.map(([, value]) => value)),\n }))\n } catch {\n // Keep the overlay; the next append or flush retries persistence.\n return\n }\n for (const [key, value] of entries) {\n if (overlay.get(key) === value) overlay.delete(key)\n }\n if (overlay.size === 0) this.#live.delete(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 }), false, { kind: 'activity', activity: normalized })\n }\n\n writeContextUsage(sessionId: string, value: ClaudeContextUsageInput): Promise<ClaudeSidecarProjection> {\n const normalized = normalizeContextUsage(value)\n return this.#update(sessionId, current => ({ ...current, contextUsage: normalized }), false, { kind: 'contextUsage', value: 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 }), false, { kind: 'tasks', value: 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, { kind: 'sync' })\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 delta?: ClaudeSidecarDelta,\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.#base(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 this.#latest.set(sessionId, next)\n if (delta !== undefined) this.#notify(sessionId, delta)\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 // CLI ≥ 2.1.238 replays prior user messages (including local-command output\n // echoes with plain string content) when resuming a session. Replays and\n // block-less string echoes carry no tool results; they are not protocol\n // failures and must never kill the session.\n if (message.isReplay === true) return []\n const envelope = record(message.message)\n const content = envelope?.content\n if (typeof content === 'string') return []\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. Every\n // update stays audit-only ('status' never enters the conversation flow);\n // a blocking state surfaces through the repository status bar badge that\n // reads these titles from the projection instead.\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: '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 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 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 { 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 /** Visible prose for the current top-level assistant segment. */\n transcriptText: string\n /** Stable sidecar ordinal reused while the current assistant segment grows. */\n transcriptTextOrdinal: number | undefined\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 #interruptions = new Map<string, Promise<void>>()\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 #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 interruption = this.#interruptions.get(request.agent.id as string)\n if (interruption !== undefined) return interruption.then(() => this.runTurn(request))\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 transcriptText: '',\n transcriptTextOrdinal: undefined,\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.#startInterrupt(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 (active.phase === 'waiting-tasks') {\n // The CLI may automatically react to each completed background task and\n // emit a top-level result, correlated or not. Publish that prose as a\n // completed progress block, but keep the original DSH turn open until\n // every owned task settles and the explicit final report returns.\n await this.#completeProgressSegment(active, message)\n return\n }\n if (message.userMessageUuid !== undefined && message.userMessageUuid !== active.promptUuid) {\n // A stale internal continuation must not settle the explicit final\n // report request. Primary-turn mismatches remain protocol failures.\n if (active.phase === 'follow-up') return\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.transcriptText += message.text\n await this.#upsertTranscriptText(active)\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.transcriptText += message.text\n await this.#upsertTranscriptText(active)\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 if (message.parentToolUseId === undefined) this.#closeTranscriptTextSegment(active)\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) active.callNames.set(message.toolUseId, message.toolName)\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 return\n case 'subagent':\n await this.#appendActivity(active, {\n kind: 'subagent',\n phase: message.phase,\n ...(message.taskId === undefined ? {} : { taskId: message.taskId }),\n title: message.title,\n summary: message.summary,\n detail: message.detail,\n isError: message.phase === 'failed',\n })\n return\n case 'status':\n case 'warning':\n case 'unknown':\n await this.#appendActivity(active, {\n kind: message.kind === 'status' ? 'status' : 'warning',\n phase: 'updated',\n title: message.title,\n ...('summary' in message ? { summary: message.summary } : {}),\n ...('detail' in message ? { detail: message.detail } : {}),\n })\n return\n case 'permission-denied':\n await this.#appendActivity(active, {\n kind: 'permission',\n phase: 'denied',\n toolUseId: message.toolUseId,\n toolName: message.toolName,\n title: message.toolName,\n summary: message.summary,\n })\n return\n }\n }\n\n /** Merge one task lifecycle message into the session's task board. */\n async #trackTask(\n entry: SupervisorEntry,\n message: Extract<NormalizedSdkMessage, { kind: 'subagent' }>,\n taskId: string,\n originTurn: number | undefined,\n ): Promise<void> {\n const previous = entry.tasks.get(taskId)\n const next: ClaudeTaskInfo = {\n taskId,\n description: message.description ?? previous?.description ?? message.title,\n status: message.taskStatus ?? previous?.status ?? 'running',\n }\n const resolvedOriginTurn = previous?.originTurn ?? originTurn\n if (resolvedOriginTurn !== undefined) next.originTurn = resolvedOriginTurn\n const subagentType = message.subagentType ?? previous?.subagentType\n if (subagentType !== undefined) next.subagentType = subagentType\n const taskType = message.taskType ?? previous?.taskType\n if (taskType !== undefined) next.taskType = taskType\n const lastToolName = message.lastToolName ?? previous?.lastToolName\n if (lastToolName !== undefined) next.lastToolName = lastToolName\n const summary = message.summary ?? previous?.summary\n if (summary !== undefined) next.summary = summary\n const usage = message.usage ?? previous?.usage\n if (usage !== undefined) next.usage = usage\n if (previous?.backgrounded === true) next.backgrounded = true\n entry.tasks.set(taskId, next)\n const settled = next.status !== 'running'\n await this.#scheduleTasksSnapshot(entry, settled)\n 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 this.#closeTranscriptTextSegment(active)\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 #completeProgressSegment(\n active: ActiveTurn,\n result: Extract<NormalizedSdkMessage, { kind: 'result' }>,\n recordUsage = true,\n ): Promise<void> {\n if (recordUsage && (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 if (!active.sawTextDelta && active.text.length === 0 && result.text !== undefined) {\n active.text = result.text\n active.transcriptText = result.text\n await this.#upsertTranscriptText(active)\n active.output.push({ type: 'text-delta', text: result.text })\n }\n await this.#upsertTranscriptText(active)\n active.output.push({ type: 'segment-complete', text: active.text })\n active.sawTextDelta = false\n active.text = ''\n this.#closeTranscriptTextSegment(active)\n active.thinking = ''\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.#upsertTranscriptText(active)\n await this.#flushTranscript(active)\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 if (!active.sawTextDelta && active.text.length === 0 && result.text !== undefined) {\n active.text = result.text\n active.transcriptText = result.text\n await this.#upsertTranscriptText(active)\n active.output.push({ type: 'text-delta', text: result.text })\n }\n await this.#upsertTranscriptText(active)\n await this.#flushTranscript(active)\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.transcriptText = result.text\n await this.#upsertTranscriptText(active)\n active.output.push({ type: 'text-delta', text: result.text })\n }\n await this.#upsertTranscriptText(active)\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 await this.#completeProgressSegment(active, result, false)\n return\n }\n await this.#appendSafely(active, {\n kind: 'status',\n phase: 'completed',\n title: 'Claude Code turn completed',\n })\n await this.#flushTranscript(active)\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 #upsertTranscriptText(active: ActiveTurn): Promise<void> {\n if (active.transcriptText.length === 0) return\n const ordinal = active.transcriptTextOrdinal ?? active.cursor.nextOrdinal++\n active.transcriptTextOrdinal = ordinal\n try {\n // Hot path: notify live subscribers synchronously; disk persistence is\n // coalesced inside the repository and flushed at segment/turn edges.\n this.#sidecar.appendTranscriptText(active.agent.id as string, {\n text: active.transcriptText,\n turn: active.cursor.turn,\n step: active.cursor.step,\n ordinal,\n })\n } catch {\n // Transcript persistence is presentational and must not change a Claude outcome.\n }\n }\n\n async #flushTranscript(active: ActiveTurn): Promise<void> {\n await this.#sidecar.flushTranscriptText(active.agent.id as string).catch(() => undefined)\n }\n\n #closeTranscriptTextSegment(active: ActiveTurn): void {\n void this.#flushTranscript(active)\n active.transcriptText = ''\n active.transcriptTextOrdinal = undefined\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 #startInterrupt(entry: SupervisorEntry): Promise<void> {\n const existing = this.#interruptions.get(entry.sessionId)\n if (existing !== undefined) return existing\n const interruption = this.#interrupt(entry).finally(() => {\n this.#interruptions.delete(entry.sessionId)\n })\n this.#interruptions.set(entry.sessionId, interruption)\n return interruption\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 await this.#upsertTranscriptText(active)\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 await this.#upsertTranscriptText(active)\n await this.#flushTranscript(active)\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 { randomUUID } from 'node:crypto'\n\nconst MAX_COMMENTS_PER_SESSION = 50\nconst MAX_TEXT_CHARS = 2_000\nconst MAX_PATH_CHARS = 1_024\nconst MAX_LINE = 10_000_000\n\nexport type ReviewCommentSide = 'old' | 'new'\n\nexport interface ReviewComment {\n readonly id: string\n readonly path: string\n readonly line: number\n readonly side: ReviewCommentSide\n readonly text: string\n}\n\nexport class ReviewCommentError extends Error {\n readonly code: string\n\n constructor(code: string, message: string) {\n super(message)\n this.name = 'ReviewCommentError'\n this.code = code\n }\n}\n\nfunction validSide(value: unknown): value is ReviewCommentSide {\n return value === 'old' || value === 'new'\n}\n\n/** Pending line comments queued per session until the next user turn drains them. */\nexport class ReviewCommentStore {\n readonly #comments = new Map<string, ReviewComment[]>()\n\n add(sessionId: string, input: { path: unknown; line: unknown; side: unknown; text: unknown }): ReviewComment {\n const path = typeof input.path === 'string' ? input.path.trim() : ''\n const text = typeof input.text === 'string' ? input.text.trim() : ''\n if (path.length === 0 || path.length > MAX_PATH_CHARS || /[\\0\\r\\n]/u.test(path)) {\n throw new ReviewCommentError('invalid-request', 'The comment path is invalid.')\n }\n if (text.length === 0 || text.length > MAX_TEXT_CHARS || text.includes('\\0')) {\n throw new ReviewCommentError('invalid-request', 'The comment text is invalid.')\n }\n if (typeof input.line !== 'number' || !Number.isSafeInteger(input.line) || input.line < 1 || input.line > MAX_LINE) {\n throw new ReviewCommentError('invalid-request', 'The comment line is invalid.')\n }\n if (!validSide(input.side)) throw new ReviewCommentError('invalid-request', 'The comment side is invalid.')\n const existing = this.#comments.get(sessionId) ?? []\n if (existing.length >= MAX_COMMENTS_PER_SESSION) {\n throw new ReviewCommentError('too-many-comments', 'Too many pending review comments. Remove one before adding another.')\n }\n const comment: ReviewComment = { id: randomUUID(), path, line: input.line, side: input.side, text }\n this.#comments.set(sessionId, [...existing, comment])\n return comment\n }\n\n remove(sessionId: string, id: string): boolean {\n const existing = this.#comments.get(sessionId)\n if (existing === undefined) return false\n const next = existing.filter(comment => comment.id !== id)\n if (next.length === existing.length) return false\n if (next.length === 0) this.#comments.delete(sessionId)\n else this.#comments.set(sessionId, next)\n return true\n }\n\n list(sessionId: string): readonly ReviewComment[] {\n return this.#comments.get(sessionId) ?? []\n }\n\n /** Remove and return every pending comment; called when a user turn consumes them. */\n drain(sessionId: string): readonly ReviewComment[] {\n const existing = this.#comments.get(sessionId) ?? []\n this.#comments.delete(sessionId)\n return existing\n }\n\n disposeSession(sessionId: string): void {\n this.#comments.delete(sessionId)\n }\n\n dispose(): void {\n this.#comments.clear()\n }\n}\n\n/** Render drained comments as the prompt block preceding the user's message text. */\nexport function formatReviewComments(comments: readonly ReviewComment[]): string {\n const lines = comments.map((comment, index) => (\n `${index + 1}. ${comment.path}:${comment.line}${comment.side === 'old' ? ' (old side)' : ''} — ${comment.text}`\n ))\n return [\n '<user-review-comments>',\n 'The user attached these code review comments to this message. Each references a file and line from the current working tree diff:',\n ...lines,\n '</user-review-comments>',\n ].join('\\n')\n}\n","import {\n LlmAdapter,\n ReasoningEffortId,\n type GenerateOptions,\n type LlmModelInfo,\n type LlmProviderInfo,\n type LlmResolvedModelInfo,\n type PreparedAdapterCall,\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'\nimport { formatReviewComments, type ReviewComment } from './review-comments.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\n/**\n * Prepend the session's pending diff-review comments to the outgoing user\n * prompt. The comments are drained once per turn: they are formatted into one\n * `<user-review-comments>` block placed ahead of the user's own text (or as a\n * leading text block for multi-part prompts) so Claude reads them in the same\n * turn that consumed them.\n */\nexport function injectReviewComments(prompt: ClaudePrompt, comments: readonly ReviewComment[]): ClaudePrompt {\n if (comments.length === 0) return prompt\n const block = formatReviewComments(comments)\n if (typeof prompt === 'string') return `${block}\\n\\n${prompt}`\n return [{ type: 'text', text: block }, ...prompt]\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 readonly #drainReviewComments: (sessionId: string) => readonly ReviewComment[]\n\n constructor(\n supervisor: ClaudeSupervisor,\n agents: Pick<AgentRegistry, 'currentInitiator' | 'get'>,\n attachments: AttachmentReader,\n presetIdFor: (agent: Agent) => string | undefined,\n drainReviewComments: (sessionId: string) => readonly ReviewComment[] = () => [],\n ) {\n super()\n this.#supervisor = supervisor\n this.#agents = agents\n this.#attachments = attachments\n this.#presetIdFor = presetIdFor\n this.#drainReviewComments = drainReviewComments\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, _signal?: AbortSignal): 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 prepareCall(\n provider: string,\n model: string,\n signal?: AbortSignal,\n ): Promise<PreparedAdapterCall> {\n return {\n model: await this.resolveModel(provider, model, signal),\n stream: options => this.stream(options),\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: injectReviewComments(prompt, this.#drainReviewComments(agent.id as string)),\n model: options.model,\n ...(thinkingMode === undefined ? {} : { thinkingMode }),\n ...(options.signal === undefined ? {} : { signal: options.signal }),\n })\n\n let pendingUsage: TokenUsage | undefined\n let completed = false\n try {\n for await (const event of events) {\n // The sidecar owns the complete visible transcript so prose and Claude\n // tool groups can share one exact ordinal stream. DSH receives only an\n // empty assistant completion anchor plus usage/lifecycle metadata.\n if (event.type === 'text-delta' || event.type === 'segment-complete') continue\n if (event.type === 'usage') {\n pendingUsage = tokenUsage(event.usage)\n continue\n }\n completed = true\n if (pendingUsage !== undefined) yield { type: 'usage', usage: pendingUsage }\n yield { type: 'finish', reason: { kind: 'stop' } }\n }\n } catch (error) {\n if ((error as Error).name === 'AbortError') {\n completed = true\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 drainReviewComments: (sessionId: string) => readonly ReviewComment[] = () => [],\n): ClaudeCodeAdapter {\n return new ClaudeCodeAdapter(supervisor, agents, attachments, presetIdFor, drainReviewComments)\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 type { ServerResponse } from 'node:http'\nimport { CLAUDE_PROJECTION_PATH } from './constants.ts'\nimport { json, trustedRequest } from './http.ts'\nimport type { ClaudeSidecarProjection, ClaudeSidecarRepository } from './sidecar.ts'\nimport type { ClaudeCommandView } from './command-bridge.ts'\nimport type { RepositoryStatus } from './repository-status.ts'\nimport type { ReviewComment } from './review-comments.ts'\n\nconst MAX_SESSION_ID_CHARS = 1_024\n/** Slow-moving metadata refresh and stream heartbeat cadence; deliberately off\n * the transcript hot path so git/gh latency never delays visible text. */\nconst META_REFRESH_MS = 5_000\n\ninterface ProjectionTarget {\n readonly sessionId: string\n readonly stream: boolean\n}\n\nfunction targetFromUrl(rawUrl: string | undefined): ProjectionTarget | 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 let encoded = pathname.slice(prefix.length)\n const stream = encoded.endsWith('/stream')\n if (stream) encoded = encoded.slice(0, -'/stream'.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, stream }\n } catch {\n return undefined\n }\n}\n\ninterface ProjectionMeta {\n readonly owned: boolean\n readonly commands: readonly ClaudeCommandView[]\n readonly repository?: RepositoryStatus\n readonly reviewComments: readonly ReviewComment[]\n}\n\nfunction envelope(projection: ClaudeSidecarProjection, meta: ProjectionMeta): Record<string, unknown> {\n return {\n schemaVersion: projection.schemaVersion,\n revision: projection.revision,\n owned: meta.owned,\n commands: meta.commands,\n activities: projection.activities,\n ...(projection.contextUsage === undefined ? {} : { contextUsage: projection.contextUsage }),\n ...(projection.tasks === undefined ? {} : { tasks: projection.tasks }),\n ...(meta.repository === undefined ? {} : { repository: meta.repository }),\n reviewComments: meta.reviewComments,\n }\n}\n\n/** Register the browser-readable, credential-free sidecar projection endpoint.\n * `GET <path>/:sessionId` returns one snapshot; `GET <path>/:sessionId/stream`\n * returns an NDJSON stream: a full snapshot line followed by incremental\n * transcript/activity deltas and periodic metadata/heartbeat lines. */\nexport function registerClaudeProjectionRoute(\n ctx: Context,\n sidecar: ClaudeSidecarRepository,\n ownsSession: (sessionId: string) => boolean,\n commandsForSession: (sessionId: string) => readonly ClaudeCommandView[] = () => [],\n repositoryForSession: (sessionId: string) => Promise<RepositoryStatus | undefined> = async () => undefined,\n reviewCommentsForSession: (sessionId: string) => readonly ReviewComment[] = () => [],\n): void {\n const info = (message: string): void => {\n ctx.logger?.info?.(message)\n }\n\n const assembleMeta = async (sessionId: string): Promise<ProjectionMeta> => {\n const owned = ownsSession(sessionId)\n const repository = owned ? await repositoryForSession(sessionId) : undefined\n return {\n owned,\n commands: commandsForSession(sessionId),\n ...(repository === undefined ? {} : { repository }),\n reviewComments: owned ? reviewCommentsForSession(sessionId) : [],\n }\n }\n\n const streamProjection = async (res: ServerResponse, sessionId: string): Promise<void> => {\n info(`dsh-claude: projection stream opened for ${sessionId.slice(0, 64)}`)\n // Delta-cadence telemetry: reveals upstream text granularity in the log.\n let textDeltas = 0\n let textBytes = 0\n let textSince = Date.now()\n let meta = await assembleMeta(sessionId)\n res.writeHead(200, {\n 'content-type': 'application/x-ndjson; charset=utf-8',\n 'cache-control': 'no-store',\n 'x-content-type-options': 'nosniff',\n })\n res.flushHeaders?.()\n let closed = false\n const writeLine = (value: unknown): void => {\n if (closed) return\n try {\n res.write(`${JSON.stringify(value)}\\n`)\n } catch {\n closed = true\n }\n }\n const writeSnapshot = async (): Promise<void> => {\n const projection = await sidecar.read(sessionId)\n writeLine({ type: 'snapshot', ...envelope(projection, meta) })\n }\n await writeSnapshot()\n const unsubscribe = sidecar.subscribe(sessionId, delta => {\n switch (delta.kind) {\n case 'text':\n textDeltas += 1\n textBytes += (delta.append ?? delta.text ?? '').length\n if (textDeltas % 25 === 0) {\n const elapsed = Date.now() - textSince\n info(`dsh-claude: stream ${sessionId.slice(0, 24)} 25 text deltas ${textBytes}B in ${elapsed}ms`)\n textBytes = 0\n textSince = Date.now()\n }\n writeLine({\n type: 'text',\n turn: delta.turn,\n step: delta.step,\n ordinal: delta.ordinal,\n ...(delta.append === undefined ? {} : { append: delta.append }),\n ...(delta.text === undefined ? {} : { text: delta.text }),\n })\n return\n case 'activity':\n writeLine({ type: 'activity', activity: delta.activity })\n return\n case 'contextUsage':\n writeLine({ type: 'contextUsage', value: delta.value })\n return\n case 'tasks':\n writeLine({ type: 'tasks', value: delta.value })\n return\n case 'sync':\n void writeSnapshot().catch(() => undefined)\n }\n })\n const timer = setInterval(() => {\n void (async () => {\n const next = await assembleMeta(sessionId)\n if (closed) return\n if (JSON.stringify(next) === JSON.stringify(meta)) {\n writeLine({ type: 'ping' })\n return\n }\n meta = next\n writeLine({\n type: 'meta',\n owned: meta.owned,\n commands: meta.commands,\n ...(meta.repository === undefined ? {} : { repository: meta.repository }),\n reviewComments: meta.reviewComments,\n })\n })().catch(() => undefined)\n }, META_REFRESH_MS)\n timer.unref?.()\n await new Promise<void>(resolve => {\n res.on('close', () => {\n closed = true\n clearInterval(timer)\n unsubscribe()\n info(`dsh-claude: projection stream closed for ${sessionId.slice(0, 64)} after ${textDeltas} text deltas`)\n resolve()\n })\n })\n }\n\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 target = targetFromUrl(req.url)\n if (target === undefined) return json(res, 400, { error: 'invalid session id' })\n try {\n if (target.stream) return await streamProjection(res, target.sessionId)\n // A steady 2s cadence here means a stale (pre-streaming) client bundle.\n info(`dsh-claude: projection poll for ${target.sessionId.slice(0, 64)}`)\n const projection = await sidecar.read(target.sessionId)\n return json(res, 200, envelope(projection, await assembleMeta(target.sessionId)))\n } catch {\n if (!res.headersSent) return json(res, 500, { error: 'projection unavailable' })\n res.end()\n }\n },\n }), 'dsh-claude: sidecar projection route')\n}\n","import type { SubprocessHandle, SubprocessRuntime } from '@deepseek-ai/dsh-subprocess'\n\nconst MAX_OUTPUT_BYTES = 64 * 1024\nconst MAX_DIFF_BYTES = 256 * 1024\nconst MAX_UNTRACKED_DIFFS = 50\nconst GIT_TIMEOUT_MS = 5_000\nconst GH_TIMEOUT_MS = 8_000\nconst CACHE_TTL_MS = 5_000\nconst MAX_TEXT_CHARS = 1_024\n\nexport type RepositoryCheckState = 'passing' | 'pending' | 'failing' | 'none'\nexport type RepositoryReviewState = 'approved' | 'changes-requested' | 'review-required' | 'none'\n\nexport interface RepositoryPullRequestStatus {\n readonly number: number\n readonly title: string\n readonly url: string\n readonly state: 'open' | 'closed' | 'merged'\n readonly draft: boolean\n readonly review: RepositoryReviewState\n readonly checks: RepositoryCheckState\n readonly mergeState?: string\n readonly author?: string\n readonly createdAt?: string\n readonly mergedAt?: string\n readonly baseBranch?: string\n}\n\nexport interface RepositoryDiffStatus {\n readonly additions: number\n readonly deletions: number\n readonly files: number\n readonly patch?: string\n readonly truncated: boolean\n}\n\nexport interface RepositoryStatus {\n readonly status: 'ready' | 'not-repository' | 'unavailable'\n readonly cwd: string\n readonly root?: string\n readonly branch?: string\n readonly detached?: boolean\n readonly worktree?: boolean\n readonly dirty?: boolean\n readonly upstream?: boolean\n readonly ahead?: number\n readonly behind?: number\n readonly remote?: string\n readonly pullRequest?: RepositoryPullRequestStatus\n readonly diff?: RepositoryDiffStatus\n /** Commits on origin/<base> that are not on HEAD, for open pull requests. */\n readonly baseBehind?: number\n}\n\ntype RepositoryRuntime = Pick<SubprocessRuntime, 'resolveExecutable' | 'spawn'>\n\ninterface CommandResult {\n readonly exitCode: number | null\n readonly stdout: string\n readonly lossy: boolean\n}\n\nfunction bounded(value: string): string {\n return value.trim().slice(0, MAX_TEXT_CHARS)\n}\n\nasync function collect(handle: SubprocessHandle): Promise<CommandResult> {\n const outcome = await handle.done\n const stdout = handle.collected.stdout?.readFrom(0)\n return {\n exitCode: outcome.exitCode,\n stdout: stdout?.text ?? '',\n lossy: stdout?.lossy === true,\n }\n}\n\nasync function run(\n runtime: RepositoryRuntime,\n executable: string,\n args: readonly string[],\n cwd: string,\n timeoutMs: number,\n maxBytes = MAX_OUTPUT_BYTES,\n): Promise<CommandResult> {\n const signal = AbortSignal.timeout(timeoutMs)\n return collect(runtime.spawn({\n argv: [executable, ...args],\n cwd,\n stdio: {\n stdin: 'ignore',\n stdout: { maxBytes },\n stderr: { maxBytes: MAX_OUTPUT_BYTES },\n },\n graceMs: 1_000,\n signal,\n env: {},\n }))\n}\n\nfunction normalizedPath(value: string): string {\n return value.replaceAll('\\\\', '/').replace(/\\/+$/u, '').toLocaleLowerCase('en-US')\n}\n\nexport function parseGitStatus(output: string): {\n branch?: string\n detached: boolean\n dirty: boolean\n upstream: boolean\n ahead?: number\n behind?: number\n} {\n let branch: string | undefined\n let detached = false\n let dirty = false\n let upstream = false\n let ahead: number | undefined\n let behind: number | undefined\n for (const line of output.split(/\\r?\\n/u)) {\n if (line.startsWith('# branch.head ')) {\n const head = bounded(line.slice('# branch.head '.length))\n if (head === '(detached)') detached = true\n else if (head.length > 0 && head !== '(unknown)') branch = head\n continue\n }\n if (line.startsWith('# branch.upstream ')) {\n upstream = true\n continue\n }\n if (line.startsWith('# branch.ab ')) {\n const counts = /^# branch\\.ab \\+(\\d+) -(\\d+)$/u.exec(line)\n if (counts !== null) {\n ahead = Number(counts[1])\n behind = Number(counts[2])\n }\n continue\n }\n if (line.length > 0 && !line.startsWith('# ')) dirty = true\n }\n return {\n ...(branch === undefined ? {} : { branch }),\n detached,\n dirty,\n upstream,\n ...(ahead === undefined ? {} : { ahead }),\n ...(behind === undefined ? {} : { behind }),\n }\n}\n\nexport function parseDiffNumstat(value: string): Omit<RepositoryDiffStatus, 'patch' | 'truncated'> {\n let additions = 0\n let deletions = 0\n let files = 0\n for (const line of value.split(/\\r?\\n/u)) {\n if (line.length === 0) continue\n const [added, deleted] = line.split('\\t')\n files += 1\n if (added !== undefined && /^\\d+$/u.test(added)) additions += Number(added)\n if (deleted !== undefined && /^\\d+$/u.test(deleted)) deletions += Number(deleted)\n }\n return { additions, deletions, files }\n}\n\nexport function parseGitHubRemote(value: string): string | undefined {\n const remote = bounded(value)\n const match = /^(?:https:\\/\\/github\\.com\\/|git@github\\.com:|ssh:\\/\\/git@github\\.com\\/)([^/\\s]+)\\/([^/\\s]+?)(?:\\.git)?$/iu.exec(remote)\n if (match?.[1] === undefined || match[2] === undefined) return undefined\n return `${match[1]}/${match[2]}`\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\nexport function aggregateChecks(value: unknown): RepositoryCheckState {\n if (!Array.isArray(value) || value.length === 0) return 'none'\n let pending = false\n for (const item of value) {\n const check = record(item)\n if (check === undefined) continue\n const conclusion = typeof check.conclusion === 'string' ? check.conclusion.toUpperCase() : undefined\n const status = typeof check.status === 'string' ? check.status.toUpperCase() : undefined\n const state = typeof check.state === 'string' ? check.state.toUpperCase() : undefined\n if (['FAILURE', 'ERROR', 'CANCELLED', 'TIMED_OUT', 'ACTION_REQUIRED'].includes(conclusion ?? state ?? '')) return 'failing'\n if (status !== undefined && status !== 'COMPLETED') pending = true\n if (['PENDING', 'EXPECTED'].includes(state ?? '')) pending = true\n }\n return pending ? 'pending' : 'passing'\n}\n\nfunction reviewState(value: unknown): RepositoryReviewState {\n if (value === 'APPROVED') return 'approved'\n if (value === 'CHANGES_REQUESTED') return 'changes-requested'\n if (value === 'REVIEW_REQUIRED') return 'review-required'\n return 'none'\n}\n\nexport function parsePullRequest(value: unknown): RepositoryPullRequestStatus | undefined {\n const input = record(value)\n if (input === undefined\n || !Number.isSafeInteger(input.number)\n || Number(input.number) <= 0\n || typeof input.title !== 'string'\n || typeof input.url !== 'string') return undefined\n let url: URL\n try {\n url = new URL(input.url)\n } catch {\n return undefined\n }\n if (url.protocol !== 'https:' || url.hostname !== 'github.com') return undefined\n const rawState = typeof input.state === 'string' ? input.state.toUpperCase() : ''\n const state = input.mergedAt !== undefined && input.mergedAt !== null\n ? 'merged'\n : rawState === 'OPEN' ? 'open' : rawState === 'CLOSED' ? 'closed' : undefined\n if (state === undefined) return undefined\n return {\n number: Number(input.number),\n title: bounded(input.title),\n url: url.href,\n state,\n draft: input.isDraft === true,\n review: reviewState(input.reviewDecision),\n checks: aggregateChecks(input.statusCheckRollup),\n ...(typeof input.mergeStateStatus === 'string'\n ? { mergeState: bounded(input.mergeStateStatus) }\n : {}),\n ...(typeof record(input.author)?.login === 'string'\n ? { author: bounded(String(record(input.author)?.login)) }\n : {}),\n ...(typeof input.createdAt === 'string' && Number.isFinite(Date.parse(input.createdAt))\n ? { createdAt: new Date(input.createdAt).toISOString() }\n : {}),\n ...(typeof input.mergedAt === 'string' && Number.isFinite(Date.parse(input.mergedAt))\n ? { mergedAt: new Date(input.mergedAt).toISOString() }\n : {}),\n ...(typeof input.baseRefName === 'string' && bounded(input.baseRefName).length > 0\n ? { baseBranch: bounded(input.baseRefName) }\n : {}),\n }\n}\n\nexport class RepositoryStatusService {\n readonly #runtime: RepositoryRuntime\n readonly #cacheTtlMs: number\n readonly #cache = new Map<string, { expiresAt: number; value: Promise<RepositoryStatus> }>()\n readonly #lastReady = new Map<string, RepositoryStatus>()\n #gitExecutable?: Promise<string>\n #ghExecutable?: Promise<string | undefined>\n\n constructor(runtime: RepositoryRuntime, cacheTtlMs = CACHE_TTL_MS) {\n this.#runtime = runtime\n this.#cacheTtlMs = cacheTtlMs\n }\n\n inspect(cwd: string): Promise<RepositoryStatus> {\n const current = this.#cache.get(cwd)\n if (current !== undefined && current.expiresAt > Date.now()) return current.value\n const value = this.#inspect(cwd).then(next => this.#stabilize(cwd, next))\n this.#cache.set(cwd, { expiresAt: Date.now() + this.#cacheTtlMs, value })\n void value.catch(() => this.#cache.delete(cwd))\n return value\n }\n\n invalidate(cwd: string): void {\n this.#cache.delete(cwd)\n this.#lastReady.delete(cwd)\n }\n\n dispose(): void {\n this.#cache.clear()\n this.#lastReady.clear()\n }\n\n #stabilize(cwd: string, next: RepositoryStatus): RepositoryStatus {\n const previous = this.#lastReady.get(cwd)\n if (next.status !== 'ready') return previous ?? next\n const sameCheckout = previous?.status === 'ready'\n && previous.root === next.root\n && previous.branch === next.branch\n const stable = sameCheckout\n ? {\n ...next,\n ...(next.pullRequest === undefined && previous.pullRequest !== undefined ? { pullRequest: previous.pullRequest } : {}),\n ...(next.pullRequest === undefined && previous.pullRequest !== undefined && previous.diff !== undefined\n ? { diff: previous.diff }\n : next.diff === undefined && previous.diff !== undefined ? { diff: previous.diff } : {}),\n }\n : next\n this.#lastReady.set(cwd, stable)\n return stable\n }\n\n async #git(): Promise<string> {\n this.#gitExecutable ??= this.#runtime.resolveExecutable('git')\n return this.#gitExecutable\n }\n\n async #gh(): Promise<string | undefined> {\n this.#ghExecutable ??= this.#runtime.resolveExecutable('gh').catch(() => undefined)\n return this.#ghExecutable\n }\n\n async #inspect(cwd: string): Promise<RepositoryStatus> {\n const safeCwd = bounded(cwd)\n let git: string\n try {\n git = await this.#git()\n } catch {\n return { status: 'unavailable', cwd: safeCwd }\n }\n try {\n const paths = await run(this.#runtime, git, [\n 'rev-parse', '--path-format=absolute', '--show-toplevel', '--absolute-git-dir', '--git-common-dir',\n ], cwd, GIT_TIMEOUT_MS)\n if (paths.exitCode !== 0) return { status: 'not-repository', cwd: safeCwd }\n const [rootValue, gitDirValue, commonDirValue] = paths.stdout.split(/\\r?\\n/u)\n const root = bounded(rootValue ?? '')\n const gitDir = bounded(gitDirValue ?? '')\n const commonDir = bounded(commonDirValue ?? '')\n if (root.length === 0 || gitDir.length === 0 || commonDir.length === 0) return { status: 'unavailable', cwd: safeCwd }\n const statusResult = await run(this.#runtime, git, ['status', '--porcelain=v2', '--branch', '--untracked-files=normal'], cwd, GIT_TIMEOUT_MS)\n if (statusResult.exitCode !== 0) return { status: 'unavailable', cwd: safeCwd }\n const status = parseGitStatus(statusResult.stdout)\n const remoteResult = await run(this.#runtime, git, ['remote', 'get-url', 'origin'], cwd, GIT_TIMEOUT_MS)\n const remote = remoteResult.exitCode === 0 ? parseGitHubRemote(remoteResult.stdout) : undefined\n const pullRequest = status.branch === undefined || remote === undefined\n ? undefined\n : await this.#pullRequest(cwd, remote, status.branch)\n const diffBase = pullRequest?.baseBranch === undefined\n ? 'HEAD'\n : await this.#mergeBase(cwd, git, pullRequest.baseBranch) ?? 'HEAD'\n const diff = status.dirty || diffBase !== 'HEAD'\n ? await this.#diff(cwd, git, diffBase)\n : { additions: 0, deletions: 0, files: 0, truncated: false }\n const baseBehind = pullRequest?.state === 'open' && pullRequest.baseBranch !== undefined\n ? await this.#baseBehind(cwd, git, pullRequest.baseBranch)\n : undefined\n return {\n status: 'ready',\n cwd: safeCwd,\n root,\n ...status,\n worktree: normalizedPath(gitDir) !== normalizedPath(commonDir),\n ...(remote === undefined ? {} : { remote }),\n ...(pullRequest === undefined ? {} : { pullRequest }),\n ...(diff === undefined ? {} : { diff }),\n ...(baseBehind === undefined ? {} : { baseBehind }),\n }\n } catch {\n return { status: 'unavailable', cwd: safeCwd }\n }\n }\n\n async #baseBehind(cwd: string, git: string, baseBranch: string): Promise<number | undefined> {\n try {\n const result = await run(this.#runtime, git, ['rev-list', '--count', `HEAD..refs/remotes/origin/${baseBranch}`, '--'], cwd, GIT_TIMEOUT_MS)\n if (result.exitCode !== 0 || result.lossy) return undefined\n const count = Number(bounded(result.stdout))\n return Number.isSafeInteger(count) && count >= 0 ? count : undefined\n } catch {\n return undefined\n }\n }\n\n async #mergeBase(cwd: string, git: string, baseBranch: string): Promise<string | undefined> {\n try {\n const result = await run(this.#runtime, git, ['merge-base', 'HEAD', `refs/remotes/origin/${baseBranch}`], cwd, GIT_TIMEOUT_MS)\n if (result.exitCode !== 0 || result.lossy) return undefined\n const oid = bounded(result.stdout)\n return /^[0-9a-f]{40}$/iu.test(oid) ? oid : undefined\n } catch {\n return undefined\n }\n }\n\n async #diff(cwd: string, git: string, base: string): Promise<RepositoryDiffStatus | undefined> {\n try {\n const numstat = await run(this.#runtime, git, ['diff', '--no-ext-diff', '--numstat', base, '--'], cwd, GIT_TIMEOUT_MS)\n if (numstat.exitCode !== 0 || numstat.lossy) return undefined\n const summary = parseDiffNumstat(numstat.stdout)\n const patch = await run(this.#runtime, git, ['diff', '--no-ext-diff', '--no-color', '--unified=3', base, '--'], cwd, GIT_TIMEOUT_MS, MAX_DIFF_BYTES)\n if (patch.exitCode !== 0) return { ...summary, truncated: true }\n const untracked = await this.#untrackedDiff(cwd, git)\n const combinedPatch = `${patch.stdout}${untracked.patch}`\n return {\n additions: summary.additions + untracked.additions,\n deletions: summary.deletions,\n files: summary.files + untracked.files,\n ...(patch.lossy ? {} : { patch: combinedPatch.slice(0, MAX_DIFF_BYTES) }),\n truncated: patch.lossy || untracked.truncated || combinedPatch.length > MAX_DIFF_BYTES,\n }\n } catch {\n return undefined\n }\n }\n\n async #untrackedDiff(cwd: string, git: string): Promise<{ additions: number; files: number; patch: string; truncated: boolean }> {\n const listed = await run(this.#runtime, git, ['ls-files', '--others', '--exclude-standard', '-z'], cwd, GIT_TIMEOUT_MS)\n if (listed.exitCode !== 0 || listed.lossy) return { additions: 0, files: 0, patch: '', truncated: listed.lossy }\n const paths = listed.stdout.split('\\0').filter(path => path.length > 0)\n let additions = 0\n let patch = ''\n let truncated = paths.length > MAX_UNTRACKED_DIFFS\n for (const path of paths.slice(0, MAX_UNTRACKED_DIFFS)) {\n const result = await run(this.#runtime, git, [\n 'diff', '--no-ext-diff', '--no-color', '--unified=3', '--numstat', '--patch', '--no-index', '--', '/dev/null', path,\n ], cwd, GIT_TIMEOUT_MS, MAX_DIFF_BYTES)\n if (result.exitCode !== 0 && result.exitCode !== 1) {\n truncated = true\n continue\n }\n const start = result.stdout.indexOf('diff --git ')\n additions += parseDiffNumstat(start >= 0 ? result.stdout.slice(0, start) : result.stdout).additions\n if (result.lossy) truncated = true\n else if (start >= 0) patch += result.stdout.slice(start)\n }\n return { additions, files: paths.length, patch, truncated }\n }\n\n async #pullRequest(cwd: string, repository: string, branch: string): Promise<RepositoryPullRequestStatus | undefined> {\n const gh = await this.#gh()\n if (gh === undefined) return undefined\n try {\n const result = await run(this.#runtime, gh, [\n 'pr', 'view', branch,\n '--repo', repository,\n '--json', 'number,title,url,state,isDraft,reviewDecision,mergeStateStatus,mergedAt,statusCheckRollup,author,createdAt,baseRefName',\n ], cwd, GH_TIMEOUT_MS)\n if (result.exitCode !== 0) return undefined\n return parsePullRequest(JSON.parse(result.stdout))\n } catch {\n return undefined\n }\n }\n}\n","import { randomUUID } from 'node:crypto'\nimport { mkdir, readFile, rename, rm, stat, writeFile } from 'node:fs/promises'\nimport { basename, isAbsolute, join, resolve } from 'node:path'\nimport { dshHomePath } from '@deepseek-ai/dsh-home-paths'\nimport type { SubprocessHandle, SubprocessRuntime } from '@deepseek-ai/dsh-subprocess'\n\nconst MAX_OUTPUT_BYTES = 128 * 1024\nconst GIT_TIMEOUT_MS = 10_000\nconst GIT_FETCH_TIMEOUT_MS = 60_000\nconst MAX_PATH_CHARS = 4_096\nconst MAX_BRANCH_CHARS = 512\nconst LEASE_SCHEMA_VERSION = 1\n// ponytail: grace only needs to outlive the worktree-create -> workspace-register\n// hop (seconds); two minutes keeps deletion feeling prompt while staying safe.\nconst CLEANUP_GRACE_MS = 2 * 60_000\n\ntype RepositorySetupRuntime = Pick<SubprocessRuntime, 'resolveExecutable' | 'spawn'>\n\ninterface CommandResult {\n readonly exitCode: number | null\n readonly stdout: string\n readonly stderr: string\n readonly lossy: boolean\n}\n\nexport interface RepositoryBranchList {\n readonly root: string\n readonly current?: string\n readonly dirty: boolean\n readonly branches: readonly string[]\n readonly remoteBranches: readonly string[]\n}\n\nexport type RepositorySetupStage = 'inspecting' | 'fetching' | 'creating-worktree' | 'saving-worktree' | 'switching-branch'\nexport type RepositorySetupProgress = (stage: RepositorySetupStage) => void\n\nexport interface RepositorySetupResult {\n readonly mode: 'checkout' | 'worktree'\n readonly root: string\n readonly path: string\n readonly branch: string\n readonly leaseId?: string\n}\n\ninterface WorktreeLease {\n readonly id: string\n readonly root: string\n readonly path: string\n readonly branch: string\n readonly createdAt: string\n readonly pluginGeneratedBranch: boolean\n readonly sessionId?: string\n}\n\ninterface LeaseDocument {\n readonly schemaVersion: typeof LEASE_SCHEMA_VERSION\n readonly leases: readonly WorktreeLease[]\n}\n\nexport interface RepositorySetupServiceOptions {\n readonly leasePath?: string\n readonly worktreeRoot?: string\n readonly branchPrefix?: () => Promise<string>\n readonly cleanupGraceMs?: number\n}\n\nexport class RepositorySetupError extends Error {\n readonly code: string\n\n constructor(code: string, message: string) {\n super(message)\n this.name = 'RepositorySetupError'\n this.code = code\n }\n}\n\nasync function collect(handle: SubprocessHandle): Promise<CommandResult> {\n const outcome = await handle.done\n const stdout = handle.collected.stdout?.readFrom(0)\n const stderr = handle.collected.stderr?.readFrom(0)\n return {\n exitCode: outcome.exitCode,\n stdout: stdout?.text ?? '',\n stderr: stderr?.text ?? '',\n lossy: stdout?.lossy === true || stderr?.lossy === true,\n }\n}\n\nfunction safePath(value: string): string {\n if (value.length === 0 || value.length > MAX_PATH_CHARS || !isAbsolute(value) || value.includes('\\0')) {\n throw new RepositorySetupError('invalid-path', 'The workspace path is invalid.')\n }\n return resolve(value)\n}\n\nfunction safeBranch(value: string): string {\n if (value.length === 0 || value.length > MAX_BRANCH_CHARS || value.trim() !== value || /[\\0\\r\\n]/u.test(value)) {\n throw new RepositorySetupError('invalid-branch', 'The branch name is invalid.')\n }\n return value\n}\n\nfunction parseCurrentBranch(value: string): string | undefined {\n const branch = value.trim()\n return branch.length === 0 || branch === 'HEAD' ? undefined : branch\n}\n\nexport function parseWorktreeBranches(value: string): ReadonlyMap<string, string> {\n const occupied = new Map<string, string>()\n let path: string | undefined\n for (const line of `${value}\\n`.split(/\\r?\\n/u)) {\n if (line.startsWith('worktree ')) path = line.slice('worktree '.length)\n else if (line.startsWith('branch refs/heads/') && path !== undefined) {\n occupied.set(line.slice('branch refs/heads/'.length), path)\n } else if (line.length === 0) path = undefined\n }\n return occupied\n}\n\nfunction slug(value: string, fallback: string): string {\n const normalized = value.toLocaleLowerCase('en-US').replace(/[^a-z0-9._-]+/gu, '-').replace(/^-+|-+$/gu, '')\n return normalized.slice(0, 48) || fallback\n}\n\n/** Comparable form for path identity: resolved, forward slashes, case-folded\n * so Windows drive-letter or case spelling differences cannot hide a match. */\nfunction comparablePath(value: string): string {\n return resolve(value).replaceAll('\\\\', '/').toLocaleLowerCase('en-US')\n}\n\nfunction pathExists(value: string): Promise<boolean> {\n return stat(value).then(() => true, () => false)\n}\n\nfunction lease(value: unknown): WorktreeLease | undefined {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) return undefined\n const input = value as Record<string, unknown>\n if (typeof input.id !== 'string' || typeof input.root !== 'string' || typeof input.path !== 'string'\n || typeof input.branch !== 'string' || typeof input.createdAt !== 'string'\n || (input.pluginGeneratedBranch !== undefined && typeof input.pluginGeneratedBranch !== 'boolean')\n || (input.sessionId !== undefined && typeof input.sessionId !== 'string')) return undefined\n return {\n id: input.id,\n root: input.root,\n path: input.path,\n branch: input.branch,\n createdAt: input.createdAt,\n pluginGeneratedBranch: input.pluginGeneratedBranch === true,\n ...(input.sessionId === undefined ? {} : { sessionId: input.sessionId }),\n }\n}\n\nexport class RepositorySetupService {\n readonly #runtime: RepositorySetupRuntime\n readonly #leasePath: string\n readonly #worktreeRoot: string\n readonly #branchPrefix: () => Promise<string>\n readonly #cleanupGraceMs: number\n #gitPath: Promise<string> | undefined\n #pending: Promise<unknown> = Promise.resolve()\n\n constructor(runtime: RepositorySetupRuntime, options: RepositorySetupServiceOptions = {}) {\n this.#runtime = runtime\n this.#leasePath = options.leasePath ?? dshHomePath('plugins', 'dsh-claude', 'worktrees.json')\n this.#worktreeRoot = options.worktreeRoot ?? dshHomePath('plugins', 'dsh-claude', 'worktrees')\n this.#branchPrefix = options.branchPrefix ?? (async () => 'claude')\n this.#cleanupGraceMs = options.cleanupGraceMs ?? CLEANUP_GRACE_MS\n }\n\n async listBranches(cwd: string): Promise<RepositoryBranchList> {\n const git = await this.#git()\n const root = await this.#repositoryRoot(git, safePath(cwd))\n const [status, refs, remoteRefs] = await Promise.all([\n this.#run(git, ['status', '--porcelain=v2', '--branch', '--untracked-files=normal'], root),\n this.#run(git, ['for-each-ref', '--format=%(refname:short)', 'refs/heads'], root),\n this.#run(git, ['for-each-ref', '--format=%(refname:short) %(symref)', 'refs/remotes'], root),\n ])\n if (status.exitCode !== 0 || status.lossy || refs.exitCode !== 0 || refs.lossy\n || remoteRefs.exitCode !== 0 || remoteRefs.lossy) {\n throw new RepositorySetupError('repository-unavailable', 'The repository state is unavailable.')\n }\n const current = status.stdout.split(/\\r?\\n/u)\n .find(line => line.startsWith('# branch.head '))\n ?.slice('# branch.head '.length)\n const branches = refs.stdout.split(/\\r?\\n/u).filter(Boolean).sort((left, right) => left.localeCompare(right))\n const remoteBranches = remoteRefs.stdout.split(/\\r?\\n/u)\n .map(line => line.trim().split(/\\s+/u))\n .filter(parts => parts[0] !== undefined && parts[0].length > 0 && parts.length === 1)\n .map(parts => parts[0]!)\n .sort((left, right) => left.localeCompare(right))\n const currentBranch = current === undefined ? undefined : parseCurrentBranch(current)\n return {\n root,\n ...(currentBranch === undefined ? {} : { current: currentBranch }),\n dirty: status.stdout.split(/\\r?\\n/u).some(line => line.length > 0 && !line.startsWith('# ')),\n branches,\n remoteBranches,\n }\n }\n\n async setup(\n cwd: string,\n branchValue: string,\n useWorktree: boolean,\n explicitBranchName?: string,\n progress: RepositorySetupProgress = () => {},\n ): Promise<RepositorySetupResult> {\n progress('inspecting')\n const branch = safeBranch(branchValue)\n const info = await this.listBranches(cwd)\n const local = info.branches.includes(branch)\n const remote = info.remoteBranches.includes(branch)\n if (!local && !remote) {\n throw new RepositorySetupError('branch-not-found', 'The selected local or remote-tracking branch does not exist.')\n }\n const requestedBranch = explicitBranchName === undefined ? undefined : safeBranch(explicitBranchName)\n if (useWorktree) {\n return this.#createWorktree(\n info.root,\n branch,\n local ? `refs/heads/${branch}` : `refs/remotes/${branch}`,\n requestedBranch,\n progress,\n )\n }\n progress('switching-branch')\n return !local && remote ? this.#checkoutRemote(info, branch) : this.#checkout(info, branch)\n }\n\n bindLease(leaseId: string, sessionId: string): Promise<void> {\n if (leaseId.length === 0 || leaseId.length > 128 || sessionId.length === 0 || sessionId.length > 1_024) {\n return Promise.reject(new RepositorySetupError('invalid-lease', 'The worktree lease is invalid.'))\n }\n return this.#serialize(async () => {\n const leases = await this.#readLeases()\n const index = leases.findIndex(item => item.id === leaseId)\n if (index < 0) throw new RepositorySetupError('lease-not-found', 'The worktree lease no longer exists.')\n const existing = leases[index]\n if (existing === undefined) throw new RepositorySetupError('lease-not-found', 'The worktree lease no longer exists.')\n leases[index] = { ...existing, sessionId }\n await this.#writeLeases(leases)\n })\n }\n\n /** Reconcile leases against the set of directories still referenced by a\n * workspace: an unreferenced lease's clean worktree is removed. Fresh\n * leases are retained for a grace period so a worktree created moments ago\n * cannot be swept before its workspace registration lands, and dirty\n * worktrees are always retained to avoid losing uncommitted work. */\n cleanupOrphans(activePaths: readonly string[]): Promise<void> {\n const active = new Set(activePaths.map(comparablePath))\n return this.#serialize(async () => {\n const leases = await this.#readLeases()\n const retained: WorktreeLease[] = []\n let changed = false\n const git = await this.#git()\n const now = Date.now()\n for (const item of leases) {\n const age = now - Date.parse(item.createdAt)\n if (active.has(comparablePath(item.path)) || !(age >= this.#cleanupGraceMs)) {\n retained.push(item)\n continue\n }\n try {\n const status = await this.#run(git, ['status', '--porcelain=v1', '--untracked-files=normal'], item.path)\n if (status.exitCode !== 0 || status.lossy) {\n if (await pathExists(item.path)) {\n retained.push(item)\n } else {\n // The directory is already gone; drop the lease and let Git\n // forget the stale worktree registration.\n await this.#run(git, ['worktree', 'prune'], item.root).catch(() => undefined)\n changed = true\n }\n continue\n }\n if (status.stdout.trim().length > 0) {\n retained.push(item)\n continue\n }\n const removed = await this.#run(git, ['worktree', 'remove', '--', item.path], item.root)\n if (removed.exitCode !== 0) {\n retained.push(item)\n continue\n }\n if (item.pluginGeneratedBranch) {\n await this.#run(git, ['branch', '-D', '--', item.branch], item.root).catch(() => undefined)\n }\n changed = true\n } catch {\n if (await pathExists(item.root)) retained.push(item)\n else changed = true // the repository itself is gone; the lease is dead weight\n }\n }\n if (changed) await this.#writeLeases(retained)\n })\n }\n\n async #checkoutRemote(info: RepositoryBranchList, remoteBranch: string): Promise<RepositorySetupResult> {\n const separator = remoteBranch.indexOf('/')\n if (separator <= 0 || separator === remoteBranch.length - 1) {\n throw new RepositorySetupError('invalid-branch', 'The remote-tracking branch name is invalid.')\n }\n const localBranch = safeBranch(remoteBranch.slice(separator + 1))\n if (info.branches.includes(localBranch)) {\n const git = await this.#git()\n const upstream = await this.#run(git, ['for-each-ref', '--format=%(upstream:short)', `refs/heads/${localBranch}`], info.root)\n if (upstream.exitCode !== 0 || upstream.lossy) {\n throw new RepositorySetupError('repository-unavailable', 'The local branch tracking state is unavailable.')\n }\n if (upstream.stdout.trim() !== remoteBranch) {\n throw new RepositorySetupError('branch-tracking-conflict', `The local branch ${localBranch} does not track ${remoteBranch}.`)\n }\n return this.#checkout(info, localBranch)\n }\n if (info.dirty) throw new RepositorySetupError('dirty-workspace', 'Commit or stash workspace changes before switching branches.')\n const git = await this.#git()\n const switched = await this.#run(git, ['switch', '--track', '-c', localBranch, `refs/remotes/${remoteBranch}`], info.root)\n if (switched.exitCode !== 0) throw new RepositorySetupError('checkout-failed', 'Git could not create the local tracking branch.')\n return { mode: 'checkout', root: info.root, path: info.root, branch: localBranch }\n }\n\n async #checkout(info: RepositoryBranchList, branch: string): Promise<RepositorySetupResult> {\n if (info.dirty) throw new RepositorySetupError('dirty-workspace', 'Commit or stash workspace changes before switching branches.')\n if (info.current !== branch) {\n const git = await this.#git()\n const worktrees = await this.#run(git, ['worktree', 'list', '--porcelain'], info.root)\n if (worktrees.exitCode !== 0 || worktrees.lossy) throw new RepositorySetupError('repository-unavailable', 'Worktree state is unavailable.')\n const occupiedPath = parseWorktreeBranches(worktrees.stdout).get(branch)\n if (occupiedPath !== undefined && resolve(occupiedPath) !== info.root) {\n throw new RepositorySetupError('branch-occupied', 'The selected branch is already checked out in another worktree.')\n }\n const switched = await this.#run(git, ['switch', '--', branch], info.root)\n if (switched.exitCode !== 0) throw new RepositorySetupError('checkout-failed', 'Git could not switch to the selected branch.')\n }\n return { mode: 'checkout', root: info.root, path: info.root, branch }\n }\n\n async #createWorktree(\n root: string,\n baseBranch: string,\n baseRef: string,\n explicitBranchName: string | undefined,\n progress: RepositorySetupProgress,\n ): Promise<RepositorySetupResult> {\n const git = await this.#git()\n progress('fetching')\n const fetched = await this.#run(\n git,\n ['-c', 'credential.interactive=never', 'fetch', '--all', '--prune'],\n root,\n GIT_FETCH_TIMEOUT_MS,\n )\n if (fetched.exitCode !== 0 || fetched.lossy) {\n throw new RepositorySetupError('fetch-failed', 'Git could not refresh remote references before creating the worktree.')\n }\n const suffix = randomUUID().slice(0, 8)\n const stamp = new Date().toISOString().replace(/[-:]/gu, '').replace(/\\.\\d{3}Z$/u, 'Z')\n const branch = explicitBranchName ?? `${safeBranch(await this.#branchPrefix())}/${slug(baseBranch, 'branch')}-${stamp}-${suffix}`\n const path = join(this.#worktreeRoot, `${slug(basename(root), 'repository')}-${stamp}-${suffix}`)\n progress('creating-worktree')\n await mkdir(this.#worktreeRoot, { recursive: true })\n const created = await this.#run(git, ['worktree', 'add', '-b', branch, path, baseRef], root)\n if (created.exitCode !== 0) throw new RepositorySetupError('worktree-failed', 'Git could not create the worktree.')\n const item: WorktreeLease = {\n id: randomUUID(),\n root,\n path,\n branch,\n createdAt: new Date().toISOString(),\n pluginGeneratedBranch: explicitBranchName === undefined,\n }\n progress('saving-worktree')\n try {\n await this.#serialize(async () => {\n const leases = await this.#readLeases()\n await this.#writeLeases([...leases, item])\n })\n } catch (error) {\n await this.#run(git, ['worktree', 'remove', '--force', '--', path], root).catch(() => undefined)\n throw error\n }\n return { mode: 'worktree', root, path, branch, leaseId: item.id }\n }\n\n async #repositoryRoot(git: string, cwd: string): Promise<string> {\n const result = await this.#run(git, ['rev-parse', '--path-format=absolute', '--show-toplevel'], cwd)\n const root = result.stdout.trim()\n if (result.exitCode !== 0 || result.lossy || root.length === 0 || !isAbsolute(root)) {\n throw new RepositorySetupError('not-repository', 'The workspace is not a Git repository.')\n }\n return resolve(root)\n }\n\n #git(): Promise<string> {\n this.#gitPath ??= this.#runtime.resolveExecutable('git')\n return this.#gitPath\n }\n\n async #run(executable: string, args: readonly string[], cwd: string, timeoutMs = GIT_TIMEOUT_MS): Promise<CommandResult> {\n return collect(this.#runtime.spawn({\n argv: [executable, ...args],\n cwd,\n stdio: {\n stdin: 'ignore',\n stdout: { maxBytes: MAX_OUTPUT_BYTES },\n stderr: { maxBytes: MAX_OUTPUT_BYTES },\n },\n graceMs: 1_000,\n signal: AbortSignal.timeout(timeoutMs),\n env: {},\n }))\n }\n\n async #readLeases(): Promise<WorktreeLease[]> {\n try {\n const parsed = JSON.parse(await readFile(this.#leasePath, 'utf8')) as unknown\n if (parsed === null || typeof parsed !== 'object' || Array.isArray(parsed)) return []\n const input = parsed as Record<string, unknown>\n if (input.schemaVersion !== LEASE_SCHEMA_VERSION || !Array.isArray(input.leases)) return []\n return input.leases.map(lease).filter((item): item is WorktreeLease => item !== undefined)\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === 'ENOENT') return []\n throw error\n }\n }\n\n async #writeLeases(leases: readonly WorktreeLease[]): Promise<void> {\n await mkdir(resolve(this.#leasePath, '..'), { recursive: true })\n const temporary = `${this.#leasePath}.${process.pid}.${randomUUID()}.tmp`\n const document: LeaseDocument = { schemaVersion: LEASE_SCHEMA_VERSION, leases }\n try {\n await writeFile(temporary, `${JSON.stringify(document, null, 2)}\\n`, { mode: 0o600 })\n await rename(temporary, this.#leasePath)\n } finally {\n await rm(temporary, { force: true }).catch(() => undefined)\n }\n }\n\n #serialize<T>(operation: () => Promise<T>): Promise<T> {\n const result = this.#pending.then(operation, operation)\n this.#pending = result.then(() => undefined, () => undefined)\n return result\n }\n}\n","import { createHash } from 'node:crypto'\nimport { basename } from 'node:path'\nimport type { SubprocessHandle, SubprocessRuntime } from '@deepseek-ai/dsh-subprocess'\n\nconst MAX_OUTPUT_BYTES = 256 * 1024\nconst MAX_PATCH_CHARS = 64 * 1024\nconst MAX_MESSAGE_CHARS = 512\nconst MAX_PR_TEXT_CHARS = 8 * 1024\nconst MAX_UNPUSHED_COMMITS = 20\nconst GIT_TIMEOUT_MS = 15_000\nconst REMOTE_TIMEOUT_MS = 60_000\nconst GENERATE_TIMEOUT_MS = 60_000\n\ntype RepositoryActionRuntime = Pick<SubprocessRuntime, 'resolveExecutable' | 'spawn'>\nexport type RepositoryActionKind = 'commit' | 'commit-push' | 'push' | 'create-pr' | 'merge-pr' | 'update-branch'\nexport type RepositoryMergeMethod = 'merge' | 'squash' | 'rebase'\n\ninterface CommandResult {\n readonly exitCode: number | null\n readonly stdout: string\n readonly stderr: string\n readonly lossy: boolean\n}\n\nexport interface RepositoryActionFile {\n readonly path: string\n readonly staged: boolean\n readonly unstaged: boolean\n readonly untracked: boolean\n}\n\nexport interface RepositoryActionCommit {\n readonly hash: string\n readonly subject: string\n}\n\nexport interface RepositoryActionPreview {\n readonly root: string\n readonly branch: string\n readonly head: string\n readonly fingerprint: string\n readonly files: readonly RepositoryActionFile[]\n readonly patch: string\n readonly truncated: boolean\n readonly hasStaged: boolean\n readonly hasUnstaged: boolean\n readonly hasUntracked: boolean\n readonly upstream?: string\n readonly unpushedCommits: readonly RepositoryActionCommit[]\n readonly unpushedTruncated: boolean\n}\n\nexport interface RepositoryActionRequest {\n readonly action: RepositoryActionKind\n readonly fingerprint: string\n readonly message: string\n readonly includeUnstaged: boolean\n readonly prTitle?: string\n readonly prBody?: string\n readonly baseBranch?: string\n readonly draft?: boolean\n readonly mergeMethod?: RepositoryMergeMethod\n}\n\nexport interface RepositoryActionResult {\n readonly commit: string\n readonly pushed: boolean\n readonly pullRequestUrl?: string\n /** Conflicted paths left in the working tree by an update-branch merge. */\n readonly conflicts?: readonly string[]\n}\n\nexport class RepositoryActionError extends Error {\n readonly code: string\n readonly commit?: string\n\n constructor(code: string, message: string, commit?: string) {\n super(message)\n this.name = 'RepositoryActionError'\n this.code = code\n if (commit !== undefined) this.commit = commit\n }\n}\n\nasync function collect(handle: SubprocessHandle): Promise<CommandResult> {\n const outcome = await handle.done\n const stdout = handle.collected.stdout?.readFrom(0)\n const stderr = handle.collected.stderr?.readFrom(0)\n return {\n exitCode: outcome.exitCode,\n stdout: stdout?.text ?? '',\n stderr: stderr?.text ?? '',\n lossy: stdout?.lossy === true || stderr?.lossy === true,\n }\n}\n\nfunction safeText(value: string, maximum: number, label: string): string {\n const text = value.trim()\n if (text.length === 0 || text.length > maximum || /[\\0\\r]/u.test(text)) {\n throw new RepositoryActionError('invalid-request', `${label} is invalid.`)\n }\n return text\n}\n\nexport function isProtectedWarpPath(path: string): boolean {\n return basename(path.replaceAll('\\\\', '/')).toLocaleLowerCase('en-US') === 'warp.md'\n}\n\nexport function parseRepositoryActionStatus(output: string): readonly RepositoryActionFile[] {\n const files = new Map<string, RepositoryActionFile>()\n const records = output.includes('\\0') ? output.split('\\0') : output.split(/\\r?\\n/u)\n for (let position = 0; position < records.length; position += 1) {\n const line = records[position] ?? ''\n if (line.length < 4) continue\n const index = line[0] ?? ' '\n const worktree = line[1] ?? ' '\n let path = line.slice(3)\n const rename = path.lastIndexOf(' -> ')\n if (rename >= 0) path = path.slice(rename + 4)\n if (output.includes('\\0') && (index === 'R' || index === 'C' || worktree === 'R' || worktree === 'C')) position += 1\n if (path.length === 0 || path.includes('\\0') || isProtectedWarpPath(path)) continue\n files.set(path, {\n path,\n staged: index !== ' ' && index !== '?',\n unstaged: worktree !== ' ' && worktree !== '?',\n untracked: index === '?' && worktree === '?',\n })\n }\n return [...files.values()].sort((left, right) => left.path.localeCompare(right.path))\n}\n\nfunction fallbackCommitMessage(files: readonly RepositoryActionFile[]): string {\n if (files.length === 1) return `Update ${files[0]?.path ?? 'repository files'}`\n return `Update ${files.length} repository files`\n}\n\nfunction normalizedGeneratedMessage(value: string, fallback: string): string {\n const first = value.split(/\\r?\\n/u).map(line => line.trim()).find(Boolean)\n if (first === undefined) return fallback\n const message = first.replace(/^['\"`]+|['\"`]+$/gu, '').replace(/[\\0\\r\\n]/gu, ' ').trim()\n return message.length === 0 || message.length > 72 ? fallback : message\n}\n\nfunction validPrUrl(value: string): string | undefined {\n try {\n const url = new URL(value.trim())\n return url.protocol === 'https:' && url.hostname === 'github.com' ? url.href : undefined\n } catch {\n return undefined\n }\n}\n\nexport function validPullRequestBody(value: string): boolean {\n const body = value.trim()\n const match = /^Summary:\\s+([^\\r\\n]+)\\r?\\n\\r?\\nChanges:\\s*\\r?\\n([\\s\\S]+)$/u.exec(body)\n const summary = match?.[1]?.trim()\n const changes = match?.[2]?.trim()\n if (summary === undefined || summary.length === 0 || changes === undefined || changes.length === 0) return false\n return !/^#{1,6}\\s|^[A-Za-z][A-Za-z ]+:\\s*$/mu.test(changes)\n}\n\nexport class RepositoryActionService {\n readonly #runtime: RepositoryActionRuntime\n readonly #claudeExecutable: string\n readonly #invalidate: (cwd: string) => void\n #gitExecutable?: Promise<string>\n #ghExecutable?: Promise<string>\n #pending: Promise<unknown> = Promise.resolve()\n\n constructor(runtime: RepositoryActionRuntime, claudeExecutable: string, invalidate: (cwd: string) => void = () => {}) {\n this.#runtime = runtime\n this.#claudeExecutable = claudeExecutable\n this.#invalidate = invalidate\n }\n\n preview(cwd: string): Promise<RepositoryActionPreview> {\n return this.#preview(cwd)\n }\n\n async generateMessage(cwd: string, fingerprint: string): Promise<string> {\n const preview = await this.#preview(cwd)\n if (preview.fingerprint !== fingerprint) throw new RepositoryActionError('repository-changed', 'Repository changes have changed. Refresh the commit panel.')\n const fallback = fallbackCommitMessage(preview.files)\n const prompt = [\n 'Write one concise English git commit subject (imperative mood, maximum 72 characters).',\n 'Return only the subject without quotes, markdown, body, or explanation.',\n `Files: ${preview.files.map(file => file.path).join(', ')}`,\n `Diff:\\n${preview.patch.slice(0, 24 * 1024)}`,\n ].join('\\n')\n try {\n const result = await this.#run(this.#claudeExecutable, ['-p', '--tools', '', '--output-format', 'text', prompt], preview.root, GENERATE_TIMEOUT_MS)\n return result.exitCode === 0 && !result.lossy ? normalizedGeneratedMessage(result.stdout, fallback) : fallback\n } catch {\n return fallback\n }\n }\n\n execute(cwd: string, request: RepositoryActionRequest): Promise<RepositoryActionResult> {\n const operation = this.#pending.then(() => this.#execute(cwd, request))\n this.#pending = operation.then(() => undefined, () => undefined)\n return operation\n }\n\n async #execute(cwd: string, request: RepositoryActionRequest): Promise<RepositoryActionResult> {\n const before = await this.#preview(cwd)\n if (before.fingerprint !== request.fingerprint) throw new RepositoryActionError('repository-changed', 'Repository changes have changed. Refresh the commit panel.')\n if (request.action === 'push') {\n const git = await this.#git()\n try {\n await this.#push(git, before.root, before.branch)\n } catch (error) {\n throw new RepositoryActionError('push-failed', error instanceof Error ? error.message : 'Git push failed.')\n }\n this.#invalidate(before.root)\n return { commit: before.head, pushed: true }\n }\n if (request.action === 'merge-pr') {\n const method = request.mergeMethod\n if (method !== 'merge' && method !== 'squash' && method !== 'rebase') {\n throw new RepositoryActionError('invalid-request', 'The merge method is invalid.')\n }\n let gh: string\n try {\n gh = await this.#gh()\n } catch (error) {\n throw new RepositoryActionError('gh-unavailable', error instanceof Error ? error.message : 'GitHub CLI is unavailable.')\n }\n const merged = await this.#run(gh, ['pr', 'merge', `--${method}`], before.root, REMOTE_TIMEOUT_MS)\n if (merged.exitCode !== 0 || merged.lossy) {\n const reason = merged.stderr.split(/\\r?\\n/u).map(line => line.trim()).filter(line => line.length > 0).at(-1)\n throw new RepositoryActionError('merge-failed', reason === undefined || reason.length === 0 ? 'The pull request could not be merged.' : reason)\n }\n this.#invalidate(before.root)\n return { commit: before.head, pushed: true }\n }\n if (request.action === 'update-branch') {\n const base = safeText(request.baseBranch ?? '', 512, 'Base branch')\n if (before.files.length > 0) {\n throw new RepositoryActionError('dirty-workspace', 'Commit or stash workspace changes before updating the branch.')\n }\n const git = await this.#git()\n await this.#mustRun(git, ['fetch', 'origin', '--', base], before.root, REMOTE_TIMEOUT_MS, 'fetch-failed', 'Git could not fetch the base branch.')\n const merged = await this.#run(git, ['merge', '--no-edit', '--', `origin/${base}`], before.root, REMOTE_TIMEOUT_MS)\n if (merged.exitCode !== 0 || merged.lossy) {\n const conflicted = await this.#run(git, ['diff', '--name-only', '--diff-filter=U', '--'], before.root, GIT_TIMEOUT_MS)\n const conflicts = conflicted.exitCode === 0 && !conflicted.lossy\n ? conflicted.stdout.split(/\\r?\\n/u).filter(line => line.length > 0).slice(0, 100)\n : []\n if (conflicts.length === 0) {\n await this.#run(git, ['merge', '--abort'], before.root, GIT_TIMEOUT_MS).catch(() => undefined)\n throw new RepositoryActionError('merge-failed', 'Git could not merge the base branch.')\n }\n // Leave the conflicted tree in place: resolving it is the next step.\n this.#invalidate(before.root)\n return { commit: before.head, pushed: false, conflicts }\n }\n const mergedHead = (await this.#mustRun(git, ['rev-parse', 'HEAD'], before.root, GIT_TIMEOUT_MS, 'merge-failed', 'The merge commit could not be verified.')).stdout.trim()\n try {\n await this.#push(git, before.root, before.branch)\n } catch (error) {\n throw new RepositoryActionError('push-failed', error instanceof Error ? error.message : 'Git push failed.', mergedHead)\n }\n this.#invalidate(before.root)\n return { commit: mergedHead, pushed: true }\n }\n const message = safeText(request.message, MAX_MESSAGE_CHARS, 'Commit message')\n if (before.files.length === 0 && request.action !== 'create-pr') {\n throw new RepositoryActionError('nothing-to-commit', 'There are no changes to commit.')\n }\n const git = await this.#git()\n let oid = before.head\n if (before.files.length > 0) {\n await this.#rejectStagedWarp(git, before.root)\n if (request.includeUnstaged) {\n const paths = before.files.filter(file => file.unstaged || file.untracked).map(file => file.path)\n if (paths.length > 0) await this.#mustRun(git, ['add', '--', ...paths], before.root, GIT_TIMEOUT_MS, 'stage-failed', 'Changes could not be staged.')\n }\n await this.#rejectStagedWarp(git, before.root)\n const staged = await this.#run(git, ['diff', '--cached', '--quiet', '--exit-code', '--'], before.root, GIT_TIMEOUT_MS)\n if (staged.exitCode === 0) throw new RepositoryActionError('nothing-to-commit', 'There are no staged changes to commit.')\n if (staged.exitCode !== 1) throw new RepositoryActionError('repository-unavailable', 'The staged changes could not be verified.')\n await this.#mustRun(git, ['commit', '-m', message, '--'], before.root, GIT_TIMEOUT_MS, 'commit-failed', 'Git commit failed.')\n oid = (await this.#mustRun(git, ['rev-parse', 'HEAD'], before.root, GIT_TIMEOUT_MS, 'commit-failed', 'The new commit could not be verified.')).stdout.trim()\n this.#invalidate(before.root)\n if (request.action === 'commit') return { commit: oid, pushed: false }\n }\n try {\n await this.#push(git, before.root, before.branch)\n } catch (error) {\n throw new RepositoryActionError('push-failed', error instanceof Error ? error.message : 'Git push failed.', oid)\n }\n this.#invalidate(before.root)\n if (request.action === 'commit-push') return { commit: oid, pushed: true }\n const title = safeText(request.prTitle ?? message, 256, 'Pull request title')\n const body = safeText(request.prBody ?? '', MAX_PR_TEXT_CHARS, 'Pull request description')\n if (!validPullRequestBody(body)) {\n throw new RepositoryActionError('invalid-pr-description', 'Pull request description must contain only Summary and Changes sections.', oid)\n }\n let gh: string\n try {\n gh = await this.#gh()\n } catch (error) {\n throw new RepositoryActionError('gh-unavailable', error instanceof Error ? error.message : 'GitHub CLI is unavailable.', oid)\n }\n const args = ['pr', 'create', '--title', title, '--body', body]\n if (request.draft !== false) args.push('--draft')\n if (request.baseBranch !== undefined) args.push('--base', safeText(request.baseBranch, 512, 'Base branch'))\n const created = await this.#run(gh, args, before.root, REMOTE_TIMEOUT_MS)\n const url = created.exitCode === 0 && !created.lossy ? validPrUrl(created.stdout) : undefined\n if (url === undefined) throw new RepositoryActionError('pr-failed', 'The pull request could not be created.', oid)\n return { commit: oid, pushed: true, pullRequestUrl: url }\n }\n\n async #preview(cwd: string): Promise<RepositoryActionPreview> {\n const git = await this.#git()\n const rootResult = await this.#mustRun(git, ['rev-parse', '--path-format=absolute', '--show-toplevel'], cwd, GIT_TIMEOUT_MS, 'not-repository', 'The session directory is not a Git repository.')\n const root = rootResult.stdout.trim()\n const [branchResult, headResult, statusResult, stagedPatch, unstagedPatch] = await Promise.all([\n this.#run(git, ['symbolic-ref', '--quiet', '--short', 'HEAD'], root, GIT_TIMEOUT_MS),\n this.#run(git, ['rev-parse', 'HEAD'], root, GIT_TIMEOUT_MS),\n this.#run(git, ['status', '--porcelain=v1', '-z', '--untracked-files=all'], root, GIT_TIMEOUT_MS),\n this.#run(git, ['diff', '--cached', '--no-ext-diff', '--no-color', '--unified=3', '--', ':(exclude)WARP.md', ':(exclude)**/WARP.md'], root, GIT_TIMEOUT_MS, MAX_OUTPUT_BYTES),\n this.#run(git, ['diff', '--no-ext-diff', '--no-color', '--unified=3', '--', ':(exclude)WARP.md', ':(exclude)**/WARP.md'], root, GIT_TIMEOUT_MS, MAX_OUTPUT_BYTES),\n ])\n if (branchResult.exitCode !== 0) throw new RepositoryActionError('detached-head', 'A detached HEAD cannot be committed from this panel.')\n if (headResult.exitCode !== 0 || statusResult.exitCode !== 0 || statusResult.lossy) throw new RepositoryActionError('repository-unavailable', 'Repository state is unavailable.')\n const files = parseRepositoryActionStatus(statusResult.stdout)\n const patch = `${stagedPatch.stdout}${stagedPatch.stdout.length > 0 && unstagedPatch.stdout.length > 0 ? '\\n' : ''}${unstagedPatch.stdout}`.slice(0, MAX_PATCH_CHARS)\n const branch = branchResult.stdout.trim()\n const head = headResult.stdout.trim()\n const fingerprint = createHash('sha256').update([head, branch, statusResult.stdout, stagedPatch.stdout, unstagedPatch.stdout].join('\\0')).digest('hex')\n const upstreamResult = await this.#run(git, ['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{upstream}'], root, GIT_TIMEOUT_MS)\n const upstream = upstreamResult.exitCode === 0 && !upstreamResult.lossy ? upstreamResult.stdout.trim() : undefined\n const logResult = await this.#run(git, [\n 'log', '--format=%H%x09%s', `-n`, String(MAX_UNPUSHED_COMMITS + 1), upstream === undefined ? 'HEAD' : '@{upstream}..HEAD', '--',\n ], root, GIT_TIMEOUT_MS)\n const commitLines = logResult.exitCode === 0 && !logResult.lossy\n ? logResult.stdout.split(/\\r?\\n/u).filter(line => line.includes('\\t'))\n : []\n const unpushedCommits = commitLines.slice(0, MAX_UNPUSHED_COMMITS).flatMap(line => {\n const tab = line.indexOf('\\t')\n const hash = line.slice(0, tab)\n return /^[0-9a-f]{40}$/iu.test(hash) ? [{ hash, subject: line.slice(tab + 1).slice(0, 140) }] : []\n })\n return {\n root,\n branch,\n head,\n fingerprint,\n files,\n patch,\n truncated: stagedPatch.lossy || unstagedPatch.lossy || stagedPatch.stdout.length + unstagedPatch.stdout.length > MAX_PATCH_CHARS,\n hasStaged: files.some(file => file.staged),\n hasUnstaged: files.some(file => file.unstaged),\n hasUntracked: files.some(file => file.untracked),\n ...(upstream === undefined ? {} : { upstream }),\n unpushedCommits,\n unpushedTruncated: commitLines.length > MAX_UNPUSHED_COMMITS,\n }\n }\n\n async #rejectStagedWarp(git: string, cwd: string): Promise<void> {\n const staged = await this.#run(git, ['diff', '--cached', '--name-only', '--'], cwd, GIT_TIMEOUT_MS)\n if (staged.exitCode !== 0 || staged.lossy) throw new RepositoryActionError('repository-unavailable', 'Staged files could not be verified.')\n if (staged.stdout.split(/\\r?\\n/u).some(path => path.length > 0 && isProtectedWarpPath(path))) {\n throw new RepositoryActionError('protected-warp-file', 'WARP.md files cannot be committed. Unstage them before continuing.')\n }\n }\n\n async #push(git: string, cwd: string, branch: string): Promise<void> {\n const upstream = await this.#run(git, ['rev-parse', '--abbrev-ref', '--symbolic-full-name', '@{upstream}'], cwd, GIT_TIMEOUT_MS)\n const args = upstream.exitCode === 0 ? ['push'] : ['push', '--set-upstream', 'origin', branch]\n await this.#mustRun(git, args, cwd, REMOTE_TIMEOUT_MS, 'push-failed', 'Git push failed.')\n }\n\n #git(): Promise<string> {\n this.#gitExecutable ??= this.#runtime.resolveExecutable('git')\n return this.#gitExecutable\n }\n\n #gh(): Promise<string> {\n this.#ghExecutable ??= this.#runtime.resolveExecutable('gh').catch(() => { throw new RepositoryActionError('gh-unavailable', 'GitHub CLI is unavailable.') })\n return this.#ghExecutable\n }\n\n async #mustRun(executable: string, args: readonly string[], cwd: string, timeoutMs: number, code: string, message: string): Promise<CommandResult> {\n const result = await this.#run(executable, args, cwd, timeoutMs)\n if (result.exitCode !== 0 || result.lossy) throw new RepositoryActionError(code, message)\n return result\n }\n\n #run(executable: string, args: readonly string[], cwd: string, timeoutMs: number, maxBytes = MAX_OUTPUT_BYTES): Promise<CommandResult> {\n return collect(this.#runtime.spawn({\n argv: [executable, ...args],\n cwd,\n stdio: { stdin: 'ignore', stdout: { maxBytes }, stderr: { maxBytes: MAX_OUTPUT_BYTES } },\n graceMs: 1_000,\n signal: AbortSignal.timeout(timeoutMs),\n env: {},\n }))\n }\n}\n","import type { IncomingMessage } from 'node:http'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-host-webserver'\nimport { CLAUDE_REPOSITORY_SETUP_PATH } from './constants.ts'\nimport { json, trustedRequest } from './http.ts'\nimport {\n RepositorySetupError,\n type RepositorySetupResult,\n type RepositorySetupService,\n type RepositorySetupStage,\n} from './repository-setup.ts'\n\nconst MAX_BODY_BYTES = 16 * 1024\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\nasync function readJson(req: IncomingMessage): Promise<Record<string, unknown>> {\n const chunks: Buffer[] = []\n let size = 0\n for await (const chunk of req) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n size += buffer.length\n if (size > MAX_BODY_BYTES) throw new RepositorySetupError('body-too-large', 'The request body is too large.')\n chunks.push(buffer)\n }\n const value = record(JSON.parse(Buffer.concat(chunks).toString('utf8')))\n if (value === undefined) throw new RepositorySetupError('invalid-request', 'The request body is invalid.')\n return value\n}\n\nfunction string(input: Record<string, unknown>, key: string): string {\n const value = input[key]\n if (typeof value !== 'string') throw new RepositorySetupError('invalid-request', `The ${key} field is required.`)\n return value\n}\n\nfunction optionalString(input: Record<string, unknown>, key: string): string | undefined {\n const value = input[key]\n if (value === undefined) return undefined\n if (typeof value !== 'string') throw new RepositorySetupError('invalid-request', `The ${key} field must be a string.`)\n return value\n}\n\nfunction ndjsonHeaders(res: import('node:http').ServerResponse): void {\n res.writeHead(200, {\n 'content-type': 'application/x-ndjson; charset=utf-8',\n 'cache-control': 'no-store',\n 'x-content-type-options': 'nosniff',\n })\n res.flushHeaders?.()\n}\n\nfunction ndjson(res: import('node:http').ServerResponse, value: unknown): void {\n res.write(`${JSON.stringify(value)}\\n`)\n}\n\nasync function streamSetup(\n res: import('node:http').ServerResponse,\n service: RepositorySetupService,\n input: Record<string, unknown>,\n): Promise<void> {\n ndjsonHeaders(res)\n let ended = false\n try {\n const result: RepositorySetupResult = await service.setup(\n string(input, 'cwd'),\n string(input, 'branch'),\n input.worktree as boolean,\n optionalString(input, 'branchName'),\n (stage: RepositorySetupStage) => { if (!ended) ndjson(res, { type: 'progress', stage }) },\n )\n ndjson(res, { type: 'complete', result })\n } catch (error) {\n const setupError = error instanceof RepositorySetupError ? error : undefined\n ndjson(res, {\n type: 'error',\n code: setupError?.code ?? 'repository-setup-unavailable',\n message: setupError?.message ?? 'Repository setup is unavailable.',\n })\n } finally {\n ended = true\n res.end()\n }\n}\n\n/** Register trusted browser routes for safe pre-session Git setup. */\nexport function registerRepositorySetupRoute(ctx: Context, service: RepositorySetupService): void {\n ctx.effect(() => ctx.webServer.register({\n kind: 'prefix',\n path: CLAUDE_REPOSITORY_SETUP_PATH,\n handler: async (req, res) => {\n if (!trustedRequest(req)) return json(res, 403, { error: 'forbidden' })\n const pathname = new URL(req.url ?? '/', 'http://localhost').pathname\n try {\n if (pathname === `${CLAUDE_REPOSITORY_SETUP_PATH}/branches`) {\n if (req.method !== 'GET') return json(res, 405, { error: 'method not allowed' })\n const cwd = new URL(req.url ?? '/', 'http://localhost').searchParams.get('cwd')\n if (cwd === null) throw new RepositorySetupError('invalid-request', 'The cwd query parameter is required.')\n return json(res, 200, await service.listBranches(cwd))\n }\n if (pathname === CLAUDE_REPOSITORY_SETUP_PATH) {\n if (req.method !== 'POST') return json(res, 405, { error: 'method not allowed' })\n const input = await readJson(req)\n if (typeof input.worktree !== 'boolean') throw new RepositorySetupError('invalid-request', 'The worktree field is required.')\n await streamSetup(res, service, input)\n return\n }\n if (pathname === `${CLAUDE_REPOSITORY_SETUP_PATH}/bind`) {\n if (req.method !== 'POST') return json(res, 405, { error: 'method not allowed' })\n const input = await readJson(req)\n await service.bindLease(string(input, 'leaseId'), string(input, 'sessionId'))\n return json(res, 200, { ok: true })\n }\n return json(res, 404, { error: 'not found' })\n } catch (error) {\n if (error instanceof RepositorySetupError) return json(res, 409, { error: error.code, message: error.message })\n if (error instanceof SyntaxError) return json(res, 400, { error: 'invalid json' })\n return json(res, 500, { error: 'repository setup unavailable' })\n }\n },\n }), 'dsh-claude: repository setup route')\n}\n","import type { IncomingMessage } from 'node:http'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-host-webserver'\nimport { CLAUDE_REPOSITORY_ACTION_PATH } from './constants.ts'\nimport { json, trustedRequest } from './http.ts'\nimport {\n RepositoryActionError,\n type RepositoryActionKind,\n type RepositoryActionRequest,\n type RepositoryMergeMethod,\n type RepositoryActionService,\n} from './repository-actions.ts'\n\nconst MAX_BODY_BYTES = 16 * 1024\nconst MAX_SESSION_ID_CHARS = 1_024\nconst ACTIONS = new Set<RepositoryActionKind>(['commit', 'commit-push', 'push', 'create-pr', 'merge-pr', 'update-branch'])\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\n}\n\nasync function readJson(req: IncomingMessage): Promise<Record<string, unknown>> {\n const chunks: Buffer[] = []\n let size = 0\n for await (const chunk of req) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n size += buffer.length\n if (size > MAX_BODY_BYTES) throw new RepositoryActionError('body-too-large', 'The request body is too large.')\n chunks.push(buffer)\n }\n const value = record(JSON.parse(Buffer.concat(chunks).toString('utf8')))\n if (value === undefined) throw new RepositoryActionError('invalid-request', 'The request body is invalid.')\n return value\n}\n\nfunction sessionId(url: URL): string {\n const value = url.searchParams.get('sessionId')\n if (value === null || value.length === 0 || value.length > MAX_SESSION_ID_CHARS) {\n throw new RepositoryActionError('invalid-session', 'The session is invalid.')\n }\n return value\n}\n\nfunction string(input: Record<string, unknown>, key: string): string {\n const value = input[key]\n if (typeof value !== 'string') throw new RepositoryActionError('invalid-request', `The ${key} field is required.`)\n return value\n}\n\nfunction optionalString(input: Record<string, unknown>, key: string): string | undefined {\n const value = input[key]\n if (value === undefined) return undefined\n if (typeof value !== 'string') throw new RepositoryActionError('invalid-request', `The ${key} field must be a string.`)\n return value\n}\n\nfunction actionRequest(input: Record<string, unknown>): RepositoryActionRequest {\n const action = input.action\n if (typeof action !== 'string' || !ACTIONS.has(action as RepositoryActionKind)\n || typeof input.includeUnstaged !== 'boolean') {\n throw new RepositoryActionError('invalid-request', 'The repository action is invalid.')\n }\n return {\n action: action as RepositoryActionKind,\n fingerprint: string(input, 'fingerprint'),\n message: action === 'push' || action === 'merge-pr' || action === 'update-branch' ? optionalString(input, 'message') ?? '' : string(input, 'message'),\n includeUnstaged: input.includeUnstaged,\n ...(optionalString(input, 'prTitle') === undefined ? {} : { prTitle: optionalString(input, 'prTitle')! }),\n ...(optionalString(input, 'prBody') === undefined ? {} : { prBody: optionalString(input, 'prBody')! }),\n ...(optionalString(input, 'baseBranch') === undefined ? {} : { baseBranch: optionalString(input, 'baseBranch')! }),\n ...(input.draft === undefined ? {} : typeof input.draft === 'boolean' ? { draft: input.draft } : (() => { throw new RepositoryActionError('invalid-request', 'The draft field must be a boolean.') })()),\n ...(input.mergeMethod === undefined\n ? {}\n : input.mergeMethod === 'merge' || input.mergeMethod === 'squash' || input.mergeMethod === 'rebase'\n ? { mergeMethod: input.mergeMethod as RepositoryMergeMethod }\n : (() => { throw new RepositoryActionError('invalid-request', 'The mergeMethod field is invalid.') })()),\n }\n}\n\nexport function registerRepositoryActionRoute(\n ctx: Context,\n service: RepositoryActionService,\n cwdForSession: (sessionId: string) => string | undefined,\n): void {\n ctx.effect(() => ctx.webServer.register({\n kind: 'prefix',\n path: CLAUDE_REPOSITORY_ACTION_PATH,\n handler: async (req, res) => {\n if (!trustedRequest(req)) return json(res, 403, { error: 'forbidden' })\n const url = new URL(req.url ?? '/', 'http://localhost')\n try {\n const id = sessionId(url)\n const cwd = cwdForSession(id)\n if (cwd === undefined) throw new RepositoryActionError('session-unavailable', 'The Claude session is unavailable.')\n if (url.pathname === `${CLAUDE_REPOSITORY_ACTION_PATH}/preview`) {\n if (req.method !== 'GET') return json(res, 405, { error: 'method not allowed' })\n return json(res, 200, await service.preview(cwd))\n }\n if (url.pathname === `${CLAUDE_REPOSITORY_ACTION_PATH}/message`) {\n if (req.method !== 'POST') return json(res, 405, { error: 'method not allowed' })\n const input = await readJson(req)\n return json(res, 200, { message: await service.generateMessage(cwd, string(input, 'fingerprint')) })\n }\n if (url.pathname === CLAUDE_REPOSITORY_ACTION_PATH) {\n if (req.method !== 'POST') return json(res, 405, { error: 'method not allowed' })\n return json(res, 200, await service.execute(cwd, actionRequest(await readJson(req))))\n }\n return json(res, 404, { error: 'not found' })\n } catch (error) {\n if (error instanceof RepositoryActionError) {\n return json(res, 409, {\n error: error.code,\n message: error.message,\n ...(error.commit === undefined ? {} : { commit: error.commit }),\n })\n }\n if (error instanceof SyntaxError) return json(res, 400, { error: 'invalid-json' })\n return json(res, 500, { error: 'repository-action-unavailable', message: 'Repository action is unavailable.' })\n }\n },\n }), 'dsh-claude: repository action route')\n}\n","import type { SubprocessHandle, SubprocessRuntime } from '@deepseek-ai/dsh-subprocess'\nimport { parseGitHubRemote } from './repository-status.ts'\n\nconst MAX_OUTPUT_BYTES = 512 * 1024\nconst GIT_TIMEOUT_MS = 10_000\nconst GH_TIMEOUT_MS = 60_000\nconst MAX_COMMENTS = 100\nconst MAX_COMMENT_CHARS = 4_096\nconst MAX_FAILING_CHECKS = 3\nconst MAX_LOG_CHARS = 8 * 1024\n\ntype FeedbackRuntime = Pick<SubprocessRuntime, 'resolveExecutable' | 'spawn'>\n\ninterface CommandResult {\n readonly exitCode: number | null\n readonly stdout: string\n readonly lossy: boolean\n}\n\nexport interface PullRequestReviewComment {\n readonly id: number\n readonly path: string\n readonly line?: number\n readonly side: 'new' | 'old'\n readonly author: string\n readonly body: string\n readonly url: string\n}\n\nexport interface FailingCheck {\n readonly name: string\n readonly link?: string\n readonly description?: string\n readonly log?: string\n}\n\nexport class PullRequestFeedbackError extends Error {\n readonly code: string\n\n constructor(code: string, message: string) {\n super(message)\n this.name = 'PullRequestFeedbackError'\n this.code = code\n }\n}\n\nasync function collect(handle: SubprocessHandle): Promise<CommandResult> {\n const outcome = await handle.done\n const stdout = handle.collected.stdout?.readFrom(0)\n return { exitCode: outcome.exitCode, stdout: stdout?.text ?? '', lossy: stdout?.lossy === true }\n}\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\n}\n\nexport function parseReviewComments(value: unknown): readonly PullRequestReviewComment[] {\n if (!Array.isArray(value)) return []\n const comments: PullRequestReviewComment[] = []\n for (const item of value) {\n const input = record(item)\n if (input === undefined || !Number.isSafeInteger(input.id)) continue\n const body = typeof input.body === 'string' ? input.body.trim() : ''\n const path = typeof input.path === 'string' ? input.path : ''\n const url = typeof input.html_url === 'string' ? input.html_url : ''\n if (body.length === 0 || path.length === 0) continue\n const line = Number.isSafeInteger(input.line)\n ? Number(input.line)\n : Number.isSafeInteger(input.original_line) ? Number(input.original_line) : undefined\n comments.push({\n id: Number(input.id),\n path,\n ...(line === undefined ? {} : { line }),\n side: input.side === 'LEFT' ? 'old' : 'new',\n author: typeof record(input.user)?.login === 'string' ? String(record(input.user)?.login) : 'unknown',\n body: body.slice(0, MAX_COMMENT_CHARS),\n url,\n })\n if (comments.length >= MAX_COMMENTS) break\n }\n return comments\n}\n\n/** Extract the Actions job id from a check run link, when it is one. */\nexport function actionsJobId(link: string | undefined): string | undefined {\n if (link === undefined) return undefined\n return /\\/actions\\/runs\\/\\d+\\/jobs?\\/(\\d+)/u.exec(link)?.[1]\n}\n\nexport function parseFailingChecks(value: unknown): readonly FailingCheck[] {\n if (!Array.isArray(value)) return []\n const failing: FailingCheck[] = []\n for (const item of value) {\n const input = record(item)\n if (input === undefined || input.bucket !== 'fail' || typeof input.name !== 'string') continue\n failing.push({\n name: input.name,\n ...(typeof input.link === 'string' && input.link.length > 0 ? { link: input.link } : {}),\n ...(typeof input.description === 'string' && input.description.length > 0 ? { description: input.description } : {}),\n })\n }\n return failing\n}\n\n/** Keep the informative end of a failed-job log within the size budget. */\nexport function boundedLogTail(value: string): string {\n const text = value.replaceAll('\\0', '').trimEnd()\n return text.length <= MAX_LOG_CHARS ? text : text.slice(text.length - MAX_LOG_CHARS)\n}\n\nexport class PullRequestFeedbackService {\n readonly #runtime: FeedbackRuntime\n #gitExecutable?: Promise<string>\n #ghExecutable?: Promise<string>\n\n constructor(runtime: FeedbackRuntime) {\n this.#runtime = runtime\n }\n\n async comments(cwd: string, pullNumber: number): Promise<readonly PullRequestReviewComment[]> {\n const repository = await this.#repository(cwd)\n const gh = await this.#gh()\n const result = await this.#run(gh, [\n 'api', `repos/${repository}/pulls/${pullNumber}/comments`, '--paginate',\n ], cwd, GH_TIMEOUT_MS)\n if (result.exitCode !== 0) throw new PullRequestFeedbackError('comments-unavailable', 'Pull request comments could not be loaded.')\n try {\n // --paginate concatenates one JSON array per page.\n const pages = result.stdout.replaceAll('][', ',')\n return parseReviewComments(JSON.parse(pages))\n } catch {\n throw new PullRequestFeedbackError('comments-unavailable', 'Pull request comments could not be parsed.')\n }\n }\n\n async failingChecks(cwd: string, pullNumber: number): Promise<readonly FailingCheck[]> {\n const gh = await this.#gh()\n const result = await this.#run(gh, [\n 'pr', 'checks', String(pullNumber), '--json', 'name,state,link,description,bucket',\n ], cwd, GH_TIMEOUT_MS)\n // gh pr checks exits non-zero when checks are failing; that IS our case.\n let checks: readonly FailingCheck[]\n try {\n checks = parseFailingChecks(JSON.parse(result.stdout))\n } catch {\n throw new PullRequestFeedbackError('checks-unavailable', 'Pull request checks could not be loaded.')\n }\n const detailed: FailingCheck[] = []\n for (const check of checks) {\n const jobId = detailed.length < MAX_FAILING_CHECKS ? actionsJobId(check.link) : undefined\n if (jobId === undefined) {\n detailed.push(check)\n continue\n }\n const log = await this.#run(gh, ['run', 'view', '--job', jobId, '--log-failed'], cwd, GH_TIMEOUT_MS)\n detailed.push(log.exitCode === 0 && log.stdout.trim().length > 0 ? { ...check, log: boundedLogTail(log.stdout) } : check)\n }\n return detailed\n }\n\n async #repository(cwd: string): Promise<string> {\n const git = await this.#git()\n const remote = await this.#run(git, ['remote', 'get-url', 'origin'], cwd, GIT_TIMEOUT_MS)\n const repository = remote.exitCode === 0 ? parseGitHubRemote(remote.stdout) : undefined\n if (repository === undefined) throw new PullRequestFeedbackError('no-github-remote', 'The repository has no GitHub origin remote.')\n return repository\n }\n\n #git(): Promise<string> {\n this.#gitExecutable ??= this.#runtime.resolveExecutable('git')\n return this.#gitExecutable\n }\n\n #gh(): Promise<string> {\n this.#ghExecutable ??= this.#runtime.resolveExecutable('gh').catch(() => {\n throw new PullRequestFeedbackError('gh-unavailable', 'GitHub CLI is unavailable.')\n })\n return this.#ghExecutable\n }\n\n #run(executable: string, args: readonly string[], cwd: string, timeoutMs: number): Promise<CommandResult> {\n return collect(this.#runtime.spawn({\n argv: [executable, ...args],\n cwd,\n stdio: { stdin: 'ignore', stdout: { maxBytes: MAX_OUTPUT_BYTES }, stderr: { maxBytes: 64 * 1024 } },\n graceMs: 1_000,\n signal: AbortSignal.timeout(timeoutMs),\n env: {},\n }))\n }\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-host-webserver'\nimport { CLAUDE_REPOSITORY_FEEDBACK_PATH } from './constants.ts'\nimport { json, trustedRequest } from './http.ts'\nimport { PullRequestFeedbackError, type PullRequestFeedbackService } from './pr-feedback.ts'\n\nconst MAX_SESSION_ID_CHARS = 1_024\n\nfunction sessionId(url: URL): string {\n const value = url.searchParams.get('sessionId')\n if (value === null || value.length === 0 || value.length > MAX_SESSION_ID_CHARS) {\n throw new PullRequestFeedbackError('invalid-session', 'The session is invalid.')\n }\n return value\n}\n\nfunction pullNumber(url: URL): number {\n const value = Number(url.searchParams.get('number'))\n if (!Number.isSafeInteger(value) || value <= 0 || value > 1_000_000_000) {\n throw new PullRequestFeedbackError('invalid-request', 'The pull request number is invalid.')\n }\n return value\n}\n\nexport function registerPullRequestFeedbackRoute(\n ctx: Context,\n service: PullRequestFeedbackService,\n cwdForSession: (sessionId: string) => string | undefined,\n): void {\n ctx.effect(() => ctx.webServer.register({\n kind: 'prefix',\n path: CLAUDE_REPOSITORY_FEEDBACK_PATH,\n handler: async (req, res) => {\n if (!trustedRequest(req)) return json(res, 403, { error: 'forbidden' })\n if (req.method !== 'GET') return json(res, 405, { error: 'method not allowed' })\n const url = new URL(req.url ?? '/', 'http://localhost')\n try {\n const cwd = cwdForSession(sessionId(url))\n if (cwd === undefined) throw new PullRequestFeedbackError('session-unavailable', 'The Claude session is unavailable.')\n if (url.pathname === `${CLAUDE_REPOSITORY_FEEDBACK_PATH}/comments`) {\n return json(res, 200, { comments: await service.comments(cwd, pullNumber(url)) })\n }\n if (url.pathname === `${CLAUDE_REPOSITORY_FEEDBACK_PATH}/checks`) {\n return json(res, 200, { checks: await service.failingChecks(cwd, pullNumber(url)) })\n }\n return json(res, 404, { error: 'not found' })\n } catch (error) {\n if (error instanceof PullRequestFeedbackError) {\n return json(res, 409, { error: error.code, message: error.message })\n }\n return json(res, 500, { error: 'pr-feedback-unavailable', message: 'Pull request feedback is unavailable.' })\n }\n },\n }), 'dsh-claude: pull request feedback route')\n}\n","import type { IncomingMessage } from 'node:http'\nimport type { Context } from '@deepseek-ai/cordis'\nimport type {} from '@deepseek-ai/dsh-host-webserver'\nimport { CLAUDE_REVIEW_COMMENT_PATH } from './constants.ts'\nimport { json, trustedRequest } from './http.ts'\nimport { ReviewCommentError, type ReviewCommentStore } from './review-comments.ts'\n\nconst MAX_BODY_BYTES = 16 * 1024\nconst MAX_SESSION_ID_CHARS = 1_024\n\nfunction record(value: unknown): Record<string, unknown> | undefined {\n return value !== null && typeof value === 'object' && !Array.isArray(value) ? value as Record<string, unknown> : undefined\n}\n\nasync function readJson(req: IncomingMessage): Promise<Record<string, unknown>> {\n const chunks: Buffer[] = []\n let size = 0\n for await (const chunk of req) {\n const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk)\n size += buffer.length\n if (size > MAX_BODY_BYTES) throw new ReviewCommentError('body-too-large', 'The request body is too large.')\n chunks.push(buffer)\n }\n const value = record(JSON.parse(Buffer.concat(chunks).toString('utf8')))\n if (value === undefined) throw new ReviewCommentError('invalid-request', 'The request body is invalid.')\n return value\n}\n\nfunction sessionIdFromUrl(url: URL): string {\n const value = url.searchParams.get('sessionId')\n if (value === null || value.length === 0 || value.length > MAX_SESSION_ID_CHARS) {\n throw new ReviewCommentError('invalid-session', 'The session is invalid.')\n }\n return value\n}\n\nexport function registerReviewCommentRoute(\n ctx: Context,\n store: ReviewCommentStore,\n ownsSession: (sessionId: string) => boolean,\n): void {\n ctx.effect(() => ctx.webServer.register({\n kind: 'prefix',\n path: CLAUDE_REVIEW_COMMENT_PATH,\n handler: async (req, res) => {\n if (!trustedRequest(req)) return json(res, 403, { error: 'forbidden' })\n const url = new URL(req.url ?? '/', 'http://localhost')\n try {\n const sessionId = sessionIdFromUrl(url)\n if (!ownsSession(sessionId)) throw new ReviewCommentError('session-unavailable', 'The Claude session is unavailable.')\n if (url.pathname === CLAUDE_REVIEW_COMMENT_PATH && req.method === 'POST') {\n const input = await readJson(req)\n const comment = store.add(sessionId, {\n path: input.path,\n line: input.line,\n side: input.side,\n text: input.text,\n })\n return json(res, 200, { comment })\n }\n if (url.pathname === `${CLAUDE_REVIEW_COMMENT_PATH}/clear` && req.method === 'POST') {\n return json(res, 200, { removed: store.drain(sessionId).length })\n }\n if (url.pathname === `${CLAUDE_REVIEW_COMMENT_PATH}/remove` && req.method === 'POST') {\n const input = await readJson(req)\n if (typeof input.id !== 'string' || input.id.length === 0 || input.id.length > 128) {\n throw new ReviewCommentError('invalid-request', 'The comment id is invalid.')\n }\n return json(res, 200, { removed: store.remove(sessionId, input.id) })\n }\n return json(res, 404, { error: 'not found' })\n } catch (error) {\n if (error instanceof ReviewCommentError) return json(res, 409, { error: error.code, message: error.message })\n if (error instanceof SyntaxError) return json(res, 400, { error: 'invalid-json' })\n return json(res, 500, { error: 'review-comment-unavailable', message: 'Review comments are unavailable.' })\n }\n },\n }), 'dsh-claude: review comment 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 { dshHomePath } from '@deepseek-ai/dsh-home-paths'\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\nconst DEFAULT_WORKTREE_BRANCH_PREFIX = 'claude'\nconst MAX_BRANCH_PREFIX_CHARS = 128\nconst MAX_PROCESSES_LIMIT = 16\nconst MAX_IDLE_TIMEOUT_MINUTES = 24 * 60\nconst DEFAULT_LIMITS: SupervisorLimits = { maxProcesses: 4, idleTimeoutMs: 30 * 60_000 }\n\ntype JsonObject = Record<string, unknown>\nexport type GlobalSettingEffect = 'new-session' | 'next-worktree' | 'restart'\n\nexport interface GlobalSettingOption {\n value: string\n label: string\n source: 'built-in' | 'user' | 'configured'\n}\n\nexport type GlobalSettingView = {\n key: string\n kind: 'select'\n value: string\n options: readonly GlobalSettingOption[]\n effect: GlobalSettingEffect\n} | {\n key: string\n kind: 'text'\n value: string\n maxLength: number\n effect: GlobalSettingEffect\n}\n\nexport interface GlobalSettingsView {\n settings: readonly GlobalSettingView[]\n}\n\ninterface GlobalSettingsPaths {\n settingsFile: string\n outputStylesDir: string\n pluginSettingsFile: string\n}\n\n/** Effective supervisor limits: the plugin config values unless overridden in Settings. */\nexport interface SupervisorLimits {\n maxProcesses: number\n idleTimeoutMs: number\n}\n\nexport interface GlobalSettingsDependencies {\n paths?: Partial<GlobalSettingsPaths>\n /** Limits from the plugin config, shown when Settings holds no override. */\n defaultLimits?: SupervisorLimits\n /** Invoked after a successful update so live runtime state can follow. */\n onUpdated?: () => void | Promise<void>\n}\n\ninterface SelectSettingDescriptor {\n key: string\n kind: 'select'\n document: 'claude' | 'plugin'\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\ninterface TextSettingDescriptor {\n key: string\n kind: 'text'\n document: 'claude' | 'plugin'\n effect: GlobalSettingEffect\n maxLength: number\n read(document: JsonObject, defaults?: SupervisorLimits): string\n apply(document: JsonObject, value: unknown): void\n}\n\ntype SettingDescriptor = SelectSettingDescriptor | TextSettingDescriptor\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 pluginSettingsFile: deps.paths?.pluginSettingsFile ?? dshHomePath('plugins', 'dsh-claude', 'settings.json'),\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 document: 'claude',\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\nexport function isValidWorktreeBranchPrefix(value: string): boolean {\n return value.length > 0\n && value.length <= MAX_BRANCH_PREFIX_CHARS\n && value.trim() === value\n && !value.startsWith('/')\n && !value.endsWith('/')\n && !value.includes('//')\n && !value.includes('..')\n && !value.includes('@{')\n && !/[\\0-\\x20\\x7f~^:?*[\\\\]/u.test(value)\n && value.split('/').every(segment => segment.length > 0 && !segment.startsWith('.') && !segment.endsWith('.lock'))\n}\n\nconst WORKTREE_BRANCH_PREFIX: TextSettingDescriptor = {\n key: 'worktreeBranchPrefix',\n kind: 'text',\n document: 'plugin',\n effect: 'next-worktree',\n maxLength: MAX_BRANCH_PREFIX_CHARS,\n read(document) {\n const value = document.worktreeBranchPrefix\n return typeof value === 'string' && isValidWorktreeBranchPrefix(value) ? value : DEFAULT_WORKTREE_BRANCH_PREFIX\n },\n apply(document, value) {\n if (typeof value !== 'string' || !isValidWorktreeBranchPrefix(value)) {\n throw new Error('Invalid value for global setting worktreeBranchPrefix')\n }\n if (value === DEFAULT_WORKTREE_BRANCH_PREFIX) delete document.worktreeBranchPrefix\n else document.worktreeBranchPrefix = value\n },\n}\n\nfunction isBoundedInteger(value: unknown, min: number, max: number): value is number {\n return typeof value === 'number' && Number.isInteger(value) && value >= min && value <= max\n}\n\nfunction integerSetting(\n key: 'maxProcesses' | 'idleTimeoutMinutes',\n min: number,\n max: number,\n defaultFor: (limits: SupervisorLimits) => number,\n): TextSettingDescriptor {\n return {\n key,\n kind: 'text',\n document: 'plugin',\n effect: 'new-session',\n maxLength: String(max).length,\n read(document, defaults = DEFAULT_LIMITS) {\n const value = document[key]\n return String(isBoundedInteger(value, min, max) ? value : defaultFor(defaults))\n },\n apply(document, value) {\n const parsed = typeof value === 'string' && /^\\d{1,6}$/u.test(value.trim()) ? Number(value.trim()) : value\n if (!isBoundedInteger(parsed, min, max)) throw new Error(`Invalid value for global setting ${key}`)\n document[key] = parsed\n },\n }\n}\n\nconst MAX_PROCESSES = integerSetting('maxProcesses', 1, MAX_PROCESSES_LIMIT, limits => limits.maxProcesses)\nconst IDLE_TIMEOUT_MINUTES = integerSetting('idleTimeoutMinutes', 1, MAX_IDLE_TIMEOUT_MINUTES, limits => Math.max(1, Math.round(limits.idleTimeoutMs / 60_000)))\n\nconst DESCRIPTORS: readonly SettingDescriptor[] = [OUTPUT_STYLE, WORKTREE_BRANCH_PREFIX, MAX_PROCESSES, IDLE_TIMEOUT_MINUTES]\nconst DESCRIPTOR_BY_KEY = new Map(DESCRIPTORS.map(descriptor => [descriptor.key, descriptor]))\nlet pendingWrite: Promise<unknown> = Promise.resolve()\n\nfunction documentFor(descriptor: SettingDescriptor, documents: { claude: JsonObject; plugin: JsonObject }): JsonObject {\n return documents[descriptor.document]\n}\n\nasync function views(documents: { claude: JsonObject; plugin: JsonObject }, paths: GlobalSettingsPaths, defaults: SupervisorLimits): Promise<GlobalSettingsView> {\n return {\n settings: await Promise.all(DESCRIPTORS.map(async descriptor => {\n const document = documentFor(descriptor, documents)\n if (descriptor.kind === 'text') {\n return {\n key: descriptor.key,\n kind: descriptor.kind,\n value: descriptor.read(document, defaults),\n maxLength: descriptor.maxLength,\n effect: descriptor.effect,\n }\n }\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\nasync function readDocuments(paths: GlobalSettingsPaths): Promise<{ claude: JsonObject; plugin: JsonObject }> {\n const [claude, plugin] = await Promise.all([readDocument(paths.settingsFile), readDocument(paths.pluginSettingsFile)])\n return { claude, plugin }\n}\n\nexport async function readGlobalSettings(deps: GlobalSettingsDependencies = {}): Promise<GlobalSettingsView> {\n const paths = pathsFor(deps)\n return views(await readDocuments(paths), paths, deps.defaultLimits ?? DEFAULT_LIMITS)\n}\n\n/** Supervisor limits the user overrode in Settings; absent keys fall back to the plugin config. */\nexport async function readSupervisorLimitOverrides(deps: GlobalSettingsDependencies = {}): Promise<Partial<SupervisorLimits>> {\n let document: JsonObject\n try {\n document = await readDocument(pathsFor(deps).pluginSettingsFile)\n } catch {\n return {}\n }\n const maxProcesses = document.maxProcesses\n const idleTimeoutMinutes = document.idleTimeoutMinutes\n return {\n ...(isBoundedInteger(maxProcesses, 1, MAX_PROCESSES_LIMIT) ? { maxProcesses } : {}),\n ...(isBoundedInteger(idleTimeoutMinutes, 1, MAX_IDLE_TIMEOUT_MINUTES) ? { idleTimeoutMs: idleTimeoutMinutes * 60_000 } : {}),\n }\n}\n\nexport async function readWorktreeBranchPrefix(deps: GlobalSettingsDependencies = {}): Promise<string> {\n const paths = pathsFor(deps)\n return WORKTREE_BRANCH_PREFIX.read(await readDocument(paths.pluginSettingsFile))\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 documents = await readDocuments(paths)\n const changedDocuments = new Set<'claude' | 'plugin'>()\n for (const [key, value] of Object.entries(changeObject)) {\n const descriptor = DESCRIPTOR_BY_KEY.get(key)!\n const document = documentFor(descriptor, documents)\n if (descriptor.kind === 'select') descriptor.apply(document, value, await descriptor.options(paths))\n else descriptor.apply(document, value)\n changedDocuments.add(descriptor.document)\n }\n if (changedDocuments.has('claude')) await atomicWrite(paths.settingsFile, documents.claude)\n if (changedDocuments.has('plugin')) await atomicWrite(paths.pluginSettingsFile, documents.plugin)\n return views(documents, paths, deps.defaultLimits ?? DEFAULT_LIMITS)\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 if (req.method === 'PATCH') await deps.onUpdated?.()\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 { RepositoryStatusService } from './repository-status.ts'\nimport { RepositorySetupService } from './repository-setup.ts'\nimport { RepositoryActionService } from './repository-actions.ts'\nimport { registerRepositorySetupRoute } from './repository-setup-routes.ts'\nimport { registerRepositoryActionRoute } from './repository-action-routes.ts'\nimport { PullRequestFeedbackService } from './pr-feedback.ts'\nimport { registerPullRequestFeedbackRoute } from './pr-feedback-routes.ts'\nimport { registerReviewCommentRoute } from './review-comment-routes.ts'\nimport { ReviewCommentStore } from './review-comments.ts'\nimport { registerClaudeUpdateRoutes } from './update-routes.ts'\nimport { readSupervisorLimitOverrides, readWorktreeBranchPrefix, 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 defaultLimits = {\n idleTimeoutMs: config.idleTimeoutMs ?? 30 * 60 * 1_000,\n maxProcesses: config.maxProcesses ?? 4,\n }\n const supervisorConfig = {\n executablePath: '',\n defaultModel: config.model ?? 'default',\n ...defaultLimits,\n }\n // Settings overrides win over the plugin config; the supervisor reads the\n // shared config object on every admission and idle schedule, so updates\n // take effect without a restart.\n const applyLimitOverrides = async (): Promise<void> => {\n const overrides = await readSupervisorLimitOverrides()\n supervisorConfig.idleTimeoutMs = overrides.idleTimeoutMs ?? defaultLimits.idleTimeoutMs\n supervisorConfig.maxProcesses = overrides.maxProcesses ?? defaultLimits.maxProcesses\n }\n await applyLimitOverrides()\n const sidecar = new ClaudeSidecarRepository()\n const repositoryStatus = new RepositoryStatusService(ctx.subprocess)\n const repositorySetup = new RepositorySetupService(ctx.subprocess, { branchPrefix: () => readWorktreeBranchPrefix() })\n const reviewComments = new ReviewCommentStore()\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), sessionId => reviewComments.drain(sessionId)),\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 reviewComments.disposeSession(agent.id as string)\n await supervisor.disposeSession(agent.id as string)\n })\n // Deleting a workspace from the sidebar is a durable-registry mutation with\n // no agent lifecycle edge, so worktree cleanup reconciles leases against\n // the workspace registry instead: unreferenced clean worktrees are removed\n // on boot and on a slow interval. workspaceRegistry is not part of this\n // plugin's typed host surface yet; inject through an untyped escape hatch\n // so older Hosts without the service simply never start the sweep.\n const injectWorkspaceRegistry = ctx.inject as unknown as (\n deps: readonly string[],\n callback: (sweepCtx: Context & { workspaceRegistry: { list(): readonly { readonly path: string }[] } }) => void,\n ) => void\n injectWorkspaceRegistry(['workspaceRegistry'], sweepCtx => {\n const sweep = (): void => {\n try {\n const paths = sweepCtx.workspaceRegistry.list().map(workspace => workspace.path)\n void repositorySetup.cleanupOrphans(paths).catch(() => undefined)\n } catch {\n // The registry can be mid-teardown; skip this pass.\n }\n }\n sweepCtx.effect(() => {\n sweep()\n const timer = setInterval(sweep, 60_000)\n timer.unref?.()\n return () => clearInterval(timer)\n }, 'dsh-claude: worktree reconciliation')\n })\n ctx.effect(() => () => reviewComments.dispose(), 'dsh-claude: review comments store')\n ctx.effect(() => () => supervisor.dispose(), 'dsh-claude: process supervisor')\n ctx.effect(() => () => repositoryStatus.dispose(), 'dsh-claude: repository status cache')\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, { defaultLimits, onUpdated: applyLimitOverrides })\n registerRepositorySetupRoute(webCtx, repositorySetup)\n const repositoryActions = new RepositoryActionService(webCtx.subprocess, supervisorConfig.executablePath, cwd => repositoryStatus.invalidate(cwd))\n const cwdForClaudeSession = (sessionId: string): string | undefined => {\n const agent = webCtx.agents.get(sessionId as never)\n if (agent === undefined || webCtx.agentPresets.composedPreset(agent.ctx) !== CLAUDE_CODE_PRESET_ID) return undefined\n return agent.session.header.cwd\n }\n registerRepositoryActionRoute(webCtx, repositoryActions, cwdForClaudeSession)\n registerPullRequestFeedbackRoute(webCtx, new PullRequestFeedbackService(webCtx.subprocess), cwdForClaudeSession)\n const ownsClaudeSession = (sessionId: string): boolean => {\n const agent = webCtx.agents.get(sessionId as never)\n return agent !== undefined && webCtx.agentPresets.composedPreset(agent.ctx) === CLAUDE_CODE_PRESET_ID\n }\n registerReviewCommentRoute(webCtx, reviewComments, ownsClaudeSession)\n registerClaudeProjectionRoute(webCtx, sidecar, ownsClaudeSession, sessionId => commandCatalogs.get(sessionId) ?? [], async sessionId => {\n const agent = webCtx.agents.get(sessionId as never)\n if (agent === undefined || webCtx.agentPresets.composedPreset(agent.ctx) !== CLAUDE_CODE_PRESET_ID) return undefined\n const cwd = agent.session.header.cwd\n return cwd === undefined ? undefined : repositoryStatus.inspect(cwd)\n }, sessionId => reviewComments.list(sessionId))\n })\n}\n"],"mappings":"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"}
|