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,214 @@
1
+ /**
2
+ * Safe task stop and resume (v52): the ONE domain API every surface — the
3
+ * CLI, the authenticated console, the focused chat — speaks, and the fences
4
+ * every execution road consults.
5
+ *
6
+ * The contract, in the operator's words: a stop names one exact active
7
+ * attempt. The first answer is "stop requested", never "stopped" — the
8
+ * request is durable before any process is signalled, and the attempt is
9
+ * SETTLED only once all owned runs ended and retained process witnesses
10
+ * establish exit. A dead worker can leave live subprocesses; recovery
11
+ * keeps that stop pending. Other tasks keep running. The task stays
12
+ * paused across restarts under a hold this stop owns, beside — never over —
13
+ * any hold that already stood. Resume names the same exact attempt, refuses
14
+ * until it is quiescent, lifts only that hold, approves nothing, and lets
15
+ * the next pass re-prove the signed scope, take a fresh claim, and inherit
16
+ * the preserved draft with fresh proof.
17
+ *
18
+ * Nothing here is a second engine: the stop rides the existing run, claim,
19
+ * hold, recovery, invocation-gateway, and held-session machinery. This
20
+ * module only names the door and the fence.
21
+ */
22
+ import { ownedProcessCount, runOwnerTag, terminateOwnedProcesses } from "./exec.js";
23
+ import { diagnoseTaskDispatch } from "./dispatch.js";
24
+ /** How often a running attempt re-reads its stop row while a child runs.
25
+ * A stop is observed within this bound even when the console that filed
26
+ * it lives in another process on the same database. */
27
+ export const STOP_WATCH_MS = 1_500;
28
+ /**
29
+ * The stop fence, as a predicate: an operator stop applies to the run (its
30
+ * own, or an owning ancestor's), or the caller's own watch-level stop says
31
+ * so. Every road that used to ask `shouldStop?.()` asks this instead.
32
+ */
33
+ export function stopRequestedFor(store, runId, also) {
34
+ if (also?.() === true)
35
+ return true;
36
+ return store.applicableStopFor(runId) !== null;
37
+ }
38
+ /** The words a road records when a stop wins: who asked, and where the
39
+ * work stays. */
40
+ export function stopWords(store, runId, worktree, fallback) {
41
+ const stop = store.applicableStopFor(runId);
42
+ if (stop === null)
43
+ return fallback;
44
+ const where = worktree === null ? "its evidence is on record" : `the work is preserved in ${worktree}`;
45
+ return `stopped by ${stop.requestedBy} (run #${stop.run}) — ${where}`;
46
+ }
47
+ /**
48
+ * End every live child THIS process holds for one attempt and its owned
49
+ * descendants — the exact-attempt handle, never a pid read from durable
50
+ * state. Returns how many process groups were signalled.
51
+ */
52
+ export function terminateStoppedAttempt(store, runId) {
53
+ let terminated = 0;
54
+ for (const owned of store.ownedRunsOf(runId))
55
+ terminated += terminateOwnedProcesses(runOwnerTag(store, owned));
56
+ return terminated;
57
+ }
58
+ /** Whether this process still tracks a live child for the attempt or any
59
+ * run it owns — the in-process half of "quiescent". */
60
+ export function attemptHasLiveChildren(store, runId) {
61
+ return store.ownedRunsOf(runId).some(owned => ownedProcessCount(runOwnerTag(store, owned)) > 0);
62
+ }
63
+ /**
64
+ * Run a child-bearing step under the stop watch: while `body` runs, the
65
+ * run's stop row is re-read every `intervalMs`; the moment a stop applies
66
+ * the run's owned children are killed through their handles and the
67
+ * caller's `onStop` fires once. The body's own settlement then observes
68
+ * the stop through `stopRequestedFor` and seals the attempt as
69
+ * interrupted — this watch never writes an outcome itself.
70
+ */
71
+ export async function underStopWatch(store, runId, body, options = {}) {
72
+ let fired = false;
73
+ const look = () => {
74
+ let applies = false;
75
+ try {
76
+ applies = store.applicableStopFor(runId) !== null;
77
+ }
78
+ catch {
79
+ // A read that cannot reach the database proves nothing; the next
80
+ // beat asks again, and settlement asks one last time.
81
+ return;
82
+ }
83
+ if (!applies)
84
+ return;
85
+ terminateStoppedAttempt(store, runId);
86
+ // A later asynchronous step may have spawned since the previous beat.
87
+ // Keep stopping children; only the notification is one-shot.
88
+ if (fired)
89
+ return;
90
+ fired = true;
91
+ try {
92
+ options.onStop?.();
93
+ }
94
+ catch {
95
+ // The watch's job is the kill; a listener's throw is its own.
96
+ }
97
+ };
98
+ look();
99
+ const timer = setInterval(look, options.intervalMs ?? STOP_WATCH_MS);
100
+ timer.unref?.();
101
+ try {
102
+ return await body();
103
+ }
104
+ finally {
105
+ clearInterval(timer);
106
+ }
107
+ }
108
+ /**
109
+ * The shared stop door. Records the durable request first (one fenced
110
+ * transaction: exact run, still open, this task's current claim, no
111
+ * tournament, no admitted publication), THEN signals every child this
112
+ * process holds for the attempt. A worker in another process observes the
113
+ * same row through its stop watch within STOP_WATCH_MS.
114
+ */
115
+ export function requestTaskStop(store, request, now) {
116
+ const ref = store.lookupRef(request.taskId);
117
+ if (ref === null || store.getTask(request.taskId) === null) {
118
+ return { ok: false, reason: "no-task", detail: `no task \`${request.taskId}\`` };
119
+ }
120
+ const asked = store.requestRunStop({ runId: request.runId, taskRef: ref.id, by: request.by, via: request.via }, now);
121
+ if (!asked.ok)
122
+ return asked;
123
+ let terminated = 0;
124
+ const signal = () => {
125
+ terminated = terminateStoppedAttempt(store, request.runId);
126
+ if (request.held !== undefined && store.heldSessionOf(request.runId) !== null) {
127
+ void request.held.stop(request.runId).catch(() => {
128
+ // The lapse interval retries the same fence; the durable row stands.
129
+ });
130
+ }
131
+ };
132
+ if (request.deferSignal)
133
+ request.deferSignal(signal);
134
+ else
135
+ signal();
136
+ return { ok: true, stop: asked.stop, repeated: asked.repeated, terminated, taskId: request.taskId };
137
+ }
138
+ /**
139
+ * The shared resume door. Refuses in words until the exact stopped attempt
140
+ * is quiescent — settled, every owned run ended, no live claim, its
141
+ * workspace not held by any process this machine can still see — then
142
+ * lifts exactly this stop's hold. `gate` reports what still keeps the
143
+ * next pass from starting work (an approval that must be signed again, a
144
+ * worker that is offline), so a resume that cannot yet start is never
145
+ * mistaken for one that did. A stopped review is refused here and pointed
146
+ * at the explicit bounded review-retry door.
147
+ */
148
+ export function resumeTaskStop(store, request, now) {
149
+ const ref = store.lookupRef(request.taskId);
150
+ if (ref === null || store.getTask(request.taskId) === null) {
151
+ return { ok: false, reason: "no-task", detail: `no task \`${request.taskId}\`` };
152
+ }
153
+ const run = store.getRun(request.runId);
154
+ if (run !== null && run.worktree !== null && request.occupied !== undefined) {
155
+ const held = request.occupied(run.worktree);
156
+ if (held.held) {
157
+ return { ok: false, reason: "occupied", detail: `run #${request.runId}'s workspace ${run.worktree} is still held by process ${String(held.by ?? "?")} — nothing resumes until it is gone` };
158
+ }
159
+ }
160
+ if (attemptHasLiveChildren(store, request.runId)) {
161
+ return { ok: false, reason: "stopping", detail: `run #${request.runId} still has a live process this worker is stopping` };
162
+ }
163
+ const resumed = store.resumeRunStop({ runId: request.runId, taskRef: ref.id, by: request.by, via: request.via }, now);
164
+ if (!resumed.ok)
165
+ return resumed;
166
+ const gate = diagnoseTaskDispatch(store, request.taskId, now);
167
+ return { ok: true, stop: resumed.stop, taskId: request.taskId, gate: gate === null || gate.condition === "running" ? null : gate };
168
+ }
169
+ /** The head of a lease group: a run whose parent (if any) ran under a
170
+ * different lease — a builder, a planner, a scout, a recovered-draft
171
+ * successor, a warm park resume; never a repair turn or a correction. */
172
+ function isAttemptRoot(store, run) {
173
+ if (run.role === "reviewer")
174
+ return run.reviewAttempt !== null && run.reviewAttempt !== undefined;
175
+ if (run.parentRun === null)
176
+ return true;
177
+ return store.getRun(run.parentRun)?.leaseId !== run.leaseId;
178
+ }
179
+ export function taskControlOf(store, taskRef, now) {
180
+ const runs = store.runsFor(taskRef);
181
+ const holding = store.currentLiveLease(taskRef, now);
182
+ const live = runs.find(run => run.outcome === null && run.role !== "reviewer" && holding !== null && run.leaseId === holding && isAttemptRoot(store, run)) ??
183
+ runs.find(run => run.outcome === null && run.role === "reviewer" && isAttemptRoot(store, run)) ??
184
+ null;
185
+ if (live !== null) {
186
+ const stop = store.stopOf(live.id);
187
+ if (stop !== null && stop.settledAt === null)
188
+ return { kind: "stopping", run: stop.run, role: live.role, stop, unsettledRun: true };
189
+ if (stop === null)
190
+ return { kind: "stop", run: live.id, role: live.role };
191
+ }
192
+ // A stop recorded but unsettled on a run that already ended is still
193
+ // "stopping" — visibly needing attention, never silently paused.
194
+ const pending = store.stopsForTask(taskRef).find(stop => stop.settledAt === null) ?? null;
195
+ if (pending !== null) {
196
+ const run = store.getRun(pending.run);
197
+ return { kind: "stopping", run: pending.run, role: run?.role ?? "builder", stop: pending, unsettledRun: run?.outcome === null, detail: store.stopQuiescenceProblem(pending.run) };
198
+ }
199
+ const newest = runs.find(run => run.role !== "reviewer" && isAttemptRoot(store, run)) ?? null;
200
+ if (newest !== null) {
201
+ const stop = store.stopOf(newest.id);
202
+ if (stop !== null && stop.settledAt !== null && stop.resumedAt === null) {
203
+ return { kind: "paused", run: newest.id, role: newest.role, stop, outcome: newest.outcome, committed: newest.committed === true, worktree: newest.worktree };
204
+ }
205
+ }
206
+ const newestReview = runs.find(run => run.role === "reviewer" && isAttemptRoot(store, run)) ?? null;
207
+ if (newestReview !== null) {
208
+ const stop = store.stopOf(newestReview.id);
209
+ if (stop !== null && stop.settledAt !== null && stop.resumedAt === null) {
210
+ return { kind: "review-stopped", run: newestReview.id, sourceRun: newestReview.parentRun, stop };
211
+ }
212
+ }
213
+ return { kind: "none" };
214
+ }
@@ -0,0 +1,10 @@
1
+ import { type VerifiedApprover } from './principal.js';
2
+ import type { Store } from './store.js';
3
+ export declare function runTaskOutcomeCommand(action: 'complete' | 'revise', positional: readonly string[], flags: Map<string, string | true>, context: {
4
+ store: Store;
5
+ evidenceRoot: string;
6
+ json: boolean;
7
+ write: (line: string) => void;
8
+ now: Date;
9
+ operator: () => Promise<VerifiedApprover | null>;
10
+ }): Promise<number>;
@@ -0,0 +1,92 @@
1
+ /** Everyday task verbs over the existing completion and revision boundaries. */
2
+ import { createHash } from 'node:crypto';
3
+ import { assignmentOf, checkAssignmentAsOperator } from './assignment.js';
4
+ import { assignmentForCoordinator, coordinatorToken } from './assignment-adapters.js';
5
+ import { authenticateCoordinator } from './coordinator.js';
6
+ import { reproveApprover } from './principal.js';
7
+ import { requestResultChanges } from './result-actions.js';
8
+ import { commentSourceKey, revisionSourceOf } from './result-review.js';
9
+ import { envelopeJson } from './envelope.js';
10
+ export async function runTaskOutcomeCommand(action, positional, flags, context) {
11
+ const command = `task ${action}`;
12
+ const emit = (result, lines) => {
13
+ context.write(context.json ? envelopeJson({ ...result, command }) : result.ok ? (lines ?? []).join('\n') : result.message ?? 'The action was refused.');
14
+ return result.ok ? 0 : result.reason === 'usage' ? 2 : 3;
15
+ };
16
+ const fail = (reason, message) => emit({ ok: false, reason, message });
17
+ const allowed = new Set(['json', 'db', 'as', 'token', 'token-env', 'token-file', ...(action === 'complete' ? ['digest'] : ['feedback', 'run', 'source', 'key'])]);
18
+ for (const key of flags.keys())
19
+ if (!allowed.has(key))
20
+ return fail('usage', `--${key} is not a task ${action} option.`);
21
+ const task = positional[0];
22
+ if (positional.length !== 1 || !task || task.length > 64 || /[\x00-\x1f]/.test(task))
23
+ return fail('usage', `Use task ${action} <task>${action === 'complete' ? ' --digest <receipt>' : ' --feedback "requested change"'}.`);
24
+ const credential = coordinatorToken(flags, process.env);
25
+ if ('ok' in credential)
26
+ return emit(credential);
27
+ if (credential.token !== null && (flags.has('as') || flags.has('token')))
28
+ return fail('usage', 'Choose a scoped credential or your operator sign-in.');
29
+ const operator = credential.token === null ? await context.operator() : null;
30
+ if (credential.token === null && operator === null)
31
+ return fail('unauthenticated', 'Sign in with up, or supply --as and --token. Agents can use --token-file or --token-env with a scoped credential.');
32
+ const { store, now, evidenceRoot } = context;
33
+ return store.transact(() => {
34
+ const coordinator = credential.token === null ? null : authenticateCoordinator(store, credential.token);
35
+ if (coordinator !== null && !coordinator.ok)
36
+ return fail('unauthenticated', 'The scoped credential is invalid or revoked.');
37
+ if (operator !== null && !reproveApprover(store, operator).ok)
38
+ return fail('unauthenticated', 'Your sign-in is no longer valid.');
39
+ const repos = coordinator?.ok ? coordinator.who.repos : operator.repos;
40
+ const current = assignmentOf(store, task, now, { principal: coordinator === null ? 'operator' : 'coordinator', repos }, evidenceRoot);
41
+ if (current === null)
42
+ return fail('not-found', 'That task is unavailable in your projects.');
43
+ if (action === 'complete') {
44
+ const supplied = flags.get('digest');
45
+ if (supplied !== undefined && (typeof supplied !== 'string' || !/^[a-f0-9]{64}$/.test(supplied)))
46
+ return fail('usage', '--digest requires the exact receipt from assignment show.');
47
+ if (supplied === undefined && (context.json || coordinator !== null))
48
+ return fail('usage', 'Read assignment show <task>, then pass its exact --digest to mark that result complete.');
49
+ const digest = typeof supplied === 'string' ? supplied : current.receipt?.digest;
50
+ if (!digest)
51
+ return fail('not-ready', 'This task has no finished result to mark complete.');
52
+ const changed = credential.token !== null
53
+ ? assignmentForCoordinator(store, credential.token, 'check', { ref: task, digest }, now, evidenceRoot)
54
+ : checkAssignmentAsOperator(store, task, digest, operator, now, evidenceRoot);
55
+ if (!changed.ok)
56
+ return emit(changed);
57
+ const assignment = 'body' in changed ? changed.body : changed.assignment;
58
+ return emit({ ok: true, result: assignment }, [`${current.rootId} · Complete`, `Result: ${current.activeTaskId} · run ${current.receipt.runId} · ${current.receipt.head ?? 'no commit'}`, current.receipt.checks.detail]);
59
+ }
60
+ const feedback = flags.get('feedback'), runFlag = flags.get('run'), sourceFlag = flags.get('source'), keyFlag = flags.get('key');
61
+ if (typeof feedback !== 'string' || !feedback.trim())
62
+ return fail('usage', 'Describe the requested change with --feedback.');
63
+ if (runFlag !== undefined && (typeof runFlag !== 'string' || !/^[1-9]\d*$/.test(runFlag) || !Number.isSafeInteger(Number(runFlag))))
64
+ return fail('usage', '--run requires an exact run number.');
65
+ if (sourceFlag !== undefined && (typeof sourceFlag !== 'string' || !/^(?:[a-f0-9]{32}|none)$/.test(sourceFlag)))
66
+ return fail('usage', '--source requires the exact source scope digest.');
67
+ if (keyFlag !== undefined && (typeof keyFlag !== 'string' || !/^[a-f0-9]{32}$/.test(keyFlag)))
68
+ return fail('usage', '--key requires 32 lowercase hexadecimal characters.');
69
+ const runId = runFlag === undefined ? current.receipt?.runId : Number(runFlag);
70
+ const run = runId === undefined ? null : store.getRun(runId);
71
+ const runTask = run === null ? null : store.externalIdFor(run.taskRef);
72
+ const family = runTask === null ? null : store.taskFamilyOf(runTask, repos, false);
73
+ if (run === null || runTask === null || family?.root.id !== current.rootId || run.outcome === null)
74
+ return fail('not-found', 'That finished result is unavailable for this task.');
75
+ const source = typeof sourceFlag === 'string' ? sourceFlag : revisionSourceOf(store.getScope(runTask)?.digest ?? null);
76
+ const actor = coordinator?.ok ? `coordinator:${coordinator.who.cid}` : operator.name;
77
+ const key = typeof keyFlag === 'string' ? keyFlag : createHash('sha256').update(JSON.stringify([actor, run.id, source, feedback])).digest('hex').slice(0, 32);
78
+ const previous = store.diffCommentBySourceKey(commentSourceKey(actor, key));
79
+ if ((family.current.id !== runTask || (current.receipt !== null && current.receipt.runId !== run.id)) && previous?.consumedBy == null)
80
+ return fail('stale-result', 'A newer version is current. Read its result before requesting another revision.');
81
+ // The shared action returns exact replays before stale-family checks. An
82
+ // older result cannot create another child once a newer revision is current.
83
+ const revised = requestResultChanges(store, evidenceRoot, { run: run.id, source, actor, repos,
84
+ batch: '', note: feedback, path: '', line: '', request: key, allowMode: operator !== null }, now);
85
+ if (!revised.ok)
86
+ return fail(revised.status === 400 ? 'usage' : 'stale-result', revised.message);
87
+ const scope = store.getScope(revised.id);
88
+ const approved = scope?.approvedDigest != null && scope.approvedDigest === scope.digest;
89
+ const planning = store.lookupRef(revised.id)?.plan === 'requested';
90
+ return emit({ ok: true, result: { id: revised.id, rootId: current.rootId, sourceRun: run.id, source, key, approved, planning } }, [`${current.rootId} · Revision created`, `Execution: ${revised.id}`, approved ? 'Covered by your existing operating mode.' : planning ? 'Updating the plan with your notes; approve it when it is ready.' : 'The revision is waiting for approval.']);
91
+ });
92
+ }
@@ -0,0 +1,30 @@
1
+ export declare const TASK_TEXT_LIMITS: {
2
+ readonly title: 200;
3
+ readonly text: 2000;
4
+ readonly textBytes: 8000;
5
+ };
6
+ export declare const TASK_SCOPE_TEXT_SCHEMA: {
7
+ readonly type: "string";
8
+ readonly maxLength: 2000;
9
+ readonly description: "At most 2000 UTF-16 code units and 8000 UTF-8 bytes; no control or disguised text.";
10
+ };
11
+ export type TaskTextRefusal = {
12
+ ok: false;
13
+ reason: "bad-title" | "bad-goal";
14
+ message: string;
15
+ };
16
+ export declare function validateScopeText(fields: {
17
+ goal?: string;
18
+ outOfScope?: string | null;
19
+ touches?: readonly string[];
20
+ }): {
21
+ ok: false;
22
+ reason: "bad-goal" | "bad-out-of-scope" | "bad-touches";
23
+ message: string;
24
+ } | null;
25
+ export declare function validateTaskText(fields: {
26
+ title: string;
27
+ goal?: string;
28
+ outOfScope?: string | null;
29
+ touches?: readonly string[];
30
+ }): TaskTextRefusal | null;
@@ -0,0 +1,41 @@
1
+ /** New task text only. Historical signed terms are read by sealRevision,
2
+ * never re-authored through this validator. Character counts deliberately
3
+ * retain the existing JavaScript/HTML UTF-16 policy (2000 code units).
4
+ * UTF-8 byte limits remain explicit storage bounds beside that policy. */
5
+ import { hasForbiddenControls, hasDisguisedText } from "./decision.js";
6
+ export const TASK_TEXT_LIMITS = { title: 200, text: 2_000, textBytes: 8_000 };
7
+ export const TASK_SCOPE_TEXT_SCHEMA = { type: "string", maxLength: TASK_TEXT_LIMITS.text,
8
+ description: "At most 2000 UTF-16 code units and 8000 UTF-8 bytes; no control or disguised text." };
9
+ const dishonest = (text) => hasForbiddenControls(text) || hasDisguisedText(text);
10
+ const overBytes = (text, cap) => Buffer.byteLength(text, "utf8") > cap;
11
+ const BYTE_CAPS = { title: 800, text: TASK_TEXT_LIMITS.textBytes, path: 800 };
12
+ const refuse = (reason, message) => ({ ok: false, reason, message });
13
+ export function validateScopeText(fields) {
14
+ for (const [value, label, reason, required] of [
15
+ [fields.goal, "Goal", "bad-goal", true],
16
+ [fields.outOfScope, "Exclusions", "bad-out-of-scope", false],
17
+ ]) {
18
+ if (value == null)
19
+ continue;
20
+ if (required && value.trim() === "")
21
+ return { ok: false, reason, message: `${label} cannot be empty.` };
22
+ if (value.length > TASK_TEXT_LIMITS.text)
23
+ return { ok: false, reason, message: `${label} must be 2000 characters or fewer.` };
24
+ if (overBytes(value, BYTE_CAPS.text))
25
+ return { ok: false, reason, message: `${label} must be 8000 UTF-8 bytes or fewer.` };
26
+ if (dishonest(value))
27
+ return { ok: false, reason, message: `${label} cannot contain control or hidden characters.` };
28
+ }
29
+ const touches = fields.touches ?? [];
30
+ if (touches.length > 50 || touches.some(one => one.trim() === "" || one.length > 200 || overBytes(one, BYTE_CAPS.path) || dishonest(one))) {
31
+ return { ok: false, reason: "bad-touches", message: "Use at most 50 paths, each non-empty, at most 200 characters, with no control or hidden characters." };
32
+ }
33
+ return null;
34
+ }
35
+ export function validateTaskText(fields) {
36
+ if (fields.title.trim() === "" || fields.title.length > 200 || overBytes(fields.title, BYTE_CAPS.title) || dishonest(fields.title)) {
37
+ return refuse("bad-title", "a title is required, at most 200 characters, with no control or disguised text");
38
+ }
39
+ const bad = validateScopeText(fields);
40
+ return bad === null ? null : refuse("bad-goal", bad.message);
41
+ }
@@ -0,0 +1,15 @@
1
+ export type TeamCliOptions = {
2
+ fetch?: typeof fetch;
3
+ env?: NodeJS.ProcessEnv;
4
+ home?: string;
5
+ profileFile?: string;
6
+ readStdin?: () => Promise<string>;
7
+ readLine?: (prompt: string) => Promise<string | null>;
8
+ isTTY?: boolean;
9
+ stderr?: (line: string) => void;
10
+ signal?: AbortSignal;
11
+ sleep?: (milliseconds: number, signal: AbortSignal) => Promise<void>;
12
+ };
13
+ export declare const TEAM_CLI_ACTIONS: readonly ['connect', 'lead list', 'lead create', 'lead update', 'lead member', 'lead transfer', 'conversation list', 'conversation create', 'conversation show', 'conversation member', 'conversation edit', 'conversation withdraw', 'conversation read', 'conversation follow', 'conversation stop'];
14
+ /** null means preserve the existing local command path. Nothing here opens a database. */
15
+ export declare function maybeRunTeamCommand(argv: readonly string[], write: (line: string) => void, options?: TeamCliOptions): Promise<number | null>;