@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
@@ -150,8 +150,9 @@ export declare function scanEnvelopeShaped(text: string): EnvelopeShapedScan;
150
150
  *
151
151
  * NOTE the two sanctioned escape SHAPES in this tree, and why they are not merged: this one inserts
152
152
  * a backslash (`<` → `<\`) because it is a byte-level CC anchor on the observer/teammate lanes;
153
- * {@link sanitizeUntrustedText} inserts a zero-width space because its lanes are read by humans as
154
- * well. Both are idempotent and both break the tag; a merge would move bytes on one of the two
153
+ * {@link sanitizeUntrustedText} writes the entity `&lt;` in the bracket's place, CC's own spelling
154
+ * for its reminder-tag escapers. Both are idempotent, both break the tag, and both are printable
155
+ * ASCII that no format-character cleaning can remove; a merge would move bytes on one of the two
155
156
  * families for no security gain.
156
157
  */
157
158
  export declare function escapeEnvelopeTag(tag: string, text: string): string;
@@ -221,10 +222,11 @@ export declare function defuseExactMarkInSegments(segments: readonly string[], m
221
222
  /**
222
223
  * Neutralize structural break-out sequences in UNTRUSTED text so it can't escape its framing into
223
224
  * model-facing instructions. Always neutralizes `<system-reminder>` / `</system-reminder>` (the codebase's
224
- * elevated-authority wrapper) by inserting a zero-width space after the leading `<`. Pass `extraTags` to also
225
- * neutralize a CALLER's own data-framing tags — e.g. `team.ts` embeds member output inside `<statement>` /
226
- * `<discussion>`, so an untrusted member could emit `</statement>` to break out (search [46] BUG2);
227
- * the caller passes those tag names. Tag names must be literal (alphanumeric/hyphen) — they are code-supplied
225
+ * elevated-authority wrapper) by writing the entity {@link ESCAPED_LT} in place of the leading `<` (a form no
226
+ * format-character or whitespace cleaning removes — see there). Pass `extraTags` to also
227
+ * neutralize a CALLER's own data-framing tags — e.g. memory recall frames note text inside its own injection
228
+ * tags, so an untrusted note could emit the closing tag to break out; the caller passes those tag names
229
+ * (`MEMORY_INJECTION_TAGS`). Tag names must be literal (alphanumeric/hyphen) — they are code-supplied
228
230
  * wrapper names, never untrusted input. Idempotent for prompt assembly (a defused tag no longer matches).
229
231
  *
230
232
  * WHY THE ALWAYS-ON SET IS ONE TAG AND NOT THE WHOLE {@link ENGINE_ENVELOPES} AUTHORITY FAMILY: this is a
@@ -344,8 +346,9 @@ export declare function flattenableUserText(content: unknown): string | undefine
344
346
  * cannot forge {@link delimitUntrusted}'s own OPEN/CLOSE markers and break out of the fence. A worker (or
345
347
  * an external page via `web_fetch`, an MCP resource — the label format is open-source, so the close marker
346
348
  * `<<<END UNTRUSTED <label>>>>` is guessable) could otherwise emit the literal close marker followed by
347
- * top-level injection. Caps any run of 3+ identical brackets at 2 consecutive by inserting a zero-width
348
- * space — the reader still sees the text, but no `<<<`/`>>>` triple survives. Idempotent: a capped run
349
+ * top-level injection. Caps any run of 3+ identical brackets at 2 consecutive by writing the entity
350
+ * ({@link ESCAPED_LT} / {@link ESCAPED_GT}) in place of every third bracket — the reader still sees the text,
351
+ * no `<<<`/`>>>` triple survives, and no format-character cleaning can put one back. Idempotent: a capped run
349
352
  * (≤2) never re-matches `{3,}`. Defusing EITHER bracket breaks the marker; we defuse both for symmetry.
350
353
  *
351
354
  * Residual (council QUESTION, accepted): only ASCII `<`/`>` (U+003C/003E) are defused. A Unicode lookalike
@@ -440,8 +443,8 @@ export declare function delimitUntrusted(label: string, text: string, maxBody?:
440
443
  * the fence really carries instead of re-deriving the transform from its own copy of the tag list.
441
444
  *
442
445
  * Two copies of that list is precisely what drifted once the fenced lane widened past the reminder tag:
443
- * a caller pre-counting with the default (reminder-only) set under-measured the wide-set result by one
444
- * ZWSP per widened-family tag occurrence, so a body got clipped while the truncation disclosure that
446
+ * a caller pre-counting with the default (reminder-only) set under-measured the wide-set result by the
447
+ * rewrite's few extra characters per widened-family tag occurrence, so a body got clipped while the truncation disclosure that
445
448
  * decision drove was withheld — an externally selectable window just under the cap. Idempotent (both
446
449
  * halves are), so a caller may hand the neutralized string straight back to the fence.
447
450
  */
@@ -1,3 +1,5 @@
1
+ const ESCAPED_LT = "&lt;";
2
+ const ESCAPED_GT = "&gt;";
1
3
  const ZWSP = String.fromCharCode(0x200b);
2
4
  export const ENGINE_ENVELOPES = Object.freeze([
3
5
  {
@@ -83,8 +85,8 @@ export const ENGINE_ENVELOPES = Object.freeze([
83
85
  {
84
86
  tag: "previous-summary",
85
87
  kind: "framing",
86
- mint: "engine/compaction (update-summarization input) / agents/team.ts",
87
- guard: "team.ts neutralizes it via NEUTRALIZED_WRAPPER_TAGS; the compaction side frames engine-held text",
88
+ mint: "engine/compaction (update-summarization input)",
89
+ guard: "frames engine-held text (the previous summary the engine itself produced)",
88
90
  fenced: false,
89
91
  disclosed: false,
90
92
  },
@@ -104,46 +106,6 @@ export const ENGINE_ENVELOPES = Object.freeze([
104
106
  fenced: false,
105
107
  disclosed: false,
106
108
  },
107
- {
108
- tag: "statement",
109
- kind: "framing",
110
- mint: "agents/team.ts (member statement frame)",
111
- guard: "sanitizeUntrustedText(NEUTRALIZED_WRAPPER_TAGS) on every member text",
112
- fenced: false,
113
- disclosed: false,
114
- },
115
- {
116
- tag: "discussion",
117
- kind: "framing",
118
- mint: "agents/team.ts",
119
- guard: "same NEUTRALIZED_WRAPPER_TAGS family",
120
- fenced: false,
121
- disclosed: false,
122
- },
123
- {
124
- tag: "discussion-final",
125
- kind: "framing",
126
- mint: "agents/team.ts",
127
- guard: "same NEUTRALIZED_WRAPPER_TAGS family",
128
- fenced: false,
129
- disclosed: false,
130
- },
131
- {
132
- tag: "earlier-discussion-summary",
133
- kind: "framing",
134
- mint: "agents/team.ts",
135
- guard: "same NEUTRALIZED_WRAPPER_TAGS family",
136
- fenced: false,
137
- disclosed: false,
138
- },
139
- {
140
- tag: "topic",
141
- kind: "framing",
142
- mint: "agents/team.ts",
143
- guard: "same NEUTRALIZED_WRAPPER_TAGS family",
144
- fenced: false,
145
- disclosed: false,
146
- },
147
109
  {
148
110
  tag: "observer-report",
149
111
  kind: "framing",
@@ -502,7 +464,7 @@ export function defuseExactMarkInSegments(segments, mark) {
502
464
  return { segments: out, changed: true };
503
465
  }
504
466
  export function sanitizeUntrustedText(text, extraTags = []) {
505
- return text.replace(breakoutRe(extraTags), (m) => m.replace("<", "<" + ZWSP));
467
+ return text.replace(breakoutRe(extraTags), (m) => ESCAPED_LT + m.slice(1));
506
468
  }
507
469
  export function cutEnginePrefix(text, enginePrefixChars) {
508
470
  if (typeof enginePrefixChars === "number" &&
@@ -574,7 +536,7 @@ export function flattenableUserText(content) {
574
536
  return undefined;
575
537
  }
576
538
  export function defuseFenceMarkers(body) {
577
- return body.replace(/<{3,}|>{3,}/g, (run) => run.match(/.{1,2}/g).join(ZWSP));
539
+ return body.replace(/<{3,}|>{3,}/g, (run) => run.replace(/(..)./g, (_g, keep) => keep + (run.startsWith("<") ? ESCAPED_LT : ESCAPED_GT)));
578
540
  }
579
541
  const REPLACEMENT = "�";
580
542
  export function defuseControlChars(text) {
@@ -65,7 +65,10 @@ export interface WorkflowJournalStore {
65
65
  /** Entries for `runId` IF its recorded scope === `scope`, ASCENDING by ordinal; otherwise EMPTY (cross-scope). */
66
66
  load(runId: string, scope: string): Promise<WorkflowJournalEntry[]>;
67
67
  /** Record one agent's result under `(runId, scope)`. MUST be idempotent per `(runId, ordinal)` — a resumed run
68
- * re-appends the cached results of its replayed prefix, so a second append for the same ordinal overwrites. */
68
+ * re-appends the cached results of its replayed prefix, so a second append for the same ordinal overwrites.
69
+ * The engine waits for the returned promise at most `RunWorkflowOptions.journalAppendTimeoutMs` (default 30 s);
70
+ * a store that has not answered by then is a store fault (`workflow.journal_append_timeout`), and the write is
71
+ * NOT cancelled — it may still land after the engine gave up on it, which idempotence makes harmless. */
69
72
  append(runId: string, scope: string, entry: WorkflowJournalEntry): Promise<void>;
70
73
  /** (CC diagnostics parity, additive): a HUMAN/MODEL-readable coordinate for this run's journal —
71
74
  * the file store returns the on-disk jsonl path (CC "Read journal.jsonl" local form); a service store
@@ -1,6 +1,5 @@
1
1
  import type { ExecutionEnv } from "../internal/harness-types.js";
2
2
  import type { PermissionResult } from "./tool-policy.js";
3
- import { type AskFace } from "./ask-origin.js";
4
3
  import { type ToolCallLike } from "./tool-registry.js";
5
4
  /**
6
5
  * How one table row matches the judged path:
@@ -51,6 +50,12 @@ export declare const WRITE_PROTECTED_DEFAULT_TABLE: readonly WriteProtectedRow[]
51
50
  * named `a:b` keeps its own identity on the POSIX reading.
52
51
  */
53
52
  export declare function foldWriteProtectSegment(s: string): string;
53
+ /** One entry's refusal under the table's entry law ({@link normalizeWriteProtectedEntry}), labelled with the seat that
54
+ * carried it, or `undefined` when the entry is lawful. */
55
+ export declare function writeProtectedEntryProblem(entry: unknown, owner: string): string | undefined;
56
+ /** The key two LAWFUL entries fold by — the resolved table's own dedupe key (kind + the folded canonical name), so a
57
+ * list folded by it and the table resolved from it agree on which entries are one row. */
58
+ export declare function writeProtectedEntryIdentity(entry: WriteProtectedEntry): string;
54
59
  /**
55
60
  * Resolve the ACTIVE table under the deployment seat (validated, loud — #123's bad-value states all
56
61
  * throw and name the knob). `undefined` = the default table; `[]` = NO table (an explicit, legal
@@ -61,6 +66,14 @@ export declare function foldWriteProtectSegment(s: string): string;
61
66
  * candidate configuration with the engine's own rules.
62
67
  */
63
68
  export declare function resolveWriteProtectedTable(entries?: readonly WriteProtectedEntry[]): readonly WriteProtectedRow[];
69
+ /**
70
+ * THE spelled half of the exemption law (path-guard-rows.ts), for every table whose rows are exemptible: compiled once over
71
+ * the declared data-root spellings ({@link dataRootSpellings}, each read under ITS OWN path family — a spelling that reduces to
72
+ * NO segments, a root of `/`, exempts nothing rather than the filesystem), it answers a SPELLED view's remainder below
73
+ * whichever root contains it (`""` = the root itself, `null` = none) by {@link relativeUnderDataRoot}'s one literal reading.
74
+ * The identity half compares canonical keys (`relativeUnderRoot`, sensitive-path-policy.ts).
75
+ */
76
+ export declare function spelledExemptionOf(dataRootPaths: readonly string[]): (spelling: string) => string | null;
64
77
  /**
65
78
  * WHY the ENVIRONMENT half of one judgment could not contribute — the canonicalizer refused the spelling,
66
79
  * a link the tree could not follow, a namespace spelling it declines, an environment call that threw.
@@ -80,13 +93,12 @@ export interface WriteProtectionViewAbsence {
80
93
  * · `hit` — a row matched; `via` says which view named it: `"spelling"` (the anchored spelling, no
81
94
  * filesystem consulted), `"chain"` (a spelling the leaf symlink chain passes through, judged as a
82
95
  * spelling) or `"target"` (the resolved real target, the spelling being innocent);
83
- * · `unresolvable` — NO half of the judgment answered at all. The judge itself no longer mints this: an
84
- * environment that cannot resolve the target has ANSWERED, and an answer of "I cannot resolve this"
85
- * leaves the lexical half's judgment standing (the absence law below). What is left for this verdict is
86
- * the judgment that never happened — the gate's bounded wait elapsing or the task ending before
87
- * anything came back (`awaitWriteProtectionJudgment`, gate-bounded-await.ts) — where there is no
88
- * lexical answer to stand on either, and the consumer REFUSES. `unresolvedSymlink` is that minter's
89
- * `false`: a wait that produced nothing knows nothing about what it was waiting for.
96
+ * · `unresolvable` — no view that answered met a row, and where the target really lands (its real target, its link chain)
97
+ * could not be determined — refused, not asked (`writeProtectionTightenDecision`): a write this table cannot judge is not
98
+ * made on its word (the one absence law's second sentence, path-guard-rows.ts). `cause` is the environment's sentence.
99
+ *
100
+ * An auxiliary view that did not answer (a root's key) takes no part; every absence is disclosed
101
+ * ({@link WriteProtectionCompileOptions.onViewAbsent}).
90
102
  */
91
103
  export type WriteProtectionVerdict = {
92
104
  readonly kind: "clear";
@@ -107,7 +119,9 @@ export interface WriteProtectionJudgeContext {
107
119
  * ({@link pathTargetBaseOf}). Absent ⇒ `cwd`, then the compile-time `rootPath`, then the environment's
108
120
  * own working directory: the same fallback chain the write tool itself walks. */
109
121
  readonly base?: string;
110
- /** Bounds the filesystem probes of the target view. */
122
+ /** The judgment's deadline (the gate hands its own): each environment lookup — the real target, the link chain, a root's
123
+ * key — is bounded by it ON ITS OWN, and one that does not answer in time is absent while every row already met stays met.
124
+ * Absent ⇒ each lookup is bounded by the gate's default deadline. */
111
125
  readonly signal?: AbortSignal;
112
126
  /** The path is a CANONICAL key the caller already resolved at the seat its program writes it (the shell read station's
113
127
  * established write target: where the path lands, or — for a removal or a rename — the entry itself, its canonical
@@ -152,9 +166,11 @@ export interface WriteProtectionMatcher {
152
166
  *
153
167
  * @contract write_protection.judges_the_real_target — the always-on write-protection table and the
154
168
  * opt-in sensitive-path deny set differ in VOCABULARY (literal rows / segment globs) and SEVERITY
155
- * (ask / deny), never in REACH: both judge the file the tool will write — the spelling anchored at the
156
- * live cwd AND its resolved real target, through one canonicalizer. Where they DO part: a target the write-protection
157
- * judge cannot resolve leaves its resolved view ABSENT (the spelling still judges); the deny set still REFUSES whole. An environment-less judge has no target view and answers by the spelling alone —
169
+ * (ask / deny), never in REACH: both judge the file the tool will write — the spelling anchored at the tool's declared
170
+ * base AND its resolved real target and the hops of its link chain, through one canonicalizer — and under ONE absence
171
+ * law: a target whose real
172
+ * destination (or link chain) cannot be determined is refused by both wherever a row stands (a row a view that did answer
173
+ * met is still the answer), and an auxiliary view that does not answer (a root's key) votes in neither. An environment-less judge has no target view and answers by the spelling alone —
158
174
  * the same absence law the cwd follows (absent ⇒ the spelling is judged exactly as given). REACH is what
159
175
  * this sentence promises, not a LOCK: the identity is resolved at judgment time and re-resolved by the
160
176
  * tool at execute time (the module header states that window and the seat that would close it).
@@ -202,6 +218,34 @@ export interface WriteProtectionCompileOptions {
202
218
  * that replaces the table wholesale gets the same law over its own rows.
203
219
  */
204
220
  export declare function compileWriteProtection(entries?: readonly WriteProtectedEntry[], opts?: WriteProtectionCompileOptions): WriteProtectionMatcher | undefined;
221
+ /** Which table a shell write target met in the leg's one write judgment: the always-on write-protection table (the command's
222
+ * ask carries that table's class) or a deployment's guarded write row (`ToolPolicy.writeGuardRows`: the target is not
223
+ * placed). */
224
+ export type WriteTargetCoverage = "protected" | "guarded";
225
+ /** The leg's write judgment, compiled once ({@link compileLegWriteJudgment}). ENGINE-INTERNAL (not re-exported from
226
+ * `src/index.ts`). */
227
+ export interface LegWriteJudgment {
228
+ /** The always-on table's judge — absent when the table is empty (an opted-out deployment mounts no tighten). */
229
+ readonly matcher: WriteProtectionMatcher | undefined;
230
+ /** THE one judgment of an ABSOLUTE write target a command names, over the always-on table AND the deployment's guarded
231
+ * write rows together — one reading of the target (its spelling, its real target, its symlink chain; a `canonical` key
232
+ * judged as a key), one exempt root, one absence law. `undefined` ⇒ no row covers it. Absent when neither table has a
233
+ * row. */
234
+ readonly judgeWriteTarget: ((target: string, opts?: {
235
+ readonly signal?: AbortSignal;
236
+ readonly canonical?: true;
237
+ }) => Promise<WriteTargetCoverage | undefined>) | undefined;
238
+ }
239
+ /**
240
+ * Compile the leg's ONE write judgment: the always-on table (`entries`, already resolved by the leg) and the deployment's
241
+ * guarded write rows (`guardRows`, the chain policies' {@link import("./tool-policy.js").ToolPolicy.writeGuardRows}) under
242
+ * the leg's one exempt root (`exemptRoots`, the leg's single resolution of `RunnerDeps.memoryEngineDir`). The gate's
243
+ * write-protection tighten reads the table's judge alone; the shell station asks the joint judgment.
244
+ */
245
+ export declare function compileLegWriteJudgment(entries: readonly WriteProtectedEntry[], opts: Omit<WriteProtectionCompileOptions, "dataRoot"> & {
246
+ readonly exemptRoots: readonly string[];
247
+ readonly guardRows?: import("./tool-policy.js").ToolPolicy["writeGuardRows"];
248
+ }): LegWriteJudgment;
205
249
  /**
206
250
  * The gate tighten's DECISION for one judgment — the words the fold writes on the pass, minted beside the
207
251
  * verdict they read so the two cannot drift:
@@ -210,28 +254,20 @@ export declare function compileWriteProtection(entries?: readonly WriteProtected
210
254
  * message (table names are deployment-validated vocabulary); the model-authored target path deliberately
211
255
  * does not — `message` is the classifier's `askMessage`, and the approval card already shows the args. The
212
256
  * spelling form's sentence is the historical one byte for byte; the target form says the target RESOLVED.
213
- * · `unresolvable` ⇒ read by the call's FACE (`face`, {@link releasableAskClassesFor}): where no permission mode releases
214
- * `write_protection_unresolved` (the file face) — `deny` naming the cause: an unjudged target is never vouched (the rule
215
- * the canonicalizing deny set follows for the same reason), so there a standing allow is refused while a standing ask
216
- * carrying the record stays a person's question in the modes that ask (dontAsk and bypassPermissions refuse it); where
217
- * a mode may release the class (the shell face) — `ask` (`safety`)
218
- * naming the cause, which the mode arbitration answers exactly as it answers that record over a standing ask
219
- * (bypassPermissions releases it, default puts it to a person, dontAsk refuses): on that face alone a standing allow
220
- * reads as a standing ask.
257
+ * · `unresolvable` ⇒ `deny` (`safety`; reason word `target_unresolved` on the sentence): where the write lands could not be
258
+ * determined, so this table cannot say it is not a protected path — refused in every permission mode (a refusal, not a
259
+ * question a mode releases), the reference's write check form ("where it leads on disk could not be determined").
221
260
  * · `clear` ⇒ `undefined`: the surviving decision stands.
222
261
  */
223
- export declare function writeProtectionTightenDecision(toolName: string, verdict: WriteProtectionVerdict, face: AskFace): PermissionResult | undefined;
262
+ export declare function writeProtectionTightenDecision(toolName: string, verdict: WriteProtectionVerdict): PermissionResult | undefined;
224
263
  /**
225
- * @contract write_protection.verdict_is_the_mandate — the judge's two non-clear verdicts are the two facts
226
- * a standing allow rule may not retire, and `clear` is neither: a MATCHED row is the mandate a live decider
227
- * may still clear, a target it could not RESOLVE is the mandate no automatic lane may. These two predicates
228
- * are the ONE reading of a verdict as either fact, beside the decision mint, so the fold records what the
229
- * judge said and never re-derives "was this write protection?" from the decision it got back.
264
+ * @contract write_protection.verdict_is_the_mandate — a MATCHED row is the one fact of the judge's verdict a standing
265
+ * allow rule may not retire (a live decider may still clear it), and `clear` is not it; this predicate is the one reading
266
+ * of a verdict as that fact, beside the decision mint, so the fold records what the judge said and never re-derives "was
267
+ * this write protection?" from the decision it got back. A view the judge's reading could not answer is no second fact:
268
+ * it took no part.
230
269
  */
231
270
  export declare function writeProtectionMandated(verdict: WriteProtectionVerdict): boolean;
232
- /** The second half of {@link writeProtectionMandated}'s contract: the judge could not name this target
233
- * (the arm that owns the ACTION denies on the same verdict). */
234
- export declare function writeProtectionUnresolved(verdict: WriteProtectionVerdict): boolean;
235
271
  /**
236
272
  * The ENGINE-FILLED gate input (`ToolGateInput.writeProtectionCheck`). Returns `null` SYNCHRONOUSLY when the
237
273
  * call is not this layer's business — not a covered write, or no resolvable target string — and otherwise