toolroll 0.5.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 (626) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1113 -0
  3. package/THIRD_PARTY_NOTICES.md +449 -0
  4. package/dist/accent-colors.d.ts +48 -0
  5. package/dist/accent-colors.js +122 -0
  6. package/dist/action-ledger.d.ts +26 -0
  7. package/dist/action-ledger.js +75 -0
  8. package/dist/agent-fence.d.ts +42 -0
  9. package/dist/agent-fence.js +183 -0
  10. package/dist/agentconfig.d.ts +216 -0
  11. package/dist/agentconfig.js +454 -0
  12. package/dist/api-tokens.d.ts +16 -0
  13. package/dist/api-tokens.js +27 -0
  14. package/dist/approval-policy.d.ts +69 -0
  15. package/dist/approval-policy.js +137 -0
  16. package/dist/approval-rules-ui.d.ts +25 -0
  17. package/dist/approval-rules-ui.js +39 -0
  18. package/dist/assignment-adapters.d.ts +180 -0
  19. package/dist/assignment-adapters.js +239 -0
  20. package/dist/assignment-brief.d.ts +71 -0
  21. package/dist/assignment-brief.js +129 -0
  22. package/dist/assignment-delivery.d.ts +56 -0
  23. package/dist/assignment-delivery.js +160 -0
  24. package/dist/assignment-presentation.d.ts +26 -0
  25. package/dist/assignment-presentation.js +80 -0
  26. package/dist/assignment-status.d.ts +62 -0
  27. package/dist/assignment-status.js +152 -0
  28. package/dist/assignment-ui.d.ts +71 -0
  29. package/dist/assignment-ui.js +103 -0
  30. package/dist/assignment.d.ts +222 -0
  31. package/dist/assignment.js +399 -0
  32. package/dist/attest.d.ts +56 -0
  33. package/dist/attest.js +153 -0
  34. package/dist/backend.d.ts +97 -0
  35. package/dist/backend.js +166 -0
  36. package/dist/backup-ui.d.ts +22 -0
  37. package/dist/backup-ui.js +59 -0
  38. package/dist/backup.d.ts +84 -0
  39. package/dist/backup.js +421 -0
  40. package/dist/beads.d.ts +34 -0
  41. package/dist/beads.js +135 -0
  42. package/dist/bin.d.ts +2 -0
  43. package/dist/bin.js +22 -0
  44. package/dist/board.d.ts +150 -0
  45. package/dist/board.js +210 -0
  46. package/dist/boot-identity.d.ts +63 -0
  47. package/dist/boot-identity.js +99 -0
  48. package/dist/browser/THIRD_PARTY_NOTICES.txt +2295 -0
  49. package/dist/browser/workspace.css +4 -0
  50. package/dist/browser/workspace.js +225 -0
  51. package/dist/browser-crew.d.ts +11 -0
  52. package/dist/browser-crew.js +50 -0
  53. package/dist/browser-shell.d.ts +8 -0
  54. package/dist/browser-shell.js +60 -0
  55. package/dist/browser-workspace.d.ts +780 -0
  56. package/dist/browser-workspace.js +47 -0
  57. package/dist/budget-alerts.d.ts +19 -0
  58. package/dist/budget-alerts.js +46 -0
  59. package/dist/builder.d.ts +370 -0
  60. package/dist/builder.js +3262 -0
  61. package/dist/capscan.d.ts +35 -0
  62. package/dist/capscan.js +113 -0
  63. package/dist/chat-acceptance.d.ts +71 -0
  64. package/dist/chat-acceptance.js +120 -0
  65. package/dist/chat-actions.d.ts +265 -0
  66. package/dist/chat-actions.js +1273 -0
  67. package/dist/chat-channel.d.ts +109 -0
  68. package/dist/chat-channel.js +652 -0
  69. package/dist/chat-continuity.d.ts +32 -0
  70. package/dist/chat-continuity.js +317 -0
  71. package/dist/chat-controls.d.ts +113 -0
  72. package/dist/chat-controls.js +53 -0
  73. package/dist/chat-delivery-state.d.ts +159 -0
  74. package/dist/chat-delivery-state.js +309 -0
  75. package/dist/chat-delivery.d.ts +38 -0
  76. package/dist/chat-delivery.js +693 -0
  77. package/dist/chat-display.d.ts +1 -0
  78. package/dist/chat-display.js +18 -0
  79. package/dist/chat-evidence.d.ts +123 -0
  80. package/dist/chat-evidence.js +207 -0
  81. package/dist/chat-flow.d.ts +44 -0
  82. package/dist/chat-flow.js +215 -0
  83. package/dist/chat-inbox.d.ts +57 -0
  84. package/dist/chat-inbox.js +123 -0
  85. package/dist/chat-polish.d.ts +16 -0
  86. package/dist/chat-polish.js +135 -0
  87. package/dist/chat-review.d.ts +46 -0
  88. package/dist/chat-review.js +98 -0
  89. package/dist/chat-rooms.d.ts +123 -0
  90. package/dist/chat-rooms.js +216 -0
  91. package/dist/chat-task-actions.d.ts +44 -0
  92. package/dist/chat-task-actions.js +79 -0
  93. package/dist/check-progress.d.ts +51 -0
  94. package/dist/check-progress.js +290 -0
  95. package/dist/child-database.d.ts +12 -0
  96. package/dist/child-database.js +30 -0
  97. package/dist/claim.d.ts +688 -0
  98. package/dist/claim.js +1740 -0
  99. package/dist/cli.d.ts +137 -0
  100. package/dist/cli.js +1461 -0
  101. package/dist/codex-limits.d.ts +15 -0
  102. package/dist/codex-limits.js +145 -0
  103. package/dist/coding-context.d.ts +55 -0
  104. package/dist/coding-context.js +92 -0
  105. package/dist/coding-handoff.d.ts +57 -0
  106. package/dist/coding-handoff.js +277 -0
  107. package/dist/coding-provider.d.ts +72 -0
  108. package/dist/coding-provider.js +424 -0
  109. package/dist/coding-shipping-ui.d.ts +4 -0
  110. package/dist/coding-shipping-ui.js +12 -0
  111. package/dist/coding-types.d.ts +62 -0
  112. package/dist/coding-types.js +1 -0
  113. package/dist/coding-ui.d.ts +17 -0
  114. package/dist/coding-ui.js +364 -0
  115. package/dist/coding-update.d.ts +15 -0
  116. package/dist/coding-update.js +149 -0
  117. package/dist/coding-workspace.d.ts +124 -0
  118. package/dist/coding-workspace.js +768 -0
  119. package/dist/container-state.d.ts +5 -0
  120. package/dist/container-state.js +62 -0
  121. package/dist/containment.d.ts +197 -0
  122. package/dist/containment.js +559 -0
  123. package/dist/contest.d.ts +318 -0
  124. package/dist/contest.js +753 -0
  125. package/dist/control-setup.d.ts +35 -0
  126. package/dist/control-setup.js +40 -0
  127. package/dist/control-ui.d.ts +29 -0
  128. package/dist/control-ui.js +53 -0
  129. package/dist/controller-service.d.ts +1 -0
  130. package/dist/controller-service.js +19 -0
  131. package/dist/controller-supervisor.d.ts +30 -0
  132. package/dist/controller-supervisor.js +104 -0
  133. package/dist/converse.d.ts +304 -0
  134. package/dist/converse.js +849 -0
  135. package/dist/coordinator-proposals.d.ts +29 -0
  136. package/dist/coordinator-proposals.js +137 -0
  137. package/dist/coordinator.d.ts +186 -0
  138. package/dist/coordinator.js +447 -0
  139. package/dist/credentials-ui.d.ts +25 -0
  140. package/dist/credentials-ui.js +48 -0
  141. package/dist/daemon.d.ts +209 -0
  142. package/dist/daemon.js +604 -0
  143. package/dist/decision.d.ts +120 -0
  144. package/dist/decision.js +388 -0
  145. package/dist/demo.d.ts +55 -0
  146. package/dist/demo.js +992 -0
  147. package/dist/desktop-access.d.ts +28 -0
  148. package/dist/desktop-access.js +88 -0
  149. package/dist/desktop-bundle.d.ts +16 -0
  150. package/dist/desktop-bundle.js +74 -0
  151. package/dist/desktop-host.d.ts +54 -0
  152. package/dist/desktop-host.js +508 -0
  153. package/dist/desktop-update-gate.d.ts +12 -0
  154. package/dist/desktop-update-gate.js +91 -0
  155. package/dist/desktop-update-recovery.d.ts +14 -0
  156. package/dist/desktop-update-recovery.js +243 -0
  157. package/dist/desktop-update.d.ts +110 -0
  158. package/dist/desktop-update.js +740 -0
  159. package/dist/discord-api.d.ts +20 -0
  160. package/dist/discord-api.js +138 -0
  161. package/dist/discord-chat.d.ts +16 -0
  162. package/dist/discord-chat.js +381 -0
  163. package/dist/discord-settings.d.ts +7 -0
  164. package/dist/discord-settings.js +75 -0
  165. package/dist/discord.d.ts +10 -0
  166. package/dist/discord.js +169 -0
  167. package/dist/discover.d.ts +75 -0
  168. package/dist/discover.js +150 -0
  169. package/dist/dispatch.d.ts +100 -0
  170. package/dist/dispatch.js +311 -0
  171. package/dist/dispose.d.ts +161 -0
  172. package/dist/dispose.js +803 -0
  173. package/dist/email-settings.d.ts +34 -0
  174. package/dist/email-settings.js +50 -0
  175. package/dist/envelope.d.ts +47 -0
  176. package/dist/envelope.js +105 -0
  177. package/dist/evidence-pack.d.ts +185 -0
  178. package/dist/evidence-pack.js +258 -0
  179. package/dist/evidence.d.ts +345 -0
  180. package/dist/evidence.js +782 -0
  181. package/dist/exec.d.ts +285 -0
  182. package/dist/exec.js +1841 -0
  183. package/dist/exhaustion.d.ts +85 -0
  184. package/dist/exhaustion.js +141 -0
  185. package/dist/export-ui.d.ts +4 -0
  186. package/dist/export-ui.js +17 -0
  187. package/dist/export.d.ts +48 -0
  188. package/dist/export.js +305 -0
  189. package/dist/flow-actions.d.ts +77 -0
  190. package/dist/flow-actions.js +203 -0
  191. package/dist/flow-code.d.ts +50 -0
  192. package/dist/flow-code.js +159 -0
  193. package/dist/flow-draft.d.ts +38 -0
  194. package/dist/flow-draft.js +80 -0
  195. package/dist/flow-engine.d.ts +66 -0
  196. package/dist/flow-engine.js +416 -0
  197. package/dist/flow-insights.d.ts +95 -0
  198. package/dist/flow-insights.js +149 -0
  199. package/dist/flow-live.d.ts +24 -0
  200. package/dist/flow-live.js +150 -0
  201. package/dist/flow-people.d.ts +24 -0
  202. package/dist/flow-people.js +91 -0
  203. package/dist/flow-replies.d.ts +48 -0
  204. package/dist/flow-replies.js +113 -0
  205. package/dist/flow-scripts.d.ts +38 -0
  206. package/dist/flow-scripts.js +73 -0
  207. package/dist/flow-secrets.d.ts +13 -0
  208. package/dist/flow-secrets.js +45 -0
  209. package/dist/flow-sort.d.ts +82 -0
  210. package/dist/flow-sort.js +153 -0
  211. package/dist/flow-steps.d.ts +40 -0
  212. package/dist/flow-steps.js +408 -0
  213. package/dist/flow-triggers.d.ts +244 -0
  214. package/dist/flow-triggers.js +959 -0
  215. package/dist/flows-ui.d.ts +20 -0
  216. package/dist/flows-ui.js +175 -0
  217. package/dist/flows.d.ts +229 -0
  218. package/dist/flows.js +968 -0
  219. package/dist/fonts.d.ts +19 -0
  220. package/dist/fonts.js +19 -0
  221. package/dist/gaps.d.ts +35 -0
  222. package/dist/gaps.js +101 -0
  223. package/dist/gate-failure.d.ts +40 -0
  224. package/dist/gate-failure.js +66 -0
  225. package/dist/git.d.ts +54 -0
  226. package/dist/git.js +94 -0
  227. package/dist/google-mail.d.ts +58 -0
  228. package/dist/google-mail.js +151 -0
  229. package/dist/grant.d.ts +136 -0
  230. package/dist/grant.js +238 -0
  231. package/dist/graph.d.ts +164 -0
  232. package/dist/graph.js +383 -0
  233. package/dist/guides.d.ts +22 -0
  234. package/dist/guides.js +363 -0
  235. package/dist/held.d.ts +150 -0
  236. package/dist/held.js +799 -0
  237. package/dist/invoke.d.ts +112 -0
  238. package/dist/invoke.js +780 -0
  239. package/dist/issues.d.ts +41 -0
  240. package/dist/issues.js +131 -0
  241. package/dist/job-object-helper.ps1 +252 -0
  242. package/dist/jsonl-discriminants.d.ts +11 -0
  243. package/dist/jsonl-discriminants.js +93 -0
  244. package/dist/keys.d.ts +104 -0
  245. package/dist/keys.js +229 -0
  246. package/dist/kits-ui.d.ts +17 -0
  247. package/dist/kits-ui.js +46 -0
  248. package/dist/kits.d.ts +86 -0
  249. package/dist/kits.js +215 -0
  250. package/dist/knowledge-cli.d.ts +101 -0
  251. package/dist/knowledge-cli.js +92 -0
  252. package/dist/knowledge-ui.d.ts +24 -0
  253. package/dist/knowledge-ui.js +40 -0
  254. package/dist/lead-context.d.ts +8 -0
  255. package/dist/lead-context.js +56 -0
  256. package/dist/lead-follow.d.ts +22 -0
  257. package/dist/lead-follow.js +167 -0
  258. package/dist/lead-status.d.ts +75 -0
  259. package/dist/lead-status.js +285 -0
  260. package/dist/ledger-chain.d.ts +46 -0
  261. package/dist/ledger-chain.js +187 -0
  262. package/dist/ledger-csv.d.ts +4 -0
  263. package/dist/ledger-csv.js +11 -0
  264. package/dist/ledger-view.d.ts +24 -0
  265. package/dist/ledger-view.js +58 -0
  266. package/dist/limits-ui.d.ts +26 -0
  267. package/dist/limits-ui.js +67 -0
  268. package/dist/link.d.ts +72 -0
  269. package/dist/link.js +217 -0
  270. package/dist/live.d.ts +96 -0
  271. package/dist/live.js +366 -0
  272. package/dist/liveness.d.ts +30 -0
  273. package/dist/liveness.js +42 -0
  274. package/dist/log.d.ts +7 -0
  275. package/dist/log.js +25 -0
  276. package/dist/mailbox.d.ts +57 -0
  277. package/dist/mailbox.js +150 -0
  278. package/dist/maintenance.d.ts +11 -0
  279. package/dist/maintenance.js +35 -0
  280. package/dist/mate-cli.d.ts +52 -0
  281. package/dist/mate-cli.js +345 -0
  282. package/dist/mate-contract.d.ts +10 -0
  283. package/dist/mate-contract.js +30 -0
  284. package/dist/mate-doors.d.ts +69 -0
  285. package/dist/mate-doors.js +548 -0
  286. package/dist/mate-progress.d.ts +29 -0
  287. package/dist/mate-progress.js +121 -0
  288. package/dist/mate-tools.d.ts +94 -0
  289. package/dist/mate-tools.js +1878 -0
  290. package/dist/mate.d.ts +92 -0
  291. package/dist/mate.js +435 -0
  292. package/dist/mcp-connect.d.ts +103 -0
  293. package/dist/mcp-connect.js +252 -0
  294. package/dist/mcp.d.ts +27 -0
  295. package/dist/mcp.js +651 -0
  296. package/dist/memory-cli.d.ts +466 -0
  297. package/dist/memory-cli.js +111 -0
  298. package/dist/memory-pass.d.ts +160 -0
  299. package/dist/memory-pass.js +409 -0
  300. package/dist/metrics.d.ts +3 -0
  301. package/dist/metrics.js +56 -0
  302. package/dist/mobile-viewport.d.ts +3 -0
  303. package/dist/mobile-viewport.js +37 -0
  304. package/dist/model-catalog.d.ts +118 -0
  305. package/dist/model-catalog.js +376 -0
  306. package/dist/models-cli.d.ts +102 -0
  307. package/dist/models-cli.js +66 -0
  308. package/dist/models-ui.d.ts +34 -0
  309. package/dist/models-ui.js +68 -0
  310. package/dist/modes.d.ts +80 -0
  311. package/dist/modes.js +182 -0
  312. package/dist/monitoring-settings.d.ts +44 -0
  313. package/dist/monitoring-settings.js +173 -0
  314. package/dist/monitoring-ui.d.ts +20 -0
  315. package/dist/monitoring-ui.js +51 -0
  316. package/dist/monitoring.d.ts +34 -0
  317. package/dist/monitoring.js +221 -0
  318. package/dist/names.d.ts +67 -0
  319. package/dist/names.js +102 -0
  320. package/dist/observations.d.ts +40 -0
  321. package/dist/observations.js +211 -0
  322. package/dist/oidc.d.ts +71 -0
  323. package/dist/oidc.js +182 -0
  324. package/dist/onboard.d.ts +108 -0
  325. package/dist/onboard.js +325 -0
  326. package/dist/openrouter-models.d.ts +30 -0
  327. package/dist/openrouter-models.js +120 -0
  328. package/dist/operate.d.ts +118 -0
  329. package/dist/operate.js +11321 -0
  330. package/dist/peek-cli.d.ts +97 -0
  331. package/dist/peek-cli.js +215 -0
  332. package/dist/peek.d.ts +134 -0
  333. package/dist/peek.js +578 -0
  334. package/dist/phase-routing.d.ts +307 -0
  335. package/dist/phase-routing.js +658 -0
  336. package/dist/plan-auto.d.ts +14 -0
  337. package/dist/plan-auto.js +92 -0
  338. package/dist/plan.d.ts +186 -0
  339. package/dist/plan.js +401 -0
  340. package/dist/planner-source.d.ts +251 -0
  341. package/dist/planner-source.js +460 -0
  342. package/dist/planner.d.ts +75 -0
  343. package/dist/planner.js +992 -0
  344. package/dist/policy-ui.d.ts +20 -0
  345. package/dist/policy-ui.js +41 -0
  346. package/dist/policy.d.ts +111 -0
  347. package/dist/policy.js +231 -0
  348. package/dist/prepared-evidence.d.ts +16 -0
  349. package/dist/prepared-evidence.js +96 -0
  350. package/dist/pricing.d.ts +45 -0
  351. package/dist/pricing.js +77 -0
  352. package/dist/principal.d.ts +42 -0
  353. package/dist/principal.js +82 -0
  354. package/dist/probe.d.ts +46 -0
  355. package/dist/probe.js +79 -0
  356. package/dist/process-custody.d.ts +17 -0
  357. package/dist/process-custody.js +91 -0
  358. package/dist/process-liveness.d.ts +10 -0
  359. package/dist/process-liveness.js +81 -0
  360. package/dist/process-recovery-anchor.d.ts +75 -0
  361. package/dist/process-recovery-anchor.js +188 -0
  362. package/dist/process-recovery-coalition.d.ts +25 -0
  363. package/dist/process-recovery-coalition.js +105 -0
  364. package/dist/process-recovery-eligibility.d.ts +178 -0
  365. package/dist/process-recovery-eligibility.js +170 -0
  366. package/dist/process-recovery-native.d.ts +172 -0
  367. package/dist/process-recovery-native.js +592 -0
  368. package/dist/process-recovery-provenance.d.ts +163 -0
  369. package/dist/process-recovery-provenance.js +292 -0
  370. package/dist/process-recovery-services.d.ts +56 -0
  371. package/dist/process-recovery-services.js +191 -0
  372. package/dist/process-recovery-settlement.d.ts +32 -0
  373. package/dist/process-recovery-settlement.js +132 -0
  374. package/dist/process-recovery.d.ts +41 -0
  375. package/dist/process-recovery.js +91 -0
  376. package/dist/process-tree.d.ts +41 -0
  377. package/dist/process-tree.js +264 -0
  378. package/dist/project-access.d.ts +14 -0
  379. package/dist/project-access.js +34 -0
  380. package/dist/project-cli.d.ts +18 -0
  381. package/dist/project-cli.js +104 -0
  382. package/dist/project-delete-ui.d.ts +22 -0
  383. package/dist/project-delete-ui.js +48 -0
  384. package/dist/project-delete.d.ts +55 -0
  385. package/dist/project-delete.js +413 -0
  386. package/dist/project-knowledge.d.ts +111 -0
  387. package/dist/project-knowledge.js +241 -0
  388. package/dist/project-learning.d.ts +100 -0
  389. package/dist/project-learning.js +438 -0
  390. package/dist/project-memory.d.ts +81 -0
  391. package/dist/project-memory.js +264 -0
  392. package/dist/project-skills.d.ts +152 -0
  393. package/dist/project-skills.js +660 -0
  394. package/dist/project-tools.d.ts +219 -0
  395. package/dist/project-tools.js +796 -0
  396. package/dist/project.d.ts +61 -0
  397. package/dist/project.js +125 -0
  398. package/dist/prompt.d.ts +22 -0
  399. package/dist/prompt.js +72 -0
  400. package/dist/proof.d.ts +513 -0
  401. package/dist/proof.js +1140 -0
  402. package/dist/proposal.d.ts +82 -0
  403. package/dist/proposal.js +210 -0
  404. package/dist/provider-connection.d.ts +22 -0
  405. package/dist/provider-connection.js +98 -0
  406. package/dist/provider-limits.d.ts +35 -0
  407. package/dist/provider-limits.js +95 -0
  408. package/dist/provider.d.ts +279 -0
  409. package/dist/provider.js +935 -0
  410. package/dist/publish.d.ts +107 -0
  411. package/dist/publish.js +650 -0
  412. package/dist/pulls.d.ts +118 -0
  413. package/dist/pulls.js +240 -0
  414. package/dist/push.d.ts +95 -0
  415. package/dist/push.js +353 -0
  416. package/dist/quality.d.ts +8 -0
  417. package/dist/quality.js +6 -0
  418. package/dist/recipe-ui.d.ts +18 -0
  419. package/dist/recipe-ui.js +152 -0
  420. package/dist/recipes.d.ts +81 -0
  421. package/dist/recipes.js +332 -0
  422. package/dist/remote.d.ts +67 -0
  423. package/dist/remote.js +122 -0
  424. package/dist/render.d.ts +64 -0
  425. package/dist/render.js +587 -0
  426. package/dist/report-summary.d.ts +13 -0
  427. package/dist/report-summary.js +15 -0
  428. package/dist/repos.d.ts +65 -0
  429. package/dist/repos.js +277 -0
  430. package/dist/repository-context-ui.d.ts +2 -0
  431. package/dist/repository-context-ui.js +10 -0
  432. package/dist/repository-context.d.ts +67 -0
  433. package/dist/repository-context.js +376 -0
  434. package/dist/restart-certification.d.ts +134 -0
  435. package/dist/restart-certification.js +226 -0
  436. package/dist/result-actions.d.ts +28 -0
  437. package/dist/result-actions.js +270 -0
  438. package/dist/result-completion.d.ts +18 -0
  439. package/dist/result-completion.js +66 -0
  440. package/dist/result-review.d.ts +213 -0
  441. package/dist/result-review.js +430 -0
  442. package/dist/retention-ui.d.ts +12 -0
  443. package/dist/retention-ui.js +39 -0
  444. package/dist/retention.d.ts +72 -0
  445. package/dist/retention.js +288 -0
  446. package/dist/review-context.d.ts +243 -0
  447. package/dist/review-context.js +1043 -0
  448. package/dist/review-evidence.d.ts +33 -0
  449. package/dist/review-evidence.js +56 -0
  450. package/dist/reviewer.d.ts +97 -0
  451. package/dist/reviewer.js +202 -0
  452. package/dist/routine.d.ts +228 -0
  453. package/dist/routine.js +764 -0
  454. package/dist/runner.d.ts +266 -0
  455. package/dist/runner.js +399 -0
  456. package/dist/scan.d.ts +32 -0
  457. package/dist/scan.js +92 -0
  458. package/dist/scope.d.ts +695 -0
  459. package/dist/scope.js +1176 -0
  460. package/dist/scout-report.d.ts +42 -0
  461. package/dist/scout-report.js +108 -0
  462. package/dist/scout.d.ts +69 -0
  463. package/dist/scout.js +351 -0
  464. package/dist/serve.d.ts +313 -0
  465. package/dist/serve.js +21776 -0
  466. package/dist/session-brief.d.ts +8 -0
  467. package/dist/session-brief.js +24 -0
  468. package/dist/session-cli.d.ts +13 -0
  469. package/dist/session-cli.js +284 -0
  470. package/dist/session-contract.d.ts +183 -0
  471. package/dist/session-contract.js +122 -0
  472. package/dist/session-http.d.ts +19 -0
  473. package/dist/session-http.js +154 -0
  474. package/dist/session-server.d.ts +12 -0
  475. package/dist/session-server.js +37 -0
  476. package/dist/session-service.d.ts +22 -0
  477. package/dist/session-service.js +157 -0
  478. package/dist/setup-guide.d.ts +39 -0
  479. package/dist/setup-guide.js +93 -0
  480. package/dist/sign-in-guard.d.ts +45 -0
  481. package/dist/sign-in-guard.js +74 -0
  482. package/dist/skills-ui.d.ts +11 -0
  483. package/dist/skills-ui.js +58 -0
  484. package/dist/skills.d.ts +97 -0
  485. package/dist/skills.js +276 -0
  486. package/dist/slack-api.d.ts +55 -0
  487. package/dist/slack-api.js +229 -0
  488. package/dist/slack-chat.d.ts +28 -0
  489. package/dist/slack-chat.js +413 -0
  490. package/dist/slack-settings.d.ts +7 -0
  491. package/dist/slack-settings.js +75 -0
  492. package/dist/slack-state.d.ts +13 -0
  493. package/dist/slack-state.js +9 -0
  494. package/dist/slack.d.ts +13 -0
  495. package/dist/slack.js +167 -0
  496. package/dist/spend-ui.d.ts +28 -0
  497. package/dist/spend-ui.js +95 -0
  498. package/dist/spend.d.ts +142 -0
  499. package/dist/spend.js +313 -0
  500. package/dist/sqlite-runtime.d.ts +3 -0
  501. package/dist/sqlite-runtime.js +6 -0
  502. package/dist/sso-settings.d.ts +33 -0
  503. package/dist/sso-settings.js +103 -0
  504. package/dist/sso-ui.d.ts +22 -0
  505. package/dist/sso-ui.js +39 -0
  506. package/dist/storage.d.ts +15 -0
  507. package/dist/storage.js +84 -0
  508. package/dist/store.d.ts +7754 -0
  509. package/dist/store.js +23279 -0
  510. package/dist/structured-output.d.ts +58 -0
  511. package/dist/structured-output.js +103 -0
  512. package/dist/style-asset.d.ts +7 -0
  513. package/dist/style-asset.js +41 -0
  514. package/dist/subscription-chat.d.ts +46 -0
  515. package/dist/subscription-chat.js +275 -0
  516. package/dist/summary.d.ts +33 -0
  517. package/dist/summary.js +71 -0
  518. package/dist/supervisor.mjs +297 -0
  519. package/dist/surface.d.ts +63 -0
  520. package/dist/surface.js +352 -0
  521. package/dist/sync.d.ts +94 -0
  522. package/dist/sync.js +279 -0
  523. package/dist/task-composer.d.ts +13 -0
  524. package/dist/task-composer.js +52 -0
  525. package/dist/task-control.d.ts +165 -0
  526. package/dist/task-control.js +214 -0
  527. package/dist/task-outcome-cli.d.ts +10 -0
  528. package/dist/task-outcome-cli.js +92 -0
  529. package/dist/task-text.d.ts +30 -0
  530. package/dist/task-text.js +41 -0
  531. package/dist/team-cli.d.ts +15 -0
  532. package/dist/team-cli.js +618 -0
  533. package/dist/team-contract.d.ts +92 -0
  534. package/dist/team-contract.js +1 -0
  535. package/dist/team-http.d.ts +17 -0
  536. package/dist/team-http.js +144 -0
  537. package/dist/team-leads.d.ts +81 -0
  538. package/dist/team-leads.js +565 -0
  539. package/dist/team-runtime.d.ts +27 -0
  540. package/dist/team-runtime.js +264 -0
  541. package/dist/team-ui.d.ts +3 -0
  542. package/dist/team-ui.js +9 -0
  543. package/dist/team-updates.d.ts +8 -0
  544. package/dist/team-updates.js +57 -0
  545. package/dist/teammate-admin.d.ts +53 -0
  546. package/dist/teammate-admin.js +111 -0
  547. package/dist/teammate-desk.d.ts +60 -0
  548. package/dist/teammate-desk.js +154 -0
  549. package/dist/teammate-memory.d.ts +64 -0
  550. package/dist/teammate-memory.js +196 -0
  551. package/dist/teammate-question.d.ts +59 -0
  552. package/dist/teammate-question.js +175 -0
  553. package/dist/teammate-tools.d.ts +108 -0
  554. package/dist/teammate-tools.js +271 -0
  555. package/dist/teammate-week.d.ts +68 -0
  556. package/dist/teammate-week.js +132 -0
  557. package/dist/teammate-work.d.ts +76 -0
  558. package/dist/teammate-work.js +280 -0
  559. package/dist/teammates-ui.d.ts +20 -0
  560. package/dist/teammates-ui.js +166 -0
  561. package/dist/teammates.d.ts +180 -0
  562. package/dist/teammates.js +253 -0
  563. package/dist/teams-api.d.ts +33 -0
  564. package/dist/teams-api.js +204 -0
  565. package/dist/teams-chat.d.ts +26 -0
  566. package/dist/teams-chat.js +215 -0
  567. package/dist/teams-settings.d.ts +12 -0
  568. package/dist/teams-settings.js +57 -0
  569. package/dist/teams.d.ts +21 -0
  570. package/dist/teams.js +124 -0
  571. package/dist/telegram-flow.d.ts +49 -0
  572. package/dist/telegram-flow.js +110 -0
  573. package/dist/telegram-mate.d.ts +137 -0
  574. package/dist/telegram-mate.js +707 -0
  575. package/dist/telegram-progress.d.ts +14 -0
  576. package/dist/telegram-progress.js +129 -0
  577. package/dist/telegram-settings.d.ts +9 -0
  578. package/dist/telegram-settings.js +36 -0
  579. package/dist/telegram-status.d.ts +75 -0
  580. package/dist/telegram-status.js +265 -0
  581. package/dist/telegram-team.d.ts +85 -0
  582. package/dist/telegram-team.js +359 -0
  583. package/dist/telegram.d.ts +230 -0
  584. package/dist/telegram.js +1931 -0
  585. package/dist/templates.d.ts +65 -0
  586. package/dist/templates.js +118 -0
  587. package/dist/tool-launcher.d.ts +1 -0
  588. package/dist/tool-launcher.js +101 -0
  589. package/dist/tools-ui.d.ts +30 -0
  590. package/dist/tools-ui.js +40 -0
  591. package/dist/transitions-recipes.d.ts +1 -0
  592. package/dist/transitions-recipes.js +203 -0
  593. package/dist/tree-proof.d.ts +34 -0
  594. package/dist/tree-proof.js +58 -0
  595. package/dist/verification-evidence.d.ts +44 -0
  596. package/dist/verification-evidence.js +238 -0
  597. package/dist/version.d.ts +2 -0
  598. package/dist/version.js +10 -0
  599. package/dist/webhooks.d.ts +91 -0
  600. package/dist/webhooks.js +283 -0
  601. package/dist/work-index.d.ts +68 -0
  602. package/dist/work-index.js +384 -0
  603. package/dist/work-summary.d.ts +57 -0
  604. package/dist/work-summary.js +116 -0
  605. package/dist/workspace-motion.d.ts +4 -0
  606. package/dist/workspace-motion.js +133 -0
  607. package/dist/workspace-revision.d.ts +19 -0
  608. package/dist/workspace-revision.js +92 -0
  609. package/dist/workspace-ui.d.ts +204 -0
  610. package/dist/workspace-ui.js +411 -0
  611. package/dist/worktree-notices.d.ts +13 -0
  612. package/dist/worktree-notices.js +17 -0
  613. package/dist/worktree.d.ts +249 -0
  614. package/dist/worktree.js +720 -0
  615. package/package.json +122 -0
  616. package/scripts/canary-assertions.mjs +42 -0
  617. package/scripts/crash-canary.mjs +253 -0
  618. package/scripts/fixtures/crash-process.mjs +74 -0
  619. package/scripts/fixtures/pilot-scenarios.mjs +85 -0
  620. package/scripts/fixtures/restart-service.mjs +27 -0
  621. package/scripts/launchd-certification.mjs +143 -0
  622. package/scripts/pilot.mjs +121 -0
  623. package/scripts/proof-preflight.mjs +140 -0
  624. package/scripts/provider-canary.mjs +379 -0
  625. package/scripts/recovery-canary.mjs +135 -0
  626. package/scripts/restart-certification.mjs +98 -0
