openportal 0.1.30 → 0.1.32

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 (534) hide show
  1. package/dist/index.js +369 -104
  2. package/package.json +5 -5
  3. package/web/nitro.json +3 -3
  4. package/web/public/assets/Input-CabuNR46.js +1 -0
  5. package/web/public/assets/_app-BuWZVanD.js +41 -0
  6. package/web/public/assets/_app-C7teCofH.js +1 -0
  7. package/web/public/assets/_id-qj9enZSf.js +37 -0
  8. package/web/public/assets/about-B4D-YQvu.js +1 -0
  9. package/web/public/assets/angular-html-CyxhxxC6.js +1 -0
  10. package/web/public/assets/angular-ts-DKwzvk_A.js +1 -0
  11. package/web/public/assets/{apl-DB8yy-Bd.js → apl-D9JhLyA8.js} +1 -1
  12. package/web/public/assets/{astro-4VtdQ-aO.js → astro-D35iUAk4.js} +1 -1
  13. package/web/public/assets/{blade-CedhYCgA.js → blade-CQ_yb9AJ.js} +1 -1
  14. package/web/public/assets/breadcrumb-context-BSiNOVxE.js +1 -0
  15. package/web/public/assets/{bsl-BQ-5RGbs.js → bsl-BDVOE52A.js} +1 -1
  16. package/web/public/assets/button-CoQU6poF.js +7 -0
  17. package/web/public/assets/c-DP4PuxsC.js +1 -0
  18. package/web/public/assets/{cairo-RAtbTRH-.js → cairo-BDZ6TRZS.js} +1 -1
  19. package/web/public/assets/{cobol-BW4nVR_8.js → cobol-Cj7rLdF4.js} +1 -1
  20. package/web/public/assets/{coffee-CxscSGMn.js → coffee-BEqQ7khn.js} +1 -1
  21. package/web/public/assets/cpp-K58e7MPy.js +1 -0
  22. package/web/public/assets/{crystal-p1F2qTK3.js → crystal-WvacFQuU.js} +1 -1
  23. package/web/public/assets/css-D8-m18hd.js +1 -0
  24. package/web/public/assets/diff-Bggc2a-A.js +227 -0
  25. package/web/public/assets/{edge-nNdVK-5H.js → edge-C2YjZt3E.js} +1 -1
  26. package/web/public/assets/{elixir-BWAg5rOr.js → elixir-DGL2pFx1.js} +1 -1
  27. package/web/public/assets/{elm-Fmq6niEZ.js → elm-CrPEbkYU.js} +1 -1
  28. package/web/public/assets/{erb-Cj-oBkqz.js → erb-Pjl6MxSx.js} +1 -1
  29. package/web/public/assets/{erlang-Dlo360hX.js → erlang-cuhwpmsu.js} +1 -1
  30. package/web/public/assets/field-BD1fYKgU.js +1 -0
  31. package/web/public/assets/{fortran-fixed-form-BNWSYlx7.js → fortran-fixed-form-CS9qOEPh.js} +1 -1
  32. package/web/public/assets/{fsharp-BvlCOZl9.js → fsharp-CQ5iYSPA.js} +1 -1
  33. package/web/public/assets/{gdresource-D_lHHmUz.js → gdresource-BAudk4qB.js} +1 -1
  34. package/web/public/assets/{git-commit-Bzl1bEH3.js → git-commit-6e79eN7Q.js} +1 -1
  35. package/web/public/assets/{git-rebase-CfPSMPpK.js → git-rebase-0YNSjhVf.js} +1 -1
  36. package/web/public/assets/{glimmer-js-C8F_h5kh.js → glimmer-js-BWHy9y50.js} +1 -1
  37. package/web/public/assets/{glimmer-ts-BVvqGv4s.js → glimmer-ts-DX8iZiOc.js} +1 -1
  38. package/web/public/assets/glsl-COW3sf6s.js +1 -0
  39. package/web/public/assets/graphql-Dd2Tpr9E.js +1 -0
  40. package/web/public/assets/{hack-BGs3bAjg.js → hack-DAJwWGZ4.js} +1 -1
  41. package/web/public/assets/haml-t0kHqiMk.js +1 -0
  42. package/web/public/assets/{handlebars-Di4bVtub.js → handlebars-qamPNlYY.js} +1 -1
  43. package/web/public/assets/html-D_X3PCw-.js +1 -0
  44. package/web/public/assets/html-derivative-CkXhljkj.js +1 -0
  45. package/web/public/assets/{http-VI9HDs0H.js → http-Cy1i-1jR.js} +1 -1
  46. package/web/public/assets/{hurl-Biy0pToc.js → hurl-BtIML1gH.js} +1 -1
  47. package/web/public/assets/{hxml-LeIITq3U.js → hxml-BlbkePaW.js} +1 -1
  48. package/web/public/assets/index-2xA55Y4b.css +2 -0
  49. package/web/public/assets/index-DxX6GAcL.js +10 -0
  50. package/web/public/assets/input-BmSt5bV_.js +1 -0
  51. package/web/public/assets/instances-BrhvsiT6.js +1 -0
  52. package/web/public/assets/java-DWvpLZQg.js +1 -0
  53. package/web/public/assets/javascript-rQslrTlU.js +1 -0
  54. package/web/public/assets/{jinja-ChSNS6Tw.js → jinja-C5RLRSh5.js} +1 -1
  55. package/web/public/assets/{jison-DgzqD4_V.js → jison-CEtCKWto.js} +1 -1
  56. package/web/public/assets/json-BtCTWCCg.js +1 -0
  57. package/web/public/assets/jsx-CC-anpHJ.js +1 -0
  58. package/web/public/assets/jsx-runtime-BE_tW6Ee.js +1 -0
  59. package/web/public/assets/{julia-BoDGmjvF.js → julia-DYZnQ9C_.js} +1 -1
  60. package/web/public/assets/{latex-ATBiwIsF.js → latex-DmbAavtk.js} +1 -1
  61. package/web/public/assets/lib-hFmyZdda.js +1 -0
  62. package/web/public/assets/link-e2hDme49.js +1 -0
  63. package/web/public/assets/{liquid-ZOI8eZQ-.js → liquid-DRMm6-P7.js} +1 -1
  64. package/web/public/assets/lua-D5x9Ej0C.js +1 -0
  65. package/web/public/assets/lucide-oITxMZUb.js +1 -0
  66. package/web/public/assets/{marko-DKJu0e8n.js → marko-BRjURZmp.js} +1 -1
  67. package/web/public/assets/{mdc-CVf5s5cG.js → mdc-BORe-lTd.js} +1 -1
  68. package/web/public/assets/{nginx-ts6STlG_.js → nginx--G2djEeU.js} +1 -1
  69. package/web/public/assets/{nim-CQJu0uif.js → nim-Bg97nylc.js} +1 -1
  70. package/web/public/assets/parsePatchFiles-D3jLD0yV.js +4 -0
  71. package/web/public/assets/{perl-VAbochW_.js → perl-BObf9N37.js} +1 -1
  72. package/web/public/assets/{php-YioiNFhr.js → php-inqyeXtA.js} +1 -1
  73. package/web/public/assets/pierre-dark-pqLturbW.js +1 -0
  74. package/web/public/assets/pierre-light-xEQF8aEA.js +1 -0
  75. package/web/public/assets/popover-D7DqQzYd.js +5 -0
  76. package/web/public/assets/{pug-B-40Haq6.js → pug-CyUw5FPt.js} +1 -1
  77. package/web/public/assets/{qml-kOoNwPEG.js → qml-IWAIEnkZ.js} +1 -1
  78. package/web/public/assets/r-B7wiE8s0.js +1 -0
  79. package/web/public/assets/{razor-OH0A0iCi.js → razor-DHWbGfqh.js} +1 -1
  80. package/web/public/assets/regexp-B5tDXh-D.js +1 -0
  81. package/web/public/assets/{rst-D2m0MWQG.js → rst-BOV1Iu5T.js} +1 -1
  82. package/web/public/assets/{ruby-Cd39ka5u.js → ruby-MEoEfPKM.js} +1 -1
  83. package/web/public/assets/{sas-BHFIMNhs.js → sas-Dxq9CzH7.js} +1 -1
  84. package/web/public/assets/scss-BMjNhvSM.js +1 -0
  85. package/web/public/assets/settings-BtPmV_Mc.js +1 -0
  86. package/web/public/assets/{shaderlab-BmcIVS6O.js → shaderlab-BiweuU0M.js} +1 -1
  87. package/web/public/assets/shellscript-P32R2bme.js +1 -0
  88. package/web/public/assets/{shellsession-BJ4t2Sdy.js → shellsession-BlrJ09y9.js} +1 -1
  89. package/web/public/assets/{soy-Bkj3NqFU.js → soy-BpQ0SMiq.js} +1 -1
  90. package/web/public/assets/{sparql-DxWpmA6s.js → sparql-J1VOnnwM.js} +1 -1
  91. package/web/public/assets/sql-DBpDxsUe.js +1 -0
  92. package/web/public/assets/{stata-BuG51IuX.js → stata-DC5z9YAe.js} +1 -1
  93. package/web/public/assets/{svelte-rvdUCFAj.js → svelte-CF6QDu1s.js} +1 -1
  94. package/web/public/assets/{templ-DVzhxzQC.js → templ-tkdPKNAc.js} +1 -1
  95. package/web/public/assets/{tex-BW37SRRB.js → tex-Bt2c8D58.js} +1 -1
  96. package/web/public/assets/{ts-tags-q0oyNnV3.js → ts-tags-B6ZGEqrj.js} +1 -1
  97. package/web/public/assets/tsx-DsDbze4C.js +1 -0
  98. package/web/public/assets/{twig--kFkuY0Y.js → twig-DRzX5__m.js} +1 -1
  99. package/web/public/assets/typescript-y69KCpjV.js +1 -0
  100. package/web/public/assets/use-media-query-DDfzZruf.js +1 -0
  101. package/web/public/assets/use-opencode-C9VP1bV0.js +1 -0
  102. package/web/public/assets/use-session-messages-Cd5WPqmc.js +4 -0
  103. package/web/public/assets/useNavigate-CwkeBifN.js +1 -0
  104. package/web/public/assets/useTextField-4MIBK5lD.js +1 -0
  105. package/web/public/assets/{vue-DPxVclZQ.js → vue-C1vQecwS.js} +1 -1
  106. package/web/public/assets/{vue-html-BMtZ_0Xw.js → vue-html-BrJuM9_k.js} +1 -1
  107. package/web/public/assets/{vue-vine-aF57X0uv.js → vue-vine-eoaT5X-O.js} +1 -1
  108. package/web/public/assets/xml-CK_MCESO.js +1 -0
  109. package/web/public/assets/{xsl-CQtLMMI3.js → xsl-CGwehH9h.js} +1 -1
  110. package/web/public/assets/yaml-okado1J8.js +1 -0
  111. package/web/public/logo.svg +61 -132
  112. package/web/server/_chunks/error-message.mjs +32 -0
  113. package/web/server/_chunks/renderer-template.mjs +6 -2
  114. package/web/server/_libs/@grpc/grpc-js+[...].mjs +23961 -0
  115. package/web/server/_libs/anthropic-ai__claude-agent-sdk.mjs +27103 -0
  116. package/web/server/_libs/balena__dockerignore.mjs +203 -0
  117. package/web/server/_libs/bl+[...].mjs +2416 -0
  118. package/web/server/_libs/chownr.mjs +108 -0
  119. package/web/server/_libs/debug+[...].mjs +813 -0
  120. package/web/server/_libs/docker-modem+split-ca.mjs +548 -0
  121. package/web/server/_libs/dockerode+[...].mjs +5258 -0
  122. package/web/server/_libs/grpc__proto-loader.mjs +291 -0
  123. package/web/server/_libs/h3+rou3+srvx.mjs +861 -0
  124. package/web/server/_libs/hookable.mjs +41 -0
  125. package/web/server/_libs/opencode-ai__sdk.mjs +4536 -0
  126. package/web/server/_libs/ufo.mjs +64 -0
  127. package/web/server/_libs/unctx.mjs +82 -0
  128. package/web/server/_libs/zod.mjs +3988 -0
  129. package/web/server/_routes/api/claude/[port]/agents.mjs +10 -0
  130. package/web/server/_routes/api/claude/[port]/config.mjs +9 -0
  131. package/web/server/_routes/api/claude/[port]/events.mjs +30 -0
  132. package/web/server/_routes/api/claude/[port]/files/search.mjs +11 -0
  133. package/web/server/_routes/api/claude/[port]/git/diff.mjs +9 -0
  134. package/web/server/_routes/api/claude/[port]/health.mjs +9 -0
  135. package/web/server/_routes/api/claude/[port]/permission/[requestId]/reply.mjs +22 -0
  136. package/web/server/_routes/api/claude/[port]/permissions.mjs +9 -0
  137. package/web/server/_routes/api/claude/[port]/project/current.mjs +9 -0
  138. package/web/server/_routes/api/claude/[port]/providers.mjs +9 -0
  139. package/web/server/_routes/api/claude/[port]/question/[requestId]/reject.mjs +12 -0
  140. package/web/server/_routes/api/claude/[port]/question/[requestId]/reply.mjs +15 -0
  141. package/web/server/_routes/api/claude/[port]/questions.mjs +9 -0
  142. package/web/server/_routes/api/claude/[port]/session/[id]/abort.mjs +15 -0
  143. package/web/server/_routes/api/claude/[port]/session/[id]/messages.mjs +11 -0
  144. package/web/server/_routes/api/claude/[port]/session/[id]/prompt.mjs +55 -0
  145. package/web/server/_routes/api/claude/[port]/session/[id].mjs +11 -0
  146. package/web/server/_routes/api/claude/[port]/session/[id]2.mjs +11 -0
  147. package/web/server/_routes/api/claude/[port]/session/create.mjs +16 -0
  148. package/web/server/_routes/api/claude/[port]/session/status.mjs +9 -0
  149. package/web/server/_routes/api/claude/[port]/sessions.mjs +9 -0
  150. package/web/server/_routes/api/codex/[port]/agents.mjs +10 -0
  151. package/web/server/_routes/api/codex/[port]/config.mjs +9 -0
  152. package/web/server/_routes/api/codex/[port]/events.mjs +30 -0
  153. package/web/server/_routes/api/codex/[port]/files/search.mjs +19 -0
  154. package/web/server/_routes/api/codex/[port]/git/diff.mjs +26 -0
  155. package/web/server/_routes/api/codex/[port]/health.mjs +13 -0
  156. package/web/server/_routes/api/codex/[port]/permission/[requestId]/reply.mjs +22 -0
  157. package/web/server/_routes/api/codex/[port]/permissions.mjs +9 -0
  158. package/web/server/_routes/api/codex/[port]/project/current.mjs +9 -0
  159. package/web/server/_routes/api/codex/[port]/providers.mjs +30 -0
  160. package/web/server/_routes/api/codex/[port]/question/[requestId]/reject.mjs +12 -0
  161. package/web/server/_routes/api/codex/[port]/question/[requestId]/reply.mjs +15 -0
  162. package/web/server/_routes/api/codex/[port]/questions.mjs +9 -0
  163. package/web/server/_routes/api/codex/[port]/session/[id]/abort.mjs +28 -0
  164. package/web/server/_routes/api/codex/[port]/session/[id]/messages.mjs +22 -0
  165. package/web/server/_routes/api/codex/[port]/session/[id]/prompt.mjs +80 -0
  166. package/web/server/_routes/api/codex/[port]/session/[id].mjs +12 -0
  167. package/web/server/_routes/api/codex/[port]/session/[id]2.mjs +14 -0
  168. package/web/server/_routes/api/codex/[port]/session/create.mjs +24 -0
  169. package/web/server/_routes/api/codex/[port]/session/status.mjs +16 -0
  170. package/web/server/_routes/api/codex/[port]/sessions.mjs +12 -0
  171. package/web/server/_routes/api/hello.mjs +3 -1
  172. package/web/server/_routes/api/instances.mjs +357 -14
  173. package/web/server/_routes/api/lib/claude_client.mjs +875 -0
  174. package/web/server/_routes/api/lib/codex_client.mjs +687 -0
  175. package/web/server/_routes/api/lib/docker.mjs +7 -27272
  176. package/web/server/_routes/api/lib/opencode_client.mjs +16 -4504
  177. package/web/server/_routes/api/lib/process_cwd.mjs +91 -0
  178. package/web/server/_routes/api/lib/validation.mjs +5 -3613
  179. package/web/server/_routes/api/opencode/[port]/agents.mjs +4 -2
  180. package/web/server/_routes/api/opencode/[port]/config.mjs +4 -2
  181. package/web/server/_routes/api/opencode/[port]/events.mjs +46 -0
  182. package/web/server/_routes/api/opencode/[port]/files/search.mjs +5 -3
  183. package/web/server/_routes/api/opencode/[port]/git/diff.mjs +4 -2
  184. package/web/server/_routes/api/opencode/[port]/health.mjs +4 -2
  185. package/web/server/_routes/api/opencode/[port]/permission/[requestId]/reply.mjs +7 -4
  186. package/web/server/_routes/api/opencode/[port]/permissions.mjs +5 -3
  187. package/web/server/_routes/api/opencode/[port]/project/current.mjs +4 -2
  188. package/web/server/_routes/api/opencode/[port]/providers.mjs +4 -2
  189. package/web/server/_routes/api/opencode/[port]/question/[requestId]/reject.mjs +5 -3
  190. package/web/server/_routes/api/opencode/[port]/question/[requestId]/reply.mjs +7 -4
  191. package/web/server/_routes/api/opencode/[port]/questions.mjs +5 -3
  192. package/web/server/_routes/api/opencode/[port]/session/[id]/abort.mjs +5 -3
  193. package/web/server/_routes/api/opencode/[port]/session/[id]/messages.mjs +5 -3
  194. package/web/server/_routes/api/opencode/[port]/session/[id]/prompt.mjs +51 -20
  195. package/web/server/_routes/api/opencode/[port]/session/[id].mjs +5 -3
  196. package/web/server/_routes/api/opencode/[port]/session/[id]2.mjs +5 -3
  197. package/web/server/_routes/api/opencode/[port]/session/create.mjs +7 -4
  198. package/web/server/_routes/api/opencode/[port]/session/status.mjs +9 -0
  199. package/web/server/_routes/api/opencode/[port]/sessions.mjs +4 -2
  200. package/web/server/_routes/api/system/hostname.mjs +3 -1
  201. package/web/server/_runtime.mjs +37 -0
  202. package/web/server/index.mjs +1892 -2380
  203. package/web/server/node_modules/nan/.github/workflows/ci.yml +52 -0
  204. package/web/server/node_modules/nan/.pre-commit-config.yaml +8 -0
  205. package/web/server/node_modules/nan/CHANGELOG.md +587 -0
  206. package/web/server/node_modules/nan/CMakeLists.txt +138 -0
  207. package/web/server/node_modules/nan/LICENSE.md +9 -0
  208. package/web/server/node_modules/nan/README.md +456 -0
  209. package/web/server/node_modules/nan/doc/asyncworker.md +146 -0
  210. package/web/server/node_modules/nan/doc/buffers.md +54 -0
  211. package/web/server/node_modules/nan/doc/callback.md +76 -0
  212. package/web/server/node_modules/nan/doc/converters.md +41 -0
  213. package/web/server/node_modules/nan/doc/errors.md +226 -0
  214. package/web/server/node_modules/nan/doc/json.md +62 -0
  215. package/web/server/node_modules/nan/doc/maybe_types.md +583 -0
  216. package/web/server/node_modules/nan/doc/methods.md +672 -0
  217. package/web/server/node_modules/nan/doc/new.md +147 -0
  218. package/web/server/node_modules/nan/doc/node_misc.md +123 -0
  219. package/web/server/node_modules/nan/doc/object_wrappers.md +263 -0
  220. package/web/server/node_modules/nan/doc/persistent.md +296 -0
  221. package/web/server/node_modules/nan/doc/scopes.md +73 -0
  222. package/web/server/node_modules/nan/doc/script.md +58 -0
  223. package/web/server/node_modules/nan/doc/string_bytes.md +81 -0
  224. package/web/server/node_modules/nan/doc/v8_internals.md +199 -0
  225. package/web/server/node_modules/nan/doc/v8_misc.md +85 -0
  226. package/web/server/node_modules/nan/include_dirs.js +1 -0
  227. package/web/server/node_modules/nan/nan.h +3096 -0
  228. package/web/server/node_modules/nan/nan_callbacks.h +141 -0
  229. package/web/server/node_modules/nan/nan_callbacks_12_inl.h +690 -0
  230. package/web/server/node_modules/nan/nan_callbacks_pre_12_inl.h +524 -0
  231. package/web/server/node_modules/nan/nan_converters.h +72 -0
  232. package/web/server/node_modules/nan/nan_converters_43_inl.h +68 -0
  233. package/web/server/node_modules/nan/nan_converters_pre_43_inl.h +42 -0
  234. package/web/server/node_modules/nan/nan_define_own_property_helper.h +29 -0
  235. package/web/server/node_modules/nan/nan_implementation_12_inl.h +430 -0
  236. package/web/server/node_modules/nan/nan_implementation_pre_12_inl.h +263 -0
  237. package/web/server/node_modules/nan/nan_json.h +166 -0
  238. package/web/server/node_modules/nan/nan_maybe_43_inl.h +360 -0
  239. package/web/server/node_modules/nan/nan_maybe_pre_43_inl.h +268 -0
  240. package/web/server/node_modules/nan/nan_new.h +340 -0
  241. package/web/server/node_modules/nan/nan_object_wrap.h +156 -0
  242. package/web/server/node_modules/nan/nan_persistent_12_inl.h +132 -0
  243. package/web/server/node_modules/nan/nan_persistent_pre_12_inl.h +242 -0
  244. package/web/server/node_modules/nan/nan_private.h +73 -0
  245. package/web/server/node_modules/nan/nan_scriptorigin.h +97 -0
  246. package/web/server/node_modules/nan/nan_string_bytes.h +305 -0
  247. package/web/server/node_modules/nan/nan_typedarray_contents.h +96 -0
  248. package/web/server/node_modules/nan/nan_weak.h +437 -0
  249. package/web/server/node_modules/nan/package.json +38 -0
  250. package/web/server/node_modules/nan/tools/1to2.js +412 -0
  251. package/web/server/node_modules/nan/tools/README.md +14 -0
  252. package/web/server/node_modules/nan/tools/package.json +19 -0
  253. package/web/server/package.json +1 -0
  254. package/web/public/assets/_app-BP3u2dm1.js +0 -1
  255. package/web/public/assets/_app-oJ3Lrn6N.js +0 -41
  256. package/web/public/assets/_id-Dx4XC9aR.js +0 -37
  257. package/web/public/assets/about-ttI-qJiN.js +0 -1
  258. package/web/public/assets/angular-html-B7AzbcLu.js +0 -1
  259. package/web/public/assets/angular-html-CWHM6XK4.js +0 -1
  260. package/web/public/assets/angular-ts-jRfZdOvj.js +0 -1
  261. package/web/public/assets/breadcrumb-context-DWkmxEQX.js +0 -1
  262. package/web/public/assets/c-BYyBRgEf.js +0 -1
  263. package/web/public/assets/c-rDRZoEwT.js +0 -1
  264. package/web/public/assets/cpp-BKPlHVN1.js +0 -1
  265. package/web/public/assets/cpp-DNNfSORd.js +0 -1
  266. package/web/public/assets/css-C_016fQU.js +0 -1
  267. package/web/public/assets/css-D3AwVSc2.js +0 -1
  268. package/web/public/assets/diff-D9_v9i9f.js +0 -1261
  269. package/web/public/assets/field-Cw2QJqyI.js +0 -1
  270. package/web/public/assets/glsl-CCt8Xq74.js +0 -1
  271. package/web/public/assets/glsl-mjl6J7xQ.js +0 -1
  272. package/web/public/assets/graphql-D1AnvbII.js +0 -1
  273. package/web/public/assets/graphql-DcY1hApn.js +0 -1
  274. package/web/public/assets/haml-B_PDjSS6.js +0 -1
  275. package/web/public/assets/haml-phUSYqbS.js +0 -1
  276. package/web/public/assets/html-DELXQlGO.js +0 -1
  277. package/web/public/assets/html-DiubA6TF.js +0 -1
  278. package/web/public/assets/html-derivative-BT-nCKmo.js +0 -1
  279. package/web/public/assets/html-derivative-Dh3FrOEV.js +0 -1
  280. package/web/public/assets/index-60mxcexA.css +0 -2
  281. package/web/public/assets/index-C3_uDbNm.js +0 -20
  282. package/web/public/assets/input-nwkok9tX.js +0 -1
  283. package/web/public/assets/instances-DrNzb2th.js +0 -1
  284. package/web/public/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  285. package/web/public/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  286. package/web/public/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  287. package/web/public/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  288. package/web/public/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  289. package/web/public/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  290. package/web/public/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  291. package/web/public/assets/java-BF4HWAb8.js +0 -1
  292. package/web/public/assets/java-C8Q66F3q.js +0 -1
  293. package/web/public/assets/javascript-0KITOXoO.js +0 -1
  294. package/web/public/assets/javascript-QwaHzY8K.js +0 -1
  295. package/web/public/assets/json-DtIt9qZE.js +0 -1
  296. package/web/public/assets/json-Jxsv7nl6.js +0 -1
  297. package/web/public/assets/jsx-0dhG_2WJ.js +0 -1
  298. package/web/public/assets/jsx-CN3KuEC1.js +0 -1
  299. package/web/public/assets/lib-7Fkkv145.js +0 -1
  300. package/web/public/assets/link-DmT_NfGE.js +0 -1
  301. package/web/public/assets/lua-CaSSwCd3.js +0 -1
  302. package/web/public/assets/lua-DLhBNWry.js +0 -1
  303. package/web/public/assets/model-store-NhJgW8wq.js +0 -1
  304. package/web/public/assets/parsePatchFiles-B433dV5r.js +0 -2
  305. package/web/public/assets/pierre-dark-Dkue_Ycs.js +0 -1
  306. package/web/public/assets/pierre-light-BSpDZVY4.js +0 -1
  307. package/web/public/assets/r-BjiStVkJ.js +0 -1
  308. package/web/public/assets/r-rdDIhDK8.js +0 -1
  309. package/web/public/assets/regexp-BbCrcKjn.js +0 -1
  310. package/web/public/assets/regexp-Y5ti0BKu.js +0 -1
  311. package/web/public/assets/scss-DrMMzxFY.js +0 -1
  312. package/web/public/assets/scss-a6SFBKT5.js +0 -1
  313. package/web/public/assets/settings-RvjCqP-Z.js +0 -1
  314. package/web/public/assets/shellscript-DzFbcKnv.js +0 -1
  315. package/web/public/assets/shellscript-yo20ha4w.js +0 -1
  316. package/web/public/assets/sql-BwmtsbRY.js +0 -1
  317. package/web/public/assets/sql-Cigyp1SO.js +0 -1
  318. package/web/public/assets/tsx-CUSFgtHy.js +0 -1
  319. package/web/public/assets/tsx-DgIHkbwf.js +0 -1
  320. package/web/public/assets/typescript-15oSVc7C.js +0 -1
  321. package/web/public/assets/typescript-aRFFLtTZ.js +0 -1
  322. package/web/public/assets/use-media-query-BIqDs21v.js +0 -1
  323. package/web/public/assets/useHasTabbableChild-DxWNQ_JF.js +0 -1
  324. package/web/public/assets/xml-BwthnBQz.js +0 -1
  325. package/web/public/assets/xml-miX9dRbM.js +0 -1
  326. package/web/public/assets/yaml-DkAPUzRH.js +0 -1
  327. package/web/public/assets/yaml-s6kFNfpY.js +0 -1
  328. /package/web/public/assets/{abap-D-EGwWJY.js → abap-BYgfS2J7.js} +0 -0
  329. /package/web/public/assets/{actionscript-3-BgEzobaq.js → actionscript-3-CWRCR4iE.js} +0 -0
  330. /package/web/public/assets/{ada-CK_QIbnr.js → ada-C49PBMn9.js} +0 -0
  331. /package/web/public/assets/{andromeeda-7Uyrbc3l.js → andromeeda-BBhAo6p7.js} +0 -0
  332. /package/web/public/assets/{apache-Dh3lWCDO.js → apache-BIH3t0yU.js} +0 -0
  333. /package/web/public/assets/{apex-Diyrmqfh.js → apex-ChBAwGH0.js} +0 -0
  334. /package/web/public/assets/{applescript-CGbSGD4R.js → applescript-F6IQpFHw.js} +0 -0
  335. /package/web/public/assets/{ara-BKT6no2T.js → ara-C7jg9iGE.js} +0 -0
  336. /package/web/public/assets/{asciidoc-BmRKQHbQ.js → asciidoc-BNeev37S.js} +0 -0
  337. /package/web/public/assets/{asm-Cqt8SHGO.js → asm-C_FYSSlO.js} +0 -0
  338. /package/web/public/assets/{aurora-x-CK7ktht2.js → aurora-x-BrXKjfbm.js} +0 -0
  339. /package/web/public/assets/{awk-B3FFpX_J.js → awk-Dhzptovp.js} +0 -0
  340. /package/web/public/assets/{ayu-dark-xJfjuCq8.js → ayu-dark-Bc6YaM0t.js} +0 -0
  341. /package/web/public/assets/{ballerina-DACRT-sT.js → ballerina-BMtRaYfJ.js} +0 -0
  342. /package/web/public/assets/{bat-DU4--CMj.js → bat-C-_iWjni.js} +0 -0
  343. /package/web/public/assets/{beancount-DvXvE1x-.js → beancount-SMCafKaA.js} +0 -0
  344. /package/web/public/assets/{berry-DCFF4Zj1.js → berry-B1oQ9RhK.js} +0 -0
  345. /package/web/public/assets/{bibtex-42-C5dln.js → bibtex-BH2gsObK.js} +0 -0
  346. /package/web/public/assets/{bicep-Dqm4PFuz.js → bicep-CzfNgsCD.js} +0 -0
  347. /package/web/public/assets/{cadence-C7hktLdb.js → cadence-BPDgYNWy.js} +0 -0
  348. /package/web/public/assets/{catppuccin-frappe-BFZAZJr3.js → catppuccin-frappe-D5TUFPbv.js} +0 -0
  349. /package/web/public/assets/{catppuccin-latte-2OpvPHma.js → catppuccin-latte-wUX3NN1_.js} +0 -0
  350. /package/web/public/assets/{catppuccin-macchiato-DOwBDSZG.js → catppuccin-macchiato-DXVcU9LJ.js} +0 -0
  351. /package/web/public/assets/{catppuccin-mocha-CPO4jaGM.js → catppuccin-mocha-CofYr3Sw.js} +0 -0
  352. /package/web/public/assets/{clarity-Rka6Ibys.js → clarity-Cmao5KSK.js} +0 -0
  353. /package/web/public/assets/{clojure-CEvM-ay9.js → clojure-D2dPuTkk.js} +0 -0
  354. /package/web/public/assets/{cmake-C-HulLqg.js → cmake-DaqQuj4A.js} +0 -0
  355. /package/web/public/assets/{codeowners-Bqxy-1en.js → codeowners-B748jmvc.js} +0 -0
  356. /package/web/public/assets/{codeql-aVPOmvJw.js → codeql-CXb_8gHR.js} +0 -0
  357. /package/web/public/assets/{common-lisp-CoH5Bypy.js → common-lisp-UZn9nc_5.js} +0 -0
  358. /package/web/public/assets/{coq-DHxvo73o.js → coq-DtO6yBIf.js} +0 -0
  359. /package/web/public/assets/{csharp-D1r0FgxE.js → csharp-BnPoTBy3.js} +0 -0
  360. /package/web/public/assets/{csv-C7wYOwss.js → csv-BBwiVr0X.js} +0 -0
  361. /package/web/public/assets/{cue-DVrj2AhX.js → cue-ScBFXY5f.js} +0 -0
  362. /package/web/public/assets/{cypher-CzVprHrl.js → cypher-CGStaC1X.js} +0 -0
  363. /package/web/public/assets/{d-x3a3_Xaw.js → d-CuTCIvnX.js} +0 -0
  364. /package/web/public/assets/{dark-plus-C0kLyDb3.js → dark-plus-B3ok_MHp.js} +0 -0
  365. /package/web/public/assets/{dart-DpnlYij3.js → dart-CqEodbm2.js} +0 -0
  366. /package/web/public/assets/{dax-Syv_hoiD.js → dax-UdE5S0Dh.js} +0 -0
  367. /package/web/public/assets/{desktop-D-wRHhtZ.js → desktop-DfmsfHJA.js} +0 -0
  368. /package/web/public/assets/{diff-DK3WLOEN.js → diff-CW0RWGd9.js} +0 -0
  369. /package/web/public/assets/{docker-BD8m_NS-.js → docker-B1qtW4ha.js} +0 -0
  370. /package/web/public/assets/{dotenv-CEeS2qc8.js → dotenv-BUzOh1k8.js} +0 -0
  371. /package/web/public/assets/{dracula-BbbBTYdV.js → dracula-NHy-p_Sb.js} +0 -0
  372. /package/web/public/assets/{dracula-soft-DEnCbN_E.js → dracula-soft-Dd1um8Q4.js} +0 -0
  373. /package/web/public/assets/{dream-maker-G83xWHtA.js → dream-maker-CBvk18nW.js} +0 -0
  374. /package/web/public/assets/{emacs-lisp-BMx_yBNe.js → emacs-lisp-DvSgLhDc.js} +0 -0
  375. /package/web/public/assets/{everforest-dark-BIGnUa1K.js → everforest-dark-BdLm24PG.js} +0 -0
  376. /package/web/public/assets/{everforest-light-DPDFUUUm.js → everforest-light-Cgvecm8J.js} +0 -0
  377. /package/web/public/assets/{fennel-D7bUTXOY.js → fennel-C-1kWlGf.js} +0 -0
  378. /package/web/public/assets/{fish-DACMRGFm.js → fish-CCpdtwqS.js} +0 -0
  379. /package/web/public/assets/{fluent-DoOY2028.js → fluent-BLg032oD.js} +0 -0
  380. /package/web/public/assets/{fortran-free-form-BMVGiZsS.js → fortran-free-form-DIFTDnRp.js} +0 -0
  381. /package/web/public/assets/{gdscript-qeX4viki.js → gdscript-BLGfbRse.js} +0 -0
  382. /package/web/public/assets/{gdshader-D4QG_LtG.js → gdshader-D4XNAEs9.js} +0 -0
  383. /package/web/public/assets/{genie-BZz7sgTg.js → genie-DmN-ICAN.js} +0 -0
  384. /package/web/public/assets/{gherkin-2F0Hux6H.js → gherkin-cuHHmRcX.js} +0 -0
  385. /package/web/public/assets/{github-dark-Ca_Q9Ef-.js → github-dark-BDEAeF5S.js} +0 -0
  386. /package/web/public/assets/{github-dark-default-B1hvTzqD.js → github-dark-default-B-VFdUi6.js} +0 -0
  387. /package/web/public/assets/{github-dark-dimmed-Czc28Paq.js → github-dark-dimmed-2DcdHZGe.js} +0 -0
  388. /package/web/public/assets/{github-dark-high-contrast-ClAFj_yD.js → github-dark-high-contrast-AfozBrrn.js} +0 -0
  389. /package/web/public/assets/{github-light-DXMgzlkd.js → github-light-B_HSK8-e.js} +0 -0
  390. /package/web/public/assets/{github-light-default-C0heX20M.js → github-light-default-DMQ1Mkip.js} +0 -0
  391. /package/web/public/assets/{github-light-high-contrast-Bdso7WSe.js → github-light-high-contrast-B9a-IAhW.js} +0 -0
  392. /package/web/public/assets/{gleam-CKujK_9r.js → gleam-D8VhqPDN.js} +0 -0
  393. /package/web/public/assets/{gnuplot-BnBldI7s.js → gnuplot-CsDpqO9X.js} +0 -0
  394. /package/web/public/assets/{go-D6V3e4Pz.js → go-BKDYqdrY.js} +0 -0
  395. /package/web/public/assets/{groovy-IfwXezsJ.js → groovy-Bi4Ll6no.js} +0 -0
  396. /package/web/public/assets/{gruvbox-dark-hard-CyHULVus.js → gruvbox-dark-hard-uWDvDB_Y.js} +0 -0
  397. /package/web/public/assets/{gruvbox-dark-medium-qJ9c8ND8.js → gruvbox-dark-medium-07z7e6Pn.js} +0 -0
  398. /package/web/public/assets/{gruvbox-dark-soft-C3qjYIJM.js → gruvbox-dark-soft-Bd5D-IiK.js} +0 -0
  399. /package/web/public/assets/{gruvbox-light-hard-DkgPegzV.js → gruvbox-light-hard-Co4Cca5U.js} +0 -0
  400. /package/web/public/assets/{gruvbox-light-medium-B_nBvpHM.js → gruvbox-light-medium-D4j8sDK2.js} +0 -0
  401. /package/web/public/assets/{gruvbox-light-soft-DPS00qzJ.js → gruvbox-light-soft-CT6vuid9.js} +0 -0
  402. /package/web/public/assets/{haskell-D_Wr4SP2.js → haskell-D62N_CAU.js} +0 -0
  403. /package/web/public/assets/{haxe-ChYRFbqx.js → haxe-DaOPEPd0.js} +0 -0
  404. /package/web/public/assets/{hcl-Cp5RP0NG.js → hcl-CKZP2LV2.js} +0 -0
  405. /package/web/public/assets/{hjson-C4qJjjHJ.js → hjson-ZrcQLLvz.js} +0 -0
  406. /package/web/public/assets/{hlsl-D179HP7y.js → hlsl-tDveWUL8.js} +0 -0
  407. /package/web/public/assets/{houston-CGv9NbgY.js → houston-DraBEKDe.js} +0 -0
  408. /package/web/public/assets/{hy-BtEqxKCs.js → hy-B2TuzEnV.js} +0 -0
  409. /package/web/public/assets/{imba-CRJbREiM.js → imba-WHJcCHli.js} +0 -0
  410. /package/web/public/assets/{ini-DSBqdtZl.js → ini-WzVu4r_S.js} +0 -0
  411. /package/web/public/assets/{json5-DMIvwtR8.js → json5-uChlRsCy.js} +0 -0
  412. /package/web/public/assets/{jsonc-BdlCXPtc.js → jsonc-o1JbODDc.js} +0 -0
  413. /package/web/public/assets/{jsonl-BpVOCxVu.js → jsonl-DsFPqTWt.js} +0 -0
  414. /package/web/public/assets/{jsonnet-D3jmEwtD.js → jsonnet-Do87PjDg.js} +0 -0
  415. /package/web/public/assets/{jssm-D7adz0Zk.js → jssm-DsKQKyHh.js} +0 -0
  416. /package/web/public/assets/{kanagawa-dragon-C8xtaWaa.js → kanagawa-dragon-DILUCdKU.js} +0 -0
  417. /package/web/public/assets/{kanagawa-lotus-Dkvwz-sh.js → kanagawa-lotus-B2Kuykzq.js} +0 -0
  418. /package/web/public/assets/{kanagawa-wave-CVz5XkfW.js → kanagawa-wave-CZqOKF3_.js} +0 -0
  419. /package/web/public/assets/{kdl-B0l_UDtx.js → kdl-B2a5Hdo5.js} +0 -0
  420. /package/web/public/assets/{kotlin-D4Z4sobD.js → kotlin-CwntYu9G.js} +0 -0
  421. /package/web/public/assets/{kusto-DBK7U6YD.js → kusto-C7xLiDy1.js} +0 -0
  422. /package/web/public/assets/{laserwave-DEPeWYLv.js → laserwave-CLp9KmkC.js} +0 -0
  423. /package/web/public/assets/{lean-BrTxhtiv.js → lean-C0OcwREI.js} +0 -0
  424. /package/web/public/assets/{less-duanLLE_.js → less-Dycz37IB.js} +0 -0
  425. /package/web/public/assets/{light-plus-BMUJ881T.js → light-plus-CASdk9mM.js} +0 -0
  426. /package/web/public/assets/{llvm-DFpB8htZ.js → llvm-subw26Uf.js} +0 -0
  427. /package/web/public/assets/{log-DUaYj482.js → log-CM4eTPwH.js} +0 -0
  428. /package/web/public/assets/{logo-U-be5s9s.js → logo-DCYIDlXZ.js} +0 -0
  429. /package/web/public/assets/{luau-ENKSAnK9.js → luau-DJkYOK-N.js} +0 -0
  430. /package/web/public/assets/{make-DjZta7xH.js → make-Bep3F-fA.js} +0 -0
  431. /package/web/public/assets/{markdown-DuOOcY8R.js → markdown-DXxotAxn.js} +0 -0
  432. /package/web/public/assets/{material-theme-XDSyYav6.js → material-theme-CfqmFDHZ.js} +0 -0
  433. /package/web/public/assets/{material-theme-darker-DhqKKVGd.js → material-theme-darker-MsbnpuuF.js} +0 -0
  434. /package/web/public/assets/{material-theme-lighter-vYkeG0w7.js → material-theme-lighter-BTEEfJMo.js} +0 -0
  435. /package/web/public/assets/{material-theme-ocean-Cw5ndLhJ.js → material-theme-ocean-CBzqTWI5.js} +0 -0
  436. /package/web/public/assets/{material-theme-palenight--eyVzvO9.js → material-theme-palenight-RKraSPMB.js} +0 -0
  437. /package/web/public/assets/{matlab-BoQcPd8Y.js → matlab-BjvFQgI4.js} +0 -0
  438. /package/web/public/assets/{mdx-B3HnIKti.js → mdx-DnKU9cqA.js} +0 -0
  439. /package/web/public/assets/{mermaid-CjOIJZ_2.js → mermaid-PsCdFMP4.js} +0 -0
  440. /package/web/public/assets/{min-dark-BcaiaifK.js → min-dark-Cv_rJJe3.js} +0 -0
  441. /package/web/public/assets/{min-light-CV0Zl-N6.js → min-light-adtpsoGt.js} +0 -0
  442. /package/web/public/assets/{mipsasm-D4P2J3AH.js → mipsasm-OAAwCDEg.js} +0 -0
  443. /package/web/public/assets/{mojo-DdFmV95X.js → mojo-C98RG4zx.js} +0 -0
  444. /package/web/public/assets/{monokai-CdNjJcyb.js → monokai-R__67SiO.js} +0 -0
  445. /package/web/public/assets/{move-BbTBpY6E.js → move-BKs_wrSq.js} +0 -0
  446. /package/web/public/assets/{narrat-D90YM_aP.js → narrat-DXBAGtnK.js} +0 -0
  447. /package/web/public/assets/{nextflow-CjzhFVAq.js → nextflow-DnO2XFP7.js} +0 -0
  448. /package/web/public/assets/{night-owl-Br_mJtsB.js → night-owl-c-XUdzNN.js} +0 -0
  449. /package/web/public/assets/{nix-CJ7FQB3j.js → nix-DSVQz1Vb.js} +0 -0
  450. /package/web/public/assets/{nord-CzGMyUS4.js → nord-CfpzYV6O.js} +0 -0
  451. /package/web/public/assets/{nushell-CGk3MG_2.js → nushell-CW8y6_6S.js} +0 -0
  452. /package/web/public/assets/{objective-c-brSW1tDJ.js → objective-c-GRClK1S7.js} +0 -0
  453. /package/web/public/assets/{objective-cpp-Bi4qA4YK.js → objective-cpp-l3qYw-v5.js} +0 -0
  454. /package/web/public/assets/{ocaml-CK8oFJnL.js → ocaml-BBDyhyMH.js} +0 -0
  455. /package/web/public/assets/{one-dark-pro-uX4CVnLO.js → one-dark-pro-NuzFmTft.js} +0 -0
  456. /package/web/public/assets/{one-light-BLm888ve.js → one-light-Cgxj9GbU.js} +0 -0
  457. /package/web/public/assets/{openscad-Bc9f44ux.js → openscad-DCmPLSXt.js} +0 -0
  458. /package/web/public/assets/{pascal-DSCI7D66.js → pascal-BMY45JJO.js} +0 -0
  459. /package/web/public/assets/{pkl-DUO2X8D0.js → pkl-ML-dWShO.js} +0 -0
  460. /package/web/public/assets/{plastic-BH7hI5Jl.js → plastic-Dm5h_fPp.js} +0 -0
  461. /package/web/public/assets/{plsql-C_HlhCbf.js → plsql-0vd5cLro.js} +0 -0
  462. /package/web/public/assets/{po-ZbEDR6yR.js → po-CbZ_uqQA.js} +0 -0
  463. /package/web/public/assets/{poimandres-BNZEf_z5.js → poimandres-BMiDntUw.js} +0 -0
  464. /package/web/public/assets/{polar-H99ZI9gT.js → polar-C4hfV8Nc.js} +0 -0
  465. /package/web/public/assets/{postcss-D9V1cTEE.js → postcss-Ct0ld0vz.js} +0 -0
  466. /package/web/public/assets/{powerquery-C21Kh7oG.js → powerquery-CTlGUQPj.js} +0 -0
  467. /package/web/public/assets/{powershell-C7SVh4_l.js → powershell-DyZsOmuq.js} +0 -0
  468. /package/web/public/assets/{prisma-t7qarfT3.js → prisma-SS92PO_I.js} +0 -0
  469. /package/web/public/assets/{prolog-ezNDDDSD.js → prolog-B1O1NNVC.js} +0 -0
  470. /package/web/public/assets/{proto-Loi3x7gt.js → proto-DSThcTAU.js} +0 -0
  471. /package/web/public/assets/{puppet-ICbQHavt.js → puppet-tvtRVdr6.js} +0 -0
  472. /package/web/public/assets/{purescript-5K0_DFG7.js → purescript-Dtbpb7D-.js} +0 -0
  473. /package/web/public/assets/{python-5Ey56Pua.js → python-D1NFioGW.js} +0 -0
  474. /package/web/public/assets/{qmldir-DFDAfCFp.js → qmldir-B-iEOngH.js} +0 -0
  475. /package/web/public/assets/{qss-CFcBGfuz.js → qss-Ba0p-aHw.js} +0 -0
  476. /package/web/public/assets/{racket-BUwKPmlz.js → racket-BXDsxf2U.js} +0 -0
  477. /package/web/public/assets/{raku-dc8o5u1F.js → raku-Dw1WWFXK.js} +0 -0
  478. /package/web/public/assets/{red-BxvfZNpB.js → red-KFYbzZV7.js} +0 -0
  479. /package/web/public/assets/{reg-C4HODx1j.js → reg-DXFHGaM4.js} +0 -0
  480. /package/web/public/assets/{rel-BGn9N5c7.js → rel-Dc5_Ytx2.js} +0 -0
  481. /package/web/public/assets/{riscv-CZ95sp2F.js → riscv-ZgswiWij.js} +0 -0
  482. /package/web/public/assets/{rose-pine-TrkZn1sZ.js → rose-pine-CgpG0Wwm.js} +0 -0
  483. /package/web/public/assets/{rose-pine-dawn-DIS6YmyK.js → rose-pine-dawn-DnQykvhA.js} +0 -0
  484. /package/web/public/assets/{rose-pine-moon-D66xAo56.js → rose-pine-moon-BxLEuV3_.js} +0 -0
  485. /package/web/public/assets/{rosmsg-3tIdVMbs.js → rosmsg-CcBwQf5j.js} +0 -0
  486. /package/web/public/assets/{rust-D4fV7JlL.js → rust-ppknoGus.js} +0 -0
  487. /package/web/public/assets/{sass-Bp0UJY9L.js → sass-Baw41att.js} +0 -0
  488. /package/web/public/assets/{scala-Csvg1HO_.js → scala-DtlnBhKt.js} +0 -0
  489. /package/web/public/assets/{scheme-C_BP1Igg.js → scheme-DYQMayIi.js} +0 -0
  490. /package/web/public/assets/{sdbl-C6SSRmZg.js → sdbl-B_1cHVNm.js} +0 -0
  491. /package/web/public/assets/{slack-dark-D8xiiB5S.js → slack-dark-DaitoxIJ.js} +0 -0
  492. /package/web/public/assets/{slack-ochin-ZhRUeH14.js → slack-ochin-CKzff-0L.js} +0 -0
  493. /package/web/public/assets/{smalltalk-BV1BGSHN.js → smalltalk-DRM3jr39.js} +0 -0
  494. /package/web/public/assets/{snazzy-light-Cr_XMyAN.js → snazzy-light-Cfj-ApKF.js} +0 -0
  495. /package/web/public/assets/{solarized-dark-Cn9jek_l.js → solarized-dark-syg5rn82.js} +0 -0
  496. /package/web/public/assets/{solarized-light-DsiZEVCv.js → solarized-light-BAea3eBG.js} +0 -0
  497. /package/web/public/assets/{solidity-Benh37UM.js → solidity-CYAp_sJG.js} +0 -0
  498. /package/web/public/assets/{splunk-CaLVgio7.js → splunk-LsCTpuOP.js} +0 -0
  499. /package/web/public/assets/{ssh-config-B-O8GtxC.js → ssh-config-QxQe7y21.js} +0 -0
  500. /package/web/public/assets/{stylus-Ym_SHhEQ.js → stylus-DZvi0832.js} +0 -0
  501. /package/web/public/assets/{swift-VXxF3sbs.js → swift-CDjbPYoV.js} +0 -0
  502. /package/web/public/assets/{synthwave-84-w6Szqqjc.js → synthwave-84-7RM1a-o6.js} +0 -0
  503. /package/web/public/assets/{system-verilog-BGjucJg8.js → system-verilog-CYey0nam.js} +0 -0
  504. /package/web/public/assets/{systemd-izjjzSiM.js → systemd-CP-_B7Hs.js} +0 -0
  505. /package/web/public/assets/{talonscript-CvTvX6MJ.js → talonscript-KcJSLq0g.js} +0 -0
  506. /package/web/public/assets/{tasl-B4UTsqP6.js → tasl-UgGRncVE.js} +0 -0
  507. /package/web/public/assets/{tcl-DL-TVAfE.js → tcl-IEoxxKd9.js} +0 -0
  508. /package/web/public/assets/{terraform-BXdxo_8l.js → terraform-PrLLnyiL.js} +0 -0
  509. /package/web/public/assets/{tokyo-night-DIRnpZ_L.js → tokyo-night-CZ_TA08H.js} +0 -0
  510. /package/web/public/assets/{toml-D7Gs36bm.js → toml-W6nxcYtJ.js} +0 -0
  511. /package/web/public/assets/{tsv-DG6pavxb.js → tsv-BRx-N_Yl.js} +0 -0
  512. /package/web/public/assets/{turtle-DGLd8P-0.js → turtle-ZCrKgE8E.js} +0 -0
  513. /package/web/public/assets/{typespec-CDyTGGvc.js → typespec-EjcUAk3i.js} +0 -0
  514. /package/web/public/assets/{typst-DEENuDxs.js → typst-BV1BGyWG.js} +0 -0
  515. /package/web/public/assets/{v-CwAlU6ix.js → v-DsDLzPtW.js} +0 -0
  516. /package/web/public/assets/{vala-Dea7VvuX.js → vala-Bs3vV05i.js} +0 -0
  517. /package/web/public/assets/{vb-DDs8SBzi.js → vb-CPJ4fJKa.js} +0 -0
  518. /package/web/public/assets/{verilog-C5jTwd1F.js → verilog-sIfxvY5_.js} +0 -0
  519. /package/web/public/assets/{vesper-BSHPbApa.js → vesper-BdKAaT7q.js} +0 -0
  520. /package/web/public/assets/{vhdl-9KzRn3Yr.js → vhdl-BWTyDzra.js} +0 -0
  521. /package/web/public/assets/{viml-BWWUx-U5.js → viml-CkzrUc36.js} +0 -0
  522. /package/web/public/assets/{vitesse-black-UFUHYZOi.js → vitesse-black-BkwYYrqu.js} +0 -0
  523. /package/web/public/assets/{vitesse-dark-_tYBvODb.js → vitesse-dark-Dr-0tRFe.js} +0 -0
  524. /package/web/public/assets/{vitesse-light-CRsR_EUr.js → vitesse-light-Dwi9BR_i.js} +0 -0
  525. /package/web/public/assets/{vyper-CHnSipMd.js → vyper-Ddg9ynNK.js} +0 -0
  526. /package/web/public/assets/{wasm-DH36lyNj.js → wasm-0ag0zszG.js} +0 -0
  527. /package/web/public/assets/{wasm-BkG5Qr1Q.js → wasm-xPljl98P.js} +0 -0
  528. /package/web/public/assets/{wenyan-CpA4iUgB.js → wenyan-BVy5yENW.js} +0 -0
  529. /package/web/public/assets/{wgsl-tgmVqEpe.js → wgsl-JVNN3zi8.js} +0 -0
  530. /package/web/public/assets/{wikitext-BSHwRUpE.js → wikitext-CJsbZHwi.js} +0 -0
  531. /package/web/public/assets/{wit-C4w9cEVY.js → wit-DEFTvUMf.js} +0 -0
  532. /package/web/public/assets/{wolfram-D7mQULT_.js → wolfram-CrHN9vWl.js} +0 -0
  533. /package/web/public/assets/{zenscript-mED8Cq2o.js → zenscript-CNDMZH8q.js} +0 -0
  534. /package/web/public/assets/{zig-DgZKy4dX.js → zig-DNDqsL3g.js} +0 -0
