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,120 @@
1
+ /**
2
+ * The decision payload, validated (§7).
3
+ *
4
+ * The convention agents drift from in prose is a schema here, and the schema
5
+ * is fail-closed: a payload missing anything a person would need on a phone
6
+ * screen at 7am is not a decision, it is a malformed one — and the caller's
7
+ * next move is bounded repair, not a guess at what the agent meant.
8
+ *
9
+ * Everything in the payload is written by an agent, which means everything in
10
+ * it is untrusted twice over: it will be rendered into a web page, printed
11
+ * into terminals, and — after the operator answers — quoted back into another
12
+ * agent's brief. The caps and the control-character rejection here are the
13
+ * first line of that defence; the escaping at each sink is the second. The
14
+ * caps also keep one screen one screen: an option list that needs scrolling
15
+ * has already failed the milestone sentence.
16
+ */
17
+ export type ParsedOption = {
18
+ id: string;
19
+ label: string;
20
+ consequence: string;
21
+ reversible: boolean;
22
+ };
23
+ export type ParsedDecision = {
24
+ urgency: "blocking";
25
+ recap: string;
26
+ question: string;
27
+ options: ParsedOption[];
28
+ recommendation: string;
29
+ assignee: string | null;
30
+ /** Normalized to toISOString(), like every timestamp in the store. */
31
+ deadline: string | null;
32
+ };
33
+ export type Problem = {
34
+ reason: string;
35
+ message: string;
36
+ };
37
+ export type ParseResult = {
38
+ ok: true;
39
+ decision: ParsedDecision;
40
+ } | {
41
+ ok: false;
42
+ problems: Problem[];
43
+ };
44
+ /** One screen's worth, enforced rather than hoped for. */
45
+ export declare const LIMITS: {
46
+ /** Bytes, before parsing. Applied by the reader too; this is the backstop. */
47
+ readonly payload: number;
48
+ readonly recap: 2000;
49
+ readonly question: 2000;
50
+ readonly consequence: 500;
51
+ readonly label: 120;
52
+ readonly optionId: 40;
53
+ readonly assignee: 120;
54
+ readonly options: 6;
55
+ /** UTF-16 code units; the byte backstop lives in validateNote. */
56
+ readonly note: 500;
57
+ };
58
+ /** Bytes an operator's note may occupy — the UTF-8 backstop under LIMITS.note. */
59
+ export declare const NOTE_BYTE_CAP = 2000;
60
+ /**
61
+ * The one validator every note passes — before a draft persists AND inside
62
+ * the answer CAS, which stays the final gate. Trims, then refuses empty,
63
+ * oversized (units or bytes), control-carrying, or invisibly-reordering
64
+ * text. Ordinary Unicode with internal newlines and tabs passes untouched.
65
+ */
66
+ export declare function validateNote(raw: string): {
67
+ ok: true;
68
+ note: string;
69
+ } | {
70
+ ok: false;
71
+ problem: string;
72
+ };
73
+ /** Whether text carries controls that could become escapes at a sink. Newlines and tabs pass. */
74
+ export declare function hasForbiddenControls(text: string): boolean;
75
+ /**
76
+ * Controls OR direction-override invisibles — the full disguise kit. For
77
+ * text that becomes standing authority or a task identity (setup commands,
78
+ * imported issue titles): a title reading "fix docs" while spelled
79
+ * backwards is not a title, it is a costume.
80
+ */
81
+ export declare function hasDisguisedText(text: string): boolean;
82
+ export declare function parseDecision(raw: string): ParseResult;
83
+ /**
84
+ * The terminal handoff: how every non-parking attempt says how it ended.
85
+ *
86
+ * gnhf's lesson, typed: "the agent seemed to finish" is not an outcome. A
87
+ * clean tree is a success only when the agent SAID no-change; changes are
88
+ * committed only when it said completed; and a missing, malformed, or
89
+ * contradictory handoff is a protocol failure that earns a strike rather
90
+ * than a guess that earns a commit.
91
+ */
92
+ export type ParsedHandoff = {
93
+ status: "completed" | "no-change" | "failed";
94
+ conclusion: string;
95
+ /** Compact, structured operator output. Version-1 handoffs rehydrate with
96
+ * empty lists; version 2 agents fill these directly. */
97
+ changes: string[];
98
+ verification: string[];
99
+ followUps: string[];
100
+ };
101
+ export declare const HANDOFF_VERSION = 2;
102
+ export declare const HANDOFF_CONCLUSION_CAP = 600;
103
+ /** The handoff's whole-file and list caps, exported so the brief states
104
+ * exactly what the parser holds it to (raw authority repair). */
105
+ export declare const HANDOFF_PAYLOAD_CAP: number;
106
+ export declare const HANDOFF_LIST_CAP = 8;
107
+ export declare const HANDOFF_ITEM_CAP = 240;
108
+ export declare function parseHandoff(raw: string): {
109
+ ok: true;
110
+ handoff: ParsedHandoff;
111
+ } | {
112
+ ok: false;
113
+ problems: Problem[];
114
+ };
115
+ /**
116
+ * The compact error a repair turn is resumed with: every problem by name,
117
+ * then the one instruction. Written for an agent that already holds the
118
+ * context — it needs the list of what failed, not the theory of why.
119
+ */
120
+ export declare function repairPrompt(problems: readonly Problem[], mailbox: string): string;
@@ -0,0 +1,388 @@
1
+ /**
2
+ * The decision payload, validated (§7).
3
+ *
4
+ * The convention agents drift from in prose is a schema here, and the schema
5
+ * is fail-closed: a payload missing anything a person would need on a phone
6
+ * screen at 7am is not a decision, it is a malformed one — and the caller's
7
+ * next move is bounded repair, not a guess at what the agent meant.
8
+ *
9
+ * Everything in the payload is written by an agent, which means everything in
10
+ * it is untrusted twice over: it will be rendered into a web page, printed
11
+ * into terminals, and — after the operator answers — quoted back into another
12
+ * agent's brief. The caps and the control-character rejection here are the
13
+ * first line of that defence; the escaping at each sink is the second. The
14
+ * caps also keep one screen one screen: an option list that needs scrolling
15
+ * has already failed the milestone sentence.
16
+ */
17
+ /** One screen's worth, enforced rather than hoped for. */
18
+ export const LIMITS = {
19
+ /** Bytes, before parsing. Applied by the reader too; this is the backstop. */
20
+ payload: 64 * 1024,
21
+ recap: 2_000,
22
+ question: 2_000,
23
+ consequence: 500,
24
+ label: 120,
25
+ optionId: 40,
26
+ assignee: 120,
27
+ options: 6,
28
+ /** UTF-16 code units; the byte backstop lives in validateNote. */
29
+ note: 500,
30
+ };
31
+ /** Bytes an operator's note may occupy — the UTF-8 backstop under LIMITS.note. */
32
+ export const NOTE_BYTE_CAP = 2_000;
33
+ /**
34
+ * Unicode that reorders or breaks lines invisibly: bidi controls and the
35
+ * line/paragraph separators. A note carrying these can spoof what a
36
+ * reviewer SEES agreeing to — rejected outright, never stripped
37
+ * (Codex free-text review, prescribed caps).
38
+ */
39
+ const FORBIDDEN_INVISIBLES = /[\u2028\u2029\u061C\u200E\u200F\u202A-\u202E\u2066-\u2069]/;
40
+ /**
41
+ * The one validator every note passes — before a draft persists AND inside
42
+ * the answer CAS, which stays the final gate. Trims, then refuses empty,
43
+ * oversized (units or bytes), control-carrying, or invisibly-reordering
44
+ * text. Ordinary Unicode with internal newlines and tabs passes untouched.
45
+ */
46
+ export function validateNote(raw) {
47
+ const note = raw.trim();
48
+ if (note === "")
49
+ return { ok: false, problem: "an empty note says nothing" };
50
+ if (note.length > LIMITS.note)
51
+ return { ok: false, problem: `a note is at most ${LIMITS.note} characters` };
52
+ if (Buffer.byteLength(note, "utf8") > NOTE_BYTE_CAP) {
53
+ return { ok: false, problem: `a note is at most ${NOTE_BYTE_CAP} bytes` };
54
+ }
55
+ if (hasForbiddenControls(note) || FORBIDDEN_INVISIBLES.test(note)) {
56
+ return { ok: false, problem: "control and direction-override characters do not travel" };
57
+ }
58
+ return { ok: true, note };
59
+ }
60
+ /** Option ids travel in URLs, CLI arguments, and CAS updates — they are identifiers, not prose. */
61
+ const OPTION_ID = /^[A-Za-z0-9][A-Za-z0-9_-]*$/;
62
+ /**
63
+ * Multi-line prose may contain newlines and tabs; nothing anywhere in a
64
+ * decision may contain the rest of C0/C1 — those are how text stops being
65
+ * text and starts being terminal escape sequences.
66
+ */
67
+ // eslint-disable-next-line no-control-regex
68
+ const FORBIDDEN_MULTILINE = /[\u0000-\u0008\u000B-\u001F\u007F-\u009F]/;
69
+ // eslint-disable-next-line no-control-regex
70
+ const FORBIDDEN_SINGLE_LINE = /[\u0000-\u001F\u007F-\u009F]/;
71
+ /** Whether text carries controls that could become escapes at a sink. Newlines and tabs pass. */
72
+ export function hasForbiddenControls(text) {
73
+ return FORBIDDEN_MULTILINE.test(text);
74
+ }
75
+ /**
76
+ * Controls OR direction-override invisibles — the full disguise kit. For
77
+ * text that becomes standing authority or a task identity (setup commands,
78
+ * imported issue titles): a title reading "fix docs" while spelled
79
+ * backwards is not a title, it is a costume.
80
+ */
81
+ export function hasDisguisedText(text) {
82
+ return FORBIDDEN_MULTILINE.test(text) || FORBIDDEN_INVISIBLES.test(text);
83
+ }
84
+ export function parseDecision(raw) {
85
+ if (Buffer.byteLength(raw, "utf8") > LIMITS.payload) {
86
+ return refuse("too-large", `the payload is over ${LIMITS.payload} bytes — one screen does not need that`);
87
+ }
88
+ let parsed;
89
+ try {
90
+ parsed = JSON.parse(raw);
91
+ }
92
+ catch (error) {
93
+ return refuse("not-json", `the payload is not JSON: ${error instanceof Error ? error.message : String(error)}`);
94
+ }
95
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
96
+ return refuse("not-an-object", "the payload must be one JSON object");
97
+ }
98
+ const body = parsed;
99
+ const problems = [];
100
+ // Urgency is required rather than defaulted: an agent that did not say
101
+ // whether the loop can continue has not composed a decision. Only
102
+ // 'blocking' exists in M3 — advisory needs a commit-and-complete lifecycle
103
+ // this park-before-commit path does not have.
104
+ if (body["urgency"] !== "blocking") {
105
+ problems.push({
106
+ reason: "bad-urgency",
107
+ message: `urgency must be the string "blocking" (got ${describe(body["urgency"])})`,
108
+ });
109
+ }
110
+ const recap = prose(body["recap"], "recap", LIMITS.recap, problems);
111
+ const question = prose(body["question"], "question", LIMITS.question, problems);
112
+ const options = parseOptions(body["options"], problems);
113
+ let recommendation = null;
114
+ if (typeof body["recommendation"] !== "string" || body["recommendation"] === "") {
115
+ problems.push({
116
+ reason: "missing-recommendation",
117
+ message: "recommendation is required and must be an option id — a decision without one is a shrug",
118
+ });
119
+ }
120
+ else if (options !== null && !options.some(option => option.id === body["recommendation"])) {
121
+ problems.push({
122
+ reason: "bad-recommendation",
123
+ message: `recommendation "${truncate(String(body["recommendation"]), 60)}" does not match any option id`,
124
+ });
125
+ }
126
+ else {
127
+ recommendation = body["recommendation"];
128
+ }
129
+ let assignee = null;
130
+ if (body["assignee"] !== undefined && body["assignee"] !== null) {
131
+ const line = singleLine(body["assignee"], "assignee", LIMITS.assignee, problems);
132
+ if (line !== null)
133
+ assignee = line;
134
+ }
135
+ let deadline = null;
136
+ if (body["deadline"] !== undefined && body["deadline"] !== null) {
137
+ const stamp = typeof body["deadline"] === "string" ? Date.parse(body["deadline"]) : NaN;
138
+ if (Number.isNaN(stamp)) {
139
+ problems.push({
140
+ reason: "bad-deadline",
141
+ message: `deadline must be an ISO 8601 timestamp (got ${describe(body["deadline"])})`,
142
+ });
143
+ }
144
+ else {
145
+ // Normalized so the store's lexicographic-comparison invariant holds.
146
+ deadline = new Date(stamp).toISOString();
147
+ }
148
+ }
149
+ if (problems.length > 0)
150
+ return { ok: false, problems };
151
+ return {
152
+ ok: true,
153
+ decision: {
154
+ urgency: "blocking",
155
+ recap: recap,
156
+ question: question,
157
+ options: options,
158
+ recommendation: recommendation,
159
+ assignee,
160
+ deadline,
161
+ },
162
+ };
163
+ }
164
+ function parseOptions(value, problems) {
165
+ if (!Array.isArray(value)) {
166
+ problems.push({ reason: "no-options", message: "options must be an array" });
167
+ return null;
168
+ }
169
+ if (value.length < 2) {
170
+ // One option is not a decision, it is a notification wearing one's
171
+ // clothes — and the operator's real alternative ("do neither") deserves
172
+ // to be an option with a stated consequence, not an implied one.
173
+ problems.push({ reason: "too-few-options", message: "a decision needs at least 2 options" });
174
+ return null;
175
+ }
176
+ if (value.length > LIMITS.options) {
177
+ problems.push({
178
+ reason: "too-many-options",
179
+ message: `at most ${LIMITS.options} options fit on one screen (got ${value.length})`,
180
+ });
181
+ return null;
182
+ }
183
+ const options = [];
184
+ const seen = new Set();
185
+ let sound = true;
186
+ value.forEach((entry, index) => {
187
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry)) {
188
+ problems.push({ reason: "bad-option", message: `option ${index} must be an object` });
189
+ sound = false;
190
+ return;
191
+ }
192
+ const option = entry;
193
+ const id = option["id"];
194
+ if (typeof id !== "string" || !OPTION_ID.test(id) || id.length > LIMITS.optionId) {
195
+ problems.push({
196
+ reason: "bad-option-id",
197
+ message: `option ${index} needs an id of 1-${LIMITS.optionId} letters, digits, - or _ (got ${describe(id)})`,
198
+ });
199
+ sound = false;
200
+ }
201
+ else if (seen.has(id)) {
202
+ problems.push({ reason: "duplicate-option-id", message: `option id "${id}" appears twice` });
203
+ sound = false;
204
+ }
205
+ else {
206
+ seen.add(id);
207
+ }
208
+ const label = singleLine(option["label"], `option ${index} label`, LIMITS.label, problems);
209
+ const consequence = prose(option["consequence"], `option ${index} consequence`, LIMITS.consequence, problems);
210
+ // Absent is invalid, never defaulted: a defaulted reversibility is a
211
+ // guess wearing a schema, and reversible=false is the field the
212
+ // scheduler's refusal to auto-apply rests on.
213
+ if (typeof option["reversible"] !== "boolean") {
214
+ problems.push({
215
+ reason: "missing-reversible",
216
+ message: `option ${index} must say reversible: true or false — unstated is not reversible, it is unstated`,
217
+ });
218
+ sound = false;
219
+ }
220
+ if (label === null || consequence === null) {
221
+ sound = false;
222
+ return;
223
+ }
224
+ if (sound) {
225
+ options.push({
226
+ id: id,
227
+ label,
228
+ consequence,
229
+ reversible: option["reversible"],
230
+ });
231
+ }
232
+ });
233
+ return sound && options.length === value.length ? options : null;
234
+ }
235
+ function prose(value, field, cap, problems) {
236
+ if (typeof value !== "string" || value.trim() === "") {
237
+ problems.push({ reason: `missing-${slug(field)}`, message: `${field} is required` });
238
+ return null;
239
+ }
240
+ if (value.length > cap) {
241
+ problems.push({ reason: `${slug(field)}-too-long`, message: `${field} is over ${cap} characters` });
242
+ return null;
243
+ }
244
+ if (FORBIDDEN_MULTILINE.test(value)) {
245
+ problems.push({
246
+ reason: `${slug(field)}-control-characters`,
247
+ message: `${field} contains control characters — text only`,
248
+ });
249
+ return null;
250
+ }
251
+ return value.trim();
252
+ }
253
+ function singleLine(value, field, cap, problems) {
254
+ if (typeof value !== "string" || value.trim() === "") {
255
+ problems.push({ reason: `missing-${slug(field)}`, message: `${field} is required` });
256
+ return null;
257
+ }
258
+ if (value.length > cap) {
259
+ problems.push({ reason: `${slug(field)}-too-long`, message: `${field} is over ${cap} characters` });
260
+ return null;
261
+ }
262
+ if (FORBIDDEN_SINGLE_LINE.test(value)) {
263
+ problems.push({
264
+ reason: `${slug(field)}-control-characters`,
265
+ message: `${field} must be one line with no control characters`,
266
+ });
267
+ return null;
268
+ }
269
+ return value.trim();
270
+ }
271
+ function refuse(reason, message) {
272
+ return { ok: false, problems: [{ reason, message }] };
273
+ }
274
+ function slug(field) {
275
+ return field.replace(/[^a-z0-9]+/gi, "-").toLowerCase();
276
+ }
277
+ function describe(value) {
278
+ if (value === undefined)
279
+ return "nothing";
280
+ if (typeof value === "string")
281
+ return `"${truncate(value, 40)}"`;
282
+ return typeof value;
283
+ }
284
+ function truncate(text, at) {
285
+ return text.length <= at ? text : `${text.slice(0, at)}…`;
286
+ }
287
+ export const HANDOFF_VERSION = 2;
288
+ export const HANDOFF_CONCLUSION_CAP = 600;
289
+ /** The handoff's whole-file and list caps, exported so the brief states
290
+ * exactly what the parser holds it to (raw authority repair). */
291
+ export const HANDOFF_PAYLOAD_CAP = 16 * 1024;
292
+ export const HANDOFF_LIST_CAP = 8;
293
+ export const HANDOFF_ITEM_CAP = 240;
294
+ /** Agent prose is display material, not authority. Once the structural
295
+ * outcome is valid, excess verbosity is compacted deterministically rather
296
+ * than throwing away completed code and paying for a whole new attempt. */
297
+ function compactHandoffText(value, cap) {
298
+ const clean = value.replace(/\s+/g, " ").trim();
299
+ if (clean.length <= cap)
300
+ return clean;
301
+ const room = Math.max(1, cap - 1);
302
+ const candidate = clean.slice(0, room);
303
+ const sentence = Math.max(candidate.lastIndexOf(". "), candidate.lastIndexOf("! "), candidate.lastIndexOf("? "));
304
+ const word = candidate.lastIndexOf(" ");
305
+ const cut = sentence >= Math.floor(room * 0.55) ? sentence + 1 : word >= Math.floor(room * 0.55) ? word : room;
306
+ return `${candidate.slice(0, cut).trimEnd()}…`;
307
+ }
308
+ function handoffList(value) {
309
+ if (!Array.isArray(value))
310
+ return [];
311
+ return value
312
+ .filter((one) => typeof one === "string" && one.trim() !== "" && !FORBIDDEN_MULTILINE.test(one))
313
+ .slice(0, HANDOFF_LIST_CAP)
314
+ .map(one => compactHandoffText(one, HANDOFF_ITEM_CAP));
315
+ }
316
+ export function parseHandoff(raw) {
317
+ if (Buffer.byteLength(raw, "utf8") > HANDOFF_PAYLOAD_CAP) {
318
+ return { ok: false, problems: [{ reason: "too-large", message: `the handoff is over ${HANDOFF_PAYLOAD_CAP} bytes` }] };
319
+ }
320
+ let parsed;
321
+ try {
322
+ parsed = JSON.parse(raw);
323
+ }
324
+ catch (error) {
325
+ return {
326
+ ok: false,
327
+ problems: [{ reason: "not-json", message: `the handoff is not JSON: ${error instanceof Error ? error.message : String(error)}` }],
328
+ };
329
+ }
330
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) {
331
+ return { ok: false, problems: [{ reason: "not-an-object", message: "the handoff must be one JSON object" }] };
332
+ }
333
+ const body = parsed;
334
+ const problems = [];
335
+ if (body["version"] !== 1 && body["version"] !== HANDOFF_VERSION) {
336
+ problems.push({
337
+ reason: "bad-version",
338
+ message: `version must be 1 or ${HANDOFF_VERSION} (got ${describe(body["version"])})`,
339
+ });
340
+ }
341
+ const status = body["status"];
342
+ if (status !== "completed" && status !== "no-change" && status !== "failed") {
343
+ problems.push({
344
+ reason: "bad-status",
345
+ message: `status must be "completed", "no-change", or "failed" (got ${describe(status)})`,
346
+ });
347
+ }
348
+ const rawConclusion = body["conclusion"];
349
+ let conclusion = null;
350
+ if (typeof rawConclusion !== "string" || rawConclusion.trim() === "") {
351
+ problems.push({ reason: "missing-conclusion", message: "conclusion is required" });
352
+ }
353
+ else if (FORBIDDEN_MULTILINE.test(rawConclusion)) {
354
+ problems.push({ reason: "conclusion-control-characters", message: "conclusion contains control characters — text only" });
355
+ }
356
+ else {
357
+ conclusion = compactHandoffText(rawConclusion, HANDOFF_CONCLUSION_CAP);
358
+ }
359
+ if (problems.length > 0)
360
+ return { ok: false, problems };
361
+ return {
362
+ ok: true,
363
+ handoff: {
364
+ status: status,
365
+ conclusion: conclusion,
366
+ changes: handoffList(body["changes"]),
367
+ verification: handoffList(body["verification"]),
368
+ followUps: handoffList(body["followUps"]),
369
+ },
370
+ };
371
+ }
372
+ /**
373
+ * The compact error a repair turn is resumed with: every problem by name,
374
+ * then the one instruction. Written for an agent that already holds the
375
+ * context — it needs the list of what failed, not the theory of why.
376
+ */
377
+ export function repairPrompt(problems, mailbox) {
378
+ return [
379
+ `Your parked decision in ${mailbox} failed validation:`,
380
+ ...problems.map(problem => `- ${problem.message} (${problem.reason})`),
381
+ "",
382
+ `Rewrite ${mailbox} only — change no other file, run no commands, and do not`,
383
+ "reconsider the decision itself. Re-emit the same judgement call as valid",
384
+ "JSON: { urgency: \"blocking\", recap, question, options: [{ id, label,",
385
+ "consequence, reversible }], recommendation } — at least two options, every",
386
+ "option's reversible stated explicitly, recommendation naming an option id.",
387
+ ].join("\n");
388
+ }
package/dist/demo.d.ts ADDED
@@ -0,0 +1,55 @@
1
+ /**
2
+ * `toolroll demo` (adoption track, step 4) — a seeded, throwaway
3
+ * sandbox: ninety seconds from npx to seeing the product mid-flight, with
4
+ * zero real repos, zero agents, zero spend.
5
+ *
6
+ * The honesty contract (Codex adoption review, findings 8 and 9):
7
+ *
8
+ * - The database is stamped `demo` BEFORE any row exists — an append-only
9
+ * installation fact with no unset API. Every spending or external-effect
10
+ * command (tick, watch, build, publish, reconcile, daemon, bridge,
11
+ * outbox deliver, intake) fails closed on the stamp, so a kept sandbox
12
+ * can never be mistaken for real work by a worker pointed at it later.
13
+ * The console banner is decoration; the fence is enforcement.
14
+ * - The seeded history is SYNTHETIC and does not pretend otherwise: runs
15
+ * are written with the same permissive store methods the test suite
16
+ * uses, inside a database that can never join operational history,
17
+ * because nothing that computes provider success or spends quota will
18
+ * open it (the fence again).
19
+ * - The throwaway password goes to the terminal and to a mode-0600 file
20
+ * inside the sandbox — NEVER into the --json envelope, a URL, or the
21
+ * database.
22
+ *
23
+ * Everything lives under one mkdtemp directory: database, evidence,
24
+ * "repos". Ctrl-C tears it down; --keep preserves it (still fenced).
25
+ */
26
+ import { type Store } from "./store.js";
27
+ export type DemoSeed = {
28
+ login: {
29
+ name: string;
30
+ password: string;
31
+ };
32
+ repos: string[];
33
+ };
34
+ /**
35
+ * Seed a believable fleet mid-flight. The store MUST already carry the
36
+ * demo stamp — this function refuses to seed an unfenced database, so no
37
+ * caller can accidentally write synthetic history somewhere real.
38
+ */
39
+ export declare function seedDemo(store: Store, repos: {
40
+ api: string;
41
+ web: string;
42
+ }, evidenceRoot: string, now: Date): DemoSeed;
43
+ /** Two tiny real repositories, so repo-bound surfaces have something true
44
+ * to point at. git is optional here — a plain directory still demos. */
45
+ export declare function makeDemoRepos(root: string): {
46
+ api: string;
47
+ web: string;
48
+ };
49
+ export declare function createDemoSandbox(now: Date): {
50
+ sandbox: string;
51
+ store: Store;
52
+ seed: DemoSeed;
53
+ evidenceRoot: string;
54
+ passwordFile: string;
55
+ };