@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
@@ -15,7 +15,7 @@ import type { Brain, ModelRef, ModelRoles } from "./model-seat.js";
15
15
  import type { RuntimeCaps, WorkflowGovernanceBaseline } from "./runtime-caps.js";
16
16
  /**
17
17
  * parity-204 — structured `RunnerDeps.loadProjectMemory` return (backward-compatible, RL-1336-project-memory-bare: a bare
18
- * `string | null` keeps its exact historical meaning). Adds the CC 2.1.204 `seededFromContext`
18
+ * `string | null` keeps its exact historical meaning). Adds the `seededFromContext`
19
19
  * seam (cc204-bundle @17917159: CC preloads readFileState for CLAUDE.md/nested-memory files it
20
20
  * placed in context, and a DEFAULT whole-file Read of an unchanged seeded file answers with the
21
21
  * already-in-context reminder instead of re-transmitting the body — token economy, GA in 204).
@@ -27,7 +27,7 @@ export interface ProjectMemoryLoad {
27
27
  * Files whose FULL, disk-verbatim text the deployment has placed in the model's context (e.g. the
28
28
  * CLAUDE.md that `content` embeds). The Runner pre-seeds the hands' read state (through the same
29
29
  * resolveKey containment as a real Read — an out-of-root path is silently skipped), so a default
30
- * whole-file Read of an UNCHANGED seeded file returns the CC-verbatim reminder
30
+ * whole-file Read of an UNCHANGED seeded file returns the reminder
31
31
  * (`This file is already in your context (see "Contents of <path>" above) and has not changed on
32
32
  * disk…`) instead of the body. `content` here MUST be the file's exact disk text at load time —
33
33
  * the unchanged check hashes it; never declare a truncated/annotated variant (CC's `isPartialView`
@@ -52,10 +52,8 @@ export interface ProjectMemoryLoad {
52
52
  */
53
53
  instructionSources?: ReadonlyArray<{
54
54
  path: string;
55
- /** (additive widening): `null` = the source is DECLARED but currently
56
- * ABSENT from disk — the change probe then watches for its APPEARANCE (renders "absent → hash").
57
- * Runtime already handled null (collectInstructionsChange's from===null arm); this widening
58
- * only aligns the declared type with the shipped behavior. */
55
+ /** `null` = the source is DECLARED but currently ABSENT from disk — the change probe then watches for
56
+ * its APPEARANCE (renders "absent → hash"). */
59
57
  contentHash: string | null;
60
58
  }>;
61
59
  }
