@sema-agent/core 7.54.1 → 7.56.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (621) hide show
  1. package/CHANGELOG.md +950 -0
  2. package/dist/agents/agent-transcript-tool.js +2 -1
  3. package/dist/agents/builtin-agents.d.ts +12 -14
  4. package/dist/agents/cascade.js +1 -1
  5. package/dist/agents/cc-peer-directory.d.ts +36 -0
  6. package/dist/agents/cc-peer-directory.js +139 -0
  7. package/dist/agents/cc-peer-wire.d.ts +105 -0
  8. package/dist/agents/cc-peer-wire.js +98 -0
  9. package/dist/agents/cc-uds-peer-channel.d.ts +40 -0
  10. package/dist/agents/cc-uds-peer-channel.js +457 -0
  11. package/dist/agents/child-model-seat.d.ts +0 -11
  12. package/dist/agents/child-model-seat.js +0 -3
  13. package/dist/agents/cross-session-envelope.d.ts +4 -1
  14. package/dist/agents/cross-session-envelope.js +8 -1
  15. package/dist/agents/cross-session-judge.d.ts +2 -2
  16. package/dist/agents/list-agents-tool.d.ts +3 -1
  17. package/dist/agents/list-agents-tool.js +9 -8
  18. package/dist/agents/observer.d.ts +4 -5
  19. package/dist/agents/observer.js +2 -1
  20. package/dist/agents/peer-admission.d.ts +6 -0
  21. package/dist/agents/peer-admission.js +4 -1
  22. package/dist/agents/peer-directory.d.ts +65 -13
  23. package/dist/agents/peer-directory.js +90 -25
  24. package/dist/agents/peer-notices.d.ts +1 -1
  25. package/dist/agents/peer-session-drain.d.ts +3 -1
  26. package/dist/agents/peer-session-drain.js +3 -2
  27. package/dist/agents/read-inbox-tool.js +2 -1
  28. package/dist/agents/repair-loop.js +2 -2
  29. package/dist/agents/retain-ledger.d.ts +1 -1
  30. package/dist/agents/roster-store.d.ts +1 -1
  31. package/dist/agents/send-message-tool.d.ts +10 -0
  32. package/dist/agents/send-message-tool.js +37 -8
  33. package/dist/agents/subagent.d.ts +39 -82
  34. package/dist/agents/subagent.js +109 -106
  35. package/dist/agents/tool-filter.d.ts +31 -46
  36. package/dist/agents/tool-filter.js +13 -33
  37. package/dist/agents/verify.d.ts +6 -5
  38. package/dist/agents/verify.js +3 -3
  39. package/dist/brain/anthropic.js +43 -81
  40. package/dist/brain/errors.d.ts +15 -0
  41. package/dist/brain/errors.js +10 -0
  42. package/dist/brain/media-degrade.d.ts +18 -7
  43. package/dist/brain/media-degrade.js +13 -2
  44. package/dist/brain/model-capability.d.ts +37 -0
  45. package/dist/brain/model-capability.js +34 -0
  46. package/dist/brain/model-presets.d.ts +6 -12
  47. package/dist/brain/model-presets.js +1 -6
  48. package/dist/brain/open-responses.js +27 -35
  49. package/dist/brain/openai.js +30 -98
  50. package/dist/brain/provider-dialect.d.ts +39 -3
  51. package/dist/brain/provider-dialect.js +28 -0
  52. package/dist/brain/reasoning-request.d.ts +96 -0
  53. package/dist/brain/reasoning-request.js +174 -0
  54. package/dist/brain/reasoning.d.ts +12 -12
  55. package/dist/brain/reasoning.js +4 -3
  56. package/dist/brain/request-params.d.ts +62 -9
  57. package/dist/brain/request-params.js +42 -7
  58. package/dist/brain/retry.d.ts +1 -1
  59. package/dist/brain/route-adjudicator.d.ts +15 -0
  60. package/dist/brain/route-adjudicator.js +15 -0
  61. package/dist/brain/status-sink.d.ts +20 -0
  62. package/dist/brain/status-sink.js +7 -0
  63. package/dist/brain/stream-engine.js +6 -5
  64. package/dist/brain/stream-shared.d.ts +1 -1
  65. package/dist/core/a2a.d.ts +2 -1
  66. package/dist/core/a2a.js +19 -13
  67. package/dist/core/advisor-verdict.d.ts +120 -0
  68. package/dist/core/advisor-verdict.js +92 -0
  69. package/dist/core/agent-definition.d.ts +17 -8
  70. package/dist/core/allow-entry.d.ts +69 -36
  71. package/dist/core/allow-entry.js +81 -52
  72. package/dist/core/allow-rule-shadow.d.ts +10 -3
  73. package/dist/core/approval-object.d.ts +2 -1
  74. package/dist/core/approval-object.js +6 -6
  75. package/dist/core/ask-origin.d.ts +127 -29
  76. package/dist/core/ask-origin.js +87 -25
  77. package/dist/core/ask-question.d.ts +51 -8
  78. package/dist/core/ask-question.js +12 -7
  79. package/dist/core/ask-unresolvable-notice.d.ts +8 -3
  80. package/dist/core/ask-unresolvable-notice.js +16 -2
  81. package/dist/core/auto-compaction.d.ts +11 -8
  82. package/dist/core/auto-compaction.js +4 -2
  83. package/dist/core/auto-mode-arming.d.ts +2 -2
  84. package/dist/core/auto-mode-defaults.d.ts +8 -8
  85. package/dist/core/auto-mode-prompt-assets.d.ts +3 -3
  86. package/dist/core/auto-mode-prompt.d.ts +1 -1
  87. package/dist/core/auto-mode.d.ts +17 -9
  88. package/dist/core/auto-mode.js +9 -6
  89. package/dist/core/background-agent-store.d.ts +3 -3
  90. package/dist/core/canonical-json.d.ts +1 -1
  91. package/dist/core/canonical-json.js +2 -2
  92. package/dist/core/checkpoint-generation.d.ts +53 -0
  93. package/dist/core/checkpoint-generation.js +35 -0
  94. package/dist/core/checkpoint-queries.d.ts +180 -0
  95. package/dist/core/checkpoint-queries.js +272 -0
  96. package/dist/core/checkpoint-requirements.d.ts +19 -4
  97. package/dist/core/checkpoint-requirements.js +8 -14
  98. package/dist/core/checkpoint-store.d.ts +165 -72
  99. package/dist/core/checkpoint-store.js +79 -82
  100. package/dist/core/child-clamp-seats.d.ts +6 -0
  101. package/dist/core/child-clamp-seats.js +3 -16
  102. package/dist/core/compliance.d.ts +2 -2
  103. package/dist/core/context-edit.d.ts +6 -7
  104. package/dist/core/cross-boundary-taint.d.ts +11 -4
  105. package/dist/core/cross-boundary-taint.js +3 -3
  106. package/dist/core/decision-receipt.d.ts +37 -3
  107. package/dist/core/decision-receipt.js +19 -19
  108. package/dist/core/delegation-not-started.d.ts +6 -0
  109. package/dist/core/delegation-not-started.js +17 -0
  110. package/dist/core/effective-path-target.d.ts +1 -1
  111. package/dist/core/engine-attestation.d.ts +93 -0
  112. package/dist/core/engine-attestation.js +70 -0
  113. package/dist/core/engine-capabilities.d.ts +4 -1
  114. package/dist/core/engine-capabilities.js +1 -1
  115. package/dist/core/engine-notice.d.ts +45 -12
  116. package/dist/core/exec-output-tail.d.ts +1 -1
  117. package/dist/core/file-history-retention.d.ts +1 -1
  118. package/dist/core/file-history-store.d.ts +147 -21
  119. package/dist/core/file-history-store.js +58 -32
  120. package/dist/core/gate-fold.d.ts +1 -1
  121. package/dist/core/gate-fold.js +24 -11
  122. package/dist/core/gate-lanes.js +81 -68
  123. package/dist/core/gate-outcome.d.ts +40 -6
  124. package/dist/core/gate-outcome.js +56 -0
  125. package/dist/core/governance-codes.d.ts +17 -3
  126. package/dist/core/governance-codes.js +16 -0
  127. package/dist/core/hands-band.d.ts +1 -1
  128. package/dist/core/hooks.d.ts +21 -20
  129. package/dist/core/hooks.js +3 -1
  130. package/dist/core/host-floor.d.ts +128 -0
  131. package/dist/core/host-floor.js +206 -0
  132. package/dist/core/host-target.d.ts +84 -0
  133. package/dist/core/host-target.js +92 -0
  134. package/dist/core/image-downsample.d.ts +1 -1
  135. package/dist/core/lsp-diagnostics.d.ts +4 -4
  136. package/dist/core/lsp.d.ts +3 -3
  137. package/dist/core/mailbox-store.d.ts +4 -0
  138. package/dist/core/mcp-connection-pool.d.ts +18 -2
  139. package/dist/core/mcp-connection-pool.js +53 -6
  140. package/dist/core/mcp-failure.d.ts +23 -4
  141. package/dist/core/mcp-failure.js +26 -11
  142. package/dist/core/mcp-listing-drift.d.ts +10 -0
  143. package/dist/core/mcp-listing-drift.js +6 -0
  144. package/dist/core/mcp-server-link.d.ts +173 -0
  145. package/dist/core/mcp-server-link.js +127 -0
  146. package/dist/core/mcp-server-spec.d.ts +4 -2
  147. package/dist/core/mcp-session-end.d.ts +26 -0
  148. package/dist/core/mcp-session-end.js +29 -0
  149. package/dist/core/mcp-startup-request.d.ts +17 -0
  150. package/dist/core/mcp-startup-request.js +17 -0
  151. package/dist/core/mcp.d.ts +17 -13
  152. package/dist/core/mcp.js +240 -189
  153. package/dist/core/media-byte-cap.d.ts +1 -1
  154. package/dist/core/memory-engine/delegation-settlement.js +15 -24
  155. package/dist/core/memory-engine/engine.d.ts +9 -9
  156. package/dist/core/memory-engine/engine.js +4 -4
  157. package/dist/core/memory-engine/layout.d.ts +60 -8
  158. package/dist/core/memory-engine/layout.js +65 -6
  159. package/dist/core/memory-engine/provenance-wording.d.ts +1 -1
  160. package/dist/core/memory-engine/tools.js +4 -1
  161. package/dist/core/mode-policy.d.ts +1 -1
  162. package/dist/core/model-seat.d.ts +10 -3
  163. package/dist/core/mods/classic-events.d.ts +67 -0
  164. package/dist/core/mods/classic-events.js +1 -0
  165. package/dist/core/mods/dollar.d.ts +13 -0
  166. package/dist/core/mods/extension-call.d.ts +31 -0
  167. package/dist/core/mods/extension-call.js +43 -0
  168. package/dist/core/mods/kernel/dispatch.d.ts +20 -3
  169. package/dist/core/mods/kernel/dispatch.js +140 -69
  170. package/dist/core/mods/kernel/events.d.ts +47 -11
  171. package/dist/core/mods/kernel/events.js +66 -42
  172. package/dist/core/mods/kernel/index.d.ts +4 -4
  173. package/dist/core/mods/kernel/index.js +2 -2
  174. package/dist/core/mods/kernel/receive.d.ts +39 -5
  175. package/dist/core/mods/kernel/receive.js +290 -17
  176. package/dist/core/mods/kernel/registration.d.ts +33 -2
  177. package/dist/core/mods/kernel/registration.js +6 -7
  178. package/dist/core/mods/kernel/site-rules.d.ts +44 -16
  179. package/dist/core/mods/kernel/site-rules.js +24 -42
  180. package/dist/core/mods/spec-seats.d.ts +69 -0
  181. package/dist/core/mods/spec-seats.js +114 -0
  182. package/dist/core/mods/stations.d.ts +28 -8
  183. package/dist/core/mods/stations.js +29 -13
  184. package/dist/core/mods/tool-call.d.ts +79 -0
  185. package/dist/core/mods/tool-call.js +152 -0
  186. package/dist/core/namespaced-rule-name.d.ts +44 -24
  187. package/dist/core/namespaced-rule-name.js +50 -43
  188. package/dist/core/output-style.d.ts +1 -1
  189. package/dist/core/param-rule-reach.d.ts +15 -0
  190. package/dist/core/param-rule-reach.js +30 -0
  191. package/dist/core/parent-spec-seat.d.ts +13 -1
  192. package/dist/core/parent-spec-seat.js +6 -0
  193. package/dist/core/park-selfcheck.js +1 -0
  194. package/dist/core/pause-registry.d.ts +16 -5
  195. package/dist/core/pause-registry.js +6 -2
  196. package/dist/core/peer-channel.d.ts +70 -0
  197. package/dist/core/peer-channel.js +1 -0
  198. package/dist/core/permission-rule-consent.d.ts +30 -5
  199. package/dist/core/permission-rule-consent.js +147 -50
  200. package/dist/core/permission-rule-model.d.ts +245 -65
  201. package/dist/core/permission-rule-model.js +421 -107
  202. package/dist/core/permission-rule-org.d.ts +6 -2
  203. package/dist/core/permission-rule-org.js +7 -3
  204. package/dist/core/permission-rule-provider.d.ts +6 -2
  205. package/dist/core/permission-rule-provider.js +41 -11
  206. package/dist/core/permission-rule-store.d.ts +22 -26
  207. package/dist/core/permission-rule-store.js +12 -6
  208. package/dist/core/permission-rule-sync.d.ts +11 -2
  209. package/dist/core/permission-rule-sync.js +11 -3
  210. package/dist/core/permission-rule-syntax.d.ts +5 -4
  211. package/dist/core/permission-rule-syntax.js +2 -2
  212. package/dist/core/permission-rules.d.ts +53 -15
  213. package/dist/core/permission-rules.js +125 -100
  214. package/dist/core/persisted-rule-arms.d.ts +6 -4
  215. package/dist/core/persisted-rule-arms.js +10 -12
  216. package/dist/core/present-plan-tool.js +3 -1
  217. package/dist/core/principal-name.d.ts +20 -0
  218. package/dist/core/principal-name.js +22 -0
  219. package/dist/core/prompt-section-seat.js +4 -6
  220. package/dist/core/protocol-http-auth.d.ts +26 -5
  221. package/dist/core/protocol-http-auth.js +137 -4
  222. package/dist/core/protocol-naming.d.ts +2 -2
  223. package/dist/core/read-only-shell-table.d.ts +1 -1
  224. package/dist/core/read-only-shell.d.ts +1 -1
  225. package/dist/core/retired-keys.d.ts +16 -0
  226. package/dist/core/retired-keys.js +16 -4
  227. package/dist/core/rewrite-rejudge.d.ts +60 -0
  228. package/dist/core/rewrite-rejudge.js +36 -0
  229. package/dist/core/roles.d.ts +34 -3
  230. package/dist/core/roles.js +66 -53
  231. package/dist/core/rule-lane-reads.d.ts +20 -15
  232. package/dist/core/rule-lane-reads.js +45 -17
  233. package/dist/core/rule-offer-read.d.ts +53 -0
  234. package/dist/core/rule-offer-read.js +146 -0
  235. package/dist/core/rule-owner.d.ts +46 -0
  236. package/dist/core/rule-owner.js +29 -0
  237. package/dist/core/runner/advisor-instructions.d.ts +70 -0
  238. package/dist/core/runner/advisor-instructions.js +61 -0
  239. package/dist/core/runner/advisor-tool.d.ts +33 -0
  240. package/dist/core/runner/advisor-tool.js +112 -0
  241. package/dist/core/runner/announce-once-ledger.d.ts +18 -26
  242. package/dist/core/runner/announce-once-ledger.js +19 -46
  243. package/dist/core/runner/approval-feedback.js +6 -3
  244. package/dist/core/runner/assemble-result.d.ts +2 -1
  245. package/dist/core/runner/assemble-result.js +1 -1
  246. package/dist/core/runner/call-hook-stations.d.ts +3 -2
  247. package/dist/core/runner/caller-roster.d.ts +21 -2
  248. package/dist/core/runner/caller-roster.js +38 -0
  249. package/dist/core/runner/capability-withheld-seat.d.ts +5 -0
  250. package/dist/core/runner/capability-withheld-seat.js +24 -0
  251. package/dist/core/runner/classifier-ladder.d.ts +33 -13
  252. package/dist/core/runner/classifier-ladder.js +15 -14
  253. package/dist/core/runner/compaction-restate.d.ts +10 -6
  254. package/dist/core/runner/compaction-restate.js +9 -3
  255. package/dist/core/runner/construction-doors.js +3 -0
  256. package/dist/core/runner/contracts.d.ts +40 -33
  257. package/dist/core/runner/conversation-segment.d.ts +28 -0
  258. package/dist/core/runner/conversation-segment.js +42 -0
  259. package/dist/core/runner/cross-boundary-lane.d.ts +21 -16
  260. package/dist/core/runner/cross-boundary-lane.js +58 -34
  261. package/dist/core/runner/decide-continuation.d.ts +7 -4
  262. package/dist/core/runner/decide-continuation.js +2 -2
  263. package/dist/core/runner/denial-limit-arms.d.ts +4 -4
  264. package/dist/core/runner/denial-limit-arms.js +1 -1
  265. package/dist/core/runner/derived-route-fallback.d.ts +24 -24
  266. package/dist/core/runner/derived-route-fallback.js +9 -7
  267. package/dist/core/runner/file-history-request.d.ts +18 -0
  268. package/dist/core/runner/file-history-request.js +21 -13
  269. package/dist/core/runner/file-history-restore.d.ts +45 -0
  270. package/dist/core/runner/file-history-restore.js +46 -0
  271. package/dist/core/runner/gate-exit.d.ts +9 -3
  272. package/dist/core/runner/gate-exit.js +11 -5
  273. package/dist/core/runner/image.d.ts +7 -17
  274. package/dist/core/runner/image.js +9 -60
  275. package/dist/core/runner/initial-run-state.js +1 -1
  276. package/dist/core/runner/permission-rule-lanes.d.ts +6 -6
  277. package/dist/core/runner/permission-rule-lanes.js +38 -15
  278. package/dist/core/runner/person-path-rows.d.ts +12 -9
  279. package/dist/core/runner/person-path-rows.js +19 -8
  280. package/dist/core/runner/prepare-advisor.d.ts +63 -0
  281. package/dist/core/runner/prepare-advisor.js +77 -0
  282. package/dist/core/runner/prepare-ask-lane.d.ts +2 -2
  283. package/dist/core/runner/prepare-ask-lane.js +5 -2
  284. package/dist/core/runner/prepare-caps-and-workflow.d.ts +4 -6
  285. package/dist/core/runner/prepare-caps-and-workflow.js +5 -4
  286. package/dist/core/runner/prepare-config-doors.d.ts +31 -38
  287. package/dist/core/runner/prepare-config-doors.js +57 -34
  288. package/dist/core/runner/prepare-defer-classify.d.ts +4 -3
  289. package/dist/core/runner/prepare-defer-classify.js +7 -8
  290. package/dist/core/runner/prepare-delegation-surface.d.ts +2 -2
  291. package/dist/core/runner/prepare-delegation-surface.js +1 -1
  292. package/dist/core/runner/prepare-file-history.d.ts +48 -8
  293. package/dist/core/runner/prepare-file-history.js +41 -73
  294. package/dist/core/runner/prepare-gate-stations.d.ts +2 -5
  295. package/dist/core/runner/prepare-gate-stations.js +12 -8
  296. package/dist/core/runner/prepare-hands-readface.d.ts +2 -8
  297. package/dist/core/runner/prepare-hands-readface.js +15 -14
  298. package/dist/core/runner/prepare-inherited-gate.d.ts +11 -7
  299. package/dist/core/runner/prepare-inherited-gate.js +8 -6
  300. package/dist/core/runner/prepare-memory-engine-session.js +1 -1
  301. package/dist/core/runner/prepare-park-ask.js +12 -12
  302. package/dist/core/runner/prepare-policy-chain.d.ts +7 -4
  303. package/dist/core/runner/prepare-policy-chain.js +68 -81
  304. package/dist/core/runner/prepare-project-context.d.ts +5 -2
  305. package/dist/core/runner/prepare-project-context.js +6 -3
  306. package/dist/core/runner/prepare-prompt-assembly.d.ts +5 -7
  307. package/dist/core/runner/prepare-prompt-assembly.js +10 -8
  308. package/dist/core/runner/prepare-prompt-inputs.d.ts +11 -9
  309. package/dist/core/runner/prepare-prompt-inputs.js +4 -6
  310. package/dist/core/runner/prepare-protocol-tools.d.ts +4 -2
  311. package/dist/core/runner/prepare-protocol-tools.js +5 -4
  312. package/dist/core/runner/prepare-safety-scan.d.ts +9 -12
  313. package/dist/core/runner/prepare-safety-scan.js +8 -23
  314. package/dist/core/runner/prepare-suspend-saga.d.ts +2 -0
  315. package/dist/core/runner/prepare-suspend-saga.js +5 -6
  316. package/dist/core/runner/prepare-task.d.ts +1 -1
  317. package/dist/core/runner/prepare-task.js +41 -35
  318. package/dist/core/runner/prepare-tool-disclosure-mount.d.ts +7 -4
  319. package/dist/core/runner/prepare-tool-disclosure-mount.js +24 -18
  320. package/dist/core/runner/prepare-turn-wiring.d.ts +0 -4
  321. package/dist/core/runner/prepare-turn-wiring.js +2 -7
  322. package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -4
  323. package/dist/core/runner/prepare-wiring-manifest.js +3 -3
  324. package/dist/core/runner/resume-admission.js +1 -1
  325. package/dist/core/runner/resume-apply.js +11 -12
  326. package/dist/core/runner/resume-checkpoint-screen.js +3 -0
  327. package/dist/core/runner/resume-claim.d.ts +4 -2
  328. package/dist/core/runner/resume-claim.js +15 -8
  329. package/dist/core/runner/resume-policy-outcome.js +1 -1
  330. package/dist/core/runner/retired-runner-deps.js +2 -1
  331. package/dist/core/runner/rewind-files.d.ts +15 -0
  332. package/dist/core/runner/rewind-files.js +132 -0
  333. package/dist/core/runner/run-attachment-seats.js +2 -2
  334. package/dist/core/runner/run-brain-sinks.d.ts +4 -1
  335. package/dist/core/runner/run-brain-sinks.js +4 -2
  336. package/dist/core/runner/run-compaction-machinery.d.ts +1 -1
  337. package/dist/core/runner/run-compaction-machinery.js +2 -12
  338. package/dist/core/runner/run-git-lane.d.ts +1 -0
  339. package/dist/core/runner/run-harness-handlers.js +14 -7
  340. package/dist/core/runner/run-leg.d.ts +1 -1
  341. package/dist/core/runner/run-leg.js +43 -18
  342. package/dist/core/runner/run-settle-and-teardown.js +3 -2
  343. package/dist/core/runner/run-telemetry-and-budget-seats.js +1 -1
  344. package/dist/core/runner/run-turn-boundary.d.ts +1 -0
  345. package/dist/core/runner/run-turn-boundary.js +15 -22
  346. package/dist/core/runner/runtask.d.ts +3 -0
  347. package/dist/core/runner/runtask.js +8 -9
  348. package/dist/core/runner/session-read-file-states.d.ts +15 -0
  349. package/dist/core/runner/session-read-file-states.js +28 -0
  350. package/dist/core/runner/session-rule-policy.d.ts +22 -21
  351. package/dist/core/runner/session-rule-policy.js +17 -31
  352. package/dist/core/runner/shell-env-withheld.d.ts +33 -0
  353. package/dist/core/runner/shell-env-withheld.js +51 -0
  354. package/dist/core/runner/side-call-account.d.ts +32 -8
  355. package/dist/core/runner/side-call-account.js +23 -1
  356. package/dist/core/runner/skills-seat.js +6 -2
  357. package/dist/core/runner/stream-settle-backstop.js +1 -1
  358. package/dist/core/runner/strict-output-schema.d.ts +1 -1
  359. package/dist/core/runner/sub-agent-deny-lists.js +4 -6
  360. package/dist/core/runner/synthetic-tools.d.ts +16 -13
  361. package/dist/core/runner/synthetic-tools.js +8 -3
  362. package/dist/core/runner/tool-disclosure.d.ts +10 -12
  363. package/dist/core/runner/tool-disclosure.js +3 -4
  364. package/dist/core/runner/tool-end-body.d.ts +1 -1
  365. package/dist/core/runner/tool-end-body.js +10 -9
  366. package/dist/core/runner/tool-face-overlay.d.ts +2 -1
  367. package/dist/core/runner/tool-face-overlay.js +17 -1
  368. package/dist/core/runner/tool-not-executed.d.ts +5 -0
  369. package/dist/core/runner/tool-not-executed.js +11 -0
  370. package/dist/core/runner/tool-occurrence.d.ts +8 -0
  371. package/dist/core/runner/tool-occurrence.js +7 -0
  372. package/dist/core/runner/tool-progress-lane.d.ts +2 -2
  373. package/dist/core/runner/tool-turn-repair-seat.d.ts +3 -2
  374. package/dist/core/runner/turn-attachments.d.ts +91 -80
  375. package/dist/core/runner/turn-attachments.js +62 -37
  376. package/dist/core/runner-deps.d.ts +42 -42
  377. package/dist/core/runtime-caps.d.ts +4 -4
  378. package/dist/core/safety-axis-vocab.d.ts +6 -4
  379. package/dist/core/safety-axis-vocab.js +6 -5
  380. package/dist/core/safety-merge-corpus.js +26 -2
  381. package/dist/core/same-plain-value.d.ts +40 -0
  382. package/dist/core/same-plain-value.js +49 -0
  383. package/dist/core/scheduler.d.ts +1 -1
  384. package/dist/core/secret-env.d.ts +26 -3
  385. package/dist/core/secret-env.js +44 -8
  386. package/dist/core/select-model.js +3 -3
  387. package/dist/core/sensitive-path-policy.d.ts +1 -1
  388. package/dist/core/sensitive-path-policy.js +1 -1
  389. package/dist/core/session-policy-store.d.ts +102 -35
  390. package/dist/core/session-policy-store.js +210 -48
  391. package/dist/core/session-reconcile.d.ts +2 -2
  392. package/dist/core/session-store.d.ts +106 -37
  393. package/dist/core/session-store.js +165 -91
  394. package/dist/core/session.d.ts +101 -57
  395. package/dist/core/session.js +53 -0
  396. package/dist/core/shared-memory/tools.js +3 -1
  397. package/dist/core/shared-memory/types.d.ts +1 -1
  398. package/dist/core/shell-read-silence.d.ts +11 -12
  399. package/dist/core/shell-read-silence.js +9 -5
  400. package/dist/core/shell-run-candidates.js +3 -1
  401. package/dist/core/shell-wrapper-projection.js +1 -1
  402. package/dist/core/shell-wrapper-table.d.ts +14 -7
  403. package/dist/core/shell-wrapper-table.js +5 -4
  404. package/dist/core/side-query.d.ts +10 -0
  405. package/dist/core/side-query.js +15 -1
  406. package/dist/core/skill-grant.d.ts +7 -2
  407. package/dist/core/skill-grant.js +5 -0
  408. package/dist/core/skills-directory.js +6 -2
  409. package/dist/core/store-contracts/checkpoint-store-contract.d.ts +11 -1
  410. package/dist/core/store-contracts/checkpoint-store-contract.js +168 -3
  411. package/dist/core/store-contracts/file-history-store-contract.js +74 -4
  412. package/dist/core/store-contracts/peer-directory-contract.d.ts +7 -2
  413. package/dist/core/store-contracts/peer-directory-contract.js +14 -2
  414. package/dist/core/store-contracts/session-policy-store-contract.d.ts +7 -0
  415. package/dist/core/store-contracts/session-policy-store-contract.js +130 -0
  416. package/dist/core/store-contracts/session-repo-contract.js +176 -0
  417. package/dist/core/store-contracts/session-store-contract.d.ts +6 -8
  418. package/dist/core/store-contracts/session-store-contract.js +361 -51
  419. package/dist/core/store-contracts/workflow-journal-store-contract.js +26 -1
  420. package/dist/core/stub-env.d.ts +2 -0
  421. package/dist/core/stub-env.js +1 -0
  422. package/dist/core/surrogate-safe-slice.d.ts +3 -3
  423. package/dist/core/synthetic-read-verdict.js +3 -3
  424. package/dist/core/task-event.d.ts +42 -8
  425. package/dist/core/task-notification.d.ts +19 -15
  426. package/dist/core/task-registry-agent.d.ts +4 -4
  427. package/dist/core/task-registry-shared.d.ts +4 -4
  428. package/dist/core/task-registry-shared.js +1 -0
  429. package/dist/core/task-registry.d.ts +13 -4
  430. package/dist/core/task-registry.js +14 -2
  431. package/dist/core/task-result.d.ts +21 -3
  432. package/dist/core/task-spec.d.ts +69 -64
  433. package/dist/core/task-stream.d.ts +6 -6
  434. package/dist/core/task-tool-shape.d.ts +4 -4
  435. package/dist/core/tighten-task-spec.d.ts +1 -1
  436. package/dist/core/tighten-task-spec.js +2 -1
  437. package/dist/core/tool-catalog-entries.d.ts +36 -2
  438. package/dist/core/tool-catalog-entries.js +69 -43
  439. package/dist/core/tool-check-reading.d.ts +11 -0
  440. package/dist/core/tool-check-reading.js +11 -6
  441. package/dist/core/tool-conformance.js +1 -0
  442. package/dist/core/tool-errors.d.ts +2 -2
  443. package/dist/core/tool-face-reader.js +5 -3
  444. package/dist/core/tool-face.d.ts +21 -2
  445. package/dist/core/tool-face.js +1 -1
  446. package/dist/core/tool-model-gate.d.ts +5 -5
  447. package/dist/core/tool-name-aliases.d.ts +29 -8
  448. package/dist/core/tool-name-aliases.js +22 -4
  449. package/dist/core/tool-name-readings.d.ts +10 -43
  450. package/dist/core/tool-name-readings.js +2 -11
  451. package/dist/core/tool-policy.d.ts +85 -196
  452. package/dist/core/tool-policy.js +150 -175
  453. package/dist/core/tool-registry.d.ts +14 -7
  454. package/dist/core/tool-registry.js +17 -7
  455. package/dist/core/tool-result-store.js +5 -1
  456. package/dist/core/tool-roster.d.ts +57 -33
  457. package/dist/core/tool-roster.js +56 -68
  458. package/dist/core/tool-spec-members.js +8 -3
  459. package/dist/core/tool-spec.d.ts +53 -31
  460. package/dist/core/tools.js +51 -10
  461. package/dist/core/trace.d.ts +6 -2
  462. package/dist/core/types.d.ts +1 -1
  463. package/dist/core/untrusted-egress.d.ts +1 -1
  464. package/dist/core/untrusted-text.d.ts +1 -1
  465. package/dist/core/user-attachment.d.ts +8 -1
  466. package/dist/core/user-attachment.js +64 -4
  467. package/dist/core/warm-resume.d.ts +1 -1
  468. package/dist/core/wiring-manifest.d.ts +58 -0
  469. package/dist/core/wiring-manifest.js +14 -5
  470. package/dist/core/workflow-journal-store.d.ts +62 -0
  471. package/dist/core/workflow-journal-store.js +78 -2
  472. package/dist/core/workflow-run-store.d.ts +6 -0
  473. package/dist/core/workflow-run-store.js +2 -0
  474. package/dist/engine/compaction/compaction.d.ts +9 -9
  475. package/dist/engine/compaction/compaction.js +3 -2
  476. package/dist/engine/execution-env/node-execution-env.d.ts +26 -8
  477. package/dist/engine/execution-env/node-execution-env.js +54 -24
  478. package/dist/engine/harness/agent-harness.d.ts +39 -9
  479. package/dist/engine/harness/agent-harness.js +87 -33
  480. package/dist/engine/harness/types.d.ts +58 -9
  481. package/dist/engine/harness/types.js +12 -1
  482. package/dist/engine/llm/types.d.ts +36 -19
  483. package/dist/engine/llm/validation.d.ts +4 -1
  484. package/dist/engine/llm/validation.js +13 -1
  485. package/dist/engine/loop/agent-loop.d.ts +23 -1
  486. package/dist/engine/loop/agent-loop.js +26 -34
  487. package/dist/engine/loop/types.d.ts +31 -19
  488. package/dist/engine/lsp/node-lsp-manager.d.ts +2 -2
  489. package/dist/engine/session/memory-repo.d.ts +18 -12
  490. package/dist/engine/session/memory-repo.js +24 -9
  491. package/dist/engine/session/parent-chain-guard.d.ts +3 -2
  492. package/dist/engine/session/parent-chain-guard.js +1 -1
  493. package/dist/engine/session/repo-utils.d.ts +32 -3
  494. package/dist/engine/session/repo-utils.js +50 -5
  495. package/dist/index.d.ts +47 -23
  496. package/dist/index.js +35 -17
  497. package/dist/internal/harness-types.d.ts +1 -1
  498. package/dist/internal/harness.d.ts +3 -3
  499. package/dist/internal/harness.js +2 -2
  500. package/dist/internal/llm.d.ts +2 -2
  501. package/dist/internal/llm.js +1 -1
  502. package/dist/orchestration/goal.js +2 -2
  503. package/dist/orchestration/run-workflow-tool.d.ts +8 -6
  504. package/dist/orchestration/run-workflow-tool.js +10 -6
  505. package/dist/orchestration/workflow-size-guideline.d.ts +4 -4
  506. package/dist/orchestration/workflow-types.d.ts +18 -0
  507. package/dist/orchestration/workflow-types.js +6 -0
  508. package/dist/orchestration/workflow.d.ts +5 -13
  509. package/dist/orchestration/workflow.js +57 -49
  510. package/dist/prompt-assembly/artifact.d.ts +2 -2
  511. package/dist/prompt-assembly/artifact.js +5 -3
  512. package/dist/prompt-assembly/assemble.d.ts +3 -2
  513. package/dist/prompt-assembly/assemble.js +1 -1
  514. package/dist/prompt-assembly/catalog/schema.d.ts +43 -12
  515. package/dist/prompt-assembly/catalog/schema.js +34 -2
  516. package/dist/prompt-assembly/catalog/sections.js +0 -1
  517. package/dist/prompt-assembly/composer.d.ts +3 -1
  518. package/dist/prompt-assembly/composer.js +1 -1
  519. package/dist/prompt-assembly/event-registry.js +2 -0
  520. package/dist/prompt-assembly/overlay.js +3 -3
  521. package/dist/prompt-assembly/renderers.d.ts +1 -1
  522. package/dist/prompt-assembly/renderers.js +0 -3
  523. package/dist/prompt-assembly/role-base.d.ts +15 -0
  524. package/dist/prompt-assembly/role-base.js +9 -0
  525. package/dist/prompt-assembly/select.d.ts +39 -14
  526. package/dist/prompt-assembly/select.js +47 -16
  527. package/dist/prompt-assembly/sugar.d.ts +17 -11
  528. package/dist/prompt-assembly/sugar.js +8 -3
  529. package/dist/prompt-assembly/tool-catalog.d.ts +39 -2
  530. package/dist/prompt-assembly/tool-catalog.js +117 -4
  531. package/dist/prompt-assembly/turn-snapshot.d.ts +4 -10
  532. package/dist/prompt-assembly/turn-snapshot.js +0 -3
  533. package/dist/prompt-assembly/types.d.ts +0 -7
  534. package/dist/prompts/default.d.ts +14 -14
  535. package/dist/scenarios/full-body.d.ts +15 -15
  536. package/dist/scenarios/full-body.js +4 -3
  537. package/dist/shell/lex.js +10 -1
  538. package/dist/stores/file/adoption/adopt.d.ts +4 -3
  539. package/dist/stores/file/adoption/adopt.js +27 -33
  540. package/dist/stores/file/adoption/marker.d.ts +6 -13
  541. package/dist/stores/file/adoption/marker.js +9 -17
  542. package/dist/stores/file/checkpoint-store.d.ts +24 -0
  543. package/dist/stores/file/checkpoint-store.js +45 -7
  544. package/dist/stores/file/file-history-store.d.ts +20 -19
  545. package/dist/stores/file/file-history-store.js +157 -141
  546. package/dist/stores/file/fs-atomic.d.ts +15 -0
  547. package/dist/stores/file/fs-atomic.js +89 -14
  548. package/dist/stores/file/index.d.ts +1 -1
  549. package/dist/stores/file/index.js +2 -1
  550. package/dist/stores/file/mailbox-store.d.ts +3 -0
  551. package/dist/stores/file/mailbox-store.js +3 -1
  552. package/dist/stores/file/permission-rule-adopt.d.ts +1 -1
  553. package/dist/stores/file/permission-rule-adopt.js +18 -18
  554. package/dist/stores/file/permission-rule-store.d.ts +18 -2
  555. package/dist/stores/file/permission-rule-store.js +31 -18
  556. package/dist/stores/file/session-policy-store.d.ts +3 -3
  557. package/dist/stores/file/session-store.d.ts +54 -16
  558. package/dist/stores/file/session-store.js +114 -85
  559. package/dist/stores/file/workflow-journal-store.d.ts +10 -4
  560. package/dist/stores/file/workflow-journal-store.js +28 -13
  561. package/dist/tools/artifact/artifact-text.d.ts +1 -1
  562. package/dist/tools/artifact/artifact-tool.js +5 -3
  563. package/dist/tools/fs/bash-program-position.d.ts +19 -2
  564. package/dist/tools/fs/bash-program-position.js +56 -9
  565. package/dist/tools/fs/bash-readonly-classifier.d.ts +3 -3
  566. package/dist/tools/fs/fs-bash.d.ts +2 -2
  567. package/dist/tools/fs/fs-bash.js +8 -6
  568. package/dist/tools/fs/fs-glob.d.ts +86 -0
  569. package/dist/tools/fs/fs-glob.js +226 -0
  570. package/dist/tools/fs/fs-read.js +14 -14
  571. package/dist/tools/fs/fs-search-tools.js +7 -7
  572. package/dist/tools/fs/fs-shared.d.ts +8 -8
  573. package/dist/tools/fs/gh-rate-limit.d.ts +1 -1
  574. package/dist/tools/fs/notebook.d.ts +2 -2
  575. package/dist/tools/fs/pattern-kill-guard.d.ts +22 -0
  576. package/dist/tools/fs/pattern-kill-guard.js +397 -0
  577. package/dist/tools/fs/pdf.d.ts +9 -6
  578. package/dist/tools/fs/pdf.js +3 -3
  579. package/dist/tools/fs/program-read-model.d.ts +57 -7
  580. package/dist/tools/fs/program-read-model.js +11 -1
  581. package/dist/tools/fs/program-read-model.rows.js +78 -21
  582. package/dist/tools/fs/read-deny-home.js +3 -2
  583. package/dist/tools/fs/read-deny.d.ts +29 -7
  584. package/dist/tools/fs/read-deny.js +63 -22
  585. package/dist/tools/fs/removal-targets.d.ts +18 -8
  586. package/dist/tools/fs/removal-targets.js +47 -20
  587. package/dist/tools/fs/safety.d.ts +9 -9
  588. package/dist/tools/fs/search.d.ts +16 -6
  589. package/dist/tools/fs/search.js +20 -26
  590. package/dist/tools/fs/shell-read-argv.js +89 -12
  591. package/dist/tools/fs/shell-read-bindings.d.ts +31 -0
  592. package/dist/tools/fs/shell-read-bindings.js +41 -0
  593. package/dist/tools/fs/shell-read-check.js +12 -20
  594. package/dist/tools/fs/shell-read-environment.d.ts +5 -1
  595. package/dist/tools/fs/shell-read-environment.js +3 -2
  596. package/dist/tools/fs/shell-read-establish.d.ts +15 -0
  597. package/dist/tools/fs/shell-read-establish.js +19 -20
  598. package/dist/tools/fs/shell-read-judge.d.ts +4 -0
  599. package/dist/tools/fs/shell-read-judge.js +5 -2
  600. package/dist/tools/fs/shell-read-plan.js +24 -16
  601. package/dist/tools/fs/shell-read-start.d.ts +6 -1
  602. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -1
  603. package/dist/tools/fs/shell-read-write-targets.js +2 -3
  604. package/dist/tools/fs/shell-reentry-text.d.ts +9 -0
  605. package/dist/tools/fs/shell-reentry-text.js +40 -2
  606. package/dist/tools/loop-tick.d.ts +2 -2
  607. package/dist/tools/scheduler-tools.js +5 -1
  608. package/dist/tools/task-list.d.ts +7 -7
  609. package/dist/tools/task-list.js +5 -1
  610. package/dist/tools/todo.js +65 -64
  611. package/dist/tools/web.d.ts +20 -15
  612. package/dist/tools/web.js +55 -69
  613. package/dist/tools/worktree.d.ts +3 -3
  614. package/dist/tools/worktree.js +3 -1
  615. package/package.json +1 -1
  616. package/test/export-surface.snapshot.json +5894 -5638
  617. package/wire-changes/core@7.55.0.json +3318 -0
  618. package/wire-changes/core@7.56.0.json +3891 -0
  619. package/wire-changes/mods-kernel@7.56.0.json +303 -0
  620. package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +0 -39
  621. package/dist/core/store-contracts/session-store-incarnation-contract.js +0 -95
