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,592 @@
1
+ import { spawn, execFileSync } from "node:child_process";
2
+ import { createHash } from "node:crypto";
3
+ import { chmodSync, lstatSync, mkdirSync, mkdtempSync, readFileSync, realpathSync, writeFileSync } from "node:fs";
4
+ import { hostname, release } from "node:os";
5
+ import { join } from "node:path";
6
+ const digest = (data) => createHash("sha256").update(data).digest("hex");
7
+ const cleanEnv = { PATH: "/usr/bin:/bin:/usr/sbin:/sbin", LC_ALL: "C", TZ: "UTC" };
8
+ /** Facts only. Public KERN_PROC_ALL supplies birth/UID/trace metadata without
9
+ * reading argv or environments. XNU's flavor 17 supplies 64-bit identities:
10
+ * https://github.com/apple-oss-distributions/xnu/blob/main/bsd/sys/proc_info_private.h
11
+ * p_puniqueid can change on orphan exec; original-parent version is diagnostic
12
+ * only (32-bit wrap is possible). No recovery authority lives in this helper. */
13
+ export const DARWIN_PROCESS_CENSUS_SOURCE = String.raw `
14
+ #include <sys/types.h>
15
+ #include <sys/sysctl.h>
16
+ #include <sys/proc.h>
17
+ #include <libproc.h>
18
+ #include <stdint.h>
19
+ #include <inttypes.h>
20
+ #include <stdio.h>
21
+ #include <stdlib.h>
22
+ #include <string.h>
23
+ #include <unistd.h>
24
+ #include <errno.h>
25
+ #include <limits.h>
26
+ struct identity_info {
27
+ unsigned char uuid[16]; uint64_t uniqueid, parent_uniqueid;
28
+ int32_t idversion, original_parent_version; uint64_t reserved[2];
29
+ };
30
+ _Static_assert(sizeof(struct identity_info) == 56, "identity ABI size");
31
+ struct coalition_info { uint64_t resource, jetsam, reserved[3]; };
32
+ struct usage_prefix { uint64_t started, exited, time_nonempty, cpu_time; };
33
+ extern int coalition_info_resource_usage(uint64_t, struct usage_prefix *, size_t);
34
+ static uint64_t target_coalition = 0;
35
+ static int anchor_pids[8] = {0}, anchor_count = 0;
36
+ static int is_anchor(pid_t pid) { for (int i = 0; i < anchor_count; i++) if (anchor_pids[i] == pid) return 1; return 0; }
37
+ static int read_usage(struct usage_prefix *usage) {
38
+ return coalition_info_resource_usage(target_coalition, usage, sizeof(*usage)) == 0 && usage->started >= usage->exited;
39
+ }
40
+ static void quoted(const char *s) {
41
+ putchar('"');
42
+ for (const unsigned char *p = (const unsigned char *)s; *p; ++p) {
43
+ if (*p == '"' || *p == '\\') { putchar('\\'); putchar(*p); }
44
+ else if (*p < 32 || *p >= 127) printf("\\u%04x", *p);
45
+ else putchar(*p);
46
+ }
47
+ putchar('"');
48
+ }
49
+ static void capture(void) {
50
+ struct usage_prefix usage_before = {0}, usage_after = {0};
51
+ int usage_before_ok = !target_coalition || read_usage(&usage_before);
52
+ unsigned int membership_unreadable = 0, target_count = 0, anchors_seen = 0;
53
+ int mib[] = { CTL_KERN, KERN_PROC, KERN_PROC_ALL, 0 };
54
+ size_t bytes = 0; int ok = sysctl(mib, 4, NULL, &bytes, NULL, 0) == 0;
55
+ size_t capacity = bytes + 256 * sizeof(struct kinfo_proc);
56
+ struct kinfo_proc *rows = ok ? calloc(1, capacity) : NULL;
57
+ if (!rows) ok = 0;
58
+ bytes = capacity;
59
+ if (ok && sysctl(mib, 4, rows, &bytes, NULL, 0) != 0) ok = 0;
60
+ if (ok && bytes % sizeof(struct kinfo_proc) != 0) ok = 0;
61
+ char boot[128] = {0}; size_t bootlen = sizeof(boot);
62
+ int boot_ok = sysctlbyname("kern.bootsessionuuid", boot, &bootlen, NULL, 0) == 0 && bootlen > 1 && bootlen <= sizeof(boot);
63
+ boot[sizeof(boot)-1] = 0;
64
+ printf("{\"schema\":1,\"bootId\":"); if (boot_ok) quoted(boot); else printf("null");
65
+ printf(",\"collectorPid\":%d,\"processes\":[", getpid());
66
+ int first = 1, identities_ok = 1;
67
+ size_t count = ok ? bytes / sizeof(struct kinfo_proc) : 0;
68
+ for (size_t i = 0; i < count; ++i) {
69
+ struct kinfo_proc *r = &rows[i]; pid_t pid = r->kp_proc.p_pid;
70
+ /* PID 0 is the kernel. SZOMB is positive kernel exit state, not a
71
+ membership read failure; flavor 20 deliberately cannot query zombies. */
72
+ if (pid <= 0 || r->kp_proc.p_stat == SZOMB) continue;
73
+ struct identity_info id = {0}; uint64_t row_resource = 0; int anchor = is_anchor(pid);
74
+ int identified = proc_pidinfo(pid, 17, 0, &id, sizeof(id)) == sizeof(id) && id.uniqueid != 0;
75
+ if (target_coalition) {
76
+ struct coalition_info coalition = {0};
77
+ errno = 0;
78
+ if (proc_pidinfo(pid, 20, 0, &coalition, sizeof(coalition)) != sizeof(coalition)) {
79
+ /* Never infer that an unreadable PID is foreign from aggregate task
80
+ counts: a retiring task may retain its coalition ID after removal.
81
+ Only fresh positive absence, not EPERM or a failed read, is safe. */
82
+ int membership_errno = errno;
83
+ struct identity_info still_live = {0};
84
+ errno = 0;
85
+ if (membership_errno == ESRCH && proc_pidinfo(pid, 17, 0, &still_live, sizeof(still_live)) <= 0 && errno == ESRCH) continue;
86
+ membership_unreadable++; continue;
87
+ }
88
+ row_resource = coalition.resource;
89
+ if (row_resource != target_coalition && !anchor) continue;
90
+ if (row_resource == target_coalition) target_count++;
91
+ if (anchor) anchors_seen++;
92
+ struct identity_info after_id = {0};
93
+ struct coalition_info after_coalition = {0};
94
+ if (proc_pidinfo(pid, 17, 0, &after_id, sizeof(after_id)) != sizeof(after_id) ||
95
+ proc_pidinfo(pid, 20, 0, &after_coalition, sizeof(after_coalition)) != sizeof(after_coalition) ||
96
+ after_id.uniqueid != id.uniqueid || after_id.parent_uniqueid != id.parent_uniqueid ||
97
+ after_coalition.resource != row_resource) identified = 0;
98
+ }
99
+ if (!identified) identities_ok = 0;
100
+ char path[PROC_PIDPATHINFO_MAXSIZE] = {0};
101
+ int path_ok = proc_pidpath(pid, path, sizeof(path)) > 0;
102
+ if (!first) putchar(','); first = 0;
103
+ printf("{\"pid\":%d,\"ppid\":%d,\"uid\":%u,\"birthMs\":%.3f,\"traced\":%s,\"uniqueId\":", pid, r->kp_eproc.e_ppid, r->kp_eproc.e_ucred.cr_uid,
104
+ (double)r->kp_proc.p_starttime.tv_sec * 1000.0 + (double)r->kp_proc.p_starttime.tv_usec / 1000.0,
105
+ (r->kp_proc.p_flag & P_TRACED) ? "true" : "false");
106
+ if (identified) printf("\"%" PRIu64 "\"", id.uniqueid); else printf("null");
107
+ printf(",\"parentUniqueId\":"); if (identified) printf("\"%" PRIu64 "\"", id.parent_uniqueid); else printf("null");
108
+ printf(",\"pidVersion\":%" PRIu32, (uint32_t)id.idversion);
109
+ printf(",\"originalParentVersion\":"); if (identified) printf("%" PRIu32, (uint32_t)id.original_parent_version); else printf("null");
110
+ printf(",\"executable\":"); if (path_ok) quoted(path); else printf("null"); if (target_coalition) printf(",\"resourceCoalitionId\":\"%" PRIu64 "\"", row_resource); putchar('}');
111
+ }
112
+ int usage_after_ok = !target_coalition || read_usage(&usage_after);
113
+ int counters_stable = !target_coalition || (usage_before_ok && usage_after_ok && usage_before.started == usage_after.started && usage_before.exited == usage_after.exited);
114
+ int anchors_readable = anchors_seen == (unsigned int)anchor_count;
115
+ int count_matches = !target_coalition || (usage_before_ok && usage_before.started - usage_before.exited == target_count);
116
+ printf("]");
117
+ if (target_coalition) {
118
+ printf(",\"anchorPids\":[");
119
+ for (int i = 0; i < anchor_count; i++) printf("%s%d", i ? "," : "", anchor_pids[i]);
120
+ printf("]");
121
+ printf(",\"resourceCoalitionId\":\"%" PRIu64 "\",\"counterBefore\":", target_coalition);
122
+ if (usage_before_ok) printf("{\"tasksStarted\":\"%" PRIu64 "\",\"tasksExited\":\"%" PRIu64 "\"}", usage_before.started, usage_before.exited); else printf("null");
123
+ printf(",\"counterAfter\":");
124
+ if (usage_after_ok) printf("{\"tasksStarted\":\"%" PRIu64 "\",\"tasksExited\":\"%" PRIu64 "\"}", usage_after.started, usage_after.exited); else printf("null");
125
+ printf(",\"kernelTableRead\":%s,\"unreadableMembershipCount\":%u", ok ? "true" : "false", membership_unreadable);
126
+ }
127
+ printf(",\"complete\":%s,\"errors\":[", ok && identities_ok && boot_ok && counters_stable && count_matches && anchors_readable && !membership_unreadable ? "true" : "false");
128
+ int comma = 0;
129
+ if (!ok) { printf("\"kernel-process-table-unreadable\""); comma = 1; }
130
+ if (membership_unreadable) { printf("%s\"process-membership-unreadable\"", comma ? "," : ""); comma = 1; }
131
+ if (!identities_ok) { printf("%s\"process-identity-unreadable\"", comma ? "," : ""); comma = 1; }
132
+ if (!boot_ok) { printf("%s\"boot-identity-unreadable\"", comma ? "," : ""); comma = 1; }
133
+ if (!usage_before_ok || !usage_after_ok) { printf("%s\"coalition-counters-unreadable\"", comma ? "," : ""); comma = 1; }
134
+ if (!counters_stable) { printf("%s\"coalition-counters-changed\"", comma ? "," : ""); comma = 1; }
135
+ if (!anchors_readable) { printf("%s\"anchor-identity-unreadable\"", comma ? "," : ""); comma = 1; }
136
+ if (!count_matches) printf("%s\"coalition-count-mismatch\"", comma ? "," : "");
137
+ printf("]}\n"); fflush(stdout); free(rows);
138
+ }
139
+ int main(int argc, char **argv) {
140
+ if (argc != 1) {
141
+ if (argc < 3 || argc > 11 || strcmp(argv[1], "--coalition") != 0 || !argv[2][0] || argv[2][0] == '0') return 2;
142
+ for (char *p = argv[2]; *p; ++p) if (*p < '0' || *p > '9') return 2;
143
+ errno = 0; char *end = NULL; target_coalition = strtoull(argv[2], &end, 10);
144
+ if (errno || !end || *end || !target_coalition) return 2;
145
+ for (int i = 3; i < argc; i++) {
146
+ if (!argv[i][0] || argv[i][0] == '0') return 2;
147
+ for (char *p = argv[i]; *p; ++p) if (*p < '0' || *p > '9') return 2;
148
+ errno = 0; long pid = strtol(argv[i], &end, 10);
149
+ if (errno || !end || *end || pid <= 0 || pid > INT_MAX || is_anchor((pid_t)pid)) return 2;
150
+ anchor_pids[anchor_count++] = (int)pid;
151
+ }
152
+ }
153
+ capture();
154
+ char command[32] = {0};
155
+ if (!fgets(command, sizeof(command), stdin) || strcmp(command, "recheck\n") != 0) return 2;
156
+ capture(); return 0;
157
+ }
158
+ `;
159
+ /** Compilation is explicit, local, and separate from read-only collection. */
160
+ export function prepareDarwinProcessCensus(directory) {
161
+ if (process.platform !== "darwin")
162
+ throw new Error("Darwin process census is unavailable on this platform.");
163
+ mkdirSync(directory, { recursive: true, mode: 0o700 });
164
+ const location = mkdtempSync(join(realpathSync(directory), "process-census-"));
165
+ chmodSync(location, 0o700);
166
+ const sourcePath = join(location, "census.c"), executablePath = join(location, "census");
167
+ writeFileSync(sourcePath, DARWIN_PROCESS_CENSUS_SOURCE, { mode: 0o600, flag: "wx" });
168
+ try {
169
+ execFileSync("/usr/bin/clang", ["-std=c11", "-O2", "-Wall", "-Wextra", "-Werror", sourcePath, "-o", executablePath, "-lproc"], { env: cleanEnv, stdio: "pipe", timeout: 30_000 });
170
+ }
171
+ catch {
172
+ throw new Error("Darwin census compilation failed; no process recovery was attempted.");
173
+ }
174
+ chmodSync(executablePath, 0o500);
175
+ return { sourcePath, executablePath, sourceSha256: digest(DARWIN_PROCESS_CENSUS_SOURCE), executableSha256: digest(readFileSync(executablePath)) };
176
+ }
177
+ function validateNative(native) {
178
+ for (const path of [native.sourcePath, native.executablePath]) {
179
+ const stat = lstatSync(path);
180
+ if (!stat.isFile() || stat.isSymbolicLink() || stat.uid !== process.getuid?.() || (stat.mode & 0o022) !== 0 || realpathSync(path) !== path)
181
+ throw new Error("untrusted-census-file");
182
+ }
183
+ if (native.sourceSha256 !== digest(DARWIN_PROCESS_CENSUS_SOURCE) || digest(readFileSync(native.sourcePath)) !== native.sourceSha256 || digest(readFileSync(native.executablePath)) !== native.executableSha256)
184
+ throw new Error("census-file-changed");
185
+ }
186
+ const isInt = (value, minimum = 0) => typeof value === "number" && Number.isSafeInteger(value) && value >= minimum;
187
+ const isId = (value) => typeof value === "string" && /^(0|[1-9][0-9]{0,19})$/.test(value) && BigInt(value) <= 0xffffffffffffffffn;
188
+ const nullable = (value, test) => value === null || test(value);
189
+ const safeText = (value) => typeof value === "string" && value.length <= 4096 && !/[\x00-\x1f\x7f]/.test(value);
190
+ /** Strict parser also strips every field not in the facts contract. */
191
+ export function parseDarwinNativeSnapshot(text) {
192
+ const v = JSON.parse(text);
193
+ if (!v || v.schema !== 1 || !nullable(v.bootId, (x) => typeof x === "string" && /^[a-fA-F0-9-]{36}$/.test(x)) || !isInt(v.collectorPid, 2) || typeof v.complete !== "boolean" || !Array.isArray(v.processes) || v.processes.length > 100_000 || !Array.isArray(v.errors) || !v.errors.every(x => ["kernel-process-table-unreadable", "process-membership-unreadable", "process-identity-unreadable", "boot-identity-unreadable", "coalition-counters-unreadable", "coalition-counters-changed", "coalition-count-mismatch", "anchor-identity-unreadable"].includes(x)))
194
+ throw new Error("malformed-native-census");
195
+ const pids = new Set(), ids = new Set();
196
+ const processes = v.processes.map((r) => {
197
+ if (!r || typeof r !== "object")
198
+ throw new Error("malformed-process-identity");
199
+ const p = r;
200
+ if (!isInt(p.pid, 1) || pids.has(p.pid) || !nullable(p.ppid, isInt) || !nullable(p.uid, isInt) || !nullable(p.birthMs, (n) => typeof n === "number" && Number.isFinite(n) && n > 0) || !nullable(p.uniqueId, isId) || p.uniqueId === "0" || (p.uniqueId !== null && ids.has(p.uniqueId)) || !nullable(p.parentUniqueId, isId) || (p.traced !== null && typeof p.traced !== "boolean") || !nullable(p.executable, safeText) || !nullable(p.originalParentVersion, (n) => isInt(n) && n <= 0xffffffff) || (p.pidVersion !== undefined && (!isInt(p.pidVersion) || p.pidVersion > 0xffffffff)))
201
+ throw new Error("malformed-process-identity");
202
+ pids.add(p.pid);
203
+ if (p.uniqueId !== null)
204
+ ids.add(p.uniqueId);
205
+ return { pid: p.pid, ppid: p.ppid, uid: p.uid, birthMs: p.birthMs, uniqueId: p.uniqueId, parentUniqueId: p.parentUniqueId, traced: p.traced, executable: p.executable, originalParentVersion: p.originalParentVersion, ...(p.pidVersion === undefined ? {} : { pidVersion: p.pidVersion }) };
206
+ });
207
+ if (v.complete && (v.bootId === null || v.errors.length || !pids.has(1) || !pids.has(v.collectorPid) || processes.some(p => p.uniqueId === null)))
208
+ throw new Error("incomplete-native-census");
209
+ return { schema: 1, bootId: v.bootId, collectorPid: v.collectorPid, complete: v.complete, processes, errors: v.errors };
210
+ }
211
+ /** PID reuse, orphan exec, tracing, UID and birth changes all invalidate a seal. */
212
+ export function changedDarwinProcessIdentities(before, after) {
213
+ const old = new Map(before.map(p => [p.pid, p])), next = new Map(after.map(p => [p.pid, p]));
214
+ const keys = ["uniqueId", "parentUniqueId", "ppid", "uid", "birthMs", "traced", "executable", "originalParentVersion", "pidVersion"];
215
+ return [...new Set([...old.keys(), ...next.keys()])].filter(pid => {
216
+ const a = old.get(pid), b = next.get(pid);
217
+ return !a || !b || keys.some(key => a[key] !== b[key]);
218
+ }).sort((a, b) => a - b);
219
+ }
220
+ /** Parse only the launchd domain's direct service table; never return raw print
221
+ * output, environment, arguments or nested service-like text. */
222
+ export function parseDarwinLaunchdServices(output) {
223
+ const result = [];
224
+ let inServices = false, found = false;
225
+ for (const line of output.split("\n")) {
226
+ if (!inServices) {
227
+ if (/^\tservices = \{$/.test(line)) {
228
+ if (found)
229
+ throw new Error("duplicate-service-table");
230
+ found = true;
231
+ inServices = true;
232
+ }
233
+ continue;
234
+ }
235
+ if (line === "\t}") {
236
+ inServices = false;
237
+ continue;
238
+ }
239
+ if (!line.trim())
240
+ continue;
241
+ const match = /^\t\t[ \t]*([0-9-]+)\s+([-A-Za-z0-9?()]+)\s+([^\x00-\x1f\x7f]+?)\s*$/.exec(line);
242
+ if (!match)
243
+ throw new Error("malformed-service-table");
244
+ const pid = Number(match[1]);
245
+ if (match[1] === "-" || pid === 0)
246
+ continue;
247
+ if (!isInt(pid, 1) || !safeText(match[3]))
248
+ throw new Error("malformed-service-table");
249
+ result.push({ pid, label: match[3] });
250
+ }
251
+ if (!found || inServices)
252
+ throw new Error("service-table-unavailable");
253
+ return result;
254
+ }
255
+ export function parseDarwinPidDomain(output) {
256
+ const field = (name) => {
257
+ const matches = [...output.matchAll(new RegExp(`^\\t${name} = ([^\\r\\n]+)$`, "gm"))];
258
+ return matches.length === 1 && safeText(matches[0][1]) ? matches[0][1] : null;
259
+ };
260
+ const numeric = (value) => value !== null && /^[0-9]+$/.test(value) && isInt(Number(value)) ? Number(value) : null;
261
+ return { type: field("type"), handle: numeric(field("handle")), originator: field("originator"), creatorPid: numeric(field("creator")?.match(/^(?:[^\[\]\r\n]+\[)?([0-9]+)\]?$/)?.[1] ?? null) };
262
+ }
263
+ function launchctl(domain, elevation) {
264
+ if (!/^(system|gui\/[0-9]+|user\/[0-9]+|pid\/[0-9]+)$/.test(domain))
265
+ throw new Error("invalid-launchd-domain");
266
+ const command = elevation === "sudo-n" ? "/usr/bin/sudo" : "/bin/launchctl";
267
+ const args = elevation === "sudo-n" ? ["-n", "/bin/launchctl", "print", domain] : ["print", domain];
268
+ return execFileSync(command, args, { encoding: "utf8", env: cleanEnv, timeout: 5000, maxBuffer: 16 * 1024 * 1024, stdio: "pipe" });
269
+ }
270
+ function domainFailure(error) {
271
+ if (error instanceof Error && ["duplicate-service-table", "malformed-service-table", "service-table-unavailable"].includes(error.message))
272
+ return error.message;
273
+ const status = typeof error === "object" && error !== null && "status" in error ? error.status : null;
274
+ if (status === 113)
275
+ return "domain-not-found";
276
+ const stderr = typeof error === "object" && error !== null && "stderr" in error ? String(error.stderr) : "";
277
+ if (/password is required|not privileged|not permitted|permission denied/i.test(stderr))
278
+ return "permission-required";
279
+ return "domain-unreadable";
280
+ }
281
+ function beginNative(native, argv, parse) {
282
+ // libproc identities and KERN_PROC_ALL need no elevation. Never run the
283
+ // caller-owned compiled executable as root; sudo-n applies only to the
284
+ // fixed /bin/launchctl read below.
285
+ const child = spawn(native.executablePath, argv, { env: cleanEnv, stdio: ["pipe", "pipe", "pipe"] });
286
+ let buffer = "", bytes = 0;
287
+ let firstResolve, firstReject;
288
+ let secondResolve, secondReject;
289
+ const first = new Promise((resolve, reject) => { firstResolve = resolve; firstReject = reject; });
290
+ const second = new Promise((resolve, reject) => { secondResolve = resolve; secondReject = reject; });
291
+ // Attach handlers immediately; a failed helper can reject before finish().
292
+ void first.catch(() => { });
293
+ void second.catch(() => { });
294
+ let lines = 0, failure = false, closeObserved = false;
295
+ const fail = () => {
296
+ const firstFailure = !failure;
297
+ failure = true;
298
+ const error = new Error("native-census-unavailable");
299
+ firstReject(error);
300
+ secondReject(error);
301
+ // A signal request is not exit evidence. Retain this handle until close,
302
+ // including when kill fails or an error event precedes eventual exit.
303
+ if (firstFailure && !closeObserved && child.pid !== undefined) {
304
+ try {
305
+ child.kill("SIGTERM");
306
+ }
307
+ catch { }
308
+ }
309
+ };
310
+ const timeout = setTimeout(fail, 120_000);
311
+ const closed = new Promise(resolve => {
312
+ child.once("error", fail);
313
+ child.once("close", code => { closeObserved = true; clearTimeout(timeout); if (code !== 0 || lines !== 2 || buffer.trim())
314
+ fail(); resolve(code === 0 && !failure && lines === 2); });
315
+ });
316
+ child.stderr.resume(); // Diagnostics are deliberately not copied to output.
317
+ child.stdin.on("error", fail);
318
+ child.stdout.on("data", (data) => {
319
+ if (failure)
320
+ return;
321
+ bytes += data.length;
322
+ if (bytes > 32 * 1024 * 1024) {
323
+ fail();
324
+ return;
325
+ }
326
+ buffer += data.toString("utf8");
327
+ for (let newline = buffer.indexOf("\n"); newline !== -1; newline = buffer.indexOf("\n")) {
328
+ const line = buffer.slice(0, newline);
329
+ buffer = buffer.slice(newline + 1);
330
+ try {
331
+ const value = parse(line);
332
+ if (value.collectorPid !== child.pid)
333
+ throw new Error("collector-identity-mismatch");
334
+ lines++;
335
+ if (lines === 1)
336
+ firstResolve(value);
337
+ else if (lines === 2)
338
+ secondResolve(value);
339
+ else
340
+ fail();
341
+ }
342
+ catch {
343
+ fail();
344
+ }
345
+ }
346
+ });
347
+ let finishing;
348
+ return { first, finish: () => finishing ??= (async () => {
349
+ try {
350
+ if (!failure)
351
+ child.stdin.end("recheck\n");
352
+ }
353
+ catch {
354
+ fail();
355
+ }
356
+ // Await close BEFORE propagating a parse/stream/timeout rejection. Both
357
+ // collectors call finish during cleanup, so neither retry nor return can
358
+ // abandon a failed child. Repeated cleanup shares this same observation.
359
+ const exited = await closed;
360
+ return { second: await second, exited };
361
+ })() };
362
+ }
363
+ /** Does not write a recovery receipt, clear custody, signal task processes, or
364
+ * infer that an unreadable service/domain is safe. sudo-n is explicit and can
365
+ * only fail closed; this function never requests or reads a password. */
366
+ export async function collectDarwinProcessRecoverySnapshot(args) {
367
+ const time = Date.parse(args.boundary), attempts = args.maxAttempts ?? 1, elevation = args.elevation ?? "none";
368
+ if (!Number.isFinite(time) || new Date(time).toISOString() !== args.boundary || !isInt(attempts, 1) || attempts > 3 || !["none", "sudo-n"].includes(elevation))
369
+ throw new Error("invalid-census-options");
370
+ validateNative(args.native);
371
+ let last;
372
+ for (let attempt = 0; attempt < attempts; attempt++) {
373
+ const report = { schema: 1, host: hostname(), bootId: null, osRelease: release(), startedAt: new Date().toISOString(), finishedAt: "", elevation, complete: false, stable: false, processes: [], managedServices: [], collectorPids: [], domainFailures: [], identityChanges: [], errors: [], nativeSourceSha256: args.native.sourceSha256, nativeExecutableSha256: args.native.executableSha256, pidDomains: [] };
374
+ let running, finished = false;
375
+ try {
376
+ if (process.platform !== "darwin")
377
+ throw new Error("unsupported-platform");
378
+ running = beginNative(args.native, [], parseDarwinNativeSnapshot);
379
+ const before = await running.first;
380
+ report.bootId = before.bootId;
381
+ report.processes = before.processes;
382
+ report.errors.push(...before.errors);
383
+ const domains = new Set(["system"]);
384
+ for (const uid of new Set(before.processes.flatMap(p => p.uid === null || p.ppid !== 1 || (p.birthMs !== null && p.birthMs < Math.floor(time / 1000) * 1000) ? [] : [p.uid]))) {
385
+ domains.add(`gui/${uid}`);
386
+ domains.add(`user/${uid}`);
387
+ }
388
+ const services = [];
389
+ for (const domain of domains) {
390
+ try {
391
+ services.push(...parseDarwinLaunchdServices(launchctl(domain, elevation)).map(row => ({ domain, ...row })));
392
+ }
393
+ catch (error) {
394
+ report.domainFailures.push({ domain, reason: domainFailure(error) });
395
+ }
396
+ }
397
+ const servicePids = new Set(services.map(s => s.pid));
398
+ for (const process of before.processes) {
399
+ if (process.ppid !== 1 || process.birthMs === null || process.birthMs < Math.floor(time / 1000) * 1000 || servicePids.has(process.pid))
400
+ continue;
401
+ const domain = `pid/${process.pid}`;
402
+ const facts = { pid: process.pid, domain, readable: false, identityBound: false, uniqueId: process.uniqueId, type: null, handle: null, originator: null, creatorPid: null };
403
+ try {
404
+ Object.assign(facts, parseDarwinPidDomain(launchctl(domain, elevation)));
405
+ facts.readable = true;
406
+ }
407
+ catch (error) {
408
+ report.domainFailures.push({ domain, reason: domainFailure(error) });
409
+ }
410
+ report.pidDomains.push(facts);
411
+ }
412
+ const done = await running.finish();
413
+ finished = true;
414
+ const after = done.second;
415
+ report.identityChanges = changedDarwinProcessIdentities(before.processes, after.processes);
416
+ report.errors.push(...after.errors);
417
+ if (before.bootId !== after.bootId || before.collectorPid !== after.collectorPid)
418
+ report.errors.push("census-context-changed");
419
+ if (!done.exited)
420
+ report.errors.push("collector-exit-unconfirmed");
421
+ if (report.identityChanges.length)
422
+ report.errors.push("process-census-changed");
423
+ const old = new Map(before.processes.map(p => [p.pid, p])), current = new Map(after.processes.map(p => [p.pid, p]));
424
+ for (const service of services) {
425
+ const a = old.get(service.pid), b = current.get(service.pid);
426
+ if (!a?.uniqueId || !b?.uniqueId)
427
+ continue;
428
+ report.managedServices.push({ ...service, uniqueId: a.uniqueId, beforeUniqueId: a.uniqueId, afterUniqueId: b.uniqueId, identityBound: a.uniqueId === b.uniqueId && !report.identityChanges.includes(service.pid) });
429
+ }
430
+ for (const domain of report.pidDomains)
431
+ domain.identityBound = domain.readable && domain.uniqueId !== null && current.get(domain.pid)?.uniqueId === domain.uniqueId && !report.identityChanges.includes(domain.pid);
432
+ report.complete = before.complete && after.complete && done.exited;
433
+ report.stable = report.complete && report.errors.length === 0 && report.identityChanges.length === 0;
434
+ // Exclusion is only for this exact facts-only child after its owned handle
435
+ // reports successful exit. No generic disappeared PID becomes an exclusion.
436
+ if (done.exited && old.get(before.collectorPid)?.uniqueId === current.get(after.collectorPid)?.uniqueId && old.get(before.collectorPid)?.uniqueId)
437
+ report.collectorPids = [before.collectorPid];
438
+ }
439
+ catch {
440
+ report.errors.push("census-collection-failed");
441
+ }
442
+ finally {
443
+ if (running && !finished) {
444
+ try {
445
+ await running.finish();
446
+ }
447
+ catch { }
448
+ }
449
+ report.finishedAt = new Date().toISOString();
450
+ report.errors = [...new Set(report.errors)];
451
+ }
452
+ last = report;
453
+ if (report.stable)
454
+ break;
455
+ }
456
+ return last;
457
+ }
458
+ export const prepareDarwinCoalitionCensus = prepareDarwinProcessCensus;
459
+ function readCounters(value) {
460
+ if (value === null)
461
+ return null;
462
+ if (typeof value !== "object" || value === null)
463
+ throw new Error("malformed-coalition-counters");
464
+ const v = value;
465
+ if (!isId(v.tasksStarted) || !isId(v.tasksExited) || BigInt(v.tasksStarted) < BigInt(v.tasksExited))
466
+ throw new Error("malformed-coalition-counters");
467
+ return { tasksStarted: v.tasksStarted, tasksExited: v.tasksExited };
468
+ }
469
+ const sameCounters = (a, b) => a !== null && b !== null && a.tasksStarted === b.tasksStarted && a.tasksExited === b.tasksExited;
470
+ /** Counts corroborate membership; they cannot classify unreadable processes.
471
+ * Every non-zombie table row must have a readable coalition or fresh ESRCH.
472
+ * Fork adopts a coalition before publishing the child PID, then makes it
473
+ * runnable. An in-construction child therefore also requires a live producer;
474
+ * separate historical provenance and absence of owned producers are mandatory.
475
+ * Exec shadows share a PID; changed task counters still invalidate the seal. */
476
+ export function parseDarwinCoalitionNativeSnapshot(text) {
477
+ const value = JSON.parse(text);
478
+ if (!value || !isId(value.resourceCoalitionId) || value.resourceCoalitionId === "0" || typeof value.complete !== "boolean" || typeof value.kernelTableRead !== "boolean" || !isInt(value.unreadableMembershipCount))
479
+ throw new Error("malformed-coalition-census");
480
+ const common = parseDarwinNativeSnapshot(JSON.stringify({ ...value, complete: false }));
481
+ const counterBefore = readCounters(value.counterBefore), counterAfter = readCounters(value.counterAfter);
482
+ const anchorPids = value.anchorPids;
483
+ if (!Array.isArray(anchorPids) || anchorPids.length > 8 || anchorPids.some(pid => !isInt(pid, 1) || pid > 0x7fffffff) || new Set(anchorPids).size !== anchorPids.length)
484
+ throw new Error("malformed-anchor-request");
485
+ const raw = value.processes;
486
+ const rows = common.processes.map((p, i) => {
487
+ const resourceCoalitionId = raw[i].resourceCoalitionId;
488
+ if (!isId(resourceCoalitionId) || resourceCoalitionId === "0" || (resourceCoalitionId !== value.resourceCoalitionId && !anchorPids.includes(p.pid)))
489
+ throw new Error("coalition-membership-mismatch");
490
+ return { ...p, resourceCoalitionId };
491
+ });
492
+ const processes = rows.filter(p => p.resourceCoalitionId === value.resourceCoalitionId);
493
+ const anchors = rows.filter(p => anchorPids.includes(p.pid));
494
+ if (value.complete && (value.unreadableMembershipCount !== 0 || !value.kernelTableRead || common.bootId === null || common.errors.length || rows.some(p => p.uniqueId === null) || anchors.length !== anchorPids.length || !sameCounters(counterBefore, counterAfter) || BigInt(counterBefore.tasksStarted) - BigInt(counterBefore.tasksExited) !== BigInt(processes.length)))
495
+ throw new Error("incomplete-coalition-census");
496
+ return { ...common, complete: value.complete, processes, anchorPids, anchors, resourceCoalitionId: value.resourceCoalitionId, counterBefore, counterAfter, kernelTableRead: value.kernelTableRead, unreadableMembershipCount: value.unreadableMembershipCount };
497
+ }
498
+ /** Validates the two seals without trusting a numeric PID intersection. Exported
499
+ * so the same malformed/racing native response receives deterministic checks. */
500
+ export function compareDarwinCoalitionSnapshots(before, after) {
501
+ const identityChanges = changedDarwinProcessIdentities(before.processes, after.processes);
502
+ const anchorIdentityChanges = [...new Set([
503
+ ...changedDarwinProcessIdentities(before.anchors, after.anchors),
504
+ ...before.anchors.filter(p => after.anchors.find(q => q.pid === p.pid)?.resourceCoalitionId !== p.resourceCoalitionId).map(p => p.pid),
505
+ ...before.anchorPids.filter(pid => !before.anchors.some(p => p.pid === pid) || !after.anchors.some(p => p.pid === pid)),
506
+ ])].sort((a, b) => a - b);
507
+ const countersStable = sameCounters(before.counterBefore, before.counterAfter) && sameCounters(before.counterBefore, after.counterBefore) && sameCounters(before.counterBefore, after.counterAfter);
508
+ const errors = [...new Set([...before.errors, ...after.errors])];
509
+ if (before.unreadableMembershipCount || after.unreadableMembershipCount)
510
+ errors.push("process-membership-unreadable");
511
+ if (before.resourceCoalitionId !== after.resourceCoalitionId || before.bootId !== after.bootId || before.bootId === null || before.collectorPid !== after.collectorPid)
512
+ errors.push("census-context-changed");
513
+ if (!countersStable)
514
+ errors.push("coalition-counters-changed");
515
+ if (identityChanges.length)
516
+ errors.push("process-census-changed");
517
+ if ([...before.anchorPids].sort((a, b) => a - b).join(",") !== [...after.anchorPids].sort((a, b) => a - b).join(","))
518
+ errors.push("anchor-request-changed");
519
+ if (anchorIdentityChanges.length)
520
+ errors.push("anchor-identity-changed");
521
+ const firstSelf = before.processes.find(p => p.pid === before.collectorPid), lastSelf = after.processes.find(p => p.pid === after.collectorPid);
522
+ if (!firstSelf?.uniqueId || firstSelf.uniqueId !== lastSelf?.uniqueId)
523
+ errors.push("collector-coalition-mismatch");
524
+ const complete = before.complete && after.complete && errors.length === 0;
525
+ return { complete, stable: complete && identityChanges.length === 0 && countersStable, countersStable, identityChanges, anchorIdentityChanges, errors: [...new Set(errors)] };
526
+ }
527
+ /** Facts-only same-coalition census; this does not establish that any historical
528
+ * run inherited this coalition or lacked privileged/delegated spawn authority.
529
+ * Unlike the full-host reader, no launchctl child is spawned between seals.
530
+ * Native task counters include fork AND exec, so transient exec copies refuse. */
531
+ export async function collectDarwinCoalitionSnapshot(args) {
532
+ const attempts = args.maxAttempts ?? 1, anchorPids = args.anchorPids ?? [];
533
+ if (anchorPids.length > 8 || anchorPids.some(pid => !isInt(pid, 1) || pid > 0x7fffffff) || new Set(anchorPids).size !== anchorPids.length)
534
+ throw new Error("invalid-anchor-pids");
535
+ if (!isId(args.resourceCoalitionId) || args.resourceCoalitionId === "0" || !isInt(attempts, 1) || attempts > 3)
536
+ throw new Error("invalid-coalition-census-options");
537
+ validateNative(args.native);
538
+ let last;
539
+ for (let attempt = 0; attempt < attempts; attempt++) {
540
+ const report = { schema: 1, host: hostname(), bootId: null, osRelease: release(), startedAt: new Date().toISOString(), finishedAt: "", resourceCoalitionId: args.resourceCoalitionId, anchorPids: [...anchorPids], anchors: [], anchorIdentityChanges: [], complete: false, stable: false, processes: [], counterBefore: null, counterAfter: null, countersStable: false, kernelTableRead: false, unreadableMembershipCount: 0, identityChanges: [], errors: [], collector: null, nativeSourceSha256: args.native.sourceSha256, nativeExecutableSha256: args.native.executableSha256 };
541
+ let running, finished = false;
542
+ try {
543
+ if (process.platform !== "darwin")
544
+ throw new Error("unsupported-platform");
545
+ running = beginNative(args.native, ["--coalition", args.resourceCoalitionId, ...anchorPids.map(String)], parseDarwinCoalitionNativeSnapshot);
546
+ const before = await running.first;
547
+ const done = await running.finish();
548
+ finished = true;
549
+ const after = done.second;
550
+ Object.assign(report, compareDarwinCoalitionSnapshots(before, after));
551
+ report.bootId = before.bootId;
552
+ report.processes = before.processes;
553
+ report.anchors = before.anchors;
554
+ if ([...before.anchorPids].sort((a, b) => a - b).join(",") !== [...anchorPids].sort((a, b) => a - b).join(","))
555
+ report.errors.push("anchor-request-mismatch");
556
+ report.counterBefore = before.counterBefore;
557
+ report.counterAfter = after.counterAfter;
558
+ report.kernelTableRead = before.kernelTableRead && after.kernelTableRead;
559
+ report.unreadableMembershipCount = before.unreadableMembershipCount + after.unreadableMembershipCount;
560
+ if (before.resourceCoalitionId !== args.resourceCoalitionId || after.resourceCoalitionId !== args.resourceCoalitionId)
561
+ report.errors.push("coalition-request-mismatch");
562
+ const firstSelf = before.processes.find(p => p.pid === before.collectorPid), lastSelf = after.processes.find(p => p.pid === after.collectorPid);
563
+ if (done.exited && firstSelf?.uniqueId && firstSelf.uniqueId === lastSelf?.uniqueId)
564
+ report.collector = { pid: before.collectorPid, uniqueId: firstSelf.uniqueId, exited: true };
565
+ if (!done.exited || report.collector === null)
566
+ report.errors.push("collector-exit-unconfirmed");
567
+ if (report.errors.length) {
568
+ report.complete = false;
569
+ report.stable = false;
570
+ }
571
+ }
572
+ catch {
573
+ report.complete = false;
574
+ report.stable = false;
575
+ report.errors.push("census-collection-failed");
576
+ }
577
+ finally {
578
+ if (running && !finished) {
579
+ try {
580
+ await running.finish();
581
+ }
582
+ catch { }
583
+ }
584
+ report.finishedAt = new Date().toISOString();
585
+ report.errors = [...new Set(report.errors)];
586
+ }
587
+ last = report;
588
+ if (report.stable)
589
+ break;
590
+ }
591
+ return last;
592
+ }