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,159 @@
1
+ import type { Store } from "./store.js";
2
+ export type ChatIdentity = {
3
+ installation: string;
4
+ team?: string;
5
+ app: string;
6
+ bot: string;
7
+ workspace: string;
8
+ };
9
+ export type ChatBinding = {
10
+ id: number;
11
+ installation: string;
12
+ team: string;
13
+ app: string;
14
+ member: string;
15
+ channel: string;
16
+ approver: string;
17
+ generation: number;
18
+ created: string;
19
+ revoked: string | null;
20
+ };
21
+ export type ChatEvent = {
22
+ id: string;
23
+ installation: string;
24
+ binding: number | null;
25
+ kind: "message" | "action" | "pair" | "notice";
26
+ channel: string;
27
+ member: string;
28
+ ts: string;
29
+ thread: string;
30
+ payload: string;
31
+ created: string;
32
+ session: number | null;
33
+ state: string;
34
+ next_at: string | null;
35
+ };
36
+ export type ChatPart = {
37
+ id: number;
38
+ event: string;
39
+ ordinal: number;
40
+ payload: string;
41
+ state: string;
42
+ message: string | null;
43
+ file: string | null;
44
+ uploaded: number;
45
+ attempts: number;
46
+ uncertain: number;
47
+ next_at: string | null;
48
+ created: string;
49
+ };
50
+ export type ChatRoom = {
51
+ id: number;
52
+ installation: string;
53
+ chat: string;
54
+ kind: "group" | "private";
55
+ conversation: string;
56
+ boundBy: string;
57
+ binding: number;
58
+ cursor: number;
59
+ };
60
+ export type ChatContent = {
61
+ text: string;
62
+ /** Where the part is sent when not the binding's own DM: a room's channel. */
63
+ channel?: string;
64
+ proposal?: number;
65
+ image?: {
66
+ taskId: string;
67
+ run: number;
68
+ artifact: number;
69
+ sha256: string;
70
+ };
71
+ task?: string;
72
+ run?: number;
73
+ edit?: string;
74
+ phase?: "armed";
75
+ link?: {
76
+ label: string;
77
+ path: string;
78
+ };
79
+ /** A flow decision's buttons ride this part (v88): minted when it is planned. */
80
+ flow?: {
81
+ card: number;
82
+ entry: number;
83
+ actions: Array<"approve" | "edit" | "send-back">;
84
+ };
85
+ /** A teammate's question's buttons ride this part (v93): each option, then one to answer in words (choice null). */
86
+ question?: {
87
+ id: number;
88
+ choices: Array<{
89
+ choice: string | null;
90
+ label: string;
91
+ }>;
92
+ };
93
+ };
94
+ export declare const chatHash: (text: string) => string;
95
+ export declare class ChatState {
96
+ readonly store: Store;
97
+ readonly channel: "slack" | "discord" | "teams";
98
+ constructor(store: Store, channel: "slack" | "discord" | "teams");
99
+ prepare(sql: string): import("./store.js").Statement;
100
+ /** Small transport facts a channel must remember per chat (a Teams service URL). Never credentials. */
101
+ meta(installation: string, key: string): string | null;
102
+ setMeta(installation: string, key: string, value: string, now: Date): void;
103
+ private readRoom;
104
+ room(installation: string, chat: string): ChatRoom | null;
105
+ rooms(installation: string): ChatRoom[];
106
+ /** Point a chat at a conversation; an earlier choice for the same chat is revoked and delivery starts from now. */
107
+ bindRoom(args: {
108
+ installation: string;
109
+ chat: string;
110
+ kind: "group" | "private";
111
+ conversation: string;
112
+ by: string;
113
+ binding: number;
114
+ }, now: Date): {
115
+ ok: true;
116
+ } | {
117
+ ok: false;
118
+ reason: "group-taken";
119
+ };
120
+ unbindRoom(installation: string, chat: string, by: string, now: Date): boolean;
121
+ /** The shared rooms core's view of this installation's room records. */
122
+ roomBackend(installation: string, now: Date): import("./chat-rooms.js").RoomBackend;
123
+ advanceRoomCursor(id: number, messageId: number): boolean;
124
+ get db(): import("./store.js").Database;
125
+ /** Every unrevoked binding for an installation, oldest first: one per
126
+ * paired person (v73). Liveness is checked per binding with `live`. */
127
+ bindings(installation: string): ChatBinding[];
128
+ /** The unrevoked binding one channel member holds, if any. */
129
+ bindingFor(installation: string, member: string): ChatBinding | null;
130
+ bindingById(id: number): ChatBinding | null;
131
+ /** The oldest unrevoked binding — the single-person reading kept for
132
+ * status lines and fixtures; inbound, delivery and notices read
133
+ * `bindingFor` / `bindingById` / `bindings`. */
134
+ binding(installation: string): ChatBinding | null;
135
+ live(binding: ChatBinding): boolean;
136
+ /** End one person's pairing and everything their chat could still do; teammates' bindings stay. */
137
+ revokeBinding(binding: ChatBinding, now?: Date): void;
138
+ revoke(installation: string, now?: Date): void;
139
+ pairing(installation: string, approver: string, generation: number, now?: Date): string;
140
+ pair(identity: ChatIdentity, hash: string, member: string, channel: string, now: Date): ChatBinding | null;
141
+ enqueue(event: Omit<ChatEvent, "session" | "state" | "next_at">): boolean;
142
+ event(id: string): ChatEvent | null;
143
+ next(installation: string, now: Date): ChatEvent | null;
144
+ defer(event: string, problem: string, until: Date): void;
145
+ finish(event: string, dropped?: boolean): void;
146
+ part(id: number): ChatPart | null;
147
+ plan(event: string, parts: ChatContent[], now: Date): void;
148
+ tokens(part: number, proposal: number, phases: Array<"confirm" | "dismiss" | "yes" | "cancel">, now: Date): void;
149
+ lease(installation: string, owner: string, now: Date): boolean;
150
+ owns(installation: string, owner: string, now?: Date): boolean;
151
+ }
152
+ export declare const chatSchema: (channel: "slack" | "discord" | "teams") => string;
153
+ export declare const chatTables: (channel: "slack" | "discord" | "teams") => string[];
154
+ export declare class ChatDeliveryError extends Error {
155
+ readonly code: string;
156
+ readonly retryMs: number;
157
+ readonly uncertain: boolean;
158
+ constructor(code: string, retryMs?: number, uncertain?: boolean);
159
+ }
@@ -0,0 +1,309 @@
1
+ /** Durable private-chat receipts. Each transport has its own tables and lease. */
2
+ import { createHash, randomBytes } from "node:crypto";
3
+ const CHAT_SCHEMA = `
4
+ CREATE TABLE IF NOT EXISTS chat_binding (
5
+ id INTEGER PRIMARY KEY AUTOINCREMENT, installation TEXT NOT NULL,
6
+ team TEXT NOT NULL, app TEXT NOT NULL, member TEXT NOT NULL, channel TEXT NOT NULL,
7
+ approver TEXT NOT NULL, generation INTEGER NOT NULL, created TEXT NOT NULL, revoked TEXT
8
+ );
9
+ CREATE UNIQUE INDEX IF NOT EXISTS chat_one_binding_member ON chat_binding(installation, member) WHERE revoked IS NULL;
10
+ CREATE TABLE IF NOT EXISTS chat_pair (
11
+ hash TEXT PRIMARY KEY, installation TEXT NOT NULL, approver TEXT NOT NULL,
12
+ generation INTEGER NOT NULL, expires TEXT NOT NULL, consumed TEXT
13
+ );
14
+ CREATE TABLE IF NOT EXISTS chat_event (
15
+ id TEXT PRIMARY KEY, installation TEXT NOT NULL, binding INTEGER REFERENCES chat_binding(id),
16
+ kind TEXT NOT NULL CHECK(kind IN ('message','action','pair','notice')),
17
+ channel TEXT NOT NULL, member TEXT NOT NULL, ts TEXT NOT NULL, thread TEXT NOT NULL,
18
+ payload TEXT NOT NULL, created TEXT NOT NULL,
19
+ session INTEGER REFERENCES mate_session(id), state TEXT NOT NULL DEFAULT 'queued' CHECK(state IN ('queued','done','dropped')),
20
+ next_at TEXT, problem TEXT
21
+ );
22
+ CREATE INDEX IF NOT EXISTS chat_pending_event ON chat_event(installation,state,next_at);
23
+ CREATE TABLE IF NOT EXISTS chat_part (
24
+ id INTEGER PRIMARY KEY AUTOINCREMENT, event TEXT NOT NULL REFERENCES chat_event(id), ordinal INTEGER NOT NULL,
25
+ payload TEXT NOT NULL, state TEXT NOT NULL DEFAULT 'pending' CHECK(state IN ('pending','sent','dropped')),
26
+ message TEXT, file TEXT, uploaded INTEGER NOT NULL DEFAULT 0, attempts INTEGER NOT NULL DEFAULT 0,
27
+ uncertain INTEGER NOT NULL DEFAULT 0, next_at TEXT, problem TEXT, created TEXT NOT NULL,
28
+ UNIQUE(event,ordinal)
29
+ );
30
+ CREATE TABLE IF NOT EXISTS chat_action (
31
+ token TEXT PRIMARY KEY, part INTEGER NOT NULL REFERENCES chat_part(id),
32
+ proposal INTEGER NOT NULL REFERENCES mate_proposal(id), phase TEXT NOT NULL CHECK(phase IN ('confirm','dismiss','yes','cancel')),
33
+ expires TEXT NOT NULL, consumed TEXT
34
+ );
35
+ CREATE TABLE IF NOT EXISTS chat_progress (
36
+ binding INTEGER NOT NULL REFERENCES chat_binding(id), run INTEGER NOT NULL REFERENCES run(id),
37
+ part INTEGER NOT NULL REFERENCES chat_part(id), digest TEXT NOT NULL,
38
+ PRIMARY KEY(binding,run)
39
+ );
40
+ CREATE TABLE IF NOT EXISTS chat_runtime (
41
+ installation TEXT PRIMARY KEY, owner TEXT, lease_until TEXT, connected TEXT,
42
+ problem TEXT, retry_at TEXT, notification INTEGER NOT NULL DEFAULT 0
43
+ );
44
+ `;
45
+ /** v73: a chat's place in the shared team conversations — a channel follows one
46
+ * conversation, a DM may select one. Rows are revoked, never deleted. */
47
+ const CHAT_ROOM_SCHEMA = `
48
+ CREATE TABLE IF NOT EXISTS chat_room (
49
+ id INTEGER PRIMARY KEY AUTOINCREMENT, installation TEXT NOT NULL, chat TEXT NOT NULL,
50
+ kind TEXT NOT NULL CHECK(kind IN ('group','private')), conversation TEXT NOT NULL,
51
+ binding INTEGER NOT NULL REFERENCES chat_binding(id),
52
+ bound_by TEXT NOT NULL, bound TEXT NOT NULL, cursor INTEGER NOT NULL DEFAULT 0,
53
+ revoked TEXT, revoked_by TEXT
54
+ );
55
+ CREATE UNIQUE INDEX IF NOT EXISTS chat_room_live ON chat_room(installation, chat) WHERE revoked IS NULL;
56
+ CREATE UNIQUE INDEX IF NOT EXISTS chat_room_group ON chat_room(conversation) WHERE revoked IS NULL AND kind='group';
57
+ CREATE TABLE IF NOT EXISTS chat_meta (
58
+ installation TEXT NOT NULL, key TEXT NOT NULL, value TEXT NOT NULL, updated TEXT NOT NULL,
59
+ PRIMARY KEY(installation, key)
60
+ );
61
+ `;
62
+ /** v88: flow decisions in the chat app, as on Telegram (telegram-flow.ts).
63
+ * A button is one opaque token for one visit (card, entry) of one card, on
64
+ * the part it rides; Edit and Send back open a prompt the person's next
65
+ * message in their DM answers. */
66
+ const CHAT_FLOW_SCHEMA = `
67
+ CREATE TABLE IF NOT EXISTS chat_flow_action (
68
+ token TEXT PRIMARY KEY, part INTEGER NOT NULL REFERENCES chat_part(id),
69
+ card INTEGER NOT NULL REFERENCES flow_card(id), entry INTEGER NOT NULL,
70
+ action TEXT NOT NULL CHECK(action IN ('approve','edit','send-back')), expires TEXT NOT NULL, consumed TEXT
71
+ );
72
+ CREATE INDEX IF NOT EXISTS chat_flow_action_visit ON chat_flow_action(card, entry);
73
+ CREATE TABLE IF NOT EXISTS chat_flow_prompt (
74
+ id INTEGER PRIMARY KEY AUTOINCREMENT, binding INTEGER NOT NULL REFERENCES chat_binding(id),
75
+ card INTEGER NOT NULL REFERENCES flow_card(id), entry INTEGER NOT NULL,
76
+ mode TEXT NOT NULL CHECK(mode IN ('edit','send-back')), created TEXT NOT NULL, expires TEXT NOT NULL, consumed TEXT
77
+ );
78
+ CREATE INDEX IF NOT EXISTS chat_flow_prompt_open ON chat_flow_prompt(binding, consumed);
79
+ `;
80
+ /** v93: a teammate's question in the chat app. One button per option (choice)
81
+ * and one to answer in words (choice NULL); that one opens a prompt the
82
+ * person's next message in their DM answers. Never in CHAT_TABLES: an older
83
+ * database has no such tables until this schema creates them. */
84
+ const CHAT_QUESTION_SCHEMA = `
85
+ CREATE TABLE IF NOT EXISTS chat_question_action (
86
+ token TEXT PRIMARY KEY, part INTEGER NOT NULL REFERENCES chat_part(id),
87
+ question INTEGER NOT NULL REFERENCES teammate_question(id), choice TEXT, expires TEXT NOT NULL, consumed TEXT
88
+ );
89
+ CREATE INDEX IF NOT EXISTS chat_question_action_question ON chat_question_action(question);
90
+ CREATE TABLE IF NOT EXISTS chat_question_prompt (
91
+ id INTEGER PRIMARY KEY AUTOINCREMENT, binding INTEGER NOT NULL REFERENCES chat_binding(id),
92
+ question INTEGER NOT NULL REFERENCES teammate_question(id), created TEXT NOT NULL, expires TEXT NOT NULL, consumed TEXT
93
+ );
94
+ CREATE INDEX IF NOT EXISTS chat_question_prompt_open ON chat_question_prompt(binding, consumed);
95
+ `;
96
+ const CHAT_TABLES = [
97
+ "chat_binding",
98
+ "chat_pair",
99
+ "chat_event",
100
+ "chat_part",
101
+ "chat_action",
102
+ "chat_progress",
103
+ "chat_runtime",
104
+ ];
105
+ export const chatHash = (text) => createHash("sha256").update(text).digest("hex");
106
+ export class ChatState {
107
+ store;
108
+ channel;
109
+ constructor(store, channel) {
110
+ this.store = store;
111
+ this.channel = channel;
112
+ }
113
+ prepare(sql) {
114
+ return this.db.prepare(sql.replace(/\bchat_(binding|pair|event|part|action|progress|runtime|room|meta|flow_action|flow_prompt|question_action|question_prompt)\b/g, `${this.channel}_$1`));
115
+ }
116
+ /** Small transport facts a channel must remember per chat (a Teams service URL). Never credentials. */
117
+ meta(installation, key) {
118
+ const row = this.prepare("SELECT value FROM chat_meta WHERE installation=? AND key=?").get(installation, key);
119
+ return row === undefined ? null : String(row.value);
120
+ }
121
+ setMeta(installation, key, value, now) {
122
+ this.prepare("INSERT INTO chat_meta(installation,key,value,updated) VALUES(?,?,?,?) ON CONFLICT(installation,key) DO UPDATE SET value=excluded.value,updated=excluded.updated").run(installation, key, value, now.toISOString());
123
+ }
124
+ // ---- rooms (v73) -----------------------------------------------------------
125
+ readRoom(row) {
126
+ return { id: Number(row.id), installation: String(row.installation), chat: String(row.chat), kind: row.kind === "group" ? "group" : "private",
127
+ conversation: String(row.conversation), boundBy: String(row.bound_by), binding: Number(row.binding), cursor: Number(row.cursor) };
128
+ }
129
+ room(installation, chat) {
130
+ const row = this.prepare("SELECT * FROM chat_room WHERE installation=? AND chat=? AND revoked IS NULL").get(installation, chat);
131
+ return row === undefined ? null : this.readRoom(row);
132
+ }
133
+ rooms(installation) {
134
+ return this.prepare("SELECT * FROM chat_room WHERE installation=? AND revoked IS NULL ORDER BY id").all(installation).map(row => this.readRoom(row));
135
+ }
136
+ /** Point a chat at a conversation; an earlier choice for the same chat is revoked and delivery starts from now. */
137
+ bindRoom(args, now) {
138
+ return this.store.transact(() => {
139
+ const stamp = now.toISOString();
140
+ // Check the expected collision before revoking the current selection.
141
+ if (args.kind === "group") {
142
+ const group = this.prepare("SELECT installation, chat FROM chat_room WHERE conversation=? AND kind='group' AND revoked IS NULL").get(args.conversation);
143
+ if (group !== undefined && (group.installation !== args.installation || group.chat !== args.chat))
144
+ return { ok: false, reason: "group-taken" };
145
+ }
146
+ this.prepare("UPDATE chat_room SET revoked=?,revoked_by=? WHERE installation=? AND chat=? AND revoked IS NULL").run(stamp, args.by, args.installation, args.chat);
147
+ const thread = this.db.prepare("SELECT thread FROM team_conversation WHERE id=?").get(args.conversation);
148
+ if (thread === undefined)
149
+ throw new Error("no such team conversation");
150
+ const cursor = Number(this.db.prepare("SELECT COALESCE(MAX(id),0) AS n FROM mate_message WHERE thread=?").get(Number(thread["thread"]))?.["n"] ?? 0);
151
+ this.prepare("INSERT INTO chat_room(installation,chat,kind,conversation,binding,bound_by,bound,cursor) VALUES(?,?,?,?,?,?,?,?)").run(args.installation, args.chat, args.kind, args.conversation, args.binding, args.by, stamp, cursor);
152
+ return { ok: true };
153
+ });
154
+ }
155
+ unbindRoom(installation, chat, by, now) {
156
+ return Number(this.prepare("UPDATE chat_room SET revoked=?,revoked_by=? WHERE installation=? AND chat=? AND revoked IS NULL").run(now.toISOString(), by, installation, chat).changes) > 0;
157
+ }
158
+ /** The shared rooms core's view of this installation's room records. */
159
+ roomBackend(installation, now) {
160
+ const roomOf = (room) => room === null ? null : { id: room.id, chatId: room.chat, kind: room.kind, conversation: room.conversation, boundBy: room.boundBy, binding: room.binding, cursor: room.cursor };
161
+ return {
162
+ room: chat => roomOf(this.room(installation, chat)),
163
+ bind: args => this.bindRoom({ installation, chat: args.chatId, kind: args.kind, conversation: args.conversation, by: args.by, binding: args.binding }, now),
164
+ unbind: (chat, by) => this.unbindRoom(installation, chat, by, now),
165
+ grant: id => { const binding = this.bindingById(id); return binding === null || !this.live(binding) ? null : { approver: binding.approver, generation: binding.generation, chatId: binding.channel }; },
166
+ };
167
+ }
168
+ advanceRoomCursor(id, messageId) {
169
+ return Number(this.prepare("UPDATE chat_room SET cursor=? WHERE id=? AND cursor<? AND revoked IS NULL").run(messageId, id, messageId).changes) > 0;
170
+ }
171
+ get db() {
172
+ return this.store.handle;
173
+ }
174
+ /** Every unrevoked binding for an installation, oldest first: one per
175
+ * paired person (v73). Liveness is checked per binding with `live`. */
176
+ bindings(installation) {
177
+ return this.prepare("SELECT * FROM chat_binding WHERE installation=? AND revoked IS NULL ORDER BY id").all(installation);
178
+ }
179
+ /** The unrevoked binding one channel member holds, if any. */
180
+ bindingFor(installation, member) {
181
+ return (this.prepare("SELECT * FROM chat_binding WHERE installation=? AND member=? AND revoked IS NULL").get(installation, member) ?? null);
182
+ }
183
+ bindingById(id) {
184
+ return (this.prepare("SELECT * FROM chat_binding WHERE id=? AND revoked IS NULL").get(id) ?? null);
185
+ }
186
+ /** The oldest unrevoked binding — the single-person reading kept for
187
+ * status lines and fixtures; inbound, delivery and notices read
188
+ * `bindingFor` / `bindingById` / `bindings`. */
189
+ binding(installation) {
190
+ return this.bindings(installation)[0] ?? null;
191
+ }
192
+ live(binding) {
193
+ const current = this.bindingById(binding.id);
194
+ const account = this.store.accountOf(binding.approver);
195
+ return (current !== null &&
196
+ account?.role === "approver" &&
197
+ account.revokedAt === null &&
198
+ account.generation === binding.generation);
199
+ }
200
+ /** End one person's pairing and everything their chat could still do; teammates' bindings stay. */
201
+ revokeBinding(binding, now = new Date()) {
202
+ this.store.transact(() => {
203
+ this.prepare("UPDATE chat_binding SET revoked=? WHERE id=? AND revoked IS NULL").run(now.toISOString(), binding.id);
204
+ this.prepare("UPDATE chat_event SET state='dropped',payload='{}',problem='Chat disconnected' WHERE binding=? AND state='queued'").run(binding.id);
205
+ this.prepare("UPDATE chat_part SET state='dropped',problem='Chat disconnected' WHERE state='pending' AND event IN (SELECT id FROM chat_event WHERE binding=?)").run(binding.id);
206
+ });
207
+ }
208
+ revoke(installation, now = new Date()) {
209
+ this.store.transact(() => {
210
+ this.prepare("UPDATE chat_binding SET revoked=? WHERE installation=? AND revoked IS NULL").run(now.toISOString(), installation);
211
+ this.prepare("UPDATE chat_pair SET consumed=? WHERE installation=? AND consumed IS NULL").run(now.toISOString(), installation);
212
+ this.prepare("UPDATE chat_event SET state='dropped',payload='{}',problem='Chat disconnected' WHERE installation=? AND state='queued'").run(installation);
213
+ this.prepare("UPDATE chat_part SET state='dropped',problem='Chat disconnected' WHERE state='pending' AND event IN (SELECT id FROM chat_event WHERE installation=?)").run(installation);
214
+ });
215
+ }
216
+ pairing(installation, approver, generation, now = new Date()) {
217
+ const code = randomBytes(16).toString("hex");
218
+ this.store.transact(() => {
219
+ // A fresh code replaces this person's outstanding ones; a teammate's pending code is theirs.
220
+ this.prepare("UPDATE chat_pair SET consumed=? WHERE installation=? AND approver=? AND consumed IS NULL").run(now.toISOString(), installation, approver);
221
+ this.prepare("INSERT INTO chat_pair VALUES(?,?,?,?,?,NULL)").run(chatHash(code), installation, approver, generation, new Date(now.getTime() + 600_000).toISOString());
222
+ });
223
+ return code;
224
+ }
225
+ pair(identity, hash, member, channel, now) {
226
+ return this.store.transact(() => {
227
+ const pair = this.prepare("SELECT approver,generation FROM chat_pair WHERE hash=? AND installation=? AND consumed IS NULL AND expires>?").get(hash, identity.installation, now.toISOString());
228
+ if (!pair)
229
+ return null;
230
+ // One binding per channel member, and one channel identity per person.
231
+ if (this.bindingFor(identity.installation, member))
232
+ return null;
233
+ if (this.bindings(identity.installation).some(one => one.approver === String(pair.approver) && this.live(one)))
234
+ return null;
235
+ const account = this.store.accountOf(String(pair.approver));
236
+ if (account?.role !== "approver" ||
237
+ account.revokedAt !== null ||
238
+ account.generation !== Number(pair.generation))
239
+ return null;
240
+ this.prepare("UPDATE chat_pair SET consumed=? WHERE hash=?").run(now.toISOString(), hash);
241
+ this.prepare("INSERT INTO chat_binding(installation,team,app,member,channel,approver,generation,created) VALUES(?,?,?,?,?,?,?,?)").run(identity.installation, identity.team ?? identity.app, identity.app, member, channel, String(pair.approver), Number(pair.generation), now.toISOString());
242
+ // The installation's notice cursor starts from now on its FIRST pairing;
243
+ // a later person joins the running cursor (their own history is fenced
244
+ // by their binding's creation time).
245
+ this.prepare("INSERT OR IGNORE INTO chat_runtime(installation, notification) VALUES(?, (SELECT COALESCE(MAX(id),0) FROM notification))").run(identity.installation);
246
+ return this.bindingFor(identity.installation, member);
247
+ });
248
+ }
249
+ enqueue(event) {
250
+ return (Number(this.prepare("INSERT OR IGNORE INTO chat_event(id,installation,binding,kind,channel,member,ts,thread,payload,created) VALUES(?,?,?,?,?,?,?,?,?,?)").run(event.id, event.installation, event.binding, event.kind, event.channel, event.member, event.ts, event.thread, event.payload, event.created).changes) === 1);
251
+ }
252
+ event(id) {
253
+ return (this.prepare("SELECT * FROM chat_event WHERE id=?").get(id) ?? null);
254
+ }
255
+ next(installation, now) {
256
+ return (this.prepare("SELECT * FROM chat_event WHERE installation=? AND state='queued' AND (next_at IS NULL OR next_at<=?) ORDER BY created,id LIMIT 1").get(installation, now.toISOString()) ?? null);
257
+ }
258
+ defer(event, problem, until) {
259
+ this.prepare("UPDATE chat_event SET next_at=?,problem=? WHERE id=? AND state='queued'").run(until.toISOString(), problem, event);
260
+ }
261
+ finish(event, dropped = false) {
262
+ this.prepare("UPDATE chat_event SET state=?,payload='{}' WHERE id=?").run(dropped ? "dropped" : "done", event);
263
+ }
264
+ part(id) {
265
+ return (this.prepare("SELECT * FROM chat_part WHERE id=?").get(id) ?? null);
266
+ }
267
+ plan(event, parts, now) {
268
+ this.store.transact(() => {
269
+ for (const [ordinal, part] of parts.entries()) {
270
+ const inserted = this.prepare("INSERT OR IGNORE INTO chat_part(event,ordinal,payload,created) VALUES(?,?,?,?)").run(event, ordinal, JSON.stringify(part), now.toISOString());
271
+ if (Number(inserted.changes) && part.proposal)
272
+ this.tokens(Number(inserted.lastInsertRowid), part.proposal, ["confirm", "dismiss"], now);
273
+ if (Number(inserted.changes) && part.question)
274
+ for (const one of part.question.choices)
275
+ this.prepare("INSERT INTO chat_question_action(token,part,question,choice,expires) VALUES(?,?,?,?,?)").run(randomBytes(16).toString("hex"), Number(inserted.lastInsertRowid), part.question.id, one.choice, new Date(now.getTime() + 7 * 86_400_000).toISOString());
276
+ if (Number(inserted.changes) && part.flow)
277
+ for (const action of part.flow.actions)
278
+ this.prepare("INSERT INTO chat_flow_action(token,part,card,entry,action,expires) VALUES(?,?,?,?,?,?)").run(randomBytes(16).toString("hex"), Number(inserted.lastInsertRowid), part.flow.card, part.flow.entry, action, new Date(now.getTime() + 7 * 86_400_000).toISOString());
279
+ }
280
+ this.finish(event);
281
+ });
282
+ }
283
+ tokens(part, proposal, phases, now) {
284
+ this.prepare("UPDATE chat_action SET consumed=? WHERE part=? AND consumed IS NULL").run(now.toISOString(), part);
285
+ for (const phase of phases)
286
+ this.prepare("INSERT INTO chat_action VALUES(?,?,?,?,?,NULL)").run(randomBytes(16).toString("hex"), part, proposal, phase, new Date(now.getTime() +
287
+ (phase === "yes" || phase === "cancel" ? 600_000 : 86_400_000)).toISOString());
288
+ }
289
+ lease(installation, owner, now) {
290
+ this.prepare("INSERT OR IGNORE INTO chat_runtime(installation) VALUES(?)").run(installation);
291
+ return (Number(this.prepare("UPDATE chat_runtime SET owner=?,lease_until=? WHERE installation=? AND (owner=? OR lease_until IS NULL OR lease_until<=?)").run(owner, new Date(now.getTime() + 60_000).toISOString(), installation, owner, now.toISOString()).changes) === 1);
292
+ }
293
+ owns(installation, owner, now = new Date()) {
294
+ return !!this.prepare("SELECT 1 FROM chat_runtime WHERE installation=? AND owner=? AND lease_until>?").get(installation, owner, now.toISOString());
295
+ }
296
+ }
297
+ export const chatSchema = (channel) => (CHAT_SCHEMA + CHAT_ROOM_SCHEMA + CHAT_FLOW_SCHEMA + CHAT_QUESTION_SCHEMA).replaceAll("chat_", `${channel}_`);
298
+ export const chatTables = (channel) => CHAT_TABLES.map((name) => name.replace("chat_", `${channel}_`));
299
+ export class ChatDeliveryError extends Error {
300
+ code;
301
+ retryMs;
302
+ uncertain;
303
+ constructor(code, retryMs = 5000, uncertain = false) {
304
+ super(code);
305
+ this.code = code;
306
+ this.retryMs = retryMs;
307
+ this.uncertain = uncertain;
308
+ }
309
+ }
@@ -0,0 +1,38 @@
1
+ import { type DoorOptions } from "./mate-doors.js";
2
+ import { ChatState, type ChatBinding, type ChatEvent, type ChatIdentity } from "./chat-delivery-state.js";
3
+ import { type Store } from "./store.js";
4
+ import type { SubscriptionMateRunner } from "./subscription-chat.js";
5
+ export declare const chatObject: (v: unknown) => Record<string, unknown>;
6
+ export type ChatDeliveryOptions = {
7
+ store: Store;
8
+ state: ChatState;
9
+ label: string;
10
+ identity: ChatIdentity;
11
+ owner: string;
12
+ member: (member: string, channel: string) => Promise<boolean>;
13
+ readProjects: () => Promise<readonly string[]>;
14
+ evidenceRoot: string;
15
+ current: () => boolean;
16
+ origin: () => string | null;
17
+ subscriptionRunner?: SubscriptionMateRunner;
18
+ held?: DoorOptions["held"];
19
+ canNotify?: () => boolean;
20
+ clock?: () => Date;
21
+ partSize?: number;
22
+ maxProposal?: number;
23
+ };
24
+ export declare const splitChatText: (text: string, size?: number) => string[];
25
+ export declare function channelAccess(options: ChatDeliveryOptions, binding: ChatBinding, ceiling?: string): Promise<string[]>;
26
+ export declare function processChatEvent(options: ChatDeliveryOptions): Promise<boolean>;
27
+ /** Bound to the paired member, exact channel/message, pending proposal and current ceiling. */
28
+ export declare function applyChatAction(options: ChatDeliveryOptions, event: ChatEvent, binding: ChatBinding, repos: readonly string[]): void;
29
+ /**
30
+ * Carry new conversation messages to every room that follows one: the
31
+ * lead's replies, teammates' messages (never the room's own), and each
32
+ * reply's pending cards, as ordinary parts sent to the room's channel. A
33
+ * room is a grant from one exact pairing and is rechecked before each
34
+ * message; a room nobody paired can carry waits.
35
+ */
36
+ export declare function planRoomMessages(options: ChatDeliveryOptions): Promise<void>;
37
+ /** One progress card per exact result; separate urgent facts retain their own review link. */
38
+ export declare function planChatNotifications(options: ChatDeliveryOptions): Promise<void>;