package/dist/index.js CHANGED
@@ -2,7 +2,15 @@
2
2
  // @bun
3
3
 
4
4
  // src/index.ts
5
- import { existsSync, readFileSync, writeFileSync } from "fs";
5
+ import {
6
+ closeSync,
7
+ existsSync,
8
+ openSync,
9
+ readFileSync,
10
+ unlinkSync,
11
+ writeFileSync,
12
+ writeSync
13
+ } from "fs";
6
14
 
7
15
  // ../../node_modules/.bun/get-port-please@3.2.0/node_modules/get-port-please/dist/index.mjs
8
16
  import { createServer, Server } from "net";
@@ -263,9 +271,13 @@ import { fileURLToPath } from "url";
263
271
  var __filename2 = fileURLToPath(import.meta.url);
264
272
  var __dirname2 = dirname(__filename2);
265
273
  var CONFIG_PATH = join(homedir(), ".portal.json");
274
+ var CONFIG_LOCK_PATH = `${CONFIG_PATH}.lock`;
266
275
  var DEFAULT_HOSTNAME = "0.0.0.0";
276
+ var DEFAULT_CODEX_HOSTNAME = "127.0.0.1";
267
277
  var DEFAULT_PORT = 3000;
268
278
  var DEFAULT_OPENCODE_PORT = 4000;