@@ -4,11 +4,12 @@ import { DEGENERATE_MESSAGE, trimDegenerateTail } from "./repetition.js";
4
4
  import { STREAM_TORN_WARNING, createRepetitionPoll, modelOutputInvalidOf, noteResponseModel, nameMissingCause, parseStreamedToolArgs, placeTurnNotes } from "./stream-shared.js";
5
5
  import { admitToolCallId, providerResultIds, providerToolCallId, responseToolCallIds } from "./tool-call-id.js";
6
6
  import { emitBrainTelemetry } from "./status-sink.js";
7
- import { errorResultMediaNote, IMAGE_OMITTED_NO_VISION, imagesOmittedNoVisionNote, modelSupportsVision, sendableImages } from "./media-degrade.js";
7
+ import { errorResultMediaNote, IMAGE_OMITTED_NO_VISION, imageWithholdOf, imagesOmittedNoVisionNote, reportImagesWithheld, sendableImages } from "./media-degrade.js";
8
8
  import { OUTPUT_CAP_KEYS, RESPONSES_RESERVED, applyExtraBody, effectiveOutputCap, headerBagOnce, lockHeader, mergeHeaders } from "./request-params.js";
9
9
  import { admitRouteRequest, applyRouteCredentialHeaders, assertServableRequestRoot, brainConfigSnapshot, createBrainRouteJudge, joinRequestUrl, resolveRequestRootOf, resolveRouteCredential } from "./route-adjudicator.js";
