@coreplane/switchboard 1.203.0 → 1.205.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 (373) hide show
  1. package/dist/assets/config/config.example.yaml +32 -3
  2. package/dist/assets/deploy/cloudflare-memory/worker.ts +129 -3
  3. package/dist/assets/deploy/cloudflare-memory/wrangler.template.jsonc +7 -2
  4. package/dist/assets/deploy/cloudflare-sandbox/worker.ts +4 -1
  5. package/dist/assets/package-lock.json +291 -97
  6. package/dist/assets/package.json +1 -1
  7. package/dist/assets/project.json +1 -1
  8. package/dist/assets/source.json +3 -3
  9. package/dist/assets/src/agents/registry.ts +466 -0
  10. package/dist/assets/src/config/profile.ts +200 -0
  11. package/dist/assets/src/core/delivery.ts +775 -0
  12. package/dist/assets/src/core/deliverySnapshotStore.ts +200 -0
  13. package/dist/assets/src/core/runLedger/types.ts +6 -0
  14. package/dist/assets/src/core/runRecord.ts +44 -0
  15. package/dist/assets/src/core/ship/contract.ts +502 -0
  16. package/dist/assets/src/core/workerError.ts +12 -0
  17. package/dist/assets/web/dist/.vite/manifest.json +2770 -70
  18. package/dist/assets/web/dist/assets/AppShell-lYVcj-k7.js +1 -0
  19. package/dist/assets/web/dist/assets/{CostsPage-XQ-fQzdz.js → CostsPage-DGSE48l1.js} +1 -1
  20. package/dist/assets/web/dist/assets/DeliveryPage-Cx7kQC_e.js +1 -0
  21. package/dist/assets/web/dist/assets/NotFoundPage-BzWS4Ca1.js +1 -0
  22. package/dist/assets/web/dist/assets/ResidentDetailPage-Bcasasjb.js +1 -0
  23. package/dist/assets/web/dist/assets/ResidentsIndexPage-BJwyrphn.js +1 -0
  24. package/dist/assets/web/dist/assets/RunRoutePage-6eStApqP.js +12 -0
  25. package/dist/assets/web/dist/assets/RunRoutePage-f6TSNPeW.css +1 -0
  26. package/dist/assets/web/dist/assets/RunsIndexPage-CWrkv7v8.js +1 -0
  27. package/dist/assets/web/dist/assets/RunsTabs-DEICQ4FY.js +1 -0
  28. package/dist/assets/web/dist/assets/ScheduledPage-BX2py1X3.js +1 -0
  29. package/dist/assets/web/dist/assets/StatusDot-CwCK84JN.js +1 -0
  30. package/dist/assets/web/dist/assets/Tooltip-CFC88_-Z.js +1 -0
  31. package/dist/assets/web/dist/assets/abap-CLvhMVsD.js +1 -0
  32. package/dist/assets/web/dist/assets/actionscript-3-Cs6JJXT5.js +1 -0
  33. package/dist/assets/web/dist/assets/ada-C5qYipkI.js +1 -0
  34. package/dist/assets/web/dist/assets/ahk-CA9gdOdF.js +1 -0
  35. package/dist/assets/web/dist/assets/ahk2-_6rzW9BS.js +1 -0
  36. package/dist/assets/web/dist/assets/andromeeda-vGVdxbeo.js +1 -0
  37. package/dist/assets/web/dist/assets/angular-html-Cw130Zyi.js +1 -0
  38. package/dist/assets/web/dist/assets/angular-ts-DY1m4C2s.js +1 -0
  39. package/dist/assets/web/dist/assets/apache-U0d_L8uA.js +1 -0
  40. package/dist/assets/web/dist/assets/apex-KFGFyKwG.js +1 -0
  41. package/dist/assets/web/dist/assets/apl-W6Ty7v05.js +1 -0
  42. package/dist/assets/web/dist/assets/applescript-CCn79oCD.js +1 -0
  43. package/dist/assets/web/dist/assets/ara-4CJ0cIlV.js +1 -0
  44. package/dist/assets/web/dist/assets/asciidoc-SCjQUq34.js +1 -0
  45. package/dist/assets/web/dist/assets/asm-Cmm7eHzH.js +1 -0
  46. package/dist/assets/web/dist/assets/astro-DlLVHwVk.js +1 -0
  47. package/dist/assets/web/dist/assets/aurora-x-CDeNXAV0.js +1 -0
  48. package/dist/assets/web/dist/assets/awk-BWXHIvNe.js +1 -0
  49. package/dist/assets/web/dist/assets/ayu-dark-DluEY0Gj.js +1 -0
  50. package/dist/assets/web/dist/assets/ayu-light-C3h-C4tm.js +1 -0
  51. package/dist/assets/web/dist/assets/ayu-mirage-Bqwy1Gya.js +1 -0
  52. package/dist/assets/web/dist/assets/ballerina-B7ZEbQpA.js +1 -0
  53. package/dist/assets/web/dist/assets/bat-qdxAdBWQ.js +1 -0
  54. package/dist/assets/web/dist/assets/beancount-D-usSTwE.js +1 -0
  55. package/dist/assets/web/dist/assets/berry-DKpUyyne.js +1 -0
  56. package/dist/assets/web/dist/assets/bibtex-Ci_nEsc7.js +1 -0
  57. package/dist/assets/web/dist/assets/bicep-CUHmPFLl.js +1 -0
  58. package/dist/assets/web/dist/assets/bird2-CYIUgYqB.js +1 -0
  59. package/dist/assets/web/dist/assets/blade-Bco3tDh4.js +1 -0
  60. package/dist/assets/web/dist/assets/bsl-_VjlB9mv.js +1 -0
  61. package/dist/assets/web/dist/assets/c-1LaFY_cj.js +1 -0
  62. package/dist/assets/web/dist/assets/c3-D0apG41V.js +1 -0
  63. package/dist/assets/web/dist/assets/cadence-CQ2zXKGN.js +1 -0
  64. package/dist/assets/web/dist/assets/cairo-DLTphjLi.js +1 -0
  65. package/dist/assets/web/dist/assets/catppuccin-frappe-C9Q5zVZY.js +1 -0
  66. package/dist/assets/web/dist/assets/catppuccin-latte-CtsyrtPq.js +1 -0
  67. package/dist/assets/web/dist/assets/catppuccin-macchiato-R8nAf1vR.js +1 -0
  68. package/dist/assets/web/dist/assets/catppuccin-mocha-DjuaAJKi.js +1 -0
  69. package/dist/assets/web/dist/assets/chapel-B-OvrOL5.js +1 -0
  70. package/dist/assets/web/dist/assets/clarity-CtfBBspg.js +1 -0
  71. package/dist/assets/web/dist/assets/clojure-DqKBuwfJ.js +1 -0
  72. package/dist/assets/web/dist/assets/cmake-Bj61d0ZC.js +1 -0
  73. package/dist/assets/web/dist/assets/cobol-Ch3EPlHu.js +1 -0
  74. package/dist/assets/web/dist/assets/codeowners-C8r90Shi.js +1 -0
  75. package/dist/assets/web/dist/assets/codeql-oeQT6MSM.js +1 -0
  76. package/dist/assets/web/dist/assets/coffee-hZuITnto.js +1 -0
  77. package/dist/assets/web/dist/assets/common-lisp-Cv5bFMCO.js +1 -0
  78. package/dist/assets/web/dist/assets/coq-DuBRPxYg.js +1 -0
  79. package/dist/assets/web/dist/assets/cpp-B8iRVo8m.js +1 -0
  80. package/dist/assets/web/dist/assets/crystal-DKveI7lr.js +1 -0
  81. package/dist/assets/web/dist/assets/csharp-oqKa8noW.js +1 -0
  82. package/dist/assets/web/dist/assets/css-_2_CD-rr.js +1 -0
  83. package/dist/assets/web/dist/assets/csv-Dx-8-gkx.js +1 -0
  84. package/dist/assets/web/dist/assets/cue-CE9AQfxI.js +1 -0
  85. package/dist/assets/web/dist/assets/cypher-ClKdZ_lG.js +1 -0
  86. package/dist/assets/web/dist/assets/d-qD-0Kul2.js +1 -0
  87. package/dist/assets/web/dist/assets/dark-plus-Cs2F2srj.js +1 -0
  88. package/dist/assets/web/dist/assets/dart-CnvKMtbv.js +1 -0
  89. package/dist/assets/web/dist/assets/dax-BkyTk9wS.js +1 -0
  90. package/dist/assets/web/dist/assets/desktop-Dlh5hvp9.js +1 -0
  91. package/dist/assets/web/dist/assets/diff-woXpYk--.js +1 -0
  92. package/dist/assets/web/dist/assets/dist-BoLiHpua.js +1547 -0
  93. package/dist/assets/web/dist/assets/docker-IyjqRm3v.js +1 -0
  94. package/dist/assets/web/dist/assets/dotenv-_5a1GRtc.js +1 -0
  95. package/dist/assets/web/dist/assets/dracula-BHWKrbxM.js +1 -0
  96. package/dist/assets/web/dist/assets/dracula-soft-5eyTD99u.js +1 -0
  97. package/dist/assets/web/dist/assets/dream-maker-DW3nJb8Q.js +1 -0
  98. package/dist/assets/web/dist/assets/edge-BenMDPct.js +1 -0
  99. package/dist/assets/web/dist/assets/elixir-CBbdEqG6.js +1 -0
  100. package/dist/assets/web/dist/assets/elm-DMub_2lY.js +1 -0
  101. package/dist/assets/web/dist/assets/emacs-lisp-c_oH4hRZ.js +1 -0
  102. package/dist/assets/web/dist/assets/erb-CI9He_Up.js +1 -0
  103. package/dist/assets/web/dist/assets/erlang-Cphh6RMH.js +1 -0
  104. package/dist/assets/web/dist/assets/everforest-dark-sB-x3p7T.js +1 -0
  105. package/dist/assets/web/dist/assets/everforest-light-Df2xbC6M.js +1 -0
  106. package/dist/assets/web/dist/assets/{favicon-CFfbl2AI.js → favicon-CWPcvWvp.js} +1 -1
  107. package/dist/assets/web/dist/assets/fennel-DQxkIbk2.js +1 -0
  108. package/dist/assets/web/dist/assets/fish-BJitypiv.js +1 -0
  109. package/dist/assets/web/dist/assets/fluent-C03EYrpw.js +1 -0
  110. package/dist/assets/web/dist/assets/fortran-fixed-form-DEKoE2YW.js +1 -0
  111. package/dist/assets/web/dist/assets/fortran-free-form-CYNrtFtB.js +1 -0
  112. package/dist/assets/web/dist/assets/fsharp-D13ZGOAj.js +1 -0
  113. package/dist/assets/web/dist/assets/gdresource-xMC7jr7x.js +1 -0
  114. package/dist/assets/web/dist/assets/gdscript-DYvRD3hg.js +1 -0
  115. package/dist/assets/web/dist/assets/gdshader-CBce3t8t.js +1 -0
  116. package/dist/assets/web/dist/assets/genie-CV2tkWYe.js +1 -0
  117. package/dist/assets/web/dist/assets/gherkin-DExj1W_8.js +1 -0
  118. package/dist/assets/web/dist/assets/git-commit-BSykSTBG.js +1 -0
  119. package/dist/assets/web/dist/assets/git-rebase-BBfhnyF8.js +1 -0
  120. package/dist/assets/web/dist/assets/github-dark-C-LZuMrd.js +1 -0
  121. package/dist/assets/web/dist/assets/github-dark-default-DXG-b-1a.js +1 -0
  122. package/dist/assets/web/dist/assets/github-dark-dimmed-Bx1FflLF.js +1 -0
  123. package/dist/assets/web/dist/assets/github-dark-high-contrast-B_tTalzw.js +1 -0
  124. package/dist/assets/web/dist/assets/github-light-EUqPIrTm.js +1 -0
  125. package/dist/assets/web/dist/assets/github-light-default-BXViO-2h.js +1 -0
  126. package/dist/assets/web/dist/assets/github-light-high-contrast-B68TUdTA.js +1 -0
  127. package/dist/assets/web/dist/assets/gleam-CSRkHgEL.js +1 -0
  128. package/dist/assets/web/dist/assets/glimmer-js-CR9Fxrau.js +1 -0
  129. package/dist/assets/web/dist/assets/glimmer-ts-CwFwX_XS.js +1 -0
  130. package/dist/assets/web/dist/assets/glsl-Daiodp1r.js +1 -0
  131. package/dist/assets/web/dist/assets/gn-ilITqXS6.js +1 -0
  132. package/dist/assets/web/dist/assets/gnuplot-7GGW24-e.js +1 -0
  133. package/dist/assets/web/dist/assets/go-rLFTqkRN.js +1 -0
  134. package/dist/assets/web/dist/assets/graphql-DZvrsEkB.js +1 -0
  135. package/dist/assets/web/dist/assets/groovy-CacY0gHj.js +1 -0
  136. package/dist/assets/web/dist/assets/gruvbox-dark-hard-C820rvS2.js +1 -0
  137. package/dist/assets/web/dist/assets/gruvbox-dark-medium-BPjhmG05.js +1 -0
  138. package/dist/assets/web/dist/assets/gruvbox-dark-soft-MrdJrrXF.js +1 -0
  139. package/dist/assets/web/dist/assets/gruvbox-light-hard-BC_s9l72.js +1 -0
  140. package/dist/assets/web/dist/assets/gruvbox-light-medium-BAWPOn9u.js +1 -0
  141. package/dist/assets/web/dist/assets/gruvbox-light-soft-BSMLrYjP.js +1 -0
  142. package/dist/assets/web/dist/assets/hack-BaXOzdg7.js +1 -0
  143. package/dist/assets/web/dist/assets/haml-CMskq_VA.js +1 -0
  144. package/dist/assets/web/dist/assets/handlebars-Dhw_f7jD.js +1 -0
  145. package/dist/assets/web/dist/assets/haskell-D8IpX4py.js +1 -0
  146. package/dist/assets/web/dist/assets/haxe-C8oCnwJJ.js +1 -0
  147. package/dist/assets/web/dist/assets/hcl-Dh228itO.js +1 -0
  148. package/dist/assets/web/dist/assets/hjson-CxZEssPk.js +1 -0
  149. package/dist/assets/web/dist/assets/hlsl-Cvrh5tZx.js +1 -0
  150. package/dist/assets/web/dist/assets/horizon-CE9ld1lL.js +1 -0
  151. package/dist/assets/web/dist/assets/horizon-bright-DSNQnXHK.js +1 -0
  152. package/dist/assets/web/dist/assets/houston-CsvMBhTu.js +1 -0
  153. package/dist/assets/web/dist/assets/html-C9k99z0z.js +1 -0
  154. package/dist/assets/web/dist/assets/html-derivative-VckPItXN.js +1 -0
  155. package/dist/assets/web/dist/assets/http-DXU_3h9v.js +1 -0
  156. package/dist/assets/web/dist/assets/hurl-KU24JNdp.js +1 -0
  157. package/dist/assets/web/dist/assets/hxml-Dcm88srW.js +1 -0
  158. package/dist/assets/web/dist/assets/hy-CZbG8q4J.js +1 -0
  159. package/dist/assets/web/dist/assets/imba-DsUTQ-LC.js +1 -0
  160. package/dist/assets/web/dist/assets/indexFormat-B-pd4r7Y.js +1 -0
  161. package/dist/assets/web/dist/assets/ini-B5eOa1yu.js +1 -0
  162. package/dist/assets/web/dist/assets/java-BbZjTNgf.js +1 -0
  163. package/dist/assets/web/dist/assets/javascript-DXCdqcZZ.js +1 -0
  164. package/dist/assets/web/dist/assets/jinja-pDlsjTVp.js +1 -0
  165. package/dist/assets/web/dist/assets/jison-DsXDk66e.js +1 -0
  166. package/dist/assets/web/dist/assets/json-tCxXfRgG.js +1 -0
  167. package/dist/assets/web/dist/assets/json5-BR5RXkoi.js +1 -0
  168. package/dist/assets/web/dist/assets/jsonc-CYpm1nAK.js +1 -0
  169. package/dist/assets/web/dist/assets/jsonl-CmCQp5Yx.js +1 -0
  170. package/dist/assets/web/dist/assets/jsonnet-CJTPZ8u_.js +1 -0
  171. package/dist/assets/web/dist/assets/jssm-DXw9l8Rf.js +1 -0
  172. package/dist/assets/web/dist/assets/jsx-B0ZYkCmi.js +1 -0
  173. package/dist/assets/web/dist/assets/julia-BLzzeI6x.js +1 -0
  174. package/dist/assets/web/dist/assets/just-DvD2_60c.js +1 -0
  175. package/dist/assets/web/dist/assets/kanagawa-dragon-Bozd7klA.js +1 -0
  176. package/dist/assets/web/dist/assets/kanagawa-lotus-BmuOG9ZW.js +1 -0
  177. package/dist/assets/web/dist/assets/kanagawa-wave-BML5mF2J.js +1 -0
  178. package/dist/assets/web/dist/assets/kdl-CsD5j6eV.js +1 -0
  179. package/dist/assets/web/dist/assets/kotlin-DhhofPvG.js +1 -0
  180. package/dist/assets/web/dist/assets/kusto-C7mF5XQf.js +1 -0
  181. package/dist/assets/web/dist/assets/laserwave-C_8bwKvT.js +1 -0
  182. package/dist/assets/web/dist/assets/latex-511zn3h7.js +1 -0
  183. package/dist/assets/web/dist/assets/lean-CewbzKMR.js +1 -0
  184. package/dist/assets/web/dist/assets/less-DVTAwKKz.js +1 -0
  185. package/dist/assets/web/dist/assets/light-plus-DVQuIRkW.js +1 -0
  186. package/dist/assets/web/dist/assets/liquid-BD0BkMox.js +1 -0
  187. package/dist/assets/web/dist/assets/llvm-DqHOMS-s.js +1 -0
  188. package/dist/assets/web/dist/assets/log-BNLmms1o.js +1 -0
  189. package/dist/assets/web/dist/assets/logo-Cluzi2Zq.js +1 -0
  190. package/dist/assets/web/dist/assets/lua-NFicKm6N.js +1 -0
  191. package/dist/assets/web/dist/assets/luau-C2pBCSgt.js +1 -0
  192. package/dist/assets/web/dist/assets/main-i3ZNDRLK.css +1 -0
  193. package/dist/assets/web/dist/assets/main-tYcFk9Dc.js +28 -0
  194. package/dist/assets/web/dist/assets/make-Dixweg8N.js +1 -0
  195. package/dist/assets/web/dist/assets/markdown-BYOwaDjH.js +1 -0
  196. package/dist/assets/web/dist/assets/marko-1-G_nEXK.js +1 -0
  197. package/dist/assets/web/dist/assets/material-theme-Bm3Qr25_.js +1 -0
  198. package/dist/assets/web/dist/assets/material-theme-darker-2IIEA8gg.js +1 -0
  199. package/dist/assets/web/dist/assets/material-theme-lighter-uhdI0v04.js +1 -0
  200. package/dist/assets/web/dist/assets/material-theme-ocean-CHQ94UKr.js +1 -0
  201. package/dist/assets/web/dist/assets/material-theme-palenight-B5W6OYN7.js +1 -0
  202. package/dist/assets/web/dist/assets/matlab-D7qyCx1q.js +1 -0
  203. package/dist/assets/web/dist/assets/mdc-DUe3AQLp.js +1 -0
  204. package/dist/assets/web/dist/assets/mdx-DQZ5AkYe.js +1 -0
  205. package/dist/assets/web/dist/assets/mermaid-BxpfTIzt.js +1 -0
  206. package/dist/assets/web/dist/assets/min-dark-BSWPekZh.js +1 -0
  207. package/dist/assets/web/dist/assets/min-light-DDpmG2fV.js +1 -0
  208. package/dist/assets/web/dist/assets/mipsasm-BMqwQI7S.js +1 -0
  209. package/dist/assets/web/dist/assets/mojo-fg40_ntQ.js +1 -0
  210. package/dist/assets/web/dist/assets/monokai-B_bV9PQ9.js +1 -0
  211. package/dist/assets/web/dist/assets/moonbit-DgjMoLWr.js +1 -0
  212. package/dist/assets/web/dist/assets/move-BYnGhZoM.js +1 -0
  213. package/dist/assets/web/dist/assets/narrat-_X_XdTYD.js +1 -0
  214. package/dist/assets/web/dist/assets/nextflow-BJtWHP5T.js +1 -0
  215. package/dist/assets/web/dist/assets/nextflow-groovy-DJMQeKeT.js +1 -0
  216. package/dist/assets/web/dist/assets/nginx-Dg379_bA.js +1 -0
  217. package/dist/assets/web/dist/assets/night-owl-DhmEMT88.js +1 -0
  218. package/dist/assets/web/dist/assets/night-owl-light-eJ-hLW7d.js +1 -0
  219. package/dist/assets/web/dist/assets/nim-BnFq97ZO.js +1 -0
  220. package/dist/assets/web/dist/assets/nix-IvuFDN5E.js +1 -0
  221. package/dist/assets/web/dist/assets/nord-Cb4Vim4T.js +1 -0
  222. package/dist/assets/web/dist/assets/nsis-CjNLYCLg.js +1 -0
  223. package/dist/assets/web/dist/assets/nushell-DHYfO66s.js +1 -0
  224. package/dist/assets/web/dist/assets/objective-c-D1A_Heim.js +1 -0
  225. package/dist/assets/web/dist/assets/objective-cpp-BsSzOQcm.js +1 -0
  226. package/dist/assets/web/dist/assets/ocaml-O90oeIOV.js +1 -0
  227. package/dist/assets/web/dist/assets/odin-B1RWQWA5.js +1 -0
  228. package/dist/assets/web/dist/assets/one-dark-pro-CLwyXe_n.js +1 -0
  229. package/dist/assets/web/dist/assets/one-light-D7Lr4KcI.js +1 -0
  230. package/dist/assets/web/dist/assets/openscad-BUDT5pXO.js +1 -0
  231. package/dist/assets/web/dist/assets/org-F0uiwGvq.js +1 -0
  232. package/dist/assets/web/dist/assets/pascal-4ZHwLPI5.js +1 -0
  233. package/dist/assets/web/dist/assets/perl-B0euczkl.js +1 -0
  234. package/dist/assets/web/dist/assets/php-DkL3k_n7.js +1 -0
  235. package/dist/assets/web/dist/assets/pierre-dark-CpLgRqie.js +1 -0
  236. package/dist/assets/web/dist/assets/pierre-dark-protanopia-deuteranopia-B35FxJx-.js +1 -0
  237. package/dist/assets/web/dist/assets/pierre-dark-soft-kZQmAZld.js +1 -0
  238. package/dist/assets/web/dist/assets/pierre-dark-tritanopia-CpjhbsIL.js +1 -0
  239. package/dist/assets/web/dist/assets/pierre-dark-vibrant-CpQYzh95.js +1 -0
  240. package/dist/assets/web/dist/assets/pierre-light-CoaEpmwp.js +1 -0
  241. package/dist/assets/web/dist/assets/pierre-light-protanopia-deuteranopia-0fSaH845.js +1 -0
  242. package/dist/assets/web/dist/assets/pierre-light-soft-lWLdNTOI.js +1 -0
  243. package/dist/assets/web/dist/assets/pierre-light-tritanopia-CEbqgOJL.js +1 -0
  244. package/dist/assets/web/dist/assets/pierre-light-vibrant-D80Fkn33.js +1 -0
  245. package/dist/assets/web/dist/assets/pkl-ot-7Btpt.js +1 -0
  246. package/dist/assets/web/dist/assets/plastic-DQwYfKfQ.js +1 -0
  247. package/dist/assets/web/dist/assets/plsql-DGHpHOYJ.js +1 -0
  248. package/dist/assets/web/dist/assets/po-BiJDBrnU.js +1 -0
  249. package/dist/assets/web/dist/assets/poimandres-DRFjx7u4.js +1 -0
  250. package/dist/assets/web/dist/assets/polar-C7UOKdEL.js +1 -0
  251. package/dist/assets/web/dist/assets/postcss-BXeXVLqQ.js +1 -0
  252. package/dist/assets/web/dist/assets/powerquery-DNMTfnFr.js +1 -0
  253. package/dist/assets/web/dist/assets/powershell-CCSX75yM.js +1 -0
  254. package/dist/assets/web/dist/assets/prisma-DMgNhnYS.js +1 -0
  255. package/dist/assets/web/dist/assets/prolog-iXnhIJG7.js +1 -0
  256. package/dist/assets/web/dist/assets/proto-DB4EqR-F.js +1 -0
  257. package/dist/assets/web/dist/assets/pug-L_OjjZP4.js +1 -0
  258. package/dist/assets/web/dist/assets/puppet-CDv2pdJW.js +1 -0
  259. package/dist/assets/web/dist/assets/purescript-9MfHhQsQ.js +1 -0
  260. package/dist/assets/web/dist/assets/python-gzcpVVnB.js +1 -0
  261. package/dist/assets/web/dist/assets/qml-BMjB00Zz.js +1 -0
  262. package/dist/assets/web/dist/assets/qmldir-DCQb3MpD.js +1 -0
  263. package/dist/assets/web/dist/assets/qss-Fe1Jh2GI.js +1 -0
  264. package/dist/assets/web/dist/assets/r-DoeLdnqR.js +1 -0
  265. package/dist/assets/web/dist/assets/racket-DcIDlBhZ.js +1 -0
  266. package/dist/assets/web/dist/assets/raku-B3gFvitq.js +1 -0
  267. package/dist/assets/web/dist/assets/razor-BzYNkAWy.js +1 -0
  268. package/dist/assets/web/dist/assets/rbs-C0MpOrj4.js +1 -0
  269. package/dist/assets/web/dist/assets/red-DX1BQOs8.js +1 -0
  270. package/dist/assets/web/dist/assets/reg-CRGYupPL.js +1 -0
  271. package/dist/assets/web/dist/assets/regexp-CPmElMk3.js +1 -0
  272. package/dist/assets/web/dist/assets/rel-BtDbiS_P.js +1 -0
  273. package/dist/assets/web/dist/assets/riscv-Ckw8ddFX.js +1 -0
  274. package/dist/assets/web/dist/assets/ron-VUp2lXgN.js +1 -0
  275. package/dist/assets/web/dist/assets/rose-pine-aMsaMD1D.js +1 -0
  276. package/dist/assets/web/dist/assets/rose-pine-dawn-8PwUyIlP.js +1 -0
  277. package/dist/assets/web/dist/assets/rose-pine-moon-DO-qXg-I.js +1 -0
  278. package/dist/assets/web/dist/assets/rosmsg-CAekHB0j.js +1 -0
  279. package/dist/assets/web/dist/assets/rst-DrsjgfI7.js +1 -0
  280. package/dist/assets/web/dist/assets/ruby-cB42ppvx.js +1 -0
  281. package/dist/assets/web/dist/assets/rust-Cfkwpbl8.js +1 -0
  282. package/dist/assets/web/dist/assets/sas-R5Y3NM_I.js +1 -0
  283. package/dist/assets/web/dist/assets/sass-DXrisJhu.js +1 -0
  284. package/dist/assets/web/dist/assets/scala-BiFt_7mu.js +1 -0
  285. package/dist/assets/web/dist/assets/scheme-DQCgrYNe.js +1 -0
  286. package/dist/assets/web/dist/assets/scss-C-zWxV9s.js +1 -0
  287. package/dist/assets/web/dist/assets/sdbl-bTVj8UrX.js +1 -0
  288. package/dist/assets/web/dist/assets/seed-DeKSHrt2.js +6 -0
  289. package/dist/assets/web/dist/assets/shaderlab-TOUzSsQk.js +1 -0
  290. package/dist/assets/web/dist/assets/shellscript-oJF96aAU.js +1 -0
  291. package/dist/assets/web/dist/assets/shellsession-CznECKyi.js +1 -0
  292. package/dist/assets/web/dist/assets/slack-dark-DnToyrRv.js +1 -0
  293. package/dist/assets/web/dist/assets/slack-ochin-B2OO5cIa.js +1 -0
  294. package/dist/assets/web/dist/assets/smalltalk-BHpQb5nM.js +1 -0
  295. package/dist/assets/web/dist/assets/smithy-Dgaz7aur.js +1 -0
  296. package/dist/assets/web/dist/assets/snazzy-light-4G7pJPwS.js +1 -0
  297. package/dist/assets/web/dist/assets/solarized-dark-UdsmMDCL.js +1 -0
  298. package/dist/assets/web/dist/assets/solarized-light-C1IUL_tW.js +1 -0
  299. package/dist/assets/web/dist/assets/solidity-Bj7E1mRn.js +1 -0
  300. package/dist/assets/web/dist/assets/soy-wjHLSRag.js +1 -0
  301. package/dist/assets/web/dist/assets/sparql-D_iOobhT.js +1 -0
  302. package/dist/assets/web/dist/assets/splunk-BC2Px7Mm.js +1 -0
  303. package/dist/assets/web/dist/assets/sql-C_BM8IOW.js +1 -0
  304. package/dist/assets/web/dist/assets/ssh-config-BgfXC-Er.js +1 -0
  305. package/dist/assets/web/dist/assets/stata-D31HO8aQ.js +1 -0
  306. package/dist/assets/web/dist/assets/stylus-B6D30XZt.js +1 -0
  307. package/dist/assets/web/dist/assets/surrealql-CKCLyplA.js +1 -0
  308. package/dist/assets/web/dist/assets/svelte-3geWk2iu.js +1 -0
  309. package/dist/assets/web/dist/assets/swift-CyEgAFGc.js +1 -0
  310. package/dist/assets/web/dist/assets/synthwave-84-nFMaYfgc.js +1 -0
  311. package/dist/assets/web/dist/assets/system-verilog-Dh5ihWbf.js +1 -0
  312. package/dist/assets/web/dist/assets/systemd-BxMlprV5.js +1 -0
  313. package/dist/assets/web/dist/assets/talonscript-CohzipZa.js +1 -0
  314. package/dist/assets/web/dist/assets/tasl-DMoTqEGO.js +1 -0
  315. package/dist/assets/web/dist/assets/tcl-CZd0xW_V.js +1 -0
  316. package/dist/assets/web/dist/assets/templ-DiJr_hTD.js +1 -0
  317. package/dist/assets/web/dist/assets/terraform-DswuEJGm.js +1 -0
  318. package/dist/assets/web/dist/assets/tex-BEJGWyeF.js +1 -0
  319. package/dist/assets/web/dist/assets/tokyo-night-oM2G3aXe.js +1 -0
  320. package/dist/assets/web/dist/assets/toml-CcmNWLt0.js +1 -0
  321. package/dist/assets/web/dist/assets/ts-tags-C8Mzdpxx.js +1 -0
  322. package/dist/assets/web/dist/assets/tsv-sltzmVWM.js +1 -0
  323. package/dist/assets/web/dist/assets/tsx-UQiSm_p3.js +1 -0
  324. package/dist/assets/web/dist/assets/turtle-ByJddavk.js +1 -0
  325. package/dist/assets/web/dist/assets/twig-_Pvzkeo9.js +1 -0
  326. package/dist/assets/web/dist/assets/typescript-BWMkINKK.js +1 -0
  327. package/dist/assets/web/dist/assets/typespec-BRdr0IET.js +1 -0
  328. package/dist/assets/web/dist/assets/typst-Bdg9m-e7.js +1 -0
  329. package/dist/assets/web/dist/assets/v-DBj4K9d_.js +1 -0
  330. package/dist/assets/web/dist/assets/vala-zf12oZj6.js +1 -0
  331. package/dist/assets/web/dist/assets/vb-DOwzaHZ0.js +1 -0
  332. package/dist/assets/web/dist/assets/verilog-B2gwz-sJ.js +1 -0
  333. package/dist/assets/web/dist/assets/vesper-DdrHHSXu.js +1 -0
  334. package/dist/assets/web/dist/assets/vhdl-BroJfC0k.js +1 -0
  335. package/dist/assets/web/dist/assets/viml-DvXPmvsu.js +1 -0
  336. package/dist/assets/web/dist/assets/vitesse-black-fwtXNY1n.js +1 -0
  337. package/dist/assets/web/dist/assets/vitesse-dark-BZCL-v6S.js +1 -0
  338. package/dist/assets/web/dist/assets/vitesse-light-VbXTXTou.js +1 -0
  339. package/dist/assets/web/dist/assets/vue-CDZrrAZ8.js +1 -0
  340. package/dist/assets/web/dist/assets/vue-html-tAlpNhfN.js +1 -0
  341. package/dist/assets/web/dist/assets/vue-vine-C27UF_rh.js +1 -0
  342. package/dist/assets/web/dist/assets/vyper-CgoNMtux.js +1 -0
  343. package/dist/assets/web/dist/assets/wallClock-61NpVkY6.js +1 -0
  344. package/dist/assets/web/dist/assets/wasm-BnjxR4X6.js +1 -0
  345. package/dist/assets/web/dist/assets/wasm-ByWQv1Qj.js +1 -0
  346. package/dist/assets/web/dist/assets/wenyan-C8pVoKbM.js +1 -0
  347. package/dist/assets/web/dist/assets/wgsl-BsKzXJz4.js +1 -0
  348. package/dist/assets/web/dist/assets/wikitext-ClFFjSW2.js +1 -0
  349. package/dist/assets/web/dist/assets/wit-DdvCle-K.js +1 -0
  350. package/dist/assets/web/dist/assets/wolfram-DLL8P-h_.js +1 -0
  351. package/dist/assets/web/dist/assets/xml-CxeDr9Zh.js +1 -0
  352. package/dist/assets/web/dist/assets/xsl-Bpi0uUnM.js +1 -0
  353. package/dist/assets/web/dist/assets/yaml-BtUgZ1GN.js +1 -0
  354. package/dist/assets/web/dist/assets/zenscript-BnlCZFoB.js +1 -0
  355. package/dist/assets/web/dist/assets/zig-CMLA9XwU.js +1 -0
  356. package/dist/cli.js +1120 -252
  357. package/package.json +1 -1
  358. package/dist/assets/web/dist/assets/AppShell-Bw3-_TTE.js +0 -1
  359. package/dist/assets/web/dist/assets/DeliveryPage-BRwcQyr7.js +0 -1
  360. package/dist/assets/web/dist/assets/NotFoundPage-RjH-9dPy.js +0 -1
  361. package/dist/assets/web/dist/assets/ResidentDetailPage-BRy5wkv9.js +0 -1
  362. package/dist/assets/web/dist/assets/ResidentsIndexPage-DAEVLN8j.js +0 -1
  363. package/dist/assets/web/dist/assets/RunRoutePage-B1KHmkZ9.js +0 -126
  364. package/dist/assets/web/dist/assets/RunRoutePage-CdbrbqU2.css +0 -1
  365. package/dist/assets/web/dist/assets/RunsIndexPage-3hUWFpFV.js +0 -1
  366. package/dist/assets/web/dist/assets/RunsTabs-Qn_5TVJU.js +0 -1
  367. package/dist/assets/web/dist/assets/ScheduledPage-DysVvVm1.js +0 -1
  368. package/dist/assets/web/dist/assets/StatusDot-Bug2a6T6.js +0 -1
  369. package/dist/assets/web/dist/assets/Tooltip-C2eEUbwn.js +0 -1
  370. package/dist/assets/web/dist/assets/main-0uhp-taL.js +0 -28
  371. package/dist/assets/web/dist/assets/main-Xickfv8V.css +0 -1
  372. package/dist/assets/web/dist/assets/seed-B8mQEhhw.js +0 -6
  373. package/dist/assets/web/dist/assets/wallClock-DI4HIEN5.js +0 -1