279
+ var DEFAULT_CODEX_PORT = 4500;
280
+ var DEFAULT_CLAUDE_PORT = 4600;
269
281
  var WEB_SERVER_PATH = join(__dirname2, "..", "web", "server", "index.mjs");
270
282
  function readConfig() {
271
283
  try {
@@ -273,6 +285,9 @@ function readConfig() {
273
285
  const config = JSON.parse(readFileSync(CONFIG_PATH, "utf-8"));
274
286
  config.instances = config.instances.map((instance) => ({
275
287
  ...instance,
288
+ provider: instance.provider ?? "opencode",
289
+ backendPort: instance.backendPort ?? instance.opencodePort,
290
+ backendPid: instance.backendPid ?? instance.opencodePid ?? null,
276
291
  opencodePid: instance.opencodePid ?? null,
277
292
  webPid: instance.webPid ?? null
278
293
  }));
@@ -286,6 +301,59 @@ function readConfig() {
286
301
  function writeConfig(config) {
287
302
  writeFileSync(CONFIG_PATH, JSON.stringify(config, null, 2));
288
303
  }
304
+ function acquireConfigLock(timeoutMs = 30000) {
305
+ const start = Date.now();
306
+ let backoff = 50;
307
+ while (true) {
308
+ try {
309
+ const fd = openSync(CONFIG_LOCK_PATH, "wx");
310
+ writeSync(fd, String(process.pid));
311
+ closeSync(fd);
312
+ return () => {
313
+ try {
314
+ unlinkSync(CONFIG_LOCK_PATH);
315
+ } catch {}
316
+ };
317
+ } catch (err) {
318
+ if (err.code !== "EEXIST")
319
+ throw err;
320
+ if (tryStealStaleLock())
321
+ continue;
322
+ if (Date.now() - start > timeoutMs) {
323
+ throw new Error(`Could not acquire ${CONFIG_LOCK_PATH} within ${timeoutMs}ms.`);
324
+ }
325
+ Atomics.wait(new Int32Array(new SharedArrayBuffer(4)), 0, 0, backoff);
326
+ backoff = Math.min(backoff * 2, 250);
327
+ }
328
+ }
329
+ }
330
+ function tryStealStaleLock() {
331
+ let holderPid;
332
+ try {
333
+ holderPid = parseInt(readFileSync(CONFIG_LOCK_PATH, "utf-8"), 10);
334
+ } catch {
335
+ return true;
336
+ }
337
+ if (!Number.isFinite(holderPid) || holderPid <= 0)
338
+ return false;
339
+ if (isProcessRunning(holderPid))
340
+ return false;
341
+ try {
342
+ unlinkSync(CONFIG_LOCK_PATH);
343
+ } catch {}
344
+ return true;
345
+ }
346
+ function mutateConfig(mutator) {
347
+ const release = acquireConfigLock();
348
+ try {
349
+ const config = readConfig();
350
+ const result = mutator(config);
351
+ writeConfig(config);
352
+ return result;
353
+ } finally {
354
+ release();
355
+ }
356
+ }
289
357
  function generateId() {
290
358
  return Math.random().toString(36).substring(2, 10);
291
359
  }
@@ -299,18 +367,51 @@ function isProcessRunning(pid) {
299
367
  return false;
300
368
  }
301
369
  }
370
+ function getInstanceProvider(instance) {
371
+ return instance.provider ?? "opencode";
372
+ }
373
+ function getInstanceBackendPort(instance) {
374
+ return instance.backendPort ?? instance.opencodePort;
375
+ }
376
+ function getInstanceBackendPid(instance) {
377
+ return instance.backendPid ?? instance.opencodePid ?? null;
378
+ }
302
379
  function isInstanceRunning(instance) {
303
- return isProcessRunning(instance.opencodePid) || isProcessRunning(instance.webPid);
380
+ if (getInstanceProvider(instance) === "claude") {
381
+ return isProcessRunning(getInstanceBackendPid(instance)) || isProcessRunning(instance.webPid);
382
+ }
383
+ return isProcessRunning(getInstanceBackendPid(instance)) || isProcessRunning(instance.webPid);
384
+ }
385
+ function providerName(provider) {
386
+ if (provider === "codex")
387
+ return "Codex";
388
+ if (provider === "claude")
389
+ return "Claude";
390
+ return "OpenCode";
391
+ }
392
+ function backendName(provider) {
393
+ if (provider === "codex")
394
+ return "Codex app-server";
395
+ if (provider === "claude")
396
+ return "Claude SDK";
397
+ return "OpenCode API";
398
+ }
399
+ function backendLocation(provider, host, port) {
400
+ if (provider === "claude") {
401
+ return `Claude SDK managed by Web UI (instance key: ${port})`;
402
+ }
403
+ const displayHost = host === "0.0.0.0" ? "localhost" : host;
404
+ return `http://${displayHost}:${port}`;
304
405
  }
305
406
  function printHelp() {
306
407
  console.log(`
307
- OpenPortal CLI - Run OpenCode with a web UI
408
+ OpenPortal CLI - Run coding agents with a web UI
308
409
 
309
410
  Usage: openportal [command] [options]
310
411
 
311
412
  Commands:
312
- (default) Start OpenCode server and Web UI
313
- run [options] Start only OpenCode server (no Web UI)
413
+ (default) Start provider backend and Web UI
414
+ run [provider] Start only a provider backend (opencode, codex, or claude)
314
415
  stop Stop running instances
315
416
  list, ls List running instances
316
417
  clean Clean up stale entries
@@ -319,15 +420,27 @@ Options:
319
420
  -h, --help Show this help message
320
421
  -d, --directory <path> Working directory (default: current directory)
321
422
  -p, --port <port> Web UI port (default: 3000)
423
+ --provider <provider> Backend provider: opencode, codex, or claude (default: opencode)
424
+ --backend-port <port> Backend server port for the selected provider
322
425
  --opencode-port <port> OpenCode server port (default: 4000)
426
+ --codex-port <port> Codex app-server port (default: 4500)
427
+ --claude-port <port> Claude instance key (default: 4600)
428
+ --claude-binary <path> Claude binary path (default: claude)
429
+ --claude-home <path> Custom HOME for Claude
430
+ --claude-args <args> Extra Claude launch args
323
431
  --hostname <host> Hostname to bind (default: 0.0.0.0)
324
432
  --name <name> Instance name
325
433
 
326
434
  Examples:
327
435
  openportal Start OpenCode + Web UI
436
+ openportal --provider codex Start Codex + Web UI
437
+ openportal --provider claude Start Claude + Web UI
328
438
  openportal . Start OpenCode + Web UI in current dir
329
439
  openportal run Start only OpenCode server
330
- openportal run -d ./my-project Start OpenCode in specific directory
440
+ openportal run opencode Start only OpenCode server
441
+ openportal run codex Start only Codex app-server
442
+ openportal run claude Keep Claude SDK backend registered
443
+ openportal run codex -d ./my-project Start Codex in specific directory
331
444
  openportal --port 8080 Use custom web UI port
332
445
  openportal stop Stop running instances
333
446
  openportal list List running instances
@@ -366,6 +479,36 @@ function parseArgs() {
366
479
  }
367
480
  return { args, flags };
368
481
  }
482
+ function parseProvider(value) {
483
+ if (typeof value !== "string")
484
+ return null;
485
+ const normalized = value.toLowerCase();
486
+ if (normalized === "opencode" || normalized === "codex" || normalized === "claude") {
487
+ return normalized;
488
+ }
489
+ return null;
490
+ }
491
+ function getProviderOption(options) {
492
+ return parseProvider(options.provider) ?? "opencode";
493
+ }
494
+ async function getBackendPort(provider, options, hostname) {
495
+ const explicit = options["backend-port"] ?? (provider === "codex" ? options["codex-port"] : provider === "claude" ? options["claude-port"] : options["opencode-port"]);
496
+ if (explicit) {
497
+ return parseInt(explicit, 10);
498
+ }
499
+ if (provider === "claude") {
500
+ const used = new Set(readConfig().instances.filter((instance) => getInstanceProvider(instance) === "claude" && isInstanceRunning(instance)).map((instance) => getInstanceBackendPort(instance)));
501
+ let port = DEFAULT_CLAUDE_PORT;
502
+ while (used.has(port) && port < 65535) {
503
+ port += 1;
504
+ }
505
+ return port;
506
+ }
507
+ return getPort({
508
+ host: hostname,
509
+ port: provider === "codex" ? DEFAULT_CODEX_PORT : DEFAULT_OPENCODE_PORT
510
+ });
511
+ }
369
512
  async function startOpenCodeServer(directory, opencodePort, hostname) {
370
513
  console.log(`Starting OpenCode server...`);
371
514
  const proc = Bun.spawn([
@@ -382,6 +525,30 @@ async function startOpenCodeServer(directory, opencodePort, hostname) {
382
525
  });
383
526
  return proc.pid;
384
527
  }
528
+ async function startCodexServer(directory, codexPort) {
529
+ console.log(`Starting Codex app-server...`);
530
+ const proc = Bun.spawn([
531
+ "codex",
532
+ "app-server",
533
+ "--listen",
534
+ `ws://${DEFAULT_CODEX_HOSTNAME}:${codexPort}`
535
+ ], {
536
+ cwd: directory,
537
+ stdio: ["ignore", "pipe", "pipe"],
538
+ env: { ...process.env }
539
+ });
540
+ return proc.pid;
541
+ }
542
+ async function startBackendServer(provider, directory, backendPort, hostname) {
543
+ if (provider === "codex") {
544
+ return startCodexServer(directory, backendPort);
545
+ }
546
+ if (provider === "claude") {
547
+ console.log(`Claude SDK will be managed by the Web UI.`);
548
+ return null;
549
+ }
550
+ return startOpenCodeServer(directory, backendPort, hostname);
551
+ }
385
552
  async function startWebServer(port, hostname) {
386
553
  console.log(`Starting Web UI server...`);
387
554
  const proc = Bun.spawn(["bun", "run", WEB_SERVER_PATH], {
@@ -397,30 +564,54 @@ async function startWebServer(port, hostname) {
397
564
  });
398
565
  return proc.pid;
399
566
  }
567
+ async function waitForClaudeRegistration(instance) {
568
+ console.log(`
569
+ Claude SDK registration is active.`);
570
+ console.log("Keep this command running while you use this Claude instance.");
571
+ console.log("Press Ctrl-C to stop it.");
572
+ await new Promise((resolve2) => {
573
+ const interval = setInterval(() => {}, 60 * 60 * 1000);
574
+ let settled = false;
575
+ const stop = () => {
576
+ if (settled)
577
+ return;
578
+ settled = true;
579
+ clearInterval(interval);
580
+ resolve2();
581
+ };
582
+ process.once("SIGINT", stop);
583
+ process.once("SIGTERM", stop);
584
+ });
585
+ mutateConfig((config) => {
586
+ config.instances = config.instances.filter((i) => i.id !== instance.id);
587
+ });
588
+ console.log(`
589
+ Stopped Claude SDK backend: ${instance.name}`);
590
+ }
400
591
  async function cmdDefault(options) {
592
+ const provider = getProviderOption(options);
401
593
  const hostname = options.hostname || DEFAULT_HOSTNAME;
402
594
  const directory = resolve(options.directory || options.d || process.cwd());
403
- const name = options.name || directory.split("/").pop() || "opencode";
595
+ const name = options.name || directory.split("/").pop() || provider;
404
596
  const port = options.port || options.p ? parseInt(options.port || options.p, 10) : await getPort({ host: hostname, port: DEFAULT_PORT });
405
- const opencodePort = options["opencode-port"] ? parseInt(options["opencode-port"], 10) : await getPort({ host: hostname, port: DEFAULT_OPENCODE_PORT });
406
- const config = readConfig();
407
- const existingIndex = config.instances.findIndex((i) => i.directory === directory);
408
- if (existingIndex !== -1) {
409
- const existing = config.instances[existingIndex];
410
- const running = isInstanceRunning(existing);
411
- if (running || isProcessRunning(existing.webPid)) {
412
- console.log(`OpenPortal is already running for this directory.`);
413
- console.log(` Name: ${existing.name}`);
414
- console.log(` Web UI Port: ${existing.port ?? "N/A"}`);
415
- console.log(` OpenCode Port: ${existing.opencodePort}`);
416
- if (existing.port) {
417
- console.log(`
597
+ const backendHost = provider === "codex" ? DEFAULT_CODEX_HOSTNAME : hostname;
598
+ const backendPort = await getBackendPort(provider, options, backendHost);
599
+ const existing = readConfig().instances.find((i) => i.directory === directory && getInstanceProvider(i) === provider);
600
+ const existingIsActive = existing && (provider === "claude" ? isProcessRunning(existing.webPid) : isInstanceRunning(existing));
601
+ if (existing && existingIsActive) {
602
+ const existingProvider = getInstanceProvider(existing);
603
+ const existingBackendPort = getInstanceBackendPort(existing);
604
+ console.log(`OpenPortal is already running for this directory.`);
605
+ console.log(` Name: ${existing.name}`);
606
+ console.log(` Provider: ${existingProvider}`);
607
+ console.log(` Web UI Port: ${existing.port ?? "N/A"}`);
608
+ console.log(` ${existingProvider === "claude" ? "Instance Key" : "Backend Port"}: ${existingBackendPort}`);
609
+ if (existing.port) {
610
+ console.log(`
418
611
  \uD83D\uDCF1 Access OpenPortal at http://${hostname === "0.0.0.0" ? "localhost" : hostname}:${existing.port}`);
419
- }
420
- console.log(`\uD83D\uDD27 OpenCode API at http://${hostname === "0.0.0.0" ? "localhost" : hostname}:${existing.opencodePort}`);
421
- return;
422
612
  }
423
- config.instances.splice(existingIndex, 1);
613
+ console.log(`\uD83D\uDD27 ${backendName(existingProvider)} at ${backendLocation(existingProvider, backendHost, existingBackendPort)}`);
614
+ return;
424
615
  }
425
616
  if (!existsSync(WEB_SERVER_PATH)) {
426
617
  console.error(`\u274C Web server not found at ${WEB_SERVER_PATH}`);
@@ -429,34 +620,49 @@ async function cmdDefault(options) {
429
620
  }
430
621
  console.log(`Starting OpenPortal...`);
431
622
  console.log(` Name: ${name}`);
623
+ console.log(` Provider: ${provider}`);
432
624
  console.log(` Directory: ${directory}`);
433
625
  console.log(` Web UI Port: ${port}`);
434
- console.log(` OpenCode Port: ${opencodePort}`);
626
+ console.log(` ${provider === "claude" ? "Instance Key" : "Backend Port"}: ${backendPort}`);
435
627
  console.log(` Hostname: ${hostname}`);
436
628
  try {
437
- const opencodePid = await startOpenCodeServer(directory, opencodePort, hostname);
629
+ const backendPid = await startBackendServer(provider, directory, backendPort, hostname);
438
630
  const webPid = await startWebServer(port, hostname);
439
631
  const instance = {
440
632
  id: generateId(),
441
633
  name,
442
634
  directory,
443
635
  port,
444
- opencodePort,
445
- hostname,
446
- opencodePid,
636
+ provider,
637
+ backendPort,
638
+ backendPid,
639
+ opencodePort: backendPort,
640
+ hostname: backendHost,
641
+ opencodePid: provider === "opencode" ? backendPid : null,
447
642
  webPid,
448
- startedAt: new Date().toISOString()
643
+ startedAt: new Date().toISOString(),
644
+ ...provider === "claude" ? {
645
+ claudeBinaryPath: options["claude-binary"],
646
+ claudeHomePath: options["claude-home"],
647
+ claudeLaunchArgs: options["claude-launch-args"] ?? options["claude-args"]
648
+ } : {}
449
649
  };
450
- config.instances.push(instance);
451
- writeConfig(config);
650
+ mutateConfig((config) => {
651
+ config.instances = config.instances.filter((i) => i.directory !== directory || getInstanceProvider(i) !== provider);
652
+ config.instances.push(instance);
653
+ });
452
654
  const displayHost = hostname === "0.0.0.0" ? "localhost" : hostname;
453
655
  console.log(`
454
656
  \u2705 OpenPortal started!`);
455
- console.log(` OpenCode PID: ${opencodePid}`);
657
+ if (backendPid) {
658
+ console.log(` ${providerName(provider)} PID: ${backendPid}`);
659
+ } else {
660
+ console.log(` ${backendName(provider)}: managed by Web UI`);
661
+ }
456
662
  console.log(` Web UI PID: ${webPid}`);
457
663
  console.log(`
458
664
  \uD83D\uDCF1 Access OpenPortal at http://${displayHost}:${port}`);
459
- console.log(`\uD83D\uDD27 OpenCode API at http://${displayHost}:${opencodePort}`);
665
+ console.log(`\uD83D\uDD27 ${backendName(provider)} at ${backendLocation(provider, backendHost, backendPort)}`);
460
666
  } catch (error) {
461
667
  if (error instanceof Error) {
462
668
  console.error(`
@@ -465,86 +671,124 @@ async function cmdDefault(options) {
465
671
  process.exit(1);
466
672
  }
467
673
  }
468
- async function cmdRun(options) {
674
+ async function cmdRun(options, provider = getProviderOption(options)) {
469
675
  const hostname = options.hostname || DEFAULT_HOSTNAME;
470
676
  const directory = resolve(options.directory || options.d || process.cwd());
471
- const name = options.name || directory.split("/").pop() || "opencode";
472
- const opencodePort = options["opencode-port"] ? parseInt(options["opencode-port"], 10) : await getPort({ host: hostname, port: DEFAULT_OPENCODE_PORT });
473
- const config = readConfig();
474
- const existingIndex = config.instances.findIndex((i) => i.directory === directory);
475
- if (existingIndex !== -1) {
476
- const existing = config.instances[existingIndex];
477
- const running = isInstanceRunning(existing);
478
- if (running) {
479
- console.log(`OpenCode is already running for this directory.`);
480
- console.log(` Name: ${existing.name}`);
481
- console.log(` OpenCode Port: ${existing.opencodePort}`);
482
- console.log(`\uD83D\uDD27 OpenCode API at http://${hostname === "0.0.0.0" ? "localhost" : hostname}:${existing.opencodePort}`);
483
- return;
484
- }
485
- config.instances.splice(existingIndex, 1);
677
+ const name = options.name || directory.split("/").pop() || provider;
678
+ const backendHost = provider === "codex" ? DEFAULT_CODEX_HOSTNAME : hostname;
679
+ const backendPort = await getBackendPort(provider, options, backendHost);
680
+ const existing = readConfig().instances.find((i) => i.directory === directory && getInstanceProvider(i) === provider);
681
+ if (existing && isInstanceRunning(existing)) {
682
+ const existingBackendPort = getInstanceBackendPort(existing);
683
+ console.log(`${providerName(provider)} is already running for this directory.`);
684
+ console.log(` Name: ${existing.name}`);
685
+ console.log(` Provider: ${getInstanceProvider(existing)}`);
686
+ console.log(` ${provider === "claude" ? "Instance Key" : "Backend Port"}: ${existingBackendPort}`);
687
+ console.log(`\uD83D\uDD27 ${backendName(provider)} at ${backendLocation(provider, backendHost, existingBackendPort)}`);
688
+ return;
486
689
  }
487
- console.log(`Starting OpenCode server...`);
690
+ console.log(provider === "claude" ? "Registering Claude SDK backend..." : `Starting ${backendName(provider)}...`);
488
691
  console.log(` Name: ${name}`);
692
+ console.log(` Provider: ${provider}`);
489
693
  console.log(` Directory: ${directory}`);
490
- console.log(` OpenCode Port: ${opencodePort}`);
491
- console.log(` Hostname: ${hostname}`);
694
+ console.log(` ${provider === "claude" ? "Instance Key" : "Backend Port"}: ${backendPort}`);
695
+ console.log(` Hostname: ${backendHost}`);
492
696
  try {
493
- const opencodePid = await startOpenCodeServer(directory, opencodePort, hostname);
697
+ if (provider === "claude") {
698
+ const instance2 = {
699
+ id: generateId(),
700
+ name,
701
+ directory,
702
+ port: null,
703
+ provider,
704
+ backendPort,
705
+ backendPid: process.pid,
706
+ opencodePort: backendPort,
707
+ hostname: backendHost,
708
+ opencodePid: null,
709
+ webPid: null,
710
+ startedAt: new Date().toISOString(),
711
+ claudeBinaryPath: options["claude-binary"],
712
+ claudeHomePath: options["claude-home"],
713
+ claudeLaunchArgs: options["claude-launch-args"] ?? options["claude-args"]
714
+ };
715
+ mutateConfig((config) => {
716
+ config.instances = config.instances.filter((i) => i.directory !== directory || getInstanceProvider(i) !== provider);
717
+ config.instances.push(instance2);
718
+ });
719
+ console.log(`
720
+ \u2705 Claude SDK backend registered!`);
721
+ console.log(` Claude holder PID: ${process.pid}`);
722
+ console.log(`\uD83D\uDD27 ${backendName(provider)} at ${backendLocation(provider, backendHost, backendPort)}`);
723
+ await waitForClaudeRegistration(instance2);
724
+ return;
725
+ }
726
+ const backendPid = await startBackendServer(provider, directory, backendPort, hostname);
494
727
  const instance = {
495
728
  id: generateId(),
496
729
  name,
497
730
  directory,
498
731
  port: null,
499
- opencodePort,
500
- hostname,
501
- opencodePid,
732
+ provider,
733
+ backendPort,
734
+ backendPid,
735
+ opencodePort: backendPort,
736
+ hostname: backendHost,
737
+ opencodePid: provider === "opencode" ? backendPid : null,
502
738
  webPid: null,
503
739
  startedAt: new Date().toISOString()
504
740
  };
505
- config.instances.push(instance);
506
- writeConfig(config);
507
- const displayHost = hostname === "0.0.0.0" ? "localhost" : hostname;
741
+ mutateConfig((config) => {
742
+ config.instances = config.instances.filter((i) => i.directory !== directory || getInstanceProvider(i) !== provider);
743
+ config.instances.push(instance);
744
+ });
508
745
  console.log(`
509
- \u2705 OpenCode server started!`);
510
- console.log(` OpenCode PID: ${opencodePid}`);
511
- console.log(`\uD83D\uDD27 OpenCode API at http://${displayHost}:${opencodePort}`);
746
+ \u2705 ${backendName(provider)} started!`);
747
+ if (backendPid) {
748
+ console.log(` ${providerName(provider)} PID: ${backendPid}`);
749
+ }
750
+ console.log(`\uD83D\uDD27 ${backendName(provider)} at ${backendLocation(provider, backendHost, backendPort)}`);
512
751
  } catch (error) {
513
752
  if (error instanceof Error) {
514
753
  console.error(`
515
- \u274C Failed to start OpenCode: ${error.message}`);
754
+ \u274C Failed to start ${providerName(provider)}: ${error.message}`);
516
755
  }
517
756
  process.exit(1);
518
757
  }
519
758
  }
520
759
  async function cmdStop(options) {
521
- const config = readConfig();
522
760
  const directory = options.directory || options.d ? resolve(options.directory || options.d) : process.cwd();
523
- const instance = options.name ? config.instances.find((i) => i.name === options.name) : config.instances.find((i) => i.directory === directory);
524
- if (!instance) {
761
+ const removed = mutateConfig((config) => {
762
+ const instance = options.name ? config.instances.find((i) => i.name === options.name) : config.instances.find((i) => i.directory === directory);
763
+ if (!instance)
764
+ return null;
765
+ config.instances = config.instances.filter((i) => i.id !== instance.id);
766
+ return instance;
767
+ });
768
+ if (!removed) {
525
769
  console.error("No instance found.");
526
770
  process.exit(1);
527
771
  }
528
- if (instance.opencodePid !== null) {
772
+ const provider = getInstanceProvider(removed);
773
+ const backendPid = getInstanceBackendPid(removed);
774
+ if (backendPid !== null) {
529
775
  try {
530
- process.kill(instance.opencodePid, "SIGTERM");
531
- console.log(`Stopped OpenCode (PID: ${instance.opencodePid})`);
776
+ process.kill(backendPid, "SIGTERM");
777
+ console.log(`Stopped ${providerName(provider)} (PID: ${backendPid})`);
532
778
  } catch {
533
- console.log("OpenCode was already stopped.");
779
+ console.log(`${providerName(provider)} was already stopped.`);
534
780
  }
535
781
  }
536
- if (instance.webPid !== null) {
782
+ if (removed.webPid !== null) {
537
783
  try {
538
- process.kill(instance.webPid, "SIGTERM");
539
- console.log(`Stopped Web UI (PID: ${instance.webPid})`);
784
+ process.kill(removed.webPid, "SIGTERM");
785
+ console.log(`Stopped Web UI (PID: ${removed.webPid})`);
540
786
  } catch {
541
787
  console.log("Web UI was already stopped.");
542
788
  }
543
789
  }
544
- config.instances = config.instances.filter((i) => i.id !== instance.id);
545
- writeConfig(config);
546
790
  console.log(`
547
- Stopped: ${instance.name}`);
791
+ Stopped: ${removed.name}`);
548
792
  }
549
793
  async function cmdList() {
550
794
  const config = readConfig();
@@ -555,45 +799,56 @@ async function cmdList() {
555
799
  console.log(`
556
800
  OpenPortal Instances:
557
801
  `);
558
- console.log("ID\t\tNAME\t\t\tPORT\tOPENCODE\tSTATUS\t\tDIRECTORY");
802
+ console.log("ID\t\tNAME\t\t\tPROVIDER\tPORT\tBACKEND\tSTATUS\t\tDIRECTORY");
559
803
  console.log("-".repeat(110));
560
- const validInstances = [];
804
+ const liveIds = new Set;
561
805
  for (const instance of config.instances) {
562
- const opencodeRunning = isProcessRunning(instance.opencodePid);
806
+ const provider = getInstanceProvider(instance);
807
+ const backendRunning = isProcessRunning(getInstanceBackendPid(instance));
563
808
  const webRunning = isProcessRunning(instance.webPid);
564
809
  let status = "stopped";
565
- if (opencodeRunning && webRunning)
810
+ if (provider === "claude") {
811
+ if (webRunning)
812
+ status = "running";
813
+ else if (backendRunning)
814
+ status = "registered";
815
+ } else if (backendRunning && webRunning)
566
816
  status = "running";
567
- else if (opencodeRunning)
568
- status = "opencode";
817
+ else if (backendRunning)
818
+ status = provider;
569
819
  else if (webRunning)
570
820
  status = "web only";
571
- if (opencodeRunning || webRunning) {
572
- validInstances.push(instance);
821
+ if (backendRunning || webRunning) {
822
+ liveIds.add(instance.id);
573
823
  }
574
824
  const portDisplay = instance.port ?? "-";
575
- console.log(`${instance.id} ${instance.name.padEnd(16)} ${String(portDisplay).padEnd(4)} ${instance.opencodePort} ${status.padEnd(12)} ${instance.directory}`);
825
+ console.log(`${instance.id} ${instance.name.padEnd(16)} ${provider.padEnd(8)} ${String(portDisplay).padEnd(4)} ${getInstanceBackendPort(instance)} ${status.padEnd(12)} ${instance.directory}`);
576
826
  }
577
- if (validInstances.length !== config.instances.length) {
578
- config.instances = validInstances;
579
- writeConfig(config);
827
+ if (liveIds.size !== config.instances.length) {
828
+ mutateConfig((latest) => {
829
+ latest.instances = latest.instances.filter((i) => liveIds.has(i.id) || isInstanceRunning(i));
830
+ });
580
831
  }
581
832
  }
582
833
  async function cmdClean() {
583
- const config = readConfig();
584
- const validInstances = [];
585
- for (const instance of config.instances) {
586
- const running = isInstanceRunning(instance);
587
- if (running || isProcessRunning(instance.webPid)) {
588
- validInstances.push(instance);
589
- } else {
590
- console.log(`Removed stale entry: ${instance.name}`);
834
+ const result = mutateConfig((config) => {
835
+ const valid = [];
836
+ const removed = [];
837
+ for (const instance of config.instances) {
838
+ if (isInstanceRunning(instance)) {
839
+ valid.push(instance);
840
+ } else {
841
+ removed.push(instance.name);
842
+ }
591
843
  }
844
+ config.instances = valid;
845
+ return { valid, removed };
846
+ });
847
+ for (const name of result.removed) {
848
+ console.log(`Removed stale entry: ${name}`);
592
849
  }
593
- config.instances = validInstances;
594
- writeConfig(config);
595
850
  console.log(`
596
- Config cleaned. ${validInstances.length} active instance(s).`);
851
+ Config cleaned. ${result.valid.length} active instance(s).`);
597
852
  }
598
853
  async function main() {
599
854
  const { args, flags } = parseArgs();
@@ -602,17 +857,27 @@ async function main() {
602
857
  return;
603
858
  }
604
859
  const command = args[0]?.toLowerCase();
605
- if (!command || command === "." || command.startsWith("/") || command.startsWith("./")) {
860
+ const commandProvider = parseProvider(command);
861
+ if (!command || command === "." || command.startsWith("/") || command.startsWith("./") || commandProvider) {
606
862
  if (command && command !== ".") {
607
- flags.directory = command;
863
+ if (commandProvider) {
864
+ flags.provider = commandProvider;
865
+ } else {
866
+ flags.directory = command;
867
+ }
608
868
  }
609
869
  await cmdDefault(flags);
610
870
  return;
611
871
  }
612
872
  switch (command) {
613
- case "run":
614
- await cmdRun(flags);
873
+ case "run": {
874
+ const provider = parseProvider(args[1]) ?? getProviderOption(flags);
875
+ if (args[1] && !parseProvider(args[1])) {
876
+ flags.directory = args[1];
877
+ }
878
+ await cmdRun(flags, provider);
615
879
  break;
880
+ }
616
881
  case "stop":
617
882
  await cmdStop(flags);
618
883
  break;