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,26 @@
1
+ /**
2
+ * Limits on the Tasks page (v105): each subscription's usage windows, as the
3
+ * provider last said, and each monthly budget, one tile each. A subscription
4
+ * costs nothing per run, so its windows are what bind it; budgets bind work
5
+ * billed to an API key. An instance operator's view.
6
+ */
7
+ import type { BrowserLimits } from "./browser-workspace.js";
8
+ import { type BudgetState } from "./spend.js";
9
+ /** "in 25 min", "in 2 h 10 min", or a day and hour ("Fri 11 PM") beyond a day. */
10
+ export declare function resetWords(resetsAt: string, now: Date): string;
11
+ export declare function limitsView(windows: readonly {
12
+ provider: string;
13
+ window: string;
14
+ usedPercent: number;
15
+ windowMinutes: number | null;
16
+ resetsAt: string | null;
17
+ reached: boolean;
18
+ plan: string | null;
19
+ observedAt: string;
20
+ }[], budgets: readonly BudgetState[], names: {
21
+ project: (repo: string) => string;
22
+ teammate: (id: number) => string;
23
+ }, now: Date): BrowserLimits | null;
24
+ /** The same tiles for the page without scripts. */
25
+ export declare function limitsHtml(limits: BrowserLimits | null): string;
26
+ export declare const LIMITS_CSS: string;
@@ -0,0 +1,67 @@
1
+ import { windowLabel } from "./provider-limits.js";
2
+ import { usd } from "./spend.js";
3
+ const PROVIDER_NAMES = { claude: "Claude", codex: "Codex", gemini: "Gemini" };
4
+ /** Plan names worth showing; anything else (an internal billing name) is left off. */
5
+ const PLAN_NAMES = { free: "Free", plus: "Plus", pro: "Pro", max: "Max", team: "Team", business: "Business", enterprise: "Enterprise", edu: "Edu" };
6
+ /** "in 25 min", "in 2 h 10 min", or a day and hour ("Fri 11 PM") beyond a day. */
7
+ export function resetWords(resetsAt, now) {
8
+ const minutes = Math.max(1, Math.round((Date.parse(resetsAt) - now.getTime()) / 60_000));
9
+ if (minutes < 60)
10
+ return `in ${minutes} min`;
11
+ if (minutes < 24 * 60)
12
+ return `in ${Math.floor(minutes / 60)} h${minutes % 60 === 0 ? "" : ` ${minutes % 60} min`}`;
13
+ return new Intl.DateTimeFormat("en-US", { weekday: "short", hour: "numeric" }).format(new Date(resetsAt)).replace(",", "");
14
+ }
15
+ const ago = (iso, now) => {
16
+ const minutes = Math.max(0, Math.round((now.getTime() - Date.parse(iso)) / 60_000));
17
+ return minutes < 60 ? `${minutes}m ago` : minutes < 48 * 60 ? `${Math.round(minutes / 60)}h ago` : `${Math.round(minutes / 1440)}d ago`;
18
+ };
19
+ const toneOf = (percent, reached) => reached || percent >= 100 ? "danger" : percent >= 80 ? "warning" : "neutral";
20
+ export function limitsView(windows, budgets, names, now) {
21
+ const tiles = [];
22
+ for (const one of windows) {
23
+ // A window that has turned over since the reading starts again from nothing.
24
+ const turned = one.resetsAt !== null && Date.parse(one.resetsAt) <= now.getTime();
25
+ const percent = turned ? 0 : one.usedPercent;
26
+ const reached = !turned && one.reached;
27
+ const stale = now.getTime() - Date.parse(one.observedAt) > 30 * 60_000;
28
+ const provider = PROVIDER_NAMES[one.provider] ?? one.provider;
29
+ const plan = one.plan === null ? "" : Object.hasOwn(PLAN_NAMES, one.plan.toLowerCase()) ? ` ${PLAN_NAMES[one.plan.toLowerCase()]}` : "";
30
+ tiles.push({
31
+ key: `${one.provider}:${one.window}`, name: `${provider}${plan}`, window: windowLabel(one.window, one.windowMinutes),
32
+ value: String(Math.round(percent)), unit: "%", percent, tone: toneOf(percent, reached), marks: [], href: null,
33
+ detail: turned ? "New window" : `${reached ? "Used up · resets" : "Resets"} ${one.resetsAt === null ? "later" : resetWords(one.resetsAt, now)}${stale ? ` · read ${ago(one.observedAt, now)}` : ""}`,
34
+ title: `${provider} said this ${ago(one.observedAt, now)}`,
35
+ });
36
+ }
37
+ for (const budget of budgets) {
38
+ const over = budget.spentMicrousd >= budget.limitMicrousd;
39
+ const name = budget.scope === "installation" ? "Everything" : budget.scope === "project" ? names.project(budget.key)
40
+ : budget.scope === "teammate" ? names.teammate(Number(budget.key)) : budget.key;
41
+ tiles.push({
42
+ key: `budget:${budget.id}`, name, window: "Budget", value: usd(budget.spentMicrousd), unit: `of ${usd(budget.limitMicrousd)}`,
43
+ percent: budget.percent, tone: over ? (budget.hardStop ? "danger" : "warning") : budget.percent >= 80 ? "warning" : "neutral", marks: [50, 80], href: "/spend",
44
+ detail: over && budget.hardStop ? "Used up · API work waits" : budget.hardStop ? "Stops API work at 100%" : "Alerts only",
45
+ title: `This month's spend billed to API keys${budget.unpriced > 0 ? `; ${budget.unpriced} without a price` : ""}`,
46
+ });
47
+ }
48
+ return tiles.length === 0 ? null : { tiles };
49
+ }
50
+ const e = (value) => String(value ?? "").replace(/[&<>"']/g, c => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c]);
51
+ /** The same tiles for the page without scripts. */
52
+ export function limitsHtml(limits) {
53
+ if (limits === null)
54
+ return "";
55
+ return `<section class="limits" aria-label="Limits"><ul>${limits.tiles.map(tile => {
56
+ const body = `<p class="limit-name"><strong>${e(tile.name)}</strong> ${e(tile.window)}</p><p class="limit-value"><strong>${e(tile.value)}</strong> ${e(tile.unit)}</p>` +
57
+ `<span class="limit-bar" aria-hidden="true"><span style="width:${Math.min(100, Math.max(0, tile.percent))}%"></span></span><p class="limit-detail">${e(tile.detail)}</p>`;
58
+ return `<li class="limit limit-${tile.tone}" data-limit="${e(tile.key)}"${tile.title === null ? "" : ` title="${e(tile.title)}"`}>${tile.href === null ? body : `<a href="${e(tile.href)}">${body}</a>`}</li>`;
59
+ }).join("")}</ul></section>`;
60
+ }
61
+ export const LIMITS_CSS = `.limits ul{list-style:none;margin:0 0 16px;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(176px,1fr));gap:8px}` +
62
+ `.limit{border:1px solid var(--border);border-radius:10px;background:var(--card);padding:12px 14px;min-width:0}.limit a{color:inherit;text-decoration:none;display:block}` +
63
+ `.limit p{margin:0}.limit-name{font-size:12px;color:var(--muted-foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.limit-name strong{color:var(--foreground);font-weight:500}` +
64
+ `.limit-value{margin-top:8px!important;font-size:12px;color:var(--muted-foreground);font-variant-numeric:tabular-nums}.limit-value strong{font-size:22px;font-weight:600;color:var(--foreground);letter-spacing:-.02em}` +
65
+ `.limit-bar{display:block;height:6px;border-radius:3px;background:var(--muted);overflow:hidden;margin-top:10px}.limit-bar span{display:block;height:100%;border-radius:3px;background:var(--foreground)}` +
66
+ `.limit-warning .limit-bar span{background:var(--warning)}.limit-danger .limit-bar span{background:var(--danger)}.limit-danger .limit-value strong{color:var(--danger)}` +
67
+ `.limit-detail{margin-top:8px!important;font-size:11.5px;color:var(--muted-foreground);white-space:nowrap;overflow:hidden;text-overflow:ellipsis}`;
package/dist/link.d.ts ADDED
@@ -0,0 +1,72 @@
1
+ /**
2
+ * Putting the command on PATH, as an explicit act.
3
+ *
4
+ * Toolroll refuses to install things on an operator's behalf — it prints
5
+ * the command and its side effects and lets them run it. A tool that applied
6
+ * that rule to `bd init` and then quietly edited PATH during its own install
7
+ * would not deserve to be believed, so this is a command you run, it shows
8
+ * you what it will do before it does it, and `unlink` undoes it exactly.
9
+ *
10
+ * Three rules hold throughout: never sudo, never a directory outside the home
11
+ * directory unless explicitly named, and never delete anything that is not
12
+ * something we put there.
13
+ *
14
+ * Two mechanisms, because "a command on PATH" means different things. On POSIX
15
+ * it is a symlink with the execute bit set. On Windows the shell resolves
16
+ * commands through PATHEXT, so an extensionless symlink is invisible no matter
17
+ * which directory it sits in — there it is a `.cmd` shim, which is also what
18
+ * npm writes, and which needs no Developer Mode to create.
19
+ */
20
+ /** What you type. */
21
+ export declare const BIN_NAME = "toolroll";
22
+ /** What lands on disk. Windows needs the extension to resolve it through PATHEXT. */
23
+ export declare const LINK_FILE: string;
24
+ export type TargetChoice = {
25
+ dir: string;
26
+ onPath: boolean;
27
+ };
28
+ export type LinkPlan = {
29
+ action: "create";
30
+ source: string;
31
+ target: string;
32
+ } | {
33
+ action: "already";
34
+ source: string;
35
+ target: string;
36
+ } | {
37
+ action: "replace";
38
+ source: string;
39
+ target: string;
40
+ current: string;
41
+ } | {
42
+ action: "conflict";
43
+ source: string;
44
+ target: string;
45
+ reason: string;
46
+ };
47
+ export type UnlinkPlan = {
48
+ action: "remove";
49
+ target: string;
50
+ current: string;
51
+ } | {
52
+ action: "absent";
53
+ target: string;
54
+ } | {
55
+ action: "foreign";
56
+ target: string;
57
+ reason: string;
58
+ };
59
+ /**
60
+ * Where the link should go. Only directories inside the home directory are
61
+ * ever proposed: everything else needs sudo, and needing sudo to read your own
62
+ * git repositories would be absurd.
63
+ */
64
+ export declare function chooseTarget(options: {
65
+ pathEntries: readonly string[];
66
+ home: string;
67
+ override?: string;
68
+ }): TargetChoice;
69
+ export declare function planLink(source: string, dir: string): Promise<LinkPlan>;
70
+ export declare function applyLink(plan: LinkPlan): Promise<void>;
71
+ export declare function planUnlink(dir: string): Promise<UnlinkPlan>;
72
+ export declare function applyUnlink(plan: UnlinkPlan): Promise<void>;
package/dist/link.js ADDED
@@ -0,0 +1,217 @@
1
+ /**
2
+ * Putting the command on PATH, as an explicit act.
3
+ *
4
+ * Toolroll refuses to install things on an operator's behalf — it prints
5
+ * the command and its side effects and lets them run it. A tool that applied
6
+ * that rule to `bd init` and then quietly edited PATH during its own install
7
+ * would not deserve to be believed, so this is a command you run, it shows
8
+ * you what it will do before it does it, and `unlink` undoes it exactly.
9
+ *
10
+ * Three rules hold throughout: never sudo, never a directory outside the home
11
+ * directory unless explicitly named, and never delete anything that is not
12
+ * something we put there.
13
+ *
14
+ * Two mechanisms, because "a command on PATH" means different things. On POSIX
15
+ * it is a symlink with the execute bit set. On Windows the shell resolves
16
+ * commands through PATHEXT, so an extensionless symlink is invisible no matter
17
+ * which directory it sits in — there it is a `.cmd` shim, which is also what
18
+ * npm writes, and which needs no Developer Mode to create.
19
+ */
20
+ import { chmod, mkdir, lstat, readFile, readlink, stat, symlink, unlink, writeFile } from "node:fs/promises";
21
+ import { dirname, join, resolve, sep } from "node:path";
22
+ const isWindows = process.platform === "win32";
23
+ /** What you type. */
24
+ export const BIN_NAME = "toolroll";
25
+ /** What lands on disk. Windows needs the extension to resolve it through PATHEXT. */
26
+ export const LINK_FILE = isWindows ? `${BIN_NAME}.cmd` : BIN_NAME;
27
+ /** Owner, group, and other execute — the same bits npm sets on a package bin. */
28
+ const EXECUTABLE_BITS = 0o111;
29
+ /**
30
+ * How a shim is known to be ours. The symlink case can ask the filesystem what
31
+ * it is; a `.cmd` is an ordinary file, so it has to say so in its own text or
32
+ * `unlink` could not tell it from someone else's program of the same name.
33
+ */
34
+ const SHIM_MARKER = "toolroll-link: generated by `toolroll link`";
35
+ /** Shims written before the rename to Toolroll stay ours. */
36
+ const LEGACY_SHIM_MARKER = "standing-orders-link: generated by `standing-orders link`";
37
+ /**
38
+ * Windows path comparison is case-insensitive, and a PATH entry may or may not
39
+ * carry a trailing separator. Comparing the raw strings means a directory that
40
+ * is on PATH gets reported as missing from it.
41
+ */
42
+ function comparablePath(path) {
43
+ const trimmed = path.length > 1 && path.endsWith(sep) ? path.slice(0, -1) : path;
44
+ return isWindows ? trimmed.toLowerCase() : trimmed;
45
+ }
46
+ function samePath(left, right) {
47
+ return comparablePath(left) === comparablePath(right);
48
+ }
49
+ /** Whether `path` is the home directory or sits beneath it. */
50
+ function isInside(path, home) {
51
+ const inner = comparablePath(path);
52
+ const outer = comparablePath(home);
53
+ return inner === outer || inner.startsWith(outer + sep);
54
+ }
55
+ /**
56
+ * Where the link should go. Only directories inside the home directory are
57
+ * ever proposed: everything else needs sudo, and needing sudo to read your own
58
+ * git repositories would be absurd.
59
+ */
60
+ export function chooseTarget(options) {
61
+ const { pathEntries, home, override } = options;
62
+ const isOnPath = (dir) => pathEntries.some(entry => samePath(entry, dir));
63
+ if (override !== undefined) {
64
+ const dir = resolve(override);
65
+ return { dir, onPath: isOnPath(dir) };
66
+ }
67
+ const conventional = [join(home, ".local", "bin"), join(home, "bin")];
68
+ const preferred = conventional.find(isOnPath);
69
+ if (preferred !== undefined)
70
+ return { dir: preferred, onPath: true };
71
+ const homeOwned = pathEntries.find(entry => isInside(entry, home));
72
+ if (homeOwned !== undefined)
73
+ return { dir: homeOwned, onPath: true };
74
+ // Nothing usable on PATH. Propose the conventional location and say so.
75
+ return { dir: conventional[0], onPath: false };
76
+ }
77
+ export async function planLink(source, dir) {
78
+ const target = join(dir, LINK_FILE);
79
+ const existing = await describeExisting(target);
80
+ if (existing === null)
81
+ return { action: "create", source, target };
82
+ if (existing.kind === "foreign") {
83
+ return { action: "conflict", source, target, reason: existing.reason };
84
+ }
85
+ if (samePath(existing.pointsTo, source))
86
+ return { action: "already", source, target };
87
+ return { action: "replace", source, target, current: existing.pointsTo };
88
+ }
89
+ export async function applyLink(plan) {
90
+ if (plan.action === "conflict") {
91
+ throw new Error(`${plan.target}: ${plan.reason} — remove it yourself if you want it gone`);
92
+ }
93
+ if (plan.action === "already")
94
+ return;
95
+ await mkdir(dirname(plan.target), { recursive: true });
96
+ // Only ever removing a shim we recognise, never someone else's file.
97
+ if (plan.action === "replace")
98
+ await unlink(plan.target);
99
+ if (isWindows) {
100
+ await writeFile(plan.target, shimText(plan.source));
101
+ return;
102
+ }
103
+ await symlink(plan.source, plan.target);
104
+ await ensureExecutable(plan.source);
105
+ }
106
+ /**
107
+ * `%*` forwards arguments with their quoting intact — the same mechanism npm's
108
+ * own generated shims use — and `EXIT /B` hands the command's exit code back to
109
+ * the shell, without which a failing scan would look like a success to anything
110
+ * that checked.
111
+ *
112
+ * The path is written with `%` doubled, because a percent sign is legal in a
113
+ * Windows path and cmd would otherwise read `%Foo%` in it as a variable and
114
+ * substitute it away. The `REM source:` line keeps the path verbatim: it is
115
+ * read back by this program, not by cmd.
116
+ *
117
+ * `SETLOCAL DisableDelayedExpansion` is not ceremony. Delayed expansion is
118
+ * inherited — a shim invoked under `cmd /v:on`, or from a batch file that
119
+ * enabled it, would have every `!` in the path *and in the arguments* eaten
120
+ * before node saw them, turning `a!name!b` into `ab` silently. Disabling it for
121
+ * our own scope is the only way to be sure. `ENDLOCAL &` shares a line with the
122
+ * exit so that `%ERRORLEVEL%` is read inside the scope, before it is torn down.
123
+ *
124
+ * One inherited quirk remains, worth knowing before someone reports it as a
125
+ * bug: a batch file reaching this through CALL has its arguments parsed a
126
+ * second time by cmd, which doubles any caret in them. That happens to
127
+ * `CALL node ...` just the same, with no shim involved, and no batch file can
128
+ * avoid it — only a compiled launcher could. The tests pin the shim to being
129
+ * transparent rather than to being immune.
130
+ */
131
+ function shimText(source) {
132
+ return [
133
+ "@ECHO off",
134
+ `REM ${SHIM_MARKER}; safe to delete`,
135
+ `REM source: ${source}`,
136
+ "SETLOCAL DisableDelayedExpansion",
137
+ `node "${source.replaceAll("%", "%%")}" %*`,
138
+ "ENDLOCAL & EXIT /B %ERRORLEVEL%",
139
+ "",
140
+ ].join("\r\n");
141
+ }
142
+ /** The source a shim points at, or null when the text is not one of ours. */
143
+ function readShimSource(text) {
144
+ if (!text.includes(SHIM_MARKER) && !text.includes(LEGACY_SHIM_MARKER))
145
+ return null;
146
+ const declared = /^REM source: (.+)$/m.exec(text);
147
+ return declared?.[1]?.trim() ?? null;
148
+ }
149
+ /**
150
+ * tsc emits a file with the shebang intact but without the execute bit, so a
151
+ * symlink to it fails with "permission denied" the first time it is typed.
152
+ * Windows has no such bit, and chmod there is a no-op at best.
153
+ */
154
+ async function ensureExecutable(source) {
155
+ if (isWindows)
156
+ return;
157
+ const stats = await stat(source);
158
+ const wanted = stats.mode | EXECUTABLE_BITS;
159
+ if (wanted !== stats.mode)
160
+ await chmod(source, wanted);
161
+ }
162
+ export async function planUnlink(dir) {
163
+ const target = join(dir, LINK_FILE);
164
+ const existing = await describeExisting(target);
165
+ if (existing === null)
166
+ return { action: "absent", target };
167
+ if (existing.kind === "foreign") {
168
+ return { action: "foreign", target, reason: existing.reason };
169
+ }
170
+ return { action: "remove", target, current: existing.pointsTo };
171
+ }
172
+ export async function applyUnlink(plan) {
173
+ if (plan.action === "foreign") {
174
+ throw new Error(`${plan.target}: ${plan.reason} — leaving it alone`);
175
+ }
176
+ if (plan.action === "absent")
177
+ return;
178
+ await unlink(plan.target);
179
+ }
180
+ /**
181
+ * null when nothing is there. Otherwise: ours, and what it points at, or
182
+ * foreign, and why we will not touch it.
183
+ */
184
+ async function describeExisting(target) {
185
+ let stats;
186
+ try {
187
+ stats = await lstat(target);
188
+ }
189
+ catch {
190
+ return null;
191
+ }
192
+ if (isWindows) {
193
+ if (!stats.isFile()) {
194
+ return { kind: "foreign", reason: "something that is not a file is already there" };
195
+ }
196
+ let text;
197
+ try {
198
+ text = await readFile(target, "utf8");
199
+ }
200
+ catch {
201
+ return { kind: "foreign", reason: "something unreadable is already there" };
202
+ }
203
+ const pointsTo = readShimSource(text);
204
+ if (pointsTo === null) {
205
+ return { kind: "foreign", reason: "a program we did not write is already there" };
206
+ }
207
+ return { kind: "ours", pointsTo };
208
+ }
209
+ if (!stats.isSymbolicLink()) {
210
+ return { kind: "foreign", reason: "something that is not a link is already there" };
211
+ }
212
+ // readlink returns the link's raw text, which may be relative. Comparing that
213
+ // against an absolute source would call a perfectly good link stale and
214
+ // replace it on every run.
215
+ const raw = await readlink(target);
216
+ return { kind: "ours", pointsTo: resolve(dirname(target), raw) };
217
+ }
package/dist/live.d.ts ADDED
@@ -0,0 +1,96 @@
1
+ /**
2
+ * The live window (arc 1): what the running agent is saying, on disk, for
3
+ * the run page to poll — and NOTHING else.
4
+ *
5
+ * This file is display state, not evidence. No artifact row points at it,
6
+ * no digest binds it, and the page that renders it says so: the machine
7
+ * running the agent could alter it. It exists so a person can watch work
8
+ * happen without a terminal, and every byte in it went through the same
9
+ * sanitize discipline as the peek: controls stripped, credential-shaped
10
+ * lines replaced whole, tool activity described in OUR fixed vocabulary —
11
+ * event metadata is never echoed.
12
+ *
13
+ * Fail-soft everywhere: a live view that cannot be written must never
14
+ * break, slow, or reclassify a build.
15
+ */
16
+ export declare const LIVE_LINE_CAP: number;
17
+ export declare const LIVE_FILE_CAP: number;
18
+ export declare const LIVE_CAP_MARKER = "[the live view stopped at its size cap \u2014 the run record continues]";
19
+ export declare const LIVE_REDACTED_LINE = "[a credential-shaped line was redacted]";
20
+ /** Finalized runs keep their live file this long for the final drain. */
21
+ export declare const LIVE_RETAIN_MS: number;
22
+ /** The bounded sweep: at most this many FINALIZED files survive a pass. */
23
+ export declare const LIVE_FILE_BOUND = 500;
24
+ export declare function liveDir(root: string): string;
25
+ /** The exact filename, from the numeric id and nothing else — no user
26
+ * input is ever parsed into this path. */
27
+ export declare function liveLogPath(root: string, runId: number): string;
28
+ /**
29
+ * One stream event → zero or more display lines, in the fixed vocabulary.
30
+ * Assistant TEXT is the agent's own words (sanitized below); tool use is a
31
+ * headline; everything else — tool results, deltas, results, subagent
32
+ * chatter — renders nothing in v1.
33
+ */
34
+ export declare function renderTranscriptLines(event: Record<string, unknown>): string[];
35
+ /** Sanitize one display line: strip, redact whole on any secret hit, cap. */
36
+ export declare function sanitizeTranscriptLine(line: string): string;
37
+ export type LiveLog = {
38
+ observe(event: Record<string, unknown>): void;
39
+ close(): void;
40
+ };
41
+ /**
42
+ * Open the run's live file for appending. The directory is 0700, the file
43
+ * 0600 and CREATED HERE (O_EXCL: a name that already exists — whatever put
44
+ * it there — is refused, not appended to), opened O_NOFOLLOW with the
45
+ * descriptor retained for the run's whole duration. Returns null on any
46
+ * failure: no live view is ever worth a build.
47
+ */
48
+ export declare function openLiveLog(root: string, runId: number): LiveLog | null;
49
+ export type LiveWindowRead = {
50
+ ok: true;
51
+ text: string;
52
+ nextOffset: number;
53
+ eof: boolean;
54
+ } | {
55
+ ok: false;
56
+ reason: "missing" | "replaced" | "unreadable";
57
+ };
58
+ /**
59
+ * Read the live file from a byte offset, returning only COMPLETE lines
60
+ * (through the last LF in the window). The descriptor is the authority:
61
+ * opened O_NOFOLLOW, proved a regular file, measured and read through
62
+ * itself. A file smaller than the offset was replaced — the caller resets,
63
+ * visibly, never silently duplicating (arc 1 §4). `allowTail` (the final
64
+ * drain) returns the unterminated tail after finalization.
65
+ */
66
+ export declare function readLiveWindow(root: string, runId: number, from: number, allowTail?: boolean): LiveWindowRead;
67
+ export type LiveSweepVerdict = {
68
+ /** run id, or null when the name is not a run's file. */
69
+ runId: number | null;
70
+ fileName: string;
71
+ mtimeMs: number;
72
+ };
73
+ /**
74
+ * Enumerate the live directory for the reconcile sweep. Pure listing — the
75
+ * CALLER decides which runs are finalized and when; this module only
76
+ * refuses to guess. Non-run names are reported with runId null (orphans
77
+ * from nothing this plane wrote; aged on mtime like everything else).
78
+ */
79
+ export declare function listLiveFiles(root: string): LiveSweepVerdict[];
80
+ /** Remove one live file, silently: a sweep never throws over display state. */
81
+ export declare function removeLiveFile(root: string, fileName: string): void;
82
+ /**
83
+ * The reconcile sweep (arc 1 §2): ACTIVE runs are exempt ABSOLUTELY — the
84
+ * transport's no-truncation assumption depends on it. Finalized runs age
85
+ * from finished_at; orphans (no run row, or a name this plane never
86
+ * writes) age from mtime; and the 500-file bound applies only WITHIN the
87
+ * finalized-or-orphan set, oldest first.
88
+ */
89
+ export declare function sweepLiveLogs(store: {
90
+ getRun(id: number): {
91
+ outcome: string | null;
92
+ finishedAt: string | null;
93
+ } | null;
94
+ }, root: string, now: Date): {
95
+ removed: string[];
96
+ };