@@ -240,13 +238,13 @@ export interface RunnerDeps {
240
238
  */
241
239
  agentConfigDir?: string;
242
240
  /**
243
- * backlog #286 (#279 — CC 2.1.233 `DANGEROUS_FILES`/`DANGEROUS_DIRECTORIES`/
241
+ * backlog #286 (#279 — `DANGEROUS_FILES`/`DANGEROUS_DIRECTORIES`/
244
242
  * `DANGEROUS_DIRECTORY_PATHS` parity): the WRITE-protection table. DEFAULT-ON: a path-confinable
245
243
  * write (Write/Edit/NotebookEdit) whose target lands on a table row has a surviving `allow`
246
244
  * demoted to `ask` at the tool gate (`decisionReason: "safety"`; a deny/ask verdict is untouched;
247
245
  * approval flows the ordinary ask-resolution chain — classifier, blanket `onAsk`, durable park —
248
246
  * with no `requiresRealApproval` mandate). Absent =
249
- * {@link import("./write-protect.js").WRITE_PROTECTED_DEFAULT_TABLE} (the CC triple verbatim +
247
+ * {@link import("./write-protect.js").WRITE_PROTECTED_DEFAULT_TABLE} (the reference triple +
250
248
  * the two argued sema rows). This key IS the whole-table escape hatch, deployment seat ONLY — the
251
249
  * task layer's twin is add-only ({@link TaskSpec.writeProtectedAdditions}: its rows UNION this
252
250
  * table and can remove none), and no governed-workflow channel reaches either: `[]` = no table (explicit and legal); a non-empty
@@ -545,6 +543,8 @@ export interface RunnerDeps {
545
543
  fileHistoryStore?: import("./file-history-store.js").FileHistoryStore | "disabled";
546
544
  /** The deployment's CAPTURE switch, apart from the store seat: `"off"` (the only word, and only beside a wired store; anything else refuses prepare, `config.invalid_file_history_capture`) ⇒ no run records — no first-touch record, no turn boundary, no fork carry, no liveness advisory, manifest `fileHistory: "disabled"` — while a wired {@link fileHistoryStore} still serves {@link TaskSpec.restoreFiles} / {@link TaskSpec.rewindFilesTo} from what it already holds. */
547
545
  fileHistoryCapture?: "off";
546
+ /** The deployment's ADVISOR switch: `"disabled"` (the only word; anything else refuses prepare, `config.advisor_tool_invalid`) ⇒ no leg attaches the `advisor` tool and every {@link TaskSpec.advisorModel} is ignored unread — manifest `advisor: { state: "not_attached", reason: "disabled" }`, no notice. */
547
+ advisorTool?: "disabled";
548
548
  /**
549
549
  * design/381 DV-14 (终审落锤) — what an Edit/Write/NotebookEdit does when its FIRST-TOUCH history
550
550
  * record cannot be persisted (`FileHistoryStore.trackEdit` answered `{ok:false}` = NO durable
@@ -563,13 +563,13 @@ export interface RunnerDeps {
563
563
  */
564
564
  onTrackFailure?: "refuse" | "proceed-unprotected";
565
565
  /**
566
- * design/99 §E6 — DURABLE per-session permission rules (a deny-narrowing folded into the task-time tool
567
- * policy). Omitted ⇒ the feature is OFF (no rules read, zero behavior change). A deployment supplies a
568
- * cross-replica backend whose CAS-rev + tighten-only semantics match the core
569
- * {@link import("./session-policy-store.js").InMemorySessionPolicyStore}. Rules are read at prepare time for a
570
- * task carrying its own `sessionId` (a delegated subagent inherits none) and composed BEFORE the caller
571
- * policy, so they can only SUBTRACT capability. core does NOT verify owner/operator identity — the store
572
- * honors the `operator` flag the (service) caller freezes from a verified principal.
566
+ * design/99 §E6 — DURABLE per-session permission rules (a deny-narrowing folded into the task-time tool policy).
567
+ * Omitted ⇒ OFF (no rules read). A deployment's cross-replica backend matches the CAS-rev + tighten-only semantics of
568
+ * {@link import("./session-policy-store.js").InMemorySessionPolicyStore}. A task carrying its own `sessionId` has its
569
+ * rules re-read at every tool gate of its own AND of every delegated leg; a descendant reads the key from ITS runner's store,
570
+ * whichever that is — none ⇒ it keeps its spawn-time snapshot and announces `config.session_rules_unreadable`; a DIFFERENT
571
+ * store answers for the key itself, silently (no row there ⇒ nothing binds), so give delegation runners this same store.
572
+ * Composed BEFORE the caller policy, they only SUBTRACT capability. core does NOT verify owner/operator identity — the store honors the `operator` flag the caller freezes from a verified principal.
573
573
  */
574
574
  sessionPolicyStore?: import("./session-policy-store.js").SessionPolicyStore;
575
575
  /**
@@ -730,9 +730,9 @@ export interface RunnerDeps {
730
730
  * engine-spawned child) AND this face is present AND the per-principal DENY bit is not set
731
731
  * ({@link RuntimeCaps.autoMode}` !== false` — absent is not a denial).
732
732
  *
733
- * 🔐 Trust gate (the CC 2.1.207 three-source invariant): classifier RULES enter EXCLUSIVELY
733
+ * 🔐 Trust gate (the three-source invariant): classifier RULES enter EXCLUSIVELY
734
734
  * here — a deployment-constructed object, never a `TaskSpec` field, never a repo-file plane. The
735
- * prompt is assembled from the SHA-locked CC 2.1.207 assets (`buildAutoModePrompt`) with these
735
+ * prompt is assembled from the SHA-locked reference assets (`buildAutoModePrompt`) with these
736
736
  * rules merged CC-exactly (user rules replace a section; the `"$defaults"` sentinel splices the
737
737
  * stock rules back in). The classify leg runs on the `classifier` role's model (fallback
738
738
  * `summarize → default`; tier default `flash`) via the brain's simple-completion pipe — same
@@ -747,7 +747,7 @@ export interface RunnerDeps {
747
747
  isolatePeers?: true;
748
748
  };
749
749
  autoMode?: {
750
- /** Rule overrides for the four permissions sections (omitted section = CC defaults verbatim). */
750
+ /** Rule overrides for the four permissions sections (omitted section = the defaults). */
751
751
  rules?: import("./auto-mode-prompt.js").AutoModeRules;
752
752
  /** Settings-plane deny rules rendered into the `<settings_deny_rules>` slot (circumvention catch). */
753
753
  settingsDenyRules?: readonly string[];
@@ -784,7 +784,7 @@ export interface RunnerDeps {
784
784
  */
785
785
  classifierFallback?: import("./auto-mode.js").AutoModeClassifierFallback;
786
786
  /**
787
- * The classifier DENIAL LIMIT (CC 2.1.250 `FO`/`AKe`): a run whose classifier keeps blocking falls
787
+ * The classifier DENIAL LIMIT: a run whose classifier keeps blocking falls
788
788
  * back to a PERSON instead of being denied without end. Per run: a `block` first increments the
789
789
  * consecutive and total counts and then judges `consecutive >= maxConsecutive || total >= maxTotal`
790
790
  * — the block that reaches a bound is itself the one that becomes an `ask` (the 3rd consecutive
@@ -942,19 +942,19 @@ export interface RunnerDeps {
942
942
  * `SendMessageToolOptions.lane` and into the session-box drain; read per call / per pass. */
943
943
  peerLane?: Partial<import("../agents/peer-admission.js").PeerLaneConfig>;
944
944
  /**
945
- * design/385 §2.1 / §5.1 — the peer-session DIRECTORY: the discovery truth of the cross-session
946
- * lane (other sessions of this engine for the same user). A HOST implements the contract (cli: the
947
- * pid-keyed registration files; server: its session table) and writes the rows; the engine only
948
- * reads them. Seat semantics = the mailbox seat's: NO seat, NO lane — every face stays byte-identical
949
- * to a pre-385 build. With the seat wired the engine (a) mounts `ListAgents` (alias `ListPeers`),
950
- * (b) opens SendMessage's `session.<id>` address arm and its last `name [ref]` rung, (c) drains this
951
- * session's own `session.<sessionId>` box at every turn boundary (the mailbox contract's third
952
- * consumption chain), and (d) splices the cross-session rule into the auto-mode classifier slot.
953
- * HARD PRECONDITION (design/385 §1.2⑥): `mailboxStore` must be wired AND declare
954
- * `crossProcessSafe: true`; otherwise the lane is REFUSED at prepare with a named
955
- * `config.peer_lane_unmounted` notice (never mounted on luck), and the seat is inert for that run.
945
+ * design/385 §2.1 / §5.1 — the peer-session DIRECTORY: the discovery truth of the cross-session lane (other sessions
946
+ * of this engine for the same user). A HOST implements the contract (cli: the pid-keyed registration files; server: its
947
+ * session table) and writes the rows; the engine only reads them. Seat semantics = the mailbox seat's: NO seat, NO lane —
948
+ * every face stays byte-identical to a pre-385 build. With the seat wired the engine (a) mounts `ListAgents` (alias
949
+ * `ListPeers`), (b) opens SendMessage's `session.<id>` address arm and its last `name [ref]` rung, (c) drains this
950
+ * session's own `session.<sessionId>` box at every turn boundary (the mailbox contract's third consumption chain), and
951
+ * (d) splices the cross-session rule into the auto-mode classifier slot. HARD PRECONDITION (design/385 §1.2⑥):
952
+ * `mailboxStore` must be wired AND declare `crossProcessSafe: true`; otherwise the lane is REFUSED at prepare with a
953
+ * named `config.peer_lane_unmounted` notice (never mounted on luck), and the seat is inert for that run.
956
954
  */
957
955
  peerDirectory?: import("../agents/peer-directory.js").PeerDirectory;
956
+ /** The cross-session SOCKET channel ({@link import("./peer-channel.js").PeerChannel}; bundled: `createCcUdsPeerChannel`, the reference agent's dialect). SendMessage reads each target row's lane once (`peerSessionLane`, against {@link mailboxStore}'s `identity`): a row whose capability bit names this store keeps its box append and its socket gets a content-free doorbell; any other row with a socket (a reference-agent session, a session of this engine on another store) gets the message over its socket, at-most-once (`via: "uds"`). Absent ⇒ such a row refuses `peer_send.not_reachable`, never an append into a box nobody drains; every other face is unchanged. The engine never listens (a host calls `listen`). Inert without {@link peerDirectory}. */
957
+ peerChannel?: import("./peer-channel.js").PeerChannel;
958
958
  /**
959
959
  * design/385 §4.4 — this deployment's `crossSessionInbound` setting LAYERS for the drain-point
960
960
  * judgment (managed / user / repo, resolved by `resolveCrossSessionInboundSetting` — explicit value
@@ -977,7 +977,7 @@ export interface RunnerDeps {
977
977
  assistant: string;
978
978
  };
979
979
  /**
980
- * design/385 §4.4 (slice 4) — this deployment's `dialogExpiry` (CC settings key, verbatim vocabulary
980
+ * design/385 §4.4 (slice 4) — this deployment's `dialogExpiry` (settings key, vocabulary
981
981
  * `"60s" | "5m" | "10m" | "never"`, default `"5m"`): how long a HELD cross-session message whose cause
982
982
  * a human review could resolve (mode-mismatch / no-mode-asserted / invalid attestation) waits in this
983
983
  * session's held queue before it resolves to its safe no-action default — EXPIRED, dropped WITH a
@@ -1079,7 +1079,7 @@ export interface RunnerDeps {
1079
1079
  /**
1080
1080
  * design/138 S1 — the NEW-ARCHITECTURE memory seam (MemoryEngine over a {@link import("./memory-engine/types.js").MemoryBackend}).
1081
1081
  * When set AND `spec.memory.enabled`, the task runs the INJECTION-FIRST file-based memory lifecycle
1082
- * (materialize → session file ops → harvest with the full gate set), the CC-verbatim `# Memory`
1082
+ * (materialize → session file ops → harvest with the full gate set), the `# Memory`
1083
1083
  * instruction + fenced derived index replace the legacy `<user_memory>` block, and NO remember/recall
1084
1084
  * tools are mounted (memory = the model's ordinary file skills). **S4: unset ⇒
1085
1085
  * the task runs MEMORY-LESS** — the legacy `memoryStore` runtime path was retired (one deprecation
@@ -1288,13 +1288,13 @@ export interface RunnerDeps {
1288
1288
  * never instead of them. A `classic.PreToolUse` handler's `allow` never bypasses `toolPolicy` — the policy is always
1289
1289
  * the final say.
1290
1290
  */
1291
- mods?: readonly import("./mods/kernel/index.js").ModRegistration<import("./mods/dollar.js").EngineDollar>[];
1291
+ mods?: readonly import("./mods/classic-events.js").EngineModRegistration[];
1292
1292
  /**
1293
- * Policy for remote image URLs (`TaskSpec.images[].url`). Return false to reject. When set it
1294
- * **replaces** the built-in SSRF guard (https-only + private/reserved-host block) — e.g. supply a
1295
- * CDN allowlist, or a stricter resolve-and-pin check. Omit to use the safe default.
1293
+ * The deployment's HOST FLOOR (`{ deny?, only? }`, host patterns `example.com` / `*.example.com`): read by the gate (a deny-only layer no rule, mode or
1294
+ * approver clears) and by the engine executors before they connect — the fetch tool's every hop, task images, each MCP http dial (pooled included), every
1295
+ * A2A request and hop, WebSearch's SearXNG backend request and every redirect hop. `only` present ⇒ nothing else is reachable (it also lifts the private-network floor for a host it names); read once at construction (a frozen copy), a bad value refuses (`config.host_floor_invalid`).
1296
1296
  */
1297
- allowImageUrl?: (url: string) => boolean;
1297
+ hostFloor?: import("./host-floor.js").HostFloorDeclaration;
1298
1298
  /**
1299
1299
  * Optional sink for best-effort background errors/warnings that are otherwise swallowed:
1300
1300
  * - `"compaction"` — a compaction failure (F8); a persistently failing one (flaky gateway, empty
@@ -1326,9 +1326,9 @@ export interface RunnerDeps {
1326
1326
  * simply carries no suggestions.
1327
1327
  * - `"rewind"` — the file-history machinery backing rewind reported a best-effort failure: a
1328
1328
  * turn-start boundary capture failed or timed out (that turn cannot be rewound to; the turn
1329
- * itself proceeds), or a first-touch failure was tolerated under
1330
- * `onTrackFailure:"proceed-unprotected"`. (design/381: the whole-tree size gate and its
1331
- * `classification:"too_large"` payload are retired — per-edited-file history has no size axis.)
1329
+ * itself proceeds), a first-touch failure was tolerated under `onTrackFailure:"proceed-unprotected"`, a
1330
+ * first-touch record could not be retracted, or a fork's history carry failed. `err` is always a
1331
+ * `FileHistoryStoreError`: read its `code` / `permanence`, never the message text.
1332
1332
  * - `"hook"` — a deployment hook misbehaved: a callback threw, or returned a verdict it was not
1333
1333
  * allowed to (e.g. a declared-observational hook). The engine applies the hook's own documented
1334
1334
  * fallback (swallow, or fail-closed deny, per its contract) and reports the fact here.
@@ -1415,7 +1415,7 @@ export interface RunnerDeps {
1415
1415
  /**
1416
1416
  * design/374 — the microCompact knobs. Both default ON (`machine: "cc"`, `clearOnRejection: true`).
1417
1417
  *
1418
- * - `machine`: `"cc"` (default: the CC 2.1.223 rejection-leg form — keep 5, ≥20k minimum-savings
1418
+ * - `machine`: `"cc"` (default: the rejection-leg form — keep 5, ≥20k minimum-savings
1419
1419
  * gate, one deep clear beyond the keep window, CC marker bytes) or `"off"` (no proactive
1420
1420
  * frontier clearing at all — the D-2 off switch; the machine then gets its ONE shot at the
1421
1421
  * blocking point instead, the slice-3 arm A, trace trigger `"blocking"`). The vocabulary is
@@ -1452,7 +1452,7 @@ export interface RunnerDeps {
1452
1452
  cacheBreakDetection?: boolean;
1453
1453
  /**
1454
1454
  * Aggregate inline-MEDIA (image) byte budget for the request (batch-C/§17.2 sibling of the text budget;
1455
- * CC 2.1.196 `tengu_media_byte_cap` parity). Image reads (`Read` → ImageContent) are per-image-capped but
1455
+ * `tengu_media_byte_cap` in the reference). Image reads (`Read` → ImageContent) are per-image-capped but
1456
1456
  * accumulate across turns; this bounds the SUM in the request by stripping the OLDEST images (replaced with a
1457
1457
  * marker) — request-only, non-destructive (the durable session keeps the image; the model can re-Read it).
1458
1458
  * The same budget bounds the media of one `tool_end.output` (spent there as base64 on the wire, x 4/3); both readers
@@ -86,7 +86,7 @@ export interface WorkflowGovernanceBaseline {
86
86
  */
87
87
  /**
88
88
  * #692 C-d — WHICH plane's ratchet denied auto mode, when the resolver knows: the three settings sources
89
- * CC 2.1.250's `permissions.disableAutoMode` can come from, as the resolver folds them into the one deny bit
89
+ * the reference's `permissions.disableAutoMode` can come from, as the resolver folds them into the one deny bit
90
90
  * ({@link RuntimeCaps.autoMode} `=== false`). `org` = a managed / organization policy plane; `local` = the
91
91
  * machine's local settings; `settings` = the user's / project's settings file. Read ONLY beside the deny bit
92
92
  * (a source with no denial is a contradiction the value screen refuses as a resolver fault); projected onto
@@ -112,7 +112,7 @@ export interface RuntimeCaps {
112
112
  * deployment, never GRANT beyond it. */
113
113
  allowFork?: boolean;
114
114
  /**
115
- * Observer agents (CC 2.1.206 parity, docs/CC206-OBSERVER-ANCHORS-2026-07-11.md §6): honor
115
+ * Observer agents: honor
116
116
  * {@link AgentDefinition.observer} auto-spawn declarations. **POLARITY NOTE — unlike
117
117
  * `allowWorkflows`/`allowFork` (`undefined` = unrestricted), this one is `=== true` EXPLICIT
118
118
  * opt-in, default OFF**: CC's gate pair is a default-UNSET experimental env var
@@ -133,7 +133,7 @@ export interface RuntimeCaps {
133
133
  * must not demote a reachable person into the model answering for them). */
134
134
  forceDurableGate?: boolean;
135
135
  /**
136
- * The per-principal auto-mode DENY bit (CC 2.1.250 polarity — the mirror of the settings-plane
136
+ * The per-principal auto-mode DENY bit (the mirror of the settings-plane
137
137
  * `permissions.disableAutoMode` ratchet: an organization may only take auto mode AWAY; it is the
138
138
  * USER who turns it on, by requesting the mode at {@link TaskSpec.permissionMode}).
139
139
  *
@@ -145,7 +145,7 @@ export interface RuntimeCaps {
145
145
  * unset. The arming itself: intent ∧ {@link RunnerDeps.autoMode} present ∧ this bit not `false`
146
146
  * (allow → run; block → deny `source:"classifier"`; classifier failure → FAIL-CLOSED back to the
147
147
  * original ask chain). The trust gate is unchanged: classifier RULES enter only through the
148
- * deployment assembly face, never a repo-controlled plane (the CC 2.1.207 three-source invariant).
148
+ * deployment assembly face, never a repo-controlled plane (the three-source invariant).
149
149
  * A denial resolves to a no-op (asks flow the original chain; no warn — the gate, not a mistake).
150
150
  */
151
151
  autoMode?: boolean;
@@ -31,7 +31,9 @@ export declare const SAFETY_AXIS_VOCABULARY: {
31
31
  readonly permissionDecision: readonly ["allow", "ask", "deny"];
32
32
  };
33
33
  /** The mark tighten's sentence — the ONE spelling of each safety-mark frame (an egress-marked tool = an external write; an
34
- * always-irreversible tool; a tool whose server declared that a call must be put to a person), read by the gate's two tighten arms (`gate-fold.ts`) and by the inherited lane's card for a
35
- * marked tool (`judgeInheritedClassifier`): a person who answers a card for a marked call is told what the mark means,
36
- * whichever lane minted the card. */
37
- export declare function markTightenMessage(toolName: string, mark: "egress" | "irreversible" | "interaction"): string;
34
+ * always-irreversible tool; a tool that may be irreversible, `"maybe"`, whose call nothing showed reversible — its probe's own
35
+ * account rides the card's `probeReason`, never this sentence; a tool whose server declared that a call must be put to a
36
+ * person), read by the gate's two tighten arms (`gate-fold.ts`) and by the inherited lane's card for a marked tool
37
+ * (`judgeInheritedClassifier`): a person who answers a card for a marked call is told what the mark means, whichever lane
38
+ * minted the card. */
39
+ export declare function markTightenMessage(toolName: string, mark: "egress" | "irreversible" | "unproven" | "interaction"): string;
@@ -10,9 +10,10 @@ export const SAFETY_AXIS_VOCABULARY = {
10
10
  const _toolEffectExhaustive = true;
11
11
  void _toolEffectExhaustive;
12
12
  export function markTightenMessage(toolName, mark) {
13
- if (mark === "interaction")
14
- return `tool "${toolName}" asks for a person's confirmation (server-declared) — explicit approval required`;
15
- return mark === "egress"
16
- ? `tool "${toolName}" performs an external write (egress) — explicit approval required`
17
- : `tool "${toolName}" performs an irreversible action — explicit approval required`;
13
+ switch (mark) {
14
+ case "interaction": return `tool "${toolName}" asks for a person's confirmation (server-declared) — explicit approval required`;
15
+ case "egress": return `tool "${toolName}" performs an external write (egress) — explicit approval required`;
16
+ case "irreversible": return `tool "${toolName}" performs an irreversible action — explicit approval required`;
17
+ case "unproven": return `tool "${toolName}" was not shown to be reversible — explicit approval required`;
18
+ }
18
19
  }
@@ -177,12 +177,36 @@ export const SAFETY_MERGE_CONFORMANCE_CORPUS = [
177
177
  },
178
178
  {
179
179
  name: "inert-deny-entry-removed-safe",
180
- intent: "removing a deny entry the grammar reads that names nothing (a wildcard peer, a `__` name with no protocol prefix) relaxes nothing — the comparison reads the EFFECTIVE entries on both sides",
181
- prior: { toolDeny: ["Bash", "mcp__*", "github__x"] },
180
+ intent: "removing a deny entry the grammar reads that names nothing (a `__` name with no protocol prefix) relaxes nothing — the comparison reads the EFFECTIVE entries on both sides",
181
+ prior: { toolDeny: ["Bash", "github__x"] },
182
182
  next: { toolDeny: ["Bash"] },
183
183
  loosens: false,
184
184
  reasons: [],
185
185
  },
186
+ {
187
+ name: "glob-deny-removed-loosened",
188
+ intent: "a `*` anywhere in a deny entry's name is a wildcard over the whole name (`mcp__git*` every peer it matches, `Re*d` every tool it matches, `*` every tool): removing one lifts a real deny",
189
+ prior: { toolDeny: ["Bash", "mcp__git*", "Re*d"] },
190
+ next: { toolDeny: ["Bash"] },
191
+ loosens: true,
192
+ reasons: ['removed toolDeny "mcp__git*"', 'removed toolDeny "Re*d"'],
193
+ },
194
+ {
195
+ name: "whole-protocol-deny-removed-loosened",
196
+ intent: "`mcp__*` and `mcp__*__*` in a deny list name every tool of every MCP server: removing either lifts a real deny",
197
+ prior: { toolDeny: ["Bash", "mcp__*"] },
198
+ next: { toolDeny: ["Bash"] },
199
+ loosens: true,
200
+ reasons: ['removed toolDeny "mcp__*"'],
201
+ },
202
+ {
203
+ name: "whole-protocol-deny-both-spellings-removed-loosened",
204
+ intent: "each whole-protocol spelling is its own deny entry: dropping one while keeping the other still removes an entry the base layer wrote",
205
+ prior: { toolDeny: ["mcp__*", "mcp__*__*"] },
206
+ next: { toolDeny: ["mcp__*"] },
207
+ loosens: true,
208
+ reasons: ['removed toolDeny "mcp__*__*"'],
209
+ },
186
210
  {
187
211
  name: "unreadable-deny-prior-loosened",
188
212
  intent: "rules whose toolDeny holds an entry no rule grammar reads (an empty entry) cannot be read and refuse every call — an override that can be read loosens them",
@@ -0,0 +1,40 @@
1
+ /**
2
+ * The conservative value-sameness proof the park mint reads when it decides whether a fidelity projection
3
+ * moved a value, and whether a policy's rewrite names the very value about to be filed. A leaf: no imports.
4
+ */
5
+ /**
6
+ * CONSERVATIVE "these two are provably the same value" for deciding whether a
7
+ * {@link import("./checkpoint-store.js").encodeAtFidelity} projection moved anything, and whether a policy's
8
+ * rewrite names the very value about to be filed.
9
+ *
10
+ * Deliberately NOT the binding hash, which is the wrong instrument for this question in two directions:
11
+ * it folds `-0` onto `0` (a real projection change the policy may care about, invisible to the hash), and
12
+ * it is a digest, so a collision would read as sameness. `Object.is` at the leaves keeps the `-0`
13
+ * distinction; comparing own-key SETS keeps the dropped `undefined`-valued key visible.
14
+ *
15
+ * Conservative on purpose — the answer it must never give wrongly is TRUE, because both callers read
16
+ * TRUE as "nothing moved / the policy named this very value" and act by filing. So sameness has to be
17
+ * PROVED, not merely un-disproved:
18
+ * - the PROTOTYPES must match and be the plain-object or array one. `[object Object]` is not proof of
19
+ * a plain object — a class instance and a null-prototype object both report it, and a tool executing
20
+ * the arguments can observe inherited behaviour. (Neither input to the projection comparison can be
21
+ * such a value: `structuredClone` and `JSON.parse` both produce plain data. A policy's rewrite can.)
22
+ * - own keys are compared with `Reflect.ownKeys` and POSITIONALLY, so a SYMBOL key or a non-enumerable
23
+ * property on one side is a difference rather than an invisible extra, and so is a different order
24
+ * (which `Object.keys`, `JSON.stringify` and any tool iterating its arguments can see).
25
+ * - properties are compared through their DESCRIPTORS — every flag, so a frozen object is not the
26
+ * mutable value a JSON decode produces — and an accessor on either side answers FALSE without being
27
+ * read: an approval decision must not be made by running deployment code, and what a getter returns
28
+ * need not be the same twice.
29
+ * - reference TOPOLOGY counts: two properties that share one object are not two properties holding
30
+ * equal objects, and a JSON round trip is precisely what turns the first into the second.
31
+ * - what it CANNOT prove on its own is that the value it inspected answers ordinary reads the way its
32
+ * descriptors did — a Proxy reports the target's descriptors and can return anything from a `get`.
33
+ * A caller comparing a value it did not construct must first establish that it is an inert data
34
+ * graph (the capture clone does exactly that, and refuses a Proxy outright).
35
+ * - any brand outside plain object/array that is not already reference-identical answers FALSE (a Date
36
+ * is never the string a JSON codec leaves behind, a Map is never the `{}`), and so does any
37
+ * inspection that throws.
38
+ * An uncertain answer therefore costs a policy consultation or a park, never a silently filed value.
39
+ */
40
+ export declare function samePlainValue(a: unknown, b: unknown): boolean;
@@ -0,0 +1,49 @@
1
+ const MAX_SAME_VALUE_DEPTH = 256;
2
+ export function samePlainValue(a, b) {
3
+ return sameValueAt(a, b, 0, new Map(), new Map());
4
+ }
5
+ function sameValueAt(a, b, depth, aToB, bToA) {
6
+ if (Object.is(a, b))
7
+ return true;
8
+ if (depth >= MAX_SAME_VALUE_DEPTH)
9
+ return false;
10
+ if (a === null || b === null || typeof a !== "object" || typeof b !== "object")
11
+ return false;
12
+ try {
13
+ const pairedWithA = aToB.get(a);
14
+ const pairedWithB = bToA.get(b);
15
+ if (pairedWithA !== undefined || pairedWithB !== undefined)
16
+ return pairedWithA === b && pairedWithB === a;
17
+ aToB.set(a, b);
18
+ bToA.set(b, a);
19
+ const proto = Object.getPrototypeOf(a);
20
+ if (proto !== Object.getPrototypeOf(b))
21
+ return false;
22
+ if (proto !== Object.prototype && proto !== Array.prototype)
23
+ return false;
24
+ if (Object.isExtensible(a) !== Object.isExtensible(b))
25
+ return false;
26
+ const ka = Reflect.ownKeys(a);
27
+ const kb = Reflect.ownKeys(b);
28
+ if (ka.length !== kb.length)
29
+ return false;
30
+ for (const [i, k] of ka.entries()) {
31
+ if (k !== kb[i])
32
+ return false;
33
+ const da = Object.getOwnPropertyDescriptor(a, k);
34
+ const db = Object.getOwnPropertyDescriptor(b, k);
35
+ if (da === undefined || db === undefined)
36
+ return false;
37
+ if (!("value" in da) || !("value" in db))
38
+ return false;
39
+ if (da.enumerable !== db.enumerable || da.writable !== db.writable || da.configurable !== db.configurable)
40
+ return false;
41
+ if (!sameValueAt(da.value, db.value, depth + 1, aToB, bToA))
42
+ return false;
43
+ }
44
+ return true;
45
+ }
46
+ catch {
47
+ return false;
48
+ }
49
+ }
@@ -111,7 +111,7 @@ export interface ScheduledTaskSummary {
111
111
  /** 下次触发的 epoch ms(cron/at 可算;daemon 提供)。 */
112
112
  nextRunMs?: number;
113
113
  /** 执行形态回显({@link ScheduledIntent.mode})。ScheduleWakeup 的 stop:true 靠它定位要取消的 pending
114
- * wakeup(cron/task 意图不受 stop 影响——CC 206 D9 语义)。老 backend 不回 = undefined(工具壳以
114
+ * wakeup(cron/task 意图不受 stop 影响)。老 backend 不回 = undefined(工具壳以
115
115
  * label 兜底过滤)。 */
116
116
  mode?: "task" | "session-wakeup";
117
117
  /** [c209-D2]:生命周期层级回显({@link ScheduledIntent.lifetime})——缺了它,任务创建后就再无
@@ -112,6 +112,9 @@ export declare function declareWithheldEnv(table: WithheldEnvDeclaration): void;
112
112
  * the peer is not dialed.
113
113
  */
114
114
  export declare function holdOwnCredentialValues(values: Iterable<string | undefined>, onNotice?: (notice: EngineNotice) => void): void;
115
+ /** The part of a `<word> <rest>` value after its first word and the spaces that follow it (`Bearer x` → `x`), or undefined when the value does
116
+ * not read that way. The cut is made of the VALUE's shape, whatever the header is called. */
117
+ export declare function authSchemeCredentials(value: string): string | undefined;
115
118
  /** THE one reading of which HTTP header carries a credential by its NAME — the credential vocabulary's header-name
116
119
  * reading ({@link isSensitiveHeaderName}: `Authorization`, `Proxy-Authorization`, `X-Api-Key`, Azure's `api-key`,
117
120
  * `x-goog-api-key`, `Cookie`, any name holding a credential word; not a gateway's own spelling of a name the
@@ -160,12 +163,32 @@ export declare function inheritedHostEnv(policy: InheritEnvPolicy | undefined, f
160
163
  export declare function inheritEnvPolicyProblem(value: unknown): string | undefined;
161
164
  /** Test seam: never called by production code. */
162
165
  export declare function __resetSecretEnvScrubNoticeAnnouncement(): void;
166
+ /** What both disclosures say about one set of findings: every withheld name, and those that are this deployment's own
167
+ * credential — withheld under every policy — whichever rule withheld them first ({@link ownCredentialJudge}, the
168
+ * subtraction's own judgment, over the entry's value in this process's environment: every finding names an entry of
169
+ * it). The rest the scrub withheld, and `"all"` or an allow list naming them hands them on. */
170
+ export declare function withheldEnvNames(findings: readonly SecretEnvFinding[]): {
171
+ names: string[];
172
+ ownCredentials: string[];
173
+ };
163
174
  /**
164
175
  * The ONE disclosure point for a scrub's withheld keys. Routed through {@link deliverEngineNotice} — the
165
176
  * engine's one notice throat — so a wired `onNotice` seat REPLACES the console line exactly as every
166
177
  * other `EngineNotice` does, and an absent seat prints the same words `console.warn` always printed here.
167
- * `detail.names` carries every withheld key; `detail.ownCredentials`, present only when one was withheld, the
168
- * subset withheld as the deployment's declared own credentials (kind `own-credential`) rather than by the scrub.
169
- * Once per PROCESS, never per call or per site; an EMPTY findings array is a no-op.
178
+ * `detail` is {@link withheldEnvNames}: `names` every withheld key, `ownCredentials` (present only when one was
179
+ * withheld) the subset that is the deployment's own credential. Once per PROCESS, never per call or per site; an
180
+ * EMPTY findings array is a no-op.
170
181
  */
171
182
  export declare function announceSecretEnvScrub(onNotice: ((notice: EngineNotice) => void) | undefined, findings: readonly SecretEnvFinding[]): void;
183
+ /**
184
+ * The session user's half of the same fact, from the execution environment's `withheldEnv`: the notice telling the
185
+ * person whose run drives a tool shell which variables of the engine's environment that shell does not receive — names
186
+ * only, never a value, split as {@link withheldEnvNames} splits them, with the way out for each half (`detail.state`
187
+ * `"withheld"`); or, when the environment answered `"unknown"`, that the engine could not determine them (`"unknown"`,
188
+ * no names: an empty list never stands for unknown). `undefined` when nothing is withheld. Minted by the Runner
189
+ * (`runner/shell-env-withheld.ts`).
190
+ */
191
+ export declare function withheldEnvUserNotice(withheld: readonly SecretEnvFinding[] | "unknown", at: {
192
+ sessionId: string;
193
+ runId?: string | undefined;
194
+ }): EngineNotice | undefined;
@@ -281,6 +281,9 @@ export function holdOwnCredentialValues(values, onNotice) {
281
281
  indexAdd(held, v);
282
282
  }
283
283
  const AUTH_SCHEME_VALUE_RE = /^[!#$%&'*+.^_`|~0-9A-Za-z-]+ +(\S[\s\S]*)$/;
284
+ export function authSchemeCredentials(value) {
285
+ return AUTH_SCHEME_VALUE_RE.exec(value)?.[1];
286
+ }
284
287
  const SCHEMED_HEADER_RE = /^(?:proxy-)?authorization$/i;
285
288
  export function isCredentialHeaderName(name) {
286
289
  return isSensitiveHeaderName(name);
@@ -293,7 +296,7 @@ export function credentialHeaderValues(headers) {
293
296
  for (const [name, value] of Object.entries(headers ?? {})) {
294
297
  if (typeof value !== "string" || !(isCredentialHeaderName(name) || looksLikeCredentialValue(value)))
295
298
  continue;
296
- const credentials = AUTH_SCHEME_VALUE_RE.exec(value)?.[1];
299
+ const credentials = authSchemeCredentials(value);
297
300
  if (credentials !== undefined && isSchemedCredentialHeader(name) && notACredentialReason(credentials) !== undefined) {
298
301
  out.push(credentials);
299
302
  continue;
@@ -324,16 +327,21 @@ export function __resetWithheldEnv() {
324
327
  Reflect.set(globalThis, WITHHELD_ENV, { names: NOTHING_NAMED, declared: new Map(), held: new Map() });
325
328
  intakeSaid.clear();
326
329
  }
327
- function withholdOwnCredentials(inherited, findings) {
330
+ function ownCredentialJudge() {
328
331
  const table = withheldEnvOf();
329
332
  if (table.names.length === 0 && table.declared.size === 0 && table.held.size === 0)
330
- return inherited;
333
+ return undefined;
331
334
  const own = new Set(table.names.map(envNameKey));
335
+ return (key, value) => own.has(envNameKey(key)) || (typeof value === "string" && (indexHas(table.declared, value) || indexHas(table.held, value)));
336
+ }
337
+ function withholdOwnCredentials(inherited, findings) {
338
+ const isOwn = ownCredentialJudge();
339
+ if (isOwn === undefined)
340
+ return inherited;
332
341
  const kept = [];
333
342
  for (const key of Object.keys(inherited)) {
334
343
  const value = inherited[key];
335
- const ownValue = typeof value === "string" && (indexHas(table.declared, value) || indexHas(table.held, value));
336
- if (!own.has(envNameKey(key)) && !ownValue)
344
+ if (!isOwn(key, value))
337
345
  kept.push([key, value]);
338
346
  else
339
347
  findings?.push({ key, kind: "own-credential", confidence: SECRET_ENV_KIND_CONFIDENCE["own-credential"], source: "secret-env" });
@@ -377,16 +385,44 @@ let secretEnvScrubNoticeAnnounced = false;
377
385
  export function __resetSecretEnvScrubNoticeAnnouncement() {
378
386
  secretEnvScrubNoticeAnnounced = false;
379
387
  }
388
+ export function withheldEnvNames(findings) {
389
+ const names = [...new Set(findings.map((f) => f.key))];
390
+ const isOwn = ownCredentialJudge();
391
+ const ownCredentials = isOwn === undefined ? [] : names.filter((k) => isOwn(k, process.env[k]));
392
+ return { names, ownCredentials };
393
+ }
380
394
  export function announceSecretEnvScrub(onNotice, findings) {
381
395
  if (findings.length === 0 || secretEnvScrubNoticeAnnounced)
382
396
  return;
383
397
  secretEnvScrubNoticeAnnounced = true;
384
- const names = findings.map((f) => f.key);
385
- const ownCredentials = findings.filter((f) => f.kind === "own-credential").map((f) => f.key);
398
+ const { names, ownCredentials } = withheldEnvNames(findings);
386
399
  const own = ownCredentials.length > 0 ? `; ${ownCredentials.length} of them this deployment's own credential(s) (${ownCredentials.join(", ")})` : "";
387
400
  deliverEngineNotice(onNotice, {
388
401
  code: "config.secret_env_scrubbed",
389
- message: `secret_env_scrubbed: ${findings.length} env key(s) withheld from a spawned child's environment (${names.join(", ")})${own} — once per process; wire onNotice for the structured form`,
402
+ message: `secret_env_scrubbed: ${names.length} env key(s) withheld from a spawned child's environment (${names.join(", ")})${own} — once per process; wire onNotice for the structured form`,
390
403
  detail: { names, ...(ownCredentials.length > 0 ? { ownCredentials } : {}) },
391
404
  });
392
405
  }
406
+ export function withheldEnvUserNotice(withheld, at) {
407
+ const route = { sessionId: at.sessionId, ...(at.runId !== undefined ? { runId: at.runId } : {}) };
408
+ if (withheld === "unknown") {
409
+ return {
410
+ code: "inherit_env.names_withheld",
411
+ message: "The engine could not determine which variables of its environment the tool shell in this session does not receive: the execution environment does not say. Variables you set may read as unset there.",
412
+ detail: { state: "unknown", ...route },
413
+ };
414
+ }
415
+ const { names, ownCredentials } = withheldEnvNames(withheld);
416
+ if (names.length === 0)
417
+ return undefined;
418
+ const scrubbed = names.filter((k) => !ownCredentials.includes(k));
419
+ const halves = [
420
+ ...(scrubbed.length > 0 ? [`${scrubbed.join(", ")} — withheld by the credential scrub; the run's inheritEnv ("all", or a list naming them) hands them on`] : []),
421
+ ...(ownCredentials.length > 0 ? [`${ownCredentials.join(", ")} — this deployment's own credential(s), withheld under every inheritEnv`] : []),
422
+ ];
423
+ return {
424
+ code: "inherit_env.names_withheld",
425
+ message: `The tool shell in this session does not receive ${names.length} variable(s) of the engine's environment: ${halves.join("; ")}. Values are never shown.`,
426
+ detail: { state: "withheld", names, ...(ownCredentials.length > 0 ? { ownCredentials } : {}), ...route },
427
+ };
428
+ }
@@ -1,3 +1,4 @@
1
+ import { capabilityHeld } from "../brain/model-capability.js";
1
2
  function asList(models) {
2
3
  return Array.isArray(models) ? models : Object.values(models);
3
4
  }
@@ -9,9 +10,8 @@ function costOf(m) {
9
10
  }
10
11
  function matches(m, c) {
11
12
  for (const need of c.needs ?? []) {
12
- if (need === "vision" && !m.input?.includes("image"))
13
- return false;
14
- if (need === "reasoning" && !m.reasoning)
13
+ const cap = need === "vision" ? "image" : need === "reasoning" ? "reasoning" : undefined;
14
+ if (cap !== undefined && !capabilityHeld(m, cap))
15
15
  return false;
16
16
  }
17
17
  if (c.minContext != null && (m.contextTokens ?? m.contextWindow ?? 0) < c.minContext) {
@@ -23,7 +23,7 @@ import type { ToolPolicy } from "./tool-policy.js";
23
23
  export declare function agentConfigDenyPatterns(): readonly string[];
24
24
  /**
25
25
  * RECOMMENDED default pattern set for {@link createSensitivePathPolicy} (additive export).
26
- * NO upstream verbatim anchor exists (cc-anchors/2.1.209 carries no sensitive/dangerous file-pattern
26
+ * NO upstream anchor exists (the anchor set carries no sensitive/dangerous file-pattern
27
27
  * material), so this is an ENGINEERING-CONSENSUS set — each line states its tradeoff. The factory's
28
28
  * default behavior is unchanged (no implicit default list; wiring this set is the caller's opt-in:
29
29
  * `createSensitivePathPolicy({ patterns: RECOMMENDED_SENSITIVE_PATTERNS, … })`).
@@ -134,7 +134,7 @@ export function createSensitivePathPolicy(opts) {
134
134
  const fold = CASE_INSENSITIVE_FS ? "ascii" : "none";
135
135
  const lower = (segs) => (CASE_INSENSITIVE_FS ? segs.map((seg) => seg.replace(/[A-Z]/g, (c) => c.toLowerCase())) : segs);
136
136
  const anchors = [configRoot, ...(env === undefined ? [] : await canonicalDataRootKeys(env, [configRoot], signal))].map((root) => lower(agentConfigDirSegments(root)));
137
- return configRows.map(({ raw, tail }) => ({ ...(compileSegmentPattern(tail, fold) ?? { raw, segments: [], foldAscii: CASE_INSENSITIVE_FS }), raw, anchors, rootedOnly: true }));
137
+ return configRows.map(({ raw, tail }) => ({ ...(compileSegmentPattern(tail, fold) ?? { raw, segments: [], fold }), raw, anchors, rootedOnly: true }));
138
138
  };
139
139
  const rowsOf = async (env, signal) => [...guardRows, ...(await configTwins(env, signal)).map(rowOf)];
140
140
  const unstampedRoots = Object.freeze(dataRootSpellings(undefined));