@sema-agent/core 7.48.0 → 7.49.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 (418) hide show
  1. package/CHANGELOG.md +418 -0
  2. package/README.md +2 -2
  3. package/dist/agents/cascade.d.ts +2 -5
  4. package/dist/agents/child-failure.d.ts +20 -0
  5. package/dist/agents/child-failure.js +28 -0
  6. package/dist/agents/cross-session-ref.d.ts +11 -3
  7. package/dist/agents/cross-session-ref.js +6 -0
  8. package/dist/agents/cumulative-stats.d.ts +12 -15
  9. package/dist/agents/cumulative-stats.js +1 -1
  10. package/dist/agents/extra-tool-names.js +1 -1
  11. package/dist/agents/inherited-tool-pool.d.ts +17 -13
  12. package/dist/agents/inherited-tool-pool.js +4 -3
  13. package/dist/agents/peer-session-drain.d.ts +3 -2
  14. package/dist/agents/peer-session-drain.js +5 -4
  15. package/dist/agents/send-message-tool.js +2 -9
  16. package/dist/agents/subagent.d.ts +10 -29
  17. package/dist/agents/subagent.js +65 -53
  18. package/dist/agents/suspend-guard.d.ts +1 -1
  19. package/dist/agents/tool-filter.d.ts +76 -65
  20. package/dist/agents/tool-filter.js +122 -92
  21. package/dist/agents/verify.d.ts +4 -7
  22. package/dist/agents/verify.js +6 -7
  23. package/dist/bench/metrics.d.ts +1 -2
  24. package/dist/brain/anthropic.js +133 -79
  25. package/dist/brain/errors.d.ts +53 -6
  26. package/dist/brain/errors.js +22 -2
  27. package/dist/brain/input-too-long.d.ts +40 -19
  28. package/dist/brain/input-too-long.js +3 -16
  29. package/dist/brain/open-responses.js +19 -10
  30. package/dist/brain/openai.js +123 -32
  31. package/dist/brain/provider-dialect.d.ts +214 -0
  32. package/dist/brain/provider-dialect.js +186 -0
  33. package/dist/brain/request-params.d.ts +27 -8
  34. package/dist/brain/request-params.js +7 -12
  35. package/dist/brain/request-route.d.ts +84 -0
  36. package/dist/brain/request-route.js +41 -0
  37. package/dist/brain/retry.d.ts +8 -0
  38. package/dist/brain/retry.js +10 -4
  39. package/dist/brain/route-adjudicator.d.ts +7 -0
  40. package/dist/brain/route-adjudicator.js +5 -1
  41. package/dist/brain/status-sink.d.ts +20 -0
  42. package/dist/brain/status-sink.js +11 -0
  43. package/dist/brain/stream-engine.d.ts +52 -1
  44. package/dist/brain/stream-engine.js +81 -24
  45. package/dist/brain/stream-shared.d.ts +57 -11
  46. package/dist/brain/stream-shared.js +28 -2
  47. package/dist/core/a2a.d.ts +1 -0
  48. package/dist/core/agent-config-dir.js +3 -2
  49. package/dist/core/allow-entry.d.ts +21 -12
  50. package/dist/core/allow-entry.js +38 -31
  51. package/dist/core/arg-summary.d.ts +17 -24
  52. package/dist/core/arg-summary.js +169 -68
  53. package/dist/core/ask-origin.d.ts +42 -24
  54. package/dist/core/ask-origin.js +18 -13
  55. package/dist/core/auto-mode-prompt-assets.d.ts +2 -2
  56. package/dist/core/auto-mode-prompt-assets.js +1 -1
  57. package/dist/core/auto-mode-prompt.d.ts +11 -1
  58. package/dist/core/auto-mode-prompt.js +13 -10
  59. package/dist/core/auto-mode-rebuild.d.ts +7 -0
  60. package/dist/core/auto-mode-rebuild.js +4 -1
  61. package/dist/core/canonical-json.d.ts +3 -0
  62. package/dist/core/canonical-json.js +2 -1
  63. package/dist/core/checkpoint-requirements.d.ts +892 -0
  64. package/dist/core/checkpoint-requirements.js +333 -0
  65. package/dist/core/checkpoint-store.d.ts +94 -65
  66. package/dist/core/checkpoint-store.js +14 -26
  67. package/dist/core/child-clamp-seats.d.ts +228 -69
  68. package/dist/core/child-clamp-seats.js +211 -17
  69. package/dist/core/classifier-unavailable-arm.d.ts +5 -1
  70. package/dist/core/classifier-unavailable-arm.js +3 -3
  71. package/dist/core/compliance.d.ts +3 -0
  72. package/dist/core/compliance.js +9 -4
  73. package/dist/core/credential-vocabulary.d.ts +140 -0
  74. package/dist/core/credential-vocabulary.js +131 -0
  75. package/dist/core/decision-receipt.js +1 -1
  76. package/dist/core/effective-path-target.d.ts +73 -16
  77. package/dist/core/effective-path-target.js +63 -33
  78. package/dist/core/engine-notice.d.ts +32 -7
  79. package/dist/core/file-history-store.js +2 -2
  80. package/dist/core/fs-write-gate-policy.d.ts +4 -0
  81. package/dist/core/fs-write-gate-policy.js +22 -5
  82. package/dist/core/gate-bounded-await.d.ts +28 -13
  83. package/dist/core/gate-bounded-await.js +41 -4
  84. package/dist/core/gate-fold.d.ts +1 -1
  85. package/dist/core/gate-fold.js +24 -25
  86. package/dist/core/gate-lanes.js +16 -15
  87. package/dist/core/gate-outcome.d.ts +20 -5
  88. package/dist/core/gate-outcome.js +5 -0
  89. package/dist/core/governance-codes.d.ts +11 -4
  90. package/dist/core/governance-codes.js +14 -3
  91. package/dist/core/hooks.d.ts +4 -0
  92. package/dist/core/locked-config.d.ts +8 -0
  93. package/dist/core/locked-config.js +14 -2
  94. package/dist/core/lsp.js +3 -5
  95. package/dist/core/mailbox-store.d.ts +3 -4
  96. package/dist/core/mcp-connection-pool.d.ts +75 -0
  97. package/dist/core/mcp-connection-pool.js +128 -0
  98. package/dist/core/mcp-failure.d.ts +2 -1
  99. package/dist/core/mcp-failure.js +13 -2
  100. package/dist/core/mcp.d.ts +4 -0
  101. package/dist/core/mcp.js +70 -43
  102. package/dist/core/memory-engine/content-origin.js +2 -14
  103. package/dist/core/memory-engine/engine.d.ts +32 -22
  104. package/dist/core/memory-engine/engine.js +103 -55
  105. package/dist/core/memory-engine/file-backend.d.ts +13 -30
  106. package/dist/core/memory-engine/file-backend.js +37 -252
  107. package/dist/core/memory-engine/index.d.ts +1 -1
  108. package/dist/core/memory-engine/index.js +1 -1
  109. package/dist/core/memory-engine/layout.d.ts +139 -9
  110. package/dist/core/memory-engine/layout.js +350 -7
  111. package/dist/core/memory-engine/scope-contract.d.ts +10 -0
  112. package/dist/core/memory-engine/scope-contract.js +8 -0
  113. package/dist/core/memory-engine/session-incarnation.d.ts +14 -4
  114. package/dist/core/memory-engine/session-incarnation.js +5 -2
  115. package/dist/core/memory-engine/types.d.ts +10 -1
  116. package/dist/core/memory.js +5 -17
  117. package/dist/core/model-seat.d.ts +4 -4
  118. package/dist/core/model-seat.js +1 -1
  119. package/dist/core/mounted-mcp.d.ts +57 -0
  120. package/dist/core/mounted-mcp.js +19 -0
  121. package/dist/core/namespaced-rule-name.d.ts +29 -0
  122. package/dist/core/namespaced-rule-name.js +52 -0
  123. package/dist/core/park-selfcheck.d.ts +1 -1
  124. package/dist/core/park-selfcheck.js +16 -6
  125. package/dist/core/path-guard-rows.d.ts +99 -0
  126. package/dist/core/path-guard-rows.js +45 -0
  127. package/dist/core/path-identity.d.ts +22 -16
  128. package/dist/core/path-identity.js +10 -10
  129. package/dist/core/path-rule-binding.d.ts +2 -1
  130. package/dist/core/path-rule-binding.js +3 -1
  131. package/dist/core/pause-registry.d.ts +16 -2
  132. package/dist/core/pause-registry.js +6 -0
  133. package/dist/core/permission-rule-consent.js +0 -7
  134. package/dist/core/permission-rule-model.d.ts +68 -24
  135. package/dist/core/permission-rule-model.js +105 -24
  136. package/dist/core/permission-rule-store.js +2 -2
  137. package/dist/core/permission-rules.d.ts +3 -30
  138. package/dist/core/permission-rules.js +4 -54
  139. package/dist/core/read-root-candidate.d.ts +1 -3
  140. package/dist/core/read-root-candidate.js +4 -15
  141. package/dist/core/real-approval.d.ts +4 -3
  142. package/dist/core/retired-keys.d.ts +13 -0
  143. package/dist/core/retired-keys.js +14 -0
  144. package/dist/core/roles.d.ts +2 -3
  145. package/dist/core/roles.js +15 -6
  146. package/dist/core/runner/assemble-result.d.ts +0 -7
  147. package/dist/core/runner/assemble-result.js +19 -31
  148. package/dist/core/runner/caller-roster.d.ts +78 -0
  149. package/dist/core/runner/caller-roster.js +219 -0
  150. package/dist/core/runner/checkpoint-scope.d.ts +16 -16
  151. package/dist/core/runner/checkpoint-scope.js +2 -2
  152. package/dist/core/runner/child-tree.js +2 -2
  153. package/dist/core/runner/contracts.d.ts +68 -35
  154. package/dist/core/runner/decide-continuation.d.ts +51 -3
  155. package/dist/core/runner/decide-continuation.js +76 -21
  156. package/dist/core/runner/denial-limit-arms.d.ts +17 -5
  157. package/dist/core/runner/denial-limit-arms.js +11 -9
  158. package/dist/core/runner/extra-body-dropped-seat.d.ts +8 -0
  159. package/dist/core/runner/extra-body-dropped-seat.js +22 -0
  160. package/dist/core/runner/finish-reason-seat.d.ts +9 -0
  161. package/dist/core/runner/finish-reason-seat.js +40 -0
  162. package/dist/core/runner/gate-exit.d.ts +44 -32
  163. package/dist/core/runner/gate-exit.js +112 -25
  164. package/dist/core/runner/inherited-ask-grants.js +6 -4
  165. package/dist/core/runner/mcp-redial.d.ts +3 -3
  166. package/dist/core/runner/mcp-redial.js +3 -4
  167. package/dist/core/runner/permission-rule-lanes.d.ts +1 -2
  168. package/dist/core/runner/permission-rule-lanes.js +5 -4
  169. package/dist/core/runner/prepare-artifact.d.ts +4 -0
  170. package/dist/core/runner/prepare-artifact.js +2 -1
  171. package/dist/core/runner/prepare-ask-lane.d.ts +2 -0
  172. package/dist/core/runner/prepare-ask-lane.js +12 -6
  173. package/dist/core/runner/prepare-boundary-parks.d.ts +5 -8
  174. package/dist/core/runner/prepare-boundary-parks.js +4 -7
  175. package/dist/core/runner/prepare-caps-and-workflow.d.ts +11 -15
  176. package/dist/core/runner/prepare-caps-and-workflow.js +19 -27
  177. package/dist/core/runner/prepare-config-doors.d.ts +9 -9
  178. package/dist/core/runner/prepare-config-doors.js +10 -5
  179. package/dist/core/runner/prepare-defer-classify.d.ts +2 -2
  180. package/dist/core/runner/prepare-defer-classify.js +5 -3
  181. package/dist/core/runner/prepare-delegation-surface.d.ts +1 -1
  182. package/dist/core/runner/prepare-delegation-surface.js +3 -3
  183. package/dist/core/runner/prepare-gate-stations.d.ts +4 -4
  184. package/dist/core/runner/prepare-gate-stations.js +9 -7
  185. package/dist/core/runner/prepare-hands-readface.d.ts +7 -7
  186. package/dist/core/runner/prepare-hands-readface.js +7 -7
  187. package/dist/core/runner/prepare-inherited-gate.d.ts +7 -6
  188. package/dist/core/runner/prepare-inherited-gate.js +14 -15
  189. package/dist/core/runner/prepare-listings.d.ts +7 -24
  190. package/dist/core/runner/prepare-listings.js +4 -5
  191. package/dist/core/runner/prepare-memory-engine-session.d.ts +2 -0
  192. package/dist/core/runner/prepare-memory-engine-session.js +4 -3
  193. package/dist/core/runner/prepare-memory.d.ts +6 -0
  194. package/dist/core/runner/prepare-memory.js +13 -13
  195. package/dist/core/runner/prepare-offload-wrappers.d.ts +5 -0
  196. package/dist/core/runner/prepare-offload-wrappers.js +3 -3
  197. package/dist/core/runner/prepare-park-ask.d.ts +7 -8
  198. package/dist/core/runner/prepare-park-ask.js +17 -10
  199. package/dist/core/runner/prepare-policy-chain.js +24 -44
  200. package/dist/core/runner/prepare-project-context.d.ts +1 -1
  201. package/dist/core/runner/prepare-project-context.js +3 -4
  202. package/dist/core/runner/prepare-protocol-tools.d.ts +9 -3
  203. package/dist/core/runner/prepare-protocol-tools.js +3 -4
  204. package/dist/core/runner/prepare-run-refs.d.ts +3 -0
  205. package/dist/core/runner/prepare-run-refs.js +2 -1
  206. package/dist/core/runner/prepare-safety-scan.d.ts +4 -8
  207. package/dist/core/runner/prepare-safety-scan.js +1 -2
  208. package/dist/core/runner/prepare-suspend-saga.d.ts +7 -1
  209. package/dist/core/runner/prepare-suspend-saga.js +28 -12
  210. package/dist/core/runner/prepare-task.d.ts +1 -1
  211. package/dist/core/runner/prepare-task.js +67 -56
  212. package/dist/core/runner/prepare-wiring-manifest.d.ts +11 -10
  213. package/dist/core/runner/prepare-wiring-manifest.js +5 -8
  214. package/dist/core/runner/resume-apply.js +7 -14
  215. package/dist/core/runner/resume-checkpoint-screen.js +11 -4
  216. package/dist/core/runner/resume-internals-and-config.js +2 -2
  217. package/dist/core/runner/resume-policy-outcome.js +5 -32
  218. package/dist/core/runner/resume-review-outcome.js +4 -1
  219. package/dist/core/runner/retired-runner-deps.d.ts +6 -0
  220. package/dist/core/runner/retired-runner-deps.js +10 -1
  221. package/dist/core/runner/run-brain-sinks.d.ts +4 -0
  222. package/dist/core/runner/run-brain-sinks.js +5 -2
  223. package/dist/core/runner/run-harness-handlers.js +27 -34
  224. package/dist/core/runner/run-leg.d.ts +0 -2
  225. package/dist/core/runner/run-leg.js +32 -33
  226. package/dist/core/runner/run-terminal-adoption.js +4 -3
  227. package/dist/core/runner/runtask.js +8 -8
  228. package/dist/core/runner/session-rule-policy.js +5 -5
  229. package/dist/core/runner/stream-settle-backstop.js +7 -4
  230. package/dist/core/runner/sub-agent-deny-lists.d.ts +51 -12
  231. package/dist/core/runner/sub-agent-deny-lists.js +111 -80
  232. package/dist/core/runner/terminal-account.d.ts +48 -0
  233. package/dist/core/runner/terminal-account.js +186 -0
  234. package/dist/core/runner/tool-end-body.d.ts +54 -17
  235. package/dist/core/runner/tool-end-body.js +27 -2
  236. package/dist/core/runner/tool-face-overlay.d.ts +3 -1
  237. package/dist/core/runner/tool-face-overlay.js +6 -4
  238. package/dist/core/runner/tool-occurrence.d.ts +106 -0
  239. package/dist/core/runner/tool-occurrence.js +123 -0
  240. package/dist/core/runner/tool-progress-lane.d.ts +16 -8
  241. package/dist/core/runner/tool-progress-lane.js +25 -34
  242. package/dist/core/runner/turn-attachments.d.ts +1 -1
  243. package/dist/core/runner/write-protection-station.d.ts +21 -9
  244. package/dist/core/runner/write-protection-station.js +20 -17
  245. package/dist/core/runner-deps.d.ts +12 -22
  246. package/dist/core/secret-env.d.ts +16 -5
  247. package/dist/core/secret-env.js +23 -63
  248. package/dist/core/sensitive-path-policy.d.ts +19 -18
  249. package/dist/core/sensitive-path-policy.js +73 -49
  250. package/dist/core/session-reconcile.d.ts +3 -0
  251. package/dist/core/session-reconcile.js +5 -4
  252. package/dist/core/session-store.d.ts +5 -0
  253. package/dist/core/session-store.js +12 -0
  254. package/dist/core/session.d.ts +13 -0
  255. package/dist/core/shared-memory/normalize.d.ts +17 -4
  256. package/dist/core/shared-memory/normalize.js +7 -7
  257. package/dist/core/shell-lexer.js +5 -4
  258. package/dist/core/skill-grant.js +1 -1
  259. package/dist/core/store-contracts/checkpoint-store-contract.js +13 -0
  260. package/dist/core/store-contracts/mailbox-store-contract.d.ts +7 -14
  261. package/dist/core/store-contracts/session-store-incarnation-contract.d.ts +27 -0
  262. package/dist/core/store-contracts/session-store-incarnation-contract.js +92 -0
  263. package/dist/core/stub-env.d.ts +2 -0
  264. package/dist/core/stub-env.js +1 -0
  265. package/dist/core/synthetic-read-verdict.js +2 -2
  266. package/dist/core/task-event.d.ts +59 -5
  267. package/dist/core/task-result.d.ts +1 -1
  268. package/dist/core/task-spec.d.ts +42 -9
  269. package/dist/core/terminal-cause.d.ts +94 -11
  270. package/dist/core/tighten-task-spec.d.ts +5 -4
  271. package/dist/core/tighten-task-spec.js +20 -25
  272. package/dist/core/tool-catalog-entries.d.ts +5 -7
  273. package/dist/core/tool-catalog-entries.js +14 -15
  274. package/dist/core/tool-face.d.ts +47 -0
  275. package/dist/core/tool-face.js +5 -0
  276. package/dist/core/tool-model-gate.d.ts +5 -5
  277. package/dist/core/tool-name-aliases.d.ts +26 -2
  278. package/dist/core/tool-name-aliases.js +13 -0
  279. package/dist/core/tool-name-list.d.ts +30 -0
  280. package/dist/core/tool-name-list.js +55 -0
  281. package/dist/core/tool-name-readings.d.ts +1 -9
  282. package/dist/core/tool-name-readings.js +1 -3
  283. package/dist/core/tool-policy.d.ts +195 -85
  284. package/dist/core/tool-policy.js +165 -380
  285. package/dist/core/tool-registry.d.ts +44 -1
  286. package/dist/core/tool-registry.js +26 -0
  287. package/dist/core/tool-roster.d.ts +19 -1
  288. package/dist/core/tool-roster.js +21 -2
  289. package/dist/core/tool-spec-members.d.ts +45 -0
  290. package/dist/core/tool-spec-members.js +169 -0
  291. package/dist/core/tool-spec.d.ts +46 -8
  292. package/dist/core/tools.d.ts +6 -2
  293. package/dist/core/tools.js +8 -4
  294. package/dist/core/untrusted-egress.js +29 -26
  295. package/dist/core/untrusted-text.d.ts +13 -10
  296. package/dist/core/untrusted-text.js +6 -44
  297. package/dist/core/workflow-journal-store.d.ts +4 -1
  298. package/dist/core/write-protect.d.ts +65 -29
  299. package/dist/core/write-protect.js +235 -177
  300. package/dist/engine/compaction/compaction.d.ts +2 -2
  301. package/dist/engine/execution-env/node-execution-env.d.ts +5 -23
  302. package/dist/engine/execution-env/node-execution-env.js +16 -38
  303. package/dist/engine/execution-env/symlink-chain.d.ts +23 -0
  304. package/dist/engine/execution-env/symlink-chain.js +32 -0
  305. package/dist/engine/harness/types.d.ts +7 -0
  306. package/dist/engine/llm/tool-turns.d.ts +3 -0
  307. package/dist/engine/llm/tool-turns.js +1 -0
  308. package/dist/engine/llm/types.d.ts +59 -23
  309. package/dist/engine/loop/agent-loop.js +16 -2
  310. package/dist/engine/session/memory-repo.js +11 -3
  311. package/dist/engine/session/repo-utils.d.ts +8 -0
  312. package/dist/engine/session/repo-utils.js +13 -0
  313. package/dist/index.d.ts +20 -23
  314. package/dist/index.js +17 -20
  315. package/dist/internal/harness.d.ts +1 -1
  316. package/dist/internal/harness.js +1 -1
  317. package/dist/internal/llm.d.ts +2 -2
  318. package/dist/internal/llm.js +1 -1
  319. package/dist/orchestration/governance-baseline-validity.js +1 -1
  320. package/dist/orchestration/run-spec.js +3 -3
  321. package/dist/orchestration/run-workflow-tool.d.ts +16 -35
  322. package/dist/orchestration/run-workflow-tool.js +38 -78
  323. package/dist/orchestration/workflow-governance.d.ts +21 -25
  324. package/dist/orchestration/workflow-governance.js +38 -78
  325. package/dist/orchestration/workflow-primitives.d.ts +7 -22
  326. package/dist/orchestration/workflow-primitives.js +5 -12
  327. package/dist/orchestration/workflow-types.d.ts +1 -1
  328. package/dist/orchestration/workflow.d.ts +61 -11
  329. package/dist/orchestration/workflow.js +189 -117
  330. package/dist/scenarios/full-body.d.ts +1 -1
  331. package/dist/shell/lex.d.ts +0 -21
  332. package/dist/shell/lex.js +250 -68
  333. package/dist/shell/shell-words.d.ts +35 -0
  334. package/dist/shell/shell-words.js +65 -0
  335. package/dist/stores/file/checkpoint-store.d.ts +5 -5
  336. package/dist/stores/file/checkpoint-store.js +5 -2
  337. package/dist/stores/file/index.d.ts +0 -8
  338. package/dist/stores/file/index.js +0 -12
  339. package/dist/stores/file/session-store.d.ts +3 -0
  340. package/dist/stores/file/session-store.js +44 -19
  341. package/dist/tools/artifact/artifact-tool.js +2 -0
  342. package/dist/tools/fs/bash-program-position.d.ts +10 -3
  343. package/dist/tools/fs/bash-program-position.js +21 -9
  344. package/dist/tools/fs/bash-readonly-classifier.d.ts +1 -1
  345. package/dist/tools/fs/bash-readonly-classifier.js +8 -7
  346. package/dist/tools/fs/containment-face.d.ts +4 -0
  347. package/dist/tools/fs/containment-face.js +3 -0
  348. package/dist/tools/fs/fs-shared.d.ts +10 -0
  349. package/dist/tools/fs/fs-shared.js +18 -0
  350. package/dist/tools/fs/fs-write.js +4 -2
  351. package/dist/tools/fs/index.d.ts +1 -1
  352. package/dist/tools/fs/program-read-model.d.ts +39 -18
  353. package/dist/tools/fs/program-read-model.js +29 -19
  354. package/dist/tools/fs/program-read-model.rows.d.ts +0 -14
  355. package/dist/tools/fs/program-read-model.rows.js +5 -5
  356. package/dist/tools/fs/read-deny-home.d.ts +33 -47
  357. package/dist/tools/fs/read-deny-home.js +35 -49
  358. package/dist/tools/fs/read-deny.d.ts +23 -22
  359. package/dist/tools/fs/read-deny.js +114 -89
  360. package/dist/tools/fs/removal-targets.d.ts +56 -23
  361. package/dist/tools/fs/removal-targets.js +65 -87
  362. package/dist/tools/fs/safety.d.ts +29 -22
  363. package/dist/tools/fs/safety.js +17 -11
  364. package/dist/tools/fs/search.js +10 -8
  365. package/dist/tools/fs/shell-read-argv.js +1 -1
  366. package/dist/tools/fs/shell-read-bindings.d.ts +169 -37
  367. package/dist/tools/fs/shell-read-bindings.js +324 -86
  368. package/dist/tools/fs/shell-read-builtins.d.ts +35 -0
  369. package/dist/tools/fs/shell-read-builtins.js +43 -0
  370. package/dist/tools/fs/shell-read-check.d.ts +15 -1
  371. package/dist/tools/fs/shell-read-check.js +51 -42
  372. package/dist/tools/fs/shell-read-establish.js +6 -6
  373. package/dist/tools/fs/shell-read-functions.d.ts +22 -0
  374. package/dist/tools/fs/shell-read-functions.js +29 -0
  375. package/dist/tools/fs/shell-read-judge.d.ts +48 -18
  376. package/dist/tools/fs/shell-read-judge.js +33 -4
  377. package/dist/tools/fs/shell-read-plan.d.ts +12 -6
  378. package/dist/tools/fs/shell-read-plan.js +118 -113
  379. package/dist/tools/fs/shell-read-start.d.ts +29 -6
  380. package/dist/tools/fs/shell-read-start.js +16 -9
  381. package/dist/tools/fs/shell-read-word.js +4 -0
  382. package/dist/tools/fs/shell-read-workdir.d.ts +156 -0
  383. package/dist/tools/fs/shell-read-workdir.js +281 -0
  384. package/dist/tools/fs/shell-read-write-targets.d.ts +5 -2
  385. package/dist/tools/fs/shell-read-write-targets.js +14 -5
  386. package/dist/tools/fs/shell-reentry-text.d.ts +4 -6
  387. package/dist/tools/fs/shell-reentry-text.js +3 -11
  388. package/dist/tools/task-list.d.ts +1 -2
  389. package/dist/tools/web.js +1 -1
  390. package/package.json +4 -1
  391. package/test/export-surface.snapshot.json +107 -143
  392. package/wire-changes/core@7.49.0.json +4765 -0
  393. package/dist/agents/teacher.d.ts +0 -159
  394. package/dist/agents/teacher.js +0 -577
  395. package/dist/agents/team.d.ts +0 -226
  396. package/dist/agents/team.js +0 -257
  397. package/dist/core/strategy-store.d.ts +0 -238
  398. package/dist/core/strategy-store.js +0 -253
  399. package/dist/orchestration/builtin-workflows.d.ts +0 -133
  400. package/dist/orchestration/builtin-workflows.js +0 -159
  401. package/dist/scenarios/env.d.ts +0 -40
  402. package/dist/scenarios/env.js +0 -39
  403. package/dist/scenarios/scenario-registry.d.ts +0 -110
  404. package/dist/scenarios/scenario-registry.js +0 -140
  405. package/dist/scenarios/teacher-quickstart.d.ts +0 -40
  406. package/dist/scenarios/teacher-quickstart.js +0 -12
  407. package/dist/stores/cc/lockfile.d.ts +0 -10
  408. package/dist/stores/cc/lockfile.js +0 -98
  409. package/dist/stores/cc/mailbox-store.d.ts +0 -20
  410. package/dist/stores/cc/mailbox-store.js +0 -255
  411. package/dist/stores/cc/roster-adapter.d.ts +0 -12
  412. package/dist/stores/cc/roster-adapter.js +0 -117
  413. package/dist/stores/cc/sidecar-transcript.d.ts +0 -97
  414. package/dist/stores/cc/sidecar-transcript.js +0 -264
  415. package/dist/stores/cc/task-list-store.d.ts +0 -2
  416. package/dist/stores/cc/task-list-store.js +0 -125
  417. package/dist/stores/file/strategy-store.d.ts +0 -97
  418. package/dist/stores/file/strategy-store.js +0 -341