10
10
  import { requestRouteOf } from "./request-route.js";
11
- import { declaredOffSpelling, mintEffortWireValue, reasoningRequestCarried } from "./reasoning.js";
11
+ import { NAMES_AS_WRITTEN, resolveProviderDialect, endpointToolNames } from "./provider-dialect.js";
12
+ import { applyReasoningToRequest } from "./reasoning-request.js";
12
13
  import { runStreamingBrain } from "./stream-engine.js";
13
14
  import { refuseRetiredTimeoutKnobs } from "./timeout.js";
14
15
  import { resolveFetch } from "./transport.js";
@@ -17,9 +18,6 @@ const DEGENERATE_POLL_CHARS = 64;
17
18
  const MALFORMED_SAMPLE_CHARS = 160;
18
19
  const MALFORMED_ARGS_CHARS = 200;
19
20
  const CAPABILITY_DIAGNOSTIC_TYPE = "responses_capability";
20
- function responsesCompat(model) {
21
- return (model.compat ?? {});
22
- }
23
21
  const NO_CONTENT = "(no content)";
24
22
  const DOCUMENT_OMITTED = "[PDF document omitted: PDF direct read requires an Anthropic-family model; re-Read the file (the engine will extract text/render pages when possible) or extract the text via Bash instead (e.g. `pdftotext`).]";
