toolroll 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (626) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +1113 -0
  3. package/THIRD_PARTY_NOTICES.md +449 -0
  4. package/dist/accent-colors.d.ts +48 -0
  5. package/dist/accent-colors.js +122 -0
  6. package/dist/action-ledger.d.ts +26 -0
  7. package/dist/action-ledger.js +75 -0
  8. package/dist/agent-fence.d.ts +42 -0
  9. package/dist/agent-fence.js +183 -0
  10. package/dist/agentconfig.d.ts +216 -0
  11. package/dist/agentconfig.js +454 -0
  12. package/dist/api-tokens.d.ts +16 -0
  13. package/dist/api-tokens.js +27 -0
  14. package/dist/approval-policy.d.ts +69 -0
  15. package/dist/approval-policy.js +137 -0
  16. package/dist/approval-rules-ui.d.ts +25 -0
  17. package/dist/approval-rules-ui.js +39 -0
  18. package/dist/assignment-adapters.d.ts +180 -0
  19. package/dist/assignment-adapters.js +239 -0
  20. package/dist/assignment-brief.d.ts +71 -0
  21. package/dist/assignment-brief.js +129 -0
  22. package/dist/assignment-delivery.d.ts +56 -0
  23. package/dist/assignment-delivery.js +160 -0
  24. package/dist/assignment-presentation.d.ts +26 -0
  25. package/dist/assignment-presentation.js +80 -0
  26. package/dist/assignment-status.d.ts +62 -0
  27. package/dist/assignment-status.js +152 -0
  28. package/dist/assignment-ui.d.ts +71 -0
  29. package/dist/assignment-ui.js +103 -0
  30. package/dist/assignment.d.ts +222 -0
  31. package/dist/assignment.js +399 -0
  32. package/dist/attest.d.ts +56 -0
  33. package/dist/attest.js +153 -0
  34. package/dist/backend.d.ts +97 -0
  35. package/dist/backend.js +166 -0
  36. package/dist/backup-ui.d.ts +22 -0
  37. package/dist/backup-ui.js +59 -0
  38. package/dist/backup.d.ts +84 -0
  39. package/dist/backup.js +421 -0
  40. package/dist/beads.d.ts +34 -0
  41. package/dist/beads.js +135 -0
  42. package/dist/bin.d.ts +2 -0
  43. package/dist/bin.js +22 -0
  44. package/dist/board.d.ts +150 -0
  45. package/dist/board.js +210 -0
  46. package/dist/boot-identity.d.ts +63 -0
  47. package/dist/boot-identity.js +99 -0
  48. package/dist/browser/THIRD_PARTY_NOTICES.txt +2295 -0
  49. package/dist/browser/workspace.css +4 -0
  50. package/dist/browser/workspace.js +225 -0
  51. package/dist/browser-crew.d.ts +11 -0
  52. package/dist/browser-crew.js +50 -0
  53. package/dist/browser-shell.d.ts +8 -0
  54. package/dist/browser-shell.js +60 -0
  55. package/dist/browser-workspace.d.ts +780 -0
  56. package/dist/browser-workspace.js +47 -0
  57. package/dist/budget-alerts.d.ts +19 -0
  58. package/dist/budget-alerts.js +46 -0
  59. package/dist/builder.d.ts +370 -0
  60. package/dist/builder.js +3262 -0
  61. package/dist/capscan.d.ts +35 -0
  62. package/dist/capscan.js +113 -0
  63. package/dist/chat-acceptance.d.ts +71 -0
  64. package/dist/chat-acceptance.js +120 -0
  65. package/dist/chat-actions.d.ts +265 -0
  66. package/dist/chat-actions.js +1273 -0
  67. package/dist/chat-channel.d.ts +109 -0
  68. package/dist/chat-channel.js +652 -0
  69. package/dist/chat-continuity.d.ts +32 -0
  70. package/dist/chat-continuity.js +317 -0
  71. package/dist/chat-controls.d.ts +113 -0
  72. package/dist/chat-controls.js +53 -0
  73. package/dist/chat-delivery-state.d.ts +159 -0
  74. package/dist/chat-delivery-state.js +309 -0
  75. package/dist/chat-delivery.d.ts +38 -0
  76. package/dist/chat-delivery.js +693 -0
  77. package/dist/chat-display.d.ts +1 -0
  78. package/dist/chat-display.js +18 -0
  79. package/dist/chat-evidence.d.ts +123 -0
  80. package/dist/chat-evidence.js +207 -0
  81. package/dist/chat-flow.d.ts +44 -0
  82. package/dist/chat-flow.js +215 -0
  83. package/dist/chat-inbox.d.ts +57 -0
  84. package/dist/chat-inbox.js +123 -0
  85. package/dist/chat-polish.d.ts +16 -0
  86. package/dist/chat-polish.js +135 -0
  87. package/dist/chat-review.d.ts +46 -0
  88. package/dist/chat-review.js +98 -0
  89. package/dist/chat-rooms.d.ts +123 -0
  90. package/dist/chat-rooms.js +216 -0
  91. package/dist/chat-task-actions.d.ts +44 -0
  92. package/dist/chat-task-actions.js +79 -0
  93. package/dist/check-progress.d.ts +51 -0
  94. package/dist/check-progress.js +290 -0
  95. package/dist/child-database.d.ts +12 -0
  96. package/dist/child-database.js +30 -0
  97. package/dist/claim.d.ts +688 -0
  98. package/dist/claim.js +1740 -0
  99. package/dist/cli.d.ts +137 -0
  100. package/dist/cli.js +1461 -0
  101. package/dist/codex-limits.d.ts +15 -0
  102. package/dist/codex-limits.js +145 -0
  103. package/dist/coding-context.d.ts +55 -0
  104. package/dist/coding-context.js +92 -0
  105. package/dist/coding-handoff.d.ts +57 -0
  106. package/dist/coding-handoff.js +277 -0
  107. package/dist/coding-provider.d.ts +72 -0
  108. package/dist/coding-provider.js +424 -0
  109. package/dist/coding-shipping-ui.d.ts +4 -0
  110. package/dist/coding-shipping-ui.js +12 -0
  111. package/dist/coding-types.d.ts +62 -0
  112. package/dist/coding-types.js +1 -0
  113. package/dist/coding-ui.d.ts +17 -0
  114. package/dist/coding-ui.js +364 -0
  115. package/dist/coding-update.d.ts +15 -0
  116. package/dist/coding-update.js +149 -0
  117. package/dist/coding-workspace.d.ts +124 -0
  118. package/dist/coding-workspace.js +768 -0
  119. package/dist/container-state.d.ts +5 -0
  120. package/dist/container-state.js +62 -0
  121. package/dist/containment.d.ts +197 -0
  122. package/dist/containment.js +559 -0
  123. package/dist/contest.d.ts +318 -0
  124. package/dist/contest.js +753 -0
  125. package/dist/control-setup.d.ts +35 -0
  126. package/dist/control-setup.js +40 -0
  127. package/dist/control-ui.d.ts +29 -0
  128. package/dist/control-ui.js +53 -0
  129. package/dist/controller-service.d.ts +1 -0
  130. package/dist/controller-service.js +19 -0
  131. package/dist/controller-supervisor.d.ts +30 -0
  132. package/dist/controller-supervisor.js +104 -0
  133. package/dist/converse.d.ts +304 -0
  134. package/dist/converse.js +849 -0
  135. package/dist/coordinator-proposals.d.ts +29 -0
  136. package/dist/coordinator-proposals.js +137 -0
  137. package/dist/coordinator.d.ts +186 -0
  138. package/dist/coordinator.js +447 -0
  139. package/dist/credentials-ui.d.ts +25 -0
  140. package/dist/credentials-ui.js +48 -0
  141. package/dist/daemon.d.ts +209 -0
  142. package/dist/daemon.js +604 -0
  143. package/dist/decision.d.ts +120 -0
  144. package/dist/decision.js +388 -0
  145. package/dist/demo.d.ts +55 -0
  146. package/dist/demo.js +992 -0
  147. package/dist/desktop-access.d.ts +28 -0
  148. package/dist/desktop-access.js +88 -0
  149. package/dist/desktop-bundle.d.ts +16 -0
  150. package/dist/desktop-bundle.js +74 -0
  151. package/dist/desktop-host.d.ts +54 -0
  152. package/dist/desktop-host.js +508 -0
  153. package/dist/desktop-update-gate.d.ts +12 -0
  154. package/dist/desktop-update-gate.js +91 -0
  155. package/dist/desktop-update-recovery.d.ts +14 -0
  156. package/dist/desktop-update-recovery.js +243 -0
  157. package/dist/desktop-update.d.ts +110 -0
  158. package/dist/desktop-update.js +740 -0
  159. package/dist/discord-api.d.ts +20 -0
  160. package/dist/discord-api.js +138 -0
  161. package/dist/discord-chat.d.ts +16 -0
  162. package/dist/discord-chat.js +381 -0
  163. package/dist/discord-settings.d.ts +7 -0
  164. package/dist/discord-settings.js +75 -0
  165. package/dist/discord.d.ts +10 -0
  166. package/dist/discord.js +169 -0
  167. package/dist/discover.d.ts +75 -0
  168. package/dist/discover.js +150 -0
  169. package/dist/dispatch.d.ts +100 -0
  170. package/dist/dispatch.js +311 -0
  171. package/dist/dispose.d.ts +161 -0
  172. package/dist/dispose.js +803 -0
  173. package/dist/email-settings.d.ts +34 -0
  174. package/dist/email-settings.js +50 -0
  175. package/dist/envelope.d.ts +47 -0
  176. package/dist/envelope.js +105 -0
  177. package/dist/evidence-pack.d.ts +185 -0
  178. package/dist/evidence-pack.js +258 -0
  179. package/dist/evidence.d.ts +345 -0
  180. package/dist/evidence.js +782 -0
  181. package/dist/exec.d.ts +285 -0
  182. package/dist/exec.js +1841 -0
  183. package/dist/exhaustion.d.ts +85 -0
  184. package/dist/exhaustion.js +141 -0
  185. package/dist/export-ui.d.ts +4 -0
  186. package/dist/export-ui.js +17 -0
  187. package/dist/export.d.ts +48 -0
  188. package/dist/export.js +305 -0
  189. package/dist/flow-actions.d.ts +77 -0
  190. package/dist/flow-actions.js +203 -0
  191. package/dist/flow-code.d.ts +50 -0
  192. package/dist/flow-code.js +159 -0
  193. package/dist/flow-draft.d.ts +38 -0
  194. package/dist/flow-draft.js +80 -0
  195. package/dist/flow-engine.d.ts +66 -0
  196. package/dist/flow-engine.js +416 -0
  197. package/dist/flow-insights.d.ts +95 -0
  198. package/dist/flow-insights.js +149 -0
  199. package/dist/flow-live.d.ts +24 -0
  200. package/dist/flow-live.js +150 -0
  201. package/dist/flow-people.d.ts +24 -0
  202. package/dist/flow-people.js +91 -0
  203. package/dist/flow-replies.d.ts +48 -0
  204. package/dist/flow-replies.js +113 -0
  205. package/dist/flow-scripts.d.ts +38 -0
  206. package/dist/flow-scripts.js +73 -0
  207. package/dist/flow-secrets.d.ts +13 -0
  208. package/dist/flow-secrets.js +45 -0
  209. package/dist/flow-sort.d.ts +82 -0
  210. package/dist/flow-sort.js +153 -0
  211. package/dist/flow-steps.d.ts +40 -0
  212. package/dist/flow-steps.js +408 -0
  213. package/dist/flow-triggers.d.ts +244 -0
  214. package/dist/flow-triggers.js +959 -0
  215. package/dist/flows-ui.d.ts +20 -0
  216. package/dist/flows-ui.js +175 -0
  217. package/dist/flows.d.ts +229 -0
  218. package/dist/flows.js +968 -0
  219. package/dist/fonts.d.ts +19 -0
  220. package/dist/fonts.js +19 -0
  221. package/dist/gaps.d.ts +35 -0
  222. package/dist/gaps.js +101 -0
  223. package/dist/gate-failure.d.ts +40 -0
  224. package/dist/gate-failure.js +66 -0
  225. package/dist/git.d.ts +54 -0
  226. package/dist/git.js +94 -0
  227. package/dist/google-mail.d.ts +58 -0
  228. package/dist/google-mail.js +151 -0
  229. package/dist/grant.d.ts +136 -0
  230. package/dist/grant.js +238 -0
  231. package/dist/graph.d.ts +164 -0
  232. package/dist/graph.js +383 -0
  233. package/dist/guides.d.ts +22 -0
  234. package/dist/guides.js +363 -0
  235. package/dist/held.d.ts +150 -0
  236. package/dist/held.js +799 -0
  237. package/dist/invoke.d.ts +112 -0
  238. package/dist/invoke.js +780 -0
  239. package/dist/issues.d.ts +41 -0
  240. package/dist/issues.js +131 -0
  241. package/dist/job-object-helper.ps1 +252 -0
  242. package/dist/jsonl-discriminants.d.ts +11 -0
  243. package/dist/jsonl-discriminants.js +93 -0
  244. package/dist/keys.d.ts +104 -0
  245. package/dist/keys.js +229 -0
  246. package/dist/kits-ui.d.ts +17 -0
  247. package/dist/kits-ui.js +46 -0
  248. package/dist/kits.d.ts +86 -0
  249. package/dist/kits.js +215 -0
  250. package/dist/knowledge-cli.d.ts +101 -0
  251. package/dist/knowledge-cli.js +92 -0
  252. package/dist/knowledge-ui.d.ts +24 -0
  253. package/dist/knowledge-ui.js +40 -0
  254. package/dist/lead-context.d.ts +8 -0
  255. package/dist/lead-context.js +56 -0
  256. package/dist/lead-follow.d.ts +22 -0
  257. package/dist/lead-follow.js +167 -0
  258. package/dist/lead-status.d.ts +75 -0
  259. package/dist/lead-status.js +285 -0
  260. package/dist/ledger-chain.d.ts +46 -0
  261. package/dist/ledger-chain.js +187 -0
  262. package/dist/ledger-csv.d.ts +4 -0
  263. package/dist/ledger-csv.js +11 -0
  264. package/dist/ledger-view.d.ts +24 -0
  265. package/dist/ledger-view.js +58 -0
  266. package/dist/limits-ui.d.ts +26 -0
  267. package/dist/limits-ui.js +67 -0
  268. package/dist/link.d.ts +72 -0
  269. package/dist/link.js +217 -0
  270. package/dist/live.d.ts +96 -0
  271. package/dist/live.js +366 -0
  272. package/dist/liveness.d.ts +30 -0
  273. package/dist/liveness.js +42 -0
  274. package/dist/log.d.ts +7 -0
  275. package/dist/log.js +25 -0
  276. package/dist/mailbox.d.ts +57 -0
  277. package/dist/mailbox.js +150 -0
  278. package/dist/maintenance.d.ts +11 -0
  279. package/dist/maintenance.js +35 -0
  280. package/dist/mate-cli.d.ts +52 -0
  281. package/dist/mate-cli.js +345 -0
  282. package/dist/mate-contract.d.ts +10 -0
  283. package/dist/mate-contract.js +30 -0
  284. package/dist/mate-doors.d.ts +69 -0
  285. package/dist/mate-doors.js +548 -0
  286. package/dist/mate-progress.d.ts +29 -0
  287. package/dist/mate-progress.js +121 -0
  288. package/dist/mate-tools.d.ts +94 -0
  289. package/dist/mate-tools.js +1878 -0
  290. package/dist/mate.d.ts +92 -0
  291. package/dist/mate.js +435 -0
  292. package/dist/mcp-connect.d.ts +103 -0
  293. package/dist/mcp-connect.js +252 -0
  294. package/dist/mcp.d.ts +27 -0
  295. package/dist/mcp.js +651 -0
  296. package/dist/memory-cli.d.ts +466 -0
  297. package/dist/memory-cli.js +111 -0
  298. package/dist/memory-pass.d.ts +160 -0
  299. package/dist/memory-pass.js +409 -0
  300. package/dist/metrics.d.ts +3 -0
  301. package/dist/metrics.js +56 -0
  302. package/dist/mobile-viewport.d.ts +3 -0
  303. package/dist/mobile-viewport.js +37 -0
  304. package/dist/model-catalog.d.ts +118 -0
  305. package/dist/model-catalog.js +376 -0
  306. package/dist/models-cli.d.ts +102 -0
  307. package/dist/models-cli.js +66 -0
  308. package/dist/models-ui.d.ts +34 -0
  309. package/dist/models-ui.js +68 -0
  310. package/dist/modes.d.ts +80 -0
  311. package/dist/modes.js +182 -0
  312. package/dist/monitoring-settings.d.ts +44 -0
  313. package/dist/monitoring-settings.js +173 -0
  314. package/dist/monitoring-ui.d.ts +20 -0
  315. package/dist/monitoring-ui.js +51 -0
  316. package/dist/monitoring.d.ts +34 -0
  317. package/dist/monitoring.js +221 -0
  318. package/dist/names.d.ts +67 -0
  319. package/dist/names.js +102 -0
  320. package/dist/observations.d.ts +40 -0
  321. package/dist/observations.js +211 -0
  322. package/dist/oidc.d.ts +71 -0
  323. package/dist/oidc.js +182 -0
  324. package/dist/onboard.d.ts +108 -0
  325. package/dist/onboard.js +325 -0
  326. package/dist/openrouter-models.d.ts +30 -0
  327. package/dist/openrouter-models.js +120 -0
  328. package/dist/operate.d.ts +118 -0
  329. package/dist/operate.js +11321 -0
  330. package/dist/peek-cli.d.ts +97 -0
  331. package/dist/peek-cli.js +215 -0
  332. package/dist/peek.d.ts +134 -0
  333. package/dist/peek.js +578 -0
  334. package/dist/phase-routing.d.ts +307 -0
  335. package/dist/phase-routing.js +658 -0
  336. package/dist/plan-auto.d.ts +14 -0
  337. package/dist/plan-auto.js +92 -0
  338. package/dist/plan.d.ts +186 -0
  339. package/dist/plan.js +401 -0
  340. package/dist/planner-source.d.ts +251 -0
  341. package/dist/planner-source.js +460 -0
  342. package/dist/planner.d.ts +75 -0
  343. package/dist/planner.js +992 -0
  344. package/dist/policy-ui.d.ts +20 -0
  345. package/dist/policy-ui.js +41 -0
  346. package/dist/policy.d.ts +111 -0
  347. package/dist/policy.js +231 -0
  348. package/dist/prepared-evidence.d.ts +16 -0
  349. package/dist/prepared-evidence.js +96 -0
  350. package/dist/pricing.d.ts +45 -0
  351. package/dist/pricing.js +77 -0
  352. package/dist/principal.d.ts +42 -0
  353. package/dist/principal.js +82 -0
  354. package/dist/probe.d.ts +46 -0
  355. package/dist/probe.js +79 -0
  356. package/dist/process-custody.d.ts +17 -0
  357. package/dist/process-custody.js +91 -0
  358. package/dist/process-liveness.d.ts +10 -0
  359. package/dist/process-liveness.js +81 -0
  360. package/dist/process-recovery-anchor.d.ts +75 -0
  361. package/dist/process-recovery-anchor.js +188 -0
  362. package/dist/process-recovery-coalition.d.ts +25 -0
  363. package/dist/process-recovery-coalition.js +105 -0
  364. package/dist/process-recovery-eligibility.d.ts +178 -0
  365. package/dist/process-recovery-eligibility.js +170 -0
  366. package/dist/process-recovery-native.d.ts +172 -0
  367. package/dist/process-recovery-native.js +592 -0
  368. package/dist/process-recovery-provenance.d.ts +163 -0
  369. package/dist/process-recovery-provenance.js +292 -0
  370. package/dist/process-recovery-services.d.ts +56 -0
  371. package/dist/process-recovery-services.js +191 -0
  372. package/dist/process-recovery-settlement.d.ts +32 -0
  373. package/dist/process-recovery-settlement.js +132 -0
  374. package/dist/process-recovery.d.ts +41 -0
  375. package/dist/process-recovery.js +91 -0
  376. package/dist/process-tree.d.ts +41 -0
  377. package/dist/process-tree.js +264 -0
  378. package/dist/project-access.d.ts +14 -0
  379. package/dist/project-access.js +34 -0
  380. package/dist/project-cli.d.ts +18 -0
  381. package/dist/project-cli.js +104 -0
  382. package/dist/project-delete-ui.d.ts +22 -0
  383. package/dist/project-delete-ui.js +48 -0
  384. package/dist/project-delete.d.ts +55 -0
  385. package/dist/project-delete.js +413 -0
  386. package/dist/project-knowledge.d.ts +111 -0
  387. package/dist/project-knowledge.js +241 -0
  388. package/dist/project-learning.d.ts +100 -0
  389. package/dist/project-learning.js +438 -0
  390. package/dist/project-memory.d.ts +81 -0
  391. package/dist/project-memory.js +264 -0
  392. package/dist/project-skills.d.ts +152 -0
  393. package/dist/project-skills.js +660 -0
  394. package/dist/project-tools.d.ts +219 -0
  395. package/dist/project-tools.js +796 -0
  396. package/dist/project.d.ts +61 -0
  397. package/dist/project.js +125 -0
  398. package/dist/prompt.d.ts +22 -0
  399. package/dist/prompt.js +72 -0
  400. package/dist/proof.d.ts +513 -0
  401. package/dist/proof.js +1140 -0
  402. package/dist/proposal.d.ts +82 -0
  403. package/dist/proposal.js +210 -0
  404. package/dist/provider-connection.d.ts +22 -0
  405. package/dist/provider-connection.js +98 -0
  406. package/dist/provider-limits.d.ts +35 -0
  407. package/dist/provider-limits.js +95 -0
  408. package/dist/provider.d.ts +279 -0
  409. package/dist/provider.js +935 -0
  410. package/dist/publish.d.ts +107 -0
  411. package/dist/publish.js +650 -0
  412. package/dist/pulls.d.ts +118 -0
  413. package/dist/pulls.js +240 -0
  414. package/dist/push.d.ts +95 -0
  415. package/dist/push.js +353 -0
  416. package/dist/quality.d.ts +8 -0
  417. package/dist/quality.js +6 -0
  418. package/dist/recipe-ui.d.ts +18 -0
  419. package/dist/recipe-ui.js +152 -0
  420. package/dist/recipes.d.ts +81 -0
  421. package/dist/recipes.js +332 -0
  422. package/dist/remote.d.ts +67 -0
  423. package/dist/remote.js +122 -0
  424. package/dist/render.d.ts +64 -0
  425. package/dist/render.js +587 -0
  426. package/dist/report-summary.d.ts +13 -0
  427. package/dist/report-summary.js +15 -0
  428. package/dist/repos.d.ts +65 -0
  429. package/dist/repos.js +277 -0
  430. package/dist/repository-context-ui.d.ts +2 -0
  431. package/dist/repository-context-ui.js +10 -0
  432. package/dist/repository-context.d.ts +67 -0
  433. package/dist/repository-context.js +376 -0
  434. package/dist/restart-certification.d.ts +134 -0
  435. package/dist/restart-certification.js +226 -0
  436. package/dist/result-actions.d.ts +28 -0
  437. package/dist/result-actions.js +270 -0
  438. package/dist/result-completion.d.ts +18 -0
  439. package/dist/result-completion.js +66 -0
  440. package/dist/result-review.d.ts +213 -0
  441. package/dist/result-review.js +430 -0
  442. package/dist/retention-ui.d.ts +12 -0
  443. package/dist/retention-ui.js +39 -0
  444. package/dist/retention.d.ts +72 -0
  445. package/dist/retention.js +288 -0
  446. package/dist/review-context.d.ts +243 -0
  447. package/dist/review-context.js +1043 -0
  448. package/dist/review-evidence.d.ts +33 -0
  449. package/dist/review-evidence.js +56 -0
  450. package/dist/reviewer.d.ts +97 -0
  451. package/dist/reviewer.js +202 -0
  452. package/dist/routine.d.ts +228 -0
  453. package/dist/routine.js +764 -0
  454. package/dist/runner.d.ts +266 -0
  455. package/dist/runner.js +399 -0
  456. package/dist/scan.d.ts +32 -0
  457. package/dist/scan.js +92 -0
  458. package/dist/scope.d.ts +695 -0
  459. package/dist/scope.js +1176 -0
  460. package/dist/scout-report.d.ts +42 -0
  461. package/dist/scout-report.js +108 -0
  462. package/dist/scout.d.ts +69 -0
  463. package/dist/scout.js +351 -0
  464. package/dist/serve.d.ts +313 -0
  465. package/dist/serve.js +21776 -0
  466. package/dist/session-brief.d.ts +8 -0
  467. package/dist/session-brief.js +24 -0
  468. package/dist/session-cli.d.ts +13 -0
  469. package/dist/session-cli.js +284 -0
  470. package/dist/session-contract.d.ts +183 -0
  471. package/dist/session-contract.js +122 -0
  472. package/dist/session-http.d.ts +19 -0
  473. package/dist/session-http.js +154 -0
  474. package/dist/session-server.d.ts +12 -0
  475. package/dist/session-server.js +37 -0
  476. package/dist/session-service.d.ts +22 -0
  477. package/dist/session-service.js +157 -0
  478. package/dist/setup-guide.d.ts +39 -0
  479. package/dist/setup-guide.js +93 -0
  480. package/dist/sign-in-guard.d.ts +45 -0
  481. package/dist/sign-in-guard.js +74 -0
  482. package/dist/skills-ui.d.ts +11 -0
  483. package/dist/skills-ui.js +58 -0
  484. package/dist/skills.d.ts +97 -0
  485. package/dist/skills.js +276 -0
  486. package/dist/slack-api.d.ts +55 -0
  487. package/dist/slack-api.js +229 -0
  488. package/dist/slack-chat.d.ts +28 -0
  489. package/dist/slack-chat.js +413 -0
  490. package/dist/slack-settings.d.ts +7 -0
  491. package/dist/slack-settings.js +75 -0
  492. package/dist/slack-state.d.ts +13 -0
  493. package/dist/slack-state.js +9 -0
  494. package/dist/slack.d.ts +13 -0
  495. package/dist/slack.js +167 -0
  496. package/dist/spend-ui.d.ts +28 -0
  497. package/dist/spend-ui.js +95 -0
  498. package/dist/spend.d.ts +142 -0
  499. package/dist/spend.js +313 -0
  500. package/dist/sqlite-runtime.d.ts +3 -0
  501. package/dist/sqlite-runtime.js +6 -0
  502. package/dist/sso-settings.d.ts +33 -0
  503. package/dist/sso-settings.js +103 -0
  504. package/dist/sso-ui.d.ts +22 -0
  505. package/dist/sso-ui.js +39 -0
  506. package/dist/storage.d.ts +15 -0
  507. package/dist/storage.js +84 -0
  508. package/dist/store.d.ts +7754 -0
  509. package/dist/store.js +23279 -0
  510. package/dist/structured-output.d.ts +58 -0
  511. package/dist/structured-output.js +103 -0
  512. package/dist/style-asset.d.ts +7 -0
  513. package/dist/style-asset.js +41 -0
  514. package/dist/subscription-chat.d.ts +46 -0
  515. package/dist/subscription-chat.js +275 -0
  516. package/dist/summary.d.ts +33 -0
  517. package/dist/summary.js +71 -0
  518. package/dist/supervisor.mjs +297 -0
  519. package/dist/surface.d.ts +63 -0
  520. package/dist/surface.js +352 -0
  521. package/dist/sync.d.ts +94 -0
  522. package/dist/sync.js +279 -0
  523. package/dist/task-composer.d.ts +13 -0
  524. package/dist/task-composer.js +52 -0
  525. package/dist/task-control.d.ts +165 -0
  526. package/dist/task-control.js +214 -0
  527. package/dist/task-outcome-cli.d.ts +10 -0
  528. package/dist/task-outcome-cli.js +92 -0
  529. package/dist/task-text.d.ts +30 -0
  530. package/dist/task-text.js +41 -0
  531. package/dist/team-cli.d.ts +15 -0
  532. package/dist/team-cli.js +618 -0
  533. package/dist/team-contract.d.ts +92 -0
  534. package/dist/team-contract.js +1 -0
  535. package/dist/team-http.d.ts +17 -0
  536. package/dist/team-http.js +144 -0
  537. package/dist/team-leads.d.ts +81 -0
  538. package/dist/team-leads.js +565 -0
  539. package/dist/team-runtime.d.ts +27 -0
  540. package/dist/team-runtime.js +264 -0
  541. package/dist/team-ui.d.ts +3 -0
  542. package/dist/team-ui.js +9 -0
  543. package/dist/team-updates.d.ts +8 -0
  544. package/dist/team-updates.js +57 -0
  545. package/dist/teammate-admin.d.ts +53 -0
  546. package/dist/teammate-admin.js +111 -0
  547. package/dist/teammate-desk.d.ts +60 -0
  548. package/dist/teammate-desk.js +154 -0
  549. package/dist/teammate-memory.d.ts +64 -0
  550. package/dist/teammate-memory.js +196 -0
  551. package/dist/teammate-question.d.ts +59 -0
  552. package/dist/teammate-question.js +175 -0
  553. package/dist/teammate-tools.d.ts +108 -0
  554. package/dist/teammate-tools.js +271 -0
  555. package/dist/teammate-week.d.ts +68 -0
  556. package/dist/teammate-week.js +132 -0
  557. package/dist/teammate-work.d.ts +76 -0
  558. package/dist/teammate-work.js +280 -0
  559. package/dist/teammates-ui.d.ts +20 -0
  560. package/dist/teammates-ui.js +166 -0
  561. package/dist/teammates.d.ts +180 -0
  562. package/dist/teammates.js +253 -0
  563. package/dist/teams-api.d.ts +33 -0
  564. package/dist/teams-api.js +204 -0
  565. package/dist/teams-chat.d.ts +26 -0
  566. package/dist/teams-chat.js +215 -0
  567. package/dist/teams-settings.d.ts +12 -0
  568. package/dist/teams-settings.js +57 -0
  569. package/dist/teams.d.ts +21 -0
  570. package/dist/teams.js +124 -0
  571. package/dist/telegram-flow.d.ts +49 -0
  572. package/dist/telegram-flow.js +110 -0
  573. package/dist/telegram-mate.d.ts +137 -0
  574. package/dist/telegram-mate.js +707 -0
  575. package/dist/telegram-progress.d.ts +14 -0
  576. package/dist/telegram-progress.js +129 -0
  577. package/dist/telegram-settings.d.ts +9 -0
  578. package/dist/telegram-settings.js +36 -0
  579. package/dist/telegram-status.d.ts +75 -0
  580. package/dist/telegram-status.js +265 -0
  581. package/dist/telegram-team.d.ts +85 -0
  582. package/dist/telegram-team.js +359 -0
  583. package/dist/telegram.d.ts +230 -0
  584. package/dist/telegram.js +1931 -0
  585. package/dist/templates.d.ts +65 -0
  586. package/dist/templates.js +118 -0
  587. package/dist/tool-launcher.d.ts +1 -0
  588. package/dist/tool-launcher.js +101 -0
  589. package/dist/tools-ui.d.ts +30 -0
  590. package/dist/tools-ui.js +40 -0
  591. package/dist/transitions-recipes.d.ts +1 -0
  592. package/dist/transitions-recipes.js +203 -0
  593. package/dist/tree-proof.d.ts +34 -0
  594. package/dist/tree-proof.js +58 -0
  595. package/dist/verification-evidence.d.ts +44 -0
  596. package/dist/verification-evidence.js +238 -0
  597. package/dist/version.d.ts +2 -0
  598. package/dist/version.js +10 -0
  599. package/dist/webhooks.d.ts +91 -0
  600. package/dist/webhooks.js +283 -0
  601. package/dist/work-index.d.ts +68 -0
  602. package/dist/work-index.js +384 -0
  603. package/dist/work-summary.d.ts +57 -0
  604. package/dist/work-summary.js +116 -0
  605. package/dist/workspace-motion.d.ts +4 -0
  606. package/dist/workspace-motion.js +133 -0
  607. package/dist/workspace-revision.d.ts +19 -0
  608. package/dist/workspace-revision.js +92 -0
  609. package/dist/workspace-ui.d.ts +204 -0
  610. package/dist/workspace-ui.js +411 -0
  611. package/dist/worktree-notices.d.ts +13 -0
  612. package/dist/worktree-notices.js +17 -0
  613. package/dist/worktree.d.ts +249 -0
  614. package/dist/worktree.js +720 -0
  615. package/package.json +122 -0
  616. package/scripts/canary-assertions.mjs +42 -0
  617. package/scripts/crash-canary.mjs +253 -0
  618. package/scripts/fixtures/crash-process.mjs +74 -0
  619. package/scripts/fixtures/pilot-scenarios.mjs +85 -0
  620. package/scripts/fixtures/restart-service.mjs +27 -0
  621. package/scripts/launchd-certification.mjs +143 -0
  622. package/scripts/pilot.mjs +121 -0
  623. package/scripts/proof-preflight.mjs +140 -0
  624. package/scripts/provider-canary.mjs +379 -0
  625. package/scripts/recovery-canary.mjs +135 -0
  626. package/scripts/restart-certification.mjs +98 -0
