@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
@@ -3,8 +3,7 @@ import { canonicalize, UNCANONICALIZABLE } from "../core/canonical-json.js";
3
3
  import { SPAWNER_SURFACE_LEG_KINDS } from "../core/tool-face.js";
4
4
  import { ruleSpellingOf } from "../core/permission-rule-syntax.js";
5
5
  import { TOOL_CATALOG_ENTRIES } from "../core/tool-catalog-entries.js";
6
- import { isNamespacedCoveringRuleName, namespacedRuleNameCovers } from "../core/namespaced-rule-name.js";
7
- import { protocolOf } from "../core/protocol-table.js";
6
+ import { isCoveringRuleName, ruleNameCovers, ruleNameReachIntoPeer } from "../core/namespaced-rule-name.js";
8
7
  import { splitNamespacedName } from "../core/tool-name-aliases.js";
9
8
  import { readToolNameList, snapshotToolNameList, valueTypeLabel } from "../core/tool-name-list.js";
10
9
  export function readDeniedEntry(entry) {
@@ -72,23 +71,19 @@ export function persistedToolNameList(entries, side) {
72
71
  function reachOf(entries, side) {
73
72
  const names = new Set();
74
73
  const covering = [];
75
- const wholeProtocols = new Set();
76
74
  for (const entry of entries) {
77
75
  const name = toolNameOfEntry(entry, side);
78
76
  if (name === undefined)
79
77
  continue;
80
- const split = splitNamespacedName(name);
81
- if (split !== undefined && split.tool === undefined && split.peer === "*") {
82
- if (side === "denied")
83
- wholeProtocols.add(split.ns.id);
84
- continue;
85
- }
86
- if (isNamespacedCoveringRuleName(name))
78
+ if (isCoveringRuleName(name, side === "denied" ? "deny" : "allow"))
87
79
  covering.push(name);
88
- else
80
+ else if (!name.includes("*"))
89
81
  names.add(name);
90
82
  }
91
- return { names, covering, wholeProtocols };
83
+ return { names, covering };
84
+ }
85
+ export function namesEveryTool(entry) {
86
+ return toolNameOfEntry(entry, "allowed") === "*";
92
87
  }
93
88
  export function readAllowedToolList(allowTools) {
94
89
  if (allowTools === undefined || allowTools === null)
@@ -96,7 +91,7 @@ export function readAllowedToolList(allowTools) {
96
91
  const list = readToolNameList(allowTools);
97
92
  if (list.kind !== "entries")
98
93
  return reachOf([], "allowed");
99
- if (list.entries.some((entry) => toolNameOfEntry(entry, "allowed") === "*"))
94
+ if (list.entries.some(namesEveryTool))
100
95
  return undefined;
101
96
  return reachOf(list.entries, "allowed");
102
97
  }
@@ -109,13 +104,8 @@ export function listReaches(reach, tool) {
109
104
  if (reach.names.has(spelling))
110
105
  return true;
111
106
  for (const pattern of reach.covering)
112
- if (namespacedRuleNameCovers(pattern, spelling))
107
+ if (ruleNameCovers(pattern, spelling))
113
108
  return true;
114
- if (reach.wholeProtocols.size > 0) {
115
- const ns = protocolOf(spelling);
116
- if (ns !== undefined && reach.wholeProtocols.has(ns.id))
117
- return true;
118
- }
119
109
  }
120
110
  return false;
121
111
  }
@@ -127,21 +117,11 @@ export function protocolToolNames(legs) {
127
117
  return [...new Set(PROTOCOL_ROWS.filter((r) => r.legs.some((l) => legs.includes(l))).map((r) => r.name))];
128
118
  }
129
119
  function reachTouchesPeer(reach, peer) {
130
- if (reach.wholeProtocols.has(peer.ns))
131
- return true;
132
- const inPeer = (spelling) => {
133
- const split = splitNamespacedName(spelling);
134
- return split !== undefined && split.ns.id === peer.ns && split.peer === peer.peer;
135
- };
136
- return [...reach.names].some(inPeer) || reach.covering.some(inPeer);
120
+ const into = (spelling) => ruleNameReachIntoPeer(spelling, peer.ns, peer.peer) !== "none";
121
+ return [...reach.names].some(into) || reach.covering.some(into);
137
122
  }
138
123
  function reachCoversPeer(reach, peer) {
139
- if (reach.wholeProtocols.has(peer.ns))
140
- return true;
141
- return reach.covering.some((pattern) => {
142
- const split = splitNamespacedName(pattern);
143
- return split !== undefined && split.ns.id === peer.ns && split.peer === peer.peer && (split.tool === undefined || split.tool === "*");
144
- });
124
+ return reach.covering.some((pattern) => ruleNameReachIntoPeer(pattern, peer.ns, peer.peer) === "all");
145
125
  }
146
126
  export function isToolSelectorLayer(layer) {
147
127
  return typeof layer === "object" && layer !== null && !Array.isArray(layer);
@@ -166,7 +146,7 @@ export function compileToolSelector(layers, legs = []) {
166
146
  const split = splitNamespacedName(prefix);
167
147
  if (split === undefined)
168
148
  return false;
169
- const peer = { ns: split.ns.id, peer: split.peer };
149
+ const peer = { ns: split.ns, peer: split.peer };
170
150
  return compiled.every((l) => (l.allow === undefined || reachTouchesPeer(l.allow, peer)) && !reachCoversPeer(l.deny, peer));
171
151
  },
172
152
  });
@@ -7,13 +7,13 @@ import type { ModelRef, TaskResult, TaskSpec, TaskStatus, ToolSpec } from "../co
7
7
  * an implementation task and tries to BREAK it — read-only, evidence-required, returning a structured
8
8
  * verdict — then the gate loops fix→re-verify until PASS or a round cap.
9
9
  *
10
- * PROVENANCE (2026-07-14; re-verified and CORRECTED against CC 2.1.220): distilled and de-branded from the
10
+ * PROVENANCE (2026-07-14; re-verified and CORRECTED): distilled and de-branded from the
11
11
  * MIT-era upstream source's dedicated `verification` agent — which was an Anthropic-internal A/B experiment
12
- * (third-party default OFF) and has since been RETIRED upstream: 2.1.207 through 2.1.220 ship NO verification
12
+ * (third-party default OFF) and has since been RETIRED upstream: later releases ship NO verification
13
13
  * agent. The current upstream completion-gate shape is (a) the Stop hook (`decision:"block"` + reason fed
14
14
  * back — sema's Stop hook is at full parity) and (b) — corrected — NOT a bundled skill. There is no built-in
15
15
  * `verify` skill in the 220 corpus. What 220 ships is an INSTRUCTION TO CREATE ONE PER PROJECT: its memory
16
- * prompt (@190146 (cli250.js:38927)) forbids creating project skills ("never create one — a new project skill
16
+ * prompt forbids creating project skills ("never create one — a new project skill
17
17
  * silently shadows a same-named built-in skill") and makes exactly one exception — "The single exception is
18
18
  * verify, because how a project verifies changes is project-specific: put a verify correction in the
19
19
  * `.claude/skills/verify/ SKILL.md` closest to the code it covers … and if that file does not exist, create
@@ -338,8 +338,9 @@ export interface DeveloperTaskConfig extends VerifyConfig {
338
338
  verify?: boolean;
339
339
  }
340
340
  /**
341
- * One-stop developer-mode convenience: applies {@link CODE_AGENT_PROMPT} (unless the task supplies its
342
- * own `systemPrompt`) and, by default, runs the {@link runWithVerification} gate. Equivalent to wiring
341
+ * One-stop developer-mode convenience: gives the task the catalog's coding role base by word (`promptRole: "code"`, on
342
+ * the task's own seat, so no role preset overtakes it) unless the task names a role base of its own (`promptRole` or
343
+ * `systemPrompt`), and, by default, runs the {@link runWithVerification} gate. Equivalent to wiring
343
344
  * the building blocks by hand — use the building blocks directly when you want full control.
344
345
  *
345
346
  * Pair with a role map that gives a strong implementation model and cheaper helper/verifier models for
@@ -1,5 +1,5 @@
1
1
  import { Type } from "typebox";
2
- import { CODE_AGENT_PROMPT } from "../prompts/default.js";
2
+ import { namesRoleBase } from "../prompt-assembly/role-base.js";
3
3
  import { releaseSession } from "./session-util.js";
4
4
  import { childClampSeats, clampSourceOf, engineHeadlessLegSeats } from "../core/child-clamp-seats.js";
5
5
  import { mapNestedSuspend, isDurablePause, pauseFamily } from "./suspend-guard.js";
@@ -179,7 +179,7 @@ export async function verifyCompleted(runner, result, specBase, objective, confi
179
179
  ? { restoreGatedTools: Array.isArray(specBase.restoreGatedTools) ? [...specBase.restoreGatedTools] : specBase.restoreGatedTools }
180
180
  : {}),
181
181
  ...(specBase.clientContext !== undefined ? { clientContext: { ...specBase.clientContext } } : {}),
182
- ...(specBase.promptProfile !== undefined ? { promptProfile: specBase.promptProfile } : {}),
182
+ ...(specBase.promptLean !== undefined ? { promptLean: specBase.promptLean } : {}),
183
183
  signal: specBase.signal,
184
184
  };
185
185
  const v = await runner.runTask(verifierSpec, withLegIdentity(legInternals(), { kind: "verifier", round }));
@@ -297,7 +297,7 @@ export async function resumeWithVerification(runner, token, outcome, taskConfig,
297
297
  return verifyCompleted(runner, result, taskConfig, objective, config, internals);
298
298
  }
299
299
  export async function runDeveloperTask(runner, spec, config = {}, internals) {
300
- const implSpec = { systemPrompt: CODE_AGENT_PROMPT, ...spec };
300
+ const implSpec = namesRoleBase(spec) ? spec : { ...spec, promptRole: "code" };
301
301
  if (config.verify === false) {
302
302
  const result = await runner.runTask(implSpec, withLegIdentity(internals, IMPL_LEG));
303
303
  return { ...result, verification: { verdict: "unverified", unverifiedReason: "opted_out", rounds: 0, findings: [] } };
@@ -5,20 +5,15 @@ import { DEGENERATE_MESSAGE, trimDegenerateTail } from "./repetition.js";
5
5
  import { STREAM_TORN_WARNING, createRepetitionPoll, createStreamEndLedger, modelOutputInvalidOf, noteResponseModel, nameMissingCause, parseStreamedToolArgs, placeTurnNotes, truncationCauseClause } from "./stream-shared.js";
6
6
  import { admitToolCallId, providerResultIds, providerToolCallId, responseToolCallIds } from "./tool-call-id.js";
7
7
  import { emitBrainTelemetry, reportReasoningWireFacts } from "./status-sink.js";
8
- import { errorResultMediaNote, IMAGE_OMITTED_NO_VISION, modelSupportsVision, sendableImages } from "./media-degrade.js";
9
- import { ANTHROPIC_RESERVED, OUTPUT_CAP_KEYS, applyExtraBody, effectiveOutputCap, headerBagOnce, lockHeader, mergeHeaders, takeHeaderCasefold } from "./request-params.js";
8
+ import { errorResultMediaNote, IMAGE_OMITTED_NO_VISION, imageWithholdOf, reportImagesWithheld, sendableImages } from "./media-degrade.js";
9
+ import { ANTHROPIC_RESERVED, OUTPUT_CAP_KEYS, applyExtraBody, effectiveOutputCap, headerBagOnce, lockHeader, mergeHeaders, takeHeaderSpellings } from "./request-params.js";
10
10
  import { admitRouteRequest, applyRouteCredentialHeaders, assertServableRequestRoot, brainConfigSnapshot, createBrainRouteJudge, joinRequestUrl, resolveRequestRootOf, resolveRouteCredential } from "./route-adjudicator.js";
11
11
  import { requestRouteOf } from "./request-route.js";
12
- import { MIN_THINKING_TOKENS, budgetCapSkipsThinking, declaredEffortLevels, reasoningBudgetShare, reasoningRequestCarried, resolveEffort } from "./reasoning.js";
12
+ import { NAMES_AS_WRITTEN, resolveProviderDialect, endpointToolNames } from "./provider-dialect.js";
13
+ import { applyReasoningToRequest, mergeReasoningHeaders } from "./reasoning-request.js";
13
14
  import { runStreamingBrain } from "./stream-engine.js";
14
15
  import { refuseRetiredTimeoutKnobs } from "./timeout.js";
15
16
  import { resolveFetch } from "./transport.js";
16
- function thinkingBudget(maxTokens, share, fixed, hardCap = false) {
17
- const max = hardCap ? maxTokens : Math.max(maxTokens, MIN_THINKING_TOKENS * 2);
18
- const want = fixed ?? Math.floor(max * share);
19
- const budget = Math.min(Math.max(MIN_THINKING_TOKENS, want), max - 1);
20
- return { max, budget };
21
- }
22
17
  const EPHEMERAL = { type: "ephemeral" };
23
18
  const DOCUMENT_OMITTED_NO_VISION = "[PDF document omitted: the serving model does not support document input; extract the text via Bash instead (e.g. `pdftotext`).]";
24
19
  function textOf(content) {
@@ -26,7 +21,7 @@ function textOf(content) {
26
21
  ? content
27
22
  : content.filter((c) => c.type === "text" && typeof c.text === "string").map((c) => c.text).join("");
28
23
  }
29
- function toUserBlocks(content, supportsVision = true) {
24
+ function toUserBlocks(content, withhold) {
30
25
  if (typeof content === "string") {
31
26
  return content.length > 0 ? [{ type: "text", text: content }] : [];
32
27
  }
@@ -37,7 +32,7 @@ function toUserBlocks(content, supportsVision = true) {
37
32
  blocks.push({ type: "text", text: c.text });
38
33
  }
39
34
  else if (c.type === "image" && c.data && c.mimeType) {
40
- if (supportsVision)
35
+ if (withhold === undefined)
41
36
  blocks.push({ type: "image", source: { type: "base64", media_type: c.mimeType, data: c.data } });
42
37
  else {
43
38
  omitted++;
@@ -45,12 +40,13 @@ function toUserBlocks(content, supportsVision = true) {
45
40
  }
46
41
  }
47
42
  }
48
- if (omitted > 0)
49
- emitBrainTelemetry({ kind: "vision_placeholder", count: omitted });
43
+ if (withhold !== undefined)
44
+ reportImagesWithheld(withhold, omitted);
50
45
  return blocks;
51
46
  }
52
- function toAnthropicMessages(ctx, model) {
53
- const supportsVision = modelSupportsVision(model);
47
+ function toAnthropicMessages(ctx, model, toolNames) {
48
+ const imageWithhold = imageWithholdOf(model);
49
+ const supportsVision = imageWithhold === undefined;
54
50
  const raw = [];
55
51
  let pendingDocs = [];
56
52
  const flushDocs = () => {
@@ -64,7 +60,7 @@ function toAnthropicMessages(ctx, model) {
64
60
  if (m.role !== "toolResult")
65
61
  flushDocs();
66
62
  if (m.role === "user") {
67
- const ub = toUserBlocks(m.content, supportsVision);
63
+ const ub = toUserBlocks(m.content, imageWithhold);
68
64
  raw.push({ role: "user", content: ub.length ? ub : [{ type: "text", text: NO_CONTENT }] });
69
65
  }
70
66
  else if (m.role === "assistant") {
@@ -86,7 +82,7 @@ function toAnthropicMessages(ctx, model) {
86
82
  blocks.push({ type: "text", text: c.text });
87
83
  }
88
84
  else if (c.type === "toolCall") {
89
- blocks.push({ type: "tool_use", id: providerToolCallId(c), name: c.name, input: c.arguments ?? {} });
85
+ blocks.push({ type: "tool_use", id: providerToolCallId(c), name: toolNames.sent(c.name), input: c.arguments ?? {} });
90
86
  }
91
87
  }
92
88
  raw.push({ role: "assistant", content: blocks.length ? blocks : [{ type: "text", text: NO_CONTENT }] });
@@ -96,7 +92,7 @@ function toAnthropicMessages(ctx, model) {
96
92
  const docs = parts ? parts.filter((c) => c.type === "document") : [];
97
93
  const rest = docs.length > 0 && parts ? parts.filter((c) => c.type !== "document") : m.content;
98
94
  const hasImage = !m.isError && Array.isArray(rest) && rest.some((c) => c.type === "image");
99
- let inner = hasImage ? toUserBlocks(rest, supportsVision) : textOf(rest);
95
+ let inner = hasImage ? toUserBlocks(rest, imageWithhold) : textOf(rest);
100
96
  if (docs.length > 0 && !m.isError) {
101
97
  if (supportsVision) {
102
98
  for (const d of docs) {
@@ -155,12 +151,12 @@ function toAnthropicMessages(ctx, model) {
155
151
  }
156
152
  return merged;
157
153
  }
158
- function toAnthropicTools(ctx, cacheBreakpoints) {
154
+ function toAnthropicTools(ctx, cacheBreakpoints, toolNames) {
159
155
  if (!ctx.tools || ctx.tools.length === 0) {
160
156
  return undefined;
161
157
  }
162
158
  return ctx.tools.map((t, i) => ({
163
- name: t.name,
159
+ name: toolNames.sent(t.name),
164
160
  description: t.description,
165
161
  input_schema: t.parameters,
166
162
  ...(cacheBreakpoints && i === ctx.tools.length - 1 ? { cache_control: EPHEMERAL } : {}),
@@ -238,6 +234,7 @@ export function createAnthropicBrain(given = {}) {
238
234
  let thinkingRequested = false;
239
235
  let sentMaxTokens;
240
236
  let sentMaxTokensLane = "config-default";
237
+ let sentToolNames = NAMES_AS_WRITTEN;
241
238
  return runStreamingBrain({
242
239
  model,
243
240
  doFetch,
@@ -249,6 +246,8 @@ export function createAnthropicBrain(given = {}) {
249
246
  buildRequest: (overrides) => {
250
247
  const routed = { id: model.id, baseUrl: model.baseUrl };
251
248
  const { root, origin: rootOrigin } = resolveRequestRootOf(routed.baseUrl, config.baseUrl, ANTHROPIC_DEFAULT_BASE_URL);
249
+ const url = joinRequestUrl(root, "/v1/messages");
250
+ const builtToolNames = endpointToolNames(resolveProviderDialect(url, model.api), model.api, (context.tools ?? []).map((t) => t.name));
252
251
  const modelHeaders = headerBagOnce(model.headers);
253
252
  const optionsHeaders = headerBagOnce(options?.headers);
254
253
  const routeCredential = resolveRouteCredential({
@@ -274,80 +273,42 @@ export function createAnthropicBrain(given = {}) {
274
273
  const body = {
275
274
  model: model.id,
276
275
  max_tokens: overrides?.maxOutputTokens ?? options?.maxTokens ?? model.maxTokens ?? config.defaultMaxTokens ?? 4096,
277
- messages: toAnthropicMessages(context, model),
276
+ messages: toAnthropicMessages(context, model, builtToolNames),
278
277
  stream: true,
279
278
  };
280
279
  if (system)
281
280
  body.system = system;
282
- const tools = toAnthropicTools(context, cacheBreakpoints);
281
+ const tools = toAnthropicTools(context, cacheBreakpoints, builtToolNames);
283
282
  if (tools)
284
283
  body.tools = tools;
285
284
  const anthCompat = (model.compat ?? {});
286
285
  if (options?.temperature !== undefined && anthCompat.supportsTemperature !== false) {
287
286
  body.temperature = options.temperature;
288
287
  }
289
- let builtReasoningFacts;
290
- let thinkingOn = false;
291
- if (reasoningRequestCarried(model, options?.reasoning)) {
292
- if (anthCompat.thinkingMode === "adaptive") {
293
- body.thinking = { type: "adaptive" };
294
- thinkingOn = true;
295
- }
296
- else {
297
- const hardCap = overrides?.maxOutputTokens !== undefined || options?.maxTokens !== undefined;
298
- builtReasoningFacts = { outputCapTokens: body.max_tokens, hardOutputCap: hardCap };
299
- if (budgetCapSkipsThinking(builtReasoningFacts.outputCapTokens, builtReasoningFacts.hardOutputCap)) {
300
- body.thinking = undefined;
301
- delete body.thinking;
302
- }
303
- else {
304
- const share = config.thinkingBudgetShare ?? reasoningBudgetShare(options.reasoning);
305
- const { max, budget } = thinkingBudget(body.max_tokens, share, config.thinkingBudgetTokens, hardCap);
306
- body.max_tokens = max;
307
- body.thinking = { type: "enabled", budget_tokens: budget };
308
- thinkingOn = true;
309
- }
310
- }
311
- if (thinkingOn)
312
- delete body.temperature;
313
- }
314
- else if (model.reasoning && options?.reasoning === "off" && anthCompat.thinkingMode !== "adaptive") {
315
- body.thinking = { type: "disabled" };
316
- }
317
- const betas = [];
318
- let sendEffortBeta = false;
319
- const declaredEffort = declaredEffortLevels(anthCompat.effortLevels);
320
- if (declaredEffort !== undefined && reasoningRequestCarried(model, options?.reasoning)) {
321
- const { effective } = resolveEffort(options.reasoning, declaredEffort);
322
- const wireEffort = effective === "minimal" ? "low" : effective;
323
- body.output_config = { effort: wireEffort };
324
- sendEffortBeta = true;
325
- }
326
- if (sendEffortBeta)
327
- betas.push("effort-2025-11-24");
328
- if (anthCompat.contextManagement && thinkingOn) {
329
- body.context_management = { edits: [{ type: "clear_thinking_20251015", keep: "all" }] };
330
- betas.push("context-management-2025-06-27");
331
- }
332
- if (anthCompat.interleavedThinking) {
333
- betas.push("interleaved-thinking-2025-05-14");
334
- }
335
- const headers = mergeHeaders(modelHeaders, config.headers, optionsHeaders);
288
+ const hardCap = overrides?.maxOutputTokens !== undefined || options?.maxTokens !== undefined;
289
+ const { body: reasoningBody, headers: reasoningHeaders, wireFacts: builtReasoningFacts, } = applyReasoningToRequest({
290
+ api: "anthropic-messages",
291
+ model,
292
+ level: options?.reasoning,
293
+ body,
294
+ budget: { capIsHard: hardCap, share: config.thinkingBudgetShare, tokens: config.thinkingBudgetTokens },
295
+ });
296
+ const headerLayers = [modelHeaders, config.headers, optionsHeaders];
297
+ const headers = mergeHeaders(...headerLayers);
336
298
  applyRouteCredentialHeaders(headers, routeCredential);
337
- if (betas.length > 0) {
338
- const existing = (takeHeaderCasefold(headers, "anthropic-beta") ?? "").split(",").map((b) => b.trim()).filter(Boolean);
339
- for (const beta of betas) {
340
- if (!existing.includes(beta))
341
- existing.push(beta);
342
- }
343
- headers["anthropic-beta"] = existing.join(",");
299
+ takeHeaderSpellings(headers, "anthropic-beta");
300
+ for (const layer of headerLayers) {
301
+ for (const [name, value] of Object.entries(layer ?? {}))
302
+ if (name.toLowerCase() === "anthropic-beta")
303
+ mergeReasoningHeaders(headers, { [name]: value });
344
304
  }
305
+ mergeReasoningHeaders(headers, reasoningHeaders);
345
306
  lockHeader(headers, "content-type", "application/json");
346
307
  lockHeader(headers, "anthropic-version", config.version ?? "2023-06-01");
347
308
  if (apiKey)
348
309
  lockHeader(headers, ANTHROPIC_KEY_HEADER, apiKey);
349
- const builtThinkingRequested = body.thinking !== undefined;
350
- const builtMaxTokens = body.max_tokens;
310
+ const builtThinkingRequested = reasoningBody.thinking !== undefined;
311
+ const builtMaxTokens = reasoningBody.max_tokens;
351
312
  const builtMaxTokensLane = overrides?.maxOutputTokens !== undefined
352
313
  ? "engine"
353
314
  : options?.maxTokens !== undefined
@@ -355,9 +316,9 @@ export function createAnthropicBrain(given = {}) {
355
316
  : model.maxTokens !== undefined
356
317
  ? "model"
357
318
  : "config-default";
358
- const { body: wire, dropped: extraBodyDropped } = applyExtraBody(body, model.extraBody, ANTHROPIC_RESERVED);
319
+ const { body: wire, dropped: extraBodyDropped } = applyExtraBody(reasoningBody, model, ANTHROPIC_RESERVED);
359
320
  return {
360
- url: joinRequestUrl(root, "/v1/messages"),
321
+ url,
361
322
  headers,
362
323
  body: JSON.stringify(wire),
363
324
  extraBodyDropped,
@@ -369,6 +330,7 @@ export function createAnthropicBrain(given = {}) {
369
330
  thinkingRequested = builtThinkingRequested;
370
331
  sentMaxTokens = builtMaxTokens;
371
332
  sentMaxTokensLane = builtMaxTokensLane;
333
+ sentToolNames = builtToolNames;
372
334
  if (builtReasoningFacts !== undefined)
373
335
  reportReasoningWireFacts(builtReasoningFacts);
374
336
  },
@@ -540,7 +502,7 @@ export function createAnthropicBrain(given = {}) {
540
502
  else if (cb.type === "tool_use") {
541
503
  acc.type = "tool_use";
542
504
  acc.toolId = cb.id ?? "";
543
- acc.toolName = cb.name ?? "";
505
+ acc.toolName = sentToolNames.called(cb.name ?? "");
544
506
  }
545
507
  else {
546
508
  acc.type = "text";
@@ -256,6 +256,21 @@ export declare function abortLikeName(err: unknown): "AbortError" | "TimeoutErro
256
256
  * rather than testing `instanceof BrainError`, which walks a chain a revoked proxy traps — and the one
257
257
  * site that did so sits in an async IIFE with no `.catch`. */
258
258
  export declare function brainErrorCodeOf(e: unknown): BrainErrorCode | undefined;
259
+ /** What a thrown brain failure says about itself in machine words: its code, and the structural input-too-long cause
260
+ * its minter declared (or ruled out). Empty for a value that carries no brain code. */
261
+ export interface ThrownBrainFailure {
262
+ readonly code?: BrainErrorCode;
263
+ readonly errorKind?: "input_too_long";
264
+ readonly inputTooLongRuledOut?: true;
265
+ }
266
+ /**
267
+ * The one reading of a thrown brain failure's structure: the code word ({@link brainErrorCodeOf}, never `instanceof`)
268
+ * and, only when the value carries a code, the input-too-long cause it was minted with — read by brand, so a value from
269
+ * another realm or behind a revoked proxy reads the same as a local `BrainError`. The stream engine's terminal shell and
270
+ * every caller that catches a brain call read it, so a failure that is thrown and one that is returned on a message
271
+ * carry the same facts.
272
+ */
273
+ export declare function thrownBrainFailure(e: unknown): ThrownBrainFailure;
259
274
  /** Render a transport-level error WITHOUT folding away its cause chain: undici rejects with
260
275
  * `TypeError("fetch failed", { cause })` where the CAUSE carries the actionable fact, and the shell
261
276
  * alone reads the same for refused / DNS / mid-stream disconnect. Walks the chain (bounded), appending
@@ -247,6 +247,16 @@ export function brainErrorCodeOf(e) {
247
247
  const code = readMember(e, "code");
248
248
  return typeof code === "string" && BRAIN_ERROR_CODES.includes(code) ? code : undefined;
249
249
  }
250
+ export function thrownBrainFailure(e) {
251
+ const code = brainErrorCodeOf(e);
252
+ if (code === undefined)
253
+ return {};
254
+ if (readMember(e, "inputTooLong") === true)
255
+ return { code, errorKind: "input_too_long" };
256
+ if (readMember(e, "inputTooLongRuledOut") === true)
257
+ return { code, inputTooLongRuledOut: true };
258
+ return { code };
259
+ }
250
260
  export function describeNetworkError(e) {
251
261
  const top = thrownText(e);
252
262
  const parts = [];
@@ -7,15 +7,26 @@
7
7
  * sentence that drifts is a string consumers grep for.
8
8
  */
9
9
  import type { Model } from "../internal/llm.js";
10
+ import { type CapabilityDeclaration } from "./model-capability.js";
11
+ /** Why a request's images are withheld from the SERVING model: the entry's image declaration, when it is not held
12
+ * (the withheld-capability report's `cause`, `status-sink.ts`). */
13
+ export type ImageWithholdCause = Exclude<CapabilityDeclaration, "declared_on">;
14
+ /** A request whose images are withheld: which model, and why. */
15
+ export interface ImageWithhold {
16
+ readonly modelId: string;
17
+ readonly cause: ImageWithholdCause;
18
+ }
10
19
  /**
11
- * Whether the SERVING model accepts image input (`Model.input` contains "image").
12
- *
13
- * An ABSENT `input` is deliberately permissive (vision on): the field is caller-supplied metadata,
14
- * and treating "not declared" as "not capable" would silently downgrade every caller who never
15
- * filled it in. A caller that genuinely serves a text-only endpoint declares `input: ["text"]` and
16
- * gets the placeholder path — the case a text-only API rejects with a hard 400 on an image part.
20
+ * The image row of the capability table for one request: `undefined` = images ride as images; otherwise the model and
21
+ * the declaration that withholds them. Read off the one capability reading (`capabilityHeld` / `capabilityOf`), so an
22
+ * entry that never declared `input` gets its images exactly as the table says, and an entry that declares a list without
23
+ * `"image"` gets the placeholder path — the case a text-only API rejects with a hard 400 on an image part. No model =
24
+ * images ride.
17
25
  */
18
- export declare function modelSupportsVision(model?: Model): boolean;
26
+ export declare function imageWithholdOf(model?: Model): ImageWithhold | undefined;
27
+ /** Report `count` images of one request replaced by placeholders — the one emit for every lane: the operator trace frame
28
+ * (telemetry, per request) and the leg's withheld-capability account (the person's notice, once per conversation). */
29
+ export declare function reportImagesWithheld(withhold: ImageWithhold, count: number): void;
19
30
  /** Placeholder for an image block dropped because the serving model declares no image input. */
20
31
  export declare const IMAGE_OMITTED_NO_VISION = "[image omitted: the serving model does not support image input]";
21
32
  /** {@link IMAGE_OMITTED_NO_VISION}, counted — a batch of dropped images states how many were lost. */
@@ -1,5 +1,16 @@
1
- export function modelSupportsVision(model) {
2
- return model?.input === undefined ? true : model.input.includes("image");
1
+ import { capabilityHeld, capabilityOf } from "./model-capability.js";
2
+ import { emitBrainTelemetry, reportCapabilityWithheld } from "./status-sink.js";
3
+ export function imageWithholdOf(model) {
4
+ if (model === undefined)
5
+ return undefined;
6
+ const declared = capabilityOf(model, "image");
7
+ return declared === "declared_on" || capabilityHeld(model, "image") ? undefined : { modelId: model.id, cause: declared };
8
+ }
9
+ export function reportImagesWithheld(withhold, count) {
10
+ if (count === 0)
11
+ return;
12
+ emitBrainTelemetry({ kind: "vision_placeholder", count });
13
+ reportCapabilityWithheld({ modelId: withhold.modelId, capability: "image", cause: withhold.cause, count });
3
14
  }
4
15
  export const IMAGE_OMITTED_NO_VISION = "[image omitted: the serving model does not support image input]";
5
16
  export function imagesOmittedNoVisionNote(count) {
@@ -0,0 +1,37 @@
1
+ /**
2
+ * The ONE reading of a model's capability declarations — image input and reasoning.
3
+ *
4
+ * A `Model` declares each capability in one of three states: on (`reasoning: true`; `input` lists `"image"`), off
5
+ * (`reasoning: false`; an `input` list without `"image"`), or not at all (the key is absent). Every reader in the engine
6
+ * (bar the PDF profile's no-metadata shortcut in `pdfModelCapabilitiesOf`, which looks at the absence itself) asks {@link capabilityOf} for the declaration, or {@link capabilityHeld} for "does the engine treat this model as
7
+ * having it", and what an undeclared capability means is stated once, in {@link UNKNOWN_CAPABILITY_READS} — no caller
8
+ * decides it for itself. A request never carries a capability declared off; one declared on is never dropped here.
9
+ *
10
+ * A declaration of the wrong shape is refused where it is read: a `reasoning` that is not a boolean, or an `input` that
11
+ * is not a list of strings, throws, naming the model and the key. Reading it some other way (by truthiness, or as
12
+ * undeclared) would turn a typo into a capability nobody declared.
13
+ */
14
+ import type { Model } from "../internal/llm.js";
15
+ /** The capabilities a model declares. `image` = accepts image input (`Model.input` lists `"image"`). */
16
+ export declare const MODEL_CAPABILITIES: readonly ["image", "reasoning"];
17
+ export type ModelCapability = (typeof MODEL_CAPABILITIES)[number];
18
+ /** What a model's entry says about one capability. `unknown` = the entry does not say. */
19
+ export declare const CAPABILITY_DECLARATIONS: readonly ["declared_on", "declared_off", "unknown"];
20
+ export type CapabilityDeclaration = (typeof CAPABILITY_DECLARATIONS)[number];
21
+ /**
22
+ * What the engine does with a capability the entry does not declare, per capability — the only place this is said.
23
+ * Image input is used (an entry that never filled in `input` keeps the images it was always sent). Reasoning is not:
24
+ * no thinking keys go out for an entry that does not declare `reasoning` (the request is the provider's default).
25
+ */
26
+ export declare const UNKNOWN_CAPABILITY_READS: Readonly<Record<ModelCapability, "held" | "not_held">>;
27
+ /** The part of a model this module reads (`id` only names the model in a refusal; the structural readers that take a
28
+ * model-shaped object without one still get the same answer). */
29
+ export type CapabilityDeclaringModel = {
30
+ readonly id?: Model["id"];
31
+ readonly reasoning?: unknown;
32
+ readonly input?: unknown;
33
+ };
34
+ /** The entry's declaration of `cap`. Throws a `TypeError` on a declaration of the wrong shape (see the module note). */
35
+ export declare function capabilityOf(model: CapabilityDeclaringModel, cap: ModelCapability): CapabilityDeclaration;
36
+ /** Whether the engine treats the model as having `cap`: declared on, or undeclared where {@link UNKNOWN_CAPABILITY_READS} says held. */
37
+ export declare function capabilityHeld(model: CapabilityDeclaringModel, cap: ModelCapability): boolean;
@@ -0,0 +1,34 @@
1
+ export const MODEL_CAPABILITIES = Object.freeze(["image", "reasoning"]);
2
+ export const CAPABILITY_DECLARATIONS = Object.freeze(["declared_on", "declared_off", "unknown"]);
3
+ export const UNKNOWN_CAPABILITY_READS = Object.freeze({
4
+ image: "held",
5
+ reasoning: "not_held",
6
+ });
7
+ function typeWordOf(value) {
8
+ return value === null ? "null" : Array.isArray(value) ? "array" : typeof value;
9
+ }
10
+ function nameOf(model) {
11
+ return typeof model.id === "string" ? `"${model.id}"` : "a model with no id";
12
+ }
13
+ export function capabilityOf(model, cap) {
14
+ if (cap === "reasoning") {
15
+ const declared = model.reasoning;
16
+ if (declared === undefined)
17
+ return "unknown";
18
+ if (typeof declared !== "boolean") {
19
+ throw new TypeError(`Model.reasoning of ${nameOf(model)} must be true, false or absent; got ${typeWordOf(declared)}`);
20
+ }
21
+ return declared ? "declared_on" : "declared_off";
22
+ }
23
+ const input = model.input;
24
+ if (input === undefined)
25
+ return "unknown";
26
+ if (!Array.isArray(input) || !input.every((m) => typeof m === "string")) {
27
+ throw new TypeError(`Model.input of ${nameOf(model)} must be a list of input kinds or absent; got ${Array.isArray(input) ? "a list holding a non-string" : typeWordOf(input)}`);
28
+ }
29
+ return input.includes("image") ? "declared_on" : "declared_off";
30
+ }
31
+ export function capabilityHeld(model, cap) {
32
+ const declared = capabilityOf(model, cap);
33
+ return declared === "declared_on" || (declared === "unknown" && UNKNOWN_CAPABILITY_READS[cap] === "held");
34
+ }
@@ -1,5 +1,5 @@
1
1
  /**
2
- * First-party model presets (design/119, CC 2.1.198 rebaseline).
2
+ * First-party model presets (design/119).
3
3
  *
4
4
  * sema stays caller-injects-`Model` by design (no baked catalog — the CC catalog/alias/family layer
5
5
  * is a product surface we deliberately don't carry). What IS worth shipping is the per-model
@@ -7,12 +7,12 @@
7
7
  * (adaptive thinking form, effort tiers, temperature rejection) that a wrong guess turns into a
8
8
  * hard 400. These presets are DATA, not mechanism — every field can be overridden by the caller.
9
9
  *
10
- * Pricing is deliberately NOT baked (CC 198 doesn't bake it either): `cost` defaults to zeros and a
10
+ * Pricing is deliberately NOT baked (the reference doesn't bake it either): `cost` defaults to zeros and a
11
11
  * deployment that wants cost accounting fills in the current official per-MTok rates.
12
12
  */
13
13
  import type { AnthropicMessagesCompat, Model } from "../internal/llm.js";
14
14
  /**
15
- * The Fable-5-class Anthropic wire contract (CC 2.1.198 capability bits, design/119 P0):
15
+ * The Fable-5-class Anthropic wire contract (capability bits, design/119 P0):
16
16
  * - `thinkingMode: "adaptive"` — `thinking: { type: "adaptive" }`, NO budget_tokens (400 on budget).
17
17
  * - `effortLevels` — the full five-tier `output_config.effort` range (fable-5 has `xhigh_effort` +
18
18
  * `max_effort`; a model without those bits should declare a shorter list and higher requests clamp).
@@ -20,15 +20,9 @@ import type { AnthropicMessagesCompat, Model } from "../internal/llm.js";
20
20
  */
21
21
  export declare const FABLE_5_COMPAT: AnthropicMessagesCompat;
22
22
  /**
23
- * The fable lines the classic prompt shape serves. They are prompt text, so they live with the prompt
24
- * text; this name stays exported for hosts that read them. The preset below no longer carries them as
25
- * `promptGuidance`: the prompt composes them itself, once, where they are the only fable text.
26
- */
27
- export declare const FABLE_5_PROMPT_GUIDANCE: readonly string[];
28
- /**
29
- * A ready-to-use `claude-fable-5` {@link Model} (CC 2.1.198 registry facts: 1M-token native context
23
+ * A ready-to-use `claude-fable-5` {@link Model} (registry facts: 1M-token native context
30
24
  * window, 64k default max output — the 128k tier is opt-in via `maxTokens` override, knowledge
31
- * cutoff Jan 2026, `default_effort: "high"`). Override anything per deployment; set `cost` for
32
- * accounting (not baked — see module note).
25
+ * cutoff Jan 2026, `default_effort: "high"`, prompt capabilities `lean_prompt` + `fable_5_mitigations`).
26
+ * Override anything per deployment; set `cost` for accounting (not baked — see module note).
33
27
  */
34
28
  export declare function fable5Model(overrides?: Partial<Model>): Model;
@@ -1,15 +1,9 @@
1
- import { catalogText } from "../prompt-assembly/catalog/index.js";
2
1
  import { ANTHROPIC_DEFAULT_BASE_URL } from "./anthropic.js";
3
2
  export const FABLE_5_COMPAT = {
4
3
  thinkingMode: "adaptive",
5
4
  effortLevels: ["low", "medium", "high", "xhigh", "max"],
6
5
  supportsTemperature: false,
7
6
  };
8
- export const FABLE_5_PROMPT_GUIDANCE = [
9
- catalogText("core/behavior.fable-classic.final-message"),
10
- catalogText("core/behavior.fable-classic.autonomy"),
11
- catalogText("core/behavior.fable-classic.tool-json"),
12
- ];
13
7
  export function fable5Model(overrides = {}) {
14
8
  return {
15
9
  id: "claude-fable-5",
@@ -25,6 +19,7 @@ export function fable5Model(overrides = {}) {
25
19
  maxTokens: 64_000,
26
20
  charsPerToken: 3,
27
21
  compat: { ...FABLE_5_COMPAT },
22
+ promptTraits: ["lean_prompt", "fable_5_mitigations"],
28
23
  ...overrides,
29
24
  };
30
25
  }