@@ -41,6 +41,7 @@ defaults:
41
41
  general: anthropic/claude-haiku-4-5
42
42
  coding: anthropic/claude-opus-5
43
43
  review: anthropic/claude-opus-5
44
+ explore: anthropic/claude-opus-5 # the two-hour read-only investigation (docs/reference/specs/agent-explore.md)
44
45
  # Default model effort per agent: low | medium | high (how hard the model
45
46
  # thinks per turn; lower = much faster turns). Same layering as models —
46
47
  # per-channel/user `effort` / `efforts.<agent>` and a per-request `effort:`
@@ -48,6 +49,21 @@ defaults:
48
49
  # provider default. Skipped for models without effort support.
49
50
  # efforts:
50
51
  # coding: medium
52
+ # A boundary caps what ANY run in a scope may have — never grants — on the
53
+ # three axes of a run's profile (docs/reference/specs/routing-and-config.md item 2):
54
+ # maxMinutes (the wall-clock budget; at least 2), maxIdentity (the credential
55
+ # a run acts as: none < read < write) and machines (the classes its tools may
56
+ # execute on: none, blank, repo-cold, repo-resident). Unlike every other
57
+ # setting, boundaries INTERSECT across defaults, channel and user — the
58
+ # smallest budget, the lowest identity, the classes every layer allows — so a
59
+ # channel or a user can only tighten what is set here. A budget above a cap is
60
+ # clipped (the card and the run record say so); a preset whose identity or
61
+ # class is above a cap is refused by name before any executor exists. Absent →
62
+ # nothing is capped and every preset runs exactly its declared profile.
63
+ # boundary:
64
+ # maxMinutes: 120
65
+ # maxIdentity: write
66
+ # machines: [none, blank, repo-cold, repo-resident]
51
67
 
