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,188 @@
1
+ import { execFileSync } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { lstatSync, readFileSync, readdirSync, realpathSync } from "node:fs";
4
+ import { join } from "node:path";
5
+ import { normalizeBootId } from "./boot-identity.js";
6
+ import { changedDarwinProcessIdentities, collectDarwinCoalitionSnapshot, DARWIN_PROCESS_CENSUS_SOURCE } from "./process-recovery-native.js";
7
+ /** This version's causal argument was audited against these installed bytes:
8
+ * up registers a fresh token BEFORE listening; every watch creates a fresh UUID;
9
+ * heartbeat authenticates that closure's token and exact owner transactionally.
10
+ * A new runtime needs its own audit, not a caller assertion of equivalent code. */
11
+ export const SERVICE_ANCHOR_RUNTIME_V1_SHA256 = "9641efcb3b46717a7f122aa025e3945a08fa55ca046605276825a9d69eefd01d";
12
+ const hash = (value) => createHash("sha256").update(value).digest("hex");
13
+ const positive = (value) => Number.isSafeInteger(value) && Number(value) > 0;
14
+ const text = (value) => typeof value === "string" && value.length > 0 && !/[\x00-\x1f\x7f]/.test(value);
15
+ const instant = (value) => typeof value === "string" && Number.isFinite(Date.parse(value));
16
+ const uuid = (value) => typeof value === "string" && normalizeBootId(value) === value;
17
+ const uint64 = (value) => /^[1-9][0-9]{0,19}$/.test(value) && BigInt(value) <= 0xffffffffffffffffn;
18
+ const environment = { PATH: "/usr/bin:/bin:/usr/sbin:/sbin", LC_ALL: "C", TZ: "UTC" };
19
+ function runtimeFingerprint(root) {
20
+ const files = [];
21
+ const walk = (directory, prefix = "") => {
22
+ for (const name of readdirSync(directory).sort()) {
23
+ const path = join(directory, name), relative = prefix + name, stat = lstatSync(path);
24
+ if (stat.isSymbolicLink())
25
+ throw Error("runtime-unreadable");
26
+ if (stat.isDirectory())
27
+ walk(path, relative + "/");
28
+ else if (stat.isFile())
29
+ files.push([relative, hash(readFileSync(path))]);
30
+ else
31
+ throw Error("runtime-unreadable");
32
+ }
33
+ };
34
+ walk(root);
35
+ if (!files.length)
36
+ throw Error("runtime-unreadable");
37
+ return hash(JSON.stringify(files));
38
+ }
39
+ const readCommand = (file, argv) => execFileSync(file, argv, {
40
+ encoding: "utf8", env: environment, timeout: 5000, maxBuffer: 4 * 1024 * 1024, stdio: ["ignore", "pipe", "pipe"],
41
+ });
42
+ function observeService(input) {
43
+ if (runtimeFingerprint(input.runtime) !== input.runtimeSha256)
44
+ throw Error("runtime-changed");
45
+ const job = readCommand("/bin/launchctl", ["print", input.service]);
46
+ // Only direct job fields count. Nested environment and diagnostic sections
47
+ // can contain arbitrary similarly named strings and are never returned.
48
+ if (job.match(/^\tpid = (\d+)$/m)?.[1] !== String(input.supervisorPid) || !/^\tstate = running$/m.test(job))
49
+ throw Error("managed-service-changed");
50
+ for (const [pid, expected] of [[input.supervisorPid, input.supervisorArgv], [input.workerPid, input.workerArgv]]) {
51
+ if (readCommand("/bin/ps", ["-ww", "-p", String(pid), "-o", "args="]).trim() !== expected.join(" "))
52
+ throw Error("service-command-changed");
53
+ }
54
+ const listener = readCommand("/usr/sbin/lsof", ["-nP", "-iTCP:" + input.port, "-sTCP:LISTEN", "-Fpn"]);
55
+ const pids = [...listener.matchAll(/^p(\d+)$/gm)].map(one => Number(one[1]));
56
+ const names = [...listener.matchAll(/^n(.+)$/gm)].map(one => one[1]);
57
+ if (!pids.length || pids.some(pid => pid !== input.workerPid) || !names.length || names.some(name => name !== `127.0.0.1:${input.port}`))
58
+ throw Error("listener-owner-changed");
59
+ }
60
+ // One SELECT is a consistent read snapshot. No credential leaves this module;
61
+ // its hash is used only to reject a registration/authority change while waiting.
62
+ const stateSql = `SELECT t.id target_id, t.started_at target_started, t.finished_at target_finished, t.outcome target_outcome,
63
+ a.id anchor_id, a.role anchor_role, a.runner anchor_runner, a.watch_incarnation anchor_owner,
64
+ a.started_at anchor_started, a.finished_at anchor_finished, a.outcome anchor_outcome,
65
+ ar.repo anchor_repo, a.parent_run source_run, p.verdict source_verdict,
66
+ (SELECT count(*) FROM criterion_review c WHERE c.reviewer_run=a.id AND c.source_run=a.parent_run) review_count,
67
+ (SELECT count(*) FROM criterion_review c WHERE c.reviewer_run=a.id AND (c.source_run<>a.parent_run OR c.judgement<>'upholds')) bad_reviews,
68
+ w.owner, w.generation, w.heartbeat_at heartbeat, w.expires_at expires,
69
+ e.id episode, e.started_at episode_started, e.ended_at episode_ended,
70
+ n.registered_at registered, n.credential_hash credential, n.retired_at retired, n.host runner_host, n.repos runner_repos
71
+ FROM run t JOIN run a ON a.id=? JOIN task_ref ar ON ar.id=a.task_ref
72
+ JOIN watch_lease w ON w.runner=a.runner AND w.repo=ar.repo
73
+ JOIN watch_episode e ON e.incarnation=w.owner AND e.runner=w.runner AND e.repo=w.repo
74
+ JOIN runner n ON n.name=w.runner LEFT JOIN proof_verdict p ON p.run=a.parent_run WHERE t.id=?`;
75
+ // Saved history alone is not a live anchor: collection also requires an unchanged
76
+ // credential epoch/incarnation across an authenticated heartbeat and native identities.
77
+ function readState(db, input, now) {
78
+ const row = db.prepare(stateSql).get(input.anchorReviewerRun, input.targetRun);
79
+ if (!row || row["target_id"] !== input.targetRun || row["anchor_id"] !== input.anchorReviewerRun ||
80
+ input.anchorReviewerRun >= input.targetRun || row["anchor_role"] !== "reviewer" || row["anchor_outcome"] !== "no-change" ||
81
+ row["anchor_runner"] !== input.runner || row["anchor_repo"] !== input.repo || row["runner_host"] !== input.host ||
82
+ !uuid(row["owner"]) || row["anchor_owner"] !== row["owner"] || !positive(row["generation"]) || !positive(row["episode"]) ||
83
+ row["episode_ended"] !== null || row["retired"] !== null || row["source_verdict"] !== "verified" ||
84
+ !positive(row["review_count"]) || row["bad_reviews"] !== 0 || !text(row["credential"]) ||
85
+ !["registered", "episode_started", "anchor_started", "anchor_finished", "target_started", "target_finished", "heartbeat", "expires"].every(key => instant(row[key])) ||
86
+ !["built", "no-change"].includes(String(row["target_outcome"])))
87
+ throw Error("watch-history-unproven");
88
+ const r = row;
89
+ const times = [r.registered, r["episode_started"], r["anchor_started"], r["anchor_finished"], r["target_started"], r["target_finished"], r.heartbeat].map(value => Date.parse(String(value)));
90
+ if (times.some((time, i) => i > 0 && time < times[i - 1]) || Date.parse(r.heartbeat) > now || Date.parse(r.expires) <= now || Date.parse(r.expires) <= Date.parse(r.heartbeat))
91
+ throw Error("watch-history-unproven");
92
+ const repos = JSON.parse(String(r["runner_repos"]));
93
+ if (!Array.isArray(repos) || !repos.includes(input.repo))
94
+ throw Error("watch-history-unproven");
95
+ return r;
96
+ }
97
+ const staticState = ({ heartbeat: _heartbeat, expires: _expires, ...row }) => JSON.stringify(row);
98
+ function anchored(snapshot, input) {
99
+ if (!snapshot.complete || !snapshot.stable || snapshot.errors.length || snapshot.anchorIdentityChanges.length ||
100
+ snapshot.host !== input.host || normalizeBootId(snapshot.bootId ?? "") !== input.bootId || snapshot.resourceCoalitionId !== input.resourceCoalitionId ||
101
+ snapshot.nativeSourceSha256 !== input.native.sourceSha256 || snapshot.nativeExecutableSha256 !== input.native.executableSha256 ||
102
+ snapshot.anchorPids.length !== 2 || !snapshot.anchorPids.includes(input.workerPid) || !snapshot.anchorPids.includes(input.supervisorPid))
103
+ throw Error("native-anchor-unproven");
104
+ const worker = snapshot.anchors.find(row => row.pid === input.workerPid), supervisor = snapshot.anchors.find(row => row.pid === input.supervisorPid);
105
+ if (!worker?.uniqueId || !supervisor?.uniqueId || worker.traced !== false || supervisor.traced !== false ||
106
+ worker.ppid !== supervisor.pid || worker.parentUniqueId !== supervisor.uniqueId || BigInt(supervisor.uniqueId) >= BigInt(worker.uniqueId) || worker.uid !== supervisor.uid ||
107
+ worker.executable !== input.workerArgv[0] || supervisor.executable !== input.supervisorArgv[0])
108
+ throw Error("native-anchor-unproven");
109
+ return [worker, supervisor];
110
+ }
111
+ /** Trusted read-only collection, not exit evidence. Reads an existing connection
112
+ * (including a schema69 Store.handle), never opens/migrates or writes a database.
113
+ * Under the trusted installed-code/credential model, renewing a saved pre-run
114
+ * UUID while registration stays fixed establishes a pre-run live service bound.
115
+ * It does NOT establish coalition inheritance, survivor exclusion, or authority
116
+ * to clear process custody. Every incomplete observation returns a refusal. */
117
+ export async function collectDarwinServiceAnchor(db, input) {
118
+ let phase = "invalid-anchor-input";
119
+ try {
120
+ const wait = input.maxWaitMs ?? 60_000;
121
+ if (process.platform !== "darwin" || input.runtimeSha256 !== SERVICE_ANCHOR_RUNTIME_V1_SHA256 || input.native.sourceSha256 !== hash(DARWIN_PROCESS_CENSUS_SOURCE) ||
122
+ ![input.targetRun, input.anchorReviewerRun, input.supervisorPid, input.workerPid, input.port].every(positive) ||
123
+ input.workerPid === input.supervisorPid || input.port > 65535 || !uuid(input.bootId) || !uint64(input.resourceCoalitionId) ||
124
+ ![input.databasePath, input.runtime, input.runner, input.repo, input.host].every(text) ||
125
+ !/^(system|gui\/[0-9]+)\/[A-Za-z0-9._-]+$/.test(input.service) || !Number.isSafeInteger(wait) || wait < 0 || wait > 60_000 ||
126
+ [input.runtime, input.databasePath, input.repo].some(path => realpathSync(path) !== path) ||
127
+ ![input.workerArgv, input.supervisorArgv].every(args => Array.isArray(args) && args.length > 2 && args.every(arg => text(arg) && !/\s/.test(arg))))
128
+ return { ok: false, reason: phase };
129
+ const args = input.workerArgv;
130
+ const flag = (name, value) => args.filter(arg => arg === name).length === 1 && args[args.indexOf(name) + 1] === value;
131
+ if (args[1] !== join(input.runtime, "cli.js") || args[2] !== "up" ||
132
+ !flag("--db", input.databasePath) || !flag("--repo", input.repo) || !flag("--runner", input.runner) ||
133
+ !flag("--port", String(input.port)) || !flag("--host", "127.0.0.1") ||
134
+ input.supervisorArgv[1] !== join(input.runtime, "controller-service.js") ||
135
+ JSON.stringify(input.supervisorArgv.slice(2)) !== JSON.stringify(args))
136
+ return { ok: false, reason: phase };
137
+ phase = "database-binding-unproven";
138
+ const main = db.prepare("PRAGMA database_list").all().filter(row => row["name"] === "main");
139
+ if (main.length !== 1 || main[0]?.["file"] !== input.databasePath)
140
+ throw Error(phase);
141
+ const witnesses = db.prepare("SELECT DISTINCT host, boot_id FROM run_process WHERE run=?").all(input.targetRun);
142
+ if (!witnesses.length || witnesses.some(row => row["host"] !== input.host || typeof row["boot_id"] !== "string" || normalizeBootId(row["boot_id"]) !== input.bootId))
143
+ throw Error(phase);
144
+ phase = "watch-history-unproven";
145
+ const initial = readState(db, input, Date.now()), fixed = staticState(initial);
146
+ phase = "native-anchor-unproven";
147
+ const capture = () => collectDarwinCoalitionSnapshot({ native: input.native, resourceCoalitionId: input.resourceCoalitionId, anchorPids: [input.workerPid, input.supervisorPid], maxAttempts: 3 });
148
+ const before = anchored(await capture(), input);
149
+ phase = "service-observation-unproven";
150
+ observeService(input);
151
+ phase = "watch-renewal-unproven";
152
+ const deadline = performance.now() + wait;
153
+ let advanced;
154
+ for (;;) {
155
+ advanced = readState(db, input, Date.now());
156
+ if (staticState(advanced) !== fixed || Date.parse(advanced.heartbeat) < Date.parse(initial.heartbeat))
157
+ throw Error("watch-incarnation-changed");
158
+ if (Date.parse(advanced.heartbeat) > Date.parse(initial.heartbeat))
159
+ break;
160
+ const left = deadline - performance.now();
161
+ if (left <= 0)
162
+ throw Error("watch-renewal-not-observed");
163
+ await new Promise(resolve => setTimeout(resolve, Math.min(1000, left)));
164
+ }
165
+ phase = "service-observation-unproven";
166
+ observeService(input);
167
+ phase = "native-anchor-unproven";
168
+ const after = anchored(await capture(), input);
169
+ if (changedDarwinProcessIdentities(before, after).length || before.some((row, i) => row.resourceCoalitionId !== after[i]?.resourceCoalitionId))
170
+ throw Error("service-identity-changed");
171
+ phase = "watch-renewal-unproven";
172
+ const final = readState(db, input, Date.now());
173
+ if (staticState(final) !== fixed || Date.parse(final.heartbeat) < Date.parse(advanced.heartbeat))
174
+ throw Error("watch-incarnation-changed");
175
+ return { ok: true, receipt: { schema: 1, kind: "authenticated-watch-continuity", targetRun: input.targetRun,
176
+ anchorReviewerRun: input.anchorReviewerRun, host: input.host, bootId: input.bootId, observedAt: new Date().toISOString(),
177
+ runtimeSha256: input.runtimeSha256, databasePath: input.databasePath, runner: input.runner, repo: input.repo,
178
+ owner: initial.owner, generation: initial.generation, episode: initial.episode, registeredAt: initial.registered,
179
+ heartbeatBefore: initial.heartbeat, heartbeatAfter: final.heartbeat, service: input.service, listener: `127.0.0.1:${input.port}`,
180
+ worker: after[0], supervisor: after[1], nativeSourceSha256: input.native.sourceSha256, nativeExecutableSha256: input.native.executableSha256 } };
181
+ }
182
+ catch (error) {
183
+ // Never forward subprocess/SQLite error objects: they may retain argv,
184
+ // launchd environment text, paths or credential-bearing row values.
185
+ const known = new Set(["runtime-changed", "managed-service-changed", "service-command-changed", "listener-owner-changed", "watch-history-unproven", "native-anchor-unproven", "watch-incarnation-changed", "watch-renewal-not-observed", "service-identity-changed"]);
186
+ return { ok: false, reason: error instanceof Error && known.has(error.message) ? error.message : phase };
187
+ }
188
+ }
@@ -0,0 +1,25 @@
1
+ import type { DarwinCoalitionRecoverySnapshot } from "./process-recovery-native.js";
2
+ import { type PreexistingAppService } from "./process-recovery-services.js";
3
+ import type { ProcessRecoveryAnchor, ProcessRecoveryAssessment } from "./process-recovery.js";
4
+ /** A current coalition inventory supplies membership, not historical authority.
5
+ * Before calling, independently authenticate that the terminal run inherited
6
+ * sourceRoot's resource coalition, could not select another coalition or delegate
7
+ * a launch, and has no remaining producer. All known owned processes must have
8
+ * positive exit evidence. A lost direct spawn is not an observer gap.
9
+ *
10
+ * Independently authenticate that preRunUpperBound's exact STILL-LIVE identity
11
+ * existed before the run could spawn. This can be a causally bound live service;
12
+ * calendar birth times, numeric PIDs, names and absent restart logs do not count.
13
+ * XNU assigns increasing 64-bit process IDs at fork and preserves them at exec.
14
+ * IDs no greater than that authenticated bound therefore predate the run.
15
+ * The native collector must revalidate this anchor alongside its counter seal.
16
+ * This pure assessment never records an exit or authorizes a database mutation. */
17
+ export declare function assessDarwinCoalitionRecovery(args: {
18
+ host: string;
19
+ bootId: string;
20
+ resourceCoalitionId: string;
21
+ sourceRoot: ProcessRecoveryAnchor;
22
+ preRunUpperBound: ProcessRecoveryAnchor;
23
+ snapshot: DarwinCoalitionRecoverySnapshot;
24
+ preexistingAppServices?: readonly PreexistingAppService[];
25
+ }): ProcessRecoveryAssessment;
@@ -0,0 +1,105 @@
1
+ import { createHash } from "node:crypto";
2
+ import { normalizeBootId } from "./boot-identity.js";
3
+ import { APP_SERVICE_EXECUTABLE, APP_SERVICE_PLATFORM } from "./process-recovery-services.js";
4
+ const uint64 = (value) => typeof value === "string" && /^(0|[1-9][0-9]{0,19})$/.test(value) && BigInt(value) <= 0xffffffffffffffffn;
5
+ const identity = (value) => uint64(value) && value !== "0";
6
+ const anchorValid = (value) => Number.isSafeInteger(value.pid) && value.pid > 1 && identity(value.uniqueId);
7
+ /** A current coalition inventory supplies membership, not historical authority.
8
+ * Before calling, independently authenticate that the terminal run inherited
9
+ * sourceRoot's resource coalition, could not select another coalition or delegate
10
+ * a launch, and has no remaining producer. All known owned processes must have
11
+ * positive exit evidence. A lost direct spawn is not an observer gap.
12
+ *
13
+ * Independently authenticate that preRunUpperBound's exact STILL-LIVE identity
14
+ * existed before the run could spawn. This can be a causally bound live service;
15
+ * calendar birth times, numeric PIDs, names and absent restart logs do not count.
16
+ * XNU assigns increasing 64-bit process IDs at fork and preserves them at exec.
17
+ * IDs no greater than that authenticated bound therefore predate the run.
18
+ * The native collector must revalidate this anchor alongside its counter seal.
19
+ * This pure assessment never records an exit or authorizes a database mutation. */
20
+ export function assessDarwinCoalitionRecovery(args) {
21
+ const s = args.snapshot;
22
+ const refuse = (problem, unresolved = []) => ({ ok: false, problems: [problem], unresolved });
23
+ const boot = normalizeBootId(args.bootId);
24
+ if (!boot || !s.bootId || normalizeBootId(s.bootId) !== boot || s.host !== args.host || !args.host ||
25
+ !identity(args.resourceCoalitionId) || s.resourceCoalitionId !== args.resourceCoalitionId)
26
+ return refuse("The process inventory does not match the authenticated host, boot and resource coalition.");
27
+ if (!anchorValid(args.sourceRoot) || !anchorValid(args.preRunUpperBound))
28
+ return refuse("The historical process identities are missing or malformed.");
29
+ if (s.schema !== 1 || !s.complete || !s.stable || !s.kernelTableRead || !s.countersStable || s.unreadableMembershipCount !== 0 || s.errors.length || s.identityChanges.length || s.anchorIdentityChanges.length)
30
+ return refuse("The target process inventory or its external anchor changed during observation.");
31
+ const before = s.counterBefore, after = s.counterAfter;
32
+ if (!before || !after || !uint64(before.tasksStarted) || !uint64(before.tasksExited) ||
33
+ before.tasksStarted !== after.tasksStarted || before.tasksExited !== after.tasksExited ||
34
+ BigInt(before.tasksStarted) < BigInt(before.tasksExited) ||
35
+ BigInt(before.tasksStarted) - BigInt(before.tasksExited) !== BigInt(s.processes.length))
36
+ return refuse("Kernel task counters do not establish a complete target inventory.");
37
+ const rows = new Map(s.processes.map(row => [row.pid, row]));
38
+ if (!rows.size || rows.size !== s.processes.length || new Set(s.processes.map(row => row.uniqueId)).size !== rows.size ||
39
+ s.processes.some(row => !Number.isSafeInteger(row.pid) || row.pid < 1 || !identity(row.uniqueId) || row.resourceCoalitionId !== s.resourceCoalitionId))
40
+ return refuse("The target inventory contains missing or ambiguous process identities.");
41
+ const source = rows.get(args.sourceRoot.pid);
42
+ if (source?.uniqueId !== args.sourceRoot.uniqueId || source.traced !== false)
43
+ return refuse("The original execution service is no longer the authenticated kernel identity.");
44
+ const anchorRows = s.anchors.filter(row => row.pid === args.preRunUpperBound.pid);
45
+ if (s.anchorPids.filter(pid => pid === args.preRunUpperBound.pid).length !== 1 || anchorRows.length !== 1 ||
46
+ anchorRows[0].uniqueId !== args.preRunUpperBound.uniqueId || anchorRows[0].traced !== false)
47
+ return refuse("The pre-run service identity was not independently revalidated by the native collector.");
48
+ const collector = s.collector;
49
+ if (!collector || collector.exited !== true || rows.get(collector.pid)?.uniqueId !== collector.uniqueId)
50
+ return refuse("The owned diagnostic process has no bound positive exit evidence.");
51
+ const bound = BigInt(args.preRunUpperBound.uniqueId);
52
+ const services = new Map();
53
+ for (const binding of args.preexistingAppServices ?? []) {
54
+ const service = rows.get(binding.pid), owner = rows.get(binding.ownerPid);
55
+ const signing = binding.ownerSigning;
56
+ const recognizedOwner = typeof binding.ownerExecutable === "string" &&
57
+ (binding.ownerExecutable === "/Applications/Google Chrome.app/Contents/MacOS/Google Chrome" ? signing === null :
58
+ createHash("sha256").update(binding.ownerExecutable).digest("hex") === APP_SERVICE_PLATFORM.clonePathSha256 &&
59
+ signing?.identifier === "com.google.Chrome" && signing.teamId === "EQHXZ8M8AV" &&
60
+ signing.cdHash === APP_SERVICE_PLATFORM.cloneCdHash && signing.dynamicallyVerified === true);
61
+ if (services.has(binding.pid) || !identity(binding.uniqueId) || !identity(binding.ownerUniqueId) ||
62
+ service?.uniqueId !== binding.uniqueId || owner?.uniqueId !== binding.ownerUniqueId || service.pid === owner.pid ||
63
+ service.traced !== false || owner.traced !== false || BigInt(owner.uniqueId) > bound || BigInt(owner.uniqueId) >= BigInt(service.uniqueId) ||
64
+ !recognizedOwner || owner.executable !== binding.ownerExecutable || !Number.isInteger(binding.ownerPidVersion) ||
65
+ binding.ownerPidVersion <= 0 || owner.pidVersion !== binding.ownerPidVersion ||
66
+ service.uid !== binding.uid || owner.uid !== binding.uid || binding.uid === null ||
67
+ service.resourceCoalitionId !== binding.resourceCoalitionId || owner.resourceCoalitionId !== binding.resourceCoalitionId ||
68
+ service.executable !== binding.executable || binding.executable !== APP_SERVICE_EXECUTABLE || binding.domain !== `pid/${owner.pid}` ||
69
+ s.osRelease !== APP_SERVICE_PLATFORM.osRelease || JSON.stringify(binding.platform) !== JSON.stringify(APP_SERVICE_PLATFORM)) {
70
+ return refuse("A collected app service does not match its pre-existing owner and final kernel identities.");
71
+ }
72
+ services.set(binding.pid, binding);
73
+ }
74
+ const external = new Map();
75
+ const visiting = new Set();
76
+ const visit = (pid) => {
77
+ if (external.has(pid))
78
+ return true;
79
+ if (visiting.has(pid))
80
+ return false;
81
+ const row = rows.get(pid);
82
+ if (!row || row.traced !== false)
83
+ return false;
84
+ const accept = (basis, anchor) => { external.set(pid, { pid, basis, anchor }); return true; };
85
+ if (pid === collector.pid && row.uniqueId === collector.uniqueId)
86
+ return accept("owned-probe", pid);
87
+ if (BigInt(row.uniqueId) <= bound)
88
+ return accept("predates-run", args.preRunUpperBound.pid);
89
+ const service = services.get(pid);
90
+ if (service)
91
+ return accept("pre-existing-app-service", service.ownerPid);
92
+ if (!row.ppid || row.ppid <= 1 || row.ppid === pid || !identity(row.parentUniqueId))
93
+ return false;
94
+ const parent = rows.get(row.ppid);
95
+ if (!parent || parent.uniqueId !== row.parentUniqueId || BigInt(parent.uniqueId) >= BigInt(row.uniqueId))
96
+ return false;
97
+ visiting.add(pid);
98
+ const found = visit(parent.pid);
99
+ visiting.delete(pid);
100
+ return found ? accept("ancestry", external.get(parent.pid).anchor) : false;
101
+ };
102
+ const unresolved = s.processes.filter(row => !visit(row.pid)).map(row => row.pid).sort((a, b) => a - b);
103
+ return unresolved.length ? refuse("Some processes could still be unobserved descendants of the completed run.", unresolved)
104
+ : { ok: true, observedAt: s.finishedAt, external: [...external.values()].sort((a, b) => a.pid - b.pid) };
105
+ }
@@ -0,0 +1,178 @@
1
+ import type { Store } from "./store.js";
2
+ export type RecoveryWitnessSnapshot = Readonly<{
3
+ id: number;
4
+ run: number;
5
+ pid: number | null;
6
+ host: string;
7
+ process_group: number;
8
+ observed_at: string;
9
+ exited_at: string | null;
10
+ boot_id: string | null;
11
+ containment: string | null;
12
+ container: string | null;
13
+ container_identity: string | null;
14
+ container_empty_at: string | null;
15
+ }>;
16
+ export declare function preparedCandidateObserverGapEligibility(store: Store, input: {
17
+ runId: number;
18
+ evidenceRoot: string;
19
+ now: Date;
20
+ /** Authenticated current kernel context supplied by the caller, not a row's
21
+ * own host/boot copied back to it. Unknown identity refuses. */
22
+ host: string;
23
+ bootId: string | null;
24
+ }): {
25
+ readonly ok: true;
26
+ readonly digest: string;
27
+ readonly binding: {
28
+ readonly version: 1;
29
+ readonly kind: "prepared-candidate-observer-gap-eligibility";
30
+ readonly host: string;
31
+ readonly bootId: string;
32
+ readonly run: {
33
+ id: number;
34
+ taskRef: number;
35
+ taskId: string;
36
+ repo: string;
37
+ leaseId: string;
38
+ role: "builder";
39
+ outcome: "built" | "no-change";
40
+ committed: boolean | null;
41
+ startedAt: string;
42
+ finishedAt: string;
43
+ branch: string;
44
+ worktree: string;
45
+ base: string;
46
+ head: string;
47
+ };
48
+ readonly scope: {
49
+ candidate: string;
50
+ digest: string;
51
+ approvedAt: string;
52
+ approvedBy: string;
53
+ approvalBasis: "mode" | "password";
54
+ modeDigest: string | null;
55
+ };
56
+ readonly command: {
57
+ readonly id: number;
58
+ readonly repo: string;
59
+ readonly command: string;
60
+ readonly timeoutMs: number;
61
+ readonly digest: string;
62
+ readonly recoverySetupDigest: string | null;
63
+ readonly approvedBy: string;
64
+ readonly approvedAt: string;
65
+ readonly revokedAt: string | null;
66
+ readonly revokedBy: string | null;
67
+ };
68
+ readonly machine: {
69
+ readonly run: number;
70
+ readonly verdict: "verified" | "attested" | "short" | "refuted";
71
+ readonly reasons: readonly string[];
72
+ readonly decidedAt: string;
73
+ readonly matrix: readonly {
74
+ readonly assessment?: {
75
+ readonly evidenceState: import("./proof.js").CriterionMatrixState;
76
+ readonly detail: readonly string[];
77
+ };
78
+ readonly id: string;
79
+ readonly statement: string;
80
+ readonly requiredEvidence: readonly import("./scope.js").EvidenceKind[];
81
+ readonly state: import("./proof.js").CriterionMatrixState;
82
+ readonly detail: readonly string[];
83
+ readonly answered: readonly {
84
+ readonly kind: import("./scope.js").EvidenceKind;
85
+ readonly ref: string;
86
+ }[];
87
+ readonly review: {
88
+ readonly judgement: import("./proof.js").CriterionJudgementWord;
89
+ readonly note: string;
90
+ readonly author: string;
91
+ } | null;
92
+ readonly coverage?: {
93
+ readonly state: "patch" | "context" | "gap";
94
+ readonly inherited: boolean;
95
+ readonly items: readonly string[];
96
+ readonly gaps: readonly string[];
97
+ readonly priorSupport: "eligible" | "invalid" | "none";
98
+ };
99
+ }[];
100
+ readonly machineVerdict: import("./store.js").ProofVerdictRow["verdict"] | null;
101
+ };
102
+ readonly gateDigest: string;
103
+ readonly gate: {
104
+ readonly id: number;
105
+ readonly run: number;
106
+ readonly kind: "base-tree" | "check-log" | "diff" | "diff-stat" | "handoff" | "park-payload" | "plan" | "plan-contract" | "proof" | "report" | "review-context" | "revision-brief" | "screenshot" | "status" | "structured-output" | "terminal-diff";
107
+ readonly key: string;
108
+ readonly sha256: string;
109
+ readonly bytesOriginal: number;
110
+ readonly bytesStored: number;
111
+ readonly truncated: boolean;
112
+ readonly redacted: boolean;
113
+ readonly capture: string;
114
+ readonly captureStatus: "failed" | "ok" | null;
115
+ readonly createdAt: string;
116
+ };
117
+ readonly log: {
118
+ readonly id: number;
119
+ readonly run: number;
120
+ readonly kind: "base-tree" | "check-log" | "diff" | "diff-stat" | "handoff" | "park-payload" | "plan" | "plan-contract" | "proof" | "report" | "review-context" | "revision-brief" | "screenshot" | "status" | "structured-output" | "terminal-diff";
121
+ readonly key: string;
122
+ readonly sha256: string;
123
+ readonly bytesOriginal: number;
124
+ readonly bytesStored: number;
125
+ readonly truncated: boolean;
126
+ readonly redacted: boolean;
127
+ readonly capture: string;
128
+ readonly captureStatus: "failed" | "ok" | null;
129
+ readonly createdAt: string;
130
+ };
131
+ readonly handoff: {
132
+ readonly id: number;
133
+ readonly run: number;
134
+ readonly kind: "base-tree" | "check-log" | "diff" | "diff-stat" | "handoff" | "park-payload" | "plan" | "plan-contract" | "proof" | "report" | "review-context" | "revision-brief" | "screenshot" | "status" | "structured-output" | "terminal-diff";
135
+ readonly key: string;
136
+ readonly sha256: string;
137
+ readonly bytesOriginal: number;
138
+ readonly bytesStored: number;
139
+ readonly truncated: boolean;
140
+ readonly redacted: boolean;
141
+ readonly capture: string;
142
+ readonly captureStatus: "failed" | "ok" | null;
143
+ readonly createdAt: string;
144
+ };
145
+ readonly ownedRuns: readonly {
146
+ readonly id: number;
147
+ readonly taskRef: number;
148
+ readonly leaseId: string;
149
+ readonly parentRun: number | null;
150
+ readonly role: "builder" | "planner" | "repair" | "reviewer" | "scout";
151
+ readonly outcome: "built" | "failed" | "interrupted" | "no-change" | "parked" | "refused";
152
+ readonly startedAt: string;
153
+ readonly finishedAt: string;
154
+ readonly providerStartedAt: null;
155
+ readonly sessionId: null;
156
+ }[];
157
+ readonly unknownWitnessIds: readonly number[];
158
+ readonly witnesses: readonly {
159
+ readonly id: number;
160
+ readonly run: number;
161
+ readonly pid: number | null;
162
+ readonly host: string;
163
+ readonly process_group: number;
164
+ readonly observed_at: string;
165
+ readonly exited_at: string | null;
166
+ readonly boot_id: string | null;
167
+ readonly containment: string | null;
168
+ readonly container: string | null;
169
+ readonly container_identity: string | null;
170
+ readonly container_empty_at: string | null;
171
+ }[];
172
+ };
173
+ readonly requires: "separate-authenticated-spawn-provenance-and-complete-os-census";
174
+ } | {
175
+ ok: false;
176
+ reason: string;
177
+ };
178
+ export type PreparedCandidateObserverGapEligibility = ReturnType<typeof preparedCandidateObserverGapEligibility>;