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,411 @@
1
+ /**
2
+ * The workspace's ONE display projection (package 1, 2026-09-13): the
3
+ * words, tone, and next action a task or result wears on every surface —
4
+ * Work rows, the task page's status box, the focused chat's journey card,
5
+ * the review cockpit's chip, and the completion receipt's heading. Pure
6
+ * functions over facts the store already records (task state, the dispatch
7
+ * diagnosis, the machine's proof verdict and its reasons, an operator's
8
+ * acceptance, the publication row); nothing here is a second lifecycle,
9
+ * and nothing here reads the agent's narrative as evidence of success.
10
+ *
11
+ * The vocabulary is the truthful-status contract from the workspace plan:
12
+ * a saved result with a failed check says "Changes saved, but checks
13
+ * failed"; a missing proof says "verification needed"; agent-reported
14
+ * checks say so; an accepted exception stays an exception; and nothing
15
+ * local is ever called shipped or deployed — "PR opened" and "Merge
16
+ * observed" name observed publication records, and deployment is never
17
+ * claimed without one.
18
+ */
19
+ import { GOAL_ASSESSMENT_PENDING, manualReviewOnly } from "./proof.js";
20
+ export const WORK_VIEWS = [
21
+ { key: "all", label: "All", hint: "Every task in view, most urgent first.", empty: "Nothing is in progress. Describe work in chat or add a task, and it appears here." },
22
+ { key: "needs-you", label: "Needs you", hint: "Tasks waiting on an answer, approval, or your inspection.", empty: "Nothing needs you right now. Queued and running work continues on its own." },
23
+ { key: "running", label: "Running", hint: "Attempts a builder owns right now.", empty: "Nothing is building right now. Approved tasks start when a builder with capacity is connected." },
24
+ { key: "completed", label: "Complete", hint: "Tasks the lead or user has marked complete. Recorded check results remain available.", empty: "No tasks have been marked complete in this view." },
25
+ ];
26
+ export function parseWorkView(raw) {
27
+ return raw === "needs-you" || raw === "running" || raw === "completed" ? raw : "all";
28
+ }
29
+ /** The review facts from the store's bounded retry projection — the same
30
+ * reading `diagnoseTaskDispatch` makes, so every surface starts from one
31
+ * record. `reviewerAlive` answers for the live attempt's runner. */
32
+ export function reviewFactsOf(retry, reviewerAlive) {
33
+ if (retry === null || retry.state === "unrequested")
34
+ return null;
35
+ const current = retry.live ?? (retry.state === "queued" ? null : retry.latest);
36
+ return {
37
+ state: retry.state,
38
+ attempt: retry.state === "queued" ? retry.nextAttempt : current?.attempt ?? null,
39
+ cap: retry.cap,
40
+ attempts: retry.attempts.length,
41
+ retriesRemaining: retry.retriesRemaining,
42
+ latestReason: retry.latest?.reason ?? null,
43
+ interrupted: retry.latest !== null && (retry.latest.outcome === "interrupted" || retry.latest.reason === "interrupted"),
44
+ queuedBy: retry.openRequest?.requestedBy ?? null,
45
+ queuedOrigin: retry.openRequest?.origin ?? null,
46
+ reviewerAlive: retry.live !== null && reviewerAlive(retry.live.runner),
47
+ };
48
+ }
49
+ /** The tokens a review in flight wears — the dispatch codes, unchanged. */
50
+ export const REVIEW_TOKENS = new Set(["reviewing", "review-pending", "review-failed", "review-exhausted"]);
51
+ const retriesLeft = (count, explicit = true) => `${count}${explicit ? " explicit" : ""} ${count === 1 ? "retry" : "retries"}`;
52
+ /**
53
+ * A review that is queued, running, failed with a retry left, or
54
+ * exhausted is the result's PRIMARY status — the machine is still
55
+ * deciding, and every surface must say so with the same words. A review
56
+ * never requested, or one that succeeded, adds nothing: the stored verdict
57
+ * (folded by the review where one landed) speaks. Words and tokens are
58
+ * the v50 dispatch contract; nothing here changes the lifecycle.
59
+ */
60
+ export function reviewStatusOf(review) {
61
+ // Model review is retired (2026-09-21): nothing schedules, retries or
62
+ // waits for a reviewer, so a recorded review request or attempt is
63
+ // history and never the result's primary status. The stored verdict and
64
+ // the assignment's Ready/Complete state speak instead.
65
+ void review;
66
+ return null;
67
+ }
68
+ const FAILED_CHECK = /^the repository's approved verification command exited (-?[0-9]+)/;
69
+ export function evidenceProblemOf(verdict, reasons) {
70
+ if (verdict === "verified" || verdict === "attested")
71
+ return "none";
72
+ if (verdict === "refuted")
73
+ return reasons.some(reason => FAILED_CHECK.test(reason)) ? "checks-failed" : "mismatched";
74
+ return "missing";
75
+ }
76
+ /** The exit code of the failed check, when the recorded reason names one. */
77
+ export function failedCheckExit(reasons) {
78
+ for (const reason of reasons) {
79
+ const found = FAILED_CHECK.exec(reason);
80
+ if (found !== null)
81
+ return Number(found[1]);
82
+ }
83
+ return null;
84
+ }
85
+ /** The observed publication record in words. Each state is a distinct
86
+ * fact: a pushed branch is not a PR, an open PR is not a merge, and a
87
+ * merge is not a deployment — no record here ever says "deployed". The
88
+ * words name what was recorded or last observed and what stays
89
+ * unconfirmed; a missing or stale observation never proves that nothing
90
+ * merged or deployed, and merging is never called manual-only — an
91
+ * authorized mode may merge on green. */
92
+ export function publicationStatusOf(publication) {
93
+ if (publication === null)
94
+ return null;
95
+ const pr = publication.prNumber === null ? "the pull request" : `PR #${publication.prNumber}`;
96
+ const ci = publication.lastCheckState === null || publication.lastCheckState === "none" ? "" : ` CI was last seen ${publication.lastCheckState}.`;
97
+ if (publication.remoteState === "MERGED") {
98
+ return { token: "merge-observed", label: "Merge observed", detail: `GitHub reports ${pr} merged. Deployment is not confirmed by any record here.` };
99
+ }
100
+ if (publication.remoteState === "CLOSED") {
101
+ return { token: "pr-closed", label: "PR closed without merging", detail: `GitHub last reported ${pr} closed without a merge. No merge or deployment is recorded here.` };
102
+ }
103
+ if (publication.state === "opened") {
104
+ return { token: "pr-opened", label: "PR opened", detail: `${pr} was last seen open on GitHub. No merge or deployment is recorded here.${ci}` };
105
+ }
106
+ if (publication.state === "pushed") {
107
+ return { token: "branch-pushed", label: "Branch pushed", detail: "The branch reached the remote; no pull request is recorded yet." };
108
+ }
109
+ if (publication.state === "failed") {
110
+ return { token: "publication-failed", label: "Publication failed", detail: "The last publication attempt failed; no pull request or merge is recorded here." };
111
+ }
112
+ return { token: "publication-pending", label: "Publication requested", detail: "Publishing was authorized and has not completed; no pull request or merge is recorded yet." };
113
+ }
114
+ /**
115
+ * The finished result's status — the one place the done words are chosen.
116
+ * Precedence: no record → scout report → operator acceptance → the machine
117
+ * verdict's problems (a refuted or short verdict is never masked by a
118
+ * no-change outcome) → a no-change conclusion, which owes no proof beyond
119
+ * its handoff and sealed diff → agent-attested → verified, where an
120
+ * observed publication names itself (a published but unverified result
121
+ * keeps its evidence problem as the main wording; the publication rides
122
+ * the detail).
123
+ */
124
+ export function resultStatusOf(result, publication = null) {
125
+ return storedResultStatusOf(result, publication);
126
+ }
127
+ /** What the machine itself recorded about a result, in a clause. */
128
+ function machineVerdictWords(result) {
129
+ if (result.verdict === "verified")
130
+ return "it verified the result before the acceptance";
131
+ if (result.verdict === "attested")
132
+ return "the checks on record are the agent's own report";
133
+ const problem = evidenceProblemOf(result.verdict, result.reasons);
134
+ if (problem === "checks-failed") {
135
+ const exit = failedCheckExit(result.reasons);
136
+ return `the approved check failed against it${exit === null ? "" : ` (exit ${exit})`}`;
137
+ }
138
+ if (problem === "mismatched")
139
+ return "its evidence did not match the sealed record";
140
+ return "its required evidence was missing";
141
+ }
142
+ function storedResultStatusOf(result, publication) {
143
+ if (result === null || result.runId === null) {
144
+ return {
145
+ token: "no-build-record",
146
+ label: "Marked done without a build record",
147
+ detail: "The task is done, but no finished attempt is recorded, so there is nothing to verify.",
148
+ tone: "problem",
149
+ action: { label: "Open the task", kind: "open-task" },
150
+ };
151
+ }
152
+ if (result.role === "scout") {
153
+ return { token: "report-ready", label: "Report ready", detail: "The research report is ready to read.", tone: "ready", action: { label: "Read the report", kind: "open-result" } };
154
+ }
155
+ const published = publicationStatusOf(publication);
156
+ const withPublication = (detail) => (published === null ? detail : `${detail} ${published.detail}`);
157
+ const humanReview = manualReviewOnly({ verdict: result.verdict ?? "", reasons: result.reasons });
158
+ if (result.accepted && humanReview) {
159
+ return { token: "accepted-exception", label: "Accepted by a person", detail: withPublication("A person accepted this result. The recorded checks are unchanged."), tone: "done", action: { label: "Open the acceptance", kind: "open-review" } };
160
+ }
161
+ if (result.accepted) {
162
+ return {
163
+ token: "accepted-exception",
164
+ label: "Accepted with an exception",
165
+ // Acceptance records a person's decision; it neither proves nor
166
+ // disproves anything about the checks. The machine's own verdict is
167
+ // restated as recorded.
168
+ detail: withPublication(`An approver accepted this result by hand, and the recorded exception says why. The machine's verdict is unchanged: ${machineVerdictWords(result)}.`),
169
+ tone: "done",
170
+ action: { label: "Open the recorded exception", kind: "open-review" },
171
+ };
172
+ }
173
+ const problem = evidenceProblemOf(result.verdict, result.reasons);
174
+ if (problem === "checks-failed") {
175
+ const exit = failedCheckExit(result.reasons);
176
+ return {
177
+ token: "checks-failed",
178
+ label: "Changes saved, but checks failed",
179
+ detail: withPublication(`The repository's approved check failed against this build${exit === null ? "" : ` (exit ${exit})`}, so the result is not verified.`),
180
+ tone: "problem",
181
+ action: { label: "Open the failed check", kind: "open-review" },
182
+ };
183
+ }
184
+ if (problem === "mismatched") {
185
+ return {
186
+ token: "evidence-mismatch",
187
+ label: "Result saved, but its record does not match",
188
+ // A structural refutation is settled before the approved check is
189
+ // weighed, so it says nothing about whether that check passed.
190
+ detail: withPublication("The proof's claims disagree with the sealed record. Whether the approved check passed is not settled by this verdict."),
191
+ tone: "problem",
192
+ action: { label: "Open the record", kind: "open-review" },
193
+ };
194
+ }
195
+ if (result.verdict === "short" && humanReview) {
196
+ return { token: "verification-needed", label: "Ready to inspect", detail: withPublication("The remaining requirements need a person's inspection. Open the result and record your decision."), tone: "attention", action: { label: "Inspect the result", kind: "open-review" } };
197
+ }
198
+ if (result.verdict === "short") {
199
+ return {
200
+ token: "verification-needed",
201
+ label: "Result saved — verification needed",
202
+ detail: withPublication("Required saved material is missing, so this result is not verified."),
203
+ tone: "problem",
204
+ action: { label: "See what is missing", kind: "open-review" },
205
+ };
206
+ }
207
+ if (result.outcome === "no-change") {
208
+ // A machine verdict (attested or verified) already proved the record
209
+ // at adjudication; only a verdict-less no-change reads its two
210
+ // presence facts here.
211
+ return result.recordComplete === false && result.verdict === null
212
+ ? { token: "record-incomplete", label: "No-change result, record incomplete", detail: "The build concluded nothing needed to change, but its handoff or sealed diff is missing.", tone: "problem", action: { label: "Open the record", kind: "open-run" } }
213
+ : { token: "no-change", label: "No changes were needed", detail: withPublication("The build concluded nothing needed to change; its handoff and sealed diff are on record."), tone: "done", action: { label: "Open the result", kind: "open-result" } };
214
+ }
215
+ if (result.verdict === null) {
216
+ return {
217
+ token: "verification-needed",
218
+ label: "Result saved — verification needed",
219
+ detail: withPublication("No verification result is recorded for this build."),
220
+ tone: "problem",
221
+ action: { label: "See what is missing", kind: "open-review" },
222
+ };
223
+ }
224
+ if (result.verdict === "attested") {
225
+ return {
226
+ token: "agent-attested",
227
+ label: "Result saved — checks reported by the agent",
228
+ detail: withPublication("No independent project check ran; the checks listed are the agent's own report."),
229
+ tone: "neutral",
230
+ action: { label: "Open the result", kind: "open-result" },
231
+ };
232
+ }
233
+ if (published !== null && (published.token === "merge-observed" || published.token === "pr-opened" || published.token === "pr-closed")) {
234
+ return {
235
+ token: published.token,
236
+ label: published.label,
237
+ detail: `The approved check passed against this result. ${published.detail}`,
238
+ tone: published.token === "pr-closed" ? "muted" : "done",
239
+ action: published.token === "merge-observed" ? { label: "Open the result", kind: "open-result" } : { label: "Open the pull request", kind: "open-pr" },
240
+ };
241
+ }
242
+ return {
243
+ token: "ready-to-review",
244
+ label: "Ready",
245
+ detail: withPublication("The approved check passed against this result."),
246
+ tone: "ready",
247
+ action: { label: "Open the result", kind: "open-result" },
248
+ };
249
+ }
250
+ /** The completion receipt's heading: what the record actually supports.
251
+ * Never "shipped" — local changes are saved; a PR or merge is named only
252
+ * from its observed record. */
253
+ export function receiptHeadingOf(outcome, publication, role) {
254
+ const published = publicationStatusOf(publication);
255
+ if (published !== null && (published.token === "merge-observed" || published.token === "pr-opened"))
256
+ return published.label;
257
+ if (role === "scout" && (outcome === "built" || outcome === "no-change"))
258
+ return "Report saved";
259
+ if (outcome === "no-change")
260
+ return "No changes were needed";
261
+ return "Changes saved";
262
+ }
263
+ /** The receipt's one-line publication fact under the heading. */
264
+ export function receiptPublicationWords(publication) {
265
+ const published = publicationStatusOf(publication);
266
+ return published === null ? "Saved on the build branch. No publication, merge, or deployment is recorded here." : published.detail;
267
+ }
268
+ /** These dispatch states may yield the headline to an unanswered
269
+ * question. Failure, uncertain process ownership, holds, approvals and
270
+ * stop settlement deliberately do not yield. This never alters dispatch. */
271
+ const QUESTION_FIRST = new Set([
272
+ "running", "waiting-decision", "no-worker-online", "no-worker-registered",
273
+ "worker-at-capacity", "ready", "planning-ready", "scouting-ready",
274
+ ]);
275
+ /** Needs you: the existing diagnosis semantics — waiting on a person with a
276
+ * concrete act — never every queued task indiscriminately. */
277
+ export function needsPerson(dispatch) {
278
+ if (dispatch === null || dispatch.action === null)
279
+ return false;
280
+ // A failed task is terminal for the scheduler and still a person's act
281
+ // (retry); every other terminal answer (complete, cancelled) is not.
282
+ return dispatch.condition === "waiting" || dispatch.code === "failed";
283
+ }
284
+ /** Navigation labels describe the available help, not a mutation: opening
285
+ * a hold or pause must never promise that the task has already resumed. */
286
+ const DISPATCH_ACTION_LABELS = {
287
+ "open-result": "Open the result",
288
+ "retry-task": "Review and retry",
289
+ "place-task": "Choose a project",
290
+ "write-scope": "Define the task",
291
+ "select-agent": "Choose an agent",
292
+ "approve-scope": "Review plan",
293
+ "answer-decision": "Answer the question",
294
+ unhold: "Review hold",
295
+ "inspect-hold": "Review hold",
296
+ "repair-dependency": "Review required task",
297
+ "repair-capability": "Review missing requirement",
298
+ "start-worker": "Check connection",
299
+ "retry-review": "Review retry options",
300
+ "resume-run": "Review pause",
301
+ };
302
+ export function dispatchActionLabel(dispatch) {
303
+ return dispatch?.action == null ? "View task details" : DISPATCH_ACTION_LABELS[dispatch.action];
304
+ }
305
+ export function workStatusOf(facts, resultDisplay) {
306
+ const dispatch = facts.dispatch;
307
+ const result = facts.state === "done" ? resultDisplay ?? resultStatusOf(facts.result, facts.publication) : null;
308
+ const running = facts.liveRunId !== null || (dispatch?.condition === "running" && !REVIEW_TOKENS.has(dispatch.code));
309
+ const question = (facts.state === "queued" || facts.state === "running" || facts.state === "done") ? facts.openDecision ?? null : null;
310
+ const needs = (dispatch !== null && !REVIEW_TOKENS.has(dispatch.code) && needsPerson(dispatch)) || question !== null;
311
+ const views = ["all"];
312
+ if (needs)
313
+ views.push("needs-you");
314
+ if (running)
315
+ views.push("running");
316
+ if (facts.state === "done")
317
+ views.push("completed");
318
+ const dispatchWords = (tone, rank, action) => ({
319
+ token: dispatch?.code ?? "unknown",
320
+ label: dispatch?.summary ?? "Status unknown",
321
+ detail: dispatch?.detail ?? "Refresh this task before relying on its status.",
322
+ tone,
323
+ action,
324
+ views,
325
+ rank,
326
+ });
327
+ // The control projection knows whether a stop has actually settled.
328
+ // A still-live claim alone cannot distinguish Running from Stopping.
329
+ if (facts.control?.kind === "stopping") {
330
+ return { token: "stopping", label: "Stopping…", detail: facts.control.detail ?? "The attempt is ending. Its work is preserved; resume becomes available after its processes exit.", tone: "attention", action: { label: "View stop details", kind: "open-task" }, views, rank: 0 };
331
+ }
332
+ if (facts.control?.kind === "paused") {
333
+ return { token: "stopped", label: "Paused", detail: "The stopped attempt's work is preserved. Resuming requires confirmation and checks the current approval again.", tone: "attention", action: { label: "Review pause", kind: "open-task" }, views, rank: 0 };
334
+ }
335
+ if (facts.state === "done" && result !== null) {
336
+ // A saved result or an ongoing review cannot answer a question. Keep
337
+ // failures primary; the shared summary retains the answer action too.
338
+ if (question !== null && result.tone !== "problem") {
339
+ return { token: "waiting-decision", label: "Waiting on your answer", detail: question.question,
340
+ tone: "attention", action: { label: "Answer question", kind: "open-task" }, views, rank: 0,
341
+ diagnostics: [{ token: result.token, label: result.label, detail: result.detail, tone: result.tone }] };
342
+ }
343
+ return { ...result, views, rank: needs ? 0 : 3 };
344
+ }
345
+ if (facts.state === "cancelled") {
346
+ return { token: "cancelled", label: "Cancelled", detail: dispatch?.detail ?? "Nothing else will run for this task.", tone: "muted", action: null, views, rank: 4 };
347
+ }
348
+ if (question !== null && facts.state !== "failed" && dispatch !== null && QUESTION_FIRST.has(dispatch.code)) {
349
+ return {
350
+ token: "waiting-decision", label: "Waiting on your answer", detail: question.question,
351
+ tone: "attention", action: { label: "Answer question", kind: "open-task" }, views, rank: 0,
352
+ ...(dispatch.code === "waiting-decision" ? {} : {
353
+ diagnostics: [{ token: dispatch.code, label: dispatch.summary, detail: dispatch.detail, tone: dispatch.condition === "running" ? "live" : "attention" }],
354
+ }),
355
+ };
356
+ }
357
+ if (running) {
358
+ return dispatchWords("live", 1, { label: "Watch the build", kind: facts.liveRunId === null ? "open-task" : "open-run" });
359
+ }
360
+ if (facts.state === "failed") {
361
+ return dispatchWords("problem", 0, { label: "Review and retry", kind: "open-task" });
362
+ }
363
+ if (needs) {
364
+ return dispatchWords("attention", 0, { label: dispatchActionLabel(dispatch), kind: "open-task" });
365
+ }
366
+ const details = { label: "View task details", kind: "open-task" };
367
+ if (dispatch === null)
368
+ return dispatchWords("neutral", 2, details);
369
+ return dispatchWords(dispatch.condition === "retrying" ? "neutral" : "muted", 2, details);
370
+ }
371
+ /** The counts each view tab wears — from the same rows the page lists. */
372
+ export function workCounts(rows) {
373
+ const counts = { all: 0, "needs-you": 0, running: 0, completed: 0 };
374
+ for (const row of rows)
375
+ for (const view of row.views)
376
+ counts[view] += 1;
377
+ return counts;
378
+ }
379
+ /** All's order: rank, then most recently updated. */
380
+ export function compareWorkRows(a, b) {
381
+ return a.rank - b.rank || (a.updatedAt < b.updatedAt ? 1 : a.updatedAt > b.updatedAt ? -1 : 0);
382
+ }
383
+ const WORK_KEYS = new Set(["inbox", "board", "queue", "work", "done", "activity", "review", "tasks", "runs", "workbench", "routines", "recipes", "ledger"]);
384
+ const SETTINGS_KEYS = new Set(["fleet", "caps", "people", "mode", "system", "settings"]);
385
+ export function primaryDestinationOf(active) {
386
+ if (active === "chat")
387
+ return "chat";
388
+ if (active === "projects")
389
+ return "projects";
390
+ if (active === "flows")
391
+ return "flows";
392
+ if (WORK_KEYS.has(active))
393
+ return "work";
394
+ if (SETTINGS_KEYS.has(active))
395
+ return "settings";
396
+ return null;
397
+ }
398
+ /** Learning stays in Settings and a useful, closed result disclosure. */
399
+ export function learningHtml(view, csrf, canManage, source) {
400
+ const e = (x) => String(x).replace(/[&<>"']/g, c => ({ '&': '&amp;', '<': '&lt;', '>': '&gt;', '"': '&quot;', "'": '&#39;' })[c]);
401
+ const fields = (values) => Object.entries(values).map(([k, v]) => `<input type="hidden" name="${e(k)}" value="${e(v)}">`).join('');
402
+ const base = { csrf, repo: view.repo, identity: view.identity, revision: view.revision };
403
+ const act = (action, label, lesson) => canManage && csrf ? `<form method="post" action="/settings/learning/change">${fields({ ...base, action, ...(lesson ? { lesson: lesson.id, version: lesson.version, sha: lesson.sha } : {}) })}<button type="submit">${label}</button></form>` : '';
404
+ const evidence = (list, run) => list.map(one => `<li><a href="/r/${one.runId ?? run}/evidence/${one.artifactId}">Source #${one.artifactId}</a><blockquote>${e(one.excerpt)}</blockquote><code>${e(one.sha256)}</code></li>`).join('');
405
+ const lessons = view.lessons.filter(l => source === undefined || l.source === source);
406
+ const cards = lessons.map(l => `<article class="card" data-lesson="${l.id}"><p><strong>${e(l.payload.observation)}</strong></p><p>${e(l.payload.action)}</p><p class="meta">${l.payload.kind === 'system' ? 'System suggestion · No change applied' : e(l.status === 'adopted' ? 'Adopted advice' : l.status === 'disabled' ? 'Disabled' : 'Proposed lesson')}</p><details><summary>Source and use</summary><p><a href="/r/${l.source}">Result #${l.source}</a> · <a href="/r/${l.reviewer}">Review #${l.reviewer}</a></p><p>${e(l.payload.paths.join(', '))} · ${e(l.payload.phases.join(', '))} · ${e({ darwin: "macOS", win32: "Windows", linux: "Linux" }[l.payload.platform] ?? l.payload.platform)}</p><ul>${evidence(l.payload.evidence, l.source)}</ul>${l.payload.kind !== 'project' ? '' : `<p class="meta">${l.status === 'proposed' ? 'Save permits advisory reuse when enabled and applicable. It does not prove a remedy works.' : 'Disabling affects future runs. Active snapshots, code and approvals stay unchanged.'}</p>${l.status === 'proposed' ? act('adopt', 'Save lesson', l) : ''}`}</details>${l.payload.kind === 'project' && l.status === 'adopted' ? act('disable', 'Disable lesson', l) : ''}</article>`).join('');
407
+ if (source !== undefined)
408
+ return lessons.length ? `<details class="learning result-learning"><summary>Learned from this task</summary>${cards}<a href="/settings/learning?repo=${encodeURIComponent(view.repo)}">Learning settings</a></details>` : '';
409
+ const history = view.events.map(ev => `<article class="card" data-learning-event="${e(ev.action)}"><p><strong>${e({ assessment: { propose: 'Learning suggested', none: 'No lesson needed', unassessed: 'Learning not assessed', invalid: 'Learning assessment invalid' }[ev.after] ?? 'Learning not assessed', proposal: 'Suggestion recorded', adopt: 'Lesson adopted', disable: 'Lesson disabled', reset: 'Learning reset', enable: 'Reuse enabled', pause: 'Reuse paused', reuse: 'Run context saved', failure: 'Learning issue', capture: 'Capture finished' }[ev.action] ?? ev.action)}</strong>${ev.action === "reuse" ? ` · ${e(ev.after)}` : ""}</p><p class="meta"><time datetime="${e(ev.at)}">${e(ev.at.replace("T", " ").replace(/\.\d+Z$/, " UTC"))}</time> · ${e(ev.actor)}${ev.run === null ? '' : ` · <a href="/r/${ev.run}">Run #${ev.run}</a>${ev.outcome === null ? "" : ` · ${e(ev.outcome)}`}`}</p><details><summary>Details</summary><p>${e(ev.before)} → ${e(ev.after)}</p><p>${e(ev.reason)}</p>${ev.lesson === null ? '' : `<p>Lesson #${ev.lesson}</p>`}<ul>${evidence(ev.evidence, ev.run)}</ul>${ev.snapshot === null ? "" : `<details><summary>Exact context</summary><pre>${e(ev.snapshot)}</pre></details>`}</details></article>`).join('');
410
+ return `<section class="learning">${view.damaged ? '<p class="problem" role="alert">Some lessons no longer verify and are excluded from reuse.</p>' : ''}<p>${view.enabled ? 'Use adopted lessons: on' : 'Use adopted lessons: off'}</p>${act(view.enabled ? 'pause' : 'enable', view.enabled ? 'Pause reuse' : 'Enable reuse')}${cards || '<p>No lessons yet. Reviews may suggest useful advice here.</p>'}<details><summary>Reset learning</summary><p>Disable all adopted lessons and future reuse. Keep history, code, approvals and active run snapshots.</p>${act('reset', 'Reset learning')}</details><h2>Changes</h2>${history || '<p>No learning changes yet.</p>'}${view.next === null ? '' : `<a class="button-link" href="/settings/learning?repo=${encodeURIComponent(view.repo)}&before=${view.next}">Older changes</a>`}</section>`;
411
+ }
@@ -0,0 +1,13 @@
1
+ /** One announcement for a reconciliation batch. The complete path inventory
2
+ * stays in worktree rows and reconcile's result; this grants no reuse/deletion
3
+ * authority and performs no filesystem or database changes. */
4
+ export declare function worktreeAdoptionNotice(repo: string, adopted: readonly string[], now: Date): {
5
+ source: {
6
+ project: string;
7
+ };
8
+ dedupeKey: string;
9
+ kind: string;
10
+ subject: string;
11
+ body: string;
12
+ link: string;
13
+ } | null;
@@ -0,0 +1,17 @@
1
+ import { createHash } from "node:crypto";
2
+ /** One announcement for a reconciliation batch. The complete path inventory
3
+ * stays in worktree rows and reconcile's result; this grants no reuse/deletion
4
+ * authority and performs no filesystem or database changes. */
5
+ export function worktreeAdoptionNotice(repo, adopted, now) {
6
+ const paths = [...new Set(adopted)].sort();
7
+ if (paths.length === 0)
8
+ return null;
9
+ const count = paths.length, plural = count !== 1;
10
+ const digest = createHash("sha256").update(JSON.stringify([repo, paths, now.toISOString()])).digest("hex");
11
+ return {
12
+ source: { project: repo }, dedupeKey: `worktree-adoption:${digest}`, kind: "worktree-adopted",
13
+ subject: `${count} worktree${plural ? "s" : ""} need${plural ? "" : "s"} review`,
14
+ body: `${count} existing worktree${plural ? "s were" : " was"} added to the inventory as released and unverified. Review before reusing or deleting ${plural ? "them" : "it"}.`,
15
+ link: `/system?project=${encodeURIComponent(repo)}`,
16
+ };
17
+ }