@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
@@ -1,7 +1,7 @@
1
- import { existsSync, readdirSync, rmSync, statSync } from "node:fs";
1
+ import { closeSync, existsSync, fstatSync, openSync, readdirSync, rmSync, utimesSync } from "node:fs";
2
2
  import { join } from "node:path";
3
- import { BaseSessionStorage, StoredSession, SessionError, assertForkTarget, forkRowCells, getEntriesToFork, incarnationCell, uuidv7, validateEntriesForImport, } from "../../internal/harness.js";
4
- import { canonicalStoreKey, AppendLog, atomicWriteFile, ensureDir, readJsonlRecords, sanitizePathComponent } from "./fs-atomic.js";
3
+ import { BaseSessionStorage, StoredSession, SessionError, assertForkTarget, compareOccupants, forkRowCells, frozenRow, getEntriesToFork, importRowCells, incarnationCell, leafIdAfterEntry, ownerCell, readIncarnationCell, readOwnerCell, uuidv7, validateEntriesForImport, } from "../../internal/harness.js";
4
+ import { canonicalStoreKey, AppendLog, atomicWriteFile, ensureDir, firstJsonlRecord, lastJsonlRecord, readJsonlRecords, sanitizePathComponent, writeThenLink } from "./fs-atomic.js";
5
5
  import { guardCorruptSink } from "./corrupt-read-sink.js";
6
6
  import { assertAdoptionBootGate } from "./adoption/marker.js";
7
7
  import { thrownText } from "../../core/thrown-value.js";
@@ -9,9 +9,14 @@ const SUFFIX = ".jsonl";
9
9
  const SESSION_LINE_JUDGE = {
10
10
  accepts: (r) => {
11
11
  const line = r;
12
- return line.kind === "meta" || (line.kind === "entry" && line.entry !== null && typeof line.entry === "object");
12
+ if (line.kind === "meta")
13
+ return true;
14
+ if (line.kind !== "entry" || line.entry === null || typeof line.entry !== "object" || Array.isArray(line.entry))
15
+ return false;
16
+ const entry = line.entry;
17
+ return typeof entry.id === "string" && (entry.type !== "leaf" || entry.targetId === null || typeof entry.targetId === "string");
13
18
  },
14
- what: "a session line is neither a meta header nor an entry record",
19
+ what: "a session line is neither a meta header nor an entry record with a string id (and, for a leaf, a string or null target)",
15
20
  };
16
21
  const sharedSessionStorages = new Map();
