zidane 6.3.1 → 6.3.3

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 (116) hide show
  1. package/dist/acp-cli.js +6 -6
  2. package/dist/{acp-Cs86McDR.js → acp-ohhNwdRs.js} +4 -4
  3. package/dist/{acp-Cs86McDR.js.map → acp-ohhNwdRs.js.map} +1 -1
  4. package/dist/acp.d.ts +1 -1
  5. package/dist/acp.js +1 -1
  6. package/dist/{agent-AZ_crMfB.js → agent-CusJwY4-.js} +32 -6
  7. package/dist/{agent-AZ_crMfB.js.map → agent-CusJwY4-.js.map} +1 -1
  8. package/dist/agent.d.ts +2 -2
  9. package/dist/agent.js +2 -2
  10. package/dist/{anthropic-CWwySM3p.js → anthropic-CLZy29w3.js} +3 -3
  11. package/dist/{anthropic-CWwySM3p.js.map → anthropic-CLZy29w3.js.map} +1 -1
  12. package/dist/{auth-BPSnotuN.js → auth-BlMvqJTC.js} +4 -4
  13. package/dist/{auth-BPSnotuN.js.map → auth-BlMvqJTC.js.map} +1 -1
  14. package/dist/{cache-telemetry-DzyfqSds.js → cache-telemetry-ehVdWsg2.js} +23 -4
  15. package/dist/cache-telemetry-ehVdWsg2.js.map +1 -0
  16. package/dist/chat/pure.d.ts +4 -4
  17. package/dist/chat/pure.js +2 -2
  18. package/dist/chat.d.ts +4 -4
  19. package/dist/chat.d.ts.map +1 -1
  20. package/dist/chat.js +5 -5
  21. package/dist/{context-transport-64EeXTAQ.js → context-transport-10istrQo.js} +3 -3
  22. package/dist/{context-transport-64EeXTAQ.js.map → context-transport-10istrQo.js.map} +1 -1
  23. package/dist/contexts/daytona.d.ts +1 -1
  24. package/dist/contexts/e2b.d.ts +1 -1
  25. package/dist/eval.d.ts +1 -1
  26. package/dist/eval.js +1 -1
  27. package/dist/extensions.d.ts +1 -1
  28. package/dist/extensions.js +1 -1
  29. package/dist/headless.d.ts +1 -1
  30. package/dist/headless.js +4 -3
  31. package/dist/headless.js.map +1 -1
  32. package/dist/{index-D-PvuMCb.d.ts → index-D-DPqXxU.d.ts} +124 -10
  33. package/dist/index-D-DPqXxU.d.ts.map +1 -0
  34. package/dist/index.d.ts +2 -2
  35. package/dist/index.js +10 -10
  36. package/dist/{inline-autocomplete-CbcdZpfC.js → inline-autocomplete-DC2cxprN.js} +6 -6
  37. package/dist/{inline-autocomplete-CbcdZpfC.js.map → inline-autocomplete-DC2cxprN.js.map} +1 -1
  38. package/dist/{login-fgr9zD6z.js → login-BjY7iWO8.js} +2 -2
  39. package/dist/{login-fgr9zD6z.js.map → login-BjY7iWO8.js.map} +1 -1
  40. package/dist/{mcp-DolMi7WV.js → mcp-BpFHFblm.js} +3 -3
  41. package/dist/{mcp-DolMi7WV.js.map → mcp-BpFHFblm.js.map} +1 -1
  42. package/dist/mcp.d.ts +1 -1
  43. package/dist/mcp.js +1 -1
  44. package/dist/{messages-CLkUdPeG.js → messages-CEM4l9iH.js} +11 -7
  45. package/dist/messages-CEM4l9iH.js.map +1 -0
  46. package/dist/{openai-compat-DHlBIjj9.js → openai-compat-Ba4nw7ip.js} +4 -3
  47. package/dist/openai-compat-Ba4nw7ip.js.map +1 -0
  48. package/dist/output/stream-json.d.ts +1 -1
  49. package/dist/output/terminal.d.ts +1 -1
  50. package/dist/presets.d.ts +1 -1
  51. package/dist/presets.js +1 -1
  52. package/dist/providers/anthropic.d.ts +1 -1
  53. package/dist/providers/anthropic.js +1 -1
  54. package/dist/providers/arcee.d.ts +1 -1
  55. package/dist/providers/arcee.js +1 -1
  56. package/dist/providers/baseten.d.ts +1 -1
  57. package/dist/providers/baseten.js +1 -1
  58. package/dist/providers/cerebras.d.ts +1 -1
  59. package/dist/providers/cerebras.js +1 -1
  60. package/dist/providers/local.d.ts +1 -1
  61. package/dist/providers/local.js +1 -1
  62. package/dist/providers/openai-compat.d.ts +1 -1
  63. package/dist/providers/openai-compat.js +1 -1
  64. package/dist/providers/openai.d.ts +1 -1
  65. package/dist/providers/openai.js +2 -2
  66. package/dist/providers/openrouter.d.ts +1 -1
  67. package/dist/providers/openrouter.js +1 -1
  68. package/dist/providers/xai.d.ts +1 -1
  69. package/dist/providers/xai.js +1 -1
  70. package/dist/{providers-Nu5ysnXN.js → providers-g1ilD4qo.js} +3 -3
  71. package/dist/{providers-Nu5ysnXN.js.map → providers-g1ilD4qo.js.map} +1 -1
  72. package/dist/providers.d.ts +1 -1
  73. package/dist/providers.js +4 -4
  74. package/dist/restate.d.ts +1 -1
  75. package/dist/session/sqlite.d.ts +1 -1
  76. package/dist/{session-vmy9jTVM.js → session-DLX7JXer.js} +2 -2
  77. package/dist/{session-vmy9jTVM.js.map → session-DLX7JXer.js.map} +1 -1
  78. package/dist/session.d.ts +1 -1
  79. package/dist/session.js +2 -2
  80. package/dist/skills.d.ts +1 -1
  81. package/dist/{stdio-D0v-W5w7.js → stdio-D73QRG0r.js} +2 -2
  82. package/dist/{stdio-D0v-W5w7.js.map → stdio-D73QRG0r.js.map} +1 -1
  83. package/dist/{stdio-loader-BPUedHxT.js → stdio-loader-BaOGqSWc.js} +2 -2
  84. package/dist/{stdio-loader-BPUedHxT.js.map → stdio-loader-BaOGqSWc.js.map} +1 -1
  85. package/dist/{tool-formatters-BPKA2if5.d.ts → tool-formatters-BX9TaWAr.d.ts} +31 -3
  86. package/dist/tool-formatters-BX9TaWAr.d.ts.map +1 -0
  87. package/dist/tools/fetch-url.d.ts +1 -1
  88. package/dist/tools/web-search.d.ts +1 -1
  89. package/dist/tools.d.ts +1 -1
  90. package/dist/tools.js +1 -1
  91. package/dist/{transcript-anchors-6-uB2Xvl.js → transcript-anchors-Bi9iZTxT.js} +7 -7
  92. package/dist/transcript-anchors-Bi9iZTxT.js.map +1 -0
  93. package/dist/{transcript-anchors-DzuIcJpm.d.ts → transcript-anchors-BpCQElT6.d.ts} +2 -2
  94. package/dist/transcript-anchors-BpCQElT6.d.ts.map +1 -0
  95. package/dist/tui.d.ts +3 -3
  96. package/dist/tui.d.ts.map +1 -1
  97. package/dist/tui.js +79 -25
  98. package/dist/tui.js.map +1 -1
  99. package/dist/{turn-operations-CtEpeB_s.js → turn-operations-CBdrdYiF.js} +56 -2
  100. package/dist/turn-operations-CBdrdYiF.js.map +1 -0
  101. package/dist/{turn-operations-Dzr3QhDD.d.ts → turn-operations-C_bn9UmE.d.ts} +3 -3
  102. package/dist/{turn-operations-Dzr3QhDD.d.ts.map → turn-operations-C_bn9UmE.d.ts.map} +1 -1
  103. package/dist/types-BIarq1qE.js.map +1 -1
  104. package/dist/types.d.ts +1 -1
  105. package/dist/{xai-Cn0LsHRt.js → xai-5LbsIfXn.js} +2 -2
  106. package/dist/{xai-Cn0LsHRt.js.map → xai-5LbsIfXn.js.map} +1 -1
  107. package/docs/ARCHITECTURE.md +11 -2
  108. package/package.json +1 -1
  109. package/dist/cache-telemetry-DzyfqSds.js.map +0 -1
  110. package/dist/index-D-PvuMCb.d.ts.map +0 -1
  111. package/dist/messages-CLkUdPeG.js.map +0 -1
  112. package/dist/openai-compat-DHlBIjj9.js.map +0 -1
  113. package/dist/tool-formatters-BPKA2if5.d.ts.map +0 -1
  114. package/dist/transcript-anchors-6-uB2Xvl.js.map +0 -1
  115. package/dist/transcript-anchors-DzuIcJpm.d.ts.map +0 -1
  116. package/dist/turn-operations-CtEpeB_s.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"headless.js","names":["basic"],"sources":["../src/headless.ts"],"sourcesContent":["/**\n * Headless mode — a non-interactive, fully-structured way to drive the agent\n * for automation and RL rollouts.\n *\n * `agent.run()` already returns rich {@link AgentStats}, the session captures a\n * lossless transcript (`session.turns`), and the hook bus exposes every\n * streaming/tool/turn event. What this module adds is the *contract* an RL loop\n * needs: one call (`runHeadless`) that runs a prompt to completion in a chosen\n * workdir, bounded by turns + wall-clock, and hands back a single serializable\n * {@link HeadlessResult} — final answer, verifiable structured output, usage,\n * and the complete trajectory — plus an optional live {@link HeadlessEvent}\n * stream (the in-process equivalent of `--output-format stream-json`).\n *\n * It is provider-agnostic: the caller passes a built {@link Provider} (e.g.\n * `local()` pointed at a vLLM server, or any of the named providers). The thin\n * CLI in `src/headless-cli.ts` wraps this with arg parsing, file/stdin I/O, and\n * JSONL transcript writing.\n */\n\nimport type { Hookable } from 'hookable'\nimport type { AgentHooks, AgentOptions } from './agent'\nimport type { ExecutionContext } from './contexts'\nimport type { ExtensionRegistry } from './extensions'\nimport type { Preset } from './presets'\nimport type { Provider } from './providers'\nimport type { RunSummary } from './run-summary'\nimport type { Session, SessionStore } from './session'\nimport type { PairingRepair } from './session/messages'\nimport type { ToolDef } from './tools'\nimport type {\n AgentStats,\n McpServerConfig,\n PromptPart,\n SessionContentBlock,\n SessionTurn,\n ThinkingLevel,\n ToolResultContent,\n ToolResultDocumentContent,\n TurnFinishReason,\n} from './types'\nimport { createAgent } from './agent'\nimport { createProcessContext } from './contexts'\nimport { basic } from './presets'\nimport { createRunSummaryCollector } from './run-summary'\nimport { createMemoryStore, createSession, toAnthropic } from './session'\nimport { ensureToolResultPairing } from './session/messages'\nimport { audioFormatFromMediaType } from './tools/media-sniff'\nimport { assertResolvedMediaBlock, documentBlockMarker, isWireTurn, toolResultToText } from './types'\n\n// ---------------------------------------------------------------------------\n// Public shapes\n// ---------------------------------------------------------------------------\n\nexport type HeadlessStatus = 'completed' | 'aborted' | 'error' | 'timeout'\n\nexport interface HeadlessUsage {\n input: number\n output: number\n cacheRead: number\n cacheCreation: number\n /** Cumulative USD cost when the provider/registry could price the run. */\n cost?: number\n}\n\nexport interface HeadlessErrorInfo {\n message: string\n /** Typed-error class name (`AgentAbortedError`, `AgentContextExceededError`, …). */\n type: string\n}\n\n/**\n * Strictly JSON-serializable postmortem of one headless run. Everything an RL\n * reward function needs: the final answer (`finalText`), the verifiable\n * structured output (`output`, present iff a `schema` was set), usage/turns,\n * and the lossless `transcript` (the SFT training data).\n */\nexport interface HeadlessResult {\n status: HeadlessStatus\n /** Concatenated text of the last assistant turn that produced any text. */\n finalText: string\n /** Schema-enforced structured output (only when `opts.schema` is set). */\n output?: Record<string, unknown>\n usage: HeadlessUsage\n turns: number\n durationMs: number\n /** Total `tool_call` blocks across the whole transcript. */\n numToolCalls: number\n /** Finish reason of the final turn that reported one. */\n finishReason?: TurnFinishReason\n error?: HeadlessErrorInfo\n sessionId: string\n /** Incident postmortem (errors, gate blocks, budget events) via run-summary. */\n summary?: RunSummary\n /** Lossless transcript — raw `session.turns`. Thinking stripped when `includeThinking: false`. */\n transcript: SessionTurn[]\n}\n\nexport type HeadlessOutputFormat = 'zidane' | 'provider'\n\nexport type ProviderTranscriptFormat = 'anthropic' | 'openai'\n\nexport type FormattedHeadlessResult\n = | HeadlessResult\n | unknown[]\n\nexport type FormattedHeadlessTurnEvent\n = | Extract<HeadlessEvent, { type: 'turn' }>\n | unknown[]\n\nexport function exitCodeForHeadlessResult(result: HeadlessResult): number {\n switch (result.status) {\n case 'completed': return 0\n case 'timeout': return 124\n case 'aborted': return 130\n case 'error':\n default: return 1\n }\n}\n\n/**\n * Live event union — the in-process equivalent of a `stream-json` line. Every\n * member is JSON-serializable; render to JSONL with {@link headlessEventToJsonl}.\n */\nexport type HeadlessEvent\n = | { type: 'start', runId: string, provider?: string }\n | { type: 'text', delta: string }\n | { type: 'thinking', delta: string }\n | { type: 'tool_call', callId: string, name: string, input: Record<string, unknown> }\n | { type: 'tool_result', callId: string, name: string, output: string, isError: boolean }\n | { type: 'turn', index: number, turn: SessionTurn }\n | { type: 'spawn', event: 'before' | 'complete' | 'error', id: string, info?: Record<string, unknown> }\n | { type: 'error', message: string, errorType?: string }\n | { type: 'result', result: HeadlessResult }\n\n/** Serialize one event as a newline-terminated JSON line (stream-json). */\nexport function headlessEventToJsonl(event: HeadlessEvent): string {\n return `${JSON.stringify(event)}\\n`\n}\n\nexport function formattedHeadlessTurnEventToJsonl(event: FormattedHeadlessTurnEvent): string {\n return `${JSON.stringify(event)}\\n`\n}\n\nexport function providerTranscriptFormatForProvider(providerName: string): ProviderTranscriptFormat {\n return providerName === 'anthropic' ? 'anthropic' : 'openai'\n}\n\nexport function transcriptToProviderMessages(\n turns: SessionTurn[],\n providerName: string,\n): unknown[] {\n const format = providerTranscriptFormatForProvider(providerName)\n if (format === 'anthropic') {\n return turns\n .filter(isWireTurn)\n .map(turn => toAnthropic({ role: turn.role, content: turn.content }))\n }\n return transcriptToOpenAIMessages(turns, { strictToolPairing: false })\n}\n\nexport function formatHeadlessResult(\n result: HeadlessResult,\n options: { format: HeadlessOutputFormat, providerName: string },\n): FormattedHeadlessResult {\n if (options.format === 'zidane')\n return result\n return transcriptToProviderMessages(result.transcript, options.providerName)\n}\n\nexport function formatHeadlessTurnEvent(\n event: Extract<HeadlessEvent, { type: 'turn' }>,\n options: { format: HeadlessOutputFormat, providerName: string },\n): FormattedHeadlessTurnEvent {\n if (options.format === 'zidane')\n return event\n return transcriptToProviderMessages([event.turn], options.providerName)\n}\n\nexport interface HeadlessOptions {\n /** User prompt — plain string or multimodal `PromptPart[]`. */\n prompt: string | PromptPart[]\n /** Built provider (e.g. `local()`, `openaiCompat(...)`, `anthropic(...)`). */\n provider: Provider\n model?: string\n /** Override the preset system prompt for this run. */\n system?: string\n thinking?: ThinkingLevel\n maxTurns?: number\n maxTokens?: number\n /** Wall-clock cap; on expiry the run is aborted and `status` becomes `'timeout'`. */\n timeoutMs?: number\n /** External abort signal — chained with the internal timeout controller. */\n signal?: AbortSignal\n /** JSON Schema for structured-output enforcement → populates `result.output`. */\n schema?: Record<string, unknown>\n /** Agent behavior defaults for this headless run. Top-level shortcuts below override matching fields. */\n behavior?: AgentOptions['behavior']\n /** Tool overrides. Omit to use the basic preset's tools. */\n tools?: Record<string, ToolDef>\n mcpServers?: McpServerConfig[]\n skills?: AgentOptions['skills']\n /**\n * Base {@link Preset} for the agent — spread in place of the default `basic`\n * preset (use it to swap the system prompt / tool set wholesale). The\n * top-level shortcuts above (`system`, `behavior`, `tools`, `mcpServers`,\n * `skills`) still override matching preset fields.\n */\n preset?: Preset\n /**\n * Pre-built extension registry folded into the agent via `createAgent`\n * (build it with `buildExtensionRegistry(defs.map(inlineLoadedExtension))`).\n * Contributes the registry's tools / hooks / mcpServers / skills /\n * system-fragments / subagents, with the explicit options above winning on\n * collision. Because hooks fold through `createAgent`, a headless run with\n * `extensions` also gets extension hooks (e.g. a `tool:transform` that\n * rewrites results), not just tools.\n */\n extensions?: ExtensionRegistry\n /** Execution context. Defaults to a process context rooted at `cwd`. */\n execution?: ExecutionContext\n /** Working directory for the default process context (ignored if `execution` is set). */\n cwd?: string\n /** Reuse / resume an existing session. */\n session?: Session\n /** Session store for a fresh session (defaults to an in-memory store). */\n store?: SessionStore\n /** Keep `thinking` blocks in `result.transcript` (default true). */\n includeThinking?: boolean\n /** Live event callback — the in-process stream-json equivalent. */\n onEvent?: (event: HeadlessEvent) => void\n}\n\n// ---------------------------------------------------------------------------\n// runHeadless\n// ---------------------------------------------------------------------------\n\n/**\n * Run a prompt to completion, headless, and return a single serializable\n * {@link HeadlessResult}. Safe to call concurrently for parallel rollouts —\n * each call builds its own agent + session and tears them down in `finally`.\n */\nexport async function runHeadless(opts: HeadlessOptions): Promise<HeadlessResult> {\n const startedAt = Date.now()\n const execution = opts.execution ?? createProcessContext({ cwd: opts.cwd })\n const session = opts.session ?? await createSession({ store: opts.store ?? createMemoryStore() })\n\n // Layer behavior on top of the base preset's: the `behavior` key is spread\n // last into `createAgent`, so without seeding from `basePreset.behavior` a\n // custom `preset` carrying behavior defaults would be silently wiped (the\n // top-level shortcuts are meant to OVERRIDE preset fields, not replace them).\n const basePreset = opts.preset ?? basic\n const behavior: NonNullable<AgentOptions['behavior']> = { ...basePreset.behavior, ...(opts.behavior ?? {}) }\n if (opts.maxTurns !== undefined)\n behavior.maxTurns = opts.maxTurns\n if (opts.maxTokens !== undefined)\n behavior.maxTokens = opts.maxTokens\n if (opts.schema !== undefined)\n behavior.schema = opts.schema\n\n const agent = createAgent({\n ...basePreset,\n provider: opts.provider,\n execution,\n session,\n behavior,\n ...(opts.tools !== undefined ? { tools: opts.tools } : {}),\n ...(opts.mcpServers !== undefined ? { mcpServers: opts.mcpServers } : {}),\n ...(opts.skills !== undefined ? { skills: opts.skills } : {}),\n ...(opts.extensions !== undefined ? { extensions: opts.extensions } : {}),\n })\n\n const collector = createRunSummaryCollector()\n const uninstallSummary = collector.install(agent.hooks)\n const uninstallEvents = opts.onEvent ? installHeadlessEventAdapter(agent.hooks, opts.onEvent) : noop\n\n // Resumed sessions carry turns from prior runs — remember where this run\n // starts so transcript/finalText/numToolCalls stay per-run, matching the\n // per-run usage/turns/durationMs stats.\n const runStartIndex = session.turns.length\n\n // Internal controller drives the wall-clock timeout and chains any external\n // signal so a host cancel and a timeout both abort the same run. The\n // listener is removed in `finally` — a long-lived host signal must not\n // accumulate one listener per rollout.\n const controller = new AbortController()\n const onExternalAbort = (): void => controller.abort(opts.signal!.reason)\n if (opts.signal) {\n if (opts.signal.aborted)\n controller.abort(opts.signal.reason)\n else\n opts.signal.addEventListener('abort', onExternalAbort, { once: true })\n }\n let timedOut = false\n const timer = opts.timeoutMs && opts.timeoutMs > 0\n ? setTimeout(() => {\n timedOut = true\n controller.abort(new Error(`Headless run timed out after ${opts.timeoutMs}ms`))\n }, opts.timeoutMs)\n : undefined\n\n let stats: AgentStats | undefined\n let error: HeadlessErrorInfo | undefined\n\n try {\n stats = await agent.run({\n prompt: opts.prompt,\n signal: controller.signal,\n ...(opts.model !== undefined ? { model: opts.model } : {}),\n ...(opts.system !== undefined ? { system: opts.system } : {}),\n ...(opts.thinking !== undefined ? { thinking: opts.thinking } : {}),\n })\n }\n catch (err) {\n // The agent loop throws typed errors (AgentAbortedError,\n // AgentContextExceededError, AgentProviderError, …) — their `name` already\n // classifies the failure, so surface it directly.\n const e = err instanceof Error ? err : new Error(String(err))\n error = { message: e.message, type: e.name }\n }\n finally {\n if (timer)\n clearTimeout(timer)\n opts.signal?.removeEventListener('abort', onExternalAbort)\n uninstallEvents()\n uninstallSummary()\n await agent.destroy()\n }\n\n // Status: a thrown error wins, but an abort/timeout can also surface as a\n // clean resolve (the loop returns partial stats), so check the signal too.\n let status: HeadlessStatus\n if (error)\n status = timedOut ? 'timeout' : controller.signal.aborted ? 'aborted' : 'error'\n else if (controller.signal.aborted)\n status = timedOut ? 'timeout' : 'aborted'\n else\n status = 'completed'\n\n const rawTranscript = session.turns.slice(runStartIndex)\n const transcript = opts.includeThinking === false ? stripThinking(rawTranscript) : rawTranscript\n const summary = collector.latest()\n\n const result: HeadlessResult = {\n status,\n finalText: extractFinalText(rawTranscript),\n ...(stats?.output ? { output: stats.output } : {}),\n usage: {\n input: stats?.totalIn ?? 0,\n output: stats?.totalOut ?? 0,\n cacheRead: stats?.totalCacheRead ?? 0,\n cacheCreation: stats?.totalCacheCreation ?? 0,\n ...(typeof stats?.cost === 'number' ? { cost: stats.cost } : {}),\n },\n turns: stats?.turns ?? 0,\n durationMs: stats?.elapsed ?? (Date.now() - startedAt),\n numToolCalls: countToolCalls(rawTranscript),\n // Suppress `finishReason` on abort/timeout: the last persisted turn can\n // carry `finishReason: 'stop'` (e.g. the model finished a turn, a follow-up\n // continued, then the run was cancelled), which would make a consumer\n // keyed on `finishReason === 'stop'` misread a cancel as \"model finished\".\n // `status` is authoritative for those exits; let it speak alone. The\n // `'pause'` exhaustion exit keeps `status: 'completed'` so it still\n // surfaces its `finishReason: 'pause'` here.\n ...(status !== 'aborted' && status !== 'timeout' && lastFinishReason(stats)\n ? { finishReason: lastFinishReason(stats) }\n : {}),\n ...(error ? { error } : {}),\n sessionId: session.id,\n ...(summary ? { summary } : {}),\n transcript,\n }\n\n opts.onEvent?.({ type: 'result', result })\n return result\n}\n\n// ---------------------------------------------------------------------------\n// Transcript → OpenAI chat messages (SFT-ready)\n// ---------------------------------------------------------------------------\n\nexport interface OpenAIChatMessage {\n role: 'system' | 'user' | 'assistant' | 'tool'\n content: string | null | OpenAIChatContentPart[]\n tool_calls?: Array<{ id: string, type: 'function', function: { name: string, arguments: string } }>\n tool_call_id?: string\n}\n\nexport type OpenAIChatContentPart\n = | { type: 'text', text: string }\n | { type: 'image_url', image_url: { url: string } }\n | { type: 'input_audio', input_audio: { data: string, format: string } }\n | { type: 'video_url', video_url: { url: string } }\n\n/**\n * Convert raw `session.turns` into standard OpenAI chat-completion messages:\n * assistant turns carry `tool_calls`, and each `tool_result` becomes its own\n * `role: 'tool'` message. This is the drop-in shape for an SFT renderer —\n * unlike `toOpenAI` (session/messages.ts), which emits an internal `_tag`\n * envelope meant for re-sending to a provider, not for training data.\n *\n * Fails closed on corrupt raw turns instead of fabricating tool results; silent\n * placeholders would create structurally-valid but semantically-poisoned SFT\n * examples.\n */\nexport function transcriptToOpenAIMessages(\n turns: SessionTurn[],\n options: { strictToolPairing?: boolean } = {},\n): OpenAIChatMessage[] {\n const { strictToolPairing = true } = options\n const messages: OpenAIChatMessage[] = []\n let chunk: Array<{ role: 'user' | 'assistant', content: SessionContentBlock[] }> = []\n const flushChunk = () => {\n if (chunk.length === 0)\n return\n let paired = chunk\n if (strictToolPairing) {\n const repairs: PairingRepair[] = []\n paired = ensureToolResultPairing(chunk, { onRepair: repair => repairs.push(repair) })\n if (repairs.length > 0) {\n throw new Error(\n `Cannot convert transcript to OpenAI messages: tool pairing repair required (${repairs.map(r => r.mode).join(', ')})`,\n )\n }\n }\n for (const msg of paired)\n pushOpenAIChatMessage(messages, msg)\n chunk = []\n }\n\n for (const turn of turns) {\n if (turn.role === 'system') {\n flushChunk()\n messages.push({ role: 'system', content: textOf(turn.content) })\n continue\n }\n // Non-wire turns (display-only `command`, and any future non-wire role)\n // never reach the model — shared, fail-safe guard.\n if (!isWireTurn(turn))\n continue\n chunk.push({ role: turn.role, content: turn.content })\n }\n flushChunk()\n\n return messages\n}\n\nfunction pushOpenAIChatMessage(messages: OpenAIChatMessage[], msg: { role: 'user' | 'assistant', content: SessionContentBlock[] }): void {\n const text = textOf(msg.content)\n\n if (msg.role === 'assistant') {\n const toolCalls = msg.content.filter((b): b is ToolCallBlock => b.type === 'tool_call')\n const out: OpenAIChatMessage = { role: 'assistant', content: text || null }\n if (toolCalls.length > 0) {\n out.tool_calls = toolCalls.map(b => ({\n id: b.id,\n type: 'function' as const,\n function: { name: b.name, arguments: JSON.stringify(b.input) },\n }))\n }\n messages.push(out)\n return\n }\n\n // user turn — may carry prompt text/images and/or tool_result blocks\n const userParts = contentPartsFromBlocks(msg.content)\n if (userParts.length > 0)\n messages.push({ role: 'user', content: simplifyOpenAIContent(userParts) })\n\n for (const tr of msg.content.filter((b): b is ToolResultBlock => b.type === 'tool_result')) {\n const { text, images } = summarizeToolResultForOpenAI(tr.output)\n if (images.length === 0) {\n messages.push({ role: 'tool', tool_call_id: tr.callId, content: text })\n continue\n }\n\n const noun = images.length === 1 ? 'image' : 'images'\n const marker = `[${images.length} ${noun} attached — see next user message]`\n messages.push({\n role: 'tool',\n tool_call_id: tr.callId,\n content: text.length > 0 ? `${text}\\n\\n${marker}` : marker,\n })\n messages.push({\n role: 'user',\n content: [\n ...images.map(toOpenAIImagePart),\n { type: 'text', text: `(${noun} returned by tool call ${tr.callId})` },\n ],\n })\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\n\ntype TextBlock = Extract<SessionContentBlock, { type: 'text' }>\ntype ToolCallBlock = Extract<SessionContentBlock, { type: 'tool_call' }>\ntype ToolResultBlock = Extract<SessionContentBlock, { type: 'tool_result' }>\n\nfunction noop(): void {}\n\nfunction textOf(content: SessionContentBlock[]): string {\n return content.filter((b): b is TextBlock => b.type === 'text').map(b => b.text).join('')\n}\n\nfunction contentPartsFromBlocks(content: SessionContentBlock[]): OpenAIChatContentPart[] {\n const parts: OpenAIChatContentPart[] = []\n for (const block of content) {\n if (block.type === 'image') {\n assertResolvedMediaBlock(block, 'OpenAI transcript messages')\n parts.push(toOpenAIImagePart(block))\n }\n else if (block.type === 'audio') {\n parts.push({ type: 'input_audio', input_audio: { data: block.data, format: audioFormatFromMediaType(block.mediaType) } })\n }\n else if (block.type === 'video') {\n parts.push({ type: 'video_url', video_url: { url: `data:${block.mediaType};base64,${block.data}` } })\n }\n else if (block.type === 'document') {\n assertResolvedMediaBlock(block, 'OpenAI transcript messages')\n parts.push({ type: 'text', text: documentMarker(block) })\n }\n else if (block.type === 'text' && block.text.length > 0) {\n parts.push({ type: 'text', text: block.text })\n }\n }\n return parts\n}\n\nfunction simplifyOpenAIContent(parts: OpenAIChatContentPart[]): string | OpenAIChatContentPart[] {\n if (parts.length === 1 && parts[0].type === 'text')\n return parts[0].text\n return parts\n}\n\nfunction toOpenAIImagePart(image: { mediaType: string, data: string }): OpenAIChatContentPart {\n return {\n type: 'image_url',\n image_url: { url: `data:${image.mediaType};base64,${image.data}` },\n }\n}\n\nfunction summarizeToolResultForOpenAI(output: string | ToolResultContent[]): {\n text: string\n images: Array<{ mediaType: string, data: string }>\n} {\n if (typeof output === 'string')\n return { text: output, images: [] }\n\n const texts: string[] = []\n const images: Array<{ mediaType: string, data: string }> = []\n for (const block of output) {\n if (block.type === 'text') {\n texts.push(block.text)\n }\n else if (block.type === 'image') {\n assertResolvedMediaBlock(block, 'OpenAI transcript messages')\n images.push({ mediaType: block.mediaType, data: block.data })\n }\n else if (block.type === 'audio') {\n texts.push(`[audio: ${block.mediaType}]`)\n }\n else if (block.type === 'video') {\n texts.push(`[video: ${block.mediaType}]`)\n }\n else {\n assertResolvedMediaBlock(block, 'OpenAI transcript messages')\n texts.push(documentMarker(block))\n }\n }\n return { text: texts.join('\\n'), images }\n}\n\nfunction documentMarker(doc: ToolResultDocumentContent): string {\n return documentBlockMarker(doc, 'document omitted')\n}\n\nfunction extractFinalText(turns: SessionTurn[]): string {\n for (let i = turns.length - 1; i >= 0; i--) {\n const turn = turns[i]\n if (turn.role !== 'assistant')\n continue\n const text = textOf(turn.content)\n if (text)\n return text\n }\n return ''\n}\n\nfunction countToolCalls(turns: SessionTurn[]): number {\n let n = 0\n for (const turn of turns) {\n for (const block of turn.content) {\n if (block.type === 'tool_call')\n n++\n }\n }\n return n\n}\n\nfunction lastFinishReason(stats?: AgentStats): TurnFinishReason | undefined {\n const usages = stats?.turnUsage\n if (!usages)\n return undefined\n for (let i = usages.length - 1; i >= 0; i--) {\n if (usages[i].finishReason)\n return usages[i].finishReason\n }\n return undefined\n}\n\nfunction stripThinking(turns: SessionTurn[]): SessionTurn[] {\n return turns.map(turn => ({\n ...turn,\n content: turn.content.filter(b => b.type !== 'thinking' && b.type !== 'redacted_thinking'),\n }))\n}\n\nexport function installHeadlessEventAdapter(\n hooks: Hookable<AgentHooks>,\n onEvent: (event: HeadlessEvent) => void,\n): () => void {\n const unregs: Array<() => void> = []\n const emittedTurnIds = new Set<string>()\n const emit = (event: HeadlessEvent): void => {\n try {\n onEvent(event)\n }\n catch {\n // A consumer's sink throwing is not the adapter's concern.\n }\n }\n\n unregs.push(hooks.hook('agent:start', ctx => emit({\n type: 'start',\n runId: ctx.runId,\n ...(ctx.providerName ? { provider: ctx.providerName } : {}),\n })))\n unregs.push(hooks.hook('stream:text', ctx => emit({ type: 'text', delta: ctx.delta })))\n unregs.push(hooks.hook('stream:thinking', ctx => emit({ type: 'thinking', delta: ctx.delta })))\n unregs.push(hooks.hook('tool:before', ctx => emit({\n type: 'tool_call',\n callId: ctx.callId,\n name: ctx.name,\n input: ctx.input,\n })))\n unregs.push(hooks.hook('tool:after', ctx => emit({\n type: 'tool_result',\n callId: ctx.callId,\n name: ctx.name,\n output: toolResultToText(ctx.result),\n isError: false,\n })))\n unregs.push(hooks.hook('tool:error', ctx => emit({\n type: 'tool_result',\n callId: ctx.callId,\n name: ctx.name,\n output: ctx.error.message,\n isError: true,\n })))\n unregs.push(hooks.hook('session:turns', (ctx) => {\n const startIndex = ctx.count - ctx.turns.length\n ctx.turns.forEach((turn, i) => {\n if (emittedTurnIds.has(turn.id))\n return\n emittedTurnIds.add(turn.id)\n emit({ type: 'turn', index: startIndex + i, turn })\n })\n }))\n unregs.push(hooks.hook('spawn:before', ctx => emit({ type: 'spawn', event: 'before', id: ctx.id })))\n unregs.push(hooks.hook('spawn:complete', ctx => emit({\n type: 'spawn',\n event: 'complete',\n id: ctx.id,\n info: { status: ctx.status ?? 'completed' },\n })))\n unregs.push(hooks.hook('spawn:error', ctx => emit({\n type: 'spawn',\n event: 'error',\n id: ctx.id,\n info: { message: ctx.error.message },\n })))\n unregs.push(hooks.hook('stream:error', ctx => emit({\n type: 'error',\n message: ctx.err instanceof Error ? ctx.err.message : String(ctx.err),\n ...(ctx.err instanceof Error ? { errorType: ctx.err.name } : {}),\n })))\n\n return () => {\n for (const un of unregs) {\n try {\n un()\n }\n catch {\n // ignore\n }\n }\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"headless.js","names":["basic"],"sources":["../src/headless.ts"],"sourcesContent":["/**\n * Headless mode — a non-interactive, fully-structured way to drive the agent\n * for automation and RL rollouts.\n *\n * `agent.run()` already returns rich {@link AgentStats}, the session captures a\n * lossless transcript (`session.turns`), and the hook bus exposes every\n * streaming/tool/turn event. What this module adds is the *contract* an RL loop\n * needs: one call (`runHeadless`) that runs a prompt to completion in a chosen\n * workdir, bounded by turns + wall-clock, and hands back a single serializable\n * {@link HeadlessResult} — final answer, verifiable structured output, usage,\n * and the complete trajectory — plus an optional live {@link HeadlessEvent}\n * stream (the in-process equivalent of `--output-format stream-json`).\n *\n * It is provider-agnostic: the caller passes a built {@link Provider} (e.g.\n * `local()` pointed at a vLLM server, or any of the named providers). The thin\n * CLI in `src/headless-cli.ts` wraps this with arg parsing, file/stdin I/O, and\n * JSONL transcript writing.\n */\n\nimport type { Hookable } from 'hookable'\nimport type { AgentHooks, AgentOptions } from './agent'\nimport type { ExecutionContext } from './contexts'\nimport type { ExtensionRegistry } from './extensions'\nimport type { Preset } from './presets'\nimport type { Provider } from './providers'\nimport type { RunSummary } from './run-summary'\nimport type { Session, SessionStore } from './session'\nimport type { PairingRepair } from './session/messages'\nimport type { ToolDef } from './tools'\nimport type {\n AgentStats,\n McpServerConfig,\n PromptPart,\n SessionContentBlock,\n SessionTurn,\n ThinkingLevel,\n ToolResultContent,\n ToolResultDocumentContent,\n TurnFinishReason,\n} from './types'\nimport { createAgent } from './agent'\nimport { createProcessContext } from './contexts'\nimport { basic } from './presets'\nimport { createRunSummaryCollector } from './run-summary'\nimport { createMemoryStore, createSession, toAnthropic } from './session'\nimport { ensureToolResultPairing } from './session/messages'\nimport { audioFormatFromMediaType } from './tools/media-sniff'\nimport { assertResolvedMediaBlock, documentBlockMarker, isWireTurn, toolResultToText } from './types'\n\n// ---------------------------------------------------------------------------\n// Public shapes\n// ---------------------------------------------------------------------------\n\nexport type HeadlessStatus = 'completed' | 'aborted' | 'error' | 'timeout'\n\nexport interface HeadlessUsage {\n input: number\n output: number\n cacheRead: number\n cacheCreation: number\n /** Cumulative USD cost when the provider/registry could price the run. */\n cost?: number\n}\n\nexport interface HeadlessErrorInfo {\n message: string\n /** Typed-error class name (`AgentAbortedError`, `AgentContextExceededError`, …). */\n type: string\n}\n\n/**\n * Strictly JSON-serializable postmortem of one headless run. Everything an RL\n * reward function needs: the final answer (`finalText`), the verifiable\n * structured output (`output`, present iff a `schema` was set), usage/turns,\n * and the lossless `transcript` (the SFT training data).\n */\nexport interface HeadlessResult {\n status: HeadlessStatus\n /** Concatenated text of the last assistant turn that produced any text. */\n finalText: string\n /** Schema-enforced structured output (only when `opts.schema` is set). */\n output?: Record<string, unknown>\n usage: HeadlessUsage\n turns: number\n durationMs: number\n /** Total `tool_call` blocks across the whole transcript. */\n numToolCalls: number\n /** Finish reason of the final turn that reported one. */\n finishReason?: TurnFinishReason\n error?: HeadlessErrorInfo\n sessionId: string\n /** Incident postmortem (errors, gate blocks, budget events) via run-summary. */\n summary?: RunSummary\n /** Lossless transcript — raw `session.turns`. Thinking stripped when `includeThinking: false`. */\n transcript: SessionTurn[]\n}\n\nexport type HeadlessOutputFormat = 'zidane' | 'provider'\n\nexport type ProviderTranscriptFormat = 'anthropic' | 'openai'\n\nexport type FormattedHeadlessResult\n = | HeadlessResult\n | unknown[]\n\nexport type FormattedHeadlessTurnEvent\n = | Extract<HeadlessEvent, { type: 'turn' }>\n | unknown[]\n\nexport function exitCodeForHeadlessResult(result: HeadlessResult): number {\n switch (result.status) {\n case 'completed': return 0\n case 'timeout': return 124\n case 'aborted': return 130\n case 'error':\n default: return 1\n }\n}\n\n/**\n * Live event union — the in-process equivalent of a `stream-json` line. Every\n * member is JSON-serializable; render to JSONL with {@link headlessEventToJsonl}.\n */\nexport type HeadlessEvent\n = | { type: 'start', runId: string, provider?: string }\n | { type: 'text', delta: string }\n | { type: 'thinking', delta: string }\n | { type: 'tool_call', callId: string, name: string, input: Record<string, unknown> }\n | { type: 'tool_result', callId: string, name: string, output: string, isError: boolean }\n | { type: 'turn', index: number, turn: SessionTurn }\n | { type: 'spawn', event: 'before' | 'complete' | 'error', id: string, info?: Record<string, unknown> }\n | { type: 'error', message: string, errorType?: string }\n | { type: 'result', result: HeadlessResult }\n\n/** Serialize one event as a newline-terminated JSON line (stream-json). */\nexport function headlessEventToJsonl(event: HeadlessEvent): string {\n return `${JSON.stringify(event)}\\n`\n}\n\nexport function formattedHeadlessTurnEventToJsonl(event: FormattedHeadlessTurnEvent): string {\n return `${JSON.stringify(event)}\\n`\n}\n\nexport function providerTranscriptFormatForProvider(providerName: string): ProviderTranscriptFormat {\n return providerName === 'anthropic' ? 'anthropic' : 'openai'\n}\n\nexport function transcriptToProviderMessages(\n turns: SessionTurn[],\n providerName: string,\n): unknown[] {\n const format = providerTranscriptFormatForProvider(providerName)\n if (format === 'anthropic') {\n return turns\n .filter(isWireTurn)\n .map(turn => toAnthropic({ role: turn.role, content: turn.content }))\n }\n return transcriptToOpenAIMessages(turns, { strictToolPairing: false })\n}\n\nexport function formatHeadlessResult(\n result: HeadlessResult,\n options: { format: HeadlessOutputFormat, providerName: string },\n): FormattedHeadlessResult {\n if (options.format === 'zidane')\n return result\n return transcriptToProviderMessages(result.transcript, options.providerName)\n}\n\nexport function formatHeadlessTurnEvent(\n event: Extract<HeadlessEvent, { type: 'turn' }>,\n options: { format: HeadlessOutputFormat, providerName: string },\n): FormattedHeadlessTurnEvent {\n if (options.format === 'zidane')\n return event\n return transcriptToProviderMessages([event.turn], options.providerName)\n}\n\nexport interface HeadlessOptions {\n /** User prompt — plain string or multimodal `PromptPart[]`. */\n prompt: string | PromptPart[]\n /** Built provider (e.g. `local()`, `openaiCompat(...)`, `anthropic(...)`). */\n provider: Provider\n model?: string\n /** Override the preset system prompt for this run. */\n system?: string\n thinking?: ThinkingLevel\n maxTurns?: number\n maxTokens?: number\n /** Wall-clock cap; on expiry the run is aborted and `status` becomes `'timeout'`. */\n timeoutMs?: number\n /** External abort signal — chained with the internal timeout controller. */\n signal?: AbortSignal\n /** JSON Schema for structured-output enforcement → populates `result.output`. */\n schema?: Record<string, unknown>\n /** Agent behavior defaults for this headless run. Top-level shortcuts below override matching fields. */\n behavior?: AgentOptions['behavior']\n /** Tool overrides. Omit to use the basic preset's tools. */\n tools?: Record<string, ToolDef>\n mcpServers?: McpServerConfig[]\n skills?: AgentOptions['skills']\n /**\n * Base {@link Preset} for the agent — spread in place of the default `basic`\n * preset (use it to swap the system prompt / tool set wholesale). The\n * top-level shortcuts above (`system`, `behavior`, `tools`, `mcpServers`,\n * `skills`) still override matching preset fields.\n */\n preset?: Preset\n /**\n * Pre-built extension registry folded into the agent via `createAgent`\n * (build it with `buildExtensionRegistry(defs.map(inlineLoadedExtension))`).\n * Contributes the registry's tools / hooks / mcpServers / skills /\n * system-fragments / subagents, with the explicit options above winning on\n * collision. Because hooks fold through `createAgent`, a headless run with\n * `extensions` also gets extension hooks (e.g. a `tool:transform` that\n * rewrites results), not just tools.\n */\n extensions?: ExtensionRegistry\n /** Execution context. Defaults to a process context rooted at `cwd`. */\n execution?: ExecutionContext\n /** Working directory for the default process context (ignored if `execution` is set). */\n cwd?: string\n /** Reuse / resume an existing session. */\n session?: Session\n /** Session store for a fresh session (defaults to an in-memory store). */\n store?: SessionStore\n /** Keep `thinking` blocks in `result.transcript` (default true). */\n includeThinking?: boolean\n /** Live event callback — the in-process stream-json equivalent. */\n onEvent?: (event: HeadlessEvent) => void\n}\n\n// ---------------------------------------------------------------------------\n// runHeadless\n// ---------------------------------------------------------------------------\n\n/**\n * Run a prompt to completion, headless, and return a single serializable\n * {@link HeadlessResult}. Safe to call concurrently for parallel rollouts —\n * each call builds its own agent + session and tears them down in `finally`.\n */\nexport async function runHeadless(opts: HeadlessOptions): Promise<HeadlessResult> {\n const startedAt = Date.now()\n const execution = opts.execution ?? createProcessContext({ cwd: opts.cwd })\n const session = opts.session ?? await createSession({ store: opts.store ?? createMemoryStore() })\n\n // Layer behavior on top of the base preset's: the `behavior` key is spread\n // last into `createAgent`, so without seeding from `basePreset.behavior` a\n // custom `preset` carrying behavior defaults would be silently wiped (the\n // top-level shortcuts are meant to OVERRIDE preset fields, not replace them).\n const basePreset = opts.preset ?? basic\n // `mediaKeepTurns` defaults ON for headless runs (matching the built-in\n // chat profiles): a PDF/screenshot-heavy trajectory would otherwise re-ship\n // every base64 payload on every request until it slams into the context\n // window and has to be rescued by the reactive overflow recovery. Wire-only\n // and re-resolvable via `read_file path=\"attachment://…\"`, so nothing is\n // lost. A preset or explicit `behavior` still overrides — passing\n // `behavior: { mediaKeepTurns: undefined }` disables the pass entirely\n // (the explicit key wins the spread and the loop skips non-numbers).\n const behavior: NonNullable<AgentOptions['behavior']> = { mediaKeepTurns: 8, ...basePreset.behavior, ...(opts.behavior ?? {}) }\n if (opts.maxTurns !== undefined)\n behavior.maxTurns = opts.maxTurns\n if (opts.maxTokens !== undefined)\n behavior.maxTokens = opts.maxTokens\n if (opts.schema !== undefined)\n behavior.schema = opts.schema\n\n const agent = createAgent({\n ...basePreset,\n provider: opts.provider,\n execution,\n session,\n behavior,\n ...(opts.tools !== undefined ? { tools: opts.tools } : {}),\n ...(opts.mcpServers !== undefined ? { mcpServers: opts.mcpServers } : {}),\n ...(opts.skills !== undefined ? { skills: opts.skills } : {}),\n ...(opts.extensions !== undefined ? { extensions: opts.extensions } : {}),\n })\n\n const collector = createRunSummaryCollector()\n const uninstallSummary = collector.install(agent.hooks)\n const uninstallEvents = opts.onEvent ? installHeadlessEventAdapter(agent.hooks, opts.onEvent) : noop\n\n // Resumed sessions carry turns from prior runs — remember where this run\n // starts so transcript/finalText/numToolCalls stay per-run, matching the\n // per-run usage/turns/durationMs stats.\n const runStartIndex = session.turns.length\n\n // Internal controller drives the wall-clock timeout and chains any external\n // signal so a host cancel and a timeout both abort the same run. The\n // listener is removed in `finally` — a long-lived host signal must not\n // accumulate one listener per rollout.\n const controller = new AbortController()\n const onExternalAbort = (): void => controller.abort(opts.signal!.reason)\n if (opts.signal) {\n if (opts.signal.aborted)\n controller.abort(opts.signal.reason)\n else\n opts.signal.addEventListener('abort', onExternalAbort, { once: true })\n }\n let timedOut = false\n const timer = opts.timeoutMs && opts.timeoutMs > 0\n ? setTimeout(() => {\n timedOut = true\n controller.abort(new Error(`Headless run timed out after ${opts.timeoutMs}ms`))\n }, opts.timeoutMs)\n : undefined\n\n let stats: AgentStats | undefined\n let error: HeadlessErrorInfo | undefined\n\n try {\n stats = await agent.run({\n prompt: opts.prompt,\n signal: controller.signal,\n ...(opts.model !== undefined ? { model: opts.model } : {}),\n ...(opts.system !== undefined ? { system: opts.system } : {}),\n ...(opts.thinking !== undefined ? { thinking: opts.thinking } : {}),\n })\n }\n catch (err) {\n // The agent loop throws typed errors (AgentAbortedError,\n // AgentContextExceededError, AgentProviderError, …) — their `name` already\n // classifies the failure, so surface it directly.\n const e = err instanceof Error ? err : new Error(String(err))\n error = { message: e.message, type: e.name }\n }\n finally {\n if (timer)\n clearTimeout(timer)\n opts.signal?.removeEventListener('abort', onExternalAbort)\n uninstallEvents()\n uninstallSummary()\n await agent.destroy()\n }\n\n // Status: a thrown error wins, but an abort/timeout can also surface as a\n // clean resolve (the loop returns partial stats), so check the signal too.\n let status: HeadlessStatus\n if (error)\n status = timedOut ? 'timeout' : controller.signal.aborted ? 'aborted' : 'error'\n else if (controller.signal.aborted)\n status = timedOut ? 'timeout' : 'aborted'\n else\n status = 'completed'\n\n const rawTranscript = session.turns.slice(runStartIndex)\n const transcript = opts.includeThinking === false ? stripThinking(rawTranscript) : rawTranscript\n const summary = collector.latest()\n\n const result: HeadlessResult = {\n status,\n finalText: extractFinalText(rawTranscript),\n ...(stats?.output ? { output: stats.output } : {}),\n usage: {\n input: stats?.totalIn ?? 0,\n output: stats?.totalOut ?? 0,\n cacheRead: stats?.totalCacheRead ?? 0,\n cacheCreation: stats?.totalCacheCreation ?? 0,\n ...(typeof stats?.cost === 'number' ? { cost: stats.cost } : {}),\n },\n turns: stats?.turns ?? 0,\n durationMs: stats?.elapsed ?? (Date.now() - startedAt),\n numToolCalls: countToolCalls(rawTranscript),\n // Suppress `finishReason` on abort/timeout: the last persisted turn can\n // carry `finishReason: 'stop'` (e.g. the model finished a turn, a follow-up\n // continued, then the run was cancelled), which would make a consumer\n // keyed on `finishReason === 'stop'` misread a cancel as \"model finished\".\n // `status` is authoritative for those exits; let it speak alone. The\n // `'pause'` exhaustion exit keeps `status: 'completed'` so it still\n // surfaces its `finishReason: 'pause'` here.\n ...(status !== 'aborted' && status !== 'timeout' && lastFinishReason(stats)\n ? { finishReason: lastFinishReason(stats) }\n : {}),\n ...(error ? { error } : {}),\n sessionId: session.id,\n ...(summary ? { summary } : {}),\n transcript,\n }\n\n opts.onEvent?.({ type: 'result', result })\n return result\n}\n\n// ---------------------------------------------------------------------------\n// Transcript → OpenAI chat messages (SFT-ready)\n// ---------------------------------------------------------------------------\n\nexport interface OpenAIChatMessage {\n role: 'system' | 'user' | 'assistant' | 'tool'\n content: string | null | OpenAIChatContentPart[]\n tool_calls?: Array<{ id: string, type: 'function', function: { name: string, arguments: string } }>\n tool_call_id?: string\n}\n\nexport type OpenAIChatContentPart\n = | { type: 'text', text: string }\n | { type: 'image_url', image_url: { url: string } }\n | { type: 'input_audio', input_audio: { data: string, format: string } }\n | { type: 'video_url', video_url: { url: string } }\n\n/**\n * Convert raw `session.turns` into standard OpenAI chat-completion messages:\n * assistant turns carry `tool_calls`, and each `tool_result` becomes its own\n * `role: 'tool'` message. This is the drop-in shape for an SFT renderer —\n * unlike `toOpenAI` (session/messages.ts), which emits an internal `_tag`\n * envelope meant for re-sending to a provider, not for training data.\n *\n * Fails closed on corrupt raw turns instead of fabricating tool results; silent\n * placeholders would create structurally-valid but semantically-poisoned SFT\n * examples.\n */\nexport function transcriptToOpenAIMessages(\n turns: SessionTurn[],\n options: { strictToolPairing?: boolean } = {},\n): OpenAIChatMessage[] {\n const { strictToolPairing = true } = options\n const messages: OpenAIChatMessage[] = []\n let chunk: Array<{ role: 'user' | 'assistant', content: SessionContentBlock[] }> = []\n const flushChunk = () => {\n if (chunk.length === 0)\n return\n let paired = chunk\n if (strictToolPairing) {\n const repairs: PairingRepair[] = []\n paired = ensureToolResultPairing(chunk, { onRepair: repair => repairs.push(repair) })\n if (repairs.length > 0) {\n throw new Error(\n `Cannot convert transcript to OpenAI messages: tool pairing repair required (${repairs.map(r => r.mode).join(', ')})`,\n )\n }\n }\n for (const msg of paired)\n pushOpenAIChatMessage(messages, msg)\n chunk = []\n }\n\n for (const turn of turns) {\n if (turn.role === 'system') {\n flushChunk()\n messages.push({ role: 'system', content: textOf(turn.content) })\n continue\n }\n // Non-wire turns (display-only `command`, and any future non-wire role)\n // never reach the model — shared, fail-safe guard.\n if (!isWireTurn(turn))\n continue\n chunk.push({ role: turn.role, content: turn.content })\n }\n flushChunk()\n\n return messages\n}\n\nfunction pushOpenAIChatMessage(messages: OpenAIChatMessage[], msg: { role: 'user' | 'assistant', content: SessionContentBlock[] }): void {\n const text = textOf(msg.content)\n\n if (msg.role === 'assistant') {\n const toolCalls = msg.content.filter((b): b is ToolCallBlock => b.type === 'tool_call')\n const out: OpenAIChatMessage = { role: 'assistant', content: text || null }\n if (toolCalls.length > 0) {\n out.tool_calls = toolCalls.map(b => ({\n id: b.id,\n type: 'function' as const,\n function: { name: b.name, arguments: JSON.stringify(b.input) },\n }))\n }\n messages.push(out)\n return\n }\n\n // user turn — may carry prompt text/images and/or tool_result blocks\n const userParts = contentPartsFromBlocks(msg.content)\n if (userParts.length > 0)\n messages.push({ role: 'user', content: simplifyOpenAIContent(userParts) })\n\n for (const tr of msg.content.filter((b): b is ToolResultBlock => b.type === 'tool_result')) {\n const { text, images } = summarizeToolResultForOpenAI(tr.output)\n if (images.length === 0) {\n messages.push({ role: 'tool', tool_call_id: tr.callId, content: text })\n continue\n }\n\n const noun = images.length === 1 ? 'image' : 'images'\n const marker = `[${images.length} ${noun} attached — see next user message]`\n messages.push({\n role: 'tool',\n tool_call_id: tr.callId,\n content: text.length > 0 ? `${text}\\n\\n${marker}` : marker,\n })\n messages.push({\n role: 'user',\n content: [\n ...images.map(toOpenAIImagePart),\n { type: 'text', text: `(${noun} returned by tool call ${tr.callId})` },\n ],\n })\n }\n}\n\n// ---------------------------------------------------------------------------\n// Internals\n// ---------------------------------------------------------------------------\n\ntype TextBlock = Extract<SessionContentBlock, { type: 'text' }>\ntype ToolCallBlock = Extract<SessionContentBlock, { type: 'tool_call' }>\ntype ToolResultBlock = Extract<SessionContentBlock, { type: 'tool_result' }>\n\nfunction noop(): void {}\n\nfunction textOf(content: SessionContentBlock[]): string {\n return content.filter((b): b is TextBlock => b.type === 'text').map(b => b.text).join('')\n}\n\nfunction contentPartsFromBlocks(content: SessionContentBlock[]): OpenAIChatContentPart[] {\n const parts: OpenAIChatContentPart[] = []\n for (const block of content) {\n if (block.type === 'image') {\n assertResolvedMediaBlock(block, 'OpenAI transcript messages')\n parts.push(toOpenAIImagePart(block))\n }\n else if (block.type === 'audio') {\n parts.push({ type: 'input_audio', input_audio: { data: block.data, format: audioFormatFromMediaType(block.mediaType) } })\n }\n else if (block.type === 'video') {\n parts.push({ type: 'video_url', video_url: { url: `data:${block.mediaType};base64,${block.data}` } })\n }\n else if (block.type === 'document') {\n assertResolvedMediaBlock(block, 'OpenAI transcript messages')\n parts.push({ type: 'text', text: documentMarker(block) })\n }\n else if (block.type === 'text' && block.text.length > 0) {\n parts.push({ type: 'text', text: block.text })\n }\n }\n return parts\n}\n\nfunction simplifyOpenAIContent(parts: OpenAIChatContentPart[]): string | OpenAIChatContentPart[] {\n if (parts.length === 1 && parts[0].type === 'text')\n return parts[0].text\n return parts\n}\n\nfunction toOpenAIImagePart(image: { mediaType: string, data: string }): OpenAIChatContentPart {\n return {\n type: 'image_url',\n image_url: { url: `data:${image.mediaType};base64,${image.data}` },\n }\n}\n\nfunction summarizeToolResultForOpenAI(output: string | ToolResultContent[]): {\n text: string\n images: Array<{ mediaType: string, data: string }>\n} {\n if (typeof output === 'string')\n return { text: output, images: [] }\n\n const texts: string[] = []\n const images: Array<{ mediaType: string, data: string }> = []\n for (const block of output) {\n if (block.type === 'text') {\n texts.push(block.text)\n }\n else if (block.type === 'image') {\n assertResolvedMediaBlock(block, 'OpenAI transcript messages')\n images.push({ mediaType: block.mediaType, data: block.data })\n }\n else if (block.type === 'audio') {\n texts.push(`[audio: ${block.mediaType}]`)\n }\n else if (block.type === 'video') {\n texts.push(`[video: ${block.mediaType}]`)\n }\n else {\n assertResolvedMediaBlock(block, 'OpenAI transcript messages')\n texts.push(documentMarker(block))\n }\n }\n return { text: texts.join('\\n'), images }\n}\n\nfunction documentMarker(doc: ToolResultDocumentContent): string {\n return documentBlockMarker(doc, 'document omitted')\n}\n\nfunction extractFinalText(turns: SessionTurn[]): string {\n for (let i = turns.length - 1; i >= 0; i--) {\n const turn = turns[i]\n if (turn.role !== 'assistant')\n continue\n const text = textOf(turn.content)\n if (text)\n return text\n }\n return ''\n}\n\nfunction countToolCalls(turns: SessionTurn[]): number {\n let n = 0\n for (const turn of turns) {\n for (const block of turn.content) {\n if (block.type === 'tool_call')\n n++\n }\n }\n return n\n}\n\nfunction lastFinishReason(stats?: AgentStats): TurnFinishReason | undefined {\n const usages = stats?.turnUsage\n if (!usages)\n return undefined\n for (let i = usages.length - 1; i >= 0; i--) {\n if (usages[i].finishReason)\n return usages[i].finishReason\n }\n return undefined\n}\n\nfunction stripThinking(turns: SessionTurn[]): SessionTurn[] {\n return turns.map(turn => ({\n ...turn,\n content: turn.content.filter(b => b.type !== 'thinking' && b.type !== 'redacted_thinking'),\n }))\n}\n\nexport function installHeadlessEventAdapter(\n hooks: Hookable<AgentHooks>,\n onEvent: (event: HeadlessEvent) => void,\n): () => void {\n const unregs: Array<() => void> = []\n const emittedTurnIds = new Set<string>()\n const emit = (event: HeadlessEvent): void => {\n try {\n onEvent(event)\n }\n catch {\n // A consumer's sink throwing is not the adapter's concern.\n }\n }\n\n unregs.push(hooks.hook('agent:start', ctx => emit({\n type: 'start',\n runId: ctx.runId,\n ...(ctx.providerName ? { provider: ctx.providerName } : {}),\n })))\n unregs.push(hooks.hook('stream:text', ctx => emit({ type: 'text', delta: ctx.delta })))\n unregs.push(hooks.hook('stream:thinking', ctx => emit({ type: 'thinking', delta: ctx.delta })))\n unregs.push(hooks.hook('tool:before', ctx => emit({\n type: 'tool_call',\n callId: ctx.callId,\n name: ctx.name,\n input: ctx.input,\n })))\n unregs.push(hooks.hook('tool:after', ctx => emit({\n type: 'tool_result',\n callId: ctx.callId,\n name: ctx.name,\n output: toolResultToText(ctx.result),\n isError: false,\n })))\n unregs.push(hooks.hook('tool:error', ctx => emit({\n type: 'tool_result',\n callId: ctx.callId,\n name: ctx.name,\n output: ctx.error.message,\n isError: true,\n })))\n unregs.push(hooks.hook('session:turns', (ctx) => {\n const startIndex = ctx.count - ctx.turns.length\n ctx.turns.forEach((turn, i) => {\n if (emittedTurnIds.has(turn.id))\n return\n emittedTurnIds.add(turn.id)\n emit({ type: 'turn', index: startIndex + i, turn })\n })\n }))\n unregs.push(hooks.hook('spawn:before', ctx => emit({ type: 'spawn', event: 'before', id: ctx.id })))\n unregs.push(hooks.hook('spawn:complete', ctx => emit({\n type: 'spawn',\n event: 'complete',\n id: ctx.id,\n info: { status: ctx.status ?? 'completed' },\n })))\n unregs.push(hooks.hook('spawn:error', ctx => emit({\n type: 'spawn',\n event: 'error',\n id: ctx.id,\n info: { message: ctx.error.message },\n })))\n unregs.push(hooks.hook('stream:error', ctx => emit({\n type: 'error',\n message: ctx.err instanceof Error ? ctx.err.message : String(ctx.err),\n ...(ctx.err instanceof Error ? { errorType: ctx.err.name } : {}),\n })))\n\n return () => {\n for (const un of unregs) {\n try {\n un()\n }\n catch {\n // ignore\n }\n }\n }\n}\n"],"mappings":"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"}
@@ -3171,9 +3171,10 @@ interface AgentBehavior {
3171
3171
  * The frontier is chunk-snapped for prompt-cache stability — media drops
3172
3172
  * out in discrete jumps, not one block per turn. `0` ages out ALL media;
3173
3173
  * `undefined` (default) disables the pass entirely (current behavior — media
3174
- * rides every turn). The built-in chat profiles enable it.
3174
+ * rides every turn). The built-in chat profiles AND `runHeadless` enable it
3175
+ * (`8`); only raw `createAgent` leaves it off.
3175
3176
  *
3176
- * Default: `undefined` (off).
3177
+ * Default: `undefined` (off) for `createAgent`; `8` under `runHeadless`.
3177
3178
  */
3178
3179
  mediaKeepTurns?: number;
3179
3180
  /**
@@ -3299,6 +3300,28 @@ interface AgentBehavior {
3299
3300
  * Set a positive integer to re-arm the cap.
3300
3301
  */
3301
3302
  maxConsecutivePauseTurns?: number;
3303
+ /**
3304
+ * Cap on consecutive refusal recoveries within a single run. A turn the
3305
+ * provider ends with `finishReason: 'content-filter'` (e.g. Anthropic
3306
+ * `stop_reason: refusal`) and no tool calls would otherwise end the run
3307
+ * silently mid-task — an empty assistant turn and a "completed" status
3308
+ * that reads as a stalled session. The loop injects a synthetic continue
3309
+ * (marked via `SessionTurn.display` so replays render it as a synthetic
3310
+ * echo, not a user prompt) and re-enters; refusals are usually transient.
3311
+ *
3312
+ * Every resume re-bills the full input context, so keep the cap small.
3313
+ * When consecutive refusal resumes reach it, the loop exits cleanly with
3314
+ * the last turn's `TurnUsage.finishReason` still `'content-filter'` so
3315
+ * consumers can surface the refusal from `stats`.
3316
+ *
3317
+ * NOTE: semantics deliberately differ from
3318
+ * {@link AgentBehavior.maxConsecutivePauseTurns} — `0` DISABLES the
3319
+ * recovery entirely (a refusal ends the run immediately, pre-6.x
3320
+ * behavior); unlimited refusal retries are never offered.
3321
+ *
3322
+ * Default: `3`.
3323
+ */
3324
+ maxConsecutiveRefusalResumes?: number;
3302
3325
  /**
3303
3326
  * Auto-resume on output-cap truncation. When `true`, a turn that hits
3304
3327
  * `max_tokens` (`finishReason: 'length'`) without completing a tool call
@@ -6172,6 +6195,13 @@ interface CacheDimensionDiff {
6172
6195
  changed: readonly CacheDimensionName[];
6173
6196
  /** Per-dimension details — only filled for changed dimensions. */
6174
6197
  details: Readonly<Partial<Record<CacheDimensionName, string>>>;
6198
+ /**
6199
+ * Message index where the prefixes diverged, when `changed` includes
6200
+ * `'messagePrefix'`. Chunk-aligned values (multiples of the compaction
6201
+ * chunk) point at tail compaction / media age-out; non-aligned values point
6202
+ * at stale-read stubbing or host-side history surgery.
6203
+ */
6204
+ messagePrefixDivergedAt?: number;
6175
6205
  }
