@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
@@ -224,6 +224,9 @@ export interface UnreadableOrgRow {
224
224
  readonly rule: string;
225
225
  readonly code: RuleRejectCode;
226
226
  readonly detail?: string;
227
+ /** The rule spelling a row that is no rule spelling only because of white space (a tab, a no-break space) is a blank away from — the
228
+ * text to republish it as; the row itself is still read as unreadable (one spelling reader, fail-closed). */
229
+ readonly respelling?: string;
227
230
  readonly behavior: "deny" | "ask";
228
231
  readonly reach: OrgRowReach;
229
232
  }
@@ -327,8 +330,9 @@ export declare function unenforceableOrgRules(rules: readonly OrgPermissionRule[
327
330
  rule: string;
328
331
  code: RuleRejectCode;
329
332
  }>;
330
- /** The reason an unreadable row's verdict carries — its place in the snapshot, its code, and the repair. */
331
- export declare function unreadableOrgRowReason(row: Pick<UnreadableOrgRow, "index" | "code" | "detail">): string;
333
+ /** The reason an unreadable row's verdict carries — its place in the snapshot, its code, and the repair: for a row that is no rule
334
+ * spelling only because of white space (a tab, a no-break space), its text and the spelling to republish it as. */
335
+ export declare function unreadableOrgRowReason(row: Pick<UnreadableOrgRow, "index" | "code" | "detail" | "rule" | "respelling">): string;
332
336
  /** The ONE clause for an org verdict that carries an `unreadable` reason — a rule the call could not be read against, or
333
337
  * a row this layer cannot read — on a refusal and on a question alike. */
334
338
  export declare function orgUnreadableClause(reason: string): string;
@@ -284,12 +284,13 @@ function orgStateCopyOf(state) {
284
284
  function readOrgRow(row, index) {
285
285
  const { rule: text, behavior: said } = orgRowPolicyOf(row);
286
286
  const behavior = said === "ask" ? "ask" : "deny";
287
- const unreadable = (code, detail) => ({
287
+ const unreadable = (code, detail, respelling) => ({
288
288
  kind: "unreadable",
289
289
  index,
290
290
  rule: typeof text === "string" ? text : text === undefined ? "<unreadable>" : escapeForDisclosure(text),
291
291
  code,
292
292
  ...(detail !== undefined ? { detail } : {}),
293
+ ...(respelling !== undefined ? { respelling } : {}),
293
294
  behavior,
294
295
  reach: reachOfRowHead(text, behavior),
295
296
  });
@@ -299,7 +300,7 @@ function readOrgRow(row, index) {
299
300
  return unreadable("invalid.grammar", said === undefined ? "no behavior" : `behavior "${escapeForDisclosure(said)}" is not deny or ask`);
300
301
  const parsed = parseRuleText(text, said);
301
302
  if ("reject" in parsed)
302
- return unreadable(parsed.reject.code);
303
+ return unreadable(parsed.reject.code, undefined, parsed.reject.respelling);
303
304
  if (parsed.rule.tool !== COMMAND_RULE_TOOL)
304
305
  return unreadable("unsupported.tool");
305
306
  return { kind: "read", index, rule: text, behavior: said, parsed: parsed.rule };
@@ -355,6 +356,9 @@ function readListedOrgRules(rules) {
355
356
  return reading;
356
357
  }
357
358
  export function unreadableOrgRowReason(row) {
359
+ if (row.respelling !== undefined) {
360
+ return `row ${row.index} of the organization snapshot, "${escapeForDisclosure(row.rule)}", is not a rule spelling (${row.code}); republish it as "${escapeForDisclosure(row.respelling)}"`;
361
+ }
358
362
  return `row ${row.index} of the organization snapshot is not a rule this layer reads (${row.code}${row.detail !== undefined ? `: ${row.detail}` : ""}); republish it in the shell tool's command grammar`;
359
363
  }
360
364
  export function orgUnreadableClause(reason) {
@@ -365,7 +369,7 @@ export function describeUnreadableOrgRows(unreadable, revision) {
365
369
  return undefined;
366
370
  const named = unreadable
367
371
  .slice(0, DISCLOSED_UNREADABLE_ROWS)
368
- .map((u) => `row ${u.index} "${escapeForDisclosure(u.rule)}" (${u.code}${u.detail !== undefined ? `: ${u.detail}` : ""})`)
372
+ .map((u) => `row ${u.index} "${escapeForDisclosure(u.rule)}" (${u.code}${u.detail !== undefined ? `: ${u.detail}` : ""}${u.respelling !== undefined ? `; republish it as "${escapeForDisclosure(u.respelling)}"` : ""})`)
369
373
  .join(", ");
370
374
  const more = unreadable.length - DISCLOSED_UNREADABLE_ROWS;
371
375
  return (`the org snapshot${revision !== undefined ? ` (revision ${escapeForDisclosure(revision)})` : ""} is served DEGRADED: ${unreadable.length} row(s) this layer cannot read — ${named}${more > 0 ? ` and ${more} more` : ""}; ` +
@@ -35,7 +35,8 @@
35
35
  * store's, the fence stays the partition's.
36
36
  */
37
37
  import type { PersistedRule, RuleScope } from "./permission-rule-model.js";
38
- import { type DurableRulePartitionProvider, type QuarantinedRuleAdd, type RuleOwner } from "./permission-rule-store.js";
38
+ import { type DurableRulePartitionProvider, type QuarantinedRuleAdd } from "./permission-rule-store.js";
39
+ import { type RuleOwner } from "./rule-owner.js";
39
40
  import { type OrgRulePartitionConfig, type OrgRuleResolution } from "./permission-rule-org.js";
40
41
  import type { SessionRulePartition } from "./permission-rule-session.js";
41
42
  import type { StoreDurability, StoreFidelity } from "./checkpoint-store.js";
@@ -145,7 +146,10 @@ export interface PermissionRuleStoreProvider {
145
146
  * provider: an absent principal resolves to zero personal rules, and a provider that forgot it would hand one person's
146
147
  * standing approvals to an anonymous task. The ONE exception is an explicitly declared LOCAL-OWNER deployment, where "no
147
148
  * principal" is the typed absence of identity — the machine owner's own bucket (a provider with no such face resolves
148
- * the anonymous store; {@link createPermissionRuleLanes} refuses that declaration loudly).
149
+ * the anonymous store; {@link createPermissionRuleLanes} refuses that declaration loudly). "No principal" is ABSENCE only —
150
+ * `undefined`, and the empty string the engine has always spelled the same ({@link readPrincipal}). A principal that was provided
151
+ * and is not a name (white space, an invisible or control character) is a bad value and is refused here: read as absence it
152
+ * would be the machine owner's bucket on a local-owner deployment.
149
153
  */
150
154
  export declare function ownerStoreOf(provider: PermissionRuleStoreProvider, principal: string | undefined, localOwnerDeclared: boolean): PermissionRuleStore;
151
155
  /** What {@link createPermissionRuleStoreProvider} composes. */
@@ -1,17 +1,39 @@
1
- import { escapeForDisclosure } from "./permission-rule-model.js";
1
+ import { escapeForDisclosure, isRuleBehavior, parseRuleText } from "./permission-rule-model.js";
2
2
  import { PERMISSION_RULE_WRITER, errText, isValidDurableScope, normalizePersistedRule, sameRuleIdentity, writerOf, } from "./permission-rule-store.js";
3
+ import { readRuleOwner } from "./rule-owner.js";
4
+ import { readPrincipal } from "./principal-name.js";
3
5
  import { UNGOVERNED_ORG_RESOLUTION, compileOrgShadowPredicate, createOrgRulePartition } from "./permission-rule-org.js";
4
6
  export function ruleSourceOf(scope) {
5
7
  return scope.kind === "global" ? "user" : scope.kind;
6
8
  }
7
9
  export function ownerStoreOf(provider, principal, localOwnerDeclared) {
8
- const anonymous = principal === undefined || principal === "";
9
- return anonymous && localOwnerDeclared && provider.forLocalOwner !== undefined ? provider.forLocalOwner() : provider.forPrincipal(anonymous ? undefined : principal);
10
+ const reading = readPrincipal(principal);
11
+ if (reading.kind === "invalid") {
12
+ throw new Error(`the principal given is not a principal name (got ${reading.fault}) — refusing to resolve a bucket for it; a provided value that names nobody is not "no principal"`);
13
+ }
14
+ if (reading.kind === "name")
15
+ return provider.forPrincipal(reading.name);
16
+ return localOwnerDeclared && provider.forLocalOwner !== undefined ? provider.forLocalOwner() : provider.forPrincipal(undefined);
10
17
  }
11
18
  function usableSessionId(sessionId) {
12
19
  return typeof sessionId === "string" && sessionId !== "" ? sessionId : undefined;
13
20
  }
14
21
  const EMPTY_DURABLE = { rules: [], tombstones: [], rev: 0 };
22
+ function durableReadOf(settled) {
23
+ if (!settled.ok)
24
+ return settled;
25
+ for (const [kind, rows] of [["rule", settled.v.rules], ["tombstone", settled.v.tombstones]]) {
26
+ const at = rows.findIndex((r) => !isRuleBehavior(r?.behavior));
27
+ if (at < 0)
28
+ continue;
29
+ const row = rows[at];
30
+ return {
31
+ ok: false,
32
+ e: new Error(`the persisted rule partition served a ${kind} row (#${at}, ${escapeForDisclosure(row?.rule)}) whose behavior word ${escapeForDisclosure(row?.behavior)} is outside deny/ask/allow — whether it refuses a call is unknown, so the partition is read as one that could not be read`),
33
+ };
34
+ }
35
+ return settled;
36
+ }
15
37
  export function createPermissionRuleStoreProvider(cfg) {
16
38
  if (cfg === null || typeof cfg !== "object") {
17
39
  throw new Error("createPermissionRuleStoreProvider takes a config object naming the partitions to compose");
@@ -61,7 +83,7 @@ class UnifiedPermissionRuleStore {
61
83
  const disclosures = [];
62
84
  const [orgSettled, durableSettled, sessionRows] = await Promise.all([
63
85
  this.org !== undefined ? this.org.resolve() : Promise.resolve({ ...UNGOVERNED_ORG_RESOLUTION, rules: [], disclosures: [] }),
64
- this.durable !== undefined ? this.durable.list().then((v) => ({ ok: true, v }), (e) => ({ ok: false, e })) : Promise.resolve({ ok: true, v: EMPTY_DURABLE }),
86
+ this.durable !== undefined ? this.durable.list().then((v) => durableReadOf({ ok: true, v }), (e) => ({ ok: false, e })) : Promise.resolve({ ok: true, v: EMPTY_DURABLE }),
65
87
  this.readSessionRows(usableSessionId(query?.sessionId), disclosures),
66
88
  ]);
67
89
  const orgResolution = orgSettled;
@@ -106,7 +128,7 @@ class UnifiedPermissionRuleStore {
106
128
  const served = structuredClone(await this.session.read(sessionId));
107
129
  const rows = served.filter((r) => {
108
130
  const scope = r?.scope;
109
- return scope?.kind === "session" && scope.sessionId === sessionId && !("reject" in normalizePersistedRule(r));
131
+ return scope?.kind === "session" && scope.sessionId === sessionId && (!("reject" in normalizePersistedRule(r)) || ((r.behavior === "deny" || r.behavior === "ask") && "reject" in parseRuleText(r.rule, r.behavior)));
110
132
  });
111
133
  if (rows.length < served.length) {
112
134
  disclosures.push(`the session rule partition served ${served.length - rows.length} row(s) that are not canonical session rows of this session — dropped, not adjudicated`);
@@ -157,8 +179,17 @@ export async function effectivePermissionRules(opts) {
157
179
  return await resolveOwnerStore(opts).effective(opts.sessionId !== undefined ? { sessionId: opts.sessionId } : undefined);
158
180
  }
159
181
  export function resolveOwnerStore(opts) {
160
- if (opts.owner !== undefined && opts.owner.kind === "local-owner") {
161
- if (opts.principal !== undefined) {
182
+ const owner = opts.owner === undefined ? undefined : readRuleOwner(opts.owner);
183
+ if (opts.owner !== undefined && owner === undefined) {
184
+ throw new Error("the owner given is neither a principal nor the local owner (a principal owner names a principal name) — refusing to resolve a bucket nobody can name");
185
+ }
186
+ const given = readPrincipal(opts.principal);
187
+ if (given.kind === "invalid") {
188
+ throw new Error(`the principal given is not a principal name (got ${given.fault}) — pass a verified principal, the local owner, or neither; a provided value that names nobody is not "no principal"`);
189
+ }
190
+ const principal = given.kind === "name" ? given.name : undefined;
191
+ if (owner?.kind === "local-owner") {
192
+ if (principal !== undefined) {
162
193
  throw new Error("pass either a principal or a local-owner, not both — a bucket has one owner");
163
194
  }
164
195
  const store = opts.provider.forLocalOwner?.();
@@ -167,9 +198,8 @@ export function resolveOwnerStore(opts) {
167
198
  }
168
199
  return store;
169
200
  }
170
- if (opts.owner !== undefined && opts.owner.kind === "principal" && opts.principal !== undefined && opts.owner.principal !== opts.principal) {
171
- throw new Error(`contradictory identity: principal "${escapeForDisclosure(opts.principal)}" and owner principal "${escapeForDisclosure(opts.owner.principal)}" disagree`);
201
+ if (owner?.kind === "principal" && principal !== undefined && owner.principal !== principal) {
202
+ throw new Error(`contradictory identity: principal "${escapeForDisclosure(principal)}" and owner principal "${escapeForDisclosure(owner.principal)}" disagree`);
172
203
  }
173
- const principal = opts.owner?.kind === "principal" ? opts.owner.principal : opts.principal;
174
- return opts.provider.forPrincipal(principal);
204
+ return opts.provider.forPrincipal(owner?.kind === "principal" ? owner.principal : principal);
175
205
  }
@@ -45,7 +45,7 @@ import type { PersistedRule, RuleAdd, RuleDot, RuleScope, RuleTombstone } from "
45
45
  import { type RuleBehavior } from "./permission-rule-model.js";
46
46
  import type { RuleSyncDropReason, RuleQuarantineReason } from "./governance-codes.js";
47
47
  import type { StoreDurability, StoreFidelity } from "./checkpoint-store.js";
48
- import type { AssertAllKeysHandled } from "./ask-origin.js";
48
+ import { type RuleOwner } from "./rule-owner.js";
49
49
  /** One store read: the rules as persisted, their tombstones, and the revision they were read at. */
50
50
  export interface StoredRules {
51
51
  /** Rules with their FULL add sets — tombstoned dots already removed by the backend on read. */
@@ -56,6 +56,14 @@ export interface StoredRules {
56
56
  /** Integrity fingerprint the backend computed, when it has one. Corruption detection only. */
57
57
  checksum?: string;
58
58
  }
59
+ /**
60
+ * The code a refusal carries when the rules a face reads — a bucket at rest, a rule-sync state on the wire — are stamped
61
+ * with a rule grammar later than this engine reads: a newer engine wrote them. Every face refuses them whole with it (the
62
+ * read face, a write's read of its base, a sync round's local read and its response), so a caller tells "an engine that
63
+ * reads that grammar reads them" from a damaged store, whose refusal carries no code. The person's rules are then one
64
+ * partition that cannot be read: every call is asked about until a read succeeds.
65
+ */
66
+ export declare const PERMISSION_RULES_LATER_GRAMMAR_CODE = "permission_rules.later_grammar";
59
67
  /**
60
68
  * The durable partition's read face: read-only, already anchored to a single owner. Rows carry the two
61
69
  * durable scopes only (`global` = the `user` source, `project` = the `project` source); a session row
@@ -64,6 +72,13 @@ export interface StoredRules {
64
72
  * A backend that fails to read must not silently report an empty set as if it were an empty store — it
65
73
  * throws, and the store's caller turns that into zero rules PLUS a loud disclosure. Both outcomes deny
66
74
  * more than they allow; only one of them is honest about why.
75
+ *
76
+ * A backend keeps ONE rule grammar stamp per bucket: every write stamps this engine's grammar
77
+ * (`SESSION_RULES_GRAMMAR`), and every read — of the read face and of a write's base — judges the stamp
78
+ * through `readRuleGrammarStamp` (absent = this engine's grammar, a bucket written before the stamp): a later
79
+ * grammar is a bucket this engine cannot read, refused whole with {@link PERMISSION_RULES_LATER_GRAMMAR_CODE},
80
+ * never read row by row (a row a newer grammar wrote reads as nothing here, and a deny that reads as nothing
81
+ * refuses nothing).
67
82
  */
68
83
  export interface DurableRulePartition {
69
84
  list(): Promise<StoredRules>;
@@ -78,31 +93,8 @@ export interface DurableRulePartition {
78
93
  /** Declared serialization fidelity, same doctrine as the other store families. */
79
94
  readonly fidelity?: StoreFidelity;
80
95
  }
81
- /**
82
- * design/182 §3.3/§4.5 — who a rule bucket belongs to, as a STRUCTURAL position.
83
- *
84
- * Identity absence is spelled as a distinct union member, never as a sentinel string flowing through
85
- * `forPrincipal` — every consumer of a principal string is an identity surface, and a made-up name on an
86
- * identity surface is indistinguishable from a real one downstream. Cloud sync and cloud tickets accept
87
- * ONLY the `principal` kind: syncing is an authenticated act, and a local-owner bucket has no cloud home
88
- * until it is adopted (`adoptFilePermissionRuleStore`).
89
- */
90
- export type RuleOwner = {
91
- kind: "principal";
92
- principal: string;
93
- } | {
94
- kind: "local-owner";
95
- };
96
- /** The owner discriminants as a value: the `kind` words of {@link RuleOwner}, both directions fenced at compile time
97
- * ({@link RuleOwnerKindsCoverEveryArm} / {@link RuleOwnerArmsCoverEveryKind}). */
98
- export declare const RULE_OWNER_KINDS: readonly ["principal", "local-owner"];
99
- /** Compile fence: an arm whose `kind` is not in {@link RULE_OWNER_KINDS} turns the argument into that word. */
100
- export type RuleOwnerKindsCoverEveryArm = AssertAllKeysHandled<Exclude<RuleOwner["kind"], (typeof RULE_OWNER_KINDS)[number]>>;
101
- /** Compile fence, the other direction: a word in {@link RULE_OWNER_KINDS} that no arm carries. */
102
- export type RuleOwnerArmsCoverEveryKind = AssertAllKeysHandled<Exclude<(typeof RULE_OWNER_KINDS)[number], RuleOwner["kind"]>>;
103
- /** Do two owners name the same bucket? */
104
- export declare function sameRuleOwner(a: RuleOwner, b: RuleOwner): boolean;
105
- /** Resolves one owner's durable partition. `undefined` ⇒ a partition that reports zero rules. This is
96
+ /** Resolves one owner's durable partition. `undefined` — or anything that is not a principal name
97
+ * (`principalNameOf`: the empty and the blank string included) ⇒ a partition that reports zero rules. This is
106
98
  * the BACKEND contract (file, in-memory, an out-of-repo SQL twin); the engine never consumes it
107
99
  * directly — `createPermissionRuleStoreProvider({ durable })` composes it into the unified store. */
108
100
  export interface DurableRulePartitionProvider {
@@ -497,6 +489,10 @@ export declare function normalizePersistedRule(r: PersistedRule): {
497
489
  reject: Extract<RuleSyncDropReason, "invalid_rule_text" | "metadata_mismatch">;
498
490
  };
499
491
  /** The normalization half exposed for the DISCLOSURE layer: which records a join would refuse, and why.
492
+ *
493
+ * It reads a state in THIS engine's grammar: the doors that hand it one — a backend's read of its bucket, the sync
494
+ * client's read of a response — refuse a state stamped later whole first ({@link PERMISSION_RULES_LATER_GRAMMAR_CODE}),
495
+ * so a row it refuses is damage to drop or quarantine, never a newer grammar's rule read as nothing.
500
496
  *
501
497
  * design/382 §4.3 — this screen carries the SESSION member of the durable face on every JOIN leg
502
498
  * (inbound state, local state, both sides of the pure join): a rule or tombstone row carrying a
@@ -1,12 +1,10 @@
1
1
  import { randomBytes } from "node:crypto";
2
2
  import { canonicalize } from "./canonical-json.js";
3
3
  import { escapeForDisclosure, isRuleBehavior, isRuleLive, parseRuleText } from "./permission-rule-model.js";
4
+ import { readRuleOwner } from "./rule-owner.js";
4
5
  import { thrownText } from "./thrown-value.js";
5
6
  import { validatePath } from "./effective-path-target.js";
6
- export const RULE_OWNER_KINDS = Object.freeze(["principal", "local-owner"]);
7
- export function sameRuleOwner(a, b) {
8
- return a.kind === "principal" ? b.kind === "principal" && a.principal === b.principal : b.kind === "local-owner";
9
- }
7
+ export const PERMISSION_RULES_LATER_GRAMMAR_CODE = "permission_rules.later_grammar";
10
8
  export function isRuleRevision(rev) {
11
9
  return typeof rev === "number" && Number.isSafeInteger(rev) && rev >= 0;
12
10
  }
@@ -513,6 +511,10 @@ async function readRuleLiveness(store, identity) {
513
511
  }
514
512
  }
515
513
  const REMOVE_MAX_ATTEMPTS = 8;
514
+ const NO_TARGET_OWNER = "the principal given is neither a principal name (a string with a visible character, no control or separator character, and no format character but a joiner) nor an owner (a principal owner names a principal name; the local owner is { kind: \"local-owner\" })";
515
+ function persistedRuleTargetOwner(target) {
516
+ return readRuleOwner(typeof target === "string" ? { kind: "principal", principal: target } : target);
517
+ }
516
518
  export async function removePersistedRule(opts) {
517
519
  const behavior = opts.behavior;
518
520
  const rule = opts.rule;
@@ -522,7 +524,9 @@ export async function removePersistedRule(opts) {
522
524
  return { status: "failed", error: `removePersistedRule: behavior ${escapeForDisclosure(behavior)} is not one of ${["deny", "ask", "allow"].join("/")} — refusing to name a rule identity nothing can carry`, committed: "no" };
523
525
  }
524
526
  const identity = { behavior, rule, scope };
525
- const owner = typeof target === "string" ? { kind: "principal", principal: target } : structuredClone(target);
527
+ const owner = persistedRuleTargetOwner(target);
528
+ if (owner === undefined)
529
+ return { status: "failed", error: `removePersistedRule: ${NO_TARGET_OWNER} — refusing to remove from a bucket nobody can name`, committed: "no" };
526
530
  const provider = opts.provider;
527
531
  if (scope?.kind === "session") {
528
532
  return {
@@ -689,7 +693,9 @@ export async function addPersistedRule(opts) {
689
693
  if ("reject" in parsed)
690
694
  return { status: "failed", error: `addPersistedRule: ${parsed.reject.code}: ${parsed.reject.message}`, committed: "no" };
691
695
  const identity = { behavior, rule: parsed.rule.rule, scope };
692
- const owner = typeof target === "string" ? { kind: "principal", principal: target } : structuredClone(target);
696
+ const owner = persistedRuleTargetOwner(target);
697
+ if (owner === undefined)
698
+ return { status: "failed", error: `addPersistedRule: ${NO_TARGET_OWNER} — refusing to write into a bucket nobody can name`, committed: "no" };
693
699
  const provider = opts.provider;
694
700
  if (owner.kind === "local-owner" && provider.forLocalOwner === undefined) {
695
701
  return { status: "failed", error: "this provider has no local-owner bucket (forLocalOwner is not implemented) — a local-owner rule cannot be added through it", committed: "no" };
@@ -27,7 +27,8 @@
27
27
  */
28
28
  import type { PersistedRule, RuleBehavior, RuleDot, RuleRejectCode, RuleScope, RuleTombstone } from "./permission-rule-model.js";
29
29
  import type { PermissionRuleStoreProvider } from "./permission-rule-provider.js";
30
- import type { RuleOwner, RuleSyncDrop, RuleSyncFrontier, RuleSyncState } from "./permission-rule-store.js";
30
+ import type { RuleOwner } from "./rule-owner.js";
31
+ import type { RuleSyncDrop, RuleSyncFrontier, RuleSyncState } from "./permission-rule-store.js";
31
32
  import { type TracerHook } from "./trace.js";
32
33
  /** The injected HTTP seam — core never bundles a fetch. The deployment owns base URL, auth, TLS and
33
34
  * retries; a non-2xx / network failure should THROW (the round then aborts with zero local effects —
@@ -43,6 +44,9 @@ export interface RuleSyncRequestBody {
43
44
  replica: string;
44
45
  state: RuleSyncState;
45
46
  observedVector?: RuleSyncFrontier;
47
+ /** The rule grammar this engine reads and writes the state's rows in (`SESSION_RULES_GRAMMAR`) — a twin whose grammar is
48
+ * earlier refuses the whole request, as this client refuses a response stamped later. */
49
+ grammar: number;
46
50
  }
47
51
  /** The wire response (server twin: join its persisted state with the request state, answer the whole
48
52
  * merged form). `gcFrontier` is the COLLECTED watermark (§5.1) — absent in v2.0 by protocol. */
@@ -58,6 +62,10 @@ export interface RuleSyncResponseBody {
58
62
  dot: RuleDot;
59
63
  reason: string;
60
64
  }>;
65
+ /** The rule grammar the merged state's rows are written in. A grammar later than this engine's refuses the whole round
66
+ * (`PERMISSION_RULES_LATER_GRAMMAR_CODE`): read in this engine's grammar, a newer grammar's row reads as nothing, and a
67
+ * deny among them would be dropped as damage. Absent: a twin that predates the member, read in this engine's. */
68
+ grammar?: number;
61
69
  }
62
70
  export interface PermissionRuleSyncResult {
63
71
  /** True ⟺ the round landed with zero drops, zero quarantines and zero warnings. */
@@ -154,7 +162,8 @@ interface ParsedRuleSyncResponse {
154
162
  }
155
163
  /**
156
164
  * Parse one wire response. Envelope violations (missing/mistyped principal, echo mismatch, no merged
157
- * state, an unparseable frontier) THROW — a protocol error aborts the round with zero local effects.
165
+ * state, an unparseable frontier, a grammar stamp this engine cannot read) THROW — a protocol error aborts
166
+ * the round with zero local effects.
158
167
  * ENTRY-level violations degrade per §4.3: an unshapeable rule/add is skipped with a warning (it never
159
168
  * reaches the local disk); an unshapeable tombstone is surfaced as `undefined` so the caller's
160
169
  * tighten-only partitioning withholds the round's adds. Unknown keys never flow anywhere — every field
@@ -1,6 +1,8 @@
1
1
  import { escapeForDisclosure, isRuleBehavior, parseRuleText, RULE_ADD_ORIGINS } from "./permission-rule-model.js";
2
- import { applyTombstones, errText, isProjectScopeRoot, joinFrontiers, joinRuleStates, normalizePersistedRule, readRuleWriteOutcome, ruleSyncVector, sameRuleIdentity, screenRuleSyncState, writerOf, } from "./permission-rule-store.js";
2
+ import { principalNameOf } from "./principal-name.js";
3
+ import { PERMISSION_RULES_LATER_GRAMMAR_CODE, applyTombstones, errText, isProjectScopeRoot, joinFrontiers, joinRuleStates, normalizePersistedRule, readRuleWriteOutcome, ruleSyncVector, sameRuleIdentity, screenRuleSyncState, writerOf, } from "./permission-rule-store.js";
3
4
  import { emitTrace } from "./trace.js";
5
+ import { SESSION_RULES_GRAMMAR, readRuleGrammarStamp } from "./session-policy-store.js";
4
6
  export const PERMISSION_RULE_SYNC_PATH = "/v1/permission-rules/sync";
5
7
  export const LOCAL_OWNER_UNSYNCABLE_CODE = "permission_rules.local_owner_unsyncable";
6
8
  function refuseLocalOwnerSync() {
@@ -22,8 +24,8 @@ export async function syncPermissionRules(opts) {
22
24
  throw new Error(`contradictory identity: principal "${escapeForDisclosure(principal)}" and owner principal "${escapeForDisclosure(owner.principal)}" disagree`);
23
25
  }
24
26
  }
25
- if (typeof principal !== "string" || principal === "") {
26
- throw new Error("syncPermissionRules requires a verified principal — an unauthenticated deployment has no cloud bucket to sync");
27
+ if (principalNameOf(principal) === undefined) {
28
+ throw new Error("syncPermissionRules requires a verified principal — an unauthenticated deployment has no cloud bucket to sync (a blank name, or one holding a control, separator or invisible format character, is not a principal)");
27
29
  }
28
30
  const traceClock = opts.now ?? Date.now;
29
31
  const disclose = (result) => {
@@ -64,6 +66,7 @@ export async function syncPermissionRules(opts) {
64
66
  replica: raw.actor,
65
67
  state: { rules: raw.rules, tombstones: raw.tombstones },
66
68
  ...(raw.observedVector !== undefined ? { observedVector: raw.observedVector } : {}),
69
+ grammar: SESSION_RULES_GRAMMAR,
67
70
  };
68
71
  const rawResponse = await transport(PERMISSION_RULE_SYNC_PATH, request);
69
72
  const response = parseRuleSyncResponse(rawResponse, principal);
@@ -310,6 +313,11 @@ export function parseRuleSyncResponse(raw, expectedPrincipal) {
310
313
  if (echoedPrincipal !== expectedPrincipal) {
311
314
  throw new Error(`the sync response echoes principal "${escapeForDisclosure(echoedPrincipal)}" but this round synced "${escapeForDisclosure(expectedPrincipal)}" — the transport is wired to the wrong bucket; refusing the whole round`);
312
315
  }
316
+ const grammar = readRuleGrammarStamp(r.grammar, SESSION_RULES_GRAMMAR, { rules: "the sync response's rules", held: "rows" });
317
+ if ("got" in grammar) {
318
+ const refusal = new Error(`${grammar.sentence} — refusing the whole round, nothing landed`);
319
+ throw grammar.later === true ? Object.assign(refusal, { code: PERMISSION_RULES_LATER_GRAMMAR_CODE }) : refusal;
320
+ }
313
321
  const merged = r.merged;
314
322
  const mergedRules = merged?.rules;
315
323
  const mergedTombstones = merged?.tombstones;
@@ -29,10 +29,11 @@ export declare function lastIndexOfUnescaped(s: string, ch: string): number;
29
29
  */
30
30
  export declare function parsePermissionRule(rule: string): ParsedPermissionRule;
31
31
  /**
32
- * Can a rule name this tool name — is it the rule syntax's name head ({@link RULE_TOOL_NAME}) and not the lone `*`? The
33
- * lone `*` is the wildcard (every tool), not a name: a tool called `*` could never be granted or refused on its own. The
34
- * mount contract for every name a caller tool answers to (its name and each alias), so each one is a name every list can
35
- * write; a protocol-minted name (`<ns>__<peer>__<tool>`, segments in `[A-Za-z0-9_-]`) is always one.
32
+ * Can a rule name this tool name — is it the rule syntax's name head ({@link RULE_TOOL_NAME}) with no `*` in it? A `*` makes a
33
+ * spelling a glob over names, not a name: a tool whose name held one would be reached by every rule whose glob matches it and
34
+ * could never be named on its own (the reference's mount spelling holds no `*` either). The mount contract for every name a
35
+ * caller tool answers to (its name and each alias), so each one is a name every list can write; a protocol-minted name
36
+ * (`<ns>__<peer>__<tool>`, segments in `[A-Za-z0-9_-]`) is always one.
36
37
  */
37
38
  export declare function isNameableToolName(name: string): boolean;
38
39
  /**
@@ -36,9 +36,9 @@ export function parsePermissionRule(rule) {
36
36
  return { toolName: name.trim() };
37
37
  return { toolName: name.trim(), ruleContent: unescapeRuleContent(content) };
38
38
  }
39
- const RULE_TOOL_NAME = /^(?:\*|[A-Za-z0-9_](?:[A-Za-z0-9_.:*-]*[A-Za-z0-9_*-])?)$/;
39
+ const RULE_TOOL_NAME = /^[A-Za-z0-9_*](?:[A-Za-z0-9_.:*-]*[A-Za-z0-9_*-])?$/;
40
40
  export function isNameableToolName(name) {
41
- return typeof name === "string" && name !== "*" && RULE_TOOL_NAME.test(name);
41
+ return typeof name === "string" && !name.includes("*") && RULE_TOOL_NAME.test(name);
42
42
  }
43
43
  export function ruleSpellingOf(rule) {
44
44
  if (rule !== rule.trim())
@@ -1,5 +1,5 @@
1
1
  /**
2
- * design/127 — **参数级权限规则 DSL**(CC 2.1.201 追平批 γ)。声明式规则字符串 → {@link ToolPolicy}
2
+ * design/127 — **参数级权限规则 DSL**(追平批 γ)。声明式规则字符串 → {@link ToolPolicy}
3
3
  * 编译器:`"Tool"`(裸)/ `"Tool(param:pattern)"`(参数级,`*` 通配全串锚定)。CC ground truth
4
4
  * 行号级:解析 `Lh` :55214 · 通配 `ZMr` :55196 · 参数级 matcher `gnn` :595123 · 评估序 `G1e` :595272。
5
5
  *
@@ -46,11 +46,21 @@
46
46
  *
47
47
  * The NAME lane is the same shape for the tools of `NAME_RULE_FACES` (the `Skill` tool): a `Skill(<name>)` / `Skill(<prefix>:*)`
48
48
  * deny or ask — the reference's own spelling — compiles through the same validator (the model's name grammar) and is judged on the
49
- * one string the call names (`nameRuleSubjectOf`) with `nameRuleAdmits`, the reader the persisted rule store uses. The parameter
49
+ * one string the call names (`nameRuleSubjectOf`) with `nameRuleReach`, the predicate the persisted rule store uses. The parameter
50
50
  * spelling `Skill(skill:<name>)` those tools used to take is retired: refused loudly, its sentence naming the CC form. A KEYED
51
51
  * value tool (`Artifact(action:<word>)`) takes the same lane for content keyed by its own parameter (`nameGrammarReads`); its
52
- * other arguments stay on the generic `param:pattern` lane. A call of it that names no value for the key as the tool reads it
53
- * is refused by the key's deny or ask rule (`keyedValueAbsentReason`, the persisted lane's reading).
52
+ * other arguments stay on the generic `param:pattern` lane. The delegation tool's `Agent(<subagent_type>)` takes it too, its
53
+ * value and the call's resolved against the agent types the call's face carries (`nameRuleReach`), its other arguments on the
54
+ * generic lane. A call of a closed-set tool that names no value as the tool reads it is refused by the tool's deny or ask rule
55
+ * (`nameValueAbsentReason`, the persisted lane's reading).
56
+ *
57
+ * The HOST lane is the same shape for a tool name the catalog declares a host target for (the URL its call reaches —
58
+ * `WebFetch`'s `url`): a `WebFetch(domain:<host>)` / `WebFetch(domain:*.<domain>)` deny or ask — the reference's own spelling —
59
+ * compiles through the model's domain grammar and is judged on the host the call reaches (`callHostTargetOf`, the protective
60
+ * reading: the call face's slot, the catalog's for the name as the floor) with `domainRuleAdmits`, the reader a person's stored
61
+ * rows and the entry lists use. Every lane is one dispatch over the rule's name and content (`ruleLaneOf`), so the static
62
+ * compile and a leg's roster compile read every rule the same way. A call whose host cannot be read is refused by a host deny
63
+ * rule and is the fail-closed ask under a host ask rule.
54
64
  *
55
65
  * 🔴 与 CC 的有意差(design/127 r2):
56
66
  * - CC 参数级 generic 道无 allow lane(gnn 只有 deny/ask)—— 我们同样,且整个 policy 无 allow 臂。
@@ -80,8 +90,8 @@ export interface PermissionRuleIssue {
80
90
  /** A rule the rule syntax reads no rule in (`ruleSpellingOf`) whose name is the reason: blanks around the rule, a
81
91
  * character outside a tool name's spelling (a variation selector, a filler, a zero-width space), a blank or an invisible
82
92
  * character before the `(`, a leading `-`. Refused — the lenient reading would deny a tool under another spelling, or none.
83
- * Also a rule whose tool name the syntax reads as the wildcard `*` (`*`, `*()`, `*(*)`): a rule reaches the tool it
84
- * names, and `*` names none. */
93
+ * (A `*` in a tool name is no such spelling: a deny or ask rule reads it as a glob over the whole name, `*` alone as every
94
+ * tool.) */
85
95
  | "invalid.tool_name" | "invalid.param_split" | "invalid.primary_field" | "invalid.cap_exceeded"
86
96
  /** An ALLOW rule (any spelling): a policy fold says deny / ask only — "this does not need asking" is the allow
87
97
  * layer's (`TaskSpec.allowedTools`, `RunnerDeps.allowedTools`). One issue per allow rule. */
@@ -102,6 +112,11 @@ export interface PermissionRuleIssue {
102
112
  * is an object/array (a rule on it can never match); the tool is unknown to the resolver a leg
103
113
  * supplied (absent resolver ⇒ the catalog alone judges and an unknown tool stays permissive). */
104
114
  | "unsupported.param_unknown" | "unsupported.param_non_scalar" | "unsupported.tool_unknown"
115
+ /** A deny/ask name rule whose value the fold lands on SEVERAL of the values the leg's mounted tool declares
116
+ * (`Agent(codereview)` on a leg offering `code-review` and `code_review`): which one it names is not determinable, and a rule
117
+ * is never resolved to one of several — refused when the leg's `ruleFaces` carry the values (without them the rule reaches
118
+ * every such value at the gate). */
119
+ | "invalid.name_ambiguous"
105
120
  /** A path-form deny/ask whose spelling needs a base this policy DECLARES as something other than an absolute path
106
121
  * of its tree's family (`/x` reads `pathBases.root`; a relative pattern `pathBases.cwd`, else `root`; `~/` `home`)
107
122
  * — a bad declared value, refused rather than compiled into a rule that reaches nothing. An undeclared base is no
@@ -117,8 +132,29 @@ export interface PermissionRuleIssue {
117
132
  /** HRD-PRM-7: a param-level rule naming a parameter the target tool does not carry. Additive member —
118
133
  * the lane that used to compile silently and never match (see {@link FILE_TOOL_PARAMS}). */
119
134
  | "unsupported.unknown_param";
135
+ /** What a person can do about the rule — never a construction option of the library: those ride on {@link libraryOption}. */
120
136
  message: string;
137
+ /**
138
+ * The engine-side library coordinate this refusal relates to — a name a host program or a spec author holds and a person
139
+ * writing rules does not: a construction option of the compile call (a key of {@link PermissionRulePolicyOptions}, a
140
+ * `pathBases` / `caps` entry spelled `pathBases.<word>` / `caps.<key>`), the allow-list seat of a request or of a deployment
141
+ * (`TaskSpec.allowedTools` / `RunnerDeps.allowedTools`), or the MCP server spec's per-tool declaration (`toolAxes`). Present
142
+ * where the engine offers it as the way out of the refusal, or names it as the declaration the refusal rests on (a rule set
143
+ * over its cap, a declared base that is no path, the list that is no list) — not wherever some other value of an option would
144
+ * happen to change the answer (a resolver that declared more parameters would also make a misspelled one compile; that is not
145
+ * a way out). The sentence never names it, so a host that exposes the coordinate renders it and any other host shows the
146
+ * sentence alone. Minted in one place ({@link ruleIssue}).
147
+ */
148
+ libraryOption?: {
149
+ name: "primaryFieldGeneric" | "defaultAction" | "ruleFaces" | `pathBases.${keyof PathRuleBases}` | `caps.${keyof PermissionRuleCaps}` | "TaskSpec.allowedTools" | "RunnerDeps.allowedTools" | "toolAxes";
150
+ /** The value that opts in, when the way out is one value (`primaryFieldGeneric` ⇒ `"allow-lexical"`); absent when the option
151
+ * takes the host's own choice (a cap's size, a base's path, the answer for calls no rule reaches). */
152
+ value?: string;
153
+ };
121
154
  }
155
+ /** THE mint of a {@link PermissionRuleIssue}: every issue the compiler and the allow-list screen report is made here, so the
156
+ * optional {@link PermissionRuleIssue.libraryOption} is written at one place and an absent one is absent, never `undefined`. */
157
+ export declare function ruleIssue(rule: string, code: PermissionRuleIssue["code"], message: string, libraryOption?: PermissionRuleIssue["libraryOption"]): PermissionRuleIssue;
122
158
  export interface PermissionRuleCaps {
123
159
  maxRules: number;
124
160
  maxRuleLength: number;
@@ -170,23 +206,25 @@ export interface PermissionRulePolicyOptions {
170
206
  */
171
207
  pathBases?: PathRuleBases;
172
208
  }
173
- import { isNamespacedCoveringRuleName, namespacedRuleNameCovers, wildcardMatch } from "./namespaced-rule-name.js";
174
- export { isNamespacedCoveringRuleName, namespacedRuleNameCovers, wildcardMatch };
209
+ import { isCoveringRuleName, ruleNameCovers, wildcardMatch } from "./namespaced-rule-name.js";
210
+ export { isCoveringRuleName, ruleNameCovers, wildcardMatch };
175
211
  /**
176
212
  * design/388 A-6/7/8/9 (D-3): the per-tool RULE FACE — the parameters a `Tool(param:pattern)` rule may name
177
213
  * (`params`, the SCALAR top-level keys ∪ the path target's aliases), the ones the generic lexical matcher must
178
- * not be pointed at (`primaryParams`), the carried-but-non-scalar keys a rule can never match (`nonScalar`), and
179
- * whether the tool names a path target at all (the file-tool glob lane). Resolved through
180
- * {@link PermissionRulePolicyOptions.ruleFaces} when a leg supplies its roster, else from the static catalog
181
- * — the three hand-kept tables (`PRIMARY_FIELDS` / `FILE_TOOLS` / `FILE_TOOL_PARAMS`) this replaced are gone.
214
+ * not be pointed at (`primaryParams`) and the carried-but-non-scalar keys a rule can never match (`nonScalar`). Resolved
215
+ * through {@link PermissionRulePolicyOptions.ruleFaces} when a leg supplies its roster, else from the static catalog — the
216
+ * three hand-kept tables (`PRIMARY_FIELDS` / `FILE_TOOLS` / `FILE_TOOL_PARAMS`) this replaced are gone. Which lane a rule
217
+ * takes is not the face's to say: it is the rule's name's grammar (`ruleLaneOf`), the same with or without a resolver.
182
218
  */
183
219
  export interface RuleFaceView {
184
220
  primaryParams: readonly string[];
185
- /** The full scalar vocabulary; ABSENT when the resolver does not know it (the static catalog for a
186
- * definition whose schema is factory-built) — then only the primary-field check applies. */
221
+ /** The full scalar vocabulary. A face that states none declares its `primaryParams` only: a rule naming any other
222
+ * parameter is refused (`unsupported.param_unknown`) — a face never leaves a parameter name unjudged. */
187
223
  params?: readonly string[];
188
224
  nonScalar?: readonly string[];
189
- pathTargeting?: boolean;
225
+ /** The values the mounted tool takes for the argument its name rules are read against (`ToolRuleFace.nameValues`): with them a
226
+ * name rule whose value the fold lands on several of them is refused at compile (`invalid.name_ambiguous`). */
227
+ nameValues?: readonly string[];
190
228
  }
191
229
  /** The static catalog's answer for a wire name (undefined ⇒ the catalog does not carry it). */
192
230
  export declare function catalogRuleFaceView(toolName: string): RuleFaceView | undefined;