@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
@@ -0,0 +1,200 @@
1
+ import { REPO_SLUG, type DeliveryRange, type PullRequestFacts } from "./delivery.js";
2
+ import { errorSuffix } from "./workerError.js";
3
+
4
+ // Where a repository's delivery snapshot lives (docs/reference/specs/delivery.md item 10):
5
+ // the merged pull requests' facts over the snapshot window, as GitHub gave
6
+ // them, and when they were read. Two implementations of one seam (AGENTS.md
7
+ // invariant 2):
8
+ //
9
+ // - `WorkerDeliverySnapshotStore` — the production choice — an HTTPS client
10
+ // to the `DeliveryDO` on the state Worker (deploy/cloudflare-memory/, one
11
+ // SQLite Durable Object, the same MEMORY_TOKEN bearer as memory, run history
12
+ // and the schedule store), so a bot restart keeps the snapshot (invariant 6)
13
+ // and the first request after one is served, not computed.
14
+ // - `InMemoryDeliverySnapshotStore` — tests, and the process without a state
15
+ // Worker: the snapshot lives as long as the process does.
16
+ //
17
+ // Node-free on purpose: the state Worker imports `isDeliverySnapshot` by
18
+ // relative path so the bot and the Worker validate ONE shape.
19
+ //
20
+ // Route contract (JSON in/out, bearer = the Worker's MEMORY_TOKEN):
21
+ // POST /delivery/get {repo} → {snapshot: DeliverySnapshot | null}
22
+ // POST /delivery/put {snapshot} → {ok: true, prs}
23
+
24
+ /** One repository's facts as a source assembled them, and when. */
25
+ export interface DeliverySnapshot {
26
+ /** `owner/name`. */
27
+ repo: string;
28
+ /** ISO 8601 — when the read from GitHub began. */
29
+ snapshotAt: string;
30
+ /** The window the facts were read for: Monday-start weeks ending on the snapshot day. */
31
+ range: DeliveryRange;
32
+ /** Every pull request merged inside the window that the read reached. */
33
+ prs: PullRequestFacts[];
34
+ /** The listing stopped at its page cap before the window's start — the newest pull requests only. */
35
+ truncated: boolean;
36
+ /** ISO 8601 — every pull request merged at or after this instant is in `prs`: the window's
37
+ * start on a complete read, the oldest update the capped listing reached otherwise. */
38
+ completeFrom: string;
39
+ }
40
+
41
+ const ISO_DAY = /^\d{4}-\d{2}-\d{2}$/;
42
+ const isInstant = (v: unknown): v is string => typeof v === "string" && Number.isFinite(Date.parse(v));
43
+
44
+ /** The fields the arithmetic reads, present and of the right kind; the arrays' rows are the source's. */
45
+ export function isPullRequestFacts(v: unknown): v is PullRequestFacts {
46
+ if (typeof v !== "object" || v === null) return false;
47
+ const p = v as Record<string, unknown>;
48
+ return (
49
+ typeof p.number === "number" &&
50
+ Number.isFinite(p.number) &&
51
+ typeof p.title === "string" &&
52
+ typeof p.author === "string" &&
53
+ isInstant(p.createdAt) &&
54
+ isInstant(p.mergedAt) &&
55
+ (p.firstHeadSha === undefined || typeof p.firstHeadSha === "string") &&
56
+ Array.isArray(p.ci) &&
57
+ Array.isArray(p.reviews) &&
58
+ Array.isArray(p.pushes) &&
59
+ (p.issue === undefined || (typeof p.issue === "object" && p.issue !== null))
60
+ );
61
+ }
62
+
63
+ export function isDeliverySnapshot(v: unknown): v is DeliverySnapshot {
64
+ if (typeof v !== "object" || v === null) return false;
65
+ const s = v as Record<string, unknown>;
66
+ if (typeof s.repo !== "string" || !REPO_SLUG.test(s.repo)) return false;
67
+ if (!isInstant(s.snapshotAt) || !isInstant(s.completeFrom)) return false;
68
+ if (typeof s.truncated !== "boolean") return false;
69
+ const range = s.range as Record<string, unknown> | null | undefined;
70
+ if (
71
+ typeof range !== "object" ||
72
+ range === null ||
73
+ typeof range.since !== "string" ||
74
+ !ISO_DAY.test(range.since) ||
75
+ typeof range.until !== "string" ||
76
+ !ISO_DAY.test(range.until) ||
77
+ typeof range.weeks !== "number" ||
78
+ !Number.isFinite(range.weeks)
79
+ )
80
+ return false;
81
+ return Array.isArray(s.prs) && s.prs.every(isPullRequestFacts);
82
+ }
83
+
84
+ export interface DeliverySnapshotStore {
85
+ /** The repository's stored snapshot, or undefined when none was ever stored. Throws on failure. */
86
+ get(repo: string): Promise<DeliverySnapshot | undefined>;
87
+ /** Replace the repository's snapshot. Throws on failure; callers warn, never crash. */
88
+ put(snapshot: DeliverySnapshot): Promise<void>;
89
+ }
90
+
91
+ export class InMemoryDeliverySnapshotStore implements DeliverySnapshotStore {
92
+ private readonly byRepo = new Map<string, DeliverySnapshot>();
93
+
94
+ async get(repo: string): Promise<DeliverySnapshot | undefined> {
95
+ const s = this.byRepo.get(repo);
96
+ return s ? structuredClone(s) : undefined;
97
+ }
98
+
99
+ async put(snapshot: DeliverySnapshot): Promise<void> {
100
+ this.byRepo.set(snapshot.repo, structuredClone(snapshot));
101
+ }
102
+ }
103
+
104
+ /** Per-request ceiling: a snapshot of a busy repository is a few MB each way. */
105
+ export const SNAPSHOT_WORKER_TIMEOUT_MS = 30_000;
106
+
107
+ export interface WorkerDeliverySnapshotStoreOptions {
108
+ /** Base URL of the state Worker. */
109
+ baseUrl: string;
110
+ /** Bearer secret (MEMORY_TOKEN on the Worker). */
111
+ token: string;
112
+ /** Injectable for tests; defaults to global fetch. */
113
+ fetch?: typeof fetch;
114
+ }
115
+
116
+ export class WorkerDeliverySnapshotStore implements DeliverySnapshotStore {
117
+ private readonly baseUrl: string;
118
+ private readonly fetchImpl: typeof fetch;
119
+
120
+ constructor(private readonly opts: WorkerDeliverySnapshotStoreOptions) {
121
+ this.baseUrl = opts.baseUrl.replace(/\/+$/, "");
122
+ this.fetchImpl = opts.fetch ?? fetch;
123
+ }
124
+
125
+ async get(repo: string): Promise<DeliverySnapshot | undefined> {
126
+ const res = await this.post("/delivery/get", { repo });
127
+ if (!res.ok) throw new Error(`state Worker /delivery/get HTTP ${res.status}${await errorSuffix(res)}`);
128
+ const data = (await res.json().catch(() => ({}))) as Record<string, unknown>;
129
+ if (data.snapshot === null || data.snapshot === undefined) return undefined;
130
+ if (!isDeliverySnapshot(data.snapshot))
131
+ throw new Error(`state Worker /delivery/get: the answer for ${repo} is not a delivery snapshot`);
132
+ return data.snapshot;
133
+ }
134
+
135
+ async put(snapshot: DeliverySnapshot): Promise<void> {
136
+ const res = await this.post("/delivery/put", { snapshot });
137
+ if (!res.ok) throw new Error(`state Worker /delivery/put HTTP ${res.status}${await errorSuffix(res)}`);
138
+ }
139
+
140
+ private post(path: string, body: unknown): Promise<Response> {
141
+ return this.fetchImpl(`${this.baseUrl}${path}`, {
142
+ method: "POST",
143
+ headers: { "content-type": "application/json", authorization: `Bearer ${this.opts.token}` },
144
+ body: JSON.stringify(body),
145
+ signal: AbortSignal.timeout(SNAPSHOT_WORKER_TIMEOUT_MS),
146
+ });
147
+ }
148
+ }
149
+
150
+ /** A `{ baseUrl, tokenEnv? }` reference to the state Worker, as every `*.worker` config block spells it. */
151
+ export interface StateWorkerRef {
152
+ baseUrl: string;
153
+ /** Env var holding the bearer; default MEMORY_TOKEN. */
154
+ tokenEnv?: string;
155
+ }
156
+
157
+ /** The config blocks that may name the state Worker — one Worker, referenced from each capability that uses it. */
158
+ export interface StateWorkerBlocks {
159
+ runtimeOverrides?: { worker?: StateWorkerRef };
160
+ runHistory?: { worker?: StateWorkerRef };
161
+ schedules?: { worker?: StateWorkerRef };
162
+ memory?: { worker?: StateWorkerRef };
163
+ }
164
+
165
+ const DEFAULT_TOKEN_ENV = "MEMORY_TOKEN";
166
+
167
+ /** The slice of the process's `Secrets` the builder reads (src/secrets.ts; named
168
+ * structurally so this module stays free of the bot's Node-only imports for the Worker). */
169
+ export interface SecretReader {
170
+ named(name: string): { reveal(): string } | undefined;
171
+ }
172
+
173
+ /** Process-startup store selection (src/index.ts, the CLI): the Worker store
174
+ * behind whichever `*.worker` block names the state Worker — the snapshot is
175
+ * a cache, so it earns no block of its own — else the in-memory store with a
176
+ * warning naming what a restart then costs. Pure w.r.t. the environment. */
177
+ export function buildDeliverySnapshotStore(
178
+ config: StateWorkerBlocks,
179
+ secrets: SecretReader,
180
+ warn: (message: string) => void,
181
+ ): DeliverySnapshotStore {
182
+ const worker = [config.runtimeOverrides, config.runHistory, config.schedules, config.memory].find(
183
+ (block) => block?.worker?.baseUrl,
184
+ )?.worker;
185
+ if (!worker) {
186
+ warn(
187
+ "delivery snapshots are kept in memory — a restart loses them and the first request after one reads GitHub live. Name the state Worker (runHistory.worker, runtimeOverrides.worker, schedules.worker or memory.worker) to keep them on it.",
188
+ );
189
+ return new InMemoryDeliverySnapshotStore();
190
+ }
191
+ const tokenEnv = worker.tokenEnv ?? DEFAULT_TOKEN_ENV;
192
+ const token = secrets.named(tokenEnv);
193
+ if (!token) {
194
+ warn(
195
+ `the state Worker is configured but ${tokenEnv} is unset — delivery snapshots are kept in memory and a restart loses them. Set ${tokenEnv} to the state Worker's bearer.`,
196
+ );
197
+ return new InMemoryDeliverySnapshotStore();
198
+ }
199
+ return new WorkerDeliverySnapshotStore({ baseUrl: worker.baseUrl, token: token.reveal() });
200
+ }
@@ -5,6 +5,7 @@
5
5
 