6176
6206
  /** Cache-affecting dimension names. */
6177
6207
  type CacheDimensionName = 'system' | 'tools' | 'model' | 'thinking' | 'thinkingBudget' | 'taskBudget' | 'effortHint'
@@ -6190,9 +6220,21 @@ type CacheDimensionName = 'system' | 'tools' | 'model' | 'thinking' | 'thinkingB
6190
6220
  *
6191
6221
  * `changed` names the request dimensions that differ from the previous turn —
6192
6222
  * the culprit when the host rewrote something. An EMPTY `changed` is itself a
6193
- * signal: the request was byte-stable and the provider still failed to serve
6194
- * the prefix, which is the signature of TTL expiry or provider-side eviction
6195
- * rather than anything the host did.
6223
+ * signal: the request was byte-stable AT THIS WIRE and the provider still
6224
+ * failed to serve the prefix. Three suspects, in the order to check them:
6225
+ *
6226
+ * 1. TTL expiry — a long pause since the previous turn (compare wall-clock
6227
+ * gaps; the default window is ~5 minutes).
6228
+ * 2. Provider-side eviction — no pause, no pattern; typically isolated.
6229
+ * 3. Downstream transformation churn — on architectures where a gateway CASTS
6230
+ * this request into another provider's format (Anthropic → OpenAI
6231
+ * Responses, Converse, …), these dimensions only cover the PRE-cast bytes.
6232
+ * A transform that isn't prefix-monotonic (unstable id mapping, per-request
6233
+ * injections, config-derived fields like reasoning effort) breaks the
6234
+ * vendor's cache while reading as byte-stable here. Recurring
6235
+ * empty-`changed` breaks on a cast route point at the transform, not at
6236
+ * this agent — instrument the gateway's OUTPUT with the same positional
6237
+ * hashing (`hashMessages`) to name the churn.
6196
6238
  */
