pi-daddy 0.28.0 → 0.32.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 (1005) hide show
  1. package/CHANGELOG.md +99 -124
  2. package/README.md +18 -896
  3. package/THIRD_PARTY_NOTICES.md +1 -1
  4. package/contracts/ledger-record/v1/README.md +44 -0
  5. package/contracts/ledger-record/v1/fixtures/child-lifecycle.json +45 -0
  6. package/contracts/ledger-record/v1/fixtures/ledger-record.jsonl +3 -0
  7. package/contracts/ledger-record/v1/governance-event.schema.json +747 -0
  8. package/contracts/ledger-record/v1/record.schema.json +91 -0
  9. package/dist/cli.d.ts +6 -4
  10. package/dist/cli.d.ts.map +1 -1
  11. package/dist/cli.js +108 -103
  12. package/dist/cli.js.map +1 -1
  13. package/dist/executors/activity-session.d.ts +12 -0
  14. package/dist/executors/activity-session.d.ts.map +1 -0
  15. package/dist/executors/activity-session.js +43 -0
  16. package/dist/executors/activity-session.js.map +1 -0
  17. package/dist/executors/executor.d.ts +39 -0
  18. package/dist/executors/executor.d.ts.map +1 -0
  19. package/dist/executors/executor.js +95 -0
  20. package/dist/executors/executor.js.map +1 -0
  21. package/dist/executors/herdr-cli.d.ts +78 -0
  22. package/dist/executors/herdr-cli.d.ts.map +1 -0
  23. package/dist/executors/herdr-cli.js +114 -0
  24. package/dist/executors/herdr-cli.js.map +1 -0
  25. package/dist/executors/herdr-name.d.ts.map +1 -0
  26. package/dist/executors/herdr-name.js.map +1 -0
  27. package/dist/executors/herdr-pi-lifecycle.d.ts.map +1 -0
  28. package/dist/executors/herdr-pi-lifecycle.js +22 -0
  29. package/dist/executors/herdr-pi-lifecycle.js.map +1 -0
  30. package/dist/executors/herdr-poll.d.ts +140 -0
  31. package/dist/executors/herdr-poll.d.ts.map +1 -0
  32. package/dist/executors/herdr-poll.js +252 -0
  33. package/dist/executors/herdr-poll.js.map +1 -0
  34. package/dist/executors/herdr-stage.d.ts +40 -0
  35. package/dist/executors/herdr-stage.d.ts.map +1 -0
  36. package/dist/executors/herdr-stage.js +54 -0
  37. package/dist/executors/herdr-stage.js.map +1 -0
  38. package/dist/executors/herdr-start.d.ts.map +1 -0
  39. package/dist/executors/herdr-start.js.map +1 -0
  40. package/dist/executors/native-session-target.d.ts +9 -0
  41. package/dist/executors/native-session-target.d.ts.map +1 -0
  42. package/dist/executors/native-session-target.js +30 -0
  43. package/dist/executors/native-session-target.js.map +1 -0
  44. package/dist/executors/pane-reaper.d.ts +111 -0
  45. package/dist/executors/pane-reaper.d.ts.map +1 -0
  46. package/dist/executors/pane-reaper.js +242 -0
  47. package/dist/executors/pane-reaper.js.map +1 -0
  48. package/dist/executors/process-activity.d.ts +3 -0
  49. package/dist/executors/process-activity.d.ts.map +1 -0
  50. package/dist/executors/process-activity.js +59 -0
  51. package/dist/executors/process-activity.js.map +1 -0
  52. package/dist/executors/run-herdr.d.ts +122 -0
  53. package/dist/executors/run-herdr.d.ts.map +1 -0
  54. package/dist/executors/run-herdr.js +341 -0
  55. package/dist/executors/run-herdr.js.map +1 -0
  56. package/dist/executors/vendor/herdr-pi-lifecycle.d.ts.map +1 -0
  57. package/dist/executors/vendor/herdr-pi-lifecycle.js.map +1 -0
  58. package/dist/governance/approval-prompt.d.ts +119 -0
  59. package/dist/governance/approval-prompt.d.ts.map +1 -0
  60. package/dist/governance/approval-prompt.js +133 -0
  61. package/dist/governance/approval-prompt.js.map +1 -0
  62. package/dist/governance/approval-store.d.ts +149 -0
  63. package/dist/governance/approval-store.d.ts.map +1 -0
  64. package/dist/governance/approval-store.js +309 -0
  65. package/dist/governance/approval-store.js.map +1 -0
  66. package/dist/governance/execution-retention.d.ts +90 -0
  67. package/dist/governance/execution-retention.d.ts.map +1 -0
  68. package/dist/governance/execution-retention.js +317 -0
  69. package/dist/governance/execution-retention.js.map +1 -0
  70. package/dist/governance/file-lock.d.ts.map +1 -0
  71. package/dist/governance/file-lock.js +205 -0
  72. package/dist/governance/file-lock.js.map +1 -0
  73. package/dist/governance/finalization.d.ts.map +1 -0
  74. package/dist/governance/finalization.js.map +1 -0
  75. package/dist/governance/grant-store.d.ts +96 -0
  76. package/dist/governance/grant-store.d.ts.map +1 -0
  77. package/dist/governance/grant-store.js +186 -0
  78. package/dist/governance/grant-store.js.map +1 -0
  79. package/dist/governance/init.d.ts +129 -0
  80. package/dist/governance/init.d.ts.map +1 -0
  81. package/dist/governance/init.js +360 -0
  82. package/dist/governance/init.js.map +1 -0
  83. package/dist/governance/lease-helper.d.ts.map +1 -0
  84. package/dist/governance/lease-helper.js +121 -0
  85. package/dist/governance/lease-helper.js.map +1 -0
  86. package/dist/governance/lease-record.d.ts +90 -0
  87. package/dist/governance/lease-record.d.ts.map +1 -0
  88. package/dist/governance/lease-record.js.map +1 -0
  89. package/dist/governance/ledger-events.d.ts +111 -0
  90. package/dist/governance/ledger-events.d.ts.map +1 -0
  91. package/dist/governance/ledger-events.js +129 -0
  92. package/dist/governance/ledger-events.js.map +1 -0
  93. package/dist/governance/ledger-report.d.ts +134 -0
  94. package/dist/governance/ledger-report.d.ts.map +1 -0
  95. package/dist/governance/ledger-report.js +294 -0
  96. package/dist/governance/ledger-report.js.map +1 -0
  97. package/dist/governance/ledger-v3-validation.d.ts +21 -0
  98. package/dist/governance/ledger-v3-validation.d.ts.map +1 -0
  99. package/dist/governance/ledger-v3-validation.js +353 -0
  100. package/dist/governance/ledger-v3-validation.js.map +1 -0
  101. package/dist/governance/ledger.d.ts +258 -0
  102. package/dist/governance/ledger.d.ts.map +1 -0
  103. package/dist/governance/ledger.js +201 -0
  104. package/dist/governance/ledger.js.map +1 -0
  105. package/dist/governance/native-session.d.ts +59 -0
  106. package/dist/governance/native-session.d.ts.map +1 -0
  107. package/dist/governance/native-session.js +208 -0
  108. package/dist/governance/native-session.js.map +1 -0
  109. package/dist/governance/record.d.ts +65 -0
  110. package/dist/governance/record.d.ts.map +1 -0
  111. package/dist/governance/record.js +259 -0
  112. package/dist/governance/record.js.map +1 -0
  113. package/dist/governance/retention-contract.d.ts.map +1 -0
  114. package/dist/governance/retention-contract.js +187 -0
  115. package/dist/governance/retention-contract.js.map +1 -0
  116. package/dist/governance/retention-json.d.ts.map +1 -0
  117. package/dist/governance/retention-json.js.map +1 -0
  118. package/dist/governance/workspace-lease.d.ts +40 -0
  119. package/dist/governance/workspace-lease.d.ts.map +1 -0
  120. package/dist/governance/workspace-lease.js +357 -0
  121. package/dist/governance/workspace-lease.js.map +1 -0
  122. package/dist/index.d.ts +59 -42
  123. package/dist/index.d.ts.map +1 -1
  124. package/dist/index.js +61 -42
  125. package/dist/index.js.map +1 -1
  126. package/dist/kernel/approval.d.ts +241 -0
  127. package/dist/kernel/approval.d.ts.map +1 -0
  128. package/dist/kernel/approval.js +270 -0
  129. package/dist/kernel/approval.js.map +1 -0
  130. package/dist/kernel/capabilities.d.ts +136 -0
  131. package/dist/kernel/capabilities.d.ts.map +1 -0
  132. package/dist/kernel/capabilities.js +199 -0
  133. package/dist/kernel/capabilities.js.map +1 -0
  134. package/dist/kernel/catalog.d.ts +98 -0
  135. package/dist/kernel/catalog.d.ts.map +1 -0
  136. package/dist/kernel/catalog.js +280 -0
  137. package/dist/kernel/catalog.js.map +1 -0
  138. package/dist/kernel/chain.d.ts.map +1 -0
  139. package/dist/kernel/chain.js.map +1 -0
  140. package/dist/kernel/correlation.d.ts.map +1 -0
  141. package/dist/kernel/correlation.js +267 -0
  142. package/dist/kernel/correlation.js.map +1 -0
  143. package/dist/kernel/definitions.d.ts.map +1 -0
  144. package/dist/kernel/definitions.js +164 -0
  145. package/dist/kernel/definitions.js.map +1 -0
  146. package/dist/kernel/delegate-types.d.ts +160 -0
  147. package/dist/kernel/delegate-types.d.ts.map +1 -0
  148. package/dist/kernel/delegate-types.js +9 -0
  149. package/dist/kernel/delegate-types.js.map +1 -0
  150. package/dist/kernel/delegate.d.ts.map +1 -0
  151. package/dist/kernel/delegate.js +314 -0
  152. package/dist/kernel/delegate.js.map +1 -0
  153. package/dist/kernel/delegation-approval.d.ts.map +1 -0
  154. package/dist/kernel/delegation-approval.js +93 -0
  155. package/dist/kernel/delegation-approval.js.map +1 -0
  156. package/dist/kernel/env-names.d.ts +51 -0
  157. package/dist/kernel/env-names.d.ts.map +1 -0
  158. package/dist/kernel/env-names.js +112 -0
  159. package/dist/kernel/env-names.js.map +1 -0
  160. package/dist/kernel/execution-id.d.ts.map +1 -0
  161. package/dist/kernel/execution-id.js.map +1 -0
  162. package/dist/kernel/fanout.d.ts.map +1 -0
  163. package/dist/kernel/fanout.js +93 -0
  164. package/dist/kernel/fanout.js.map +1 -0
  165. package/dist/kernel/grant-env.d.ts +118 -0
  166. package/dist/kernel/grant-env.d.ts.map +1 -0
  167. package/dist/kernel/grant-env.js +104 -0
  168. package/dist/kernel/grant-env.js.map +1 -0
  169. package/dist/kernel/ledger-identifiers.d.ts.map +1 -0
  170. package/dist/kernel/ledger-identifiers.js.map +1 -0
  171. package/dist/kernel/model-preflight.d.ts +13 -0
  172. package/dist/kernel/model-preflight.d.ts.map +1 -0
  173. package/dist/kernel/model-preflight.js +30 -0
  174. package/dist/kernel/model-preflight.js.map +1 -0
  175. package/dist/kernel/pi-tools.d.ts.map +1 -0
  176. package/dist/kernel/pi-tools.js +29 -0
  177. package/dist/kernel/pi-tools.js.map +1 -0
  178. package/dist/kernel/progress.d.ts.map +1 -0
  179. package/dist/kernel/progress.js.map +1 -0
  180. package/dist/kernel/project-paths.d.ts +43 -0
  181. package/dist/kernel/project-paths.d.ts.map +1 -0
  182. package/dist/kernel/project-paths.js +81 -0
  183. package/dist/kernel/project-paths.js.map +1 -0
  184. package/dist/kernel/propagation.d.ts +195 -0
  185. package/dist/kernel/propagation.d.ts.map +1 -0
  186. package/dist/kernel/propagation.js +275 -0
  187. package/dist/kernel/propagation.js.map +1 -0
  188. package/dist/kernel/refusals.d.ts +16 -0
  189. package/dist/kernel/refusals.d.ts.map +1 -0
  190. package/dist/kernel/refusals.js +53 -0
  191. package/dist/kernel/refusals.js.map +1 -0
  192. package/dist/kernel/resolve.d.ts.map +1 -0
  193. package/dist/kernel/resolve.js +201 -0
  194. package/dist/kernel/resolve.js.map +1 -0
  195. package/dist/kernel/routing-authority.d.ts.map +1 -0
  196. package/dist/kernel/routing-authority.js.map +1 -0
  197. package/dist/kernel/run-child.d.ts +111 -0
  198. package/dist/kernel/run-child.d.ts.map +1 -0
  199. package/dist/kernel/run-child.js +324 -0
  200. package/dist/kernel/run-child.js.map +1 -0
  201. package/dist/kernel/skill-packages.d.ts +116 -0
  202. package/dist/kernel/skill-packages.d.ts.map +1 -0
  203. package/dist/kernel/skill-packages.js +300 -0
  204. package/dist/kernel/skill-packages.js.map +1 -0
  205. package/dist/kernel/skill-resources.d.ts.map +1 -0
  206. package/dist/kernel/skill-resources.js +56 -0
  207. package/dist/kernel/skill-resources.js.map +1 -0
  208. package/dist/kernel/spawn.d.ts.map +1 -0
  209. package/dist/kernel/spawn.js.map +1 -0
  210. package/dist/kernel/workspace.d.ts +51 -0
  211. package/dist/kernel/workspace.d.ts.map +1 -0
  212. package/dist/kernel/workspace.js +223 -0
  213. package/dist/kernel/workspace.js.map +1 -0
  214. package/dist/products/activity-timeline.d.ts +126 -0
  215. package/dist/products/activity-timeline.d.ts.map +1 -0
  216. package/dist/products/activity-timeline.js +542 -0
  217. package/dist/products/activity-timeline.js.map +1 -0
  218. package/dist/products/dashboard-cli.d.ts +26 -0
  219. package/dist/products/dashboard-cli.d.ts.map +1 -0
  220. package/dist/products/dashboard-cli.js +224 -0
  221. package/dist/products/dashboard-cli.js.map +1 -0
  222. package/dist/products/dashboard-display-controls.d.ts +17 -0
  223. package/dist/products/dashboard-display-controls.d.ts.map +1 -0
  224. package/dist/products/dashboard-display-controls.js +38 -0
  225. package/dist/products/dashboard-display-controls.js.map +1 -0
  226. package/dist/products/dashboard-handshake.d.ts +42 -0
  227. package/dist/products/dashboard-handshake.d.ts.map +1 -0
  228. package/dist/products/dashboard-handshake.js +158 -0
  229. package/dist/products/dashboard-handshake.js.map +1 -0
  230. package/dist/products/dashboard-herdr.d.ts +55 -0
  231. package/dist/products/dashboard-herdr.d.ts.map +1 -0
  232. package/dist/products/dashboard-herdr.js +324 -0
  233. package/dist/products/dashboard-herdr.js.map +1 -0
  234. package/dist/products/dashboard-projection.d.ts +62 -0
  235. package/dist/products/dashboard-projection.d.ts.map +1 -0
  236. package/dist/products/dashboard-projection.js +305 -0
  237. package/dist/products/dashboard-projection.js.map +1 -0
  238. package/dist/products/dashboard-render.d.ts.map +1 -0
  239. package/dist/products/dashboard-render.js +208 -0
  240. package/dist/products/dashboard-render.js.map +1 -0
  241. package/extensions/activity-timeline.ts +134 -28
  242. package/extensions/approval-banking.ts +3 -3
  243. package/extensions/approvals.ts +18 -12
  244. package/extensions/chain-approval-facts.ts +9 -6
  245. package/extensions/chain-ledger.ts +4 -4
  246. package/extensions/chain-plan.ts +6 -6
  247. package/extensions/correlation-shape.ts +42 -33
  248. package/extensions/delegate-chain.ts +93 -45
  249. package/extensions/delegation-authority.ts +7 -3
  250. package/extensions/delegation-ledger.ts +2 -2
  251. package/extensions/delegation-native.ts +24 -7
  252. package/extensions/delegation.ts +91 -80
  253. package/extensions/execute-child.ts +440 -293
  254. package/extensions/execution-occurrence.ts +2 -2
  255. package/extensions/executor-session.ts +5 -5
  256. package/extensions/fanout-outcome.ts +8 -6
  257. package/extensions/grant-store-refusal.ts +24 -12
  258. package/extensions/grants-command.ts +41 -33
  259. package/extensions/grants-connected-command.ts +29 -15
  260. package/extensions/grants.ts +73 -73
  261. package/extensions/init-command.ts +18 -12
  262. package/extensions/reload-environment.ts +12 -5
  263. package/extensions/run-delegation.ts +29 -19
  264. package/extensions/session-environment.ts +25 -11
  265. package/extensions/session-report.ts +60 -11
  266. package/extensions/session.ts +58 -34
  267. package/extensions/spawn-summary.ts +5 -5
  268. package/extensions/stored-grant-session.ts +5 -5
  269. package/extensions/tripwire.ts +1 -1
  270. package/extensions/workspace-runtime.ts +26 -24
  271. package/herdr-plugin/herdr-plugin.toml +1 -1
  272. package/package.json +4 -211
  273. package/src/cli.ts +136 -89
  274. package/src/executors/activity-session.ts +54 -0
  275. package/src/executors/executor.ts +123 -0
  276. package/src/executors/herdr-cli.ts +132 -0
  277. package/src/executors/herdr-pi-lifecycle.ts +21 -0
  278. package/src/executors/herdr-poll.ts +305 -0
  279. package/src/executors/herdr-stage.ts +55 -0
  280. package/src/executors/native-session-target.ts +31 -0
  281. package/src/executors/pane-reaper.ts +270 -0
  282. package/src/executors/process-activity.ts +54 -0
  283. package/src/executors/run-herdr.ts +426 -0
  284. package/src/governance/approval-prompt.ts +225 -0
  285. package/src/governance/approval-store.ts +385 -0
  286. package/src/governance/execution-retention.ts +372 -0
  287. package/src/governance/file-lock.ts +210 -0
  288. package/src/governance/finalization.ts +82 -0
  289. package/src/governance/grant-store.ts +235 -0
  290. package/src/governance/init.ts +447 -0
  291. package/src/governance/lease-helper.ts +124 -0
  292. package/src/governance/lease-record.ts +131 -0
  293. package/src/governance/ledger-events.ts +222 -0
  294. package/src/governance/ledger-report.ts +396 -0
  295. package/src/governance/ledger-v3-validation.ts +384 -0
  296. package/src/governance/ledger.ts +419 -0
  297. package/src/governance/native-session.ts +264 -0
  298. package/src/governance/record.ts +294 -0
  299. package/src/governance/retention-contract.ts +201 -0
  300. package/src/governance/retention-json.ts +24 -0
  301. package/src/governance/workspace-lease.ts +429 -0
  302. package/src/index.ts +82 -92
  303. package/src/kernel/approval.ts +406 -0
  304. package/src/kernel/capabilities.ts +216 -0
  305. package/src/kernel/catalog.ts +313 -0
  306. package/src/kernel/correlation.ts +351 -0
  307. package/src/kernel/definitions.ts +215 -0
  308. package/src/kernel/delegate-types.ts +162 -0
  309. package/src/kernel/delegate.ts +370 -0
  310. package/src/kernel/delegation-approval.ts +126 -0
  311. package/src/kernel/env-names.ts +119 -0
  312. package/src/kernel/fanout.ts +106 -0
  313. package/src/kernel/grant-env.ts +174 -0
  314. package/src/kernel/model-preflight.ts +44 -0
  315. package/src/kernel/pi-tools.ts +32 -0
  316. package/src/kernel/project-paths.ts +97 -0
  317. package/src/kernel/propagation.ts +341 -0
  318. package/src/kernel/refusals.ts +64 -0
  319. package/src/kernel/resolve.ts +258 -0
  320. package/src/kernel/run-child.ts +418 -0
  321. package/src/kernel/skill-packages.ts +329 -0
  322. package/src/kernel/skill-resources.ts +64 -0
  323. package/src/kernel/workspace.ts +336 -0
  324. package/src/products/activity-timeline.ts +679 -0
  325. package/src/products/dashboard-cli.ts +250 -0
  326. package/src/products/dashboard-display-controls.ts +44 -0
  327. package/src/products/dashboard-handshake.ts +222 -0
  328. package/src/products/dashboard-herdr.ts +427 -0
  329. package/src/products/dashboard-projection.ts +389 -0
  330. package/src/products/dashboard-render.ts +260 -0
  331. package/PRODUCT-GUIDE.md +0 -155
  332. package/REQUIREMENTS.md +0 -41
  333. package/contracts/daily-view/v1/README.md +0 -114
  334. package/contracts/daily-view/v1/fixtures/view.json +0 -525
  335. package/contracts/daily-view/v1/fixtures/view.txt +0 -75
  336. package/contracts/daily-view/v1/fixtures/work.jsonl +0 -17
  337. package/contracts/daily-view/v1/p03/README.md +0 -26
  338. package/contracts/daily-view/v1/p03/fixtures/retained-executions.json +0 -241
  339. package/contracts/daily-view/v1/p03/projection.schema.json +0 -194
  340. package/contracts/daily-view/v1/p03/provenance.json +0 -21
  341. package/contracts/dashboard-host/v1/README.md +0 -176
  342. package/contracts/debrief/v1/README.md +0 -146
  343. package/contracts/debrief/v1/intervention/README.md +0 -32
  344. package/contracts/debrief/v1/intervention/fixtures/artifact-3ee11136beb864f518252e5024dae9197421fbf97b6e981d3243c782b5c44bd0.txt +0 -1
  345. package/contracts/debrief/v1/intervention/fixtures/artifact-58905d872dd3c54a9705f67b05fa82edbad7af6476ae8993faf1a7b9fadfb905.txt +0 -1
  346. package/contracts/debrief/v1/intervention/fixtures/assessment.json +0 -29
  347. package/contracts/debrief/v1/intervention/fixtures/blind-view.json +0 -20
  348. package/contracts/debrief/v1/intervention/fixtures/choice.json +0 -7
  349. package/contracts/debrief/v1/intervention/fixtures/manifest.json +0 -57
  350. package/contracts/debrief/v1/intervention/fixtures/reveal.json +0 -39
  351. package/contracts/debrief/v1/provenance.json +0 -89
  352. package/contracts/debrief/v1/work-capture/README.md +0 -38
  353. package/contracts/debrief/v1/work-capture/fixtures/batch.json +0 -17
  354. package/contracts/debrief/v1/work-capture/fixtures/cases.json +0 -184
  355. package/contracts/debrief/v1/work-capture/fixtures/review.json +0 -184
  356. package/contracts/debrief/v1/work-capture/review-request.schema.json +0 -41
  357. package/contracts/debrief/v1/work-capture/work-case.schema.json +0 -190
  358. package/contracts/debrief/v2/README.md +0 -71
  359. package/contracts/debrief/v2/input-pin.json +0 -66
  360. package/contracts/debrief/v2/intervention-upstream.md +0 -40
  361. package/contracts/debrief/v2/work-signals-upstream.md +0 -22
  362. package/contracts/dispatch-control/v1/README.md +0 -109
  363. package/contracts/dispatch-control/v1/request.schema.json +0 -19
  364. package/contracts/effect-profile/v1/README.md +0 -124
  365. package/contracts/execution-retention/v1/README.md +0 -109
  366. package/contracts/execution-retention/v2/README.md +0 -148
  367. package/contracts/execution-retention/v2/fixtures/interrupted-native-bytes.json +0 -91
  368. package/contracts/execution-retention/v2/fixtures/missing-native-session.json +0 -91
  369. package/contracts/execution-retention/v2/fixtures/native-file-unknown-branch.json +0 -91
  370. package/contracts/execution-retention/v2/fixtures/native-id-without-bytes.json +0 -91
  371. package/contracts/execution-retention/v2/fixtures/native-live-branch.json +0 -90
  372. package/contracts/execution-retention/v2/fixtures/replaced-native-session.json +0 -92
  373. package/contracts/execution-retention/v2/fixtures/result-82c620cdfeb8ca6b858cf653d7f5e2eedca5315d6244216d60e8b36f03223d6a.bin +0 -1
  374. package/contracts/execution-retention/v2/fixtures/session-2ec1f134bc739984434f7fca689e1c3d1c39fce2dcadae709e9b6faedfcc4ac7.bin +0 -3
  375. package/contracts/execution-retention/v2/fixtures/session-9bdb4bd16a901da31580acf056bda525225259e15ec409e0410480109011772f.bin +0 -3
  376. package/contracts/execution-retention/v2/manifest.schema.json +0 -858
  377. package/contracts/experiment/v1/README.md +0 -164
  378. package/contracts/factory-order/v1/README.md +0 -151
  379. package/contracts/factory-order/v1/adoption-pin.json +0 -8
  380. package/contracts/intent-control/v1/README.md +0 -135
  381. package/contracts/intent-control/v1/request.schema.json +0 -1096
  382. package/contracts/intent-control/v2/README.md +0 -34
  383. package/contracts/intent-control/v2/request.schema.json +0 -1070
  384. package/contracts/ledger/v2/README.md +0 -59
  385. package/contracts/ledger/v2/fixtures/capability-decision.json +0 -95
  386. package/contracts/ledger/v2/fixtures/check-receipt.json +0 -40
  387. package/contracts/ledger/v2/fixtures/child-lifecycle.json +0 -42
  388. package/contracts/ledger/v2/fixtures/workspace-lease.json +0 -41
  389. package/contracts/ledger/v2/ledger-event.schema.json +0 -633
  390. package/contracts/ledger/v3/README.md +0 -36
  391. package/contracts/ledger/v3/fixtures/check-receipt.json +0 -41
  392. package/contracts/ledger/v3/fixtures/child-lifecycle.json +0 -44
  393. package/contracts/ledger/v3/fixtures/workflow-fact.json +0 -40
  394. package/contracts/ledger/v3/ledger-event.schema.json +0 -955
  395. package/contracts/ledger/v4/README.md +0 -241
  396. package/contracts/ledger/v4/fixtures/layout-options.json +0 -428
  397. package/contracts/ledger/v4/fixtures/work-acceptance.json +0 -57
  398. package/contracts/ledger/v4/fixtures/work-occurrence.json +0 -44
  399. package/contracts/ledger/v4/fixtures/work-revision.json +0 -26
  400. package/contracts/ledger/v4/fixtures/work-snapshot.json +0 -73
  401. package/contracts/ledger/v4/ledger-event.schema.json +0 -162
  402. package/contracts/ordinary-control/v1/README.md +0 -59
  403. package/contracts/producer-ipc/v1/README.md +0 -137
  404. package/dist/activity-timeline.d.ts +0 -109
  405. package/dist/activity-timeline.d.ts.map +0 -1
  406. package/dist/activity-timeline.js +0 -208
  407. package/dist/activity-timeline.js.map +0 -1
  408. package/dist/approval-prompt.d.ts +0 -119
  409. package/dist/approval-prompt.d.ts.map +0 -1
  410. package/dist/approval-prompt.js +0 -133
  411. package/dist/approval-prompt.js.map +0 -1
  412. package/dist/approval-store.d.ts +0 -149
  413. package/dist/approval-store.d.ts.map +0 -1
  414. package/dist/approval-store.js +0 -314
  415. package/dist/approval-store.js.map +0 -1
  416. package/dist/approval.d.ts +0 -241
  417. package/dist/approval.d.ts.map +0 -1
  418. package/dist/approval.js +0 -268
  419. package/dist/approval.js.map +0 -1
  420. package/dist/capabilities.d.ts +0 -136
  421. package/dist/capabilities.d.ts.map +0 -1
  422. package/dist/capabilities.js +0 -203
  423. package/dist/capabilities.js.map +0 -1
  424. package/dist/catalog.d.ts +0 -98
  425. package/dist/catalog.d.ts.map +0 -1
  426. package/dist/catalog.js +0 -273
  427. package/dist/catalog.js.map +0 -1
  428. package/dist/chain.d.ts.map +0 -1
  429. package/dist/chain.js.map +0 -1
  430. package/dist/check-runner.d.ts +0 -66
  431. package/dist/check-runner.d.ts.map +0 -1
  432. package/dist/check-runner.js +0 -275
  433. package/dist/check-runner.js.map +0 -1
  434. package/dist/control-journal.d.ts +0 -20
  435. package/dist/control-journal.d.ts.map +0 -1
  436. package/dist/control-journal.js +0 -73
  437. package/dist/control-journal.js.map +0 -1
  438. package/dist/correlation.d.ts.map +0 -1
  439. package/dist/correlation.js +0 -231
  440. package/dist/correlation.js.map +0 -1
  441. package/dist/daily-dashboard-host.d.ts +0 -136
  442. package/dist/daily-dashboard-host.d.ts.map +0 -1
  443. package/dist/daily-dashboard-host.js +0 -164
  444. package/dist/daily-dashboard-host.js.map +0 -1
  445. package/dist/daily-panel.d.ts +0 -36
  446. package/dist/daily-panel.d.ts.map +0 -1
  447. package/dist/daily-panel.js +0 -84
  448. package/dist/daily-panel.js.map +0 -1
  449. package/dist/daily-view-input.d.ts +0 -44
  450. package/dist/daily-view-input.d.ts.map +0 -1
  451. package/dist/daily-view-input.js +0 -68
  452. package/dist/daily-view-input.js.map +0 -1
  453. package/dist/daily-view-render.d.ts +0 -5
  454. package/dist/daily-view-render.d.ts.map +0 -1
  455. package/dist/daily-view-render.js +0 -42
  456. package/dist/daily-view-render.js.map +0 -1
  457. package/dist/daily-view.d.ts +0 -77
  458. package/dist/daily-view.d.ts.map +0 -1
  459. package/dist/daily-view.js +0 -176
  460. package/dist/daily-view.js.map +0 -1
  461. package/dist/dashboard-cli.d.ts +0 -54
  462. package/dist/dashboard-cli.d.ts.map +0 -1
  463. package/dist/dashboard-cli.js +0 -367
  464. package/dist/dashboard-cli.js.map +0 -1
  465. package/dist/dashboard-display-controls.d.ts +0 -15
  466. package/dist/dashboard-display-controls.d.ts.map +0 -1
  467. package/dist/dashboard-display-controls.js +0 -34
  468. package/dist/dashboard-display-controls.js.map +0 -1
  469. package/dist/dashboard-handshake.d.ts +0 -42
  470. package/dist/dashboard-handshake.d.ts.map +0 -1
  471. package/dist/dashboard-handshake.js +0 -147
  472. package/dist/dashboard-handshake.js.map +0 -1
  473. package/dist/dashboard-harness.d.ts +0 -22
  474. package/dist/dashboard-harness.d.ts.map +0 -1
  475. package/dist/dashboard-harness.js +0 -89
  476. package/dist/dashboard-harness.js.map +0 -1
  477. package/dist/dashboard-herdr.d.ts +0 -55
  478. package/dist/dashboard-herdr.d.ts.map +0 -1
  479. package/dist/dashboard-herdr.js +0 -293
  480. package/dist/dashboard-herdr.js.map +0 -1
  481. package/dist/dashboard-host-contract.d.ts +0 -127
  482. package/dist/dashboard-host-contract.d.ts.map +0 -1
  483. package/dist/dashboard-host-contract.js +0 -14
  484. package/dist/dashboard-host-contract.js.map +0 -1
  485. package/dist/dashboard-host-transport.d.ts +0 -16
  486. package/dist/dashboard-host-transport.d.ts.map +0 -1
  487. package/dist/dashboard-host-transport.js +0 -127
  488. package/dist/dashboard-host-transport.js.map +0 -1
  489. package/dist/dashboard-host.d.ts +0 -239
  490. package/dist/dashboard-host.d.ts.map +0 -1
  491. package/dist/dashboard-host.js +0 -474
  492. package/dist/dashboard-host.js.map +0 -1
  493. package/dist/dashboard-menu.d.ts +0 -16
  494. package/dist/dashboard-menu.d.ts.map +0 -1
  495. package/dist/dashboard-menu.js +0 -33
  496. package/dist/dashboard-menu.js.map +0 -1
  497. package/dist/dashboard-observation.d.ts +0 -28
  498. package/dist/dashboard-observation.d.ts.map +0 -1
  499. package/dist/dashboard-observation.js +0 -87
  500. package/dist/dashboard-observation.js.map +0 -1
  501. package/dist/dashboard-projection.d.ts +0 -73
  502. package/dist/dashboard-projection.d.ts.map +0 -1
  503. package/dist/dashboard-projection.js +0 -294
  504. package/dist/dashboard-projection.js.map +0 -1
  505. package/dist/dashboard-render.d.ts.map +0 -1
  506. package/dist/dashboard-render.js +0 -212
  507. package/dist/dashboard-render.js.map +0 -1
  508. package/dist/debrief-contract.d.ts +0 -65
  509. package/dist/debrief-contract.d.ts.map +0 -1
  510. package/dist/debrief-contract.js +0 -151
  511. package/dist/debrief-contract.js.map +0 -1
  512. package/dist/debrief-fixture.d.ts +0 -16
  513. package/dist/debrief-fixture.d.ts.map +0 -1
  514. package/dist/debrief-fixture.js +0 -41
  515. package/dist/debrief-fixture.js.map +0 -1
  516. package/dist/debrief-host.d.ts +0 -59
  517. package/dist/debrief-host.d.ts.map +0 -1
  518. package/dist/debrief-host.js +0 -49
  519. package/dist/debrief-host.js.map +0 -1
  520. package/dist/debrief-render.d.ts +0 -5
  521. package/dist/debrief-render.d.ts.map +0 -1
  522. package/dist/debrief-render.js +0 -65
  523. package/dist/debrief-render.js.map +0 -1
  524. package/dist/debrief.d.ts +0 -90
  525. package/dist/debrief.d.ts.map +0 -1
  526. package/dist/debrief.js +0 -263
  527. package/dist/debrief.js.map +0 -1
  528. package/dist/definitions.d.ts.map +0 -1
  529. package/dist/definitions.js +0 -164
  530. package/dist/definitions.js.map +0 -1
  531. package/dist/delegate-types.d.ts +0 -154
  532. package/dist/delegate-types.d.ts.map +0 -1
  533. package/dist/delegate-types.js +0 -8
  534. package/dist/delegate-types.js.map +0 -1
  535. package/dist/delegate.d.ts.map +0 -1
  536. package/dist/delegate.js +0 -313
  537. package/dist/delegate.js.map +0 -1
  538. package/dist/delegation-approval.d.ts.map +0 -1
  539. package/dist/delegation-approval.js +0 -94
  540. package/dist/delegation-approval.js.map +0 -1
  541. package/dist/dispatch-control.d.ts +0 -45
  542. package/dist/dispatch-control.d.ts.map +0 -1
  543. package/dist/dispatch-control.js +0 -76
  544. package/dist/dispatch-control.js.map +0 -1
  545. package/dist/effect-profile-runtime.d.ts +0 -40
  546. package/dist/effect-profile-runtime.d.ts.map +0 -1
  547. package/dist/effect-profile-runtime.js +0 -51
  548. package/dist/effect-profile-runtime.js.map +0 -1
  549. package/dist/effect-profile.d.ts +0 -40
  550. package/dist/effect-profile.d.ts.map +0 -1
  551. package/dist/effect-profile.js +0 -152
  552. package/dist/effect-profile.js.map +0 -1
  553. package/dist/execution-id.d.ts.map +0 -1
  554. package/dist/execution-id.js.map +0 -1
  555. package/dist/execution-retention.d.ts +0 -90
  556. package/dist/execution-retention.d.ts.map +0 -1
  557. package/dist/execution-retention.js +0 -247
  558. package/dist/execution-retention.js.map +0 -1
  559. package/dist/executor.d.ts +0 -39
  560. package/dist/executor.d.ts.map +0 -1
  561. package/dist/executor.js +0 -94
  562. package/dist/executor.js.map +0 -1
  563. package/dist/experiment-contract.d.ts +0 -56
  564. package/dist/experiment-contract.d.ts.map +0 -1
  565. package/dist/experiment-contract.js +0 -80
  566. package/dist/experiment-contract.js.map +0 -1
  567. package/dist/experiment-state.d.ts +0 -22
  568. package/dist/experiment-state.d.ts.map +0 -1
  569. package/dist/experiment-state.js +0 -79
  570. package/dist/experiment-state.js.map +0 -1
  571. package/dist/experiment-store.d.ts +0 -30
  572. package/dist/experiment-store.d.ts.map +0 -1
  573. package/dist/experiment-store.js +0 -147
  574. package/dist/experiment-store.js.map +0 -1
  575. package/dist/experiment.d.ts +0 -65
  576. package/dist/experiment.d.ts.map +0 -1
  577. package/dist/experiment.js +0 -362
  578. package/dist/experiment.js.map +0 -1
  579. package/dist/factory-contract.d.ts +0 -79
  580. package/dist/factory-contract.d.ts.map +0 -1
  581. package/dist/factory-contract.js +0 -89
  582. package/dist/factory-contract.js.map +0 -1
  583. package/dist/factory-migration.d.ts +0 -20
  584. package/dist/factory-migration.d.ts.map +0 -1
  585. package/dist/factory-migration.js +0 -55
  586. package/dist/factory-migration.js.map +0 -1
  587. package/dist/factory-order.d.ts +0 -848
  588. package/dist/factory-order.d.ts.map +0 -1
  589. package/dist/factory-order.js +0 -83
  590. package/dist/factory-order.js.map +0 -1
  591. package/dist/factory-registry.d.ts +0 -121
  592. package/dist/factory-registry.d.ts.map +0 -1
  593. package/dist/factory-registry.js +0 -133
  594. package/dist/factory-registry.js.map +0 -1
  595. package/dist/fanout.d.ts.map +0 -1
  596. package/dist/fanout.js +0 -93
  597. package/dist/fanout.js.map +0 -1
  598. package/dist/file-lock.d.ts.map +0 -1
  599. package/dist/file-lock.js +0 -201
  600. package/dist/file-lock.js.map +0 -1
  601. package/dist/finalization.d.ts.map +0 -1
  602. package/dist/finalization.js.map +0 -1
  603. package/dist/git-identity.d.ts +0 -13
  604. package/dist/git-identity.d.ts.map +0 -1
  605. package/dist/git-identity.js +0 -47
  606. package/dist/git-identity.js.map +0 -1
  607. package/dist/grant-env.d.ts +0 -75
  608. package/dist/grant-env.d.ts.map +0 -1
  609. package/dist/grant-env.js +0 -154
  610. package/dist/grant-env.js.map +0 -1
  611. package/dist/grant-store.d.ts +0 -96
  612. package/dist/grant-store.d.ts.map +0 -1
  613. package/dist/grant-store.js +0 -188
  614. package/dist/grant-store.js.map +0 -1
  615. package/dist/herdr-cli.d.ts +0 -78
  616. package/dist/herdr-cli.d.ts.map +0 -1
  617. package/dist/herdr-cli.js +0 -113
  618. package/dist/herdr-cli.js.map +0 -1
  619. package/dist/herdr-name.d.ts.map +0 -1
  620. package/dist/herdr-name.js.map +0 -1
  621. package/dist/herdr-pi-lifecycle.d.ts.map +0 -1
  622. package/dist/herdr-pi-lifecycle.js +0 -22
  623. package/dist/herdr-pi-lifecycle.js.map +0 -1
  624. package/dist/herdr-poll.d.ts +0 -133
  625. package/dist/herdr-poll.d.ts.map +0 -1
  626. package/dist/herdr-poll.js +0 -222
  627. package/dist/herdr-poll.js.map +0 -1
  628. package/dist/herdr-stage.d.ts +0 -40
  629. package/dist/herdr-stage.d.ts.map +0 -1
  630. package/dist/herdr-stage.js +0 -54
  631. package/dist/herdr-stage.js.map +0 -1
  632. package/dist/herdr-start.d.ts.map +0 -1
  633. package/dist/herdr-start.js.map +0 -1
  634. package/dist/init.d.ts +0 -117
  635. package/dist/init.d.ts.map +0 -1
  636. package/dist/init.js +0 -323
  637. package/dist/init.js.map +0 -1
  638. package/dist/intent-application.d.ts +0 -17
  639. package/dist/intent-application.d.ts.map +0 -1
  640. package/dist/intent-application.js +0 -114
  641. package/dist/intent-application.js.map +0 -1
  642. package/dist/intent-control.d.ts +0 -201
  643. package/dist/intent-control.d.ts.map +0 -1
  644. package/dist/intent-control.js +0 -110
  645. package/dist/intent-control.js.map +0 -1
  646. package/dist/intent-scheduling.d.ts +0 -9
  647. package/dist/intent-scheduling.d.ts.map +0 -1
  648. package/dist/intent-scheduling.js +0 -15
  649. package/dist/intent-scheduling.js.map +0 -1
  650. package/dist/learning-connection.d.ts +0 -127
  651. package/dist/learning-connection.d.ts.map +0 -1
  652. package/dist/learning-connection.js +0 -54
  653. package/dist/learning-connection.js.map +0 -1
  654. package/dist/lease-helper.d.ts.map +0 -1
  655. package/dist/lease-helper.js +0 -94
  656. package/dist/lease-helper.js.map +0 -1
  657. package/dist/lease-record.d.ts +0 -90
  658. package/dist/lease-record.d.ts.map +0 -1
  659. package/dist/lease-record.js.map +0 -1
  660. package/dist/ledger-append.d.ts +0 -15
  661. package/dist/ledger-append.d.ts.map +0 -1
  662. package/dist/ledger-append.js +0 -94
  663. package/dist/ledger-append.js.map +0 -1
  664. package/dist/ledger-events.d.ts +0 -131
  665. package/dist/ledger-events.d.ts.map +0 -1
  666. package/dist/ledger-events.js +0 -107
  667. package/dist/ledger-events.js.map +0 -1
  668. package/dist/ledger-identifiers.d.ts.map +0 -1
  669. package/dist/ledger-identifiers.js.map +0 -1
  670. package/dist/ledger-report.d.ts +0 -134
  671. package/dist/ledger-report.d.ts.map +0 -1
  672. package/dist/ledger-report.js +0 -271
  673. package/dist/ledger-report.js.map +0 -1
  674. package/dist/ledger-v3-validation.d.ts +0 -11
  675. package/dist/ledger-v3-validation.d.ts.map +0 -1
  676. package/dist/ledger-v3-validation.js +0 -265
  677. package/dist/ledger-v3-validation.js.map +0 -1
  678. package/dist/ledger.d.ts +0 -242
  679. package/dist/ledger.d.ts.map +0 -1
  680. package/dist/ledger.js +0 -142
  681. package/dist/ledger.js.map +0 -1
  682. package/dist/measured-order.d.ts +0 -249
  683. package/dist/measured-order.d.ts.map +0 -1
  684. package/dist/measured-order.js +0 -309
  685. package/dist/measured-order.js.map +0 -1
  686. package/dist/measured-session.d.ts +0 -97
  687. package/dist/measured-session.d.ts.map +0 -1
  688. package/dist/measured-session.js +0 -134
  689. package/dist/measured-session.js.map +0 -1
  690. package/dist/model-preflight.d.ts +0 -13
  691. package/dist/model-preflight.d.ts.map +0 -1
  692. package/dist/model-preflight.js +0 -29
  693. package/dist/model-preflight.js.map +0 -1
  694. package/dist/native-session-target.d.ts +0 -9
  695. package/dist/native-session-target.d.ts.map +0 -1
  696. package/dist/native-session-target.js +0 -29
  697. package/dist/native-session-target.js.map +0 -1
  698. package/dist/native-session.d.ts +0 -59
  699. package/dist/native-session.d.ts.map +0 -1
  700. package/dist/native-session.js +0 -154
  701. package/dist/native-session.js.map +0 -1
  702. package/dist/order-schedule.d.ts +0 -37
  703. package/dist/order-schedule.d.ts.map +0 -1
  704. package/dist/order-schedule.js +0 -81
  705. package/dist/order-schedule.js.map +0 -1
  706. package/dist/ordinary-children.d.ts +0 -52
  707. package/dist/ordinary-children.d.ts.map +0 -1
  708. package/dist/ordinary-children.js +0 -93
  709. package/dist/ordinary-children.js.map +0 -1
  710. package/dist/pane-reaper.d.ts +0 -111
  711. package/dist/pane-reaper.d.ts.map +0 -1
  712. package/dist/pane-reaper.js +0 -242
  713. package/dist/pane-reaper.js.map +0 -1
  714. package/dist/pi-tools.d.ts.map +0 -1
  715. package/dist/pi-tools.js +0 -21
  716. package/dist/pi-tools.js.map +0 -1
  717. package/dist/producer-ipc-contract.d.ts +0 -29
  718. package/dist/producer-ipc-contract.d.ts.map +0 -1
  719. package/dist/producer-ipc-contract.js +0 -29
  720. package/dist/producer-ipc-contract.js.map +0 -1
  721. package/dist/producer-ipc.d.ts +0 -55
  722. package/dist/producer-ipc.d.ts.map +0 -1
  723. package/dist/producer-ipc.js +0 -143
  724. package/dist/producer-ipc.js.map +0 -1
  725. package/dist/product-files.d.ts +0 -6
  726. package/dist/product-files.d.ts.map +0 -1
  727. package/dist/product-files.js +0 -55
  728. package/dist/product-files.js.map +0 -1
  729. package/dist/progress.d.ts.map +0 -1
  730. package/dist/progress.js.map +0 -1
  731. package/dist/propagation.d.ts +0 -203
  732. package/dist/propagation.d.ts.map +0 -1
  733. package/dist/propagation.js +0 -279
  734. package/dist/propagation.js.map +0 -1
  735. package/dist/refusals.d.ts +0 -16
  736. package/dist/refusals.d.ts.map +0 -1
  737. package/dist/refusals.js +0 -55
  738. package/dist/refusals.js.map +0 -1
  739. package/dist/resolve.d.ts.map +0 -1
  740. package/dist/resolve.js +0 -211
  741. package/dist/resolve.js.map +0 -1
  742. package/dist/resource-budget.d.ts +0 -334
  743. package/dist/resource-budget.d.ts.map +0 -1
  744. package/dist/resource-budget.js +0 -415
  745. package/dist/resource-budget.js.map +0 -1
  746. package/dist/retention-contract.d.ts.map +0 -1
  747. package/dist/retention-contract.js +0 -104
  748. package/dist/retention-contract.js.map +0 -1
  749. package/dist/retention-json.d.ts.map +0 -1
  750. package/dist/retention-json.js.map +0 -1
  751. package/dist/routing-authority.d.ts.map +0 -1
  752. package/dist/routing-authority.js.map +0 -1
  753. package/dist/run-child.d.ts +0 -87
  754. package/dist/run-child.d.ts.map +0 -1
  755. package/dist/run-child.js +0 -248
  756. package/dist/run-child.js.map +0 -1
  757. package/dist/run-herdr.d.ts +0 -119
  758. package/dist/run-herdr.d.ts.map +0 -1
  759. package/dist/run-herdr.js +0 -335
  760. package/dist/run-herdr.js.map +0 -1
  761. package/dist/skill-packages.d.ts +0 -116
  762. package/dist/skill-packages.d.ts.map +0 -1
  763. package/dist/skill-packages.js +0 -295
  764. package/dist/skill-packages.js.map +0 -1
  765. package/dist/skill-resources.d.ts.map +0 -1
  766. package/dist/skill-resources.js +0 -52
  767. package/dist/skill-resources.js.map +0 -1
  768. package/dist/spawn.d.ts.map +0 -1
  769. package/dist/spawn.js.map +0 -1
  770. package/dist/vendor/adoption.d.ts +0 -129
  771. package/dist/vendor/adoption.d.ts.map +0 -1
  772. package/dist/vendor/adoption.js +0 -102
  773. package/dist/vendor/adoption.js.map +0 -1
  774. package/dist/vendor/herdr-pi-lifecycle.d.ts.map +0 -1
  775. package/dist/vendor/herdr-pi-lifecycle.js.map +0 -1
  776. package/dist/work-command.d.ts +0 -32
  777. package/dist/work-command.d.ts.map +0 -1
  778. package/dist/work-command.js +0 -179
  779. package/dist/work-command.js.map +0 -1
  780. package/dist/work-ledger-destination.d.ts +0 -20
  781. package/dist/work-ledger-destination.d.ts.map +0 -1
  782. package/dist/work-ledger-destination.js +0 -131
  783. package/dist/work-ledger-destination.js.map +0 -1
  784. package/dist/work-ledger-json.d.ts +0 -25
  785. package/dist/work-ledger-json.d.ts.map +0 -1
  786. package/dist/work-ledger-json.js +0 -267
  787. package/dist/work-ledger-json.js.map +0 -1
  788. package/dist/work-ledger-occurrences.d.ts +0 -227
  789. package/dist/work-ledger-occurrences.d.ts.map +0 -1
  790. package/dist/work-ledger-occurrences.js +0 -115
  791. package/dist/work-ledger-occurrences.js.map +0 -1
  792. package/dist/work-ledger-projection.d.ts +0 -295
  793. package/dist/work-ledger-projection.d.ts.map +0 -1
  794. package/dist/work-ledger-projection.js +0 -237
  795. package/dist/work-ledger-projection.js.map +0 -1
  796. package/dist/work-ledger-snapshot.d.ts +0 -29
  797. package/dist/work-ledger-snapshot.d.ts.map +0 -1
  798. package/dist/work-ledger-snapshot.js +0 -267
  799. package/dist/work-ledger-snapshot.js.map +0 -1
  800. package/dist/work-ledger-types.d.ts +0 -261
  801. package/dist/work-ledger-types.d.ts.map +0 -1
  802. package/dist/work-ledger-types.js +0 -13
  803. package/dist/work-ledger-types.js.map +0 -1
  804. package/dist/work-ledger-validation.d.ts +0 -14
  805. package/dist/work-ledger-validation.d.ts.map +0 -1
  806. package/dist/work-ledger-validation.js +0 -226
  807. package/dist/work-ledger-validation.js.map +0 -1
  808. package/dist/work-ledger.d.ts +0 -43
  809. package/dist/work-ledger.d.ts.map +0 -1
  810. package/dist/work-ledger.js +0 -225
  811. package/dist/work-ledger.js.map +0 -1
  812. package/dist/work-policy-registry.d.ts +0 -133
  813. package/dist/work-policy-registry.d.ts.map +0 -1
  814. package/dist/work-policy-registry.js +0 -128
  815. package/dist/work-policy-registry.js.map +0 -1
  816. package/dist/work-run.d.ts +0 -56
  817. package/dist/work-run.d.ts.map +0 -1
  818. package/dist/work-run.js +0 -102
  819. package/dist/work-run.js.map +0 -1
  820. package/dist/work-setup.d.ts +0 -40
  821. package/dist/work-setup.d.ts.map +0 -1
  822. package/dist/work-setup.js +0 -174
  823. package/dist/work-setup.js.map +0 -1
  824. package/dist/workflow-fact-id.d.ts +0 -4
  825. package/dist/workflow-fact-id.d.ts.map +0 -1
  826. package/dist/workflow-fact-id.js +0 -14
  827. package/dist/workflow-fact-id.js.map +0 -1
  828. package/dist/workflow-facts.d.ts +0 -34
  829. package/dist/workflow-facts.d.ts.map +0 -1
  830. package/dist/workflow-facts.js +0 -43
  831. package/dist/workflow-facts.js.map +0 -1
  832. package/dist/workspace-lease.d.ts +0 -40
  833. package/dist/workspace-lease.d.ts.map +0 -1
  834. package/dist/workspace-lease.js +0 -333
  835. package/dist/workspace-lease.js.map +0 -1
  836. package/dist/workspace.d.ts +0 -57
  837. package/dist/workspace.d.ts.map +0 -1
  838. package/dist/workspace.js +0 -216
  839. package/dist/workspace.js.map +0 -1
  840. package/extensions/daily-dashboard-session.ts +0 -48
  841. package/extensions/daily-work-session.ts +0 -20
  842. package/extensions/learning-outcome-session.ts +0 -38
  843. package/extensions/learning-session.ts +0 -59
  844. package/extensions/ordinary-runtime.ts +0 -14
  845. package/extensions/primary-shadow.ts +0 -11
  846. package/extensions/work-policy-session.ts +0 -139
  847. package/extensions/work-run-session.ts +0 -75
  848. package/extensions/work-runtime.ts +0 -44
  849. package/extensions/work-session.ts +0 -132
  850. package/src/activity-timeline.ts +0 -133
  851. package/src/approval-prompt.ts +0 -225
  852. package/src/approval-store.ts +0 -386
  853. package/src/approval.ts +0 -399
  854. package/src/capabilities.ts +0 -220
  855. package/src/catalog.ts +0 -306
  856. package/src/check-runner.ts +0 -387
  857. package/src/control-journal.ts +0 -26
  858. package/src/correlation.ts +0 -320
  859. package/src/daily-dashboard-host.ts +0 -105
  860. package/src/daily-panel.ts +0 -80
  861. package/src/daily-view-input.ts +0 -59
  862. package/src/daily-view-render.ts +0 -45
  863. package/src/daily-view.ts +0 -160
  864. package/src/dashboard-cli.ts +0 -340
  865. package/src/dashboard-display-controls.ts +0 -21
  866. package/src/dashboard-handshake.ts +0 -199
  867. package/src/dashboard-harness.ts +0 -37
  868. package/src/dashboard-herdr.ts +0 -363
  869. package/src/dashboard-host-contract.ts +0 -50
  870. package/src/dashboard-host-transport.ts +0 -43
  871. package/src/dashboard-host.ts +0 -244
  872. package/src/dashboard-menu.ts +0 -28
  873. package/src/dashboard-observation.ts +0 -46
  874. package/src/dashboard-projection.ts +0 -390
  875. package/src/dashboard-render.ts +0 -259
  876. package/src/debrief-contract.ts +0 -127
  877. package/src/debrief-fixture.ts +0 -29
  878. package/src/debrief-host.ts +0 -53
  879. package/src/debrief-render.ts +0 -49
  880. package/src/debrief.ts +0 -198
  881. package/src/definitions.ts +0 -211
  882. package/src/delegate-types.ts +0 -154
  883. package/src/delegate.ts +0 -348
  884. package/src/delegation-approval.ts +0 -126
  885. package/src/dispatch-control.ts +0 -81
  886. package/src/effect-profile-runtime.ts +0 -46
  887. package/src/effect-profile.ts +0 -129
  888. package/src/execution-retention.ts +0 -230
  889. package/src/executor.ts +0 -123
  890. package/src/experiment-contract.ts +0 -66
  891. package/src/experiment-state.ts +0 -44
  892. package/src/experiment-store.ts +0 -98
  893. package/src/experiment.ts +0 -236
  894. package/src/factory-contract.ts +0 -47
  895. package/src/factory-migration.ts +0 -29
  896. package/src/factory-order.ts +0 -56
  897. package/src/factory-registry.ts +0 -60
  898. package/src/fanout.ts +0 -106
  899. package/src/file-lock.ts +0 -178
  900. package/src/finalization.ts +0 -79
  901. package/src/git-identity.ts +0 -56
  902. package/src/grant-env.ts +0 -221
  903. package/src/grant-store.ts +0 -235
  904. package/src/herdr-cli.ts +0 -125
  905. package/src/herdr-pi-lifecycle.ts +0 -21
  906. package/src/herdr-poll.ts +0 -253
  907. package/src/herdr-stage.ts +0 -55
  908. package/src/init.ts +0 -389
  909. package/src/intent-application.ts +0 -91
  910. package/src/intent-control.ts +0 -107
  911. package/src/intent-scheduling.ts +0 -14
  912. package/src/learning-connection.ts +0 -70
  913. package/src/lease-helper.ts +0 -97
  914. package/src/lease-record.ts +0 -131
  915. package/src/ledger-append.ts +0 -72
  916. package/src/ledger-events.ts +0 -226
  917. package/src/ledger-report.ts +0 -357
  918. package/src/ledger-v3-validation.ts +0 -266
  919. package/src/ledger.ts +0 -369
  920. package/src/measured-order.ts +0 -72
  921. package/src/measured-session.ts +0 -70
  922. package/src/model-preflight.ts +0 -41
  923. package/src/native-session-target.ts +0 -23
  924. package/src/native-session.ts +0 -139
  925. package/src/order-schedule.ts +0 -42
  926. package/src/ordinary-children.ts +0 -59
  927. package/src/pane-reaper.ts +0 -270
  928. package/src/pi-tools.ts +0 -25
  929. package/src/producer-ipc-contract.ts +0 -26
  930. package/src/producer-ipc.ts +0 -107
  931. package/src/product-files.ts +0 -34
  932. package/src/propagation.ts +0 -333
  933. package/src/refusals.ts +0 -70
  934. package/src/resolve.ts +0 -267
  935. package/src/resource-budget.ts +0 -349
  936. package/src/retention-contract.ts +0 -84
  937. package/src/retention-json.ts +0 -20
  938. package/src/run-child.ts +0 -303
  939. package/src/run-herdr.ts +0 -386
  940. package/src/skill-packages.ts +0 -314
  941. package/src/skill-resources.ts +0 -48
  942. package/src/vendor/adoption.ts +0 -109
  943. package/src/work-command.ts +0 -197
  944. package/src/work-ledger-destination.ts +0 -113
  945. package/src/work-ledger-json.ts +0 -228
  946. package/src/work-ledger-occurrences.ts +0 -99
  947. package/src/work-ledger-projection.ts +0 -262
  948. package/src/work-ledger-snapshot.ts +0 -246
  949. package/src/work-ledger-types.ts +0 -229
  950. package/src/work-ledger-validation.ts +0 -174
  951. package/src/work-ledger.ts +0 -186
  952. package/src/work-policy-registry.ts +0 -81
  953. package/src/work-run.ts +0 -79
  954. package/src/work-setup.ts +0 -141
  955. package/src/workflow-fact-id.ts +0 -16
  956. package/src/workflow-facts.ts +0 -65
  957. package/src/workspace-lease.ts +0 -363
  958. package/src/workspace.ts +0 -308
  959. /package/contracts/{ledger/v3 → ledger-record/v1}/fixtures/capability-decision.json +0 -0
  960. /package/contracts/{ledger/v3 → ledger-record/v1}/fixtures/workspace-lease.json +0 -0
  961. /package/dist/{herdr-name.d.ts → executors/herdr-name.d.ts} +0 -0
  962. /package/dist/{herdr-name.js → executors/herdr-name.js} +0 -0
  963. /package/dist/{herdr-pi-lifecycle.d.ts → executors/herdr-pi-lifecycle.d.ts} +0 -0
  964. /package/dist/{herdr-start.d.ts → executors/herdr-start.d.ts} +0 -0
  965. /package/dist/{herdr-start.js → executors/herdr-start.js} +0 -0
  966. /package/dist/{vendor → executors/vendor}/herdr-pi-lifecycle.d.ts +0 -0
  967. /package/dist/{vendor → executors/vendor}/herdr-pi-lifecycle.js +0 -0
  968. /package/dist/{file-lock.d.ts → governance/file-lock.d.ts} +0 -0
  969. /package/dist/{finalization.d.ts → governance/finalization.d.ts} +0 -0
  970. /package/dist/{finalization.js → governance/finalization.js} +0 -0
  971. /package/dist/{lease-helper.d.ts → governance/lease-helper.d.ts} +0 -0
  972. /package/dist/{lease-record.js → governance/lease-record.js} +0 -0
  973. /package/dist/{retention-contract.d.ts → governance/retention-contract.d.ts} +0 -0
  974. /package/dist/{retention-json.d.ts → governance/retention-json.d.ts} +0 -0
  975. /package/dist/{retention-json.js → governance/retention-json.js} +0 -0
  976. /package/dist/{chain.d.ts → kernel/chain.d.ts} +0 -0
  977. /package/dist/{chain.js → kernel/chain.js} +0 -0
  978. /package/dist/{correlation.d.ts → kernel/correlation.d.ts} +0 -0
  979. /package/dist/{definitions.d.ts → kernel/definitions.d.ts} +0 -0
  980. /package/dist/{delegate.d.ts → kernel/delegate.d.ts} +0 -0
  981. /package/dist/{delegation-approval.d.ts → kernel/delegation-approval.d.ts} +0 -0
  982. /package/dist/{execution-id.d.ts → kernel/execution-id.d.ts} +0 -0
  983. /package/dist/{execution-id.js → kernel/execution-id.js} +0 -0
  984. /package/dist/{fanout.d.ts → kernel/fanout.d.ts} +0 -0
  985. /package/dist/{ledger-identifiers.d.ts → kernel/ledger-identifiers.d.ts} +0 -0
  986. /package/dist/{ledger-identifiers.js → kernel/ledger-identifiers.js} +0 -0
  987. /package/dist/{pi-tools.d.ts → kernel/pi-tools.d.ts} +0 -0
  988. /package/dist/{progress.d.ts → kernel/progress.d.ts} +0 -0
  989. /package/dist/{progress.js → kernel/progress.js} +0 -0
  990. /package/dist/{resolve.d.ts → kernel/resolve.d.ts} +0 -0
  991. /package/dist/{routing-authority.d.ts → kernel/routing-authority.d.ts} +0 -0
  992. /package/dist/{routing-authority.js → kernel/routing-authority.js} +0 -0
  993. /package/dist/{skill-resources.d.ts → kernel/skill-resources.d.ts} +0 -0
  994. /package/dist/{spawn.d.ts → kernel/spawn.d.ts} +0 -0
  995. /package/dist/{spawn.js → kernel/spawn.js} +0 -0
  996. /package/dist/{dashboard-render.d.ts → products/dashboard-render.d.ts} +0 -0
  997. /package/src/{herdr-name.ts → executors/herdr-name.ts} +0 -0
  998. /package/src/{herdr-start.ts → executors/herdr-start.ts} +0 -0
  999. /package/src/{vendor → executors/vendor}/herdr-pi-lifecycle.ts +0 -0
  1000. /package/src/{chain.ts → kernel/chain.ts} +0 -0
  1001. /package/src/{execution-id.ts → kernel/execution-id.ts} +0 -0
  1002. /package/src/{ledger-identifiers.ts → kernel/ledger-identifiers.ts} +0 -0
  1003. /package/src/{progress.ts → kernel/progress.ts} +0 -0
  1004. /package/src/{routing-authority.ts → kernel/routing-authority.ts} +0 -0
  1005. /package/src/{spawn.ts → kernel/spawn.ts} +0 -0
