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,137 @@
1
+ /**
2
+ * Separation of duties (v102): a project's approval rules. Two can be on at
3
+ * once, and neither changes a thing until a project turns it on.
4
+ *
5
+ * - The person who filed a task can't approve it ("not the requester").
6
+ * - Protected work (the whole project, or tasks that touch protected paths)
7
+ * needs two different people to approve the same exact scope, and an AI
8
+ * teammate or an operating mode can never decide it.
9
+ *
10
+ * The store enforces these at the one place every approval is sealed
11
+ * (`Store.sealScopeApproval`); this module holds the pure parts.
12
+ */
13
+ /** A filer from a name as the ledger writes it: an AI teammate's ends " (AI)"; a coordinator's starts "coordinator:"; none is automation. */
14
+ export function filerFor(name) {
15
+ if (name == null || name === "")
16
+ return { name: null, kind: "automation" };
17
+ if (name.endsWith(" (AI)"))
18
+ return { name, kind: "teammate" };
19
+ if (name.startsWith("coordinator:"))
20
+ return { name, kind: "coordinator" };
21
+ return { name, kind: "person" };
22
+ }
23
+ export const NO_RULES = { notRequester: false, protectProject: false, protectedPaths: [] };
24
+ /** A path as the rules compare it: forward slashes, no "." or "..", lower case (macOS
25
+ * checkouts ignore case). null when it climbs out of the checkout. */
26
+ function normal(path) {
27
+ const parts = [];
28
+ for (const part of path.trim().replace(/\\/g, "/").toLowerCase().split("/")) {
29
+ if (part === "" || part === ".")
30
+ continue;
31
+ if (part === "..") {
32
+ if (parts.length === 0)
33
+ return null;
34
+ parts.pop();
35
+ continue;
36
+ }
37
+ parts.push(part);
38
+ }
39
+ return parts.join("/");
40
+ }
41
+ const clean = (path) => normal(path) ?? "";
42
+ const wild = /[*?[{]/;
43
+ const literalPrefix = (glob) => { const at = glob.search(wild); return at === -1 ? glob : glob.slice(0, at); };
44
+ function globRegex(glob) {
45
+ let out = "";
46
+ for (let i = 0; i < glob.length; i++) {
47
+ const c = glob[i];
48
+ if (c === "*" && glob[i + 1] === "*") {
49
+ out += ".*";
50
+ i++;
51
+ if (glob[i + 1] === "/")
52
+ i++;
53
+ }
54
+ else if (c === "*")
55
+ out += "[^/]*";
56
+ else if (c === "?")
57
+ out += "[^/]";
58
+ else
59
+ out += c.replace(/[.+^${}()|\\[\]]/g, "\\$&");
60
+ }
61
+ return new RegExp(`^${out}(?:/.*)?$`);
62
+ }
63
+ /** Whether a task that says it touches `touch` may touch something under
64
+ * `protectedGlob`, or a changed file is protected. A plain path covers
65
+ * itself and everything under it; a pattern with no slash matches at any
66
+ * depth (as in .gitignore); two patterns that could reach the same files
67
+ * count as overlapping; a path that climbs out of the checkout is
68
+ * protected. Every doubt errs toward protecting. */
69
+ export function touchesProtected(touch, protectedGlob) {
70
+ const g = normal(protectedGlob);
71
+ if (g === null || g === "")
72
+ return false;
73
+ const b = g.includes("/") ? g : `**/${g}`;
74
+ const a = normal(touch);
75
+ if (a === null || a === "")
76
+ return true;
77
+ const pattern = globRegex(b);
78
+ if (!wild.test(a)) {
79
+ if (pattern.test(a))
80
+ return true;
81
+ // A protected pattern that lives inside this path (".github" holding ".github/workflows/**") is reached, whatever the name looks like.
82
+ const pb = literalPrefix(b);
83
+ if (pb === a || pb.startsWith(`${a}/`))
84
+ return true;
85
+ // A file ("docs/readme.md") is only itself; a folder ("infra", or a name with no extension) may hold anything a pattern reaches.
86
+ if (/\.[^/.]+$/.test(a))
87
+ return false;
88
+ return pattern.test(`${a}/x`) || pattern.test(`${a}/x/y.z`) || `${a}/`.startsWith(pb);
89
+ }
90
+ const pa = literalPrefix(a), pb = literalPrefix(b);
91
+ return pa.startsWith(pb) || pb.startsWith(pa);
92
+ }
93
+ /** The changed files (from a build's diff) that the rules protect. */
94
+ export function protectedChanges(rules, changed) {
95
+ if (rules.protectProject)
96
+ return [...changed];
97
+ return changed.filter(file => rules.protectedPaths.some(glob => touchesProtected(file, glob)));
98
+ }
99
+ /** Whether a task's declared paths reach protected work. A task that
100
+ * declares no paths can't show it stays clear, so it counts as protected. */
101
+ export function isProtectedWork(rules, touches) {
102
+ if (rules.protectProject)
103
+ return true;
104
+ if (rules.protectedPaths.length === 0)
105
+ return false;
106
+ if (touches.length === 0)
107
+ return true;
108
+ return touches.some(touch => rules.protectedPaths.some(glob => touchesProtected(touch, glob)));
109
+ }
110
+ /** Protected paths as a person types them: one per line or comma separated, trimmed, deduplicated, at most 50. */
111
+ export function parseProtectedPaths(raw) {
112
+ const paths = [...new Set(raw.split(/[\n,]/).map(clean).filter(one => one !== ""))];
113
+ if (paths.length > 50)
114
+ return { ok: false, problem: "Protect at most 50 paths." };
115
+ const long = paths.find(one => one.length > 200);
116
+ if (long !== undefined)
117
+ return { ok: false, problem: "A protected path is 200 characters at most." };
118
+ return { ok: true, paths };
119
+ }
120
+ /** The rules in a line, for the ledger's before → after. */
121
+ export function rulesWords(rules) {
122
+ const parts = [
123
+ rules.notRequester ? "requester can't approve" : null,
124
+ rules.protectProject ? "whole project protected" : rules.protectedPaths.length > 0 ? `protected: ${rules.protectedPaths.join(", ")}` : null,
125
+ ].filter((one) => one !== null);
126
+ return parts.length === 0 ? "no rules" : parts.join("; ");
127
+ }
128
+ /** What a person reads when the rules stop an approval. */
129
+ export function gateWords(gate) {
130
+ if (gate.verdict === "vote")
131
+ return gate.already
132
+ ? "You've already approved this. It needs a second approver."
133
+ : `Your approval is recorded (${gate.have} of ${gate.need}). This work is protected, so a second person needs to approve it.`;
134
+ return gate.reason === "requester"
135
+ ? "You filed this task, and this project needs someone else to approve it."
136
+ : "This work is protected: a person has to approve it, not an operating mode, a routine or an AI teammate.";
137
+ }
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Settings → Approval rules (v102): a project's separation of duties. An
3
+ * instance operator sets them (with their password, or a fresh sign-in with
4
+ * the identity provider); everyone else reads them. Every change is in the
5
+ * ledger, before → after.
6
+ */
7
+ import type { ApprovalRules } from "./approval-policy.js";
8
+ export declare const APPROVAL_RULES_CSS: string;
9
+ export type ApprovalRulesView = {
10
+ repo: string;
11
+ name: string;
12
+ rules: ApprovalRules & {
13
+ updatedBy: string | null;
14
+ updatedAt: string | null;
15
+ };
16
+ canChange: boolean;
17
+ /** People who can approve on this project (two approvers need two). */
18
+ approvers: number;
19
+ };
20
+ /** The rules in plain words, for anyone who can see the project. */
21
+ export declare function rulesSummary(rules: ApprovalRules): string;
22
+ export declare function approvalRulesHtml(view: ApprovalRulesView, csrf: string, notice: {
23
+ said?: string | null;
24
+ problem?: string | null;
25
+ }): string;
@@ -0,0 +1,39 @@
1
+ const e = (value) => String(value ?? "").replace(/[&<>"']/g, c => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c]);
2
+ export const APPROVAL_RULES_CSS = `.approval-rules{max-width:720px;min-width:0}.approval-rules fieldset{border:0;padding:0;margin:18px 0 0;min-width:0}` +
3
+ `.approval-rules legend{font-weight:600;font-size:.875rem;margin-bottom:8px}.approval-rules .choice{display:grid;grid-template-columns:auto minmax(0,1fr);gap:10px;align-items:start;margin:0 0 10px;font-weight:400}` +
4
+ `.approval-rules .choice input{margin:.2rem 0 0}.approval-rules .choice strong{display:block;font-size:.875rem;font-weight:500}.approval-rules .choice small{display:block;color:var(--muted-foreground);font-size:.8125rem;margin-top:2px}` +
5
+ `.approval-rules textarea{min-height:88px;font-family:var(--font-mono);font-size:.8125rem}.approval-rules .paths{margin:4px 0 0 26px}` +
6
+ `.approval-rules .current{margin:0 0 4px}.approval-rules .step-up{margin-top:16px}.approval-rules button[type=submit]{margin-top:14px}`;
7
+ /** The rules in plain words, for anyone who can see the project. */
8
+ export function rulesSummary(rules) {
9
+ const parts = [];
10
+ if (rules.notRequester)
11
+ parts.push("The person who filed a task can't approve it.");
12
+ if (rules.protectProject)
13
+ parts.push("All work here is protected: two people approve it, never an AI teammate or an operating mode.");
14
+ else if (rules.protectedPaths.length > 0)
15
+ parts.push(`Work touching ${rules.protectedPaths.join(", ")} is protected: two people approve it, never an AI teammate or an operating mode.`);
16
+ return parts.length === 0 ? "No approval rules: anyone who can approve on this project can approve its work, including their own." : parts.join(" ");
17
+ }
18
+ export function approvalRulesHtml(view, csrf, notice) {
19
+ const note = notice.problem ? `<p class="problem" role="alert">${e(notice.problem)}</p>` : notice.said ? `<p role="status">${e(notice.said)}</p>` : "";
20
+ const changed = view.rules.updatedBy === null ? "" : ` <span class="meta">Changed by ${e(view.rules.updatedBy)} on ${e((view.rules.updatedAt ?? "").slice(0, 10))}.</span>`;
21
+ const current = `<p class="current">${e(rulesSummary(view.rules))}${changed}</p>`;
22
+ if (!view.canChange)
23
+ return `<section class="approval-rules">${note}${current}<p class="meta">An instance operator sets these.</p></section>`;
24
+ const protect = view.rules.protectProject ? "project" : view.rules.protectedPaths.length > 0 ? "paths" : "none";
25
+ const radio = (value, title, hint) => `<label class="choice"><input type="radio" name="protect" value="${value}"${protect === value ? " checked" : ""}><span><strong>${title}</strong><small>${hint}</small></span></label>`;
26
+ const few = view.approvers < 2 ? `<p class="meta">Only ${view.approvers === 1 ? "one person" : "no one"} can approve on this project, so protected work would wait for a second approver. Add one in People first.</p>` : "";
27
+ return `<section class="approval-rules">${note}${current}` +
28
+ `<form method="post" action="/settings/approval"><input type="hidden" name="csrf" value="${e(csrf)}"><input type="hidden" name="repo" value="${e(view.repo)}">` +
29
+ `<fieldset><legend>Who approves</legend><label class="choice"><input type="checkbox" name="not_requester" value="1"${view.rules.notRequester ? " checked" : ""}>` +
30
+ `<span><strong>Someone other than the requester</strong><small>The person who filed a task, or asked for a revision, can't approve it. Operating modes stop approving their signer's own filings here.</small></span></label></fieldset>` +
31
+ `<fieldset><legend>Protected work</legend>` +
32
+ radio("none", "Nothing protected", "One approval is enough.") +
33
+ radio("project", "The whole project", "Every task needs two different people to approve the same scope.") +
34
+ radio("paths", "Only these paths", "Tasks that touch them, or don't say what they touch, need two people.") +
35
+ `<div class="paths"><label>Protected paths, one per line<textarea name="paths" spellcheck="false" placeholder="infra/**&#10;migrations/**">${e(view.rules.protectedPaths.join("\n"))}</textarea></label></div>` +
36
+ few + `</fieldset>` +
37
+ `<div class="step-up"><label>Your Toolroll password<input type="password" name="password" autocomplete="current-password"></label></div>` +
38
+ `<button type="submit">Save rules</button></form></section>`;
39
+ }
@@ -0,0 +1,180 @@
1
+ import { type AssignmentSnapshot } from "./assignment.js";
2
+ import type { Store } from "./store.js";
3
+ export declare const ASSIGNMENT_ACTIONS: readonly ["show", "updates", "claim", "check", "brief", "inbox", "ack"];
4
+ export type AssignmentOperation = typeof ASSIGNMENT_ACTIONS[number];
5
+ type Args = Record<string, unknown>;
6
+ type Failure = {
7
+ ok: false;
8
+ reason: string;
9
+ message: string;
10
+ };
11
+ export declare const ASSIGNMENT_TOOLS: readonly [{
12
+ readonly name: "get_assignment";
13
+ readonly operation: "show";
14
+ readonly description: "Read one assignment's root, current execution, owner, exact result and handoff receipt. Approval, proof and deployment remain separate facts.";
15
+ readonly inputSchema: {
16
+ type: string;
17
+ properties: Record<string, unknown>;
18
+ required: string[];
19
+ additionalProperties: boolean;
20
+ };
21
+ }, {
22
+ readonly name: "list_assignment_updates";
23
+ readonly operation: "updates";
24
+ readonly description: "Read durable assignment updates in your projects after a cursor. Save nextCursor after processing; repeated reads do not acknowledge or deliver anything.";
25
+ readonly inputSchema: {
26
+ type: string;
27
+ properties: Record<string, unknown>;
28
+ required: string[];
29
+ additionalProperties: boolean;
30
+ };
31
+ }, {
32
+ readonly name: "claim_assignment";
33
+ readonly operation: "claim";
34
+ readonly description: "Record yourself as this assignment's lead. Repeating your claim is safe; another active owner cannot be replaced. This grants no approval or execution authority.";
35
+ readonly inputSchema: {
36
+ type: string;
37
+ properties: Record<string, unknown>;
38
+ required: string[];
39
+ additionalProperties: boolean;
40
+ };
41
+ }, {
42
+ readonly name: "acknowledge_assignment";
43
+ readonly operation: "check";
44
+ readonly description: "Acknowledge the exact ready-to-check receipt as its lead, using the current receipt digest. This does not accept failed proof, answer decisions, approve work, publish or deploy.";
45
+ readonly inputSchema: {
46
+ type: string;
47
+ properties: Record<string, unknown>;
48
+ required: string[];
49
+ additionalProperties: boolean;
50
+ };
51
+ }, {
52
+ readonly name: "get_assignment_brief";
53
+ readonly operation: "brief";
54
+ readonly description: "Catch up from the local database: current work, decisions, saved results and project knowledge. Bounded read only; no model call or task mutation.";
55
+ readonly inputSchema: {
56
+ type: string;
57
+ properties: Record<string, unknown>;
58
+ required: string[];
59
+ additionalProperties: boolean;
60
+ };
61
+ }, {
62
+ readonly name: "get_assignment_inbox";
63
+ readonly operation: "inbox";
64
+ readonly description: "Receive a durable batch of your assignments' status changes. Use a stable consumer name. Until acknowledged, the same batch survives reconnects and restarts. Receiving never completes or reruns work.";
65
+ readonly inputSchema: {
66
+ type: string;
67
+ properties: Record<string, unknown>;
68
+ required: string[];
69
+ additionalProperties: boolean;
70
+ };
71
+ }, {
72
+ readonly name: "acknowledge_assignment_delivery";
73
+ readonly operation: "ack";
74
+ readonly description: "Acknowledge receipt of an inbox batch after handling its updates. This advances only your delivery cursor; it never marks work complete, answers a decision or starts a revision.";
75
+ readonly inputSchema: {
76
+ type: string;
77
+ properties: Record<string, unknown>;
78
+ required: string[];
79
+ additionalProperties: boolean;
80
+ };
81
+ }];
82
+ /** The CLI and MCP use the same bounded input contract. MCP also validates its
83
+ * descriptor before dispatch; this check protects direct adapter callers. */
84
+ export declare function assignmentArgumentProblem(operation: AssignmentOperation, args: Args): string | null;
85
+ /** Every read and mutation authenticates inside the same transaction as its
86
+ * projection. A cached name/allowlist cannot keep a revoked identity alive. */
87
+ export declare function assignmentForCoordinator(store: Store, token: string, operation: AssignmentOperation, args: Args, now: Date, evidenceRoot?: string): Failure | {
88
+ ok: true;
89
+ body: import("./assignment-brief.js").AssignmentCatchUp;
90
+ } | {
91
+ ok: true;
92
+ body: {
93
+ events: {
94
+ id: number;
95
+ createdAt: string;
96
+ rootId: string;
97
+ digest: string;
98
+ superseded: boolean;
99
+ assignment: {
100
+ version: 1;
101
+ rootId: string;
102
+ activeTaskId: string;
103
+ state: "cancelled" | "checking" | "complete" | "needs-decision" | "ready-to-check" | "working";
104
+ detail: string;
105
+ owner: (import("./assignment.js").AssignmentOwner & {
106
+ active: boolean;
107
+ }) | null;
108
+ primaryAction: import("./work-summary.js").WorkAction | null;
109
+ attention: string[];
110
+ attempts: number;
111
+ handoff: {
112
+ kind: "result" | "decision" | "attention";
113
+ digest: string;
114
+ acknowledged: boolean;
115
+ } | null;
116
+ completion: {
117
+ actor: string;
118
+ at: string;
119
+ digest: string;
120
+ } | null;
121
+ result: {
122
+ digest: string;
123
+ taskId: string;
124
+ runId: number;
125
+ base: string | null;
126
+ head: string | null;
127
+ completionKind: "accepted-exception" | "checked-build" | "finished-build" | "research-report" | "verified-build" | null;
128
+ checks: import("./assignment.js").AssignmentChecks;
129
+ proofAcceptance: import("./store.js").ProofAcceptanceRow | null;
130
+ verdict: "attested" | "refuted" | "short" | "verified" | null;
131
+ criteria: {
132
+ passed: number;
133
+ total: number;
134
+ };
135
+ evidence: "recorded";
136
+ } | null;
137
+ publication: {
138
+ state: string;
139
+ prUrl: string | null;
140
+ remoteState: string | null;
141
+ } | null;
142
+ deployment: {
143
+ status: "not-recorded";
144
+ };
145
+ };
146
+ }[];
147
+ nextCursor: number;
148
+ hasMore: boolean;
149
+ };
150
+ } | {
151
+ ok: true;
152
+ body: AssignmentSnapshot;
153
+ } | {
154
+ ok: true;
155
+ body: {
156
+ ok: true;
157
+ batch: import("./assignment-delivery.js").AssignmentDeliveryBatch;
158
+ replayed: boolean;
159
+ } | {
160
+ ok: true;
161
+ alreadyAcknowledged: boolean;
162
+ cursor: number;
163
+ };
164
+ };
165
+ export type AssignmentCliContext = {
166
+ commandName?: string;
167
+ store: Store;
168
+ write: (line: string) => void;
169
+ json: boolean;
170
+ now: Date;
171
+ evidenceRoot?: string;
172
+ env?: NodeJS.ProcessEnv;
173
+ };
174
+ /** Explicit secret source only. Never print secret values or discover default
175
+ * files. A bad explicit credential must not fall back to a local read. */
176
+ export declare function coordinatorToken(flags: Map<string, string | true>, env: NodeJS.ProcessEnv): {
177
+ token: string | null;
178
+ } | Failure;
179
+ export declare function runAssignmentCommand(positional: readonly string[], flags: Map<string, string | true>, context: AssignmentCliContext): number;
180
+ export {};
@@ -0,0 +1,239 @@
1
+ /** Assignment reads and delivery acknowledgments. These adapters never start
2
+ * work, answer a decision, accept proof, or change an approval. */
3
+ import { readFileSync, statSync } from "node:fs";
4
+ import { authenticateCoordinator } from "./coordinator.js";
5
+ import { assignmentOf, assignmentUpdates, claimAssignment, checkAssignment } from "./assignment.js";
6
+ import { assignmentCatchUp } from "./assignment-brief.js";
7
+ import { assignmentInbox, acknowledgeAssignmentDelivery } from "./assignment-delivery.js";
8
+ import { syncAssignmentStatuses } from "./assignment-status.js";
9
+ import { envelopeJson } from "./envelope.js";
10
+ export const ASSIGNMENT_ACTIONS = ["show", "updates", "claim", "check", "brief", "inbox", "ack"];
11
+ const failure = (reason, message) => ({ ok: false, reason, message });
12
+ const reference = { type: "string", minLength: 1, maxLength: 64 };
13
+ const digest = { type: "string", minLength: 64, maxLength: 64, pattern: "^[a-f0-9]{64}$" };
14
+ const batchId = { type: "string", minLength: 32, maxLength: 32, pattern: "^[a-f0-9]{32}$" };
15
+ const consumer = { type: "string", minLength: 1, maxLength: 64, pattern: "^[a-z0-9][a-z0-9-]{0,63}$" };
16
+ const object = (properties, required = []) => ({ type: "object", properties, required, additionalProperties: false });
17
+ export const ASSIGNMENT_TOOLS = [
18
+ { name: "get_assignment", operation: "show", description: "Read one assignment's root, current execution, owner, exact result and handoff receipt. Approval, proof and deployment remain separate facts.", inputSchema: object({ ref: reference }, ["ref"]) },
19
+ { name: "list_assignment_updates", operation: "updates", description: "Read durable assignment updates in your projects after a cursor. Save nextCursor after processing; repeated reads do not acknowledge or deliver anything.", inputSchema: object({ after: { type: "integer", minimum: 0, maximum: Number.MAX_SAFE_INTEGER }, limit: { type: "integer", minimum: 1, maximum: 100 } }) },
20
+ { name: "claim_assignment", operation: "claim", description: "Record yourself as this assignment's lead. Repeating your claim is safe; another active owner cannot be replaced. This grants no approval or execution authority.", inputSchema: object({ ref: reference }, ["ref"]) },
21
+ { name: "acknowledge_assignment", operation: "check", description: "Acknowledge the exact ready-to-check receipt as its lead, using the current receipt digest. This does not accept failed proof, answer decisions, approve work, publish or deploy.", inputSchema: object({ ref: reference, digest }, ["ref", "digest"]) },
22
+ { name: "get_assignment_brief", operation: "brief", description: "Catch up from the local database: current work, decisions, saved results and project knowledge. Bounded read only; no model call or task mutation.", inputSchema: object({ repo: { type: "string", minLength: 1, maxLength: 4096 }, limit: { type: "integer", minimum: 1, maximum: 25 } }) },
23
+ { name: "get_assignment_inbox", operation: "inbox", description: "Receive a durable batch of your assignments' status changes. Use a stable consumer name. Until acknowledged, the same batch survives reconnects and restarts. Receiving never completes or reruns work.", inputSchema: object({ consumer, limit: { type: "integer", minimum: 1, maximum: 100 } }, ["consumer"]) },
24
+ { name: "acknowledge_assignment_delivery", operation: "ack", description: "Acknowledge receipt of an inbox batch after handling its updates. This advances only your delivery cursor; it never marks work complete, answers a decision or starts a revision.", inputSchema: object({ consumer, batchId }, ["consumer", "batchId"]) },
25
+ ];
26
+ /** The CLI and MCP use the same bounded input contract. MCP also validates its
27
+ * descriptor before dispatch; this check protects direct adapter callers. */
28
+ export function assignmentArgumentProblem(operation, args) {
29
+ if (!ASSIGNMENT_ACTIONS.includes(operation))
30
+ return "Choose show, updates, claim, check, brief, inbox, or ack.";
31
+ const allowed = operation === "brief" ? ["repo", "limit"] : operation === "inbox" ? ["consumer", "limit"] : operation === "ack" ? ["consumer", "batchId"] : operation === "updates" ? ["after", "limit"] : operation === "check" ? ["ref", "digest"] : ["ref"];
32
+ for (const key of Object.keys(args))
33
+ if (!allowed.includes(key))
34
+ return `Unknown argument: ${key}.`;
35
+ if (["show", "claim", "check"].includes(operation) && (typeof args["ref"] !== "string" || args["ref"].length < 1 || args["ref"].length > 64 || /[\u0000-\u001f\u007f]/.test(args["ref"])))
36
+ return "Choose a task id, 1–64 characters without control characters.";
37
+ if (operation === "check" && (typeof args["digest"] !== "string" || !/^[a-f0-9]{64}$/.test(args["digest"])))
38
+ return "Use the exact 64-character receipt digest from assignment show.";
39
+ if ((operation === "inbox" || operation === "ack") && (typeof args["consumer"] !== "string" || !/^[a-z0-9][a-z0-9-]{0,63}$/.test(args["consumer"])))
40
+ return "Use a stable consumer name with 1–64 lowercase letters, digits or hyphens.";
41
+ if (operation === "ack" && (typeof args["batchId"] !== "string" || !/^[a-f0-9]{32}$/.test(args["batchId"])))
42
+ return "Use the exact batchId from assignment inbox.";
43
+ if (args["repo"] !== undefined && (typeof args["repo"] !== "string" || args["repo"].length < 1 || args["repo"].length > 4096 || /[\u0000-\u001f\u007f]/.test(args["repo"])))
44
+ return "Choose a project path without control characters.";
45
+ for (const [name, min, max] of [["after", 0, Number.MAX_SAFE_INTEGER], ["limit", 1, operation === "brief" ? 25 : 100]]) {
46
+ const value = args[name];
47
+ if (value !== undefined && (typeof value !== "number" || !Number.isSafeInteger(value) || value < min || value > max))
48
+ return `${name} must be an integer from ${min} to ${max}.`;
49
+ }
50
+ return null;
51
+ }
52
+ function readAssignment(store, operation, args, now, access, root) {
53
+ if (operation === "brief")
54
+ return { ok: true, body: assignmentCatchUp(store, now, access, { ...(args["repo"] === undefined ? {} : { repo: String(args["repo"]) }), ...(args["limit"] === undefined ? {} : { limit: Number(args["limit"]) }) }, root) };
55
+ if (operation === "updates")
56
+ return { ok: true, body: assignmentUpdates(store, now, access, { after: Number(args["after"] ?? 0), limit: Number(args["limit"] ?? 50) }, root) };
57
+ const assignment = assignmentOf(store, String(args["ref"]), now, access, root);
58
+ return assignment === null ? failure("not-found", "No assignment with that task id is available in your projects.") : { ok: true, body: assignment };
59
+ }
60
+ /** Every read and mutation authenticates inside the same transaction as its
61
+ * projection. A cached name/allowlist cannot keep a revoked identity alive. */
62
+ export function assignmentForCoordinator(store, token, operation, args, now, evidenceRoot) {
63
+ const problem = assignmentArgumentProblem(operation, args);
64
+ if (problem !== null)
65
+ return failure("usage", problem);
66
+ // Authenticate before maintenance, then authenticate again inside delivery.
67
+ // Reconciliation owns one short transaction per family and cannot sit under
68
+ // the delivery transaction's writer reservation.
69
+ if (operation === 'inbox') {
70
+ const authenticated = authenticateCoordinator(store, token);
71
+ if (!authenticated.ok)
72
+ return failure('unauthenticated', 'The coordinator credential is unavailable or revoked.');
73
+ syncAssignmentStatuses(store, now, authenticated.who.repos, evidenceRoot);
74
+ }
75
+ const project = () => {
76
+ const authenticated = authenticateCoordinator(store, token);
77
+ if (!authenticated.ok)
78
+ return failure("unauthenticated", "The coordinator credential is unavailable or revoked.");
79
+ const { who } = authenticated;
80
+ if (operation === "show" || operation === "updates" || operation === "brief")
81
+ return readAssignment(store, operation, args, now, { principal: "coordinator", repos: who.repos }, evidenceRoot);
82
+ const owner = { kind: "coordinator", id: who.cid, label: who.name };
83
+ if (operation === "inbox" || operation === "ack") {
84
+ const delivered = operation === "inbox"
85
+ ? assignmentInbox(store, owner, { consumer: String(args["consumer"]), ...(args["limit"] === undefined ? {} : { limit: Number(args["limit"]) }) }, now)
86
+ : acknowledgeAssignmentDelivery(store, owner, { consumer: String(args["consumer"]), batchId: String(args["batchId"]) }, now);
87
+ return delivered.ok ? { ok: true, body: delivered } : delivered;
88
+ }
89
+ const result = operation === "claim"
90
+ ? claimAssignment(store, String(args["ref"]), owner, now, evidenceRoot)
91
+ : checkAssignment(store, String(args["ref"]), String(args["digest"]), owner, now, evidenceRoot);
92
+ return result.ok ? { ok: true, body: result.assignment } : result;
93
+ };
94
+ return operation === 'show' || operation === 'updates' || operation === 'brief'
95
+ ? store.savepoint(project) : store.transact(project);
96
+ }
97
+ function assignmentLines(assignment) {
98
+ const receipt = assignment.receipt;
99
+ return [
100
+ `${assignment.rootId} · ${assignment.state}`,
101
+ assignment.detail,
102
+ `Current task: ${assignment.activeTaskId}`,
103
+ `Lead: ${assignment.owner === null ? "unclaimed" : `${assignment.owner.label}${assignment.owner.active ? "" : " (no longer has access)"}`}`,
104
+ ...(receipt === null ? [] : [
105
+ `Result: ${receipt.taskId} · run ${receipt.runId}`,
106
+ `Result type: ${receipt.completionKind === "verified-build" ? "verified build" : receipt.completionKind === "checked-build" ? "checks passed; lead review" : receipt.completionKind === "finished-build" ? "finished work; inspect check results" : receipt.completionKind === "research-report" ? "research report" : receipt.completionKind === "accepted-exception" ? "accepted exception" : "execution needs attention"}`,
107
+ ...(receipt.proofAcceptance === null ? [] : [`Recorded acceptance: ${receipt.proofAcceptance.approver}${receipt.proofAcceptance.note === null ? "" : ` · ${receipt.proofAcceptance.note}`}`]),
108
+ `Candidate: ${receipt.head ?? "not recorded"} (base ${receipt.base ?? "not recorded"})`,
109
+ `Checks: ${receipt.checks.detail}${receipt.checks.command === null ? "" : ` (${receipt.checks.command})`}`,
110
+ `Proof: ${receipt.proof?.verdict ?? "not recorded"} · evidence ${receipt.evidence}`,
111
+ ...(receipt.proof === null ? [] : [`Criteria: ${receipt.proof.matrix.filter(row => row.state === "pass").length}/${receipt.proof.matrix.length} recorded as passed`]),
112
+ ...receipt.caveats.map(one => `Recorded limitation: ${one}`),
113
+ ...(receipt.agentReport === null ? [] : [`Agent report: ${receipt.agentReport}`]),
114
+ `Receipt: ${receipt.digest}`,
115
+ ]),
116
+ ...(assignment.savedContext === undefined ? [] : [
117
+ ...(assignment.savedContext.goal === null ? [] : [`Goal: ${assignment.savedContext.goal}`]),
118
+ ...(assignment.savedContext.outOfScope === null ? [] : [`Out of scope: ${assignment.savedContext.outOfScope}`]),
119
+ ...assignment.savedContext.excerpts.map(one => `Saved ${one.kind} #${one.artifactId} (run ${one.runId}, ${one.sha256})${one.shortened ? " [shortened]" : ""}:\n${one.text ?? one.problem}`),
120
+ ]),
121
+ ...(assignment.completion === null ? [] : [`Handled by: ${assignment.completion.actor} at ${assignment.completion.at}`]),
122
+ ...assignment.attention.filter(one => one !== assignment.detail).map(one => `Attention: ${one}`),
123
+ ...(assignment.primaryAction === null ? [] : [`Next: ${assignment.primaryAction.label} (${assignment.primaryAction.access})`]),
124
+ `Publication: ${assignment.publication === null ? "not recorded" : assignment.publication.state}${assignment.publication?.prUrl ? ` · ${assignment.publication.prUrl}` : ""}`,
125
+ "Deployment: not recorded",
126
+ ];
127
+ }
128
+ function resultLines(body) {
129
+ if ("rootId" in body)
130
+ return assignmentLines(body);
131
+ if ("batch" in body)
132
+ return [
133
+ body.batch.events.length === 0 ? "No new assignment updates." : `${body.batch.events.length} assignment update${body.batch.events.length === 1 ? "" : "s"}.`,
134
+ ...body.batch.events.map(event => JSON.stringify(event)),
135
+ ...(body.batch.id === null ? [] : [`After handling: assignment ack --consumer ${body.batch.consumer} --batch ${body.batch.id}`]),
136
+ ...(body.batch.hasMore ? ["More updates remain after this batch."] : []),
137
+ ];
138
+ if ("alreadyAcknowledged" in body)
139
+ return [body.alreadyAcknowledged ? "This delivery was already acknowledged." : "Delivery acknowledged. Task status is unchanged."];
140
+ if ("assignments" in body)
141
+ return [
142
+ `Catch-up · ${body.asOf}`,
143
+ ...(body.assignments.length === 0 ? ["No assignments in this snapshot."] : body.assignments.flatMap(one => [
144
+ `${one.title} · ${one.state}`,
145
+ one.detail,
146
+ ...(one.goal === null ? [] : [`Goal: ${one.goal}`]),
147
+ ...(one.outcome === null ? [] : [`Saved agent report: ${one.outcome}`]),
148
+ ...one.decisions.filter(decision => decision.state !== "answered").map(decision => `Question: ${decision.question}`),
149
+ `Read: assignment show ${one.rootId}`,
150
+ ])),
151
+ ...body.projects.flatMap(project => [
152
+ `Knowledge: ${project.repo} · ${project.knowledge.status}${project.knowledge.revision === null ? "" : ` (version ${project.knowledge.revision})`}`,
153
+ ...(project.knowledge.instructions ? [project.knowledge.instructions] : []),
154
+ ]),
155
+ ...(body.omissions.assignments || body.omissions.decisions || body.omissions.projects || body.omissions.textFields
156
+ ? [`Shortened: ${body.omissions.assignments} assignments, ${body.omissions.decisions} decisions, ${body.omissions.projects} projects, ${body.omissions.textFields} text fields.`] : []),
157
+ ...body.omissions.notes,
158
+ ];
159
+ return [
160
+ ...(body.events.length === 0 ? ["No new assignment updates."] : body.events.flatMap(event => [
161
+ `Update ${event.id}${event.superseded ? " (superseded; inspect the current assignment)" : ""}`,
162
+ `${event.assignment.rootId} · ${event.assignment.state}`,
163
+ event.assignment.detail,
164
+ `Current task: ${event.assignment.activeTaskId}`,
165
+ `Read: assignment show ${event.assignment.rootId}`,
166
+ ])),
167
+ `Next cursor: ${body.nextCursor}${body.hasMore ? " · more updates available" : ""}`,
168
+ ];
169
+ }
170
+ /** Explicit secret source only. Never print secret values or discover default
171
+ * files. A bad explicit credential must not fall back to a local read. */
172
+ export function coordinatorToken(flags, env) {
173
+ const envName = flags.get("token-env"), path = flags.get("token-file");
174
+ if (envName !== undefined && path !== undefined)
175
+ return failure("usage", "Choose either --token-env NAME or --token-file PATH.");
176
+ if (envName === undefined && path === undefined)
177
+ return { token: null };
178
+ let raw;
179
+ if (typeof envName === "string") {
180
+ if (!/^[A-Za-z_][A-Za-z0-9_]*$/.test(envName))
181
+ return failure("usage", "--token-env names an environment variable.");
182
+ raw = env[envName];
183
+ }
184
+ else if (typeof path === "string") {
185
+ try {
186
+ const info = statSync(path);
187
+ if (!info.isFile() || info.size > 16_384)
188
+ return failure("usage", "The explicit token file must be a regular file no larger than 16 KiB.");
189
+ raw = readFileSync(path, "utf8");
190
+ }
191
+ catch {
192
+ return failure("unauthenticated", "The explicit token file could not be read.");
193
+ }
194
+ }
195
+ const token = raw?.trim();
196
+ if (!token || token.length > 4096 || /\s/.test(token))
197
+ return failure("unauthenticated", "The explicit credential source must contain one coordinator token.");
198
+ return { token };
199
+ }
200
+ export function runAssignmentCommand(positional, flags, context) {
201
+ const operation = positional[0];
202
+ const command = context.commandName ?? (ASSIGNMENT_ACTIONS.includes(operation) ? `assignment ${operation}` : "assignment");
203
+ const emit = (result) => {
204
+ if (context.json)
205
+ context.write(envelopeJson(result.ok ? { ok: true, command, result: result.body } : { ...result, command }));
206
+ else if (!result.ok)
207
+ context.write(result.message);
208
+ else
209
+ context.write(resultLines(result.body).join("\n"));
210
+ return result.ok ? 0 : result.reason === "usage" ? 2 : 3;
211
+ };
212
+ if (!ASSIGNMENT_ACTIONS.includes(operation))
213
+ return emit(failure("usage", "Use assignment show <task>, updates, claim <task>, check <task> --digest <receipt>, brief, inbox --consumer <name>, or ack --consumer <name> --batch <id>."));
214
+ const operationFlags = operation === "brief" ? ["repo", "limit"] : operation === "inbox" ? ["consumer", "limit"] : operation === "ack" ? ["consumer", "batch"] : operation === "updates" ? ["after", "limit"] : operation === "check" ? ["digest"] : [];
215
+ const allowed = new Set(["json", "db", "token-env", "token-file", ...operationFlags]);
216
+ for (const flag of flags.keys())
217
+ if (!allowed.has(flag))
218
+ return emit(failure("usage", `--${flag} is not an assignment ${operation} option.`));
219
+ const hasTask = ["show", "claim", "check"].includes(operation);
220
+ if (positional.length !== (hasTask ? 2 : 1))
221
+ return emit(failure("usage", hasTask ? `assignment ${operation} takes exactly one task id.` : `assignment ${operation} takes no task argument.`));
222
+ const args = hasTask ? { ref: positional[1] } : {};
223
+ for (const flag of operationFlags) {
224
+ const value = flags.get(flag);
225
+ if (value !== undefined)
226
+ args[flag === "batch" ? "batchId" : flag] = ["after", "limit"].includes(flag) ? typeof value === "string" && /^\d+$/.test(value) ? Number(value) : NaN : value;
227
+ }
228
+ const problem = assignmentArgumentProblem(operation, args);
229
+ if (problem !== null)
230
+ return emit(failure("usage", problem));
231
+ const credential = coordinatorToken(flags, context.env ?? process.env);
232
+ if ("ok" in credential)
233
+ return emit(credential);
234
+ if (credential.token !== null)
235
+ return emit(assignmentForCoordinator(context.store, credential.token, operation, args, context.now, context.evidenceRoot));
236
+ if (operation === "claim" || operation === "check" || operation === "inbox" || operation === "ack")
237
+ return emit(failure("unauthenticated", "Use --token-env NAME or --token-file PATH with your coordinator credential to own an assignment or receive and acknowledge its updates."));
238
+ return emit(readAssignment(context.store, operation, args, context.now, { principal: "operator", repos: null, includeUnplaced: true }, context.evidenceRoot));
239
+ }