52
68
  # PR reviews and the reading diff (docs/reference/specs/reading-diff.md). Every
53
69
  # review records its full `git diff`; the ABRIDGED version (meat.dev, run on
@@ -72,6 +88,12 @@ defaults:
72
88
  # review: anthropic/claude-opus-5
73
89
  # efforts:
74
90
  # coding: medium
91
+ # # Cap this channel's runs (see defaults.boundary): here every run acts
92
+ # # with at most a read credential — `agent:coding` is refused by name,
93
+ # # `agent:review` runs — and no run gets more than 45 minutes.
94
+ # boundary:
95
+ # maxMinutes: 45
96
+ # maxIdentity: read
75
97
 
76
98
  # Static per-user defaults (user ID -> scope).
77
99
  # users:
@@ -249,10 +271,13 @@ workspaceDir: ./workspaces
249
271
  # <task>` runs the coding → review → fix loop to LGTM as one pipeline: at most
250
272
  # `maxRounds` review rounds and `maxMinutes` minutes of wall clock — whichever
251
273
  # hits first ends the loop, and each child round's own budget is clipped to the
252
- # remaining pipeline time. Defaults shown; both must be integers >= 1.
274
+ # remaining pipeline time. `maxMinutes` is the ship preset's declared budget:
275
+ # a channel or user `boundary.maxMinutes` and a per-message `budget:` directive
276
+ # clip it like any preset's, and the card says so. Defaults shown; both must be
277
+ # integers >= 1.
253
278
  # ship:
254
279
  # maxRounds: 3 # review rounds per pipeline
255
- # maxMinutes: 120 # pipeline wall-clock budget in minutes
280
+ # maxMinutes: 120 # the ship preset's wall-clock budget in minutes (the registry's default)
256
281
 
257
282
  # Spend reporting: GET /costs (Access-gated). Optional. See docs/reference/specs/costs.md.
258
283
  # costs:
@@ -273,7 +298,7 @@ workspaceDir: ./workspaces
273
298
  # anthropicWorkspaceId: wrkspc_... # this app's Anthropic workspace
274
299
 
275
300
  # Delivery indicators: GET /delivery and `delivery report` (docs/reference/specs/delivery.md).
276
- # Optional. Needs a GitHub credential (the App triple or GH_TOKEN); read-only.
301
+ # Optional. Needs a GitHub credential (the App triple or GH_TOKEN); read-only on GitHub.
277
302
  # delivery:
278
303
  # repos: [acme/api, acme/web] # the repositories the page serves; the first is its default
279
304
  # # (`delivery report --repo owner/name` needs no entry here)
@@ -281,6 +306,10 @@ workspaceDir: ./workspaces
281
306
  # # beside this installation's own App identity
282
307
  # agentLogins: [] # logins that are agents beyond the `[bot]` suffix