@@ -0,0 +1,42 @@
1
+ import type { Store } from "./store.js";
2
+ declare const verifiedApproverBrand: unique symbol;
3
+ export type VerifiedApprover = {
4
+ readonly [verifiedApproverBrand]: true;
5
+ readonly name: string;
6
+ /** The approver row's credential generation at mint; re-proved on every use. */
7
+ readonly generation: number;
8
+ /** The admitted repos, in the surface's own order — `r1..rN` maps by index. */
9
+ readonly repos: readonly string[];
10
+ readonly ceilingDigest: string;
11
+ };
12
+ /** The mate's ceiling digest: the admitted repos IN ORDER, hashed — `rN`
13
+ * is an index, so two surfaces naming the same repos in a different order
14
+ * hold different ceilings (slice-2 review, finding 3). */
15
+ export declare function ceilingDigestOf(repos: readonly string[]): string;
16
+ /** True only for an object this module minted — never for a structural copy. */
17
+ export declare function isVerifiedApprover(value: unknown): value is VerifiedApprover;
18
+ export type PrincipalRefusal = {
19
+ ok: false;
20
+ reason: "no-approvers" | "unknown" | "revoked" | "locked" | "not-an-approver" | "generation" | "forged";
21
+ };
22
+ /** The password road: the CLI, and any ceremony that retypes it. */
23
+ export declare function verifyApproverByPassword(store: Store, name: string, token: string, repos: readonly string[]): {
24
+ ok: true;
25
+ who: VerifiedApprover;
26
+ } | PrincipalRefusal;
27
+ /**
28
+ * The session road: the edge has already proved the cookie, csrf, and the
29
+ * origin, and holds the generation the session was opened under. This
30
+ * re-proves the ROW — present, an approver, not revoked, SAME generation —
31
+ * so a name alone mints nothing, and a credential rotation since the
32
+ * session opened ends the principal.
33
+ */
34
+ export declare function verifyApproverStanding(store: Store, name: string, generation: number, repos: readonly string[]): {
35
+ ok: true;
36
+ who: VerifiedApprover;
37
+ } | PrincipalRefusal;
38
+ /** Re-prove a principal minted earlier: minted here, intact, same row, same generation, still an approver. */
39
+ export declare function reproveApprover(store: Store, who: VerifiedApprover): {
40
+ ok: true;
41
+ } | PrincipalRefusal;
42
+ export {};
@@ -0,0 +1,82 @@
1
+ /**
2
+ * The branded approver principal (mate arc, ruling 3).
3
+ *
4
+ * Every act the mate proposes and every confirmation an operator taps
5
+ * runs under a principal that PROVES it was authenticated — a password
6
+ * ceremony, or a cookie session the edge already proved (csrf, role,
7
+ * generation) and this module re-proves against the approver row. The
8
+ * maker is module-private and the brand is RUNTIME (slice-1 review,
9
+ * finding 3): a principal is frozen at mint and remembered in a private
10
+ * set, so a structural look-alike, a mutated copy, or a repos list edited
11
+ * after the fact is refused by `isVerifiedApprover` and `reproveApprover`.
12
+ * The ceiling rides on it — the admitted repos and their digest — so a
13
+ * principal minted on one surface can never read or confirm on another's
14
+ * wider or narrower view.
15
+ */
16
+ import { createHash } from "node:crypto";
17
+ import { authenticateAccount } from "./scope.js";
18
+ /** The mate's ceiling digest: the admitted repos IN ORDER, hashed — `rN`
19
+ * is an index, so two surfaces naming the same repos in a different order
20
+ * hold different ceilings (slice-2 review, finding 3). */
21
+ export function ceilingDigestOf(repos) {
22
+ return createHash("sha256").update(repos.join("\n")).digest("hex");
23
+ }
24
+ /** Every principal this process minted. Membership IS the brand at runtime. */
25
+ const minted = new WeakSet();
26
+ function verified(row) {
27
+ const who = Object.freeze({
28
+ name: row.name,
29
+ generation: row.generation,
30
+ repos: Object.freeze([...row.repos]),
31
+ ceilingDigest: ceilingDigestOf(row.repos),
32
+ });
33
+ minted.add(who);
34
+ return who;
35
+ }
36
+ /** True only for an object this module minted — never for a structural copy. */
37
+ export function isVerifiedApprover(value) {
38
+ return typeof value === "object" && value !== null && minted.has(value);
39
+ }
40
+ /** The password road: the CLI, and any ceremony that retypes it. */
41
+ export function verifyApproverByPassword(store, name, token, repos) {
42
+ const account = authenticateAccount(store, name, token);
43
+ if (!account.ok)
44
+ return { ok: false, reason: account.reason };
45
+ if (account.role !== "approver")
46
+ return { ok: false, reason: "not-an-approver" };
47
+ return { ok: true, who: verified({ name, generation: account.generation, repos }) };
48
+ }
49
+ /**
50
+ * The session road: the edge has already proved the cookie, csrf, and the
51
+ * origin, and holds the generation the session was opened under. This
52
+ * re-proves the ROW — present, an approver, not revoked, SAME generation —
53
+ * so a name alone mints nothing, and a credential rotation since the
54
+ * session opened ends the principal.
55
+ */
56
+ export function verifyApproverStanding(store, name, generation, repos) {
57
+ const account = store.accountOf(name);
58
+ if (account === null)
59
+ return { ok: false, reason: "unknown" };
60
+ if (account.revokedAt !== null)
61
+ return { ok: false, reason: "revoked" };
62
+ if (account.role !== "approver")
63
+ return { ok: false, reason: "not-an-approver" };
64
+ if (account.generation !== generation)
65
+ return { ok: false, reason: "generation" };
66
+ return { ok: true, who: verified({ name, generation: account.generation, repos }) };
67
+ }
68
+ /** Re-prove a principal minted earlier: minted here, intact, same row, same generation, still an approver. */
69
+ export function reproveApprover(store, who) {
70
+ if (!isVerifiedApprover(who) || ceilingDigestOf(who.repos) !== who.ceilingDigest)
71
+ return { ok: false, reason: "forged" };
72
+ const account = store.accountOf(who.name);
73
+ if (account === null)
74
+ return { ok: false, reason: "unknown" };
75
+ if (account.revokedAt !== null)
76
+ return { ok: false, reason: "revoked" };
77
+ if (account.role !== "approver")
78
+ return { ok: false, reason: "not-an-approver" };
79
+ if (account.generation !== who.generation)
80
+ return { ok: false, reason: "generation" };
81
+ return { ok: true };
82
+ }
@@ -0,0 +1,46 @@
1
+ /**
2
+ * Asking an environment whether it has what the work needs.
3
+ *
4
+ * A probe is an operator-authored command line whose exit 0 means "present
5
+ * and alive": `gh auth status`, `test -n "$SUPABASE_KEY"`. It runs through
6
+ * a real shell, deliberately — the design's own examples need expansion and
7
+ * `test` — and that is safe only because of who wrote it: probes are stored
8
+ * by the operator, at `cap add`, with the author recorded. Nothing an agent
9
+ * or a scanned repository writes is ever executed as a probe; the scanner
10
+ * synthesizes probes from a fixed template over validated identifiers or
11
+ * stores none at all.
12
+ *
13
+ * The answer is a claim about one machine at one moment. `verified` carries
14
+ * when and by whom; anything else carries the probe's own words — "exit 1",
15
+ * "timed out", "sh not found" — because collapsing those to a bit discards
16
+ * exactly what tells an operator whether to paste a key or fix a PATH.
17
+ */
18
+ import { type ExecResult, type RunOptions } from "./exec.js";
19
+ import { type Capability, type Store } from "./store.js";
20
+ export type Runner = (file: string, args: readonly string[], options?: RunOptions) => Promise<ExecResult>;
21
+ /** Probes are cheap questions; one that hangs is already an answer. */
22
+ export declare const PROBE_TIMEOUT_MS = 10000;
23
+ export type ProbeOutcome = {
24
+ kind: Capability["kind"];
25
+ name: string;
26
+ status: "verified" | "failed" | "unprobed";
27
+ /** The probe's words when it did not say yes. */
28
+ detail?: string;
29
+ };
30
+ /**
31
+ * Whether a capability is verified *right now*: a stale yes is not a yes.
32
+ * Presence is not enough, and neither is a verification whose expiry passed.
33
+ */
34
+ export declare function isVerified(capability: Capability, now: Date): boolean;
35
+ /** Run one capability's probe and record what it said. */
36
+ export declare function probeOne(store: Store, capability: Capability, by: string, now: Date, runner?: Runner, env?: Record<string, string>): Promise<ProbeOutcome>;
37
+ /**
38
+ * Probe a repo's capabilities — all of them, or the named subset. Statuses
39
+ * land in the store as each probe answers; the returned outcomes are for
40
+ * reporting, not the source of truth.
41
+ */
42
+ export declare function probeRepo(store: Store, repo: string, by: string, now: Date, options?: {
43
+ runner?: Runner;
44
+ only?: ReadonlySet<string>;
45
+ env?: Record<string, string>;
46
+ }): Promise<ProbeOutcome[]>;
package/dist/probe.js ADDED
@@ -0,0 +1,79 @@
1
+ /**
2
+ * Asking an environment whether it has what the work needs.
3
+ *
4
+ * A probe is an operator-authored command line whose exit 0 means "present
5
+ * and alive": `gh auth status`, `test -n "$SUPABASE_KEY"`. It runs through
6
+ * a real shell, deliberately — the design's own examples need expansion and
7
+ * `test` — and that is safe only because of who wrote it: probes are stored
8
+ * by the operator, at `cap add`, with the author recorded. Nothing an agent
9
+ * or a scanned repository writes is ever executed as a probe; the scanner
10
+ * synthesizes probes from a fixed template over validated identifiers or
11
+ * stores none at all.
12
+ *
13
+ * The answer is a claim about one machine at one moment. `verified` carries
14
+ * when and by whom; anything else carries the probe's own words — "exit 1",
15
+ * "timed out", "sh not found" — because collapsing those to a bit discards
16
+ * exactly what tells an operator whether to paste a key or fix a PATH.
17
+ */
18
+ import { run, NOT_FOUND_CODE, OVERFLOW_CODE, TIMEOUT_CODE, } from "./exec.js";
19
+ import {} from "./store.js";
20
+ /** Probes are cheap questions; one that hangs is already an answer. */
21
+ export const PROBE_TIMEOUT_MS = 10_000;
22
+ /**
23
+ * Whether a capability is verified *right now*: a stale yes is not a yes.
24
+ * Presence is not enough, and neither is a verification whose expiry passed.
25
+ */
26
+ export function isVerified(capability, now) {
27
+ if (capability.status !== "verified")
28
+ return false;
29
+ if (capability.expiresAt === null)
30
+ return true;
31
+ return capability.expiresAt > now.toISOString();
32
+ }
33
+ /** Run one capability's probe and record what it said. */
34
+ export async function probeOne(store, capability, by, now, runner = run, env) {
35
+ const { kind, name } = capability;
36
+ if (capability.probe === null) {
37
+ // Nothing can vouch for it, and nobody may vouch by hand (§3: presence
38
+ // is not enough — an assertion is even less). It stays a visible gap.
39
+ return { kind, name, status: "unprobed", detail: "no probe — only a probe can verify" };
40
+ }
41
+ const asked = await runner("sh", ["-lc", capability.probe], {
42
+ cwd: capability.repo,
43
+ timeoutMs: PROBE_TIMEOUT_MS,
44
+ ...(env === undefined ? {} : { env }),
45
+ });
46
+ if (asked.code === 0) {
47
+ store.markCapability(capability.repo, kind, name, { status: "verified", by }, now);
48
+ return { kind, name, status: "verified" };
49
+ }
50
+ const detail = describe(asked);
51
+ store.markCapability(capability.repo, kind, name, { status: "failed", by, detail }, now);
52
+ return { kind, name, status: "failed", detail };
53
+ }
54
+ /**
55
+ * Probe a repo's capabilities — all of them, or the named subset. Statuses
56
+ * land in the store as each probe answers; the returned outcomes are for
57
+ * reporting, not the source of truth.
58
+ */
59
+ export async function probeRepo(store, repo, by, now, options = {}) {
60
+ const outcomes = [];
61
+ for (const capability of store.listCapabilities(repo)) {
62
+ if (options.only !== undefined && !options.only.has(`${capability.kind}:${capability.name}`)) {
63
+ continue;
64
+ }
65
+ outcomes.push(await probeOne(store, capability, by, now, options.runner ?? run, options.env));
66
+ }
67
+ return outcomes;
68
+ }
69
+ function describe(result) {
70
+ if (result.timedOut || result.code === TIMEOUT_CODE) {
71
+ return `timed out after ${PROBE_TIMEOUT_MS / 1000}s`;
72
+ }
73
+ if (result.notFound || result.code === NOT_FOUND_CODE)
74
+ return "sh not found";
75
+ if (result.code === OVERFLOW_CODE)
76
+ return "output too large";
77
+ const stderr = result.stderr.split("\n")[0]?.trim() ?? "";
78
+ return stderr === "" ? `exit ${result.code}` : `exit ${result.code} — ${stderr}`;
79
+ }
@@ -0,0 +1,17 @@
1
+ import type { ObservedProcess, ProcessObservationFailure } from "./process-tree.js";
2
+ import type { Store } from "./store.js";
3
+ import type { ExecResult, RunOptions } from "./exec.js";
4
+ /** Existing append-only ledger; a diagnostic is not exit evidence. */
5
+ export declare function recordProcessObservationFailure(store: Store, runId: number, now: Date, failure: ProcessObservationFailure): void;
6
+ /** Preserve observed IDs through the existing serialized write boundary. This
7
+ * writes process facts only; it does not declare exit or replay observers. */
8
+ export declare function preserveObservedProcesses(store: Store, runId: number, now: Date, rows: readonly ObservedProcess[]): boolean;
9
+ type Runner = (file: string, args: readonly string[], options?: RunOptions) => Promise<ExecResult>;
10
+ /** Reserve each spawn before the OS call. A crash before its PID is recorded
11
+ * leaves an explicit unknown, even if earlier setup/check processes exited.
12
+ * Only the returning transport can certify that its reserved spawn made no child.
13
+ * Retained PIDs are read-only witnesses, never authority to signal a process.
14
+ * A native OS object (v53) rides the same witness: named at the spawn, and
15
+ * marked empty only when the OS proved it so — never on a transport exit. */
16
+ export declare function witnessedRunner(store: Store, runId: number, clock: () => Date, runner: Runner): Runner;
17
+ export {};
@@ -0,0 +1,91 @@
1
+ /** Existing append-only ledger; a diagnostic is not exit evidence. */
2
+ export function recordProcessObservationFailure(store, runId, now, failure) {
3
+ const run = store.getRun(runId);
4
+ const ref = run === null ? null : store.refById(run.taskRef);
5
+ store.recordAction({ at: now.toISOString(), actor: run?.runner ?? "system", repo: ref?.repo ?? null,
6
+ taskId: ref?.externalId ?? null, runId, action: "process observation failed", source: "work",
7
+ outcome: JSON.stringify(failure) });
8
+ }
9
+ /** Preserve observed IDs through the existing serialized write boundary. This
10
+ * writes process facts only; it does not declare exit or replay observers. */
11
+ export function preserveObservedProcesses(store, runId, now, rows) {
12
+ const first = rows[0];
13
+ if (!first)
14
+ return false;
15
+ // Reserve BEFORE waiting for the batch transaction. A crash/rollback leaves
16
+ // this new guard intact; no old unknown witness is reused or cleared.
17
+ const witness = store.reserveRunProcess(runId, now, first.group);
18
+ store.transact(() => {
19
+ store.recordRunProcess(runId, first.pid, now, first.group, witness);
20
+ for (const row of rows.slice(1))
21
+ store.recordRunProcess(runId, row.pid, now, row.group);
22
+ });
23
+ return true;
24
+ }
25
+ /** Reserve each spawn before the OS call. A crash before its PID is recorded
26
+ * leaves an explicit unknown, even if earlier setup/check processes exited.
27
+ * Only the returning transport can certify that its reserved spawn made no child.
28
+ * Retained PIDs are read-only witnesses, never authority to signal a process.
29
+ * A native OS object (v53) rides the same witness: named at the spawn, and
30
+ * marked empty only when the OS proved it so — never on a transport exit. */
31
+ export function witnessedRunner(store, runId, clock, runner) {
32
+ return async (file, args, options = {}) => {
33
+ const witnesses = [];
34
+ let unknown = false;
35
+ let native = false;
36
+ const result = await runner(file, args, {
37
+ ...options,
38
+ onDescendant: (pid, group) => {
39
+ store.recordRunProcess(runId, pid, clock(), group);
40
+ options.onDescendant?.(pid, group);
41
+ },
42
+ // External custody callbacks retain the conservative failure path;
43
+ // replaying them could repeat non-idempotent side effects.
44
+ onDescendantWriteFailure: rows => options.onDescendant === undefined
45
+ && preserveObservedProcesses(store, runId, clock(), rows),
46
+ onDescendantExit: (pid, group) => {
47
+ store.recordRunProcessExits(runId, clock(), { pid, group });
48
+ options.onDescendantExit?.(pid, group);
49
+ },
50
+ onObservationFailure: failure => {
51
+ recordProcessObservationFailure(store, runId, clock(), failure);
52
+ options.onObservationFailure?.(failure);
53
+ },
54
+ onUnknown: () => {
55
+ if (!native && !unknown) {
56
+ store.reserveRunProcess(runId, clock(), true);
57
+ unknown = true;
58
+ }
59
+ options.onUnknown?.();
60
+ },
61
+ beforeSpawn: () => {
62
+ if (options.beforeSpawn?.() === false)
63
+ return false;
64
+ native = false;
65
+ witnesses.push(store.reserveRunProcess(runId, clock(), options.processGroup === true));
66
+ return true;
67
+ },
68
+ onSpawn: pid => {
69
+ store.recordRunProcess(runId, pid, clock(), options.processGroup === true, witnesses.at(-1));
70
+ options.onSpawn?.(pid);
71
+ },
72
+ onContainer: info => {
73
+ native = true;
74
+ const witness = witnesses.at(-1);
75
+ if (witness !== undefined)
76
+ store.recordRunContainer(witness, info.backend, info.id, info.identity);
77
+ options.onContainer?.(info);
78
+ },
79
+ onContainerEmpty: () => {
80
+ const witness = witnesses.at(-1);
81
+ if (witness !== undefined)
82
+ store.markRunContainerEmpty(witness, clock());
83
+ options.onContainerEmpty?.();
84
+ },
85
+ });
86
+ for (const witness of witnesses)
87
+ store.finishUnspawnedProcess(witness, clock());
88
+ store.recordRunProcessExits(runId, clock());
89
+ return result;
90
+ };
91
+ }
@@ -0,0 +1,10 @@
1
+ type HistoricalWitness = {
2
+ observedAt: unknown;
3
+ finishedAt: unknown;
4
+ };
5
+ /** Read-only checks of retained process witnesses. Saved PIDs authorize no
6
+ * signal. ESRCH or proven macOS PID reuse establishes absence; everything
7
+ * unknown stays occupied. This concerns the historical identity, not whether
8
+ * the numeric PID/PGID is currently populated by unrelated processes. */
9
+ export declare function processMayBeAlive(pid: number, group: boolean, witness?: HistoricalWitness): boolean;
10
+ export {};
@@ -0,0 +1,81 @@
1
+ import { execFileSync } from "node:child_process";
2
+ /** Only the exact UTC millisecond format stored by the writer is evidence. */
3
+ function timestamp(value) {
4
+ if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/.test(value))
5
+ return null;
6
+ const ms = Date.parse(value);
7
+ return Number.isFinite(ms) && new Date(ms).toISOString() === value ? ms : null;
8
+ }
9
+ function newerMacProcess(pid, witness) {
10
+ if (process.platform !== "darwin" || witness === undefined)
11
+ return false;
12
+ const observed = timestamp(witness.observedAt), finished = timestamp(witness.finishedAt);
13
+ if (observed === null || finished === null)
14
+ return false;
15
+ try {
16
+ // lstart has whole-second precision. Fix locale AND timezone; never let
17
+ // Date.parse guess either, or normalize an invalid calendar date.
18
+ const raw = execFileSync("/bin/ps", ["-p", String(pid), "-o", "lstart="], {
19
+ encoding: "utf8", env: { ...process.env, LC_ALL: "C", TZ: "UTC" },
20
+ stdio: ["ignore", "pipe", "ignore"], maxBuffer: 1024,
21
+ // Bound only this owned diagnostic child, never an agent or task.
22
+ // A stalled/oversized lookup throws and leaves the witness occupied.
23
+ timeout: 1_000, killSignal: "SIGKILL",
24
+ }).trim().replace(/ +/g, " ");
25
+ const match = /^(Sun|Mon|Tue|Wed|Thu|Fri|Sat) (Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec) (\d{1,2}) (\d{2}:\d{2}:\d{2}) (\d{4})$/.exec(raw);
26
+ if (match === null)
27
+ return false;
28
+ const utc = `${match[1]}, ${match[3].padStart(2, "0")} ${match[2]} ${match[5]} ${match[4]} GMT`;
29
+ const start = Date.parse(utc);
30
+ if (!Number.isFinite(start) || new Date(start).toUTCString() !== utc || start > Date.now())
31
+ return false;
32
+ // The displayed second is a lower bound, not a rounded millisecond
33
+ // identity. Same-second observations are ambiguous. Reservations can
34
+ // precede spawn, so also require birth AFTER the owning run ended.
35
+ return start > Math.max(observed, finished);
36
+ }
37
+ catch {
38
+ return false;
39
+ }
40
+ }
41
+ /** Read-only checks of retained process witnesses. Saved PIDs authorize no
42
+ * signal. ESRCH or proven macOS PID reuse establishes absence; everything
43
+ * unknown stays occupied. This concerns the historical identity, not whether
44
+ * the numeric PID/PGID is currently populated by unrelated processes. */
45
+ export function processMayBeAlive(pid, group, witness) {
46
+ if (!Number.isSafeInteger(pid) || pid <= 0)
47
+ return true;
48
+ if (group && process.platform !== "win32") {
49
+ let absent = false;
50
+ try {
51
+ process.kill(-pid, 0);
52
+ }
53
+ catch (error) {
54
+ const code = error.code;
55
+ if (code === "ESRCH")
56
+ absent = true;
57
+ else if (code !== "EPERM")
58
+ return true;
59
+ }
60
+ // Darwin's forkproc excludes existing PIDs, PGIDs and session IDs under
61
+ // proc_list_lock. A proven newer PID EQUAL to the saved PGID therefore
62
+ // implies the old group ended before allocation, even if a new group now
63
+ // uses that number. A new member or an absent leader proves nothing.
64
+ // See docs/assessments/UPDATE_PID_REUSE_2026-09-15.md, recovery attempt 2.
65
+ if (!absent)
66
+ return !newerMacProcess(pid, witness);
67
+ }
68
+ try {
69
+ process.kill(pid, 0);
70
+ }
71
+ catch (error) {
72
+ const code = error.code;
73
+ if (code === "ESRCH")
74
+ return false;
75
+ if (code !== "EPERM")
76
+ return true;
77
+ // Signal permission and readable birth identity are independent. EPERM
78
+ // alone proves nothing; a failed/ambiguous ps read still stays occupied.
79
+ }
80
+ return !newerMacProcess(pid, witness);
81
+ }
@@ -0,0 +1,75 @@
1
+ import type { SQLInputValue } from "node:sqlite";
2
+ import type { DarwinCoalitionProcessIdentity, PreparedDarwinProcessCensus } from "./process-recovery-native.js";
3
+ /** This version's causal argument was audited against these installed bytes:
4
+ * up registers a fresh token BEFORE listening; every watch creates a fresh UUID;
5
+ * heartbeat authenticates that closure's token and exact owner transactionally.
6
+ * A new runtime needs its own audit, not a caller assertion of equivalent code. */
7
+ export declare const SERVICE_ANCHOR_RUNTIME_V1_SHA256 = "9641efcb3b46717a7f122aa025e3945a08fa55ca046605276825a9d69eefd01d";
8
+ export type DarwinServiceAnchorInput = {
9
+ databasePath: string;
10
+ targetRun: number;
11
+ anchorReviewerRun: number;
12
+ runtime: string;
13
+ runtimeSha256: string;
14
+ runner: string;
15
+ repo: string;
16
+ host: string;
17
+ bootId: string;
18
+ resourceCoalitionId: string;
19
+ service: string;
20
+ supervisorPid: number;
21
+ workerPid: number;
22
+ port: number;
23
+ /** Full expected arrays; compared privately, never included in a receipt. */
24
+ supervisorArgv: string[];
25
+ workerArgv: string[];
26
+ /** Recovery must prepare this helper itself from the known embedded source;
27
+ * never accept an executable or this result receipt from a client request. */
28
+ native: PreparedDarwinProcessCensus;
29
+ maxWaitMs?: number;
30
+ };
31
+ export type DarwinServiceAnchorReceipt = {
32
+ schema: 1;
33
+ kind: "authenticated-watch-continuity";
34
+ targetRun: number;
35
+ anchorReviewerRun: number;
36
+ host: string;
37
+ bootId: string;
38
+ observedAt: string;
39
+ runtimeSha256: string;
40
+ databasePath: string;
41
+ runner: string;
42
+ repo: string;
43
+ owner: string;
44
+ generation: number;
45
+ episode: number;
46
+ registeredAt: string;
47
+ heartbeatBefore: string;
48
+ heartbeatAfter: string;
49
+ service: string;
50
+ listener: string;
51
+ worker: DarwinCoalitionProcessIdentity;
52
+ supervisor: DarwinCoalitionProcessIdentity;
53
+ nativeSourceSha256: string;
54
+ nativeExecutableSha256: string;
55
+ };
56
+ export type DarwinServiceAnchorResult = {
57
+ ok: true;
58
+ receipt: DarwinServiceAnchorReceipt;
59
+ } | {
60
+ ok: false;
61
+ reason: string;
62
+ };
63
+ export type RecoveryReadDatabase = {
64
+ prepare(sql: string): {
65
+ get(...parameters: SQLInputValue[]): Record<string, unknown> | undefined;
66
+ all(...parameters: SQLInputValue[]): Record<string, unknown>[];
67
+ };
68
+ };
69
+ /** Trusted read-only collection, not exit evidence. Reads an existing connection
70
+ * (including a schema69 Store.handle), never opens/migrates or writes a database.
71
+ * Under the trusted installed-code/credential model, renewing a saved pre-run
72
+ * UUID while registration stays fixed establishes a pre-run live service bound.
73
+ * It does NOT establish coalition inheritance, survivor exclusion, or authority
74
+ * to clear process custody. Every incomplete observation returns a refusal. */
75
+ export declare function collectDarwinServiceAnchor(db: RecoveryReadDatabase, input: DarwinServiceAnchorInput): Promise<DarwinServiceAnchorResult>;