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,41 @@
1
+ /**
2
+ * GitHub Issues, through `gh`.
3
+ *
4
+ * No new credential: `gh` is already authenticated on any machine where the
5
+ * rest of this tool works, which is the same reason pull requests are read
6
+ * that way. Nothing here holds a token.
7
+ *
8
+ * Two things it deliberately will not do.
9
+ *
10
+ * **It will not write dependency edges.** GitHub grew native `blocked_by`
11
+ * relations and sub-issues, and the design says to use them *where a
12
+ * capability probe confirms them* — including a `gh` new enough to expose the
13
+ * fields. This adapter has confirmed neither the endpoint shape nor the
14
+ * version behaviour against a live repository, so it refuses instead of
15
+ * guessing, and refuses rather than emulating. An invented edge would make our
16
+ * scheduler disagree with what every human on the repository can see.
17
+ *
18
+ * **It will not reach the network on the scheduler's hot path.** Reading is a
19
+ * round trip per repository, and GitHub allows five thousand authenticated
20
+ * requests an hour; a scheduler polling dependencies for a hundred issues once
21
+ * a minute would exhaust that before doing any real work. §4's answer is a
22
+ * materialised snapshot read out of band, which is the scheduler's job to hold
23
+ * — this module just makes each read explicit and bounded so that when the
24
+ * scheduler arrives it is obvious what costs a network call.
25
+ */
26
+ import type { Deps } from "./graph.js";
27
+ import { type GraphBackend, type Runner } from "./backend.js";
28
+ /** A network round trip; bounded like the pull request read it sits beside. */
29
+ export declare const ISSUE_TIMEOUT_MS = 20000;
30
+ /** Enough to see a backlog without paginating. */
31
+ export declare const DEFAULT_LIMIT = 100;
32
+ export type IssuesOptions = {
33
+ repo: string;
34
+ runner?: Runner;
35
+ limit?: number;
36
+ /** Overridden when a caller is spending a shared budget; see `remote.ts`. */
37
+ timeoutMs?: number;
38
+ /** Whether `gh` is new enough for the dependency fields; see `graph.ts`. */
39
+ deps?: Deps;
40
+ };
41
+ export declare function githubIssues(options: IssuesOptions): GraphBackend;
package/dist/issues.js ADDED
@@ -0,0 +1,131 @@
1
+ /**
2
+ * GitHub Issues, through `gh`.
3
+ *
4
+ * No new credential: `gh` is already authenticated on any machine where the
5
+ * rest of this tool works, which is the same reason pull requests are read
6
+ * that way. Nothing here holds a token.
7
+ *
8
+ * Two things it deliberately will not do.
9
+ *
10
+ * **It will not write dependency edges.** GitHub grew native `blocked_by`
11
+ * relations and sub-issues, and the design says to use them *where a
12
+ * capability probe confirms them* — including a `gh` new enough to expose the
13
+ * fields. This adapter has confirmed neither the endpoint shape nor the
14
+ * version behaviour against a live repository, so it refuses instead of
15
+ * guessing, and refuses rather than emulating. An invented edge would make our
16
+ * scheduler disagree with what every human on the repository can see.
17
+ *
18
+ * **It will not reach the network on the scheduler's hot path.** Reading is a
19
+ * round trip per repository, and GitHub allows five thousand authenticated
20
+ * requests an hour; a scheduler polling dependencies for a hundred issues once
21
+ * a minute would exhaust that before doing any real work. §4's answer is a
22
+ * materialised snapshot read out of band, which is the scheduler's job to hold
23
+ * — this module just makes each read explicit and bounded so that when the
24
+ * scheduler arrives it is obvious what costs a network call.
25
+ */
26
+ import { run } from "./exec.js";
27
+ import { ok, no, edgesNotEmulated, describeFailure, parseJson, } from "./backend.js";
28
+ const GH = "gh";
29
+ /** A network round trip; bounded like the pull request read it sits beside. */
30
+ export const ISSUE_TIMEOUT_MS = 20_000;
31
+ /** Enough to see a backlog without paginating. */
32
+ export const DEFAULT_LIMIT = 100;
33
+ export function githubIssues(options) {
34
+ const { repo, runner = run, limit = DEFAULT_LIMIT, timeoutMs = ISSUE_TIMEOUT_MS, deps = "unverified", } = options;
35
+ const call = (args) => runner(GH, args, { cwd: repo, timeoutMs });
36
+ return {
37
+ name: "github-issues",
38
+ deps,
39
+ /**
40
+ * Every open issue. Without confirmed edges there is no dependency order
41
+ * to apply, so "ready" here means "open" — which is exactly why a backend
42
+ * in this state is not an autonomous-scheduling default.
43
+ */
44
+ async listReady() {
45
+ const result = await call([
46
+ "issue",
47
+ "list",
48
+ "--state",
49
+ "open",
50
+ "--limit",
51
+ String(limit),
52
+ "--json",
53
+ "number,title,state",
54
+ ]);
55
+ if (result.code !== 0)
56
+ return no("unreachable", describeFailure(result));
57
+ const parsed = parseJson(result.stdout);
58
+ if (!Array.isArray(parsed))
59
+ return no("unreadable", "gh returned something that is not a list");
60
+ return ok(parsed.map(readIssue).filter((task) => task !== null));
61
+ },
62
+ async get(id) {
63
+ const result = await call(["issue", "view", id, "--json", "number,title,state"]);
64
+ // gh returns non-zero for a missing issue, which is an answer rather
65
+ // than a fault: null means "not there", and the caller can tell that
66
+ // apart from "we could not ask".
67
+ if (result.code !== 0) {
68
+ return isMissing(result.stderr) ? ok(null) : no("unreachable", describeFailure(result));
69
+ }
70
+ const task = readIssue(parseJson(result.stdout));
71
+ return task === null ? no("unreadable", "gh returned an issue in a shape we do not know") : ok(task);
72
+ },
73
+ /**
74
+ * `gh issue create` prints the new issue's URL and nothing else, so the
75
+ * number is read back off the end of it. Parsed strictly: a URL we cannot
76
+ * read means we do not know what was created, and reporting a made-up id
77
+ * would be worse than reporting the failure.
78
+ */
79
+ async create(spec) {
80
+ const result = await call([
81
+ "issue",
82
+ "create",
83
+ "--title",
84
+ spec.title,
85
+ "--body",
86
+ spec.body ?? "Filed by Toolroll.",
87
+ ]);
88
+ if (result.code !== 0)
89
+ return no("rejected", describeFailure(result));
90
+ const number = /\/issues\/(\d+)\s*$/.exec(result.stdout.trim());
91
+ if (number?.[1] === undefined) {
92
+ return no("unreadable", "the issue was created, but gh did not print a URL we could read");
93
+ }
94
+ return ok(number[1]);
95
+ },
96
+ /**
97
+ * GitHub has two states, so everything terminal closes and everything
98
+ * else reopens. The mapping is lossy and says so rather than inventing
99
+ * labels to carry the difference — a `failed` task and a `done` one look
100
+ * the same to GitHub, and pretending otherwise would put our vocabulary
101
+ * into somebody else's tracker.
102
+ */
103
+ async setState(id, state) {
104
+ const closing = state === "done" || state === "failed" || state === "cancelled";
105
+ const result = await call(["issue", closing ? "close" : "reopen", id]);
106
+ if (result.code !== 0)
107
+ return no("rejected", describeFailure(result));
108
+ return ok(undefined);
109
+ },
110
+ async addEdge() {
111
+ return edgesNotEmulated("GitHub Issues");
112
+ },
113
+ };
114
+ }
115
+ function readIssue(record) {
116
+ if (typeof record !== "object" || record === null)
117
+ return null;
118
+ const raw = record;
119
+ const number = raw["number"];
120
+ if (typeof number !== "number")
121
+ return null;
122
+ return {
123
+ id: String(number),
124
+ title: typeof raw["title"] === "string" ? raw["title"] : "",
125
+ state: String(raw["state"]).toUpperCase() === "CLOSED" ? "done" : "queued",
126
+ };
127
+ }
128
+ function isMissing(stderr) {
129
+ const text = stderr.toLowerCase();
130
+ return text.includes("could not resolve") || text.includes("not found");
131
+ }
@@ -0,0 +1,252 @@
1
+ # The Windows Job Object helper (docs/PROCESS_CONTAINMENT_PLAN.md).
2
+ #
3
+ # Runs OUTSIDE the job it owns. Invoked by containment.ts only:
4
+ # powershell -NoProfile -NonInteractive -ExecutionPolicy Bypass -File job-object-helper.ps1 <pipe> <base64 json [file, ...args]>
5
+ #
6
+ # Protocol over the named pipe the controller listens on:
7
+ # helper -> controller "attached" the target was created SUSPENDED, assigned to a
8
+ # kill-on-close / no-breakaway job, then resumed
9
+ # "failed <detail>" the target never ran
10
+ # "empty" the job reports zero active processes
11
+ # controller -> helper "kill" TerminateJobObject, then report "empty" and exit
12
+ # The helper exits with the root's exit code as soon as the job is empty;
13
+ # members that outlive the root's natural exit are terminated after 2 s.
14
+ # The controller's death closes the pipe: the helper terminates the job and exits, and the
15
+ # job handle closing (kill-on-close) ends anything that raced that.
16
+ #
17
+ # The target inherits this helper's stdin/stdout/stderr (the controller's pipes), its
18
+ # environment and its working directory verbatim; argv is re-quoted with the same rules
19
+ # libuv uses, never re-parsed through a shell.
20
+
21
+ param(
22
+ [Parameter(Position = 0)] [string] $Pipe,
23
+ # The target's argv - file first - as base64(UTF-8 JSON array): one opaque
24
+ # token, so PowerShell's own command-line parsing can never touch a quote,
25
+ # a space or a percent sign the controller passed.
26
+ [Parameter(Position = 1)] [string] $Encoded,
27
+ [string] $JobName,
28
+ [string] $QueryName
29
+ )
30
+
31
+ $ErrorActionPreference = "Stop"
32
+
33
+ Add-Type -TypeDefinition @"
34
+ using System;
35
+ using System.Runtime.InteropServices;
36
+ using System.Text;
37
+ public static class SoJob {
38
+ [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)]
39
+ public struct STARTUPINFO {
40
+ public int cb; public string lpReserved; public string lpDesktop; public string lpTitle;
41
+ public int dwX; public int dwY; public int dwXSize; public int dwYSize; public int dwXCountChars; public int dwYCountChars;
42
+ public int dwFillAttribute; public int dwFlags; public short wShowWindow; public short cbReserved2;
43
+ public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError;
44
+ }
45
+ [StructLayout(LayoutKind.Sequential)]
46
+ public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public int dwProcessId; public int dwThreadId; }
47
+ [StructLayout(LayoutKind.Sequential)]
48
+ public struct JOBOBJECT_BASIC_LIMIT_INFORMATION {
49
+ public long PerProcessUserTimeLimit; public long PerJobUserTimeLimit; public uint LimitFlags;
50
+ public UIntPtr MinimumWorkingSetSize; public UIntPtr MaximumWorkingSetSize; public uint ActiveProcessLimit;
51
+ public UIntPtr Affinity; public uint PriorityClass; public uint SchedulingClass;
52
+ }
53
+ [StructLayout(LayoutKind.Sequential)]
54
+ public struct IO_COUNTERS {
55
+ public ulong ReadOperationCount; public ulong WriteOperationCount; public ulong OtherOperationCount;
56
+ public ulong ReadTransferCount; public ulong WriteTransferCount; public ulong OtherTransferCount;
57
+ }
58
+ [StructLayout(LayoutKind.Sequential)]
59
+ public struct JOBOBJECT_EXTENDED_LIMIT_INFORMATION {
60
+ public JOBOBJECT_BASIC_LIMIT_INFORMATION BasicLimitInformation; public IO_COUNTERS IoInfo;
61
+ public UIntPtr ProcessMemoryLimit; public UIntPtr JobMemoryLimit; public UIntPtr PeakProcessMemoryUsed; public UIntPtr PeakJobMemoryUsed;
62
+ }
63
+ [StructLayout(LayoutKind.Sequential)]
64
+ public struct JOBOBJECT_BASIC_ACCOUNTING_INFORMATION {
65
+ public long TotalUserTime; public long TotalKernelTime; public long ThisPeriodTotalUserTime; public long ThisPeriodTotalKernelTime;
66
+ public uint TotalPageFaultCount; public uint TotalProcesses; public uint ActiveProcesses; public uint TotalTerminatedProcesses;
67
+ }
68
+ public const int JobObjectBasicAccountingInformation = 1;
69
+ public const int JobObjectExtendedLimitInformation = 9;
70
+ public const uint JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE = 0x2000;
71
+ public const uint CREATE_SUSPENDED = 0x4;
72
+ public const uint CREATE_UNICODE_ENVIRONMENT = 0x400;
73
+ public const int STARTF_USESTDHANDLES = 0x100;
74
+ [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern IntPtr CreateJobObjectW(IntPtr attributes, string name);
75
+ [DllImport("kernel32.dll", SetLastError = true)] public static extern bool SetInformationJobObject(IntPtr job, int infoClass, IntPtr info, uint length);
76
+ [DllImport("kernel32.dll", SetLastError = true)] public static extern bool QueryInformationJobObject(IntPtr job, int infoClass, IntPtr info, uint length, IntPtr returned);
77
+ [DllImport("kernel32.dll", SetLastError = true)] public static extern bool AssignProcessToJobObject(IntPtr job, IntPtr process);
78
+ [DllImport("kernel32.dll", SetLastError = true)] public static extern bool TerminateJobObject(IntPtr job, uint exitCode);
79
+ [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern bool CreateProcessW(string application, StringBuilder commandLine, IntPtr processAttributes, IntPtr threadAttributes, bool inheritHandles, uint creationFlags, IntPtr environment, string currentDirectory, ref STARTUPINFO startupInfo, out PROCESS_INFORMATION processInformation);
80
+ [DllImport("kernel32.dll", SetLastError = true)] public static extern uint ResumeThread(IntPtr thread);
81
+ [DllImport("kernel32.dll", SetLastError = true)] public static extern bool TerminateProcess(IntPtr process, uint exitCode);
82
+ [DllImport("kernel32.dll", SetLastError = true)] public static extern uint WaitForSingleObject(IntPtr handle, uint milliseconds);
83
+ [DllImport("kernel32.dll", SetLastError = true)] public static extern bool GetExitCodeProcess(IntPtr process, out uint exitCode);
84
+ [DllImport("kernel32.dll", SetLastError = true)] public static extern IntPtr GetStdHandle(int which);
85
+ [DllImport("kernel32.dll", SetLastError = true)] public static extern bool CloseHandle(IntPtr handle);
86
+
87
+ /** libuv's quoting rules: the target sees exactly the argv the controller passed. */
88
+ public static string Quote(string arg) {
89
+ if (arg.Length == 0) return "\"\"";
90
+ bool plain = true;
91
+ foreach (char c in arg) { if (c == ' ' || c == '\t' || c == '"' || c == '\n' || c == '\r') { plain = false; break; } }
92
+ if (plain) return arg;
93
+ var sb = new StringBuilder();
94
+ sb.Append('"');
95
+ int backslashes = 0;
96
+ foreach (char c in arg) {
97
+ if (c == '\\') { backslashes++; continue; }
98
+ if (c == '"') { sb.Append('\\', backslashes * 2 + 1); sb.Append('"'); backslashes = 0; continue; }
99
+ sb.Append('\\', backslashes); sb.Append(c); backslashes = 0;
100
+ }
101
+ sb.Append('\\', backslashes * 2);
102
+ sb.Append('"');
103
+ return sb.ToString();
104
+ }
105
+
106
+ [DllImport("kernel32.dll", CharSet = CharSet.Unicode, SetLastError = true)] public static extern IntPtr OpenJobObjectW(uint access, bool inherit, string name);
107
+ public static string Inspect(string name) {
108
+ IntPtr job = OpenJobObjectW(4, false, name); // JOB_OBJECT_QUERY only
109
+ if (job == IntPtr.Zero) return Marshal.GetLastWin32Error() == 2 ? "empty" : "unknown";
110
+ try { return ActiveProcesses(job) == 0 ? "empty" : "populated"; }
111
+ catch { return "unknown"; }
112
+ finally { CloseHandle(job); }
113
+ }
114
+ public static IntPtr MakeJob(string name) {
115
+ IntPtr job = CreateJobObjectW(IntPtr.Zero, name);
116
+ int createdError = Marshal.GetLastWin32Error();
117
+ if (job != IntPtr.Zero && createdError == 183) { CloseHandle(job); throw new Exception("job name already exists"); }
118
+ if (job == IntPtr.Zero) throw new Exception("CreateJobObject failed: " + Marshal.GetLastWin32Error());
119
+ var info = new JOBOBJECT_EXTENDED_LIMIT_INFORMATION();
120
+ // Kill on close; NO breakaway flags, so nothing inside may leave the job.
121
+ info.BasicLimitInformation.LimitFlags = JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE;
122
+ int size = Marshal.SizeOf(typeof(JOBOBJECT_EXTENDED_LIMIT_INFORMATION));
123
+ IntPtr buffer = Marshal.AllocHGlobal(size);
124
+ try {
125
+ Marshal.StructureToPtr(info, buffer, false);
126
+ if (!SetInformationJobObject(job, JobObjectExtendedLimitInformation, buffer, (uint)size)) throw new Exception("SetInformationJobObject failed: " + Marshal.GetLastWin32Error());
127
+ } finally { Marshal.FreeHGlobal(buffer); }
128
+ return job;
129
+ }
130
+
131
+ public static uint ActiveProcesses(IntPtr job) {
132
+ int size = Marshal.SizeOf(typeof(JOBOBJECT_BASIC_ACCOUNTING_INFORMATION));
133
+ IntPtr buffer = Marshal.AllocHGlobal(size);
134
+ try {
135
+ if (!QueryInformationJobObject(job, JobObjectBasicAccountingInformation, buffer, (uint)size, IntPtr.Zero)) throw new Exception("QueryInformationJobObject failed: " + Marshal.GetLastWin32Error());
136
+ var info = (JOBOBJECT_BASIC_ACCOUNTING_INFORMATION)Marshal.PtrToStructure(buffer, typeof(JOBOBJECT_BASIC_ACCOUNTING_INFORMATION));
137
+ return info.ActiveProcesses;
138
+ } finally { Marshal.FreeHGlobal(buffer); }
139
+ }
140
+
141
+ public static PROCESS_INFORMATION StartSuspended(string commandLine) {
142
+ var si = new STARTUPINFO();
143
+ si.cb = Marshal.SizeOf(typeof(STARTUPINFO));
144
+ si.dwFlags = STARTF_USESTDHANDLES;
145
+ si.hStdInput = GetStdHandle(-10); si.hStdOutput = GetStdHandle(-11); si.hStdError = GetStdHandle(-12);
146
+ PROCESS_INFORMATION pi;
147
+ var cmd = new StringBuilder(commandLine);
148
+ if (!CreateProcessW(null, cmd, IntPtr.Zero, IntPtr.Zero, true, CREATE_SUSPENDED | CREATE_UNICODE_ENVIRONMENT, IntPtr.Zero, null, ref si, out pi)) {
149
+ throw new Exception("CreateProcess failed: " + Marshal.GetLastWin32Error());
150
+ }
151
+ return pi;
152
+ }
153
+ }
154
+ "@
155
+
156
+ if ($QueryName) {
157
+ if ($QueryName -cnotmatch '^Global\\so-[A-Za-z0-9._-]+-[a-f0-9]{64}$') { Write-Output "unknown"; exit 0 }
158
+ Write-Output ([SoJob]::Inspect($QueryName)); exit 0
159
+ }
160
+ if ($JobName -cnotmatch '^Global\\so-[A-Za-z0-9._-]+-[a-f0-9]{64}$') { throw "invalid job custody name" }
161
+ $name = $Pipe
162
+ if ($name.StartsWith("\\.\pipe\")) { $name = $name.Substring(9) }
163
+ # Duplex control requires an overlapped handle: on .NET Framework a pending
164
+ # asynchronous read on a synchronous PipeStream can serialize a concurrent
165
+ # write. That would delay the empty reply until another order arrives.
166
+ $client = New-Object System.IO.Pipes.NamedPipeClientStream(".", $name, [System.IO.Pipes.PipeDirection]::InOut, [System.IO.Pipes.PipeOptions]::Asynchronous)
167
+ $client.Connect(5000)
168
+ $writer = New-Object System.IO.StreamWriter($client)
169
+ $writer.AutoFlush = $true
170
+ $reader = New-Object System.IO.StreamReader($client)
171
+
172
+ function Send([string] $line) { try { $writer.Write($line + "`n") } catch { } }
173
+
174
+ $job = [IntPtr]::Zero
175
+ $pi = $null
176
+ try {
177
+ [string[]]$targetArguments = ConvertFrom-Json -InputObject ([System.Text.Encoding]::UTF8.GetString([Convert]::FromBase64String($Encoded)))
178
+ if ($targetArguments.Count -lt 1) { throw "the target argv is empty" }
179
+ # Admission arrives only after the controller durably records this helper.
180
+ $job = [SoJob]::MakeJob($JobName)
181
+ Send "ready"
182
+ $admission = $reader.ReadLineAsync()
183
+ if (-not $admission.Wait(15000) -or $admission.Result -cne "go") { throw "job admission refused" }
184
+ $parts = @()
185
+ foreach ($arg in $targetArguments) { $parts += [SoJob]::Quote([string]$arg) }
186
+ $pi = [SoJob]::StartSuspended(($parts -join " "))
187
+ if (-not [SoJob]::AssignProcessToJobObject($job, $pi.hProcess)) {
188
+ $code = [System.Runtime.InteropServices.Marshal]::GetLastWin32Error()
189
+ [void][SoJob]::TerminateProcess($pi.hProcess, 126)
190
+ Send ("failed AssignProcessToJobObject failed with Win32 error " + $code + " - the target never ran")
191
+ exit 126
192
+ }
193
+ if ([SoJob]::ResumeThread($pi.hThread) -eq [uint32]::MaxValue) { throw "ResumeThread failed" }
194
+ Send "attached"
195
+ } catch {
196
+ if ($pi -ne $null -and $pi.hProcess -ne [IntPtr]::Zero) { [void][SoJob]::TerminateProcess($pi.hProcess, 126) }
197
+ if ($job -ne [IntPtr]::Zero) { [void][SoJob]::TerminateJobObject($job, 126); [void][SoJob]::CloseHandle($job) }
198
+ Send ("failed " + $_.Exception.Message)
199
+ exit 126
200
+ }
201
+
202
+ # Orders from the controller are read asynchronously on this one thread (a
203
+ # PowerShell runspace is single-threaded; ReadLineAsync polls without one). The
204
+ # pipe closing - the controller died - is itself the order to terminate.
205
+ $pendingRead = $reader.ReadLineAsync()
206
+ $pipeClosed = $false
207
+ function NextOrders {
208
+ $found = @()
209
+ while ($script:pendingRead -ne $null -and $script:pendingRead.IsCompleted) {
210
+ $line = $null
211
+ try { $line = $script:pendingRead.Result } catch { $line = $null }
212
+ if ($line -eq $null) { $script:pipeClosed = $true; $script:pendingRead = $null; $found += "closed"; break }
213
+ $found += $line.Trim()
214
+ $script:pendingRead = $reader.ReadLineAsync()
215
+ }
216
+ return $found
217
+ }
218
+
219
+ $exitCode = 1
220
+ $rootExited = $false
221
+ $rootExitedAt = $null
222
+ while ($true) {
223
+ if (-not $rootExited -and [SoJob]::WaitForSingleObject($pi.hProcess, 50) -eq 0) {
224
+ $rootExited = $true
225
+ $rootExitedAt = Get-Date
226
+ $c = [uint32]0
227
+ if ([SoJob]::GetExitCodeProcess($pi.hProcess, [ref]$c)) { $exitCode = [int]$c }
228
+ }
229
+ foreach ($order in (NextOrders)) {
230
+ # A stop from the controller, or the controller's death (pipe closed):
231
+ # end every member now. "release" needs nothing here - the helper exits
232
+ # on its own the moment the job is proven empty.
233
+ if ($order -eq "kill" -or $order -eq "closed") { [void][SoJob]::TerminateJobObject($job, 137); if (-not $rootExited) { $rootExited = $true; $rootExitedAt = Get-Date; $exitCode = 137 } }
234
+ }
235
+ if ($rootExited) {
236
+ $active = [SoJob]::ActiveProcesses($job)
237
+ if ($active -eq 0) { Send "empty"; break }
238
+ # The root is gone but members remain (a detached grandchild): natural
239
+ # exit cleans them up too, after a short grace for the ordinary case.
240
+ if (((Get-Date) - $rootExitedAt).TotalMilliseconds -gt 2000) { [void][SoJob]::TerminateJobObject($job, 137) }
241
+ }
242
+ Start-Sleep -Milliseconds 50
243
+ }
244
+ [void][SoJob]::CloseHandle($pi.hThread)
245
+ [void][SoJob]::CloseHandle($pi.hProcess)
246
+ [void][SoJob]::CloseHandle($job)
247
+ # This is a dedicated helper process. A pending .NET pipe read can prevent
248
+ # PowerShell's normal host shutdown, and disposing its shared stream can
249
+ # wait for that read. The kernel has already proved the job empty and all
250
+ # owned process/job handles are closed. Exit the helper process directly;
251
+ # Windows closes the pipe and cancels pending IO without a disposal wait.
252
+ [Environment]::Exit($exitCode)
@@ -0,0 +1,11 @@
1
+ /** Bounded structural metadata for an event whose text may exceed the wire
2
+ * cap. Long JSON strings become null in a small skeleton, but every escape
3
+ * is still validated. JSON.parse proves the remaining structure. Unknown,
4
+ * malformed or over-complex input never earns permission to discard it. */
5
+ export declare function jsonlDiscriminants(): {
6
+ push(bytes: Buffer): void;
7
+ finish(): {
8
+ type: string;
9
+ itemType: string | null;
10
+ } | null;
11
+ };
@@ -0,0 +1,93 @@
1
+ /** Bounded structural metadata for an event whose text may exceed the wire
2
+ * cap. Long JSON strings become null in a small skeleton, but every escape
3
+ * is still validated. JSON.parse proves the remaining structure. Unknown,
4
+ * malformed or over-complex input never earns permission to discard it. */
5
+ export function jsonlDiscriminants() {
6
+ const skeleton = Buffer.allocUnsafe(64 * 1024);
7
+ const token = Buffer.allocUnsafe(256);
8
+ let size = 0;
9
+ let tokenSize = 0;
10
+ let longString = false;
11
+ let inString = false;
12
+ let escaped = false;
13
+ let unicode = 0;
14
+ let invalid = false;
15
+ const emit = (byte) => {
16
+ if (size >= skeleton.length)
17
+ invalid = true;
18
+ else
19
+ skeleton[size++] = byte;
20
+ };
21
+ const remember = (byte) => {
22
+ if (tokenSize < token.length)
23
+ token[tokenSize++] = byte;
24
+ else
25
+ longString = true;
26
+ };
27
+ return {
28
+ push(bytes) {
29
+ for (const byte of bytes) {
30
+ if (invalid)
31
+ return;
32
+ if (!inString) {
33
+ if (byte === 34) {
34
+ inString = true;
35
+ tokenSize = 0;
36
+ longString = false;
37
+ remember(byte);
38
+ }
39
+ else if (byte === 32 || byte === 9 || byte === 13) {
40
+ if (size === 0 || skeleton[size - 1] !== 32)
41
+ emit(32);
42
+ }
43
+ else
44
+ emit(byte);
45
+ continue;
46
+ }
47
+ remember(byte);
48
+ if (unicode > 0) {
49
+ if (!(byte >= 48 && byte <= 57 || byte >= 65 && byte <= 70 || byte >= 97 && byte <= 102))
50
+ invalid = true;
51
+ unicode--;
52
+ }
53
+ else if (escaped) {
54
+ escaped = false;
55
+ if (byte === 117)
56
+ unicode = 4;
57
+ else if (![34, 92, 47, 98, 102, 110, 114, 116].includes(byte))
58
+ invalid = true;
59
+ }
60
+ else if (byte === 92)
61
+ escaped = true;
62
+ else if (byte === 34) {
63
+ inString = false;
64
+ // A long key also becomes null, which is invalid JSON: refuse
65
+ // classification rather than invent a possibly colliding key.
66
+ const value = longString ? Buffer.from("null") : token.subarray(0, tokenSize);
67
+ for (const one of value)
68
+ emit(one);
69
+ }
70
+ else if (byte < 32)
71
+ invalid = true;
72
+ }
73
+ },
74
+ finish() {
75
+ if (invalid || inString)
76
+ return null;
77
+ try {
78
+ const event = JSON.parse(skeleton.toString("utf8", 0, size));
79
+ if (event === null || typeof event !== "object" || Array.isArray(event))
80
+ return null;
81
+ const { type, item } = event;
82
+ if (typeof type !== "string")
83
+ return null;
84
+ const itemType = item !== null && typeof item === "object" && !Array.isArray(item)
85
+ ? item["type"] : null;
86
+ return { type, itemType: typeof itemType === "string" ? itemType : null };
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ },
92
+ };
93
+ }
package/dist/keys.d.ts ADDED
@@ -0,0 +1,104 @@
1
+ /**
2
+ * Provider API keys, managed instead of ambient (the gap the gemini
3
+ * live-auth work exposed): one 0600 file per provider under
4
+ * ~/.toolroll/keys/ (or an older ~/.standing-orders/keys/), written from the settings card or piped into
5
+ * the CLI — never typed into an argv, never rendered back, never stored
6
+ * in the database a backup might carry.
7
+ *
8
+ * The injection contract lives in the invocation gateway: a stored key is
9
+ * added to EXACTLY its own provider's child environment at spawn, where
10
+ * the adapter's foreign-credential strip has already shed everybody
11
+ * else's. The plane's own process never needs the key in its environment
12
+ * at all — a restart or a rotation is a file write, not a relaunch — and
13
+ * an ambient env var still works as the fallback it always was (the file,
14
+ * being deliberate, wins).
15
+ */
16
+ import type { ProviderId } from "./provider.js";
17
+ /** The ONE env name each provider's own harness reads its key from —
18
+ * where a managed key is INJECTED. */
19
+ export declare const PROVIDER_KEY_ENV: Record<ProviderId, string>;
20
+ /** EVERY env name a provider reads its OWN key from — what subscription
21
+ * mode STRIPS so an ambient key cannot override the login. gemini reads
22
+ * two; the rest read one. */
23
+ export declare const OWN_KEY_ENV: Record<ProviderId, readonly string[]>;
24
+ export declare function keysDir(home?: string): string;
25
+ /**
26
+ * How a provider authenticates (the operator's ruling 2026-08-29: keep
27
+ * BOTH, prefer the subscription). "subscription" uses the CLI's OWN login
28
+ * — a Claude/ChatGPT plan, a Google cached login — and the API key is
29
+ * kept but NOT handed to the process, so its own auth wins. "api-key"
30
+ * hands the stored (or ambient) key to the process. openrouter has no
31
+ * login and is always api-key.
32
+ */
33
+ export type AuthMode = "subscription" | "api-key";
34
+ /** Providers that CAN authenticate without an API key (a subscription or
35
+ * cached login). openrouter cannot — it is api-key only. */
36
+ export declare const SUBSCRIPTION_CAPABLE: Record<ProviderId, boolean>;
37
+ /** The default when nothing is set: subscription where it exists (prefer
38
+ * the plan the operator already pays for), api-key otherwise. */
39
+ export declare const DEFAULT_AUTH_MODE: Record<ProviderId, AuthMode>;
40
+ export declare function readAuthMode(provider: ProviderId, home?: string): AuthMode;
41
+ /**
42
+ * The auth mode as an AUTHORITY reads it (raw authority repair): an absent
43
+ * file is the provider's default, but a file that is present and says
44
+ * neither `subscription` nor `api-key` is a stated problem — never the
45
+ * subscription default a lenient read would coerce it to. A provider with
46
+ * no subscription login is the key, whatever the file says.
47
+ */
48
+ export declare function readAuthModeStrict(provider: ProviderId, home?: string): {
49
+ ok: true;
50
+ mode: AuthMode;
51
+ } | {
52
+ ok: false;
53
+ problem: string;
54
+ };
55
+ export declare function setAuthMode(provider: ProviderId, mode: AuthMode, home?: string): {
56
+ ok: true;
57
+ } | {
58
+ ok: false;
59
+ reason: "no-subscription";
60
+ };
61
+ export declare function keyFileFor(provider: ProviderId, home?: string): string;
62
+ /** Shape check only — never a validity claim. A key is printable ASCII
63
+ * without whitespace, bounded; anything else is a paste accident. */
64
+ export declare function plausibleKey(value: string): boolean;
65
+ export declare function saveProviderKey(provider: ProviderId, value: string, home?: string): {
66
+ ok: true;
67
+ } | {
68
+ ok: false;
69
+ reason: "implausible";
70
+ };
71
+ export declare function readProviderKey(provider: ProviderId, home?: string): string | null;
72
+ export declare function clearProviderKey(provider: ProviderId, home?: string): boolean;
73
+ /**
74
+ * A live credential check that spends NO tokens: each provider exposes a
75
+ * cheap authenticated GET (its model list, or a key-info route) whose only
76
+ * job here is to make the provider's own auth boundary answer yes or no.
77
+ * Injectable fetcher (the converse.ts precedent) so tests never touch the
78
+ * network. Distinguishes a REJECTED key (bad/expired/wrong provider) from
79
+ * an UNREACHABLE provider (offline, blocked) — the operator needs to know
80
+ * which, because only one of them means "fix the key".
81
+ */
82
+ export type KeyVerdict = {
83
+ ok: true;
84
+ } | {
85
+ ok: false;
86
+ reason: "rejected";
87
+ status: number;
88
+ } | {
89
+ ok: false;
90
+ reason: "unreachable";
91
+ } | {
92
+ ok: false;
93
+ reason: "unexpected";
94
+ status: number;
95
+ };
96
+ export declare function verifyProviderKey(provider: ProviderId, value: string, fetcher?: typeof fetch, timeoutMs?: number): Promise<KeyVerdict>;
97
+ /** Words for a verdict, safe to render on any surface (never the key). */
98
+ export declare function verdictWords(provider: ProviderId, verdict: KeyVerdict): string;
99
+ /** What a surface may say about a key: that it exists and when it last
100
+ * changed — NEVER the value, never a prefix, never a length. */
101
+ export declare function keyStatus(provider: ProviderId, home?: string): {
102
+ set: boolean;
103
+ updatedAt: string | null;
104
+ };