@cmmd-center/forge 0.9.2 → 0.9.4

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 (461) hide show
  1. package/dist/{BunHttpServer-Dc5XijQF.mjs → BunHttpServer-BgNCpQzV.mjs} +2 -2
  2. package/dist/{BunHttpServer-Cuya1Zon.cjs → BunHttpServer-DOAuw4Iq.cjs} +2 -2
  3. package/dist/{BunPTY-z9OKvyBo.cjs → BunPTY-2icf7sRj.cjs} +2 -2
  4. package/dist/{BunPTY-CfS5zDoQ.mjs → BunPTY-D-Klry5N.mjs} +2 -2
  5. package/dist/{BunServices-eq_c-3x1.mjs → BunServices-ChM4mYH9.mjs} +1 -1
  6. package/dist/{BunServices-khEuvPaA.cjs → BunServices-CiNXNzHD.cjs} +1 -1
  7. package/dist/Mime-BITO-E1U.mjs +1395 -0
  8. package/dist/Mime-CyHbecis.cjs +1400 -0
  9. package/dist/{Mime-B75_d9aw.mjs → NodeHttpServer-C_wePPV0.mjs} +614 -1456
  10. package/dist/{Mime-aSilaQX9.cjs → NodeHttpServer-D_ismXpd.cjs} +617 -1466
  11. package/dist/{NodePTY-ChjVFpUH.mjs → NodePTY-BMUFdM93.mjs} +2 -2
  12. package/dist/{NodePTY-BOaJi0JA.cjs → NodePTY-cb7HIasY.cjs} +2 -2
  13. package/dist/{NodeSqliteClient-GlgGqc8V.mjs → NodeSqliteClient-OdI1TawL.mjs} +1 -1
  14. package/dist/{NodeSqliteClient-Vunn3aFN.cjs → NodeSqliteClient-SsUCk9mA.cjs} +1 -1
  15. package/dist/{PTY-rn2kGjhB.mjs → PTY-CBkE5akF.mjs} +1 -1
  16. package/dist/{PTY-D5OpMK9s.cjs → PTY-U3JQnLXS.cjs} +1 -1
  17. package/dist/{SqliteClient-Bpkno4Ob.cjs → SqliteClient-CdAhI4lb.cjs} +1 -1
  18. package/dist/{SqliteClient-DYQAvreq.mjs → SqliteClient-aoOb51gB.mjs} +1 -1
  19. package/dist/bin.cjs +14462 -10887
  20. package/dist/bin.mjs +14644 -11067
  21. package/dist/client/apple-touch-icon.png +0 -0
  22. package/dist/client/apple-touch-icon.png.publish-bak +0 -0
  23. package/dist/client/assets/CanvasPanel-BIN3OTEQ.js +441 -0
  24. package/dist/client/assets/CompositeItem-UKxcvvWv.js +2 -0
  25. package/dist/client/assets/DiffPanel-CeuRaSj1.js +64 -0
  26. package/dist/client/assets/DiffPanel.logic-D5i9QswQ.js +21 -0
  27. package/dist/client/assets/DiffPanelShell-W5nEVL52.js +2531 -0
  28. package/dist/client/assets/DiffWorkerPoolProvider-D87CO5TY.js +73 -0
  29. package/dist/client/assets/PullRequestCodePanel-DAmHwtY9.js +5 -0
  30. package/dist/client/assets/Stream-CToP6xzI.js +15 -0
  31. package/dist/client/assets/Virtualizer-CnwVHiy3.js +2 -0
  32. package/dist/client/assets/__vite-browser-external-DkEyUtaV.js +2 -0
  33. package/dist/client/assets/abap-kWSt4ETq.js +2 -0
  34. package/dist/client/assets/actionscript-3-DUMfZd56.js +2 -0
  35. package/dist/client/assets/ada-B5ZVVI6u.js +2 -0
  36. package/dist/client/assets/andromeeda-DXFdNco6.js +2 -0
  37. package/dist/client/assets/andromeeda-DwmQuk--.js +2 -0
  38. package/dist/client/assets/angular-html-BHUTdQ2k.js +2 -0
  39. package/dist/client/assets/angular-ts-BSGCbJ0j.js +2 -0
  40. package/dist/client/assets/apache-Cu40O3Ol.js +2 -0
  41. package/dist/client/assets/apex-DMPEjfSG.js +2 -0
  42. package/dist/client/assets/apl-BoCi4WkG.js +2 -0
  43. package/dist/client/assets/applescript-mUd3mpyF.js +2 -0
  44. package/dist/client/assets/ara-LhQXZmm_.js +2 -0
  45. package/dist/client/assets/asciidoc-BhTPoeH5.js +2 -0
  46. package/dist/client/assets/asm-BGGwX2ZL.js +2 -0
  47. package/dist/client/assets/astro-BMi5lGMm.js +2 -0
  48. package/dist/client/assets/atomRegistry-Bq5Y4LP1.js +3 -0
  49. package/dist/client/assets/aurora-x-CLgz8jpO.js +2 -0
  50. package/dist/client/assets/aurora-x-DY4EgSB_.js +2 -0
  51. package/dist/client/assets/awk-emAjNmqG.js +2 -0
  52. package/dist/client/assets/ayu-dark-BOsBaLmt.js +2 -0
  53. package/dist/client/assets/ayu-dark-Dm87GVDE.js +2 -0
  54. package/dist/client/assets/ayu-light-CVzS2PQZ.js +2 -0
  55. package/dist/client/assets/ayu-light-nGNJ-WDB.js +2 -0
  56. package/dist/client/assets/ayu-mirage-CionIqJ2.js +2 -0
  57. package/dist/client/assets/ayu-mirage-wUDx3klU.js +2 -0
  58. package/dist/client/assets/ballerina-Zz4P1PCo.js +2 -0
  59. package/dist/client/assets/bat-CojohPr3.js +2 -0
  60. package/dist/client/assets/beancount-DIrDFIbZ.js +2 -0
  61. package/dist/client/assets/berry-BktKISqk.js +2 -0
  62. package/dist/client/assets/bibtex-QuZiL8vO.js +2 -0
  63. package/dist/client/assets/bicep-BBqBjbA3.js +2 -0
  64. package/dist/client/assets/bird2-FrGIamnO.js +2 -0
  65. package/dist/client/assets/blade-CUGHtpnt.js +2 -0
  66. package/dist/client/assets/bsl-Dwz0otKA.js +2 -0
  67. package/dist/client/assets/c-3r97XxSq.js +2 -0
  68. package/dist/client/assets/c3-D-fgrOzJ.js +2 -0
  69. package/dist/client/assets/cadence-53eYIqKQ.js +2 -0
  70. package/dist/client/assets/cairo-Cai_OBhL.js +2 -0
  71. package/dist/client/assets/canvasStateStore-D3R1Ldk1.js +2 -0
  72. package/dist/client/assets/catppuccin-frappe-B9ztfCCY.js +2 -0
  73. package/dist/client/assets/catppuccin-frappe-Dtq86Zt-.js +2 -0
  74. package/dist/client/assets/catppuccin-latte-D1lF_ULk.js +2 -0
  75. package/dist/client/assets/catppuccin-latte-jgmNlGoB.js +2 -0
  76. package/dist/client/assets/catppuccin-macchiato-CcX-f1yB.js +2 -0
  77. package/dist/client/assets/catppuccin-macchiato-DfuKQKcK.js +2 -0
  78. package/dist/client/assets/catppuccin-mocha-B3_lpdvM.js +2 -0
  79. package/dist/client/assets/catppuccin-mocha-DfNnOvvn.js +2 -0
  80. package/dist/client/assets/clarity-DCS2DMlE.js +2 -0
  81. package/dist/client/assets/clojure-XwHeeE37.js +2 -0
  82. package/dist/client/assets/cmake-VIYk9tbe.js +2 -0
  83. package/dist/client/assets/cmmdAuthRedirect-DLvl7JNi.js +2 -0
  84. package/dist/client/assets/cobol-IPhylbE9.js +2 -0
  85. package/dist/client/assets/codeowners-DiTXAskR.js +2 -0
  86. package/dist/client/assets/codeql-0208dEuz.js +2 -0
  87. package/dist/client/assets/coffee-BwGUpF4f.js +2 -0
  88. package/dist/client/assets/common-lisp-Bbk7xLRF.js +2 -0
  89. package/dist/client/assets/coq-CDDZdGGh.js +2 -0
  90. package/dist/client/assets/cpp-jFyTvZsm.js +2 -0
  91. package/dist/client/assets/crystal-DYkQl9zO.js +2 -0
  92. package/dist/client/assets/csharp-Dausz59m.js +2 -0
  93. package/dist/client/assets/css-jXIxCbs3.js +2 -0
  94. package/dist/client/assets/csv-e2HVQau9.js +2 -0
  95. package/dist/client/assets/cue-BMgE_xju.js +2 -0
  96. package/dist/client/assets/cypher-CA95tXqi.js +2 -0
  97. package/dist/client/assets/d-DeO2qMKQ.js +2 -0
  98. package/dist/client/assets/dark-plus-DaoBxEuI.js +2 -0
  99. package/dist/client/assets/dark-plus-hlEOAUn6.js +2 -0
  100. package/dist/client/assets/dart-_9gbW0uG.js +2 -0
  101. package/dist/client/assets/dax-BMSB_urL.js +2 -0
  102. package/dist/client/assets/desktop-CFWOIXtS.js +2 -0
  103. package/dist/client/assets/diff-K3NAzB5h.js +2 -0
  104. package/dist/client/assets/docker-BHQx5Ff2.js +2 -0
  105. package/dist/client/assets/dotenv-CkiqXLC8.js +2 -0
  106. package/dist/client/assets/dracula-C9rp4fWn.js +2 -0
  107. package/dist/client/assets/dracula-CIJxKfwh.js +2 -0
  108. package/dist/client/assets/dracula-soft-BN-taJLQ.js +2 -0
  109. package/dist/client/assets/dracula-soft-De1wWQ_v.js +2 -0
  110. package/dist/client/assets/dream-maker-BM-H3AID.js +2 -0
  111. package/dist/client/assets/edge-CVf1J8H7.js +2 -0
  112. package/dist/client/assets/elixir-DtWV_YYF.js +2 -0
  113. package/dist/client/assets/elm-BJC2NMzB.js +2 -0
  114. package/dist/client/assets/emacs-lisp-BBM_ORbk.js +2 -0
  115. package/dist/client/assets/erb-cwYn0k3w.js +2 -0
  116. package/dist/client/assets/erlang-QNS0KA0S.js +2 -0
  117. package/dist/client/assets/everforest-dark-BSYmfNnp.js +2 -0
  118. package/dist/client/assets/everforest-dark-DUW3cHBn.js +2 -0
  119. package/dist/client/assets/everforest-light-CXyS_8Pc.js +2 -0
  120. package/dist/client/assets/everforest-light-DR-OhbXr.js +2 -0
  121. package/dist/client/assets/fennel-CAUJGoSU.js +2 -0
  122. package/dist/client/assets/fish-Cgln2BIC.js +2 -0
  123. package/dist/client/assets/fluent-BFL910sE.js +2 -0
  124. package/dist/client/assets/fortran-fixed-form-GNS6k7js.js +2 -0
  125. package/dist/client/assets/fortran-free-form-DB-siuqX.js +2 -0
  126. package/dist/client/assets/fsharp-BEjSdIee.js +2 -0
  127. package/dist/client/assets/gdresource-D24f9BeL.js +2 -0
  128. package/dist/client/assets/gdscript-Bq5ZYHDh.js +2 -0
  129. package/dist/client/assets/gdshader-BWxXiThj.js +2 -0
  130. package/dist/client/assets/genie-BOcsPMcn.js +2 -0
  131. package/dist/client/assets/gherkin-pSvoetjt.js +2 -0
  132. package/dist/client/assets/git-commit-Ddcy2Rzd.js +2 -0
  133. package/dist/client/assets/git-rebase-95AHstHI.js +2 -0
  134. package/dist/client/assets/github-dark-BbHkogeI.js +2 -0
  135. package/dist/client/assets/github-dark-D1nTcH4E.js +2 -0
  136. package/dist/client/assets/github-dark-default-Cgu-j31c.js +2 -0
  137. package/dist/client/assets/github-dark-default-CwMUtNVn.js +2 -0
  138. package/dist/client/assets/github-dark-dimmed-BmSK4vhs.js +2 -0
  139. package/dist/client/assets/github-dark-dimmed-CQVfITf-.js +2 -0
  140. package/dist/client/assets/github-dark-high-contrast-8_9Rbsic.js +2 -0
  141. package/dist/client/assets/github-dark-high-contrast-BO-0858k.js +2 -0
  142. package/dist/client/assets/github-light-DWIA8Fx_.js +2 -0
  143. package/dist/client/assets/github-light-default-CR0FtjVb.js +2 -0
  144. package/dist/client/assets/github-light-default-LLPbqR-K.js +2 -0
  145. package/dist/client/assets/github-light-high-contrast-5o8qRjCb.js +2 -0
  146. package/dist/client/assets/github-light-high-contrast-C8BCDz6a.js +2 -0
  147. package/dist/client/assets/github-light-lCcn0xRl.js +2 -0
  148. package/dist/client/assets/gleam-DPm9Zc9U.js +2 -0
  149. package/dist/client/assets/glimmer-js-Cjwf-Ijv.js +2 -0
  150. package/dist/client/assets/glimmer-ts-DXnOWlZf.js +2 -0
  151. package/dist/client/assets/glsl-iXGbnqIU.js +2 -0
  152. package/dist/client/assets/gn-DEuV1her.js +2 -0
  153. package/dist/client/assets/gnuplot-CqGlKjK6.js +2 -0
  154. package/dist/client/assets/go-mptU-yl2.js +2 -0
  155. package/dist/client/assets/graphql-DJMVZQv3.js +2 -0
  156. package/dist/client/assets/groovy-CKg5KWq9.js +2 -0
  157. package/dist/client/assets/gruvbox-dark-hard-Df4rfbxN.js +2 -0
  158. package/dist/client/assets/gruvbox-dark-hard-DsK6pQOr.js +2 -0
  159. package/dist/client/assets/gruvbox-dark-medium-nlSbDtaA.js +2 -0
  160. package/dist/client/assets/gruvbox-dark-medium-zSmEeDKP.js +2 -0
  161. package/dist/client/assets/gruvbox-dark-soft-BSW4a3D0.js +2 -0
  162. package/dist/client/assets/gruvbox-dark-soft-DgI1MxVf.js +2 -0
  163. package/dist/client/assets/gruvbox-light-hard-D144A6HZ.js +2 -0
  164. package/dist/client/assets/gruvbox-light-hard-DMNoHzNU.js +2 -0
  165. package/dist/client/assets/gruvbox-light-medium-C0B0NCuj.js +2 -0
  166. package/dist/client/assets/gruvbox-light-medium-CY2MDbN0.js +2 -0
  167. package/dist/client/assets/gruvbox-light-soft-CWJ8aP9f.js +2 -0
  168. package/dist/client/assets/gruvbox-light-soft-CyPlqRD8.js +2 -0
  169. package/dist/client/assets/hack-CkGKtoya.js +2 -0
  170. package/dist/client/assets/haml-mV-E4efJ.js +2 -0
  171. package/dist/client/assets/handlebars-Da6i86YE.js +2 -0
  172. package/dist/client/assets/haskell-DFWkJmsd.js +2 -0
  173. package/dist/client/assets/haxe-DoXg9N2w.js +2 -0
  174. package/dist/client/assets/hcl-VbcvLW6X.js +2 -0
  175. package/dist/client/assets/hjson-dQ--SYg9.js +2 -0
  176. package/dist/client/assets/hlsl-DNh8NDKB.js +2 -0
  177. package/dist/client/assets/horizon-BeufL1QP.js +2 -0
  178. package/dist/client/assets/horizon-CnOil3H1.js +2 -0
  179. package/dist/client/assets/horizon-bright-BoFfNO4u.js +2 -0
  180. package/dist/client/assets/horizon-bright-CJCE-DcQ.js +2 -0
  181. package/dist/client/assets/houston-C5_OTP91.js +2 -0
  182. package/dist/client/assets/houston-jaZUvSzs.js +2 -0
  183. package/dist/client/assets/html-derivative-BOw7yS3Z.js +2 -0
  184. package/dist/client/assets/html-e1ppUAVa.js +2 -0
  185. package/dist/client/assets/html2canvas-C_LL7spC.js +6 -0
  186. package/dist/client/assets/http-DFrMFVWs.js +2 -0
  187. package/dist/client/assets/hurl-3N2UscjA.js +2 -0
  188. package/dist/client/assets/hxml-Ip0yb8dg.js +2 -0
  189. package/dist/client/assets/hy-Bg-RIaMc.js +2 -0
  190. package/dist/client/assets/imba-BjZ9NRcj.js +2 -0
  191. package/dist/client/assets/index-Dr7HwjTE.css +1 -0
  192. package/dist/client/assets/index-DyEYqQdf.js +151 -0
  193. package/dist/client/assets/index.es-piUKIQw4.js +6 -0
  194. package/dist/client/assets/ini-CXagdQO9.js +2 -0
  195. package/dist/client/assets/java-DY6ZSujp.js +2 -0
  196. package/dist/client/assets/javascript-BfTuFzbs.js +2 -0
  197. package/dist/client/assets/jinja-C4NVx4X-.js +2 -0
  198. package/dist/client/assets/jison-BaE4DrvM.js +2 -0
  199. package/dist/client/assets/json-LL0kLbs_.js +2 -0
  200. package/dist/client/assets/json5-B1LcXsA8.js +2 -0
  201. package/dist/client/assets/jsonc-CYSDka7c.js +2 -0
  202. package/dist/client/assets/jsonl-CwfwQmvE.js +2 -0
  203. package/dist/client/assets/jsonnet-DG_zYewp.js +2 -0
  204. package/dist/client/assets/jspdf.es.min-_OjqfV_L.js +80 -0
  205. package/dist/client/assets/jssm-IkACsEzj.js +2 -0
  206. package/dist/client/assets/jsx-BOBg7x46.js +2 -0
  207. package/dist/client/assets/julia-D5dobu9Y.js +2 -0
  208. package/dist/client/assets/just-D99ddsWv.js +2 -0
  209. package/dist/client/assets/kanagawa-dragon-BBUl63AF.js +2 -0
  210. package/dist/client/assets/kanagawa-dragon-CBGy-6ik.js +2 -0
  211. package/dist/client/assets/kanagawa-lotus-BKY9TlU3.js +2 -0
  212. package/dist/client/assets/kanagawa-lotus-D93oLQjR.js +2 -0
  213. package/dist/client/assets/kanagawa-wave-CWf0rFWt.js +2 -0
  214. package/dist/client/assets/kanagawa-wave-CZBJ3hQh.js +2 -0
  215. package/dist/client/assets/kdl-DuytcvNV.js +2 -0
  216. package/dist/client/assets/kotlin-DmtnKz6Z.js +2 -0
  217. package/dist/client/assets/kusto-DmrVjfae.js +2 -0
  218. package/dist/client/assets/laserwave-DTzUwFmi.js +2 -0
  219. package/dist/client/assets/laserwave-NRABVcaO.js +2 -0
  220. package/dist/client/assets/latex-0e5rhe9m.js +2 -0
  221. package/dist/client/assets/lean-Bhkhoed1.js +2 -0
  222. package/dist/client/assets/less-BgyohKqc.js +2 -0
  223. package/dist/client/assets/light-plus-Cbc9ZUH4.js +2 -0
  224. package/dist/client/assets/light-plus-SK-KfMAV.js +2 -0
  225. package/dist/client/assets/liquid-BR35Xk1k.js +2 -0
  226. package/dist/client/assets/llvm-BtFJuFOJ.js +2 -0
  227. package/dist/client/assets/log-Df3M8ERB.js +2 -0
  228. package/dist/client/assets/logo-VfSEjTs6.js +2 -0
  229. package/dist/client/assets/lua-BMt4EqAw.js +2 -0
  230. package/dist/client/assets/luau-DIHOVG2A.js +2 -0
  231. package/dist/client/assets/make-gTMDFaMm.js +2 -0
  232. package/dist/client/assets/markdown-B_5il8S2.js +2 -0
  233. package/dist/client/assets/marko-DN4rLggA.js +2 -0
  234. package/dist/client/assets/material-theme-Pm6m-Kzc.js +2 -0
  235. package/dist/client/assets/material-theme-darker-BxFgxa9U.js +2 -0
  236. package/dist/client/assets/material-theme-darker-pKUQPx9-.js +2 -0
  237. package/dist/client/assets/material-theme-lighter-BLqni5my.js +2 -0
  238. package/dist/client/assets/material-theme-lighter-D6-26WhM.js +2 -0
  239. package/dist/client/assets/material-theme-ocean-C2N-nFlu.js +2 -0
  240. package/dist/client/assets/material-theme-ocean-DCxzET3l.js +2 -0
  241. package/dist/client/assets/material-theme-palenight-DyQqRTLL.js +2 -0
  242. package/dist/client/assets/material-theme-palenight-Y14J3SJp.js +2 -0
  243. package/dist/client/assets/material-theme-zfTX2d95.js +2 -0
  244. package/dist/client/assets/matlab-B2zVSjQq.js +2 -0
  245. package/dist/client/assets/mdc-kokCuEO8.js +2 -0
  246. package/dist/client/assets/mdx-CL7pLDiG.js +2 -0
  247. package/dist/client/assets/mermaid-Cou83ohU.js +2 -0
  248. package/dist/client/assets/min-dark-Bg1kQHvJ.js +2 -0
  249. package/dist/client/assets/min-dark-BhN4iMRs.js +2 -0
  250. package/dist/client/assets/min-light-BjU80CRL.js +2 -0
  251. package/dist/client/assets/min-light-Bw9u-P_u.js +2 -0
  252. package/dist/client/assets/mipsasm-CNFOlV7Y.js +2 -0
  253. package/dist/client/assets/module-fAFg92om.js +4 -0
  254. package/dist/client/assets/mojo-DmJMpmxj.js +2 -0
  255. package/dist/client/assets/monokai-C4NNjw1j.js +2 -0
  256. package/dist/client/assets/monokai-DIfgn9Q6.js +2 -0
  257. package/dist/client/assets/moonbit-f-DlcHvh.js +2 -0
  258. package/dist/client/assets/move-3UEJ-86q.js +2 -0
  259. package/dist/client/assets/narrat-BSySVkso.js +2 -0
  260. package/dist/client/assets/nextflow-B6YiVxNF.js +2 -0
  261. package/dist/client/assets/nextflow-groovy-CJM1tnxB.js +2 -0
  262. package/dist/client/assets/nginx-yFGqgywB.js +2 -0
  263. package/dist/client/assets/night-owl-CVqrHJ7c.js +2 -0
  264. package/dist/client/assets/night-owl-M-9PEzO3.js +2 -0
  265. package/dist/client/assets/night-owl-light-BFLAfCgh.js +2 -0
  266. package/dist/client/assets/night-owl-light-CbICj08I.js +2 -0
  267. package/dist/client/assets/nim-H0r8m4Bj.js +2 -0
  268. package/dist/client/assets/nix-D01-yy0s.js +2 -0
  269. package/dist/client/assets/nord-DdQ2eXb7.js +2 -0
  270. package/dist/client/assets/nord-b31BpoFd.js +2 -0
  271. package/dist/client/assets/nushell-CHtjMTHK.js +2 -0
  272. package/dist/client/assets/objective-c-CpnACn2A.js +2 -0
  273. package/dist/client/assets/objective-cpp-CC37zF8s.js +2 -0
  274. package/dist/client/assets/ocaml-zEzf7VRa.js +2 -0
  275. package/dist/client/assets/odin-7LfNaizd.js +2 -0
  276. package/dist/client/assets/one-dark-pro-D7GXMkD_.js +2 -0
  277. package/dist/client/assets/one-dark-pro-DZNXQIff.js +2 -0
  278. package/dist/client/assets/one-light-D0m2woYU.js +2 -0
  279. package/dist/client/assets/one-light-vpvEwBNE.js +2 -0
  280. package/dist/client/assets/openscad-alCnkqb3.js +2 -0
  281. package/dist/client/assets/pascal-BzxE7FG0.js +2 -0
  282. package/dist/client/assets/perl-DMfQlGhS.js +2 -0
  283. package/dist/client/assets/php-eC0_nfgu.js +2 -0
  284. package/dist/client/assets/pierre-dark-C8scyjTE.js +2 -0
  285. package/dist/client/assets/pierre-dark-protanopia-deuteranopia-DjjI5tLG.js +2 -0
  286. package/dist/client/assets/pierre-dark-soft-U4k3hSAg.js +2 -0
  287. package/dist/client/assets/pierre-dark-tritanopia-CwldMLve.js +2 -0
  288. package/dist/client/assets/pierre-dark-vibrant-CbqW77RL.js +2 -0
  289. package/dist/client/assets/pierre-light-CRazXHrY.js +2 -0
  290. package/dist/client/assets/pierre-light-protanopia-deuteranopia-C-0-s32M.js +2 -0
  291. package/dist/client/assets/pierre-light-soft-CeMgeGD-.js +2 -0
  292. package/dist/client/assets/pierre-light-tritanopia-CwP7kaEp.js +2 -0
  293. package/dist/client/assets/pierre-light-vibrant-BRw7kdwa.js +2 -0
  294. package/dist/client/assets/pkl-B_4Y3aQj.js +2 -0
  295. package/dist/client/assets/plastic-7ebP7j7m.js +2 -0
  296. package/dist/client/assets/plastic-BxJ4wlPp.js +2 -0
  297. package/dist/client/assets/plsql-Vnj6O-p2.js +2 -0
  298. package/dist/client/assets/po-BDEiW-In.js +2 -0
  299. package/dist/client/assets/poimandres-CjxvpNV1.js +2 -0
  300. package/dist/client/assets/poimandres-DaajSABO.js +2 -0
  301. package/dist/client/assets/polar-DkeS43LD.js +2 -0
  302. package/dist/client/assets/postcss-BdW9ckpW.js +2 -0
  303. package/dist/client/assets/powerquery-Ck_tTsxM.js +2 -0
  304. package/dist/client/assets/powershell-CSE_7mny.js +2 -0
  305. package/dist/client/assets/preload-helper-2nxZ5jlD.js +1 -0
  306. package/dist/client/assets/prisma-Bo0mLS5-.js +2 -0
  307. package/dist/client/assets/prolog-BKKH5B6F.js +2 -0
  308. package/dist/client/assets/proto-CQGfqf21.js +2 -0
  309. package/dist/client/assets/pug-CdkPd3m5.js +2 -0
  310. package/dist/client/assets/puppet-CMQRMMTw.js +2 -0
  311. package/dist/client/assets/purescript-CCcyGQO2.js +2 -0
  312. package/dist/client/assets/purify.es-BOhOJYGt.js +3 -0
  313. package/dist/client/assets/python-DMPOlDIf.js +2 -0
  314. package/dist/client/assets/qml-CjgSvi7A.js +2 -0
  315. package/dist/client/assets/qmldir-WCdsq__X.js +2 -0
  316. package/dist/client/assets/qss-AtgwhOez.js +2 -0
  317. package/dist/client/assets/r-CyfaTtPo.js +2 -0
  318. package/dist/client/assets/racket-BChN0yKc.js +2 -0
  319. package/dist/client/assets/raku-y2whvo3i.js +2 -0
  320. package/dist/client/assets/razor-xg0jlt5d.js +2 -0
  321. package/dist/client/assets/red-4ASUbyQz.js +2 -0
  322. package/dist/client/assets/red-FUTSeuNn.js +2 -0
  323. package/dist/client/assets/reg-Vw5mc10D.js +2 -0
  324. package/dist/client/assets/regexp-DNjghFOM.js +2 -0
  325. package/dist/client/assets/rel-B7yBab0H.js +2 -0
  326. package/dist/client/assets/riscv-CoVA6mXv.js +2 -0
  327. package/dist/client/assets/rolldown-runtime-BeQ30c1w.js +1 -0
  328. package/dist/client/assets/ron-Dncoj8f2.js +2 -0
  329. package/dist/client/assets/rose-pine-BYqQazSr.js +2 -0
  330. package/dist/client/assets/rose-pine-DKVJldI6.js +2 -0
  331. package/dist/client/assets/rose-pine-dawn-BzAj1SA_.js +2 -0
  332. package/dist/client/assets/rose-pine-dawn-DpMWSJny.js +2 -0
  333. package/dist/client/assets/rose-pine-moon-BF7RtPma.js +2 -0
  334. package/dist/client/assets/rose-pine-moon-Buv_ZumG.js +2 -0
  335. package/dist/client/assets/rosmsg-DMM9gQ6F.js +2 -0
  336. package/dist/client/assets/rst-DUzGXO8S.js +2 -0
  337. package/dist/client/assets/ruby-rVw1KmtO.js +2 -0
  338. package/dist/client/assets/rust-Do9fnzCe.js +2 -0
  339. package/dist/client/assets/sas-DqCEPep6.js +2 -0
  340. package/dist/client/assets/sass-C-AYCcFv.js +2 -0
  341. package/dist/client/assets/scala-g1Tl2-Vx.js +2 -0
  342. package/dist/client/assets/scheme-DMNTmmtl.js +2 -0
  343. package/dist/client/assets/scss-DUVpCPFS.js +2 -0
  344. package/dist/client/assets/sdbl-DN-YwBSp.js +2 -0
  345. package/dist/client/assets/shaderlab-CU1ngQGv.js +2 -0
  346. package/dist/client/assets/shellscript-DhExEfAl.js +2 -0
  347. package/dist/client/assets/shellsession-BRLd459R.js +2 -0
  348. package/dist/client/assets/slack-dark-CHVebfsv.js +2 -0
  349. package/dist/client/assets/slack-dark-DsHK2SW9.js +2 -0
  350. package/dist/client/assets/slack-ochin-DLRnnjq1.js +2 -0
  351. package/dist/client/assets/slack-ochin-auUeui07.js +2 -0
  352. package/dist/client/assets/smalltalk-DfTqE6NI.js +2 -0
  353. package/dist/client/assets/snazzy-light-DYCniS15.js +2 -0
  354. package/dist/client/assets/snazzy-light-DcJ4c2TI.js +2 -0
  355. package/dist/client/assets/solarized-dark-C2M3A6iX.js +2 -0
  356. package/dist/client/assets/solarized-dark-f_BlEcC2.js +2 -0
  357. package/dist/client/assets/solarized-light-DGdaihLk.js +2 -0
  358. package/dist/client/assets/solarized-light-p0lk9NUw.js +2 -0
  359. package/dist/client/assets/solidity-UrsYApv4.js +2 -0
  360. package/dist/client/assets/soy-B2el7XDq.js +2 -0
  361. package/dist/client/assets/sparql-Ckg9aAAq.js +2 -0
  362. package/dist/client/assets/splunk-BbdNC7mF.js +2 -0
  363. package/dist/client/assets/sql-DiDaRjp9.js +2 -0
  364. package/dist/client/assets/src-pwcrD9wg.js +3 -0
  365. package/dist/client/assets/ssh-config-NaDpXiNE.js +2 -0
  366. package/dist/client/assets/stata-C71yNzqX.js +2 -0
  367. package/dist/client/assets/stylus-BmDWwNjA.js +2 -0
  368. package/dist/client/assets/surrealql-Cmypmwl2.js +2 -0
  369. package/dist/client/assets/svelte-VS6niI_T.js +2 -0
  370. package/dist/client/assets/swift-C69NyPuQ.js +2 -0
  371. package/dist/client/assets/synthwave-84-2NxBVDLO.js +2 -0
  372. package/dist/client/assets/synthwave-84-CVwMZOby.js +2 -0
  373. package/dist/client/assets/system-verilog-DJk0s1jv.js +2 -0
  374. package/dist/client/assets/systemd-CcQAXEZ9.js +2 -0
  375. package/dist/client/assets/talonscript-CUGr7vYM.js +2 -0
  376. package/dist/client/assets/tasl-BB-YNBB8.js +2 -0
  377. package/dist/client/assets/tcl-DR8-AcmN.js +2 -0
  378. package/dist/client/assets/templ-Cr4Do0uA.js +2 -0
  379. package/dist/client/assets/terraform-DS-GC2Bj.js +2 -0
  380. package/dist/client/assets/tex-CcZtvqzZ.js +2 -0
  381. package/dist/client/assets/toggle-BBEoD8mr.js +2 -0
  382. package/dist/client/assets/tokyo-night-9wJEO1G-.js +2 -0
  383. package/dist/client/assets/tokyo-night-ZUp4Hulo.js +2 -0
  384. package/dist/client/assets/toml-ByrHRc5Z.js +2 -0
  385. package/dist/client/assets/transport-B-82Ada5.js +2 -0
  386. package/dist/client/assets/ts-tags-Dhe4Ce_p.js +2 -0
  387. package/dist/client/assets/tsv-2A2hWH8i.js +2 -0
  388. package/dist/client/assets/tsx-rRP2I03K.js +2 -0
  389. package/dist/client/assets/turtle-BYbwzkhD.js +2 -0
  390. package/dist/client/assets/twig-DtN4j4nR.js +2 -0
  391. package/dist/client/assets/typeof-DOAxNSYQ.js +2 -0
  392. package/dist/client/assets/typescript-tv4fsI1Q.js +2 -0
  393. package/dist/client/assets/typespec-DoZVUoUi.js +2 -0
  394. package/dist/client/assets/typst-BmNF0lss.js +2 -0
  395. package/dist/client/assets/useTriggerFocusGuards-B2i3DSgR.js +2 -0
  396. package/dist/client/assets/v-CtCN4vLO.js +2 -0
  397. package/dist/client/assets/vala-DOsY6Y3z.js +2 -0
  398. package/dist/client/assets/vb-C1Ff9hOT.js +2 -0
  399. package/dist/client/assets/verilog-Dt4OfjHN.js +2 -0
  400. package/dist/client/assets/vesper-5ZmhmIun.js +2 -0
  401. package/dist/client/assets/vesper-J3W-7eep.js +2 -0
  402. package/dist/client/assets/vhdl-DkoQ3qnl.js +2 -0
  403. package/dist/client/assets/viml-C3b4aEDf.js +2 -0
  404. package/dist/client/assets/vitesse-black-CYOC7ssU.js +2 -0
  405. package/dist/client/assets/vitesse-black-DWaDDoI3.js +2 -0
  406. package/dist/client/assets/vitesse-dark-Bxewb9U5.js +2 -0
  407. package/dist/client/assets/vitesse-dark-CZotVzc8.js +2 -0
  408. package/dist/client/assets/vitesse-light-Bf_msd9a.js +2 -0
  409. package/dist/client/assets/vitesse-light-BfrRSjRx.js +2 -0
  410. package/dist/client/assets/vue-C0rWZC13.js +2 -0
  411. package/dist/client/assets/vue-html-bxw887C2.js +2 -0
  412. package/dist/client/assets/vue-vine-DUWGjTI5.js +2 -0
  413. package/dist/client/assets/vyper-BamdcTqV.js +2 -0
  414. package/dist/client/assets/wasm-C2MLrNQ1.js +2 -0
  415. package/dist/client/assets/wasm-CGd31VpO.js +2 -0
  416. package/dist/client/assets/wenyan-BPZ76iog.js +2 -0
  417. package/dist/client/assets/wgsl-sH_fVDG_.js +2 -0
  418. package/dist/client/assets/wikitext-BsPo9Czf.js +2 -0
  419. package/dist/client/assets/wit-BfBhtJwS.js +2 -0
  420. package/dist/client/assets/wolfram-GL7CPBRD.js +2 -0
  421. package/dist/client/assets/worker-Cvq2iJN1.js +162 -0
  422. package/dist/client/assets/workspaceReadinessAtom-DUP5NKsc.js +2 -0
  423. package/dist/client/assets/xml-C0zxRzgj.js +2 -0
  424. package/dist/client/assets/xsl-CC403A_G.js +2 -0
  425. package/dist/client/assets/yaml-BCnsJrvx.js +2 -0
  426. package/dist/client/assets/zenscript-CmwVE7RW.js +2 -0
  427. package/dist/client/assets/zig-GtQXM-vf.js +2 -0
  428. package/dist/client/favicon-16x16.png +0 -0
  429. package/dist/client/favicon-16x16.png.publish-bak +0 -0
  430. package/dist/client/favicon-32x32.png +0 -0
  431. package/dist/client/favicon-32x32.png.publish-bak +0 -0
  432. package/dist/client/favicon.ico +0 -0
  433. package/dist/client/favicon.ico.publish-bak +0 -0
  434. package/dist/client/forge-mark.svg +5 -0
  435. package/dist/client/index.html +131 -0
  436. package/dist/client/mockServiceWorker.js +336 -0
  437. package/dist/client/sidebar/forge-ember-field.webp +0 -0
  438. package/dist/{esm-wLIF-u3N.mjs → esm-Ce1GqbVk.mjs} +1 -1
  439. package/dist/{esm-BZhXwX5p.cjs → esm-Do7HVhLA.cjs} +1 -1
  440. package/dist/{execAsync-DWZyWH-_.mjs → execAsync-BNNdR88o.mjs} +1 -1
  441. package/dist/{execAsync-jnYVB5RZ.cjs → execAsync-BUcaFQ1D.cjs} +1 -1
  442. package/dist/forge-provision-display.sh +316 -0
  443. package/dist/{getMachineId-bsd-BLtyMA4j.cjs → getMachineId-bsd-C_qi9crE.cjs} +3 -3
  444. package/dist/{getMachineId-bsd-CTjiY7jG.mjs → getMachineId-bsd-FI863wjR.mjs} +3 -3
  445. package/dist/{getMachineId-darwin-DaGS2zUd.cjs → getMachineId-darwin-BOoNuqXn.cjs} +3 -3
  446. package/dist/{getMachineId-darwin-BrPuyPOo.mjs → getMachineId-darwin-D9VhTaPM.mjs} +3 -3
  447. package/dist/{getMachineId-linux-BsP3wJaE.cjs → getMachineId-linux-C9L-vW7m.cjs} +2 -2
  448. package/dist/{getMachineId-linux-D9QEWWF-.mjs → getMachineId-linux-DE2x36Kt.mjs} +2 -2
  449. package/dist/{getMachineId-unsupported-Cm-2s4Sg.mjs → getMachineId-unsupported-9S6pcxXb.mjs} +2 -2
  450. package/dist/{getMachineId-unsupported-B_M-gck7.cjs → getMachineId-unsupported-CmbM8LYa.cjs} +2 -2
  451. package/dist/{getMachineId-win-qtEKaUYj.mjs → getMachineId-win-0EVRuBxU.mjs} +3 -3
  452. package/dist/{getMachineId-win-3zJ3HQLG.cjs → getMachineId-win-BPaemVew.cjs} +3 -3
  453. package/dist/{open-CGXZLos4.cjs → open-BAsPVCWX.cjs} +1 -1
  454. package/dist/{open-Cf0bgbyx.mjs → open-FIgTDosf.mjs} +1 -1
  455. package/dist/runtimeBootstrap.cjs +8 -0
  456. package/dist/runtimeBootstrap.mjs +4 -0
  457. package/dist/runtimeControlAuthority-Dm9z5ziU.mjs +505 -0
  458. package/dist/runtimeControlAuthority-Dx6Y5LPI.cjs +571 -0
  459. package/package.json +28 -30
  460. package/dist/NodeHttpServer-C7YMYP5R.cjs +0 -616
  461. package/dist/NodeHttpServer-D5-EtRwc.mjs +0 -605