@@ -1,97 +0,0 @@
1
- import { type StoredStrategy, type StrategyStore, type StrategyStoreIncident } from "../../core/strategy-store.js";
2
- /**
3
- * File-backed {@link StrategyStore} — the persistence twin of `InMemoryStrategyStore`, so the teacher
4
- * mode's cross-session reuse premise actually holds on a local (TOC) deployment where every session is
5
- * a fresh process (an in-memory strategy repository there re-learns everything, every time).
6
- *
7
- * DESIGN STANCE — this is a **cache, not an authority store**: every entry is regenerable (worst case:
8
- * ask the teacher again), so losing one never loses correctness. It therefore deliberately skips the
9
- * journal/shadow armor of the memory file backend and does NOT fsync-harden beyond the shared
10
- * atomic-write primitive, does NOT take a cross-process lock, and accepts a narrow multi-process race
11
- * on save-side dedup (two processes can each write one copy of the same normalized entry — the read
12
- * side dedups, and a lost max-confidence merge is cache-grade). What it does NOT relax: scope
13
- * isolation and loud-refusal discipline, which are held to the same standard as the durable stores.
14
- *
15
- * Layout: `<root>/<scopeDir>/<id>.json`, one strategy per file, whole-file atomic replace on write.
16
- * `scopeDir = slug(scope) + "-" + sha256(scope).slice(0,24)` — the slug is a strict `[a-z0-9-]`
17
- * whitelist purely for readability; IDENTITY lives in the 96-bit hash, so no scope value, however
18
- * adversarial, can traverse out of the root or collide another scope's directory. Ids are gated to
19
- * `[A-Za-z0-9_-]{1,64}` at save (the escalation loop mints UUIDs; the interface is public, so a
20
- * hand-rolled id must not be able to name a path).
21
- *
22
- * `scope` is a NAMESPACE, not an authorization boundary — the store cannot authenticate its caller;
23
- * whoever holds the instance can address any scope (same posture as the memory store). Authorization
24
- * is the host's obligation.
25
- */
26
- export interface FileStrategyStoreOptions {
27
- /** Directory to keep strategies under (created `0o700` if absent; a non-directory or unwritable
28
- * path is refused loudly at construction — a store that cannot persist must not pretend to). */
29
- root: string;
30
- /** Per-scope capacity cap (entries), evicting the lowest-scoring on overflow. Default 100. */
31
- maxPerScope?: number;
32
- /**
33
- * Disclosure sink for contained store incidents (a corrupt entry quarantined, an eviction that
34
- * failed after a successful save, a degraded read). Absent ⇒ `console.warn`, once per op kind —
35
- * a contained fault must be loud somewhere, but must never flood.
36
- */
37
- onIncident?: (i: StrategyStoreIncident) => void;
38
- }
39
- export declare class FileStrategyStore implements StrategyStore {
40
- private readonly root;
41
- private readonly maxPerScope;
42
- private readonly onIncident?;
43
- /** Ops that already warned on the absent-sink fallback (bounded disclosure — never flood). */
44
- private readonly warnedOps;
45
- /** Isolation scope for the host incident sink (sync throw AND async rejection contained). */
46
- private readonly sinkNotifier;
47
- /** Scope dirs whose stale temps this instance already swept (once per scope per instance). */
48
- private readonly sweptTemps;
49
- constructor(opts: FileStrategyStoreOptions);
50
- /** `slug(scope)-sha256(scope)[0..24]` — slug is readability only; the hash is the injective key. */
51
- private scopeDirName;
52
- private scopeDirPath;
53
- /** The scope dir must be a REAL directory — a symlink here means the store's namespace was tampered
54
- * with (a link could point retrieval at another scope's data, or writes out of the root). The
55
- * check-then-use window against a same-uid untrusted local process is out of the threat model: such a
56
- * process already holds the same rights as the store itself. */
57
- private assertScopeDirSafe;
58
- private incident;
59
- /** Sweep crashed writers' stale temps (once per scope per instance). Fresh temps are left alone —
60
- * they may belong to a live concurrent writer. */
61
- private sweepStaleTemps;
62
- /** Load every VALID entry of a scope dir. Corrupt files are quarantined (`.bad` rename) with one
63
- * disclosure; entries that violate the read-side invariants (foreign scope / id≠filename) are
64
- * skipped with disclosure but NOT quarantined (a copied-in file may be someone's valid data);
65
- * normalized duplicates collapse to the best-scoring copy. */
66
- private loadScope;
67
- /** Rename a corrupt file to `<name>.bad` — one disclosure now, zero parse cost on every later read
68
- * (the suffix no longer matches the entry-file grammar). Never faults the calling operation. */
69
- private quarantine;
70
- /** Serialize + write one entry, refusing a record whose SERIALIZED form exceeds the read bound.
71
- * The field caps bound RAW string bytes, but JSON escaping expands control characters up to 6x —
72
- * without this door a save could succeed and then self-quarantine on the very next read (the
73
- * worst possible shape: an accepted write the store itself later refuses to serve). */
74
- private writeEntry;
75
- save(s: StoredStrategy): void;
76
- private evict;
77
- find(scope: string, query: string, limit: number): StoredStrategy[];
78
- /** Bounded candidate view for the RETRIEVAL-adjacent paths (find/hasStrategy/save): an externally
79
- * inflated directory must not make a hot operation unbounded. MAINTENANCE passes Infinity — see
80
- * {@link prune}. */
81
- private retrievalReadCap;
82
- /**
83
- * Trims to `maxSize` over an UNCAPPED enumeration: prune is the reconciliation verb, so it must see
84
- * every entry file — under the bounded retrieval view, a capacity SHRINK across restarts (or
85
- * `maxPerScope: 0`) left files beyond the window untouched, reporting success while the "removed"
86
- * strategies sat on disk ready to resurrect under a later, larger capacity. Host-invoked
87
- * maintenance accepts the O(all files) cost the retrieval path refuses.
88
- */
89
- prune(scope: string, maxSize: number): void;
90
- /** Uncapped for the same reason as {@link prune}: this face feeds the seed capacity door, and an
91
- * under-count there turns "refuse what cannot fit" into silent eviction of fresh seeds. */
92
- scopeUsage(scope: string): {
93
- used: number;
94
- capacity: number;
95
- };
96
- hasStrategy(scope: string, entry: Pick<StoredStrategy, "problem" | "strategy">): boolean;
97
- }
@@ -1,341 +0,0 @@
1
- import { accessSync, constants as FS, lstatSync, mkdirSync, readFileSync, readdirSync, renameSync, statSync, unlinkSync } from "node:fs";
2
- import { join } from "node:path";
3
- import { createHash } from "node:crypto";
4
- import { atomicWriteFile } from "./fs-atomic.js";
5
- import { createSafeNotifier, observeThenableRejection } from "../../core/safe-notify.js";
6
- import { thrownText } from "../../core/thrown-value.js";
7
- import { MAX_STRATEGY_INJECTION_TOTAL_BYTES, MAX_STRATEGY_TEXT_BYTES, compileStrategyQuery, resolveCapacityCap, resolveFindLimit, scoreStoredStrategy, storedStrategyShapeIssue, strategyDedupKey, validateStrategyForWrite, } from "../../core/strategy-store.js";
8
- function configRefusal(message, code) {
9
- const e = new Error(message);
10
- e.code = code;
11
- return e;
12
- }
13
- const SCOPE_SLUG_MAX = 40;
14
- const READ_FILE_CAP_FACTOR = 4;
15
- const STALE_TEMP_MS = 60 * 60 * 1000;
16
- const MAX_ENTRY_FILE_BYTES = 65536;
17
- const FILE_RE = /^([A-Za-z0-9_-]{1,64})\.json$/;
18
- export class FileStrategyStore {
19
- root;
20
- maxPerScope;
21
- onIncident;
22
- warnedOps = new Set();
23
- sinkNotifier = createSafeNotifier();
24
- sweptTemps = new Set();
25
- constructor(opts) {
26
- this.maxPerScope = resolveCapacityCap("maxPerScope", opts.maxPerScope ?? 100);
27
- this.onIncident = opts.onIncident;
28
- const root = opts.root;
29
- if (typeof root !== "string" || root.length === 0) {
30
- throw configRefusal("FileStrategyStore: root must be a non-empty path", "config.strategy_root_invalid");
31
- }
32
- try {
33
- mkdirSync(root, { recursive: true, mode: 0o700 });
34
- }
35
- catch (err) {
36
- throw configRefusal(`FileStrategyStore: cannot create root ${root}: ${thrownText(err)}`, "config.strategy_root_invalid");
37
- }
38
- let st;
39
- try {
40
- st = statSync(root);
41
- }
42
- catch (err) {
43
- throw configRefusal(`FileStrategyStore: cannot stat root ${root}: ${thrownText(err)}`, "config.strategy_root_invalid");
44
- }
45
- if (!st.isDirectory()) {
46
- throw configRefusal(`FileStrategyStore: root ${root} exists and is not a directory`, "config.strategy_root_invalid");
47
- }
48
- try {
49
- accessSync(root, FS.W_OK);
50
- }
51
- catch {
52
- throw configRefusal(`FileStrategyStore: root ${root} is not writable`, "config.strategy_root_invalid");
53
- }
54
- this.root = root;
55
- }
56
- scopeDirName(scope) {
57
- const slug = scope
58
- .toLowerCase()
59
- .replace(/[^a-z0-9-]+/g, "-")
60
- .replace(/^-+|-+$/g, "")
61
- .slice(0, SCOPE_SLUG_MAX);
62
- const h = createHash("sha256").update(scope, "utf8").digest("hex").slice(0, 24);
63
- return `${slug || "s"}-${h}`;
64
- }
65
- scopeDirPath(scope) {
66
- return join(this.root, this.scopeDirName(scope));
67
- }
68
- assertScopeDirSafe(dir) {
69
- let st;
70
- try {
71
- st = lstatSync(dir);
72
- }
73
- catch (err) {
74
- if (err.code === "ENOENT")
75
- return;
76
- throw err;
77
- }
78
- if (st.isSymbolicLink() || !st.isDirectory()) {
79
- const e = new Error(`FileStrategyStore: scope directory ${dir} is not a plain directory (symlink or non-dir refused)`);
80
- e.code = "strategy.scope_dir_invalid";
81
- throw e;
82
- }
83
- }
84
- incident(i) {
85
- const sink = this.onIncident;
86
- if (sink !== undefined) {
87
- const site = `FileStrategyStore.onIncident.${i.op}`;
88
- this.sinkNotifier.notify(() => observeThenableRejection(sink(i), this.sinkNotifier, site), site);
89
- return;
90
- }
91
- if (!this.warnedOps.has(i.op)) {
92
- this.warnedOps.add(i.op);
93
- console.warn(`FileStrategyStore ${i.op} incident: ${i.error}${i.path !== undefined ? ` (${i.path})` : ""}`);
94
- }
95
- }
96
- sweepStaleTemps(dir) {
97
- if (this.sweptTemps.has(dir))
98
- return;
99
- this.sweptTemps.add(dir);
100
- let names;
101
- try {
102
- names = readdirSync(dir);
103
- }
104
- catch {
105
- return;
106
- }
107
- const cutoff = Date.now() - STALE_TEMP_MS;
108
- for (const name of names) {
109
- if (!name.endsWith(".tmp"))
110
- continue;
111
- const p = join(dir, name);
112
- try {
113
- if (statSync(p).mtimeMs < cutoff)
114
- unlinkSync(p);
115
- }
116
- catch {
117
- }
118
- }
119
- }
120
- loadScope(scope, dir, readCap) {
121
- let names;
122
- try {
123
- names = readdirSync(dir);
124
- }
125
- catch (err) {
126
- if (err.code === "ENOENT")
127
- return [];
128
- throw err;
129
- }
130
- let candidates = names.filter((n) => FILE_RE.test(n)).sort();
131
- if (Number.isFinite(readCap) && candidates.length > readCap) {
132
- this.incident({
133
- op: "find",
134
- error: `scope directory holds ${candidates.length} entry files, over the ${readCap} read cap — parsing the first ${readCap} only (an external writer likely inflated this directory)`,
135
- path: dir,
136
- });
137
- candidates = candidates.slice(0, readCap);
138
- }
139
- const out = [];
140
- for (const name of candidates) {
141
- const p = join(dir, name);
142
- let fst;
143
- try {
144
- fst = lstatSync(p);
145
- }
146
- catch (err) {
147
- if (err.code === "ENOENT")
148
- continue;
149
- this.incident({ op: "find", error: `unstat-able entry skipped: ${thrownText(err)}`, path: p });
150
- continue;
151
- }
152
- if (!fst.isFile()) {
153
- this.incident({ op: "find", error: "non-regular entry skipped (symlink or special file refused)", path: p });
154
- continue;
155
- }
156
- if (fst.size > MAX_ENTRY_FILE_BYTES) {
157
- this.quarantine(p, `entry file is ${fst.size} bytes, over the ${MAX_ENTRY_FILE_BYTES} read bound`);
158
- continue;
159
- }
160
- let raw;
161
- try {
162
- raw = readFileSync(p, "utf8");
163
- }
164
- catch (err) {
165
- if (err.code === "ENOENT")
166
- continue;
167
- this.incident({ op: "find", error: `unreadable entry skipped: ${thrownText(err)}`, path: p });
168
- continue;
169
- }
170
- let parsed;
171
- try {
172
- parsed = JSON.parse(raw);
173
- }
174
- catch {
175
- this.quarantine(p, "unparseable JSON");
176
- continue;
177
- }
178
- if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
179
- this.quarantine(p, "top-level JSON value is not an object");
180
- continue;
181
- }
182
- const rec = parsed;
183
- if (rec.v !== 1) {
184
- this.incident({ op: "parse", error: `unknown schema version ${String(rec.v)} — entry skipped, file left in place`, path: p });
185
- continue;
186
- }
187
- const { v: _v, ...candidate } = rec;
188
- const issue = storedStrategyShapeIssue(candidate);
189
- if (issue !== null) {
190
- this.quarantine(p, issue);
191
- continue;
192
- }
193
- const entry = candidate;
194
- const fileId = FILE_RE.exec(name)[1];
195
- if (entry.scope !== scope || entry.id !== fileId) {
196
- this.incident({
197
- op: "find",
198
- error: `entry skipped: scope/id mismatch (file claims scope ${JSON.stringify(entry.scope)}, id ${JSON.stringify(entry.id)})`,
199
- id: fileId,
200
- path: p,
201
- });
202
- continue;
203
- }
204
- out.push({ entry, path: p });
205
- }
206
- const byKey = new Map();
207
- for (const le of out) {
208
- const key = strategyDedupKey(le.entry);
209
- const prev = byKey.get(key);
210
- if (prev === undefined || scoreStoredStrategy(le.entry) > scoreStoredStrategy(prev.entry))
211
- byKey.set(key, le);
212
- }
213
- return [...byKey.values()];
214
- }
215
- quarantine(p, reason) {
216
- try {
217
- renameSync(p, `${p}.bad`);
218
- this.incident({ op: "parse", error: `corrupt entry quarantined (${reason})`, path: p });
219
- }
220
- catch (err) {
221
- this.incident({ op: "parse", error: `corrupt entry skipped (${reason}); quarantine rename failed: ${thrownText(err)}`, path: p });
222
- }
223
- }
224
- writeEntry(dir, path, entry) {
225
- const record = {
226
- v: 1,
227
- id: entry.id,
228
- problem: entry.problem,
229
- strategy: entry.strategy,
230
- confidence: entry.confidence,
231
- scope: entry.scope,
232
- ts: entry.ts,
233
- ...(entry.teacherModel !== undefined ? { teacherModel: entry.teacherModel } : {}),
234
- ...(entry.signature !== undefined ? { signature: entry.signature } : {}),
235
- ...(entry.origin !== undefined ? { origin: entry.origin } : {}),
236
- };
237
- const bytes = JSON.stringify(record);
238
- if (Buffer.byteLength(bytes, "utf8") > MAX_ENTRY_FILE_BYTES) {
239
- const e = new Error(`FileStrategyStore: entry serializes over the ${MAX_ENTRY_FILE_BYTES}-byte read bound (JSON escaping expanded it past the field caps) — refusing a write the read side would quarantine`);
240
- e.code = "strategy.entry_invalid";
241
- throw e;
242
- }
243
- atomicWriteFile(dir, path, bytes);
244
- }
245
- save(s) {
246
- validateStrategyForWrite(s);
247
- const dir = this.scopeDirPath(s.scope);
248
- this.assertScopeDirSafe(dir);
249
- mkdirSync(dir, { recursive: true, mode: 0o700 });
250
- this.sweepStaleTemps(dir);
251
- const existing = this.loadScope(s.scope, dir, this.retrievalReadCap());
252
- const key = strategyDedupKey(s);
253
- const dup = existing.find((le) => strategyDedupKey(le.entry) === key);
254
- let all;
255
- if (dup !== undefined) {
256
- const refreshed = {
257
- ...dup.entry,
258
- ...(s.confidence >= dup.entry.confidence ? { confidence: s.confidence, ts: s.ts } : {}),
259
- ...(s.teacherModel !== undefined ? { teacherModel: s.teacherModel } : {}),
260
- };
261
- this.writeEntry(dir, dup.path, refreshed);
262
- dup.entry = refreshed;
263
- all = existing;
264
- }
265
- else {
266
- const p = join(dir, `${s.id}.json`);
267
- const byId = existing.find((le) => le.entry.id === s.id);
268
- this.writeEntry(dir, p, s);
269
- if (byId !== undefined) {
270
- byId.entry = s;
271
- all = existing;
272
- }
273
- else {
274
- all = [...existing, { entry: s, path: p }];
275
- }
276
- }
277
- if (all.length > this.maxPerScope) {
278
- this.evict(all, this.maxPerScope);
279
- }
280
- }
281
- evict(all, keep) {
282
- const sorted = [...all].sort((a, b) => scoreStoredStrategy(b.entry) - scoreStoredStrategy(a.entry));
283
- for (const le of sorted.slice(keep)) {
284
- try {
285
- unlinkSync(le.path);
286
- }
287
- catch (err) {
288
- if (err.code === "ENOENT")
289
- continue;
290
- this.incident({ op: "evict", error: thrownText(err), id: le.entry.id, path: le.path });
291
- }
292
- }
293
- }
294
- find(scope, query, limit) {
295
- const cap = resolveFindLimit(limit);
296
- const dir = this.scopeDirPath(scope);
297
- this.assertScopeDirSafe(dir);
298
- const matches = compileStrategyQuery(query);
299
- if (matches === null)
300
- return [];
301
- const ranked = this.loadScope(scope, dir, this.retrievalReadCap())
302
- .map((le) => le.entry)
303
- .filter((e) => matches(e.problem))
304
- .sort((a, b) => scoreStoredStrategy(b) - scoreStoredStrategy(a))
305
- .slice(0, cap);
306
- let bytes = 0;
307
- for (let i = 0; i < ranked.length; i++) {
308
- bytes += Buffer.byteLength(ranked[i].strategy, "utf8");
309
- if (bytes > MAX_STRATEGY_INJECTION_TOTAL_BYTES) {
310
- this.incident({
311
- op: "find",
312
- error: `result truncated at ${i} of ${ranked.length} entries — combined strategy text exceeded ${MAX_STRATEGY_INJECTION_TOTAL_BYTES} bytes (per-entry cap ${MAX_STRATEGY_TEXT_BYTES})`,
313
- });
314
- return ranked.slice(0, i);
315
- }
316
- }
317
- return ranked;
318
- }
319
- retrievalReadCap() {
320
- return this.maxPerScope * READ_FILE_CAP_FACTOR;
321
- }
322
- prune(scope, maxSize) {
323
- const n = resolveCapacityCap("maxSize", maxSize);
324
- const dir = this.scopeDirPath(scope);
325
- this.assertScopeDirSafe(dir);
326
- const all = this.loadScope(scope, dir, Number.POSITIVE_INFINITY);
327
- if (all.length > n)
328
- this.evict(all, n);
329
- }
330
- scopeUsage(scope) {
331
- const dir = this.scopeDirPath(scope);
332
- this.assertScopeDirSafe(dir);
333
- return { used: this.loadScope(scope, dir, Number.POSITIVE_INFINITY).length, capacity: this.maxPerScope };
334
- }
335
- hasStrategy(scope, entry) {
336
- const dir = this.scopeDirPath(scope);
337
- this.assertScopeDirSafe(dir);
338
- const key = strategyDedupKey(entry);
339
- return this.loadScope(scope, dir, this.retrievalReadCap()).some((le) => strategyDedupKey(le.entry) === key);
340
- }
341
- }