@cmmd-center/forge 0.9.3 → 0.9.5

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 +14484 -10871
  20. package/dist/bin.mjs +14667 -11052
  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-L85w5RTn.mjs +535 -0
  458. package/dist/runtimeControlAuthority-SNBF5Mjy.cjs +601 -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,601 @@
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
+ /**
254
+ * Whether trying again could plausibly succeed.
255
+ *
256
+ * A restarting control plane and a wrong credential both fail here and need
257
+ * opposite responses: the first must be retried until the deploy finishes,
258
+ * the second must not be retried at all. Without this the caller cannot tell
259
+ * them apart and picks wrong in one direction or the other.
260
+ */
261
+ retryable;
262
+ constructor(input) {
263
+ super(input.message);
264
+ this.name = "RuntimeControlAuthorityError";
265
+ this.status = input.status ?? null;
266
+ this.code = input.code;
267
+ this.retryable = input.retryable ?? false;
268
+ }
269
+ };
270
+ /** Longest body prefix quoted into an error message. */
271
+ const CONTROL_AUTHORITY_BODY_PREVIEW = 180;
272
+ /**
273
+ * A short, credential-free description of a body that would not parse.
274
+ *
275
+ * The point is to identify the RESPONDER. A proxy error page says who it is in
276
+ * its first line, and that one line is the whole difference between "CMMD is
277
+ * redeploying" and a multi-hour dig through a guest.
278
+ *
279
+ * Redacted because this lands in logs and the responder is not always the one
280
+ * we think it is: anything resembling a JWT or a long opaque token is stripped
281
+ * rather than trusted to be harmless.
282
+ */
283
+ function describeUnparsableBody(body) {
284
+ const collapsed = body.replace(/[A-Za-z0-9_-]{12,}\.[A-Za-z0-9_-]{12,}\.[A-Za-z0-9_-]{6,}/g, "<redacted-jwt>").replace(/[A-Za-z0-9_-]{40,}/g, "<redacted>").replace(/\s+/g, " ").trim();
285
+ return collapsed.length > CONTROL_AUTHORITY_BODY_PREVIEW ? `${collapsed.slice(0, CONTROL_AUTHORITY_BODY_PREVIEW)}…` : collapsed;
286
+ }
287
+ let authority = null;
288
+ let bootstrapInFlight = null;
289
+ function normalizedControlPlaneUrl(value) {
290
+ return value.trim().replace(/\/+$/u, "");
291
+ }
292
+ function asObject(value) {
293
+ return value !== null && typeof value === "object" ? value : null;
294
+ }
295
+ function readNullableString(value) {
296
+ if (value === null) return null;
297
+ return typeof value === "string" ? value : void 0;
298
+ }
299
+ function hasValidOptionalHeartbeatFields(payload) {
300
+ const countsAreValid = [payload.activeTurnCount, payload.activeSessionCount].every((value) => value === void 0 || Number.isSafeInteger(value) && value >= 0);
301
+ const stringsAreValid = [
302
+ payload.drainStartedAt,
303
+ payload.drainReason,
304
+ payload.drainTargetImageRef,
305
+ payload.drainTargetImageVersion
306
+ ].every((value) => value === void 0 || value === null || typeof value === "string");
307
+ return countsAreValid && stringsAreValid && (payload.draining === void 0 || typeof payload.draining === "boolean") && (payload.drainForceRequired === void 0 || typeof payload.drainForceRequired === "boolean");
308
+ }
309
+ function requiredControlFields(payload) {
310
+ const runtimeId = payload.runtimeId;
311
+ const controlTicket = payload.controlTicket;
312
+ const expiresAt = payload.expiresAt;
313
+ 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;
314
+ return {
315
+ runtimeId,
316
+ controlTicket,
317
+ expiresAt
318
+ };
319
+ }
320
+ function optionalHeartbeatFields(payload) {
321
+ const activeTurnCount = payload.activeTurnCount;
322
+ const activeSessionCount = payload.activeSessionCount;
323
+ const drainStartedAt = readNullableString(payload.drainStartedAt);
324
+ const drainReason = readNullableString(payload.drainReason);
325
+ const drainTargetImageRef = readNullableString(payload.drainTargetImageRef);
326
+ const drainTargetImageVersion = readNullableString(payload.drainTargetImageVersion);
327
+ return {
328
+ ...typeof activeTurnCount === "number" ? { activeTurnCount } : {},
329
+ ...typeof activeSessionCount === "number" ? { activeSessionCount } : {},
330
+ ...typeof payload.draining === "boolean" ? { draining: payload.draining } : {},
331
+ ...drainStartedAt !== void 0 ? { drainStartedAt } : {},
332
+ ...drainReason !== void 0 ? { drainReason } : {},
333
+ ...drainTargetImageRef !== void 0 ? { drainTargetImageRef } : {},
334
+ ...drainTargetImageVersion !== void 0 ? { drainTargetImageVersion } : {},
335
+ ...typeof payload.drainForceRequired === "boolean" ? { drainForceRequired: payload.drainForceRequired } : {}
336
+ };
337
+ }
338
+ function parseRuntimeControlAuthorityEnvelope(value) {
339
+ const payload = asObject(asObject(value)?.data);
340
+ if (!payload) return null;
341
+ const required = requiredControlFields(payload);
342
+ if (!required || !hasValidOptionalHeartbeatFields(payload)) return null;
343
+ return {
344
+ ...required,
345
+ ...optionalHeartbeatFields(payload)
346
+ };
347
+ }
348
+ function sameIdentity(stored, identity) {
349
+ 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;
350
+ }
351
+ function isExactControlTicket(claims, identity) {
352
+ const scopes = new Set(claims.scope);
353
+ 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));
354
+ }
355
+ function storeRuntimeControlAuthority(input) {
356
+ if (input.envelope.runtimeId !== input.identity.runtimeId) return false;
357
+ const claims = verifyCmmdRuntimeTicket(input.envelope.controlTicket, {
358
+ publicKeyPem: input.identity.publicKeyPem,
359
+ orgId: input.identity.orgId,
360
+ projectId: input.identity.projectId,
361
+ runtimeId: input.identity.runtimeId,
362
+ machineId: input.identity.machineId,
363
+ credentialEpoch: input.identity.credentialEpoch
364
+ });
365
+ if (!claims || !isExactControlTicket(claims, input.identity)) return false;
366
+ const responseExpirySeconds = Math.floor(Date.parse(input.envelope.expiresAt) / 1e3);
367
+ if (Math.abs(responseExpirySeconds - claims.expiresAtSeconds) > 1) return false;
368
+ if (authority && sameIdentity(authority, input.identity)) {
369
+ if (authority.expiresAtSeconds >= claims.expiresAtSeconds) return true;
370
+ }
371
+ authority = {
372
+ ...input.identity,
373
+ controlPlaneUrl: normalizedControlPlaneUrl(input.identity.controlPlaneUrl),
374
+ token: input.envelope.controlTicket,
375
+ expiresAtSeconds: claims.expiresAtSeconds
376
+ };
377
+ return true;
378
+ }
379
+ async function readControlAuthorityResponse(response) {
380
+ if (!response.ok) throw new RuntimeControlAuthorityError({
381
+ status: response.status,
382
+ code: "CMMD_RUNTIME_CONTROL_AUTHORITY_REJECTED",
383
+ retryable: response.status >= 500,
384
+ message: `CMMD runtime control authority request failed (${response.status}).`
385
+ });
386
+ const raw = await response.text().catch(() => "");
387
+ try {
388
+ return JSON.parse(raw);
389
+ } catch {
390
+ throw new RuntimeControlAuthorityError({
391
+ status: response.status,
392
+ code: "CMMD_RUNTIME_CONTROL_AUTHORITY_INVALID_RESPONSE",
393
+ retryable: true,
394
+ message: `CMMD runtime control authority returned ${response.status} with a non-JSON body (content-type: ${response.headers.get("content-type") ?? "none"}): ${describeUnparsableBody(raw) || "<empty>"}`
395
+ });
396
+ }
397
+ }
398
+ async function requestWithTimeout(url, init, fetchImpl) {
399
+ const abortController = new AbortController();
400
+ const timeout = setTimeout(() => abortController.abort(), CONTROL_AUTHORITY_TIMEOUT_MS);
401
+ try {
402
+ return await readControlAuthorityResponse(await fetchImpl(url, {
403
+ ...init,
404
+ signal: abortController.signal
405
+ }));
406
+ } finally {
407
+ clearTimeout(timeout);
408
+ }
409
+ }
410
+ async function requestRuntimeControlHeartbeat(input) {
411
+ return requestWithTimeout(new URL(`/api/forge/context/runtime-authority/runtimes/${encodeURIComponent(input.grant.runtimeId)}/heartbeat`, `${input.grant.controlPlaneUrl}/`), {
412
+ method: "POST",
413
+ headers: {
414
+ authorization: `Bearer ${input.grant.grantToken}`,
415
+ "content-type": "application/json"
416
+ },
417
+ body: JSON.stringify({
418
+ activeTurnCount: input.activeTurnCount,
419
+ activeSessionCount: input.activeSessionCount,
420
+ ...input.forgeGitCommit !== void 0 ? { forgeGitCommit: input.forgeGitCommit } : {}
421
+ })
422
+ }, input.fetchImpl);
423
+ }
424
+ function clearRejectedAuthority(error, grantToken) {
425
+ if (!(error instanceof RuntimeControlAuthorityError)) return;
426
+ if (error.status !== 401 && error.status !== 410) return;
427
+ if (authority?.token === grantToken) authority = null;
428
+ }
429
+ function readRuntimeControlAuthority(input) {
430
+ const current = authority;
431
+ if (!current) return null;
432
+ const nowSeconds = input.nowSeconds ?? Math.floor(Date.now() / 1e3);
433
+ if (current.expiresAtSeconds <= nowSeconds) {
434
+ authority = null;
435
+ return null;
436
+ }
437
+ if (current.runtimeId !== input.runtimeId || current.machineId !== input.machineId || current.credentialEpoch !== input.credentialEpoch) return null;
438
+ return {
439
+ controlPlaneUrl: current.controlPlaneUrl,
440
+ runtimeId: current.runtimeId,
441
+ machineId: current.machineId,
442
+ credentialEpoch: current.credentialEpoch,
443
+ grantToken: current.token,
444
+ expiresAtSeconds: current.expiresAtSeconds
445
+ };
446
+ }
447
+ /**
448
+ * Seed the in-memory control authority from the sealed Service bootstrap grant.
449
+ * The grant must be exact-machine and carry exactly heartbeat + replication;
450
+ * it cannot authorize owner transport or any credential broker operation.
451
+ */
452
+ function bootstrapRuntimeControlAuthorityFromNarrowGrant(input) {
453
+ const claims = verifyCmmdRuntimeTicket(input.grantToken, {
454
+ publicKeyPem: input.identity.publicKeyPem,
455
+ orgId: input.identity.orgId,
456
+ projectId: input.identity.projectId,
457
+ runtimeId: input.identity.runtimeId,
458
+ machineId: input.identity.machineId,
459
+ credentialEpoch: input.identity.credentialEpoch
460
+ });
461
+ if (!claims || !isExactControlTicket(claims, input.identity)) return false;
462
+ return storeRuntimeControlAuthority({
463
+ identity: input.identity,
464
+ envelope: {
465
+ runtimeId: input.identity.runtimeId,
466
+ controlTicket: input.grantToken,
467
+ expiresAt: (/* @__PURE__ */ new Date(claims.expiresAtSeconds * 1e3)).toISOString()
468
+ }
469
+ });
470
+ }
471
+ async function bootstrapRuntimeControlAuthority(input) {
472
+ const current = authority;
473
+ const nowSeconds = input.nowSeconds ?? Math.floor(Date.now() / 1e3);
474
+ if (current && sameIdentity(current, input.identity) && current.expiresAtSeconds > nowSeconds + CONTROL_AUTHORITY_REFRESH_SKEW_SECONDS) return true;
475
+ if (bootstrapInFlight) return bootstrapInFlight;
476
+ bootstrapInFlight = (async () => {
477
+ const envelope = parseRuntimeControlAuthorityEnvelope(await requestWithTimeout(new URL(`/api/forge/context/runtime-authority/runtimes/${encodeURIComponent(input.identity.runtimeId)}/control-ticket/bootstrap`, `${normalizedControlPlaneUrl(input.identity.controlPlaneUrl)}/`), {
478
+ method: "POST",
479
+ headers: {
480
+ authorization: `Bearer ${input.connectToken}`,
481
+ "x-forge-runtime-provisioning-grant": input.provisioningGrant
482
+ }
483
+ }, input.fetchImpl ?? fetch));
484
+ if (!envelope || !storeRuntimeControlAuthority({
485
+ identity: input.identity,
486
+ envelope
487
+ })) throw new RuntimeControlAuthorityError({
488
+ code: "CMMD_RUNTIME_CONTROL_AUTHORITY_INVALID_RESPONSE",
489
+ message: "CMMD runtime control authority response did not match this runtime."
490
+ });
491
+ return true;
492
+ })().finally(() => {
493
+ bootstrapInFlight = null;
494
+ });
495
+ return bootstrapInFlight;
496
+ }
497
+ async function sendRuntimeControlHeartbeat(input) {
498
+ const current = authority;
499
+ const grant = readRuntimeControlAuthority(input);
500
+ if (!current || !grant) return null;
501
+ let body;
502
+ try {
503
+ body = await requestRuntimeControlHeartbeat({
504
+ grant,
505
+ activeTurnCount: input.activeTurnCount,
506
+ activeSessionCount: input.activeSessionCount,
507
+ forgeGitCommit: input.forgeGitCommit,
508
+ fetchImpl: input.fetchImpl ?? fetch
509
+ });
510
+ } catch (error) {
511
+ clearRejectedAuthority(error, grant.grantToken);
512
+ throw error;
513
+ }
514
+ const envelope = parseRuntimeControlAuthorityEnvelope(body);
515
+ if (!envelope || !storeRuntimeControlAuthority({
516
+ identity: current,
517
+ envelope
518
+ })) throw new RuntimeControlAuthorityError({
519
+ code: "CMMD_RUNTIME_CONTROL_AUTHORITY_INVALID_RESPONSE",
520
+ message: "CMMD runtime heartbeat returned authority for a different runtime."
521
+ });
522
+ return {
523
+ activeTurnCount: envelope.activeTurnCount ?? input.activeTurnCount,
524
+ activeSessionCount: envelope.activeSessionCount ?? input.activeSessionCount,
525
+ draining: envelope.draining ?? false,
526
+ drainStartedAt: envelope.drainStartedAt ?? null,
527
+ drainReason: envelope.drainReason ?? null,
528
+ drainTargetImageRef: envelope.drainTargetImageRef ?? null,
529
+ drainTargetImageVersion: envelope.drainTargetImageVersion ?? null,
530
+ drainForceRequired: envelope.drainForceRequired ?? false
531
+ };
532
+ }
533
+ //#endregion
534
+ Object.defineProperty(exports, "bootstrapRuntimeControlAuthority", {
535
+ enumerable: true,
536
+ get: function() {
537
+ return bootstrapRuntimeControlAuthority;
538
+ }
539
+ });
540
+ Object.defineProperty(exports, "bootstrapRuntimeControlAuthorityFromNarrowGrant", {
541
+ enumerable: true,
542
+ get: function() {
543
+ return bootstrapRuntimeControlAuthorityFromNarrowGrant;
544
+ }
545
+ });
546
+ Object.defineProperty(exports, "createReadOnceFileTokenAccessor", {
547
+ enumerable: true,
548
+ get: function() {
549
+ return createReadOnceFileTokenAccessor;
550
+ }
551
+ });
552
+ Object.defineProperty(exports, "readRuntimeControlAuthority", {
553
+ enumerable: true,
554
+ get: function() {
555
+ return readRuntimeControlAuthority;
556
+ }
557
+ });
558
+ Object.defineProperty(exports, "runtimeGrantToken", {
559
+ enumerable: true,
560
+ get: function() {
561
+ return runtimeGrantToken;
562
+ }
563
+ });
564
+ Object.defineProperty(exports, "sendRuntimeControlHeartbeat", {
565
+ enumerable: true,
566
+ get: function() {
567
+ return sendRuntimeControlHeartbeat;
568
+ }
569
+ });
570
+ Object.defineProperty(exports, "setRuntimeGrantToken", {
571
+ enumerable: true,
572
+ get: function() {
573
+ return setRuntimeGrantToken;
574
+ }
575
+ });
576
+ Object.defineProperty(exports, "verifyCmmdAuthRuntimeTicket", {
577
+ enumerable: true,
578
+ get: function() {
579
+ return verifyCmmdAuthRuntimeTicket;
580
+ }
581
+ });
582
+ Object.defineProperty(exports, "verifyCmmdClaudeReadinessTicket", {
583
+ enumerable: true,
584
+ get: function() {
585
+ return verifyCmmdClaudeReadinessTicket;
586
+ }
587
+ });
588
+ Object.defineProperty(exports, "verifyCmmdRuntimeTicket", {
589
+ enumerable: true,
590
+ get: function() {
591
+ return verifyCmmdRuntimeTicket;
592
+ }
593
+ });
594
+ Object.defineProperty(exports, "verifyCmmdRuntimeTicketRefreshProof", {
595
+ enumerable: true,
596
+ get: function() {
597
+ return verifyCmmdRuntimeTicketRefreshProof;
598
+ }
599
+ });
600
+
601
+ //# sourceMappingURL=runtimeControlAuthority-SNBF5Mjy.cjs.map
package/package.json CHANGED
@@ -1,7 +1,5 @@
1
1
  {
2
2
  "name": "@cmmd-center/forge",
3
- "version": "0.9.3",
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.5",
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/relay-host": "0.0.0-alpha.1",
49
- "@cmmd-forge/shared": "0.0.0-alpha.1",
50
- "@cmmd-forge/web": "0.9.0",
51
- "@effect/language-service": "0.84.2",
52
- "@effect/vitest": "4.0.0-beta.45",
53
- "@types/bun": "^1.3.9",
54
- "@types/node": "^24.10.13",
55
- "@types/pg": "^8.21.0",
56
- "@types/ws": "^8.5.13",
57
- "effect-acp": "0.0.1",
58
- "tsdown": "0.21.4",
59
- "typescript": "^5.7.3",
60
- "vitest": "^4.1.10"
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
  }