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,66 @@
1
+ import { type FlowDefinition, type FlowStage } from "./flows.js";
2
+ import type { FlowCardRow, FlowRow, Store } from "./store.js";
3
+ export type FlowAdvance = {
4
+ moved: number;
5
+ filed: string[];
6
+ problems: string[];
7
+ };
8
+ /** The flow's drawing, or null when it can't be read (the card then says so and waits). */
9
+ export declare function flowDefinitionOf(flow: FlowRow): FlowDefinition | null;
10
+ /** Where a card's link opens: the flow's canvas with the card selected. */
11
+ export declare const flowCardHref: (flow: number, card: number) => string;
12
+ /** Where a confirmed flow action may point: a flow's canvas, maybe with one card open. */
13
+ export declare const FLOW_HREF: RegExp;
14
+ /** Advance every active card in one project's flows. */
15
+ export declare function advanceFlows(store: Store, repo: string, now: Date, options?: {
16
+ evidenceRoot?: string;
17
+ }): FlowAdvance;
18
+ export type FlowAct = {
19
+ ok: true;
20
+ said: string;
21
+ card: number;
22
+ } | {
23
+ ok: false;
24
+ message: string;
25
+ };
26
+ /** A card's words, checked once for every door: a title, an optional description, and no keys, because cards become agent instructions. */
27
+ export declare function flowCardText(title: unknown, description: unknown): {
28
+ title: string;
29
+ description: string | null;
30
+ } | {
31
+ problem: string;
32
+ };
33
+ /** Add a card to a flow, in its start zone unless a zone is named. */
34
+ export declare function addCardToFlow(store: Store, flow: FlowRow, input: {
35
+ title: unknown;
36
+ description: unknown;
37
+ stage: string | null;
38
+ }, actor: string, now: Date): FlowAct;
39
+ /** Move a card to another zone of its flow by hand; the zone's step runs on the next pass. */
40
+ export declare function moveCardInFlow(store: Store, card: FlowCardRow, to: string, actor: string, now: Date): FlowAct;
41
+ /** Take a card out of its flow; the tasks it filed are left as they are. */
42
+ export declare function cancelFlowCard(store: Store, card: FlowCardRow, actor: string, now: Date): FlowAct;
43
+ export type FlowDecision = {
44
+ ok: true;
45
+ said: string;
46
+ } | {
47
+ ok: false;
48
+ message: string;
49
+ };
50
+ /** A person's decision on a card waiting in an approval zone. A send back to a build zone whose work has a result becomes a revision of that work. */
51
+ /** The draft a decision is about: the draft zone that sends its cards to this one. */
52
+ export declare function draftFor(definition: FlowDefinition, stage: FlowStage): FlowStage | null;
53
+ export declare function decideFlowCard(store: Store, input: {
54
+ card: number;
55
+ decision: "approve" | "send-back";
56
+ note: string | null;
57
+ actor: string;
58
+ repos: readonly string[];
59
+ evidenceRoot?: string;
60
+ /** The draft as the person left it: approving sends this version on. */
61
+ draft?: string | null;
62
+ /** The visit the person saw (a chat button's): a card that moved on since is refused. */
63
+ entry?: number;
64
+ /** v92: the AI teammate (by handle) deciding a zone it staffs; `actor` is then how it reads in history. */
65
+ teammate?: string;
66
+ }, now: Date): FlowDecision;
@@ -0,0 +1,416 @@
1
+ /**
2
+ * The flow engine: moves cards through their flow's zones. Deterministic
3
+ * and model-free — it runs in a worker's pass beside routines, files work
4
+ * through the ordinary task door (so every approval and check a task needs
5
+ * still applies), reads task state, posts messages through the outbox, and
6
+ * waits for people. See flows.ts for what each zone does.
7
+ */
8
+ import { assignmentOf } from "./assignment.js";
9
+ import { filerFor } from "./approval-policy.js";
10
+ import { diagnoseTaskDispatch } from "./dispatch.js";
11
+ import { deciderOf, durationWords, fillFlowText, validateFlowDefinition } from "./flows.js";
12
+ import { reportSummaryFor } from "./report-summary.js";
13
+ import { fileTaskProposal } from "./proposal.js";
14
+ import { requestResultChanges } from "./result-actions.js";
15
+ import { revisionSourceOf } from "./result-review.js";
16
+ import { scanForSecrets } from "./evidence.js";
17
+ import { cardFollowers, notifyPeople } from "./flow-people.js";
18
+ import { keptDraft } from "./flow-draft.js";
19
+ import { parseSoul, teammateLabel } from "./teammates.js";
20
+ /** The flow's drawing, or null when it can't be read (the card then says so and waits). */
21
+ export function flowDefinitionOf(flow) {
22
+ try {
23
+ return validateFlowDefinition(JSON.parse(flow.definitionJson));
24
+ }
25
+ catch {
26
+ return null;
27
+ }
28
+ }
29
+ /** Where a card's link opens: the flow's canvas with the card selected. */
30
+ export const flowCardHref = (flow, card) => `/flows/${flow}?card=${card}`;
31
+ /** Where a confirmed flow action may point: a flow's canvas, maybe with one card open. */
32
+ export const FLOW_HREF = /^\/flows\/[1-9][0-9]{0,9}(\?card=[1-9][0-9]{0,9})?$/;
33
+ const ACCEPTANCE = {
34
+ report: [{ id: "c1", statement: "The report answers the request, citing where in the repository each point comes from", how: null, evidence: ["manual-review"] }],
35
+ task: [{ id: "c1", statement: "The requested change is made and the project's existing checks still pass", how: null, evidence: ["manual-review"] }],
36
+ };
37
+ function fill(template, card) {
38
+ return fillFlowText(template, { title: card.title, description: card.description, note: card.note, outputs: card.outputs });
39
+ }
40
+ /** A work zone's goal: its words filled from the card, plus the card and any send-back note when the words leave
41
+ * them out. "Fix the bug on the card" says nothing on its own (found in the real e2e: the builder saw only the branch name). */
42
+ function workGoal(instructions, card) {
43
+ const names = (key) => new RegExp(`\\{\\{\\s*${key.replace(".", "\\.")}\\s*\\}\\}`).test(instructions);
44
+ const extra = [
45
+ ...(names("card.title") || names("card.description") ? [] : [`The card: {{card.title}}${card.description ? "\n\n{{card.description}}" : ""}`]),
46
+ ...(names("card.title") && !names("card.description") && card.description ? ["Details on the card:\n{{card.description}}"] : []),
47
+ ...(names("note") || !card.note ? [] : ["Changes asked for: {{note}}"]),
48
+ ];
49
+ return fill([instructions, ...extra].join("\n\n"), card);
50
+ }
51
+ const titleIn = (definition, id) => definition.stages.find(one => one.id === id)?.title ?? id;
52
+ /** A teammate's name as its soul file gives it (its handle when the file can't be read). */
53
+ function teammateName(mate) {
54
+ const read = parseSoul(mate.soul);
55
+ return read.ok ? read.soul.name : mate.handle;
56
+ }
57
+ /** What a teammate said when it handed a card to its person, or why it couldn't decide. */
58
+ function handoffWords(mate, turn) {
59
+ const read = parseSoul(mate.soul);
60
+ const label = read.ok ? teammateLabel(read.soul) : mate.handle;
61
+ let note = "";
62
+ try {
63
+ const decided = JSON.parse(turn.decisionJson ?? "{}");
64
+ note = typeof decided.note === "string" ? decided.note : "";
65
+ }
66
+ catch {
67
+ note = "";
68
+ }
69
+ return { label, said: turn.state === "failed" ? `${label} couldn't decide this one (${turn.result ?? "it didn't finish"}), so it's yours.` : `${label}: ${note || "Over to you on this one."}` };
70
+ }
71
+ /** Advance every active card in one project's flows. */
72
+ export function advanceFlows(store, repo, now, options = {}) {
73
+ const outcome = { moved: 0, filed: [], problems: [] };
74
+ const flows = new Map();
75
+ for (const card of store.activeFlowCards(repo)) {
76
+ let entry = flows.get(card.flow);
77
+ if (entry === undefined) {
78
+ const flow = store.getFlow(card.flow);
79
+ if (flow === null)
80
+ continue;
81
+ entry = { flow, definition: flowDefinitionOf(flow) };
82
+ flows.set(card.flow, entry);
83
+ }
84
+ try {
85
+ advanceCard(store, entry.flow, entry.definition, card, now, options, outcome);
86
+ }
87
+ catch (error) {
88
+ outcome.problems.push(`flow card ${card.id}: ${error instanceof Error ? error.message : "could not advance"}`);
89
+ }
90
+ }
91
+ return outcome;
92
+ }
93
+ function advanceCard(store, flow, definition, card, now, options, outcome) {
94
+ if (definition === null) {
95
+ store.updateFlowCard(card.id, { waiting: "This flow's drawing can't be read. Open the flow and save it again." }, now);
96
+ return;
97
+ }
98
+ const stage = definition.stages.find(one => one.id === card.stage);
99
+ if (stage === undefined) {
100
+ // The zone was removed while the card sat in it: back to the start.
101
+ if (store.moveFlowCard(card.id, { to: definition.start, outcome: "moved", actor: "flow", note: null, expectEntry: card.entry }, now))
102
+ outcome.moved++;
103
+ return;
104
+ }
105
+ const onward = (result, note, task) => {
106
+ const to = result === "ok" ? stage.next : stage.onFail;
107
+ if (to === null) {
108
+ if (result === "ok" && stage.next === null)
109
+ store.updateFlowCard(card.id, { waiting: "Finished here. Move the card on when you're ready." }, now);
110
+ return;
111
+ }
112
+ if (store.moveFlowCard(card.id, { to, outcome: result, actor: "flow", ...(note === undefined ? {} : { note }), ...(task === undefined ? {} : { task }), expectEntry: card.entry }, now)) {
113
+ outcome.moved++;
114
+ if (result === "fail" && card.owner !== null)
115
+ notifyPeople(store, card, [card.owner], null, { key: `failed:${card.entry}`, subject: `“${card.title}” went back to ${titleIn(definition, to)}`, body: `${note ?? "Its step didn't finish."} It's in ${titleIn(definition, to)} now.`, attention: true }, now);
116
+ }
117
+ };
118
+ // A time limit (v91): once a card has sat here that long, the person it waits on hears about it, once,
119
+ // and a Holding or "Person decides" zone can move it on.
120
+ if (stage.limit !== undefined && stage.kind !== "wait" && stage.kind !== "done") {
121
+ const entered = Date.parse(store.flowCardEnteredAt(card.id) ?? card.updatedAt);
122
+ if (now.getTime() >= entered + stage.limit.minutes * 60_000) {
123
+ const decider = stage.kind === "approval" ? deciderOf(stage, flow) : null;
124
+ const to = stage.limit.to;
125
+ notifyPeople(store, card, [decider ?? card.owner ?? flow.owner], null, { key: `limit:${card.entry}`, attention: true,
126
+ subject: `“${card.title}” has waited ${durationWords(stage.limit.minutes)} in ${stage.title}`,
127
+ body: to === null ? `It's still in ${stage.title}.` : `It's moving to ${titleIn(definition, to)}.` }, now);
128
+ if (to !== null && store.moveFlowCard(card.id, { to, outcome: "moved", actor: "flow", historyNote: `Waited more than ${durationWords(stage.limit.minutes)} in ${stage.title}`, expectEntry: card.entry }, now)) {
129
+ outcome.moved++;
130
+ return;
131
+ }
132
+ }
133
+ }
134
+ switch (stage.kind) {
135
+ case "inbox":
136
+ if (card.waiting !== null)
137
+ store.updateFlowCard(card.id, { waiting: null }, now);
138
+ return;
139
+ case "wait": {
140
+ const wait = stage.wait ?? { for: "reply", minutes: 24 * 60 };
141
+ const entered = Date.parse(store.flowCardEnteredAt(card.id) ?? card.updatedAt);
142
+ const words = durationWords(wait.minutes);
143
+ if (now.getTime() < entered + wait.minutes * 60_000) {
144
+ // Replies are taken as they're read (flow-replies.ts), which moves the card on; until then it says what it waits for.
145
+ const watch = wait.for === "reply" ? store.flowMailWatch() : null;
146
+ const trouble = watch !== null && watch.failures > 0 && watch.lastOutcome !== null ? ` ${watch.lastOutcome}` : "";
147
+ // How long is on the card itself (when it moves on, in the viewer's own time); this says what for.
148
+ const waiting = wait.for === "time" ? "Waiting before moving on." : `Waiting for a reply.${trouble}`;
149
+ if (card.waiting !== waiting)
150
+ store.updateFlowCard(card.id, { waiting }, now);
151
+ return;
152
+ }
153
+ if (wait.for === "time") {
154
+ onward("ok");
155
+ return;
156
+ }
157
+ if (stage.onFail !== null) {
158
+ if (store.moveFlowCard(card.id, { to: stage.onFail, outcome: "moved", actor: "flow", historyNote: `No reply after ${words}`, expectEntry: card.entry }, now))
159
+ outcome.moved++;
160
+ return;
161
+ }
162
+ const waiting = `No reply after ${words}. Move the card on when you're ready.`;
163
+ if (card.waiting !== waiting) {
164
+ store.updateFlowCard(card.id, { waiting }, now);
165
+ notifyPeople(store, card, [card.owner ?? flow.owner], null, { key: `no-reply:${card.entry}`, subject: `No reply to “${card.title}” after ${words}`, body: `It's waiting in ${stage.title}.`, attention: true }, now);
166
+ }
167
+ return;
168
+ }
169
+ case "done":
170
+ store.updateFlowCard(card.id, { state: "done", waiting: null }, now);
171
+ notifyPeople(store, card, cardFollowers(store, card), null, { key: `done:${card.entry}`, subject: `Done: “${card.title}”`, body: `“${card.title}” reached ${stage.title} in ${flow.name}.` }, now);
172
+ return;
173
+ case "notify": {
174
+ const message = fill(stage.message ?? card.title, card);
175
+ store.enqueueNotification({
176
+ dedupeKey: `flow:${card.id}:${card.entry}`, kind: "flow-message",
177
+ subject: `${flow.name}: ${message}`.slice(0, 200), body: `${message}\n\nCard: ${card.title}`.slice(0, 2000),
178
+ link: flowCardHref(flow.id, card.id), source: { project: flow.repo },
179
+ }, now);
180
+ onward("ok");
181
+ return;
182
+ }
183
+ case "approval": {
184
+ const decider = deciderOf(stage, flow);
185
+ const who = decider ?? "an approver";
186
+ // v92: a zone an active teammate staffs is its to decide first (the step pass runs it). A person hears
187
+ // about the card only when the teammate hands it over, can't decide, or is paused or gone.
188
+ // v102: on a protected project an AI teammate never decides; the person does.
189
+ const mate = stage.teammate === undefined || store.approvalRules(flow.repo).protectProject ? null : store.teammateByHandle(flow.repo, stage.teammate);
190
+ const turn = mate === null ? null : store.flowStepRun(card.id, card.entry);
191
+ const handed = turn !== null && turn.kind === "teammate" && (turn.state === "failed" || turn.state === "passed");
192
+ if (mate !== null && mate.state === "active" && !handed) {
193
+ const name = teammateName(mate);
194
+ if (card.waiting !== `${name} is deciding`)
195
+ store.updateFlowCard(card.id, { waiting: `${name} is deciding` }, now);
196
+ return;
197
+ }
198
+ const handoff = handed && mate !== null ? handoffWords(mate, turn) : null;
199
+ if (card.waiting === null || (mate !== null && card.waiting === `${teammateName(mate)} is deciding`)) {
200
+ // A named decider hears it alone; "anyone who approves" pages everyone who can.
201
+ // With a draft in front of it, the decision carries the draft itself: it can be read (and answered) where it arrives.
202
+ const draft = draftFor(definition, stage);
203
+ const text = draft === null ? undefined : card.outputs[draft.id];
204
+ store.enqueueNotification({
205
+ dedupeKey: `flow-decide:${card.id}:${card.entry}`, kind: "flow-decision", pushClass: "attention", ...(decider === null ? {} : { recipient: decider }),
206
+ subject: (handoff !== null ? `${handoff.label}: ${card.title} needs ${decider === null ? "a decision" : `${decider}'s decision`}` : `${flow.name}: ${card.title} needs ${decider === null ? "a decision" : `${decider}'s decision`}`).slice(0, 200),
207
+ body: `${handoff === null ? "" : `${handoff.said}\n\n`}${text === undefined ? `${stage.title}: approve it, or send it back with a note.`
208
+ : `${stage.title}: approve this draft to send it as written, edit it, or send it back with a note.\n\n${text}`}`.slice(0, 4000),
209
+ link: flowCardHref(flow.id, card.id), source: { project: flow.repo },
210
+ }, now);
211
+ store.updateFlowCard(card.id, { waiting: `Waiting for ${who} to approve or send it back` }, now);
212
+ }
213
+ return;
214
+ }
215
+ case "task":
216
+ case "report":
217
+ workStage(store, flow, stage, card, now, options, outcome, onward);
218
+ return;
219
+ case "check":
220
+ case "update":
221
+ case "sort":
222
+ case "draft":
223
+ case "request":
224
+ case "email":
225
+ case "tool":
226
+ // Run by the worker's step pass (flow-steps.ts), which moves the card on.
227
+ return;
228
+ }
229
+ }
230
+ function workStage(store, flow, stage, card, now, options, outcome, onward) {
231
+ if (card.task === null) {
232
+ const report = stage.kind === "report";
233
+ const filed = fileTaskProposal(store, {
234
+ title: (report ? `${stage.title}: ${card.title}` : card.title).slice(0, 200),
235
+ repo: flow.repo,
236
+ goal: workGoal(stage.instructions ?? card.title, card).slice(0, 8000),
237
+ filedVia: `flow:${flow.id}`, filedBy: filerFor(card.createdBy), // who made the card asked for the work (an owner can be reassigned by anyone)
238
+ deliverable: report ? "report" : "branch",
239
+ planning: report ? "skip" : stage.planning ?? "auto",
240
+ acceptance: report ? ACCEPTANCE.report : ACCEPTANCE.task,
241
+ admittedRepos: [flow.repo],
242
+ }, now);
243
+ if (!filed.ok) {
244
+ store.updateFlowCard(card.id, { waiting: `Couldn't file the work: ${filed.message}` }, now);
245
+ return;
246
+ }
247
+ store.updateFlowCard(card.id, { task: filed.id, ...(report || card.primaryTask !== null ? {} : { primaryTask: filed.id }), waiting: "Filed as a task" }, now);
248
+ outcome.filed.push(filed.id);
249
+ return;
250
+ }
251
+ // A send back may have made a revision: follow the task's current version.
252
+ const family = store.taskFamilyOf(card.task, [flow.repo], false);
253
+ const current = family?.current.id ?? card.task;
254
+ const task = store.getTask(current);
255
+ if (task === null) {
256
+ store.updateFlowCard(card.id, { waiting: "Its task is gone. Move the card to try again." }, now);
257
+ return;
258
+ }
259
+ if (task.state === "done") {
260
+ // A build whose project checks failed is done but not good: it takes the failure path, like a failed build.
261
+ if (stage.kind === "task") {
262
+ const checks = assignmentOf(store, current, now, { principal: "operator", repos: [flow.repo] }, options.evidenceRoot)?.receipt?.checks ?? null;
263
+ if (checks?.status === "failed") {
264
+ const said = `The checks failed on its result: ${checks.detail}`;
265
+ store.updateFlowCard(card.id, { outputs: { ...card.outputs, [stage.id]: `${said} (task ${current})` }, primaryTask: current }, now);
266
+ if (stage.onFail !== null)
267
+ onward("fail", said);
268
+ else if (card.waiting !== `${said} Look at the result, then move the card on or back.`)
269
+ store.updateFlowCard(card.id, { waiting: `${said} Look at the result, then move the card on or back.` }, now);
270
+ return;
271
+ }
272
+ }
273
+ const outputs = { ...card.outputs };
274
+ if (stage.kind === "report") {
275
+ const ref = store.lookupRef(current);
276
+ const summary = ref === null ? null : reportSummaryFor(store, options.evidenceRoot, ref.id);
277
+ outputs[stage.id] = summary !== null && "summary" in summary ? summary.summary.slice(0, 6000) : "The report is ready on its task.";
278
+ }
279
+ else {
280
+ outputs[stage.id] = `Result ready on task ${current}.`;
281
+ }
282
+ store.updateFlowCard(card.id, { outputs, ...(stage.kind === "task" ? { primaryTask: current } : {}), waiting: null }, now);
283
+ onward("ok");
284
+ return;
285
+ }
286
+ if (task.state === "failed" || task.state === "cancelled") {
287
+ if (stage.onFail !== null)
288
+ onward("fail", `The ${stage.kind === "report" ? "research" : "build"} ${task.state === "failed" ? "failed" : "was cancelled"}.`);
289
+ else {
290
+ const waiting = `The task ${task.state === "failed" ? "failed" : "was cancelled"}. Retry it, or move the card.`;
291
+ if (card.waiting !== waiting && card.owner !== null)
292
+ notifyPeople(store, card, [card.owner], null, { key: `stuck:${card.entry}`, subject: `“${card.title}” is stuck in ${stage.title}`, body: waiting, attention: true }, now);
293
+ store.updateFlowCard(card.id, { waiting }, now);
294
+ }
295
+ return;
296
+ }
297
+ const diagnosis = diagnoseTaskDispatch(store, current, now);
298
+ const waiting = diagnosis?.summary ?? "Working on it";
299
+ if (waiting !== card.waiting)
300
+ store.updateFlowCard(card.id, { waiting }, now);
301
+ }
302
+ const zoneWords = (title) => `${title}${/[.?!]$/.test(title) ? "" : "."}`;
303
+ /** A card's words, checked once for every door: a title, an optional description, and no keys, because cards become agent instructions. */
304
+ export function flowCardText(title, description) {
305
+ const cleanTitle = (typeof title === "string" ? title : "").replace(/[\u0000-\u001f\u007f]/g, " ").trim().slice(0, 200);
306
+ const cleanDescription = (typeof description === "string" ? description : "").replace(/[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f]/g, "").trim().slice(0, 4000) || null;
307
+ if (cleanTitle === "")
308
+ return { problem: "Give the card a title." };
309
+ if (scanForSecrets(`${cleanTitle}\n${cleanDescription ?? ""}`).length > 0)
310
+ return { problem: "That looks like a key or password. Cards become agent instructions; keep secrets out of them." };
311
+ return { title: cleanTitle, description: cleanDescription };
312
+ }
313
+ /** Add a card to a flow, in its start zone unless a zone is named. */
314
+ export function addCardToFlow(store, flow, input, actor, now) {
315
+ const definition = flowDefinitionOf(flow);
316
+ if (definition === null || flow.state !== "active")
317
+ return { ok: false, message: "This flow can't take cards right now." };
318
+ const text = flowCardText(input.title, input.description);
319
+ if ("problem" in text)
320
+ return { ok: false, message: text.problem };
321
+ const stage = definition.stages.find(one => one.id === input.stage) ?? definition.stages.find(one => one.id === definition.start);
322
+ const card = store.addFlowCard({ flow: flow.id, title: text.title, description: text.description, stage: stage.id, by: actor }, now);
323
+ // Whoever adds a card follows it; owning it is a separate, deliberate step.
324
+ store.setFlowCardWatcher(card, actor, true, now);
325
+ return { ok: true, said: `Card added to ${zoneWords(stage.title)}`, card };
326
+ }
327
+ /** Move a card to another zone of its flow by hand; the zone's step runs on the next pass. */
328
+ export function moveCardInFlow(store, card, to, actor, now) {
329
+ const flow = store.getFlow(card.flow);
330
+ const definition = flow === null ? null : flowDefinitionOf(flow);
331
+ const stage = definition?.stages.find(one => one.id === to);
332
+ if (stage === undefined)
333
+ return { ok: false, message: "Choose a zone in this flow." };
334
+ if (card.state !== "active")
335
+ return { ok: false, message: "That card is finished." };
336
+ if (to === card.stage)
337
+ return { ok: true, said: "Already there.", card: card.id };
338
+ if (!store.moveFlowCard(card.id, { to, outcome: "moved", actor, expectEntry: card.entry }, now))
339
+ return { ok: false, message: "That card just moved. Look again." };
340
+ if (card.owner !== null)
341
+ notifyPeople(store, card, [card.owner], actor, { key: `moved:${card.entry}`, subject: `${actor} moved “${card.title}” to ${stage.title}`, body: `It was in ${definition.stages.find(one => one.id === card.stage)?.title ?? "another zone"}.` }, now);
342
+ return { ok: true, said: `Moved to ${zoneWords(stage.title)}`, card: card.id };
343
+ }
344
+ /** Take a card out of its flow; the tasks it filed are left as they are. */
345
+ export function cancelFlowCard(store, card, actor, now) {
346
+ if (card.state !== "active")
347
+ return { ok: false, message: "That card is already finished." };
348
+ store.moveFlowCard(card.id, { to: card.stage, outcome: "cancelled", actor }, now);
349
+ store.updateFlowCard(card.id, { state: "cancelled", waiting: null }, now);
350
+ return { ok: true, said: "Card cancelled. Its tasks are unchanged.", card: card.id };
351
+ }
352
+ /** A person's decision on a card waiting in an approval zone. A send back to a build zone whose work has a result becomes a revision of that work. */
353
+ /** The draft a decision is about: the draft zone that sends its cards to this one. */
354
+ export function draftFor(definition, stage) {
355
+ return definition.stages.find(one => one.kind === "draft" && one.next === stage.id)
356
+ // A teammate's zone that leads here (by its next, or one of its answers) wrote the draft this decision checks (starter kits).
357
+ ?? definition.stages.find(one => one.kind === "teammate" && (one.next === stage.id || (one.routes ?? []).some(route => route.to === stage.id))) ?? null;
358
+ }
359
+ export function decideFlowCard(store, input, now) {
360
+ const card = store.getFlowCard(input.card);
361
+ const flow = card === null ? null : store.getFlow(card.flow);
362
+ const definition = flow === null ? null : flowDefinitionOf(flow);
363
+ if (card === null || flow === null || definition === null || card.state !== "active" || !input.repos.includes(flow.repo))
364
+ return { ok: false, message: "That card is no longer waiting." };
365
+ const stage = definition.stages.find(one => one.id === card.stage);
366
+ if (stage === undefined || stage.kind !== "approval" || (input.entry !== undefined && input.entry !== card.entry))
367
+ return { ok: false, message: "That card has moved on since; nothing was changed." };
368
+ // A teammate decides only a zone it staffs; its person (and only them) can always decide instead.
369
+ const decider = deciderOf(stage, flow);
370
+ if (input.teammate !== undefined ? stage.teammate !== input.teammate : decider !== null && decider !== input.actor)
371
+ return { ok: false, message: `Only ${decider ?? "an approver"} decides here.` };
372
+ // v102: a protected project's decisions are a person's, never an AI teammate's.
373
+ if (input.teammate !== undefined && store.approvalRules(flow.repo).protectProject)
374
+ return { ok: false, message: "This project is protected: a person decides here." };
375
+ if (input.decision === "approve") {
376
+ // An edited draft replaces the one Claude wrote, so the steps after this send what the person approved.
377
+ const draft = draftFor(definition, stage);
378
+ if (draft !== null && typeof input.draft === "string" && input.draft.trim() !== "" && input.draft.trim() !== card.outputs[draft.id]?.trim()) {
379
+ store.updateFlowCard(card.id, { outputs: { ...card.outputs, [draft.id]: keptDraft(input.draft) } }, now);
380
+ store.addFlowComment({ card: card.id, author: input.actor, body: "Edited the draft before approving it.", mentions: [] }, now);
381
+ }
382
+ if (stage.next === null) {
383
+ store.updateFlowCard(card.id, { state: "done", waiting: null }, now);
384
+ return { ok: true, said: "Approved. The card is done." };
385
+ }
386
+ store.moveFlowCard(card.id, { to: stage.next, outcome: "approved", actor: input.actor, note: input.note, expectEntry: card.entry }, now);
387
+ const title = definition.stages.find(one => one.id === stage.next)?.title ?? stage.next;
388
+ if (card.owner !== null)
389
+ notifyPeople(store, card, [card.owner], input.actor, { key: `approved:${card.entry}`, subject: `${input.actor} approved “${card.title}”`, body: `${stage.title}: approved. It moves to ${title}.${input.note === null || input.note.trim() === "" ? "" : `\n\n${input.note.trim()}`}` }, now);
390
+ return { ok: true, said: `Approved. Moved to ${title}${/[.?!]$/.test(title) ? "" : "."}` };
391
+ }
392
+ if (stage.onFail === null)
393
+ return { ok: false, message: "This zone has nowhere to send work back to." };
394
+ if (input.note === null || input.note.trim() === "")
395
+ return { ok: false, message: "Say what should change." };
396
+ const target = definition.stages.find(one => one.id === stage.onFail);
397
+ // Back to a build zone with a finished result: a revision of that same work, carrying the note.
398
+ let revision = null;
399
+ if (target?.kind === "task" && card.primaryTask !== null && input.evidenceRoot !== undefined) {
400
+ const snapshot = assignmentOf(store, card.primaryTask, now, { principal: "operator", repos: input.repos });
401
+ const runId = snapshot?.receipt?.runId;
402
+ const runTask = runId === undefined ? null : store.externalIdFor(store.getRun(runId)?.taskRef ?? -1);
403
+ if (runId !== undefined && runTask !== null) {
404
+ const revised = requestResultChanges(store, input.evidenceRoot, {
405
+ run: runId, source: revisionSourceOf(store.getScope(runTask)?.digest ?? null), actor: input.actor, repos: input.repos,
406
+ batch: "", note: input.note.trim(), path: "", line: "", request: `flow-${card.id}-${card.entry}`, allowMode: true,
407
+ }, now);
408
+ if (revised.ok)
409
+ revision = revised.id;
410
+ }
411
+ }
412
+ store.moveFlowCard(card.id, { to: stage.onFail, outcome: "sent-back", actor: input.actor, note: input.note.trim(), ...(revision === null ? {} : { task: revision }), expectEntry: card.entry }, now);
413
+ if (card.owner !== null)
414
+ notifyPeople(store, card, [card.owner], input.actor, { key: `sent-back:${card.entry}`, subject: `${input.actor} sent “${card.title}” back`, body: `Sent back to ${target?.title ?? stage.onFail}:\n\n${input.note.trim()}`, attention: true }, now);
415
+ return { ok: true, said: revision === null ? `Sent back to ${target?.title ?? stage.onFail} with your note.` : `Sent back to ${target?.title ?? stage.onFail}: a revision was made with your note.` };
416
+ }
@@ -0,0 +1,95 @@
1
+ import type { FlowRow, FlowStepRunRow, Store } from "./store.js";
2
+ export type ZoneInsight = {
3
+ zone: string;
4
+ title: string;
5
+ kind: string;
6
+ /** Cards that arrived in the window, and what happened next. */
7
+ entered: number;
8
+ movedOn: number;
9
+ failed: number;
10
+ sentBack: number;
11
+ /** Cards sitting there now. */
12
+ here: number;
13
+ /** The middle of how long cards stayed before moving on, in minutes. */
14
+ typicalMinutes: number | null;
15
+ lastProblem: {
16
+ card: number;
17
+ cardTitle: string;
18
+ note: string | null;
19
+ at: string;
20
+ } | null;
21
+ };
22
+ export type ScriptInsight = {
23
+ script: string;
24
+ runs: number;
25
+ passed: number;
26
+ failed: number;
27
+ typicalSeconds: number | null;
28
+ lastFailure: string | null;
29
+ };
30
+ /**
31
+ * How a sort zone is doing, from what people did after it: a card a person
32
+ * moved to where a different answer leads was sorted wrong; one that moved
33
+ * on from where Jev sent it was sorted right; a not-sure card a person
34
+ * placed says what the answer should have been. Cards nobody has touched
35
+ * since are not counted either way.
36
+ */
37
+ export type SortInsight = {
38
+ zone: string;
39
+ title: string;
40
+ sureAt: number;
41
+ sorted: number;
42
+ alone: number;
43
+ notSure: number;
44
+ corrected: number;
45
+ /** How often Jev was right, by how sure it was: [from, to) in whole percents. */
46
+ bands: {
47
+ from: number;
48
+ to: number;
49
+ right: number;
50
+ of: number;
51
+ }[];
52
+ costUsd: number;
53
+ suggestion: string | null;
54
+ };
55
+ export type StepRunInsight = {
56
+ card: number;
57
+ cardTitle: string;
58
+ entry: number;
59
+ zone: string;
60
+ zoneTitle: string;
61
+ kind: "check" | "update" | "sort" | "draft" | "request" | "email" | "tool" | "teammate";
62
+ script: string | null;
63
+ version: number | null;
64
+ state: FlowStepRunRow["state"];
65
+ result: string | null;
66
+ exitCode: number | null;
67
+ durationMs: number | null;
68
+ at: string;
69
+ hasLog: boolean;
70
+ };
71
+ export type FlowInsights = {
72
+ flow: number;
73
+ name: string;
74
+ days: number;
75
+ cards: {
76
+ started: number;
77
+ finished: number;
78
+ active: number;
79
+ };
80
+ zones: ZoneInsight[];
81
+ /** The zones that fail or send work back most, worst first. */
82
+ breaks: {
83
+ zone: string;
84
+ title: string;
85
+ problems: number;
86
+ of: number;
87
+ }[];
88
+ scripts: ScriptInsight[];
89
+ sorts: SortInsight[];
90
+ runs: StepRunInsight[];
91
+ };
92
+ /** One flow's insights over the last `days` days. */
93
+ export declare function flowInsights(store: Store, flow: FlowRow, now: Date, days?: number): FlowInsights;
94
+ /** One line for a flow's list entry: where it has had the most trouble lately. */
95
+ export declare function troubleWords(insights: FlowInsights): string | null;