pi2dsh 0.3.4 → 0.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. package/dist/{all-Rt4K68QA.mjs → all-DSpxKvHa.mjs} +10 -10
  2. package/dist/{all-Rt4K68QA.mjs.map → all-DSpxKvHa.mjs.map} +1 -1
  3. package/dist/{anthropic-messages-Beym0_aC.mjs → anthropic-messages-BL9N1Idv.mjs} +3 -3
  4. package/dist/{anthropic-messages-Beym0_aC.mjs.map → anthropic-messages-BL9N1Idv.mjs.map} +1 -1
  5. package/dist/{azure-openai-responses-cHqZTgLD.mjs → azure-openai-responses-A67VbaZ1.mjs} +3 -3
  6. package/dist/{azure-openai-responses-cHqZTgLD.mjs.map → azure-openai-responses-A67VbaZ1.mjs.map} +1 -1
  7. package/dist/cli.mjs +1 -1
  8. package/dist/compat/pi-ai.d.mts +3 -38
  9. package/dist/compat/pi-ai.d.mts.map +1 -1
  10. package/dist/compat/pi-ai.mjs +3 -3
  11. package/dist/compat/pi-coding-agent.d.mts +71 -32
  12. package/dist/compat/pi-coding-agent.d.mts.map +1 -1
  13. package/dist/compat/pi-coding-agent.mjs +2 -2
  14. package/dist/credentials-oauth.mjs +2 -2
  15. package/dist/{dist-QBBA-dL_.mjs → dist-BYA74yh_.mjs} +2 -2
  16. package/dist/{dist-QBBA-dL_.mjs.map → dist-BYA74yh_.mjs.map} +1 -1
  17. package/dist/dist-DeonWo7m.mjs +1089 -0
  18. package/dist/dist-DeonWo7m.mjs.map +1 -0
  19. package/dist/{google-generative-ai-B7OZs5lu.mjs → google-generative-ai-DT5S8D8y.mjs} +2 -2
  20. package/dist/{google-generative-ai-B7OZs5lu.mjs.map → google-generative-ai-DT5S8D8y.mjs.map} +1 -1
  21. package/dist/{google-shared-CRsAUItF.mjs → google-shared-DYP_9cnK.mjs} +4 -4
  22. package/dist/{google-shared-CRsAUItF.mjs.map → google-shared-DYP_9cnK.mjs.map} +1 -1
  23. package/dist/{google-vertex-DmdaHQtB.mjs → google-vertex-Dpq7O7Be.mjs} +3 -3
  24. package/dist/{google-vertex-DmdaHQtB.mjs.map → google-vertex-Dpq7O7Be.mjs.map} +1 -1
  25. package/dist/host.mjs +1 -1
  26. package/dist/index.d.mts.map +1 -1
  27. package/dist/index.mjs +1 -1
  28. package/dist/{json-parse-CFyFZSLJ.mjs → json-parse-Dz5sKMTv.mjs} +2 -2
  29. package/dist/{json-parse-CFyFZSLJ.mjs.map → json-parse-Dz5sKMTv.mjs.map} +1 -1
  30. package/dist/{mcp-config-D2B3kv-Z.mjs → mcp-config-B3h5jTBb.mjs} +9 -8
  31. package/dist/mcp-config-B3h5jTBb.mjs.map +1 -0
  32. package/dist/{mistral-conversations-HHZCcFv_.mjs → mistral-conversations-BsxbCCWx.mjs} +4 -4
  33. package/dist/{mistral-conversations-HHZCcFv_.mjs.map → mistral-conversations-BsxbCCWx.mjs.map} +1 -1
  34. package/dist/{multipart-parser-CIa5BbwO.mjs → multipart-parser-woKCuALW.mjs} +3 -3
  35. package/dist/{multipart-parser-CIa5BbwO.mjs.map → multipart-parser-woKCuALW.mjs.map} +1 -1
  36. package/dist/{openai-codex-responses-vmovNu-q.mjs → openai-codex-responses-C7vviVT2.mjs} +3 -3
  37. package/dist/{openai-codex-responses-vmovNu-q.mjs.map → openai-codex-responses-C7vviVT2.mjs.map} +1 -1
  38. package/dist/{openai-completions-fXHhRolF.mjs → openai-completions-By8QNX1P.mjs} +3 -3
  39. package/dist/{openai-completions-fXHhRolF.mjs.map → openai-completions-By8QNX1P.mjs.map} +1 -1
  40. package/dist/{openai-responses-DKdCYf3h.mjs → openai-responses-DboJUcFN.mjs} +3 -3
  41. package/dist/{openai-responses-DKdCYf3h.mjs.map → openai-responses-DboJUcFN.mjs.map} +1 -1
  42. package/dist/{openai-responses-shared-D0Jq7yVP.mjs → openai-responses-shared-BDzn7nJY.mjs} +2 -2
  43. package/dist/{openai-responses-shared-D0Jq7yVP.mjs.map → openai-responses-shared-BDzn7nJY.mjs.map} +1 -1
  44. package/dist/{otel-BQSQRBLF.mjs → otel-PimLMoiV.mjs} +3 -3
  45. package/dist/{otel-BQSQRBLF.mjs.map → otel-PimLMoiV.mjs.map} +1 -1
  46. package/dist/{pi-ai-DhYGgq4Y.mjs → pi-ai-B_88Wb0r.mjs} +49 -6
  47. package/dist/{pi-ai-DhYGgq4Y.mjs.map → pi-ai-B_88Wb0r.mjs.map} +1 -1
  48. package/dist/{pi-coding-agent-fPHwKP4d.mjs → pi-coding-agent-COMX0KHL.mjs} +109 -34
  49. package/dist/pi-coding-agent-COMX0KHL.mjs.map +1 -0
  50. package/dist/{pi-messages-CV-Ts8An.mjs → pi-messages-B-7Xo_I0.mjs} +3 -3
  51. package/dist/{pi-messages-CV-Ts8An.mjs.map → pi-messages-B-7Xo_I0.mjs.map} +1 -1
  52. package/dist/pi-types-KazmR2O5.d.mts +62 -0
  53. package/dist/pi-types-KazmR2O5.d.mts.map +1 -0
  54. package/dist/pi-uuid-Db8ShZsK.mjs +47 -0
  55. package/dist/pi-uuid-Db8ShZsK.mjs.map +1 -0
  56. package/dist/{provider-env-C72pF4vP.mjs → provider-env-D-cCRWzv.mjs} +2 -2
  57. package/dist/{provider-env-C72pF4vP.mjs.map → provider-env-D-cCRWzv.mjs.map} +1 -1
  58. package/dist/{runtime-B9R7bDWT.mjs → runtime-B7mEIRf-.mjs} +1183 -52
  59. package/dist/runtime-B7mEIRf-.mjs.map +1 -0
  60. package/dist/runtime.d.mts.map +1 -1
  61. package/dist/runtime.mjs +1 -1
  62. package/dist/{src-C3WBfOks.mjs → src-BEl3QrGL.mjs} +3 -3
  63. package/dist/{src-C3WBfOks.mjs.map → src-BEl3QrGL.mjs.map} +1 -1
  64. package/package.json +2 -2
  65. package/dist/build-BG7p2Lbr.mjs +0 -4416
  66. package/dist/build-BG7p2Lbr.mjs.map +0 -1
  67. package/dist/dist-IQKOgQyt.mjs +0 -10035
  68. package/dist/dist-IQKOgQyt.mjs.map +0 -1
  69. package/dist/mcp-config-D2B3kv-Z.mjs.map +0 -1
  70. package/dist/pi-coding-agent-fPHwKP4d.mjs.map +0 -1
  71. package/dist/pi-types-BLt46jaf.d.mts +0 -2494
  72. package/dist/pi-types-BLt46jaf.d.mts.map +0 -1
  73. package/dist/rolldown-runtime-CTfmNlz1.mjs +0 -44
  74. package/dist/runtime-B9R7bDWT.mjs.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runtime-B7mEIRf-.mjs","names":["dshToPiContent","#host","#handle","#session","#tools","#subscribers","#disposers","#activeToolNames","#project","#turns","#aborted","#sessionName","#llm","#models","#resolved","#refreshing","#refreshOnce"],"sources":["../src/session-bridge.ts","../src/subagent-bridge.ts","../src/model-bridge.ts","../src/compat/vendor/pi-json.ts","../src/compat/vendor/pi-model-config.ts","../src/compat/vendor/pi-models-compose.ts","../src/compat/vendor/pi-shell-config.ts","../src/compat/vendor/pi-resolve-config-value.ts","../src/models-json.ts","../src/provider-adapter.ts","../src/runtime.ts"],"sourcesContent":["// Pi session semantics over a DSH durable session.\n//\n// DSH's append-only event log is authoritative for messages; Pi-only state\n// (custom entries, labels, a session name fallback) persists in a pi2dsh\n// sidecar JSONL next to DSH's home. The sidecar exists because DSH currently\n// has no channel for out-of-repo plugin events: `Session.append()` cannot set\n// the envelope's `ignorable: true`, so an unknown event type appended to the\n// main log would make other builds refuse to reload the whole session. Until\n// DSH grows that registration surface, the sidecar keeps Pi entries durable\n// and replayable without touching main-log compatibility.\n\nimport { appendFileSync, existsSync, mkdirSync, readFileSync } from 'node:fs'\nimport { join } from 'node:path'\nimport { randomUUID } from 'node:crypto'\nimport { getAgentDir } from './compat/vendor/pi-config-shim.js'\n\ntype UnknownRecord = Record<string, unknown>\n\ninterface DshSessionLike {\n id: string\n events: readonly UnknownRecord[] | (() => readonly UnknownRecord[])\n append?(type: string, data: unknown, opts?: unknown): unknown\n header?: UnknownRecord\n}\n\ninterface SidecarRecord {\n kind: 'custom' | 'label' | 'name'\n id: string\n timestamp: string\n customType?: string\n data?: unknown\n targetId?: string\n label?: string\n name?: string\n}\n\nexport interface PiProjectedEntry {\n type: string\n id: string\n parentId: string | null\n timestamp: string\n [key: string]: unknown\n}\n\nfunction sidecarDir(): string {\n return join(getAgentDir(), 'session-entries')\n}\n\nfunction sessionEvents(session: DshSessionLike): readonly UnknownRecord[] {\n const events = session.events\n return typeof events === 'function' ? events.call(session) : events ?? []\n}\n\nfunction dshToPiContent(content: unknown): unknown[] {\n if (!Array.isArray(content)) return [{ type: 'text', text: String(content ?? '') }]\n return content.map(block => {\n if (typeof block !== 'object' || block === null) return { type: 'text', text: String(block) }\n const record = block as UnknownRecord\n if (record.type === 'text') return { type: 'text', text: String(record.text ?? '') }\n if (record.type === 'reasoning') return { type: 'thinking', thinking: String(record.text ?? '') }\n if (record.type === 'tool-call') {\n return { type: 'toolCall', id: record.id, name: record.name, arguments: record.arguments }\n }\n return { type: record.type }\n })\n}\n\nexport class PiSessionBridge {\n private readonly records = new Map<string, SidecarRecord[]>()\n private readonly loaded = new Set<string>()\n\n private sidecarPath(sessionId: string): string {\n const safe = sessionId.replace(/[^a-zA-Z0-9._-]+/gu, '_')\n return join(sidecarDir(), `${safe}.jsonl`)\n }\n\n load(sessionId: string): void {\n if (this.loaded.has(sessionId)) return\n this.loaded.add(sessionId)\n const path = this.sidecarPath(sessionId)\n if (!existsSync(path)) {\n this.records.set(sessionId, this.records.get(sessionId) ?? [])\n return\n }\n const parsed: SidecarRecord[] = []\n for (const line of readFileSync(path, 'utf8').split('\\n')) {\n if (line.trim().length === 0) continue\n try {\n parsed.push(JSON.parse(line) as SidecarRecord)\n } catch {\n // A torn tail line from a crashed process is dropped, like DSH's own\n // never-finished trailing fragments.\n }\n }\n this.records.set(sessionId, parsed)\n }\n\n private persist(sessionId: string, record: SidecarRecord): void {\n this.load(sessionId)\n const list = this.records.get(sessionId) ?? []\n list.push(record)\n this.records.set(sessionId, list)\n mkdirSync(sidecarDir(), { recursive: true })\n appendFileSync(this.sidecarPath(sessionId), `${JSON.stringify(record)}\\n`)\n }\n\n appendCustomEntry(sessionId: string, customType: string, data: unknown): string {\n const id = randomUUID()\n this.persist(sessionId, {\n kind: 'custom', id, timestamp: new Date().toISOString(), customType,\n ...(data === undefined ? {} : { data }),\n })\n return id\n }\n\n appendLabel(sessionId: string, targetId: string, label: string | undefined): void {\n this.persist(sessionId, {\n kind: 'label', id: randomUUID(), timestamp: new Date().toISOString(), targetId,\n ...(label === undefined ? {} : { label }),\n })\n }\n\n setName(sessionId: string, name: string): void {\n const sanitized = name.replace(/[\\r\\n]+/gu, ' ').trim()\n this.persist(sessionId, { kind: 'name', id: randomUUID(), timestamp: new Date().toISOString(), name: sanitized })\n }\n\n getName(sessionId: string): string | undefined {\n this.load(sessionId)\n const list = this.records.get(sessionId) ?? []\n for (let i = list.length - 1; i >= 0; i -= 1) {\n if (list[i]!.kind === 'name') return list[i]!.name\n }\n return undefined\n }\n\n labels(sessionId: string): Map<string, string> {\n this.load(sessionId)\n const labels = new Map<string, string>()\n for (const record of this.records.get(sessionId) ?? []) {\n if (record.kind !== 'label' || record.targetId === undefined) continue\n if (record.label === undefined) labels.delete(record.targetId)\n else labels.set(record.targetId, record.label)\n }\n return labels\n }\n\n /**\n * Project the DSH durable log plus sidecar records into Pi's entry-chain\n * shape. DSH history is linear, so the projection is a single-branch tree:\n * every entry's parent is its predecessor.\n */\n projectEntries(session: DshSessionLike): PiProjectedEntry[] {\n this.load(session.id)\n const merged: Array<{ time: number; entry: Omit<PiProjectedEntry, 'parentId'> }> = []\n for (const event of sessionEvents(session)) {\n const seq = Number(event.seq ?? 0)\n const time = Number(event.time ?? 0)\n const data = (event.data ?? {}) as UnknownRecord\n const type = event.type\n if (type === 'user/message') {\n merged.push({\n time,\n entry: {\n type: 'message', id: `dsh-${seq}`, timestamp: new Date(time).toISOString(),\n message: { role: 'user', content: dshToPiContent(data.content) },\n },\n })\n } else if (type === 'assistant/message') {\n const message = (data.message ?? {}) as UnknownRecord\n merged.push({\n time,\n entry: {\n type: 'message', id: `dsh-${seq}`, timestamp: new Date(time).toISOString(),\n message: { role: 'assistant', content: dshToPiContent(message.content) },\n },\n })\n } else if (type === 'tool/result') {\n const message = (data.message ?? {}) as UnknownRecord\n const blocks = Array.isArray(message.content) ? message.content as UnknownRecord[] : []\n const tool = blocks.find(block => block.type === 'tool-result')\n merged.push({\n time,\n entry: {\n type: 'message', id: `dsh-${seq}`, timestamp: new Date(time).toISOString(),\n message: {\n role: 'toolResult',\n toolCallId: tool?.toolCallId,\n content: dshToPiContent(tool?.content ?? []),\n isError: tool?.isError === true,\n },\n },\n })\n }\n }\n for (const record of this.records.get(session.id) ?? []) {\n const time = Date.parse(record.timestamp)\n if (record.kind === 'custom') {\n merged.push({\n time,\n entry: {\n type: 'custom', id: record.id, timestamp: record.timestamp,\n customType: record.customType,\n ...(record.data === undefined ? {} : { data: record.data }),\n },\n })\n } else if (record.kind === 'label') {\n merged.push({\n time,\n entry: {\n type: 'label', id: record.id, timestamp: record.timestamp,\n targetId: record.targetId, label: record.label,\n },\n })\n } else {\n merged.push({\n time,\n entry: { type: 'session_info', id: record.id, timestamp: record.timestamp, name: record.name },\n })\n }\n }\n merged.sort((left, right) => left.time - right.time)\n const entries: PiProjectedEntry[] = []\n let parentId: string | null = null\n for (const item of merged) {\n const entry = { ...item.entry, parentId } as PiProjectedEntry\n entries.push(entry)\n parentId = entry.id\n }\n return entries\n }\n\n /** The exact 14-method surface Pi exposes as ctx.sessionManager. */\n readonlySessionManager(session: DshSessionLike, cwd: string): UnknownRecord {\n const entriesOf = (): PiProjectedEntry[] => this.projectEntries(session)\n const leafOf = (): PiProjectedEntry | undefined => entriesOf().at(-1)\n return {\n getCwd: () => cwd,\n getSessionDir: () => sidecarDir(),\n getSessionId: () => session.id,\n getSessionFile: () => this.sidecarPath(session.id),\n getLeafId: () => leafOf()?.id ?? null,\n getLeafEntry: () => leafOf(),\n getEntry: (id: string) => entriesOf().find(entry => entry.id === id),\n getLabel: (id: string) => this.labels(session.id).get(id),\n getBranch: (fromId?: string) => {\n const entries = entriesOf()\n if (fromId === undefined) return entries\n const index = entries.findIndex(entry => entry.id === fromId)\n return index === -1 ? [] : entries.slice(0, index + 1)\n },\n // Pi context rules: message/compaction/branch_summary/custom_message\n // enter the LLM context; custom entries and labels are state-only.\n buildContextEntries: () => entriesOf().filter(entry =>\n entry.type === 'message' || entry.type === 'compaction' || entry.type === 'branch_summary' || entry.type === 'custom_message'),\n getHeader: () => ({\n type: 'session',\n version: 3,\n id: session.id,\n timestamp: new Date(Number(sessionEvents(session)[0]?.time ?? Date.now())).toISOString(),\n cwd,\n }),\n getEntries: () => entriesOf(),\n getTree: () => {\n const entries = entriesOf()\n const labels = this.labels(session.id)\n type Node = { entry: PiProjectedEntry; children: Node[]; label?: string | undefined }\n let root: Node | undefined\n let cursor: Node | undefined\n for (const entry of entries) {\n const node: Node = {\n entry,\n children: [],\n ...(labels.has(entry.id) ? { label: labels.get(entry.id) } : {}),\n }\n if (cursor === undefined) root = node\n else cursor.children.push(node)\n cursor = node\n }\n return root === undefined ? [] : [root]\n },\n getSessionName: () => this.getName(session.id),\n }\n }\n}\n","import type { Context } from '@deepseek-ai/cordis'\nimport { createUserMessage, type ContentBlock } from '@deepseek-ai/dsh-llm'\n\ntype UnknownRecord = Record<string, unknown>\ntype PiSessionEventHandler = (event: UnknownRecord) => void\n\n// Pi's public AgentSession surface, driven by a REAL DSH agent created\n// through ctx.agents — the host loop's registered factory builds the child\n// session and drives its turns. The bridge owns no model loop of its own:\n// in a composition without the loop/model runtime (e.g. the credential-less\n// black-box probe), creation fails with an explicit message instead of\n// pretending a subagent ran.\n//\n// Surface covered is the set the ecosystem's subagent packages actually\n// consume (verified against @tintinweb/pi-subagents): prompt, steer, abort,\n// subscribe, messages, setSessionName, getSessionStats, bindExtensions,\n// getAllTools/getActiveToolNames/setActiveToolsByName, and the\n// agent.beforeToolCall hook slot (wired to DSH's tools/pre-execute seam).\n\nexport interface SubagentHost {\n cordis: Context\n cwd(): string\n parentSessionId(): string | undefined\n piContentToDsh(content: unknown): Promise<ContentBlock[]>\n deliver(agent: UnknownRecord, message: unknown, mode: 'inject' | 'steer' | 'followup'): void\n messageFromSessionEvent(event: UnknownRecord): UnknownRecord | undefined\n messageSource: string\n}\n\nexport interface CreateAgentSessionOptions {\n cwd?: string\n tools?: unknown[]\n customTools?: unknown[]\n model?: unknown\n thinkingLevel?: unknown\n [key: string]: unknown\n}\n\ninterface BeforeToolCallDecision {\n block?: boolean\n reason?: string\n}\n\ninterface PiSubagentFacade {\n beforeToolCall?: (\n context: { toolCall: { name: string, id: string, arguments: unknown } },\n signal: AbortSignal | undefined,\n ) => Promise<BeforeToolCallDecision | undefined> | BeforeToolCallDecision | undefined\n}\n\nlet subagentSerial = 0\n\nexport class PiBridgedAgentSession {\n readonly agent: PiSubagentFacade = {}\n readonly messages: UnknownRecord[] = []\n\n readonly #host: SubagentHost\n readonly #handle: { agent: UnknownRecord, dispose(): Promise<void> }\n readonly #session: UnknownRecord\n readonly #tools: unknown[]\n readonly #subscribers = new Set<PiSessionEventHandler>()\n readonly #disposers: Array<() => void> = []\n #activeToolNames: string[]\n #sessionName = ''\n #turns = 0\n #aborted = false\n\n constructor(\n host: SubagentHost,\n handle: { agent: UnknownRecord, dispose(): Promise<void> },\n tools: unknown[],\n ) {\n this.#host = host\n this.#handle = handle\n this.#session = (handle.agent as { session?: UnknownRecord }).session ?? {}\n this.#tools = tools\n this.#activeToolNames = tools\n .map(tool => (tool as { name?: unknown } | undefined)?.name)\n .filter((name): name is string => typeof name === 'string')\n\n const cordis = host.cordis as unknown as {\n on(name: string, callback: (...args: any[]) => unknown): () => void\n }\n // Project this child session's durable events into Pi AgentSessionEvents.\n const offEvents = cordis.on('session/event', (session: UnknownRecord, event: UnknownRecord) => {\n if (session !== this.#session) return\n this.#project(event)\n })\n // Pi packages assign session.agent.beforeToolCall to gate the subagent's\n // tool calls; DSH's pre-execute seam is the same decision point.\n const offPre = cordis.on('tools/pre-execute', async (\n exec: { agent?: unknown, name: string, callId: string, arguments: unknown },\n next: () => Promise<UnknownRecord>,\n ): Promise<UnknownRecord> => {\n if (exec.agent !== this.#handle.agent || this.agent.beforeToolCall === undefined) return next()\n const decision = await this.agent.beforeToolCall(\n { toolCall: { name: exec.name, id: exec.callId, arguments: exec.arguments } },\n undefined,\n )\n if (decision?.block === true) {\n return { kind: 'deny', reason: decision.reason ?? `Tool \"${exec.name}\" is not available to this subagent.` }\n }\n return next()\n })\n this.#disposers.push(offEvents, offPre)\n }\n\n #project(event: UnknownRecord): void {\n const type = event.type\n const emit = (piEvent: UnknownRecord): void => {\n for (const handler of [...this.#subscribers]) {\n try {\n handler(piEvent)\n } catch {\n // A broken subscriber must not sever the projection for the rest.\n }\n }\n }\n if (type === 'turn/start') {\n emit({ type: 'turn_start', turnIndex: Number((event.data as UnknownRecord).turn ?? 1) - 1 })\n }\n if (type === 'tool/call') {\n const data = event.data as UnknownRecord\n let args: unknown = {}\n try {\n args = JSON.parse(String(data.arguments ?? '{}'))\n } catch {\n args = {}\n }\n emit({ type: 'tool_execution_start', toolCallId: data.callId, toolName: data.name, args })\n }\n if (type === 'assistant/chunk') {\n const chunk = ((event.data as UnknownRecord).chunk ?? {}) as UnknownRecord\n const delta = typeof chunk.text === 'string' ? chunk.text : typeof chunk.delta === 'string' ? chunk.delta : ''\n emit({\n type: 'message_update',\n message: { role: 'assistant', content: [{ type: 'text', text: delta }] },\n assistantMessageEvent: { type: 'text_delta', delta, ...chunk },\n })\n }\n const message = this.#host.messageFromSessionEvent(event)\n if (message !== undefined) {\n this.messages.push(message)\n emit({ type: 'message_start', message })\n emit({ type: 'message_end', message })\n }\n if (type === 'turn/end') {\n this.#turns += 1\n emit({ type: 'turn_end', turnIndex: Number((event.data as UnknownRecord).turn ?? 1) - 1, message: { role: 'assistant', content: [] }, toolResults: [] })\n }\n }\n\n subscribe(handler: PiSessionEventHandler): () => void {\n this.#subscribers.add(handler)\n return () => this.#subscribers.delete(handler)\n }\n\n async prompt(text: string): Promise<void> {\n const blocks = await this.#host.piContentToDsh([{ type: 'text', text: String(text) }])\n const cordis = this.#host.cordis as unknown as {\n on(name: string, callback: (...args: any[]) => unknown): () => void\n }\n const completed = new Promise<void>(resolve => {\n const off = cordis.on('session/event', (session: UnknownRecord, event: UnknownRecord) => {\n if (session !== this.#session) return\n if (event.type === 'turn/end') {\n off()\n resolve()\n }\n })\n this.#disposers.push(off)\n })\n this.#host.deliver(this.#handle.agent, createUserMessage({\n content: blocks,\n source: { kind: 'plugin', plugin: this.#host.messageSource },\n }), 'followup')\n await completed\n }\n\n steer(text: string): void {\n void this.#host.piContentToDsh([{ type: 'text', text: String(text) }]).then(blocks => {\n this.#host.deliver(this.#handle.agent, createUserMessage({\n content: blocks,\n source: { kind: 'plugin', plugin: this.#host.messageSource },\n }), 'steer')\n })\n }\n\n abort(): void {\n this.#aborted = true\n // Pi's session.abort() is idempotent and safe at any lifecycle point;\n // DSH's Agent.cancel throws once the agent is disposed, so contain it.\n try {\n const cancel = (this.#handle.agent as { cancel?: (reason: UnknownRecord) => void }).cancel\n cancel?.({ kind: 'hook', reason: 'pi2dsh subagent abort()' })\n } catch {\n // already disposed — nothing left to abort\n }\n }\n\n setSessionName(name: string): void {\n this.#sessionName = String(name)\n }\n\n getSessionName(): string {\n return this.#sessionName\n }\n\n getSessionStats(): UnknownRecord {\n return { turns: this.#turns, messages: this.messages.length, aborted: this.#aborted }\n }\n\n getAllTools(): unknown[] {\n return [...this.#tools]\n }\n\n getActiveToolNames(): string[] {\n return [...this.#activeToolNames]\n }\n\n setActiveToolsByName(names: string[]): void {\n this.#activeToolNames = names.filter(name => typeof name === 'string')\n }\n\n async bindExtensions(_bindings: UnknownRecord = {}): Promise<void> {\n // The parent pi2dsh runtime already owns extension binding for the host\n // composition; a child session shares those registrations. Kept as an\n // accepted no-op so Pi's construction sequence proceeds unchanged.\n }\n\n async dispose(): Promise<void> {\n for (const dispose of this.#disposers.splice(0)) {\n try {\n dispose()\n } catch {\n // Disposal is best-effort teardown; the handle dispose below decides.\n }\n }\n this.#subscribers.clear()\n await this.#handle.dispose()\n }\n}\n\nexport async function createBridgedAgentSession(\n host: SubagentHost,\n options: CreateAgentSessionOptions,\n): Promise<{ session: PiBridgedAgentSession }> {\n // ctx.get() resolves the service without an inject declaration — the bridge\n // is constructed from arbitrary extension call sites, not a fiber of its own.\n const agents = (host.cordis as unknown as { get(name: string): unknown }).get('agents') as\n | { create?: (options: UnknownRecord) => Promise<{ agent: UnknownRecord, dispose(): Promise<void> }> }\n | undefined\n if (agents?.create === undefined) {\n throw new Error('pi2dsh: createAgentSession() needs the DSH agent registry in the host composition')\n }\n subagentSerial += 1\n const sessionId = `pi2dsh-sub-${Date.now().toString(36)}-${subagentSerial}`\n let handle\n try {\n // A Pi model object on the options routes the child agent: DSH's\n // agentOptions carry the provider route and model id the child's loop\n // will call (reviewer sessions, model division of labor).\n const requestedModel = options.model as { provider?: unknown, id?: unknown } | undefined\n // Pi's createAgentSession carries the caller's behavior contract on two\n // public surfaces: a plain systemPrompt option, or a ResourceLoader whose\n // getSystemPrompt() yields the override (guardian builds its reviewer\n // this way: DefaultResourceLoader with systemPromptOverride). An override\n // REPLACES the host's default prompt in Pi, and appendSystemPrompt\n // entries follow it.\n const loader = options.resourceLoader as {\n getSystemPrompt?(): string | undefined\n getAppendSystemPrompt?(): string[]\n } | undefined\n const overrideText = typeof options.systemPrompt === 'string' && options.systemPrompt.length > 0\n ? options.systemPrompt\n : (typeof loader?.getSystemPrompt === 'function' ? loader.getSystemPrompt() : undefined)\n const appendTexts = (typeof loader?.getAppendSystemPrompt === 'function' ? loader.getAppendSystemPrompt() : [])\n .filter((text): text is string => typeof text === 'string' && text.length > 0)\n const systemPrompt = overrideText !== undefined && overrideText.length > 0\n ? [overrideText, ...appendTexts].join('\\n\\n')\n : undefined\n handle = await agents.create({\n sessionId,\n meta: {\n cwd: typeof options.cwd === 'string' ? options.cwd : host.cwd(),\n origin: 'subagent',\n ...(host.parentSessionId() !== undefined ? { parentSession: host.parentSessionId() } : {}),\n },\n ...(typeof requestedModel?.id === 'string' && requestedModel.id.length > 0\n ? {\n agentOptions: {\n model: requestedModel.id,\n ...(typeof requestedModel.provider === 'string' && requestedModel.provider.length > 0\n ? { provider: requestedModel.provider }\n : {}),\n },\n }\n : {}),\n })\n // Registered through the child's own Agent.ctx: ctx.get() returns a\n // caller-bound service view, so the section lands in this agent's scope\n // layer (dsh-scope kScope tag on Agent.ctx) and unwinds on disposal —\n // never visible to the parent or sibling sessions. `complete: true` is\n // DSH's sole-prompt-section semantics, matching Pi's systemPromptOverride\n // replacing the default prompt.\n if (systemPrompt !== undefined) {\n const agentCtx = (handle.agent as { ctx?: { get?(name: string): unknown } }).ctx\n const prompt = (typeof agentCtx?.get === 'function' ? agentCtx.get('systemPrompt') : undefined) as\n | { section(input: { name: string, order: number, text: string, complete?: boolean }): unknown }\n | undefined\n if (prompt === undefined) {\n throw new Error('pi2dsh: createAgentSession() got a system prompt but the DSH composition has no systemPrompt service to carry it')\n }\n prompt.section({ name: 'pi2dsh:subagent-system-prompt', order: -1_000_000, text: systemPrompt, complete: true })\n }\n } catch (error) {\n throw new Error(\n 'pi2dsh: subagent creation needs the DSH host loop (model runtime) to provide the agent factory; '\n + `this composition cannot run one (${error instanceof Error ? error.message : String(error)})`,\n )\n }\n const tools = [\n ...(Array.isArray(options.tools) ? options.tools : []),\n ...(Array.isArray(options.customTools) ? options.customTools : []),\n ]\n return { session: new PiBridgedAgentSession(host, handle, tools) }\n}\n","// Model Runtime Bridge: Pi's model surface projected onto DSH's llm service.\n//\n// - catalog: llm.listProviders() × listModels() cached as Pi Model objects,\n// refreshed on the `llm/adapters-updated` registry notification\n// - designated-model calls: pi-ai complete()/stream() run on ctx.llm.stream()\n// with two-way message conversion (both vocabularies are pi-ai lineage —\n// DSH's official adapter package is dsh-llm-pi-ai)\n// - per-agent model/thinking switches stay on the `agent/request` waterfall\n// (wired in runtime.ts); this module owns catalog + call translation\n//\n// Compositions without a mounted llm service keep the empty-catalog semantics:\n// every entry point degrades to the previous explicit behavior.\n\nimport { AssistantMessageEventStream } from './compat/vendor/pi-ai-event-stream.js'\n\ntype UnknownRecord = Record<string, unknown>\n\nexport interface DshLlmLike {\n listProviders(): Array<{ id: string, name: string }>\n listModels(provider: string): Promise<UnknownRecord[]>\n resolveModelInfo(provider: string, model: string, signal?: AbortSignal): Promise<UnknownRecord>\n stream(options: UnknownRecord): AsyncIterable<UnknownRecord>\n}\n\nexport function llmOf(ctx: unknown): DshLlmLike | undefined {\n try {\n const service = (ctx as { get(name: string): unknown }).get('llm')\n if (typeof (service as DshLlmLike | undefined)?.stream !== 'function') return undefined\n return service as DshLlmLike\n } catch {\n return undefined\n }\n}\n\n// ---- catalog ---------------------------------------------------------------\n\n/** A DSH catalog entry in Pi's Model shape. */\nexport interface PiModelShape {\n id: string\n name: string\n provider: string\n api: string\n input: Array<'text' | 'image'>\n reasoning: boolean\n contextWindow?: number\n maxTokens?: number\n [key: string]: unknown\n}\n\n// Pi Model fields a Pi-native route's directory entry may carry through the\n// DSH directory. Restoring them keeps the projection an EXACT Pi Model —\n// packages that read baseUrl or branch on api never see that a DSH\n// directory sat in between.\nconst PI_MODEL_PASSTHROUGH_FIELDS = [\n 'baseUrl', 'cost', 'contextWindow', 'maxTokens', 'samplingParams', 'thinkingLevelMap', 'compat', 'headers',\n] as const\n\nfunction piModelFromInfo(info: UnknownRecord): PiModelShape {\n const modalities = Array.isArray(info.inputModalities) ? info.inputModalities as string[] : undefined\n const carried: UnknownRecord = {}\n for (const field of PI_MODEL_PASSTHROUGH_FIELDS) {\n if (info[field] !== undefined) carried[field] = info[field]\n }\n return {\n ...carried,\n id: String(info.id ?? ''),\n name: String(info.name ?? info.id ?? ''),\n provider: String(info.provider ?? ''),\n // A Pi-native route's entry names its real wire protocol; a DSH-owned\n // adapter's does not, and its transport stays behind the route.\n api: typeof info.api === 'string' ? info.api : 'faux',\n input: modalities === undefined\n ? ['text']\n : modalities.filter((m): m is 'text' | 'image' => m === 'text' || m === 'image'),\n reasoning: typeof info.reasoning === 'boolean'\n ? info.reasoning\n : (info as { reasoning?: unknown }).reasoning !== undefined,\n }\n}\n\n/**\n * Cached projection of DSH's advisory model catalog as Pi Model objects.\n * `refresh()` re-reads providers and models; the runtime subscribes it to\n * `llm/adapters-updated`. Reads are synchronous (Pi's getAll contract).\n */\nexport class ModelCatalog {\n #llm: DshLlmLike | undefined\n #models: PiModelShape[] = []\n #resolved = new Map<string, PiModelShape>()\n #refreshing: Promise<void> | undefined\n\n constructor(llm: DshLlmLike | undefined) {\n this.#llm = llm\n }\n\n get present(): boolean {\n return this.#llm !== undefined\n }\n\n all(): PiModelShape[] {\n return [...this.#models]\n }\n\n find(provider: string, modelId: string): PiModelShape | undefined {\n return this.#resolved.get(`${provider}\u0000${modelId}`)\n ?? this.#models.find(model => model.provider === provider && model.id === modelId)\n }\n\n refresh(): Promise<void> {\n if (this.#llm === undefined) return Promise.resolve()\n this.#refreshing ??= this.#refreshOnce().finally(() => { this.#refreshing = undefined })\n return this.#refreshing\n }\n\n async #refreshOnce(): Promise<void> {\n const llm = this.#llm\n if (llm === undefined) return\n const next: PiModelShape[] = []\n for (const provider of llm.listProviders()) {\n try {\n for (const info of await llm.listModels(provider.id)) {\n next.push(piModelFromInfo({ ...info, provider: provider.id }))\n }\n } catch {\n // A provider whose adapter fails to list keeps its previous entries out;\n // the catalog is advisory and absence must not break registration.\n }\n }\n this.#models = next\n }\n\n /** Exact-route metadata (context window, reasoning efforts), cached per route. */\n async resolve(provider: string, modelId: string): Promise<PiModelShape | undefined> {\n if (this.#llm === undefined) return undefined\n const key = `${provider}\u0000${modelId}`\n const cached = this.#resolved.get(key)\n if (cached !== undefined) return cached\n try {\n const info = await this.#llm.resolveModelInfo(provider, modelId)\n const model = piModelFromInfo(info)\n const context = (info as { context?: { contextWindow?: unknown } }).context\n if (typeof context?.contextWindow === 'number') model.contextWindow = context.contextWindow\n const defaultMaxTokens = (info as { defaultMaxTokens?: unknown }).defaultMaxTokens\n if (typeof defaultMaxTokens === 'number') model.maxTokens = defaultMaxTokens\n const reasoning = (info as { reasoning?: { efforts?: unknown[] } }).reasoning\n model.reasoning = Array.isArray(reasoning?.efforts) && reasoning.efforts.length > 0\n this.#resolved.set(key, model)\n return model\n } catch {\n return undefined\n }\n }\n}\n\n// ---- message conversion ----------------------------------------------------\n\ninterface PiContentBlock { type: string, [key: string]: unknown }\n\nfunction dshBlocksFromPiContent(content: unknown): UnknownRecord[] {\n if (typeof content === 'string') return content.length > 0 ? [{ type: 'text', text: content }] : []\n if (!Array.isArray(content)) return []\n const blocks: UnknownRecord[] = []\n for (const block of content as PiContentBlock[]) {\n if (block.type === 'text' && typeof block.text === 'string') {\n blocks.push({ type: 'text', text: block.text })\n } else if (block.type === 'thinking' && typeof block.thinking === 'string') {\n blocks.push({ type: 'reasoning', text: block.thinking })\n } else if (block.type === 'toolCall') {\n blocks.push({\n type: 'tool-call',\n id: String(block.id ?? ''),\n name: String(block.name ?? ''),\n arguments: typeof block.arguments === 'string' ? block.arguments : JSON.stringify(block.arguments ?? {}),\n })\n } else if (block.type === 'image') {\n // DSH image blocks require attachment refs owned by the attachment\n // service; a hand-built pi-ai call has none, so the reference is\n // preserved textually instead of being silently dropped.\n blocks.push({ type: 'text', text: `[image omitted by pi2dsh: ${String(block.mimeType ?? 'unknown media type')}]` })\n }\n }\n return blocks\n}\n\n/**\n * Pi request context → DSH GenerateOptions parts. System prompt moves to the\n * dedicated slot; toolResult messages become DSH tool-result user messages.\n */\nexport function piRequestToDshMessages(context: UnknownRecord): { system?: string, messages: UnknownRecord[] } {\n const messages: UnknownRecord[] = []\n const source = Array.isArray(context.messages) ? context.messages as UnknownRecord[] : []\n for (const message of source) {\n if (message.role === 'user') {\n messages.push({ role: 'user', content: dshBlocksFromPiContent(message.content), source: { kind: 'user' } })\n } else if (message.role === 'assistant') {\n messages.push({\n role: 'assistant',\n content: dshBlocksFromPiContent(message.content),\n source: {\n kind: 'model',\n provider: String(message.provider ?? context.provider ?? 'pi2dsh'),\n model: String(message.model ?? context.model ?? 'unknown'),\n },\n })\n } else if (message.role === 'toolResult') {\n messages.push({\n role: 'user',\n content: [{\n type: 'tool-result',\n toolCallId: String(message.toolCallId ?? ''),\n content: dshBlocksFromPiContent(message.content),\n isError: message.isError === true,\n }],\n source: { kind: 'tool', callId: String(message.toolCallId ?? '') },\n })\n }\n }\n const system = typeof context.systemPrompt === 'string' && context.systemPrompt.length > 0\n ? context.systemPrompt\n : undefined\n return { ...(system === undefined ? {} : { system }), messages }\n}\n\nfunction piUsageFromDsh(usage: UnknownRecord | undefined): UnknownRecord {\n const input = Number((usage as { inputTokens?: unknown } | undefined)?.inputTokens ?? 0)\n const output = Number((usage as { outputTokens?: unknown } | undefined)?.outputTokens ?? 0)\n const cacheRead = Number((usage as { cacheReadTokens?: unknown } | undefined)?.cacheReadTokens ?? 0)\n const cacheWrite = Number((usage as { cacheWriteTokens?: unknown } | undefined)?.cacheWriteTokens ?? 0)\n return {\n input, output, cacheRead, cacheWrite,\n totalTokens: input + output + cacheRead + cacheWrite,\n cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, total: 0 },\n }\n}\n\nfunction piStopReason(finish: UnknownRecord | undefined): string {\n switch ((finish as { kind?: unknown } | undefined)?.kind) {\n case 'stop': return 'stop'\n case 'max-tokens': return 'length'\n case 'tool-calls': return 'toolUse'\n case 'aborted': return 'aborted'\n default: return 'error'\n }\n}\n\n// ---- designated-model call bridge ------------------------------------------\n\nexport interface PiStreamRequest {\n model: UnknownRecord\n context: UnknownRecord\n options?: UnknownRecord | undefined\n}\n\n/**\n * Run one hand-built pi-ai model call on DSH's native llm service, translating\n * the chunk stream into Pi's AssistantMessageEventStream vocabulary.\n */\nexport function streamViaDshLlm(llm: DshLlmLike, request: PiStreamRequest): AssistantMessageEventStream {\n const stream = new AssistantMessageEventStream() as AssistantMessageEventStream & {\n push(event: UnknownRecord): void\n }\n const provider = String(request.model.provider ?? '')\n const modelId = String(request.model.id ?? '')\n const { system, messages } = piRequestToDshMessages({ ...request.context, provider, model: modelId })\n const options = request.options ?? {}\n const generate: UnknownRecord = {\n provider,\n model: modelId,\n messages,\n ...(system === undefined ? {} : { system }),\n ...(Array.isArray(request.context.tools) ? { tools: normalizeToolSchemas(request.context.tools as UnknownRecord[]) } : {}),\n ...(typeof options.maxTokens === 'number' ? { maxTokens: options.maxTokens } : {}),\n ...(typeof options.temperature === 'number' ? { temperature: options.temperature } : {}),\n ...(options.signal instanceof AbortSignal ? { signal: options.signal } : {}),\n }\n\n void (async () => {\n const partial: UnknownRecord = { role: 'assistant', content: [], provider, model: modelId, api: 'faux' }\n const content = partial.content as PiContentBlock[]\n let usage: UnknownRecord | undefined\n stream.push({ type: 'start', partial })\n try {\n for await (const chunk of llm.stream(generate)) {\n const type = String(chunk.type ?? '')\n const index = Number(chunk.index ?? 0)\n if (type === 'block-start') {\n const blockType = String(chunk.blockType ?? '')\n if (blockType === 'text') {\n content[index] = { type: 'text', text: '' }\n stream.push({ type: 'text_start', contentIndex: index, partial })\n } else if (blockType === 'reasoning') {\n content[index] = { type: 'thinking', thinking: '' }\n stream.push({ type: 'thinking_start', contentIndex: index, partial })\n } else if (blockType === 'tool-call') {\n content[index] = { type: 'toolCall', id: '', name: '', arguments: undefined, partialJson: '' }\n stream.push({ type: 'toolcall_start', contentIndex: index, partial })\n }\n } else if (type === 'text-delta') {\n const block = content[index] ??= { type: 'text', text: '' }\n block.text = String(block.text ?? '') + String(chunk.text ?? '')\n stream.push({ type: 'text_delta', contentIndex: index, delta: String(chunk.text ?? ''), partial })\n } else if (type === 'reasoning-delta') {\n const block = content[index] ??= { type: 'thinking', thinking: '' }\n block.thinking = String(block.thinking ?? '') + String(chunk.text ?? '')\n stream.push({ type: 'thinking_delta', contentIndex: index, delta: String(chunk.text ?? ''), partial })\n } else if (type === 'tool-call-delta') {\n const block = content[index] ??= { type: 'toolCall', id: '', name: '', arguments: undefined, partialJson: '' }\n if (chunk.id !== undefined) block.id = String(chunk.id)\n if (chunk.name !== undefined) block.name = String(chunk.name)\n block.partialJson = String(block.partialJson ?? '') + String(chunk.argumentsDelta ?? '')\n stream.push({ type: 'toolcall_delta', contentIndex: index, delta: String(chunk.argumentsDelta ?? ''), partial })\n } else if (type === 'block-end') {\n const block = chunk.block as UnknownRecord | undefined\n const blockType = String(block?.type ?? '')\n if (blockType === 'text') {\n content[index] = { type: 'text', text: String(block?.text ?? '') }\n stream.push({ type: 'text_end', contentIndex: index, content: String(block?.text ?? ''), partial })\n } else if (blockType === 'reasoning') {\n content[index] = { type: 'thinking', thinking: String(block?.text ?? '') }\n stream.push({ type: 'thinking_end', contentIndex: index, content: String(block?.text ?? ''), partial })\n } else if (blockType === 'tool-call') {\n let parsed: unknown\n try { parsed = JSON.parse(String(block?.arguments ?? '{}')) } catch { parsed = {} }\n content[index] = { type: 'toolCall', id: String(block?.id ?? ''), name: String(block?.name ?? ''), arguments: parsed }\n stream.push({ type: 'toolcall_end', contentIndex: index, toolCall: content[index], partial })\n }\n } else if (type === 'usage') {\n usage = piUsageFromDsh(chunk.usage as UnknownRecord | undefined)\n } else if (type === 'finish') {\n const finish = chunk.reason as UnknownRecord | undefined\n const stopReason = piStopReason(finish)\n if (stopReason === 'error' || stopReason === 'aborted') {\n const failure = (finish as { failure?: { message?: unknown } } | undefined)?.failure\n const error = {\n type: 'error' as const,\n reason: stopReason === 'aborted' ? 'aborted' : 'error',\n error: new Error(String(failure?.message ?? `model call failed (${stopReason})`)),\n }\n stream.push({ ...error, partial })\n return\n }\n const message: UnknownRecord = {\n role: 'assistant',\n content: content.filter(block => block !== undefined),\n provider, model: modelId, api: 'faux',\n ...(usage === undefined ? {} : { usage }),\n stopReason,\n timestamp: Date.now(),\n }\n stream.push({ type: 'done', reason: stopReason, message })\n return\n }\n }\n // Stream ended without a finish chunk — surface it as an error, never a\n // fabricated completion.\n stream.push({ type: 'error', reason: 'error', error: new Error('pi2dsh: DSH llm stream ended without a finish chunk'), partial })\n } catch (error) {\n stream.push({ type: 'error', reason: 'error', error: error instanceof Error ? error : new Error(String(error)), partial })\n }\n })()\n\n return stream\n}\n\nfunction normalizeToolSchemas(tools: UnknownRecord[]): UnknownRecord[] {\n return tools.map(tool => ({\n name: String(tool.name ?? ''),\n description: String(tool.description ?? ''),\n parameters: (tool.parameters ?? tool.inputSchema ?? { type: 'object', properties: {} }) as UnknownRecord,\n }))\n}\n\n// ---- reverse conversion (DSH request → Pi request, Pi events → DSH chunks) --\n// Used by the provider adapter: a Pi package's own transport serves a DSH\n// llm route, so the DSH loop's vocabulary must arrive in Pi shapes and the\n// package's event stream must leave as DSH chunks.\n\n/** DSH GenerateOptions parts → the Pi request context a provider.stream expects. */\nexport function dshRequestToPiContext(options: UnknownRecord): UnknownRecord {\n const piMessages: UnknownRecord[] = []\n for (const message of Array.isArray(options.messages) ? options.messages as UnknownRecord[] : []) {\n const content = Array.isArray(message.content) ? message.content as UnknownRecord[] : []\n const source = message.source as { kind?: unknown } | undefined\n if (message.role === 'user' && source?.kind === 'tool') {\n const result = content[0] as UnknownRecord | undefined\n piMessages.push({\n role: 'toolResult',\n toolCallId: String(result?.toolCallId ?? ''),\n content: piContentFromDshBlocks(Array.isArray(result?.content) ? result.content as UnknownRecord[] : []),\n isError: result?.isError === true,\n })\n } else if (message.role === 'user') {\n piMessages.push({ role: 'user', content: piContentFromDshBlocks(content) })\n } else if (message.role === 'assistant') {\n piMessages.push({ role: 'assistant', content: piContentFromDshBlocks(content) })\n }\n }\n return {\n ...(typeof options.system === 'string' && options.system.length > 0 ? { systemPrompt: options.system } : {}),\n messages: piMessages,\n ...(Array.isArray(options.tools) ? { tools: options.tools } : {}),\n }\n}\n\nfunction piContentFromDshBlocks(blocks: UnknownRecord[]): UnknownRecord[] {\n const out: UnknownRecord[] = []\n for (const block of blocks) {\n if (block.type === 'text') out.push({ type: 'text', text: String(block.text ?? '') })\n else if (block.type === 'reasoning') out.push({ type: 'thinking', thinking: String(block.text ?? '') })\n else if (block.type === 'tool-call') {\n let parsed: unknown\n try { parsed = JSON.parse(String(block.arguments ?? '{}')) } catch { parsed = {} }\n out.push({ type: 'toolCall', id: String(block.id ?? ''), name: String(block.name ?? ''), arguments: parsed })\n }\n }\n return out\n}\n\n/** A Pi AssistantMessageEventStream → DSH StreamChunk sequence. */\nexport async function* piEventsToDshChunks(events: AsyncIterable<UnknownRecord>): AsyncIterable<UnknownRecord> {\n let usage: UnknownRecord | undefined\n for await (const event of events) {\n const type = String(event.type ?? '')\n const index = Number(event.contentIndex ?? 0)\n if (type === 'text_start') yield { type: 'block-start', index, blockType: 'text' }\n else if (type === 'text_delta') yield { type: 'text-delta', index, text: String(event.delta ?? '') }\n else if (type === 'text_end') yield { type: 'block-end', index, block: { type: 'text', text: String(event.content ?? '') } }\n else if (type === 'thinking_start') yield { type: 'block-start', index, blockType: 'reasoning' }\n else if (type === 'thinking_delta') yield { type: 'reasoning-delta', index, text: String(event.delta ?? '') }\n else if (type === 'thinking_end') yield { type: 'block-end', index, block: { type: 'reasoning', text: String(event.content ?? '') } }\n else if (type === 'toolcall_start') yield { type: 'block-start', index, blockType: 'tool-call' }\n else if (type === 'toolcall_delta') yield { type: 'tool-call-delta', index, id: '', argumentsDelta: String(event.delta ?? '') }\n else if (type === 'toolcall_end') {\n const call = event.toolCall as UnknownRecord | undefined\n yield {\n type: 'block-end', index,\n block: {\n type: 'tool-call',\n id: String(call?.id ?? ''),\n name: String(call?.name ?? ''),\n arguments: typeof call?.arguments === 'string' ? call.arguments : JSON.stringify(call?.arguments ?? {}),\n },\n }\n } else if (type === 'done') {\n const message = event.message as UnknownRecord | undefined\n const piUsage = message?.usage as UnknownRecord | undefined\n if (piUsage !== undefined) {\n usage = {\n inputTokens: Number(piUsage.input ?? 0),\n outputTokens: Number(piUsage.output ?? 0),\n ...(piUsage.cacheRead === undefined ? {} : { cacheReadTokens: Number(piUsage.cacheRead) }),\n ...(piUsage.cacheWrite === undefined ? {} : { cacheWriteTokens: Number(piUsage.cacheWrite) }),\n }\n yield { type: 'usage', usage }\n }\n const stop = String(message?.stopReason ?? 'stop')\n yield {\n type: 'finish',\n reason: stop === 'length' ? { kind: 'max-tokens' }\n : stop === 'toolUse' ? { kind: 'tool-calls' }\n : stop === 'aborted' ? { kind: 'aborted', failure: { message: 'aborted by caller', code: 'ABORTED' } }\n : { kind: 'stop' },\n }\n return\n } else if (type === 'error') {\n const error = event.error\n yield {\n type: 'finish',\n reason: {\n kind: String(event.reason ?? '') === 'aborted' ? 'aborted' : 'error',\n failure: { message: error instanceof Error ? error.message : String(error ?? 'provider stream error'), code: 'PI_PROVIDER' },\n },\n }\n return\n }\n }\n // The package's stream ended without done/error — a terminal error chunk,\n // never a fabricated finish.\n yield { type: 'finish', reason: { kind: 'error', failure: { message: 'pi2dsh: Pi provider stream ended without done/error', code: 'PI_PROVIDER' } } }\n}\n","// @ts-nocheck — vendored Pi source (coding-agent src/utils/json.ts @47f9438, MIT, see ./PI-LICENSE); logic unchanged.\n/** Strip `//` line comments and trailing commas from JSON, leaving string literals untouched. */\nexport function stripJsonComments(input: string): string {\n\treturn input\n\t\t.replace(/\"(?:\\\\.|[^\"\\\\])*\"|\\/\\/[^\\n]*/g, (m) => (m[0] === '\"' ? m : \"\"))\n\t\t.replace(/\"(?:\\\\.|[^\"\\\\])*\"|,(\\s*[}\\]])/g, (m, tail) => tail ?? (m[0] === '\"' ? m : \"\"));\n}\n","// @ts-nocheck — vendored Pi source (coding-agent src/core/model-config.ts @47f9438, MIT, see ./PI-LICENSE);\n// imports remapped (utils/json → pi-json, utils/paths → pi-config-shim), logic unchanged.\n/** Immutable, credential-blind models.json snapshot. */\n\nimport { readFile } from \"node:fs/promises\";\nimport { type Static, Type } from \"typebox\";\nimport { Compile } from \"typebox/compile\";\nimport type { TLocalizedValidationError } from \"typebox/error\";\nimport { stripJsonComments } from \"./pi-json.js\";\nimport { normalizePath } from \"./pi-config-shim.js\";\n\nconst PercentileCutoffsSchema = Type.Object({\n\tp50: Type.Optional(Type.Number()),\n\tp75: Type.Optional(Type.Number()),\n\tp90: Type.Optional(Type.Number()),\n\tp99: Type.Optional(Type.Number()),\n});\n\nconst OpenRouterRoutingSchema = Type.Object({\n\tallow_fallbacks: Type.Optional(Type.Boolean()),\n\trequire_parameters: Type.Optional(Type.Boolean()),\n\tdata_collection: Type.Optional(Type.Union([Type.Literal(\"deny\"), Type.Literal(\"allow\")])),\n\tzdr: Type.Optional(Type.Boolean()),\n\tenforce_distillable_text: Type.Optional(Type.Boolean()),\n\torder: Type.Optional(Type.Array(Type.String())),\n\tonly: Type.Optional(Type.Array(Type.String())),\n\tignore: Type.Optional(Type.Array(Type.String())),\n\tquantizations: Type.Optional(Type.Array(Type.String())),\n\tsort: Type.Optional(\n\t\tType.Union([\n\t\t\tType.String(),\n\t\t\tType.Object({\n\t\t\t\tby: Type.Optional(Type.String()),\n\t\t\t\tpartition: Type.Optional(Type.Union([Type.String(), Type.Null()])),\n\t\t\t}),\n\t\t]),\n\t),\n\tmax_price: Type.Optional(\n\t\tType.Object({\n\t\t\tprompt: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\tcompletion: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\timage: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\taudio: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t\trequest: Type.Optional(Type.Union([Type.Number(), Type.String()])),\n\t\t}),\n\t),\n\tpreferred_min_throughput: Type.Optional(Type.Union([Type.Number(), PercentileCutoffsSchema])),\n\tpreferred_max_latency: Type.Optional(Type.Union([Type.Number(), PercentileCutoffsSchema])),\n});\n\nconst VercelGatewayRoutingSchema = Type.Object({\n\tonly: Type.Optional(Type.Array(Type.String())),\n\torder: Type.Optional(Type.Array(Type.String())),\n});\n\nconst ThinkingLevelMapValueSchema = Type.Union([Type.String(), Type.Null()]);\nconst ThinkingLevelMapSchema = Type.Object({\n\toff: Type.Optional(ThinkingLevelMapValueSchema),\n\tminimal: Type.Optional(ThinkingLevelMapValueSchema),\n\tlow: Type.Optional(ThinkingLevelMapValueSchema),\n\tmedium: Type.Optional(ThinkingLevelMapValueSchema),\n\thigh: Type.Optional(ThinkingLevelMapValueSchema),\n\txhigh: Type.Optional(ThinkingLevelMapValueSchema),\n\tmax: Type.Optional(ThinkingLevelMapValueSchema),\n});\n\nconst ChatTemplateKwargScalarSchema = Type.Union([Type.String(), Type.Number(), Type.Boolean(), Type.Null()]);\nconst ChatTemplateKwargVariableSchema = Type.Object({\n\t$var: Type.Union([Type.Literal(\"thinking.enabled\"), Type.Literal(\"thinking.effort\")]),\n\tomitWhenOff: Type.Optional(Type.Boolean()),\n});\nconst ChatTemplateKwargSchema = Type.Union([ChatTemplateKwargScalarSchema, ChatTemplateKwargVariableSchema]);\n\nconst OpenAICompletionsCompatSchema = Type.Object({\n\tsupportsStore: Type.Optional(Type.Boolean()),\n\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\tsupportsReasoningEffort: Type.Optional(Type.Boolean()),\n\tsupportsUsageInStreaming: Type.Optional(Type.Boolean()),\n\tmaxTokensField: Type.Optional(Type.Union([Type.Literal(\"max_completion_tokens\"), Type.Literal(\"max_tokens\")])),\n\trequiresToolResultName: Type.Optional(Type.Boolean()),\n\trequiresAssistantAfterToolResult: Type.Optional(Type.Boolean()),\n\trequiresThinkingAsText: Type.Optional(Type.Boolean()),\n\trequiresReasoningContentOnAssistantMessages: Type.Optional(Type.Boolean()),\n\tthinkingFormat: Type.Optional(\n\t\tType.Union([\n\t\t\tType.Literal(\"openai\"),\n\t\t\tType.Literal(\"openrouter\"),\n\t\t\tType.Literal(\"together\"),\n\t\t\tType.Literal(\"baseten\"),\n\t\t\tType.Literal(\"deepseek\"),\n\t\t\tType.Literal(\"zai\"),\n\t\t\tType.Literal(\"qwen\"),\n\t\t\tType.Literal(\"chat-template\"),\n\t\t\tType.Literal(\"qwen-chat-template\"),\n\t\t\tType.Literal(\"string-thinking\"),\n\t\t\tType.Literal(\"ant-ling\"),\n\t\t]),\n\t),\n\tchatTemplateKwargs: Type.Optional(Type.Record(Type.String(), ChatTemplateKwargSchema)),\n\tchatTemplateArgs: Type.Optional(Type.Record(Type.String(), ChatTemplateKwargSchema)),\n\tcacheControlFormat: Type.Optional(Type.Literal(\"anthropic\")),\n\topenRouterRouting: Type.Optional(OpenRouterRoutingSchema),\n\tvercelGatewayRouting: Type.Optional(VercelGatewayRoutingSchema),\n\tsupportsOpenAIGrammarTools: Type.Optional(Type.Boolean()),\n\tsupportsStrictMode: Type.Optional(Type.Boolean()),\n\tsendSessionAffinityHeaders: Type.Optional(Type.Boolean()),\n\tdeferredToolsMode: Type.Optional(Type.Literal(\"kimi\")),\n\tsessionAffinityFormat: Type.Optional(\n\t\tType.Union([Type.Literal(\"openai\"), Type.Literal(\"openai-nosession\"), Type.Literal(\"openrouter\")]),\n\t),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n});\n\nconst OpenAIResponsesCompatSchema = Type.Object({\n\tsupportsDeveloperRole: Type.Optional(Type.Boolean()),\n\tsessionAffinityFormat: Type.Optional(\n\t\tType.Union([Type.Literal(\"openai\"), Type.Literal(\"openai-nosession\"), Type.Literal(\"openrouter\")]),\n\t),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n\tsupportsStrictMode: Type.Optional(Type.Boolean()),\n\tsupportsOpenAIGrammarTools: Type.Optional(Type.Boolean()),\n\tsupportsAdditionalTools: Type.Optional(Type.Boolean()),\n\tsupportsToolSearch: Type.Optional(Type.Boolean()),\n});\n\nconst AnthropicMessagesCompatSchema = Type.Object({\n\tsupportsEagerToolInputStreaming: Type.Optional(Type.Boolean()),\n\tsupportsLongCacheRetention: Type.Optional(Type.Boolean()),\n\tsendSessionAffinityHeaders: Type.Optional(Type.Boolean()),\n\tsupportsCacheControlOnTools: Type.Optional(Type.Boolean()),\n\tsupportsTemperature: Type.Optional(Type.Boolean()),\n\tforceAdaptiveThinking: Type.Optional(Type.Boolean()),\n\tallowEmptySignature: Type.Optional(Type.Boolean()),\n\tsupportsStrictTools: Type.Optional(Type.Boolean()),\n\tsupportsToolReferences: Type.Optional(Type.Boolean()),\n});\n\nconst ProviderCompatSchema = Type.Union([\n\tOpenAICompletionsCompatSchema,\n\tOpenAIResponsesCompatSchema,\n\tAnthropicMessagesCompatSchema,\n]);\n\nconst ModelCostRatesSchema = {\n\tinput: Type.Number(),\n\toutput: Type.Number(),\n\tcacheRead: Type.Number(),\n\tcacheWrite: Type.Number(),\n};\nconst ModelCostTierSchema = Type.Object({\n\tinputTokensAbove: Type.Number(),\n\t...ModelCostRatesSchema,\n});\nconst ModelCostSchema = Type.Object({\n\t...ModelCostRatesSchema,\n\ttiers: Type.Optional(Type.Array(ModelCostTierSchema)),\n});\n\nconst ModelDefinitionSchema = Type.Object({\n\tid: Type.String({ minLength: 1 }),\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\tapi: Type.Optional(Type.String({ minLength: 1 })),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tthinkingLevelMap: Type.Optional(ThinkingLevelMapSchema),\n\tinput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\tcost: Type.Optional(ModelCostSchema),\n\tcontextWindow: Type.Optional(Type.Number()),\n\tmaxTokens: Type.Optional(Type.Number()),\n\tsamplingParams: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n});\n\nconst ModelOverrideSchema = Type.Object({\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\treasoning: Type.Optional(Type.Boolean()),\n\tthinkingLevelMap: Type.Optional(ThinkingLevelMapSchema),\n\tinput: Type.Optional(Type.Array(Type.Union([Type.Literal(\"text\"), Type.Literal(\"image\")]))),\n\tcost: Type.Optional(\n\t\tType.Object({\n\t\t\tinput: Type.Optional(Type.Number()),\n\t\t\toutput: Type.Optional(Type.Number()),\n\t\t\tcacheRead: Type.Optional(Type.Number()),\n\t\t\tcacheWrite: Type.Optional(Type.Number()),\n\t\t\ttiers: Type.Optional(Type.Array(ModelCostTierSchema)),\n\t\t}),\n\t),\n\tcontextWindow: Type.Optional(Type.Number()),\n\tmaxTokens: Type.Optional(Type.Number()),\n\tsamplingParams: Type.Optional(Type.Record(Type.String(), Type.Unknown())),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n});\n\nconst ProviderConfigSchema = Type.Object({\n\tname: Type.Optional(Type.String({ minLength: 1 })),\n\tbaseUrl: Type.Optional(Type.String({ minLength: 1 })),\n\tapiKey: Type.Optional(Type.String({ minLength: 1 })),\n\tapi: Type.Optional(Type.String({ minLength: 1 })),\n\toauth: Type.Optional(Type.Literal(\"radius\")),\n\theaders: Type.Optional(Type.Record(Type.String(), Type.String())),\n\tcompat: Type.Optional(ProviderCompatSchema),\n\tauthHeader: Type.Optional(Type.Boolean()),\n\tmodels: Type.Optional(Type.Array(ModelDefinitionSchema)),\n\tmodelOverrides: Type.Optional(Type.Record(Type.String(), ModelOverrideSchema)),\n});\n\nconst ModelsConfigSchema = Type.Object({\n\tproviders: Type.Record(Type.String(), ProviderConfigSchema),\n});\nconst validateModelsConfig = Compile(ModelsConfigSchema);\n\nexport type ModelsJsonModel = Static<typeof ModelDefinitionSchema>;\nexport type ModelsJsonModelOverride = Static<typeof ModelOverrideSchema>;\nexport type ModelsJsonProvider = Static<typeof ProviderConfigSchema>;\ntype ModelsJson = Static<typeof ModelsConfigSchema>;\n\nfunction formatValidationPath(error: TLocalizedValidationError): string {\n\tif (error.keyword === \"required\") {\n\t\tconst requiredProperties = (error.params as { requiredProperties?: string[] }).requiredProperties;\n\t\tconst requiredProperty = requiredProperties?.[0];\n\t\tif (requiredProperty) {\n\t\t\tconst basePath = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\t\t\treturn basePath ? `${basePath}.${requiredProperty}` : requiredProperty;\n\t\t}\n\t}\n\tconst path = error.instancePath.replace(/^\\//, \"\").replace(/\\//g, \".\");\n\treturn path || \"root\";\n}\n\nfunction deepFreeze<T>(value: T): T {\n\tif (typeof value !== \"object\" || value === null || Object.isFrozen(value)) return value;\n\tfor (const child of Object.values(value)) deepFreeze(child);\n\treturn Object.freeze(value);\n}\n\n/** One immutable load of models.json. */\nexport class ModelConfig {\n\tprivate readonly providers: ReadonlyMap<string, ModelsJsonProvider>;\n\tprivate readonly error: string | undefined;\n\n\tprivate constructor(providers: ReadonlyMap<string, ModelsJsonProvider>, error?: string) {\n\t\tthis.providers = providers;\n\t\tthis.error = error;\n\t}\n\n\tstatic async load(modelsJsonPath: string | undefined): Promise<ModelConfig> {\n\t\tif (!modelsJsonPath) return new ModelConfig(new Map());\n\t\tconst path = normalizePath(modelsJsonPath);\n\t\tlet content: string;\n\t\ttry {\n\t\t\tcontent = await readFile(path, \"utf-8\");\n\t\t} catch (error) {\n\t\t\tif ((error as NodeJS.ErrnoException).code === \"ENOENT\") return new ModelConfig(new Map());\n\t\t\treturn new ModelConfig(\n\t\t\t\tnew Map(),\n\t\t\t\t`Failed to load models.json: ${error instanceof Error ? error.message : error}\\n\\nFile: ${path}`,\n\t\t\t);\n\t\t}\n\n\t\tlet parsed: unknown;\n\t\ttry {\n\t\t\tparsed = JSON.parse(stripJsonComments(content));\n\t\t} catch (error) {\n\t\t\treturn new ModelConfig(\n\t\t\t\tnew Map(),\n\t\t\t\t`Failed to parse models.json: ${error instanceof Error ? error.message : error}\\n\\nFile: ${path}`,\n\t\t\t);\n\t\t}\n\n\t\tif (!validateModelsConfig.Check(parsed)) {\n\t\t\tconst errors =\n\t\t\t\tvalidateModelsConfig\n\t\t\t\t\t.Errors(parsed)\n\t\t\t\t\t.map((error) => ` - ${formatValidationPath(error)}: ${error.message}`)\n\t\t\t\t\t.join(\"\\n\") || \"Unknown schema error\";\n\t\t\treturn new ModelConfig(new Map(), `Invalid models.json schema:\\n${errors}\\n\\nFile: ${path}`);\n\t\t}\n\n\t\tconst config = parsed as ModelsJson;\n\t\tconst providers = new Map<string, ModelsJsonProvider>();\n\t\tfor (const [providerId, provider] of Object.entries(config.providers)) {\n\t\t\tproviders.set(providerId, deepFreeze(structuredClone(provider)));\n\t\t}\n\t\treturn new ModelConfig(providers);\n\t}\n\n\tgetProvider(providerId: string): ModelsJsonProvider | undefined {\n\t\treturn this.providers.get(providerId);\n\t}\n\n\tgetProviderIds(): readonly string[] {\n\t\treturn [...this.providers.keys()];\n\t}\n\n\tgetError(): string | undefined {\n\t\treturn this.error;\n\t}\n}\n","// @ts-nocheck — vendored Pi source (coding-agent src/core/provider-composer.ts @47f9438, MIT, see ./PI-LICENSE);\n// excerpt: the models.json composition closure (mergeCompat, applyModelOverride,\n// modelFromJson, applyModelsJson). The full module's other exports depend on the\n// pi-ai runtime and auth storage; the excerpted functions are the pure\n// config→Model projection and their logic is unchanged.\n//\n// Composition order (composeModelProvider's getModels, upstream lines 431-446):\n// modelOverrides are the topmost user-config layer — callers apply\n// applyModelsJson first, then map each model through applyModelOverride for\n// its `config.modelOverrides[model.id]` entry.\nimport type { ModelsJsonModel, ModelsJsonModelOverride, ModelsJsonProvider } from \"./pi-model-config.js\";\n\ntype Api = string;\ntype Model<A> = Record<string, unknown> & { compat?: Record<string, unknown> };\n\nfunction mergeCompat(\n\tbase: Model<Api>[\"compat\"],\n\toverride: Model<Api>[\"compat\"] | ModelsJsonModelOverride[\"compat\"],\n): Model<Api>[\"compat\"] {\n\tif (!override) return base;\n\tconst merged = { ...base, ...override } as NonNullable<Model<Api>[\"compat\"]>;\n\tconst baseNested = base as Record<string, unknown> | undefined;\n\tconst overrideNested = override as Record<string, unknown>;\n\tconst mergedNested = merged as Record<string, unknown>;\n\tfor (const key of [\"openRouterRouting\", \"vercelGatewayRouting\", \"chatTemplateKwargs\", \"chatTemplateArgs\"] as const) {\n\t\tconst baseValue = baseNested?.[key];\n\t\tconst overrideValue = overrideNested[key];\n\t\tif (\n\t\t\t(typeof baseValue === \"object\" && baseValue !== null) ||\n\t\t\t(typeof overrideValue === \"object\" && overrideValue !== null)\n\t\t) {\n\t\t\tmergedNested[key] = { ...(baseValue as object | undefined), ...(overrideValue as object | undefined) };\n\t\t}\n\t}\n\treturn merged;\n}\n\nexport function applyModelOverride(model: Model<Api>, override: ModelsJsonModelOverride): Model<Api> {\n\treturn {\n\t\t...model,\n\t\tname: override.name ?? model.name,\n\t\treasoning: override.reasoning ?? model.reasoning,\n\t\tthinkingLevelMap: override.thinkingLevelMap\n\t\t\t? { ...model.thinkingLevelMap, ...override.thinkingLevelMap }\n\t\t\t: model.thinkingLevelMap,\n\t\tinput: (override.input as (\"text\" | \"image\")[] | undefined) ?? model.input,\n\t\tcost: override.cost\n\t\t\t? {\n\t\t\t\t\tinput: override.cost.input ?? model.cost.input,\n\t\t\t\t\toutput: override.cost.output ?? model.cost.output,\n\t\t\t\t\tcacheRead: override.cost.cacheRead ?? model.cost.cacheRead,\n\t\t\t\t\tcacheWrite: override.cost.cacheWrite ?? model.cost.cacheWrite,\n\t\t\t\t\ttiers: override.cost.tiers ?? model.cost.tiers,\n\t\t\t\t}\n\t\t\t: model.cost,\n\t\tcontextWindow: override.contextWindow ?? model.contextWindow,\n\t\tmaxTokens: override.maxTokens ?? model.maxTokens,\n\t\tsamplingParams: override.samplingParams\n\t\t\t? { ...model.samplingParams, ...override.samplingParams }\n\t\t\t: model.samplingParams,\n\t\tcompat: mergeCompat(model.compat, override.compat),\n\t};\n}\n\nfunction modelFromJson(\n\tproviderId: string,\n\tdefinition: ModelsJsonModel,\n\tproviderConfig: ModelsJsonProvider,\n\tdefaults: Model<Api> | undefined,\n): Model<Api> {\n\tconst api = definition.api ?? providerConfig.api ?? defaults?.api;\n\tif (!api) {\n\t\tthrow new Error(\n\t\t\t`Provider ${providerId}, model ${definition.id}: no \"api\" specified. Set at provider or model level.`,\n\t\t);\n\t}\n\tconst baseUrl = definition.baseUrl ?? providerConfig.baseUrl ?? defaults?.baseUrl;\n\tif (!baseUrl) throw new Error(`Provider ${providerId}: \"baseUrl\" is required when defining custom models.`);\n\tif (definition.contextWindow !== undefined && definition.contextWindow <= 0) {\n\t\tthrow new Error(`Provider ${providerId}, model ${definition.id}: invalid contextWindow`);\n\t}\n\tif (definition.maxTokens !== undefined && definition.maxTokens <= 0) {\n\t\tthrow new Error(`Provider ${providerId}, model ${definition.id}: invalid maxTokens`);\n\t}\n\treturn {\n\t\tid: definition.id,\n\t\tname: definition.name ?? definition.id,\n\t\tapi: api as Api,\n\t\tprovider: providerId,\n\t\tbaseUrl,\n\t\treasoning: definition.reasoning ?? false,\n\t\tthinkingLevelMap: definition.thinkingLevelMap,\n\t\tinput: (definition.input ?? [\"text\"]) as (\"text\" | \"image\")[],\n\t\tcost: definition.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },\n\t\tcontextWindow: definition.contextWindow ?? 128000,\n\t\tmaxTokens: definition.maxTokens ?? 16384,\n\t\tsamplingParams: definition.samplingParams,\n\t\theaders: undefined,\n\t\tcompat: mergeCompat(providerConfig.compat, definition.compat),\n\t};\n}\n\nexport function applyModelsJson(\n\tproviderId: string,\n\tbaseModels: readonly Model<Api>[],\n\tconfig: ModelsJsonProvider | undefined,\n): Model<Api>[] {\n\tif (!config) return [...baseModels];\n\tif (config.oauth && !config.baseUrl) {\n\t\tthrow new Error(`Provider ${providerId}: \"baseUrl\" is required when \"oauth\" is set.`);\n\t}\n\tconst hasOverrides = config.modelOverrides && Object.keys(config.modelOverrides).length > 0;\n\tif (\n\t\t!config.models?.length &&\n\t\t!config.baseUrl &&\n\t\t!config.headers &&\n\t\t!config.compat &&\n\t\t!hasOverrides &&\n\t\t!config.apiKey &&\n\t\t!config.oauth &&\n\t\tconfig.authHeader === undefined\n\t) {\n\t\tthrow new Error(\n\t\t\t`Provider ${providerId}: must specify \"baseUrl\", \"headers\", \"compat\", \"modelOverrides\", or \"models\".`,\n\t\t);\n\t}\n\n\tconst models: Model<Api>[] = baseModels.map((model) => ({\n\t\t...model,\n\t\tbaseUrl: config.oauth === \"radius\" ? model.baseUrl : (config.baseUrl ?? model.baseUrl),\n\t\tcompat: mergeCompat(model.compat, config.compat),\n\t}));\n\tfor (const definition of config.models ?? []) {\n\t\tconst existingIndex = models.findIndex((model) => model.id === definition.id);\n\t\tconst defaults = existingIndex >= 0 ? models[existingIndex] : models[0];\n\t\tconst model = modelFromJson(providerId, definition, config, defaults);\n\t\tif (existingIndex >= 0) models[existingIndex] = model;\n\t\telse models.push(model);\n\t}\n\treturn models;\n}\n","// @ts-nocheck — vendored Pi source (coding-agent src/utils/shell.ts @47f9438, MIT, see ./PI-LICENSE);\n// excerpt: the getShellConfig closure consumed by resolve-config-value's `!command`\n// execution path. The full module's other exports depend on getBinDir and are not\n// used by the vendored resolver; logic of the excerpted functions is unchanged.\nimport { existsSync } from \"node:fs\";\nimport { spawnSync } from \"child_process\";\n\nexport interface ShellConfig {\n\tshell: string;\n\targs: string[];\n\tcommandTransport?: \"argv\" | \"stdin\";\n}\n\nfunction isLegacyWslBashPath(path: string): boolean {\n\tconst normalized = path.replace(/\\//g, \"\\\\\").toLowerCase();\n\treturn /^[a-z]:\\\\windows\\\\(?:system32|sysnative)\\\\bash\\.exe$/.test(normalized);\n}\n\nfunction getBashShellConfig(shell: string): ShellConfig {\n\treturn isLegacyWslBashPath(shell) ? { shell, args: [\"-s\"], commandTransport: \"stdin\" } : { shell, args: [\"-c\"] };\n}\n\nfunction findBashOnPath(): string | null {\n\tif (process.platform === \"win32\") {\n\t\t// Windows: Use 'where' and verify file exists (where can return non-existent paths)\n\t\ttry {\n\t\t\tconst result = spawnSync(\"where\", [\"bash.exe\"], {\n\t\t\t\tencoding: \"utf-8\",\n\t\t\t\ttimeout: 5000,\n\t\t\t\twindowsHide: true,\n\t\t\t});\n\t\t\tif (result.status === 0 && result.stdout) {\n\t\t\t\tconst firstMatch = result.stdout.trim().split(/\\r?\\n/)[0];\n\t\t\t\tif (firstMatch && existsSync(firstMatch)) {\n\t\t\t\t\treturn firstMatch;\n\t\t\t\t}\n\t\t\t}\n\t\t} catch {\n\t\t\t// Ignore errors\n\t\t}\n\t\treturn null;\n\t}\n\n\t// Unix: Use 'which' and trust its output (handles Termux and special filesystems)\n\ttry {\n\t\tconst result = spawnSync(\"which\", [\"bash\"], { encoding: \"utf-8\", timeout: 5000 });\n\t\tif (result.status === 0 && result.stdout) {\n\t\t\tconst firstMatch = result.stdout.trim().split(/\\r?\\n/)[0];\n\t\t\tif (firstMatch) {\n\t\t\t\treturn firstMatch;\n\t\t\t}\n\t\t}\n\t} catch {\n\t\t// Ignore errors\n\t}\n\treturn null;\n}\n\n/**\n * Resolve shell configuration based on platform and an optional explicit shell path.\n * Resolution order:\n * 1. User-specified shellPath\n * 2. On Windows: Git Bash in known locations, then bash on PATH\n * 3. On Unix: /bin/bash, then bash on PATH, then fallback to sh\n */\nexport function getShellConfig(customShellPath?: string): ShellConfig {\n\t// 1. Check user-specified shell path\n\tif (customShellPath) {\n\t\tif (existsSync(customShellPath)) {\n\t\t\treturn getBashShellConfig(customShellPath);\n\t\t}\n\t\tthrow new Error(`Custom shell path not found: ${customShellPath}`);\n\t}\n\n\tif (process.platform === \"win32\") {\n\t\t// 2. Try Git Bash in known locations\n\t\tconst paths: string[] = [];\n\t\tconst programFiles = process.env.ProgramFiles;\n\t\tif (programFiles) {\n\t\t\tpaths.push(`${programFiles}\\\\Git\\\\bin\\\\bash.exe`);\n\t\t}\n\t\tconst programFilesX86 = process.env[\"ProgramFiles(x86)\"];\n\t\tif (programFilesX86) {\n\t\t\tpaths.push(`${programFilesX86}\\\\Git\\\\bin\\\\bash.exe`);\n\t\t}\n\n\t\tfor (const path of paths) {\n\t\t\tif (existsSync(path)) {\n\t\t\t\treturn getBashShellConfig(path);\n\t\t\t}\n\t\t}\n\n\t\t// 3. Fallback: search bash.exe on PATH (Cygwin, MSYS2, WSL, etc.)\n\t\tconst bashOnPath = findBashOnPath();\n\t\tif (bashOnPath) {\n\t\t\treturn getBashShellConfig(bashOnPath);\n\t\t}\n\n\t\tthrow new Error(\n\t\t\t`No bash shell found. Options:\\n` +\n\t\t\t\t` 1. Install Git for Windows: https://git-scm.com/download/win\\n` +\n\t\t\t\t` 2. Add your bash to PATH (Cygwin, MSYS2, etc.)\\n` +\n\t\t\t\t\" 3. Set shellPath in settings.json\\n\\n\" +\n\t\t\t\t`Searched Git Bash in:\\n${paths.map((p) => ` ${p}`).join(\"\\n\")}`,\n\t\t);\n\t}\n\n\t// Unix: try /bin/bash, then bash on PATH, then fallback to sh\n\tif (existsSync(\"/bin/bash\")) {\n\t\treturn getBashShellConfig(\"/bin/bash\");\n\t}\n\n\tconst bashOnPath = findBashOnPath();\n\tif (bashOnPath) {\n\t\treturn getBashShellConfig(bashOnPath);\n\t}\n\n\treturn { shell: \"sh\", args: [\"-c\"] };\n}\n","// @ts-nocheck — vendored Pi source (coding-agent src/core/resolve-config-value.ts @47f9438, MIT, see ./PI-LICENSE);\n// imports remapped (getShellConfig → vendored excerpt), logic unchanged.\n/**\n * Resolve configuration values that may be shell commands, environment variables, or literals.\n * Used by auth-storage.ts and model-registry.ts.\n */\n\nimport { execSync, spawnSync } from \"child_process\";\nimport { getShellConfig } from \"./pi-shell-config.js\";\n\n// Cache for shell command results (persists for process lifetime)\nconst commandResultCache = new Map<string, string | undefined>();\nconst ENV_VAR_NAME_RE = /^[A-Za-z_][A-Za-z0-9_]*$/;\nconst ENV_VAR_NAME_PREFIX_RE = /^[A-Za-z_][A-Za-z0-9_]*/;\n\ntype TemplatePart = { type: \"literal\"; value: string } | { type: \"env\"; name: string };\n\ntype ConfigValueReference = { type: \"command\"; config: string } | { type: \"template\"; parts: TemplatePart[] };\n\nfunction appendLiteral(parts: TemplatePart[], value: string): void {\n\tif (!value) return;\n\tconst previousPart = parts[parts.length - 1];\n\tif (previousPart?.type === \"literal\") {\n\t\tpreviousPart.value += value;\n\t\treturn;\n\t}\n\tparts.push({ type: \"literal\", value });\n}\n\nfunction parseConfigValueTemplate(config: string): TemplatePart[] {\n\tconst parts: TemplatePart[] = [];\n\tlet index = 0;\n\n\twhile (index < config.length) {\n\t\tconst dollarIndex = config.indexOf(\"$\", index);\n\t\tif (dollarIndex < 0) {\n\t\t\tappendLiteral(parts, config.slice(index));\n\t\t\tbreak;\n\t\t}\n\n\t\tappendLiteral(parts, config.slice(index, dollarIndex));\n\t\tconst nextChar = config[dollarIndex + 1];\n\n\t\tif (nextChar === \"$\" || nextChar === \"!\") {\n\t\t\tappendLiteral(parts, nextChar);\n\t\t\tindex = dollarIndex + 2;\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (nextChar === \"{\") {\n\t\t\tconst endIndex = config.indexOf(\"}\", dollarIndex + 2);\n\t\t\tif (endIndex < 0) {\n\t\t\t\tappendLiteral(parts, \"$\");\n\t\t\t\tindex = dollarIndex + 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst name = config.slice(dollarIndex + 2, endIndex);\n\t\t\tif (ENV_VAR_NAME_RE.test(name)) {\n\t\t\t\tparts.push({ type: \"env\", name });\n\t\t\t} else {\n\t\t\t\tappendLiteral(parts, config.slice(dollarIndex, endIndex + 1));\n\t\t\t}\n\t\t\tindex = endIndex + 1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst match = config.slice(dollarIndex + 1).match(ENV_VAR_NAME_PREFIX_RE);\n\t\tif (match) {\n\t\t\tparts.push({ type: \"env\", name: match[0] });\n\t\t\tindex = dollarIndex + 1 + match[0].length;\n\t\t\tcontinue;\n\t\t}\n\n\t\tappendLiteral(parts, \"$\");\n\t\tindex = dollarIndex + 1;\n\t}\n\n\treturn parts;\n}\n\nfunction parseConfigValueReference(config: string): ConfigValueReference {\n\tif (config.startsWith(\"!\")) {\n\t\treturn { type: \"command\", config };\n\t}\n\n\treturn { type: \"template\", parts: parseConfigValueTemplate(config) };\n}\n\nfunction resolveEnvConfigValue(name: string, env?: Record<string, string>): string | undefined {\n\treturn env?.[name] || process.env[name] || undefined;\n}\n\nfunction getTemplateEnvVarNames(parts: TemplatePart[]): string[] {\n\tconst names: string[] = [];\n\tfor (const part of parts) {\n\t\tif (part.type !== \"env\" || names.includes(part.name)) continue;\n\t\tnames.push(part.name);\n\t}\n\treturn names;\n}\n\nfunction resolveTemplate(parts: TemplatePart[], env?: Record<string, string>): string | undefined {\n\tlet resolved = \"\";\n\tfor (const part of parts) {\n\t\tif (part.type === \"literal\") {\n\t\t\tresolved += part.value;\n\t\t\tcontinue;\n\t\t}\n\t\tconst envValue = resolveEnvConfigValue(part.name, env);\n\t\tif (envValue === undefined) return undefined;\n\t\tresolved += envValue;\n\t}\n\treturn resolved;\n}\n\nexport function getConfigValueEnvVarName(config: string): string | undefined {\n\tconst reference = parseConfigValueReference(config);\n\tif (reference.type !== \"template\") return undefined;\n\treturn reference.parts.length === 1 && reference.parts[0]?.type === \"env\" ? reference.parts[0].name : undefined;\n}\n\nexport function getConfigValueEnvVarNames(config: string): string[] {\n\tconst reference = parseConfigValueReference(config);\n\treturn reference.type === \"template\" ? getTemplateEnvVarNames(reference.parts) : [];\n}\n\nexport function getMissingConfigValueEnvVarNames(config: string, env?: Record<string, string>): string[] {\n\treturn getConfigValueEnvVarNames(config).filter((name) => resolveEnvConfigValue(name, env) === undefined);\n}\n\nexport function isCommandConfigValue(config: string): boolean {\n\treturn parseConfigValueReference(config).type === \"command\";\n}\n\nexport function isConfigValueConfigured(config: string, env?: Record<string, string>): boolean {\n\treturn getMissingConfigValueEnvVarNames(config, env).length === 0;\n}\n\n/**\n * Resolve a config value (API key, header value, etc.) to an actual value.\n * - If starts with \"!\", executes the rest as a shell command and uses stdout (cached)\n * - Interpolates \"$ENV_VAR\" or \"${ENV_VAR}\" references with the named environment variable\n * - In non-command values, \"$$\" escapes a literal \"$\" and \"$!\" escapes a literal \"!\"\n * - Otherwise treats the value as a literal\n */\nexport function resolveConfigValue(config: string, env?: Record<string, string>): string | undefined {\n\tconst reference = parseConfigValueReference(config);\n\tif (reference.type === \"command\") {\n\t\treturn executeCommand(reference.config);\n\t}\n\treturn resolveTemplate(reference.parts, env);\n}\n\nfunction executeWithConfiguredShell(command: string): { executed: boolean; value: string | undefined } {\n\ttry {\n\t\tconst { shell, args, commandTransport } = getShellConfig();\n\t\tconst commandFromStdin = commandTransport === \"stdin\";\n\t\tconst result = spawnSync(shell, commandFromStdin ? args : [...args, command], {\n\t\t\tencoding: \"utf-8\",\n\t\t\tinput: commandFromStdin ? command : undefined,\n\t\t\ttimeout: 10000,\n\t\t\tstdio: [commandFromStdin ? \"pipe\" : \"ignore\", \"pipe\", \"ignore\"],\n\t\t\tshell: false,\n\t\t\twindowsHide: true,\n\t\t});\n\n\t\tif (result.error) {\n\t\t\tconst error = result.error as NodeJS.ErrnoException;\n\t\t\tif (error.code === \"ENOENT\") {\n\t\t\t\treturn { executed: false, value: undefined };\n\t\t\t}\n\t\t\treturn { executed: true, value: undefined };\n\t\t}\n\n\t\tif (result.status !== 0) {\n\t\t\treturn { executed: true, value: undefined };\n\t\t}\n\n\t\tconst value = (result.stdout ?? \"\").trim();\n\t\treturn { executed: true, value: value || undefined };\n\t} catch {\n\t\treturn { executed: false, value: undefined };\n\t}\n}\n\nfunction executeWithDefaultShell(command: string): string | undefined {\n\ttry {\n\t\tconst output = execSync(command, {\n\t\t\tencoding: \"utf-8\",\n\t\t\ttimeout: 10000,\n\t\t\tstdio: [\"ignore\", \"pipe\", \"ignore\"],\n\t\t});\n\t\treturn output.trim() || undefined;\n\t} catch {\n\t\treturn undefined;\n\t}\n}\n\nfunction executeCommandUncached(commandConfig: string): string | undefined {\n\tconst command = commandConfig.slice(1);\n\treturn process.platform === \"win32\"\n\t\t? (() => {\n\t\t\t\tconst configuredResult = executeWithConfiguredShell(command);\n\t\t\t\treturn configuredResult.executed ? configuredResult.value : executeWithDefaultShell(command);\n\t\t\t})()\n\t\t: executeWithDefaultShell(command);\n}\n\nfunction executeCommand(commandConfig: string): string | undefined {\n\tif (commandResultCache.has(commandConfig)) {\n\t\treturn commandResultCache.get(commandConfig);\n\t}\n\n\tconst result = executeCommandUncached(commandConfig);\n\tcommandResultCache.set(commandConfig, result);\n\treturn result;\n}\n\n/**\n * Resolve all header values using the same resolution logic as API keys.\n */\nexport function resolveConfigValueUncached(config: string, env?: Record<string, string>): string | undefined {\n\tconst reference = parseConfigValueReference(config);\n\tif (reference.type === \"command\") {\n\t\treturn executeCommandUncached(reference.config);\n\t}\n\treturn resolveTemplate(reference.parts, env);\n}\n\nexport function resolveConfigValueOrThrow(config: string, description: string, env?: Record<string, string>): string {\n\tconst resolvedValue = resolveConfigValueUncached(config, env);\n\tif (resolvedValue !== undefined) {\n\t\treturn resolvedValue;\n\t}\n\n\tconst reference = parseConfigValueReference(config);\n\tif (reference.type === \"command\") {\n\t\tthrow new Error(`Failed to resolve ${description} from shell command: ${reference.config.slice(1)}`);\n\t}\n\n\tif (reference.type === \"template\") {\n\t\tconst missingEnvVars = getMissingConfigValueEnvVarNames(config, env);\n\t\tif (missingEnvVars.length === 1) {\n\t\t\tthrow new Error(`Failed to resolve ${description} from environment variable: ${missingEnvVars[0]}`);\n\t\t}\n\t\tif (missingEnvVars.length > 1) {\n\t\t\tthrow new Error(`Failed to resolve ${description} from environment variables: ${missingEnvVars.join(\", \")}`);\n\t\t}\n\t}\n\n\tthrow new Error(`Failed to resolve ${description}`);\n}\n\n/**\n * Resolve all header values using the same resolution logic as API keys.\n */\nexport function resolveHeaders(\n\theaders: Record<string, string> | undefined,\n\tenv?: Record<string, string>,\n): Record<string, string> | undefined {\n\tif (!headers) return undefined;\n\tconst resolved: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tconst resolvedValue = resolveConfigValue(value, env);\n\t\tif (resolvedValue) {\n\t\t\tresolved[key] = resolvedValue;\n\t\t}\n\t}\n\treturn Object.keys(resolved).length > 0 ? resolved : undefined;\n}\n\nexport function resolveHeadersOrThrow(\n\theaders: Record<string, string> | undefined,\n\tdescription: string,\n\tenv?: Record<string, string>,\n): Record<string, string> | undefined {\n\tif (!headers) return undefined;\n\tconst resolved: Record<string, string> = {};\n\tfor (const [key, value] of Object.entries(headers)) {\n\t\tresolved[key] = resolveConfigValueOrThrow(value, `${description} header \"${key}\"`, env);\n\t}\n\treturn Object.keys(resolved).length > 0 ? resolved : undefined;\n}\n\n/** Clear the config value command cache. Exported for testing. */\nexport function clearConfigValueCache(): void {\n\tcommandResultCache.clear();\n}\n","// Pi's standard custom-model registry: ~/.pi/agent/models.json (redirected under\n// DSH's home by the vendored getAgentDir). The file is loaded and composed with\n// vendored Pi sources — ModelConfig (schema + parse), applyModelsJson /\n// applyModelOverride (config → Model projection) and resolve-config-value\n// ($ENV interpolation, !command execution) — so user-defined providers appear\n// in modelRegistry.find() and resolve credentials with Pi's exact semantics.\n// This is the configuration channel pi-vision-tool and the wider custom-model\n// plugin family document for their users.\nimport { join } from 'node:path'\nimport { getAgentDir } from './compat/vendor/pi-config-shim.js'\nimport { ModelConfig, type ModelsJsonProvider } from './compat/vendor/pi-model-config.js'\nimport { applyModelOverride, applyModelsJson } from './compat/vendor/pi-models-compose.js'\nimport {\n isCommandConfigValue,\n isConfigValueConfigured,\n getConfigValueEnvVarNames,\n resolveConfigValueOrThrow,\n resolveHeadersOrThrow,\n} from './compat/vendor/pi-resolve-config-value.js'\n\ntype UnknownRecord = Record<string, unknown>\n\nexport interface ModelsJsonSnapshot {\n models: UnknownRecord[]\n providers: Map<string, ModelsJsonProvider>\n errors: string[]\n}\n\nexport type ResolvedModelsJsonAuth =\n | { ok: true; apiKey?: string; headers?: Record<string, string> }\n | { ok: false; error: string }\n\nexport function modelsJsonPath(): string {\n return join(getAgentDir(), 'models.json')\n}\n\nconst emptySnapshot = (): ModelsJsonSnapshot => ({ models: [], providers: new Map(), errors: [] })\n\n/**\n * One load of models.json projected to Pi Model objects. Mirrors Pi's\n * composeModelProvider composition order: base (builtin) models →\n * applyModelsJson upserts → modelOverrides as the topmost user-config layer.\n * A provider that fails composition contributes an error and is skipped —\n * the same per-entry isolation the rest of the bridge applies to extensions.\n */\nexport async function loadModelsJsonSnapshot(\n baseProviderOf?: (providerId: string) => Promise<UnknownRecord | undefined>,\n): Promise<ModelsJsonSnapshot> {\n const snapshot = emptySnapshot()\n const config = await ModelConfig.load(modelsJsonPath())\n const loadError = config.getError()\n if (loadError !== undefined) {\n snapshot.errors.push(loadError)\n return snapshot\n }\n for (const providerId of config.getProviderIds()) {\n const providerConfig = config.getProvider(providerId)\n if (providerConfig === undefined) continue\n try {\n const base = await baseProviderOf?.(providerId)\n const baseModels = typeof (base as { getModels?: unknown } | undefined)?.getModels === 'function'\n ? (base as { getModels(): UnknownRecord[] }).getModels()\n : []\n const composed = applyModelsJson(providerId, baseModels, providerConfig).map(model => {\n const override = providerConfig.modelOverrides?.[String((model as UnknownRecord).id)]\n return override ? applyModelOverride(model, override) : model\n })\n snapshot.models.push(...(composed as UnknownRecord[]))\n snapshot.providers.set(providerId, providerConfig)\n } catch (error) {\n snapshot.errors.push(error instanceof Error ? error.message : String(error))\n }\n }\n return snapshot\n}\n\n/**\n * Pi's configured-auth answer for a models.json provider, following\n * composeApiKeyAuth.resolve + withConfiguredAuth and the registry's\n * translation of their failures:\n * - a configured apiKey resolves through $ENV/!command or fails loudly with\n * the resolver's message;\n * - authHeader folds the resolved key into an Authorization header and,\n * without a key, becomes Pi's \"No API key found\" answer;\n * - a provider with neither key nor authHeader answers with its resolved\n * headers only (the registry's compatibility path).\n */\nexport function resolveModelsJsonAuth(providerId: string, provider: ModelsJsonProvider): ResolvedModelsJsonAuth {\n try {\n const headers = resolveHeadersOrThrow(provider.headers, `provider \"${providerId}\"`)\n const rawKey = provider.apiKey\n if (rawKey === undefined) {\n if (provider.authHeader ?? false) return { ok: false, error: `No API key found for \"${providerId}\"` }\n return { ok: true, ...(headers === undefined ? {} : { headers }) }\n }\n const apiKey = resolveConfigValueOrThrow(rawKey, `API key for provider \"${providerId}\"`)\n const merged = (provider.authHeader ?? false)\n ? { ...headers, Authorization: `Bearer ${apiKey}` }\n : headers\n return { ok: true, apiKey, ...(merged === undefined ? {} : { headers: merged }) }\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) }\n }\n}\n\n/**\n * Pi's withConfiguredAuth layered over an auth resolved by another family\n * (an extension-registered provider or a builtin): models.json headers\n * override the resolved ones, and authHeader folds the resolved key into\n * an Authorization header — failing loudly without one, as Pi does.\n */\nexport function applyModelsJsonConfiguredAuth(\n providerId: string,\n provider: ModelsJsonProvider,\n auth: { apiKey?: string; headers?: Record<string, string> },\n): { ok: true; apiKey?: string; headers?: Record<string, string> } | { ok: false; error: string } {\n try {\n const configured = resolveHeadersOrThrow(provider.headers, `provider \"${providerId}\"`)\n let headers = auth.headers || configured ? { ...auth.headers, ...configured } : undefined\n if (provider.authHeader ?? false) {\n if (auth.apiKey === undefined) return { ok: false, error: `No API key found for \"${providerId}\"` }\n headers = { ...headers, Authorization: `Bearer ${auth.apiKey}` }\n }\n return {\n ok: true,\n ...(auth.apiKey === undefined ? {} : { apiKey: auth.apiKey }),\n ...(headers === undefined ? {} : { headers }),\n }\n } catch (error) {\n return { ok: false, error: error instanceof Error ? error.message : String(error) }\n }\n}\n\n/**\n * One models.json provider as a Pi Provider object: the composed Pi Models\n * as its catalog and Pi's per-api wire clients as its transport (attached by\n * the provider adapter's synthesis). Registered as a DSH llm route, this\n * makes the DSH directory the single model directory — the Pi registry\n * projects it back, and registry.getProvider() answers a genuine Pi\n * Provider, so packages that stream through the provider surface work\n * unchanged.\n */\nexport function modelsJsonPiProvider(\n providerId: string,\n provider: ModelsJsonProvider,\n models: UnknownRecord[],\n): UnknownRecord {\n return {\n id: providerId,\n name: provider.name ?? providerId,\n ...(provider.baseUrl === undefined ? {} : { baseUrl: provider.baseUrl }),\n ...(provider.api === undefined ? {} : { api: provider.api }),\n getModels: () => models,\n }\n}\n\n/**\n * Pi's configured-check (not liveness) for a models.json provider — the\n * configuredRequestAuthStatus semantics: a literal or !command key counts as\n * configured, a templated key counts only when its env vars are present, and\n * a provider without an apiKey defers to the other credential families.\n */\nexport function modelsJsonAuthConfigured(provider: ModelsJsonProvider): boolean | undefined {\n const value = provider.apiKey\n if (value === undefined) return undefined\n if (isCommandConfigValue(value)) return true\n if (getConfigValueEnvVarNames(value).length > 0) return isConfigValueConfigured(value)\n return true\n}\n","// Pi provider → DSH llm route. Every Pi provider — package-registered or\n// models.json-defined — becomes a real DSH adapter through the public\n// `llm.registerAdapter` seam, so the DSH llm directory is the ONE model\n// directory both worlds read: DSH routes to these models natively (loop,\n// child agents, hand-built calls), and the Pi registry is a projection of\n// that same directory. A provider carrying its own transport (pi-ai\n// createProvider's stream) streams through it; a config-only provider gets\n// the real pi-ai wire client for each model's declared `api`. Credentials\n// resolve per request through Pi's own chain; the key rides the provider's\n// stream options and never enters logs.\n\nimport { anthropicMessagesApi, openAICompletionsApi, openAIResponsesApi } from './compat/pi-ai.js'\nimport { dshRequestToPiContext, piEventsToDshChunks } from './model-bridge.js'\n\ntype UnknownRecord = Record<string, unknown>\n\ninterface PiTransportProvider {\n stream(model: UnknownRecord, context: UnknownRecord, options: UnknownRecord): AsyncIterable<UnknownRecord>\n getModels?(): UnknownRecord[]\n name?: unknown\n [key: string]: unknown\n}\n\n// Pi's wire-protocol clients by models.json `api` value — the same registry\n// Pi's own composeModelProvider streams through. Each factory is the compat\n// lazy shell: it forwards to the REAL pi-ai when the host installs it and\n// fails explicitly otherwise.\nconst PI_API_FACTORIES: Record<string, () => unknown> = {\n 'openai-completions': openAICompletionsApi,\n 'openai-responses': openAIResponsesApi,\n 'anthropic-messages': anthropicMessagesApi,\n}\n\ninterface PiApiClient {\n stream(model: UnknownRecord, context: UnknownRecord, options: UnknownRecord): AsyncIterable<UnknownRecord>\n streamSimple?(model: UnknownRecord, context: UnknownRecord, options: UnknownRecord): AsyncIterable<UnknownRecord>\n}\n\nfunction piApiClientFor(api: unknown): PiApiClient | undefined {\n const factory = typeof api === 'string' ? PI_API_FACTORIES[api] : undefined\n return factory === undefined ? undefined : factory() as PiApiClient\n}\n\n/**\n * Give a config-only Pi provider (models.json entries, packages that declare\n * models without a stream) Pi's own transport: each call dispatches on the\n * model's declared `api` to the real pi-ai client, exactly as Pi's\n * provider composer does. Undispatchable providers (no models, or an api\n * with no client) answer undefined and stay off the directory.\n */\nexport function withSynthesizedTransport(provider: UnknownRecord): (PiTransportProvider & UnknownRecord) | undefined {\n const models = typeof (provider as { getModels?: unknown }).getModels === 'function'\n ? (provider as { getModels(): UnknownRecord[] }).getModels()\n : Array.isArray(provider.models) ? provider.models as UnknownRecord[] : []\n if (models.length === 0) return undefined\n if (!models.some(model => piApiClientFor(model.api) !== undefined)) return undefined\n const dispatch = (simple: boolean) =>\n (model: UnknownRecord, context: UnknownRecord, options: UnknownRecord): AsyncIterable<UnknownRecord> => {\n const client = piApiClientFor(model.api)\n if (client === undefined) {\n throw new Error(`pi2dsh: no wire-protocol client for api ${JSON.stringify(String(model.api))} (model ${String(model.provider)}/${String(model.id)})`)\n }\n const call = simple ? client.streamSimple ?? client.stream : client.stream\n return call.call(client, model, context, options)\n }\n return {\n ...provider,\n getModels: () => models,\n stream: dispatch(false),\n streamSimple: dispatch(true),\n }\n}\n\nexport interface ProviderAdapterHost {\n /** Pi's full credential chain for this provider (stored OAuth → stored key → ambient env). */\n resolveAuth(): Promise<{ auth?: UnknownRecord } | undefined>\n warn(message: string): void\n}\n\nexport function providerCarriesTransport(value: UnknownRecord | undefined): value is PiTransportProvider & UnknownRecord {\n return typeof value?.stream === 'function'\n}\n\nfunction providerModels(provider: PiTransportProvider): UnknownRecord[] {\n try {\n const models = provider.getModels?.()\n return Array.isArray(models) ? models : []\n } catch {\n return []\n }\n}\n\n// Pi Model fields a directory entry may carry (mirrored by the projection's\n// exit restore). A whitelist, never a spread: DSH assigns its own meanings to\n// names like reasoning/context/description, and a Pi-shaped value under those\n// names corrupts the directory contract.\nconst PI_CARRIED_FIELDS = [\n 'api', 'baseUrl', 'cost', 'contextWindow', 'maxTokens', 'samplingParams', 'thinkingLevelMap', 'compat', 'headers',\n] as const\n\nfunction piCarriedFields(model: UnknownRecord): UnknownRecord {\n const carried: UnknownRecord = {}\n for (const field of PI_CARRIED_FIELDS) {\n if (model[field] !== undefined) carried[field] = model[field]\n }\n return carried\n}\n\n/**\n * Wrap one Pi provider object as a DSH LlmAdapter-shaped route handler.\n * Structural typing carries it through `llm.registerAdapter`.\n */\nexport function piProviderDshAdapter(providerId: string, provider: PiTransportProvider, host: ProviderAdapterHost): UnknownRecord {\n return {\n providerInfo: (id: string) => ({ id, name: typeof provider.name === 'string' ? provider.name : id }),\n providerRetryPolicy: () => undefined,\n // The directory entry carries the Pi model's OWN fields (api, baseUrl,\n // cost, sampling params, …) alongside the DSH directory fields, so the\n // Pi registry projection restores an exact Pi Model and packages never\n // see that a DSH directory sat in between. Carriage is a whitelist:\n // names DSH gives its own meaning (reasoning is Pi's boolean but DSH's\n // {efforts} object) must never ride through with the Pi shape.\n listModels: async (id: string) => providerModels(provider).map(model => ({\n ...piCarriedFields(model),\n provider: id,\n id: String(model.id ?? ''),\n name: String(model.name ?? model.id ?? ''),\n ...(Array.isArray(model.input) ? { inputModalities: (model.input as string[]).filter(m => m === 'text' || m === 'image') } : {}),\n })),\n resolveModel: async (id: string, modelId: string) => {\n const known = providerModels(provider).find(model => model.id === modelId)\n return {\n ...(known === undefined ? {} : piCarriedFields(known)),\n provider: id,\n id: modelId,\n name: String(known?.name ?? modelId),\n ...(typeof known?.contextWindow === 'number' ? { context: { contextWindow: known.contextWindow } } : {}),\n ...(typeof known?.maxTokens === 'number' ? { defaultMaxTokens: known.maxTokens } : {}),\n }\n },\n async *stream(options: UnknownRecord): AsyncIterable<UnknownRecord> {\n const resolved = await host.resolveAuth()\n const auth = resolved?.auth as UnknownRecord | undefined\n const modelId = String(options.model ?? '')\n // The provider's own model entry keeps its api/thinking metadata; an\n // unlisted id passes through as pi-ai's advisory-catalog contract allows.\n const model = providerModels(provider).find(entry => entry.id === modelId)\n ?? { id: modelId, provider: providerId }\n const piContext = dshRequestToPiContext(options)\n const piOptions: UnknownRecord = {\n ...(auth?.apiKey === undefined ? {} : { apiKey: auth.apiKey }),\n ...(auth?.baseUrl === undefined ? {} : { baseUrl: auth.baseUrl }),\n ...(auth?.headers === undefined ? {} : { headers: auth.headers }),\n ...(options.signal instanceof AbortSignal ? { signal: options.signal } : {}),\n ...(typeof options.maxTokens === 'number' ? { maxTokens: options.maxTokens } : {}),\n ...(typeof options.temperature === 'number' ? { temperature: options.temperature } : {}),\n }\n yield* piEventsToDshChunks(provider.stream(model, piContext, piOptions))\n },\n }\n}\n\nexport interface RegisterPiProviderRouteOptions {\n llm: { registerAdapter(providers: string[], adapter: unknown): () => void } | undefined\n providerId: string\n provider: UnknownRecord\n host: ProviderAdapterHost\n}\n\n/**\n * Register the provider as a live DSH route when an llm service is mounted.\n * A provider carrying its own transport streams through it; a config-only\n * provider gets Pi's synthesized per-api transport. A route conflict (an\n * adapter already owns the name — e.g. a deployment-configured `deepseek`)\n * keeps the existing route and reports the skip.\n * @returns the route disposer, or undefined when nothing was registered.\n */\nexport function registerPiProviderRoute(options: RegisterPiProviderRouteOptions): (() => void) | undefined {\n const { llm, providerId, provider, host } = options\n if (llm === undefined) return undefined\n const transport = providerCarriesTransport(provider) ? provider : withSynthesizedTransport(provider)\n if (transport === undefined) return undefined\n try {\n return llm.registerAdapter([providerId], piProviderDshAdapter(providerId, transport, host))\n } catch (error) {\n host.warn(`[pi2dsh] Pi provider ${JSON.stringify(providerId)} was not added as a DSH llm route (${error instanceof Error ? error.message : String(error)}); the existing route keeps the name`)\n return undefined\n }\n}\n","import { access, readFile } from 'node:fs/promises'\nimport { EventEmitter } from 'node:events'\nimport { AsyncLocalStorage } from 'node:async_hooks'\nimport { createRequire } from 'node:module'\nimport { fileURLToPath } from 'node:url'\nimport { dirname, join } from 'node:path'\nimport { createJiti } from 'jiti'\nimport type { Context } from '@deepseek-ai/cordis'\nimport { createUserMessage, type ContentBlock } from '@deepseek-ai/dsh-llm'\nimport { renderPrompt } from '@deepseek-ai/dsh-system-prompt'\nimport type {\n PostToolDecision,\n PreToolDecision,\n ToolDefinition,\n ToolExecution,\n ToolExecutionResult,\n} from '@deepseek-ai/dsh-tools'\nimport type { GeneratedRuntimeManifest } from './types.js'\nimport { PiSessionBridge } from './session-bridge.js'\nimport { ExtensionRunner, Theme, __setSubagentSessionFactory, getAgentDir } from './compat/pi-coding-agent.js'\nimport { createBridgedAgentSession } from './subagent-bridge.js'\nimport {\n FileCredentialStore,\n loginPiProvider,\n providerSupportsOAuth,\n resolvePiProviderAuth,\n} from './oauth-bridge.js'\nimport { __setPiAiLlmBridge, builtinProviders, realBuiltinProvider } from './compat/pi-ai.js'\nimport { ModelCatalog, llmOf, streamViaDshLlm } from './model-bridge.js'\nimport {\n applyModelsJsonConfiguredAuth,\n loadModelsJsonSnapshot,\n modelsJsonAuthConfigured,\n modelsJsonPiProvider,\n resolveModelsJsonAuth,\n type ModelsJsonSnapshot,\n} from './models-json.js'\nimport { registerPiProviderRoute } from './provider-adapter.js'\n\ntype UnknownRecord = Record<string, unknown>\ntype PiHandler = (event: UnknownRecord, context: UnknownRecord) => unknown | Promise<unknown>\n\ninterface RuntimeOptions {\n rootUrl: URL\n manifest: GeneratedRuntimeManifest\n config?: UnknownRecord\n}\n\ninterface PiTool {\n name: string\n label?: string\n description: string\n parameters: unknown\n executionMode?: 'parallel' | 'sequential'\n prepareArguments?: (args: unknown) => unknown\n execute(\n toolCallId: string,\n args: unknown,\n signal: AbortSignal | undefined,\n onUpdate: ((result: unknown) => void) | undefined,\n context: UnknownRecord,\n ): Promise<unknown>\n}\n\ninterface PiCommand {\n name: string\n description: string\n argumentHint?: string\n handler(args: string, context: UnknownRecord): unknown | Promise<unknown>\n}\n\ninterface RuntimeState {\n handlers: Map<string, PiHandler[]>\n tools: Map<string, PiTool>\n // The Pi runner facade tool-catalog packages (pi-fabric) hook by patching\n // ExtensionRunner.prototype.getAllRegisteredTools; enumeration of Pi tools\n // goes through it so a patched prototype really filters the catalog.\n runner: ExtensionRunner\n toolDisposers: Map<string, () => void>\n toolRestrictions: WeakMap<object, () => void>\n pendingActiveTools?: string[]\n commands: Map<string, PiCommand>\n // DSH-side disposers for registered commands, so Pi's same-name\n // registerCommand replacement (Map.set semantics) can release the old one.\n commandDisposers: Map<string, () => void>\n flags: Map<string, boolean | string | undefined>\n notifications: string[]\n activeAgents: Set<UnknownRecord>\n disposedAgents: WeakSet<object>\n currentSystemPrompt: string\n messageSource: string\n eventBus: EventEmitter\n agentScope: AsyncLocalStorage<UnknownRecord | undefined>\n bridge: PiSessionBridge\n theme: Theme\n // Registered-but-headless surfaces: accepted so packages load and can\n // introspect their own registrations; DSH owns actual presentation.\n shortcuts: Map<string, UnknownRecord>\n messageRenderers: Map<string, unknown>\n entryRenderers: Map<string, unknown>\n markdownTransformer?: unknown\n providers: Map<string, UnknownRecord>\n // Pi-format auth.json store, created on first OAuth use; per-provider\n // serialized writes, atomic 0600 persistence (see oauth-bridge).\n oauthStore?: FileCredentialStore\n loginCommandRegistered?: boolean\n autocompleteProviders: unknown[]\n editorComponentFactory?: unknown\n editorBuffers: WeakMap<object, string>\n toolsExpanded: boolean\n // Per-agent model/thinking overrides applied through the agent/request waterfall.\n modelOverrides: WeakMap<object, { provider?: string; model?: string }>\n thinkingLevels: WeakMap<object, string>\n // Per-agent, per-turn system-prompt override returned by before_agent_start\n // (Pi resets to the base prompt when a turn's handlers return none).\n turnSystemPromptOverrides: WeakMap<object, string>\n globalThinkingLevel: string\n // Pi tool_call handlers mutate event.input in place; mutations apply to\n // pi2dsh-owned tools through this channel (DSH core deliberately forbids\n // rewriting exec.arguments for native tools).\n argMutations: WeakMap<object, unknown>\n // Streaming accumulation for message_update projection from assistant/chunk.\n streamingTexts: Map<string, string>\n // Last model id seen in a request/header event, for model_select projection.\n lastLoggedModels: WeakMap<object, string>\n // Pi Model catalog projected from the DSH llm service (empty without one).\n modelCatalog?: ModelCatalog\n // Pi's standard user-defined model registry: ~/.pi/agent/models.json under\n // the redirected agent dir, loaded before extensions and on refresh().\n modelsJson?: ModelsJsonSnapshot\n // models.json providers as Pi Provider objects (models + per-api\n // transport), registered as DSH llm routes; getProvider answers these.\n modelsJsonProviders: Map<string, UnknownRecord>\n // Live DSH llm routes registered for transport-carrying Pi providers.\n providerRouteDisposers: Map<string, () => void>\n}\n\ninterface PiExecOptions {\n signal?: AbortSignal\n timeout?: number\n cwd?: string\n}\n\ninterface DshSubprocessHandle {\n collected: {\n stdout?: { readFrom(offset: number): { text: string; lossy: boolean } }\n stderr?: { readFrom(offset: number): { text: string; lossy: boolean } }\n }\n done: Promise<{ exitCode: number | null; signal: string | null }>\n}\n\ninterface DshSubprocessService {\n resolveExecutable(command: string, env?: Readonly<Record<string, string>>, signal?: AbortSignal): Promise<string>\n spawn(spec: UnknownRecord): DshSubprocessHandle\n}\n\ninterface DshAgent extends UnknownRecord {\n steer(message: unknown): void\n followup(message: unknown): void\n inject(message: unknown): void\n}\n\nfunction logger(ctx: Context): { warn(message: string): void; info(message: string): void; debug(message: string): void } {\n const candidate = (ctx as unknown as { logger?: Partial<ReturnType<typeof logger>> }).logger\n return {\n warn: message => candidate?.warn?.(message) ?? console.warn(message),\n info: message => candidate?.info?.(message) ?? console.info(message),\n debug: message => candidate?.debug?.(message) ?? undefined,\n }\n}\n\nfunction cloneJson<T>(value: T): T {\n return structuredClone(value)\n}\n\nfunction jsonEqual(left: unknown, right: unknown): boolean {\n try {\n return JSON.stringify(left) === JSON.stringify(right)\n } catch {\n return false\n }\n}\n\nfunction jsonValue(value: unknown): unknown {\n if (value === undefined) return null\n try {\n return JSON.parse(JSON.stringify(value)) as unknown\n } catch {\n return String(value)\n }\n}\n\nfunction textBlocks(content: unknown): Array<{ type: 'text'; text: string }> {\n if (!Array.isArray(content)) return [{ type: 'text', text: String(content ?? '') }]\n return content.map((block): { type: 'text'; text: string } => {\n if (typeof block === 'object' && block !== null && (block as UnknownRecord).type === 'text') {\n return { type: 'text', text: String((block as UnknownRecord).text ?? '') }\n }\n if (typeof block === 'object' && block !== null && (block as UnknownRecord).type === 'image') {\n const mime = String((block as UnknownRecord).mimeType ?? 'image')\n return { type: 'text', text: `[Pi tool returned ${mime}; binary image output requires a native DSH attachment adapter]` }\n }\n return { type: 'text', text: String(block) }\n })\n}\n\nfunction normalizeToolResult(result: unknown): UnknownRecord {\n if (typeof result !== 'object' || result === null || Array.isArray(result)) {\n return { content: [{ type: 'text', text: String(result ?? '') }], details: null }\n }\n const record = result as UnknownRecord\n return {\n content: textBlocks(record.content),\n details: jsonValue(record.details),\n ...(record.isError === true ? { isError: true } : {}),\n ...(record.usage !== undefined ? { usage: jsonValue(record.usage) } : {}),\n ...(record.terminate === true ? { terminate: true } : {}),\n }\n}\n\nasync function piToDshContent(ctx: Context, content: unknown): Promise<ContentBlock[]> {\n const values = Array.isArray(content) ? content : [{ type: 'text', text: String(content ?? '') }]\n const blocks: ContentBlock[] = []\n for (const value of values) {\n if (typeof value !== 'object' || value === null) {\n blocks.push({ type: 'text', text: String(value) })\n continue\n }\n const block = value as UnknownRecord\n if (block.type === 'text') {\n blocks.push({ type: 'text', text: String(block.text ?? '') })\n continue\n }\n if (block.type !== 'image') {\n blocks.push({ type: 'text', text: String(value) })\n continue\n }\n const attachments = optionalService<{\n saveImage(input: { data: Uint8Array; mediaType: string; name?: string }): Promise<UnknownRecord>\n }>(ctx, 'attachments')\n if (attachments === undefined) {\n throw new Error('pi2dsh: Pi image content requires the DSH attachments service')\n }\n if (typeof block.data !== 'string' || typeof block.mimeType !== 'string') {\n throw new TypeError('pi2dsh: Pi image content requires base64 data and mimeType')\n }\n const attachment = await attachments.saveImage({\n data: Buffer.from(block.data, 'base64'),\n mediaType: block.mimeType,\n ...(typeof block.name === 'string' ? { name: block.name } : {}),\n })\n blocks.push({ type: 'image', attachment } as unknown as ContentBlock)\n }\n return blocks\n}\n\nasync function normalizeToolResultForDsh(ctx: Context, result: unknown): Promise<UnknownRecord> {\n if (typeof result !== 'object' || result === null || Array.isArray(result)) {\n return { content: [{ type: 'text', text: String(result ?? '') }], details: null }\n }\n const record = result as UnknownRecord\n return {\n content: await piToDshContent(ctx, record.content),\n details: jsonValue(record.details),\n ...(record.isError === true ? { isError: true } : {}),\n ...(record.usage !== undefined ? { usage: jsonValue(record.usage) } : {}),\n ...(record.terminate === true ? { terminate: true } : {}),\n }\n}\n\nconst SUPPORTED_SCHEMA_KEYS = new Set([\n 'type', 'oneOf', 'anyOf', 'properties', 'required', 'additionalProperties',\n 'items', 'enum', 'const', 'description', 'title', 'default', 'examples',\n])\n\nfunction normalizeSchemaNode(value: unknown, path: string, warnings: string[]): UnknownRecord {\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n warnings.push(`${path}: non-object schema replaced with unconstrained JSON`)\n return {}\n }\n const source = value as UnknownRecord\n const output: UnknownRecord = {}\n for (const key of Object.keys(source)) {\n if (!SUPPORTED_SCHEMA_KEYS.has(key)) warnings.push(`${path}.${key}: constraint is not enforced by DSH and was dropped`)\n }\n const type = source.type\n if (typeof type === 'string' && ['object', 'array', 'string', 'number', 'integer', 'boolean', 'null'].includes(type)) {\n output.type = type\n } else if (type !== undefined) {\n warnings.push(`${path}.type: unsupported type was dropped`)\n }\n const union = Array.isArray(source.oneOf) ? source.oneOf : Array.isArray(source.anyOf) ? source.anyOf : undefined\n if (union !== undefined) {\n if (source.anyOf !== undefined) warnings.push(`${path}.anyOf: converted to DSH exact-one oneOf semantics`)\n output.oneOf = union.map((entry, index) => normalizeSchemaNode(entry, `${path}.oneOf[${index}]`, warnings))\n delete output.type\n }\n if (output.type === 'object') {\n const properties = typeof source.properties === 'object' && source.properties !== null && !Array.isArray(source.properties)\n ? source.properties as UnknownRecord\n : {}\n output.properties = Object.fromEntries(\n Object.entries(properties).map(([key, entry]) => [key, normalizeSchemaNode(entry, `${path}.properties.${key}`, warnings)]),\n )\n if (Array.isArray(source.required)) output.required = source.required.filter(item => typeof item === 'string')\n if (typeof source.additionalProperties === 'boolean') output.additionalProperties = source.additionalProperties\n else if (source.additionalProperties !== undefined) {\n output.additionalProperties = true\n warnings.push(`${path}.additionalProperties: schema-valued form widened to true`)\n }\n }\n if (output.type === 'array' && source.items !== undefined) {\n output.items = normalizeSchemaNode(source.items, `${path}.items`, warnings)\n }\n if (Array.isArray(source.enum)) output.enum = source.enum.filter(item => item === null || ['string', 'number', 'boolean'].includes(typeof item))\n if (source.const === null || ['string', 'number', 'boolean'].includes(typeof source.const)) output.const = source.const\n for (const annotation of ['description', 'title'] as const) {\n if (typeof source[annotation] === 'string') output[annotation] = source[annotation]\n }\n for (const annotation of ['default', 'examples'] as const) {\n if (source[annotation] !== undefined) output[annotation] = jsonValue(source[annotation])\n }\n return output\n}\n\nexport function normalizeToolSchema(schema: unknown): { schema: UnknownRecord; warnings: string[] } {\n const warnings: string[] = []\n const normalized = normalizeSchemaNode(schema, '$', warnings)\n if (normalized.type !== 'object') {\n throw new TypeError('Pi tool parameters must use an object-root TypeBox schema')\n }\n return { schema: normalized, warnings }\n}\n\nfunction cwdOf(agent: UnknownRecord | undefined): string {\n const session = agent?.session\n if (typeof session === 'object' && session !== null) {\n const header = (session as UnknownRecord).header\n if (typeof header === 'object' && header !== null && typeof (header as UnknownRecord).cwd === 'string') {\n return (header as UnknownRecord).cwd as string\n }\n }\n return process.cwd()\n}\n\nfunction unsupported(name: string): never {\n throw new Error(`pi2dsh: Pi API ${name} requires a native DSH port; inspect the compatibility report`)\n}\n\nfunction optionalService<T>(ctx: Context, name: string): T | undefined {\n return (ctx as unknown as { get(name: string): unknown }).get(name) as T | undefined\n}\n\nfunction requireAgent(state: RuntimeState, operation: string): DshAgent {\n const agent = currentAgent(state)\n if (agent === undefined) {\n throw new Error(`pi2dsh: ${operation} requires one active DSH agent context`)\n }\n return agent as DshAgent\n}\n\nfunction answerText(answer: UnknownRecord | undefined): string | undefined {\n if (answer === undefined) return undefined\n if (typeof answer.custom === 'string' && answer.custom.length > 0) return answer.custom\n const selected = answer.selected\n return Array.isArray(selected) && typeof selected[0] === 'string' ? selected[0] : undefined\n}\n\nasync function askOne(\n ctx: Context,\n agent: UnknownRecord | undefined,\n signal: AbortSignal | undefined,\n question: UnknownRecord,\n): Promise<string | undefined> {\n const service = optionalService<{\n ask(request: UnknownRecord): Promise<{ answers: UnknownRecord[] }>\n }>(ctx, 'userQuestions')\n if (service === undefined) unsupported('ctx.ui AskUser')\n const result = await service.ask({ questions: [question], ...(agent !== undefined ? { agent } : {}), signal })\n return answerText(result.answers.find(answer => answer.id === question.id))\n}\n\nfunction agentSession(agent: UnknownRecord | undefined): { id: string; events: unknown } | undefined {\n const session = agent?.session\n if (typeof session !== 'object' || session === null) return undefined\n const record = session as UnknownRecord\n if (typeof record.id !== 'string') return undefined\n return record as unknown as { id: string; events: unknown }\n}\n\n// A child agent's session (subagent origin: reviewer sessions, tool workers)\n// is not a Pi host session; its lifecycle and event stream must never project\n// into the Pi extensions mounted on the parent.\nfunction isSubagentOrigin(subject: UnknownRecord | undefined): boolean {\n const session = (subject?.session ?? subject) as UnknownRecord | undefined\n const header = session?.header as UnknownRecord | undefined\n // The durable header carries creation meta FLATTENED (origin sits beside\n // id/cwd/parentSession); older/mock shapes may nest it under meta.\n return header?.origin === 'subagent'\n || (header?.meta as UnknownRecord | undefined)?.origin === 'subagent'\n || (session?.meta as UnknownRecord | undefined)?.origin === 'subagent'\n}\n\n// Pi ctx.model: a setModel() override wins; otherwise the live DSH agent's\n// own route (Agent.options.provider/model), enriched from the catalog.\nfunction currentPiModel(state: RuntimeState, agent: UnknownRecord): UnknownRecord | undefined {\n const override = state.modelOverrides.get(agent)\n const options = agent.options as { provider?: unknown, model?: unknown } | undefined\n const provider = String(override?.provider ?? options?.provider ?? '')\n const id = String(override?.model ?? options?.model ?? '')\n if (id.length === 0) return override\n const known = provider.length > 0 ? state.modelCatalog?.find(provider, id) : undefined\n return known ?? { id, name: id, provider, api: 'faux', input: ['text'], reasoning: false }\n}\n\nfunction thinkingLevelOf(state: RuntimeState, agent: UnknownRecord | undefined): string {\n if (agent !== undefined) {\n const scoped = state.thinkingLevels.get(agent)\n if (scoped !== undefined) return scoped\n }\n return state.globalThinkingLevel\n}\n\nfunction contextFor(\n ctx: Context,\n state: RuntimeState,\n agent: UnknownRecord | undefined,\n signal: AbortSignal | undefined,\n command = false,\n): UnknownRecord {\n const notices: string[] = []\n const userQuestions = optionalService(ctx, 'userQuestions')\n const ui = {\n notify(message: unknown) {\n const text = String(message)\n notices.push(text)\n state.notifications.push(text)\n logger(ctx).info(`[pi2dsh] ${text}`)\n },\n select: (title: unknown, options: unknown[]) => askOne(ctx, agent, signal, {\n id: 'pi2dsh-select',\n question: String(title),\n options: options.map(option => ({ label: String(option) })),\n }),\n async confirm(title: unknown, message: unknown) {\n return await askOne(ctx, agent, signal, {\n id: 'pi2dsh-confirm',\n question: String(title),\n detail: String(message),\n options: [{ label: 'Yes' }, { label: 'No' }],\n }) === 'Yes'\n },\n input: (title: unknown, placeholder?: unknown) => askOne(ctx, agent, signal, {\n id: 'pi2dsh-input',\n question: String(title),\n ...(placeholder === undefined ? {} : { detail: String(placeholder) }),\n }),\n editor: (title: unknown, prefill?: unknown) => askOne(ctx, agent, signal, {\n id: 'pi2dsh-editor',\n question: String(title),\n ...(prefill === undefined ? {} : { detail: `Current text:\\n${String(prefill)}` }),\n }),\n setStatus: () => undefined,\n setWidget: () => undefined,\n onTerminalInput: () => () => undefined,\n setWorkingMessage: () => undefined,\n setWorkingVisible: () => undefined,\n setWorkingIndicator: () => undefined,\n setHiddenThinkingLabel: () => undefined,\n setFooter: () => undefined,\n setHeader: () => undefined,\n setTitle: () => undefined,\n // Pi's own rpc mode resolves ui.custom to undefined; mirror that exactly.\n custom: async () => undefined,\n pasteToEditor(text: unknown) {\n if (agent !== undefined) {\n state.editorBuffers.set(agent, (state.editorBuffers.get(agent) ?? '') + String(text))\n }\n },\n setEditorText(text: unknown) {\n if (agent !== undefined) state.editorBuffers.set(agent, String(text))\n },\n getEditorText: () => (agent === undefined ? '' : state.editorBuffers.get(agent) ?? ''),\n addAutocompleteProvider(factory: unknown) {\n state.autocompleteProviders.push(factory)\n },\n setEditorComponent(factory: unknown) {\n state.editorComponentFactory = factory\n },\n getEditorComponent: () => state.editorComponentFactory,\n get theme() {\n return state.theme\n },\n getAllThemes: () => [{ name: state.theme.name, path: undefined }],\n getTheme: (name: string) => (name === state.theme.name ? state.theme : undefined),\n setTheme: (target: unknown) => (\n typeof target === 'object' || target === state.theme.name\n ? { success: true }\n : { success: false, error: `pi2dsh headless mode ships a single theme (${state.theme.name})` }\n ),\n getToolsExpanded: () => state.toolsExpanded,\n setToolsExpanded(expanded: unknown) {\n state.toolsExpanded = expanded === true\n },\n }\n const session = agentSession(agent)\n // Pi's ModelRegistry surface over the ONE model directory: every Pi\n // provider — package-registered or models.json-defined — is a DSH llm\n // route, and this registry is a faithful Pi projection of that directory\n // (route entries carry their full Pi Model fields through it). Neither\n // side sees the other: packages read exact Pi Models, DSH routes to\n // ordinary adapters. The provider-auth half resolves Pi's full credential\n // chain (vendored double-checked-lock refresh) against the Pi-format\n // auth.json and the models.json configured keys.\n const providerConfig = (name: string): UnknownRecord | undefined => state.providers.get(name)\n const catalog = state.modelCatalog\n // Directory membership comes from the DSH llm directory alone. The DSH\n // catalog channel detaches entries to its own metadata contract, so the\n // projection restores each Pi-native route's entry from the registration\n // source at the exit — packages read the EXACT Pi Model (api, baseUrl,\n // cost, …) they configured, and never see that a DSH directory sat in\n // between. DSH-owned routes project as-is.\n const piNativeEntry = (provider: string, id: string): UnknownRecord | undefined => {\n // Restore only entries OUR route registration put in the directory\n // (models.json providers survive in modelsJsonProviders exactly when\n // their route won the name; package providers restore only while they\n // own their route). A foreign adapter's models never wear a Pi-native\n // configuration's fields.\n const source = (state.modelsJsonProviders.get(provider)\n ?? (state.providerRouteDisposers.has(provider) ? state.providers.get(provider) : undefined)) as\n | { getModels?(): unknown; models?: unknown }\n | undefined\n if (source === undefined) return undefined\n let models: unknown\n try {\n models = typeof source.getModels === 'function' ? source.getModels() : source.models\n } catch {\n return undefined\n }\n if (!Array.isArray(models)) return undefined\n return (models as UnknownRecord[]).find(model => model.id === id)\n }\n const restorePiShape = (entry: UnknownRecord): UnknownRecord => {\n const native = piNativeEntry(String(entry.provider ?? ''), String(entry.id ?? ''))\n return native === undefined ? entry : { ...entry, ...native, provider: entry.provider }\n }\n const allModels = () => (catalog?.all() ?? []).map(restorePiShape)\n // THE one call path for every standard Pi model call: package → bridge →\n // DSH llm route → adapter. No provider surface hands a package a direct\n // wire transport; the wire clients live inside route adapters only.\n const dshRoutedStream = (model: UnknownRecord, context: UnknownRecord, options?: UnknownRecord) => {\n const llm = llmOf(ctx)\n if (llm === undefined) {\n throw new Error('pi2dsh: model calls need a DSH llm service; this composition mounts none')\n }\n return streamViaDshLlm(llm, { model, context, options: options as never })\n }\n const dshRoutedPiProvider = (base: UnknownRecord, providerId: string): UnknownRecord => ({\n ...base,\n id: providerId,\n getModels: () => allModels().filter(model => model.provider === providerId),\n stream: dshRoutedStream,\n streamSimple: dshRoutedStream,\n })\n const modelRegistry = {\n getAll: () => allModels(),\n getAvailable: () => allModels(),\n find: (provider: string, modelId: string) => {\n const entry = catalog?.find(provider, modelId)\n return entry === undefined ? undefined : restorePiShape(entry)\n },\n getError: () => {\n const problems = state.modelsJson?.errors ?? []\n return problems.length > 0 ? problems.join('\\n') : undefined\n },\n hasConfiguredAuth: (model: unknown) => {\n // Configuration check, not key liveness (Pi's is also a config check):\n // the route resolves iff its provider is in the live llm directory,\n // registered by a package, or configured in models.json. A models.json\n // apiKey answers with Pi's configured-status semantics (a templated key\n // counts only while its env vars are present).\n const provider = String((model as UnknownRecord | undefined)?.provider ?? '')\n if (provider.length === 0) return false\n const jsonProvider = state.modelsJson?.providers.get(provider)\n if (jsonProvider !== undefined) {\n const configured = modelsJsonAuthConfigured(jsonProvider)\n if (configured !== undefined) return configured\n }\n return state.providers.has(provider)\n || (catalog?.all() ?? []).some(entry => entry.provider === provider)\n || jsonProvider !== undefined\n },\n // Pi's per-model credential read, two families with one resolver:\n // package-registered providers use their own declared chain; DSH built-in\n // routes resolve through the REAL pi-ai's builtinProviders() definition —\n // the same source DSH's own llm adapter builds its directory from — so\n // env-held keys (e.g. DEEPSEEK_API_KEY) resolve with Pi's exact\n // semantics. Neither family fabricates a key: no resolution → not ok.\n getApiKeyAndHeaders: async (model: unknown) => {\n const provider = String((model as UnknownRecord | undefined)?.provider ?? '')\n // Pi's configured-key precedence (composeApiKeyAuth.resolve): a\n // package-registered provider keeps its own declared chain, a\n // models.json apiKey answers next, and builtin env resolution is the\n // inherited fallback. models.json headers/authHeader layer over the\n // other families' answers exactly like Pi's withConfiguredAuth.\n const jsonProvider = state.modelsJson?.providers.get(provider)\n const config = providerConfig(provider)\n ?? (jsonProvider?.apiKey !== undefined ? undefined : await realBuiltinProvider(provider))\n if (config !== undefined) {\n const resolved = await resolvePiProviderAuth({\n providerId: provider, providerConfig: config, store: oauthStoreOf(state),\n })\n const auth = resolved?.auth as UnknownRecord | undefined\n if (auth?.apiKey === undefined) return { ok: false }\n const configured = jsonProvider === undefined\n ? undefined\n : applyModelsJsonConfiguredAuth(provider, jsonProvider, {\n apiKey: auth.apiKey as string,\n ...(auth.headers === undefined ? {} : { headers: auth.headers as Record<string, string> }),\n })\n if (configured !== undefined && !configured.ok) return { ok: false, error: configured.error }\n const headers = configured?.ok ? configured.headers : auth.headers as Record<string, string> | undefined\n return {\n ok: true,\n apiKey: auth.apiKey,\n ...(headers === undefined ? {} : { headers }),\n ...(auth.baseUrl === undefined && config.baseUrl === undefined ? {} : { baseUrl: auth.baseUrl ?? config.baseUrl }),\n }\n }\n if (jsonProvider !== undefined) {\n const resolved = resolveModelsJsonAuth(provider, jsonProvider)\n if (!resolved.ok) return { ok: false, error: resolved.error }\n return {\n ok: true,\n ...(resolved.apiKey === undefined ? {} : { apiKey: resolved.apiKey }),\n ...(resolved.headers === undefined ? {} : { headers: resolved.headers }),\n }\n }\n // A DSH adapter route: its credential reference lives in the public\n // configurable-provider directory (settingsNs/settingsPath), the\n // profile's apiKeyEnv, and the credentials service — three public\n // seams, no name guessing. Any missing step answers not-ok honestly.\n try {\n const llm = llmOf(ctx) as unknown as { listConfigurableProviders?(): Array<{ provider: string, settingsNs: string, settingsPath: readonly string[] }> } | undefined\n const entry = llm?.listConfigurableProviders?.()?.find(candidate => candidate.provider === provider)\n if (entry === undefined) return { ok: false }\n const settings = (ctx as unknown as { get(name: string): unknown }).get('settings') as { get(ns: string): unknown } | undefined\n const section = settings?.get(entry.settingsNs)\n const profile = entry.settingsPath.reduce<unknown>(\n (node, key) => (typeof node === 'object' && node !== null ? (node as UnknownRecord)[key] : undefined),\n section,\n ) as UnknownRecord | undefined\n const ref = profile?.apiKeyEnv\n if (typeof ref !== 'string' || ref.length === 0) return { ok: false }\n const credentials = (ctx as unknown as { get(name: string): unknown }).get('credentials') as { resolve(ref: string): Promise<{ value?: string } | undefined> } | undefined\n const resolved = await credentials?.resolve(ref)\n if (typeof resolved?.value !== 'string' || resolved.value.length === 0) return { ok: false }\n return { ok: true, apiKey: resolved.value }\n } catch {\n return { ok: false }\n }\n },\n getProviderAuthStatus: (provider: string) =>\n providerSupportsOAuth(providerConfig(provider)) ? 'oauth' : 'none',\n // Every provider the directory carries answers as a Pi Provider whose\n // stream surface runs through the DSH llm route — packages never hold a\n // wire transport. A package-registered provider keeps its fields (Pi's\n // read-back contract) with its stream rerouted while its route is live;\n // a models.json provider exists exactly while its route does; a\n // DSH-owned route answers a synthesized Pi Provider over its directory\n // models.\n getProvider: (provider: string) => {\n const base = providerConfig(provider) ?? state.modelsJsonProviders.get(provider)\n if (base !== undefined) {\n const routed = state.providerRouteDisposers.has(provider)\n || state.providerRouteDisposers.has(`${MODELS_JSON_ROUTE_PREFIX}${provider}`)\n // A package provider that never became a route keeps its own object:\n // that transport is the package's own asset, not a bridge surface.\n return routed ? dshRoutedPiProvider(base, provider) : base\n }\n if ((catalog?.all() ?? []).some(entry => entry.provider === provider)) {\n return dshRoutedPiProvider({ id: provider, name: provider }, provider)\n }\n return undefined\n },\n // Pi's registry.complete: one designated-model call through the same\n // single path (the DSH llm route), collected to an AssistantMessage.\n complete: async (model: unknown, context: unknown, options?: unknown) => {\n const stream = dshRoutedStream(\n model as UnknownRecord,\n (context ?? {}) as UnknownRecord,\n options as UnknownRecord | undefined,\n ) as unknown as { result(): Promise<unknown> }\n const result = await stream.result()\n if (result instanceof Error) throw result\n return result\n },\n getRegisteredProviderConfig: (provider: string) => providerConfig(provider),\n getRegisteredProviderIds: () => [...state.providers.keys()],\n getProviderDisplayName: (provider: string) => {\n const config = providerConfig(provider) ?? state.modelsJsonProviders.get(provider)\n return typeof config?.name === 'string' ? config.name : provider\n },\n getProviderAuth: async (provider: string) => {\n const config = providerConfig(provider)\n if (config === undefined) return undefined\n const resolved = await resolvePiProviderAuth({\n providerId: provider, providerConfig: config, store: oauthStoreOf(state),\n })\n if (resolved?.auth === undefined) return resolved\n // Pi fills the provider's declared baseUrl when the credential itself\n // carries none (OAuth toAuth often returns just the key).\n return resolved.auth.baseUrl === undefined && config.baseUrl !== undefined\n ? { ...resolved, auth: { ...resolved.auth, baseUrl: config.baseUrl } }\n : resolved\n },\n getApiKeyForProvider: async (provider: string) => {\n const config = providerConfig(provider)\n if (config === undefined) return undefined\n const resolved = await resolvePiProviderAuth({\n providerId: provider, providerConfig: config, store: oauthStoreOf(state),\n })\n return (resolved?.auth as UnknownRecord | undefined)?.apiKey as string | undefined\n },\n isUsingOAuth: (model: unknown) => {\n const provider = String((model as UnknownRecord | undefined)?.provider ?? '')\n return provider.length > 0 && providerSupportsOAuth(providerConfig(provider))\n },\n refresh: async () => {\n // Pi's refresh() reloads models.json: routes re-register from the new\n // snapshot, then the directory projection re-reads.\n await reloadModelsJson(ctx, state)\n await catalog?.refresh()\n return { models: allModels(), errors: [...(state.modelsJson?.errors ?? [])] }\n },\n }\n const base: UnknownRecord = {\n ui,\n mode: 'rpc',\n hasUI: userQuestions !== undefined,\n cwd: cwdOf(agent),\n sessionManager: session === undefined\n ? state.bridge.readonlySessionManager({ id: 'pi2dsh-detached', events: [] }, cwdOf(agent))\n : state.bridge.readonlySessionManager(session as never, cwdOf(agent)),\n modelRegistry,\n // Current effective model: a setModel() override wins; otherwise the DSH\n // agent's own provider/model route (Agent.options), enriched from the\n // catalog when the entry is known there.\n model: agent === undefined ? undefined : currentPiModel(state, agent),\n scopedModels: catalog?.all() ?? [],\n thinkingLevel: thinkingLevelOf(state, agent),\n isIdle: () => command,\n isProjectTrusted: () => false,\n signal,\n abort: () => {\n const target = agent as { cancel?(cause: unknown): void } | undefined\n if (typeof target?.cancel !== 'function') unsupported('ctx.abort without a live DSH agent')\n target.cancel({ kind: 'hook', reason: 'pi2dsh: aborted by migrated Pi extension' })\n },\n hasPendingMessages: () => false,\n shutdown: () => unsupported('ctx.shutdown'),\n getContextUsage: () => undefined,\n compact: () => unsupported('ctx.compact'),\n getSystemPrompt: () => state.currentSystemPrompt,\n __agent: agent,\n __notices: notices,\n }\n if (command) {\n Object.assign(base, {\n getSystemPromptOptions: () => ({}),\n waitForIdle: async () => {\n const wait = agent?.whenIdle\n if (typeof wait === 'function') await wait.call(agent)\n },\n newSession: () => unsupported('ctx.newSession'),\n fork: () => unsupported('ctx.fork'),\n navigateTree: () => unsupported('ctx.navigateTree'),\n switchSession: () => unsupported('ctx.switchSession'),\n reload: () => unsupported('ctx.reload'),\n })\n }\n return base\n}\n\nasync function dispatch(\n state: RuntimeState,\n eventName: string,\n event: UnknownRecord,\n eventContext: UnknownRecord,\n): Promise<unknown[]> {\n const results: unknown[] = []\n const agent = eventContext.__agent as UnknownRecord | undefined\n for (const handler of state.handlers.get(eventName) ?? []) {\n results.push(await state.agentScope.run(agent, () => handler(event, eventContext)))\n }\n return results\n}\n\nfunction dshToPiContent(content: readonly ContentBlock[]): Array<UnknownRecord> {\n return content.map(block => {\n if (block.type === 'text') return { type: 'text', text: block.text }\n if (block.type === 'reasoning') return { type: 'thinking', thinking: block.text }\n if (block.type === 'tool-call') return { type: 'toolCall', id: block.id, name: block.name, arguments: block.arguments }\n return { type: block.type }\n })\n}\n\nfunction messageFromSessionEvent(event: UnknownRecord): UnknownRecord | undefined {\n const type = event.type\n const data = event.data\n if (typeof data !== 'object' || data === null) return undefined\n const record = data as UnknownRecord\n if (type === 'user/message') return { role: 'user', content: dshToPiContent((record.content ?? []) as ContentBlock[]) }\n if (type === 'assistant/message') {\n const message = record.message as UnknownRecord | undefined\n return { role: 'assistant', content: dshToPiContent((message?.content ?? []) as ContentBlock[]) }\n }\n if (type === 'tool/result') {\n const message = record.message as UnknownRecord | undefined\n const blocks = (message?.content ?? []) as Array<UnknownRecord>\n const tool = blocks.find(block => block.type === 'tool-result')\n return {\n role: 'toolResult',\n toolCallId: tool?.toolCallId,\n content: dshToPiContent((tool?.content ?? []) as ContentBlock[]),\n isError: tool?.isError === true,\n }\n }\n return undefined\n}\n\nfunction sourceReason(value: unknown): string {\n return value === 'resume' ? 'resume' : value === 'fork' ? 'fork' : 'startup'\n}\n\nfunction subscribeLifecycle(ctx: Context, state: RuntimeState): void {\n const cordis = ctx as unknown as {\n on(name: string, callback: (...args: any[]) => unknown, options?: unknown): () => void\n effect(callback: () => unknown, label?: string): unknown\n }\n const warn = (event: string, error: unknown) => logger(ctx).warn(`[pi2dsh] ${event} handler failed: ${String(error)}`)\n\n cordis.on('agent/session-start', (payload: UnknownRecord) => {\n const agent = payload.agent as UnknownRecord\n // Child agents (subagent-origin sessions — reviewer sessions, tool\n // workers) are NOT Pi host sessions: a Pi extension lives in exactly one\n // session, and leaking a child's lifecycle into it reads as \"a new\n // session started\" mid-turn (packages then reset their runtime state\n // while their own child is mid-flight). Track the agent for scoped\n // routing but never project the Pi lifecycle event.\n if (isSubagentOrigin(agent)) {\n state.activeAgents.add(agent)\n return\n }\n state.activeAgents.add(agent)\n const session = agentSession(agent)\n if (session !== undefined) state.bridge.load(session.id)\n if (state.pendingActiveTools !== undefined) {\n state.agentScope.run(agent, () => setActiveTools(ctx, state, state.pendingActiveTools!))\n }\n void dispatch(state, 'session_start', { type: 'session_start', reason: sourceReason(payload.source) }, contextFor(ctx, state, agent, undefined))\n .catch(error => warn('session_start', error))\n })\n cordis.on('agent/disposed', (payload: UnknownRecord) => {\n const agent = payload.agent as UnknownRecord\n state.activeAgents.delete(agent)\n if (typeof agent === 'object' && agent !== null) {\n state.toolRestrictions.get(agent)?.()\n state.toolRestrictions.delete(agent)\n }\n if (typeof agent === 'object' && agent !== null && !state.disposedAgents.has(agent)) {\n state.disposedAgents.add(agent)\n // Child-agent disposal is not the Pi host session shutting down.\n if (!isSubagentOrigin(agent)) {\n void dispatch(state, 'session_shutdown', { type: 'session_shutdown', reason: 'quit' }, contextFor(ctx, state, agent, undefined))\n .catch(error => warn('session_shutdown', error))\n }\n }\n })\n\n cordis.on('session/event', (session: UnknownRecord, event: UnknownRecord) => {\n // Child-agent sessions never project into the parent's Pi extensions.\n if (isSubagentOrigin(session)) return\n const agent = [...state.activeAgents].find(candidate => candidate.session === session)\n const eventContext = contextFor(ctx, state, agent, undefined)\n const type = event.type\n if (type === 'turn/start') {\n const turn = Number((event.data as UnknownRecord).turn ?? 1)\n void dispatch(state, 'agent_start', { type: 'agent_start' }, eventContext).catch(error => warn('agent_start', error))\n void dispatch(state, 'turn_start', { type: 'turn_start', turnIndex: turn - 1, timestamp: event.time ?? Date.now() }, eventContext)\n .catch(error => warn('turn_start', error))\n }\n if (type === 'tool/call') {\n const data = event.data as UnknownRecord\n let args: unknown = {}\n try { args = JSON.parse(String(data.arguments ?? '{}')) } catch { args = {} }\n void dispatch(state, 'tool_execution_start', {\n type: 'tool_execution_start', toolCallId: data.callId, toolName: data.name, args,\n }, eventContext).catch(error => warn('tool_execution_start', error))\n }\n if (type === 'assistant/chunk' && (state.handlers.get('message_update')?.length ?? 0) > 0) {\n const data = event.data as UnknownRecord\n const chunk = (data.chunk ?? {}) as UnknownRecord\n const key = `${String(session.id ?? '')}:${String(data.turn ?? 0)}:${String(data.step ?? 0)}`\n const delta = typeof chunk.text === 'string'\n ? chunk.text\n : typeof chunk.delta === 'string' ? chunk.delta : ''\n const accumulated = (state.streamingTexts.get(key) ?? '') + delta\n state.streamingTexts.set(key, accumulated)\n void dispatch(state, 'message_update', {\n type: 'message_update',\n message: { role: 'assistant', content: [{ type: 'text', text: accumulated }] },\n assistantMessageEvent: chunk,\n }, eventContext).catch(error => warn('message_update', error))\n }\n if (type === 'assistant/message') {\n const data = event.data as UnknownRecord\n state.streamingTexts.delete(`${String(session.id ?? '')}:${String(data.turn ?? 0)}:${String(data.step ?? 0)}`)\n }\n if (type === 'session/title') {\n const data = event.data as UnknownRecord\n void dispatch(state, 'session_info_changed', {\n type: 'session_info_changed', name: typeof data.title === 'string' ? data.title : undefined,\n }, eventContext).catch(error => warn('session_info_changed', error))\n }\n // DSH compaction events are facts from the durable log: the \"before\"\n // projection is advisory (cancel/replace cannot reach DSH's compactor),\n // and the \"after\" projection carries the summary when one was recorded.\n if (type === 'compaction/start') {\n void dispatch(state, 'session_before_compact', {\n type: 'session_before_compact',\n preparation: { ...(event.data as UnknownRecord) },\n branchEntries: [],\n reason: 'threshold',\n willRetry: false,\n }, eventContext).catch(error => warn('session_before_compact', error))\n }\n if (type === 'compaction/end' || type === 'compaction/summary') {\n const data = event.data as UnknownRecord\n void dispatch(state, 'session_compact', {\n type: 'session_compact',\n compactionEntry: {\n type: 'compaction',\n id: `dsh-${String(event.seq ?? '')}`,\n summary: typeof data.summary === 'string' ? data.summary : '',\n ...(data as object),\n },\n fromExtension: false,\n reason: 'threshold',\n willRetry: false,\n }, eventContext).catch(error => warn('session_compact', error))\n }\n if (type === 'request/header') {\n const header = ((event.data as UnknownRecord).header ?? {}) as UnknownRecord\n const model = header.model ?? (header as { config?: UnknownRecord }).config?.model\n if (model !== undefined && agent !== undefined) {\n const previous = state.lastLoggedModels.get(agent)\n if (previous !== undefined && previous !== String(model)) {\n void dispatch(state, 'model_select', {\n type: 'model_select',\n model: { id: String(model) },\n previousModel: { id: previous },\n source: 'set',\n }, eventContext).catch(error => warn('model_select', error))\n }\n state.lastLoggedModels.set(agent, String(model))\n }\n }\n const message = messageFromSessionEvent(event)\n if (message !== undefined) {\n void dispatch(state, 'message_start', { type: 'message_start', message }, eventContext)\n .then(() => dispatch(state, 'message_end', { type: 'message_end', message }, eventContext))\n .catch(error => warn('message lifecycle', error))\n }\n if (type === 'turn/end') {\n const data = event.data as UnknownRecord\n const turnIndex = Number(data.turn ?? 1) - 1\n const finalMessage = { role: 'assistant', content: [] }\n void dispatch(state, 'turn_end', { type: 'turn_end', turnIndex, message: finalMessage, toolResults: [] }, eventContext)\n .then(() => dispatch(state, 'agent_end', { type: 'agent_end', messages: [] }, eventContext))\n .then(() => dispatch(state, 'agent_settled', { type: 'agent_settled' }, eventContext))\n .catch(error => warn('turn end lifecycle', error))\n }\n })\n\n // Per-agent model/thinking overrides recorded by setModel()/setThinkingLevel()\n // are applied at the request boundary, DSH's sanctioned seam for call-config\n // replacement.\n cordis.on('agent/request', async (payload: UnknownRecord, next: () => Promise<UnknownRecord>) => {\n const config = await next()\n const agent = payload.agent as UnknownRecord | undefined\n if (agent === undefined) return config\n const override = state.modelOverrides.get(agent)\n const thinking = state.thinkingLevels.get(agent)\n if (override === undefined && thinking === undefined) return config\n return {\n ...config,\n ...(override?.provider === undefined ? {} : { provider: override.provider }),\n ...(override?.model === undefined ? {} : { model: override.model }),\n ...(thinking === undefined || thinking === 'off' ? {} : { reasoningEffort: thinking }),\n }\n })\n\n cordis.on('tools/result', (exec: ToolExecution, result: ToolExecutionResult) => {\n const agent = exec.agent as unknown as UnknownRecord | undefined\n void dispatch(state, 'tool_execution_end', {\n type: 'tool_execution_end',\n toolCallId: exec.callId,\n toolName: exec.name,\n result: { content: dshToPiContent(result.content), details: result.meta ?? null },\n isError: result.isError,\n }, contextFor(ctx, state, agent, exec.signal)).catch(error => warn('tool_execution_end', error))\n })\n\n cordis.effect(() => async () => {\n for (const agent of state.activeAgents) {\n if (typeof agent === 'object' && agent !== null && !state.disposedAgents.has(agent)) {\n state.disposedAgents.add(agent)\n await dispatch(state, 'session_shutdown', { type: 'session_shutdown', reason: 'quit' }, contextFor(ctx, state, agent, undefined))\n }\n }\n state.activeAgents.clear()\n for (const dispose of state.toolDisposers.values()) dispose()\n state.toolDisposers.clear()\n state.eventBus.removeAllListeners()\n }, 'pi2dsh session shutdown')\n}\n\nfunction subscribeInterceptors(ctx: Context, state: RuntimeState): void {\n const cordis = ctx as unknown as { on(name: string, callback: (...args: any[]) => unknown): () => void }\n cordis.on('tools/pre-execute', async (exec: ToolExecution, next: () => Promise<PreToolDecision>): Promise<PreToolDecision> => {\n const input = cloneJson(exec.arguments)\n const event: UnknownRecord = { type: 'tool_call', toolName: exec.name, toolCallId: exec.callId, input }\n const results = await dispatch(state, 'tool_call', event, contextFor(ctx, state, exec.agent as unknown as UnknownRecord, exec.signal))\n if (!jsonEqual(event.input, exec.arguments)) {\n if (state.tools.has(exec.name)) {\n // Pi semantics: tool_call handlers mutate event.input in place. For\n // pi2dsh-owned tools the mutation is applied inside our execute\n // wrapper; DSH-native tools cannot accept it because the core logs\n // arguments before policy on purpose.\n state.argMutations.set(exec as unknown as object, cloneJson(event.input))\n } else {\n return { kind: 'deny', reason: `pi2dsh: a Pi tool_call hook mutated arguments of native DSH tool ${JSON.stringify(exec.name)}; DSH logs arguments before policy, so this mutation cannot be honored` }\n }\n }\n for (const result of results) {\n if (typeof result === 'object' && result !== null && (result as UnknownRecord).block === true) {\n return { kind: 'deny', reason: String((result as UnknownRecord).reason ?? 'blocked by migrated Pi tool_call hook') }\n }\n }\n return next()\n })\n\n cordis.on('tools/post-execute', async (\n exec: ToolExecution,\n result: ToolExecutionResult,\n next: () => Promise<PostToolDecision>,\n ): Promise<PostToolDecision> => {\n const downstream = await next()\n if (downstream.kind === 'block') return downstream\n const event: UnknownRecord = {\n type: 'tool_result',\n toolName: exec.name,\n toolCallId: exec.callId,\n input: cloneJson(exec.arguments),\n content: dshToPiContent(result.content),\n details: result.meta ?? null,\n isError: result.isError,\n usage: undefined,\n }\n const results = await dispatch(state, 'tool_result', event, contextFor(ctx, state, exec.agent as unknown as UnknownRecord, exec.signal))\n for (const patch of results) {\n if (typeof patch !== 'object' || patch === null) continue\n Object.assign(event, patch)\n }\n const content = textBlocks(event.content)\n if (event.isError === true && !result.isError) return { kind: 'block', feedback: content }\n if (event.isError === false && result.isError) {\n logger(ctx).warn('[pi2dsh] a Pi tool_result hook attempted to recover a DSH error; error recovery was ignored')\n }\n if (!jsonEqual(event.content, dshToPiContent(result.content))) return { kind: 'accept', content }\n return downstream\n })\n\n // Pi's before_agent_start fires once per user prompt: after the user\n // message is known, before the first model call. DSH's agent/pre-step\n // waterfall is exactly that seam — the step-1 decision carries the turn's\n // entering user messages, so the Pi event sees the real prompt text and\n // image attachments (Pi's expandedText/currentImages), returned custom\n // messages join the step beside the user message as plugin-sourced context\n // (Pi's role:\"custom\" append), and a returned systemPrompt becomes this\n // turn's override, consumed by the assembly interceptor below and reset\n // next turn exactly as Pi resets to the base prompt.\n cordis.on('agent/pre-step', async (payload: UnknownRecord, next: () => Promise<UnknownRecord>) => {\n const decision = await next() as UnknownRecord & { kind?: string, messages?: UnknownRecord[] }\n if (decision.kind !== 'enter' || payload.step !== 1) return decision\n if ((state.handlers.get('before_agent_start')?.length ?? 0) === 0) return decision\n const agent = payload.agent as UnknownRecord\n if (isSubagentOrigin(agent)) return decision\n const signal = payload.signal as AbortSignal | undefined\n const messages = decision.messages ?? []\n const userMessages = messages.filter(message =>\n ((message as { source?: { kind?: string } }).source?.kind ?? 'user') === 'user')\n const prompt = userMessages\n .flatMap(message => textBlocks((message as { content?: unknown }).content))\n .map(block => block.text)\n .join('\\n')\n const images = await collectPiImages(ctx, userMessages)\n state.turnSystemPromptOverrides.delete(agent)\n const event: UnknownRecord = {\n type: 'before_agent_start',\n prompt,\n ...(images.length > 0 ? { images } : {}),\n systemPrompt: state.currentSystemPrompt,\n systemPromptOptions: {},\n }\n const results = await dispatch(state, 'before_agent_start', event, contextFor(ctx, state, agent, signal))\n const injected: UnknownRecord[] = []\n for (const result of results) {\n if (typeof result !== 'object' || result === null) continue\n const record = result as UnknownRecord\n if (typeof record.systemPrompt === 'string') {\n state.turnSystemPromptOverrides.set(agent, record.systemPrompt)\n event.systemPrompt = record.systemPrompt\n }\n const message = record.message as UnknownRecord | undefined\n if (message !== undefined) {\n const content = message.content\n const blocks = await piToDshContent(ctx, typeof content === 'string' ? [{ type: 'text', text: content }] : content ?? [])\n injected.push(createUserMessage({\n content: blocks,\n // piCustomType rides the merge-extensible source so the durable log\n // (and every later projection) keeps Pi's role:\"custom\" identity.\n source: {\n kind: 'plugin', plugin: state.messageSource,\n ...(typeof message.customType === 'string' ? { piCustomType: message.customType } : {}),\n },\n }) as unknown as UnknownRecord)\n }\n }\n const stepMessages = injected.length === 0 ? messages : [...messages, ...injected]\n // Pi's context event fires before every model call with the full message\n // array and may return a transformed copy. DSH's durable history is\n // append-only, so the projection splits: entered history is read-only,\n // and only this step's not-yet-entered messages accept the transform —\n // which is exactly the slice packages rewrite (their own custom messages\n // and the turn's user message, e.g. image placeholders → guide text).\n const transformed = await applyPiContextTransform(ctx, state, agent, signal, stepMessages)\n if (transformed === stepMessages && injected.length === 0) return decision\n return { ...decision, messages: transformed }\n })\n\n cordis.on('system-prompt/assemble', async (assembly: UnknownRecord, assembleContext: UnknownRecord, next: () => Promise<UnknownRecord>) => {\n const downstream = await next()\n if ((state.handlers.get('before_agent_start')?.length ?? 0) === 0) return downstream\n const original = renderPrompt(downstream as never)\n state.currentSystemPrompt = original\n const agent = (assembleContext.agent ?? assembleContext.scope) as UnknownRecord | undefined\n if (agent !== undefined && !isSubagentOrigin(agent)) {\n // A live agent assembly: the pre-step bridge above owns the Pi event\n // for its turn; this interceptor only applies the stored override.\n const override = state.turnSystemPromptOverrides.get(agent)\n if (override === undefined) return downstream\n state.currentSystemPrompt = override\n return { ...downstream, sections: [{ name: 'pi2dsh:system-prompt', text: override }] }\n }\n // No live agent (diagnostics, compositions without the agent loop): keep\n // the assembly-time dispatch so systemPrompt-replacement packages still\n // run; Pi's prompt/images/custom-message surfaces need a real turn.\n const event: UnknownRecord = {\n type: 'before_agent_start', prompt: '', systemPrompt: original, systemPromptOptions: {},\n }\n const results = await dispatch(state, 'before_agent_start', event, contextFor(ctx, state, assembleContext.scope as UnknownRecord, assembleContext.signal as AbortSignal | undefined))\n let replacement = original\n for (const result of results) {\n if (typeof result === 'object' && result !== null && typeof (result as UnknownRecord).systemPrompt === 'string') {\n replacement = (result as UnknownRecord).systemPrompt as string\n event.systemPrompt = replacement\n }\n }\n state.currentSystemPrompt = replacement\n return { ...downstream, sections: [{ name: 'pi2dsh:system-prompt', text: replacement }] }\n })\n}\n\n// Project one not-yet-entered DSH message as the Pi message shape context\n// handlers expect: a piCustomType source marker restores Pi's role:\"custom\"\n// identity, everything else is a user message.\nfunction piShapeOfPending(message: UnknownRecord): UnknownRecord {\n const source = message.source as UnknownRecord | undefined\n const content = dshToPiContent((message.content ?? []) as ContentBlock[])\n return typeof source?.piCustomType === 'string'\n ? { role: 'custom', customType: source.piCustomType, content }\n : { role: 'user', content }\n}\n\n// Pi's context event on the DSH seam: full history (read-only projection from\n// the durable log) plus this step's pending messages (transformable). A\n// handler's returned array must keep the length; only the pending tail is\n// applied, with each message's blocks rebuilt from the returned Pi content.\nasync function applyPiContextTransform(\n ctx: Context,\n state: RuntimeState,\n agent: UnknownRecord,\n signal: AbortSignal | undefined,\n pending: UnknownRecord[],\n): Promise<UnknownRecord[]> {\n if ((state.handlers.get('context')?.length ?? 0) === 0) return pending\n const session = agentSession(agent)\n const history: UnknownRecord[] = []\n for (const event of ((session?.events ?? []) as UnknownRecord[])) {\n const projected = messageFromSessionEvent(event)\n if (projected === undefined) continue\n if (event.type === 'user/message') {\n const customType = ((event.data as UnknownRecord | undefined)?.source as UnknownRecord | undefined)?.piCustomType\n if (typeof customType === 'string') {\n history.push({ ...projected, role: 'custom', customType })\n continue\n }\n }\n history.push(projected)\n }\n const projectedPending = pending.map(piShapeOfPending)\n const event: UnknownRecord = { type: 'context', messages: [...history, ...projectedPending] }\n const results = await dispatch(state, 'context', event, contextFor(ctx, state, agent, signal))\n let current = event.messages as UnknownRecord[]\n for (const result of results) {\n if (typeof result !== 'object' || result === null) continue\n const returned = (result as UnknownRecord).messages\n if (!Array.isArray(returned)) continue\n if (returned.length !== current.length) {\n logger(ctx).warn('[pi2dsh] a Pi context handler changed the message count; DSH durable history is append-only, so the transform was ignored')\n continue\n }\n current = returned as UnknownRecord[]\n }\n if (current === event.messages) return pending\n for (let index = 0; index < history.length; index++) {\n if (current[index] === history[index]) continue\n if (JSON.stringify(current[index]) === JSON.stringify(history[index])) continue\n logger(ctx).warn('[pi2dsh] a Pi context handler edited already-entered history; DSH durable history is append-only, so those edits were ignored (only this step\\'s not-yet-entered messages accept the transform)')\n break\n }\n const tail = current.slice(history.length)\n const rebuilt: UnknownRecord[] = []\n for (const [index, original] of pending.entries()) {\n const shape = tail[index]\n if (shape === undefined) { rebuilt.push(original); continue }\n const blocks = await piToDshContent(ctx, typeof shape.content === 'string'\n ? [{ type: 'text', text: shape.content }]\n : shape.content ?? [])\n rebuilt.push(createUserMessage({\n content: blocks,\n source: (original.source ?? { kind: 'plugin', plugin: state.messageSource }) as never,\n }) as unknown as UnknownRecord)\n }\n return rebuilt\n}\n\n// Pi's before_agent_start images: the entering user messages' image\n// attachments, read back from the DSH attachment store as base64\n// ImageContent. Messages without attachments (or compositions without the\n// attachment service) simply contribute none — the path-in-prompt flow the\n// vision packages document works either way.\nasync function collectPiImages(ctx: Context, messages: UnknownRecord[]): Promise<UnknownRecord[]> {\n const attachments = (ctx as unknown as { get(name: string): unknown }).get('attachments') as {\n readImage(attachment: unknown): Promise<{ data: ArrayBufferLike }>\n } | undefined\n if (attachments === undefined) return []\n const images: UnknownRecord[] = []\n for (const message of messages) {\n const content = (message as { content?: unknown }).content\n if (!Array.isArray(content)) continue\n for (const block of content as UnknownRecord[]) {\n if (block?.type !== 'image' || block.attachment === undefined) continue\n try {\n const stored = await attachments.readImage(block.attachment)\n images.push({\n type: 'image',\n data: Buffer.from(stored.data).toString('base64'),\n mimeType: String((block.attachment as UnknownRecord).mediaType ?? 'image/png'),\n })\n } catch {\n // An unreadable attachment contributes no image; Pi passes what exists.\n }\n }\n }\n return images\n}\n\nfunction oauthStoreOf(state: RuntimeState): FileCredentialStore {\n state.oauthStore ??= new FileCredentialStore(join(getAgentDir(), 'auth.json'))\n return state.oauthStore\n}\n\nconst MODELS_JSON_ROUTE_PREFIX = 'models.json/'\n\n// (Re)load Pi's models.json and register each provider as a DSH llm route —\n// the single-directory contract: models.json is a configuration ENTRY, the\n// DSH llm directory is the one runtime model directory, and the Pi registry\n// is its projection. Load errors warn per entry and surface via getError().\nasync function reloadModelsJson(ctx: Context, state: RuntimeState): Promise<void> {\n for (const [key, dispose] of state.providerRouteDisposers) {\n if (!key.startsWith(MODELS_JSON_ROUTE_PREFIX)) continue\n state.providerRouteDisposers.delete(key)\n dispose()\n }\n state.modelsJsonProviders.clear()\n state.modelsJson = await loadModelsJsonSnapshot(realBuiltinProvider)\n for (const problem of state.modelsJson.errors) logger(ctx).warn(`[pi2dsh] models.json: ${problem}`)\n for (const [providerId, providerConfig] of state.modelsJson.providers) {\n const models = state.modelsJson.models.filter(model => model.provider === providerId)\n const provider = modelsJsonPiProvider(providerId, providerConfig, models)\n const routeDisposer = registerPiProviderRoute({\n llm: llmOf(ctx) as never,\n providerId,\n provider,\n host: {\n resolveAuth: async () => {\n const resolved = resolveModelsJsonAuth(providerId, providerConfig)\n if (!resolved.ok) return undefined\n return {\n auth: {\n ...(resolved.apiKey === undefined ? {} : { apiKey: resolved.apiKey }),\n ...(resolved.headers === undefined ? {} : { headers: resolved.headers }),\n ...(providerConfig.baseUrl === undefined ? {} : { baseUrl: providerConfig.baseUrl }),\n },\n }\n },\n warn: message => logger(ctx).warn(message),\n },\n })\n // The directory is the only authority. A provider exists in the Pi\n // projection (getProvider, the exit-restore join) exactly when ITS route\n // registration owns the directory entries — a name conflict or a missing\n // llm service means this configuration is NOT in the directory, so it\n // must not answer anywhere (otherwise another adapter's models would\n // wear this configuration's baseUrl). The ledger keeps the DEFINITION\n // only; wire transports live inside the route adapter, and the provider\n // surface packages read streams through the DSH route (getProvider).\n if (routeDisposer !== undefined) {\n state.modelsJsonProviders.set(providerId, provider)\n state.providerRouteDisposers.set(`${MODELS_JSON_ROUTE_PREFIX}${providerId}`, routeDisposer)\n logger(ctx).info(`[pi2dsh] models.json provider ${JSON.stringify(providerId)} registered as a native DSH llm route (${models.length} models)`)\n }\n }\n}\n\n// Pi hosts ship /login <provider> as a built-in; register it once, the first\n// time an oauth-capable provider appears.\nfunction ensureLoginCommand(ctx: Context, state: RuntimeState): void {\n if (state.loginCommandRegistered === true) return\n state.loginCommandRegistered = true\n // A host bundle mounts several packages, each with its own runtime state;\n // the first mount wins the shared /login name. Later mounts must not fail\n // over a duplicate — their OAuth providers are served by builtin preload\n // parity, and a same-name registration would abort the whole package.\n try {\n registerLoginCommand(ctx, state)\n } catch (error) {\n logger(ctx).warn(`[pi2dsh] /login is already registered by an earlier package in this host; this package's providers use that command (${error instanceof Error ? error.message : String(error)})`)\n }\n}\n\nfunction registerLoginCommand(ctx: Context, state: RuntimeState): void {\n registerCommand(ctx, state, {\n name: 'login',\n description: 'Log in to a Pi provider through its own OAuth flow',\n argumentHint: '<provider>',\n async handler(args: string, commandContext: UnknownRecord) {\n const oauthProviders = [...state.providers.entries()]\n .filter(([, config]) => providerSupportsOAuth(config))\n .map(([name]) => name)\n if (oauthProviders.length === 0) throw new Error('no registered Pi provider supports OAuth login')\n const ui = commandContext.ui as {\n input(title: unknown, placeholder?: unknown): Promise<string | undefined>\n select(title: unknown, options: unknown[]): Promise<string | undefined>\n notify(message: unknown): void\n }\n let providerId = args.trim().split(/\\s+/u)[0] ?? ''\n if (providerId.length === 0) {\n providerId = oauthProviders.length === 1\n ? oauthProviders[0] as string\n : String(await ui.select('Log in to which provider?', oauthProviders) ?? '')\n }\n const config = state.providers.get(providerId)\n if (config === undefined || !providerSupportsOAuth(config)) {\n throw new Error(`unknown OAuth provider ${JSON.stringify(providerId)}; available: ${oauthProviders.join(', ')}`)\n }\n const oauthName = ((config.oauth as UnknownRecord | undefined)?.name as string | undefined) ?? providerId\n const commandSignal = commandContext.signal as AbortSignal | undefined\n await loginPiProvider({\n providerId,\n providerName: oauthName,\n providerConfig: config,\n store: oauthStoreOf(state),\n ui,\n ...(commandSignal !== undefined ? { signal: commandSignal } : {}),\n })\n ui.notify(`Logged in to ${oauthName}; credential stored in ${oauthStoreOf(state).path}`)\n return `Logged in to ${oauthName}`\n },\n })\n}\n\nfunction registerTool(ctx: Context, state: RuntimeState, tool: PiTool): void {\n // Pi's runner stores tools in a name-keyed Map (set + refreshTools):\n // re-registering a name replaces the previous definition. Mirror that —\n // catalog packages (pi-fabric) re-register wrapped variants at runtime.\n if (state.tools.has(tool.name)) unregisterTool(state, tool.name)\n const normalized = normalizeToolSchema(tool.parameters)\n for (const warning of normalized.warnings) logger(ctx).warn(`[pi2dsh] tool ${tool.name}: ${warning}`)\n state.tools.set(tool.name, tool)\n const definition: ToolDefinition = {\n name: tool.name,\n description: tool.description,\n parameters: normalized.schema,\n output: {\n schema: {},\n render: (_args, value) => (value as UnknownRecord).content as ContentBlock[],\n presentationMeta: (_args, value) => jsonValue((value as UnknownRecord).details) as never,\n },\n isConcurrencySafe: () => tool.executionMode === 'parallel',\n async execute(args, exec) {\n const mutated = state.argMutations.get(exec as unknown as object)\n if (mutated !== undefined) state.argMutations.delete(exec as unknown as object)\n const effective = mutated ?? args\n const prepared = tool.prepareArguments?.(cloneJson(effective)) ?? effective\n const agent = exec.agent as unknown as UnknownRecord | undefined\n const result = await normalizeToolResultForDsh(ctx, await state.agentScope.run(agent, () => tool.execute(\n String(exec.callId),\n prepared,\n exec.signal,\n update => {\n void dispatch(state, 'tool_execution_update', {\n type: 'tool_execution_update',\n toolCallId: String(exec.callId),\n toolName: tool.name,\n args: prepared,\n partialResult: jsonValue(update),\n }, contextFor(ctx, state, agent, exec.signal))\n .catch(error => logger(ctx).warn(`[pi2dsh] tool_execution_update handler failed: ${String(error)}`))\n },\n contextFor(ctx, state, agent, exec.signal),\n )))\n if (result.terminate === true) exec.concludeTurn()\n if (result.isError === true) {\n const message = textBlocks(result.content).map(block => block.text).filter(Boolean).join('\\n')\n throw new Error(message || `Pi tool ${tool.name} failed`)\n }\n return result\n },\n }\n const dispose = (ctx as unknown as { tools: { register(toolDefinition: ToolDefinition): () => void } }).tools.register(definition)\n state.toolDisposers.set(tool.name, dispose)\n}\n\nfunction unregisterTool(state: RuntimeState, name: string): boolean {\n const dispose = state.toolDisposers.get(name)\n if (dispose === undefined) return false\n dispose()\n state.toolDisposers.delete(name)\n state.tools.delete(name)\n return true\n}\n\nfunction currentAgent(state: RuntimeState): UnknownRecord | undefined {\n const scoped = state.agentScope.getStore()\n if (scoped !== undefined) return scoped\n if (state.activeAgents.size === 1) return state.activeAgents.values().next().value as UnknownRecord | undefined\n return undefined\n}\n\nfunction toolRuntime(ctx: Context, agent?: UnknownRecord): {\n schemas(scope?: unknown): Array<{ name: string; description?: string; parameters?: unknown }>\n restrict?(filter: { allow: string[] }): () => void\n} {\n const scoped = agent?.ctx as { tools?: ReturnType<typeof toolRuntime> } | undefined\n return scoped?.tools ?? (ctx as unknown as { tools: ReturnType<typeof toolRuntime> }).tools\n}\n\nfunction getActiveTools(ctx: Context, state: RuntimeState): string[] {\n const agent = currentAgent(state)\n return toolRuntime(ctx, agent).schemas(agent).map(tool => tool.name)\n}\n\nfunction setActiveTools(ctx: Context, state: RuntimeState, names: string[]): void {\n const unique = [...new Set(names)]\n const agent = currentAgent(state)\n state.pendingActiveTools = unique\n if (agent === undefined || typeof agent !== 'object' || agent === null) return\n const scopedTools = agent.ctx === undefined ? undefined : toolRuntime(ctx, agent)\n if (scopedTools === undefined || typeof scopedTools.restrict !== 'function') {\n // No agent-scoped tool runtime (e.g. a bare test agent): remember the\n // intent and apply it when a scoped agent starts. Restricting the global\n // registry here would mask every agent, which DSH rightly rejects.\n logger(ctx).warn('[pi2dsh] setActiveTools deferred: the current agent exposes no scoped tools.restrict()')\n return\n }\n state.toolRestrictions.get(agent)?.()\n state.toolRestrictions.set(agent, scopedTools.restrict({ allow: unique }))\n}\n\nfunction deliverAgentMessage(agent: DshAgent, message: unknown, mode: 'inject' | 'steer' | 'followup'): void {\n const deliver = agent[mode]\n if (typeof deliver !== 'function') throw new Error(`pi2dsh: active DSH agent has no ${mode}() delivery method`)\n deliver.call(agent, message)\n}\n\nasync function sendPiMessage(\n ctx: Context,\n state: RuntimeState,\n content: unknown,\n mode: 'inject' | 'steer' | 'followup',\n): Promise<void> {\n const agent = requireAgent(state, mode === 'inject' ? 'sendMessage' : 'sendUserMessage')\n const blocks = await piToDshContent(ctx, typeof content === 'string' ? [{ type: 'text', text: content }] : content)\n deliverAgentMessage(agent, createUserMessage({\n content: blocks,\n source: { kind: 'plugin', plugin: state.messageSource },\n }), mode)\n}\n\nfunction combineExecSignal(options: PiExecOptions): {\n signal: AbortSignal\n killed(): boolean\n cleanup(): void\n} {\n const controller = new AbortController()\n let killed = false\n let timer: ReturnType<typeof setTimeout> | undefined\n const abort = (reason: unknown): void => {\n if (controller.signal.aborted) return\n killed = true\n controller.abort(reason)\n }\n const onAbort = (): void => abort(options.signal?.reason ?? new Error('Pi exec aborted'))\n if (options.signal?.aborted) onAbort()\n else options.signal?.addEventListener('abort', onAbort, { once: true })\n if (typeof options.timeout === 'number' && Number.isFinite(options.timeout) && options.timeout > 0) {\n timer = setTimeout(() => abort(new Error(`Pi exec timed out after ${options.timeout}ms`)), options.timeout)\n }\n return {\n signal: controller.signal,\n killed: () => killed,\n cleanup() {\n if (timer !== undefined) clearTimeout(timer)\n options.signal?.removeEventListener('abort', onAbort)\n },\n }\n}\n\nasync function executePiCommand(\n service: DshSubprocessService,\n cwd: string,\n command: string,\n args: string[],\n options: PiExecOptions,\n): Promise<{ stdout: string; stderr: string; code: number; killed: boolean }> {\n const operation = combineExecSignal(options)\n try {\n if (typeof command !== 'string' || command.length === 0) throw new TypeError('Pi exec command must be a non-empty string')\n if (!Array.isArray(args) || args.some(value => typeof value !== 'string')) throw new TypeError('Pi exec args must be strings')\n const executable = await service.resolveExecutable(command, undefined, operation.signal)\n const collect = { maxBytes: 64 * 1024 * 1024 }\n const handle = service.spawn({\n argv: [executable, ...args],\n cwd: options.cwd ?? cwd,\n stdio: { stdin: 'ignore', stdout: collect, stderr: collect },\n graceMs: 5_000,\n signal: operation.signal,\n })\n const outcome = await handle.done\n const stdout = handle.collected.stdout?.readFrom(0)\n const stderr = handle.collected.stderr?.readFrom(0)\n const truncation = [stdout?.lossy ? 'stdout' : '', stderr?.lossy ? 'stderr' : ''].filter(Boolean)\n return {\n stdout: stdout?.text ?? '',\n stderr: `${stderr?.text ?? ''}${truncation.length === 0 ? '' : `\\n[pi2dsh: ${truncation.join(' and ')} exceeded the 64 MiB compatibility limit]`}`,\n code: outcome.exitCode ?? 0,\n killed: operation.killed(),\n }\n } catch (error) {\n return {\n stdout: '',\n stderr: error instanceof Error ? error.message : String(error),\n code: operation.signal.aborted ? 0 : 1,\n killed: operation.killed(),\n }\n } finally {\n operation.cleanup()\n }\n}\n\nfunction dshCommandName(ctx: Context, piName: string): string {\n // DSH command names are /^[a-z][a-z0-9_-]*$/; Pi allows richer names like\n // \"btw:tangent\". Normalize instead of refusing the whole package.\n const normalized = piName.toLowerCase().replace(/[^a-z0-9_-]+/gu, '-').replace(/^[^a-z]+/u, '')\n const name = normalized.length > 0 ? normalized : 'pi-command'\n if (name !== piName) logger(ctx).warn(`[pi2dsh] Pi command /${piName} registered as /${name} to satisfy DSH command naming`)\n return name\n}\n\nfunction registerCommand(ctx: Context, state: RuntimeState, command: PiCommand): void {\n // Pi's registerCommand never throws. Within one extension it is Map.set —\n // a same-name registration replaces the earlier one (loader.ts\n // extension.commands.set). Colliding registrations from DIFFERENT sources\n // both survive in Pi under numbered invocation names (runner.ts\n // resolveRegisteredCommands: /name:1, /name:2). On the shared DSH command\n // namespace the earlier registration's name cannot be rewritten from here,\n // so the mapped semantics are: this package's re-registration replaces its\n // own command and keeps the base name; a collision with another package's\n // command registers under Pi's numbered scheme (/name-2, /name-3 — DSH\n // command naming takes '-' where Pi takes ':') while the first keeps the\n // bare name.\n if (state.commands.has(command.name)) {\n state.commandDisposers.get(command.name)?.()\n state.commandDisposers.delete(command.name)\n }\n state.commands.set(command.name, command)\n const commands = (ctx as unknown as { get(name: string): unknown }).get('commands') as {\n register(definition: UnknownRecord): () => void\n } | undefined\n if (commands === undefined) {\n logger(ctx).warn(`[pi2dsh] command /${command.name} was not registered because this DSH composition has no ctx.commands`)\n return\n }\n const baseName = dshCommandName(ctx, command.name)\n const definitionFor = (dshName: string): UnknownRecord => ({\n name: dshName,\n description: command.description || `Migrated Pi command /${command.name}`,\n ...(command.argumentHint !== undefined ? { input: { hint: command.argumentHint } } : {}),\n async handler(invocation: UnknownRecord) {\n const agent = invocation.agent as UnknownRecord\n const commandContext = contextFor(ctx, state, agent, invocation.signal as AbortSignal, true)\n await state.agentScope.run(agent, () => command.handler(String(invocation.rawInput ?? '').trimStart(), commandContext))\n const notices = commandContext.__notices as string[]\n return { kind: 'success', ...(notices.length > 0 ? { text: notices.join('\\n') } : {}) }\n },\n })\n let lastError: unknown\n for (let ordinal = 1; ordinal <= 9; ordinal++) {\n const dshName = ordinal === 1 ? baseName : `${baseName}-${ordinal}`\n try {\n state.commandDisposers.set(command.name, commands.register(definitionFor(dshName)))\n if (ordinal > 1) {\n logger(ctx).warn(`[pi2dsh] command /${command.name} collides with an earlier registration in this host; mounted as /${dshName} (Pi numbers colliding commands the same way)`)\n }\n return\n } catch (error) {\n lastError = error\n }\n }\n logger(ctx).warn(`[pi2dsh] command /${command.name} was not registered: ${lastError instanceof Error ? lastError.message : String(lastError)}`)\n}\n\nfunction requireSession(state: RuntimeState, operation: string): { id: string; events: unknown } {\n const agent = currentAgent(state)\n const session = agentSession(agent)\n if (session === undefined) {\n throw new Error(`pi2dsh: ${operation} requires one active DSH agent with a durable session`)\n }\n return session\n}\n\nfunction createPiApi(ctx: Context, state: RuntimeState): UnknownRecord {\n return {\n on(event: string, handler: PiHandler) {\n const list = state.handlers.get(event) ?? []\n list.push(handler)\n state.handlers.set(event, list)\n },\n registerTool: (tool: PiTool) => registerTool(ctx, state, tool),\n unregisterTool: (name: string) => unregisterTool(state, name),\n registerCommand(name: string, options: UnknownRecord) {\n registerCommand(ctx, state, {\n name,\n description: typeof options.description === 'string' ? options.description : `Migrated Pi command /${name}`,\n ...(typeof options.argumentHint === 'string' ? { argumentHint: options.argumentHint } : {}),\n handler: options.handler as PiCommand['handler'],\n })\n },\n // Registered and introspectable; DSH surfaces have no terminal key\n // bindings, so handlers never fire — the same as Pi's non-TUI modes.\n registerShortcut(shortcut: string, options: UnknownRecord) {\n state.shortcuts.set(shortcut, options)\n },\n registerFlag(name: string, options: UnknownRecord) {\n state.flags.set(name, options.default as boolean | string | undefined)\n logger(ctx).warn(`[pi2dsh] Pi flag --${name} uses its default only; DSH CLI registration is unsupported`)\n },\n getFlag: (name: string) => state.flags.get(name),\n registerProvider(providerOrName: unknown, config?: UnknownRecord) {\n // pi-ai createProvider() objects are keyed by id in Pi's registry\n // (name is the display name); extension-generation calls pass the key\n // explicitly as the first argument.\n const name = typeof providerOrName === 'string'\n ? providerOrName\n : String((providerOrName as UnknownRecord | undefined)?.id\n ?? (providerOrName as UnknownRecord | undefined)?.name ?? 'unnamed')\n const value = typeof providerOrName === 'string' ? config ?? {} : providerOrName as UnknownRecord\n state.providers.set(name, value)\n if (providerSupportsOAuth(value)) {\n // Pi hosts expose /login <provider> for oauth-capable providers; the\n // package's own login flow runs, credentials land in auth.json.\n ensureLoginCommand(ctx, state)\n logger(ctx).info(`[pi2dsh] Pi provider ${JSON.stringify(name)} supports OAuth — log in with /login ${name}`)\n }\n // A provider carrying its own transport becomes a REAL DSH llm route:\n // the loop and child agents route to it natively, with credentials\n // resolved through Pi's own chain per request.\n const routeDisposer = registerPiProviderRoute({\n llm: llmOf(ctx) as never,\n providerId: name,\n provider: value,\n host: {\n resolveAuth: async () => resolvePiProviderAuth({\n providerId: name, providerConfig: value, store: oauthStoreOf(state),\n }) as Promise<{ auth?: UnknownRecord } | undefined>,\n warn: message => logger(ctx).warn(message),\n },\n })\n if (routeDisposer !== undefined) {\n state.providerRouteDisposers.set(name, routeDisposer)\n void state.modelCatalog?.refresh()\n logger(ctx).info(`[pi2dsh] Pi provider ${JSON.stringify(name)} registered as a native DSH llm route`)\n } else if (!providerSupportsOAuth(value)) {\n logger(ctx).info(`[pi2dsh] recorded Pi provider ${JSON.stringify(name)}; model calls stay on DSH llm adapters`)\n }\n // Pi hosts refresh a registered provider's dynamic model catalog\n // (fetchModels against its gateway); best-effort and non-blocking, with\n // pi-ai's publish/store contract and the provider's own resolved\n // credential (gateway discovery needs one).\n const refreshModels = (value as { refreshModels?: unknown }).refreshModels\n if (typeof refreshModels === 'function') {\n void (async () => {\n const resolved = await resolvePiProviderAuth({\n providerId: name, providerConfig: value, store: oauthStoreOf(state),\n }).catch(() => undefined)\n const apiKey = (resolved?.auth as UnknownRecord | undefined)?.apiKey\n await Promise.resolve(refreshModels.call(value, {\n stored: undefined,\n ...(apiKey === undefined ? {} : { credential: { type: 'api_key', key: apiKey } }),\n store: {\n read: async () => undefined,\n write: async () => {},\n delete: async () => {},\n },\n allowNetwork: true,\n signal: new AbortController().signal,\n publish: async (publication: { update?: () => void }) => {\n publication.update?.()\n return true\n },\n }))\n void state.modelCatalog?.refresh()\n })().catch(error => logger(ctx).warn(`[pi2dsh] model catalog refresh for Pi provider ${JSON.stringify(name)} failed (its registry entries stay static): ${error instanceof Error ? error.message : String(error)}`))\n }\n },\n unregisterProvider(name: string) {\n state.providers.delete(name)\n const routeDisposer = state.providerRouteDisposers.get(name)\n if (routeDisposer !== undefined) {\n state.providerRouteDisposers.delete(name)\n routeDisposer()\n }\n },\n // Renderer registrations are accepted verbatim; DSH owns presentation, so\n // they are never invoked — matching Pi's own non-TUI surfaces.\n registerMessageRenderer(customType: string, renderer: unknown) {\n state.messageRenderers.set(customType, renderer)\n },\n registerEntryRenderer(customType: string, renderer: unknown) {\n state.entryRenderers.set(customType, renderer)\n },\n registerMarkdownTransformer(transformer: unknown) {\n state.markdownTransformer = transformer\n },\n sendMessage(message: UnknownRecord, options: UnknownRecord = {}) {\n requireAgent(state, 'sendMessage')\n const mode = options.deliverAs === 'steer'\n ? 'steer'\n : options.deliverAs === 'followUp' || options.deliverAs === 'nextTurn' || options.triggerTurn === true\n ? 'followup'\n : 'inject'\n return sendPiMessage(ctx, state, message.content, mode)\n },\n sendUserMessage(content: unknown, options: UnknownRecord = {}) {\n requireAgent(state, 'sendUserMessage')\n return sendPiMessage(ctx, state, content, options.deliverAs === 'steer' ? 'steer' : 'followup')\n },\n appendEntry(customType: string, data?: unknown) {\n const session = requireSession(state, 'appendEntry')\n state.bridge.appendCustomEntry(session.id, customType, data)\n },\n setSessionName(name: string) {\n const session = requireSession(state, 'setSessionName')\n state.bridge.setName(session.id, String(name))\n void dispatch(state, 'session_info_changed', {\n type: 'session_info_changed',\n name: state.bridge.getName(session.id),\n }, contextFor(ctx, state, currentAgent(state), undefined))\n .catch(error => logger(ctx).warn(`[pi2dsh] session_info_changed handler failed: ${String(error)}`))\n },\n getSessionName() {\n const agent = currentAgent(state)\n const session = agentSession(agent)\n return session === undefined ? undefined : state.bridge.getName(session.id)\n },\n setLabel(entryId: string, label: string | undefined) {\n const session = requireSession(state, 'setLabel')\n state.bridge.appendLabel(session.id, String(entryId), label)\n },\n exec(command: string, args: string[] = [], options: PiExecOptions = {}) {\n const service = optionalService<DshSubprocessService>(ctx, 'subprocess')\n if (service === undefined) unsupported('exec')\n return executePiCommand(service, cwdOf(currentAgent(state)), command, args, options)\n },\n getActiveTools: () => getActiveTools(ctx, state),\n getAllTools: () => {\n // Enumerate Pi-registered tools through the runner facade: a package\n // that patched ExtensionRunner.prototype.getAllRegisteredTools\n // (pi-fabric's catalog capture) filters what this surface reports.\n const visiblePiTools = new Set(\n state.runner.getAllRegisteredTools()\n .map(record => (record.definition as PiTool | undefined)?.name)\n .filter((name): name is string => typeof name === 'string'),\n )\n return toolRuntime(ctx, currentAgent(state)).schemas(currentAgent(state))\n .filter(tool => !state.tools.has(tool.name) || visiblePiTools.has(tool.name))\n .map(tool => ({\n name: tool.name,\n description: tool.description ?? '',\n parameters: tool.parameters ?? {},\n source: state.tools.has(tool.name) ? 'extension' : 'builtin',\n sourceInfo: { path: '', source: state.tools.has(tool.name) ? 'pi2dsh' : 'dsh', scope: 'session', origin: 'runtime' },\n }))\n },\n setActiveTools: (names: string[]) => setActiveTools(ctx, state, names),\n getCommands: () => [...state.commands.values()].map(command => ({\n name: command.name,\n description: command.description,\n source: 'extension',\n sourceInfo: { path: '', source: 'pi2dsh', scope: 'user', origin: 'package' },\n })),\n async setModel(model: UnknownRecord) {\n const agent = currentAgent(state)\n if (agent === undefined) return false\n const override = {\n ...(typeof model?.provider === 'string' ? { provider: model.provider } : {}),\n ...(typeof model?.id === 'string' ? { model: model.id } : {}),\n }\n if (override.model === undefined) return false\n state.modelOverrides.set(agent, override)\n const previous = state.modelOverrides.get(agent)\n void dispatch(state, 'model_select', {\n type: 'model_select', model, previousModel: previous, source: 'set',\n }, contextFor(ctx, state, agent, undefined))\n .catch(error => logger(ctx).warn(`[pi2dsh] model_select handler failed: ${String(error)}`))\n return true\n },\n getThinkingLevel: () => thinkingLevelOf(state, currentAgent(state)),\n setThinkingLevel(level: string) {\n const agent = currentAgent(state)\n const previousLevel = thinkingLevelOf(state, agent)\n if (agent === undefined) state.globalThinkingLevel = String(level)\n else state.thinkingLevels.set(agent, String(level))\n void dispatch(state, 'thinking_level_select', {\n type: 'thinking_level_select', level: String(level), previousLevel,\n }, contextFor(ctx, state, agent, undefined))\n .catch(error => logger(ctx).warn(`[pi2dsh] thinking_level_select handler failed: ${String(error)}`))\n },\n events: {\n emit(channel: string, data: unknown) {\n state.eventBus.emit(channel, data)\n },\n on(channel: string, handler: (data: unknown) => unknown) {\n const safeHandler = (data: unknown) => {\n Promise.resolve(handler(data)).catch(error => logger(ctx).warn(`[pi2dsh] package event ${channel} handler failed: ${String(error)}`))\n }\n state.eventBus.on(channel, safeHandler)\n return () => state.eventBus.off(channel, safeHandler)\n },\n },\n }\n}\n\nfunction splitArguments(input: string): string[] {\n const values: string[] = []\n let current = ''\n let quote: string | undefined\n for (const character of input) {\n if (quote !== undefined) {\n if (character === quote) quote = undefined\n else current += character\n } else if (character === '\"' || character === \"'\") {\n quote = character\n } else if (/\\s/u.test(character)) {\n if (current.length > 0) {\n values.push(current)\n current = ''\n }\n } else {\n current += character\n }\n }\n if (current.length > 0) values.push(current)\n return values\n}\n\nfunction promptBody(text: string): string {\n const normalized = text.replace(/\\r\\n?/gu, '\\n')\n if (!normalized.startsWith('---')) return normalized\n const endIndex = normalized.indexOf('\\n---', 3)\n if (endIndex === -1) return normalized\n return normalized.slice(endIndex + 4).trim()\n}\n\nfunction expandPrompt(text: string, rawInput: string): string {\n const args = splitArguments(rawInput)\n const all = args.join(' ')\n return promptBody(text).replace(\n /\\$\\{(\\d+|ARGUMENTS|@):-([^}]*)\\}|\\$\\{@:(\\d+)(?::(\\d+))?\\}|\\$(ARGUMENTS|@|\\d+)/gu,\n (_match, defaultTarget: string | undefined, fallback: string | undefined, sliceStart: string | undefined, sliceLength: string | undefined, simple: string | undefined) => {\n if (defaultTarget !== undefined) {\n const value = defaultTarget === '@' || defaultTarget === 'ARGUMENTS'\n ? all\n : args[Number(defaultTarget) - 1]\n return value || fallback || ''\n }\n if (sliceStart !== undefined) {\n const offset = Math.max(0, Number(sliceStart) - 1)\n return args.slice(offset, sliceLength === undefined ? undefined : offset + Number(sliceLength)).join(' ')\n }\n if (simple === '@' || simple === 'ARGUMENTS') return all\n return args[Number(simple) - 1] ?? ''\n },\n )\n}\n\nasync function registerPromptCommands(ctx: Context, state: RuntimeState, rootDir: string, manifest: GeneratedRuntimeManifest): Promise<void> {\n for (const prompt of manifest.prompts) {\n const text = await readFile(join(rootDir, prompt.path), 'utf8')\n registerCommand(ctx, state, {\n name: prompt.name,\n description: prompt.description,\n ...(prompt.argumentHint !== undefined ? { argumentHint: prompt.argumentHint } : {}),\n handler(rawInput, commandContext) {\n const agent = (commandContext as UnknownRecord).__agent as UnknownRecord | undefined\n const invocationAgent = agent ?? [...state.activeAgents][0]\n if (invocationAgent === undefined || typeof invocationAgent.steer !== 'function') {\n throw new Error(`pi2dsh: /${prompt.name} requires a live DSH agent`)\n }\n invocationAgent.steer(createUserMessage({\n content: [{ type: 'text', text: expandPrompt(text, rawInput) }],\n source: { kind: 'plugin', plugin: `pi2dsh:${manifest.package.name}`, form: 'relay' },\n }))\n },\n })\n }\n}\n\nasync function loadExtensions(\n rootDir: string,\n manifest: GeneratedRuntimeManifest,\n api: UnknownRecord,\n onExtensionError?: (failure: string) => void,\n): Promise<void> {\n const resolveShim = async (name: string): Promise<string> => {\n const compiled = fileURLToPath(new URL(`./compat/${name}.mjs`, import.meta.url))\n try {\n await access(compiled)\n return compiled\n } catch {\n return fileURLToPath(new URL(`./compat/${name}.ts`, import.meta.url))\n }\n }\n const [codingAgentShim, tuiShim, aiShim] = await Promise.all([\n resolveShim('pi-coding-agent'),\n resolveShim('pi-tui'),\n resolveShim('pi-ai'),\n ])\n const aliases: Record<string, string> = {}\n for (const family of ['@earendil-works', '@mariozechner']) {\n aliases[`${family}/pi-coding-agent`] = codingAgentShim\n aliases[`${family}/pi-tui`] = tuiShim\n aliases[`${family}/pi-ai`] = aiShim\n // Pi resolves subpath entries of pi-ai (compat superset, oauth, provider\n // catalogs) for extensions; all of them land on the same shim surface.\n aliases[`${family}/pi-ai/compat`] = aiShim\n aliases[`${family}/pi-ai/oauth`] = aiShim\n aliases[`${family}/pi-ai/providers/all`] = aiShim\n }\n // Pi's loader hands extensions the host's typebox without a declaration;\n // mirror that by resolving every typebox entry the whitelist names to the\n // bridge's own copy.\n // typebox restricts its exports map (no ./package.json), so resolve each\n // public entry directly; resolution anchors at this runtime file, which in a\n // generated bundle sits next to the bundle's own node_modules.\n const require = createRequire(import.meta.url)\n for (const entry of ['typebox', 'typebox/value', 'typebox/compile']) {\n try {\n const resolved = require.resolve(entry)\n aliases[entry] = resolved\n aliases[entry.replace('typebox', '@sinclair/typebox')] = resolved\n } catch {\n // Without a resolvable typebox entry extensions fall back to normal\n // resolution against their own dependencies.\n }\n }\n const jiti = createJiti(import.meta.url, {\n interopDefault: true,\n alias: aliases,\n })\n // Pi's loader isolates per-extension failures: one broken entry reports and\n // the rest keep loading. A package whose every entry fails still errors.\n const failures: string[] = []\n let mounted = 0\n for (const extension of manifest.extensions) {\n try {\n const loaded: unknown = await jiti.import(join(rootDir, extension))\n const candidate = typeof loaded === 'object' && loaded !== null && 'default' in loaded\n ? (loaded as { default: unknown }).default\n : loaded\n if (typeof candidate !== 'function') throw new TypeError(`Pi extension ${extension} has no default factory function`)\n await candidate(api)\n mounted += 1\n } catch (error) {\n failures.push(`${extension}: ${error instanceof Error ? error.message : String(error)}`)\n }\n }\n if (failures.length > 0 && mounted === 0 && manifest.extensions.length > 0) {\n throw new Error(`every Pi extension entry failed to load:\\n${failures.map(item => `- ${item}`).join('\\n')}`)\n }\n for (const failure of failures) onExtensionError?.(failure)\n}\n\nexport async function applyPiPackage(ctx: Context, options: RuntimeOptions): Promise<void> {\n if (options.manifest.schemaVersion !== 1) throw new Error(`unsupported pi2dsh manifest version ${String(options.manifest.schemaVersion)}`)\n const rootDir = fileURLToPath(options.rootUrl)\n const runtimeTools = new Map<string, PiTool>()\n const piToolRecords = (): Array<{ definition: unknown, sourceInfo: { path: string, source: string, scope: string, origin: string } }> =>\n [...runtimeTools.values()].map(tool => ({\n definition: tool,\n sourceInfo: { path: '', source: 'pi2dsh', scope: 'session', origin: 'package' },\n }))\n const state: RuntimeState = {\n handlers: new Map(),\n tools: runtimeTools,\n runner: new ExtensionRunner(piToolRecords),\n toolDisposers: new Map(),\n toolRestrictions: new WeakMap(),\n commands: new Map(),\n commandDisposers: new Map(),\n modelsJsonProviders: new Map(),\n flags: new Map(),\n notifications: [],\n activeAgents: new Set(),\n disposedAgents: new WeakSet(),\n currentSystemPrompt: '',\n messageSource: `pi2dsh:${options.manifest.package.name}`,\n eventBus: new EventEmitter(),\n agentScope: new AsyncLocalStorage(),\n bridge: new PiSessionBridge(),\n theme: new Theme(),\n shortcuts: new Map(),\n messageRenderers: new Map(),\n entryRenderers: new Map(),\n providers: new Map(),\n autocompleteProviders: [],\n editorBuffers: new WeakMap(),\n toolsExpanded: false,\n modelOverrides: new WeakMap(),\n thinkingLevels: new WeakMap(),\n turnSystemPromptOverrides: new WeakMap(),\n globalThinkingLevel: 'off',\n argMutations: new WeakMap(),\n streamingTexts: new Map(),\n lastLoggedModels: new WeakMap(),\n providerRouteDisposers: new Map(),\n }\n subscribeLifecycle(ctx, state)\n subscribeInterceptors(ctx, state)\n // Pi hosts ship their built-in OAuth providers ready to log in; preload the\n // four vendored official flows so `/login openai-codex` (etc.) works out of\n // the box, before any package registers its own providers.\n for (const provider of builtinProviders()) {\n state.providers.set(provider.id, { name: provider.name, baseUrl: provider.baseUrl, oauth: provider.auth.oauth })\n }\n ensureLoginCommand(ctx, state)\n if (options.manifest.skillDirs.length > 0) {\n const skills = (ctx as unknown as { get(name: string): unknown }).get('skills')\n if (skills === undefined) logger(ctx).warn('[pi2dsh] migrated skills were not mounted because this DSH composition has no ctx.skills')\n else {\n const { apply: applyFilesystemSkills } = await import('@deepseek-ai/dsh-skill-filesystem')\n applyFilesystemSkills(ctx, {\n providerName: `pi2dsh-${options.manifest.package.name.replace(/[^a-zA-Z0-9_-]+/gu, '-').replace(/^-+|-+$/gu, '')}`,\n includeDefaultRoots: false,\n customSkillDirs: options.manifest.skillDirs.map(path => join(rootDir, path)),\n watch: false,\n })\n }\n }\n // Model Runtime Bridge: ONE model directory. Pi's models.json providers\n // register as DSH llm routes first (Pi's per-api wire clients as their\n // transport), then the DSH directory — now containing every route — is\n // projected as Pi's model catalog, and hand-built pi-ai complete()/stream()\n // calls route through the native llm service. Compositions without llm\n // keep the empty-catalog semantics.\n const llm = llmOf(ctx)\n state.modelCatalog = new ModelCatalog(llm)\n await reloadModelsJson(ctx, state)\n if (llm !== undefined) {\n const cordisCtx = ctx as unknown as { on(name: string, callback: (...args: unknown[]) => unknown): () => void }\n cordisCtx.on('llm/adapters-updated', () => { void state.modelCatalog?.refresh() })\n // Pi hosts finish loading the model directory before extensions can see\n // the registry, so extension-visible reads (guardian reviewer probes)\n // never race the initial catalog fill. Later refreshes stay concurrent.\n await state.modelCatalog.refresh()\n __setPiAiLlmBridge((model, context, callOptions) => streamViaDshLlm(llm, { model, context, options: callOptions }))\n ctx.effect(() => () => __setPiAiLlmBridge(undefined))\n }\n // createAgentSession builds a real DSH child agent through ctx.agents; the\n // factory lives for exactly the runtime's lifetime.\n __setSubagentSessionFactory(subagentOptions => createBridgedAgentSession({\n cordis: ctx,\n cwd: () => cwdOf(currentAgent(state)),\n parentSessionId: () => {\n const session = agentSession(currentAgent(state))\n return session === undefined ? undefined : String(session.id ?? '') || undefined\n },\n piContentToDsh: content => piToDshContent(ctx, content),\n deliver: (agent, message, mode) => deliverAgentMessage(agent as DshAgent, message, mode),\n messageFromSessionEvent,\n messageSource: state.messageSource,\n }, subagentOptions))\n ctx.effect(() => () => __setSubagentSessionFactory(undefined))\n await registerPromptCommands(ctx, state, rootDir, options.manifest)\n await loadExtensions(rootDir, options.manifest, createPiApi(ctx, state),\n failure => logger(ctx).warn(`[pi2dsh] extension entry failed and was skipped (matching Pi's per-extension error isolation): ${failure}`))\n logger(ctx).info(`[pi2dsh] loaded ${options.manifest.package.name}: ${state.tools.size} tools, ${state.commands.size} commands, ${options.manifest.skillDirs.length} skill roots`)\n}\n\nexport const runtimeInternals = {\n expandPrompt,\n normalizeToolResult,\n splitArguments,\n textBlocks,\n}\n"],"mappings":"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"}