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,75 @@
1
+ /** v99: sign-ins (and refusals, lockouts, sign-outs) and policy changes are their own kinds of event. */
2
+ export const LEDGER_SOURCES = ["work", "request", "access", "sign-in", "policy"];
3
+ /** The table as v54 made it: the one earlier shape the v99 rebuild accepts. */
4
+ export const LEDGER_V54_TABLE = (name) => `CREATE TABLE ${name} (
5
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
6
+ at TEXT NOT NULL, actor TEXT NOT NULL, repo TEXT,
7
+ task_id TEXT, run_id INTEGER,
8
+ action TEXT NOT NULL, outcome TEXT NOT NULL,
9
+ source TEXT NOT NULL CHECK (source IN ('work','request','access'))
10
+ )`;
11
+ export const LEDGER_V54_COLUMNS = ["id", "at", "actor", "repo", "task_id", "run_id", "action", "outcome", "source"];
12
+ export const LEDGER_TABLE = (name) => `CREATE TABLE ${name} (
13
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
14
+ at TEXT NOT NULL, actor TEXT NOT NULL, repo TEXT,
15
+ task_id TEXT, run_id INTEGER,
16
+ action TEXT NOT NULL, outcome TEXT NOT NULL,
17
+ source TEXT NOT NULL CHECK (source IN ('work','request','access','sign-in','policy')),
18
+ detail TEXT
19
+ )`;
20
+ export const LEDGER_SCHEMA = `
21
+ ${LEDGER_TABLE("IF NOT EXISTS action_ledger")};
22
+ CREATE INDEX IF NOT EXISTS action_ledger_project ON action_ledger(repo, id DESC);
23
+ CREATE INDEX IF NOT EXISTS action_ledger_actor ON action_ledger(actor, id DESC);
24
+ CREATE TRIGGER IF NOT EXISTS action_ledger_no_update BEFORE UPDATE ON action_ledger
25
+ BEGIN SELECT RAISE(ABORT, 'action history is append-only'); END;
26
+ CREATE TRIGGER IF NOT EXISTS action_ledger_no_delete BEFORE DELETE ON action_ledger
27
+ BEGIN SELECT RAISE(ABORT, 'action history is append-only'); END;
28
+ `;
29
+ /** Installed after all table migrations. Work events commit with the work,
30
+ * including CLI and unattended workers; no prompts, tool arguments, tokens,
31
+ * decision text, or transcript content are copied into the ledger. */
32
+ export function installLedgerTriggers(db) {
33
+ const repo = (ref) => `(SELECT repo FROM task_ref WHERE id = ${ref})`;
34
+ const task = (ref) => `(SELECT external_id FROM task_ref WHERE id = ${ref})`;
35
+ const runRef = `(SELECT task_ref FROM run WHERE id = NEW.run)`;
36
+ const event = (at, actor, project, taskId, runId, action, outcome) => `INSERT INTO action_ledger(at,actor,repo,task_id,run_id,action,outcome,source) VALUES (${at},${actor},${project},${taskId},${runId},'${action}',${outcome},'work');`;
37
+ db.exec(`
38
+ CREATE TRIGGER IF NOT EXISTS ledger_run_started AFTER INSERT ON run BEGIN
39
+ ${event("NEW.started_at", "NEW.runner", repo("NEW.task_ref"), task("NEW.task_ref"), "NEW.id", "run started", "NEW.role")}
40
+ END;
41
+ CREATE TRIGGER IF NOT EXISTS ledger_run_finished AFTER UPDATE OF outcome ON run
42
+ WHEN NEW.outcome IS NOT NULL AND OLD.outcome IS NOT NEW.outcome BEGIN
43
+ ${event("COALESCE(NEW.finished_at, NEW.started_at)", "NEW.runner", repo("NEW.task_ref"), task("NEW.task_ref"), "NEW.id", "run finished", "NEW.outcome")}
44
+ END;
45
+ CREATE TRIGGER IF NOT EXISTS ledger_decision_opened AFTER INSERT ON decision BEGIN
46
+ ${event("NEW.created_at", "'system'", repo(runRef), task(runRef), "NEW.run", "decision opened", "NEW.state")}
47
+ END;
48
+ CREATE TRIGGER IF NOT EXISTS ledger_decision_answered AFTER UPDATE OF answered_at ON decision
49
+ WHEN NEW.answered_at IS NOT NULL AND OLD.answered_at IS NULL BEGIN
50
+ ${event("NEW.answered_at", "COALESCE(NEW.answered_by,'system')", repo(runRef), task(runRef), "NEW.run", "decision answered", "NEW.state")}
51
+ END;
52
+ CREATE TRIGGER IF NOT EXISTS ledger_scope_approved AFTER UPDATE OF approved_at, approved_digest ON task_scope
53
+ WHEN NEW.approved_at IS NOT NULL AND (OLD.approved_at IS NOT NEW.approved_at OR OLD.approved_digest IS NOT NEW.approved_digest) BEGIN
54
+ ${event("NEW.approved_at", "COALESCE(NEW.approved_by,'system')", "(SELECT repo FROM task_ref WHERE backend = 'built-in' AND external_id = NEW.task_id)", "NEW.task_id", "NULL", "scope approved", "'approved'")}
55
+ END;
56
+ CREATE TRIGGER IF NOT EXISTS ledger_task_state AFTER UPDATE OF state ON task
57
+ WHEN OLD.state IS NOT NEW.state BEGIN
58
+ ${event("NEW.updated_at", "'system'", "(SELECT repo FROM task_ref WHERE backend = 'built-in' AND external_id = NEW.id)", "NEW.id", "NULL", "task state changed", "NEW.state")}
59
+ END;
60
+ CREATE TRIGGER IF NOT EXISTS ledger_task_placed AFTER UPDATE OF repo ON task_ref
61
+ WHEN OLD.repo IS NOT NEW.repo BEGIN
62
+ ${event("strftime('%Y-%m-%dT%H:%M:%fZ','now')", "'system'", "NEW.repo", "NEW.external_id", "NULL", "task placed", "'recorded'")}
63
+ END;
64
+ CREATE TRIGGER IF NOT EXISTS ledger_coordinator_minted AFTER INSERT ON coordinator_credential BEGIN
65
+ INSERT INTO action_ledger(at,actor,repo,task_id,run_id,action,outcome,source,detail) VALUES (NEW.created_at, NEW.created_by, NULL, NULL, NULL,
66
+ 'coordinator minted: ' || NEW.name, 'minted', 'access', 'projects: ' || NEW.repos);
67
+ END;
68
+ CREATE TRIGGER IF NOT EXISTS ledger_task_registered AFTER INSERT ON task_ref BEGIN
69
+ ${event("strftime('%Y-%m-%dT%H:%M:%fZ','now')", "'system'", "NEW.repo", "NEW.external_id", "NULL", "task registered", "'recorded'")}
70
+ END;
71
+ CREATE TRIGGER IF NOT EXISTS ledger_steer AFTER INSERT ON task_steer BEGIN
72
+ ${event("NEW.created_at", "NEW.author", repo("NEW.task_ref"), task("NEW.task_ref"), "NEW.attached_run", "steering added", "NEW.authorship_state")}
73
+ END;
74
+ `);
75
+ }
@@ -0,0 +1,42 @@
1
+ /** How a launch was fenced, as recorded on the run and said on the task. */
2
+ export type FenceMethod = "codex-profile" | "macos-sandbox" | "linux-bubblewrap" | "claude-rules" | "none";
3
+ /**
4
+ * Every path an agent must not reach: the Toolroll state folder
5
+ * beside the database (all of it, except the folder that holds this run's
6
+ * own worktree), the database itself with its journal files, and
7
+ * `~/.toolroll` or an older `~/.standing-orders` (provider keys and project tool secrets). When the
8
+ * database sits anywhere else (a shared folder), only the database and
9
+ * secret-looking entries there are fenced.
10
+ */
11
+ export declare function agentFence(options: {
12
+ databaseFile: string | null;
13
+ worktree: string | null;
14
+ home?: string;
15
+ extra?: readonly string[];
16
+ }): string[];
17
+ /**
18
+ * Codex's own sandbox, fenced. Auto: the `:workspace` profile Codex's
19
+ * `--sandbox workspace-write` already gives (workspace and temp writes, no
20
+ * network). Full access: the same profile widened to write anywhere with
21
+ * network on, instead of no sandbox at all. Either way the fenced paths are
22
+ * denied, which in Codex outranks any write or read grant.
23
+ */
24
+ export declare function codexFenceArgv(fence: readonly string[], fullAccess: boolean): string[];
25
+ /** Claude's own file tools refuse the fenced paths in every mode (its shell is fenced by the macOS sandbox). */
26
+ export declare function claudeFenceSettings(fence: readonly string[]): string;
27
+ /** A Seatbelt profile that allows everything except reading or writing the fenced paths. */
28
+ export declare function macosFenceProfile(fence: readonly string[]): string;
29
+ export declare const SANDBOX_EXEC = "/usr/bin/sandbox-exec";
30
+ /** Whether this machine can run an agent inside the macOS fence. */
31
+ export declare function macosFenceAvailable(platform?: NodeJS.Platform): boolean;
32
+ /** The spawn that runs `file args` inside the macOS fence (same process: sandbox-exec replaces itself with the agent). */
33
+ export declare function macosFenced(file: string, args: readonly string[], fence: readonly string[]): {
34
+ file: string;
35
+ args: string[];
36
+ };
37
+ export declare function linuxFenceAvailable(platform?: NodeJS.Platform, probe?: () => boolean): boolean;
38
+ /** The spawn that runs `file args` inside the Linux fence: the whole filesystem as it is, except each fenced path masked. */
39
+ export declare function linuxFenced(file: string, args: readonly string[], fence: readonly string[]): {
40
+ file: string;
41
+ args: string[];
42
+ };
@@ -0,0 +1,183 @@
1
+ /**
2
+ * The agent fence: what no build, plan, scout or repair agent may read or
3
+ * write, whatever its permission mode. Agents run as the operator's own OS
4
+ * user, so without it an agent could read the approver's remembered login
5
+ * (`up-login.txt`), runner and coordinator tokens, provider keys, project
6
+ * tool secrets, other runs' evidence, or the live database — and use them
7
+ * to approve its own work. The fence closes that at the operating system,
8
+ * not in the model's instructions:
9
+ *
10
+ * - Codex (every platform): a permission profile that extends its own
11
+ * `:workspace` sandbox (Auto keeps it exactly: workspace writes, no
12
+ * network) or widens it to write anywhere with network on (Full access,
13
+ * which used to mean no sandbox at all), and denies every fenced path.
14
+ * - Claude and Gemini on macOS: the whole agent process runs inside a
15
+ * Seatbelt profile that allows everything except the fenced paths.
16
+ * - Claude and Gemini on Linux (v88): the agent runs under bubblewrap, in its
17
+ * own mount namespace where every fenced folder is an empty one and every
18
+ * fenced file is /dev/null. Used when `bwrap` is installed and works here.
19
+ * - Claude everywhere also gets Read/Edit deny rules for its own file tools.
20
+ *
21
+ * Checked against codex-cli 0.156 and Claude Code 2.1.281 with a canary
22
+ * file read by an obfuscated script: "Operation not permitted".
23
+ */
24
+ import { spawnSync } from "node:child_process";
25
+ import { existsSync, readdirSync, readFileSync, realpathSync, statSync } from "node:fs";
26
+ import { homedir } from "node:os";
27
+ import { basename, dirname, isAbsolute, join, relative, resolve, sep } from "node:path";
28
+ import { readMonitoring } from "./monitoring-settings.js";
29
+ import { existingFolders } from "./names.js";
30
+ /** Names that are secrets wherever the database lives (used when its folder is shared with other things). */
31
+ const SENSITIVE_NAME = /(^up-login\.txt$|token|secret|login|password|credential|vapid|keys?\b|\.pem$|\.key$|^backups$|^evidence$|^remote$|^sign-in\.json$|^monitoring\.json$)/i;
32
+ function real(path) {
33
+ try {
34
+ return realpathSync(path);
35
+ }
36
+ catch {
37
+ return resolve(path);
38
+ }
39
+ }
40
+ function inside(child, parent) {
41
+ const rel = relative(parent, child);
42
+ return rel !== "" && !rel.startsWith("..") && !isAbsolute(rel);
43
+ }
44
+ /**
45
+ * Every path an agent must not reach: the Toolroll state folder
46
+ * beside the database (all of it, except the folder that holds this run's
47
+ * own worktree), the database itself with its journal files, and
48
+ * `~/.toolroll` or an older `~/.standing-orders` (provider keys and project tool secrets). When the
49
+ * database sits anywhere else (a shared folder), only the database and
50
+ * secret-looking entries there are fenced.
51
+ */
52
+ export function agentFence(options) {
53
+ const fence = new Set();
54
+ const home = real(options.home ?? homedir());
55
+ const worktree = options.worktree === null ? null : real(options.worktree);
56
+ if (options.databaseFile !== null && options.databaseFile !== "" && options.databaseFile !== ":memory:") {
57
+ const database = real(options.databaseFile);
58
+ const state = dirname(database);
59
+ for (const suffix of ["", "-wal", "-shm", "-journal"])
60
+ if (existsSync(database + suffix))
61
+ fence.add(database + suffix);
62
+ // Only a folder that is Toolroll's own (~/.config/toolroll or an older name,
63
+ // the desktop app's "Toolroll") is fenced whole: a database kept
64
+ // in a shared folder (a projects folder, a test's temp folder) must not
65
+ // fence its neighbours, the repositories agents build among them.
66
+ const dedicated = state !== home && state !== sep && !existsSync(join(state, ".git")) && /standing[\s_-]?orders|toolroll|nightorders/i.test(basename(state));
67
+ // The entries this run's worktree needs stay reachable: the one it lives
68
+ // under, and the repository its git metadata belongs to.
69
+ const keep = new Set();
70
+ for (const needed of [worktree, worktree === null ? null : mainRepositoryOf(worktree)]) {
71
+ if (needed !== null && inside(needed, state))
72
+ keep.add(relative(state, needed).split(sep)[0]);
73
+ }
74
+ let entries = [];
75
+ try {
76
+ entries = readdirSync(state);
77
+ }
78
+ catch {
79
+ entries = [];
80
+ }
81
+ for (const entry of entries) {
82
+ // A repository is work, never a secret.
83
+ if (keep.has(entry) || existsSync(join(state, entry, ".git")))
84
+ continue;
85
+ if (dedicated || SENSITIVE_NAME.test(entry))
86
+ fence.add(join(state, entry));
87
+ }
88
+ }
89
+ for (const secrets of existingFolders(home, { dot: true }))
90
+ fence.add(secrets);
91
+ // v104: the folder the audit stream writes to holds the whole instance's history.
92
+ if (options.databaseFile !== null && options.databaseFile !== "" && options.databaseFile !== ":memory:") {
93
+ const stream = readMonitoring(dirname(real(options.databaseFile))).folder?.path;
94
+ if (stream !== undefined && existsSync(stream))
95
+ fence.add(real(stream));
96
+ }
97
+ for (const path of options.extra ?? [])
98
+ if (existsSync(path))
99
+ fence.add(real(path));
100
+ // Never fence the run's own worktree or anything above it.
101
+ return [...fence].filter(path => worktree === null || (path !== worktree && !inside(worktree, path))).sort();
102
+ }
103
+ /** The repository a git worktree belongs to (its `.git` file names the main repository's git folder). */
104
+ function mainRepositoryOf(worktree) {
105
+ try {
106
+ const pointer = /^gitdir:\s*(.+)$/m.exec(readFileSync(join(worktree, ".git"), "utf8"))?.[1]?.trim();
107
+ if (pointer === undefined)
108
+ return null;
109
+ const gitdir = real(isAbsolute(pointer) ? pointer : join(worktree, pointer));
110
+ // <repo>/.git/worktrees/<name> → <repo>
111
+ const marker = `${sep}.git${sep}worktrees${sep}`;
112
+ const at = gitdir.lastIndexOf(marker);
113
+ return at < 0 ? null : gitdir.slice(0, at);
114
+ }
115
+ catch {
116
+ return null;
117
+ }
118
+ }
119
+ const toml = (value) => `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
120
+ /**
121
+ * Codex's own sandbox, fenced. Auto: the `:workspace` profile Codex's
122
+ * `--sandbox workspace-write` already gives (workspace and temp writes, no
123
+ * network). Full access: the same profile widened to write anywhere with
124
+ * network on, instead of no sandbox at all. Either way the fenced paths are
125
+ * denied, which in Codex outranks any write or read grant.
126
+ */
127
+ export function codexFenceArgv(fence, fullAccess) {
128
+ const filesystem = [...(fullAccess ? ['"/"="write"'] : []), ...fence.map(path => `${toml(path)}="deny"`)];
129
+ return [
130
+ "-c", 'default_permissions="standing-orders"',
131
+ "-c", 'permissions.standing-orders.extends=":workspace"',
132
+ "-c", `permissions.standing-orders.filesystem={${filesystem.join(",")}}`,
133
+ ...(fullAccess ? ["-c", "permissions.standing-orders.network.enabled=true", "-c", 'approval_policy="never"'] : []),
134
+ ];
135
+ }
136
+ /** Claude's own file tools refuse the fenced paths in every mode (its shell is fenced by the macOS sandbox). */
137
+ export function claudeFenceSettings(fence) {
138
+ const rules = fence.flatMap(path => [`Read(/${path})`, `Read(/${path}/**)`, `Edit(/${path})`, `Edit(/${path}/**)`]);
139
+ return JSON.stringify({ permissions: { deny: rules } });
140
+ }
141
+ const seatbelt = (path) => `"${path.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
142
+ /** A Seatbelt profile that allows everything except reading or writing the fenced paths. */
143
+ export function macosFenceProfile(fence) {
144
+ return ["(version 1)", "(allow default)", `(deny file-read* file-write* ${fence.map(path => `(subpath ${seatbelt(path)})`).join(" ")})`].join("\n");
145
+ }
146
+ export const SANDBOX_EXEC = "/usr/bin/sandbox-exec";
147
+ /** Whether this machine can run an agent inside the macOS fence. */
148
+ export function macosFenceAvailable(platform = process.platform) {
149
+ return platform === "darwin" && existsSync(SANDBOX_EXEC);
150
+ }
151
+ /** The spawn that runs `file args` inside the macOS fence (same process: sandbox-exec replaces itself with the agent). */
152
+ export function macosFenced(file, args, fence) {
153
+ return { file: SANDBOX_EXEC, args: ["-p", macosFenceProfile(fence), file, ...args] };
154
+ }
155
+ /** Whether bubblewrap runs here (checked once): installed, and allowed to make its namespace. */
156
+ let bubblewrapWorks = null;
157
+ export function linuxFenceAvailable(platform = process.platform, probe = () => spawnSync("bwrap", ["--dev-bind", "/", "/", "--", "true"], { timeout: 5_000, stdio: "ignore" }).status === 0) {
158
+ if (platform !== "linux")
159
+ return false;
160
+ if (bubblewrapWorks === null) {
161
+ try {
162
+ bubblewrapWorks = probe();
163
+ }
164
+ catch {
165
+ bubblewrapWorks = false;
166
+ }
167
+ }
168
+ return bubblewrapWorks;
169
+ }
170
+ /** The spawn that runs `file args` inside the Linux fence: the whole filesystem as it is, except each fenced path masked. */
171
+ export function linuxFenced(file, args, fence) {
172
+ const masks = fence.flatMap(path => {
173
+ let folder = true;
174
+ try {
175
+ folder = statSync(path).isDirectory();
176
+ }
177
+ catch {
178
+ folder = true;
179
+ }
180
+ return folder ? ["--tmpfs", path] : ["--ro-bind", "/dev/null", path];
181
+ });
182
+ return { file: "bwrap", args: ["--dev-bind", "/", "/", ...masks, "--die-with-parent", "--", file, ...args] };
183
+ }
@@ -0,0 +1,216 @@
1
+ /**
2
+ * Phase-agent resolution: which provider and model a phase runs on, layer
3
+ * by layer, with the layers written down (Codex provider review, Q8).
4
+ *
5
+ * pinned task agent — stamped by a fire transaction; NOTHING overrides it
6
+ * explicit flags — this pass's operator, per field
7
+ * project override — phase_config row scoped to the canonical repo
8
+ * installation — phase_config row scoped 'installation'
9
+ * review inheritance — when review is unset, the planner's complete pair
10
+ * default — claude, harness default model
11
+ *
12
+ * Config rows are COMPLETE pairs (provider required, model optional), so a
13
+ * partial override cannot marry a codex model to an inherited claude
14
+ * provider. Flags are per-field with one stated rule: `--model` alone
15
+ * rides whatever provider resolves; `--provider` alone runs that
16
+ * provider's default model — a lower layer's model never crosses onto a
17
+ * flag-chosen provider it was not written for.
18
+ *
19
+ * The resolved pair is validated before anything is claimed or spent, and
20
+ * the caller snapshots it into the run row.
21
+ */
22
+ import { type AgentSpec, type Phase } from "./provider.js";
23
+ import { type Store, type TaskRef } from "./store.js";
24
+ import { type ChainEntry, type ExecutionProfile, type UnattendedPermissionMode } from "./scope.js";
25
+ import { type ExactSpec, type PhaseRoute, type RouteCandidates } from "./phase-routing.js";
26
+ import type { AcceptanceCriterion } from "./scope.js";
27
+ export declare const INSTALLATION_SCOPE = "installation";
28
+ export type PhaseFlags = {
29
+ provider?: string | undefined;
30
+ model?: string | undefined;
31
+ };
32
+ export type Resolution = {
33
+ ok: true;
34
+ spec: AgentSpec;
35
+ source: "pinned" | "flag" | "project" | "installation" | "default";
36
+ } | {
37
+ ok: false;
38
+ problem: string;
39
+ };
40
+ export declare function resolvePhaseAgent(store: Store, phase: Phase, repo: string | null, flags: PhaseFlags,
41
+ /** The task being dispatched, when one is — its pin is authoritative. */
42
+ ref?: Pick<TaskRef, "agentProvider" | "agentModel">): Resolution;
43
+ /**
44
+ * The FILING resolver (foundations findings 13/15/19): the execution
45
+ * profile a scope stores, resolved once, exactly, at filing. The model is
46
+ * the exact string the argv will carry — the harness-default road refuses
47
+ * here rather than floating (ruling 10). Repair precedence: the
48
+ * --repair-model flag, else the repair phase-config row's MODEL (its
49
+ * provider must equal the build provider — cross-provider repair does not
50
+ * exist), else the literal "inherit". Callers that file scopes SAVE an
51
+ * unresolved state on refusal (finding 19) — this function only says why.
52
+ */
53
+ export type ProfileResolution = {
54
+ ok: true;
55
+ profile: ExecutionProfile;
56
+ provenance: {
57
+ resolvedFrom: string;
58
+ repairFrom: string;
59
+ };
60
+ } | {
61
+ ok: false;
62
+ reason: "unknown-provider" | "no-model" | "repair-provider-mismatch";
63
+ problem: string;
64
+ };
65
+ export declare function resolveScopeProfile(store: Store, repo: string | null, ref: Pick<TaskRef, "agentProvider" | "agentModel"> | undefined, flags: PhaseFlags & {
66
+ repairModel?: string | undefined;
67
+ permissionMode?: UnattendedPermissionMode | undefined;
68
+ }): ProfileResolution;
69
+ export type ChainResolution = {
70
+ ok: true;
71
+ chain: ChainEntry[];
72
+ kind: "profile" | "chain";
73
+ } | {
74
+ ok: false;
75
+ reason: "base-unresolved" | "bad-fallback" | "duplicate";
76
+ problem: string;
77
+ };
78
+ /**
79
+ * Resolve the full EXECUTION CHAIN a scope files under (v30): the base
80
+ * (entry 0) is the ordinary single-profile resolution wearing the base
81
+ * provider's auth mode; the fallbacks are the scope's configured entries,
82
+ * each resolved to a WHOLE ExecutionProfile (repair per entry). With no
83
+ * fallbacks configured, the result is `kind: "profile"` — a single-profile
84
+ * approval, byte-identical to today (NOT an explicit chain). With
85
+ * fallbacks, it is `kind: "chain"` and the approval binds the whole thing.
86
+ * The base auth mode is passed in (the caller reads it from the managed
87
+ * key store) so resolution stays pure and testable.
88
+ */
89
+ export declare function resolveScopeChain(store: Store, repo: string | null, ref: Pick<TaskRef, "agentProvider" | "agentModel"> | undefined, flags: PhaseFlags & {
90
+ repairModel?: string | undefined;
91
+ permissionMode?: UnattendedPermissionMode | undefined;
92
+ }, baseAuthMode: "subscription" | "api-key"): ChainResolution;
93
+ /**
94
+ * The two candidate tiers the routing policy chooses between, per phase,
95
+ * read from configuration ONLY — never inferred from a model's name:
96
+ *
97
+ * routine — the ordinary resolution above (project > installation,
98
+ * review inheriting the planner's pair), i.e. exactly the
99
+ * agent every pre-v47 scope resolved to — but EXACT: a phase
100
+ * whose resolution has no model id cannot be a candidate,
101
+ * because an approval binds exact routing. Repair is the one
102
+ * phase with no routine candidate of its own when nothing is
103
+ * configured: it inherits the build leg (repairs resume the
104
+ * builder's session), and the policy says so.
105
+ * strong — the operator's named strong row (`config set <phase> --tier
106
+ * strong …`), project over installation, review inheriting the
107
+ * plan's strong row when it has none of its own; null when
108
+ * nothing is configured, and the route then SAYS so.
109
+ *
110
+ * A misconfigured row — unknown provider, missing model, argv-unsafe
111
+ * model — REFUSES with the words to fix it; the caller files the scope
112
+ * unresolved with them. Nothing is skipped or guessed.
113
+ */
114
+ export type CandidatesResolution = {
115
+ ok: true;
116
+ candidates: RouteCandidates;
117
+ } | {
118
+ ok: false;
119
+ phase: Phase;
120
+ problem: string;
121
+ };
122
+ export declare function resolveRouteCandidates(store: Store, repo: string | null, pins?: {
123
+ plan?: ExactSpec | null;
124
+ build?: ExactSpec | null;
125
+ }): CandidatesResolution;
126
+ /** A task's pinned pair as an EXACT spec, or the words for why it cannot
127
+ * route: a pin with no model id binds nothing exact. */
128
+ export declare function exactPinOf(provider: string | null, model: string | null, phase: "plan" | "build"): {
129
+ ok: true;
130
+ pin: ExactSpec | null;
131
+ } | {
132
+ ok: false;
133
+ problem: string;
134
+ };
135
+ /**
136
+ * THE ROUTE A TASK RUNS UNDER, for dispatch and every surface:
137
+ *
138
+ * approved — the sealed route when the approval stands (authoritative;
139
+ * mutable configuration never rewrites it);
140
+ * proposed — the WORKING proposed route the next approval would seal;
141
+ * live — no scope yet (a plan request): a live recommendation from
142
+ * the task's own risk, overrides, and pins over today's
143
+ * configuration;
144
+ * legacy — a row PROVEN to predate v47 (no route era): its sealed
145
+ * profile alone governs the build; plan and review resolve
146
+ * from configuration at run time, and the surfaces say so;
147
+ * unreadable — a routed row whose route data is missing, malformed, or
148
+ * does not verify against its approval, or a task whose
149
+ * configuration cannot make an exact route: FAIL CLOSED,
150
+ * with the words. Nothing dispatches on it.
151
+ *
152
+ * `source` says which, so a surface never presents a live recommendation
153
+ * as a sealed term and a runner never runs a legacy road on a routed row.
154
+ */
155
+ export type TaskRoute = {
156
+ kind: "route";
157
+ route: PhaseRoute;
158
+ source: "approved" | "proposed" | "live";
159
+ } | {
160
+ kind: "legacy";
161
+ profile: ExecutionProfile;
162
+ approved: boolean;
163
+ } | {
164
+ kind: "unreadable";
165
+ problem: string;
166
+ };
167
+ export declare function routeOfTask(store: Store, taskId: string, ref: TaskRef | null, now: Date): TaskRoute | null;
168
+ /**
169
+ * THE ROUTINE'S FROZEN AUTHORITY, resolved once at filing: the four-role
170
+ * route a routine's firings will run under, and the execution profile that
171
+ * restates its build and repair legs exactly. Routine tasks declare routine
172
+ * risk; the rubric's evidence needs, the installation's quality default,
173
+ * and the repository's publication authority are the other signed inputs.
174
+ * A configuration that cannot make an exact, runnable route answers with
175
+ * the words — the routine files unresolved and cannot be approved until
176
+ * it is filed again under a configuration that can.
177
+ */
178
+ export type RoutineAuthority = {
179
+ ok: true;
180
+ route: PhaseRoute;
181
+ profile: ExecutionProfile;
182
+ } | {
183
+ ok: false;
184
+ problem: string;
185
+ };
186
+ export declare function resolveRoutineAuthority(store: Store, repo: string, acceptance: readonly AcceptanceCriterion[], now: Date): RoutineAuthority;
187
+ /** One agent a surface shows for one role: an exact pair, where it comes
188
+ * from, whether it is the role's current leg, and whether it can be
189
+ * CHOSEN — only a pair the active configuration names for this role is
190
+ * selectable; a current leg the configuration no longer names is shown
191
+ * for what runs today and nothing more. */
192
+ export type AgentChoice = ExactSpec & {
193
+ source: string;
194
+ current: boolean;
195
+ selectable: boolean;
196
+ };
197
+ /**
198
+ * THE ROLE'S CONFIGURED CHOICES (v48), simple and role-specific: for each
199
+ * role, exactly the exact pairs the active configuration names FOR THAT
200
+ * ROLE — its everyday agent and its strong agent — and nothing borrowed
201
+ * from another role. Repair runs only the build leg's provider (repairs
202
+ * resume the builder's session): its choices are the configured repair
203
+ * rows on that provider plus the build role's own configured agents on
204
+ * it, so an operator can keep repairs on the builder without naming a
205
+ * repair row. Gemini never reviews. Nothing is typed free-hand and
206
+ * nothing unconfigured is selectable: an approval binds an exact agent
207
+ * the operator named once, in configuration.
208
+ *
209
+ * The role's CURRENT leg rides along marked `current`; when the
210
+ * configuration no longer names it (a stale override, a routine's pin)
211
+ * it is display-only — `selectable: false` — so a surface can say what
212
+ * runs today without offering to re-pick it. Empty when the
213
+ * configuration cannot make exact candidates at all; the surface then
214
+ * says so instead of guessing.
215
+ */
216
+ export declare function agentChoicesFor(store: Store, repo: string | null, route: PhaseRoute | null): Record<Phase, AgentChoice[]>;