@tangle-network/agent-runtime 7.0.0 → 8.0.1

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 (124) hide show
  1. package/CHANGELOG.md +74 -0
  2. package/README.md +0 -3
  3. package/dist/{activation-Ba9IAgQ3.js → activation-8AdN-3r4.js} +4 -4
  4. package/dist/{activation-Ba9IAgQ3.js.map → activation-8AdN-3r4.js.map} +1 -1
  5. package/dist/{activation-DIkTEBWF.d.ts → activation-xxvLF1-1.d.ts} +2 -2
  6. package/dist/agent.d.ts +1 -1
  7. package/dist/agent.js +3 -3
  8. package/dist/{bundle-Cy5igJdv.js → bundle-CcpL2lfr.js} +2 -2
  9. package/dist/{bundle-Cy5igJdv.js.map → bundle-CcpL2lfr.js.map} +1 -1
  10. package/dist/candidate-execution/index.js +4 -4
  11. package/dist/continuation-CIyKnS1Q.js +451 -0
  12. package/dist/continuation-CIyKnS1Q.js.map +1 -0
  13. package/dist/{coordination-manager-DQZ2u6L-.js → coordination-manager-DAGPerJy.js} +194 -148
  14. package/dist/coordination-manager-DAGPerJy.js.map +1 -0
  15. package/dist/{coordination-map-routing-CKRNZSaV.js → coordination-map-routing-XZXTlCmn.js} +2 -4
  16. package/dist/coordination-map-routing-XZXTlCmn.js.map +1 -0
  17. package/dist/{delegate-DFLSVjFG.js → delegate-CoaNr0hO.js} +3 -3
  18. package/dist/{delegate-DFLSVjFG.js.map → delegate-CoaNr0hO.js.map} +1 -1
  19. package/dist/durable.d.ts +1 -1
  20. package/dist/durable.js +13 -12
  21. package/dist/durable.js.map +1 -1
  22. package/dist/{errors-AzSuGI23.js → errors-DG8yufqX.js} +8 -1
  23. package/dist/errors-DG8yufqX.js.map +1 -0
  24. package/dist/{failure-cause-rJTm_Tx8.js → failure-cause-CVB-YE88.js} +12 -8
  25. package/dist/{failure-cause-rJTm_Tx8.js.map → failure-cause-CVB-YE88.js.map} +1 -1
  26. package/dist/graph-pFTeNZ-G.js +1793 -0
  27. package/dist/graph-pFTeNZ-G.js.map +1 -0
  28. package/dist/{graph-registry-7X2nrreR.js → graph-registry-czAwYwNj.js} +133 -9
  29. package/dist/graph-registry-czAwYwNj.js.map +1 -0
  30. package/dist/{graph-registry-gYbq4L5Z.js → graph-registry-uTIyyy7A.js} +1 -1
  31. package/dist/{improve-BolbYegO.js → improve-I43jex8v.js} +19 -48
  32. package/dist/improve-I43jex8v.js.map +1 -0
  33. package/dist/index.d.ts +3 -3
  34. package/dist/index.js +16 -16
  35. package/dist/intelligence.d.ts +2 -2
  36. package/dist/intelligence.js +8 -8
  37. package/dist/intelligence.js.map +1 -1
  38. package/dist/kernel.d.ts +2 -2
  39. package/dist/kernel.js +16 -15
  40. package/dist/{loop-runner-Cs9IJ6Nk.d.ts → loop-runner-BGwhcn1p.d.ts} +2 -2
  41. package/dist/{loop-runner-C9W3T_3T.js → loop-runner-BN4KozR0.js} +3 -3
  42. package/dist/{loop-runner-C9W3T_3T.js.map → loop-runner-BN4KozR0.js.map} +1 -1
  43. package/dist/loop-runner-bin.d.ts +1 -1
  44. package/dist/loop-runner-bin.js +1 -1
  45. package/dist/mcp/bin.js +7 -5
  46. package/dist/mcp/bin.js.map +1 -1
  47. package/dist/mcp/index.d.ts +1 -1
  48. package/dist/mcp/index.js +9 -9
  49. package/dist/mcp/memory-bin.js +2 -2
  50. package/dist/{model-policy-JOcg3NRs.js → model-policy-CZwhXp8O.js} +15 -10
  51. package/dist/model-policy-CZwhXp8O.js.map +1 -0
  52. package/dist/{prepare-Dtfk_Wi_.js → prepare-BnF8nGIg.js} +4 -4
  53. package/dist/{prepare-Dtfk_Wi_.js.map → prepare-BnF8nGIg.js.map} +1 -1
  54. package/dist/{profile-CNSQjOes.js → profile-CD25rTJF.js} +4 -4
  55. package/dist/{profile-CNSQjOes.js.map → profile-CD25rTJF.js.map} +1 -1
  56. package/dist/profiles.d.ts +1 -1
  57. package/dist/profiles.js +2 -2
  58. package/dist/{provision-supervisor-BQFHjCtN.js → provision-supervisor-DvzayGpe.js} +8 -8
  59. package/dist/{provision-supervisor-BQFHjCtN.js.map → provision-supervisor-DvzayGpe.js.map} +1 -1
  60. package/dist/{run-cancellation-B84X8ZAP.js → run-cancellation-C5__aBKW.js} +4 -4
  61. package/dist/{run-cancellation-B84X8ZAP.js.map → run-cancellation-C5__aBKW.js.map} +1 -1
  62. package/dist/{run-state-Dh1bGERI.js → run-state-CJAaxqfp.js} +5 -5
  63. package/dist/{run-state-Dh1bGERI.js.map → run-state-CJAaxqfp.js.map} +1 -1
  64. package/dist/{runtime-C9F1PG2A.js → runtime-CuwHe8_K.js} +76 -987
  65. package/dist/runtime-CuwHe8_K.js.map +1 -0
  66. package/dist/{sandbox-profile-compat-oFGWESLn.js → sandbox-profile-compat-l-SLQnGb.js} +2 -2
  67. package/dist/{sandbox-profile-compat-oFGWESLn.js.map → sandbox-profile-compat-l-SLQnGb.js.map} +1 -1
  68. package/dist/{search-executor-CKR9_6NR.js → search-executor-DAjm-NlG.js} +17 -46
  69. package/dist/search-executor-DAjm-NlG.js.map +1 -0
  70. package/dist/{server-Dh3SQGQT.js → server-BUpNUn5D.js} +32 -8
  71. package/dist/{server-Dh3SQGQT.js.map → server-BUpNUn5D.js.map} +1 -1
  72. package/dist/{settle-record-C6LdVvok.js → settle-record-CeBdBuxP.js} +2 -2
  73. package/dist/{settle-record-C6LdVvok.js.map → settle-record-CeBdBuxP.js.map} +1 -1
  74. package/dist/{snapshot-Cgj2Wzi6.js → snapshot-BKI_w3JD.js} +19 -5
  75. package/dist/snapshot-BKI_w3JD.js.map +1 -0
  76. package/dist/{structural-rollout-Dapf2aZY.js → structural-rollout-CqxBKxKY.js} +18 -54
  77. package/dist/structural-rollout-CqxBKxKY.js.map +1 -0
  78. package/dist/{supervise-xwl2D6q3.js → supervise-Cdqj_oe4.js} +101 -111
  79. package/dist/supervise-Cdqj_oe4.js.map +1 -0
  80. package/dist/{supervision-discovery-B47U8TH5.js → supervision-discovery-CW-ildZ-.js} +4 -4
  81. package/dist/{supervision-discovery-B47U8TH5.js.map → supervision-discovery-CW-ildZ-.js.map} +1 -1
  82. package/dist/{supervisor-gC-u_PRk.js → supervisor-D-eT-6Tu.js} +206 -693
  83. package/dist/supervisor-D-eT-6Tu.js.map +1 -0
  84. package/dist/{supervisor-accounting-DxLQ_TQe.js → supervisor-accounting-Ow6CChpB.js} +434 -423
  85. package/dist/supervisor-accounting-Ow6CChpB.js.map +1 -0
  86. package/dist/testing.d.ts +1 -1
  87. package/dist/testing.js +61 -61
  88. package/dist/{tool-server-Dg350Bgz.js → tool-server-DYwRbi0I.js} +3 -3
  89. package/dist/{tool-server-Dg350Bgz.js.map → tool-server-DYwRbi0I.js.map} +1 -1
  90. package/dist/{top-web-BJLnFQdr.js → top-web-BuYMkJN4.js} +9 -7
  91. package/dist/{top-web-BJLnFQdr.js.map → top-web-BuYMkJN4.js.map} +1 -1
  92. package/dist/tui/bin.js +3 -3
  93. package/dist/tui/index.d.ts +1 -1
  94. package/dist/tui/index.js +2 -2
  95. package/dist/{types-Jg274chm.d.ts → types-C_qbnw9N.d.ts} +1335 -1413
  96. package/dist/{util-C_cdPNC4.js → util-fcckrkKp.js} +39 -113
  97. package/dist/util-fcckrkKp.js.map +1 -0
  98. package/dist/viewer/report-viewer.js +90 -90
  99. package/dist/viewer/runtime-viewer/AgentGraphCanvas-P_PFS2Ko-B7S6Fwwy.js +563 -0
  100. package/dist/viewer/runtime-viewer/latest-events-wofY6ifW-B8_bfLwI.js +17870 -0
  101. package/dist/viewer/styles.css +1592 -7027
  102. package/dist/viewer/workspace-viewer.js +10926 -10522
  103. package/dist/{workspace-streams-B7yNMahl.js → workspace-streams-DA9R3j-p.js} +2 -2
  104. package/dist/{workspace-streams-B7yNMahl.js.map → workspace-streams-DA9R3j-p.js.map} +1 -1
  105. package/package.json +9 -9
  106. package/dist/coordination-manager-DQZ2u6L-.js.map +0 -1
  107. package/dist/coordination-map-routing-CKRNZSaV.js.map +0 -1
  108. package/dist/errors-AzSuGI23.js.map +0 -1
  109. package/dist/graph-BjQF2syl.js +0 -579
  110. package/dist/graph-BjQF2syl.js.map +0 -1
  111. package/dist/graph-registry-7X2nrreR.js.map +0 -1
  112. package/dist/improve-BolbYegO.js.map +0 -1
  113. package/dist/model-policy-JOcg3NRs.js.map +0 -1
  114. package/dist/runtime-C9F1PG2A.js.map +0 -1
  115. package/dist/search-executor-CKR9_6NR.js.map +0 -1
  116. package/dist/snapshot-Cgj2Wzi6.js.map +0 -1
  117. package/dist/structural-rollout-Dapf2aZY.js.map +0 -1
  118. package/dist/supervise-xwl2D6q3.js.map +0 -1
  119. package/dist/supervisor-accounting-DxLQ_TQe.js.map +0 -1
  120. package/dist/supervisor-gC-u_PRk.js.map +0 -1
  121. package/dist/util-C_cdPNC4.js.map +0 -1
  122. package/dist/viewer/runtime-viewer/AgentGraphCanvas-DGq7_u8--C6yDfIUT.js +0 -8555
  123. package/dist/viewer/runtime-viewer/latest-events-CRq9sGkK-CfoBl1dP.js +0 -9592
  124. package/dist/viewer/runtime-viewer/sandbox-ui-BEziPi7D.css +0 -2