@@ -0,0 +1,341 @@
1
+ /**
2
+ * Race-free grant propagation.
3
+ *
4
+ * The first implementation wrote each child's computed grant into `process.env` inside the `tool_call`
5
+ * handler. The environment is process-global, so two concurrent spawns could read each other's values —
6
+ * a real hole in a security control.
7
+ *
8
+ * The fix removes the need for a per-child channel entirely, rather than trying to build one:
9
+ *
10
+ * 1. Everything pushed to children is a property of the PARENT, not of the individual spawn — the
11
+ * parent's own grant, the child depth (parent depth + 1), and the configured bounds. Those are
12
+ * identical for every sibling, so concurrent spawns cannot disagree and there is nothing to race.
13
+ * `ENV_APPROVED` (approvals a human granted at or above this level) is safe on the same global
14
+ * channel for the same reason: it is intersected with the parent's own grant before being written,
15
+ * which is itself a parent-level fact, so it too is identical for every sibling.
16
+ * 2. Each child derives ITS OWN grant on arrival: `inheritedParentGrant ∩ ownObservedTools`, where the
17
+ * observed set comes from the `tools` array of its first provider request — authoritative, because
18
+ * it is literally what pi sent the model.
19
+ *
20
+ * The environment is therefore written ONCE per session, before any spawn can occur (the first provider
21
+ * request precedes any tool call), and never mutated per spawn.
22
+ *
23
+ * The invariant still holds transitively: own = observed ∩ inheritedParent ⊆ inheritedParent, so no
24
+ * descendant can exceed the root. It is also defence in depth — even if a spawn slipped past the
25
+ * interceptor and pi handed the child more than the parent held, the intersection clamps it back.
26
+ */
27
+
28
+ import type { Capability } from "./resolve.ts";
29
+ import { WILDCARD } from "./pi-tools.ts";
30
+ import { WORKSPACE_WILDCARD } from "./resolve.ts";
31
+ import { inheritApprovals, type InheritableApproval } from "./approval.ts";
32
+ import { assertCapabilitiesArePropagatable } from "./capabilities.ts";
33
+ import {
34
+ ENV_GRANT,
35
+ ENV_FANOUT,
36
+ ENV_PARENT_ID,
37
+ ENV_EXECUTION_ID,
38
+ ENV_DEPTH,
39
+ ENV_MAX_DEPTH,
40
+ ENV_GATED,
41
+ ENV_LEDGER,
42
+ ENV_APPROVED,
43
+ } from "./env-names.ts";
44
+ export {
45
+ ENV_GRANT,
46
+ ENV_FANOUT,
47
+ ENV_PARENT_ID,
48
+ ENV_EXECUTION_ID,
49
+ ENV_DEPTH,
50
+ ENV_MAX_DEPTH,
51
+ ENV_GATED,
52
+ ENV_LEDGER,
53
+ ENV_APPROVED,
54
+ } from "./env-names.ts";
55
+
56
+ /**
57
+ * Total descendants this session may create in its whole subtree (`src/kernel/fanout.ts`).
58
+ *
59
+ * In `GRANT_ENV_KEYS` and therefore stripped from a child's environment and re-supplied only by the spawn
60
+ * plan — like depth, and for the same reason: it is capability state that must ATTENUATE downward, not an
61
+ * operator preference that should inherit. `PI_DADDY_CHILD_TIMEOUT` is deliberately the other kind.
62
+ */
63
+ /**
64
+ * This session's ledger id, so a child's records name their real parent (review finding F8).
65
+ *
66
+ * Without it every level restarts at `d0` and the ledger cannot be joined into a tree across processes.
67
+ */
68
+ /** Unique identity of this governed execution occurrence; unlike ENV_PARENT_ID it is never reused. */
69
+
70
+ /**
71
+ * Every variable this package uses to push governance state at a child.
72
+ *
73
+ * Named as a set so `mergeChildEnv` can guarantee that none of them survives from the parent's own
74
+ * environment into a child's — a governance variable a child inherits by accident is one nobody decided
75
+ * to give it.
76
+ */
77
+ export const GRANT_ENV_KEYS = [
78
+ ENV_GRANT,
79
+ ENV_DEPTH,
80
+ ENV_MAX_DEPTH,
81
+ ENV_GATED,
82
+ ENV_LEDGER,
83
+ ENV_APPROVED,
84
+ ENV_FANOUT,
85
+ ENV_PARENT_ID,
86
+ ENV_EXECUTION_ID,
87
+ ] as const;
88
+
89
+ export const parseList = (raw: string | undefined): Capability[] =>
90
+ (raw ?? "")
91
+ .split(",")
92
+ .map((s) => s.trim())
93
+ .filter((s) => s.length > 0);
94
+
95
+ /** Does a bare pi tool name correspond to this capability? `read` matches `tool:read` and `ext:pkg/read`. */
96
+ function matchesToolName(capability: Capability, toolName: string): boolean {
97
+ if (capability === `tool:${toolName}`) return true;
98
+ return capability.startsWith("ext:") && capability.slice(capability.lastIndexOf("/") + 1) === toolName;
99
+ }
100
+
101
+ /**
102
+ * Is this capability something an observed tool array can speak about at all? (R-36, ADR-0017 step 1.)
103
+ *
104
+ * `tool:` and `ext:` name tools, so a tool array that omits one is evidence the session does not have it.
105
+ * `skill:` and `agent:` name a loadable instruction file and a spawnable definition — neither is ever a
106
+ * tool, so an observation says **nothing** about them and must not be read as evidence of absence.
107
+ */
108
+ const isToolCapability = (capability: Capability): boolean =>
109
+ capability.startsWith("tool:") || capability.startsWith("ext:");
110
+
111
+ /**
112
+ * Derive this session's own grant from what it inherited and what pi actually gave it.
113
+ *
114
+ * `observedTools` is the bare tool-name list from the session's own provider payload, or null when it
115
+ * has not been observed yet — in which case the inherited grant is used unchanged (it is already an
116
+ * upper bound, so this is safe, just less tight).
117
+ *
118
+ * A wildcard holder stays a wildcard holder: an enumerated observation must not silently downgrade an
119
+ * explicitly unlimited grant, or a root session would lose the authority it was configured with.
120
+ *
121
+ * **R-36 / ADR-0017 step 1: only tool-shaped capabilities are filtered.** The observation is a list of
122
+ * TOOLS, so it is evidence about `tool:` and `ext:` and about nothing else. Until this was fixed, a child
123
+ * inheriting `tool:read, skill:review` held only `tool:read` from its first provider request onward — it
124
+ * still *had* the skill (it arrives as `--skill`), but could not re-grant it and `/grants` stopped listing
125
+ * it. Silently, and in the narrowing direction, which is why it survived: nothing fails when a grant
126
+ * quietly shrinks. It also made ADR-0017's `agent:` prerequisite unsatisfiable below the root.
127
+ */
128
+ export function deriveOwnGrant(inheritedParentGrant: Capability[], observedTools: string[] | null): Capability[] {
129
+ if (observedTools === null) return [...inheritedParentGrant];
130
+ // Capabilities an observation cannot speak about ride through both branches untouched.
131
+ const nonTool = inheritedParentGrant.filter((c) => !isToolCapability(c) && c !== WILDCARD);
132
+ if (inheritedParentGrant.includes(WILDCARD)) {
133
+ // Keep the wildcard, and additionally enumerate what was observed so descendants can be checked
134
+ // against concrete names too.
135
+ const enumerated = observedTools.map((t) => `tool:${t}`);
136
+ return [...new Set([WILDCARD, ...enumerated, ...nonTool])].sort();
137
+ }
138
+ return [
139
+ ...inheritedParentGrant.filter((c) => isToolCapability(c) && observedTools.some((t) => matchesToolName(c, t))),
140
+ ...nonTool,
141
+ ].sort();
142
+ }
143
+
144
+ /**
145
+ * Parse a bound from the environment, distinguishing **absent** from **malformed**.
146
+ *
147
+ * G7 / A-S4 + B-I4. `Number.parseInt` is the wrong tool for reading configuration: it accepts a numeric
148
+ * prefix (`parseInt("2abc")` is `2`), returns `NaN` for anything else, and `NaN` silently passes every
149
+ * comparison as false — so a malformed `PI_DADDY_MAX_DEPTH` did not tighten the limit, it removed it.
150
+ *
151
+ * The three-way return is the point. `undefined` means "not configured, use the documented default";
152
+ * `null` means "configured wrongly", which callers must treat as a failure rather than a default,
153
+ * because a value someone tried to set and mistyped is not the same as one they never set.
154
+ */
155
+ export function parseBound(raw: string | undefined): number | null | undefined {
156
+ if (raw === undefined) return undefined;
157
+ const trimmed = raw.trim();
158
+ // Exact non-negative decimal integers only: no signs, no fractions, no 0x, no numeric prefixes.
159
+ if (!/^\d+$/.test(trimmed)) return null;
160
+ const value = Number(trimmed);
161
+ return Number.isSafeInteger(value) ? value : null;
162
+ }
163
+
164
+ export interface DepthConfig {
165
+ depth: number;
166
+ maxDepth: number;
167
+ /** Names of the variables that were set but unreadable, for an operator-facing warning. */
168
+ malformed: string[];
169
+ }
170
+
171
+ /**
172
+ * Resolve this session's depth bounds, failing closed on anything malformed.
173
+ *
174
+ * **Malformed input disables spawning entirely (`maxDepth: 0`)** rather than falling back to a default,
175
+ * and that applies to a bad `PI_DADDY_DEPTH` just as much as a bad `PI_DADDY_MAX_DEPTH`. The old
176
+ * `|| 0` guard on depth failed open in a subtler way than the missing guard on maxDepth: a session that
177
+ * could not read its own depth was treated as a **root**, which is the most permissive answer available
178
+ * and precisely the value an attacker would choose. If we do not know how deep we are, we must not spawn.
179
+ */
180
+ export function depthConfig(depthRaw: string | undefined, maxDepthRaw: string | undefined): DepthConfig {
181
+ const depth = parseBound(depthRaw);
182
+ const maxDepth = parseBound(maxDepthRaw);
183
+ const malformed: string[] = [];
184
+ if (depth === null) malformed.push(ENV_DEPTH);
185
+ if (maxDepth === null) malformed.push(ENV_MAX_DEPTH);
186
+
187
+ if (malformed.length > 0) return { depth: depth ?? 0, maxDepth: 0, malformed };
188
+ return { depth: depth ?? 0, maxDepth: maxDepth ?? DEFAULT_MAX_DEPTH, malformed };
189
+ }
190
+
191
+ /** The documented default child-depth bound when `PI_DADDY_MAX_DEPTH` is not set. */
192
+ export const DEFAULT_MAX_DEPTH = 2;
193
+
194
+ /**
195
+ * Gated by default in a governed session (ADR-0012).
196
+ *
197
+ * `bash` is not one capability among others; it is an execution primitive. A child holding it can run
198
+ * `env -u PI_DADDY_GRANT pi …` and obtain a completely **ungoverned** descendant — measured, not
199
+ * theorised (`docs/probes/g5-bash-escape`). Handing that down silently is the thing worth changing.
200
+ *
201
+ * Subsumption-aware gating (also ADR-0012) means this single entry covers `write`, `edit`, `read`,
202
+ * `grep`, `find` and `ls` as well, since `bash` confers all of them.
203
+ */
204
+ export const DEFAULT_GATED: Capability[] = ["tool:bash"];
205
+
206
+ /**
207
+ * Read the gate list, distinguishing **absent** from **explicitly empty**.
208
+ *
209
+ * `parseList` alone cannot: it maps both `undefined` and `""` to `[]`. That distinction is the operator's
210
+ * only way to turn the default off — without it, someone who wants no gates would have to stop governing
211
+ * altogether, which is strictly worse than the thing they were trying to avoid.
212
+ */
213
+ export function gatedFromEnv(raw: string | undefined): Capability[] {
214
+ if (raw === undefined) return [...DEFAULT_GATED];
215
+ return parseList(raw);
216
+ }
217
+
218
+ export interface ChildEnvInput {
219
+ /** This session's own grant — becomes the child's inherited parent grant. */
220
+ ownGrant: Capability[];
221
+ /** This session's depth; children are one deeper. */
222
+ depth: number;
223
+ maxDepth: number;
224
+ gated: Capability[];
225
+ /**
226
+ * Gated capabilities a human approved at or above this level.
227
+ *
228
+ * Safe to push on the GLOBAL channel because it is intersected with THIS session's own grant, which is
229
+ * a parent-level fact — identical for every sibling, so there is nothing to race on. Each child then
230
+ * re-intersects with its own grant on arrival, exactly as it does for the grant itself.
231
+ */
232
+ /**
233
+ * Approvals eligible to cross the boundary (ADR-0014): capability, subject and scope. `once` is
234
+ * dropped by `inheritApprovals`, and the subject is preserved so it cannot satisfy another one.
235
+ */
236
+ approved?: InheritableApproval[];
237
+ ledgerPath?: string;
238
+ /**
239
+ * Whether THIS session is governed — i.e. `PI_DADDY_GRANT` was set for it.
240
+ *
241
+ * G7 / B-I8. Governance is opt-in: with the variable unset the README promises "nothing is blocked".
242
+ * That was true of the session itself and false of its children, because this function still exported
243
+ * a grant, a depth and a bound, so an ungoverned parent silently started governing its descendants —
244
+ * and the grant it exported was its own observed tool surface, which is a real restriction arrived at
245
+ * by accident. An ungoverned session must be transparent, not a source of policy.
246
+ *
247
+ * Defaults to `true` so that every existing caller keeps publishing; only the extension, which alone
248
+ * knows whether the variable was set, passes `false`.
249
+ */
250
+ governed?: boolean;
251
+ }
252
+
253
+ /**
254
+ * The environment a child should inherit. Constant across all of this session's children by
255
+ * construction, which is what makes concurrent spawning safe.
256
+ *
257
+ * **The wildcard is never inherited.** A root may HOLD `tool:*` — that is authority to grant anything —
258
+ * but handing it down would let every descendant reacquire the full catalog, which makes attenuation
259
+ * meaningless below the root. Children therefore inherit the ENUMERATED grant only.
260
+ *
261
+ * Consequence, deliberate: a wildcard root that has not yet observed its own tools hands children an
262
+ * empty grant, so they can spawn nothing. That fails closed. It is also unreachable in normal flow,
263
+ * because a session's first provider request always precedes its first tool call.
264
+ */
265
+ /**
266
+ * The part of a grant a child may inherit: everything but the wildcards that are HELD, never handed down.
267
+ *
268
+ * `tool:*` for R-26's reason — a root that handed it down let every descendant reacquire the full catalog.
269
+ * `workspace:*` for the same reason one namespace over (R-131): a descendant holding it could route anywhere
270
+ * the registry lists, which is the attenuation failure ADR-0035 exists to close. `agent:*` is deliberately
271
+ * NOT stripped — ADR-0023 decided that a session authorised for any definition passes that on, because
272
+ * definitions are ceilings rather than roots.
273
+ *
274
+ * **Exported, and there is exactly one spelling of this rule on purpose.** It shipped as a filter inline in
275
+ * `childEnv` and nowhere else, so a grant travelling the OTHER path — `delegate.ts` building a child's
276
+ * `PI_DADDY_GRANT` from `result.effective` — carried `workspace:*` straight down. The test written beside
277
+ * that fix exercised `childEnv`, which is not the path a delegated child's grant travels, so it could not
278
+ * catch it. R-28's shape: two routes for one rule, with the guard on the quieter one. Both call this now.
279
+ */
280
+ export function inheritableGrant(grant: readonly Capability[]): Capability[] {
281
+ return grant.filter((c) => c !== WILDCARD && c !== WORKSPACE_WILDCARD);
282
+ }
283
+
284
+ export function childEnv(input: ChildEnvInput): Record<string, string> {
285
+ if (input.governed === false) return {};
286
+ const inheritable = inheritableGrant(input.ownGrant);
287
+ const env: Record<string, string> = {
288
+ [ENV_GRANT]: (assertCapabilitiesArePropagatable(inheritable), inheritable.join(",")),
289
+ [ENV_DEPTH]: String(input.depth + 1),
290
+ [ENV_MAX_DEPTH]: String(input.maxDepth),
291
+ };
292
+ if (input.gated.length > 0) env[ENV_GATED] = input.gated.join(",");
293
+ // ALWAYS written, empty string included. This is the one value that changes during a session (a human
294
+ // approves something, or the session's own grant narrows on observation), and the interceptor path
295
+ // publishes it by ASSIGNING into the process-global `process.env`. Omitting it when empty would leave
296
+ // whatever was there before — the parent's own, unclamped `PI_DADDY_APPROVED` — visible to every child.
297
+ // `parseList("")` is `[]`, so an empty value reads back exactly as an absent one.
298
+ env[ENV_APPROVED] = inheritApprovals(input.approved ?? [], inheritable).join(",");
299
+ // Empty is an explicit one-run ledger opt-out and must overwrite a prior publication too.
300
+ if (input.ledgerPath !== undefined) env[ENV_LEDGER] = input.ledgerPath;
301
+ return env;
302
+ }
303
+
304
+ /**
305
+ * The environment for a child this process spawns itself: the parent's environment with every governance
306
+ * variable stripped, then the per-child plan applied.
307
+ *
308
+ * Spreading `{ ...process.env, ...plan.env }` is not enough. `plan.env` omits keys that do not apply to
309
+ * this child (an empty approval set, no gated list), and an omitted key does not overwrite — so the
310
+ * parent's own value survives into the child. Stripping first makes the plan the ONLY source of every
311
+ * governance variable, which is what `delegate.ts`'s "nothing is written to the shared `process.env`"
312
+ * claim actually requires. Consumers re-clamp anyway; this is the defence in depth behind that.
313
+ */
314
+ export function mergeChildEnv(parentEnv: NodeJS.ProcessEnv, planEnv: Record<string, string>): NodeJS.ProcessEnv {
315
+ const merged: NodeJS.ProcessEnv = { ...parentEnv };
316
+ for (const key of GRANT_ENV_KEYS) delete merged[key];
317
+ return { ...merged, ...planEnv };
318
+ }
319
+
320
+ /** Extract bare tool names from a provider payload's tool array, tolerating provider shape differences. */
321
+ export function observeToolNames(payload: unknown): string[] | null {
322
+ if (!payload || typeof payload !== "object") return null;
323
+ const record = payload as Record<string, unknown>;
324
+ for (const key of ["tools", "functions"]) {
325
+ const candidate = record[key];
326
+ if (!Array.isArray(candidate)) continue;
327
+ const names = candidate
328
+ .map((entry) => {
329
+ if (!entry || typeof entry !== "object") return undefined;
330
+ const e = entry as Record<string, unknown>;
331
+ // Anthropic/OpenAI tool objects, and OpenAI's nested `function.name` form.
332
+ const nested = e.function as Record<string, unknown> | undefined;
333
+ const name = e.name ?? nested?.name;
334
+ return typeof name === "string" ? name : undefined;
335
+ })
336
+ .filter((n): n is string => Boolean(n));
337
+ // An empty tools array is a real observation (the session has no tools), not a failure to observe.
338
+ return names;
339
+ }
340
+ return null;
341
+ }
@@ -0,0 +1,64 @@
1
+ export const REFUSAL_CODES = [
2
+ "CAPABILITY_ESCALATION",
3
+ "GRANT_ID_MALFORMED",
4
+ "DEFINITION_NOT_AUTHORIZED",
5
+ "UNDECLARED_TOOLS",
6
+ "UNKNOWN_TOOL",
7
+ "GATED_UNAPPROVED",
8
+ "APPROVAL_EXPIRED",
9
+ "APPROVAL_SCOPE_MISMATCH",
10
+ "APPROVAL_FLOW_FAILED",
11
+ "DEPTH_EXCEEDED",
12
+ "FANOUT_EXCEEDED",
13
+ "EXECUTOR_UNAVAILABLE",
14
+ "MODEL_UNRESOLVED",
15
+ "GRANT_STORE_INVALID",
16
+ // Execution-phase outcomes. Without these, an external controller could distinguish a policy refusal
17
+ // from an internal error but not a lost writer lease from a user pressing stop (R-103).
18
+ "CHILD_TIMED_OUT",
19
+ "CHILD_CANCELLED",
20
+ "CHILD_EXIT_NONZERO",
21
+ // Planner refusals that previously carried a message and no code at all — including the narrowing
22
+ // violation, which is the hardest rule this package enforces (R-109).
23
+ "TASK_MISSING",
24
+ "UNKNOWN_DEFINITION",
25
+ "CEILING_PATTERNS_UNRESOLVED",
26
+ "NARROWING_VIOLATED",
27
+ "DEFINITION_UNREADABLE",
28
+ "CORRELATION_TOO_LARGE",
29
+ "CORRELATION_INVALID",
30
+ "LEDGER_WRITE_FAILED",
31
+ "FANOUT_FAILED",
32
+ "WORKSPACE_NOT_REGISTERED",
33
+ "WORKSPACE_NOT_AUTHORIZED",
34
+ "WORKSPACE_WRITE_CONFLICT",
35
+ "WORKSPACE_LEASE_STALE",
36
+ // ADR-0076 PR 3d: a ledger with a torn or tampered tail refuses appends until an explicit repair.
37
+ "LEDGER_DAMAGED",
38
+ ] as const;
39
+
40
+ export type RefusalCode = (typeof REFUSAL_CODES)[number];
41
+
42
+ export interface StructuredRefusal {
43
+ code: RefusalCode;
44
+ /** Existing actionable diagnostic. Codes accompany rather than replace it. */
45
+ message: string;
46
+ details?: Record<string, string | number | boolean | null>;
47
+ }
48
+
49
+ export function refusal(code: RefusalCode, message: string, details?: StructuredRefusal["details"]): StructuredRefusal {
50
+ return { code, message, ...(details && Object.keys(details).length > 0 ? { details: { ...details } } : {}) };
51
+ }
52
+
53
+ /** Error shape for API callers. pi-facing tools still throw, as pi requires, while retaining a stable code. */
54
+ export class GovernanceRefusal extends Error {
55
+ readonly code: RefusalCode;
56
+ readonly details?: StructuredRefusal["details"];
57
+
58
+ constructor(value: StructuredRefusal) {
59
+ super(value.message);
60
+ this.name = "GovernanceRefusal";
61
+ this.code = value.code;
62
+ this.details = value.details;
63
+ }
64
+ }
@@ -0,0 +1,258 @@
1
+ /**
2
+ * Grant resolution — the entire security surface of capability governance, as a pure function.
3
+ *
4
+ * The invariant (ADR-0008): a capability set may only ever SHRINK as it passes down a delegation
5
+ * tree. Escalation is impossible by construction rather than by policy, because a parent can never
6
+ * confer what it does not itself hold.
7
+ *
8
+ * effective = ( requested ∩ parentGrant ∩ ceiling ) \ (gated \ approved)
9
+ *
10
+ * Being pure — no I/O, no model, no network — this is exhaustively testable, which matters because it
11
+ * is the only place an escalation could be introduced.
12
+ */
13
+
14
+ /** `tool:read` · `ext:pi-web-access/web_search` · `skill:review` · `agent:researcher` */
15
+ export type Capability = string;
16
+
17
+ /**
18
+ * Capabilities that transitively confer everything else. Granting one is equivalent to granting the
19
+ * whole catalog, so they can never be a *narrowing* grant.
20
+ *
21
+ * `ext:pi-fabric/fabric_exec` is here on measured evidence, not suspicion: a child granted
22
+ * `tools: []` (nothing at all) plus `recursive: true` still reached `pi.write` and `pi.bash` and
23
+ * spawned a grandchild that wrote to disk. See docs/probes/pi-fabric-eval (probes 2, 4, 7, 8).
24
+ */
25
+ export const UNIVERSAL_CAPABILITIES: readonly Capability[] = ["ext:pi-fabric/fabric_exec", "tool:fabric_exec"];
26
+
27
+ /**
28
+ * Capabilities that functionally contain others.
29
+ *
30
+ * `bash` can run `grep`, `find`, `ls`, `cat`, and `sed` — so a session holding it can already do
31
+ * everything the file and search tools do, whatever the tool list says. Modelling this explicitly serves
32
+ * two purposes:
33
+ *
34
+ * 1. It removes false escalation reports. pi's *default* surface is only `read`, `bash`, `edit`, `write`
35
+ * (measured, not assumed), so an agent type declaring `tools: read, grep, find, ls` would otherwise
36
+ * look like an escalation from any normal parent — despite being strictly weaker.
37
+ * 2. It makes the uncomfortable truth visible rather than implied: **a grant containing `bash` is not a
38
+ * narrow grant.** `subsumedBy` in the result says so, so a reviewer can see what the grant really means.
39
+ */
40
+ export const SUBSUMPTION: Readonly<Record<Capability, readonly Capability[]>> = {
41
+ "tool:bash": ["tool:grep", "tool:find", "tool:ls", "tool:read", "tool:write", "tool:edit", "tool:edit-diff"],
42
+ };
43
+
44
+ /** Expand a grant to everything it functionally confers. */
45
+ export function expandSubsumed(grant: Capability[]): Capability[] {
46
+ const expanded = new Set(grant);
47
+ for (const held of grant) {
48
+ for (const implied of SUBSUMPTION[held] ?? []) expanded.add(implied);
49
+ }
50
+ return [...expanded].sort();
51
+ }
52
+
53
+ import { WILDCARD } from "./pi-tools.ts";
54
+ import { isWellFormedCapability } from "./capabilities.ts";
55
+
56
+ /**
57
+ * "Any definition" — ADR-0023, and one of two wildcards this module understands.
58
+ *
59
+ * Declared here rather than beside `WILDCARD` because `pi-tools.ts` imports `Capability` from this module.
60
+ * That import is `import type`, so it is erased and the runtime dependency runs one way only — which is
61
+ * what makes importing `WILDCARD` back safe.
62
+ *
63
+ * Deliberately weaker than `tool:*`: it confers **no tool authority**, so `agent:*,tool:read` may spawn
64
+ * every definition on disk and hand each of them nothing but `read`. It exists because the alternative was
65
+ * `tool:*` — authority to grant every tool — which made the safe configuration the laborious one.
66
+ */
67
+ export const AGENT_WILDCARD: Capability = "agent:*";
68
+ /**
69
+ * `workspace:*` covers any `workspace:<id>` — ADR-0035, and the second namespace wildcard.
70
+ *
71
+ * Added as a deliberate edit, which is what the comment in `resolve()` below asks for: there is no
72
+ * generalised `<ns>:*` rule, so a namespace does not acquire a wildcard by existing. Unlike `agent:*` this
73
+ * one is **not inheritable** (`childEnv` strips it) — R-26's rule, because a root that handed
74
+ * `workspace:*` down would make routing attenuation meaningless below the root, which is the exact defect
75
+ * R-131 records.
76
+ */
77
+ export const WORKSPACE_WILDCARD: Capability = "workspace:*";
78
+
79
+ export interface ResolveInput {
80
+ /** What the delegating agent asked to give the child. */
81
+ requested: Capability[];
82
+ /** What the delegating agent itself holds. The root's grant is configured, never defaulted to all. */
83
+ parentGrant: Capability[];
84
+ /** Declarative maximum for the child's agent type (its frontmatter). Omit for no ceiling. */
85
+ ceiling?: Capability[];
86
+ /** Destructive capabilities that may never enter a grant without explicit human approval. */
87
+ gated?: Capability[];
88
+ /** Gated capabilities a human has approved for this specific spawn. */
89
+ approved?: Capability[];
90
+ /**
91
+ * Honour functional subsumption when deciding what the parent covers (default true).
92
+ * Set false for a strict name-equality check.
93
+ */
94
+ subsumption?: boolean;
95
+ }
96
+
97
+ export interface ResolveResult {
98
+ /** The capability set the child may hold. */
99
+ effective: Capability[];
100
+ /** Requested but NOT held by the parent — the escalation-attempt signal. Log every one. */
101
+ denied: Capability[];
102
+ /** Held by the parent but outside the child type's declared ceiling. */
103
+ clipped: Capability[];
104
+ /** Allowed by the tree but gated and unapproved. */
105
+ gatedBlocked: Capability[];
106
+ /** Universal capabilities that survived resolution — see `assertNarrowing`. */
107
+ universal: Capability[];
108
+ /**
109
+ * Capabilities the parent covers only through subsumption, not by holding them directly — e.g. `grep`
110
+ * covered because the parent holds `bash`. Non-empty means the grant is broader than its list suggests.
111
+ */
112
+ subsumedBy: Capability[];
113
+ }
114
+
115
+ const unique = (xs: Capability[]): Capability[] => [...new Set(xs)].sort();
116
+
117
+ /**
118
+ * Resolve a child's grant. Total and side-effect free; every rejected capability is reported rather
119
+ * than silently dropped, because a grant nobody can audit proves nothing.
120
+ */
121
+ export function resolve(input: ResolveInput): ResolveResult {
122
+ const requested = unique(input.requested);
123
+ const held = new Set(input.parentGrant);
124
+ const parent = input.subsumption === false ? held : new Set(expandSubsumed(input.parentGrant));
125
+ /**
126
+ * `agent:*` covers any `agent:<name>` — ADR-0023. It was the only wildcard rule in this function when
127
+ * that was written; ADR-0035 added a third, so `covered()` now has `tool:*`, `agent:*` and `workspace:*`.
128
+ * There is still no GENERALISED `<ns>:*` rule: each is a deliberate edit, which is the property worth
129
+ * keeping. Corrected because the sentence sat eighty lines above "all THREE wildcards are excluded".
130
+ *
131
+ * `resolve` is otherwise exact-match plus subsumption, deliberately: `tool:*` works not because anything
132
+ * here understands it, but because `deriveOwnGrant` *enumerates* a session's observed tool names beside
133
+ * it. Definitions are not tools, so nothing enumerates them — which is why `maySpawnDefinition` had to
134
+ * special-case the wildcard, and why this needs stating rather than falling out.
135
+ *
136
+ * Scoped to one namespace on purpose. There is no generalised `<ns>:*` rule, so a namespace added later
137
+ * does not silently acquire a wildcard; adding one is a deliberate edit and another decision.
138
+ */
139
+ const anyDefinition = held.has(AGENT_WILDCARD);
140
+ /**
141
+ * `tool:*` satisfies **any** capability, including `skill:` and `agent:` ids.
142
+ *
143
+ * Missing until 0.11.2, and the omission broke the one rule this package must never break by accident:
144
+ * *governance is opt-in*. An ungoverned session holds `[tool:*, …observed tools]` and nothing else, so
145
+ * spawning a definition whose `allowed-tools` names `agent:worker` or `skill:review` — the composition
146
+ * ADR-0017 created and ADR-0023's own example uses — was refused with **"capability escalation
147
+ * blocked"**, and recorded as an escalation attempt, in a session that had opted out.
148
+ *
149
+ * `maySpawnDefinition` had always honoured `tool:*` for definition ids and `docs/SPEC.md` had always
150
+ * claimed it "satisfies any capability". This function disagreed with both, which is R-28's shape: two
151
+ * spellings of one rule, and the enforcing one was wrong.
152
+ */
153
+ const anyCapability = held.has(WILDCARD);
154
+ const anyWorkspace = held.has(WORKSPACE_WILDCARD);
155
+ // A malformed id is never covered — not by an exact hold, and above all not by a wildcard's PREFIX rule,
156
+ // which is how `agent:x,tool:bash` got admitted and then split into two capabilities in the child.
157
+ // Landing in `denied` is the right outcome rather than a throw: it fails closed AND records an
158
+ // escalation attempt, so the ledger shows the attempt instead of a clean line.
159
+ const covered = (c: Capability): boolean =>
160
+ isWellFormedCapability(c) &&
161
+ (parent.has(c) ||
162
+ anyCapability ||
163
+ (anyDefinition && c.startsWith("agent:")) ||
164
+ (anyWorkspace && c.startsWith("workspace:")));
165
+
166
+ const ceiling = input.ceiling === undefined ? null : new Set(input.ceiling);
167
+ const gated = new Set(input.gated ?? []);
168
+ const approved = new Set(input.approved ?? []);
169
+
170
+ // Order is irrelevant to the outcome (set intersection is commutative), so each rejection reason is
171
+ // reported independently rather than being masked by whichever filter happened to run first.
172
+ const denied = requested.filter((c) => !covered(c));
173
+ const clipped = requested.filter((c) => covered(c) && ceiling !== null && !ceiling.has(c));
174
+ /**
175
+ * Is this capability gated, directly or by subsuming something gated?
176
+ *
177
+ * ADR-0012. Exact-name gating was defeatable by handing down a broader capability: the package's own
178
+ * `SUBSUMPTION` table says `bash` confers `write`, so gating `write` produced **no prompt** when `bash`
179
+ * was granted instead. The gate read as satisfied because the string never appeared.
180
+ *
181
+ * The direction is load-bearing and easy to invert. A capability is gated when it **subsumes**
182
+ * something gated — never when it **is subsumed by** something gated. Gating `bash` must not quietly
183
+ * gate a plain `write` grant, which would make gating a broad capability restrict the narrow ones and
184
+ * invert least privilege.
185
+ */
186
+ const isGated = (c: Capability): boolean => {
187
+ if (gated.has(c)) return true;
188
+ if (input.subsumption === false) return false;
189
+ return (SUBSUMPTION[c] ?? []).some((implied) => gated.has(implied));
190
+ };
191
+
192
+ const gatedBlocked = requested.filter(
193
+ (c) => covered(c) && (ceiling === null || ceiling.has(c)) && isGated(c) && !approved.has(c),
194
+ );
195
+
196
+ const rejected = new Set([...denied, ...clipped, ...gatedBlocked]);
197
+ const effective = requested.filter((c) => !rejected.has(c));
198
+
199
+ return {
200
+ effective,
201
+ denied,
202
+ clipped,
203
+ gatedBlocked,
204
+ universal: effective.filter((c) => UNIVERSAL_CAPABILITIES.includes(c)),
205
+ // F9: capabilities covered by a WILDCARD are not "subsumed" — this field means "the grant is broader
206
+ // than its list suggests", which is the `bash`-covers-`grep` warning. A wildcard holder already knows
207
+ // its grant is broad; listing every id under it would bury the signal the field exists to carry.
208
+ //
209
+ // All THREE wildcards are excluded. `anyWorkspace` was missing, so a caller holding `workspace:*` saw
210
+ // its own `workspace:prod` reported as subsumed while the `agent:*` holder correctly saw nothing — the
211
+ // field contradicting its own rule, and a false "broader than it looks" flag in the ledger and in
212
+ // `/grants`. Every wildcard added to `covered()` above needs a line here; that is now three for three.
213
+ subsumedBy: effective.filter(
214
+ (c) =>
215
+ !held.has(c) &&
216
+ !anyCapability &&
217
+ !(anyDefinition && c.startsWith("agent:")) &&
218
+ !(anyWorkspace && c.startsWith("workspace:")),
219
+ ),
220
+ };
221
+ }
222
+
223
+ /**
224
+ * Fail closed on a grant that cannot actually narrow anything.
225
+ *
226
+ * A universal capability in an "attenuated" grant is not a narrow grant with one extra item — it is
227
+ * full authority wearing a narrow grant's clothing. Callers must opt in explicitly rather than
228
+ * discover this at runtime.
229
+ */
230
+ export function assertNarrowing(result: ResolveResult, allowUniversal = false): void {
231
+ if (!allowUniversal && result.universal.length > 0) {
232
+ throw new Error(
233
+ `refusing to issue a grant containing universal capabilities: ${result.universal.join(", ")}. ` +
234
+ `These transitively confer the whole catalog, so the grant would not narrow anything. ` +
235
+ `Pass allowUniversal to override deliberately.`,
236
+ );
237
+ }
238
+ }
239
+
240
+ /**
241
+ * Project an effective grant onto pi's `--tools` allowlist.
242
+ *
243
+ * pi core is the enforcement point — verified: `--tools` and `--no-tools` both hard-block extension
244
+ * tools, and an explicitly `-e`-loaded extension cannot re-add its tool past them
245
+ * (docs/probes/pi-fabric-eval probes 9–11). That is why enforcement needs no in-descendant runtime.
246
+ *
247
+ * Returns `null` when the grant contains no callable tools, meaning the caller should pass
248
+ * `--no-tools` rather than an empty `--tools` (an empty list is not a valid allowlist).
249
+ */
250
+ export function toPiToolsAllowlist(effective: Capability[]): string[] | null {
251
+ const names = effective
252
+ .filter((c) => c.startsWith("tool:") || c.startsWith("ext:"))
253
+ // `tool:read` -> `read`; `ext:pkg/web_search` -> `web_search` (pi matches on bare tool name)
254
+ .map((c) => (c.startsWith("tool:") ? c.slice(5) : c.slice(c.lastIndexOf("/") + 1)))
255
+ .filter((n) => n.length > 0);
256
+ const deduped = [...new Set(names)].sort();
257
+ return deduped.length > 0 ? deduped : null;
258
+ }