17
22
  const sessionStorageFinalizer = new FinalizationRegistry(({ canonical, log }) => {
@@ -31,10 +36,12 @@ class FileSessionStorage extends BaseSessionStorage {
31
36
  log;
32
37
  canonicalPath;
33
38
  holders = new Set();
39
+ occupant;
34
40
  constructor(log, meta, entries, canonicalPath) {
35
41
  super(meta, entries);
36
42
  this.log = log;
37
43
  this.canonicalPath = canonicalPath;
44
+ this.occupant = { incarnation: meta.incarnation };
38
45
  }
39
46
  addHolder(holder) {
40
47
  this.holders.add(holder);
@@ -46,6 +53,9 @@ class FileSessionStorage extends BaseSessionStorage {
46
53
  closeLog() {
47
54
  this.log.close();
48
55
  }
56
+ isViewOf(row) {
57
+ return this.log.isFileAtPath() && compareOccupants(this.occupant, row) !== "different";
58
+ }
49
59
  persistSync(entry) {
50
60
  this.log.append({ kind: "entry", entry }, true);
51
61
  }
@@ -91,45 +101,70 @@ export class FileSessionRepo {
91
101
  tally = info;
92
102
  this.onCorruptRead?.({ ...info, sessionId: id });
93
103
  }, SESSION_LINE_JUDGE);
94
- let meta;
104
+ const meta = this.headerOf(id, path, lines[0], () => ` (${tally?.dropped ?? 0} of ${tally?.total ?? lines.length} records skipped as corrupt)`);
95
105
  const entries = [];
96
- for (const line of lines) {
97
- if (line.kind === "meta")
98
- meta = line;
99
- else
106
+ for (const line of lines)
107
+ if (line.kind === "entry")
100
108
  entries.push(line.entry);
109
+ return { meta, entries };
110
+ }
111
+ headerOf(id, path, first, skipped = () => "") {
112
+ if (first === undefined || first.kind !== "meta")
113
+ throw new SessionError("corrupt_session", `Session ${id} is unreadable: its log has no meta header${skipped()}`);
114
+ const said = (key) => (detail) => this.disclose(path, `session header ${key}: ${detail}`, id);
115
+ const incarnation = readIncarnationCell(first.incarnation, said("incarnation"));
116
+ const forkedFromIncarnation = readIncarnationCell(first.forkedFromIncarnation, said("forkedFromIncarnation"));
117
+ return {
118
+ id,
119
+ createdAt: first.createdAt,
120
+ ...(first.forkedFrom !== undefined ? { forkedFrom: first.forkedFrom } : {}),
121
+ ...(first.placement !== undefined ? { placement: first.placement } : {}),
122
+ ...(incarnation !== undefined ? { incarnation } : {}),
123
+ ...(forkedFromIncarnation !== undefined ? { forkedFromIncarnation } : {}),
124
+ owner: readOwnerCell(first.owner, id),
125
+ };
126
+ }
127
+ async headOf(sessionId) {
128
+ return this.atRow(sessionId, (fd, size, meta) => {
129
+ const last = lastJsonlRecord(fd, size, (r) => r.kind === "entry", SESSION_LINE_JUDGE);
130
+ return { owner: meta.owner ?? null, incarnation: meta.incarnation, leafId: last === undefined ? null : leafIdAfterEntry(last.entry) };
131
+ });
132
+ }
133
+ rowOf(sessionId) {
134
+ return this.atRow(sessionId, (_fd, _size, meta, mtimeMs) => ({ ...meta, lastActiveAt: Math.trunc(mtimeMs) }));
135
+ }
136
+ atRow(sessionId, read) {
137
+ const path = this.pathFor(sessionId);
138
+ let fd;
139
+ try {
140
+ fd = openSync(path, "r");
101
141
  }
102
- if (meta === undefined) {
103
- throw new SessionError("corrupt_session", `Session ${id} is unreadable: its log has no meta header (${tally?.dropped ?? 0} of ${tally?.total ?? lines.length} records skipped as corrupt)`);
142
+ catch (err) {
143
+ if (err.code === "ENOENT")
144
+ return undefined;
145
+ throw err;
104
146
  }
105
- const { createdAt, forkedFrom, placement, incarnation, forkedFromIncarnation } = meta;
106
- for (const [key, token] of [["incarnation", incarnation], ["forkedFromIncarnation", forkedFromIncarnation]]) {
107
- if (token !== undefined && typeof token !== "string")
108
- this.disclose(path, `session header carries a non-string ${key} (${typeof token}) — read as an UNKNOWN occupant`, id);
147
+ try {
148
+ const { size, mtimeMs } = fstatSync(fd);
149
+ return read(fd, size, this.headerOf(sessionId, path, firstJsonlRecord(fd, size, SESSION_LINE_JUDGE)), mtimeMs);
150
+ }
151
+ finally {
152
+ closeSync(fd);
109
153
  }
110
- return {
111
- meta: {
112
- id,
113
- createdAt,
114
- ...(forkedFrom !== undefined ? { forkedFrom } : {}),
115
- ...(placement !== undefined ? { placement } : {}),
116
- ...(typeof incarnation === "string" ? { incarnation } : {}),
117
- ...(typeof forkedFromIncarnation === "string" ? { forkedFromIncarnation } : {}),
118
- },
119
- entries,
120
- };
121
154
  }
122
155
  storage(meta, entries) {
123
156
  const { id } = meta;
124
157
  const canonical = canonicalStoreKey(this.pathFor(id));
125
158
  const live = sharedSessionStorages.get(canonical)?.deref();
126
- if (live !== undefined) {
159
+ if (live !== undefined && live.isViewOf(meta)) {
127
160
  live.addHolder(this);
128
161
  this.joined.set(canonical, new WeakRef(live));
129
162
  return live;
130
163
  }
164
+ if (live !== undefined)
165
+ evictSharedSessionStorage(canonical);
131
166
  const log = new AppendLog(this.pathFor(id));
132
- const created = new FileSessionStorage(log, meta, entries, canonical);
167
+ const created = new FileSessionStorage(log, frozenRow({ ...meta, ...(meta.placement !== undefined ? { placement: { ...meta.placement } } : {}) }), entries, canonical);
133
168
  sharedSessionStorages.set(canonical, new WeakRef(created));
134
169
  created.addHolder(this);
135
170
  this.joined.set(canonical, new WeakRef(created));
@@ -153,10 +188,17 @@ export class FileSessionRepo {
153
188
  const createdAt = new Date().toISOString();
154
189
  const path = this.pathFor(id);
155
190
  if (!existsSync(path)) {
156
- evictSharedSessionStorage(canonicalStoreKey(path));
191
+ const owner = ownerCell(options.owner);
157
192
  const placement = options.placement !== undefined ? { ...options.placement, placedAt: options.placement.placedAt ?? Date.now() } : undefined;
158
- const meta = { id, createdAt, ...(placement !== undefined ? { placement } : {}), ...incarnationCell(undefined) };
159
- atomicWriteFile(this.tmpDir, path, `${JSON.stringify({ kind: "meta", ...meta })}\n`);
193
+ const meta = { id, createdAt, ...(placement !== undefined ? { placement } : {}), ...incarnationCell(undefined), ...owner };
194
+ try {
195
+ writeThenLink(path, `${JSON.stringify({ kind: "meta", ...meta })}\n`);
196
+ }
197
+ catch (err) {
198
+ if (err.code === "EEXIST")
199
+ throw new SessionError("conflict", `session ${id} was created by another writer between this create's existence check and its write — refusing to replace or attach to that row`);
200
+ throw err;
201
+ }
160
202
  return new StoredSession(this.storage(meta, []));
161
203
  }
162
204
  const { meta, entries } = this.read(id);
@@ -166,80 +208,65 @@ export class FileSessionRepo {
166
208
  const { meta, entries } = this.read(metadata.id);
167
209
  return new StoredSession(this.storage(meta, entries));
168
210
  }
169
- async list() {
170
- let names;
211
+ async touch(sessionId) {
212
+ const now = new Date();
171
213
  try {
172
- names = readdirSync(this.dir);
214
+ utimesSync(this.pathFor(sessionId), now, now);
173
215
  }
174
216
  catch (err) {
175
- if (err.code !== "ENOENT") {
176
- this.disclose(this.dir, `session directory unreadable (${err.code ?? "unknown"}) — listed as empty`);
177
- }
178
- return [];
179
- }
180
- const out = [];
181
- for (const name of names) {
182
- if (!name.endsWith(SUFFIX))
183
- continue;
184
- const id = name.slice(0, -SUFFIX.length);
185
- try {
186
- const { createdAt, forkedFrom, placement } = this.read(id).meta;
187
- if (placement !== undefined)
188
- continue;
189
- out.push({ id, createdAt, ...(forkedFrom !== undefined ? { forkedFrom } : {}) });
190
- }
191
- catch (err) {
192
- if (!(err instanceof SessionError && err.code === "not_found")) {
193
- this.disclose(this.pathFor(id), `session log unreadable (${thrownText(err)}) — skipped from the listing`, id);
194
- }
195
- }
217
+ if (err.code === "ENOENT")
218
+ return;
219
+ throw new SessionError("storage", `session ${sessionId}'s activity could not be recorded: ${thrownText(err)}`, err instanceof Error ? err : undefined);
196
220
  }
197
- return out.sort((a, b) => a.createdAt.localeCompare(b.createdAt));
198
221
  }
199
- async listPlaced(kind, opts) {
222
+ async list() {
223
+ return this.rows("the listing")
224
+ .filter((row) => row.placement === undefined)
225
+ .sort((a, b) => a.createdAt.localeCompare(b.createdAt));
226
+ }
227
+ rows(listing) {
200
228
  let names;
201
229
  try {
202
230
  names = readdirSync(this.dir);
203
231
  }
204
232
  catch (err) {
205
233
  if (err.code !== "ENOENT") {
206
- this.disclose(this.dir, `session directory unreadable (${err.code ?? "unknown"}) — placed listing degraded to empty`);
234
+ this.disclose(this.dir, `session directory unreadable (${err.code ?? "unknown"}) — ${listing} degraded to empty`);
207
235
  }
208
236
  return [];
209
237
  }
210
- const now = Date.now();
211
238
  const out = [];
212
239
  for (const name of names) {
213
240
  if (!name.endsWith(SUFFIX))
214
241
  continue;
215
242
  const id = name.slice(0, -SUFFIX.length);
216
- let placement;
243
+ let row;
217
244
  try {
218
- placement = this.read(id).meta.placement;
245
+ row = this.rowOf(id);
219
246
  }
220
247
  catch (err) {
221
- if (!(err instanceof SessionError && err.code === "not_found")) {
222
- this.disclose(this.pathFor(id), `session log unreadable (${thrownText(err)}) — skipped from the placed listing`, id);
223
- }
248
+ this.disclose(this.pathFor(id), `session log unreadable (${thrownText(err)}) — skipped from ${listing}`, id);
224
249
  continue;
225
250
  }
251
+ if (row !== undefined)
252
+ out.push(row);
253
+ }
254
+ return out;
255
+ }
256
+ async listPlaced(kind, opts) {
257
+ const now = Date.now();
258
+ const out = [];
259
+ for (const row of this.rows("the placed listing")) {
260
+ const placement = row.placement;
226
261
  if (placement === undefined || placement.kind !== kind)
227
262
  continue;
228
263
  if (opts?.scope !== undefined && placement.scope !== opts.scope)
229
264
  continue;
230
- if (opts?.olderThanMs !== undefined) {
231
- let ageAnchor = placement.placedAt;
232
- try {
233
- ageAnchor = statSync(this.pathFor(id)).mtimeMs;
234
- }
235
- catch {
236
- }
237
- if (now - ageAnchor <= opts.olderThanMs)
238
- continue;
239
- }
265
+ if (opts?.olderThanMs !== undefined && now - row.lastActiveAt <= opts.olderThanMs)
266
+ continue;
240
267
  out.push(placement.scope !== undefined && placement.handle !== undefined
241
- ? { sessionId: id, placedAt: placement.placedAt, scope: placement.scope, handle: placement.handle }
242
- : { sessionId: id, placedAt: placement.placedAt, tupleIncomplete: true });
268
+ ? { sessionId: row.id, placedAt: placement.placedAt, scope: placement.scope, handle: placement.handle }
269
+ : { sessionId: row.id, placedAt: placement.placedAt, tupleIncomplete: true });
243
270
  }
244
271
  return out;
245
272
  }
@@ -248,15 +275,19 @@ export class FileSessionRepo {
248
275
  return this.read(id).meta;
249
276
  }
250
277
  catch (err) {
251
- return err instanceof SessionError && err.code === "not_found" ? undefined : {};
278
+ if (err instanceof SessionError && err.code === "not_found")
279
+ return undefined;
280
+ throw err;
252
281
  }
253
282
  }
254
283
  async placementOf(sessionId) {
255
284
  try {
256
285
  return this.read(sessionId).meta.placement;
257
286
  }
258
- catch {
259
- return undefined;
287
+ catch (err) {
288
+ if (err instanceof SessionError && err.code === "not_found")
289
+ return undefined;
290
+ throw err;
260
291
  }
261
292
  }
262
293
  async delete(metadata) {
@@ -275,7 +306,7 @@ export class FileSessionRepo {
275
306
  const id = options.id ?? uuidv7();
276
307
  const createdAt = new Date().toISOString();
277
308
  const path = this.pathFor(id);
278
- const meta = { id, createdAt, ...forkRowCells(await source.getMetadata()) };
309
+ const meta = { id, createdAt, ...forkRowCells(await source.getMetadata(), options.owner) };
279
310
  const lines = [JSON.stringify({ kind: "meta", ...meta })];
280
311
  for (const entry of forked) {
281
312
  lines.push(JSON.stringify({ kind: "entry", entry }));
@@ -288,12 +319,10 @@ export class FileSessionRepo {
288
319
  return this.read(sessionId).entries;
289
320
  }
290
321
  async importEntries(sessionId, owner, entries, options) {
291
- void owner;
292
322
  const validated = validateEntriesForImport(entries, options);
293
- const prior = this.priorHeader(sessionId);
323
+ const meta = importRowCells(sessionId, owner, this.priorHeader(sessionId), new Date().toISOString());
294
324
  evictSharedSessionStorage(canonicalStoreKey(this.pathFor(sessionId)));
295
- const createdAt = new Date().toISOString();
296
- const lines = [JSON.stringify({ kind: "meta", id: sessionId, createdAt, ...incarnationCell(prior) })];
325
+ const lines = [JSON.stringify({ kind: "meta", ...meta })];
297
326
  for (const entry of validated) {
298
327
  lines.push(JSON.stringify({ kind: "entry", entry }));
299
328
  }
@@ -48,9 +48,9 @@ export declare const RESUME_CLAIM_SWEEP_INTERVAL_MS = 60000;
48
48
  */
49
49
  export declare const RESUME_CLAIM_REAP_GRACE_MS: number;
50
50
  export interface FileWorkflowJournalStoreOptions {
51
- /** Disclosure seat for a ledger line this store DROPPED on replay (not JSON, not a record, or a record
52
- * with none of this ledger's members) — a resume that silently finds "nothing to replay" re-runs the
53
- * work with no signal. Never fires on a missing ledger; swallow-guarded. */
51
+ /** Disclosure seat for a ledger line that is not one of the run's records (not JSON, not an object, no `scope` /
52
+ * `ordinal`, another scope) and — with the refusal, carrying the ledger's path — for whatever refused a `load`.
53
+ * Never fires on a missing ledger or on a crash's unterminated tail; swallow-guarded. */
54
54
  onCorruptRead?: (info: CorruptReadInfo) => void;
55
55
  }
56
56
  export declare class FileWorkflowJournalStore implements WorkflowJournalStore {
@@ -79,9 +79,15 @@ export declare class FileWorkflowJournalStore implements WorkflowJournalStore {
79
79
  /** CC local form: the run's on-disk journal path for the notification diagnostics line.
80
80
  * Traversal-shaped ids (LLM-controlled on some paths) degrade to undefined, never throw. */
81
81
  locator(runId: string): string | undefined;
82
- /** Replay a run's ledger: last-writer-wins per ordinal; a torn/unparsable line is skipped (uncommitted). */
82
+ /** Replay a run's ledger: last-writer-wins per ordinal, with every line that is not one of the run's records
83
+ * (`notRecords`) and the scope the first record fixes. Rows come back as written — which arm each one is, and
84
+ * whether anything refuses, is {@link load}'s question, so the scope lookup `append` makes refuses on nothing. */
83
85
  private replay;
84
86
  append(runId: string, scope: string, entry: WorkflowJournalEntry): Promise<void>;
87
+ /** The run's entries, ascending by ordinal, each winning line read through {@link readWorkflowJournalEntry}. A
88
+ * ledger line that is not one of the run's records, or a corrupt row, REFUSES the whole load: dropped, what it
89
+ * held would look never journaled and a resume would run it again. Only the unterminated tail a crash leaves is
90
+ * uncommitted. The location goes to `onCorruptRead`, not into the message; a superseded line is not read. */
85
91
  load(runId: string, scope: string): Promise<WorkflowJournalEntry[]>;
86
92
  /**
87
93
  * RB-242 — the claim file for `(sourceRunId, scope)`. Keyed by BOTH: a cross-scope caller already
@@ -1,18 +1,13 @@
1
1
  import { existsSync, mkdirSync, readFileSync, readdirSync, statSync, unlinkSync } from "node:fs";
2
2
  import { createHash } from "node:crypto";
3
3
  import { join } from "node:path";
4
- import { callKeyOrdinal } from "../../core/workflow-journal-store.js";
4
+ import { callKeyOrdinal, readWorkflowJournalEntry, WorkflowJournalIncompatibleError, } from "../../core/workflow-journal-store.js";
5
5
  import { AppendLog, readJsonlRecords } from "./fs-atomic.js";
6
6
  import { guardCorruptSink } from "./corrupt-read-sink.js";
7
7
  import { canonicalStoreKey, sanitizePathComponent, writeThenLink } from "./fs-atomic.js";
8
8
  import { assertAdoptionBootGate } from "./adoption/marker.js";
9
9
  import { assertJournalEntryFits } from "../../core/workflow-journal-store.js";
10
10
  export { MAX_JOURNAL_RESULT_BYTES, oversizeJournalResult } from "../../core/workflow-journal-store.js";
11
- function entryOf(rec) {
12
- if (rec.parked !== undefined)
13
- return { callKey: rec.callKey, parked: rec.parked };
14
- return { callKey: rec.callKey, result: rec.result };
15
- }
16
11
  export const RESUME_CLAIM_TTL_MS = 60 * 60 * 1000;
17
12
  export const RESUME_CLAIM_RELEASE_GRACE_MS = 5_000;
18
13
  export const RESUME_CLAIM_SWEEP_INTERVAL_MS = 60_000;
@@ -21,7 +16,7 @@ const sharedJournalDirs = new Map();
21
16
  const MAX_OPEN_JOURNAL_LOGS = 64;
22
17
  function isJournalLine(r) {
23
18
  const rec = r;
24
- return typeof rec.callKey === "string" && typeof rec.scope === "string" && Number.isFinite(rec.ordinal);
19
+ return typeof rec.scope === "string" && Number.isFinite(rec.ordinal);
25
20
  }
26
21
  export class FileWorkflowJournalStore {
27
22
  fsyncEnabled;
@@ -86,11 +81,17 @@ export class FileWorkflowJournalStore {
86
81
  scope ??= r.scope;
87
82
  return r.scope === scope;
88
83
  },
89
- what: "a journal line carries no callKey/scope pair, or a scope other than its run's first line",
84
+ what: "a journal line carries no scope/ordinal pair, or a scope other than its run's first line",
85
+ };
86
+ const notRecords = [];
87
+ const onCorrupt = (info) => {
88
+ if (info.kind === "record")
89
+ notRecords.push(info);
90
+ this.discloseCorrupt?.(info);
90
91
  };
91
- for (const rec of readJsonlRecords(path, this.discloseCorrupt, judge))
92
- byOrdinal.set(rec.ordinal, entryOf(rec));
93
- return scope === undefined ? undefined : { scope, byOrdinal };
92
+ for (const rec of readJsonlRecords(path, onCorrupt, judge))
93
+ byOrdinal.set(rec.ordinal, rec);
94
+ return { scope, byOrdinal, notRecords };
94
95
  }
95
96
  async append(runId, scope, entry) {
96
97
  assertJournalEntryFits(entry);
@@ -126,9 +127,23 @@ export class FileWorkflowJournalStore {
126
127
  }
127
128
  async load(runId, scope) {
128
129
  const rec = this.replay(runId);
129
- if (!rec || rec.scope !== scope)
130
+ if (!rec || (rec.scope !== undefined && rec.scope !== scope))
130
131
  return [];
131
- return [...rec.byOrdinal.entries()].sort((a, b) => a[0] - b[0]).map(([, e]) => e);
132
+ const lost = rec.notRecords[0];
133
+ if (lost !== undefined) {
134
+ this.discloseCorrupt?.({ kind: "file", path: this.pathFor(runId), reason: `${lost.form}: ledger line ${lost.line} is not one of the run's records (the run's journal is refused)` });
135
+ throw WorkflowJournalIncompatibleError.ledgerLine(runId, lost.line, lost.form);
136
+ }
137
+ const out = [];
138
+ for (const [ordinal, line] of [...rec.byOrdinal.entries()].sort((a, b) => a[0] - b[0])) {
139
+ const read = readWorkflowJournalEntry(line);
140
+ if ("corrupt" in read) {
141
+ this.discloseCorrupt?.({ kind: "file", path: this.pathFor(runId), reason: `${read.corrupt}: journal entry #${ordinal} ${read.why} (the run's journal is refused)` });
142
+ throw new WorkflowJournalIncompatibleError(runId, ordinal, line);
143
+ }
144
+ out.push(read.entry);
145
+ }
146
+ return out;
132
147
  }
133
148
  claimPathFor(sourceRunId, scope) {
134
149
  const scopeTag = createHash("sha256").update(scope).digest("hex").slice(0, 16);
@@ -1,6 +1,6 @@
1
1
  /**
2
2
  * The model-facing text of the Artifact tool. Every sentence is the upstream tool's wording, taken
3
- * byte-for-byte from the reference corpus (Claude Code 2.1.259, `cli259.js`; the line of each constant is
3
+ * byte-for-byte from the reference corpus (the line of each constant is
4
4
  * noted beside it) with one class of edit: a reference to a hosting product this library does not have
5
5
  * (`claude.ai`, its terminal/gallery/Slack surfaces, an `out_dir` save) is replaced by the smallest
6
6
  * neutral phrase. The replacement list is registered in the divergence register beside this package.
@@ -8,8 +8,8 @@ const ARTIFACT_ACTION_LEGS = {
8
8
  hosted: { publish: ["env", "outside_write"], list: ["outside_read"], read: ["outside_read"], list_files: ["outside_read"], read_file: ["outside_read"] },
9
9
  "local-stub": { publish: ["env"], list: [], read: [], list_files: [], read_file: [] },
10
10
  };
11
- import { ARTIFACT_TOOL_NAME, toolFace } from "../../core/tool-catalog-entries.js";
12
- import { resolveAsk } from "../../core/tool-policy.js";
11
+ import { ARTIFACT_TOOL_NAME, mountRuleFace, toolFace } from "../../core/tool-catalog-entries.js";
12
+ import { attest, resolveAsk } from "../../core/tool-policy.js";
13
13
  import { NOT_BINDABLE } from "../../core/skill-grant-binding.js";
14
14
  import { approvalCardOf } from "../../core/tool-roster.js";
15
15
  import { errorResult } from "../../core/tools.js";
@@ -328,7 +328,8 @@ export function createArtifactTool(opts) {
328
328
  if (sharedReadApproved.has(url))
329
329
  return Promise.resolve({ ok: true });
330
330
  if (permissionMode !== undefined) {
331
- const verdict = arbitrateByMode(permissionMode(), classifyAsk({ action: "ask", requiresRealApproval: true, guards: ["artifact_shared_read"] }, { contentQuestion: false, markedUnresolvable: false, org: undefined, tightened: undefined, mandateMarks: {} }));
331
+ const call = { toolCallId: ctx.toolCallId, toolName: ARTIFACT_TOOL_NAME };
332
+ const verdict = arbitrateByMode(permissionMode(), classifyAsk(attest({ action: "ask", requiresRealApproval: true }, call, { guards: ["artifact_shared_read"] }), { call, contentQuestion: false, markedUnresolvable: false, org: undefined, tightened: undefined, mandateMarks: {} }));
332
333
  if (verdict.kind === "released") {
333
334
  if (!releaseAnnounced && onNotice !== undefined) {
334
335
  releaseAnnounced = true;
@@ -448,6 +449,7 @@ export function createArtifactTool(opts) {
448
449
  return {
449
450
  name: ARTIFACT_TOOL_NAME,
450
451
  ...toolFace("artifact"),
452
+ ruleFace: mountRuleFace("artifact"),
451
453
  contentOrigin: ARTIFACT_PLANE_CONTENT_ORIGIN[caps.plane],
452
454
  description: artifactDescription(caps.plane, caps.actions),
453
455
  parameters: buildSchema(caps),
@@ -39,14 +39,27 @@ export declare const LOOP_LIST_HEADS: ReadonlySet<string>;
39
39
  * over control words and earlier assignments re-traces). One fact, two readers that must agree.
40
40
  */
41
41
  export declare function isLeadingAssignmentWord(words: readonly LexedWord[], i: number): boolean;
42
- export declare const PROGRAM_POSITION_REFUSAL_KINDS: readonly ["option_at_program_position", "control_syntax_at_program_position"];
42
+ export declare const PROGRAM_POSITION_REFUSAL_KINDS: readonly ["option_at_program_position", "control_syntax_at_program_position", "wildcard_program_word"];
43
43
  export type ProgramPositionRefusalKind = (typeof PROGRAM_POSITION_REFUSAL_KINDS)[number];
44
44
  /** Why the program could not be read — a closed set, each member minted into one sentence. `owner` is the word
45
45
  * that took the offending token: the control word or the first launcher of the chain. */
46
- export type ProgramPositionRefusal = {
46
+ export type ProgramPositionRefusal =
47
+ /** `endedBy`: the launcher whose bare `--` ended its options before this word — the word is then no option of anyone's
48
+ * but a name spelled like one (`env -- -i ls` runs a program named `-i`), and the sentence says that, not "the option". */
49
+ {
47
50
  readonly kind: "option_at_program_position";
48
51
  readonly owner: string;
49
52
  readonly option: string;
53
+ readonly endedBy?: string;
54
+ }
55
+ /** The program word carries an unquoted glob (`s[h]`, `s*h`, `./c?t`): the shell expands it against the filesystem,
56
+ * so which program runs — a shell among them — is not readable from the text (`touch sh; s[h] -c '…'`). `word` is the
57
+ * word as written, `at` its argv index (the words AFTER it are still handed over, so a deny operand still refuses).
58
+ * Both faces ask, the same as any unreadable program position. */
59
+ | {
60
+ readonly kind: "wildcard_program_word";
61
+ readonly word: string;
62
+ readonly at: number;
50
63
  } | {
51
64
  readonly kind: "control_syntax_at_program_position";
52
65
  readonly owner: string;
@@ -130,3 +143,7 @@ export declare function programPositionRunsShell(pos: ProgramPosition, runsShell
130
143
  export declare function shellScanDeclineOf(pos: ProgramPosition, acceptsStreamTarget: (basename: string) => boolean): ShellScanDecline | undefined;
131
144
  /** ONE sentence per refusal kind, minted here and nowhere else. */
132
145
  export declare function programPositionRefusalSentence(refusal: ProgramPositionRefusal): string;
146
+ /** The sentence a segment whose program the walk DECLINED carries, read off the segment's text — the program-position reader's own
147
+ * refusal, the stream fact, or that no program could be named: the read station's account of the segment and the removal guard's
148
+ * are this one sentence. */
149
+ export declare function declinedProgramSentence(text: string): string;