toolroll 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (626) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1113 -0
  3. package/THIRD_PARTY_NOTICES.md +449 -0
  4. package/dist/accent-colors.d.ts +48 -0
  5. package/dist/accent-colors.js +122 -0
  6. package/dist/action-ledger.d.ts +26 -0
  7. package/dist/action-ledger.js +75 -0
  8. package/dist/agent-fence.d.ts +42 -0
  9. package/dist/agent-fence.js +183 -0
  10. package/dist/agentconfig.d.ts +216 -0
  11. package/dist/agentconfig.js +454 -0
  12. package/dist/api-tokens.d.ts +16 -0
  13. package/dist/api-tokens.js +27 -0
  14. package/dist/approval-policy.d.ts +69 -0
  15. package/dist/approval-policy.js +137 -0
  16. package/dist/approval-rules-ui.d.ts +25 -0
  17. package/dist/approval-rules-ui.js +39 -0
  18. package/dist/assignment-adapters.d.ts +180 -0
  19. package/dist/assignment-adapters.js +239 -0
  20. package/dist/assignment-brief.d.ts +71 -0
  21. package/dist/assignment-brief.js +129 -0
  22. package/dist/assignment-delivery.d.ts +56 -0
  23. package/dist/assignment-delivery.js +160 -0
  24. package/dist/assignment-presentation.d.ts +26 -0
  25. package/dist/assignment-presentation.js +80 -0
  26. package/dist/assignment-status.d.ts +62 -0
  27. package/dist/assignment-status.js +152 -0
  28. package/dist/assignment-ui.d.ts +71 -0
  29. package/dist/assignment-ui.js +103 -0
  30. package/dist/assignment.d.ts +222 -0
  31. package/dist/assignment.js +399 -0
  32. package/dist/attest.d.ts +56 -0
  33. package/dist/attest.js +153 -0
  34. package/dist/backend.d.ts +97 -0
  35. package/dist/backend.js +166 -0
  36. package/dist/backup-ui.d.ts +22 -0
  37. package/dist/backup-ui.js +59 -0
  38. package/dist/backup.d.ts +84 -0
  39. package/dist/backup.js +421 -0
  40. package/dist/beads.d.ts +34 -0
  41. package/dist/beads.js +135 -0
  42. package/dist/bin.d.ts +2 -0
  43. package/dist/bin.js +22 -0
  44. package/dist/board.d.ts +150 -0
  45. package/dist/board.js +210 -0
  46. package/dist/boot-identity.d.ts +63 -0
  47. package/dist/boot-identity.js +99 -0
  48. package/dist/browser/THIRD_PARTY_NOTICES.txt +2295 -0
  49. package/dist/browser/workspace.css +4 -0
  50. package/dist/browser/workspace.js +225 -0
  51. package/dist/browser-crew.d.ts +11 -0
  52. package/dist/browser-crew.js +50 -0
  53. package/dist/browser-shell.d.ts +8 -0
  54. package/dist/browser-shell.js +60 -0
  55. package/dist/browser-workspace.d.ts +780 -0
  56. package/dist/browser-workspace.js +47 -0
  57. package/dist/budget-alerts.d.ts +19 -0
  58. package/dist/budget-alerts.js +46 -0
  59. package/dist/builder.d.ts +370 -0
  60. package/dist/builder.js +3262 -0
  61. package/dist/capscan.d.ts +35 -0
  62. package/dist/capscan.js +113 -0
  63. package/dist/chat-acceptance.d.ts +71 -0
  64. package/dist/chat-acceptance.js +120 -0
  65. package/dist/chat-actions.d.ts +265 -0
  66. package/dist/chat-actions.js +1273 -0
  67. package/dist/chat-channel.d.ts +109 -0
  68. package/dist/chat-channel.js +652 -0
  69. package/dist/chat-continuity.d.ts +32 -0
  70. package/dist/chat-continuity.js +317 -0
  71. package/dist/chat-controls.d.ts +113 -0
  72. package/dist/chat-controls.js +53 -0
  73. package/dist/chat-delivery-state.d.ts +159 -0
  74. package/dist/chat-delivery-state.js +309 -0
  75. package/dist/chat-delivery.d.ts +38 -0
  76. package/dist/chat-delivery.js +693 -0
  77. package/dist/chat-display.d.ts +1 -0
  78. package/dist/chat-display.js +18 -0
  79. package/dist/chat-evidence.d.ts +123 -0
  80. package/dist/chat-evidence.js +207 -0
  81. package/dist/chat-flow.d.ts +44 -0
  82. package/dist/chat-flow.js +215 -0
  83. package/dist/chat-inbox.d.ts +57 -0
  84. package/dist/chat-inbox.js +123 -0
  85. package/dist/chat-polish.d.ts +16 -0
  86. package/dist/chat-polish.js +135 -0
  87. package/dist/chat-review.d.ts +46 -0
  88. package/dist/chat-review.js +98 -0
  89. package/dist/chat-rooms.d.ts +123 -0
  90. package/dist/chat-rooms.js +216 -0
  91. package/dist/chat-task-actions.d.ts +44 -0
  92. package/dist/chat-task-actions.js +79 -0
  93. package/dist/check-progress.d.ts +51 -0
  94. package/dist/check-progress.js +290 -0
  95. package/dist/child-database.d.ts +12 -0
  96. package/dist/child-database.js +30 -0
  97. package/dist/claim.d.ts +688 -0
  98. package/dist/claim.js +1740 -0
  99. package/dist/cli.d.ts +137 -0
  100. package/dist/cli.js +1461 -0
  101. package/dist/codex-limits.d.ts +15 -0
  102. package/dist/codex-limits.js +145 -0
  103. package/dist/coding-context.d.ts +55 -0
  104. package/dist/coding-context.js +92 -0
  105. package/dist/coding-handoff.d.ts +57 -0
  106. package/dist/coding-handoff.js +277 -0
  107. package/dist/coding-provider.d.ts +72 -0
  108. package/dist/coding-provider.js +424 -0
  109. package/dist/coding-shipping-ui.d.ts +4 -0
  110. package/dist/coding-shipping-ui.js +12 -0
  111. package/dist/coding-types.d.ts +62 -0
  112. package/dist/coding-types.js +1 -0
  113. package/dist/coding-ui.d.ts +17 -0
  114. package/dist/coding-ui.js +364 -0
  115. package/dist/coding-update.d.ts +15 -0
  116. package/dist/coding-update.js +149 -0
  117. package/dist/coding-workspace.d.ts +124 -0
  118. package/dist/coding-workspace.js +768 -0
  119. package/dist/container-state.d.ts +5 -0
  120. package/dist/container-state.js +62 -0
  121. package/dist/containment.d.ts +197 -0
  122. package/dist/containment.js +559 -0
  123. package/dist/contest.d.ts +318 -0
  124. package/dist/contest.js +753 -0
  125. package/dist/control-setup.d.ts +35 -0
  126. package/dist/control-setup.js +40 -0
  127. package/dist/control-ui.d.ts +29 -0
  128. package/dist/control-ui.js +53 -0
  129. package/dist/controller-service.d.ts +1 -0
  130. package/dist/controller-service.js +19 -0
  131. package/dist/controller-supervisor.d.ts +30 -0
  132. package/dist/controller-supervisor.js +104 -0
  133. package/dist/converse.d.ts +304 -0
  134. package/dist/converse.js +849 -0
  135. package/dist/coordinator-proposals.d.ts +29 -0
  136. package/dist/coordinator-proposals.js +137 -0
  137. package/dist/coordinator.d.ts +186 -0
  138. package/dist/coordinator.js +447 -0
  139. package/dist/credentials-ui.d.ts +25 -0
  140. package/dist/credentials-ui.js +48 -0
  141. package/dist/daemon.d.ts +209 -0
  142. package/dist/daemon.js +604 -0
  143. package/dist/decision.d.ts +120 -0
  144. package/dist/decision.js +388 -0
  145. package/dist/demo.d.ts +55 -0
  146. package/dist/demo.js +992 -0
  147. package/dist/desktop-access.d.ts +28 -0
  148. package/dist/desktop-access.js +88 -0
  149. package/dist/desktop-bundle.d.ts +16 -0
  150. package/dist/desktop-bundle.js +74 -0
  151. package/dist/desktop-host.d.ts +54 -0
  152. package/dist/desktop-host.js +508 -0
  153. package/dist/desktop-update-gate.d.ts +12 -0
  154. package/dist/desktop-update-gate.js +91 -0
  155. package/dist/desktop-update-recovery.d.ts +14 -0
  156. package/dist/desktop-update-recovery.js +243 -0
  157. package/dist/desktop-update.d.ts +110 -0
  158. package/dist/desktop-update.js +740 -0
  159. package/dist/discord-api.d.ts +20 -0
  160. package/dist/discord-api.js +138 -0
  161. package/dist/discord-chat.d.ts +16 -0
  162. package/dist/discord-chat.js +381 -0
  163. package/dist/discord-settings.d.ts +7 -0
  164. package/dist/discord-settings.js +75 -0
  165. package/dist/discord.d.ts +10 -0
  166. package/dist/discord.js +169 -0
  167. package/dist/discover.d.ts +75 -0
  168. package/dist/discover.js +150 -0
  169. package/dist/dispatch.d.ts +100 -0
  170. package/dist/dispatch.js +311 -0
  171. package/dist/dispose.d.ts +161 -0
  172. package/dist/dispose.js +803 -0
  173. package/dist/email-settings.d.ts +34 -0
  174. package/dist/email-settings.js +50 -0
  175. package/dist/envelope.d.ts +47 -0
  176. package/dist/envelope.js +105 -0
  177. package/dist/evidence-pack.d.ts +185 -0
  178. package/dist/evidence-pack.js +258 -0
  179. package/dist/evidence.d.ts +345 -0
  180. package/dist/evidence.js +782 -0
  181. package/dist/exec.d.ts +285 -0
  182. package/dist/exec.js +1841 -0
  183. package/dist/exhaustion.d.ts +85 -0
  184. package/dist/exhaustion.js +141 -0
  185. package/dist/export-ui.d.ts +4 -0
  186. package/dist/export-ui.js +17 -0
  187. package/dist/export.d.ts +48 -0
  188. package/dist/export.js +305 -0
  189. package/dist/flow-actions.d.ts +77 -0
  190. package/dist/flow-actions.js +203 -0
  191. package/dist/flow-code.d.ts +50 -0
  192. package/dist/flow-code.js +159 -0
  193. package/dist/flow-draft.d.ts +38 -0
  194. package/dist/flow-draft.js +80 -0
  195. package/dist/flow-engine.d.ts +66 -0
  196. package/dist/flow-engine.js +416 -0
  197. package/dist/flow-insights.d.ts +95 -0
  198. package/dist/flow-insights.js +149 -0
  199. package/dist/flow-live.d.ts +24 -0
  200. package/dist/flow-live.js +150 -0
  201. package/dist/flow-people.d.ts +24 -0
  202. package/dist/flow-people.js +91 -0
  203. package/dist/flow-replies.d.ts +48 -0
  204. package/dist/flow-replies.js +113 -0
  205. package/dist/flow-scripts.d.ts +38 -0
  206. package/dist/flow-scripts.js +73 -0
  207. package/dist/flow-secrets.d.ts +13 -0
  208. package/dist/flow-secrets.js +45 -0
  209. package/dist/flow-sort.d.ts +82 -0
  210. package/dist/flow-sort.js +153 -0
  211. package/dist/flow-steps.d.ts +40 -0
  212. package/dist/flow-steps.js +408 -0
  213. package/dist/flow-triggers.d.ts +244 -0
  214. package/dist/flow-triggers.js +959 -0
  215. package/dist/flows-ui.d.ts +20 -0
  216. package/dist/flows-ui.js +175 -0
  217. package/dist/flows.d.ts +229 -0
  218. package/dist/flows.js +968 -0
  219. package/dist/fonts.d.ts +19 -0
  220. package/dist/fonts.js +19 -0
  221. package/dist/gaps.d.ts +35 -0
  222. package/dist/gaps.js +101 -0
  223. package/dist/gate-failure.d.ts +40 -0
  224. package/dist/gate-failure.js +66 -0
  225. package/dist/git.d.ts +54 -0
  226. package/dist/git.js +94 -0
  227. package/dist/google-mail.d.ts +58 -0
  228. package/dist/google-mail.js +151 -0
  229. package/dist/grant.d.ts +136 -0
  230. package/dist/grant.js +238 -0
  231. package/dist/graph.d.ts +164 -0
  232. package/dist/graph.js +383 -0
  233. package/dist/guides.d.ts +22 -0
  234. package/dist/guides.js +363 -0
  235. package/dist/held.d.ts +150 -0
  236. package/dist/held.js +799 -0
  237. package/dist/invoke.d.ts +112 -0
  238. package/dist/invoke.js +780 -0
  239. package/dist/issues.d.ts +41 -0
  240. package/dist/issues.js +131 -0
  241. package/dist/job-object-helper.ps1 +252 -0
  242. package/dist/jsonl-discriminants.d.ts +11 -0
  243. package/dist/jsonl-discriminants.js +93 -0
  244. package/dist/keys.d.ts +104 -0
  245. package/dist/keys.js +229 -0
  246. package/dist/kits-ui.d.ts +17 -0
  247. package/dist/kits-ui.js +46 -0
  248. package/dist/kits.d.ts +86 -0
  249. package/dist/kits.js +215 -0
  250. package/dist/knowledge-cli.d.ts +101 -0
  251. package/dist/knowledge-cli.js +92 -0
  252. package/dist/knowledge-ui.d.ts +24 -0
  253. package/dist/knowledge-ui.js +40 -0
  254. package/dist/lead-context.d.ts +8 -0
  255. package/dist/lead-context.js +56 -0
  256. package/dist/lead-follow.d.ts +22 -0
  257. package/dist/lead-follow.js +167 -0
  258. package/dist/lead-status.d.ts +75 -0
  259. package/dist/lead-status.js +285 -0
  260. package/dist/ledger-chain.d.ts +46 -0
  261. package/dist/ledger-chain.js +187 -0
  262. package/dist/ledger-csv.d.ts +4 -0
  263. package/dist/ledger-csv.js +11 -0
  264. package/dist/ledger-view.d.ts +24 -0
  265. package/dist/ledger-view.js +58 -0
  266. package/dist/limits-ui.d.ts +26 -0
  267. package/dist/limits-ui.js +67 -0
  268. package/dist/link.d.ts +72 -0
  269. package/dist/link.js +217 -0
  270. package/dist/live.d.ts +96 -0
  271. package/dist/live.js +366 -0
  272. package/dist/liveness.d.ts +30 -0
  273. package/dist/liveness.js +42 -0
  274. package/dist/log.d.ts +7 -0
  275. package/dist/log.js +25 -0
  276. package/dist/mailbox.d.ts +57 -0
  277. package/dist/mailbox.js +150 -0
  278. package/dist/maintenance.d.ts +11 -0
  279. package/dist/maintenance.js +35 -0
  280. package/dist/mate-cli.d.ts +52 -0
  281. package/dist/mate-cli.js +345 -0
  282. package/dist/mate-contract.d.ts +10 -0
  283. package/dist/mate-contract.js +30 -0
  284. package/dist/mate-doors.d.ts +69 -0
  285. package/dist/mate-doors.js +548 -0
  286. package/dist/mate-progress.d.ts +29 -0
  287. package/dist/mate-progress.js +121 -0
  288. package/dist/mate-tools.d.ts +94 -0
  289. package/dist/mate-tools.js +1878 -0
  290. package/dist/mate.d.ts +92 -0
  291. package/dist/mate.js +435 -0
  292. package/dist/mcp-connect.d.ts +103 -0
  293. package/dist/mcp-connect.js +252 -0
  294. package/dist/mcp.d.ts +27 -0
  295. package/dist/mcp.js +651 -0
  296. package/dist/memory-cli.d.ts +466 -0
  297. package/dist/memory-cli.js +111 -0
  298. package/dist/memory-pass.d.ts +160 -0
  299. package/dist/memory-pass.js +409 -0
  300. package/dist/metrics.d.ts +3 -0
  301. package/dist/metrics.js +56 -0
  302. package/dist/mobile-viewport.d.ts +3 -0
  303. package/dist/mobile-viewport.js +37 -0
  304. package/dist/model-catalog.d.ts +118 -0
  305. package/dist/model-catalog.js +376 -0
  306. package/dist/models-cli.d.ts +102 -0
  307. package/dist/models-cli.js +66 -0
  308. package/dist/models-ui.d.ts +34 -0
  309. package/dist/models-ui.js +68 -0
  310. package/dist/modes.d.ts +80 -0
  311. package/dist/modes.js +182 -0
  312. package/dist/monitoring-settings.d.ts +44 -0
  313. package/dist/monitoring-settings.js +173 -0
  314. package/dist/monitoring-ui.d.ts +20 -0
  315. package/dist/monitoring-ui.js +51 -0
  316. package/dist/monitoring.d.ts +34 -0
  317. package/dist/monitoring.js +221 -0
  318. package/dist/names.d.ts +67 -0
  319. package/dist/names.js +102 -0
  320. package/dist/observations.d.ts +40 -0
  321. package/dist/observations.js +211 -0
  322. package/dist/oidc.d.ts +71 -0
  323. package/dist/oidc.js +182 -0
  324. package/dist/onboard.d.ts +108 -0
  325. package/dist/onboard.js +325 -0
  326. package/dist/openrouter-models.d.ts +30 -0
  327. package/dist/openrouter-models.js +120 -0
  328. package/dist/operate.d.ts +118 -0
  329. package/dist/operate.js +11321 -0
  330. package/dist/peek-cli.d.ts +97 -0
  331. package/dist/peek-cli.js +215 -0
  332. package/dist/peek.d.ts +134 -0
  333. package/dist/peek.js +578 -0
  334. package/dist/phase-routing.d.ts +307 -0
  335. package/dist/phase-routing.js +658 -0
  336. package/dist/plan-auto.d.ts +14 -0
  337. package/dist/plan-auto.js +92 -0
  338. package/dist/plan.d.ts +186 -0
  339. package/dist/plan.js +401 -0
  340. package/dist/planner-source.d.ts +251 -0
  341. package/dist/planner-source.js +460 -0
  342. package/dist/planner.d.ts +75 -0
  343. package/dist/planner.js +992 -0
  344. package/dist/policy-ui.d.ts +20 -0
  345. package/dist/policy-ui.js +41 -0
  346. package/dist/policy.d.ts +111 -0
  347. package/dist/policy.js +231 -0
  348. package/dist/prepared-evidence.d.ts +16 -0
  349. package/dist/prepared-evidence.js +96 -0
  350. package/dist/pricing.d.ts +45 -0
  351. package/dist/pricing.js +77 -0
  352. package/dist/principal.d.ts +42 -0
  353. package/dist/principal.js +82 -0
  354. package/dist/probe.d.ts +46 -0
  355. package/dist/probe.js +79 -0
  356. package/dist/process-custody.d.ts +17 -0
  357. package/dist/process-custody.js +91 -0
  358. package/dist/process-liveness.d.ts +10 -0
  359. package/dist/process-liveness.js +81 -0
  360. package/dist/process-recovery-anchor.d.ts +75 -0
  361. package/dist/process-recovery-anchor.js +188 -0
  362. package/dist/process-recovery-coalition.d.ts +25 -0
  363. package/dist/process-recovery-coalition.js +105 -0
  364. package/dist/process-recovery-eligibility.d.ts +178 -0
  365. package/dist/process-recovery-eligibility.js +170 -0
  366. package/dist/process-recovery-native.d.ts +172 -0
  367. package/dist/process-recovery-native.js +592 -0
  368. package/dist/process-recovery-provenance.d.ts +163 -0
  369. package/dist/process-recovery-provenance.js +292 -0
  370. package/dist/process-recovery-services.d.ts +56 -0
  371. package/dist/process-recovery-services.js +191 -0
  372. package/dist/process-recovery-settlement.d.ts +32 -0
  373. package/dist/process-recovery-settlement.js +132 -0
  374. package/dist/process-recovery.d.ts +41 -0
  375. package/dist/process-recovery.js +91 -0
  376. package/dist/process-tree.d.ts +41 -0
  377. package/dist/process-tree.js +264 -0
  378. package/dist/project-access.d.ts +14 -0
  379. package/dist/project-access.js +34 -0
  380. package/dist/project-cli.d.ts +18 -0
  381. package/dist/project-cli.js +104 -0
  382. package/dist/project-delete-ui.d.ts +22 -0
  383. package/dist/project-delete-ui.js +48 -0
  384. package/dist/project-delete.d.ts +55 -0
  385. package/dist/project-delete.js +413 -0
  386. package/dist/project-knowledge.d.ts +111 -0
  387. package/dist/project-knowledge.js +241 -0
  388. package/dist/project-learning.d.ts +100 -0
  389. package/dist/project-learning.js +438 -0
  390. package/dist/project-memory.d.ts +81 -0
  391. package/dist/project-memory.js +264 -0
  392. package/dist/project-skills.d.ts +152 -0
  393. package/dist/project-skills.js +660 -0
  394. package/dist/project-tools.d.ts +219 -0
  395. package/dist/project-tools.js +796 -0
  396. package/dist/project.d.ts +61 -0
  397. package/dist/project.js +125 -0
  398. package/dist/prompt.d.ts +22 -0
  399. package/dist/prompt.js +72 -0
  400. package/dist/proof.d.ts +513 -0
  401. package/dist/proof.js +1140 -0
  402. package/dist/proposal.d.ts +82 -0
  403. package/dist/proposal.js +210 -0
  404. package/dist/provider-connection.d.ts +22 -0
  405. package/dist/provider-connection.js +98 -0
  406. package/dist/provider-limits.d.ts +35 -0
  407. package/dist/provider-limits.js +95 -0
  408. package/dist/provider.d.ts +279 -0
  409. package/dist/provider.js +935 -0
  410. package/dist/publish.d.ts +107 -0
  411. package/dist/publish.js +650 -0
  412. package/dist/pulls.d.ts +118 -0
  413. package/dist/pulls.js +240 -0
  414. package/dist/push.d.ts +95 -0
  415. package/dist/push.js +353 -0
  416. package/dist/quality.d.ts +8 -0
  417. package/dist/quality.js +6 -0
  418. package/dist/recipe-ui.d.ts +18 -0
  419. package/dist/recipe-ui.js +152 -0
  420. package/dist/recipes.d.ts +81 -0
  421. package/dist/recipes.js +332 -0
  422. package/dist/remote.d.ts +67 -0
  423. package/dist/remote.js +122 -0
  424. package/dist/render.d.ts +64 -0
  425. package/dist/render.js +587 -0
  426. package/dist/report-summary.d.ts +13 -0
  427. package/dist/report-summary.js +15 -0
  428. package/dist/repos.d.ts +65 -0
  429. package/dist/repos.js +277 -0
  430. package/dist/repository-context-ui.d.ts +2 -0
  431. package/dist/repository-context-ui.js +10 -0
  432. package/dist/repository-context.d.ts +67 -0
  433. package/dist/repository-context.js +376 -0
  434. package/dist/restart-certification.d.ts +134 -0
  435. package/dist/restart-certification.js +226 -0
  436. package/dist/result-actions.d.ts +28 -0
  437. package/dist/result-actions.js +270 -0
  438. package/dist/result-completion.d.ts +18 -0
  439. package/dist/result-completion.js +66 -0
  440. package/dist/result-review.d.ts +213 -0
  441. package/dist/result-review.js +430 -0
  442. package/dist/retention-ui.d.ts +12 -0
  443. package/dist/retention-ui.js +39 -0
  444. package/dist/retention.d.ts +72 -0
  445. package/dist/retention.js +288 -0
  446. package/dist/review-context.d.ts +243 -0
  447. package/dist/review-context.js +1043 -0
  448. package/dist/review-evidence.d.ts +33 -0
  449. package/dist/review-evidence.js +56 -0
  450. package/dist/reviewer.d.ts +97 -0
  451. package/dist/reviewer.js +202 -0
  452. package/dist/routine.d.ts +228 -0
  453. package/dist/routine.js +764 -0
  454. package/dist/runner.d.ts +266 -0
  455. package/dist/runner.js +399 -0
  456. package/dist/scan.d.ts +32 -0
  457. package/dist/scan.js +92 -0
  458. package/dist/scope.d.ts +695 -0
  459. package/dist/scope.js +1176 -0
  460. package/dist/scout-report.d.ts +42 -0
  461. package/dist/scout-report.js +108 -0
  462. package/dist/scout.d.ts +69 -0
  463. package/dist/scout.js +351 -0
  464. package/dist/serve.d.ts +313 -0
  465. package/dist/serve.js +21776 -0
  466. package/dist/session-brief.d.ts +8 -0
  467. package/dist/session-brief.js +24 -0
  468. package/dist/session-cli.d.ts +13 -0
  469. package/dist/session-cli.js +284 -0
  470. package/dist/session-contract.d.ts +183 -0
  471. package/dist/session-contract.js +122 -0
  472. package/dist/session-http.d.ts +19 -0
  473. package/dist/session-http.js +154 -0
  474. package/dist/session-server.d.ts +12 -0
  475. package/dist/session-server.js +37 -0
  476. package/dist/session-service.d.ts +22 -0
  477. package/dist/session-service.js +157 -0
  478. package/dist/setup-guide.d.ts +39 -0
  479. package/dist/setup-guide.js +93 -0
  480. package/dist/sign-in-guard.d.ts +45 -0
  481. package/dist/sign-in-guard.js +74 -0
  482. package/dist/skills-ui.d.ts +11 -0
  483. package/dist/skills-ui.js +58 -0
  484. package/dist/skills.d.ts +97 -0
  485. package/dist/skills.js +276 -0
  486. package/dist/slack-api.d.ts +55 -0
  487. package/dist/slack-api.js +229 -0
  488. package/dist/slack-chat.d.ts +28 -0
  489. package/dist/slack-chat.js +413 -0
  490. package/dist/slack-settings.d.ts +7 -0
  491. package/dist/slack-settings.js +75 -0
  492. package/dist/slack-state.d.ts +13 -0
  493. package/dist/slack-state.js +9 -0
  494. package/dist/slack.d.ts +13 -0
  495. package/dist/slack.js +167 -0
  496. package/dist/spend-ui.d.ts +28 -0
  497. package/dist/spend-ui.js +95 -0
  498. package/dist/spend.d.ts +142 -0
  499. package/dist/spend.js +313 -0
  500. package/dist/sqlite-runtime.d.ts +3 -0
  501. package/dist/sqlite-runtime.js +6 -0
  502. package/dist/sso-settings.d.ts +33 -0
  503. package/dist/sso-settings.js +103 -0
  504. package/dist/sso-ui.d.ts +22 -0
  505. package/dist/sso-ui.js +39 -0
  506. package/dist/storage.d.ts +15 -0
  507. package/dist/storage.js +84 -0
  508. package/dist/store.d.ts +7754 -0
  509. package/dist/store.js +23279 -0
  510. package/dist/structured-output.d.ts +58 -0
  511. package/dist/structured-output.js +103 -0
  512. package/dist/style-asset.d.ts +7 -0
  513. package/dist/style-asset.js +41 -0
  514. package/dist/subscription-chat.d.ts +46 -0
  515. package/dist/subscription-chat.js +275 -0
  516. package/dist/summary.d.ts +33 -0
  517. package/dist/summary.js +71 -0
  518. package/dist/supervisor.mjs +297 -0
  519. package/dist/surface.d.ts +63 -0
  520. package/dist/surface.js +352 -0
  521. package/dist/sync.d.ts +94 -0
  522. package/dist/sync.js +279 -0
  523. package/dist/task-composer.d.ts +13 -0
  524. package/dist/task-composer.js +52 -0
  525. package/dist/task-control.d.ts +165 -0
  526. package/dist/task-control.js +214 -0
  527. package/dist/task-outcome-cli.d.ts +10 -0
  528. package/dist/task-outcome-cli.js +92 -0
  529. package/dist/task-text.d.ts +30 -0
  530. package/dist/task-text.js +41 -0
  531. package/dist/team-cli.d.ts +15 -0
  532. package/dist/team-cli.js +618 -0
  533. package/dist/team-contract.d.ts +92 -0
  534. package/dist/team-contract.js +1 -0
  535. package/dist/team-http.d.ts +17 -0
  536. package/dist/team-http.js +144 -0
  537. package/dist/team-leads.d.ts +81 -0
  538. package/dist/team-leads.js +565 -0
  539. package/dist/team-runtime.d.ts +27 -0
  540. package/dist/team-runtime.js +264 -0
  541. package/dist/team-ui.d.ts +3 -0
  542. package/dist/team-ui.js +9 -0
  543. package/dist/team-updates.d.ts +8 -0
  544. package/dist/team-updates.js +57 -0
  545. package/dist/teammate-admin.d.ts +53 -0
  546. package/dist/teammate-admin.js +111 -0
  547. package/dist/teammate-desk.d.ts +60 -0
  548. package/dist/teammate-desk.js +154 -0
  549. package/dist/teammate-memory.d.ts +64 -0
  550. package/dist/teammate-memory.js +196 -0
  551. package/dist/teammate-question.d.ts +59 -0
  552. package/dist/teammate-question.js +175 -0
  553. package/dist/teammate-tools.d.ts +108 -0
  554. package/dist/teammate-tools.js +271 -0
  555. package/dist/teammate-week.d.ts +68 -0
  556. package/dist/teammate-week.js +132 -0
  557. package/dist/teammate-work.d.ts +76 -0
  558. package/dist/teammate-work.js +280 -0
  559. package/dist/teammates-ui.d.ts +20 -0
  560. package/dist/teammates-ui.js +166 -0
  561. package/dist/teammates.d.ts +180 -0
  562. package/dist/teammates.js +253 -0
  563. package/dist/teams-api.d.ts +33 -0
  564. package/dist/teams-api.js +204 -0
  565. package/dist/teams-chat.d.ts +26 -0
  566. package/dist/teams-chat.js +215 -0
  567. package/dist/teams-settings.d.ts +12 -0
  568. package/dist/teams-settings.js +57 -0
  569. package/dist/teams.d.ts +21 -0
  570. package/dist/teams.js +124 -0
  571. package/dist/telegram-flow.d.ts +49 -0
  572. package/dist/telegram-flow.js +110 -0
  573. package/dist/telegram-mate.d.ts +137 -0
  574. package/dist/telegram-mate.js +707 -0
  575. package/dist/telegram-progress.d.ts +14 -0
  576. package/dist/telegram-progress.js +129 -0
  577. package/dist/telegram-settings.d.ts +9 -0
  578. package/dist/telegram-settings.js +36 -0
  579. package/dist/telegram-status.d.ts +75 -0
  580. package/dist/telegram-status.js +265 -0
  581. package/dist/telegram-team.d.ts +85 -0
  582. package/dist/telegram-team.js +359 -0
  583. package/dist/telegram.d.ts +230 -0
  584. package/dist/telegram.js +1931 -0
  585. package/dist/templates.d.ts +65 -0
  586. package/dist/templates.js +118 -0
  587. package/dist/tool-launcher.d.ts +1 -0
  588. package/dist/tool-launcher.js +101 -0
  589. package/dist/tools-ui.d.ts +30 -0
  590. package/dist/tools-ui.js +40 -0
  591. package/dist/transitions-recipes.d.ts +1 -0
  592. package/dist/transitions-recipes.js +203 -0
  593. package/dist/tree-proof.d.ts +34 -0
  594. package/dist/tree-proof.js +58 -0
  595. package/dist/verification-evidence.d.ts +44 -0
  596. package/dist/verification-evidence.js +238 -0
  597. package/dist/version.d.ts +2 -0
  598. package/dist/version.js +10 -0
  599. package/dist/webhooks.d.ts +91 -0
  600. package/dist/webhooks.js +283 -0
  601. package/dist/work-index.d.ts +68 -0
  602. package/dist/work-index.js +384 -0
  603. package/dist/work-summary.d.ts +57 -0
  604. package/dist/work-summary.js +116 -0
  605. package/dist/workspace-motion.d.ts +4 -0
  606. package/dist/workspace-motion.js +133 -0
  607. package/dist/workspace-revision.d.ts +19 -0
  608. package/dist/workspace-revision.js +92 -0
  609. package/dist/workspace-ui.d.ts +204 -0
  610. package/dist/workspace-ui.js +411 -0
  611. package/dist/worktree-notices.d.ts +13 -0
  612. package/dist/worktree-notices.js +17 -0
  613. package/dist/worktree.d.ts +249 -0
  614. package/dist/worktree.js +720 -0
  615. package/package.json +122 -0
  616. package/scripts/canary-assertions.mjs +42 -0
  617. package/scripts/crash-canary.mjs +253 -0
  618. package/scripts/fixtures/crash-process.mjs +74 -0
  619. package/scripts/fixtures/pilot-scenarios.mjs +85 -0
  620. package/scripts/fixtures/restart-service.mjs +27 -0
  621. package/scripts/launchd-certification.mjs +143 -0
  622. package/scripts/pilot.mjs +121 -0
  623. package/scripts/proof-preflight.mjs +140 -0
  624. package/scripts/provider-canary.mjs +379 -0
  625. package/scripts/recovery-canary.mjs +135 -0
  626. package/scripts/restart-certification.mjs +98 -0