283
308
  # agentCoauthors: [Claude] # `Co-Authored-By:` names that mark a commit as an agent's
309
+ # snapshot: # each repository's facts are read from GitHub on an interval and
310
+ # everyMinutes: 60 # served from that snapshot (its age on the page; `?fresh=1` /
311
+ # # `--fresh` read now); 5–1440 minutes, default 60. Kept on the
312
+ # # state Worker any `*.worker` block below names; in memory without one
284
313
 
285
314
  # Dashboard authentication (docs/reference/specs/access-gate.md). Everything the dashboard
286
315
  # serves — /runs*, /residents*, /costs*, /mcp/connect/*, and every /api/* command
@@ -10,6 +10,8 @@ import {
10
10
  } from "../../src/core/memory/engine.ts";
11
11
  import { tokenize } from "../../src/core/memory/scorer.ts";
12
12
  import { FIRING_DETAIL_MAX, isScheduleFiring, type ScheduleFiring } from "../../src/core/schedules.ts";
13
+ import { REPO_SLUG } from "../../src/core/delivery.ts";
14
+ import { isDeliverySnapshot, type DeliverySnapshot } from "../../src/core/deliverySnapshotStore.ts";
13
15
  import {
14
16
  applyRetention,
15
17
  clampRetentionPolicy,
@@ -127,9 +129,14 @@ export interface Env {
127
129
  CONFIG: DurableObjectNamespace<ConfigDO>;
128
130
  /** Live-run transcripts (run-history item 32): one RunTranscriptDO per live run, named by run id. */
129
131
  RUN_TRANSCRIPTS: DurableObjectNamespace<RunTranscriptDO>;
132
+ /** Delivery snapshots (delivery item 10): ONE DeliveryDO (named "delivery"), one snapshot per repository. */
133
+ DELIVERY: DurableObjectNamespace<DeliveryDO>;
130
134
  MEMORY_TOKEN?: string;
131
135
  }
132
136
 
137
+ /** The single DeliveryDO's name — every repository's snapshot lives in one object. */
138
+ const DELIVERY_OBJECT = "delivery";
139
+
133
140
  /** The single ConfigDO's name. */
134
141
  const CONFIG_OBJECT = "config";
135
142
  /** A config document key: short, lowercase, like `overrides`. */
@@ -700,6 +707,112 @@ function parseStored<T>(text: string, guard: (v: unknown) => v is T): T | null {
700
707
  }
701
708
  }