@@ -0,0 +1,97 @@
1
+ /**
2
+ * `toolroll peek` — the terminal multiplexer over live agents.
3
+ *
4
+ * One pane per open run: its task, worker, role, stage word, elapsed
5
+ * clock, and the tail of its live transcript (the same per-run file the
6
+ * console's run page follows: text the agent said and the kind of tool it
7
+ * reached for — never file contents, never a command line, credential
8
+ * shapes redacted at write). Digits focus one pane, `a` shows all, `q`
9
+ * leaves. No dependency: the screen is the alternate buffer and a
10
+ * handful of escape sequences. `--tmux` opens a real tmux session with one
11
+ * window per run for people who live there. Outside a TTY (or with
12
+ * `--json`) it prints one snapshot and exits — the same data, an envelope.
13
+ *
14
+ * Read-only by construction: nothing here writes to the store or the
15
+ * files; a peek is a look.
16
+ */
17
+ import type { Store } from "./store.js";
18
+ export declare const PEEK_TAIL_LINES = 400;
19
+ export type PeekPane = {
20
+ runId: number;
21
+ taskId: string;
22
+ title: string;
23
+ repo: string | null;
24
+ runner: string;
25
+ role: string;
26
+ provider: string;
27
+ model: string | null;
28
+ phase: string;
29
+ startedAt: string;
30
+ /** Tail of the live transcript, newest last. */
31
+ lines: string[];
32
+ /** Why the transcript is absent, when it is. */
33
+ transcript: "live" | "not-yet" | "replaced" | "unreadable";
34
+ };
35
+ type Tail = {
36
+ offset: number;
37
+ lines: string[];
38
+ state: PeekPane["transcript"];
39
+ };
40
+ /** Advance one run's tail from its offset; `replaced` resets visibly. */
41
+ export declare function advanceTail(root: string, runId: number, tail: Tail): Tail;
42
+ /** The stage word for a pane: the machine's own phase, or what precedes it. */
43
+ export declare function stageWord(run: {
44
+ phase: string | null;
45
+ model: string | null;
46
+ providerStartedAt: string | null;
47
+ }): string;
48
+ export declare function elapsedWords(startedAt: string, now: Date): string;
49
+ /** One snapshot of every live run — the envelope's body, and the TUI's first frame. */
50
+ export declare function snapshotLiveRuns(store: Store, root: string, now: Date, tails?: Map<number, Tail>): PeekPane[];
51
+ /**
52
+ * Compose one frame: panes stacked, each with a header and as many tail
53
+ * lines as its share of the rows allows; the focused pane takes the whole
54
+ * screen. Pure — the loop paints what this returns.
55
+ */
56
+ export declare function composeFrame(panes: PeekPane[], size: {
57
+ columns: number;
58
+ rows: number;
59
+ }, focus: number | null, now: Date): string;
60
+ export type PeekIo = {
61
+ stdout: NodeJS.WriteStream & {
62
+ columns?: number;
63
+ rows?: number;
64
+ };
65
+ stdin: NodeJS.ReadStream & {
66
+ setRawMode?: (raw: boolean) => void;
67
+ isRaw?: boolean;
68
+ };
69
+ };
70
+ /**
71
+ * Follow live runs until `q` (or, watching one run, until it finishes).
72
+ * Resolves with the exit code.
73
+ */
74
+ export declare function runPeek(store: Store, root: string, options: {
75
+ runId?: number;
76
+ io: PeekIo;
77
+ clock?: () => Date;
78
+ intervalMs?: number;
79
+ }): Promise<number>;
80
+ /**
81
+ * A real tmux session, one window per live run, each running `peek <run>`
82
+ * — for people who already live in tmux. The plane never becomes tmux's
83
+ * dependant: liveness stays in the store's leases, and this is a view.
84
+ */
85
+ export declare function openInTmux(panes: readonly PeekPane[], command: readonly string[], run: (file: string, args: readonly string[]) => Promise<{
86
+ code: number;
87
+ stderr: string;
88
+ }>, session?: string): Promise<{
89
+ ok: true;
90
+ windows: number;
91
+ } | {
92
+ ok: false;
93
+ message: string;
94
+ }>;
95
+ /** Hand the terminal to tmux and wait for it to come back. */
96
+ export declare function attachTmux(session?: string): Promise<number>;
97
+ export {};
@@ -0,0 +1,215 @@
1
+ /**
2
+ * `toolroll peek` — the terminal multiplexer over live agents.
3
+ *
4
+ * One pane per open run: its task, worker, role, stage word, elapsed
5
+ * clock, and the tail of its live transcript (the same per-run file the
6
+ * console's run page follows: text the agent said and the kind of tool it
7
+ * reached for — never file contents, never a command line, credential
8
+ * shapes redacted at write). Digits focus one pane, `a` shows all, `q`
9
+ * leaves. No dependency: the screen is the alternate buffer and a
10
+ * handful of escape sequences. `--tmux` opens a real tmux session with one
11
+ * window per run for people who live there. Outside a TTY (or with
12
+ * `--json`) it prints one snapshot and exits — the same data, an envelope.
13
+ *
14
+ * Read-only by construction: nothing here writes to the store or the
15
+ * files; a peek is a look.
16
+ */
17
+ import { spawn } from "node:child_process";
18
+ import { readLiveWindow } from "./live.js";
19
+ export const PEEK_TAIL_LINES = 400;
20
+ const ESC = "\u001b";
21
+ /** Advance one run's tail from its offset; `replaced` resets visibly. */
22
+ export function advanceTail(root, runId, tail) {
23
+ const read = readLiveWindow(root, runId, tail.offset);
24
+ if (!read.ok) {
25
+ if (read.reason === "replaced")
26
+ return { offset: 0, lines: ["[the live view was replaced — starting over]"], state: "replaced" };
27
+ return { ...tail, state: read.reason === "missing" ? (tail.lines.length === 0 ? "not-yet" : tail.state) : "unreadable" };
28
+ }
29
+ if (read.text === "")
30
+ return { ...tail, state: tail.lines.length === 0 ? "not-yet" : "live" };
31
+ const fresh = read.text.split("\n").filter(one => one !== "");
32
+ const lines = [...tail.lines, ...fresh].slice(-PEEK_TAIL_LINES);
33
+ return { offset: read.nextOffset, lines, state: "live" };
34
+ }
35
+ /** The stage word for a pane: the machine's own phase, or what precedes it. */
36
+ export function stageWord(run) {
37
+ if (run.phase !== null)
38
+ return run.phase.replace(/-/g, " ");
39
+ return run.providerStartedAt === null ? "preparing workspace" : "the agent is working";
40
+ }
41
+ export function elapsedWords(startedAt, now) {
42
+ const ms = Math.max(0, now.getTime() - new Date(startedAt).getTime());
43
+ const minutes = Math.floor(ms / 60_000);
44
+ const seconds = Math.floor((ms % 60_000) / 1000);
45
+ return minutes >= 60 ? `${Math.floor(minutes / 60)}h${String(minutes % 60).padStart(2, "0")}m` : `${minutes}m${String(seconds).padStart(2, "0")}s`;
46
+ }
47
+ /** One snapshot of every live run — the envelope's body, and the TUI's first frame. */
48
+ export function snapshotLiveRuns(store, root, now, tails = new Map()) {
49
+ const panes = [];
50
+ for (const run of store.liveRuns(now)) {
51
+ const previous = tails.get(run.id) ?? { offset: 0, lines: [], state: "not-yet" };
52
+ const tail = advanceTail(root, run.id, previous);
53
+ tails.set(run.id, tail);
54
+ panes.push({
55
+ runId: run.id,
56
+ taskId: run.taskId,
57
+ title: run.title,
58
+ repo: run.repo,
59
+ runner: run.runner,
60
+ role: run.role,
61
+ provider: run.provider,
62
+ model: run.model,
63
+ phase: stageWord(run),
64
+ startedAt: run.startedAt,
65
+ lines: tail.lines,
66
+ transcript: tail.state,
67
+ });
68
+ }
69
+ for (const id of [...tails.keys()]) {
70
+ if (!panes.some(one => one.runId === id))
71
+ tails.delete(id);
72
+ }
73
+ return panes;
74
+ }
75
+ // ---- the frame --------------------------------------------------------------
76
+ function fit(text, width) {
77
+ const chars = [...text];
78
+ if (chars.length <= width)
79
+ return text + " ".repeat(width - chars.length);
80
+ return chars.slice(0, Math.max(0, width - 1)).join("") + "…";
81
+ }
82
+ function header(pane, index, now, width, focused) {
83
+ const left = `${index + 1} · #${pane.runId} ${pane.title}`;
84
+ const right = `${pane.runner} · ${pane.role} · ${pane.phase} · ${elapsedWords(pane.startedAt, now)}`;
85
+ const room = Math.max(0, width - [...right].length - 1);
86
+ const line = `${fit(left, room)} ${right}`;
87
+ return `${ESC}[7m${focused ? `${ESC}[1m` : ""}${fit(line, width)}${ESC}[0m`;
88
+ }
89
+ /**
90
+ * Compose one frame: panes stacked, each with a header and as many tail
91
+ * lines as its share of the rows allows; the focused pane takes the whole
92
+ * screen. Pure — the loop paints what this returns.
93
+ */
94
+ export function composeFrame(panes, size, focus, now) {
95
+ const columns = Math.max(20, size.columns);
96
+ const rows = Math.max(4, size.rows);
97
+ const footer = `${ESC}[2m${fit(panes.length === 0 ? "no agent is working right now — q leaves" : `${panes.length} live · 1-${Math.min(9, panes.length)} focus · a all · q leaves`, columns)}${ESC}[0m`;
98
+ const shown = focus !== null && panes[focus] !== undefined ? [panes[focus]] : panes;
99
+ const out = [];
100
+ if (shown.length === 0) {
101
+ out.push(fit("", columns));
102
+ out.push(fit(" nothing to peek at: no run is open.", columns));
103
+ for (let i = out.length; i < rows - 1; i += 1)
104
+ out.push(fit("", columns));
105
+ out.push(footer);
106
+ return out.join("\n");
107
+ }
108
+ const body = rows - 1;
109
+ const share = Math.max(2, Math.floor(body / shown.length));
110
+ for (const [i, pane] of shown.entries()) {
111
+ const index = focus !== null && panes[focus] !== undefined ? focus : i;
112
+ const height = i === shown.length - 1 ? body - share * (shown.length - 1) : share;
113
+ out.push(header(pane, index, now, columns, focus !== null));
114
+ const lines = pane.lines.length === 0
115
+ ? [pane.transcript === "not-yet" ? " (no transcript yet — the agent has not spoken)" : pane.transcript === "unreadable" ? " (the live file could not be read)" : " …"]
116
+ : pane.lines.slice(-(height - 1)).map(one => ` ${one}`);
117
+ for (let r = 0; r < height - 1; r += 1)
118
+ out.push(fit(lines[r] ?? "", columns));
119
+ }
120
+ while (out.length < rows - 1)
121
+ out.push(fit("", columns));
122
+ out.push(footer);
123
+ return out.slice(0, rows).join("\n");
124
+ }
125
+ /**
126
+ * Follow live runs until `q` (or, watching one run, until it finishes).
127
+ * Resolves with the exit code.
128
+ */
129
+ export async function runPeek(store, root, options) {
130
+ const { io } = options;
131
+ const clock = options.clock ?? (() => new Date());
132
+ const tails = new Map();
133
+ let focus = null;
134
+ let stop = false;
135
+ let finishedWord = null;
136
+ const paint = () => {
137
+ const now = clock();
138
+ let panes = snapshotLiveRuns(store, root, now, tails);
139
+ if (options.runId !== undefined) {
140
+ panes = panes.filter(one => one.runId === options.runId);
141
+ if (panes.length === 0 && finishedWord === null) {
142
+ const run = store.getRun(options.runId);
143
+ finishedWord = run === null ? "no such run" : `run #${options.runId} finished: ${run.outcome ?? "?"}${run.reason === null ? "" : ` (${run.reason})`}`;
144
+ stop = true;
145
+ }
146
+ }
147
+ const size = { columns: io.stdout.columns ?? 100, rows: io.stdout.rows ?? 30 };
148
+ io.stdout.write(`${ESC}[H${composeFrame(panes, size, options.runId !== undefined ? null : focus, now)}`);
149
+ };
150
+ const wasRaw = io.stdin.isRaw === true;
151
+ io.stdout.write(`${ESC}[?1049h${ESC}[?25l${ESC}[2J`);
152
+ io.stdin.setRawMode?.(true);
153
+ io.stdin.resume();
154
+ const onKey = (chunk) => {
155
+ for (const ch of chunk.toString("utf8")) {
156
+ if (ch === "q" || ch === "\u0003")
157
+ stop = true;
158
+ else if (ch === "a")
159
+ focus = null;
160
+ else if (ch >= "1" && ch <= "9")
161
+ focus = Number(ch) - 1;
162
+ }
163
+ };
164
+ io.stdin.on("data", onKey);
165
+ const onResize = () => paint();
166
+ io.stdout.on("resize", onResize);
167
+ try {
168
+ paint();
169
+ while (!stop) {
170
+ await new Promise(resolve => setTimeout(resolve, options.intervalMs ?? 500));
171
+ paint();
172
+ }
173
+ }
174
+ finally {
175
+ io.stdin.removeListener("data", onKey);
176
+ io.stdout.removeListener("resize", onResize);
177
+ io.stdin.setRawMode?.(wasRaw);
178
+ io.stdin.pause();
179
+ io.stdout.write(`${ESC}[?25h${ESC}[?1049l`);
180
+ if (finishedWord !== null)
181
+ io.stdout.write(`${finishedWord}\n`);
182
+ }
183
+ return 0;
184
+ }
185
+ // ---- tmux -------------------------------------------------------------------
186
+ /**
187
+ * A real tmux session, one window per live run, each running `peek <run>`
188
+ * — for people who already live in tmux. The plane never becomes tmux's
189
+ * dependant: liveness stays in the store's leases, and this is a view.
190
+ */
191
+ export async function openInTmux(panes, command, run, session = "toolroll") {
192
+ if (panes.length === 0)
193
+ return { ok: false, message: "no run is open — nothing to open a window for" };
194
+ const probe = await run("tmux", ["-V"]);
195
+ if (probe.code !== 0)
196
+ return { ok: false, message: "tmux is not installed (or not on PATH) — `toolroll peek` without --tmux needs nothing" };
197
+ const shellWord = (part) => `'${part.replace(/'/g, "'\\''")}'`;
198
+ const commandFor = (runId) => [...command, "peek", String(runId)].map(shellWord).join(" ");
199
+ const [first, ...rest] = panes;
200
+ const made = await run("tmux", ["new-session", "-d", "-s", session, "-n", first.taskId, commandFor(first.runId)]);
201
+ if (made.code !== 0)
202
+ return { ok: false, message: `tmux new-session: ${made.stderr.trim() || "refused"} — a session named ${session} may already exist (\`tmux attach -t ${session}\`)` };
203
+ for (const pane of rest) {
204
+ await run("tmux", ["new-window", "-t", session, "-n", pane.taskId, commandFor(pane.runId)]);
205
+ }
206
+ return { ok: true, windows: panes.length };
207
+ }
208
+ /** Hand the terminal to tmux and wait for it to come back. */
209
+ export function attachTmux(session = "toolroll") {
210
+ return new Promise(resolve => {
211
+ const child = spawn("tmux", ["attach", "-t", session], { stdio: "inherit" });
212
+ child.on("exit", code => resolve(code ?? 0));
213
+ child.on("error", () => resolve(1));
214
+ });
215
+ }
package/dist/peek.d.ts ADDED
@@ -0,0 +1,134 @@
1
+ /**
2
+ * The live peek's NATIVE reader (attended finding 7, CRITICAL): the whole
3
+ * point of this module is what it does not do. No git invocation ever has
4
+ * the agent's worktree as its working tree; nothing here consults
5
+ * gitattributes, hooks, clean/process filters, or external diff drivers —
6
+ * the mechanisms finding 7 proved can execute repository-configured
7
+ * commands. Change detection is a git-blob sha1 computed IN PROCESS against
8
+ * the frozen base tree; the diff is a line-based Myers implemented here.
9
+ *
10
+ * Two layers, deliberately separated: the PURE core (sha1, diff, parsers,
11
+ * aggregation — bytes in, structures out) and ONE I/O function,
12
+ * observeWorktree — descriptor-DISCIPLINED, not descriptor-confined: Node
13
+ * has no openat, so traversal is by pathname and a same-UID attacker
14
+ * renaming ancestors mid-walk can misdirect it (round-3 finding 44 owns
15
+ * the honest disclosure). What IS held: files open O_NOFOLLOW|O_NONBLOCK
16
+ * and must fstat as regular files on the root's device before a byte is
17
+ * read; reads go through that descriptor, bounded to the accepted size,
18
+ * with growth re-checked after; directories must prove the root's device
19
+ * before descent; symlinks are never followed; `.git` is never entered;
20
+ * every cap is explicit; unreadable corners make the look PARTIAL rather
21
+ * than silently narrower. Guarding, caching, and serving stay with their
22
+ * owners (serve.ts).
23
+ */
24
+ /** git's own blob identity: sha1 over "blob <len>\0" + bytes. Computing it
25
+ * here is what lets change detection never ask git about a working tree. */
26
+ export declare function gitBlobSha1(bytes: Buffer): string;
27
+ /** git's heuristic, near enough: a NUL in the first 8 KiB means binary —
28
+ * named on the page, never diffed. */
29
+ export declare function looksBinary(bytes: Buffer): boolean;
30
+ export type Hunk = {
31
+ aStart: number;
32
+ aLines: number;
33
+ bStart: number;
34
+ bLines: number;
35
+ /** Prefixed lines: " ctx", "-old", "+new" — exactly unified-diff shape. */
36
+ lines: string[];
37
+ };
38
+ /**
39
+ * Line-based Myers (the O(ND) greedy walk), bounded by the caller's caps —
40
+ * inputs beyond the byte caps never reach here. Returns unified hunks with
41
+ * three lines of context, or null when the edit distance exceeds `maxD`
42
+ * (a rewrite is not usefully rendered as a diff — the caller says so).
43
+ */
44
+ export declare function diffLines(aText: string, bText: string, maxD?: number): Hunk[] | null;
45
+ /** Render hunks as a unified patch body for one file, capped in bytes.
46
+ * The cap drops the incomplete final line (finding 9), and says so. */
47
+ export declare function renderUnified(path: string, hunks: Hunk[], capBytes: number): {
48
+ text: string;
49
+ truncated: boolean;
50
+ };
51
+ /**
52
+ * New-file readability WITHOUT suppression (round-1 finding 19: ignore
53
+ * parsing is gone — a pattern match can HIDE a name, and patterns are
54
+ * agent-influencable). Aggregation only: a first path segment holding more
55
+ * than `groupAt` new files collapses to one row stating its exact count;
56
+ * everything else lists; the row cap saturates with exact totals. No name
57
+ * is ever dropped silently — the numbers always add up.
58
+ */
59
+ export type NewFileRow = {
60
+ label: string;
61
+ count: number;
62
+ collapsed: boolean;
63
+ };
64
+ export declare function aggregateNewNames(paths: readonly string[], groupAt?: number, rowCap?: number): {
65
+ rows: NewFileRow[];
66
+ total: number;
67
+ renderedFiles: number;
68
+ };
69
+ /**
70
+ * The base-tree snapshot parser (round-1 finding 15's demands, applied to
71
+ * OUR OWN format anyway): every entry is proved shaped before use —
72
+ * relative path with no dot-dot/backslash/control bytes, a known mode,
73
+ * a 40-hex sha, a bounded non-negative size. Anything else refuses the
74
+ * whole snapshot; a partial base is not a base.
75
+ */
76
+ export type BaseTreeEntry = {
77
+ path: string;
78
+ mode: string;
79
+ sha: string;
80
+ size: number;
81
+ };
82
+ /**
83
+ * The enveloped snapshot document (round-2 finding 26): entries alone are
84
+ * not a snapshot — the envelope binds schema version, repository, run, and
85
+ * the exact base OID, and the CONSUMER (not readVerifiedArtifact) proves
86
+ * those against the run row plus capture_status/truncated before any walk.
87
+ */
88
+ export type BaseTreeSnapshot = {
89
+ repo: string;
90
+ run: number;
91
+ base: string;
92
+ entries: BaseTreeEntry[];
93
+ };
94
+ export declare function encodeBaseTreeSnapshot(snapshot: BaseTreeSnapshot): string;
95
+ export declare function parseBaseTreeSnapshot(json: string, entryCap?: number): BaseTreeSnapshot | null;
96
+ export declare function parseBaseTree(json: string, entryCap?: number): BaseTreeEntry[] | null;
97
+ export type PeekLimits = {
98
+ /** Walk abandons past this many entries — a typed refusal, not a guess. */
99
+ maxEntries: number;
100
+ /** Combined cap across changed+deleted+unchecked rows (finding 38). */
101
+ maxRows: number;
102
+ /** Files larger than this are compared by size only, and say so. */
103
+ maxFileBytes: number;
104
+ /** Total bytes hashed per observation; past it, remaining files go unverified. */
105
+ maxHashedBytes: number;
106
+ /** Wall budget, checked between files — over it, a partial look, never a hang. */
107
+ deadlineMs: number;
108
+ };
109
+ export declare const PEEK_LIMITS: PeekLimits;
110
+ export type PeekRow = {
111
+ kind: "changed" | "deleted" | "unchecked";
112
+ path: string;
113
+ detail: string;
114
+ };
115
+ export type Observation = {
116
+ ok: true;
117
+ rows: PeekRow[];
118
+ newPaths: string[];
119
+ /** Non-null when the look is partial, saying why in plain words. */
120
+ partial: string | null;
121
+ scanned: number;
122
+ } | {
123
+ ok: false;
124
+ reason: string;
125
+ };
126
+ /**
127
+ * One best-effort observation of a working tree against its frozen base
128
+ * (v2 brief §2). Descriptor-confined throughout: directories via opendir
129
+ * handles, files via O_NOFOLLOW descriptors, sizes from fstat on the OPEN
130
+ * descriptor (never a path-racy stat), bytes hashed through the same
131
+ * descriptor. Symlinks are typed by lstat-equivalent dirent info and never
132
+ * opened. Nothing here writes, spawns, or evaluates anything.
133
+ */
134
+ export declare function observeWorktree(root: string, base: readonly BaseTreeEntry[], limits?: PeekLimits): Promise<Observation>;