@@ -0,0 +1,571 @@
1
+ #!/usr/bin/env node
2
+
3
+ require("./chunk-BhaIgcZK.cjs");
4
+ let node_crypto = require("node:crypto");
5
+ let node_fs = require("node:fs");
6
+ //#region src/auth/readOnceFileToken.ts
7
+ function createReadOnceFileTokenAccessor(config) {
8
+ let cachedFileToken = null;
9
+ let fileTokenResolved = false;
10
+ function readAndConsumeTokenFile(path) {
11
+ let contents;
12
+ try {
13
+ contents = (0, node_fs.readFileSync)(path, "utf8");
14
+ } catch {
15
+ return null;
16
+ }
17
+ try {
18
+ (0, node_fs.unlinkSync)(path);
19
+ } catch (error) {
20
+ console.debug(`${config.debugLabel}: failed to unlink token file`, error);
21
+ }
22
+ const trimmed = contents.trim();
23
+ return trimmed.length > 0 ? trimmed : null;
24
+ }
25
+ return {
26
+ read(env = process.env) {
27
+ const fromEnv = env[config.envVar]?.trim();
28
+ if (fromEnv) return fromEnv;
29
+ if (!fileTokenResolved) {
30
+ const path = env[config.fileEnvVar]?.trim();
31
+ cachedFileToken = path ? readAndConsumeTokenFile(path) : null;
32
+ fileTokenResolved = true;
33
+ }
34
+ return cachedFileToken;
35
+ },
36
+ set(token) {
37
+ cachedFileToken = token;
38
+ fileTokenResolved = true;
39
+ },
40
+ reset() {
41
+ cachedFileToken = null;
42
+ fileTokenResolved = false;
43
+ }
44
+ };
45
+ }
46
+ //#endregion
47
+ //#region src/auth/runtimeGrantToken.ts
48
+ const accessor = createReadOnceFileTokenAccessor({
49
+ envVar: "FORGE_CMMD_RUNTIME_GRANT_TOKEN",
50
+ fileEnvVar: "FORGE_CMMD_RUNTIME_GRANT_TOKEN_FILE",
51
+ debugLabel: "runtimeGrantToken"
52
+ });
53
+ /**
54
+ * Resolves the CMMD runtime grant token, preferring the (legacy) environment
55
+ * variable and falling back to a one-time file read. The file, once read, is
56
+ * unlinked and its contents cached in memory for the remainder of the
57
+ * process — the secret is never read from disk twice.
58
+ */
59
+ function runtimeGrantToken(env = process.env) {
60
+ return accessor.read(env);
61
+ }
62
+ /**
63
+ * Replaces the in-memory grant token cache with a freshly-issued one (see
64
+ * runtimeAuth/runtimeGrantRefresh.ts). This is the ONLY way a long-lived
65
+ * process picks up a rotated grant: the source file was already unlinked
66
+ * after its one read, and FORGE_CMMD_RUNTIME_GRANT_TOKEN (when present)
67
+ * always takes priority over this cache, matching `runtimeGrantToken()`'s own
68
+ * precedence. Does not touch disk — the refreshed secret lives only in this
69
+ * process's memory, same as the original.
70
+ */
71
+ function setRuntimeGrantToken(token) {
72
+ accessor.set(token);
73
+ }
74
+ //#endregion
75
+ //#region src/runtimeAuth/cmmdRuntimeTicket.ts
76
+ const CMMD_CLAUDE_READINESS_TICKET_AUDIENCE = "forge-claude-readiness";
77
+ const CMMD_CLAUDE_READINESS_TICKET_SCOPE = "claude-readiness-probe";
78
+ function decodeBase64UrlJson(value) {
79
+ try {
80
+ return JSON.parse(Buffer.from(value, "base64url").toString("utf8"));
81
+ } catch {
82
+ return null;
83
+ }
84
+ }
85
+ function normalizePem(value) {
86
+ return value.includes("\\n") ? value.replace(/\\n/g, "\n") : value;
87
+ }
88
+ function stringClaim(payload, key) {
89
+ const value = payload[key];
90
+ if (typeof value === "string" && value.trim().length > 0) return value;
91
+ if (typeof value === "number" && Number.isFinite(value)) return String(value);
92
+ return null;
93
+ }
94
+ function constantTimeEqualString(left, right) {
95
+ const leftBuffer = Buffer.from(left, "utf8");
96
+ const rightBuffer = Buffer.from(right, "utf8");
97
+ if (leftBuffer.length !== rightBuffer.length) return false;
98
+ return (0, node_crypto.timingSafeEqual)(leftBuffer, rightBuffer);
99
+ }
100
+ function matchesExpected(actual, expected) {
101
+ return expected === void 0 || expected.trim().length === 0 || constantTimeEqualString(actual, expected);
102
+ }
103
+ function validTicketHeader(value) {
104
+ return typeof value === "object" && value !== null && value.alg === "EdDSA";
105
+ }
106
+ function validTicketSignature(input) {
107
+ try {
108
+ return (0, node_crypto.verify)(null, Buffer.from(input.signingInput), (0, node_crypto.createPublicKey)(normalizePem(input.publicKeyPem)), Buffer.from(input.signatureRaw, "base64url"));
109
+ } catch {
110
+ return false;
111
+ }
112
+ }
113
+ function nonNegativeIntegerClaim(value) {
114
+ return Number.isSafeInteger(value) && value >= 0 ? value : null;
115
+ }
116
+ function stringArrayClaim(value) {
117
+ return Array.isArray(value) && value.every((entry) => typeof entry === "string") ? value : null;
118
+ }
119
+ function verifiedRuntimeTicketPayload(token, publicKeyPem, audience = "forge-runtime") {
120
+ const parts = token.split(".");
121
+ if (parts.length !== 3) return null;
122
+ const [headerRaw, payloadRaw, signatureRaw] = parts;
123
+ if (!validTicketHeader(decodeBase64UrlJson(headerRaw))) return null;
124
+ const payload = decodeBase64UrlJson(payloadRaw);
125
+ if (typeof payload !== "object" || payload === null) return null;
126
+ const payloadRecord = payload;
127
+ if (payloadRecord["iss"] !== "cmmd" || payloadRecord["aud"] !== audience) return null;
128
+ return validTicketSignature({
129
+ signingInput: `${headerRaw}.${payloadRaw}`,
130
+ signatureRaw,
131
+ publicKeyPem
132
+ }) ? payloadRecord : null;
133
+ }
134
+ function verifyCmmdClaudeReadinessTicket(token, expectations) {
135
+ const payload = verifiedRuntimeTicketPayload(token, expectations.publicKeyPem, CMMD_CLAUDE_READINESS_TICKET_AUDIENCE);
136
+ if (!payload) return null;
137
+ const claims = runtimeTicketClaims(payload, false);
138
+ if (!claims || !runtimeTicketExpectationsMatch(claims, expectations)) return null;
139
+ const jti = stringClaim(payload, "jti");
140
+ const issuedAtSeconds = nonNegativeIntegerClaim(payload["iat"]);
141
+ const notBeforeSeconds = nonNegativeIntegerClaim(payload["nbf"]);
142
+ const nowSeconds = Math.floor(Date.now() / 1e3);
143
+ if (issuedAtSeconds === null || notBeforeSeconds === null || notBeforeSeconds > nowSeconds || issuedAtSeconds > nowSeconds + 5 || claims.expiresAtSeconds - issuedAtSeconds > 90) return null;
144
+ return jti && claims.scope.length === 1 && claims.scope[0] === CMMD_CLAUDE_READINESS_TICKET_SCOPE ? {
145
+ ...claims,
146
+ jti
147
+ } : null;
148
+ }
149
+ function runtimeTicketExpiration(payload, allowExpired) {
150
+ const expiresAtSeconds = payload["exp"];
151
+ if (typeof expiresAtSeconds !== "number" || !Number.isFinite(expiresAtSeconds)) return null;
152
+ if (!allowExpired && Math.floor(Date.now() / 1e3) >= expiresAtSeconds) return null;
153
+ return expiresAtSeconds;
154
+ }
155
+ function requiredRuntimeIdentity(payload) {
156
+ const userId = stringClaim(payload, "user_id");
157
+ const orgId = stringClaim(payload, "org_id");
158
+ const projectId = stringClaim(payload, "project_id");
159
+ const runtimeId = stringClaim(payload, "runtime_id");
160
+ if (!userId || !orgId || !projectId || !runtimeId) return null;
161
+ return {
162
+ userId,
163
+ orgId,
164
+ projectId,
165
+ runtimeId
166
+ };
167
+ }
168
+ function runtimeTicketClaims(payload, allowExpired) {
169
+ const expiresAtSeconds = runtimeTicketExpiration(payload, allowExpired);
170
+ if (expiresAtSeconds === null) return null;
171
+ const identity = requiredRuntimeIdentity(payload);
172
+ if (!identity) return null;
173
+ const scope = stringArrayClaim(payload["scope"]);
174
+ if (!scope) return null;
175
+ return {
176
+ ...identity,
177
+ machineId: stringClaim(payload, "machine_id"),
178
+ credentialEpoch: nonNegativeIntegerClaim(payload["credential_epoch"]),
179
+ scope,
180
+ expiresAtSeconds
181
+ };
182
+ }
183
+ function exactMachineExpectationMatches(claims, expectations) {
184
+ if (expectations.machineId !== void 0 && expectations.machineId.trim().length > 0) {
185
+ if (!claims.machineId) return false;
186
+ if (!constantTimeEqualString(claims.machineId, expectations.machineId)) return false;
187
+ }
188
+ return expectations.credentialEpoch === void 0 || claims.credentialEpoch === expectations.credentialEpoch;
189
+ }
190
+ function runtimeTicketExpectationsMatch(claims, expectations) {
191
+ return matchesExpected(claims.runtimeId, expectations.runtimeId) && matchesExpected(claims.orgId, expectations.orgId) && matchesExpected(claims.userId, expectations.userId) && matchesExpected(claims.projectId, expectations.projectId) && exactMachineExpectationMatches(claims, expectations);
192
+ }
193
+ function verifyCmmdRuntimeTicketWithExpirationPolicy(token, expectations, allowExpired) {
194
+ const payload = verifiedRuntimeTicketPayload(token, expectations.publicKeyPem);
195
+ if (!payload) return null;
196
+ const claims = runtimeTicketClaims(payload, allowExpired);
197
+ return claims && runtimeTicketExpectationsMatch(claims, expectations) ? claims : null;
198
+ }
199
+ function verifyCmmdRuntimeTicket(token, expectations) {
200
+ return verifyCmmdRuntimeTicketWithExpirationPolicy(token, expectations, false);
201
+ }
202
+ /**
203
+ * Verify a provisioning grant used only as refresh proof, retaining its signed
204
+ * identity and scope after `exp`. Expiration is intentionally the one relaxed
205
+ * check: signature, issuer, audience, claim shape, and caller expectations are
206
+ * identical to normal runtime-ticket verification. Callers must compare the
207
+ * returned ownership and authority to the freshly issued grant before storing
208
+ * it; this must never be used to authorize an ordinary runtime operation.
209
+ */
210
+ function verifyCmmdRuntimeTicketRefreshProof(token, expectations) {
211
+ return verifyCmmdRuntimeTicketWithExpirationPolicy(token, expectations, true);
212
+ }
213
+ function authRuntimeTicketClaims(payload) {
214
+ const expiresAtSeconds = runtimeTicketExpiration(payload, false);
215
+ if (expiresAtSeconds === null) return null;
216
+ const userId = stringClaim(payload, "user_id");
217
+ const orgId = stringClaim(payload, "org_id");
218
+ const runtimeId = stringClaim(payload, "runtime_id");
219
+ const scope = stringArrayClaim(payload["scope"]);
220
+ return userId && orgId && runtimeId && scope ? {
221
+ orgId,
222
+ userId,
223
+ runtimeId,
224
+ scope,
225
+ expiresAtSeconds
226
+ } : null;
227
+ }
228
+ function authRuntimeTicketExpectationsMatch(claims, expectations) {
229
+ return matchesExpected(claims.runtimeId, expectations.runtimeId) && matchesExpected(claims.orgId, expectations.orgId) && matchesExpected(claims.userId, expectations.userId);
230
+ }
231
+ /**
232
+ * Card 1359 — verify the projectless personal-provider auth VM's transport
233
+ * ticket. It is the sibling of {@link verifyCmmdRuntimeTicket} for the distinct
234
+ * "forge-auth-runtime" audience: projectless, with no machine id or credential
235
+ * epoch (the auth VM serves no project and holds no broker scope), so it only
236
+ * asserts org/user/runtime identity + scope. The audience check keeps the two
237
+ * ticket families from cross-authenticating in either direction.
238
+ */
239
+ function verifyCmmdAuthRuntimeTicket(token, expectations) {
240
+ const payload = verifiedRuntimeTicketPayload(token, expectations.publicKeyPem, "forge-auth-runtime");
241
+ if (!payload) return null;
242
+ const claims = authRuntimeTicketClaims(payload);
243
+ return claims && authRuntimeTicketExpectationsMatch(claims, expectations) ? claims : null;
244
+ }
245
+ //#endregion
246
+ //#region src/runtimeAuth/runtimeControlAuthority.ts
247
+ const CONTROL_AUTHORITY_REFRESH_SKEW_SECONDS = 60;
248
+ const CONTROL_AUTHORITY_TIMEOUT_MS = 1e4;
249
+ const CONTROL_AUTHORITY_SCOPES = new Set(["heartbeat", "replication"]);
250
+ var RuntimeControlAuthorityError = class extends Error {
251
+ status;
252
+ code;
253
+ constructor(input) {
254
+ super(input.message);
255
+ this.name = "RuntimeControlAuthorityError";
256
+ this.status = input.status ?? null;
257
+ this.code = input.code;
258
+ }
259
+ };
260
+ let authority = null;
261
+ let bootstrapInFlight = null;
262
+ function normalizedControlPlaneUrl(value) {
263
+ return value.trim().replace(/\/+$/u, "");
264
+ }
265
+ function asObject(value) {
266
+ return value !== null && typeof value === "object" ? value : null;
267
+ }
268
+ function readNullableString(value) {
269
+ if (value === null) return null;
270
+ return typeof value === "string" ? value : void 0;
271
+ }
272
+ function hasValidOptionalHeartbeatFields(payload) {
273
+ const countsAreValid = [payload.activeTurnCount, payload.activeSessionCount].every((value) => value === void 0 || Number.isSafeInteger(value) && value >= 0);
274
+ const stringsAreValid = [
275
+ payload.drainStartedAt,
276
+ payload.drainReason,
277
+ payload.drainTargetImageRef,
278
+ payload.drainTargetImageVersion
279
+ ].every((value) => value === void 0 || value === null || typeof value === "string");
280
+ return countsAreValid && stringsAreValid && (payload.draining === void 0 || typeof payload.draining === "boolean") && (payload.drainForceRequired === void 0 || typeof payload.drainForceRequired === "boolean");
281
+ }
282
+ function requiredControlFields(payload) {
283
+ const runtimeId = payload.runtimeId;
284
+ const controlTicket = payload.controlTicket;
285
+ const expiresAt = payload.expiresAt;
286
+ if (typeof runtimeId !== "string" || runtimeId.trim().length === 0 || typeof controlTicket !== "string" || controlTicket.trim().length === 0 || typeof expiresAt !== "string" || !Number.isFinite(Date.parse(expiresAt))) return null;
287
+ return {
288
+ runtimeId,
289
+ controlTicket,
290
+ expiresAt
291
+ };
292
+ }
293
+ function optionalHeartbeatFields(payload) {
294
+ const activeTurnCount = payload.activeTurnCount;
295
+ const activeSessionCount = payload.activeSessionCount;
296
+ const drainStartedAt = readNullableString(payload.drainStartedAt);
297
+ const drainReason = readNullableString(payload.drainReason);
298
+ const drainTargetImageRef = readNullableString(payload.drainTargetImageRef);
299
+ const drainTargetImageVersion = readNullableString(payload.drainTargetImageVersion);
300
+ return {
301
+ ...typeof activeTurnCount === "number" ? { activeTurnCount } : {},
302
+ ...typeof activeSessionCount === "number" ? { activeSessionCount } : {},
303
+ ...typeof payload.draining === "boolean" ? { draining: payload.draining } : {},
304
+ ...drainStartedAt !== void 0 ? { drainStartedAt } : {},
305
+ ...drainReason !== void 0 ? { drainReason } : {},
306
+ ...drainTargetImageRef !== void 0 ? { drainTargetImageRef } : {},
307
+ ...drainTargetImageVersion !== void 0 ? { drainTargetImageVersion } : {},
308
+ ...typeof payload.drainForceRequired === "boolean" ? { drainForceRequired: payload.drainForceRequired } : {}
309
+ };
310
+ }
311
+ function parseRuntimeControlAuthorityEnvelope(value) {
312
+ const payload = asObject(asObject(value)?.data);
313
+ if (!payload) return null;
314
+ const required = requiredControlFields(payload);
315
+ if (!required || !hasValidOptionalHeartbeatFields(payload)) return null;
316
+ return {
317
+ ...required,
318
+ ...optionalHeartbeatFields(payload)
319
+ };
320
+ }
321
+ function sameIdentity(stored, identity) {
322
+ return stored.controlPlaneUrl === normalizedControlPlaneUrl(identity.controlPlaneUrl) && stored.orgId === identity.orgId && stored.userId === identity.userId && stored.projectId === identity.projectId && stored.runtimeId === identity.runtimeId && stored.machineId === identity.machineId && stored.credentialEpoch === identity.credentialEpoch;
323
+ }
324
+ function isExactControlTicket(claims, identity) {
325
+ const scopes = new Set(claims.scope);
326
+ return claims.userId === identity.userId && claims.machineId === identity.machineId && claims.credentialEpoch === identity.credentialEpoch && scopes.size === CONTROL_AUTHORITY_SCOPES.size && [...CONTROL_AUTHORITY_SCOPES].every((scope) => scopes.has(scope));
327
+ }
328
+ function storeRuntimeControlAuthority(input) {
329
+ if (input.envelope.runtimeId !== input.identity.runtimeId) return false;
330
+ const claims = verifyCmmdRuntimeTicket(input.envelope.controlTicket, {
331
+ publicKeyPem: input.identity.publicKeyPem,
332
+ orgId: input.identity.orgId,
333
+ projectId: input.identity.projectId,
334
+ runtimeId: input.identity.runtimeId,
335
+ machineId: input.identity.machineId,
336
+ credentialEpoch: input.identity.credentialEpoch
337
+ });
338
+ if (!claims || !isExactControlTicket(claims, input.identity)) return false;
339
+ const responseExpirySeconds = Math.floor(Date.parse(input.envelope.expiresAt) / 1e3);
340
+ if (Math.abs(responseExpirySeconds - claims.expiresAtSeconds) > 1) return false;
341
+ if (authority && sameIdentity(authority, input.identity)) {
342
+ if (authority.expiresAtSeconds >= claims.expiresAtSeconds) return true;
343
+ }
344
+ authority = {
345
+ ...input.identity,
346
+ controlPlaneUrl: normalizedControlPlaneUrl(input.identity.controlPlaneUrl),
347
+ token: input.envelope.controlTicket,
348
+ expiresAtSeconds: claims.expiresAtSeconds
349
+ };
350
+ return true;
351
+ }
352
+ async function readControlAuthorityResponse(response) {
353
+ if (!response.ok) throw new RuntimeControlAuthorityError({
354
+ status: response.status,
355
+ code: "CMMD_RUNTIME_CONTROL_AUTHORITY_REJECTED",
356
+ message: `CMMD runtime control authority request failed (${response.status}).`
357
+ });
358
+ try {
359
+ return await response.json();
360
+ } catch {
361
+ throw new RuntimeControlAuthorityError({
362
+ status: response.status,
363
+ code: "CMMD_RUNTIME_CONTROL_AUTHORITY_INVALID_RESPONSE",
364
+ message: "CMMD runtime control authority returned invalid JSON."
365
+ });
366
+ }
367
+ }
368
+ async function requestWithTimeout(url, init, fetchImpl) {
369
+ const abortController = new AbortController();
370
+ const timeout = setTimeout(() => abortController.abort(), CONTROL_AUTHORITY_TIMEOUT_MS);
371
+ try {
372
+ return await readControlAuthorityResponse(await fetchImpl(url, {
373
+ ...init,
374
+ signal: abortController.signal
375
+ }));
376
+ } finally {
377
+ clearTimeout(timeout);
378
+ }
379
+ }
380
+ async function requestRuntimeControlHeartbeat(input) {
381
+ return requestWithTimeout(new URL(`/api/forge/context/runtime-authority/runtimes/${encodeURIComponent(input.grant.runtimeId)}/heartbeat`, `${input.grant.controlPlaneUrl}/`), {
382
+ method: "POST",
383
+ headers: {
384
+ authorization: `Bearer ${input.grant.grantToken}`,
385
+ "content-type": "application/json"
386
+ },
387
+ body: JSON.stringify({
388
+ activeTurnCount: input.activeTurnCount,
389
+ activeSessionCount: input.activeSessionCount,
390
+ ...input.forgeGitCommit !== void 0 ? { forgeGitCommit: input.forgeGitCommit } : {}
391
+ })
392
+ }, input.fetchImpl);
393
+ }
394
+ function clearRejectedAuthority(error, grantToken) {
395
+ if (!(error instanceof RuntimeControlAuthorityError)) return;
396
+ if (error.status !== 401 && error.status !== 410) return;
397
+ if (authority?.token === grantToken) authority = null;
398
+ }
399
+ function readRuntimeControlAuthority(input) {
400
+ const current = authority;
401
+ if (!current) return null;
402
+ const nowSeconds = input.nowSeconds ?? Math.floor(Date.now() / 1e3);
403
+ if (current.expiresAtSeconds <= nowSeconds) {
404
+ authority = null;
405
+ return null;
406
+ }
407
+ if (current.runtimeId !== input.runtimeId || current.machineId !== input.machineId || current.credentialEpoch !== input.credentialEpoch) return null;
408
+ return {
409
+ controlPlaneUrl: current.controlPlaneUrl,
410
+ runtimeId: current.runtimeId,
411
+ machineId: current.machineId,
412
+ credentialEpoch: current.credentialEpoch,
413
+ grantToken: current.token,
414
+ expiresAtSeconds: current.expiresAtSeconds
415
+ };
416
+ }
417
+ /**
418
+ * Seed the in-memory control authority from the sealed Service bootstrap grant.
419
+ * The grant must be exact-machine and carry exactly heartbeat + replication;
420
+ * it cannot authorize owner transport or any credential broker operation.
421
+ */
422
+ function bootstrapRuntimeControlAuthorityFromNarrowGrant(input) {
423
+ const claims = verifyCmmdRuntimeTicket(input.grantToken, {
424
+ publicKeyPem: input.identity.publicKeyPem,
425
+ orgId: input.identity.orgId,
426
+ projectId: input.identity.projectId,
427
+ runtimeId: input.identity.runtimeId,
428
+ machineId: input.identity.machineId,
429
+ credentialEpoch: input.identity.credentialEpoch
430
+ });
431
+ if (!claims || !isExactControlTicket(claims, input.identity)) return false;
432
+ return storeRuntimeControlAuthority({
433
+ identity: input.identity,
434
+ envelope: {
435
+ runtimeId: input.identity.runtimeId,
436
+ controlTicket: input.grantToken,
437
+ expiresAt: (/* @__PURE__ */ new Date(claims.expiresAtSeconds * 1e3)).toISOString()
438
+ }
439
+ });
440
+ }
441
+ async function bootstrapRuntimeControlAuthority(input) {
442
+ const current = authority;
443
+ const nowSeconds = input.nowSeconds ?? Math.floor(Date.now() / 1e3);
444
+ if (current && sameIdentity(current, input.identity) && current.expiresAtSeconds > nowSeconds + CONTROL_AUTHORITY_REFRESH_SKEW_SECONDS) return true;
445
+ if (bootstrapInFlight) return bootstrapInFlight;
446
+ bootstrapInFlight = (async () => {
447
+ const envelope = parseRuntimeControlAuthorityEnvelope(await requestWithTimeout(new URL(`/api/forge/context/runtime-authority/runtimes/${encodeURIComponent(input.identity.runtimeId)}/control-ticket/bootstrap`, `${normalizedControlPlaneUrl(input.identity.controlPlaneUrl)}/`), {
448
+ method: "POST",
449
+ headers: {
450
+ authorization: `Bearer ${input.connectToken}`,
451
+ "x-forge-runtime-provisioning-grant": input.provisioningGrant
452
+ }
453
+ }, input.fetchImpl ?? fetch));
454
+ if (!envelope || !storeRuntimeControlAuthority({
455
+ identity: input.identity,
456
+ envelope
457
+ })) throw new RuntimeControlAuthorityError({
458
+ code: "CMMD_RUNTIME_CONTROL_AUTHORITY_INVALID_RESPONSE",
459
+ message: "CMMD runtime control authority response did not match this runtime."
460
+ });
461
+ return true;
462
+ })().finally(() => {
463
+ bootstrapInFlight = null;
464
+ });
465
+ return bootstrapInFlight;
466
+ }
467
+ async function sendRuntimeControlHeartbeat(input) {
468
+ const current = authority;
469
+ const grant = readRuntimeControlAuthority(input);
470
+ if (!current || !grant) return null;
471
+ let body;
472
+ try {
473
+ body = await requestRuntimeControlHeartbeat({
474
+ grant,
475
+ activeTurnCount: input.activeTurnCount,
476
+ activeSessionCount: input.activeSessionCount,
477
+ forgeGitCommit: input.forgeGitCommit,
478
+ fetchImpl: input.fetchImpl ?? fetch
479
+ });
480
+ } catch (error) {
481
+ clearRejectedAuthority(error, grant.grantToken);
482
+ throw error;
483
+ }
484
+ const envelope = parseRuntimeControlAuthorityEnvelope(body);
485
+ if (!envelope || !storeRuntimeControlAuthority({
486
+ identity: current,
487
+ envelope
488
+ })) throw new RuntimeControlAuthorityError({
489
+ code: "CMMD_RUNTIME_CONTROL_AUTHORITY_INVALID_RESPONSE",
490
+ message: "CMMD runtime heartbeat returned authority for a different runtime."
491
+ });
492
+ return {
493
+ activeTurnCount: envelope.activeTurnCount ?? input.activeTurnCount,
494
+ activeSessionCount: envelope.activeSessionCount ?? input.activeSessionCount,
495
+ draining: envelope.draining ?? false,
496
+ drainStartedAt: envelope.drainStartedAt ?? null,
497
+ drainReason: envelope.drainReason ?? null,
498
+ drainTargetImageRef: envelope.drainTargetImageRef ?? null,
499
+ drainTargetImageVersion: envelope.drainTargetImageVersion ?? null,
500
+ drainForceRequired: envelope.drainForceRequired ?? false
501
+ };
502
+ }
503
+ //#endregion
504
+ Object.defineProperty(exports, "bootstrapRuntimeControlAuthority", {
505
+ enumerable: true,
506
+ get: function() {
507
+ return bootstrapRuntimeControlAuthority;
508
+ }
509
+ });
510
+ Object.defineProperty(exports, "bootstrapRuntimeControlAuthorityFromNarrowGrant", {
511
+ enumerable: true,
512
+ get: function() {
513
+ return bootstrapRuntimeControlAuthorityFromNarrowGrant;
514
+ }
515
+ });
516
+ Object.defineProperty(exports, "createReadOnceFileTokenAccessor", {
517
+ enumerable: true,
518
+ get: function() {
519
+ return createReadOnceFileTokenAccessor;
520
+ }
521
+ });
522
+ Object.defineProperty(exports, "readRuntimeControlAuthority", {
523
+ enumerable: true,
524
+ get: function() {
525
+ return readRuntimeControlAuthority;
526
+ }
527
+ });
528
+ Object.defineProperty(exports, "runtimeGrantToken", {
529
+ enumerable: true,
530
+ get: function() {
531
+ return runtimeGrantToken;
532
+ }
533
+ });
534
+ Object.defineProperty(exports, "sendRuntimeControlHeartbeat", {
535
+ enumerable: true,
536
+ get: function() {
537
+ return sendRuntimeControlHeartbeat;
538
+ }
539
+ });
540
+ Object.defineProperty(exports, "setRuntimeGrantToken", {
541
+ enumerable: true,
542
+ get: function() {
543
+ return setRuntimeGrantToken;
544
+ }
545
+ });
546
+ Object.defineProperty(exports, "verifyCmmdAuthRuntimeTicket", {
547
+ enumerable: true,
548
+ get: function() {
549
+ return verifyCmmdAuthRuntimeTicket;
550
+ }
551
+ });
552
+ Object.defineProperty(exports, "verifyCmmdClaudeReadinessTicket", {
553
+ enumerable: true,
554
+ get: function() {
555
+ return verifyCmmdClaudeReadinessTicket;
556
+ }
557
+ });
558
+ Object.defineProperty(exports, "verifyCmmdRuntimeTicket", {
559
+ enumerable: true,
560
+ get: function() {
561
+ return verifyCmmdRuntimeTicket;
562
+ }
563
+ });
564
+ Object.defineProperty(exports, "verifyCmmdRuntimeTicketRefreshProof", {
565
+ enumerable: true,
566
+ get: function() {
567
+ return verifyCmmdRuntimeTicketRefreshProof;
568
+ }
569
+ });
570
+
571
+ //# sourceMappingURL=runtimeControlAuthority-Dx6Y5LPI.cjs.map
package/package.json CHANGED
@@ -1,7 +1,5 @@
1
1
  {
2
2
  "name": "@cmmd-center/forge",
3
- "version": "0.9.2",
4
- "license": "MIT",
5
3
  "repository": {
6
4
  "type": "git",
7
5
  "url": "https://github.com/CMMD-Center/forge",
@@ -10,19 +8,15 @@
10
8
  "bin": {
11
9
  "cmmd-forge": "dist/bin.mjs"
12
10
  },
11
+ "type": "module",
12
+ "version": "0.9.4",
13
+ "engines": {
14
+ "node": "^22.16 || ^23.11 || >=24.10"
15
+ },
13
16
  "files": [
14
17
  "dist",
15
18
  "!dist/**/*.map"
16
19
  ],
17
- "type": "module",
18
- "scripts": {
19
- "dev": "FORGE_PORT=${FORGE_PORT:-13773} FORGE_COMMAND_APP_URL=${FORGE_COMMAND_APP_URL:-https://cmmd.ai} bun --watch src/bin.ts",
20
- "build": "node scripts/cli.ts build",
21
- "start": "node dist/bin.mjs",
22
- "prepare": "effect-language-service patch || exit 0",
23
- "typecheck": "tsc --noEmit",
24
- "test": "vitest run"
25
- },
26
20
  "dependencies": {
27
21
  "@anthropic-ai/claude-agent-sdk": "^0.3.232",
28
22
  "@cmmd-center/agent-browser": "0.6.2",
@@ -42,24 +36,28 @@
42
36
  "werift": "0.24.4",
43
37
  "zod": "^4.0.0"
44
38
  },
45
- "devDependencies": {
46
- "@cmmd-forge/client-runtime": "0.0.0-alpha.1",
47
- "@cmmd-forge/contracts": "0.9.0",
48
- "@cmmd-forge/shared": "0.0.0-alpha.1",
49
- "@cmmd-forge/web": "0.9.0",
50
- "@effect/language-service": "0.84.2",
51
- "@effect/vitest": "4.0.0-beta.45",
52
- "@types/bun": "^1.3.9",
53
- "@types/node": "^24.10.13",
54
- "@types/pg": "^8.21.0",
55
- "@types/ws": "^8.5.13",
56
- "effect-acp": "0.0.1",
57
- "tsdown": "0.21.4",
58
- "typescript": "^5.7.3",
59
- "vitest": "^4.1.10",
60
- "@cmmd-forge/relay-host": "0.0.0-alpha.1"
61
- },
62
- "engines": {
63
- "node": "^22.16 || ^23.11 || >=24.10"
39
+ "overrides": {
40
+ "@babel/core": "7.29.7",
41
+ "@opentelemetry/core": "2.10.0",
42
+ "ajv": "8.20.0",
43
+ "brace-expansion": "5.0.9",
44
+ "dompurify": "3.4.13",
45
+ "esbuild": "0.28.1",
46
+ "fast-uri": "4.1.2",
47
+ "js-yaml": "4.3.1",
48
+ "nanoid": "3.3.18",
49
+ "picomatch": "4.0.5",
50
+ "postcss": "8.5.25",
51
+ "protobufjs": "7.6.5",
52
+ "sharp": "0.35.3",
53
+ "shell-quote": "1.10.0",
54
+ "smol-toml": "1.7.1",
55
+ "svgo": "4.0.2",
56
+ "tar": "7.5.22",
57
+ "undici": "7.29.0",
58
+ "uuid": "11.1.1",
59
+ "vite": "^8.2.0",
60
+ "ws": "8.21.2",
61
+ "yaml": "2.9.0"
64
62
  }
65
63
  }