702
709
 
710
+ // ---------------------------------------------------------------------------
711
+ // Durable Object: delivery snapshots, one per repository
712
+ // ---------------------------------------------------------------------------
713
+
714
+ // The delivery page's snapshot (docs/reference/specs/delivery.md item 10): the
715
+ // merged pull requests' facts over the snapshot window, as GitHub gave them,
716
+ // and when they were read. A busy repository's window is a few MB — the review
717
+ // bodies and every workflow run of every branch — so a snapshot is stored as
718
+ // one row per pull request under a meta row, never as one JSON value (the
719
+ // per-row limit is 2 MB). A put replaces the repository's snapshot whole, in
720
+ // one transaction; a get reassembles it in pull request number order.
721
+
722
+ /** One pull request's facts may not exceed a fraction of the row limit; the fence names the pull request. */
723
+ const MAX_PULL_REQUEST_FACTS_BYTES = 1024 * 1024;
724
+
725
+ export class DeliveryDO extends DurableObject<Env> {
726
+ private readonly sql: SqlStorage;
727
+
728
+ constructor(ctx: DurableObjectState, env: Env) {
729
+ super(ctx, env);
730
+ this.sql = ctx.storage.sql;
731
+ this.sql.exec(`
732
+ CREATE TABLE IF NOT EXISTS snapshots (
733
+ repo TEXT PRIMARY KEY,
734
+ snapshot_at TEXT NOT NULL,
735
+ meta TEXT NOT NULL
736
+ );
737
+ CREATE TABLE IF NOT EXISTS pull_requests (
738
+ repo TEXT NOT NULL,
739
+ number INTEGER NOT NULL,
740
+ facts TEXT NOT NULL,
741
+ PRIMARY KEY (repo, number)
742
+ );
743
+ `);
744
+ }
745
+
746
+ /** Replace the repository's snapshot: the meta row and one row per pull request, in one transaction. */
747
+ async put(snapshot: DeliverySnapshot): Promise<number> {
748
+ const { prs, ...meta } = snapshot;
749
+ this.ctx.storage.transactionSync(() => {
750
+ this.sql.exec(`DELETE FROM pull_requests WHERE repo = ?`, snapshot.repo);
751
+ for (const pr of prs) {
752
+ this.sql.exec(
753
+ `INSERT OR REPLACE INTO pull_requests (repo, number, facts) VALUES (?, ?, ?)`,
754
+ snapshot.repo,
755
+ pr.number,
756
+ JSON.stringify(pr),
757
+ );
758
+ }
759
+ this.sql.exec(
760
+ `INSERT OR REPLACE INTO snapshots (repo, snapshot_at, meta) VALUES (?, ?, ?)`,
761
+ snapshot.repo,
762
+ snapshot.snapshotAt,
763
+ JSON.stringify(meta),
764
+ );
765
+ });
766
+ return prs.length;
767
+ }
768
+
769
+ /** The repository's snapshot, pull requests in number order; null when none was stored. */
770
+ async get(repo: string): Promise<DeliverySnapshot | null> {
771
+ const row = this.sql.exec<{ meta: string }>(`SELECT meta FROM snapshots WHERE repo = ?`, repo).toArray()[0];
772
+ if (!row) return null;
773
+ const prs = this.sql
774
+ .exec<{ facts: string }>(`SELECT facts FROM pull_requests WHERE repo = ? ORDER BY number`, repo)
775
+ .toArray()
776
+ .map((r) => JSON.parse(r.facts) as DeliverySnapshot["prs"][number]);
777
+ return { ...(JSON.parse(row.meta) as Omit<DeliverySnapshot, "prs">), prs };
778
+ }
779
+ }
780
+
781
+ const DELIVERY_ROUTES = new Set(["/delivery/get", "/delivery/put"]);
782
+
783
+ async function handleDelivery(pathname: string, body: unknown, env: Env): Promise<Response> {
784
+ const b = (typeof body === "object" && body !== null ? body : {}) as Record<string, unknown>;
785
+ const dO = env.DELIVERY.get(env.DELIVERY.idFromName(DELIVERY_OBJECT));
786
+ if (pathname === "/delivery/get") {
787
+ if (typeof b.repo !== "string" || !REPO_SLUG.test(b.repo)) return json({ error: "repo must be owner/name" }, 400);
788
+ const snapshot = await dO.get(b.repo);
789
+ console.log(
790
+ `[delivery/get] ${b.repo} -> ${snapshot ? `${snapshot.prs.length} pull requests as of ${snapshot.snapshotAt}` : "none"}`,
791
+ );
792
+ return json({ snapshot });
793
+ }
794
+ if (pathname === "/delivery/put") {
795
+ if (!isDeliverySnapshot(b.snapshot))
796
+ return json(
797
+ { error: "snapshot must be a DeliverySnapshot (repo, snapshotAt, range, prs[], truncated, completeFrom)" },
798
+ 400,
799
+ );
800
+ const encoder = new TextEncoder();
801
+ const oversized = b.snapshot.prs.find(
802
+ (pr) => encoder.encode(JSON.stringify(pr)).byteLength > MAX_PULL_REQUEST_FACTS_BYTES,
803
+ );
804
+ if (oversized)
805
+ return json(
806
+ { error: `pull request ${oversized.number}'s facts must be at most ${MAX_PULL_REQUEST_FACTS_BYTES} bytes` },
807
+ 413,
808
+ );
809
+ const prs = await dO.put(b.snapshot);
810
+ console.log(`[delivery/put] ${b.snapshot.repo} <- ${prs} pull requests as of ${b.snapshot.snapshotAt}`);
811
+ return json({ ok: true, prs });
812
+ }
813
+ return json({ error: "not found" }, 404);
814
+ }
815
+
703
816
  /** Documents are small; a body over this is refused before storage. */