25
23
  function textOf(content) {
@@ -37,16 +35,17 @@ function functionCallOutputText(text, hasCarriedImages, original) {
37
35
  return "(image attached below)";
38
36
  return Array.isArray(original) && original.length > 0 ? "(non-text tool result omitted)" : "";
39
37
  }
40
- function toUserParts(content, supportsVision) {
38
+ function toUserParts(content, withhold) {
41
39
  if (typeof content === "string") {
42
40
  return content === "" ? [] : [{ type: "input_text", text: content }];
43
41
  }
42
+ const supportsVision = withhold === undefined;
44
43
  const nDocs = content.filter((c) => c.type === "document").length;
45
44
  if (nDocs > 0)
46
45
  emitBrainTelemetry({ kind: "document_placeholder", count: nDocs });
47
46
  const images = content.filter((c) => c.type === "image" && c.data !== undefined && c.mimeType !== undefined);
48
- if (!supportsVision && images.length > 0)
49
- emitBrainTelemetry({ kind: "vision_placeholder", count: images.length });
47
+ if (withhold !== undefined)
48
+ reportImagesWithheld(withhold, images.length);
50
49
  const parts = [];
51
50
  for (const c of content) {
52
51
  if (c.type === "text" && typeof c.text === "string" && c.text.length > 0) {
@@ -64,8 +63,9 @@ function toUserParts(content, supportsVision) {
64
63
  parts.push({ type: "input_text", text: imagesOmittedNoVisionNote(images.length) });
65
64
  return parts;
66
65
  }
67
- function toResponsesInput(ctx, model, replayReasoning) {
68
- const supportsVision = modelSupportsVision(model);
66
+ function toResponsesInput(ctx, model, replayReasoning, toolNames) {
67
+ const imageWithhold = imageWithholdOf(model);
68
+ const supportsVision = imageWithhold === undefined;
69
69
  const out = [];
70
70
  let pendingImages = [];
71
71
  const flushImages = () => {
@@ -87,7 +87,7 @@ function toResponsesInput(ctx, model, replayReasoning) {
87
87
  if (m.role !== "toolResult")
88
88
  flushImages();
89
89
  if (m.role === "user") {
90
- const parts = toUserParts(m.content, supportsVision);
90
+ const parts = toUserParts(m.content, imageWithhold);
91
91
  out.push({
92
92
  type: "message",
93
93
  role: "user",
@@ -116,15 +116,15 @@ function toResponsesInput(ctx, model, replayReasoning) {
116
116
  if (text !== "")
117
117
  out.push({ type: "message", role: "assistant", content: [{ type: "output_text", text }] });
118
118
  for (const tc of toolCalls) {
119
- out.push({ type: "function_call", call_id: providerToolCallId(tc), name: tc.name, arguments: JSON.stringify(tc.arguments ?? {}) });
119
+ out.push({ type: "function_call", call_id: providerToolCallId(tc), name: toolNames.sent(tc.name), arguments: JSON.stringify(tc.arguments ?? {}) });
120
120
  }
121
121
  }
122
122
  else if (m.role === "toolResult") {
123
123
  const mediaImages = sendableImages(Array.isArray(m.content) ? m.content : []);
124
124
  const rawImages = m.isError ? [] : mediaImages;
125
125
  const images = supportsVision ? rawImages : [];
126
- if (!supportsVision && rawImages.length > 0)
127
- emitBrainTelemetry({ kind: "vision_placeholder", count: rawImages.length });
126
+ if (imageWithhold !== undefined)
127
+ reportImagesWithheld(imageWithhold, rawImages.length);
128
128
  const nDocs = Array.isArray(m.content) ? m.content.filter((c) => c.type === "document").length : 0;
129
129
  if (nDocs > 0)
130
130
  emitBrainTelemetry({ kind: "document_placeholder", count: nDocs });
@@ -145,27 +145,17 @@ function toResponsesInput(ctx, model, replayReasoning) {
145
145
  flushImages();
146
146
  return out;
147
147
  }
148
- function toResponsesTools(ctx) {
148
+ function toResponsesTools(ctx, toolNames) {
149
149
  if (!ctx.tools || ctx.tools.length === 0)
150
150
  return undefined;
151
151
  return ctx.tools.map((t) => ({
152
152
  type: "function",
153
- name: t.name,
153
+ name: toolNames.sent(t.name),
154
154
  description: t.description,
155
155
  parameters: t.parameters,
156
156
  strict: false,
157
157
  }));
158
158
  }
159
- function resolveWireEffort(model, reasoning) {
160
- if (model.reasoning && reasoning === "off")
161
- return declaredOffSpelling(model);
162
- const compat = responsesCompat(model);
163
- if (compat.supportsReasoningEffort === false)
164
- return undefined;
165
- if (!reasoningRequestCarried(model, reasoning))
166
- return undefined;
167
- return mintEffortWireValue(reasoning, model, compat.reasoningEffortLevels).wireValue;
168
- }
169
159
  function computeUsage(model, raw) {
170
160
  const input = raw?.input_tokens ?? 0;
171
161
  const output = raw?.output_tokens ?? 0;
@@ -231,6 +221,7 @@ export function createOpenResponsesBrain(given = {}) {
231
221
  let sentEffort;
232
222
  let builtMaxTokens;
233
223
  let builtMaxTokensLane = "unset";
224
+ let sentToolNames = NAMES_AS_WRITTEN;
234
225
  return runStreamingBrain({
235
226
  model,
236
227
  doFetch,
@@ -245,6 +236,8 @@ export function createOpenResponsesBrain(given = {}) {
245
236
  if (!root) {
246
237
  throw new Error("createOpenResponsesBrain: no baseUrl configured (set config.baseUrl or model.baseUrl)");
247
238
  }
239
+ const url = joinRequestUrl(root, "/responses");
240
+ const builtToolNames = endpointToolNames(resolveProviderDialect(url, model.api), model.api, (context.tools ?? []).map((t) => t.name));
248
241
  const modelHeaders = headerBagOnce(model.headers);
249
242
  const optionsHeaders = headerBagOnce(options?.headers);
250
243
  const routeCredential = resolveRouteCredential({
@@ -262,15 +255,14 @@ export function createOpenResponsesBrain(given = {}) {
262
255
  "remove it, or serve this model through the chat-completions lane, which does support it");
263
256
  }
264
257
  const requestedMaxTokens = overrides?.maxOutputTokens ?? options?.maxTokens ?? model.maxTokens;
265
- const effort = resolveWireEffort(model, options?.reasoning);
266
258
  const body = {
267
259
  model: model.id,
268
- input: toResponsesInput(context, model, config.replayReasoning !== false),
260
+ input: toResponsesInput(context, model, config.replayReasoning !== false, builtToolNames),
269
261
  stream: true,
270
262
  };
271
263
  if (context.systemPrompt)
272
264
  body.instructions = context.systemPrompt;
273
- const tools = toResponsesTools(context);
265
+ const tools = toResponsesTools(context, builtToolNames);
274
266
  if (tools)
275
267
  body.tools = tools;
276
268
  if (options?.temperature !== undefined)
@@ -286,16 +278,15 @@ export function createOpenResponsesBrain(given = {}) {
286
278
  builtMaxTokens = undefined;
287
279
  builtMaxTokensLane = "unset";
288
280
  }
289
- if (effort !== undefined)
290
- body.reasoning = { effort };
281
+ const { body: reasoningBody, effort } = applyReasoningToRequest({ api: "openai-responses", model, level: options?.reasoning, body });
291
282
  const headers = mergeHeaders(modelHeaders, config.headers, optionsHeaders);
292
283
  applyRouteCredentialHeaders(headers, routeCredential);
293
284
  lockHeader(headers, "content-type", "application/json");
294
285
  if (apiKey)
295
286
  lockHeader(headers, OPEN_RESPONSES_KEY_HEADER, `Bearer ${apiKey}`);
296
- const { body: wire, dropped: extraBodyDropped } = applyExtraBody(body, model.extraBody, RESPONSES_RESERVED);
287
+ const { body: wire, dropped: extraBodyDropped } = applyExtraBody(reasoningBody, model, RESPONSES_RESERVED);
297
288
  return {
298
- url: joinRequestUrl(root, "/responses"),
289
+ url,
299
290
  headers,
300
291
  body: JSON.stringify(wire),
301
292
  extraBodyDropped,
@@ -307,6 +298,7 @@ export function createOpenResponsesBrain(given = {}) {
307
298
  sentMaxTokens = builtMaxTokens;
308
299
  sentMaxTokensLane = builtMaxTokensLane;
309
300
  sentEffort = effort;
301
+ sentToolNames = builtToolNames;
310
302
  },
311
303
  };
312
304
  },
@@ -457,7 +449,7 @@ export function createOpenResponsesBrain(given = {}) {
457
449
  else if (itemType === "function_call") {
458
450
  const acc = openItem(index, "function_call", itemId);
459
451
  acc.callId = frame.item?.call_id ?? "";
460
- acc.name = frame.item?.name ?? "";
452
+ acc.name = sentToolNames.called(frame.item?.name ?? "");
461
453
  if (frame.item?.arguments)
462
454
  acc.args += frame.item.arguments;
463
455
  }
@@ -546,7 +538,7 @@ export function createOpenResponsesBrain(given = {}) {
546
538
  if (!acc.callId && frame.item?.call_id)
547
539
  acc.callId = frame.item.call_id;
548
540
  if (!acc.name && frame.item?.name)
549
- acc.name = frame.item.name;
541
+ acc.name = sentToolNames.called(frame.item.name);
550
542
  if (acc.args === "" && frame.item?.arguments)
551
543
  acc.args = frame.item.arguments;
552
544
  }
@@ -4,13 +4,14 @@ import { DEGENERATE_MESSAGE, trimDegenerateTail } from "./repetition.js";
4
4
  import { STREAM_TORN_WARNING, createRepetitionPoll, createStreamEndLedger, echoFoldedWord, modelOutputInvalidOf, noteResponseModel, nameMissingCause, parseStreamedToolArgs, placeTurnNotes, truncationCauseClause } from "./stream-shared.js";
5
5
  import { admitToolCallId, providerResultIds, providerToolCallId, responseToolCallIds } from "./tool-call-id.js";
6
6
  import { emitBrainTelemetry } from "./status-sink.js";
7
- import { errorResultMediaNote, IMAGE_OMITTED_NO_VISION, imagesOmittedNoVisionNote, modelSupportsVision, sendableImages } from "./media-degrade.js";
7
+ import { errorResultMediaNote, IMAGE_OMITTED_NO_VISION, imageWithholdOf, imagesOmittedNoVisionNote, reportImagesWithheld, sendableImages } from "./media-degrade.js";
8
+ import { capabilityHeld } from "./model-capability.js";
8
9
  import { OPENAI_RESERVED, OUTPUT_CAP_KEYS, applyExtraBody, effectiveOutputCap, headerBagOnce, lockHeader, mergeHeaders } from "./request-params.js";
9
10
  import { BrainError, providerErrorWord } from "./errors.js";
10
- import { inBandProviderError } from "./provider-dialect.js";
11
+ import { NAMES_AS_WRITTEN, inBandProviderError, resolveProviderDialect, endpointToolNames } from "./provider-dialect.js";
11
12
  import { admitRouteRequest, applyRouteCredentialHeaders, assertServableRequestRoot, brainConfigSnapshot, createBrainRouteJudge, joinRequestUrl, resolveRequestRootOf, resolveRouteCredential } from "./route-adjudicator.js";
12
13
  import { requestRouteOf } from "./request-route.js";
13
- import { declaredOffSpelling, mintEffortWireValue, reasoningRequestCarried } from "./reasoning.js";
14
+ import { applyReasoningToRequest } from "./reasoning-request.js";
14
15
  import { runStreamingBrain } from "./stream-engine.js";
15
16
  import { refuseRetiredTimeoutKnobs } from "./timeout.js";
16
17
  import { resolveFetch } from "./transport.js";
@@ -38,7 +39,7 @@ function textOf(content) {
38
39
  }
39
40
  const NO_CONTENT = "(no content)";
40
41
  const DOCUMENT_OMITTED = "[PDF document omitted: PDF direct read requires an Anthropic-family model; re-Read the file (the engine will extract text/render pages when possible) or extract the text via Bash instead (e.g. `pdftotext`).]";
41
- function toUserContent(content, supportsVision = true) {
42
+ function toUserContent(content, withhold) {
42
43
  if (typeof content === "string") {
43
44
  return content;
44
45
  }
@@ -52,9 +53,9 @@ function toUserContent(content, supportsVision = true) {
52
53
  return base;
53
54
  return base ? `${base}\n${DOCUMENT_OMITTED}` : DOCUMENT_OMITTED;
54
55
  }
55
- if (!supportsVision) {
56
+ if (withhold !== undefined) {
56
57
  const n = content.filter((c) => c.type === "image").length;
57
- emitBrainTelemetry({ kind: "vision_placeholder", count: n });
58
+ reportImagesWithheld(withhold, n);
58
59
  const base = textOf(content);
59
60
  const note = imagesOmittedNoVisionNote(n);
60
61
  const withNote = base ? `${base}\n${note}` : note;
@@ -80,85 +81,11 @@ function toUserContent(content, supportsVision = true) {
80
81
  function thinkingCompat(model) {
81
82
  return (model.compat ?? {});
82
83
  }
83
- function applyThinking(body, model, reasoning) {
84
- if (model.reasoning && reasoning === "off") {
85
- const offCompat = thinkingCompat(model);
86
- const offFormat = offCompat.thinkingFormat ?? "openai";
87
- switch (offFormat) {
88
- case "qwen":
89
- case "zai":
90
- body.enable_thinking = false;
91
- break;
92
- case "qwen-chat-template": {
93
- const k = (typeof body.chat_template_kwargs === "object" && body.chat_template_kwargs) || {};
94
- body.chat_template_kwargs = { ...k, enable_thinking: false };
95
- break;
96
- }
97
- case "deepseek":
98
- body.thinking = { type: "disabled" };
99
- break;
100
- case "openrouter":
101
- case "together":
102
- body.reasoning = { enabled: false };
103
- break;
104
- case "openai": {
105
- const offSpelling = declaredOffSpelling(model);
106
- if (offSpelling !== undefined)
107
- body.reasoning_effort = offSpelling;
108
- break;
109
- }
110
- default: {
111
- const _exhaustive = offFormat;
112
- void _exhaustive;
113
- break;
114
- }
115
- }
116
- return;
117
- }
118
- if (!reasoningRequestCarried(model, reasoning))
119
- return;
120
- const compat = thinkingCompat(model);
121
- const supportsEffort = compat.supportsReasoningEffort ?? true;
122
- const effortWire = mintEffortWireValue(reasoning, model, compat.reasoningEffortLevels).wireValue;
123
- const format = compat.thinkingFormat ?? "openai";
124
- switch (format) {
125
- case "openai":
126
- if (supportsEffort && effortWire !== undefined)
127
- body.reasoning_effort = effortWire;
128
- break;
129
- case "openrouter":
130
- body.reasoning = { effort: effortWire };
131
- break;
132
- case "deepseek":
133
- body.thinking = { type: "enabled" };
134
- if (supportsEffort && effortWire !== undefined)
135
- body.reasoning_effort = effortWire;
136
- break;
137
- case "together":
138
- body.reasoning = { enabled: true };
139
- if (supportsEffort && effortWire !== undefined)
140
- body.reasoning_effort = effortWire;
141
- break;
142
- case "qwen":
143
- case "zai":
144
- body.enable_thinking = true;
145
- break;
146
- case "qwen-chat-template": {
147
- const k = (typeof body.chat_template_kwargs === "object" && body.chat_template_kwargs) || {};
148
- body.chat_template_kwargs = { ...k, enable_thinking: true };
149
- break;
150
- }
151
- default: {
152
- const _exhaustive = format;
153
- void _exhaustive;
154
- break;
155
- }
156
- }
157
- }
158
- function toOpenAIMessages(ctx, replayThinking = true, model) {
159
- const supportsVision = modelSupportsVision(model);
84
+ function toOpenAIMessages(ctx, replayThinking = true, model, toolNames) {
85
+ const imageWithhold = imageWithholdOf(model);
86
+ const supportsVision = imageWithhold === undefined;
160
87
  const out = [];
161
- const needsEmptyReasoningField = !!model?.reasoning && thinkingCompat(model).requiresReasoningContentOnAssistantMessages === true;
88
+ const needsEmptyReasoningField = model !== undefined && capabilityHeld(model, "reasoning") && thinkingCompat(model).requiresReasoningContentOnAssistantMessages === true;
162
89
  if (ctx.systemPrompt) {
163
90
  out.push({ role: "system", content: ctx.systemPrompt });
164
91
  }
@@ -181,7 +108,7 @@ function toOpenAIMessages(ctx, replayThinking = true, model) {
181
108
  if (m.role !== "toolResult")
182
109
  flushImages();
183
110
  if (m.role === "user") {
184
- const uc = toUserContent(m.content, supportsVision);
111
+ const uc = toUserContent(m.content, imageWithhold);
185
112
  const empty = uc === "" || (Array.isArray(uc) && uc.length === 0);
186
113
  out.push({ role: "user", content: empty ? NO_CONTENT : uc });
187
114
  }
@@ -206,7 +133,7 @@ function toOpenAIMessages(ctx, replayThinking = true, model) {
206
133
  msg.tool_calls = toolCalls.map((tc) => ({
207
134
  id: providerToolCallId(tc),
208
135
  type: "function",
209
- function: { name: tc.name, arguments: JSON.stringify(tc.arguments ?? {}) },
136
+ function: { name: toolNames.sent(tc.name), arguments: JSON.stringify(tc.arguments ?? {}) },
210
137
  }));
211
138
  }
212
139
  out.push(msg);
@@ -215,8 +142,8 @@ function toOpenAIMessages(ctx, replayThinking = true, model) {
215
142
  const mediaImages = sendableImages(Array.isArray(m.content) ? m.content : []);
216
143
  const rawImages = m.isError ? [] : mediaImages;
217
144
  const images = supportsVision ? rawImages : [];
218
- if (!supportsVision && rawImages.length > 0)
219
- emitBrainTelemetry({ kind: "vision_placeholder", count: rawImages.length });
145
+ if (imageWithhold !== undefined)
146
+ reportImagesWithheld(imageWithhold, rawImages.length);
220
147
  const nDocs = Array.isArray(m.content) ? m.content.filter((c) => c.type === "document").length : 0;
221
148
  if (nDocs > 0)
222
149
  emitBrainTelemetry({ kind: "document_placeholder", count: nDocs });
@@ -244,13 +171,13 @@ function toolResultText(text, hasCarriedImages, original) {
244
171
  return "(image attached below)";
245
172
  return Array.isArray(original) && original.length > 0 ? "(non-text tool result omitted)" : "";
246
173
  }
247
- function toOpenAITools(ctx) {
174
+ function toOpenAITools(ctx, toolNames) {
248
175
  if (!ctx.tools || ctx.tools.length === 0) {
249
176
  return undefined;
250
177
  }
251
178
  return ctx.tools.map((t) => ({
252
179
  type: "function",
253
- function: { name: t.name, description: t.description, parameters: t.parameters },
180
+ function: { name: toolNames.sent(t.name), description: t.description, parameters: t.parameters },
254
181
  }));
255
182
  }
256
183
  const FINISH_REASON_READINGS = Object.freeze({
@@ -334,6 +261,7 @@ export function createOpenAIBrain(given = {}) {
334
261
  let sentMaxTokensLane = "unset";
335
262
  let builtMaxTokens;
336
263
  let builtMaxTokensLane = "unset";
264
+ let sentToolNames = NAMES_AS_WRITTEN;
337
265
  return runStreamingBrain({
338
266
  model,
339
267
  doFetch,
@@ -348,6 +276,8 @@ export function createOpenAIBrain(given = {}) {
348
276
  if (!root) {
349
277
  throw new Error("createOpenAIBrain: no baseUrl configured (set config.baseUrl or model.baseUrl)");
350
278
  }
279
+ const url = joinRequestUrl(root, "/chat/completions");
280
+ const builtToolNames = endpointToolNames(resolveProviderDialect(url, model.api), model.api, (context.tools ?? []).map((t) => t.name));
351
281
  const modelHeaders = headerBagOnce(model.headers);
352
282
  const optionsHeaders = headerBagOnce(options?.headers);
353
283
  const routeCredential = resolveRouteCredential({
@@ -362,11 +292,11 @@ export function createOpenAIBrain(given = {}) {
362
292
  const apiKey = routeCredential.apiKey;
363
293
  const body = {
364
294
  model: model.id,
365
- messages: toOpenAIMessages(context, config.replayThinking, model),
295
+ messages: toOpenAIMessages(context, config.replayThinking, model, builtToolNames),
366
296
  stream: true,
367
297
  stream_options: { include_usage: true },
368
298
  };
369
- const tools = toOpenAITools(context);
299
+ const tools = toOpenAITools(context, builtToolNames);
370
300
  if (tools)
371
301
  body.tools = tools;
372
302
  if (options?.temperature !== undefined)
@@ -387,15 +317,15 @@ export function createOpenAIBrain(given = {}) {
387
317
  }
388
318
  if (options?.stop)
389
319
  body.stop = options.stop;
390
- applyThinking(body, model, options?.reasoning);
320
+ const { body: reasoningBody } = applyReasoningToRequest({ api: "openai-completions", model, level: options?.reasoning, body });
391
321
  const headers = mergeHeaders(modelHeaders, config.headers, optionsHeaders);
392
322
  applyRouteCredentialHeaders(headers, routeCredential);
393
323
  lockHeader(headers, "content-type", "application/json");
394
324
  if (apiKey)
395
325
  lockHeader(headers, OPENAI_KEY_HEADER, `Bearer ${apiKey}`);
396
- const { body: wire, dropped: extraBodyDropped } = applyExtraBody(body, model.extraBody, OPENAI_RESERVED);
326
+ const { body: wire, dropped: extraBodyDropped } = applyExtraBody(reasoningBody, model, OPENAI_RESERVED);
397
327
  return {
398
- url: joinRequestUrl(root, "/chat/completions"),
328
+ url,
399
329
  headers,
400
330
  body: JSON.stringify(wire),
401
331
  extraBodyDropped,
@@ -406,6 +336,7 @@ export function createOpenAIBrain(given = {}) {
406
336
  routeAdmission();
407
337
  sentMaxTokens = builtMaxTokens;
408
338
  sentMaxTokensLane = builtMaxTokensLane;
339
+ sentToolNames = builtToolNames;
409
340
  },
410
341
  };
411
342
  },
@@ -577,7 +508,7 @@ export function createOpenAIBrain(given = {}) {
577
508
  if (tc.id)
578
509
  acc.id = tc.id;
579
510
  if (tc.function?.name)
580
- acc.name = tc.function.name;
511
+ acc.name = sentToolNames.called(tc.function.name);
581
512
  if (tc.function?.arguments && !acc.closedTc)
582
513
  acc.args += tc.function.arguments;
583
514
  toolAccum.set(idx, acc);
@@ -619,7 +550,7 @@ export function createOpenAIBrain(given = {}) {
619
550
  }
620
551
  }
621
552
  if (config.repairTextToolCalls && toolCalls.length === 0 && textFace && context.tools && context.tools.length > 0) {
622
- const names = new Set(context.tools.flatMap((t) => [t.name, ...(t.aliases ?? [])]));
553
+ const names = new Set(context.tools.flatMap((t) => [t.name, sentToolNames.sent(t.name), ...(t.aliases ?? [])]));
623
554
  const repaired = repairTextToolCalls(textFace, names);
624
555
  if (repaired.toolCalls.length > 0) {
625
556
  finalContent.length = 0;
@@ -627,7 +558,8 @@ export function createOpenAIBrain(given = {}) {
627
558
  finalContent.push({ type: "thinking", thinking: accumReasoning });
628
559
  if (repaired.cleanedText)
629
560
  finalContent.push({ type: "text", text: repaired.cleanedText });
630
- for (const tc of repaired.toolCalls) {
561
+ for (const repairedCall of repaired.toolCalls) {
562
+ const tc = { ...repairedCall, name: sentToolNames.called(repairedCall.name) };
631
563
  finalContent.push(tc);
632
564
  toolCalls.push(tc);
633
565
  }
@@ -1,6 +1,7 @@
1
1
  /**
2
- * The provider dialect table — what each provider endpoint MEANS by the way it fails, declared once per
3
- * endpoint and read by every seat that reports a provider failure.
2
+ * The provider dialect table — what each provider endpoint MEANS by the way it fails and by the tool names it is
3
+ * sent, declared once per endpoint and read by every seat that reports a provider failure or names a tool on the
4
+ * wire.
4
5
  *
5
6
  * KEY. An endpoint is named by (wire family, host suffix + path): the same brand can serve two endpoints whose
6
7
  * failures read in opposite ways (Moonshot's open platform states an exhausted balance as a 429, its coding
@@ -14,7 +15,9 @@
14
15
  * column: rows that turn a status, the envelope's word (`error.code`, else `error.type` — the same word
15
16
  * `apiErrorCode` carries) and the envelope's sentence (`error.message`) into one {@link ProviderCondition}. The
16
17
  * context-limit refusal is a flag on the same rows (`inputTooLong`), so "this 400 is the input being too long"
17
- * and "this 400 is something else the provider named" are read off one row and cannot disagree.
18
+ * and "this 400 is something else the provider named" are read off one row and cannot disagree. `toolNames` is
19
+ * the tool-name column: names the endpoint gives a meaning of its own on one wire ({@link ToolNameRow}), read by
20
+ * {@link endpointToolNames} — the one projection every brain sends tool names through and reads call names back by.
18
21
  *
19
22
  * ONE VERDICT, TWO SEATS. {@link judgeHttpFailure} answers once per failed response; the retry decision, the
20
23
  * retry frame (`BrainStatus.providerCondition`) and the terminal (`BrainError` → `AssistantMessage` →
@@ -142,11 +145,24 @@ export interface DialectKey {
142
145
  /** A path prefix, matched at a segment boundary. Absent = every path on the host. */
143
146
  readonly path?: string;
144
147
  }
148
+ /**
149
+ * One row of the tool-name column. On `wire`, the endpoint treats a tool sent under `name` as a feature of its own
150
+ * rather than as the tool the request declares, so a tool by that name travels as `sentAs` instead, and a call the
151
+ * model makes to `sentAs` is a call to `name`. The name inside the engine, the prompts that mention it and the
152
+ * tool's parameters do not change; only the spelling on this wire does.
153
+ */
154
+ export interface ToolNameRow {
155
+ readonly wire: Model["api"];
156
+ readonly name: string;
157
+ readonly sentAs: string;
158
+ }
145
159
  /** One endpoint's declared dialect: its key and its columns. */
146
160
  export interface ProviderDialect {
147
161
  readonly name: string;
148
162
  readonly key: DialectKey;
149
163
  readonly failures: readonly FailureRow[];
164
+ /** Absent = the endpoint gives no tool name a meaning of its own: every name travels as written. */
165
+ readonly toolNames?: readonly ToolNameRow[];
150
166
  }
151
167
  /**
152
168
  * The declared dialects. Each row's source is the provider's own error documentation as collected in the
@@ -172,6 +188,26 @@ export declare const GENERIC_FAILURES: readonly FailureRow[];
172
188
  export declare function isTransientStatus(status: number): boolean;
173
189
  /** The endpoint a request went to, or `undefined` when no dialect declares it. */
174
190
  export declare function resolveProviderDialect(url: string, wire: Model["api"]): ProviderDialect | undefined;
191
+ /**
192
+ * How one request's tool names travel. Both halves read the one set the request declares: `sent` spells a declared
193
+ * tool's name, in the tool table and in every replayed call to it; `called` reads a call name the model sends back as
194
+ * the declared tool that travels under it. A name the request does not declare travels and comes back as written —
195
+ * a replayed call to a tool no longer mounted keeps its name, and a model that calls a tool by the name the prompts
196
+ * use still reaches it. A brain builds one with each request and keeps the one the engine commits; its parser reads
197
+ * call names through it.
198
+ */
199
+ export interface EndpointToolNames {
200
+ readonly sent: (name: string) => string;
201
+ readonly called: (sentName: string) => string;
202
+ }
203
+ /** Every name travels as written: the projection of an endpoint whose dialect has no tool-name row on the wire. */
204
+ export declare const NAMES_AS_WRITTEN: EndpointToolNames;
205
+ /**
206
+ * The tool-name projection of one request: the dialect's rows for this wire, applied to the tools the request
207
+ * declares. Two declared tools that would travel under one name are refused before anything is sent — the model
208
+ * could not tell them apart, and neither could the call that comes back.
209
+ */
210
+ export declare function endpointToolNames(dialect: ProviderDialect | undefined, wire: Model["api"], declared: readonly string[]): EndpointToolNames;
175
211
  /** One failure's reading off the table. */
176
212
  export interface ProviderVerdict {
177
213
  readonly condition: ProviderCondition;
@@ -87,6 +87,7 @@ export const PROVIDER_DIALECTS = Object.freeze([
87
87
  { status: [429], word: ["1311", "1313"], condition: "stop_other" },
88
88
  { status: [400], word: ["1261"], condition: "stop_other", inputTooLong: true },
89
89
  ],
90
+ toolNames: [{ wire: ANTHROPIC, name: "ToolSearch", sentAs: "ToolFinder" }],
90
91
  },
91
92
  {
92
93
  name: "openai",
@@ -120,6 +121,33 @@ export function resolveProviderDialect(url, wire) {
120
121
  d.key.hosts.some((h) => host === h || host.endsWith(`.${h}`)) &&
121
122
  (d.key.path === undefined || path === d.key.path || path.startsWith(`${d.key.path}/`)));
122
123
  }
124
+ export const NAMES_AS_WRITTEN = Object.freeze({ sent: (name) => name, called: (sentName) => sentName });
125
+ export function endpointToolNames(dialect, wire, declared) {
126
+ const rows = (dialect?.toolNames ?? []).filter((r) => r.wire === wire);
127
+ if (rows.length === 0)
128
+ return NAMES_AS_WRITTEN;
129
+ const sentAs = new Map(rows.map((r) => [r.name, r.sentAs]));
130
+ const holderOf = new Map();
131
+ const forward = new Map();
132
+ const back = new Map();
133
+ for (const name of new Set(declared)) {
134
+ const onWire = sentAs.get(name) ?? name;
135
+ const holder = holderOf.get(onWire);
136
+ if (holder !== undefined) {
137
+ const moved = rows.filter((r) => r.sentAs === onWire).map((r) => JSON.stringify(r.name)).join(" / ");
138
+ const asWritten = [holder, name].find((n) => n === onWire);
139
+ throw new BrainError("invalid_request", `the request was not sent: the tools ${JSON.stringify(holder)} and ${JSON.stringify(name)} would both travel as ${JSON.stringify(onWire)}. ` +
140
+ `This endpoint gives the tool name ${moved} a meaning of its own on this wire, so a tool by that name is sent as ${JSON.stringify(onWire)}, ` +
141
+ `and two tools cannot share one name on the wire — rename ${asWritten === undefined ? "one of them" : `the tool named ${JSON.stringify(asWritten)}`}.`);
142
+ }
143
+ holderOf.set(onWire, name);
144
+ if (onWire !== name) {
145
+ forward.set(name, onWire);
146
+ back.set(onWire, name);
147
+ }
148
+ }
149
+ return { sent: (name) => forward.get(name) ?? name, called: (sentName) => back.get(sentName) ?? sentName };
150
+ }
123
151
  function statementOf(err) {
124
152
  if (err === undefined)
125
153
  return undefined;