6
6
  import type { ChatMessage, ToolDef } from "../../providers/types.js";
7
7
  import type { ChannelVisibility } from "../authz/types.js";
8
+ import type { RunProfile } from "../../config/profile.js";
8
9
  import type { RunEvent } from "../runEvents.js";
9
10
 
10
11
  /** How long a generation's claim on a run lasts without a heartbeat. */
@@ -55,6 +56,11 @@ export interface LiveRunMeta {
55
56
  headSha?: string;
56
57
  pr?: number;
57
58
  readonly?: boolean;
59
+ /** The effective profile the run was admitted with — its class, identity,
60
+ * the budget it runs on and what clipped it — so a resume keeps the clipped
61
+ * budget instead of re-reading the preset's. Absent on rows written before
62
+ * profiles existed. */
63
+ profile?: RunProfile;
58
64
  /** Which executor the run attached: what `makeExecutor` chose. */
59
65
  selection?: "resident" | "sandbox" | "local" | "none";
60
66
  /** The worktree path the system prompt names. */
@@ -1,4 +1,5 @@
1
1
  import type { ChannelVisibility, Predicate } from "./authz/types.js";
2
+ import type { BoundaryScope, Identity, MachineClass, RunProfile } from "../config/profile.js";
2
3
  import type { RunEvent } from "./runEvents.js";
3
4
  import { isHeadMaterial, isSpanRecord } from "./runEvents.js";
4
5
  import { isHandoffShape, type Handoff } from "./ship/handoff.js";
@@ -97,6 +98,48 @@ export interface RunRecord {
97
98
  * three empty lists, distinguishable from none); absent on every other run
98
99
  * and on records written before it existed. */
99
100
  handoff?: Handoff;
101
+ /** The effective profile the run was admitted with (docs/decisions/0026-capability-profiles-and-request-routing.md):
102
+ * the preset, its machine class and identity, the minutes it ran on and —
103
+ * when a boundary clipped the budget — the scope that did, so a reader can
104
+ * tell a clipped budget from a declared one. Absent on records written
105
+ * before profiles existed. */
106
+ profile?: RunProfileRecord;
107
+ }
108
+
109
+ /** The profile as the record stores it: the run's effective profile plus the preset it came from. */
110
+ export type RunProfileRecord = RunProfile & { preset: string };
111
+
112
+ // The vocabularies the profile is checked against, typed against the unions
113
+ // (a class or identity added without a row here fails to compile) — the record
114
+ // contract stays node-free and imports the registry's types only.
115
+ const MACHINE_CLASSES_IN_RECORD: Record<MachineClass, true> = {
116
+ none: true,
117
+ blank: true,
118
+ "repo-cold": true,
119
+ "repo-resident": true,
120
+ };
121
+ const IDENTITIES_IN_RECORD: Record<Identity, true> = { none: true, read: true, write: true };
122
+ const BOUNDARY_SCOPES_IN_RECORD: Record<BoundaryScope, true> = {
123
+ defaults: true,
124
+ channel: true,
125
+ user: true,
126
+ directive: true,
127
+ };
128
+
129
+ /** Structural check on a stored profile (item 3's rule for the field). */
130
+ function isRunProfileRecord(v: unknown): v is RunProfileRecord {
131
+ if (typeof v !== "object" || v === null) return false;
132
+ const p = v as Record<string, unknown>;
133
+ if (typeof p.preset !== "string") return false;
134
+ if (typeof p.machine !== "string" || !Object.hasOwn(MACHINE_CLASSES_IN_RECORD, p.machine)) return false;
135
+ if (typeof p.identity !== "string" || !Object.hasOwn(IDENTITIES_IN_RECORD, p.identity)) return false;
136
+ if (!isFiniteNumber(p.minutes) || p.minutes <= 0) return false;
137
+ if (
138
+ p.boundedBy !== undefined &&
139
+ (typeof p.boundedBy !== "string" || !Object.hasOwn(BOUNDARY_SCOPES_IN_RECORD, p.boundedBy))
140
+ )
141
+ return false;
142
+ return true;
100
143
  }
101
144
 
102
145
  /** A run as a listing shows it: the record minus its events. `diagnosis` stays —
@@ -419,6 +462,7 @@ export function isRunRecord(v: unknown): v is RunRecord {
419
462
  // The handoff is checked for shape, not bounds (docs/reference/specs/agent-ship.md
420
463
  // item 14): redaction may lengthen a stored string past the tool's limit.
421
464
  if (r.handoff !== undefined && !isHandoffShape(r.handoff)) return false;
465
+ if (r.profile !== undefined && !isRunProfileRecord(r.profile)) return false;
422
466
  if (typeof r.channelId !== "string" || typeof r.userId !== "string" || typeof r.threadKey !== "string") return false;
423
467
  // Absent on records written before the stamp existed (read as `unknown`); present → a known value.
424
468
  if (r.channelVisibility !== undefined && !CHANNEL_VISIBILITIES.includes(r.channelVisibility as ChannelVisibility))