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,258 @@
1
+ /**
2
+ * v103: a change's evidence pack. It is everything an auditor asks about one
3
+ * piece of work, in one place: who asked for it, the exact terms and who
4
+ * approved them (under which rules), which agents ran and what they cost,
5
+ * what changed, the checks, who marked it complete, where it was published,
6
+ * and every ledger entry about it with its seal. JSON for tools; the same
7
+ * facts as a printable page for people.
8
+ *
9
+ * Each ledger entry carries its seal (`prev`, `hash`), so anyone can
10
+ * recompute it; the chain report and the latest checkpoint tie those
11
+ * entries to the whole ledger.
12
+ */
13
+ import { createHash } from "node:crypto";
14
+ import { rulesWords } from "./approval-policy.js";
15
+ import { assignmentOf } from "./assignment.js";
16
+ import { projectName } from "./project.js";
17
+ import { changedFilesOf } from "./result-completion.js";
18
+ export const EVIDENCE_PACK_FORMAT = "standing-orders/evidence-pack/v1";
19
+ /** How to recheck one entry's seal, for whoever reads the JSON. */
20
+ export const SEAL_RECIPE = 'hash = sha256(prev + "\\n" + JSON.stringify([id, at, actor, repo, taskId, runId, action, outcome, source, detail]))';
21
+ /** A pack carries up to this many of the task's own entries, and the newest this many requests made about it. */
22
+ const MAX_ENTRIES = 5000;
23
+ const MAX_REQUESTS = 500;
24
+ /** The pack for one task (the whole family: the task and every revision), as `who` may see it. null when they can't. */
25
+ export function evidencePack(store, taskId, access, who, now, evidenceRoot, checked) {
26
+ const family = store.taskFamilyOf(taskId, access.repos, access.principal === "operator" && access.includeUnplaced === true);
27
+ if (family === null)
28
+ return null;
29
+ const chain = checked ?? store.ledgerChain();
30
+ const repo = family.root.repo;
31
+ const versions = family.versions.map(version => {
32
+ const scope = store.getScope(version.id);
33
+ const history = store.scopeHistory(version.id);
34
+ const runs = store.runsFor(version.refId).map(run => {
35
+ const artifacts = store.artifactsFor(run.id);
36
+ const diff = artifacts.find(one => one.kind === "diff");
37
+ const proof = store.proofVerdictFor(run.id);
38
+ const publication = store.publicationForRun(run.id);
39
+ const builds = run.role === "builder" || run.role === "repair";
40
+ return {
41
+ id: run.id, role: run.role, agent: run.provider, model: run.model, outcome: run.outcome, reason: run.reason,
42
+ base: run.baseRevision, head: run.headRevision, startedAt: run.startedAt, finishedAt: run.finishedAt,
43
+ tokensIn: run.tokensIn, tokensOut: run.tokensOut, costUsd: run.costUsd,
44
+ changedFiles: builds && artifacts.some(one => one.kind === "diff-stat") ? changedFilesOf(store, run.id, evidenceRoot) : builds ? null : [],
45
+ diff: diff === undefined ? null : { sha256: diff.sha256, bytes: diff.bytesOriginal, complete: !diff.truncated && !diff.redacted },
46
+ proof: proof === null ? null : { verdict: proof.verdict, decidedAt: proof.decidedAt, reasons: proof.reasons },
47
+ publication: publication === null ? null : { repo: publication.githubRepo, branch: publication.head, commit: publication.headSha, state: publication.state,
48
+ pr: publication.prNumber, url: publication.prUrl, remoteState: publication.remoteState, checks: publication.lastCheckState },
49
+ };
50
+ });
51
+ return {
52
+ id: version.id, title: version.title, state: version.state, filedAt: version.createdAt, filedBy: store.taskFiler(version.id),
53
+ scope: scope === null ? null : {
54
+ goal: scope.goal, outOfScope: scope.outOfScope, touches: scope.touches, acceptance: scope.acceptance.map(one => ({ id: one.id, statement: one.statement })),
55
+ budgetUsd: scope.budgetMicrousd === null ? null : scope.budgetMicrousd / 1_000_000, digest: scope.digest,
56
+ approved: scope.approvedBy === null || scope.approvedAt === null || scope.approvedDigest === null ? null
57
+ : { by: scope.approvedBy, at: scope.approvedAt, digest: scope.approvedDigest, basis: scope.approvalBasis === "mode" ? "mode" : "person", current: scope.approvedDigest === scope.digest },
58
+ writtenBy: history.authors,
59
+ approvals: history.votes,
60
+ },
61
+ runs,
62
+ };
63
+ });
64
+ const assignment = assignmentOf(store, family.current.id, now, access, evidenceRoot);
65
+ const receipt = assignment?.receipt ?? null;
66
+ const runIds = versions.flatMap(version => version.runs.map(run => run.id));
67
+ const { entries, truncated } = store.taskLedgerEntries({ taskIds: family.versions.map(version => version.id), runIds }, { entries: MAX_ENTRIES, requests: MAX_REQUESTS });
68
+ const allRuns = versions.flatMap(version => version.runs);
69
+ const sum = (pick) => allRuns.reduce((total, run) => total + (pick(run) ?? 0), 0);
70
+ const latest = store.ledgerCheckpoints(1)[0] ?? null;
71
+ const rules = repo === null ? null : store.approvalRules(repo);
72
+ const body = {
73
+ format: EVIDENCE_PACK_FORMAT,
74
+ generatedAt: now.toISOString(),
75
+ generatedBy: who,
76
+ task: { id: family.root.id, title: family.current.title, state: family.current.state, repo, project: repo === null ? null : projectName(repo), filedAt: family.root.createdAt },
77
+ rules: repo === null || rules === null ? null : {
78
+ now: rulesWords(rules),
79
+ changes: store.actionLedger({ repos: [repo], source: "policy", limit: 101 }).filter(one => one.action === "approval rules changed").reverse()
80
+ .map(one => ({ id: one.id, at: one.at, by: one.actor, change: one.detail })),
81
+ },
82
+ versions,
83
+ result: receipt === null ? null : {
84
+ runId: receipt.runId, base: receipt.base, head: receipt.head, kind: receipt.completionKind,
85
+ checks: { status: receipt.checks.status, command: receipt.checks.command, exitCode: receipt.checks.exitCode, detail: receipt.checks.detail },
86
+ completedBy: assignment?.completion?.actor ?? null, completedAt: assignment?.completion?.at ?? null, caveats: receipt.caveats,
87
+ publication: assignment?.publication ?? null,
88
+ },
89
+ totals: { runs: allRuns.length, costUsd: Math.round(sum(run => run.costUsd) * 1e6) / 1e6, tokensIn: sum(run => run.tokensIn), tokensOut: sum(run => run.tokensOut) },
90
+ ledger: {
91
+ entries,
92
+ truncated,
93
+ chain: { ok: chain.ok, entries: chain.entries, through: chain.through, head: chain.head, problem: chain.problem?.what ?? null, checkedAt: chain.checkedAt },
94
+ checkpoint: latest === null ? null : { through: latest.through, hash: latest.hash, at: latest.at },
95
+ recipe: SEAL_RECIPE,
96
+ },
97
+ };
98
+ return { ...body, digest: packDigest(body) };
99
+ }
100
+ export function packDigest(body) {
101
+ return createHash("sha256").update(JSON.stringify(body), "utf8").digest("hex");
102
+ }
103
+ /** A day as the export takes it (YYYY-MM-DD, UTC), or null. */
104
+ export function exportDay(value) {
105
+ if (value === null || !/^\d{4}-\d{2}-\d{2}$/.test(value))
106
+ return null;
107
+ const day = new Date(`${value}T00:00:00.000Z`);
108
+ return Number.isNaN(day.getTime()) || day.toISOString().slice(0, 10) !== value ? null : day.toISOString();
109
+ }
110
+ const EXPORT_ENTRIES = 100_000;
111
+ /** Entries per piece of an export: small enough that a slow, steady reader finishes each well inside the server's minute. */
112
+ const EXPORT_PAGE = 250;
113
+ const EXPORT_PACKS = 200;
114
+ /** Every ledger entry in [from, to) that `who` may read, sealed, with a pack for each task they name: one JSON
115
+ * document (a `LedgerExport`), a piece at a time (a page of entries, or one pack), so an export never holds
116
+ * the whole range at once. */
117
+ export function* ledgerExportChunks(store, range, scope, access, who, now, evidenceRoot) {
118
+ // An export is the record someone takes away: the whole chain is walked for it (or was, within the last minute).
119
+ const chain = store.ledgerChain({ full: true, fresh: 60_000 });
120
+ const latest = store.ledgerCheckpoints(1)[0] ?? null;
121
+ const head = {
122
+ format: "standing-orders/ledger-export/v1", generatedAt: now.toISOString(), generatedBy: who, from: range.from, to: range.to,
123
+ chain: { ok: chain.ok, entries: chain.entries, through: chain.through, head: chain.head, problem: chain.problem?.what ?? null, checkedAt: chain.checkedAt },
124
+ checkpoint: latest === null ? null : { through: latest.through, hash: latest.hash, at: latest.at }, recipe: SEAL_RECIPE,
125
+ };
126
+ yield `${JSON.stringify(head).slice(0, -1)},"entries":[`;
127
+ const named = [];
128
+ const seen = new Set();
129
+ let after = 0, written = 0, moreEntries = false;
130
+ for (;;) {
131
+ const page = store.sealedLedgerEntries({ ...range, repos: scope.repos, instance: scope.instance, after, limit: EXPORT_PAGE });
132
+ const kept = page.slice(0, Math.min(EXPORT_PAGE, EXPORT_ENTRIES - written));
133
+ if (kept.length > 0)
134
+ yield `${written === 0 ? "" : ","}${kept.map(one => JSON.stringify(one)).join(",")}`;
135
+ written += kept.length;
136
+ for (const one of kept)
137
+ if (one.taskId !== null && !seen.has(one.taskId)) {
138
+ seen.add(one.taskId);
139
+ named.push(one.taskId);
140
+ }
141
+ if (page.length <= EXPORT_PAGE)
142
+ break;
143
+ if (written >= EXPORT_ENTRIES) {
144
+ moreEntries = true;
145
+ break;
146
+ }
147
+ after = kept.at(-1).id;
148
+ }
149
+ yield `],"packs":[`;
150
+ const packed = new Set();
151
+ let packs = 0, morePacks = false;
152
+ for (const taskId of named) {
153
+ if (packed.has(taskId))
154
+ continue;
155
+ const family = store.taskFamilyOf(taskId, access.repos, access.principal === "operator" && access.includeUnplaced === true);
156
+ if (family === null || packed.has(family.root.id)) {
157
+ packed.add(taskId);
158
+ continue;
159
+ }
160
+ for (const version of family.versions)
161
+ packed.add(version.id);
162
+ packed.add(family.root.id);
163
+ if (packs === EXPORT_PACKS) {
164
+ morePacks = true;
165
+ break;
166
+ }
167
+ const pack = evidencePack(store, family.root.id, access, who, now, evidenceRoot, chain);
168
+ if (pack === null)
169
+ continue;
170
+ yield `${packs === 0 ? "" : ","}${JSON.stringify(pack)}`;
171
+ packs++;
172
+ }
173
+ yield `],"truncated":${JSON.stringify({ entries: moreEntries, packs: morePacks })}}`;
174
+ }
175
+ // ---- The printable page -----------------------------------------------------
176
+ const e = (value) => String(value ?? "").replace(/[&<>"']/g, c => ({ "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;" })[c]);
177
+ const when = (at) => at === null ? "—" : `${e(at.slice(0, 16).replace("T", " "))} UTC`;
178
+ const short = (hash) => hash === null ? "—" : `<code title="${e(hash)}">${e(hash.slice(0, 12))}</code>`;
179
+ const usd = (value) => value === null ? "—" : `$${value.toFixed(value < 1 ? 4 : 2)}`;
180
+ /** Only a web address links; anything else (a stored value that isn't one) is shown as text. */
181
+ const link = (url) => /^https:\/\/[^\s"'<>]+$/.test(url) ? `<a href="${e(url)}">${e(url)}</a>` : e(url);
182
+ const filer = (who) => who === null || who.name === null ? "automation" : who.kind === "person" ? e(who.name) : `${e(who.name)} (${e(who.kind)})`;
183
+ export const EVIDENCE_PACK_CSS = `.evidence-pack{max-width:960px;min-width:0}.evidence-pack h1{margin:0}.evidence-pack h2{font-size:.9375rem;margin:24px 0 8px}.evidence-pack h3{font-size:.875rem;margin:16px 0 6px}` +
184
+ `.evidence-head{display:flex;justify-content:space-between;gap:12px;flex-wrap:wrap;align-items:baseline}.evidence-pack dl{display:grid;grid-template-columns:minmax(120px,180px) minmax(0,1fr);gap:4px 16px;margin:0}` +
185
+ `.evidence-pack dt{color:var(--muted-foreground);font-size:.8125rem}.evidence-pack dd{margin:0;min-width:0;overflow-wrap:anywhere}.evidence-pack table{width:100%;border-collapse:collapse;font-size:.8125rem}` +
186
+ `.evidence-pack th,.evidence-pack td{text-align:left;padding:5px 8px 5px 0;border-bottom:1px solid var(--border);vertical-align:top;overflow-wrap:anywhere}.evidence-pack th{font-weight:500;color:var(--muted-foreground)}` +
187
+ `.evidence-pack code{font-family:var(--font-mono);font-size:.75rem}.evidence-pack .files{margin:4px 0 0;padding-left:18px;font-family:var(--font-mono);font-size:.75rem}.evidence-pack .criteria{margin:0;padding-left:18px}.evidence-chain{font-size:.8125rem;margin:8px 0 0}` +
188
+ `.evidence-chain.ok strong{color:var(--success)}.evidence-table{overflow-x:auto}.evidence-foot{margin-top:24px;font-size:.75rem;color:var(--muted-foreground);overflow-wrap:anywhere}` +
189
+ `@media(max-width:600px){.evidence-pack dl{grid-template-columns:minmax(0,1fr)}.evidence-pack dd{margin-bottom:6px}}` +
190
+ `@media print{.side,.tabbar,.mobile-top,.scope-bar,.banner,.evidence-actions{display:none!important}body,.app,.content,.detail,main{background:#fff!important;color:#000!important;margin:0!important;padding:0!important;box-shadow:none!important;border:0!important}` +
191
+ `.evidence-pack{max-width:none}.evidence-pack section{break-inside:avoid-page}.evidence-pack a{color:#000;text-decoration:none}}`;
192
+ /** The pack as a page: the same facts, in the order an auditor reads them. No script. */
193
+ export function evidencePackHtml(pack) {
194
+ const task = pack.task;
195
+ const chain = pack.ledger.chain.ok
196
+ ? `<p class="evidence-chain ok" data-evidence-chain="ok"><strong>Ledger chain verified</strong> · ${pack.ledger.chain.entries} entries · head ${short(pack.ledger.chain.head)}${pack.ledger.chain.checkedAt === null ? "" : ` · checked in full ${when(pack.ledger.chain.checkedAt)}`}${pack.ledger.checkpoint === null ? "" : ` · last checkpoint at entry #${pack.ledger.checkpoint.through}`}</p>`
197
+ : `<p class="evidence-chain problem" role="alert" data-evidence-chain="broken"><strong>Ledger chain broken</strong> · ${e(pack.ledger.chain.problem)}</p>`;
198
+ const versions = pack.versions.map((version, index) => {
199
+ const scope = version.scope;
200
+ const approved = scope?.approved ?? null;
201
+ const approvals = scope === null ? [] : scope.approvals.filter(one => one.digest === (approved?.digest ?? scope.digest));
202
+ const rows = [
203
+ ["Filed", `${when(version.filedAt)} by ${filer(version.filedBy)}`],
204
+ ...(scope === null ? [["Scope", "None written"]] : [
205
+ ["Goal", e(scope.goal)],
206
+ ...(scope.touches.length ? [["Touches", scope.touches.map(e).join(", ")]] : []),
207
+ ...(scope.acceptance.length ? [["Acceptance", `<ol class="criteria">${scope.acceptance.map(one => `<li>${e(one.statement)}</li>`).join("")}</ol>`]] : []),
208
+ ...(scope.writtenBy.length ? [["Scope written by", [...new Set(scope.writtenBy.map(one => one.author))].map(e).join(", ")]] : []),
209
+ ["Approved", approved === null ? "Not approved" : `${e(approved.by)}${approved.basis === "mode" ? " (operating mode)" : ""} · ${when(approved.at)}${approved.current ? "" : " · the scope changed after this"}`],
210
+ ...(approvals.length > 1 ? [["Approvals", approvals.map(one => `${e(one.approver)} · ${when(one.at)}`).join("<br>")]] : []),
211
+ ["Scope digest", short(scope.digest)],
212
+ ]),
213
+ ];
214
+ const runs = version.runs.length === 0 ? `<p class="meta">No agent ran.</p>` :
215
+ `<div class="evidence-table"><table><thead><tr><th>Run</th><th>Role</th><th>Agent</th><th>Outcome</th><th>Cost</th><th>Finished</th><th>Commit</th></tr></thead><tbody>` +
216
+ version.runs.map(run => `<tr><td><a href="/r/${run.id}">#${run.id}</a></td><td>${e(run.role)}</td><td>${e(run.agent)}${run.model ? ` · ${e(run.model)}` : ""}</td><td>${e(run.outcome ?? "running")}</td><td>${usd(run.costUsd)}</td><td>${when(run.finishedAt)}</td><td>${short(run.head)}</td></tr>`).join("") +
217
+ `</tbody></table></div>`;
218
+ const changes = version.runs.filter(run => run.role === "builder" || run.role === "repair").map(run => `<p class="meta">Run #${run.id}${run.diff === null ? "" : ` · diff ${short(run.diff.sha256)}${run.diff.complete ? "" : " (partial)"}`}</p>` +
219
+ (run.changedFiles === null ? `<p class="meta">Its changed files couldn't be read.</p>` : run.changedFiles.length === 0 ? `<p class="meta">No files changed.</p>` : `<ul class="files">${run.changedFiles.map(file => `<li>${e(file)}</li>`).join("")}</ul>`)).join("");
220
+ return `<section data-evidence-version="${e(version.id)}"><h2>${pack.versions.length > 1 ? `${index === 0 ? "Request" : `Revision ${index}`} · ` : "Request and approval · "}${e(version.id)}</h2><dl>${rows.map(([label, value]) => `<dt>${label}</dt><dd>${value}</dd>`).join("")}</dl>` +
221
+ `<h3>Agents</h3>${runs}${changes === "" ? "" : `<h3>Changes</h3>${changes}`}</section>`;
222
+ }).join("");
223
+ const result = pack.result;
224
+ const outcome = result === null ? `<section><h2>Result</h2><p class="meta">No finished result yet.</p></section>` :
225
+ `<section data-evidence-result><h2>Result</h2><dl>` +
226
+ `<dt>Checks</dt><dd>${e(result.checks.detail)}${result.checks.command ? ` <code>${e(result.checks.command)}</code>` : ""}</dd>` +
227
+ `<dt>Marked complete</dt><dd>${result.completedBy === null ? "Not yet" : `${e(result.completedBy)} · ${when(result.completedAt)}`}</dd>` +
228
+ `<dt>Published</dt><dd>${result.publication === null ? "Not published" : `${e(result.publication.state)}${result.publication.prUrl ? ` · ${link(result.publication.prUrl)}` : ""}${result.publication.remoteState ? ` · ${e(result.publication.remoteState.toLowerCase())}` : ""}`}</dd>` +
229
+ `<dt>Commit</dt><dd>${short(result.base)} → ${short(result.head)}</dd>` +
230
+ (result.caveats.length ? `<dt>Caveats</dt><dd>${result.caveats.map(e).join("<br>")}</dd>` : "") +
231
+ `</dl></section>`;
232
+ const decisions = pack.ledger.entries.filter(one => one.source !== "request");
233
+ const requests = pack.ledger.entries.length - decisions.length;
234
+ const askedWords = `${requests} ${requests === 1 ? "request" : "requests"} made through the console (accepted or refused)`;
235
+ const ledger = `<section><h2>Ledger</h2>${decisions.length === 0 ? `<p class="meta">No entries.</p>` :
236
+ `<div class="evidence-table"><table><thead><tr><th>#</th><th>Time</th><th>Who</th><th>What</th><th>Outcome</th><th>Seal</th></tr></thead><tbody>` +
237
+ decisions.map(one => `<tr data-ledger-id="${one.id}"><td>${one.id}</td><td>${when(one.at)}</td><td>${e(one.actor)}</td><td>${e(one.action)}${one.detail ? `<br><span class="meta">${e(one.detail)}</span>` : ""}</td><td>${e(one.outcome)}</td><td>${short(one.seal?.hash ?? null)}</td></tr>`).join("") +
238
+ `</tbody></table></div>`}${requests > 0 ? `<p class="meta">Plus ${askedWords}, listed in the JSON.</p>` : ""}${pack.ledger.truncated ? `<p class="meta">This pack holds ${decisions.length} of the task's entries and the newest ${requests} requests; the ledger export has the rest.</p>` : ""}</section>`;
239
+ const cost = pack.totals.runs === 0 ? "None ran" : `${pack.totals.runs} ${pack.totals.runs === 1 ? "run" : "runs"} · ${usd(pack.totals.costUsd)}`;
240
+ // The rules as they stand, and each change to them (the approval above was under whichever applied then).
241
+ const rules = pack.rules === null ? "None" : `${e(pack.rules.now)}${pack.rules.changes.length === 0 ? "" :
242
+ `<ul class="criteria">${pack.rules.changes.slice(-5).map(one => `<li class="meta">${when(one.at)} · ${e(one.by)}: ${e(one.change)}</li>`).join("")}</ul>`}`;
243
+ return `<article class="evidence-pack" data-evidence-pack="${e(task.id)}">` +
244
+ `<div class="evidence-head"><h1>Evidence pack</h1><p class="evidence-actions"><a href="/t/${encodeURIComponent(task.id)}/evidence?format=json" download>Download JSON</a> · <a href="/t/${encodeURIComponent(task.id)}">Back to task</a></p></div>` +
245
+ `<p><strong>${e(task.title)}</strong></p>` +
246
+ `<dl><dt>Task</dt><dd>${e(task.id)}${task.project === null ? "" : ` · ${e(task.project)}`} · ${e(task.state)}</dd>` +
247
+ `<dt>Approval rules</dt><dd>${rules}</dd><dt>Agents</dt><dd>${cost}</dd>` +
248
+ `<dt>Prepared</dt><dd>${when(pack.generatedAt)} for ${e(pack.generatedBy)}</dd></dl>${chain}` +
249
+ versions + outcome + ledger +
250
+ `<p class="evidence-foot">Pack digest <code>${e(pack.digest)}</code>. Each ledger entry's seal can be rechecked from the JSON: ${e(pack.ledger.recipe)}.</p></article>`;
251
+ }
252
+ /** The page as a file on its own (the CLI's --html): the same facts with just enough style to print. */
253
+ export function standaloneEvidenceHtml(pack) {
254
+ return `<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><title>Evidence pack · ${e(pack.task.id)}</title>` +
255
+ `<style>:root{--muted-foreground:#5c5c5c;--border:#dedede;--success:#1a7f37;--font-mono:ui-monospace,SFMono-Regular,Menlo,monospace}` +
256
+ `body{font:14px/1.5 system-ui,-apple-system,sans-serif;margin:32px auto;padding:0 16px;max-width:960px;color:#171717;background:#fff}.meta{color:var(--muted-foreground);font-size:.8125rem}.evidence-actions{display:none}` +
257
+ EVIDENCE_PACK_CSS + `</style></head><body>${evidencePackHtml(pack)}</body></html>\n`;
258
+ }
@@ -0,0 +1,345 @@
1
+ /**
2
+ * Evidence: what actually happened, captured by the machine (§4, §7).
3
+ *
4
+ * The agent does not choose what counts as evidence — a diff the agent could
5
+ * fabricate is a screenshot of a different crime scene. At park time the
6
+ * builder captures the working state itself, relative to the base revision
7
+ * stamped before the agent spent anything, and records how each capture was
8
+ * made, whether it is complete, and what it hashes to. A truncated capture
9
+ * says truncated; a failed capture stores the failure. Presenting either as
10
+ * the whole story is the one dishonesty this module exists to rule out.
11
+ *
12
+ * Files live under the evidence root — outside every worktree, so an agent
13
+ * cannot pre-write them — created exclusively (`wx`) with mode 0600. The
14
+ * store holds keys relative to that root, never absolute paths.
15
+ */
16
+ import { type ParsedReport } from "./scout-report.js";
17
+ import { type ParsedProof } from "./proof.js";
18
+ import type { Artifact, Store } from "./store.js";
19
+ import type { ExecResult } from "./exec.js";
20
+ /** The park mailbox pattern. Each run's actual name carries a nonce; see `mailboxName`. */
21
+ export declare const MAILBOX_PREFIX = "STANDING-ORDERS-PARK-";
22
+ /** The terminal handoff: how every non-parking attempt says how it ended. */
23
+ export declare const HANDOFF_PREFIX = "STANDING-ORDERS-DONE-";
24
+ /** The planner's terminal handoff: the proposed scope and the plan document. */
25
+ export declare const PLAN_PREFIX = "STANDING-ORDERS-PLAN-";
26
+ /** The reviewer's former comment mailbox (v29–evidence-review-v1): the
27
+ * reviewer now replies in its final message and writes nothing, but the
28
+ * pattern stays recognized so a sweep still cleans up a stray file this
29
+ * name left by an older build. */
30
+ export declare const REVIEW_PREFIX = "STANDING-ORDERS-REVIEW-";
31
+ /** The scout's terminal handoff (v34): the report, its only deliverable. */
32
+ export declare const REPORT_PREFIX = "STANDING-ORDERS-REPORT-";
33
+ /** The build's proof manifest (Priority 2): optional, and read only after
34
+ * the handoff — a completed attempt's proof, never a parking or failure
35
+ * artifact. */
36
+ export declare const PROOF_PREFIX = "STANDING-ORDERS-PROOF-";
37
+ export declare const RUBRIC_PREFIX = "STANDING-ORDERS-RUBRIC-";
38
+ /** The running build's atomic milestone checkpoint (adaptive execution
39
+ * plans): overwritten in place — a temp name, then a rename — rather than
40
+ * created once and unlinked, since progress is reported many times across
41
+ * one attempt. Read, never consumed, by the pulse and by settlement. */
42
+ export declare const PROGRESS_PREFIX = "STANDING-ORDERS-PROGRESS-";
43
+ /** The running build's bounded, evidence-linked plan-revision proposal
44
+ * (adaptive execution plans): a terminal file like park or proof, written
45
+ * at most once, read once at settlement. */
46
+ export declare const PROPOSAL_PREFIX = "STANDING-ORDERS-PROPOSAL-";
47
+ export declare const MAILBOX_SUFFIX = ".json";
48
+ /** v105: left in a run's evidence folder when the retention setting removed its files (retention.ts). */
49
+ export declare const RETENTION_NOTE = "REMOVED-BY-RETENTION";
50
+ /** Bounds on a claimed screenshot file's own bytes — independent of the
51
+ * proof manifest's byte cap, since these are binary images, not JSON. */
52
+ export declare const SCREENSHOT_BYTE_CAP: number;
53
+ /** Bytes each kind may store. Originals can be any size; the record says what was cut. */
54
+ /** Bound one captured stream to `cap` bytes keeping its beginning and, mostly,
55
+ * its end: a test runner's summary and failure list come last, and that is
56
+ * what a reviewer or a repair needs to read. */
57
+ export declare const SHORTENED_MARKER = "\n\u2026 output shortened; ending follows \u2026\n";
58
+ export declare function boundStreamHeadTail(value: string, cap: number, headShare?: number): string;
59
+ export declare const EVIDENCE_CAPS: Record<Artifact["kind"], number>;
60
+ export declare function evidenceRoot(home: string): string;
61
+ /**
62
+ * Unpredictable per attempt, so nothing on disk before this build can already
63
+ * be the mailbox: a stale file, however it got there, simply has the wrong
64
+ * name. The agent learns the name from its brief and nowhere else.
65
+ */
66
+ export declare function mailboxName(): string;
67
+ export declare function looksLikeMailbox(name: string): boolean;
68
+ /** Every protocol file the sweep must never let an old attempt leave behind.
69
+ * The pre-rename NIGHTORDERS- prefix stays recognized here — a worktree cut
70
+ * down before 2026-08-13 may still hold one, and cleanup has no vintage. */
71
+ export declare function looksLikeProtocolFile(name: string): boolean;
72
+ export declare function handoffName(): string;
73
+ export declare function planFileName(): string;
74
+ /** The build's optional proof manifest (Priority 2), named exactly like
75
+ * every other protocol file — a nonce the agent learns only from its brief. */
76
+ export declare function proofFileName(): string;
77
+ export declare function rubricFileName(): string;
78
+ export declare function reportFileName(): string;
79
+ export declare function progressFileName(): string;
80
+ export declare function proposalFileName(): string;
81
+ /**
82
+ * Read a mailbox without following anything: the path must be a regular file,
83
+ * opened O_NOFOLLOW and measured through its own descriptor — an agent that
84
+ * made the pathname a symlink or FIFO gets a refusal, not a runner reading an
85
+ * unrelated local file into web-visible evidence.
86
+ */
87
+ export declare function readMailbox(path: string, cap?: number): {
88
+ ok: true;
89
+ raw: Buffer;
90
+ } | {
91
+ ok: false;
92
+ problem: string;
93
+ missing: boolean;
94
+ raw?: Buffer;
95
+ bytesOriginal?: number;
96
+ };
97
+ /** A scout's report as a surface reads it (mate arc §10): the newest
98
+ * scout run's artifact, VERIFIED before a byte is parsed, then parsed with
99
+ * the same 422 rule that admitted it. null = no report; a problem names
100
+ * why an existing artifact cannot be shown rather than showing nothing. */
101
+ export type ReportView = {
102
+ ok: true;
103
+ run: number;
104
+ report: ParsedReport;
105
+ } | {
106
+ ok: false;
107
+ run: number;
108
+ problem: string;
109
+ };
110
+ export declare function readVerifiedReport(store: Store, root: string, taskRef: number): ReportView | null;
111
+ /** A build's proof, read the same verified way as a scout's report — but
112
+ * keyed by RUN, not task: unlike a scout's report (the task's one rolling
113
+ * deliverable), a proof belongs to the one attempt whose page is showing
114
+ * it. null = no proof artifact for this run; a problem names why an
115
+ * existing one cannot be shown. */
116
+ export type ProofView = {
117
+ ok: true;
118
+ run: number;
119
+ proof: ParsedProof;
120
+ } | {
121
+ ok: false;
122
+ run: number;
123
+ problem: string;
124
+ };
125
+ /** Verifies this run's proof bytes and format. A handoff that relies on a
126
+ * revision's ancestors must also recheck its saved review-context custody. */
127
+ export declare function readVerifiedProofForRun(store: Store, root: string, runId: number): ProofView | null;
128
+ export declare function sniffImageKind(bytes: Buffer): "png" | "jpeg" | null;
129
+ /** Whether bytes claimed as a screenshot actually are a bounded PNG or
130
+ * JPEG — the one check standing between a claimed path and stored,
131
+ * immutable image evidence. */
132
+ export declare function validateScreenshotBytes(bytes: Buffer): {
133
+ ok: true;
134
+ kind: "png" | "jpeg";
135
+ } | {
136
+ ok: false;
137
+ problem: string;
138
+ };
139
+ /**
140
+ * Pixel dimensions read straight from the format's own header — never
141
+ * decoded, never trusting a claimed size (v39, screenshot evidence:
142
+ * "meaningful byte size and at least 320 by 200 dimensions"). `null` when
143
+ * the bytes are a valid signature but the header could not be read (a
144
+ * genuinely corrupt or truncated file) — the caller treats that the same
145
+ * as failing the size floor, never as passing it.
146
+ *
147
+ * PNG: the IHDR chunk is fixed at bytes 8-25 for every valid PNG — width
148
+ * and height are the two big-endian uint32s right after it starts.
149
+ *
150
+ * JPEG: scan markers from byte 2. Every marker except the two without a
151
+ * payload (SOI 0xD8, EOI 0xD9) and the RST markers (0xD0-0xD7) carries a
152
+ * two-byte big-endian length; the SOF markers (0xC0-0xCF, excluding the
153
+ * DHT/JPG/DAC markers 0xC4/0xC8/0xCC, which share the range but are not
154
+ * frame headers) hold precision(1) + height(2) + width(2) right after
155
+ * that length field.
156
+ */
157
+ export declare function imageDimensions(bytes: Buffer, kind: "png" | "jpeg"): {
158
+ width: number;
159
+ height: number;
160
+ } | null;
161
+ /**
162
+ * Write one evidence file and record it. The row is written through the
163
+ * store the caller passed — inside whatever transaction the caller holds.
164
+ */
165
+ export declare function storeEvidence(store: Store, root: string, runId: number, kind: Artifact["kind"], name: string, content: Buffer, capture: string, now: Date, options?: {
166
+ redacted?: boolean;
167
+ captureStatus?: "ok" | "failed";
168
+ sourceBytesOriginal?: number;
169
+ }): number;
170
+ /**
171
+ * Read an artifact's bytes back, believing nothing until it is proved on the
172
+ * descriptor actually read (§7's honesty, applied to serving). The record's
173
+ * key must be a normalized relative path; the resolved path must live under
174
+ * the root; the open refuses symlinks; the size and hash checks run against
175
+ * the same descriptor the bytes come from — so a pathname swapped between a
176
+ * check and the read buys an attacker nothing. Only a buffer whose SHA-256
177
+ * matches the row is ever returned: unverified bytes never leave this
178
+ * function, which is what lets a caller stream with a clear conscience.
179
+ * Success proves stored-byte integrity only. Callers must independently
180
+ * decide whether a shortened representation or failed capture is usable;
181
+ * a verified failure log is still a failure, not successful evidence.
182
+ */
183
+ export declare function readVerifiedArtifact(root: string, artifact: Artifact): {
184
+ ok: true;
185
+ content: Buffer;
186
+ } | {
187
+ ok: false;
188
+ problem: string;
189
+ };
190
+ /** The file alone, no row — quarantines use this; they belong to no live run. */
191
+ export declare function writeEvidenceFile(root: string, runId: number, name: string, content: Buffer): string;
192
+ /**
193
+ * Sweep every park-shaped file out of a worktree before the agent runs.
194
+ *
195
+ * A mailbox left by a cut-down attempt is never ingested as a decision — the
196
+ * lease that could have vouched for it is gone — but its bytes may still say
197
+ * what the agent meant, so what can be read safely is kept under quarantine
198
+ * in the current run's evidence directory. What cannot be read safely (a
199
+ * symlink, a FIFO, something oversized) is removed unread.
200
+ */
201
+ export declare function quarantineMailboxes(worktree: string, root: string | null, runId: number | null): string[];
202
+ /**
203
+ * Capture the park's evidence: the complete working state against the base
204
+ * revision, and the porcelain inventory that names what the diff cannot —
205
+ * untracked and staged files included. External diff drivers and textconv
206
+ * are disabled by name: both run repository-configured commands, and this
207
+ * capture must not execute anything the agent may have just written.
208
+ */
209
+ export declare function captureParkEvidence(store: Store, git: (file: string, args: readonly string[], options?: {
210
+ cwd?: string;
211
+ }) => Promise<ExecResult>, worktree: string, baseRevision: string | null, root: string, runId: number, now: Date): Promise<number[]>;
212
+ /** One file's row in the terminal diff-stat. null adds/dels = binary. */
213
+ export type DiffStatFile = {
214
+ path: string;
215
+ additions: number | null;
216
+ deletions: number | null;
217
+ renamedFrom?: string;
218
+ };
219
+ export type DiffStat = {
220
+ schema: 1;
221
+ base: string;
222
+ head: string;
223
+ fileCount: number;
224
+ additions: number;
225
+ deletions: number;
226
+ binaryCount: number;
227
+ files: DiffStatFile[];
228
+ /** True when the file list was cut to fit the cap — counts stay complete. */
229
+ filesTruncated: boolean;
230
+ };
231
+ /**
232
+ * Parse `git diff --numstat -z` output. NUL-delimited, so filenames are never
233
+ * guessed out of patch headers (Codex roadmap review, scope cut A.3): plain
234
+ * entries are one token "adds\tdels\tpath"; renames are "adds\tdels\t" with
235
+ * the two paths as the following tokens. Binary files carry "-" counts,
236
+ * recorded as null — never coerced to zero.
237
+ */
238
+ export declare function parseNumstat(raw: string, base: string, head: string): DiffStat;
239
+ /** The freshness-stamped handoff artifact's shape (M6.10). */
240
+ export type HandoffArtifact = {
241
+ schema: 1;
242
+ taskId: string;
243
+ runId: number;
244
+ provider: string;
245
+ /** v47: the exact model that ran, and the sealed route leg it ran as —
246
+ * provenance a later reader can hold against the approval. Absent on
247
+ * artifacts written before routes existed. */
248
+ model?: string;
249
+ route?: {
250
+ digest: string;
251
+ phase: "plan" | "build" | "repair" | "review";
252
+ provider: string;
253
+ model: string | null;
254
+ chosen: "recommended" | "override" | "pinned" | "legacy" | "fallback";
255
+ };
256
+ sessionId: string | null;
257
+ branch: string;
258
+ worktree: string;
259
+ base: string;
260
+ head: string;
261
+ outcome: "built" | "no-change";
262
+ committed: boolean;
263
+ /** Decision ids whose answers were in this run's brief — causality, not time. */
264
+ decisionsIncorporated: number[];
265
+ /** The agent's conclusion — agent-reported, and labeled so by its position here. */
266
+ conclusion: string;
267
+ /** Structured operator-facing output. Optional for artifacts written by
268
+ * older versions; readers treat absence as an empty list. */
269
+ changes?: string[];
270
+ verification?: string[];
271
+ followUps?: string[];
272
+ freshness: {
273
+ stampedAt: string;
274
+ /** A successor proves this against the branch before trusting anything above. */
275
+ currentAsOf: string;
276
+ };
277
+ };
278
+ /**
279
+ * Write the handoff artifact (M6.10): the machine's own statement of where
280
+ * a finished run left the world — workspace identity, exact base and head,
281
+ * which answered decisions the brief carried, and a freshness stamp a
282
+ * successor can PROVE against the branch before spending a token on stale
283
+ * context. This is what makes a cold takeover context-bearing rather than
284
+ * repo-only; a provider session is memory, not a freshness proof.
285
+ */
286
+ export declare function storeHandoffArtifact(store: Store, root: string, payload: HandoffArtifact, now: Date): number;
287
+ /**
288
+ * High-confidence secret shapes ONLY (audit IV-7): a detector that cries
289
+ * wolf trains people to approve wolves. Each pattern is a format no
290
+ * ordinary source line matches by accident; generic "password=" shapes
291
+ * are deliberately absent — test fixtures would drown the signal.
292
+ */
293
+ export declare const SECRET_PATTERNS: readonly {
294
+ name: string;
295
+ pattern: RegExp;
296
+ }[];
297
+ export type SecretHit = {
298
+ name: string;
299
+ line: number;
300
+ };
301
+ /** Scan text line by line; every hit names its pattern and line. */
302
+ export declare function scanForSecrets(text: string): SecretHit[];
303
+ /** Replace every hit line with a marker naming what was found — the display copy holds no secret. */
304
+ export declare function redactSecretLines(text: string, hits: readonly SecretHit[]): string;
305
+ /**
306
+ * Fit a DiffStat under its cap by shedding FILES, never bytes (audit C-4):
307
+ * a structured artifact cut mid-token is not a smaller stat, it is no stat.
308
+ * Aggregate counts always survive; the file list shrinks until the encoded
309
+ * JSON fits, and filesTruncated says so.
310
+ */
311
+ export declare function budgetedStatJson(stat: DiffStat): Buffer;
312
+ /**
313
+ * Capture the TERMINAL diff — the immutable base→head patch of a run that
314
+ * committed, taken before its worktree is released (M5.3; the Codex scope
315
+ * cut is the spec). Two artifacts: the bounded plain patch, and a
316
+ * machine-parsed stat whose filenames came NUL-delimited from git, never
317
+ * from patch headers. Same execution posture as the park capture: external
318
+ * diff drivers and textconv disabled by name, because this must not run
319
+ * anything the agent may have just written. A no-change run stores the
320
+ * explicit zero-stat rather than storing nothing — "no diff" and "capture
321
+ * failed" have to read differently.
322
+ */
323
+ export declare function captureTerminalDiff(store: Store, git: (file: string, args: readonly string[], options?: {
324
+ cwd?: string;
325
+ }) => Promise<ExecResult>, worktree: string, base: string, head: string, root: string, runId: number, now: Date): Promise<{
326
+ diffId: number;
327
+ statId: number;
328
+ }>;
329
+ /**
330
+ * The live peek's base snapshot (live-peek v3 §1), captured in the same
331
+ * pre-spawn window that computed `base` itself — one `ls-tree` against the
332
+ * project clone (NEVER a worktree), lazy-fetch and replace-refs disabled
333
+ * on argv, the child's environment reduced to an allowlist that contains
334
+ * no GIT_* at all. The parsed listing is round-tripped through the strict
335
+ * snapshot codec: any entry the codec refuses — including paths the UTF-8
336
+ * decode mangled into U+FFFD — refuses the WHOLE snapshot, recorded as a
337
+ * failed capture. Integrity class: the database's own, claimed as nothing
338
+ * more (round-3 finding 42).
339
+ */
340
+ export declare function captureBaseTree(store: Store, git: (file: string, args: readonly string[], options?: {
341
+ cwd?: string;
342
+ envAllowlist?: readonly string[];
343
+ }) => Promise<ExecResult>, repoRoot: string, repo: string, base: string, root: string, runId: number, now: Date): Promise<{
344
+ ok: boolean;
345
+ }>;