@@ -1 +1 @@
1
- {"version":3,"file":"bin.js","names":[],"sources":["../../src/mcp/delegate-supervisor-provisioning.ts","../../src/mcp/bin.ts"],"sourcesContent":["/**\n *\n * Resolve the `delegate` supervisor substrate (router brain + worker backend) from env, so the\n * `agent-runtime-mcp` bin can serve the ONE generic `delegate` verb by env, over the SAME stdio\n * invocation a consumer already mounts.\n *\n * `delegate` is wired into `createMcpServer` via `McpServerOptions.delegateSupervisor`, which needs a\n * router (the supervisor brain's transport) and a backend (WHERE the authored workers run). Inside a\n * sandbox child the natural backend is `sandbox`: authored workers run as sub-sandboxes through the\n * SAME `SandboxClient` the bin already loads from its sandbox key. Dedicated MCP variables name\n * the supervisor's router connection and exact model; inherited worker/model aliases are rejected.\n *\n * @experimental\n */\n\nimport type { AgentProfile } from '@tangle-network/agent-interface'\nimport { ConfigError } from '../errors'\nimport type { SandboxClient } from '../runtime'\nimport type { RouterTransportConfig } from '../runtime/router-http-transport'\nimport { supervisorInstructions } from '../runtime/supervise/authoring'\nimport { coordinationProfileToolPrefix } from '../runtime/supervise/provider-visible-profile'\nimport type { ExecutorConfig } from '../runtime/supervise/runtime'\nimport type { DelegateHandlerOptions } from './tools/delegate'\n\nfunction trimmed(value: string | undefined): string | undefined {\n const v = value?.trim()\n return v ? v : undefined\n}\n\nfunction requiredEnv(env: NodeJS.ProcessEnv, name: string): string {\n const value = trimmed(env[name])\n if (value) return value\n throw new ConfigError(`agent-runtime-mcp: ${name} is required when MCP_ENABLE_DELEGATE=1`)\n}\n\n/** True when the operator opted the generic `delegate` verb in (`MCP_ENABLE_DELEGATE=1`). Default off:\n * the wiring is additive, so consumers that do not enable it are unaffected. */\nexport function delegateEnabled(env: NodeJS.ProcessEnv = process.env): boolean {\n return env.MCP_ENABLE_DELEGATE === '1'\n}\n\n/**\n * The Runtime verbs the authoring supervisor is granted. A profile gets no coordination tool it does\n * not declare, so without `spawn_worker` the brain is offered no tools and every delegation settles\n * `no-children-spawned`. The rest let it inspect, steer, stop, and re-read what it already spawned,\n * which its authoring instruction tells it to do.\n */\nconst delegateSupervisorVerbs = [\n 'spawn_worker',\n 'observe_agent',\n 'steer_agent',\n 'cancel_worker',\n 'read_journal',\n] as const\n\n/**\n * The `delegate` caller asked for a worker to do the task, and only a worker's settled result is\n * delivered. A capable brain otherwise answers a small intent itself (gemini-3.7-flash and kimi-k3\n * both replied to \"Reply with exactly DELEGATED-391\" directly), which settles `no-children-spawned`\n * and discards the answer.\n */\nconst delegateContract = [\n '',\n 'This task came through `delegate`: the caller wants a worker to do it. However small the task,',\n 'call spawn_worker at least once before you end your turn. Your own reply is never delivered;',\n \"only a worker's settled result is.\",\n].join('\\n')\n\n/**\n * Resolve the supervisor brain from dedicated MCP configuration. The model is part of the exact\n * profile; the URL and key are transport-only. No generic worker/model/key variable may silently\n * select this paid execution path.\n */\nfunction resolveRouterSupervisor(env: NodeJS.ProcessEnv): {\n router: RouterTransportConfig\n profile: AgentProfile\n} {\n const routerKey = requiredEnv(env, 'MCP_SUPERVISOR_ROUTER_KEY')\n const base = requiredEnv(env, 'MCP_SUPERVISOR_ROUTER_BASE_URL')\n const routerBaseUrl = /\\/v\\d+\\/?$/.test(base)\n ? base.replace(/\\/$/, '')\n : `${base.replace(/\\/$/, '')}/v1`\n const model = requiredEnv(env, 'MCP_SUPERVISOR_MODEL')\n // The consumer's own policy for the workers this supervisor authors, such as the only harness and\n // model its worker boxes can run. Without it the brain picks instruments from memory, and on\n // 2026-10-19 every one it picked (claude-code on Anthropic, nanoclaw, cli-base) died in the box.\n const consumerInstructions = trimmed(env.MCP_SUPERVISOR_INSTRUCTIONS)\n return {\n router: { routerBaseUrl, routerKey },\n profile: {\n name: 'delegate-supervisor',\n harness: 'cli-base',\n model: { provider: 'tangle-router', default: model },\n prompt: {\n systemPrompt: [\n supervisorInstructions(),\n delegateContract,\n ...(consumerInstructions ? ['', consumerInstructions] : []),\n ].join('\\n'),\n },\n tools: Object.fromEntries(\n delegateSupervisorVerbs.map((verb) => [`${coordinationProfileToolPrefix}${verb}`, true]),\n ),\n },\n }\n}\n\n/**\n * Build the `delegateSupervisor` substrate for `createMcpServer` from env + the bin's loaded\n * `SandboxClient`. Returns `undefined` when `delegate` is not opted in, so the caller mounts it only\n * when asked. The worker backend is `sandbox`; every authored worker's exact profile selects its\n * own harness/provider/model.\n */\nexport function resolveDelegateSupervisor(\n sandboxClient: SandboxClient,\n env: NodeJS.ProcessEnv = process.env,\n): DelegateHandlerOptions | undefined {\n if (!delegateEnabled(env)) return undefined\n const supervisor = resolveRouterSupervisor(env)\n const backend: ExecutorConfig = {\n backend: 'sandbox',\n sandboxClient,\n }\n return {\n router: supervisor.router,\n supervisorProfile: supervisor.profile,\n backend,\n }\n}\n","#!/usr/bin/env node\n\n/**\n *\n * `agent-runtime-mcp` — stdio MCP server entry point.\n *\n * Serves the ONE generic `delegate` verb (opt-in via `MCP_ENABLE_DELEGATE=1`): one intent → a\n * supervisor that authors + drives its own worker over `supervise()`, returning the delivered output\n * with its cost. The supervisor brain runs on the router; authored workers run as sub-sandboxes\n * through the `SandboxClient` the bin loads from the sandbox key. The queue-bound tools\n * (`delegate_feedback`, `delegation_status`, `delegation_history`) are always served.\n *\n * A platform key serves one product, so the Sandbox API key and the router key are separate\n * variables: the sandbox key only constructs the Sandbox client, and the router key only reaches\n * the supervisor brain. Neither is forwarded into a worker box; each worker's model access comes\n * from the box its profile provisions.\n *\n * Environment variables:\n * TANGLE_SANDBOX_API_KEY Sandbox API key passed to `new Sandbox({ apiKey })`. Falls back\n * to TANGLE_API_KEY when unset, so one key that serves the Sandbox\n * API keeps working.\n * TANGLE_API_KEY Sandbox API key when TANGLE_SANDBOX_API_KEY is unset\n * SANDBOX_BASE_URL optional — sandbox-SDK base URL override\n * MCP_ENABLE_DELEGATE set to `1` to serve the generic `delegate` verb. Its authoring\n * supervisor runs the brain on the router and spawns authored\n * workers as sub-sandboxes via the same client; needs a sandbox key.\n * MCP_ENABLE_EVENTS set to `1` to serve the `events_*` subscription tools read-only\n * over one durable observer journal.\n * AGENT_RUNTIME_EVENTS_JOURNAL absolute path of that observer-journal file. Absent or empty\n * file = valid empty journal; records appear as the run appends.\n * MCP_SUPERVISOR_MODEL required exact supervisor brain model id\n * MCP_SUPERVISOR_ROUTER_KEY required router key for the supervisor brain\n * MCP_SUPERVISOR_ROUTER_BASE_URL required router base, normalized to `/v1`\n * MCP_SUPERVISOR_INSTRUCTIONS optional text appended to the supervisor's system prompt: the\n * caller's policy for the workers it authors, such as the harness\n * and model its worker boxes can run\n * AGENT_RUNTIME_DELEGATION_STATE_FILE\n * optional — absolute path of a JSON state\n * file. When set, delegation records persist\n * across MCP restarts (FileDelegationStore):\n * status/history survive and idempotency keys\n * dedupe across processes.\n * AGENT_RUNTIME_DELEGATION_STATE_RECOVER\n * set to `1` to archive a corrupt state file\n * (`<file>.corrupt-<ts>`) and start empty\n * instead of refusing to boot.\n * AGENT_RUNTIME_DELEGATION_RETAIN_TERMINAL\n * optional — positive integer cap on retained\n * terminal records. Unset = keep forever.\n *\n * @experimental\n */\n\nimport { isAbsolute } from 'node:path'\nimport { FileObserverJournal } from '../durable/observer-journal'\nimport type { SandboxClient } from '../runtime'\nimport { delegateEnabled, resolveDelegateSupervisor } from './delegate-supervisor-provisioning'\nimport { FileDelegationStore } from './delegation-store'\nimport { createMcpServer } from './server'\nimport { DelegationTaskQueue } from './task-queue'\nimport type { DelegateHandlerOptions } from './tools/delegate'\nimport { type McpEventSource, observerJournalEventSource } from './tools/events'\nimport { readTraceContextFromEnv, type TraceContext } from './trace-propagation'\n\nconst DEFAULT_SANDBOX_BASE_URL = 'https://sandbox.tangle.tools'\n\nasync function main(): Promise<void> {\n const wantDelegate = delegateEnabled(process.env)\n\n // The generic `delegate` verb needs the sandbox client: its authored workers run as sub-sandboxes\n // (the `sandbox` backend). When `delegate` is not opted in, the server runs the queue-only subset\n // (feedback + status + history) with no sandbox.\n let sandboxClient: SandboxClient | undefined\n if (wantDelegate) {\n const apiKey = sandboxApiKey(process.env)\n if (!apiKey && !process.env.AGENT_RUNTIME_MCP_ALLOW_NO_KEY) {\n process.stderr.write(\n 'agent-runtime-mcp: a Sandbox API key is required to serve `delegate`: set TANGLE_SANDBOX_API_KEY (or TANGLE_API_KEY when that key serves the Sandbox API). Set AGENT_RUNTIME_MCP_ALLOW_NO_KEY=1 to run without it for diagnostics, or unset MCP_ENABLE_DELEGATE to run the queue-only subset.\\n',\n )\n process.exit(2)\n }\n sandboxClient = await loadSandboxClient(apiKey)\n }\n\n // The supervisor's loop topology spans export to the OTLP / Tangle Intelligence sink when\n // OTEL_EXPORTER_OTLP_ENDPOINT is set (+ TRACE_ID / PARENT_SPAN_ID for correlation). The same\n // context is stamped onto every delegation record so journal consumers join records into the\n // caller's trace.\n const traceContext = readTraceContextFromEnv()\n if (process.env.OTEL_EXPORTER_OTLP_ENDPOINT) {\n process.stderr.write(\n `agent-runtime-mcp: exporting loop topology → ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}\\n`,\n )\n }\n\n // The ONE generic `delegate` verb — opt-in via MCP_ENABLE_DELEGATE=1. Its authoring supervisor\n // runs the brain on the router and spawns authored workers as sub-sandboxes through the SAME\n // client, so it needs the loaded `sandboxClient`. Gated on the client resolving (no key → no\n // delegate, fail-closed).\n let delegateSupervisor: DelegateHandlerOptions | undefined\n if (wantDelegate && sandboxClient) {\n try {\n delegateSupervisor = resolveDelegateSupervisor(sandboxClient)\n } catch (error) {\n // Refuse to serve a verb that cannot work. Advertising `delegate` on an\n // unresolvable substrate spends an agent's turn on a tool whose first\n // inference is guaranteed to reject.\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n process.exit(2)\n }\n }\n if (delegateSupervisor) {\n process.stderr.write(\n `agent-runtime-mcp: delegate enabled — generic authoring supervisor on ${delegateSupervisor.supervisorProfile.model?.default}\\n`,\n )\n }\n\n const durableQueue = await buildDurableQueueFromEnv(traceContext)\n const eventSource = await buildEventSourceFromEnv()\n const server = createMcpServer({\n ...(delegateSupervisor ? { delegateSupervisor } : {}),\n ...(eventSource ? { eventSource } : {}),\n traceContext,\n ...(durableQueue ? { queue: durableQueue } : {}),\n })\n\n const shutdown = () => {\n server.stop()\n // Drain journal writes so the state file reflects the final record\n // states before the process exits. A persist failure already routed\n // through onPersistError; swallow the duplicate rejection here.\n if (durableQueue) {\n void durableQueue\n .flush()\n .catch(() => {})\n .finally(() => process.exit(0))\n return\n }\n process.exit(0)\n }\n process.on('SIGINT', shutdown)\n process.on('SIGTERM', shutdown)\n\n await server.serve()\n}\n\n/** `MCP_ENABLE_EVENTS=1` + `AGENT_RUNTIME_EVENTS_JOURNAL=<file>` serves the\n * `events_*` subscription tools read-only over ONE pursuit's durable observer\n * journal. An absent file is a valid empty journal: consumers subscribe at\n * watermark 0 and see records as the run appends them. Cross-pursuit\n * aggregation belongs to the host/platform layer, not this bin. */\nasync function buildEventSourceFromEnv(): Promise<McpEventSource | undefined> {\n if (process.env.MCP_ENABLE_EVENTS !== '1') return undefined\n const journalPath = process.env.AGENT_RUNTIME_EVENTS_JOURNAL\n if (!journalPath || !isAbsolute(journalPath)) {\n process.stderr.write(\n 'agent-runtime-mcp: MCP_ENABLE_EVENTS=1 requires AGENT_RUNTIME_EVENTS_JOURNAL set to an absolute observer-journal file path.\\n',\n )\n process.exit(2)\n }\n const journal = await FileObserverJournal.open(journalPath)\n if (journal) {\n process.stderr.write(\n `agent-runtime-mcp: events enabled — read-only observer journal ${journalPath} (pursuit ${journal.pursuitId})\\n`,\n )\n return observerJournalEventSource(journal)\n }\n process.stderr.write(\n `agent-runtime-mcp: events enabled — journal ${journalPath} has no committed records yet; serving an empty journal.\\n`,\n )\n return { read: async () => [] }\n}\n\nasync function buildDurableQueueFromEnv(\n traceContext: TraceContext,\n): Promise<DelegationTaskQueue | undefined> {\n const stateFile = process.env.AGENT_RUNTIME_DELEGATION_STATE_FILE?.trim()\n if (!stateFile) return undefined\n const store = new FileDelegationStore({\n filePath: stateFile,\n recoverCorrupt: process.env.AGENT_RUNTIME_DELEGATION_STATE_RECOVER === '1',\n })\n const maxTerminalRecords = parseRetention(process.env.AGENT_RUNTIME_DELEGATION_RETAIN_TERMINAL)\n const queue = await DelegationTaskQueue.restore({\n store,\n traceContext,\n ...(maxTerminalRecords !== undefined ? { maxTerminalRecords } : {}),\n onPersistError: (error) => {\n // Durable mode that can no longer write is a broken contract: crash\n // loud instead of degrading to memory-only behind the caller's back.\n process.stderr.write(`agent-runtime-mcp: ${error.message}\\n`)\n process.exit(1)\n },\n })\n process.stderr.write(`agent-runtime-mcp: durable delegation state → ${stateFile}\\n`)\n return queue\n}\n\nfunction parseRetention(raw: string | undefined): number | undefined {\n if (raw === undefined || raw.trim() === '') return undefined\n const n = Number(raw)\n if (!Number.isInteger(n) || n < 1) {\n process.stderr.write(\n `agent-runtime-mcp: AGENT_RUNTIME_DELEGATION_RETAIN_TERMINAL must be a positive integer, got \"${raw}\"\\n`,\n )\n process.exit(2)\n }\n return n\n}\n\n/** The Sandbox API key: the dedicated variable when set, else the legacy single key. The router key\n * (`MCP_SUPERVISOR_ROUTER_KEY`) is read only by the supervisor provisioning. */\nfunction sandboxApiKey(env: NodeJS.ProcessEnv): string | undefined {\n return env.TANGLE_SANDBOX_API_KEY?.trim() || env.TANGLE_API_KEY?.trim() || undefined\n}\n\nasync function loadSandboxClient(apiKey: string | undefined): Promise<SandboxClient> {\n // Diagnostic mode: AGENT_RUNTIME_MCP_ALLOW_NO_KEY=1 enables tools/list + the\n // queue-bound tools (status / history / feedback) without sandbox creds.\n // `delegate` requires a real client; the stub fails loud at create() so the\n // agent observes the cause instead of silent success.\n if (!apiKey) {\n return {\n async create() {\n throw new Error(\n 'agent-runtime-mcp: no Sandbox API key is set; `delegate` is disabled in diagnostic mode. Set TANGLE_SANDBOX_API_KEY (or TANGLE_API_KEY) or unset MCP_ENABLE_DELEGATE to remove the unsupported tool from the tool list.',\n )\n },\n } satisfies SandboxClient\n }\n // Diagnostic mode does not need a client, so defer SDK initialization until\n // delegation is requested. Runtime declares the SDK as a required peer.\n const mod = await import('@tangle-network/sandbox').catch((err) => {\n process.stderr.write(\n `agent-runtime-mcp: failed to load @tangle-network/sandbox (${err.message}); install the peer dependency\\n`,\n )\n process.exit(2)\n })\n const SandboxCtor = (mod as { Sandbox?: new (config: unknown) => SandboxClient }).Sandbox\n if (!SandboxCtor) {\n process.stderr.write(\n 'agent-runtime-mcp: @tangle-network/sandbox does not export Sandbox; cannot construct client\\n',\n )\n process.exit(2)\n }\n // @tangle-network/sandbox ≥0.6 makes baseUrl required; default it so the MCP server\n // starts without forcing every caller to set SANDBOX_BASE_URL. Treat empty/whitespace as\n // unset (|| not ??) so `SANDBOX_BASE_URL=` still resolves to the default.\n const baseUrl = process.env.SANDBOX_BASE_URL?.trim() || DEFAULT_SANDBOX_BASE_URL\n return new SandboxCtor({ apiKey, baseUrl })\n}\n\nmain().catch((err) => {\n process.stderr.write(`agent-runtime-mcp: ${err instanceof Error ? err.stack : String(err)}\\n`)\n process.exit(1)\n})\n"],"mappings":"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"}
1
+ {"version":3,"file":"bin.js","names":[],"sources":["../../src/mcp/delegate-supervisor-provisioning.ts","../../src/mcp/bin.ts"],"sourcesContent":["/**\n *\n * Resolve the `delegate` supervisor substrate (router brain + worker backend) from env, so the\n * `agent-runtime-mcp` bin can serve the ONE generic `delegate` verb by env, over the SAME stdio\n * invocation a consumer already mounts.\n *\n * `delegate` is wired into `createMcpServer` via `McpServerOptions.delegateSupervisor`, which needs a\n * router (the supervisor brain's transport) and a backend (WHERE the authored workers run). Inside a\n * sandbox child the natural backend is `sandbox`: authored workers run as sub-sandboxes through the\n * SAME `SandboxClient` the bin already loads from its sandbox key. Dedicated MCP variables name\n * the supervisor's router connection and exact model; inherited worker/model aliases are rejected.\n *\n * @experimental\n */\n\nimport type { AgentProfile } from '@tangle-network/agent-interface'\nimport { ConfigError } from '../errors'\nimport type { SandboxClient } from '../runtime'\nimport type { RouterTransportConfig } from '../runtime/router-http-transport'\nimport { supervisorInstructions } from '../runtime/supervise/authoring'\nimport { coordinationProfileToolPrefix } from '../runtime/supervise/provider-visible-profile'\nimport type { ExecutorConfig } from '../runtime/supervise/runtime'\nimport type { DelegateHandlerOptions } from './tools/delegate'\n\nfunction trimmed(value: string | undefined): string | undefined {\n const v = value?.trim()\n return v ? v : undefined\n}\n\nfunction requiredEnv(env: NodeJS.ProcessEnv, name: string): string {\n const value = trimmed(env[name])\n if (value) return value\n throw new ConfigError(`agent-runtime-mcp: ${name} is required when MCP_ENABLE_DELEGATE=1`)\n}\n\n/** True when the operator opted the generic `delegate` verb in (`MCP_ENABLE_DELEGATE=1`). Default off:\n * the wiring is additive, so consumers that do not enable it are unaffected. */\nexport function delegateEnabled(env: NodeJS.ProcessEnv = process.env): boolean {\n return env.MCP_ENABLE_DELEGATE === '1'\n}\n\n/**\n * The Runtime verbs the authoring supervisor is granted. A profile gets no coordination tool it does\n * not declare, so without `spawn_worker` the brain is offered no tools and every delegation settles\n * `no-children-spawned`. The rest let it inspect, steer, stop, and re-read what it already spawned,\n * which its authoring instruction tells it to do.\n */\nconst delegateSupervisorVerbs = [\n 'spawn_worker',\n 'observe_agent',\n 'steer_agent',\n 'cancel_worker',\n 'read_journal',\n] as const\n\n/**\n * The `delegate` caller asked for a worker to do the task, and only a worker's settled result is\n * delivered. A capable brain otherwise answers a small intent itself (gemini-3.7-flash and kimi-k3\n * both replied to \"Reply with exactly DELEGATED-391\" directly), which settles `no-children-spawned`\n * and discards the answer.\n */\nconst delegateContract = [\n '',\n 'This task came through `delegate`: the caller wants a worker to do it. However small the task,',\n 'call spawn_worker at least once before you end your turn. Your own reply is never delivered;',\n \"only a worker's settled result is.\",\n].join('\\n')\n\n/**\n * Resolve the supervisor brain from dedicated MCP configuration. The model is part of the exact\n * profile; the URL and key are transport-only. No generic worker/model/key variable may silently\n * select this paid execution path.\n */\nfunction resolveRouterSupervisor(env: NodeJS.ProcessEnv): {\n router: RouterTransportConfig\n profile: AgentProfile\n} {\n const routerKey = requiredEnv(env, 'MCP_SUPERVISOR_ROUTER_KEY')\n const base = requiredEnv(env, 'MCP_SUPERVISOR_ROUTER_BASE_URL')\n const routerBaseUrl = /\\/v\\d+\\/?$/.test(base)\n ? base.replace(/\\/$/, '')\n : `${base.replace(/\\/$/, '')}/v1`\n const model = requiredEnv(env, 'MCP_SUPERVISOR_MODEL')\n // The consumer's own policy for the workers this supervisor authors, such as the only harness and\n // model its worker boxes can run. Without it the brain picks instruments from memory, and on\n // 2026-10-19 every one it picked (claude-code on Anthropic, nanoclaw, cli-base) died in the box.\n const consumerInstructions = trimmed(env.MCP_SUPERVISOR_INSTRUCTIONS)\n return {\n router: { routerBaseUrl, routerKey },\n profile: {\n name: 'delegate-supervisor',\n harness: 'cli-base',\n model: { provider: 'tangle-router', default: model },\n prompt: {\n systemPrompt: [\n supervisorInstructions(),\n delegateContract,\n ...(consumerInstructions ? ['', consumerInstructions] : []),\n ].join('\\n'),\n },\n tools: Object.fromEntries(\n delegateSupervisorVerbs.map((verb) => [`${coordinationProfileToolPrefix}${verb}`, true]),\n ),\n },\n }\n}\n\n/**\n * Build the `delegateSupervisor` substrate for `createMcpServer` from env + the bin's loaded\n * `SandboxClient`. Returns `undefined` when `delegate` is not opted in, so the caller mounts it only\n * when asked. The worker backend is `sandbox`; every authored worker's exact profile selects its\n * own harness/provider/model.\n */\nexport function resolveDelegateSupervisor(\n sandboxClient: SandboxClient,\n env: NodeJS.ProcessEnv = process.env,\n): DelegateHandlerOptions | undefined {\n if (!delegateEnabled(env)) return undefined\n const supervisor = resolveRouterSupervisor(env)\n const backend: ExecutorConfig = {\n backend: 'sandbox',\n sandboxClient,\n }\n return {\n router: supervisor.router,\n supervisorProfile: supervisor.profile,\n backend,\n }\n}\n","#!/usr/bin/env node\n\n/**\n *\n * `agent-runtime-mcp` — stdio MCP server entry point.\n *\n * Serves the ONE generic `delegate` verb (opt-in via `MCP_ENABLE_DELEGATE=1`): one intent → a\n * supervisor that authors + drives its own worker over `supervise()`, returning the delivered output\n * with its cost. The supervisor brain runs on the router; authored workers run as sub-sandboxes\n * through the `SandboxClient` the bin loads from the sandbox key. The queue-bound tools\n * (`delegate_feedback`, `delegation_status`, `delegation_history`) are always served.\n *\n * A platform key serves one product, so the Sandbox API key and the router key are separate\n * variables: the sandbox key only constructs the Sandbox client, and the router key only reaches\n * the supervisor brain. Neither is forwarded into a worker box; each worker's model access comes\n * from the box its profile provisions.\n *\n * Environment variables:\n * TANGLE_SANDBOX_API_KEY Sandbox API key passed to `new Sandbox({ apiKey })`. Falls back\n * to TANGLE_API_KEY when unset, so one key that serves the Sandbox\n * API keeps working.\n * TANGLE_API_KEY Sandbox API key when TANGLE_SANDBOX_API_KEY is unset\n * SANDBOX_BASE_URL optional — sandbox-SDK base URL override\n * MCP_ENABLE_DELEGATE set to `1` to serve the generic `delegate` verb. Its authoring\n * supervisor runs the brain on the router and spawns authored\n * workers as sub-sandboxes via the same client; needs a sandbox key.\n * MCP_ENABLE_EVENTS set to `1` to serve the `events_*` subscription tools read-only\n * over one durable observer journal.\n * AGENT_RUNTIME_EVENTS_JOURNAL absolute path of that observer-journal file. Absent or empty\n * file = valid empty journal; records appear as the run appends.\n * MCP_SUPERVISOR_MODEL required exact supervisor brain model id\n * MCP_SUPERVISOR_ROUTER_KEY required router key for the supervisor brain\n * MCP_SUPERVISOR_ROUTER_BASE_URL required router base, normalized to `/v1`\n * MCP_SUPERVISOR_INSTRUCTIONS optional text appended to the supervisor's system prompt: the\n * caller's policy for the workers it authors, such as the harness\n * and model its worker boxes can run\n * AGENT_RUNTIME_DELEGATION_STATE_FILE\n * optional — absolute path of a JSON state\n * file. When set, delegation records persist\n * across MCP restarts (FileDelegationStore):\n * status/history survive and idempotency keys\n * dedupe across processes.\n * AGENT_RUNTIME_DELEGATION_STATE_RECOVER\n * set to `1` to archive a corrupt state file\n * (`<file>.corrupt-<ts>`) and start empty\n * instead of refusing to boot.\n * AGENT_RUNTIME_DELEGATION_RETAIN_TERMINAL\n * optional — positive integer cap on retained\n * terminal records. Unset = keep forever.\n *\n * @experimental\n */\n\nimport { basename, isAbsolute } from 'node:path'\nimport { FileObserverJournal } from '../durable/observer-journal'\nimport type { SandboxClient } from '../runtime'\nimport { delegateEnabled, resolveDelegateSupervisor } from './delegate-supervisor-provisioning'\nimport { FileDelegationStore } from './delegation-store'\nimport { createMcpServer } from './server'\nimport { DelegationTaskQueue } from './task-queue'\nimport type { DelegateHandlerOptions } from './tools/delegate'\nimport {\n type McpEventSource,\n observerJournalEventSource,\n rootStreamEventSource,\n} from './tools/events'\nimport { readTraceContextFromEnv, type TraceContext } from './trace-propagation'\n\nconst DEFAULT_SANDBOX_BASE_URL = 'https://sandbox.tangle.tools'\n\nasync function main(): Promise<void> {\n const wantDelegate = delegateEnabled(process.env)\n\n // The generic `delegate` verb needs the sandbox client: its authored workers run as sub-sandboxes\n // (the `sandbox` backend). When `delegate` is not opted in, the server runs the queue-only subset\n // (feedback + status + history) with no sandbox.\n let sandboxClient: SandboxClient | undefined\n if (wantDelegate) {\n const apiKey = sandboxApiKey(process.env)\n if (!apiKey && !process.env.AGENT_RUNTIME_MCP_ALLOW_NO_KEY) {\n process.stderr.write(\n 'agent-runtime-mcp: a Sandbox API key is required to serve `delegate`: set TANGLE_SANDBOX_API_KEY (or TANGLE_API_KEY when that key serves the Sandbox API). Set AGENT_RUNTIME_MCP_ALLOW_NO_KEY=1 to run without it for diagnostics, or unset MCP_ENABLE_DELEGATE to run the queue-only subset.\\n',\n )\n process.exit(2)\n }\n sandboxClient = await loadSandboxClient(apiKey)\n }\n\n // The supervisor's loop topology spans export to the OTLP / Tangle Intelligence sink when\n // OTEL_EXPORTER_OTLP_ENDPOINT is set (+ TRACE_ID / PARENT_SPAN_ID for correlation). The same\n // context is stamped onto every delegation record so journal consumers join records into the\n // caller's trace.\n const traceContext = readTraceContextFromEnv()\n if (process.env.OTEL_EXPORTER_OTLP_ENDPOINT) {\n process.stderr.write(\n `agent-runtime-mcp: exporting loop topology → ${process.env.OTEL_EXPORTER_OTLP_ENDPOINT}\\n`,\n )\n }\n\n // The ONE generic `delegate` verb — opt-in via MCP_ENABLE_DELEGATE=1. Its authoring supervisor\n // runs the brain on the router and spawns authored workers as sub-sandboxes through the SAME\n // client, so it needs the loaded `sandboxClient`. Gated on the client resolving (no key → no\n // delegate, fail-closed).\n let delegateSupervisor: DelegateHandlerOptions | undefined\n if (wantDelegate && sandboxClient) {\n try {\n delegateSupervisor = resolveDelegateSupervisor(sandboxClient)\n } catch (error) {\n // Refuse to serve a verb that cannot work. Advertising `delegate` on an\n // unresolvable substrate spends an agent's turn on a tool whose first\n // inference is guaranteed to reject.\n process.stderr.write(`${error instanceof Error ? error.message : String(error)}\\n`)\n process.exit(2)\n }\n }\n if (delegateSupervisor) {\n process.stderr.write(\n `agent-runtime-mcp: delegate enabled — generic authoring supervisor on ${delegateSupervisor.supervisorProfile.model?.default}\\n`,\n )\n }\n\n const durableQueue = await buildDurableQueueFromEnv(traceContext)\n const eventSource = await buildEventSourceFromEnv()\n const server = createMcpServer({\n ...(delegateSupervisor ? { delegateSupervisor } : {}),\n ...(eventSource ? { eventSource } : {}),\n traceContext,\n ...(durableQueue ? { queue: durableQueue } : {}),\n })\n\n const shutdown = () => {\n server.stop()\n // Drain journal writes so the state file reflects the final record\n // states before the process exits. A persist failure already routed\n // through onPersistError; swallow the duplicate rejection here.\n if (durableQueue) {\n void durableQueue\n .flush()\n .catch(() => {})\n .finally(() => process.exit(0))\n return\n }\n process.exit(0)\n }\n process.on('SIGINT', shutdown)\n process.on('SIGTERM', shutdown)\n\n await server.serve()\n}\n\n/** `MCP_ENABLE_EVENTS=1` + `AGENT_RUNTIME_EVENTS_JOURNAL=<file>` serves the\n * `events_*` subscription tools read-only over ONE pursuit's durable observer\n * journal. An absent file is a valid empty journal: consumers subscribe at\n * watermark 0 and see records as the run appends them. Cross-pursuit\n * aggregation belongs to the host/platform layer, not this bin. */\nasync function buildEventSourceFromEnv(): Promise<McpEventSource | undefined> {\n if (process.env.MCP_ENABLE_EVENTS !== '1') return undefined\n // `AGENT_RUNTIME_EVENTS_ROOT_STREAM=<runDir>` serves that run's committed root stream instead.\n const runDir = process.env.AGENT_RUNTIME_EVENTS_ROOT_STREAM\n if (runDir && isAbsolute(runDir))\n return rootStreamEventSource(runDir, { pursuitId: basename(runDir) })\n const journalPath = process.env.AGENT_RUNTIME_EVENTS_JOURNAL\n if (!journalPath || !isAbsolute(journalPath)) {\n process.stderr.write(\n 'agent-runtime-mcp: MCP_ENABLE_EVENTS=1 requires AGENT_RUNTIME_EVENTS_JOURNAL set to an absolute observer-journal file path.\\n',\n )\n process.exit(2)\n }\n const journal = await FileObserverJournal.open(journalPath)\n if (journal) {\n process.stderr.write(\n `agent-runtime-mcp: events enabled — read-only observer journal ${journalPath} (pursuit ${journal.pursuitId})\\n`,\n )\n return observerJournalEventSource(journal)\n }\n process.stderr.write(\n `agent-runtime-mcp: events enabled — journal ${journalPath} has no committed records yet; serving an empty journal.\\n`,\n )\n return { read: async () => [] }\n}\n\nasync function buildDurableQueueFromEnv(\n traceContext: TraceContext,\n): Promise<DelegationTaskQueue | undefined> {\n const stateFile = process.env.AGENT_RUNTIME_DELEGATION_STATE_FILE?.trim()\n if (!stateFile) return undefined\n const store = new FileDelegationStore({\n filePath: stateFile,\n recoverCorrupt: process.env.AGENT_RUNTIME_DELEGATION_STATE_RECOVER === '1',\n })\n const maxTerminalRecords = parseRetention(process.env.AGENT_RUNTIME_DELEGATION_RETAIN_TERMINAL)\n const queue = await DelegationTaskQueue.restore({\n store,\n traceContext,\n ...(maxTerminalRecords !== undefined ? { maxTerminalRecords } : {}),\n onPersistError: (error) => {\n // Durable mode that can no longer write is a broken contract: crash\n // loud instead of degrading to memory-only behind the caller's back.\n process.stderr.write(`agent-runtime-mcp: ${error.message}\\n`)\n process.exit(1)\n },\n })\n process.stderr.write(`agent-runtime-mcp: durable delegation state → ${stateFile}\\n`)\n return queue\n}\n\nfunction parseRetention(raw: string | undefined): number | undefined {\n if (raw === undefined || raw.trim() === '') return undefined\n const n = Number(raw)\n if (!Number.isInteger(n) || n < 1) {\n process.stderr.write(\n `agent-runtime-mcp: AGENT_RUNTIME_DELEGATION_RETAIN_TERMINAL must be a positive integer, got \"${raw}\"\\n`,\n )\n process.exit(2)\n }\n return n\n}\n\n/** The Sandbox API key: the dedicated variable when set, else the legacy single key. The router key\n * (`MCP_SUPERVISOR_ROUTER_KEY`) is read only by the supervisor provisioning. */\nfunction sandboxApiKey(env: NodeJS.ProcessEnv): string | undefined {\n return env.TANGLE_SANDBOX_API_KEY?.trim() || env.TANGLE_API_KEY?.trim() || undefined\n}\n\nasync function loadSandboxClient(apiKey: string | undefined): Promise<SandboxClient> {\n // Diagnostic mode: AGENT_RUNTIME_MCP_ALLOW_NO_KEY=1 enables tools/list + the\n // queue-bound tools (status / history / feedback) without sandbox creds.\n // `delegate` requires a real client; the stub fails loud at create() so the\n // agent observes the cause instead of silent success.\n if (!apiKey) {\n return {\n async create() {\n throw new Error(\n 'agent-runtime-mcp: no Sandbox API key is set; `delegate` is disabled in diagnostic mode. Set TANGLE_SANDBOX_API_KEY (or TANGLE_API_KEY) or unset MCP_ENABLE_DELEGATE to remove the unsupported tool from the tool list.',\n )\n },\n } satisfies SandboxClient\n }\n // Diagnostic mode does not need a client, so defer SDK initialization until\n // delegation is requested. Runtime declares the SDK as a required peer.\n const mod = await import('@tangle-network/sandbox').catch((err) => {\n process.stderr.write(\n `agent-runtime-mcp: failed to load @tangle-network/sandbox (${err.message}); install the peer dependency\\n`,\n )\n process.exit(2)\n })\n const SandboxCtor = (mod as { Sandbox?: new (config: unknown) => SandboxClient }).Sandbox\n if (!SandboxCtor) {\n process.stderr.write(\n 'agent-runtime-mcp: @tangle-network/sandbox does not export Sandbox; cannot construct client\\n',\n )\n process.exit(2)\n }\n // @tangle-network/sandbox ≥0.6 makes baseUrl required; default it so the MCP server\n // starts without forcing every caller to set SANDBOX_BASE_URL. Treat empty/whitespace as\n // unset (|| not ??) so `SANDBOX_BASE_URL=` still resolves to the default.\n const baseUrl = process.env.SANDBOX_BASE_URL?.trim() || DEFAULT_SANDBOX_BASE_URL\n return new SandboxCtor({ apiKey, baseUrl })\n}\n\nmain().catch((err) => {\n process.stderr.write(`agent-runtime-mcp: ${err instanceof Error ? err.stack : String(err)}\\n`)\n process.exit(1)\n})\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { $_ as McpToolAnnotations, $m as DelegationResultPayload, Af as ResolveSpawnResourcePathsResult, Am as runDetachedTurn, Bf as EventSubscription, Bm as SubmitOutput, Ch as FileDelegationStoreOptions, Cm as FleetHandle, Cv as RunLocalHarnessOptions, Dm as createSiblingSandboxExecutor, Em as createFleetWorkspaceExecutor, Ev as LocalHarness, F as CoordinationTools, Ff as environmentReader, Fm as DelegationResumeTick, G as SpawnRefusalCause, Gf as DelegateHandlerOptions, Gg as AwaitWakeInput, Gm as DelegateUiAuditArgs, Hf as McpEventRecord, Hm as DelegateCodeConfig, I as CoordinationToolsOptions, If as resolveSpawnResourcePaths, Im as DelegationRunContext, Jm as DelegationError, Kf as DelegateResult, Kg as CoordinationEvent, Km as DelegateUiAuditConfig, Lf as McpServer, Lm as DelegationTaskQueue, Mf as SpawnResourceBytes, Mm as DelegationRecord, Nf as SpawnResourceRead, Nm as DelegationResumeContext, Om as DetachedTurn, P as CoordinationStats, Pf as SpawnResourceReader, Pm as DelegationResumeDriver, Q_ as JsonRpcResponse, Qm as DelegationProgress, Rf as McpServerOptions, Rm as DelegationTaskQueueOptions, Sh as FileDelegationStore, Sm as DelegationExecutor, Th as CoderTask, Tm as SiblingSandboxExecutorOptions, Tv as LOCAL_HARNESSES, Uf as McpEventSource, Um as DelegateResearchArgs, Vf as EventSubscriptionStore, Vm as DelegateCodeArgs, Wf as DelegateError, Wg as GitRunner, Wm as DelegateResearchConfig, Xg as ManagerWake, Xm as DelegationHistoryArgs, Ym as DelegationFeedbackSnapshot, Z_ as JsonRpcMessage, Zm as DelegationHistoryEntry, _m as DelegateRunCtx, ah as UiAuditLensFilter, bh as DelegationPersistenceError, bm as UiAuditorDelegate, dy as createPropagatingTraceEmitter, eh as DelegationStatus, ev as McpToolDescriptor, fm as FeedbackEvent, fy as readTraceContextFromEnv, g_ as QuestionOption, gf as CheckRead, gm as CoderReviewer, h_ as QuestionLevel, hm as CoderReview, hv as AnalystRegistry, ih as ResearchOutputShape, jf as ResolvedSpawnResourcePath, jm as DelegationArgs, km as RunDetachedTurnOptions, mm as CoderDelegate, nh as FeedbackRating, oh as UiAuditorDelegationOutput, pm as FeedbackStore, q as WorkerSpawnContext, qf as createDelegateHandler, qm as DelegateUiAuditRoute, rh as FeedbackRefersTo, th as DelegationStatusResult, tv as McpTransport, u_ as Question, uy as TraceContext, vh as DelegationTraceSpan, vm as DetachedSessionDelegateOptions, wh as CoderOutput, wm as FleetWorkspaceExecutorOptions, wv as runLocalHarness, xh as DelegationStore, xm as detachedSessionDelegate, y_ as QuestionUrgency, yh as composeLoopTraceEmitters, ym as DetachedWinnerSelection, z as MakeWorkerAgent, zf as createMcpServer, zm as SubmitInput } from "../types-Jg274chm.js";
1
+ import { $f as DelegateHandlerOptions, $g as AwaitWakeInput, $m as DelegateUiAuditArgs, Ah as FileDelegationStore, Am as DelegationExecutor, Bf as SpawnResourceBytes, Bm as DelegationRecord, C_ as QuestionLevel, Cm as CoderReview, Cv as AnalystRegistry, D_ as QuestionUrgency, Dh as composeLoopTraceEmitters, Dm as DetachedWinnerSelection, Eh as DelegationTraceSpan, Em as DetachedSessionDelegateOptions, F as CoordinationTools, Fm as createSiblingSandboxExecutor, G as SpawnRefusalCause, Gf as McpServer, Gm as DelegationTaskQueue, Hf as SpawnResourceReader, Hm as DelegationResumeDriver, I as CoordinationToolsOptions, Im as DetachedTurn, Jf as EventSubscription, Jm as SubmitOutput, Kf as McpServerOptions, Km as DelegationTaskQueueOptions, Lm as RunDetachedTurnOptions, Mh as CoderOutput, Mm as FleetWorkspaceExecutorOptions, Mv as runLocalHarness, Nh as CoderTask, Nm as SiblingSandboxExecutorOptions, Nv as LOCAL_HARNESSES, Oh as DelegationPersistenceError, Om as UiAuditorDelegate, P as CoordinationStats, Pm as createFleetWorkspaceExecutor, Pv as LocalHarness, Qf as DelegateError, Qg as GitRunner, Qm as DelegateResearchConfig, Rf as ResolveSpawnResourcePathsResult, Rm as runDetachedTurn, Sm as CoderDelegate, Tm as DelegateRunCtx, Uf as environmentReader, Um as DelegationResumeTick, Vf as SpawnResourceRead, Vm as DelegationResumeContext, Wf as resolveSpawnResourcePaths, Wm as DelegationRunContext, Xf as McpEventRecord, Xm as DelegateCodeConfig, Yf as EventSubscriptionStore, Ym as DelegateCodeArgs, Zf as McpEventSource, Zm as DelegateResearchArgs, ah as DelegationHistoryEntry, av as JsonRpcMessage, bm as FeedbackEvent, by as readTraceContextFromEnv, ch as DelegationStatus, cv as McpToolDescriptor, dh as FeedbackRefersTo, e_ as CoordinationEvent, eh as DelegateUiAuditConfig, ep as DelegateResult, fh as ResearchOutputShape, i_ as ManagerWake, ih as DelegationHistoryArgs, jh as FileDelegationStoreOptions, jm as FleetHandle, jv as RunLocalHarnessOptions, kh as DelegationStore, km as detachedSessionDelegate, lh as DelegationStatusResult, lv as McpTransport, mh as UiAuditorDelegationOutput, nh as DelegationError, oh as DelegationProgress, ov as JsonRpcResponse, ph as UiAuditLensFilter, q as WorkerSpawnContext, qf as createMcpServer, qm as SubmitInput, rh as DelegationFeedbackSnapshot, sh as DelegationResultPayload, sv as McpToolAnnotations, th as DelegateUiAuditRoute, tp as createDelegateHandler, uh as FeedbackRating, v_ as Question, vy as TraceContext, w_ as QuestionOption, wf as CheckRead, wm as CoderReviewer, xm as FeedbackStore, yy as createPropagatingTraceEmitter, z as MakeWorkerAgent, zf as ResolvedSpawnResourcePath, zm as DelegationArgs } from "../types-C_qbnw9N.js";
2
2
  import { HarnessType } from "@tangle-network/agent-interface";
3
3
  /**
4
4
  *
package/dist/mcp/index.js CHANGED
@@ -1,12 +1,12 @@
1
- import { jn as readTraceContextFromEnv, kn as createPropagatingTraceEmitter, vt as environmentReader, yt as resolveSpawnResourcePaths } from "../supervisor-accounting-DxLQ_TQe.js";
2
- import { i as ConfigError, m as ValidationError } from "../errors-AzSuGI23.js";
3
- import { s as deleteBoxSafe, v as sleep, x as throwIfAborted } from "../util-C_cdPNC4.js";
4
- import { A as createSandboxForSpec, D as runAgentRounds, Ht as LOCAL_HARNESSES, O as assertBoxlessPromptOptions, Vt as runWorktreeHarness } from "../supervisor-gC-u_PRk.js";
5
- import { t as assertExecutableAgentProfile } from "../model-policy-JOcg3NRs.js";
6
- import { n as createStdioToolServer } from "../tool-server-Dg350Bgz.js";
7
- import { t as createCoordinationTools } from "../coordination-manager-DQZ2u6L-.js";
8
- import { h as runCoderChecks, pt as selectValidWinner } from "../runtime-C9F1PG2A.js";
9
- import { a as FileDelegationStore, i as DelegationTaskQueue, o as composeLoopTraceEmitters, r as createDelegateHandler, t as createMcpServer } from "../server-Dh3SQGQT.js";
1
+ import { In as readTraceContextFromEnv, Pn as createPropagatingTraceEmitter, St as resolveSpawnResourcePaths, xt as environmentReader } from "../supervisor-accounting-Ow6CChpB.js";
2
+ import { i as ConfigError, m as ValidationError } from "../errors-DG8yufqX.js";
3
+ import { s as deleteBoxSafe, v as sleep, x as throwIfAborted } from "../util-fcckrkKp.js";
4
+ import { A as createSandboxForSpec, D as runAgentRounds, Ft as LOCAL_HARNESSES, O as assertBoxlessPromptOptions, Pt as runWorktreeHarness } from "../supervisor-D-eT-6Tu.js";
5
+ import { t as assertExecutableAgentProfile } from "../model-policy-CZwhXp8O.js";
6
+ import { n as createStdioToolServer } from "../tool-server-DYwRbi0I.js";
7
+ import { t as createCoordinationTools } from "../coordination-manager-DAGPerJy.js";
8
+ import { h as runCoderChecks, mt as selectValidWinner } from "../runtime-CuwHe8_K.js";
9
+ import { a as DelegationTaskQueue, i as createDelegateHandler, o as FileDelegationStore, s as composeLoopTraceEmitters, t as createMcpServer } from "../server-BUpNUn5D.js";
10
10
  import { agentProfileSchema } from "@tangle-network/agent-interface";
11
11
  import { isRecord } from "@tangle-network/agent-core";
12
12
  import { randomUUID } from "node:crypto";
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env node
2
- import { m as ValidationError } from "../errors-AzSuGI23.js";
3
- import { n as createStdioToolServer } from "../tool-server-Dg350Bgz.js";
2
+ import { m as ValidationError } from "../errors-DG8yufqX.js";
3
+ import { n as createStdioToolServer } from "../tool-server-DYwRbi0I.js";
4
4
  import { appendFileSync, mkdirSync, readFileSync } from "node:fs";
5
5
  import { dirname } from "node:path";
6
6
  // src/mcp/memory-server.ts
@@ -1,4 +1,4 @@
1
- import { i as ConfigError, m as ValidationError } from "./errors-AzSuGI23.js";
1
+ import { i as ConfigError, m as ValidationError } from "./errors-DG8yufqX.js";
2
2
  import { harnessTypeSchema } from "@tangle-network/agent-interface";
3
3
  import { HARNESS_NATIVE_MODEL } from "@tangle-network/agent-eval";
4
4
  // src/runtime/harness-role.ts
@@ -81,7 +81,7 @@ function modelIdentityParts(model) {
81
81
  function equivalentModelBase(observed, declared) {
82
82
  const observedPath = modelBaseParts(observed);
83
83
  const declaredPath = modelBaseParts(declared);
84
- if (!samePath(observedPath.path, declaredPath.path)) return false;
84
+ if (!samePath(observedPath.path, declaredPath.path)) return servesClaudeAlias(observed, declared);
85
85
  if (observedPath.provider === void 0 || declaredPath.provider === void 0 || sameProvider(observedPath.provider, declaredPath.provider)) return true;
86
86
  if (observedPath.provider === "tangle-router" || declaredPath.provider === "tangle-router") {
87
87
  const router = observedPath.provider === "tangle-router" ? observedPath : declaredPath;
@@ -91,6 +91,11 @@ function equivalentModelBase(observed, declared) {
91
91
  }
92
92
  return false;
93
93
  }
94
+ function servesClaudeAlias(observed, declared) {
95
+ const route = "^(?:claude-code/)?(?:anthropic/)?";
96
+ const alias = new RegExp(`${route}(opus|sonnet|haiku)$`, "u").exec(declared)?.[1];
97
+ return alias !== void 0 && new RegExp(`${route}claude-${alias}-[\\w.-]+$`, "u").test(observed);
98
+ }
94
99
  /**
95
100
  * Compare provider slugs across catalogs that spell one vendor with or without hyphens,
96
101
  * such as `zai` and OpenRouter's `z-ai`. Any other provider difference is a substitution.
@@ -327,16 +332,16 @@ function profileBridgeWireModel(profile) {
327
332
  * Refuse an incomplete execution identity before any backend may fill it from ambient config.
328
333
  * `AgentProfile` is the sole behavioral authority: harness, provider, and concrete model all
329
334
  * participate in its digest. Eval's runtime-selected marker is a matrix-planning value, never an
330
- * executable model.
335
+ * executable model. Every missing field is named in ONE refusal, so a caller that cannot see
336
+ * the contract learns it in one round trip, not one per field (#1329).
331
337
  */
332
338
  function assertExecutableAgentProfile(profile, context) {
333
- if (profile.harness === void 0) throw new ConfigError(`${context}: AgentProfile.harness must be explicit before execution`);
339
+ const failures = [];
340
+ if (profile.harness === void 0) failures.push("AgentProfile.harness must be explicit before execution");
334
341
  const declared = profile.model?.default;
335
- if (!concreteModelId(declared)) {
336
- const reason = isHarnessNativeModel(declared) ? "runtime-selected" : "missing";
337
- throw new ConfigError(`${context}: AgentProfile.model.default is ${reason}; execution requires a concrete model`);
338
- }
339
- if (!profile.model?.provider?.trim()) throw new ConfigError(`${context}: AgentProfile.model.provider must be explicit before execution`);
342
+ if (!concreteModelId(declared)) failures.push(`AgentProfile.model.default is ${isHarnessNativeModel(declared) ? "runtime-selected" : "missing"}; execution requires a concrete model`);
343
+ if (!profile.model?.provider?.trim()) failures.push("AgentProfile.model.provider must be explicit before execution");
344
+ if (failures.length > 0) throw new ConfigError(`${context}: the profile cannot run yet: ${failures.join("; ")}`);
340
345
  }
341
346
  const PROFILE_MODEL_METADATA_KEYS = /* @__PURE__ */ new Set([
342
347
  "codeMode",
@@ -526,4 +531,4 @@ function assertProfileModelsAllowed(profile, allowed) {
526
531
  }
527
532
  export { agentHarness as _, concreteProfileModel as a, profileModelExecutionSettings as c, assertRouterAutoDeclaration as d, assertRouterAutoResponse as f, observedModelMatchesDeclared as g, observedModelHasSnapshot as h, concreteModelId as i, profileProviderModel as l, mergeObservedModelIdentity as m, assertModelAllowed as n, enforceTokenLimits as o, canonicalObservedModelParts as p, assertProfileModelsAllowed as r, profileBridgeWireModel as s, assertExecutableAgentProfile as t, resolveRouterRetryPolicy as u, harnessRunsAgent as v };
528
533
 
529
- //# sourceMappingURL=model-policy-JOcg3NRs.js.map
534
+ //# sourceMappingURL=model-policy-CZwhXp8O.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"model-policy-CZwhXp8O.js","names":["positiveInteger"],"sources":["../src/runtime/harness-role.ts","../src/runtime/model-identity.ts","../src/runtime/router-auto-evidence.ts","../src/runtime/router-retry-policy.ts","../src/runtime/supervise/model-policy.ts"],"sourcesContent":["/**\n * Which `HarnessType` values name a real coding-agent runtime, and which name a MODE that has no\n * agent behind it.\n *\n * `cli-base` is the router-backed mode — a plain multi-turn router call with no coding-agent\n * harness (`@tangle-network/agent-interface`'s `HarnessType` doc, and the same table's\n * `harnessReasoningCeiling['cli-base'] = 'none'` commented \"cli-base has no agent\"). The\n * distinction is REAL; what was accidental is that three call sites each spelled the test\n * themselves, so a second no-agent mode would have to be remembered in three places.\n *\n * SHOULD UPSTREAM: this belongs next to `harnessHonorsEffort` in agent-interface's\n * `harness-capabilities.ts`, which already encodes the fact but exports no predicate for it.\n * Until it does, this is the one local copy — extend the set here, never re-test the name.\n */\n\nimport type { HarnessType } from '@tangle-network/agent-interface'\n\n/**\n * Harness ids that select a router/no-agent mode rather than a coding-agent runtime.\n *\n * `nanoclaw` is deliberately ABSENT: the shared capability table clamps its reasoning ceiling the\n * same way it clamps `cli-base`, but nanoclaw does run an agent (a socket-bridge runner to the\n * NanoClaw daemon) and every caller here treats it as a full harness. Add a row only with the\n * behavior change stated, never to make the two clamps look symmetric.\n */\nconst NO_AGENT_HARNESSES: ReadonlySet<string> = new Set<string>(['cli-base' satisfies HarnessType])\n\n/** Whether this profile harness selects a real coding-agent runtime (vs. the router/no-agent mode\n * or no preference at all). Accepts the looser `string` some local profile shapes declare, and\n * preserves the caller's own harness type when it is narrower. */\nexport function harnessRunsAgent<T extends string>(harness: T | null | undefined): harness is T {\n return harness != null && !NO_AGENT_HARNESSES.has(harness)\n}\n\n/** The coding-agent harness this profile selects, or `undefined` when it selects none — the shape\n * callers want when a no-agent mode must fall through to the router arm. */\nexport function agentHarness<T extends string>(harness: T | null | undefined): T | undefined {\n return harnessRunsAgent(harness) ? harness : undefined\n}\n","import { harnessTypeSchema } from '@tangle-network/agent-interface'\n\nconst SNAPSHOT_TOKEN = /^[A-Za-z0-9._-]+$/u\nconst datedIsoSuffix = /^(.*)-(\\d{4})-(\\d{2})-(\\d{2})$/u\nconst datedCompactSuffix = /^(.*)-(\\d{4})(\\d{2})(\\d{2})$/u\nconst datedMonthSuffix = /^(.*)-(\\d{4})-(\\d{2})$/u\n\ntype SnapshotKind = 'date' | 'opaque'\n\ninterface ModelIdentityParts {\n readonly base: string\n readonly snapshot?: string\n readonly snapshotKind?: SnapshotKind\n}\n\ninterface CanonicalObservedModelParts {\n readonly base: string\n readonly snapshot?: string\n readonly snapshotKind?: SnapshotKind\n readonly canonical: string\n}\n\n/** Match equivalent bare and provider-qualified spellings without discarding observed identity. */\nexport function observedModelMatchesDeclared(observed: string, declared: string): boolean {\n const observedIdentity = modelIdentityParts(observed)\n const declaredIdentity = modelIdentityParts(declared)\n if (!observedIdentity || !declaredIdentity) return false\n if (\n declaredIdentity.snapshot !== undefined &&\n (observedIdentity.snapshot !== declaredIdentity.snapshot ||\n observedIdentity.snapshotKind !== declaredIdentity.snapshotKind)\n ) {\n return false\n }\n return equivalentModelBase(observedIdentity.base, declaredIdentity.base)\n}\n\n/** Merge two observations of one served model while retaining a snapshot-bearing raw identity. */\nexport function mergeObservedModelIdentity(current: string, next: string): string | undefined {\n const currentIdentity = modelIdentityParts(current)\n const nextIdentity = modelIdentityParts(next)\n if (!currentIdentity || !nextIdentity) return undefined\n if (!equivalentModelBase(currentIdentity.base, nextIdentity.base)) return undefined\n if (\n currentIdentity.snapshot !== undefined &&\n nextIdentity.snapshot !== undefined &&\n (currentIdentity.snapshot !== nextIdentity.snapshot ||\n currentIdentity.snapshotKind !== nextIdentity.snapshotKind)\n ) {\n return undefined\n }\n return currentIdentity.snapshot === undefined && nextIdentity.snapshot !== undefined\n ? next\n : current\n}\n\n/** Return the canonical model and its validated snapshot kind for runtime evidence reduction. */\nexport function canonicalObservedModelParts(\n model: string,\n): CanonicalObservedModelParts | undefined {\n const identity = modelIdentityParts(model)\n if (!identity) return undefined\n const base = identity.base.slice(identity.base.lastIndexOf('/') + 1)\n const canonical =\n identity.snapshot === undefined\n ? base\n : identity.snapshotKind === 'date'\n ? `${base}-${identity.snapshot}`\n : `${base}@${identity.snapshot}`\n return {\n base,\n ...(identity.snapshot !== undefined ? { snapshot: identity.snapshot } : {}),\n ...(identity.snapshotKind !== undefined ? { snapshotKind: identity.snapshotKind } : {}),\n canonical,\n }\n}\n\n/** Return whether an observed identity includes a provider snapshot. */\nexport function observedModelHasSnapshot(model: string): boolean {\n return modelIdentityParts(model)?.snapshot !== undefined\n}\n\nfunction modelIdentityParts(model: string): ModelIdentityParts | null {\n if (model.length === 0) return null\n const at = model.lastIndexOf('@')\n if (at < 0) {\n const dated = datedModelIdentity(model)\n if (dated !== undefined) return dated\n return modelLeaf(model).length === 0 ? null : { base: model }\n }\n const base = model.slice(0, at)\n const snapshot = model.slice(at + 1)\n if (base.length === 0 || modelLeaf(base).length === 0 || !SNAPSHOT_TOKEN.test(snapshot)) {\n return null\n }\n return { base, snapshot, snapshotKind: 'opaque' }\n}\n\nfunction equivalentModelBase(observed: string, declared: string): boolean {\n const observedPath = modelBaseParts(observed)\n const declaredPath = modelBaseParts(declared)\n if (!samePath(observedPath.path, declaredPath.path)) return servesClaudeAlias(observed, declared)\n\n // A bare id omits provider routing. It can match an explicitly qualified spelling\n // only when the model path is otherwise identical.\n if (\n observedPath.provider === undefined ||\n declaredPath.provider === undefined ||\n sameProvider(observedPath.provider, declaredPath.provider)\n ) {\n return true\n }\n\n // Tangle Router may report the upstream provider's qualified spelling. Preserve this\n // one documented alias without allowing arbitrary provider-to-provider substitutions.\n if (observedPath.provider === 'tangle-router' || declaredPath.provider === 'tangle-router') {\n const router = observedPath.provider === 'tangle-router' ? observedPath : declaredPath\n const upstream = observedPath.provider === 'tangle-router' ? declaredPath : observedPath\n if (upstream.provider === undefined) return false\n return (\n samePath(router.path, upstream.path) ||\n (router.path[0] === upstream.provider && samePath(router.path.slice(1), upstream.path))\n )\n }\n\n return false\n}\n\n// Claude Code serves a family alias (`anthropic/opus`) as its current model (`claude-opus-5-5`).\nfunction servesClaudeAlias(observed: string, declared: string): boolean {\n const route = '^(?:claude-code/)?(?:anthropic/)?'\n const alias = new RegExp(`${route}(opus|sonnet|haiku)$`, 'u').exec(declared)?.[1]\n return alias !== undefined && new RegExp(`${route}claude-${alias}-[\\\\w.-]+$`, 'u').test(observed)\n}\n\n/**\n * Compare provider slugs across catalogs that spell one vendor with or without hyphens,\n * such as `zai` and OpenRouter's `z-ai`. Any other provider difference is a substitution.\n */\nfunction sameProvider(left: string, right: string): boolean {\n return left.replaceAll('-', '') === right.replaceAll('-', '')\n}\n\ninterface ModelBaseParts {\n readonly provider: string | undefined\n readonly path: ReadonlyArray<string>\n}\n\nfunction modelBaseParts(model: string): ModelBaseParts {\n const segments = model.split('/')\n const normalized =\n segments.length > 1 && isHarnessPrefix(segments[0]) ? segments.slice(1) : segments\n if (normalized.length === 1) return { provider: undefined, path: normalized }\n return { provider: normalized[0], path: normalized.slice(1) }\n}\n\nfunction isHarnessPrefix(segment: string | undefined): boolean {\n return segment !== undefined && harnessTypeSchema.safeParse(segment).success\n}\n\nfunction samePath(left: ReadonlyArray<string>, right: ReadonlyArray<string>): boolean {\n return left.length === right.length && left.every((segment, index) => segment === right[index])\n}\n\nfunction modelLeaf(model: string): string {\n return model.slice(model.lastIndexOf('/') + 1)\n}\n\n/**\n * Parse the provider's documented dated snapshot forms.\n *\n * `undefined` means that the model has no dated shape and must be treated as a normal base.\n * `null` means that it has a dated shape but the date is invalid, so identity matching fails.\n */\nfunction datedModelIdentity(model: string): ModelIdentityParts | null | undefined {\n const iso = datedIsoSuffix.exec(model)\n if (iso) {\n const [, base, yearText, monthText, dayText] = iso\n return buildDatedIdentity(\n base,\n `${yearText}-${monthText}-${dayText}`,\n isValidCalendarDate(yearText, monthText, dayText),\n )\n }\n\n const compact = datedCompactSuffix.exec(model)\n if (compact) {\n const [, base, yearText, monthText, dayText] = compact\n return buildDatedIdentity(\n base,\n `${yearText}-${monthText}-${dayText}`,\n isValidCalendarDate(yearText, monthText, dayText),\n )\n }\n\n const month = datedMonthSuffix.exec(model)\n if (month) {\n const [, base, yearText, monthText] = month\n return buildDatedIdentity(\n base,\n `${yearText}-${monthText}`,\n isValidCalendarMonth(yearText, monthText),\n )\n }\n\n return undefined\n}\n\nfunction buildDatedIdentity(\n base: string | undefined,\n snapshot: string,\n valid: boolean,\n): ModelIdentityParts | null | undefined {\n // A date that is the entire model segment is not a snapshot suffix.\n if (base === undefined || base.length === 0 || base.endsWith('/')) return undefined\n return valid ? { base, snapshot, snapshotKind: 'date' } : null\n}\n\nfunction isValidCalendarDate(\n yearText: string | undefined,\n monthText: string | undefined,\n dayText: string | undefined,\n): boolean {\n if (yearText === undefined || monthText === undefined || dayText === undefined) return false\n const year = Number(yearText)\n const month = Number(monthText)\n const day = Number(dayText)\n if (year < 2000 || year > 2099 || month < 1 || month > 12 || day < 1 || day > 31) {\n return false\n }\n const date = new Date(Date.UTC(year, month - 1, day))\n return (\n date.getUTCFullYear() === year && date.getUTCMonth() === month - 1 && date.getUTCDate() === day\n )\n}\n\nfunction isValidCalendarMonth(\n yearText: string | undefined,\n monthText: string | undefined,\n): boolean {\n if (yearText === undefined || monthText === undefined) return false\n const year = Number(yearText)\n const month = Number(monthText)\n return year >= 2000 && year <= 2099 && month >= 1 && month <= 12\n}\n","import { ValidationError } from '../errors'\nimport { observedModelMatchesDeclared } from './model-identity'\n\nfunction object(value: unknown): Record<string, unknown> {\n if (value === null || typeof value !== 'object' || Array.isArray(value)) {\n throw new ValidationError('Router Auto requires an inline policy and routing receipt')\n }\n return value as Record<string, unknown>\n}\n\n/** Router owns policy parsing. Runtime requires visible model authority before dispatch. */\nexport function assertRouterAutoDeclaration(value: unknown, stream: boolean | undefined): void {\n const policy = object(value)\n if (stream === true) throw new ValidationError('Router Auto requires buffered transport')\n if (\n policy.version !== 1 ||\n typeof policy.id !== 'string' ||\n typeof policy.revision !== 'string' ||\n !Array.isArray(policy.strategies) ||\n policy.strategies.length === 0\n ) {\n throw new ValidationError(\n 'Router Auto requires a versioned inline policy with concrete strategies',\n )\n }\n for (const raw of policy.strategies) {\n const strategy = object(raw)\n if (\n typeof strategy.id !== 'string' ||\n typeof strategy.model !== 'string' ||\n strategy.model === 'tangle/auto' ||\n strategy.model.length === 0\n ) {\n throw new ValidationError('Router Auto strategy model authority is missing')\n }\n }\n for (const phase of ['selector', 'review']) {\n if (policy[phase] !== undefined && typeof object(policy[phase]).model !== 'string') {\n throw new ValidationError('Router Auto assessment model authority is missing')\n }\n }\n}\n\n/** An alias does not waive identity checks. Every reported child must match its declared phase. */\nexport function assertRouterAutoResponse(\n policyValue: unknown,\n response: unknown,\n served: string | undefined,\n): void {\n const policy = object(policyValue)\n const receipt = object(object(response).tangle_auto)\n const decision = object(receipt.decision)\n const strategies = policy.strategies as unknown[]\n const selected = strategies.map(object).find((strategy) => strategy.id === decision.strategyId)\n if (\n decision.requestedModel !== 'tangle/auto' ||\n decision.policyId !== policy.id ||\n decision.policyRevision !== policy.revision ||\n typeof decision.policyDigest !== 'string' ||\n !selected ||\n decision.selectedModel !== selected.model ||\n served === undefined ||\n !observedModelMatchesDeclared(served, String(selected.model))\n ) {\n throw new ValidationError(\n 'Router Auto response does not match AgentProfile policy/model authority',\n )\n }\n if (!Array.isArray(receipt.calls) || receipt.calls.length === 0) {\n throw new ValidationError('Router Auto response is missing physical call receipts')\n }\n for (const raw of receipt.calls) {\n const call = object(raw)\n const declared =\n call.phase === 'selector'\n ? object(policy.selector).model\n : call.phase === 'review'\n ? object(policy.review).model\n : call.phase === 'initial' || call.phase === 'escalation'\n ? strategies.map(object).map((strategy) => strategy.model)\n : []\n const allowed = Array.isArray(declared) ? declared : [declared]\n if (\n typeof call.model !== 'string' ||\n !allowed.some(\n (model) =>\n typeof model === 'string' && observedModelMatchesDeclared(call.model as string, model),\n )\n )\n throw new ValidationError('Router Auto physical call exceeds AgentProfile model authority')\n }\n}\n\n/** The concrete authority declared by an inline Auto policy, including paid assessments. */\nexport function routerAutoDeclaredModels(value: unknown): readonly string[] {\n assertRouterAutoDeclaration(value, undefined)\n const policy = object(value)\n const models = (policy.strategies as unknown[]).map((raw) => String(object(raw).model))\n for (const phase of ['selector', 'review']) {\n if (policy[phase] !== undefined) models.push(String(object(policy[phase]).model))\n }\n return [...new Set(models)]\n}\n","import { ValidationError } from '../errors'\n\n/** Exact retry controls accepted at `AgentProfile.model.metadata.retry`. */\nexport interface RouterRetryPolicy {\n /** Total attempts, including the first request. */\n readonly maxAttempts?: number\n /** Delay before the second attempt. Later delays grow exponentially. */\n readonly initialBackoffMs?: number\n /** Maximum delay between attempts. */\n readonly maxBackoffMs?: number\n /** Symmetric random variation around each delay, from 0 through 1. */\n readonly jitter?: number\n /** HTTP statuses that may be retried. */\n readonly retryStatuses?: ReadonlyArray<number>\n /** Deadline for receiving one attempt's response headers. Zero disables it. */\n readonly requestTimeoutMs?: number\n}\n\nexport interface ResolvedRouterRetryPolicy {\n readonly maxAttempts: number\n readonly initialBackoffMs: number\n readonly maxBackoffMs: number\n readonly jitter: number\n readonly retryStatuses: ReadonlyArray<number>\n readonly requestTimeoutMs: number\n}\n\nconst maximumTimerMs = 2_147_483_647\nconst defaultRetryStatuses = Object.freeze([408, 425, 429, 500, 502, 503, 504, 520, 522, 524])\nconst retryPolicyKeys = new Set([\n 'initialBackoffMs',\n 'jitter',\n 'maxAttempts',\n 'maxBackoffMs',\n 'requestTimeoutMs',\n 'retryStatuses',\n])\n\n/** Parse untrusted profile/config data once and return an immutable complete policy. */\nexport function resolveRouterRetryPolicy(\n input: unknown,\n context: string,\n): ResolvedRouterRetryPolicy {\n if (\n input !== undefined &&\n (typeof input !== 'object' || input === null || Array.isArray(input))\n ) {\n throw new ValidationError(`${context} must be an object`)\n }\n const policy = input === undefined ? {} : Object.fromEntries(Object.entries(input))\n const unknown = Object.keys(policy).filter((key) => !retryPolicyKeys.has(key))\n if (unknown.length > 0) {\n throw new ValidationError(`${context} has unsupported fields: ${unknown.join(', ')}`)\n }\n const maxAttempts = positiveInteger(policy.maxAttempts, 5, `${context}.maxAttempts`)\n const initialBackoffMs = timerInteger(\n policy.initialBackoffMs,\n 1_000,\n `${context}.initialBackoffMs`,\n )\n const maxBackoffMs = timerInteger(policy.maxBackoffMs, 30_000, `${context}.maxBackoffMs`)\n const requestTimeoutMs = timerInteger(\n policy.requestTimeoutMs,\n 0,\n `${context}.requestTimeoutMs`,\n Number.MAX_SAFE_INTEGER - Date.now(),\n )\n const jitter = policy.jitter ?? 0.25\n if (typeof jitter !== 'number' || !Number.isFinite(jitter) || jitter < 0 || jitter > 1) {\n throw new ValidationError(`${context}.jitter must be a finite number from 0 through 1`)\n }\n const retryStatuses = parseRetryStatuses(policy.retryStatuses, context)\n return Object.freeze({\n maxAttempts,\n initialBackoffMs,\n maxBackoffMs,\n jitter,\n retryStatuses,\n requestTimeoutMs,\n })\n}\n\nfunction parseRetryStatuses(value: unknown, context: string): ReadonlyArray<number> {\n if (value === undefined) return defaultRetryStatuses\n if (!Array.isArray(value)) {\n throw new ValidationError(`${context}.retryStatuses must be an array of HTTP statuses`)\n }\n const statuses: number[] = []\n const seen = new Set<number>()\n for (const status of value) {\n if (!Number.isSafeInteger(status) || status < 100 || status > 599) {\n throw new ValidationError(\n `${context}.retryStatuses must contain integer HTTP statuses from 100 through 599`,\n )\n }\n if (seen.has(status)) {\n throw new ValidationError(`${context}.retryStatuses must not contain duplicates`)\n }\n seen.add(status)\n statuses.push(status)\n }\n return Object.freeze(statuses)\n}\n\nfunction positiveInteger(value: unknown, fallback: number, context: string): number {\n const parsed = value ?? fallback\n if (typeof parsed !== 'number' || !Number.isSafeInteger(parsed) || parsed < 1) {\n throw new ValidationError(`${context} must be a positive safe integer`)\n }\n return parsed\n}\n\nfunction timerInteger(\n value: unknown,\n fallback: number,\n context: string,\n maximum = maximumTimerMs,\n): number {\n const parsed = value ?? fallback\n if (\n typeof parsed !== 'number' ||\n !Number.isSafeInteger(parsed) ||\n parsed < 0 ||\n parsed > maximum\n ) {\n throw new ValidationError(\n `${context} must be a nonnegative safe integer no greater than ${maximum}`,\n )\n }\n return parsed\n}\n","/**\n * `assertModelAllowed` — a fail-loud guard that restricts a run to a chosen subset of\n * models. The two front doors (`supervise()` / `improve()`) call it once per configured\n * model at resolve time, so a run that names a model outside the allowed set throws before\n * any compute is spent — never silently swapped or silently allowed.\n */\nimport { HARNESS_NATIVE_MODEL } from '@tangle-network/agent-eval'\nimport type { AgentProfile } from '@tangle-network/agent-interface'\nimport { ConfigError } from '../../errors'\nimport { agentHarness } from '../harness-role'\nimport { routerAutoDeclaredModels } from '../router-auto-evidence'\nimport { type ResolvedRouterRetryPolicy, resolveRouterRetryPolicy } from '../router-retry-policy'\n\n/**\n * Return the model id an executor may send to a provider.\n *\n * Eval stamps {@link HARNESS_NATIVE_MODEL} into a profile when model selection is deliberately\n * delegated to the configured runtime. That marker belongs in experiment identity and cost\n * admission; it is not a provider model id.\n */\nexport function concreteModelId(model: string | undefined): string | undefined {\n if (model === undefined) return undefined\n const id = model.trim()\n return id.length > 0 && !isHarnessNativeModel(id) ? id : undefined\n}\n\n/** Whether a model value delegates selection to the chosen execution system. */\nfunction isHarnessNativeModel(model: string | undefined): boolean {\n return model?.trim() === HARNESS_NATIVE_MODEL\n}\n\n/** Return a profile's explicitly selected provider model, if it has one. */\nexport function concreteProfileModel(profile: Pick<AgentProfile, 'model'>): string | undefined {\n return concreteModelId(profile.model?.default)\n}\n\n/**\n * Return the model id for a direct provider request.\n *\n * A portable profile can qualify its model with the selected provider. The direct endpoint already\n * selects that provider, so remove only the exact matching prefix. Preserve every other prefix\n * because it can identify a provider-owned nested route, such as `anthropic/claude-sonnet`.\n */\nexport function profileProviderModel(profile: Pick<AgentProfile, 'model'>): string | undefined {\n const model = concreteProfileModel(profile)\n const provider = profile.model?.provider?.trim()\n if (!model || !provider || !model.startsWith(`${provider}/`)) return model\n return concreteModelId(model.slice(provider.length + 1))\n}\n\n/** The full cli-bridge wire id declared by a profile: harness/provider/model. */\nexport function profileBridgeWireModel(\n profile: Pick<AgentProfile, 'harness' | 'model'>,\n): string | undefined {\n const model = concreteProfileModel(profile)\n const provider = profile.model?.provider\n const harness = agentHarness(profile.harness)\n const modelWithoutHarness =\n model && harness && model.startsWith(`${harness}/`) ? model.slice(harness.length + 1) : model\n const providerModel = modelWithoutHarness\n ? provider && !modelWithoutHarness.startsWith(`${provider}/`)\n ? `${provider}/${modelWithoutHarness}`\n : modelWithoutHarness\n : undefined\n if (!harness) return providerModel\n if (!providerModel) return harness\n // Always add the harness segment: a provider may share the harness's name. opencode's own keyless\n // provider is `opencode`, so `opencode/glm-5.3-flash-free` is a provider/model pair; reading it as\n // already harness-prefixed sent `opencode/glm-5.3-flash-free`, cli-bridge removed the harness, and\n // opencode received the bare model and could not resolve it (\"Model not found\").\n return `${harness}/${providerModel}`\n}\n\n/**\n * Refuse an incomplete execution identity before any backend may fill it from ambient config.\n * `AgentProfile` is the sole behavioral authority: harness, provider, and concrete model all\n * participate in its digest. Eval's runtime-selected marker is a matrix-planning value, never an\n * executable model. Every missing field is named in ONE refusal, so a caller that cannot see\n * the contract learns it in one round trip, not one per field (#1329).\n */\nexport function assertExecutableAgentProfile(profile: AgentProfile, context: string): void {\n const failures: string[] = []\n if (profile.harness === undefined) {\n failures.push('AgentProfile.harness must be explicit before execution')\n }\n const declared = profile.model?.default\n if (!concreteModelId(declared)) {\n failures.push(\n `AgentProfile.model.default is ${isHarnessNativeModel(declared) ? 'runtime-selected' : 'missing'}; execution requires a concrete model`,\n )\n }\n if (!profile.model?.provider?.trim()) {\n failures.push('AgentProfile.model.provider must be explicit before execution')\n }\n if (failures.length > 0) {\n throw new ConfigError(`${context}: the profile cannot run yet: ${failures.join('; ')}`)\n }\n}\n\n/**\n * Separate completion ceilings an exact profile may request.\n *\n * They are distinct because providers do not share one meaning for a single number: measured\n * through the Tangle Router, `glm-5.2` accepted `max_tokens: 8` and still billed 135\n * completion tokens — 132 reasoning, 3 visible — while `max_completion_tokens: 256` bounded the\n * total. A path that cannot enforce a requested ceiling refuses the run instead of sending a\n * number that means something else there.\n */\nexport interface ProfileTokenLimits {\n /** Visible answer tokens, from `AgentProfile.model.maxVisibleOutputTokens`. */\n readonly visible?: number\n /** Hidden reasoning tokens, from `AgentProfile.model.maxReasoningTokens`. */\n readonly reasoning?: number\n /** Visible and reasoning tokens together, from `AgentProfile.model.maxTotalOutputTokens`. */\n readonly total?: number\n}\n\n/** The ceilings one execution path actually sends, in the request fields it sends them as. */\nexport interface AppliedTokenLimits {\n /** Sent as `max_tokens`. */\n readonly maxTokens?: number\n /** Sent as `max_completion_tokens`. */\n readonly maxCompletionTokens?: number\n}\n\n/** What a path was asked to enforce and what it sent, for the execution receipt. */\nexport interface TokenLimitDecision {\n readonly requested: ProfileTokenLimits\n readonly applied: AppliedTokenLimits\n}\n\n/** The execution paths that lower a profile into a provider request. */\ntype ModelExecutionPath = 'router' | 'bridge' | 'sandbox' | 'provider'\n\n/** Generation and loop controls that may affect one model execution. */\nexport interface ProfileModelExecutionSettings {\n readonly temperature?: number\n /** Completion ceilings the profile requested. Empty when it requested none. */\n readonly tokenLimits: ProfileTokenLimits\n readonly retry?: ResolvedRouterRetryPolicy\n readonly seed?: number\n readonly toolChoice?: 'auto' | 'required' | 'none'\n readonly extraBody?: Readonly<Record<string, unknown>>\n /** Zero means no turn-count cap; conserved budgets and deadlines still apply. */\n readonly maxTurns?: number\n /**\n * Take each Router completion over SSE, with or without tools. The Router's request deadline ends\n * when response headers are committed, so a long thinking-model answer needs a stream to finish.\n * Requires the HTTP transport; an injected buffered `complete` transport is refused.\n */\n readonly stream?: boolean\n /**\n * This node's action space is CODE, not JSON tool calls (router-tools backend\n * only): the model is shown `tool_search` + `codemode` instead of the raw tool\n * set, and composes the granted handlers as one QuickJS program. `true` takes\n * host settings or engine defaults; an object can tighten host ceilings and\n * add direct-only tools. `false` selects ordinary tools for this node. Host\n * state and direct-only restrictions survive every enabled profile declaration.\n */\n readonly codeMode?: boolean | ProfileCodeModeSettings\n}\n\n/** The per-node code-mode controls a profile may pin — the seam's subset, minus\n * host-only (wasm/workerUrl) and executor-owned (store) options. */\nexport interface ProfileCodeModeSettings {\n /** Includes time in tools; at most 2,147,483,647 ms. */\n readonly timeoutMs?: number\n readonly memoryLimitBytes?: number\n /** Excess calls queue; Promise.all does not fail simply because the queue is full. */\n readonly concurrency?: number\n /** Bounds total admitted calls, including queued calls. */\n readonly maxCalls?: number\n /** These capabilities keep their direct model tools and are not callable from code. */\n readonly directTools?: ReadonlyArray<string>\n}\n\nconst PROFILE_MODEL_METADATA_KEYS = new Set([\n 'codeMode',\n 'extraBody',\n 'maxTurns',\n 'retry',\n 'seed',\n 'stream',\n 'temperature',\n 'toolChoice',\n])\n\n/**\n * Read execution controls from the exact profile and reject unknown controls.\n * Credential intent reaches environment providers unchanged; other paths cannot enforce it.\n * Backends receive endpoint/auth and executable ports only; they cannot silently alter behavior.\n */\nexport function profileModelExecutionSettings(\n profile: Pick<AgentProfile, 'model'>,\n context: string,\n path: ModelExecutionPath = 'router',\n): ProfileModelExecutionSettings {\n const metadata = profile.model?.metadata ?? {}\n if (metadata.maxTokens !== undefined) {\n throw new ConfigError(\n `${context}: AgentProfile.model.metadata.maxTokens is ambiguous across providers; declare AgentProfile.model.maxVisibleOutputTokens, maxReasoningTokens, or maxTotalOutputTokens instead`,\n )\n }\n const unknown = Object.keys(metadata).filter(\n (key) =>\n !PROFILE_MODEL_METADATA_KEYS.has(key) && !(path === 'provider' && key === 'credentialSource'),\n )\n if (unknown.length > 0) {\n throw new ConfigError(\n `${context}: unsupported AgentProfile.model.metadata fields: ${unknown.join(', ')}`,\n )\n }\n // The credential vocabulary is router | api-key | subscription (agent-sdk #440); `managed` is\n // the deprecated spelling of `router` and stays readable so authored profiles keep parsing.\n if (\n metadata.credentialSource !== undefined &&\n metadata.credentialSource !== 'router' &&\n metadata.credentialSource !== 'api-key' &&\n metadata.credentialSource !== 'subscription' &&\n metadata.credentialSource !== 'managed'\n ) {\n throw new ConfigError(\n `${context}: AgentProfile.model.metadata.credentialSource must be router, api-key, subscription, or the deprecated managed`,\n )\n }\n const temperature = finiteNumber(metadata.temperature, `${context}: temperature`)\n const tokenLimits = profileTokenLimits(profile, context)\n const retryInput = metadata.retry\n const retry =\n retryInput === undefined\n ? undefined\n : resolveRouterRetryPolicy(retryInput, `${context}: AgentProfile.model.metadata.retry`)\n const seed = safeInteger(metadata.seed, `${context}: seed`)\n const maxTurns = nonnegativeInteger(metadata.maxTurns, `${context}: maxTurns`)\n const stream = optionalBoolean(metadata.stream, `${context}: stream`)\n const toolChoice = metadata.toolChoice\n if (\n toolChoice !== undefined &&\n toolChoice !== 'auto' &&\n toolChoice !== 'required' &&\n toolChoice !== 'none'\n ) {\n throw new ConfigError(`${context}: toolChoice must be auto, required, or none`)\n }\n const extraBody = metadata.extraBody\n if (\n extraBody !== undefined &&\n (typeof extraBody !== 'object' || extraBody === null || Array.isArray(extraBody))\n ) {\n throw new ConfigError(`${context}: extraBody must be an object`)\n }\n const codeMode = profileCodeModeSettings(metadata.codeMode, context)\n return {\n ...(temperature !== undefined ? { temperature } : {}),\n tokenLimits,\n ...(retry !== undefined ? { retry } : {}),\n ...(seed !== undefined ? { seed } : {}),\n ...(toolChoice !== undefined ? { toolChoice } : {}),\n ...(extraBody !== undefined\n ? { extraBody: Object.freeze({ ...(extraBody as Record<string, unknown>) }) }\n : {}),\n ...(maxTurns !== undefined ? { maxTurns } : {}),\n ...(stream !== undefined ? { stream } : {}),\n ...(codeMode !== undefined ? { codeMode } : {}),\n }\n}\n\nconst PROFILE_CODE_MODE_KEYS = new Set([\n 'concurrency',\n 'directTools',\n 'maxCalls',\n 'memoryLimitBytes',\n 'timeoutMs',\n])\n\n/** Validate `AgentProfile.model.metadata.codeMode`: a boolean, or an object pinning\n * exactly the subset a node may choose (host-only wasm/workerUrl and the\n * executor-owned store are refused — those belong to the seam). */\nfunction profileCodeModeSettings(\n value: unknown,\n context: string,\n): boolean | ProfileCodeModeSettings | undefined {\n if (value === undefined) return undefined\n if (typeof value === 'boolean') return value\n const label = `${context}: codeMode`\n if (typeof value !== 'object' || value === null || Array.isArray(value)) {\n throw new ConfigError(`${label} must be a boolean or an object of engine settings`)\n }\n const input = value as Record<string, unknown>\n const unknown = Object.keys(input).filter((key) => !PROFILE_CODE_MODE_KEYS.has(key))\n if (unknown.length > 0) {\n throw new ConfigError(\n `${label} refuses unsupported fields: ${unknown.join(', ')} (allowed: ${[...PROFILE_CODE_MODE_KEYS].join(', ')}; wasm/workerUrl/store belong to the executor seam)`,\n )\n }\n const timeoutMs = positiveInteger(input.timeoutMs, `${label}.timeoutMs`)\n const memoryLimitBytes = positiveInteger(input.memoryLimitBytes, `${label}.memoryLimitBytes`)\n const concurrency = positiveInteger(input.concurrency, `${label}.concurrency`)\n const maxCalls = positiveInteger(input.maxCalls, `${label}.maxCalls`)\n const directTools = input.directTools\n if (\n directTools !== undefined &&\n (!Array.isArray(directTools) || directTools.some((name) => typeof name !== 'string' || !name))\n ) {\n throw new ConfigError(`${label}.directTools must be an array of tool names`)\n }\n return Object.freeze({\n ...(timeoutMs !== undefined ? { timeoutMs } : {}),\n ...(memoryLimitBytes !== undefined ? { memoryLimitBytes } : {}),\n ...(concurrency !== undefined ? { concurrency } : {}),\n ...(maxCalls !== undefined ? { maxCalls } : {}),\n ...(Array.isArray(directTools) ? { directTools: Object.freeze([...directTools]) } : {}),\n })\n}\n\n/**\n * Read the completion ceilings an exact profile declares. The Interface schema already refines\n * these fields, but a profile can reach an executor without a parse, so the same rules are\n * enforced here: positive integers, and no single ceiling above the total.\n */\nfunction profileTokenLimits(\n profile: Pick<AgentProfile, 'model'>,\n context: string,\n): ProfileTokenLimits {\n const model = profile.model\n const visible = positiveInteger(\n model?.maxVisibleOutputTokens,\n `${context}: maxVisibleOutputTokens`,\n )\n const reasoning = positiveInteger(model?.maxReasoningTokens, `${context}: maxReasoningTokens`)\n const total = positiveInteger(model?.maxTotalOutputTokens, `${context}: maxTotalOutputTokens`)\n if (total !== undefined) {\n for (const [name, value] of [\n ['maxVisibleOutputTokens', visible],\n ['maxReasoningTokens', reasoning],\n ] as const) {\n if (value !== undefined && value > total) {\n throw new ConfigError(\n `${context}: AgentProfile.model.${name} (${value}) exceeds maxTotalOutputTokens (${total})`,\n )\n }\n }\n }\n return {\n ...(visible !== undefined ? { visible } : {}),\n ...(reasoning !== undefined ? { reasoning } : {}),\n ...(total !== undefined ? { total } : {}),\n }\n}\n\n/**\n * Lower the requested ceilings onto one execution path, or refuse the run before any paid\n * transport.\n *\n * - Router and OpenAI-compatible routes send the visible ceiling as `max_tokens` and the total as\n * `max_completion_tokens`.\n * - The CLI Bridge lowers ONE completion cap into the run's model catalog, so it carries the total\n * as `max_tokens` and cannot bound the visible half on its own.\n * - The Sandbox and environment-provider paths expose no completion cap at all.\n * - No route publishes a reasoning-token budget, so a reasoning ceiling is refused everywhere.\n * `AgentProfile.model.reasoningEffort` is an intensity dial, not a token bound.\n */\nexport function enforceTokenLimits(\n limits: ProfileTokenLimits,\n path: ModelExecutionPath,\n context: string,\n): TokenLimitDecision {\n const refuse = (field: string, reason: string): never => {\n throw new ConfigError(\n `${context}: AgentProfile.model.${field} cannot be enforced on the ${path} path (${reason}); remove the ceiling or select a path that enforces it`,\n )\n }\n if (limits.reasoning !== undefined) {\n refuse('maxReasoningTokens', 'no route exposes a reasoning-token budget')\n }\n if (path === 'router') {\n return {\n requested: limits,\n applied: {\n ...(limits.visible !== undefined ? { maxTokens: limits.visible } : {}),\n ...(limits.total !== undefined ? { maxCompletionTokens: limits.total } : {}),\n },\n }\n }\n if (path === 'bridge') {\n if (limits.visible !== undefined) {\n refuse('maxVisibleOutputTokens', 'the bridge lowers one completion cap covering both halves')\n }\n return {\n requested: limits,\n applied: {\n ...(limits.total !== undefined ? { maxTokens: limits.total } : {}),\n },\n }\n }\n if (limits.visible !== undefined) refuse('maxVisibleOutputTokens', 'the backend accepts no cap')\n if (limits.total !== undefined) refuse('maxTotalOutputTokens', 'the backend accepts no cap')\n return { requested: limits, applied: {} }\n}\n\nfunction finiteNumber(value: unknown, context: string): number | undefined {\n if (value === undefined) return undefined\n if (typeof value !== 'number' || !Number.isFinite(value)) {\n throw new ConfigError(`${context} must be a finite number`)\n }\n return value\n}\n\nfunction safeInteger(value: unknown, context: string): number | undefined {\n if (value === undefined) return undefined\n if (!Number.isSafeInteger(value)) throw new ConfigError(`${context} must be a safe integer`)\n return value as number\n}\n\nfunction positiveInteger(value: unknown, context: string): number | undefined {\n const parsed = safeInteger(value, context)\n if (parsed !== undefined && parsed < 1) {\n throw new ConfigError(`${context} must be positive`)\n }\n return parsed\n}\n\nfunction nonnegativeInteger(value: unknown, context: string): number | undefined {\n const parsed = safeInteger(value, context)\n if (parsed !== undefined && parsed < 0) {\n throw new ConfigError(`${context} must be nonnegative`)\n }\n return parsed\n}\n\nfunction optionalBoolean(value: unknown, context: string): boolean | undefined {\n if (value === undefined) return undefined\n if (typeof value !== 'boolean') throw new ConfigError(`${context} must be boolean`)\n return value\n}\n\n/**\n * Throw a `ConfigError` when `allowed` is set, `model` is defined, and `model` is not a\n * member of `allowed`. No-op when `allowed` is unset (the unrestricted default) or when\n * `model` is undefined (nothing was configured to check).\n */\nexport function assertModelAllowed(\n model: string | undefined,\n allowed: readonly string[] | undefined,\n): void {\n if (!allowed || model === undefined) return\n if (!allowed.includes(model)) {\n throw new ConfigError(\n `model ${JSON.stringify(model)} is not in the allowed set ${JSON.stringify([...allowed])}`,\n )\n }\n}\n\n/** Check every canonical model-bearing field in a complete profile, including the models a\n * backend may select for cheap work, named subagents, or modes.\n *\n * Every compared value is a bare model id. The composed `harness/provider/model` wire id\n * (`profileBridgeWireModel`) is neither built nor compared here, so this admits any route that\n * declares an allowed id, and a qualified entry in `allowed` matches nothing. Route pinning\n * belongs to `SuperviseOptions.authorizeSpawn`. */\nexport function assertProfileModelsAllowed(\n profile: AgentProfile,\n allowed: readonly string[] | undefined,\n): void {\n assertModelAllowed(profile.model?.default, allowed)\n assertModelAllowed(profile.model?.small, allowed)\n if (profile.model?.default === 'tangle/auto') {\n const extra = profile.model.metadata?.extraBody\n const policy =\n extra !== null && typeof extra === 'object'\n ? (extra as Record<string, unknown>).auto\n : undefined\n for (const model of routerAutoDeclaredModels(policy)) assertModelAllowed(model, allowed)\n }\n for (const subagent of Object.values(profile.subagents ?? {})) {\n assertModelAllowed(subagent.model, allowed)\n }\n for (const mode of Object.values(profile.modes ?? {})) {\n assertModelAllowed(mode.model, allowed)\n }\n}\n"],"mappings":"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"}
@@ -1,6 +1,6 @@
1
- import { c as errorMessage } from "./util-C_cdPNC4.js";
2
- import { C as readMaterializedWorkspaceFiles, D as verifyMaterializedProfileWorkspace, E as verifyBytes, F as deepFreezeCandidate, I as embeddedCandidateArtifact, L as immutableCandidateValue, M as canonicalCandidateBytes$1, N as canonicalCandidateDigest$1, O as verifyMaterializedWorkspace, P as canonicalCandidateDocument, R as omitTopLevelDigest, V as hasControlCharacter, _ as assertExactObjectKeys, b as artifactCacheKey, d as verifyTaskCheckout, f as verifyTaskOutcomePatch, g as persistCandidateOutputArtifact, k as verifyWorkspaceSnapshotArtifacts, l as readCandidateGitHubResource, u as verifyCandidateCode, v as isWellFormedUnicode, w as readVerifiedArtifact, z as sha256Bytes$1 } from "./workspace-streams-B7yNMahl.js";
3
- import { _ as parseAgentCandidateProfileActivation, c as buildLaunch, f as exactProfileExecutorFiles, h as modelRoutes, l as candidateEntrypointReceipt, m as materializeAgentCandidateProfilePlan, n as PI_CANDIDATE_SESSION_DIR_ENV, r as absoluteExecutionCwd, s as assertCandidateProfileExecutionSupport, t as PI_CANDIDATE_AGENT_DIR_ENV, u as candidateProfileAgentPaths, x as requirePublicCandidateConfigValue } from "./profile-CNSQjOes.js";
1
+ import { c as errorMessage } from "./util-fcckrkKp.js";
2
+ import { C as readMaterializedWorkspaceFiles, D as verifyMaterializedProfileWorkspace, E as verifyBytes, F as deepFreezeCandidate, I as embeddedCandidateArtifact, L as immutableCandidateValue, M as canonicalCandidateBytes$1, N as canonicalCandidateDigest$1, O as verifyMaterializedWorkspace, P as canonicalCandidateDocument, R as omitTopLevelDigest, V as hasControlCharacter, _ as assertExactObjectKeys, b as artifactCacheKey, d as verifyTaskCheckout, f as verifyTaskOutcomePatch, g as persistCandidateOutputArtifact, k as verifyWorkspaceSnapshotArtifacts, l as readCandidateGitHubResource, u as verifyCandidateCode, v as isWellFormedUnicode, w as readVerifiedArtifact, z as sha256Bytes$1 } from "./workspace-streams-DA9R3j-p.js";
3
+ import { _ as parseAgentCandidateProfileActivation, c as buildLaunch, f as exactProfileExecutorFiles, h as modelRoutes, l as candidateEntrypointReceipt, m as materializeAgentCandidateProfilePlan, n as PI_CANDIDATE_SESSION_DIR_ENV, r as absoluteExecutionCwd, s as assertCandidateProfileExecutionSupport, t as PI_CANDIDATE_AGENT_DIR_ENV, u as candidateProfileAgentPaths, x as requirePublicCandidateConfigValue } from "./profile-CD25rTJF.js";
4
4
  import { i as redactProtectedValue, n as createProtectedRecordRedactor, r as redactProtectedReason, t as assertNoProtectedBytes } from "./protected-redaction-DilFZch5.js";
5
5
  import { agentCandidateArtifactRefSchema, agentCandidateBenchmarkResultEvidenceSchema, agentCandidateBenchmarkSuiteSchema, agentCandidateBenchmarkTaskSchema, agentCandidateBundleSchema, agentCandidateContainerSchema, agentCandidateExecutionLimitsSchema, agentCandidateExecutionPlanEvidenceSchema, agentCandidateExecutionPlanMaterialSchema, agentCandidateMaterializationReceiptSchema, agentCandidateModelAccessNetworkSchema, agentCandidateModelSettlementEvidenceSchema, agentCandidateProfilePlanEvidenceSchema, agentCandidateResolvedModelSchema, agentCandidateRunCellSchema, agentCandidateRunReceiptSchema, agentCandidateTaskOutcomeEvidenceSchema, agentCandidateTaskOutcomeSpecSchema, agentCandidateTerminationSchema, agentCandidateWorkspaceManifestMaterialSchema, agentCandidateWorkspaceSnapshotEvidenceSchema, sha256DigestSchema } from "@tangle-network/agent-interface";
6
6
  import { REDACTION_VERSION, isLlmSpan } from "@tangle-network/agent-eval";
@@ -4319,4 +4319,4 @@ async function cleanupFailedPreparation(held, error) {
4319
4319
  }
4320
4320
  export { verifiedResourceTextByDigest as C, AGENT_CANDIDATE_EXECUTION_SUPPORT as S, sealTerminalDigest as _, consumePreparedCandidateExecution as a, sealAgentCandidateModelSettlement as b, withinCandidateCleanupDeadline as c, assertTerminalMatchesClaim as d, assertTerminalMatchesStaged as f, requireStagedTerminal as g, rejectedStage as h, beginPreparedCandidateDisposal as i, assertRecoveryMatchesStaged as l, rejectedFinish as m, executePreparedAgentCandidate as n, candidateClaimFileInternals as o, recoveredTerminalRecord as p, assertPreparedCandidateIntegrity as r, candidateCleanupDeadline as s, prepareAgentCandidateExecution as t, assertTerminalAllowedInPhase as u, terminalRecord as v, verifyAgentCandidateBundle as w, exactProcessProviderAsCandidateExecutor as x, createProtectedAgentCandidateModelPort as y };
4321
4321
 
4322
- //# sourceMappingURL=prepare-Dtfk_Wi_.js.map
4322
+ //# sourceMappingURL=prepare-BnF8nGIg.js.map