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,97 @@
1
+ /**
2
+ * The contract every work graph is driven through, and the guard around it.
3
+ *
4
+ * §4's interface, with one deliberate omission: `hold` is not here. A hold is
5
+ * an operational pause — "not tonight, we are waiting on a person" — and not a
6
+ * claim about how the work is structured, so it lives in the overlay where it
7
+ * costs nobody else's tracker anything. Dependency edges are the opposite, and
8
+ * that asymmetry is the whole rule:
9
+ *
10
+ * **Scheduling edges are never emulated.** A backend with no native edges is
11
+ * *ineligible for dependency scheduling*, not repaired with invisible ones. A
12
+ * private graph is shadow data: teammates and other tools read a task as ready
13
+ * while our overlay privately calls it blocked, and the divergence becomes
14
+ * migration-critical the moment anybody wants out. So `addEdge` on a backend
15
+ * whose edges are unverified refuses, and says why, rather than storing
16
+ * something only we can see.
17
+ *
18
+ * Every method answers with an outcome rather than throwing. These call other
19
+ * people's binaries over other people's networks; failure is a normal Tuesday,
20
+ * and one unreachable backend must not end a run covering four others.
21
+ */
22
+ import { type Store, type TaskState } from "./store.js";
23
+ import type { Deps } from "./graph.js";
24
+ import type { ExecResult, RunOptions } from "./exec.js";
25
+ export type Runner = (file: string, args: readonly string[], options?: RunOptions) => Promise<ExecResult>;
26
+ /** What a backend can tell us about a task, in terms we share across all of them. */
27
+ export type BackendTask = {
28
+ id: string;
29
+ title: string;
30
+ state: TaskState;
31
+ };
32
+ export type TaskSpec = {
33
+ title: string;
34
+ body?: string;
35
+ };
36
+ export type Outcome<T> = {
37
+ ok: true;
38
+ value: T;
39
+ } | {
40
+ ok: false;
41
+ reason: OutcomeReason;
42
+ message: string;
43
+ };
44
+ /**
45
+ * `unsupported` is not a failure of this run — it is a permanent property of
46
+ * the backend, and a caller should stop asking rather than retry.
47
+ */
48
+ export type OutcomeReason = "unsupported" | "denied" | "unreachable" | "unreadable" | "rejected";
49
+ export interface GraphBackend {
50
+ readonly name: string;
51
+ /** Whether this backend carries dependency edges of its own. */
52
+ readonly deps: Deps;
53
+ listReady(): Promise<Outcome<BackendTask[]>>;
54
+ get(id: string): Promise<Outcome<BackendTask | null>>;
55
+ create(spec: TaskSpec): Promise<Outcome<string>>;
56
+ setState(id: string, state: TaskState): Promise<Outcome<void>>;
57
+ addEdge(blocked: string, blocker: string): Promise<Outcome<void>>;
58
+ }
59
+ export declare const ok: <T>(value: T) => Outcome<T>;
60
+ export declare const no: (reason: OutcomeReason, message: string) => Outcome<never>;
61
+ /**
62
+ * The refusal a backend without confirmed edges gives, spelled once so every
63
+ * adapter says the same thing and nobody is tempted to soften it.
64
+ */
65
+ export declare function edgesNotEmulated(name: string): Outcome<never>;
66
+ /** Turn a failed command into words, without pretending to know more than we do. */
67
+ export declare function describeFailure(result: ExecResult): string;
68
+ export declare function parseJson(text: string): unknown | null;
69
+ /**
70
+ * The built-in store, behind the same contract as everyone else.
71
+ *
72
+ * Worth the wrapper even though it is ours: the scheduler should not be able
73
+ * to tell which backend it is driving, and the day this is the only one with a
74
+ * privileged shortcut is the day the interface stops being tested.
75
+ *
76
+ * It is the only backend here whose edges are both native and ours to write,
77
+ * so it is also the only one where dependency scheduling is unconditionally
78
+ * available.
79
+ */
80
+ export declare function builtIn(store: Store, now?: () => Date): GraphBackend;
81
+ export type GuardOptions = {
82
+ store: Store;
83
+ repo: string;
84
+ };
85
+ /**
86
+ * Wrap a backend so nothing can write through it without a grant.
87
+ *
88
+ * Applied once, at construction, rather than checked inside each adapter — an
89
+ * authorization that every implementation has to remember to call is one that
90
+ * a future adapter will forget, and it will forget it silently. Here the only
91
+ * way to reach a mutating method is through the wrapper, and adding a backend
92
+ * later inherits the check by construction.
93
+ *
94
+ * Reads pass straight through. Discovery has always been read-only and needs
95
+ * no permission; it is writing to somebody else's tracker that requires one.
96
+ */
97
+ export declare function guarded(backend: GraphBackend, options: GuardOptions): GraphBackend;
@@ -0,0 +1,166 @@
1
+ /**
2
+ * The contract every work graph is driven through, and the guard around it.
3
+ *
4
+ * §4's interface, with one deliberate omission: `hold` is not here. A hold is
5
+ * an operational pause — "not tonight, we are waiting on a person" — and not a
6
+ * claim about how the work is structured, so it lives in the overlay where it
7
+ * costs nobody else's tracker anything. Dependency edges are the opposite, and
8
+ * that asymmetry is the whole rule:
9
+ *
10
+ * **Scheduling edges are never emulated.** A backend with no native edges is
11
+ * *ineligible for dependency scheduling*, not repaired with invisible ones. A
12
+ * private graph is shadow data: teammates and other tools read a task as ready
13
+ * while our overlay privately calls it blocked, and the divergence becomes
14
+ * migration-critical the moment anybody wants out. So `addEdge` on a backend
15
+ * whose edges are unverified refuses, and says why, rather than storing
16
+ * something only we can see.
17
+ *
18
+ * Every method answers with an outcome rather than throwing. These call other
19
+ * people's binaries over other people's networks; failure is a normal Tuesday,
20
+ * and one unreachable backend must not end a run covering four others.
21
+ */
22
+ import { BUILT_IN } from "./store.js";
23
+ import { permits } from "./grant.js";
24
+ export const ok = (value) => ({ ok: true, value });
25
+ export const no = (reason, message) => ({
26
+ ok: false,
27
+ reason,
28
+ message,
29
+ });
30
+ /**
31
+ * The refusal a backend without confirmed edges gives, spelled once so every
32
+ * adapter says the same thing and nobody is tempted to soften it.
33
+ */
34
+ export function edgesNotEmulated(name) {
35
+ return no("unsupported", `${name} dependency edges are not confirmed here, and Toolroll does not invent them — a graph only we can see would read as ready to everyone else`);
36
+ }
37
+ /** Turn a failed command into words, without pretending to know more than we do. */
38
+ export function describeFailure(result) {
39
+ if (result.notFound)
40
+ return "the command is not installed";
41
+ if (result.timedOut)
42
+ return "it timed out";
43
+ const [line = ""] = result.stderr.trim().split("\n");
44
+ return line === "" ? `exit ${result.code}` : line;
45
+ }
46
+ export function parseJson(text) {
47
+ try {
48
+ return JSON.parse(text);
49
+ }
50
+ catch {
51
+ return null;
52
+ }
53
+ }
54
+ /**
55
+ * The built-in store, behind the same contract as everyone else.
56
+ *
57
+ * Worth the wrapper even though it is ours: the scheduler should not be able
58
+ * to tell which backend it is driving, and the day this is the only one with a
59
+ * privileged shortcut is the day the interface stops being tested.
60
+ *
61
+ * It is the only backend here whose edges are both native and ours to write,
62
+ * so it is also the only one where dependency scheduling is unconditionally
63
+ * available.
64
+ */
65
+ export function builtIn(store, now = () => new Date()) {
66
+ return {
67
+ name: BUILT_IN,
68
+ deps: "native",
69
+ async listReady() {
70
+ const ready = store.listReady(now());
71
+ return ok(ready
72
+ .map(ref => store.getTask(ref.externalId))
73
+ .filter((task) => task !== null)
74
+ .map(task => ({ id: task.id, title: task.title, state: task.state })));
75
+ },
76
+ async get(id) {
77
+ const task = store.getTask(id);
78
+ return ok(task === null ? null : { id: task.id, title: task.title, state: task.state });
79
+ },
80
+ async create(spec) {
81
+ // The id is derived from the title here rather than by the caller, so
82
+ // that every backend's `create` has the same shape: hand it a spec, get
83
+ // an id back.
84
+ const id = `${slug(spec.title)}-${now().toISOString().slice(11, 19).replace(/:/g, "")}`;
85
+ if (store.getTask(id) !== null)
86
+ return no("rejected", `\`${id}\` already exists`);
87
+ store.createTask({ id, title: spec.title }, now());
88
+ return ok(id);
89
+ },
90
+ async setState(id, state) {
91
+ const moved = store.setTaskState(id, state, now());
92
+ if (moved.ok)
93
+ return ok(undefined);
94
+ return no("rejected", moved.reason === "external-closed"
95
+ ? `the tracker closed \`${id}\` — reopen it first`
96
+ : moved.reason === "reason-required" || moved.reason === "bad-reason"
97
+ ? `cancelling \`${id}\` requires a plain reason — use task state ${id} cancelled --reason <text>`
98
+ : `no task \`${id}\``);
99
+ },
100
+ async addEdge(blocked, blocker) {
101
+ const result = store.addEdge(blocked, blocker);
102
+ return result.ok ? ok(undefined) : no("rejected", result.reason);
103
+ },
104
+ };
105
+ }
106
+ function slug(title) {
107
+ const words = title
108
+ .toLowerCase()
109
+ .replace(/[^a-z0-9]+/g, "-")
110
+ .replace(/^-|-$/g, "")
111
+ .split("-")
112
+ .filter(Boolean)
113
+ .slice(0, 4)
114
+ .join("-");
115
+ return words === "" ? "task" : words;
116
+ }
117
+ /**
118
+ * Wrap a backend so nothing can write through it without a grant.
119
+ *
120
+ * Applied once, at construction, rather than checked inside each adapter — an
121
+ * authorization that every implementation has to remember to call is one that
122
+ * a future adapter will forget, and it will forget it silently. Here the only
123
+ * way to reach a mutating method is through the wrapper, and adding a backend
124
+ * later inherits the check by construction.
125
+ *
126
+ * Reads pass straight through. Discovery has always been read-only and needs
127
+ * no permission; it is writing to somebody else's tracker that requires one.
128
+ */
129
+ export function guarded(backend, options) {
130
+ const { store, repo } = options;
131
+ const allowed = (mutation, id) => {
132
+ const verdict = permits(store.grantFor(repo, backend.name), {
133
+ repo,
134
+ backend: backend.name,
135
+ mutation,
136
+ // Read from the overlay, never from the caller. A task we have merely
137
+ // seen is `theirs` until something explicitly makes it ours.
138
+ origin: id === undefined ? "ours" : store.originOf(backend.name, id),
139
+ });
140
+ return verdict.ok ? null : no("denied", verdict.message);
141
+ };
142
+ return {
143
+ name: backend.name,
144
+ deps: backend.deps,
145
+ listReady: () => backend.listReady(),
146
+ get: id => backend.get(id),
147
+ async create(spec) {
148
+ // A task we are about to create is ours by definition; there is no id to
149
+ // ask the overlay about yet, and the selector cannot be what stops it.
150
+ const denied = allowed("create");
151
+ return denied ?? backend.create(spec);
152
+ },
153
+ async setState(id, state) {
154
+ // Closing somebody's issue and moving our own task along are different
155
+ // acts to a person, however alike they look to a database, so they check
156
+ // against different mutation classes.
157
+ const terminal = state === "done" || state === "failed" || state === "cancelled";
158
+ const denied = allowed(terminal ? "close" : "transition", id);
159
+ return denied ?? backend.setState(id, state);
160
+ },
161
+ async addEdge(blocked, blocker) {
162
+ const denied = allowed("edge", blocked);
163
+ return denied ?? backend.addEdge(blocked, blocker);
164
+ },
165
+ };
166
+ }
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Settings → Backups (sprint 8): how the last backup went and one button to
3
+ * back up now, then the schedule. Past backups and how to restore sit in
4
+ * disclosures.
5
+ */
6
+ import type { BackupRun, BackupSettings } from "./store.js";
7
+ /** The schedules on offer and the most copies kept. Here rather than in backup.ts so the page never loads `node:sqlite`. */
8
+ export declare const BACKUP_EVERY_HOURS: readonly [1, 6, 12, 24];
9
+ export declare const MAX_KEEP = 100;
10
+ export declare const BACKUP_CSS: string;
11
+ export type BackupView = {
12
+ settings: BackupSettings;
13
+ folder: string;
14
+ defaultFolder: string;
15
+ runs: BackupRun[];
16
+ csrf: string;
17
+ now: Date;
18
+ };
19
+ export declare function backupHtml(view: BackupView, notice: {
20
+ said?: string | null;
21
+ problem?: string | null;
22
+ }): string;
@@ -0,0 +1,59 @@
1
+ import { bytesWords } from "./storage.js";
2
+ /** The schedules on offer and the most copies kept. Here rather than in backup.ts so the page never loads `node:sqlite`. */
3
+ export const BACKUP_EVERY_HOURS = [1, 6, 12, 24];
4
+ export const MAX_KEEP = 100;
5
+ const e = (value) => String(value ?? "").replace(/[&<>"']/g, c => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c]);
6
+ const when = (at) => `${e(at.slice(0, 16).replace("T", " "))} UTC`;
7
+ const everyWords = (hours) => hours === 1 ? "Every hour" : hours === 24 ? "Every day" : `Every ${hours} hours`;
8
+ const fileName = (path) => path.slice(path.lastIndexOf("/") + 1);
9
+ export const BACKUP_CSS = `.backups{max-width:720px;min-width:0;overflow-wrap:anywhere}.backups .backup-state{display:flex;gap:16px;align-items:flex-start;justify-content:space-between;flex-wrap:wrap}` +
10
+ `.backups .backup-state>div{flex:1 1 320px;min-width:0}.backups .backup-state h2{margin:0;font-size:1.0625rem}.backups .backup-state p{margin:4px 0 0}.backups .backup-state .problem{color:var(--danger)}` +
11
+ `.backups .backup-state form{margin:0}.backups .backup-state button{white-space:nowrap}` +
12
+ `.backups fieldset{border:0;padding:0;margin:0;min-width:0}.backups label{display:grid;gap:4px;margin:12px 0 0;font-size:.875rem}` +
13
+ `.backups input[type=text],.backups input[type=number],.backups input[type=password],.backups select{width:100%;box-sizing:border-box;max-width:100%}` +
14
+ `.backups .pair{display:grid;grid-template-columns:1fr 1fr;gap:12px}.backups button[type=submit]{margin-top:14px}` +
15
+ `.backups details{margin-top:16px}.backups summary{cursor:pointer}.backups ol{list-style:none;padding:0;margin:8px 0 0}` +
16
+ `.backups li{display:flex;gap:8px 12px;flex-wrap:wrap;padding:8px 0;border-top:1px solid var(--line, rgba(0,0,0,.08));font-size:.875rem}` +
17
+ `.backups li .failed{color:var(--danger)}.backups code{white-space:nowrap}.backups pre{overflow-x:auto;margin:8px 0}` +
18
+ `@media (max-width:900px){.backups .backup-state form,.backups .backup-state button{width:100%}.backups .pair{grid-template-columns:1fr}}`;
19
+ /** The state in one line, and the next backup (if any), for the top of the page. */
20
+ function state(view) {
21
+ const last = view.runs[0];
22
+ const good = view.runs.find(one => one.ok === true);
23
+ const next = !view.settings.enabled ? "Scheduled backups are off."
24
+ : good === undefined ? "The first scheduled backup runs within a minute or two of the console starting."
25
+ : `Next one about ${when(new Date(Date.parse(good.startedAt) + view.settings.everyHours * 3_600_000).toISOString())}.`;
26
+ if (last === undefined)
27
+ return `<h2>No backups yet</h2><p class="meta">${e(next)}</p>`;
28
+ if (last.ok === null)
29
+ return `<h2>Backing up</h2><p class="meta">Started ${when(last.startedAt)}.</p>`;
30
+ if (last.ok === false) {
31
+ return `<h2 data-backup-state="failed">Last backup failed</h2><p class="problem" role="alert">${when(last.startedAt)}: ${e(last.error ?? "no reason was recorded")}</p>` +
32
+ `<p class="meta">${good === undefined ? "No backup has succeeded yet." : `Last good backup ${when(good.startedAt)}.`} ${e(next)}</p>`;
33
+ }
34
+ return `<h2 data-backup-state="ok">Backed up ${when(last.startedAt)}</h2><p class="meta">${last.bytes === null ? "" : `${e(bytesWords(last.bytes))} · `}${e(next)}</p>`;
35
+ }
36
+ export function backupHtml(view, notice) {
37
+ const s = view.settings;
38
+ const note = notice.problem ? `<p class="problem" role="alert">${e(notice.problem)}</p>` : notice.said ? `<p role="status">${e(notice.said)}</p>` : "";
39
+ const csrf = `<input type="hidden" name="csrf" value="${e(view.csrf)}">`;
40
+ const choices = [`<option value="off"${s.enabled ? "" : " selected"}>Off</option>`,
41
+ ...BACKUP_EVERY_HOURS.map(hours => `<option value="${hours}"${s.enabled && s.everyHours === hours ? " selected" : ""}>${everyWords(hours)}</option>`)].join("");
42
+ const runs = view.runs.map(run => `<li data-backup-run="${run.id}"><span>${when(run.startedAt)}</span>` +
43
+ (run.ok === true ? `<span>Succeeded${run.bytes === null ? "" : ` · ${e(bytesWords(run.bytes))}`}</span>${run.file === null ? "" : `<span class="mono meta">${e(fileName(run.file))}</span>`}`
44
+ : run.ok === false ? `<span class="failed">Failed: ${e(run.error ?? "no reason recorded")}</span>` : `<span>Running</span>`) +
45
+ `<span class="meta">${run.trigger === "manual" ? "by hand" : "scheduled"}</span></li>`).join("");
46
+ return `<section class="backups">${note}` +
47
+ `<div class="card backup-state"><div>${state(view)}</div>` +
48
+ `<form method="post" action="/settings/backups/now">${csrf}<button type="submit">Back up now</button></form></div>` +
49
+ `<h2>Schedule</h2>` +
50
+ `<form method="post" action="/settings/backups">${csrf}<fieldset>` +
51
+ `<div class="pair"><label>Back up<select name="every">${choices}</select></label>` +
52
+ `<label>Keep the newest<input type="number" name="keep" min="1" max="${MAX_KEEP}" step="1" value="${s.keep}" required></label></div>` +
53
+ `<label>Folder<input type="text" name="folder" value="${e(s.folder ?? "")}" placeholder="${e(view.defaultFolder)}" spellcheck="false"></label>` +
54
+ `<label>Your Toolroll password<input type="password" name="password" autocomplete="current-password"></label>` +
55
+ `</fieldset><button type="submit">Save</button></form>` +
56
+ `<details><summary>Recent backups${view.runs.length === 0 ? "" : ` (${view.runs.length})`}</summary>${runs === "" ? `<p class="meta">None yet.</p>` : `<ol>${runs}</ol>`}<p class="meta">In <span class="mono">${e(view.folder)}</span>. Only the database is copied: provider keys and sign-in files stay out.</p></details>` +
57
+ `<details><summary>Restore a backup</summary><p>Stop Toolroll, then run:</p><pre><code>toolroll restore &lt;file&gt; --dry-run</code></pre>` +
58
+ `<p class="meta">The dry run checks the backup (its version and ledger chain) and changes nothing. Run it again without <code>--dry-run</code> to restore; the current database is kept as a copy first.</p></details></section>`;
59
+ }
@@ -0,0 +1,84 @@
1
+ import { BACKUP_EVERY_HOURS, MAX_KEEP } from "./backup-ui.js";
2
+ import { type BackupSettings, type Store } from "./store.js";
3
+ /** The oldest schema whose ledger has a hash chain to verify. */
4
+ export declare const OLDEST_RESTORABLE = 103;
5
+ export { BACKUP_EVERY_HOURS, MAX_KEEP };
6
+ export declare const defaultBackupFolder: (databaseFile: string) => string;
7
+ export declare const backupFolderOf: (settings: BackupSettings, databaseFile: string) => string;
8
+ /** Copy `sourceFile` into `target` with the online backup (all pages in one step: one consistent snapshot, and
9
+ * writers carry on meanwhile), then make the copy one self-contained file and check it. */
10
+ export declare function onlineCopy(sourceFile: string, target: string): Promise<{
11
+ bytes: number;
12
+ schemaVersion: number | null;
13
+ }>;
14
+ /** A folder the operator may choose: a full path, outside every project and build checkout (agents work there). */
15
+ export declare function checkBackupFolder(path: string, forbidden: readonly string[]): string | null;
16
+ /** A short tag for one database, from its full path, so databases that share a backup folder tell their backups apart. */
17
+ export declare function databaseTag(databaseFile: string): string;
18
+ /** Whose backups are whose: this database's tag, and every backup file its own history records making. */
19
+ export type BackupOwner = {
20
+ tag: string;
21
+ made: ReadonlySet<string>;
22
+ };
23
+ export declare function backupOwner(store: Store, databaseFile: string): BackupOwner;
24
+ /** This database's backups in a folder, made on a schedule or by `backup now`, newest first. A backup tagged for
25
+ * another database is never this one's. An untagged one (made before backups were tagged) is this one's only when its
26
+ * own history records making it: pruning deletes, so what can't be proved ours is left alone. */
27
+ export declare function backupFiles(folder: string, owner: BackupOwner): {
28
+ name: string;
29
+ path: string;
30
+ bytes: number;
31
+ }[];
32
+ /** Remove all but this database's newest `keep` backups. Never touches another database's, or anything else in the folder. */
33
+ export declare function pruneBackups(folder: string, keep: number, owner: BackupOwner): number;
34
+ export type BackupOutcome = {
35
+ ok: true;
36
+ id: number;
37
+ file: string;
38
+ bytes: number;
39
+ removed: number;
40
+ } | {
41
+ ok: false;
42
+ id: number;
43
+ error: string;
44
+ };
45
+ /** Back the database up now, keep the newest N, and record how it went. */
46
+ export declare function backupNow(store: Store, databaseFile: string, trigger: "scheduled" | "manual", clock?: () => Date): Promise<BackupOutcome>;
47
+ /** Whether a scheduled backup is due: the last good one is older than the schedule, and the last try over an hour ago. */
48
+ export declare function backupDue(store: Store, now: Date): boolean;
49
+ /** One pass of the loop beside the console: renew the lease (a restore sees it), and back up when due. */
50
+ export declare function backupPass(store: Store, databaseFile: string, holder: string, clock?: () => Date): Promise<BackupOutcome | null>;
51
+ /** The loop beside the console: a pass a minute. */
52
+ export declare function startBackups(store: Store, databaseFile: string, everyMs?: number): () => void;
53
+ /** What's running against the database now: the console (its backup lease), and workers (watch leases, runner heartbeats). */
54
+ export declare function runningNow(store: Store, now: Date): string[];
55
+ export type RestoreRefusal = "not-found" | "same-file" | "running" | "unreadable" | "schema" | "ledger";
56
+ export type RestoreReport = {
57
+ ok: boolean;
58
+ dryRun: boolean;
59
+ file: string;
60
+ /** Why it won't restore, each in words (every check that failed, so one attempt shows them all). */
61
+ refusals: {
62
+ reason: RestoreRefusal;
63
+ words: string;
64
+ }[];
65
+ schemaVersion: number | null;
66
+ ledger: {
67
+ entries: number;
68
+ through: number | null;
69
+ } | null;
70
+ /** Where the database as it was before the restore is kept (null on a dry run or a refusal). */
71
+ savedAs: string | null;
72
+ };
73
+ /**
74
+ * Put a backup back in place of the database. Refuses while Toolroll is running, when the backup isn't a
75
+ * Toolroll database this build can read (its schema version), or when its ledger chain doesn't verify. The
76
+ * backup is copied beside the database first and every check runs on that copy, so what was checked is what goes in.
77
+ */
78
+ export declare function restoreDatabase(options: {
79
+ databaseFile: string;
80
+ file: string;
81
+ dryRun: boolean;
82
+ now: Date;
83
+ actor?: string;
84
+ }): Promise<RestoreReport>;