6197
6239
  interface CacheBreakInfo {
6198
6240
  /**
@@ -6224,13 +6266,64 @@ interface CacheBreakInfo {
6224
6266
  /** Human-readable per-dimension diffs, keyed by the entries of `changed`. */
6225
6267
  details: Partial<Record<CacheDimensionName, string>>;
6226
6268
  }
6269
+ /**
6270
+ * Structured payload of the `'cache:drift'` agent hook, emitted by
6271
+ * {@link installCacheBreakLogger} at `turn:before` whenever the outgoing
6272
+ * request DIVERGES from the previous completed turn's — any tracked dimension,
6273
+ * including an in-place rewrite of the message prefix.
6274
+ *
6275
+ * Drift is the PREDICTIVE counterpart of `'cache:break'`: it fires from the
6276
+ * request bytes alone, before (and regardless of whether) the provider
6277
+ * confirms a miss. That makes it the signal that works everywhere the
6278
+ * confirmed-cost path cannot see — providers that report no cache usage, and
6279
+ * format-casting gateways where this wire is the last observable point before
6280
+ * the cast. A turn that drifts here and then reports a healthy `cacheRead`
6281
+ * means the provider absorbed the change (e.g. only the tail moved); a turn
6282
+ * that drifts AND breaks gives the break its attribution for free.
6283
+ *
6284
+ * Intentional rewrites drift too, by design — that is the attribution story
6285
+ * for planned invalidations: tail compaction and media age-out cut on
6286
+ * chunk-aligned indices (`divergedAt` a multiple of the compaction chunk),
6287
+ * stale-read stubbing rewrites a read's own position, host history surgery
6288
+ * lands anywhere. `details.messagePrefix` carries the same hint in prose.
6289
+ */
6290
+ interface CacheDriftInfo {
6291
+ /** 1-based turn index, installer-lifetime monotonic — see {@link CacheBreakInfo.turn}. */
6292
+ turn: number;
6293
+ turnId: string;
6294
+ /** Model id of the OUTGOING request (post-fallback, pre-provider). */
6295
+ model: string;
6296
+ /** Dimensions that differ from the previous completed turn's request. */
6297
+ changed: CacheDimensionName[];
6298
+ /** Human-readable per-dimension diffs, keyed by the entries of `changed`. */
6299
+ details: Partial<Record<CacheDimensionName, string>>;
6300
+ /** Message index of an in-place prefix rewrite — see {@link CacheDimensionDiff.messagePrefixDivergedAt}. */
6301
+ divergedAt?: number;
6302
+ previousMessageCount: number;
6303
+ messageCount: number;
6304
+ }
6227
6305
  interface CacheBreakLoggerOptions {
6228
6306
  /**
6229
6307
  * Sink for log lines. Defaults to `console.error`. Use a {@link Logger} or
6230
6308
  * a test buffer here when you want the output to land somewhere other than
6231
6309
  * stderr.
6310
+ *
6311
+ * NOT every line is a dimension diff: unless {@link onEmitError} is
6312
+ * provided, `'cache:break'` handler errors are also routed here (prefixed
6313
+ * `cache-break: 'cache:break' handler threw:`). A host that counts `log`
6314
+ * invocations as "dimension changes" — the journal-mode wiring — should
6315
+ * either pass `onEmitError` or count via the `'cache:break'` hook instead.
6232
6316
  */
6233
6317
  log?: (line: string) => void;
6318
+ /**
6319
+ * Sink for errors thrown by `'cache:break'` hook consumers. The emission is
6320
+ * try/caught so a UI bug in a handler can't unwind into the loop and abort
6321
+ * the run; this is where that error surfaces. Defaults to the {@link log}
6322
+ * channel (never a louder one — hosts route `log` away from stderr for good
6323
+ * reasons). Pass a dedicated sink when `log` invocations are being counted
6324
+ * as metrics.
6325
+ */
6326
+ onEmitError?: (error: unknown) => void;
6234
6327
  /**
6235
6328
  * When `true`, emit a log line on EVERY turn (not just cache breaks) with
6236
6329
  * the per-dimension hashes. Useful for offline correlation; off by default
@@ -12486,12 +12579,33 @@ interface AgentHooks {
12486
12579
  *
12487
12580
  * The payload names the request dimensions that changed (`changed`) with
12488
12581
  * human-readable diffs (`details`). An empty `changed` means the request
12489
- * was byte-stable and the provider still dropped the prefix — the TTL
12490
- * expiry / eviction signature. Hosts surface this as UI (TUI footer chip),
12491
- * metrics, or alerts; the text `log` line remains available for grep-based
12582
+ * was byte-stable at this wire and the provider still dropped the prefix —
12583
+ * TTL expiry, provider eviction, or (behind a format-casting gateway)
12584
+ * churn introduced by the cast itself; see {@link CacheBreakInfo} for how
12585
+ * to tell them apart. Hosts surface this as UI (TUI footer chip), metrics,
12586
+ * or alerts; the text `log` line remains available for grep-based
12492
12587
  * workflows and, unlike this hook, stays silent on unattributable breaks.
12493
12588
  */
12494
12589
  'cache:break': (info: CacheBreakInfo) => void | Promise<void>;
12590
+ /**
12591
+ * Fires at `turn:before` when the outgoing request DIVERGES from the
12592
+ * previous completed turn's — the predictive counterpart of `'cache:break'`.
12593
+ * Emitted by `installCacheBreakLogger` from the request bytes alone, so it
12594
+ * works on providers that report no cache usage and on format-casting
12595
+ * gateways where this wire is the last observable point before the cast.
12596
+ *
12597
+ * Drift + healthy `cacheRead` afterwards = the provider absorbed the change;
12598
+ * drift + a `'cache:break'` on the same turn = the break's attribution.
12599
+ * Intentional rewrites (compaction cuts, stale-read stubs) drift by design —
12600
+ * `divergedAt` tells them apart; see `CacheDriftInfo`.
12601
+ *
12602
+ * Delivery is fire-and-forget: `turn:before` rides the loop's PROPAGATING
12603
+ * hook timeout, so the emitter does not await consumers. Synchronous
12604
+ * handlers complete before the request goes out; async handlers detach and
12605
+ * must not assume the turn is still in flight; errors route to the
12606
+ * installer's `onEmitError`, never into the run.
12607
+ */
12608
+ 'cache:drift': (info: CacheDriftInfo) => void | Promise<void>;
12495
12609
  /**
12496
12610
  * Fires after each assistant turn (before its tool-result follow-up
12497
12611
  * dispatches; the loop iterates back to a fresh `turn:before` once the
@@ -17285,5 +17399,5 @@ declare function definePreset(config: Preset): Preset;
17285
17399
  */
17286
17400
  declare function composePresets(...presets: Preset[]): Preset;
17287
17401
  //#endregion
17288
- export { buildPersistedStub as $, clampExtensionConfigNumber as $a, findActiveTrigger as $c, StreamOptions as $d, AnthropicParams as $f, expandEnvPlaceholders as $h, mergeContributions as $i, InferSchemaOutput as $l, LoadSessionOptions as $m, exitCodeForHeadlessResult as $n, ExtensionBannerOptions as $o, PromptVideoPart as $p, RecentFile as $r, SkillInstallCandidate as $s, EvalWorkspaceFile as $t, detectAuth as $u, Meter as A, ExtensionPromptBridge as Aa, Theme as Ac, ContextCategoryId as Ad, mapOAIFinishReason as Af, ToWireMessagesOptions as Ah, truncateHeadForPtlRetry as Ai, PRESENT_PLAN_TOOL as Al, TurnUsage as Am, finalizeEvalMetrics as An, ExtensionProviderMiddleware as Ao, ChildRunStats as Ap, multiEdit as Ar, isSpawnTool as As, EvalAgentMcpServers as At, EditHunk as Au, McpCredentialStore as B, ExtensionConfigEnumItem as Ba, patchInlineGhost as Bc, CacheBreakLoggerOptions as Bd, toPiMessages as Bf, reasoningWireAction as Bh, AgentHooks as Bi, QuestionRequest as Bl, getReadState as Bm, statusCompleted as Bn, ExtensionToolPolicy as Bo, McpServerConfig as Bp, RunSummaryByModel as Br, isToolAllowedByUnion as Bs, EvalMetric as Bt, ToolCallDisplay as Bu, SuccessfulMutationOutcome as C, discoverExtensions as Ca, createSkillActivationState as Cc, effectiveContextWindow as Cd, applyOAICacheBreakpoints as Cf, PairingDropKind as Ch, CompactScope as Ci, AnswerValue as Cl, ToolResultDocumentRefContent as Cm, defineMetrics as Cn, ExtensionMcpConfigTransform as Co, AgentBehavior as Cp, SkillsReadToolOptions as Cr, SpawnTool as Cs, readSkillEditMarker as Ct, DEFAULT_BUDGET_EXCLUDE_TOOLS as Cu, Counter as D, scanExtensionDirectories as Da, DEFAULT_THEME as Dc, ContextBreakdownContributor as Dd, classifyOpenAICompatError as Df, RemintResult as Dh, sliceForCompaction as Di, InteractionResponse as Dl, ToolResultTextContent as Dm, fileContentQuality as Dn, ExtensionPaths as Do, AutoCompact as Dp, createShellTool as Dr, SubagentOverride as Ds, CreateEvalAgentOptions as Dt, resolveAgentId as Du, resolveModelTargets as E, parseExtensionScanPathEnv as Ea, ChipColorMap as Ec, ContextBreakdownContributionContext as Ed, buildAssistantContent as Ef, ReasoningWireAction as Eh, anchorPreviewFor as Ei, InteractionRequest as El, ToolResultMetadata as Em, fileContains as En, ExtensionOrderedContribution as Eo, AgentStats as Ep, CreateShellToolOptions as Er, SubagentDef as Es, withZidaneSkillEditSkill as Et, accentColor as Eu, createMetricsHooks as F, ExtensionConfigActionResult as Fa, resolveTheme as Fc, ContextMcpGroup as Fd, userMessage as Ff, ensureEndsWithUserMessage as Fh, normalizeShellCommand as Fi, PlanResponse as Fl, ToolDef as Fm, llmJudge as Fn, ExtensionSkillPolicy as Fo, DEFAULT_AGENT_CLOCK as Fp, glob as Fr, defineSkill as Fs, EvalArtifacts as Ft, Picked as Fu, OAuthCallbackHandle as G, ExtensionConfigScope as Ga, ActiveTrigger as Gc, fnv1a32 as Gd, CerebrasParams as Gf, toWireMessages as Gh, createAgent as Gi, buildResumedToolResultsTurn as Gl, resolveReadStateMap as Gm, HeadlessOptions as Gn, ExtensionToolResultMetadataRegistration as Go, OAuthRefreshHookContext as Gp, RunSummaryTokens as Gr, validateSkillForWrite as Gs, EvalRunSummary as Gt, filterChainFallbacks as Gu, McpOAuthProviderOptions as H, ExtensionConfigItemBase as Ha, tokenEndingAtCursor as Hc, CacheDimensionName as Hd, local as Hf, sanitizeHistoryForProvider as Hh, McpConnector as Hi, QuestionType as Hl, hydrateReadStateFromSession as Hm, FormattedHeadlessTurnEvent as Hn, ExtensionToolRenderer as Ho, McpToolSchema as Hp, RunSummaryCollectorOptions as Hr, parseAllowedToolPattern as Hs, EvalRunMetricAggregate as Ht, buildRunModel as Hu, LoginMcpServerOptions as I, ExtensionConfigActionStatus as Ia, InlineAutocompleteContext as Ic, ContextSnapshot as Id, OpenAIParams as If, ensureToolResultPairing as Ih, stableStringify as Ii, PlanStep as Il, ToolMap as Im, normalizeMetric as In, ExtensionSource as Io, DedupHasher as Ip, edit as Ir, writeSkillToDisk as Is, EvalCaseOptions as It, Screen as Iu, startOAuthCallback as J, ExtensionConfigValue as Ja, CompletionProvider as Jc, snapshotCacheDimensions as Jd, baseten as Jf, McpExecutionBinding as Jh, buildExtensionPreset as Ji, makeRequestInteraction as Jl, SkillDiagnostic as Jm, HeadlessStatus as Jn, ExtensionToolVerdict as Jo, PromptAudioPart as Jp, BYTES_PER_TOKEN as Jr, InterpolateShellCommandsOptions as Js, EvalScore as Jt, sanitizeModelChain as Ju, OAuthCallbackOptions as K, ExtensionConfigStringItem as Ka, CompletionContext as Kc, hashMessages as Kd, cerebras as Kf, ConnectMcpServersOptions as Kh, BuildExtensionRegistryOptions as Ki, createInteractionTools as Kl, ShellInterpolationApproval as Km, HeadlessOutputFormat as Kn, ExtensionToolResultPatch as Ko, ProgressNudgeKind as Kp, RunSummaryValidation as Kr, validateSkillName as Ks, EvalRunSummaryCase as Kt, providerKeySetChanged as Ku, LoginMcpServerResult as L, ExtensionConfigBooleanItem as La, InlineAutocompleteProvider as Lc, ContextUsageSplit as Ld, classifyOpenAIError as Lf, filterUnresolvedToolUses as Lh, localReliabilityBehavior as Li, Question as Ll, HydrateReadStateOptions as Lm, registerEvalTests as Ln, ExtensionStorageScope as Lo, DedupToolConfig as Lp, RunSummary as Lr, writeSkillsToDisk as Ls, EvalCaseResult as Lt, SessionMeta as Lu, MetricsHookSet as M, createExtensionPromptBridge as Ma, ThemeSelect as Mc, ContextExtensionRow as Md, openaiCompat as Mf, autoDetectAndConvert as Mh, generateStructuredData as Mi, PlanDecision as Ml, toolOutputByteLength as Mm, formatEvalRunSummary as Mn, ExtensionRunTransform as Mo, CompactFunction as Mp, InteractionToolOptions as Mr, createModelSearchTool as Ms, EvalAgentRunResult as Mt, EditOutcomeKind as Mu, MetricsHooksOptions as N, defineExtension as Na, ThemeSurfaces as Nc, ContextExtensionSection as Nd, toOAIMessages as Nf, detectTurnInterruption as Nh, defaultRepeatGuardNormalize as Ni, PlanPayload as Nl, toolResultToText as Nm, formatTrajectoryLine as Nn, ExtensionRuntimeEnv as No, CompactHookContext as Np, createInteractionTool as Nr, formatModelLine as Ns, EvalAgentRunStats as Nt, EditPayload as Nu, Histogram as O, DiscoverAndBuildExtensionRegistryOptions as Oa, SyntaxStyles as Oc, ContextBreakdownOptions as Od, consumeSSE as Of, SYNTHETIC_TOOL_RESULT_PLACEHOLDER as Oh, stripImagesFromTurns as Oi, InteractionsActions as Ol, ToolResultVideoContent as Om, fileExists as On, ExtensionPermission as Oo, AutoCompactConfig as Op, shell as Or, SubagentRegistry as Os, EFFICIENCY_METRICS as Ot, singleAgentRegistry as Ou, UpDownCounter as P, ExtensionConfigActionItem as Pa, resolveChipColor as Pc, ContextItem as Pd, toolResultsMessage as Pf, dropInvalidToolPairings as Ph, defaultRepeatGuardTracked as Pi, PlanRequest as Pl, ToolContext as Pm, functionalityMetric as Pn, ExtensionSessionStateSurface as Po, CompactStartHookContext as Pp, grep as Pr, matchModelEntries as Ps, EvalAgentStats as Pt, Owner as Pu, PersistOutcome as Q, WireExtensionConfigSchema as Qa, collectReferences as Qc, StreamCallbacks as Qd, AnthropicContextManagement as Qf, deriveMcpToolMeta as Qh, filterExtensionRegistry as Qi, useInteractionsQueue as Ql, CreateSessionOptions as Qm, ProviderTranscriptFormat as Qn, TuiContributions as Qo, PromptTextPart as Qp, PostCompactRestoreOptions as Qr, SkillCandidateDetail as Qs, EvalVariantSummary as Qt, ProviderKey as Qu, loginMcpServer as R, ExtensionConfigCategory as Ra, InlineGhost as Rc, buildContextBreakdown as Rd, mapCodexStopReason as Rf, fromAnthropic as Rh, Agent as Ri, QuestionChoice as Rl, ReadStateEntry as Rm, relativeArtifactPath as Rn, ExtensionStorageSurface as Ro, GeometricThinkingDecay as Rp, RunSummaryBlock as Rr, SkillValidationIssue as Rs, EvalDefinition as Rt, Settings as Ru, MutationValidationResult as S, defaultExtensionScanPaths as Sa, SkillActivationStateOptions as Sc, OUTPUT_RESERVE_TOKENS as Sd, TOOL_RESULTS_TAG as Sf, PairingDrop as Sh, ANCHOR_PREVIEW_MAX_CHARS as Si, ASK_USER_TOOL as Sl, ToolResultDocumentContent as Sm, defineEval as Sn, ExtensionManifest as So, OAuthProviderInterface as Sp, createSkillsRunScriptTool as Sr, SpawnTaskOutcome as Ss, extensionScaffold as St, DEFAULT_AGENT_ID as Su, normalizeProviders as T, isExtensionDefinition as Ta, ChipColor as Tc, ContextBreakdown as Td, assistantMessage as Tf, PairingRepairMode as Th, SummaryToTurnInput as Ti, CreateInteractionToolsOptions as Tl, ToolResultImageRefContent as Tm, emitEfficiencyMetrics as Tn, ExtensionModalNode as To, AgentRunOptions as Tp, shellKill as Tr, SpawnToolState as Ts, withZidaneExtensionSkill as Tt, PLAN_AGENT as Tu, createMemoryMcpCredentialStore as U, ExtensionConfigModelItem as Ua, CompletionState as Uc, CacheDimensionSnapshot as Ud, CursorParams as Uf, toAnthropic as Uh, McpToolMeta as Ui, SelectQuestion as Ul, hydrateReadStateFromSessionAsync as Um, HeadlessErrorInfo as Un, ExtensionToolRendererEntry as Uo, ModelTarget as Up, RunSummaryError as Ur, validateResourcePath as Us, EvalRunReporter as Ut, chainPositionOf as Uu, McpOAuthProvider as V, ExtensionConfigItem as Va, resolveInlineSuggestion as Vc, CacheDimensionDiff as Vd, LocalParams as Vf, remintDuplicateToolCallIds as Vh, AgentOptions as Vi, QuestionResponse as Vl, hashContent as Vm, FormattedHeadlessResult as Vn, ExtensionToolRenderProps as Vo, McpToolHookContext as Vp, RunSummaryCollector as Vr, matchesAllowedTool as Vs, EvalMetricError as Vt, ModelChainEntry as Vu, hasAuthorizationHeader as W, ExtensionConfigNumberItem as Wa, useCompletion as Wc, diffCacheDimensions as Wd, cursor as Wf, toOpenAI as Wh, McpToolWrap as Wi, TextQuestion as Wl, readStateKey as Wm, HeadlessEvent as Wn, ExtensionToolRendererRegistration as Wo, ModelTargetSpec as Wp, RunSummaryRepeatGuard as Wr, validateResourcePathReal as Ws, EvalRunReporterOptions as Wt, chainsEqual as Wu, PERSISTENCE_PREVIEW_BYTES as X, StoredExtensionConfigItem as Xa, CompletionSubmitContext as Xc, Provider as Xd, ArceeParams as Xf, connectMcpServers as Xh, composeExtensionPreset as Xi, serializeInteractionResponse as Xl, SkillSource as Xm, OpenAIChatContentPart as Xn, GuiContributions as Xo, PromptImagePart as Xp, utf8ByteLength as Xr, stripShellInterpolations as Xs, EvalScorerContext as Xt, AuthMethod as Xu, PERSISTED_STUB_PREFIX as Y, ExtensionConfigValueItem as Ya, CompletionReference as Yc, HistoryRepair as Yd, planBasetenReasoning as Yf, attachStderrWarnPump as Yh, buildExtensionRegistry as Yi, pendingInteractionsFromTurns as Yl, SkillResource as Ym, HeadlessUsage as Yn, ExtensionTuiSurface as Yo, PromptDocumentPart as Yp, estimateTokens as Yr, interpolateShellCommands as Ys, EvalScorer as Yt, toggleChainEntry as Yu, PersistInput as Z, WireExtensionConfigItem as Za, applyInsert as Zc, ProviderCapabilities as Zd, arcee as Zf, createStderrLineEmitter as Zh, disposeExtensionRegistry as Zi, useInteractionsActions as Zl, SkillsConfig as Zm, OpenAIChatMessage as Zn, LoadedExtension as Zo, PromptPart as Zp, PostCompactAttachments as Zr, SKILL_PROVENANCE_FILE as Zs, EvalTestRunner as Zt, ProviderAuth as Zu, statsByModel as _, removeInstalledExtension as _a, installAllowedToolsGate as _c, piIdOf as _d, OAITool as _f, FileMapAdapter as _h, buildCompactPrompt as _i, commandBlockToEvent as _l, ToolBatchExecutor as _m, clearRegisteredEvals as _n, ExtensionFooterHint as _o, isOAuthAccessToken as _p, ToolSearchToolOptions as _r, createExtensionHostRuntimeBridge as _s, ZIDANE_SKILL_EDIT_SKILL_NAME as _t, AgentAccent as _u, basicTools as a, ExtensionInstallIo as aa, installSkillFromSpec as ac, anthropicDescriptor as ad, XaiParams as af, wrapDiscoveredMcpTools as ag, createSession as ah, CompactOptions as ai, CommandArgSuggestion as al, RunHookMap as am, MetricSpec as an, sanitizeExtensionConfigActionPatch as ao, classifyAnthropicError as ap, providerTranscriptFormatForProvider as ar, ExtensionNotifyOptions as as, SHELL_CASCADE_CANCEL_MESSAGE as at, ConsoleSinkOptions as au, MutationValidationHooksOptions as b, ENTRY_CANDIDATES as ba, DeactivationReason as bc, AutoCompactDecision as bd, OpenAICompatParams as bf, EnsureToolResultPairingOptions as bh, buildTailCompactPrompt as bi, executeCommand as bl, ToolResultAudioContent as bm, createEvalRunReporter as bn, ExtensionKeybinding as bo, resolveOAuthApiKey as bp, createSkillsUseTool as br, ExtensionSubagentDef as bs, editSessionMetadata as bt, BUILD_AGENT as bu, StartSpan as c, ExtensionInstallScope as ca, readSkillProvenance as cc, enabledModelOptions as cd, SchemaSanitizeProfile as cf, demoteStaleRunningStatus as ch, compactConversation as ci, CommandGenerateDataOptions as cl, SessionHookContext as cm, RegisterEvalTestsOptions as cn, ExtensionApiVersion as co, planAnthropicThinking as cp, transcriptToProviderMessages as cr, createExtensionHud as cs, applyCompactSummaryCutoff as ct, LogSink as cu, TracingHooksOptions as d, InstalledExtensionTargetOptions as da, getDefaultScanPaths as dc, localDescriptor as dd, sanitizeToolSpecs as df, resumeChainRunIds as dh, BASE_INSTRUCTIONS as di, CommandOutputBlock as dl, SpawnHookContext as dm, TrajectoryStep as dn, ExtensionContext as do, resolveAnthropicMaxOutput as dp, waitTask as dr, ExtensionModelEntry as ds, EXTENSION_EDIT_METADATA_KEY as dt, LoggingHooksOptions as du, partitionExtensionCatalog as ea, SkillInstallError as ec, BUILTIN_PROVIDERS as ed, TokenCountPayload as ef, expandMcpConfigEnv as eg, Session as eh, buildPostCompactAttachments as ei, mergeReferences as el, RepeatGuardConfig as em, EvalWorkspaceOptions as en, coerceExtensionConfigInput as eo, AnthropicThinkingPlan as ep, formatHeadlessResult as er, ExtensionHud as es, cleanupPersistedSession as et, SchemaInput as eu, createTracingHooks as f, fetchExtensionSource as fa, inferSource as fc, modelOptionsFor as fd, OpenRouterParams as ff, setExtensionSessionState as fh, CompactDirection as fi, CommandSpawnResult as fl, StaleReadPolicy as fm, TrajectoryStepKind as fn, ExtensionContextTransform as fo, OAuthParams as fp, ValidationResult as fr, ExtensionRuntimeSurface as fs, EditSessionTarget as ft, RingBufferSink as fu, formatTokenUsage as g, readExtensionInstallProvenance as ga, IMPLICITLY_ALLOWED_SKILL_TOOLS as gc, openrouterDescriptor as gd, OAIMessage as gf, createMemoryStore as gh, TRAILER as gi, CommandStepFn as gl, ThinkingLevel as gm, buildTrajectory as gn, ExtensionDefinition as go, extractRuntimeCredentials as gp, LazyToolEntry as gr, ExtensionWorkspaceSurface as gs, ZIDANE_EXTENSION_SKILL_NAME as gt, jsonSink as gu, flattenTurns as h, parseExtensionInstallSource as ha, buildCatalog as hc, openaiDescriptor as hd, ASSISTANT_TOOL_CALLS_TAG as hf, createRemoteStore as hh, NO_TOOLS_PREAMBLE as hi, CommandStepContext as hl, ThinkingDecay as hm, buildRegisteredEvals as hn, ExtensionCustomRendererEntry as ho, credentialsFromParams as hp, tailTruncate as hr, ExtensionWorkspacePair as hs, SkillEditMarker as ht, createLoggingHooks as hu, _default as i, ExtensionInstallErrorCode as ia, SkillInstallSpec as ic, ProviderDescriptor as id, TurnResult as if, resultToString as ig, SessionStore as ih, CompactEndEvent as ii, CommandAgentResult as il, RetryConfig as im, MetricEmitter as in, resolveExtensionConfigValue as io, buildAnthropicClientOptions as ip, installHeadlessEventAdapter as ir, ExtensionNotification as is, INTERRUPT_MESSAGE_FOR_TOOL_USE as it, zodToJsonSchema as iu, MetricAttributes as j, ExtensionPromptDelivery as ja, ThemeColors as jc, ContextExactCounts as jd, openAICompatPromptMessage as jf, TurnInterruptionState as jh, GenerateStructuredDataOptions as ji, PendingInteractionEntry as jl, toolOutputBudgetByteLength as jm, formatEvalCaseSummary as jn, ExtensionRegistry as jo, CompactEndHookContext as jp, listFiles as jr, SpawnModelEntry as js, EvalAgentRunOptions as jt, EditOutcome as ju, InstrumentOptions as k, discoverAndBuildExtensionRegistry as ka, SyntaxTokenStyle as kc, ContextCategory as kd, formatTools as kf, TOOL_USE_INTERRUPTED_MARKER as kh, summaryToTurn as ki, InteractionsProvider as kl, TurnFinishReason as km, fileExistsOneOf as kn, ExtensionPromptTransform as ko, CacheTtl as kp, readFile as kr, createSpawnTool as ks, EvalAgent as kt, EditDiffDisplay as ku, TracingConventions as l, ExtensionInstallSource as la, SourcedScanPath as lc, getContextWindow as ld, SchemaSanitizeResult as lf, getExtensionSessionState as lh, CompactInvalidInputError as li, CommandInteraction as ll, SessionMessage as lm, ReusableExecutionContext as ln, ExtensionBehaviorTransform as lo, resolveAnthropicAuthShape as lp, writeFile as lr, ExtensionHostRuntimeBridge as ls, collectNewlyStaleReadPaths as lt, Logger as lu, TokenUsageLike as m, listExtensionCandidates as ma, parseSkillFile as mc, modelsForDescriptor as md, openrouter as mf, RemoteStoreOptions as mh, CompactPromptOptions as mi, CommandStep as ml, StreamHookContext as mm, buildEvalRunSummary as mn, ExtensionCustomRenderer as mo, credentialsFilePath as mp, TailTruncateOptions as mr, ExtensionSessionsSurface as ms, SKILL_EDIT_METADATA_KEY as mt, createLogger as mu, composePresets as n, ExtensionInstallCandidate as na, SkillInstallOptions as nc, ModelInfo as nd, ToolResult as nf, normalizeMcpBlocks as ng, SessionMetaRow as nh, selectFilesFromSession as ni, resolveCompletionSubmit as nl, ResolveContentRef as nm, LlmJudgeOptions as nn, isValidExtensionConfigValue as no, anthropic as np, formattedHeadlessTurnEventToJsonl as nr, ExtensionHudStatus as ns, resolvePersistDir as nt, isStandardSchema as nu, GEN_AI_ATTRIBUTES as o, ExtensionInstallProvenance as oa, listSkillCandidates as oc, cerebrasDescriptor as od, xai as of, currentExtensionSession as oh, CompactResult as oi, CommandAttachment as ol, SessionContentBlock as om, MetricSpecMap as on, toWireConfigSchema as oo, credentialIdentity as op, runHeadless as or, ExtensionNotifyTone as os, TOOL_USE_CANCELLED_MESSAGE as ot, LogLevel as ou, ModelUsage as p, installExtensionFromSpec as pa, parseFrontmatter as pc, modelSupportsReasoning as pd, normalizeOpenRouterModelId as pf, withExtensionSession as ph, CompactPromptBuilder as pi, CommandSpawnTask as pl, StepThinkingDecay as pm, artifactPath as pn, ExtensionContributions as po, ResolveOAuthApiKeyOptions as pp, validateToolArgs as pr, ExtensionSessionSummary as ps, ExtensionEditMarker as pt, consoleSink as pu, OAuthCallbackResult as q, ExtensionConfigSurface as qa, CompletionItem as qc, installCacheBreakLogger as qd, BasetenParams as qf, McpConnection as qh, ExtensionCatalogPartition as qi, isInteractionTool as ql, SkillConfig as qm, HeadlessResult as qn, ExtensionToolResultTransform as qo, ProgressNudgeMessage as qp, createRunSummaryCollector as qr, resolveSkills as qs, EvalRunUsage as qt, restoreChainFallbacks as qu, definePreset as r, ExtensionInstallError as ra, SkillInstallResult as rc, ModelOption as rd, ToolSpec as rf, normalizeMcpServers as rg, SessionRun as rh, selectRecentFiles as ri, Command as rl, ResolveContentRefBlock as rm, MetricDirection as rn, resolveExtensionConfig as ro, applyAnthropicCacheBreakpoints as rp, headlessEventToJsonl as rr, ExtensionHudWriter as rs, resolveTasksDir as rt, resolveSchemaInput as ru, Span as s, ExtensionInstallResult as sa, parseSkillInstallSpec as sc, credKeyOf as sd, SchemaSanitizeOptions as sf, deleteExtensionSessionState as sh, CompactStartEvent as si, CommandExecution as sl, SessionEndStatus as sm, MetricStats as sn, EMPTY_EXTENSION_REGISTRY as so, defaultAnthropicMaxTokens as sp, transcriptToOpenAIMessages as sr, ExtensionStatusOptions as ss, TOOL_USE_SKIPPED_MESSAGE as st, LogRecord as su, Preset as t, ExtensionFetchResult as ta, SkillInstallErrorCode as tc, CustomField as td, ToolCall as tf, nonOwningMcpView as tg, SessionData as th, selectFilesFromReadState as ti, mergeSuggestions as tl, RepeatGuardToolMatcher as tm, EvalWorkspaceSnapshot as tn, isValidExtensionConfigItem as to, EXTENDED_CACHE_TTL_BETA as tp, formatHeadlessTurnEvent as tr, ExtensionHudState as ts, maybePersistToolResult as tt, StandardSchemaLike as tu, TracingHookSet as u, InstallExtensionFromSpecOptions as ua, discoverSkills as uc, getModelInfo as ud, sanitizeToolSchema as uf, loadSession as uh, CompactPromptTooLongError as ui, CommandInvocation as ul, SessionTurn as um, Trajectory as un, ExtensionCapability as uo, resolveAnthropicBetas as up, WAIT_TASK_TIMED_OUT_PREFIX as ur, ExtensionHostRuntimeImpl as us, renderStaleReadNotice as ut, LoggingHookSet as uu, MutationValidationBatch as v, updateInstalledExtension as va, ActivationVia as vc, restoreModelOptions as vd, OpenAICompatAuthHeader as vf, FileMapStoreOptions as vh, buildFromCompactPrompt as vi, commandBlocksToContent as vl, ToolHookContext as vm, computeEvalTagScores as vn, ExtensionGuiPanel as vo, readOAuthCredentials as vp, createToolSearchTool as vr, createWorkspaceSurface as vs, buildZidaneExtensionSkill as vt, AgentProfile as vu, createMutationValidationHooks as w, inlineLoadedExtension as wa, BUILTIN_THEMES as wc, shouldAutoCompact as wd, applyOAIToolCacheBreakpoint as wf, PairingRepair as wh, CompactionSlice as wi, ConfirmQuestion as wl, ToolResultImageContent as wm, efficiencyMetricValues as wn, ExtensionModal as wo, AgentClock as wp, createSkillsReadTool as wr, SpawnToolOptions as ws, resolveExtensionDocsDir as wt, DEFAULT_PERSIST_EXCLUDE_TOOLS as wu, MutationValidationMutation as x, ExtensionScanEntry as xa, SkillActivationState as xc, AutoCompactInput as xd, OpenAICompatStreamError as xf, ORPHANED_TOOL_RESULT_MARKER as xh, buildUpToCompactPrompt as xi, parseCommandInvocation as xl, ToolResultContent as xm, createReusableExecutionContext as xn, ExtensionKeybindingDispatchContext as xo, writeOAuthCredentials as xp, SkillsRunScriptToolOptions as xr, SpawnTaskInput as xs, extensionDirForCwd as xt, BUILTIN_AGENTS as xu, MutationValidationFailure as y, registerExtensionHostModules as ya, ActiveSkill as yc, AUTO_COMPACT_MIN_GROWTH_FRACTION as yd, OpenAICompatHttpError as yf, createFileMapStore as yh, buildFullCompactPrompt as yi, commandSteps as yl, ToolOutcome as ym, createEvalAgent as yn, ExtensionGuiSurface as yo, registerCustomOAuthProvider as yp, SkillsUseToolOptions as yr, ChildAgent as ys, buildZidaneSkillEditSkill as yt, AgentRegistry as yu, McpCredentialEntry as z, ExtensionConfigChangeBehavior as za, createPathAutocompleteProvider as zc, CacheBreakInfo as zd, openai as zf, fromOpenAI as zh, AgentHookMap as zi, QuestionPayload as zl, ReadStateMap as zm, runEvalCase as zn, ExtensionToolCatalogTransform as zo, JsonValue as zp, RunSummaryBudget as zr, SkillValidationResult as zs, EvalDefinitionContext as zt, StreamEvent as zu };
17289
- //# sourceMappingURL=index-D-PvuMCb.d.ts.map
17402
+ export { buildPersistedStub as $, clampExtensionConfigNumber as $a, findActiveTrigger as $c, StreamCallbacks as $d, AnthropicContextManagement as $f, deriveMcpToolMeta as $h, mergeContributions as $i, InferSchemaOutput as $l, CreateSessionOptions as $m, exitCodeForHeadlessResult as $n, ExtensionBannerOptions as $o, PromptTextPart as $p, RecentFile as $r, SkillInstallCandidate as $s, EvalWorkspaceFile as $t, detectAuth as $u, Meter as A, ExtensionPromptBridge as Aa, Theme as Ac, ContextCategoryId as Ad, formatTools as Af, TOOL_USE_INTERRUPTED_MARKER as Ah, truncateHeadForPtlRetry as Ai, PRESENT_PLAN_TOOL as Al, TurnFinishReason as Am, finalizeEvalMetrics as An, ExtensionProviderMiddleware as Ao, CacheTtl as Ap, multiEdit as Ar, isSpawnTool as As, EvalAgentMcpServers as At, EditHunk as Au, McpCredentialStore as B, ExtensionConfigEnumItem as Ba, patchInlineGhost as Bc, CacheBreakLoggerOptions as Bd, openai as Bf, fromOpenAI as Bh, AgentHooks as Bi, QuestionRequest as Bl, ReadStateMap as Bm, statusCompleted as Bn, ExtensionToolPolicy as Bo, JsonValue as Bp, RunSummaryByModel as Br, isToolAllowedByUnion as Bs, EvalMetric as Bt, ToolCallDisplay as Bu, SuccessfulMutationOutcome as C, discoverExtensions as Ca, createSkillActivationState as Cc, effectiveContextWindow as Cd, TOOL_RESULTS_TAG as Cf, PairingDrop as Ch, CompactScope as Ci, AnswerValue as Cl, ToolResultDocumentContent as Cm, defineMetrics as Cn, ExtensionMcpConfigTransform as Co, OAuthProviderInterface as Cp, SkillsReadToolOptions as Cr, SpawnTool as Cs, readSkillEditMarker as Ct, DEFAULT_BUDGET_EXCLUDE_TOOLS as Cu, Counter as D, scanExtensionDirectories as Da, DEFAULT_THEME as Dc, ContextBreakdownContributor as Dd, buildAssistantContent as Df, ReasoningWireAction as Dh, sliceForCompaction as Di, InteractionResponse as Dl, ToolResultMetadata as Dm, fileContentQuality as Dn, ExtensionPaths as Do, AgentStats as Dp, createShellTool as Dr, SubagentOverride as Ds, CreateEvalAgentOptions as Dt, resolveAgentId as Du, resolveModelTargets as E, parseExtensionScanPathEnv as Ea, ChipColorMap as Ec, ContextBreakdownContributionContext as Ed, assistantMessage as Ef, PairingRepairMode as Eh, anchorPreviewFor as Ei, InteractionRequest as El, ToolResultImageRefContent as Em, fileContains as En, ExtensionOrderedContribution as Eo, AgentRunOptions as Ep, CreateShellToolOptions as Er, SubagentDef as Es, withZidaneSkillEditSkill as Et, accentColor as Eu, createMetricsHooks as F, ExtensionConfigActionResult as Fa, resolveTheme as Fc, ContextMcpGroup as Fd, toolResultsMessage as Ff, dropInvalidToolPairings as Fh, normalizeShellCommand as Fi, PlanResponse as Fl, ToolContext as Fm, llmJudge as Fn, ExtensionSkillPolicy as Fo, CompactStartHookContext as Fp, glob as Fr, defineSkill as Fs, EvalArtifacts as Ft, Picked as Fu, OAuthCallbackHandle as G, ExtensionConfigScope as Ga, ActiveTrigger as Gc, diffCacheDimensions as Gd, cursor as Gf, toOpenAI as Gh, createAgent as Gi, buildResumedToolResultsTurn as Gl, readStateKey as Gm, HeadlessOptions as Gn, ExtensionToolResultMetadataRegistration as Go, ModelTargetSpec as Gp, RunSummaryTokens as Gr, validateSkillForWrite as Gs, EvalRunSummary as Gt, filterChainFallbacks as Gu, McpOAuthProviderOptions as H, ExtensionConfigItemBase as Ha, tokenEndingAtCursor as Hc, CacheDimensionName as Hd, LocalParams as Hf, remintDuplicateToolCallIds as Hh, McpConnector as Hi, QuestionType as Hl, hashContent as Hm, FormattedHeadlessTurnEvent as Hn, ExtensionToolRenderer as Ho, McpToolHookContext as Hp, RunSummaryCollectorOptions as Hr, parseAllowedToolPattern as Hs, EvalRunMetricAggregate as Ht, buildRunModel as Hu, LoginMcpServerOptions as I, ExtensionConfigActionStatus as Ia, InlineAutocompleteContext as Ic, ContextSnapshot as Id, userMessage as If, ensureEndsWithUserMessage as Ih, stableStringify as Ii, PlanStep as Il, ToolDef as Im, normalizeMetric as In, ExtensionSource as Io, DEFAULT_AGENT_CLOCK as Ip, edit as Ir, writeSkillToDisk as Is, EvalCaseOptions as It, Screen as Iu, startOAuthCallback as J, ExtensionConfigValue as Ja, CompletionProvider as Jc, installCacheBreakLogger as Jd, BasetenParams as Jf, McpConnection as Jh, buildExtensionPreset as Ji, makeRequestInteraction as Jl, SkillConfig as Jm, HeadlessStatus as Jn, ExtensionToolVerdict as Jo, ProgressNudgeMessage as Jp, BYTES_PER_TOKEN as Jr, InterpolateShellCommandsOptions as Js, EvalScore as Jt, sanitizeModelChain as Ju, OAuthCallbackOptions as K, ExtensionConfigStringItem as Ka, CompletionContext as Kc, fnv1a32 as Kd, CerebrasParams as Kf, toWireMessages as Kh, BuildExtensionRegistryOptions as Ki, createInteractionTools as Kl, resolveReadStateMap as Km, HeadlessOutputFormat as Kn, ExtensionToolResultPatch as Ko, OAuthRefreshHookContext as Kp, RunSummaryValidation as Kr, validateSkillName as Ks, EvalRunSummaryCase as Kt, providerKeySetChanged as Ku, LoginMcpServerResult as L, ExtensionConfigBooleanItem as La, InlineAutocompleteProvider as Lc, ContextUsageSplit as Ld, OpenAIParams as Lf, ensureToolResultPairing as Lh, localReliabilityBehavior as Li, Question as Ll, ToolMap as Lm, registerEvalTests as Ln, ExtensionStorageScope as Lo, DedupHasher as Lp, RunSummary as Lr, writeSkillsToDisk as Ls, EvalCaseResult as Lt, SessionMeta as Lu, MetricsHookSet as M, createExtensionPromptBridge as Ma, ThemeSelect as Mc, ContextExtensionRow as Md, openAICompatPromptMessage as Mf, TurnInterruptionState as Mh, generateStructuredData as Mi, PlanDecision as Ml, toolOutputBudgetByteLength as Mm, formatEvalRunSummary as Mn, ExtensionRunTransform as Mo, CompactEndHookContext as Mp, InteractionToolOptions as Mr, createModelSearchTool as Ms, EvalAgentRunResult as Mt, EditOutcomeKind as Mu, MetricsHooksOptions as N, defineExtension as Na, ThemeSurfaces as Nc, ContextExtensionSection as Nd, openaiCompat as Nf, autoDetectAndConvert as Nh, defaultRepeatGuardNormalize as Ni, PlanPayload as Nl, toolOutputByteLength as Nm, formatTrajectoryLine as Nn, ExtensionRuntimeEnv as No, CompactFunction as Np, createInteractionTool as Nr, formatModelLine as Ns, EvalAgentRunStats as Nt, EditPayload as Nu, Histogram as O, DiscoverAndBuildExtensionRegistryOptions as Oa, SyntaxStyles as Oc, ContextBreakdownOptions as Od, classifyOpenAICompatError as Of, RemintResult as Oh, stripImagesFromTurns as Oi, InteractionsActions as Ol, ToolResultTextContent as Om, fileExists as On, ExtensionPermission as Oo, AutoCompact as Op, shell as Or, SubagentRegistry as Os, EFFICIENCY_METRICS as Ot, singleAgentRegistry as Ou, UpDownCounter as P, ExtensionConfigActionItem as Pa, resolveChipColor as Pc, ContextItem as Pd, toOAIMessages as Pf, detectTurnInterruption as Ph, defaultRepeatGuardTracked as Pi, PlanRequest as Pl, toolResultToText as Pm, functionalityMetric as Pn, ExtensionSessionStateSurface as Po, CompactHookContext as Pp, grep as Pr, matchModelEntries as Ps, EvalAgentStats as Pt, Owner as Pu, PersistOutcome as Q, WireExtensionConfigSchema as Qa, collectReferences as Qc, ProviderCapabilities as Qd, arcee as Qf, createStderrLineEmitter as Qh, filterExtensionRegistry as Qi, useInteractionsQueue as Ql, SkillsConfig as Qm, ProviderTranscriptFormat as Qn, TuiContributions as Qo, PromptPart as Qp, PostCompactRestoreOptions as Qr, SkillCandidateDetail as Qs, EvalVariantSummary as Qt, ProviderKey as Qu, loginMcpServer as R, ExtensionConfigCategory as Ra, InlineGhost as Rc, buildContextBreakdown as Rd, classifyOpenAIError as Rf, filterUnresolvedToolUses as Rh, Agent as Ri, QuestionChoice as Rl, HydrateReadStateOptions as Rm, relativeArtifactPath as Rn, ExtensionStorageSurface as Ro, DedupToolConfig as Rp, RunSummaryBlock as Rr, SkillValidationIssue as Rs, EvalDefinition as Rt, Settings as Ru, MutationValidationResult as S, defaultExtensionScanPaths as Sa, SkillActivationStateOptions as Sc, OUTPUT_RESERVE_TOKENS as Sd, OpenAICompatStreamError as Sf, ORPHANED_TOOL_RESULT_MARKER as Sh, ANCHOR_PREVIEW_MAX_CHARS as Si, ASK_USER_TOOL as Sl, ToolResultContent as Sm, defineEval as Sn, ExtensionManifest as So, writeOAuthCredentials as Sp, createSkillsRunScriptTool as Sr, SpawnTaskOutcome as Ss, extensionScaffold as St, DEFAULT_AGENT_ID as Su, normalizeProviders as T, isExtensionDefinition as Ta, ChipColor as Tc, ContextBreakdown as Td, applyOAIToolCacheBreakpoint as Tf, PairingRepair as Th, SummaryToTurnInput as Ti, CreateInteractionToolsOptions as Tl, ToolResultImageContent as Tm, emitEfficiencyMetrics as Tn, ExtensionModalNode as To, AgentClock as Tp, shellKill as Tr, SpawnToolState as Ts, withZidaneExtensionSkill as Tt, PLAN_AGENT as Tu, createMemoryMcpCredentialStore as U, ExtensionConfigModelItem as Ua, CompletionState as Uc, CacheDimensionSnapshot as Ud, local as Uf, sanitizeHistoryForProvider as Uh, McpToolMeta as Ui, SelectQuestion as Ul, hydrateReadStateFromSession as Um, HeadlessErrorInfo as Un, ExtensionToolRendererEntry as Uo, McpToolSchema as Up, RunSummaryError as Ur, validateResourcePath as Us, EvalRunReporter as Ut, chainPositionOf as Uu, McpOAuthProvider as V, ExtensionConfigItem as Va, resolveInlineSuggestion as Vc, CacheDimensionDiff as Vd, toPiMessages as Vf, reasoningWireAction as Vh, AgentOptions as Vi, QuestionResponse as Vl, getReadState as Vm, FormattedHeadlessResult as Vn, ExtensionToolRenderProps as Vo, McpServerConfig as Vp, RunSummaryCollector as Vr, matchesAllowedTool as Vs, EvalMetricError as Vt, ModelChainEntry as Vu, hasAuthorizationHeader as W, ExtensionConfigNumberItem as Wa, useCompletion as Wc, CacheDriftInfo as Wd, CursorParams as Wf, toAnthropic as Wh, McpToolWrap as Wi, TextQuestion as Wl, hydrateReadStateFromSessionAsync as Wm, HeadlessEvent as Wn, ExtensionToolRendererRegistration as Wo, ModelTarget as Wp, RunSummaryRepeatGuard as Wr, validateResourcePathReal as Ws, EvalRunReporterOptions as Wt, chainsEqual as Wu, PERSISTENCE_PREVIEW_BYTES as X, StoredExtensionConfigItem as Xa, CompletionSubmitContext as Xc, HistoryRepair as Xd, planBasetenReasoning as Xf, attachStderrWarnPump as Xh, composeExtensionPreset as Xi, serializeInteractionResponse as Xl, SkillResource as Xm, OpenAIChatContentPart as Xn, GuiContributions as Xo, PromptDocumentPart as Xp, utf8ByteLength as Xr, stripShellInterpolations as Xs, EvalScorerContext as Xt, AuthMethod as Xu, PERSISTED_STUB_PREFIX as Y, ExtensionConfigValueItem as Ya, CompletionReference as Yc, snapshotCacheDimensions as Yd, baseten as Yf, McpExecutionBinding as Yh, buildExtensionRegistry as Yi, pendingInteractionsFromTurns as Yl, SkillDiagnostic as Ym, HeadlessUsage as Yn, ExtensionTuiSurface as Yo, PromptAudioPart as Yp, estimateTokens as Yr, interpolateShellCommands as Ys, EvalScorer as Yt, toggleChainEntry as Yu, PersistInput as Z, WireExtensionConfigItem as Za, applyInsert as Zc, Provider as Zd, ArceeParams as Zf, connectMcpServers as Zh, disposeExtensionRegistry as Zi, useInteractionsActions as Zl, SkillSource as Zm, OpenAIChatMessage as Zn, LoadedExtension as Zo, PromptImagePart as Zp, PostCompactAttachments as Zr, SKILL_PROVENANCE_FILE as Zs, EvalTestRunner as Zt, ProviderAuth as Zu, statsByModel as _, removeInstalledExtension as _a, installAllowedToolsGate as _c, piIdOf as _d, OAIMessage as _f, createMemoryStore as _h, buildCompactPrompt as _i, commandBlockToEvent as _l, ThinkingLevel as _m, clearRegisteredEvals as _n, ExtensionFooterHint as _o, extractRuntimeCredentials as _p, ToolSearchToolOptions as _r, createExtensionHostRuntimeBridge as _s, ZIDANE_SKILL_EDIT_SKILL_NAME as _t, AgentAccent as _u, basicTools as a, ExtensionInstallIo as aa, installSkillFromSpec as ac, anthropicDescriptor as ad, TurnResult as af, resultToString as ag, SessionStore as ah, CompactOptions as ai, CommandArgSuggestion as al, RetryConfig as am, MetricSpec as an, sanitizeExtensionConfigActionPatch as ao, buildAnthropicClientOptions as ap, providerTranscriptFormatForProvider as ar, ExtensionNotifyOptions as as, SHELL_CASCADE_CANCEL_MESSAGE as at, ConsoleSinkOptions as au, MutationValidationHooksOptions as b, ENTRY_CANDIDATES as ba, DeactivationReason as bc, AutoCompactDecision as bd, OpenAICompatHttpError as bf, createFileMapStore as bh, buildTailCompactPrompt as bi, executeCommand as bl, ToolOutcome as bm, createEvalRunReporter as bn, ExtensionKeybinding as bo, registerCustomOAuthProvider as bp, createSkillsUseTool as br, ExtensionSubagentDef as bs, editSessionMetadata as bt, BUILD_AGENT as bu, StartSpan as c, ExtensionInstallScope as ca, readSkillProvenance as cc, enabledModelOptions as cd, SchemaSanitizeOptions as cf, deleteExtensionSessionState as ch, compactConversation as ci, CommandGenerateDataOptions as cl, SessionEndStatus as cm, RegisterEvalTestsOptions as cn, ExtensionApiVersion as co, defaultAnthropicMaxTokens as cp, transcriptToProviderMessages as cr, createExtensionHud as cs, applyCompactSummaryCutoff as ct, LogSink as cu, TracingHooksOptions as d, InstalledExtensionTargetOptions as da, getDefaultScanPaths as dc, localDescriptor as dd, sanitizeToolSchema as df, loadSession as dh, BASE_INSTRUCTIONS as di, CommandOutputBlock as dl, SessionTurn as dm, TrajectoryStep as dn, ExtensionContext as do, resolveAnthropicBetas as dp, waitTask as dr, ExtensionModelEntry as ds, EXTENSION_EDIT_METADATA_KEY as dt, LoggingHooksOptions as du, partitionExtensionCatalog as ea, SkillInstallError as ec, BUILTIN_PROVIDERS as ed, StreamOptions as ef, expandEnvPlaceholders as eg, LoadSessionOptions as eh, buildPostCompactAttachments as ei, mergeReferences as el, PromptVideoPart as em, EvalWorkspaceOptions as en, coerceExtensionConfigInput as eo, AnthropicParams as ep, formatHeadlessResult as er, ExtensionHud as es, cleanupPersistedSession as et, SchemaInput as eu, createTracingHooks as f, fetchExtensionSource as fa, inferSource as fc, modelOptionsFor as fd, sanitizeToolSpecs as ff, resumeChainRunIds as fh, CompactDirection as fi, CommandSpawnResult as fl, SpawnHookContext as fm, TrajectoryStepKind as fn, ExtensionContextTransform as fo, resolveAnthropicMaxOutput as fp, ValidationResult as fr, ExtensionRuntimeSurface as fs, EditSessionTarget as ft, RingBufferSink as fu, formatTokenUsage as g, readExtensionInstallProvenance as ga, IMPLICITLY_ALLOWED_SKILL_TOOLS as gc, openrouterDescriptor as gd, ASSISTANT_TOOL_CALLS_TAG as gf, createRemoteStore as gh, TRAILER as gi, CommandStepFn as gl, ThinkingDecay as gm, buildTrajectory as gn, ExtensionDefinition as go, credentialsFromParams as gp, LazyToolEntry as gr, ExtensionWorkspaceSurface as gs, ZIDANE_EXTENSION_SKILL_NAME as gt, jsonSink as gu, flattenTurns as h, parseExtensionInstallSource as ha, buildCatalog as hc, openaiDescriptor as hd, openrouter as hf, RemoteStoreOptions as hh, NO_TOOLS_PREAMBLE as hi, CommandStepContext as hl, StreamHookContext as hm, buildRegisteredEvals as hn, ExtensionCustomRendererEntry as ho, credentialsFilePath as hp, tailTruncate as hr, ExtensionWorkspacePair as hs, SkillEditMarker as ht, createLoggingHooks as hu, _default as i, ExtensionInstallErrorCode as ia, SkillInstallSpec as ic, ProviderDescriptor as id, ToolSpec as if, normalizeMcpServers as ig, SessionRun as ih, CompactEndEvent as ii, CommandAgentResult as il, ResolveContentRefBlock as im, MetricEmitter as in, resolveExtensionConfigValue as io, applyAnthropicCacheBreakpoints as ip, installHeadlessEventAdapter as ir, ExtensionNotification as is, INTERRUPT_MESSAGE_FOR_TOOL_USE as it, zodToJsonSchema as iu, MetricAttributes as j, ExtensionPromptDelivery as ja, ThemeColors as jc, ContextExactCounts as jd, mapOAIFinishReason as jf, ToWireMessagesOptions as jh, GenerateStructuredDataOptions as ji, PendingInteractionEntry as jl, TurnUsage as jm, formatEvalCaseSummary as jn, ExtensionRegistry as jo, ChildRunStats as jp, listFiles as jr, SpawnModelEntry as js, EvalAgentRunOptions as jt, EditOutcome as ju, InstrumentOptions as k, discoverAndBuildExtensionRegistry as ka, SyntaxTokenStyle as kc, ContextCategory as kd, consumeSSE as kf, SYNTHETIC_TOOL_RESULT_PLACEHOLDER as kh, summaryToTurn as ki, InteractionsProvider as kl, ToolResultVideoContent as km, fileExistsOneOf as kn, ExtensionPromptTransform as ko, AutoCompactConfig as kp, readFile as kr, createSpawnTool as ks, EvalAgent as kt, EditDiffDisplay as ku, TracingConventions as l, ExtensionInstallSource as la, SourcedScanPath as lc, getContextWindow as ld, SchemaSanitizeProfile as lf, demoteStaleRunningStatus as lh, CompactInvalidInputError as li, CommandInteraction as ll, SessionHookContext as lm, ReusableExecutionContext as ln, ExtensionBehaviorTransform as lo, planAnthropicThinking as lp, writeFile as lr, ExtensionHostRuntimeBridge as ls, collectNewlyStaleReadPaths as lt, Logger as lu, TokenUsageLike as m, listExtensionCandidates as ma, parseSkillFile as mc, modelsForDescriptor as md, normalizeOpenRouterModelId as mf, withExtensionSession as mh, CompactPromptOptions as mi, CommandStep as ml, StepThinkingDecay as mm, buildEvalRunSummary as mn, ExtensionCustomRenderer as mo, ResolveOAuthApiKeyOptions as mp, TailTruncateOptions as mr, ExtensionSessionsSurface as ms, SKILL_EDIT_METADATA_KEY as mt, createLogger as mu, composePresets as n, ExtensionInstallCandidate as na, SkillInstallOptions as nc, ModelInfo as nd, ToolCall as nf, nonOwningMcpView as ng, SessionData as nh, selectFilesFromSession as ni, resolveCompletionSubmit as nl, RepeatGuardToolMatcher as nm, LlmJudgeOptions as nn, isValidExtensionConfigValue as no, EXTENDED_CACHE_TTL_BETA as np, formattedHeadlessTurnEventToJsonl as nr, ExtensionHudStatus as ns, resolvePersistDir as nt, isStandardSchema as nu, GEN_AI_ATTRIBUTES as o, ExtensionInstallProvenance as oa, listSkillCandidates as oc, cerebrasDescriptor as od, XaiParams as of, wrapDiscoveredMcpTools as og, createSession as oh, CompactResult as oi, CommandAttachment as ol, RunHookMap as om, MetricSpecMap as on, toWireConfigSchema as oo, classifyAnthropicError as op, runHeadless as or, ExtensionNotifyTone as os, TOOL_USE_CANCELLED_MESSAGE as ot, LogLevel as ou, ModelUsage as p, installExtensionFromSpec as pa, parseFrontmatter as pc, modelSupportsReasoning as pd, OpenRouterParams as pf, setExtensionSessionState as ph, CompactPromptBuilder as pi, CommandSpawnTask as pl, StaleReadPolicy as pm, artifactPath as pn, ExtensionContributions as po, OAuthParams as pp, validateToolArgs as pr, ExtensionSessionSummary as ps, ExtensionEditMarker as pt, consoleSink as pu, OAuthCallbackResult as q, ExtensionConfigSurface as qa, CompletionItem as qc, hashMessages as qd, cerebras as qf, ConnectMcpServersOptions as qh, ExtensionCatalogPartition as qi, isInteractionTool as ql, ShellInterpolationApproval as qm, HeadlessResult as qn, ExtensionToolResultTransform as qo, ProgressNudgeKind as qp, createRunSummaryCollector as qr, resolveSkills as qs, EvalRunUsage as qt, restoreChainFallbacks as qu, definePreset as r, ExtensionInstallError as ra, SkillInstallResult as rc, ModelOption as rd, ToolResult as rf, normalizeMcpBlocks as rg, SessionMetaRow as rh, selectRecentFiles as ri, Command as rl, ResolveContentRef as rm, MetricDirection as rn, resolveExtensionConfig as ro, anthropic as rp, headlessEventToJsonl as rr, ExtensionHudWriter as rs, resolveTasksDir as rt, resolveSchemaInput as ru, Span as s, ExtensionInstallResult as sa, parseSkillInstallSpec as sc, credKeyOf as sd, xai as sf, currentExtensionSession as sh, CompactStartEvent as si, CommandExecution as sl, SessionContentBlock as sm, MetricStats as sn, EMPTY_EXTENSION_REGISTRY as so, credentialIdentity as sp, transcriptToOpenAIMessages as sr, ExtensionStatusOptions as ss, TOOL_USE_SKIPPED_MESSAGE as st, LogRecord as su, Preset as t, ExtensionFetchResult as ta, SkillInstallErrorCode as tc, CustomField as td, TokenCountPayload as tf, expandMcpConfigEnv as tg, Session as th, selectFilesFromReadState as ti, mergeSuggestions as tl, RepeatGuardConfig as tm, EvalWorkspaceSnapshot as tn, isValidExtensionConfigItem as to, AnthropicThinkingPlan as tp, formatHeadlessTurnEvent as tr, ExtensionHudState as ts, maybePersistToolResult as tt, StandardSchemaLike as tu, TracingHookSet as u, InstallExtensionFromSpecOptions as ua, discoverSkills as uc, getModelInfo as ud, SchemaSanitizeResult as uf, getExtensionSessionState as uh, CompactPromptTooLongError as ui, CommandInvocation as ul, SessionMessage as um, Trajectory as un, ExtensionCapability as uo, resolveAnthropicAuthShape as up, WAIT_TASK_TIMED_OUT_PREFIX as ur, ExtensionHostRuntimeImpl as us, renderStaleReadNotice as ut, LoggingHookSet as uu, MutationValidationBatch as v, updateInstalledExtension as va, ActivationVia as vc, restoreModelOptions as vd, OAITool as vf, FileMapAdapter as vh, buildFromCompactPrompt as vi, commandBlocksToContent as vl, ToolBatchExecutor as vm, computeEvalTagScores as vn, ExtensionGuiPanel as vo, isOAuthAccessToken as vp, createToolSearchTool as vr, createWorkspaceSurface as vs, buildZidaneExtensionSkill as vt, AgentProfile as vu, createMutationValidationHooks as w, inlineLoadedExtension as wa, BUILTIN_THEMES as wc, shouldAutoCompact as wd, applyOAICacheBreakpoints as wf, PairingDropKind as wh, CompactionSlice as wi, ConfirmQuestion as wl, ToolResultDocumentRefContent as wm, efficiencyMetricValues as wn, ExtensionModal as wo, AgentBehavior as wp, createSkillsReadTool as wr, SpawnToolOptions as ws, resolveExtensionDocsDir as wt, DEFAULT_PERSIST_EXCLUDE_TOOLS as wu, MutationValidationMutation as x, ExtensionScanEntry as xa, SkillActivationState as xc, AutoCompactInput as xd, OpenAICompatParams as xf, EnsureToolResultPairingOptions as xh, buildUpToCompactPrompt as xi, parseCommandInvocation as xl, ToolResultAudioContent as xm, createReusableExecutionContext as xn, ExtensionKeybindingDispatchContext as xo, resolveOAuthApiKey as xp, SkillsRunScriptToolOptions as xr, SpawnTaskInput as xs, extensionDirForCwd as xt, BUILTIN_AGENTS as xu, MutationValidationFailure as y, registerExtensionHostModules as ya, ActiveSkill as yc, AUTO_COMPACT_MIN_GROWTH_FRACTION as yd, OpenAICompatAuthHeader as yf, FileMapStoreOptions as yh, buildFullCompactPrompt as yi, commandSteps as yl, ToolHookContext as ym, createEvalAgent as yn, ExtensionGuiSurface as yo, readOAuthCredentials as yp, SkillsUseToolOptions as yr, ChildAgent as ys, buildZidaneSkillEditSkill as yt, AgentRegistry as yu, McpCredentialEntry as z, ExtensionConfigChangeBehavior as za, createPathAutocompleteProvider as zc, CacheBreakInfo as zd, mapCodexStopReason as zf, fromAnthropic as zh, AgentHookMap as zi, QuestionPayload as zl, ReadStateEntry as zm, runEvalCase as zn, ExtensionToolCatalogTransform as zo, GeometricThinkingDecay as zp, RunSummaryBudget as zr, SkillValidationResult as zs, EvalDefinitionContext as zt, StreamEvent as zu };
17403
+ //# sourceMappingURL=index-D-DPqXxU.d.ts.map