704
817
  const MAX_CONFIG_DOCUMENT_BYTES = 256 * 1024;
705
818
 
@@ -2180,6 +2293,16 @@ const LEDGER_ROUTES = new Set([
2180
2293
 
2181
2294
  /** Routes whose bodies may carry a record, a transcript chunk, or an event batch. */
2182
2295
  const WIDE_BODY_ROUTES = new Set(["/runs/put", "/runs/finish", "/runs/append", "/runs/transcript/write"]);
2296
+ /** A delivery snapshot: every merged pull request's reviews and its branch's workflow runs over
2297
+ * the window — a busy repository's runs to a few MB (measured: 291 pull requests, 2.1 MB). */
2298
+ const MAX_SNAPSHOT_BODY_BYTES = 8 * 1024 * 1024;
2299
+
2300
+ /** The request body ceiling per route, decided after routing and before the parse. */
2301
+ function bodyFenceFor(pathname: string): number {
2302
+ if (WIDE_BODY_ROUTES.has(pathname)) return MAX_RUN_PUT_BODY_BYTES;
2303
+ if (pathname === "/delivery/put") return MAX_SNAPSHOT_BODY_BYTES;
2304
+ return MAX_BODY_BYTES;
2305
+ }
2183
2306
 
2184
2307
  const gen = (v: unknown): Validated<string> =>
2185
2308
  typeof v === "string" && GEN_PATTERN.test(v)
@@ -2486,6 +2609,7 @@ async function handleRuns(pathname: string, body: unknown, env: Env): Promise<Re
2486
2609
 
2487
2610
  const ROUTES = new Set([
2488
2611
  ...CONFIG_ROUTES,
2612
+ ...DELIVERY_ROUTES,
2489
2613
  "/retrieve",
2490
2614
  "/write",
2491
2615
  "/list",
@@ -2513,7 +2637,7 @@ interface Admission {
2513
2637
  async function handleRequest(request: Request, env: Env, admission: Admission): Promise<Response> {
2514
2638
  const url = new URL(request.url);
2515
2639
  if (url.pathname === "/healthz" && request.method === "GET")
2516
- return json({ ok: true, build: BUILD, features: ["memory", "schedules", "runs", "config"] });
2640
+ return json({ ok: true, build: BUILD, features: ["memory", "schedules", "runs", "config", "delivery"] });
2517
2641
  if (!admission.known) return json({ error: "not found" }, 404);
2518
2642
  if (request.method !== "POST") return json({ error: "method not allowed" }, 405);
2519
2643
  if (!admission.authorized) return json({ error: "unauthorized" }, 401);
@@ -2533,8 +2657,9 @@ async function handleRequest(request: Request, env: Env, admission: Admission):
2533
2657
  return json({ error: "body must declare a numeric Content-Length" }, 411);
2534
2658
  }
2535
2659
  // The ledger's bulk routes carry a finished record, a transcript chunk, or
2536
- // an event batch (32 × 64 KiB) and share /runs/put's fence.
2537
- const maxBodyBytes = WIDE_BODY_ROUTES.has(url.pathname) ? MAX_RUN_PUT_BODY_BYTES : MAX_BODY_BYTES;
2660
+ // an event batch (32 × 64 KiB) and share /runs/put's fence; a delivery
2661
+ // snapshot carries a whole window of pull request facts and has its own.
2662
+ const maxBodyBytes = bodyFenceFor(url.pathname);
2538
2663
  if (Number(header) > maxBodyBytes) {
2539
2664
  return json({ error: `body must be at most ${maxBodyBytes} bytes` }, 413);
2540
2665
  }
@@ -2563,6 +2688,7 @@ async function handleRequest(request: Request, env: Env, admission: Admission):
2563
2688
  }
2564
2689
  if (url.pathname.startsWith("/runs/")) return handleRuns(url.pathname, body, env);
2565
2690
  if (url.pathname.startsWith("/config/")) return handleConfig(url.pathname, body, env);
2691
+ if (url.pathname.startsWith("/delivery/")) return handleDelivery(url.pathname, body, env);
2566
2692
 
2567
2693
  if (url.pathname === "/retrieve") {
2568
2694
  const parsed = parseRetrieve(body);
@@ -31,7 +31,11 @@
31
31
  // transcript a resumed run continues from (docs/reference/specs/run-history.md item
32
32
  // 32). Kept apart from the history object so transcript bytes never queue
33
33
  // behind an admission decision; cleared at finish.
34
- { "name": "RUN_TRANSCRIPTS", "class_name": "RunTranscriptDO" }
34
+ { "name": "RUN_TRANSCRIPTS", "class_name": "RunTranscriptDO" },
35
+ // ONE DeliveryDO (named "delivery"): the delivery page's snapshot per
36
+ // repository — the merged pull requests' facts over the window, one row
37
+ // each, and when they were read (docs/reference/specs/delivery.md item 10).
38
+ { "name": "DELIVERY", "class_name": "DeliveryDO" }
35
39
  ]
36
40
  },
37
41
  // SQLite-backed DOs (durable across restarts — AGENTS.md invariant 6).
@@ -45,6 +49,7 @@
45
49
  // The friction ledger is read from run history (RunHistoryDO carries every
46
50
  // run's diagnosis); the FrictionDO that once mirrored those diagnoses is
47
51
  // retired with its rows — docs/reference/specs/self-improvement.md item 1.
48
- { "tag": "v7", "deleted_classes": ["FrictionDO"] }
52
+ { "tag": "v7", "deleted_classes": ["FrictionDO"] },
53
+ { "tag": "v8", "new_sqlite_classes": ["DeliveryDO"] }
49
54
  ]
50
55
  }
@@ -340,9 +340,12 @@ function streamExec(
340
340
  // command (137 when the follow-up SIGKILL had to) — annotate so the
341
341
  // agent knows what happened and how to adapt.
342
342
  const timedOut = exitCode === 124 || exitCode === 137;
343
+ // A job past the ceiling is detached with `setsid -f`: every /exec
344
+ // runs under `timeout … bash -c`, whose process group is reaped when
345
+ // the command returns, so a plain background job dies with it.
343
346
  const note = timedOut
344
347
  ? `command timed out in the sandbox after ${execTimeoutSecs}s (pass the bash tool's timeoutMs for longer commands, max ${BASH_TIMEOUT_MAX_MS} ms); ` +
345
- "re-run as smaller/faster steps or background it with nohup"
348
+ "re-run as smaller/faster steps, or start it detached with `setsid -f sh -c '<command> > /tmp/job.log 2>&1'` and poll the log on later calls"
346
349
  : "";
347
350
  // The command as the Worker's own root (docs/reference/specs/tracing.md item 22).
348
351
  execRoot(attemptStartedAt, traceparent).end(exitCode === 0 ? "ok" : "error", {