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,71 @@
1
+ import type { AssignmentAccess, AssignmentSnapshot } from "./assignment.js";
2
+ import type { Store } from "./store.js";
3
+ export type AssignmentCatchUp = {
4
+ version: 1;
5
+ asOf: string;
6
+ readOnly: true;
7
+ assignments: {
8
+ rootId: string;
9
+ taskId: string;
10
+ repo: string | null;
11
+ title: string;
12
+ state: AssignmentSnapshot["state"];
13
+ detail: string;
14
+ goal: string | null;
15
+ updatedAt: string;
16
+ runId: number | null;
17
+ resultRunId: number | null;
18
+ outcome: string | null;
19
+ checks: {
20
+ status: string;
21
+ exitCode: number | null;
22
+ detail: string;
23
+ } | null;
24
+ nextAction: AssignmentSnapshot["primaryAction"];
25
+ attention: string[];
26
+ decisions: {
27
+ id: number;
28
+ runId: number;
29
+ question: string;
30
+ state: string;
31
+ overdue: boolean;
32
+ choice: string | null;
33
+ }[];
34
+ }[];
35
+ projects: {
36
+ repo: string;
37
+ knowledge: {
38
+ status: "stored" | "none" | "unavailable";
39
+ revision: number | null;
40
+ identity: string | null;
41
+ sha256: string | null;
42
+ instructions: string;
43
+ sources: {
44
+ id: string;
45
+ title: string;
46
+ kind: "saved-note" | "repository-document";
47
+ path: string | null;
48
+ sourceRevision: string | null;
49
+ sourceSha: string | null;
50
+ }[];
51
+ decisions: {
52
+ id: number;
53
+ claim: string;
54
+ }[];
55
+ };
56
+ }[];
57
+ omissions: {
58
+ assignments: number;
59
+ decisions: number;
60
+ projects: number;
61
+ textFields: number;
62
+ candidateScanLimited: boolean;
63
+ notes: string[];
64
+ };
65
+ };
66
+ /** A current snapshot, never a receipt to acknowledge. Full assignment reads
67
+ * remain the place to inspect exact saved work and obtain its current digest. */
68
+ export declare function assignmentCatchUp(store: Store, now: Date, access: AssignmentAccess, query?: {
69
+ repo?: string;
70
+ limit?: number;
71
+ }, evidenceRoot?: string): AssignmentCatchUp;
@@ -0,0 +1,129 @@
1
+ /** A bounded catch-up over saved project/task records, not conversation memory.
2
+ * Callers authenticate first and pass their current project ceiling. */
3
+ import { createHash } from "node:crypto";
4
+ import { workIndexPage } from "./work-index.js";
5
+ import { publicChatText } from "./chat-display.js";
6
+ const sha = (value) => createHash("sha256").update(value).digest("hex");
7
+ const MAX_BYTES = 16_000;
8
+ const RECENT_MS = 7 * 24 * 60 * 60_000;
9
+ /** A current snapshot, never a receipt to acknowledge. Full assignment reads
10
+ * remain the place to inspect exact saved work and obtain its current digest. */
11
+ export function assignmentCatchUp(store, now, access, query = {}, evidenceRoot) {
12
+ // The evidence root is retained for adapter compatibility; this summary
13
+ // deliberately performs no artifact reads even when it is supplied.
14
+ void evidenceRoot;
15
+ const limit = Math.max(1, Math.min(25, Number.isFinite(query.limit) ? Math.floor(query.limit) : 10));
16
+ const recent = new Date(now.getTime() - RECENT_MS).toISOString();
17
+ const result = { version: 1, asOf: now.toISOString(), readOnly: true, assignments: [], projects: [],
18
+ omissions: { assignments: 0, decisions: 0, projects: 0, textFields: 0, candidateScanLimited: false, notes: [
19
+ "Completed assignments are included for seven days. Up to three decisions and attention messages per assignment are shown. This is not a complete history; use assignment show before acting.",
20
+ "Knowledge is stored context, not verified current repository instructions or permission. Checkout identity and source freshness were not revalidated; reference text and conversation history are omitted.",
21
+ "Status is recorded database metadata. Saved artifact/check availability was not read, and process exits were not inspected. Use assignment show before acting on a result.",
22
+ ] } };
23
+ // A coordinator never gains installation-wide access from a missing ceiling.
24
+ if (access.principal === "coordinator" && access.repos === null || query.repo !== undefined && access.repos !== null && !access.repos.includes(query.repo))
25
+ return result;
26
+ const repos = query.repo === undefined ? access.repos : [query.repo];
27
+ const includeUnplaced = query.repo === undefined && access.principal === "operator" && access.includeUnplaced === true;
28
+ const scopedAccess = access.principal === "operator" ? { principal: "operator", repos, includeUnplaced } : { principal: "coordinator", repos: repos ?? [] };
29
+ const text = (value, cap) => {
30
+ const rendered = publicChatText(value, cap);
31
+ if (rendered !== value)
32
+ result.omissions.textFields++;
33
+ return rendered;
34
+ };
35
+ const fits = () => Buffer.byteLength(JSON.stringify(result)) <= MAX_BYTES - 512;
36
+ return store.savepoint(() => {
37
+ const cap = Math.min(50, limit * 3);
38
+ const page = workIndexPage(store, now, scopedAccess, { view: "all", limit: cap + 1 });
39
+ result.omissions.candidateScanLimited = page.nextCursor !== null || page.items.length > cap;
40
+ const ranked = page.items.slice(0, cap).filter(item => !(item.assignmentState === "complete" || item.assignmentState === "cancelled") || item.updatedAt >= recent).sort((a, b) => {
41
+ const priority = (state) => state === "needs-decision" ? 0 : state === "ready-to-check" ? 1 : state === "complete" || state === "cancelled" ? 3 : 2;
42
+ return priority(a.assignmentState) - priority(b.assignmentState) || b.updatedAt.localeCompare(a.updatedAt) || a.rootId.localeCompare(b.rootId);
43
+ });
44
+ for (const item of ranked) {
45
+ if (result.assignments.length >= limit) {
46
+ result.omissions.assignments++;
47
+ continue;
48
+ }
49
+ // Read only the chosen rows. No family hydration, artifact bytes, native
50
+ // process census, or repository probing belongs in a catch-up summary.
51
+ const goal = store.handle.prepare('SELECT substr(goal,1,1601) AS goal FROM task_scope WHERE task_id=?').get(item.activeTaskId)?.["goal"];
52
+ const saved = item.resultRunId === null ? undefined : store.handle.prepare(`SELECT substr(r.handoff,1,1601) AS handoff
53
+ FROM run r JOIN task_ref t ON t.id=r.task_ref
54
+ WHERE r.id=? AND t.backend='built-in' AND t.external_id=? AND t.repo IS ?`)
55
+ .get(item.resultRunId, item.resultTaskId, item.repo);
56
+ const decisions = store.handle.prepare(`WITH RECURSIVE family(id,external_id,depth) AS (
57
+ SELECT id,external_id,0 FROM task_ref WHERE backend='built-in' AND external_id=? AND repo IS ?
58
+ UNION ALL SELECT t.id,t.external_id,f.depth+1 FROM task_ref t JOIN family f ON t.revision_of=f.external_id
59
+ JOIN artifact a ON a.id=t.revision_brief_artifact AND a.kind='revision-brief'
60
+ JOIN run source ON source.id=a.run AND source.task_ref=f.id
61
+ WHERE t.backend='built-in' AND t.repo IS ? AND f.depth<63
62
+ ) SELECT d.id,d.run,substr(d.question,1,961) AS question,d.state,d.deadline,substr(d.choice,1,321) AS choice,COUNT(*) OVER() AS total
63
+ FROM decision d JOIN run r ON r.id=d.run WHERE r.task_ref IN (SELECT id FROM family)
64
+ ORDER BY (d.answered_at IS NULL) DESC,d.id DESC LIMIT 3`).all(item.rootId, item.repo, item.repo);
65
+ const count = Number(decisions[0]?.["total"] ?? 0);
66
+ const attention = [item.familyProblem,
67
+ item.earlierActiveCount > 0 ? `${item.earlierActiveCount} earlier version${item.earlierActiveCount === 1 ? " has" : "s have"} unfinished work.` : null,
68
+ ].filter((one) => one !== null);
69
+ const entry = {
70
+ rootId: item.rootId, taskId: item.activeTaskId, repo: item.repo, title: text(item.title, 120), state: item.assignmentState,
71
+ detail: text(item.status.detail, 240), goal: goal == null ? null : text(String(goal), 400), updatedAt: item.updatedAt,
72
+ runId: item.liveRunId ?? item.unfinishedRunId ?? item.resultRunId, resultRunId: item.resultRunId,
73
+ outcome: saved?.["handoff"] == null ? null : text(String(saved["handoff"]), 400),
74
+ checks: item.resultRunId === null ? null : { status: "not-read", exitCode: null, detail: "Saved checks were not revalidated. Use assignment show to inspect them." },
75
+ nextAction: item.primaryAction, attention: attention.slice(0, 3).map(one => text(one, 160)),
76
+ decisions: decisions.map(row => ({ id: Number(row["id"]), runId: Number(row["run"]), question: text(String(row["question"]), 240), state: String(row["state"]),
77
+ overdue: row["state"] !== "answered" && row["deadline"] !== null && String(row["deadline"]) <= now.toISOString(), choice: row["choice"] == null ? null : text(String(row["choice"]), 80) })),
78
+ };
79
+ result.assignments.push(entry);
80
+ if (!fits()) {
81
+ result.assignments.pop();
82
+ result.omissions.assignments++;
83
+ }
84
+ else
85
+ result.omissions.decisions += Math.max(0, count - decisions.length);
86
+ }
87
+ // Project knowledge is admitted in SQL before any payload or title read.
88
+ const projectRows = store.handle.prepare(`SELECT repo FROM project_knowledge WHERE ? = 1 OR repo IN (SELECT value FROM json_each(?)) ORDER BY repo LIMIT 9`)
89
+ .all(repos === null ? 1 : 0, JSON.stringify(repos ?? []));
90
+ const projectCount = Number(store.handle.prepare('SELECT COUNT(*) AS n FROM project_knowledge WHERE ? = 1 OR repo IN (SELECT value FROM json_each(?))').get(repos === null ? 1 : 0, JSON.stringify(repos ?? []))?.["n"] ?? 0);
91
+ result.omissions.projects = Math.max(0, projectCount - 8);
92
+ for (const project of projectRows.slice(0, 8)) {
93
+ const repo = String(project["repo"]);
94
+ const knowledge = { status: "unavailable", revision: null, identity: null, sha256: null, instructions: "", sources: [], decisions: [] };
95
+ const row = store.handle.prepare('SELECT * FROM project_knowledge WHERE repo=?').get(repo);
96
+ try {
97
+ const payload = String(row["payload"]), revision = Number(row["revision"]), identity = String(row["identity"]);
98
+ const history = store.handle.prepare('SELECT sha FROM knowledge_change WHERE repo=? AND identity=? AND revision=?').get(repo, identity, revision);
99
+ if (Buffer.byteLength(payload) > 160_000 || !Number.isSafeInteger(revision) || revision < 1 || sha(payload) !== row["sha"] || history?.["sha"] !== row["sha"])
100
+ throw Error("invalid stored context");
101
+ const saved = JSON.parse(payload);
102
+ if (typeof saved.instructions !== "string" || !Array.isArray(saved.references) || saved.references.length > 12)
103
+ throw Error("invalid stored context");
104
+ const sources = saved.references.map((one) => {
105
+ if (typeof one.id !== "string" || typeof one.title !== "string" || typeof one.content !== "string")
106
+ throw Error("invalid stored source");
107
+ const id = text(one.id, 80), path = typeof one.path === "string" ? text(one.path, 160) : null;
108
+ return { id, title: text(one.title, 120), kind: path === null ? "saved-note" : "repository-document", path,
109
+ sourceRevision: typeof one.sourceRevision === "string" && /^[a-f0-9]{40,64}$/.test(one.sourceRevision) ? one.sourceRevision : null,
110
+ sourceSha: typeof one.sourceSha === "string" && /^[a-f0-9]{40,64}$/.test(one.sourceSha) ? one.sourceSha : null };
111
+ });
112
+ Object.assign(knowledge, { status: "stored", revision, identity: /^[a-f0-9]{64}$/.test(identity) ? identity : null, sha256: String(row["sha"]), instructions: text(saved.instructions, 600), sources });
113
+ }
114
+ catch { /* Integrity failures are explicit; never replay an older version as current. */ }
115
+ try {
116
+ knowledge.decisions = store.handle.prepare("SELECT id,claim FROM project_decision WHERE repo=? AND status='active' ORDER BY id DESC LIMIT 8").all(repo).map(row => ({ id: Number(row["id"]), claim: text(String(row["claim"]), 160) }));
117
+ }
118
+ catch { /* memory absent on an older database reads as no decisions */ }
119
+ result.projects.push({ repo, knowledge });
120
+ if (!fits()) {
121
+ result.projects.pop();
122
+ result.omissions.projects++;
123
+ }
124
+ }
125
+ if (result.omissions.candidateScanLimited)
126
+ result.omissions.notes.push("Candidate scanning was limited; omitted assignment counts are lower bounds, not a complete project total. Filter by project or read the task list for older work.");
127
+ return result;
128
+ });
129
+ }
@@ -0,0 +1,56 @@
1
+ import type { Store } from "./store.js";
2
+ import type { AssignmentOwner } from "./assignment.js";
3
+ import { type AssignmentStatusEvent } from "./assignment-status.js";
4
+ type SavedDeliveryEvent = {
5
+ id: number;
6
+ createdAt: string;
7
+ rootId: string;
8
+ project: string;
9
+ kind: "assignment-status";
10
+ digest: string;
11
+ assignment: AssignmentStatusEvent["assignment"];
12
+ };
13
+ export type AssignmentDeliveryEvent = SavedDeliveryEvent | {
14
+ id: number;
15
+ unavailable: true;
16
+ };
17
+ export type AssignmentDeliveryBatch = {
18
+ version: 1;
19
+ id: string | null;
20
+ consumer: string;
21
+ after: number;
22
+ nextCursor: number;
23
+ hasMore: boolean;
24
+ events: AssignmentDeliveryEvent[];
25
+ };
26
+ type Failure = {
27
+ ok: false;
28
+ reason: "invalid-input" | "unavailable" | "stale-batch" | "event-too-large";
29
+ message: string;
30
+ };
31
+ export type AssignmentInboxResult = {
32
+ ok: true;
33
+ batch: AssignmentDeliveryBatch;
34
+ replayed: boolean;
35
+ } | Failure;
36
+ export type AssignmentDeliveryAckResult = {
37
+ ok: true;
38
+ alreadyAcknowledged: boolean;
39
+ cursor: number;
40
+ } | Failure;
41
+ /** A read stages one immutable page. Until ACK, any process using this owner
42
+ * and consumer receives that exact page, regardless of new status events or
43
+ * a changed requested page size. Lost access replaces content with an opaque
44
+ * tombstone; it does not prevent acknowledgment of that already issued page.
45
+ * Consumer names identify independent inboxes. */
46
+ export declare function assignmentInbox(store: Store, owner: AssignmentOwner, query: {
47
+ consumer: string;
48
+ limit?: number;
49
+ }, now: Date): AssignmentInboxResult;
50
+ /** ACK advances only the exact issued page, atomically. Replaying any prior
51
+ * ACK is harmless, including while a newer page awaits acknowledgment. */
52
+ export declare function acknowledgeAssignmentDelivery(store: Store, owner: AssignmentOwner, query: {
53
+ consumer: string;
54
+ batchId: string;
55
+ }, now: Date): AssignmentDeliveryAckResult;
56
+ export {};
@@ -0,0 +1,160 @@
1
+ /** Durable, explicitly acknowledged delivery of assignment status events.
2
+ * Callers authenticate the raw coordinator credential inside the same Store
3
+ * transaction. Delivery receipts never complete tasks or grant authority. */
4
+ import { createHash, randomBytes } from "node:crypto";
5
+ import { ASSIGNMENT_STATUS_ACTION, parseAssignmentStatusEvent } from "./assignment-status.js";
6
+ const MAX_PAGE_BYTES = 64 * 1024;
7
+ const fail = (reason, message) => ({ ok: false, reason, message });
8
+ const actor = (owner) => `coordinator:${owner.id}`;
9
+ const keyFor = (owner, consumer) => createHash("sha256").update(JSON.stringify([owner.id, consumer])).digest("hex");
10
+ const validConsumer = (value) => typeof value === "string" && /^[a-z0-9][a-z0-9-]{0,63}$/.test(value);
11
+ const ownerSql = `COALESCE((SELECT 'lead:'||o.lead FROM team_task_owner o WHERE o.task_ref=t.id),(SELECT a.actor FROM action_ledger a WHERE a.task_id = t.external_id
12
+ AND a.action = 'assignment claimed' AND a.source = 'work' ORDER BY a.id DESC LIMIT 1),
13
+ 'coordinator:' || t.coordinator_cid)`;
14
+ function admittedRepos(store, owner) {
15
+ if (owner.kind !== "coordinator" || typeof owner.id !== "string" || owner.id.length === 0)
16
+ return null;
17
+ const row = store.handle.prepare("SELECT repos,revoked_at FROM coordinator_credential WHERE cid = ?").get(owner.id);
18
+ if (!row || row["revoked_at"] !== null)
19
+ return null;
20
+ try {
21
+ const repos = JSON.parse(String(row["repos"]));
22
+ return Array.isArray(repos) && repos.every(repo => typeof repo === "string") ? repos : null;
23
+ }
24
+ catch {
25
+ return null;
26
+ }
27
+ }
28
+ function exposedBatch(store, owner, repos, batch) {
29
+ return { ...batch, events: batch.events.map(event => {
30
+ const admitted = repos.includes(event.project) && store.handle.prepare(`SELECT 1 FROM task_ref t
31
+ WHERE t.backend = 'built-in' AND t.external_id = ? AND t.repo = ? AND t.revision_of IS NULL AND ${ownerSql} = ?`)
32
+ .get(event.rootId, event.project, actor(owner)) !== undefined;
33
+ return admitted ? event : { id: event.id, unavailable: true };
34
+ }) };
35
+ }
36
+ function eventFromRow(row, owner) {
37
+ const parsed = parseAssignmentStatusEvent(String(row["outcome"]));
38
+ if (parsed === null || parsed.assignment.rootId !== row["task_id"] || parsed.assignment.owner?.id !== owner.id)
39
+ return null;
40
+ return { id: Number(row["id"]), createdAt: String(row["at"]), rootId: String(row["task_id"]),
41
+ project: String(row["repo"]), kind: "assignment-status", digest: parsed.digest, assignment: parsed.assignment };
42
+ }
43
+ function pendingBatch(store, owner, key) {
44
+ const id = store.serviceCursor(`assignment-inbox:${key}:pending`);
45
+ if (id === 0)
46
+ return null;
47
+ const invalid = () => fail("unavailable", "The saved delivery page is invalid; its cursor has not advanced.");
48
+ const row = store.handle.prepare("SELECT outcome FROM action_ledger WHERE id = ? AND actor = ? AND action = ? AND source = 'work'")
49
+ .get(id, actor(owner), `assignment delivery batch:${key}`);
50
+ if (!row || Buffer.byteLength(String(row["outcome"])) > MAX_PAGE_BYTES)
51
+ return invalid();
52
+ let parsed;
53
+ try {
54
+ parsed = JSON.parse(String(row["outcome"]));
55
+ }
56
+ catch {
57
+ return invalid();
58
+ }
59
+ if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed))
60
+ return invalid();
61
+ const batch = parsed;
62
+ if (Object.keys(batch).sort().join(",") !== "after,consumer,events,hasMore,id,nextCursor,version" || batch.version !== 1 ||
63
+ typeof batch.id !== "string" || !/^[a-f0-9]{32}$/.test(batch.id) || !validConsumer(batch.consumer) ||
64
+ !Number.isSafeInteger(batch.after) || batch.after < 0 || !Number.isSafeInteger(batch.nextCursor) || batch.nextCursor <= batch.after ||
65
+ typeof batch.hasMore !== "boolean" || !Array.isArray(batch.events) || batch.events.length < 1 || batch.events.length > 100)
66
+ return invalid();
67
+ let previous = batch.after;
68
+ for (const event of batch.events) {
69
+ if (!event || !Number.isSafeInteger(event.id) || event.id <= previous)
70
+ return invalid();
71
+ const source = store.handle.prepare("SELECT id,at,task_id,repo,outcome FROM action_ledger WHERE id = ? AND actor = ? AND action = ? AND source = 'work'")
72
+ .get(event.id, actor(owner), ASSIGNMENT_STATUS_ACTION);
73
+ const original = source === undefined ? null : eventFromRow(source, owner);
74
+ if (original === null || JSON.stringify(original) !== JSON.stringify(event))
75
+ return invalid();
76
+ previous = event.id;
77
+ }
78
+ return previous === batch.nextCursor ? batch : invalid();
79
+ }
80
+ /** A read stages one immutable page. Until ACK, any process using this owner
81
+ * and consumer receives that exact page, regardless of new status events or
82
+ * a changed requested page size. Lost access replaces content with an opaque
83
+ * tombstone; it does not prevent acknowledgment of that already issued page.
84
+ * Consumer names identify independent inboxes. */
85
+ export function assignmentInbox(store, owner, query, now) {
86
+ if (!validConsumer(query.consumer) || (query.limit !== undefined && (!Number.isInteger(query.limit) || query.limit < 1 || query.limit > 100)))
87
+ return fail("invalid-input", "Use a consumer name of 1–64 characters and a page size of 1–100.");
88
+ return store.transact(() => store.savepoint(() => {
89
+ const repos = admittedRepos(store, owner);
90
+ if (repos === null)
91
+ return fail("unavailable", "The coordinator is no longer active.");
92
+ const key = keyFor(owner, query.consumer), cursorKey = `assignment-inbox:${key}:acked`;
93
+ const after = store.serviceCursor(cursorKey), pending = pendingBatch(store, owner, key);
94
+ if (pending !== null) {
95
+ if ("ok" in pending)
96
+ return pending;
97
+ if (pending.consumer !== query.consumer || pending.after !== after)
98
+ return fail("unavailable", "The saved delivery page does not match its cursor.");
99
+ return { ok: true, batch: exposedBatch(store, owner, repos, pending), replayed: true };
100
+ }
101
+ const limit = query.limit ?? 10;
102
+ const rows = store.handle.prepare(`SELECT n.id,n.at,n.task_id,n.repo,n.outcome
103
+ FROM action_ledger n JOIN task_ref t ON t.backend = 'built-in'
104
+ AND t.external_id = n.task_id AND t.repo = n.repo AND t.revision_of IS NULL
105
+ WHERE n.id > ? AND n.action = ? AND n.source = 'work' AND n.actor = ?
106
+ AND n.repo IN (SELECT value FROM json_each(?)) AND ${ownerSql} = ?
107
+ ORDER BY n.id LIMIT ?`).all(after, ASSIGNMENT_STATUS_ACTION, actor(owner), JSON.stringify(repos), actor(owner), limit + 1);
108
+ const batch = { version: 1, id: null, consumer: query.consumer, after, nextCursor: after, hasMore: rows.length > limit, events: [] };
109
+ for (const row of rows.slice(0, limit)) {
110
+ const event = eventFromRow(row, owner);
111
+ if (event === null)
112
+ return fail("unavailable", "The next saved assignment event is invalid; no event was skipped.");
113
+ batch.events.push(event);
114
+ if (Buffer.byteLength(JSON.stringify(batch)) > MAX_PAGE_BYTES - 128) {
115
+ batch.events.pop();
116
+ if (batch.events.length === 0)
117
+ return fail("event-too-large", "The next assignment event exceeds the delivery limit; no event was skipped.");
118
+ batch.hasMore = true;
119
+ break;
120
+ }
121
+ batch.nextCursor = event.id;
122
+ }
123
+ if (batch.events.length === 0)
124
+ return { ok: true, batch, replayed: false };
125
+ batch.id = randomBytes(16).toString("hex");
126
+ const id = store.recordAction({ at: now.toISOString(), actor: actor(owner), repo: null, taskId: null, runId: null,
127
+ action: `assignment delivery batch:${key}`, outcome: JSON.stringify(batch), source: "work" });
128
+ store.setServiceCursor(`assignment-inbox:${key}:pending`, id, now);
129
+ return { ok: true, batch, replayed: false };
130
+ }));
131
+ }
132
+ /** ACK advances only the exact issued page, atomically. Replaying any prior
133
+ * ACK is harmless, including while a newer page awaits acknowledgment. */
134
+ export function acknowledgeAssignmentDelivery(store, owner, query, now) {
135
+ if (!validConsumer(query.consumer) || typeof query.batchId !== "string" || !/^[a-f0-9]{32}$/.test(query.batchId))
136
+ return fail("invalid-input", "Use the exact consumer and batch ID returned by the inbox.");
137
+ return store.transact(() => store.savepoint(() => {
138
+ const repos = admittedRepos(store, owner);
139
+ if (repos === null)
140
+ return fail("unavailable", "The coordinator is no longer active.");
141
+ const key = keyFor(owner, query.consumer), cursorKey = `assignment-inbox:${key}:acked`;
142
+ const cursor = store.serviceCursor(cursorKey), action = `assignment delivery acknowledged:${key}`;
143
+ const acknowledged = store.handle.prepare(`SELECT 1 FROM action_ledger WHERE actor = ? AND action = ? AND source = 'work'
144
+ AND json_extract(outcome, '$.batchId') = ? LIMIT 1`).get(actor(owner), action, query.batchId);
145
+ if (acknowledged)
146
+ return { ok: true, alreadyAcknowledged: true, cursor };
147
+ const pending = pendingBatch(store, owner, key);
148
+ if (pending !== null && "ok" in pending)
149
+ return pending;
150
+ if (pending === null || pending.id !== query.batchId || pending.consumer !== query.consumer || pending.after !== cursor)
151
+ return fail("stale-batch", "This batch was not issued to this inbox; its cursor has not advanced.");
152
+ // Access loss redacts replayed events; the exact issued page remains
153
+ // acknowledgeable so its inaccessible entries cannot wedge this inbox.
154
+ store.recordAction({ at: now.toISOString(), actor: actor(owner), repo: null, taskId: null, runId: null,
155
+ action, outcome: JSON.stringify({ batchId: pending.id, after: pending.after, cursor: pending.nextCursor }), source: "work" });
156
+ store.setServiceCursor(cursorKey, pending.nextCursor, now);
157
+ store.setServiceCursor(`assignment-inbox:${key}:pending`, 0, now);
158
+ return { ok: true, alreadyAcknowledged: false, cursor: pending.nextCursor };
159
+ }));
160
+ }
@@ -0,0 +1,26 @@
1
+ /** Current assignment presentation shared by summaries and result views.
2
+ * Saved assessments remain history; this projection never changes receipts,
3
+ * checks, approvals, ownership, or the exact completion identity. */
4
+ import type { AssignmentSnapshot } from './assignment.js';
5
+ import { type DisplayStatus, type WorkStatus } from './workspace-ui.js';
6
+ export type AssignmentWorkStatus = DisplayStatus & Partial<Pick<WorkStatus, 'views' | 'rank'>>;
7
+ export type AssignmentAttention = {
8
+ id: string;
9
+ detail: string;
10
+ tone: 'problem' | 'attention';
11
+ };
12
+ /** Only the retired assessment requirement is history-only. Specific missing
13
+ * material, defects and failed checks remain visible, including reviewer findings. */
14
+ export declare function historicalAssessmentReason(reason: string): boolean;
15
+ /** Known storage-cap notices do not mean the retained bytes are damaged. */
16
+ export declare function shortenedMaterialReason(detail: string): boolean;
17
+ export declare function assignmentPresentationOf(assignment: AssignmentSnapshot, options?: {
18
+ workStatus?: AssignmentWorkStatus;
19
+ diagnostics?: WorkStatus['diagnostics'];
20
+ additionalAttention?: readonly string[];
21
+ }): {
22
+ status: WorkStatus;
23
+ primaryAction: import("./work-summary.js").WorkAction | null;
24
+ attention: AssignmentAttention[];
25
+ diagnostics: Pick<DisplayStatus, "detail" | "label" | "token" | "tone">[];
26
+ };
@@ -0,0 +1,80 @@
1
+ import { GOAL_ASSESSMENT_PENDING } from './proof.js';
2
+ import { failedCheckExit } from './workspace-ui.js';
3
+ const LABELS = {
4
+ working: 'Working', checking: 'Checking', 'needs-decision': 'Needs your decision',
5
+ 'ready-to-check': 'Ready', complete: 'Complete', cancelled: 'Cancelled',
6
+ };
7
+ /** Only the retired assessment requirement is history-only. Specific missing
8
+ * material, defects and failed checks remain visible, including reviewer findings. */
9
+ export function historicalAssessmentReason(reason) {
10
+ return reason === GOAL_ASSESSMENT_PENDING || reason === 'no proof was written' || reason === 'No builder proof artifact is recorded.' || /^criterion "[^"]+" awaits independent goal assessment\.?$/.test(reason) ||
11
+ /^semantic coverage: .* — (?:required .*|independent review is optional .*)$/.test(reason);
12
+ }
13
+ /** Known storage-cap notices do not mean the retained bytes are damaged. */
14
+ export function shortenedMaterialReason(detail) {
15
+ return detail === 'The check output was shortened when it was stored; its download holds only the stored part.' ||
16
+ detail === 'The sealed diff was shortened when it was stored; its download holds only the stored part, not the full change.' ||
17
+ detail === 'The report was shortened when it was stored; its download holds only the stored part.' ||
18
+ detail === 'The check log was shortened when stored; only the retained output is available.' ||
19
+ detail === 'The changed-file list was cut short; the counts are complete.' ||
20
+ /^Saved (?:terminal-diff|report) #\d+ is incomplete\.$/.test(detail);
21
+ }
22
+ export function assignmentPresentationOf(assignment, options = {}) {
23
+ const { state } = assignment, work = options.workStatus;
24
+ const status = state === 'working'
25
+ ? { ...(work ?? { label: LABELS[state], tone: 'muted' }), token: `assignment-${state}`,
26
+ detail: assignment.detail, action: null, views: work?.views?.filter(view => view !== 'completed') ?? ['all'], rank: work?.rank ?? 2 }
27
+ : { token: `assignment-${state}`, label: state === 'checking' ? work?.label ?? LABELS[state] : LABELS[state], detail: assignment.detail,
28
+ action: null, tone: state === 'needs-decision' ? 'attention' : state === 'checking' ? work?.tone ?? 'live' : state === 'ready-to-check' ? 'ready' : state === 'complete' ? 'done' : 'muted',
29
+ views: state === 'ready-to-check' || state === 'needs-decision' ? ['all', 'needs-you'] : state === 'complete' ? ['all', 'completed']
30
+ : state === 'checking' && work?.views?.includes('running') ? ['all', 'running'] : ['all'],
31
+ rank: state === 'needs-decision' || state === 'ready-to-check' ? 0 : state === 'checking' ? 1 : state === 'complete' ? 3 : 4 };
32
+ const ready = state === 'ready-to-check' || state === 'complete';
33
+ const checks = assignment.receipt?.checks;
34
+ const checkReason = (detail) => detail === checks?.detail || /^Checks (?:failed|passed|did not finish)/.test(detail) ||
35
+ failedCheckExit([detail]) !== null;
36
+ const materialReason = (detail) => {
37
+ const saved = /^Saved (check-log|terminal-diff|report) #(\d+)/.exec(detail);
38
+ if (saved) {
39
+ const current = assignment.receipt?.artifacts.filter(one => one.kind === saved[1]) ?? [];
40
+ // An older attempt's missing file is a distinct limitation. Only the
41
+ // one exact current file can share its detailed reader's explanation.
42
+ return current.length === 1 && current[0].id === Number(saved[2]) ? saved[1] === 'terminal-diff' ? 'diff' : saved[1] : `artifact:${saved[2]}`;
43
+ }
44
+ if (/^The (?:retained verification log|check log|check output) /.test(detail))
45
+ return 'check-log';
46
+ if (/^The sealed diff /.test(detail))
47
+ return 'diff';
48
+ if (/^The report (?:was |is |cannot |no longer )/.test(detail))
49
+ return 'report';
50
+ return null;
51
+ };
52
+ const attention = new Map();
53
+ for (const detail of [...assignment.attention, ...(options.additionalAttention ?? [])]) {
54
+ if (historicalAssessmentReason(detail) || detail === assignment.detail)
55
+ continue;
56
+ const material = materialReason(detail);
57
+ const id = checks !== undefined && checkReason(detail) ? 'checks' : material === null ? `detail:${detail}` : `material:${material}`;
58
+ // A read of the exact machine record owns the check outcome. A legacy
59
+ // assessment cannot claim failure after the actual check passed.
60
+ if (id === 'checks' && (checks?.status === 'passed' || assignment.detail.includes(checks.detail)))
61
+ continue;
62
+ if ([...attention.values()].some(one => one.detail.includes(detail)))
63
+ continue;
64
+ const previous = attention.get(id);
65
+ // Damage to the retained bytes outranks their earlier storage limit.
66
+ if (previous !== undefined && shortenedMaterialReason(detail) && !shortenedMaterialReason(previous.detail))
67
+ continue;
68
+ attention.set(id, { id, detail: id === 'checks' ? checks.detail : detail, tone: 'problem' });
69
+ }
70
+ const diagnostics = (options.diagnostics ?? []).filter(one => {
71
+ if (historicalAssessmentReason(one.detail) || one.detail === assignment.detail || attention.has(`detail:${one.detail}`))
72
+ return false;
73
+ if (ready && (one.token === 'verification-needed' || one.token.startsWith('review-')))
74
+ return false;
75
+ if (checks !== undefined && (one.token === 'checks-failed' || checkReason(one.detail)))
76
+ return false;
77
+ return true;
78
+ });
79
+ return { status, primaryAction: assignment.primaryAction, attention: [...attention.values()], diagnostics };
80
+ }
@@ -0,0 +1,62 @@
1
+ import type { Store } from "./store.js";
2
+ import { type AssignmentSnapshot } from "./assignment.js";
3
+ export declare const ASSIGNMENT_STATUS_ACTION = "assignment status observed";
4
+ export declare const ASSIGNMENT_STATUS_SOURCE: "work";
5
+ /** No saved artifact contents, credential bytes, or polling timestamps. Exact
6
+ * IDs and digests identify the full read; display text is deliberately bounded. */
7
+ export declare function assignmentStatusBrief(assignment: AssignmentSnapshot): {
8
+ rootId: string;
9
+ activeTaskId: string;
10
+ title: string;
11
+ state: "cancelled" | "checking" | "complete" | "needs-decision" | "ready-to-check" | "working";
12
+ detail: string;
13
+ owner: {
14
+ kind: "coordinator" | "lead";
15
+ id: string;
16
+ label: string;
17
+ } | null;
18
+ runId: number | null;
19
+ primaryAction: {
20
+ code: "inspect-decisions" | "inspect-run" | "inspect-stop" | "inspect-task" | "open-pr" | "reconcile-run" | import("./dispatch.js").DispatchAction;
21
+ label: string;
22
+ target: import("./work-summary.js").WorkTarget;
23
+ } | null;
24
+ attention: string[];
25
+ result: {
26
+ digest: string;
27
+ runId: number;
28
+ checks: {
29
+ status: "failed" | "not-run" | "passed" | "unavailable";
30
+ exitCode: number | null;
31
+ logArtifactId: number | null;
32
+ };
33
+ checksDigest: string;
34
+ } | null;
35
+ completion: {
36
+ actor: string;
37
+ digest: string;
38
+ } | null;
39
+ publication: {
40
+ state: string;
41
+ prUrl: string | null;
42
+ remoteState: string | null;
43
+ } | null;
44
+ };
45
+ export type AssignmentStatusEvent = {
46
+ version: 1;
47
+ digest: string;
48
+ stateDigest: string;
49
+ assignment: ReturnType<typeof assignmentStatusBrief> & {
50
+ owner: NonNullable<ReturnType<typeof assignmentStatusBrief>["owner"]>;
51
+ };
52
+ };
53
+ /** An unreadable ledger event is an explicit consumer error, not a cursor that
54
+ * may silently skip the row. This validates the bounded data, not authority. */
55
+ export declare function parseAssignmentStatusEvent(value: string): AssignmentStatusEvent | null;
56
+ /** Call inside the mutation's transaction when possible; independently atomic
57
+ * for worker reconciliation. The latest event, not a permanent digest set,
58
+ * deduplicates retries so Working → Needs decision → Working is retained. */
59
+ export declare function noteAssignmentStatus(store: Store, snapshot: AssignmentSnapshot, now: Date): number | null;
60
+ /** At most fifty roots per pass; the cursor survives process restarts. A full
61
+ * pass cycles back, so changes below the cursor are eventually observed too. */
62
+ export declare function syncAssignmentStatuses(store: Store, now: Date, repos: readonly string[], root?: string): void;