@@ -0,0 +1,66 @@
1
+ /** `toolroll models …`: what each CLI can run, whether the CLIs are
2
+ * current, and the automatic check. The same saved catalog as Settings → Models. */
3
+ import { envelopeJson } from "./envelope.js";
4
+ import { checkModels, isNewModel, modelOptions, priceWords, RUNTIME_TOOLS, runtimeStates, seenModels, setWatch, updateRuntime, watchState } from "./model-catalog.js";
5
+ import { isProviderId } from "./provider.js";
6
+ const flags = [
7
+ { name: "provider", takesValue: true, meaning: "claude, codex, gemini or openrouter, for models list" },
8
+ { name: "json", takesValue: false, meaning: "versioned structured response" },
9
+ { name: "db", takesValue: true, meaning: "local Toolroll database" },
10
+ ];
11
+ export const MODELS_DESCRIPTORS = [
12
+ { action: "status", synopsis: "installed CLI versions, available updates, new models and the automatic check", mutation: "none", takesQuery: false, flags },
13
+ { action: "list", synopsis: "models a provider can run, newest first, with prices (--provider claude|codex|gemini|openrouter)", mutation: "none", takesQuery: false, flags },
14
+ { action: "check", synopsis: "fetch the public model lists and check CLI versions now", mutation: "unkeyed", takesQuery: false, flags },
15
+ { action: "update", synopsis: "update one CLI while no work is running: models update claude|codex|gemini", mutation: "unkeyed", takesQuery: true, flags },
16
+ { action: "watch", synopsis: "turn the 6-hourly check and its messages on or off: models watch on|off", mutation: "unkeyed", takesQuery: true, flags },
17
+ ];
18
+ export async function runModelsCommand(positional, options, context) {
19
+ const action = positional[0] ?? "status";
20
+ const command = `models ${action}`;
21
+ const fail = (reason, message) => { context.write(context.json ? envelopeJson({ ok: false, command, reason, message }) : message); return reason === "usage" ? 2 : 1; };
22
+ const ok = (result, lines) => { context.write(context.json ? envelopeJson({ ok: true, command, ...result }) : lines.join("\n")); return 0; };
23
+ if (!MODELS_DESCRIPTORS.some(one => one.action === action))
24
+ return fail("usage", "Use models status | list --provider <p> | check | update <claude|codex|gemini> | watch on|off.");
25
+ if (context.actor === null)
26
+ return fail("unauthenticated", "Sign in first: the remembered local login drives models commands.");
27
+ const { store, now } = context;
28
+ if (action === "status") {
29
+ const runtimes = runtimeStates(store), watch = watchState(store);
30
+ const fresh = ["claude", "codex", "gemini"].flatMap(source => seenModels(store, source)).filter(model => isNewModel(model, now));
31
+ return ok({ runtimes, watch, newModels: fresh }, [
32
+ ...(runtimes.length === 0 ? ["No CLI versions checked yet. Run: toolroll models check"] : runtimes.map(one => `${one.name} ${one.installed ?? "?"}${one.behind ? ` · ${one.latest} available${one.updateCommand === null ? "" : ` (toolroll models update ${one.tool})`}` : " · up to date"}`)),
33
+ ...fresh.map(model => `New: ${model.name} · ${priceWords(model)}`),
34
+ `Automatic checks: ${watch.enabled ? "on" : "off"} · last checked ${watch.checkedAt ?? "never"}`,
35
+ ]);
36
+ }
37
+ if (action === "list") {
38
+ const provider = options.get("provider");
39
+ if (typeof provider !== "string" || !isProviderId(provider))
40
+ return fail("usage", "Use --provider claude, codex, gemini or openrouter.");
41
+ const models = modelOptions(store, provider, now);
42
+ return ok({ provider, models }, models.length === 0 ? ["No models saved yet. Run: toolroll models check"] : models.map(one => `${one.value} ${one.label}`));
43
+ }
44
+ if (action === "check") {
45
+ const checked = await checkModels(store, now, context.seams);
46
+ const notable = checked.added.filter(one => one.source !== "openrouter");
47
+ if (!checked.ok)
48
+ return fail("refused", checked.problem ?? "The model lists could not be fetched.");
49
+ return ok({ added: notable, runtimes: checked.runtimes }, [
50
+ notable.length === 0 ? "No new models." : `New: ${notable.map(one => one.name).join(", ")}`,
51
+ ...checked.runtimes.filter(one => one.behind).map(one => `${one.name} ${one.latest} is available (you have ${one.installed}).`),
52
+ ]);
53
+ }
54
+ if (action === "update") {
55
+ const tool = positional[1] ?? "";
56
+ if (!(tool in RUNTIME_TOOLS))
57
+ return fail("usage", "Name one CLI: models update claude|codex|gemini.");
58
+ const updated = await updateRuntime(store, tool, context.actor, now, context.seams);
59
+ return updated.ok ? ok({ tool, message: updated.message }, [updated.message]) : fail("refused", updated.message);
60
+ }
61
+ const wanted = positional[1];
62
+ if (wanted !== "on" && wanted !== "off")
63
+ return fail("usage", "Use models watch on or models watch off.");
64
+ setWatch(store, wanted === "on", context.actor, now);
65
+ return ok({ enabled: wanted === "on" }, [wanted === "on" ? "Automatic checks are on: every 6 hours, with a message for each new model or CLI update." : "Automatic checks are off."]);
66
+ }
@@ -0,0 +1,34 @@
1
+ /** Settings → Models: the CLIs on this computer, the default agent for each
2
+ * role picked from live lists, and the models that just arrived. */
3
+ import type { ModelOption, RuntimeState, SeenModel, WatchState } from "./model-catalog.js";
4
+ export declare const MODELS_CSS = ".models{max-width:780px;min-width:0;overflow-wrap:anywhere}.models .card{padding:16px 20px;margin:12px 0;min-width:0}.models h2{margin:24px 0 8px}.models form{margin:0}.models label{display:grid;gap:6px}.models select,.models input[type=search]{box-sizing:border-box;width:100%;max-width:100%;min-width:0}.models button,.models summary,.models .button-link{min-height:44px}.models button{white-space:nowrap}.models summary{padding:12px 0;cursor:pointer}.models .tool{display:flex;gap:12px;align-items:center;justify-content:space-between;flex-wrap:wrap}.models .role{display:grid;grid-template-columns:minmax(0,1fr);gap:8px}.models .role-row{display:flex;gap:12px;align-items:end;flex-wrap:wrap}.models .role-row select{flex:1 1 240px;width:auto;min-width:0}.models .role-name{font-weight:600}.models .new{font-weight:600}.models ul{padding-left:20px}.models .meta{font-size:.86rem}@media(max-width:600px){.models .card{padding:14px}}";
5
+ export type RoleView = {
6
+ phase: "plan" | "build" | "review" | "repair";
7
+ label: string;
8
+ /** "provider|model", or "inherit" for a repair that follows the builder. */
9
+ current: string;
10
+ words: string;
11
+ groups: {
12
+ label: string;
13
+ provider: string;
14
+ options: ModelOption[];
15
+ }[];
16
+ /** Repair only: offer "Same as the builder". */
17
+ inherit?: boolean;
18
+ };
19
+ export type ModelsView = {
20
+ runtimes: RuntimeState[];
21
+ watch: WatchState;
22
+ roles: RoleView[];
23
+ chat: {
24
+ words: string;
25
+ } | null;
26
+ fresh: SeenModel[];
27
+ csrf: string;
28
+ canManage: boolean;
29
+ said: string | null;
30
+ problem: string | null;
31
+ };
32
+ export declare function modelsHtml(view: ModelsView): string;
33
+ /** Filters one long picker as you type; the saved choice always stays listed. */
34
+ export declare function modelsScript(): string;
@@ -0,0 +1,68 @@
1
+ import { priceWords } from "./model-catalog.js";
2
+ const e = (s) => String(s ?? "").replace(/[&<>"']/g, c => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" }[c]));
3
+ const hidden = (data) => Object.entries(data).map(([k, v]) => `<input type="hidden" name="${e(k)}" value="${e(v)}">`).join("");
4
+ const when = (iso) => iso === null ? "never" : `${iso.slice(0, 16).replace("T", " ")} UTC`;
5
+ export const MODELS_CSS = `.models{max-width:780px;min-width:0;overflow-wrap:anywhere}.models .card{padding:16px 20px;margin:12px 0;min-width:0}.models h2{margin:24px 0 8px}.models form{margin:0}.models label{display:grid;gap:6px}.models select,.models input[type=search]{box-sizing:border-box;width:100%;max-width:100%;min-width:0}.models button,.models summary,.models .button-link{min-height:44px}.models button{white-space:nowrap}.models summary{padding:12px 0;cursor:pointer}.models .tool{display:flex;gap:12px;align-items:center;justify-content:space-between;flex-wrap:wrap}.models .role{display:grid;grid-template-columns:minmax(0,1fr);gap:8px}.models .role-row{display:flex;gap:12px;align-items:end;flex-wrap:wrap}.models .role-row select{flex:1 1 240px;width:auto;min-width:0}.models .role-name{font-weight:600}.models .new{font-weight:600}.models ul{padding-left:20px}.models .meta{font-size:.86rem}@media(max-width:600px){.models .card{padding:14px}}`;
6
+ function toolRow(one, manage, csrf) {
7
+ const state = one.installed === null ? "Version unknown"
8
+ : one.behind ? `${e(one.installed)} · <strong>${e(one.latest)} available</strong>`
9
+ : `${e(one.installed)} · Up to date`;
10
+ const action = manage && one.behind && one.updateCommand !== null
11
+ ? `<form method="post" action="/settings/models/update">${hidden({ csrf, tool: one.tool })}<button type="submit">Update ${e(one.name)}</button></form>`
12
+ : one.behind ? `<span class="meta">Update it the way you installed it</span>` : "";
13
+ return `<div class="card tool"><span><strong>${e(one.name)}</strong> ${state}${one.problem === null ? "" : `<br><span class="meta">${e(one.problem)}</span>`}</span>${action}</div>`;
14
+ }
15
+ function roleForm(role, manage, csrf) {
16
+ if (!manage)
17
+ return `<div class="card role"><strong>${e(role.label)}</strong><span>${e(role.words)}</span></div>`;
18
+ const known = role.groups.some(group => group.options.some(option => `${group.provider}|${option.value}` === role.current));
19
+ const saved = !known && role.current !== "inherit" && role.current !== "" ? `<option value="${e(role.current)}" selected>${e(role.words)} · current</option>` : "";
20
+ const groups = role.groups.map(group => `<optgroup label="${e(group.label)}">${group.options.map(option => {
21
+ const value = `${group.provider}|${option.value}`;
22
+ return `<option value="${e(value)}"${value === role.current ? " selected" : ""}>${e(option.label)}</option>`;
23
+ }).join("")}</optgroup>`).join("");
24
+ const inherit = role.inherit ? `<option value="inherit"${role.current === "inherit" ? " selected" : ""}>Same as the builder</option>` : "";
25
+ const long = role.groups.reduce((sum, group) => sum + group.options.length, 0) > 40;
26
+ const count = role.groups.reduce((sum, group) => sum + group.options.length, 0);
27
+ const id = `role-${role.phase}`;
28
+ return `<form method="post" action="/settings/models/agent" class="card role">${hidden({ csrf, phase: role.phase })}` +
29
+ `<label class="role-name" for="${id}">${e(role.label)}</label>` +
30
+ (long ? `<input type="search" data-model-filter hidden aria-label="Search ${e(role.label.toLowerCase())} models" placeholder="Search ${count} models" autocomplete="off">` : "") +
31
+ `<div class="role-row"><select id="${id}" name="agent">${inherit}${saved}${groups}</select><button type="submit" class="secondary">Save</button></div></form>`;
32
+ }
33
+ export function modelsHtml(view) {
34
+ const manage = view.canManage && view.csrf !== "";
35
+ const status = view.said === null ? "" : `<p role="status">${e(view.said)}</p>`;
36
+ const problem = view.problem === null ? "" : `<p class="problem" role="alert">${e(view.problem)}</p>`;
37
+ const tools = view.runtimes.length === 0
38
+ ? `<p class="meta">No Claude, Codex or Gemini CLI found on this computer yet.</p>`
39
+ : view.runtimes.map(one => toolRow(one, manage, view.csrf)).join("");
40
+ const check = manage
41
+ ? `<form method="post" action="/settings/models/check" class="inline">${hidden({ csrf: view.csrf })}<button type="submit" class="secondary">Check now</button></form>`
42
+ : "";
43
+ const fresh = view.fresh.length === 0 ? "" :
44
+ `<h2>New models</h2><ul>${view.fresh.map(model => `<li><span class="new">${e(model.name)}</span> <span class="meta">${e(priceWords(model))}${model.releasedAt === null ? "" : ` · released ${e(model.releasedAt.slice(0, 10))}`}</span></li>`).join("")}</ul>`;
45
+ const watch = manage
46
+ ? `<details><summary>Automatic checks · ${view.watch.enabled ? "On" : "Off"}</summary><form method="post" action="/settings/models/watch">${hidden({ csrf: view.csrf, enabled: view.watch.enabled ? "0" : "1" })}` +
47
+ `<p>Check every 6 hours and send a message when a new model or CLI update appears. It uses public lists and sends nothing about you or your projects.</p>` +
48
+ `<button type="submit" class="secondary">${view.watch.enabled ? "Turn off" : "Turn on"}</button></form></details>`
49
+ : "";
50
+ return `<section class="models">${status}${problem}` +
51
+ `<h2>AI tools</h2>${tools}<p class="meta">Checked ${e(when(view.watch.checkedAt))} ${check}</p>` +
52
+ fresh +
53
+ `<h2>Default agents</h2><p class="meta">New tasks use these. Approved tasks keep the agents they were approved with.</p>` +
54
+ view.roles.map(role => roleForm(role, manage, view.csrf)).join("") +
55
+ (view.chat === null ? "" : `<h2>Chat</h2><p>${e(view.chat.words)} · <a href="/chat?settings=1#chat-settings">Change</a></p>`) +
56
+ watch + `</section>`;
57
+ }
58
+ /** Filters one long picker as you type; the saved choice always stays listed. */
59
+ export function modelsScript() {
60
+ return `(function(){document.querySelectorAll('.models form.role').forEach(function(form){
61
+ var search=form.querySelector('[data-model-filter]'),select=form.querySelector('select');
62
+ if(!search||!select)return;search.hidden=false;
63
+ var groups=Array.from(select.querySelectorAll('optgroup')).map(function(g){return{g:g,options:Array.from(g.children)}});
64
+ search.addEventListener('input',function(){var q=search.value.trim().toLowerCase(),chosen=select.value;
65
+ groups.forEach(function(entry){entry.g.replaceChildren();entry.options.forEach(function(o){if(!q||o.value===chosen||(o.textContent+' '+o.value).toLowerCase().includes(q))entry.g.appendChild(o)})});
66
+ select.value=chosen;});
67
+ })})();`;
68
+ }
@@ -0,0 +1,80 @@
1
+ /**
2
+ * Operating modes (v29, the modes chain v1–v7): a per-repository,
3
+ * password-signed, expiring envelope that pre-authorizes the SIGNER'S OWN
4
+ * future acts. The absence of a mode is 'locked' — every act keeps its
5
+ * own ceremony, today's world, the default forever.
6
+ *
7
+ * The doctrine (v4 ruling): RAISING authority is a password ceremony;
8
+ * LOWERING it is one click for any approver; on revocation or expiry
9
+ * every mode-derived flow falls back to the human ceremony at its next
10
+ * gate, and running work is never fenced.
11
+ *
12
+ * This module owns the terms shape, the digest, and the words. The store
13
+ * owns the transactions; the tick owns the rails; serve owns the
14
+ * ceremony screens.
15
+ */
16
+ export type ModeName = "standard" | "hands-off";
17
+ export type ModeTerms = {
18
+ name: ModeName;
19
+ /** The filing default per provider (C7 matrix): "safe" = auto /
20
+ * auto_edit; "escalated" = bypassPermissions / yolo. Codex-shaped
21
+ * providers have one posture and the ceremony words say escalation
22
+ * changes nothing for them. */
23
+ permissionDefault: "safe" | "escalated";
24
+ /** Auto-approve the SIGNER'S OWN credentialed filings (C1's predicate
25
+ * and road table). */
26
+ autoApproveFiling: boolean;
27
+ /** Explicit opt-in: a verified planner may approve a plan that preserves
28
+ * the signer's pre-authorized filed contract and execution terms exactly. */
29
+ planAuto: boolean;
30
+ /** Attended mint without the per-mint password — signer only (D8). */
31
+ quickMint: boolean;
32
+ /** Historical signed field; new modes leave it false and no worker consumes it. */
33
+ reviewAuto: boolean;
34
+ /** Historical signed retry term, retained for digest and audit compatibility. */
35
+ reviewRetryAuto: boolean;
36
+ /** Stamped into filings that name no budget of their own. */
37
+ perAttemptBudgetMicrousd: number | null;
38
+ /** SOFT rail: new admissions stop once the day's MEASURED spend has
39
+ * reached this; running work may finish past it (D4). */
40
+ dailyMeasuredCapMicrousd: number | null;
41
+ /** HARD rail: reservation-counted admissions per UTC day, covering
42
+ * unmeasured providers too (D4). */
43
+ dailyRunCap: number | null;
44
+ /** "notify" = merges wait for a human even under a merge grant;
45
+ * "automerge" = the mode's signature substitutes for the per-merge
46
+ * human authorization, through the grant machinery only (D1/E1). */
47
+ publication: "notify" | "automerge";
48
+ /** Whether this mode AUTHORIZES automatic PAID fallback (a
49
+ * subscription->api-key or api-key->api-key switch that spends). v30,
50
+ * fallback chains R8: legacy modes default FALSE — a paid substitution
51
+ * must be an explicit, freshly-signed grant. A subscription->subscription
52
+ * fallback is not "paid" and needs no grant. */
53
+ allowPaidFallback: boolean;
54
+ /** Whether this mode AUTHORIZES the bounded repair loop to draft AND
55
+ * auto-approve its own repair attempts (v40, evidence-review-v1) — the
56
+ * allowPaidFallback precedent, verbatim: legacy modes default FALSE, a
57
+ * new authority is never inherited, only freshly signed. Without it, a
58
+ * short/refuted run with named unresolved criteria still gets exactly
59
+ * one drafted repair — it simply waits unapproved. */
60
+ repairAuto: boolean;
61
+ /** The signed cap on repair attempts per chain (0..3), counted over the
62
+ * chain rooted at the original task. Meaningless (read as 0) unless
63
+ * `repairAuto` is also true — a mode may sign a cap without signing the
64
+ * authority, but never the reverse. */
65
+ repairMaxAttempts: number;
66
+ absoluteExpiry: string;
67
+ };
68
+ export declare const MODE_MAX_DAYS = 7;
69
+ /** The presets are STARTING POINTS the ceremony renders in full — the
70
+ * signature always covers the resolved terms, never a label. */
71
+ export declare function presetTerms(name: ModeName, absoluteExpiry: string): ModeTerms;
72
+ export declare function modeTermsJson(terms: ModeTerms): string;
73
+ /** sha256 over a domain-separated canonical encoding, 32 hex like every
74
+ * other safety digest here. */
75
+ export declare function modeDigestOf(terms: ModeTerms): string;
76
+ /** Strict rehydration — anything unexpected is null, never a guess. */
77
+ export declare function modeTermsFromJson(json: string | null): ModeTerms | null;
78
+ /** Every term in words — what the ceremony renders and the password
79
+ * signs. The reversal sentence is verbatim from the chain (C1). */
80
+ export declare function modeWords(terms: ModeTerms): string[];
package/dist/modes.js ADDED
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Operating modes (v29, the modes chain v1–v7): a per-repository,
3
+ * password-signed, expiring envelope that pre-authorizes the SIGNER'S OWN
4
+ * future acts. The absence of a mode is 'locked' — every act keeps its
5
+ * own ceremony, today's world, the default forever.
6
+ *
7
+ * The doctrine (v4 ruling): RAISING authority is a password ceremony;
8
+ * LOWERING it is one click for any approver; on revocation or expiry
9
+ * every mode-derived flow falls back to the human ceremony at its next
10
+ * gate, and running work is never fenced.
11
+ *
12
+ * This module owns the terms shape, the digest, and the words. The store
13
+ * owns the transactions; the tick owns the rails; serve owns the
14
+ * ceremony screens.
15
+ */
16
+ import { createHash } from "node:crypto";
17
+ export const MODE_MAX_DAYS = 7;
18
+ /** The presets are STARTING POINTS the ceremony renders in full — the
19
+ * signature always covers the resolved terms, never a label. */
20
+ export function presetTerms(name, absoluteExpiry) {
21
+ return name === "standard"
22
+ ? {
23
+ name,
24
+ permissionDefault: "safe",
25
+ autoApproveFiling: false,
26
+ planAuto: false,
27
+ quickMint: true,
28
+ reviewAuto: false,
29
+ reviewRetryAuto: false,
30
+ perAttemptBudgetMicrousd: null,
31
+ dailyMeasuredCapMicrousd: null,
32
+ dailyRunCap: null,
33
+ publication: "notify",
34
+ allowPaidFallback: false,
35
+ repairAuto: false,
36
+ repairMaxAttempts: 0,
37
+ absoluteExpiry,
38
+ }
39
+ : {
40
+ name,
41
+ permissionDefault: "escalated",
42
+ autoApproveFiling: true,
43
+ planAuto: false,
44
+ quickMint: true,
45
+ reviewAuto: false,
46
+ reviewRetryAuto: false,
47
+ perAttemptBudgetMicrousd: null,
48
+ dailyMeasuredCapMicrousd: null,
49
+ dailyRunCap: null,
50
+ publication: "notify",
51
+ allowPaidFallback: false,
52
+ repairAuto: false,
53
+ repairMaxAttempts: 0,
54
+ absoluteExpiry,
55
+ };
56
+ }
57
+ function canonicalJson(value) {
58
+ if (Array.isArray(value))
59
+ return `[${value.map(canonicalJson).join(",")}]`;
60
+ if (value !== null && typeof value === "object") {
61
+ const entries = Object.entries(value)
62
+ .filter(([, v]) => v !== undefined)
63
+ .sort(([a], [b]) => (a < b ? -1 : a > b ? 1 : 0))
64
+ .map(([k, v]) => `${JSON.stringify(k)}:${canonicalJson(v)}`);
65
+ return `{${entries.join(",")}}`;
66
+ }
67
+ return JSON.stringify(value);
68
+ }
69
+ export function modeTermsJson(terms) {
70
+ return canonicalJson(terms);
71
+ }
72
+ /** sha256 over a domain-separated canonical encoding, 32 hex like every
73
+ * other safety digest here. */
74
+ export function modeDigestOf(terms) {
75
+ return createHash("sha256")
76
+ .update(`standing-orders:mode:${modeTermsJson(terms)}`, "utf8")
77
+ .digest("hex")
78
+ .slice(0, 32);
79
+ }
80
+ /** Strict rehydration — anything unexpected is null, never a guess. */
81
+ export function modeTermsFromJson(json) {
82
+ if (json === null)
83
+ return null;
84
+ let parsed;
85
+ try {
86
+ parsed = JSON.parse(json);
87
+ }
88
+ catch {
89
+ return null;
90
+ }
91
+ if (parsed === null || typeof parsed !== "object")
92
+ return null;
93
+ const t = parsed;
94
+ const optMoney = (v) => v === null ? null : typeof v === "number" && Number.isInteger(v) && v > 0 ? v : undefined;
95
+ const budget = optMoney(t["perAttemptBudgetMicrousd"]);
96
+ const measured = optMoney(t["dailyMeasuredCapMicrousd"]);
97
+ const runs = optMoney(t["dailyRunCap"]);
98
+ if ((t["name"] === "standard" || t["name"] === "hands-off") &&
99
+ (t["permissionDefault"] === "safe" || t["permissionDefault"] === "escalated") &&
100
+ typeof t["autoApproveFiling"] === "boolean" &&
101
+ (t["planAuto"] === undefined || typeof t["planAuto"] === "boolean") &&
102
+ typeof t["quickMint"] === "boolean" &&
103
+ typeof t["reviewAuto"] === "boolean" &&
104
+ (t["reviewRetryAuto"] === undefined || typeof t["reviewRetryAuto"] === "boolean") &&
105
+ budget !== undefined &&
106
+ measured !== undefined &&
107
+ runs !== undefined &&
108
+ (t["publication"] === "notify" || t["publication"] === "automerge") &&
109
+ // allowPaidFallback: a legacy mode has NO such field — that MUST read
110
+ // as false (R8: a paid substitution is only ever an explicit,
111
+ // freshly-signed grant). A present value must be a strict boolean;
112
+ // anything else is a bad envelope, null.
113
+ (t["allowPaidFallback"] === undefined || typeof t["allowPaidFallback"] === "boolean") &&
114
+ // repairAuto/repairMaxAttempts: the SAME precedent, verbatim (v40). A
115
+ // legacy mode has NO such fields — that MUST read as false/0, never
116
+ // inherited. A present repairAuto must be a strict boolean; a present
117
+ // repairMaxAttempts must be an integer 0..3. Anything else is a bad
118
+ // envelope, null.
119
+ (t["repairAuto"] === undefined || typeof t["repairAuto"] === "boolean") &&
120
+ (t["repairMaxAttempts"] === undefined ||
121
+ (typeof t["repairMaxAttempts"] === "number" && Number.isInteger(t["repairMaxAttempts"]) && t["repairMaxAttempts"] >= 0 && t["repairMaxAttempts"] <= 3)) &&
122
+ typeof t["absoluteExpiry"] === "string" &&
123
+ !Number.isNaN(Date.parse(t["absoluteExpiry"]))) {
124
+ return {
125
+ name: t["name"],
126
+ permissionDefault: t["permissionDefault"],
127
+ autoApproveFiling: t["autoApproveFiling"],
128
+ planAuto: t["planAuto"] === true,
129
+ quickMint: t["quickMint"],
130
+ reviewAuto: t["reviewAuto"],
131
+ reviewRetryAuto: t["reviewRetryAuto"] === true,
132
+ perAttemptBudgetMicrousd: budget,
133
+ dailyMeasuredCapMicrousd: measured,
134
+ dailyRunCap: runs,
135
+ publication: t["publication"],
136
+ allowPaidFallback: t["allowPaidFallback"] === true,
137
+ repairAuto: t["repairAuto"] === true,
138
+ repairMaxAttempts: typeof t["repairMaxAttempts"] === "number" ? t["repairMaxAttempts"] : 0,
139
+ absoluteExpiry: t["absoluteExpiry"],
140
+ };
141
+ }
142
+ return null;
143
+ }
144
+ /** Every term in words — what the ceremony renders and the password
145
+ * signs. The reversal sentence is verbatim from the chain (C1). */
146
+ export function modeWords(terms) {
147
+ return [
148
+ terms.permissionDefault === "escalated"
149
+ ? "new filings default to FULL permissions: claude runs with --dangerously-skip-permissions, gemini with --approval-mode yolo (codex-shaped lanes have one posture; this changes nothing for them)"
150
+ : "new filings use safe unattended permissions: routine project commands and edits proceed; risky acts stop for approval",
151
+ terms.autoApproveFiling
152
+ ? "every scope YOU file — signed-in console or credentialed CLI — is approved the moment you file it; while this mode is active, your signed-in browser session becomes a spend credential for this repository"
153
+ : "filings still wait for their own approval ceremony",
154
+ terms.quickMint
155
+ ? "you start watched sessions without re-typing your password — the confirm screen still shows every term"
156
+ : "watched sessions keep the per-session password",
157
+ terms.planAuto
158
+ ? "plans for your pre-authorized filings auto-approve only when the goal, exclusions, paths, acceptance criteria, risk, budget, and agent route remain exactly unchanged; provide a goal, paths and acceptance criteria upfront; amendments and unresolved questions still wait for you"
159
+ : "planner-generated plans wait for your approval",
160
+ "finished work and saved checks go to the lead or user; no separate model review runs",
161
+ ...(terms.reviewAuto || terms.reviewRetryAuto
162
+ ? ["historical review grants are retained on record but no longer schedule work"] : []),
163
+ terms.perAttemptBudgetMicrousd === null
164
+ ? "filings carry no default dollar cap"
165
+ : `filings that name no budget get a $${(terms.perAttemptBudgetMicrousd / 1_000_000).toFixed(2)} per-attempt cap`,
166
+ terms.dailyMeasuredCapMicrousd === null
167
+ ? "no daily dollar rail"
168
+ : `new admissions stop once the day's MEASURED spend reaches $${(terms.dailyMeasuredCapMicrousd / 1_000_000).toFixed(2)} — running work may finish past it, and unmeasured providers ride outside this number`,
169
+ terms.dailyRunCap === null
170
+ ? "no daily run rail"
171
+ : `at most ${terms.dailyRunCap} agent starts per UTC day, every provider counted, reserved at admission`,
172
+ terms.publication === "automerge"
173
+ ? "pull requests merge THEMSELVES when CI is seen green on the exact commit — you are told afterwards (requires a merge-capable publication grant)"
174
+ : "merges wait for you — even where a grant could merge on its own, while this mode is active",
175
+ terms.allowPaidFallback
176
+ ? "when a subscription is exhausted mid-build, an approved fallback that spends (an API key) may run automatically — spend moves to that account"
177
+ : "automatic fallback never switches to a paid API key on its own; a subscription that runs out stops and waits for you",
178
+ ...(terms.repairAuto
179
+ ? ["historical automatic repair grants are retained on record but no longer schedule work"] : []),
180
+ `everything above ends at ${terms.absoluteExpiry.slice(0, 16).replace("T", " ")} — revoking it earlier is one click, and every act it covered falls back to its own ceremony`,
181
+ ];
182
+ }
@@ -0,0 +1,44 @@
1
+ /** Where an address points, without its path or query (a webhook may carry a key in either). */
2
+ export declare const origin: (address: string) => string;
3
+ export type MonitoringSettings = {
4
+ webhook: {
5
+ url: string;
6
+ secret: string;
7
+ } | null;
8
+ folder: {
9
+ path: string;
10
+ } | null;
11
+ traces: {
12
+ endpoint: string;
13
+ header: {
14
+ name: string;
15
+ value: string;
16
+ } | null;
17
+ } | null;
18
+ };
19
+ export declare const NO_MONITORING: MonitoringSettings;
20
+ /** An address Toolroll may send to: https anywhere, http only to this machine (a collector beside it). */
21
+ export declare function sendableAddress(value: string): string | null;
22
+ export declare function readMonitoring(dir: string | null | undefined): MonitoringSettings;
23
+ /** A fresh signing secret for the webhook (shown once; the receiver keeps it to check each request). */
24
+ export declare function newSigningSecret(): string;
25
+ export type MonitoringForm = {
26
+ webhook: string;
27
+ folder: string;
28
+ tracesEndpoint: string;
29
+ headerName: string;
30
+ headerValue: string;
31
+ rotate: boolean;
32
+ };
33
+ export declare function saveMonitoring(dir: string, form: MonitoringForm, previous: MonitoringSettings, forbidden?: readonly string[]): {
34
+ ok: true;
35
+ settings: MonitoringSettings;
36
+ secret: string | null;
37
+ } | {
38
+ ok: false;
39
+ said: string;
40
+ };
41
+ /** The change in words for the ledger: where things go and header names, never a secret or a full address. */
42
+ export declare function monitoringWords(settings: MonitoringSettings): string;
43
+ /** A change for the ledger: before → after, and what changed that the words alone don't show (never the values). */
44
+ export declare function monitoringChange(before: MonitoringSettings, after: MonitoringSettings, newSecret: boolean): string | null;