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,216 @@
1
+ import { TeamLeads } from "./team-leads.js";
2
+ import { tooLongText } from "./chat-channel.js";
3
+ import { MATE_MESSAGE_MAX_CHARS } from "./mate.js";
4
+ import { phoneText } from "./telegram-status.js";
5
+ /** `/team` lists, `/team <n>` chooses, `/team off` (or `private`) leaves.
6
+ * The bare word works too, because Slack and Discord keep unregistered
7
+ * slash text for themselves. Any other text is not ours. */
8
+ export function roomCommand(text) {
9
+ const trimmed = text.trim();
10
+ if (/^\/?team(?:@\w+)?\s*$/i.test(trimmed))
11
+ return { kind: "list" };
12
+ const pick = /^\/?team(?:@\w+)?\s+([1-9][0-9]{0,2})\s*$/i.exec(trimmed);
13
+ if (pick !== null)
14
+ return { kind: "select", index: Number(pick[1]) };
15
+ if (/^\/?team(?:@\w+)?\s+(?:off|private)\s*$/i.test(trimmed))
16
+ return { kind: "off" };
17
+ return /^\/team(?:@\w+)?(?:\s|$)/i.test(trimmed) ? { kind: "list" } : null;
18
+ }
19
+ export const PAIR_FIRST = "Pair your account first: open Settings in Toolroll, choose this chat service, and send the code here in a private chat.";
20
+ export function teamRequestId(channel, chatId, updateKey) {
21
+ return `${channel}:${chatId}:${updateKey}`;
22
+ }
23
+ function domainFor(store, projects) {
24
+ return new TeamLeads(store, () => projects ?? []);
25
+ }
26
+ export function conversationRow(store, id) {
27
+ const row = store.handle.prepare("SELECT c.id, c.title, c.thread, c.lead, c.visibility, l.name FROM team_conversation c JOIN team_lead l ON l.id = c.lead WHERE c.id = ?").get(id);
28
+ return row === undefined ? null : { conversation: String(row["id"]), title: String(row["title"]), thread: Number(row["thread"]), lead: String(row["lead"]), leadName: String(row["name"]), visibility: String(row["visibility"]) };
29
+ }
30
+ function conversationsFor(domain, actor) {
31
+ try {
32
+ const snapshot = domain.snapshot(actor);
33
+ return snapshot.conversations.map(conversation => ({ conversation, leadName: snapshot.leads.find(lead => lead.id === conversation.leadId)?.name ?? "lead" }));
34
+ }
35
+ catch {
36
+ return [];
37
+ }
38
+ }
39
+ function managerOf(domain, actor, conversationId) {
40
+ try {
41
+ return domain.access(actor, conversationId, "manager").role === "manager";
42
+ }
43
+ catch {
44
+ return false;
45
+ }
46
+ }
47
+ function privateListing(rows, current) {
48
+ if (rows.length === 0)
49
+ return "You are not in any team conversation yet. Join one in Toolroll under Chat → Team chat, then send /team again.";
50
+ const lines = ["Your conversations", ""];
51
+ rows.forEach((row, index) => {
52
+ lines.push(`${index + 1}. ${phoneText(row.conversation.title, 80)} — ${row.conversation.visibility === "team" ? "Team" : "Private"} · lead ${phoneText(row.leadName, 40)}${row.conversation.id === current ? " (current)" : ""}`);
53
+ });
54
+ lines.push("", current === null ? "This chat talks to your private assistant. Send /team <number> to talk in a conversation instead." : "Send /team <number> to switch, or /team off for your private assistant.");
55
+ return lines.join("\n");
56
+ }
57
+ function groupListing(rows, current) {
58
+ if (rows.length === 0)
59
+ return "No team conversation you manage is available to this room. Create one in Toolroll under Chat → Team chat, then send /team again.";
60
+ const lines = [current === null ? "Choose the conversation this room follows" : "This room follows a conversation", ""];
61
+ rows.forEach((row, index) => {
62
+ lines.push(`${index + 1}. ${phoneText(row.conversation.title, 80)} — lead ${phoneText(row.leadName, 40)}${row.conversation.id === current ? " (current)" : ""}`);
63
+ });
64
+ lines.push("", "Send /team <number> to follow it (managers only), or /team off to stop. Everyone in this room will read its replies.");
65
+ return lines.join("\n");
66
+ }
67
+ /**
68
+ * Handle one inbound message that belongs to the team layer. Returns true
69
+ * when it was consumed here (a `/team` command in any chat, any message in
70
+ * a followed room, or a private message while a conversation is selected);
71
+ * false hands the message to the transport's personal path untouched.
72
+ */
73
+ export function applyRoomInbound(input) {
74
+ const { store, backend, chatId, isGroup, sender, now, report, say } = input;
75
+ const command = roomCommand(input.text);
76
+ const room = backend.room(chatId);
77
+ const domain = domainFor(store, input.projects);
78
+ const paired = sender !== null && store.accountOf(sender.approver)?.role === "approver";
79
+ const actor = sender === null ? null : { name: sender.approver, generation: sender.generation };
80
+ if (command !== null) {
81
+ report.statusReplies = (report.statusReplies ?? 0) + 1;
82
+ if (!paired || actor === null) {
83
+ say(PAIR_FIRST);
84
+ return true;
85
+ }
86
+ const rows = conversationsFor(domain, actor).filter(row => !isGroup || (row.conversation.visibility === "team" && managerOf(domain, actor, row.conversation.id)));
87
+ const current = room?.conversation ?? null;
88
+ if (command.kind === "list") {
89
+ say(isGroup ? groupListing(rows, current) : privateListing(rows, current));
90
+ return true;
91
+ }
92
+ if (command.kind === "off") {
93
+ const ended = room !== null && (!isGroup || managerOf(domain, actor, room.conversation) || room.boundBy === actor.name) && backend.unbind(chatId, actor.name);
94
+ say(ended ? (isGroup ? "This room no longer follows a conversation." : "Back to your private assistant.") : isGroup ? "This room follows nothing you can change." : "This chat already talks to your private assistant.");
95
+ return true;
96
+ }
97
+ const chosen = rows[command.index - 1];
98
+ if (chosen === undefined) {
99
+ say("Choose a number from the list: send /team to see it.");
100
+ return true;
101
+ }
102
+ const bound = backend.bind({ chatId, kind: isGroup ? "group" : "private", conversation: chosen.conversation.id, by: actor.name, binding: sender.binding });
103
+ if (!bound.ok) {
104
+ say("Another room already follows that conversation. Stop it there first, or choose a different conversation.");
105
+ return true;
106
+ }
107
+ say(isGroup
108
+ ? `This room now follows ${phoneText(chosen.conversation.title, 80)} (lead ${phoneText(chosen.leadName, 40)}). Paired members' messages go there; everyone here reads its replies. Send /team off to stop.`
109
+ : `This chat now talks in ${phoneText(chosen.conversation.title, 80)} (lead ${phoneText(chosen.leadName, 40)}). Send /team off for your private assistant.`);
110
+ return true;
111
+ }
112
+ if (room === null) {
113
+ // A room the bot merely sits in stays silent; a private chat falls through to the personal assistant.
114
+ if (isGroup)
115
+ report.ignored++;
116
+ return isGroup;
117
+ }
118
+ if (!paired || actor === null) {
119
+ // Unpaired members' chatter is nobody's message. A slash attempt gets the one hint.
120
+ if (input.text.trimStart().startsWith("/")) {
121
+ say(PAIR_FIRST);
122
+ report.statusReplies = (report.statusReplies ?? 0) + 1;
123
+ }
124
+ else
125
+ report.ignored++;
126
+ return true;
127
+ }
128
+ const trimmed = input.text.trim();
129
+ if (trimmed === "") {
130
+ report.ignored++;
131
+ return true;
132
+ }
133
+ if (trimmed.length > MATE_MESSAGE_MAX_CHARS) {
134
+ say(tooLongText(trimmed.length));
135
+ report.chatRefused = (report.chatRefused ?? 0) + 1;
136
+ return true;
137
+ }
138
+ const row = conversationRow(store, room.conversation);
139
+ if (row === null) {
140
+ backend.unbind(chatId, "system");
141
+ report.ignored++;
142
+ return true;
143
+ }
144
+ // A current sender must not queue into a destination whose sharing grant
145
+ // ended: it could run successfully while every reply is withheld.
146
+ if (!roomGrantAllowed(store, domain, backend, room)) {
147
+ say(isGroup ? "This room's connection ended. Ask a conversation manager to send /team and connect it again." : "This chat's connection ended. Send /team and choose the conversation again.");
148
+ report.chatRefused = (report.chatRefused ?? 0) + 1;
149
+ return true;
150
+ }
151
+ // Membership first, in the domain's own words: a removed person is told so.
152
+ try {
153
+ domain.access(actor, row.conversation, "contributor");
154
+ }
155
+ catch (error) {
156
+ say(phoneText(error instanceof Error ? error.message : "You cannot talk in this conversation.", 300));
157
+ report.chatRefused = (report.chatRefused ?? 0) + 1;
158
+ return true;
159
+ }
160
+ // Consent is the person's own, per conversation, and is checked before the
161
+ // message is saved: an unconsented message must not sit in the shared queue.
162
+ const session = store.teamMateSession(actor.name, row.thread);
163
+ if (session === null || session.approverGeneration !== actor.generation || session.endedAt !== null) {
164
+ say(`${phoneText(row.title, 80)}: enable chat for yourself in Toolroll first (it shows the provider and limits), then send again.`, { label: "Enable chat", path: `/chat?conversation=${encodeURIComponent(row.conversation)}` });
165
+ report.chatRefused = (report.chatRefused ?? 0) + 1;
166
+ return true;
167
+ }
168
+ const answer = domain.execute(actor, { operation: "send", args: { conversationId: row.conversation, requestId: teamRequestId(input.channel, chatId, input.updateKey), text: trimmed } }, now);
169
+ if (!answer.ok) {
170
+ say(phoneText(answer.message, 300));
171
+ report.chatRefused = (report.chatRefused ?? 0) + 1;
172
+ return true;
173
+ }
174
+ report.chatQueued = (report.chatQueued ?? 0) + 1;
175
+ return true;
176
+ }
177
+ /** Whether the pairing a room was granted from still holds: live, the same
178
+ * person, still a manager of a team conversation for a group (a viewer for a
179
+ * private selection). */
180
+ export function roomGrantAllowed(store, domain, backend, room) {
181
+ const grant = backend.grant(room.binding);
182
+ if (grant === null || grant.approver !== room.boundBy || (room.kind === "private" && grant.chatId !== room.chatId))
183
+ return false;
184
+ try {
185
+ const access = domain.access({ name: grant.approver, generation: grant.generation }, room.conversation, room.kind === "group" ? "manager" : "viewer");
186
+ return room.kind !== "group" || access.conversation.visibility === "team";
187
+ }
188
+ catch {
189
+ return false;
190
+ }
191
+ }
192
+ export function teamDomain(store, projects) { return domainFor(store, projects); }
193
+ /** The conversation messages a room has not received yet, oldest first. */
194
+ export function roomMessagesAfter(store, thread, cursor, limit = 20) {
195
+ return store.handle.prepare(`SELECT m.id, m.role, m.text, m.turn, q.author, q.request_id, q.status FROM mate_message m
196
+ LEFT JOIN team_message q ON q.message = m.id WHERE m.thread = ? AND m.id > ? ORDER BY m.id LIMIT ?`).all(thread, cursor, limit)
197
+ .map(row => ({ id: Number(row["id"]), role: row["role"] === "assistant" ? "assistant" : "operator", text: String(row["text"]), turn: row["turn"] === null ? null : Number(row["turn"]),
198
+ author: row["author"] === null || row["author"] === undefined ? null : String(row["author"]), requestId: row["request_id"] === null || row["request_id"] === undefined ? null : String(row["request_id"]), status: row["status"] === null || row["status"] === undefined ? null : String(row["status"]) }));
199
+ }
200
+ /** What a room shows for one message: the lead's reply as is, a teammate's message with its author, this room's own messages and cancelled ones not at all. */
201
+ export function roomMessageText(message, channel, chatId) {
202
+ if (message.role === "assistant")
203
+ return message.text;
204
+ const own = message.requestId !== null && message.requestId.startsWith(`${channel}:${chatId}:`);
205
+ if (own || message.status === "cancelled" || message.author === null || message.author.length === 0)
206
+ return null;
207
+ return `${phoneText(message.author, 40)}: ${message.text}`;
208
+ }
209
+ /** Whose binding a room card rides: the person the lead was answering, else any paired participant. */
210
+ export function roomCardApprover(store, conversation, turn, paired) {
211
+ const author = store.handle.prepare("SELECT author FROM team_message WHERE turn_id = ?").get(turn);
212
+ if (author !== undefined && paired.includes(String(author["author"])))
213
+ return String(author["author"]);
214
+ const members = new Set(store.handle.prepare("SELECT account FROM team_participant WHERE conversation = ? AND active = 1").all(conversation).map(one => String(one["account"])));
215
+ return paired.find(one => members.has(one)) ?? null;
216
+ }
@@ -0,0 +1,44 @@
1
+ import { type Store } from "./store.js";
2
+ import type { VerifiedApprover } from "./principal.js";
3
+ import { type StopRequest } from "./task-control.js";
4
+ export declare const CHAT_TASK_ACTIONS: {
5
+ readonly stop: {
6
+ readonly label: "Stop task";
7
+ readonly detail: "Pauses this task once the run acknowledges the stop. Saved work remains; other tasks continue.";
8
+ };
9
+ readonly resume: {
10
+ readonly label: "Review resume";
11
+ readonly detail: "Opens password confirmation to lift this stop’s hold and continue from saved work. Other holds and approval requirements still apply.";
12
+ };
13
+ readonly retry: {
14
+ readonly label: "Try again";
15
+ readonly detail: "Queues another attempt. Existing approvals and holds still apply.";
16
+ };
17
+ readonly plan: {
18
+ readonly label: "Plan first";
19
+ readonly detail: "Requests a plan. Building still requires approval.";
20
+ };
21
+ readonly wait_for: {
22
+ readonly label: "Add dependency";
23
+ readonly detail: "Waits for the selected task to finish.";
24
+ };
25
+ readonly stop_waiting: {
26
+ readonly label: "Remove dependency";
27
+ readonly detail: "Stops waiting for the selected task. Other requirements still apply.";
28
+ };
29
+ };
30
+ export declare function isChatTaskAction(value: unknown): value is keyof typeof CHAT_TASK_ACTIONS;
31
+ /** Bind cards to a specific execution and its current state, not the family's moving pointer. */
32
+ export declare function chatTaskStamp(store: Store, who: VerifiedApprover, task: string): string | null;
33
+ /** Only current, eligible controls can become cards; retain the exact run the reader saw. */
34
+ export declare function chatTaskRun(store: Store, task: string, operation: "stop" | "resume", now: Date): number | null;
35
+ export declare function applyChatTaskAction(store: Store, who: VerifiedApprover, payload: Record<string, unknown>, now: Date, web: boolean, controls?: Pick<StopRequest, "held" | "deferSignal"> & {
36
+ via?: StopRequest["via"];
37
+ }): {
38
+ ok: true;
39
+ taskId: string;
40
+ said: string;
41
+ } | {
42
+ ok: false;
43
+ message: string;
44
+ };
@@ -0,0 +1,79 @@
1
+ import { verifiedAuthor } from "./store.js";
2
+ import { requestTaskStop, taskControlOf } from "./task-control.js";
3
+ import { authorizePlanUnderMode } from "./plan-auto.js";
4
+ export const CHAT_TASK_ACTIONS = {
5
+ // Build #1604 feedback: one short consequence that still says saved work
6
+ // remains, other tasks continue, and the pause waits for acknowledgement.
7
+ stop: { label: "Stop task", detail: "Pauses this task once the run acknowledges the stop. Saved work remains; other tasks continue." },
8
+ resume: { label: "Review resume", detail: "Opens password confirmation to lift this stop’s hold and continue from saved work. Other holds and approval requirements still apply." },
9
+ retry: { label: "Try again", detail: "Queues another attempt. Existing approvals and holds still apply." },
10
+ plan: { label: "Plan first", detail: "Requests a plan. Building still requires approval." },
11
+ wait_for: { label: "Add dependency", detail: "Waits for the selected task to finish." },
12
+ stop_waiting: { label: "Remove dependency", detail: "Stops waiting for the selected task. Other requirements still apply." },
13
+ };
14
+ export function isChatTaskAction(value) {
15
+ return typeof value === "string" && Object.hasOwn(CHAT_TASK_ACTIONS, value);
16
+ }
17
+ /** Bind cards to a specific execution and its current state, not the family's moving pointer. */
18
+ export function chatTaskStamp(store, who, task) {
19
+ const ref = store.lookupRef(task), row = store.getTask(task);
20
+ if (!ref?.repo || !who.repos.includes(ref.repo) || row === null)
21
+ return null;
22
+ const family = store.taskFamilyOf(task, who.repos, false);
23
+ if (!family || family.problem || family.current.id !== task)
24
+ return null;
25
+ return JSON.stringify([task, row.state, row.updatedAt, store.getScope(task)?.digest ?? null,
26
+ ref.plan, store.runsFor(ref.id)[0]?.id ?? null, store.blockers(task).sort()]);
27
+ }
28
+ /** Only current, eligible controls can become cards; retain the exact run the reader saw. */
29
+ export function chatTaskRun(store, task, operation, now) {
30
+ const ref = store.lookupRef(task);
31
+ if (ref === null)
32
+ return null;
33
+ const control = taskControlOf(store, ref.id, now);
34
+ return (operation === "stop" && control.kind === "stop") || (operation === "resume" && control.kind === "paused") ? control.run : null;
35
+ }
36
+ export function applyChatTaskAction(store, who, payload, now, web, controls = {}) {
37
+ const task = payload["task"], operation = payload["operation"];
38
+ if (typeof task !== "string" || !isChatTaskAction(operation))
39
+ return { ok: false, message: "This task action is incomplete." };
40
+ const stamp = chatTaskStamp(store, who, task);
41
+ if (stamp === null || stamp !== payload["stamp"])
42
+ return { ok: false, message: "This task changed. Review it again before confirming." };
43
+ const ref = store.lookupRef(task);
44
+ if (store.openContestFor(ref.id) !== null)
45
+ return { ok: false, message: "Wait for the agent comparison to finish." };
46
+ if (operation === "stop" || operation === "resume") {
47
+ if (store.isDemo())
48
+ return { ok: false, message: "The demo authorizes nothing." };
49
+ const run = chatTaskRun(store, task, operation, now);
50
+ if (run === null || run !== payload["run"])
51
+ return { ok: false, message: "This attempt changed. Review the current task before confirming." };
52
+ // Resume remains the existing nonce + password ceremony. A proposal only opens it.
53
+ if (operation === "resume")
54
+ return { ok: true, taskId: task, said: `Resume review requested for ${task}. Complete the password confirmation on the task to resume.` };
55
+ const { via, ...rest } = controls;
56
+ const result = requestTaskStop(store, { taskId: task, runId: run, by: verifiedAuthor(who.name), via: via ?? (web ? "web" : "cli"), ...rest }, now);
57
+ return result.ok ? { ok: true, taskId: task, said: `Stop requested for ${task}, run #${run}.` }
58
+ : { ok: false, message: result.detail };
59
+ }
60
+ if (operation === "retry") {
61
+ const result = store.requeueTask(task, who.name, now);
62
+ return result.ok ? { ok: true, taskId: task, said: "Task queued again." } : { ok: false, message: result.reason === "claimed" ? "This task is already running." : result.reason === "not-stalled" ? "This task does not need another attempt." : "That task is no longer available." };
63
+ }
64
+ if (operation === "plan") {
65
+ const result = store.requestPlan(ref.id, now);
66
+ if (!result.ok)
67
+ return { ok: false, message: `Could not request a plan: ${result.reason}.` };
68
+ if (web)
69
+ authorizePlanUnderMode(store, task, who.name, now);
70
+ return { ok: true, taskId: task, said: "Plan requested. Building still requires approval." };
71
+ }
72
+ const other = payload["dependency"];
73
+ const otherRef = typeof other === "string" ? store.lookupRef(other) : null;
74
+ if (!otherRef?.repo || !who.repos.includes(otherRef.repo))
75
+ return { ok: false, message: "That dependency is not in your projects." };
76
+ const result = operation === "wait_for" ? store.addEdge(task, other) : store.removeEdge(task, other);
77
+ return result.ok ? { ok: true, taskId: task, said: operation === "wait_for" ? "Dependency added." : "Dependency removed." }
78
+ : { ok: false, message: "The dependency could not be changed. Review the current task." };
79
+ }
@@ -0,0 +1,51 @@
1
+ /** Live facts extracted from the approved check's ordinary output. */
2
+ export declare const CHECK_SUITES: readonly ["unit", "flows", "app"];
3
+ export type CheckSuiteName = (typeof CHECK_SUITES)[number];
4
+ export type CheckSuiteState = "pending" | "running" | "passed" | "failed" | "unknown";
5
+ export type CheckSuiteProgress = {
6
+ state: CheckSuiteState;
7
+ passed: number;
8
+ failed: number;
9
+ skipped: number;
10
+ total: number | null;
11
+ /** Only when the journeys run in parallel groups: how many groups have passed or failed, of how many. */
12
+ groups?: CheckGroupsProgress;
13
+ };
14
+ export type CheckGroupsProgress = {
15
+ passed: number;
16
+ failed: number;
17
+ total: number;
18
+ };
19
+ export type CheckProgressSnapshot = {
20
+ version: 1;
21
+ final: boolean;
22
+ line: string;
23
+ suites: Record<CheckSuiteName, CheckSuiteProgress>;
24
+ };
25
+ export declare function checkProgressLine(suites: Record<CheckSuiteName, CheckSuiteProgress>): string;
26
+ /** A machine-only count line that is safe to send through a push provider. */
27
+ export declare function isCheckProgressLine(value: string): boolean;
28
+ export declare function parseCheckProgressSnapshot(raw: string): CheckProgressSnapshot | null;
29
+ /**
30
+ * Incrementally reads stdout and stderr. Each stream keeps its own partial
31
+ * line so simultaneous journey output cannot splice two records together.
32
+ */
33
+ export declare class CheckProgressTracker {
34
+ private readonly update;
35
+ private readonly suites;
36
+ private readonly buffers;
37
+ private readonly events;
38
+ private last;
39
+ private recognized;
40
+ private parallel;
41
+ constructor(update: (snapshot: CheckProgressSnapshot) => void);
42
+ feed(chunk: string, stream?: "stdout" | "stderr"): void;
43
+ finish(): CheckProgressSnapshot | null;
44
+ snapshot(final?: boolean): CheckProgressSnapshot;
45
+ private emit;
46
+ private read;
47
+ /** One group's journey line: count its events, and take its own totals line as that group's result. */
48
+ private readGroup;
49
+ /** The suite is the sum of its groups; its total is known once every group has reported one. */
50
+ private summarize;
51
+ }