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.
- package/dist/index.js +369 -104
- package/package.json +5 -5
- package/web/nitro.json +3 -3
- package/web/public/assets/Input-CabuNR46.js +1 -0
- package/web/public/assets/_app-BuWZVanD.js +41 -0
- package/web/public/assets/_app-C7teCofH.js +1 -0
- package/web/public/assets/_id-qj9enZSf.js +37 -0
- package/web/public/assets/about-B4D-YQvu.js +1 -0
- package/web/public/assets/angular-html-CyxhxxC6.js +1 -0
- package/web/public/assets/angular-ts-DKwzvk_A.js +1 -0
- package/web/public/assets/{apl-DB8yy-Bd.js → apl-D9JhLyA8.js} +1 -1
- package/web/public/assets/{astro-4VtdQ-aO.js → astro-D35iUAk4.js} +1 -1
- package/web/public/assets/{blade-CedhYCgA.js → blade-CQ_yb9AJ.js} +1 -1
- package/web/public/assets/breadcrumb-context-BSiNOVxE.js +1 -0
- package/web/public/assets/{bsl-BQ-5RGbs.js → bsl-BDVOE52A.js} +1 -1
- package/web/public/assets/button-CoQU6poF.js +7 -0
- package/web/public/assets/c-DP4PuxsC.js +1 -0
- package/web/public/assets/{cairo-RAtbTRH-.js → cairo-BDZ6TRZS.js} +1 -1
- package/web/public/assets/{cobol-BW4nVR_8.js → cobol-Cj7rLdF4.js} +1 -1
- package/web/public/assets/{coffee-CxscSGMn.js → coffee-BEqQ7khn.js} +1 -1
- package/web/public/assets/cpp-K58e7MPy.js +1 -0
- package/web/public/assets/{crystal-p1F2qTK3.js → crystal-WvacFQuU.js} +1 -1
- package/web/public/assets/css-D8-m18hd.js +1 -0
- package/web/public/assets/diff-Bggc2a-A.js +227 -0
- package/web/public/assets/{edge-nNdVK-5H.js → edge-C2YjZt3E.js} +1 -1
- package/web/public/assets/{elixir-BWAg5rOr.js → elixir-DGL2pFx1.js} +1 -1
- package/web/public/assets/{elm-Fmq6niEZ.js → elm-CrPEbkYU.js} +1 -1
- package/web/public/assets/{erb-Cj-oBkqz.js → erb-Pjl6MxSx.js} +1 -1
- package/web/public/assets/{erlang-Dlo360hX.js → erlang-cuhwpmsu.js} +1 -1
- package/web/public/assets/field-BD1fYKgU.js +1 -0
- package/web/public/assets/{fortran-fixed-form-BNWSYlx7.js → fortran-fixed-form-CS9qOEPh.js} +1 -1
- package/web/public/assets/{fsharp-BvlCOZl9.js → fsharp-CQ5iYSPA.js} +1 -1
- package/web/public/assets/{gdresource-D_lHHmUz.js → gdresource-BAudk4qB.js} +1 -1
- package/web/public/assets/{git-commit-Bzl1bEH3.js → git-commit-6e79eN7Q.js} +1 -1
- package/web/public/assets/{git-rebase-CfPSMPpK.js → git-rebase-0YNSjhVf.js} +1 -1
- package/web/public/assets/{glimmer-js-C8F_h5kh.js → glimmer-js-BWHy9y50.js} +1 -1
- package/web/public/assets/{glimmer-ts-BVvqGv4s.js → glimmer-ts-DX8iZiOc.js} +1 -1
- package/web/public/assets/glsl-COW3sf6s.js +1 -0
- package/web/public/assets/graphql-Dd2Tpr9E.js +1 -0
- package/web/public/assets/{hack-BGs3bAjg.js → hack-DAJwWGZ4.js} +1 -1
- package/web/public/assets/haml-t0kHqiMk.js +1 -0
- package/web/public/assets/{handlebars-Di4bVtub.js → handlebars-qamPNlYY.js} +1 -1
- package/web/public/assets/html-D_X3PCw-.js +1 -0
- package/web/public/assets/html-derivative-CkXhljkj.js +1 -0
- package/web/public/assets/{http-VI9HDs0H.js → http-Cy1i-1jR.js} +1 -1
- package/web/public/assets/{hurl-Biy0pToc.js → hurl-BtIML1gH.js} +1 -1
- package/web/public/assets/{hxml-LeIITq3U.js → hxml-BlbkePaW.js} +1 -1
- package/web/public/assets/index-2xA55Y4b.css +2 -0
- package/web/public/assets/index-DxX6GAcL.js +10 -0
- package/web/public/assets/input-BmSt5bV_.js +1 -0
- package/web/public/assets/instances-BrhvsiT6.js +1 -0
- package/web/public/assets/java-DWvpLZQg.js +1 -0
- package/web/public/assets/javascript-rQslrTlU.js +1 -0
- package/web/public/assets/{jinja-ChSNS6Tw.js → jinja-C5RLRSh5.js} +1 -1
- package/web/public/assets/{jison-DgzqD4_V.js → jison-CEtCKWto.js} +1 -1
- package/web/public/assets/json-BtCTWCCg.js +1 -0
- package/web/public/assets/jsx-CC-anpHJ.js +1 -0
- package/web/public/assets/jsx-runtime-BE_tW6Ee.js +1 -0
- package/web/public/assets/{julia-BoDGmjvF.js → julia-DYZnQ9C_.js} +1 -1
- package/web/public/assets/{latex-ATBiwIsF.js → latex-DmbAavtk.js} +1 -1
- package/web/public/assets/lib-hFmyZdda.js +1 -0
- package/web/public/assets/link-e2hDme49.js +1 -0
- package/web/public/assets/{liquid-ZOI8eZQ-.js → liquid-DRMm6-P7.js} +1 -1
- package/web/public/assets/lua-D5x9Ej0C.js +1 -0
- package/web/public/assets/lucide-oITxMZUb.js +1 -0
- package/web/public/assets/{marko-DKJu0e8n.js → marko-BRjURZmp.js} +1 -1
- package/web/public/assets/{mdc-CVf5s5cG.js → mdc-BORe-lTd.js} +1 -1
- package/web/public/assets/{nginx-ts6STlG_.js → nginx--G2djEeU.js} +1 -1
- package/web/public/assets/{nim-CQJu0uif.js → nim-Bg97nylc.js} +1 -1
- package/web/public/assets/parsePatchFiles-D3jLD0yV.js +4 -0
- package/web/public/assets/{perl-VAbochW_.js → perl-BObf9N37.js} +1 -1
- package/web/public/assets/{php-YioiNFhr.js → php-inqyeXtA.js} +1 -1
- package/web/public/assets/pierre-dark-pqLturbW.js +1 -0
- package/web/public/assets/pierre-light-xEQF8aEA.js +1 -0
- package/web/public/assets/popover-D7DqQzYd.js +5 -0
- package/web/public/assets/{pug-B-40Haq6.js → pug-CyUw5FPt.js} +1 -1
- package/web/public/assets/{qml-kOoNwPEG.js → qml-IWAIEnkZ.js} +1 -1
- package/web/public/assets/r-B7wiE8s0.js +1 -0
- package/web/public/assets/{razor-OH0A0iCi.js → razor-DHWbGfqh.js} +1 -1
- package/web/public/assets/regexp-B5tDXh-D.js +1 -0
- package/web/public/assets/{rst-D2m0MWQG.js → rst-BOV1Iu5T.js} +1 -1
- package/web/public/assets/{ruby-Cd39ka5u.js → ruby-MEoEfPKM.js} +1 -1
- package/web/public/assets/{sas-BHFIMNhs.js → sas-Dxq9CzH7.js} +1 -1
- package/web/public/assets/scss-BMjNhvSM.js +1 -0
- package/web/public/assets/settings-BtPmV_Mc.js +1 -0
- package/web/public/assets/{shaderlab-BmcIVS6O.js → shaderlab-BiweuU0M.js} +1 -1
- package/web/public/assets/shellscript-P32R2bme.js +1 -0
- package/web/public/assets/{shellsession-BJ4t2Sdy.js → shellsession-BlrJ09y9.js} +1 -1
- package/web/public/assets/{soy-Bkj3NqFU.js → soy-BpQ0SMiq.js} +1 -1
- package/web/public/assets/{sparql-DxWpmA6s.js → sparql-J1VOnnwM.js} +1 -1
- package/web/public/assets/sql-DBpDxsUe.js +1 -0
- package/web/public/assets/{stata-BuG51IuX.js → stata-DC5z9YAe.js} +1 -1
- package/web/public/assets/{svelte-rvdUCFAj.js → svelte-CF6QDu1s.js} +1 -1
- package/web/public/assets/{templ-DVzhxzQC.js → templ-tkdPKNAc.js} +1 -1
- package/web/public/assets/{tex-BW37SRRB.js → tex-Bt2c8D58.js} +1 -1
- package/web/public/assets/{ts-tags-q0oyNnV3.js → ts-tags-B6ZGEqrj.js} +1 -1
- package/web/public/assets/tsx-DsDbze4C.js +1 -0
- package/web/public/assets/{twig--kFkuY0Y.js → twig-DRzX5__m.js} +1 -1
- package/web/public/assets/typescript-y69KCpjV.js +1 -0
- package/web/public/assets/use-media-query-DDfzZruf.js +1 -0
- package/web/public/assets/use-opencode-C9VP1bV0.js +1 -0
- package/web/public/assets/use-session-messages-Cd5WPqmc.js +4 -0
- package/web/public/assets/useNavigate-CwkeBifN.js +1 -0
- package/web/public/assets/useTextField-4MIBK5lD.js +1 -0
- package/web/public/assets/{vue-DPxVclZQ.js → vue-C1vQecwS.js} +1 -1
- package/web/public/assets/{vue-html-BMtZ_0Xw.js → vue-html-BrJuM9_k.js} +1 -1
- package/web/public/assets/{vue-vine-aF57X0uv.js → vue-vine-eoaT5X-O.js} +1 -1
- package/web/public/assets/xml-CK_MCESO.js +1 -0
- package/web/public/assets/{xsl-CQtLMMI3.js → xsl-CGwehH9h.js} +1 -1
- package/web/public/assets/yaml-okado1J8.js +1 -0
- package/web/public/logo.svg +61 -132
- package/web/server/_chunks/error-message.mjs +32 -0
- package/web/server/_chunks/renderer-template.mjs +6 -2
- package/web/server/_libs/@grpc/grpc-js+[...].mjs +23961 -0
- package/web/server/_libs/anthropic-ai__claude-agent-sdk.mjs +27103 -0
- package/web/server/_libs/balena__dockerignore.mjs +203 -0
- package/web/server/_libs/bl+[...].mjs +2416 -0
- package/web/server/_libs/chownr.mjs +108 -0
- package/web/server/_libs/debug+[...].mjs +813 -0
- package/web/server/_libs/docker-modem+split-ca.mjs +548 -0
- package/web/server/_libs/dockerode+[...].mjs +5258 -0
- package/web/server/_libs/grpc__proto-loader.mjs +291 -0
- package/web/server/_libs/h3+rou3+srvx.mjs +861 -0
- package/web/server/_libs/hookable.mjs +41 -0
- package/web/server/_libs/opencode-ai__sdk.mjs +4536 -0
- package/web/server/_libs/ufo.mjs +64 -0
- package/web/server/_libs/unctx.mjs +82 -0
- package/web/server/_libs/zod.mjs +3988 -0
- package/web/server/_routes/api/claude/[port]/agents.mjs +10 -0
- package/web/server/_routes/api/claude/[port]/config.mjs +9 -0
- package/web/server/_routes/api/claude/[port]/events.mjs +30 -0
- package/web/server/_routes/api/claude/[port]/files/search.mjs +11 -0
- package/web/server/_routes/api/claude/[port]/git/diff.mjs +9 -0
- package/web/server/_routes/api/claude/[port]/health.mjs +9 -0
- package/web/server/_routes/api/claude/[port]/permission/[requestId]/reply.mjs +22 -0
- package/web/server/_routes/api/claude/[port]/permissions.mjs +9 -0
- package/web/server/_routes/api/claude/[port]/project/current.mjs +9 -0
- package/web/server/_routes/api/claude/[port]/providers.mjs +9 -0
- package/web/server/_routes/api/claude/[port]/question/[requestId]/reject.mjs +12 -0
- package/web/server/_routes/api/claude/[port]/question/[requestId]/reply.mjs +15 -0
- package/web/server/_routes/api/claude/[port]/questions.mjs +9 -0
- package/web/server/_routes/api/claude/[port]/session/[id]/abort.mjs +15 -0
- package/web/server/_routes/api/claude/[port]/session/[id]/messages.mjs +11 -0
- package/web/server/_routes/api/claude/[port]/session/[id]/prompt.mjs +55 -0
- package/web/server/_routes/api/claude/[port]/session/[id].mjs +11 -0
- package/web/server/_routes/api/claude/[port]/session/[id]2.mjs +11 -0
- package/web/server/_routes/api/claude/[port]/session/create.mjs +16 -0
- package/web/server/_routes/api/claude/[port]/session/status.mjs +9 -0
- package/web/server/_routes/api/claude/[port]/sessions.mjs +9 -0
- package/web/server/_routes/api/codex/[port]/agents.mjs +10 -0
- package/web/server/_routes/api/codex/[port]/config.mjs +9 -0
- package/web/server/_routes/api/codex/[port]/events.mjs +30 -0
- package/web/server/_routes/api/codex/[port]/files/search.mjs +19 -0
- package/web/server/_routes/api/codex/[port]/git/diff.mjs +26 -0
- package/web/server/_routes/api/codex/[port]/health.mjs +13 -0
- package/web/server/_routes/api/codex/[port]/permission/[requestId]/reply.mjs +22 -0
- package/web/server/_routes/api/codex/[port]/permissions.mjs +9 -0
- package/web/server/_routes/api/codex/[port]/project/current.mjs +9 -0
- package/web/server/_routes/api/codex/[port]/providers.mjs +30 -0
- package/web/server/_routes/api/codex/[port]/question/[requestId]/reject.mjs +12 -0
- package/web/server/_routes/api/codex/[port]/question/[requestId]/reply.mjs +15 -0
- package/web/server/_routes/api/codex/[port]/questions.mjs +9 -0
- package/web/server/_routes/api/codex/[port]/session/[id]/abort.mjs +28 -0
- package/web/server/_routes/api/codex/[port]/session/[id]/messages.mjs +22 -0
- package/web/server/_routes/api/codex/[port]/session/[id]/prompt.mjs +80 -0
- package/web/server/_routes/api/codex/[port]/session/[id].mjs +12 -0
- package/web/server/_routes/api/codex/[port]/session/[id]2.mjs +14 -0
- package/web/server/_routes/api/codex/[port]/session/create.mjs +24 -0
- package/web/server/_routes/api/codex/[port]/session/status.mjs +16 -0
- package/web/server/_routes/api/codex/[port]/sessions.mjs +12 -0
- package/web/server/_routes/api/hello.mjs +3 -1
- package/web/server/_routes/api/instances.mjs +357 -14
- package/web/server/_routes/api/lib/claude_client.mjs +875 -0
- package/web/server/_routes/api/lib/codex_client.mjs +687 -0
- package/web/server/_routes/api/lib/docker.mjs +7 -27272
- package/web/server/_routes/api/lib/opencode_client.mjs +16 -4504
- package/web/server/_routes/api/lib/process_cwd.mjs +91 -0
- package/web/server/_routes/api/lib/validation.mjs +5 -3613
- package/web/server/_routes/api/opencode/[port]/agents.mjs +4 -2
- package/web/server/_routes/api/opencode/[port]/config.mjs +4 -2
- package/web/server/_routes/api/opencode/[port]/events.mjs +46 -0
- package/web/server/_routes/api/opencode/[port]/files/search.mjs +5 -3
- package/web/server/_routes/api/opencode/[port]/git/diff.mjs +4 -2
- package/web/server/_routes/api/opencode/[port]/health.mjs +4 -2
- package/web/server/_routes/api/opencode/[port]/permission/[requestId]/reply.mjs +7 -4
- package/web/server/_routes/api/opencode/[port]/permissions.mjs +5 -3
- package/web/server/_routes/api/opencode/[port]/project/current.mjs +4 -2
- package/web/server/_routes/api/opencode/[port]/providers.mjs +4 -2
- package/web/server/_routes/api/opencode/[port]/question/[requestId]/reject.mjs +5 -3
- package/web/server/_routes/api/opencode/[port]/question/[requestId]/reply.mjs +7 -4
- package/web/server/_routes/api/opencode/[port]/questions.mjs +5 -3
- package/web/server/_routes/api/opencode/[port]/session/[id]/abort.mjs +5 -3
- package/web/server/_routes/api/opencode/[port]/session/[id]/messages.mjs +5 -3
- package/web/server/_routes/api/opencode/[port]/session/[id]/prompt.mjs +51 -20
- package/web/server/_routes/api/opencode/[port]/session/[id].mjs +5 -3
- package/web/server/_routes/api/opencode/[port]/session/[id]2.mjs +5 -3
- package/web/server/_routes/api/opencode/[port]/session/create.mjs +7 -4
- package/web/server/_routes/api/opencode/[port]/session/status.mjs +9 -0
- package/web/server/_routes/api/opencode/[port]/sessions.mjs +4 -2
- package/web/server/_routes/api/system/hostname.mjs +3 -1
- package/web/server/_runtime.mjs +37 -0
- package/web/server/index.mjs +1892 -2380
- package/web/server/node_modules/nan/.github/workflows/ci.yml +52 -0
- package/web/server/node_modules/nan/.pre-commit-config.yaml +8 -0
- package/web/server/node_modules/nan/CHANGELOG.md +587 -0
- package/web/server/node_modules/nan/CMakeLists.txt +138 -0
- package/web/server/node_modules/nan/LICENSE.md +9 -0
- package/web/server/node_modules/nan/README.md +456 -0
- package/web/server/node_modules/nan/doc/asyncworker.md +146 -0
- package/web/server/node_modules/nan/doc/buffers.md +54 -0
- package/web/server/node_modules/nan/doc/callback.md +76 -0
- package/web/server/node_modules/nan/doc/converters.md +41 -0
- package/web/server/node_modules/nan/doc/errors.md +226 -0
- package/web/server/node_modules/nan/doc/json.md +62 -0
- package/web/server/node_modules/nan/doc/maybe_types.md +583 -0
- package/web/server/node_modules/nan/doc/methods.md +672 -0
- package/web/server/node_modules/nan/doc/new.md +147 -0
- package/web/server/node_modules/nan/doc/node_misc.md +123 -0
- package/web/server/node_modules/nan/doc/object_wrappers.md +263 -0
- package/web/server/node_modules/nan/doc/persistent.md +296 -0
- package/web/server/node_modules/nan/doc/scopes.md +73 -0
- package/web/server/node_modules/nan/doc/script.md +58 -0
- package/web/server/node_modules/nan/doc/string_bytes.md +81 -0
- package/web/server/node_modules/nan/doc/v8_internals.md +199 -0
- package/web/server/node_modules/nan/doc/v8_misc.md +85 -0
- package/web/server/node_modules/nan/include_dirs.js +1 -0
- package/web/server/node_modules/nan/nan.h +3096 -0
- package/web/server/node_modules/nan/nan_callbacks.h +141 -0
- package/web/server/node_modules/nan/nan_callbacks_12_inl.h +690 -0
- package/web/server/node_modules/nan/nan_callbacks_pre_12_inl.h +524 -0
- package/web/server/node_modules/nan/nan_converters.h +72 -0
- package/web/server/node_modules/nan/nan_converters_43_inl.h +68 -0
- package/web/server/node_modules/nan/nan_converters_pre_43_inl.h +42 -0
- package/web/server/node_modules/nan/nan_define_own_property_helper.h +29 -0
- package/web/server/node_modules/nan/nan_implementation_12_inl.h +430 -0
- package/web/server/node_modules/nan/nan_implementation_pre_12_inl.h +263 -0
- package/web/server/node_modules/nan/nan_json.h +166 -0
- package/web/server/node_modules/nan/nan_maybe_43_inl.h +360 -0
- package/web/server/node_modules/nan/nan_maybe_pre_43_inl.h +268 -0
- package/web/server/node_modules/nan/nan_new.h +340 -0
- package/web/server/node_modules/nan/nan_object_wrap.h +156 -0
- package/web/server/node_modules/nan/nan_persistent_12_inl.h +132 -0
- package/web/server/node_modules/nan/nan_persistent_pre_12_inl.h +242 -0
- package/web/server/node_modules/nan/nan_private.h +73 -0
- package/web/server/node_modules/nan/nan_scriptorigin.h +97 -0
- package/web/server/node_modules/nan/nan_string_bytes.h +305 -0
- package/web/server/node_modules/nan/nan_typedarray_contents.h +96 -0
- package/web/server/node_modules/nan/nan_weak.h +437 -0
- package/web/server/node_modules/nan/package.json +38 -0
- package/web/server/node_modules/nan/tools/1to2.js +412 -0
- package/web/server/node_modules/nan/tools/README.md +14 -0
- package/web/server/node_modules/nan/tools/package.json +19 -0
- package/web/server/package.json +1 -0
- package/web/public/assets/_app-BP3u2dm1.js +0 -1
- package/web/public/assets/_app-oJ3Lrn6N.js +0 -41
- package/web/public/assets/_id-Dx4XC9aR.js +0 -37
- package/web/public/assets/about-ttI-qJiN.js +0 -1
- package/web/public/assets/angular-html-B7AzbcLu.js +0 -1
- package/web/public/assets/angular-html-CWHM6XK4.js +0 -1
- package/web/public/assets/angular-ts-jRfZdOvj.js +0 -1
- package/web/public/assets/breadcrumb-context-DWkmxEQX.js +0 -1
- package/web/public/assets/c-BYyBRgEf.js +0 -1
- package/web/public/assets/c-rDRZoEwT.js +0 -1
- package/web/public/assets/cpp-BKPlHVN1.js +0 -1
- package/web/public/assets/cpp-DNNfSORd.js +0 -1
- package/web/public/assets/css-C_016fQU.js +0 -1
- package/web/public/assets/css-D3AwVSc2.js +0 -1
- package/web/public/assets/diff-D9_v9i9f.js +0 -1261
- package/web/public/assets/field-Cw2QJqyI.js +0 -1
- package/web/public/assets/glsl-CCt8Xq74.js +0 -1
- package/web/public/assets/glsl-mjl6J7xQ.js +0 -1
- package/web/public/assets/graphql-D1AnvbII.js +0 -1
- package/web/public/assets/graphql-DcY1hApn.js +0 -1
- package/web/public/assets/haml-B_PDjSS6.js +0 -1
- package/web/public/assets/haml-phUSYqbS.js +0 -1
- package/web/public/assets/html-DELXQlGO.js +0 -1
- package/web/public/assets/html-DiubA6TF.js +0 -1
- package/web/public/assets/html-derivative-BT-nCKmo.js +0 -1
- package/web/public/assets/html-derivative-Dh3FrOEV.js +0 -1
- package/web/public/assets/index-60mxcexA.css +0 -2
- package/web/public/assets/index-C3_uDbNm.js +0 -20
- package/web/public/assets/input-nwkok9tX.js +0 -1
- package/web/public/assets/instances-DrNzb2th.js +0 -1
- package/web/public/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
- package/web/public/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
- package/web/public/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
- package/web/public/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
- package/web/public/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
- package/web/public/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
- package/web/public/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
- package/web/public/assets/java-BF4HWAb8.js +0 -1
- package/web/public/assets/java-C8Q66F3q.js +0 -1
- package/web/public/assets/javascript-0KITOXoO.js +0 -1
- package/web/public/assets/javascript-QwaHzY8K.js +0 -1
- package/web/public/assets/json-DtIt9qZE.js +0 -1
- package/web/public/assets/json-Jxsv7nl6.js +0 -1
- package/web/public/assets/jsx-0dhG_2WJ.js +0 -1
- package/web/public/assets/jsx-CN3KuEC1.js +0 -1
- package/web/public/assets/lib-7Fkkv145.js +0 -1
- package/web/public/assets/link-DmT_NfGE.js +0 -1
- package/web/public/assets/lua-CaSSwCd3.js +0 -1
- package/web/public/assets/lua-DLhBNWry.js +0 -1
- package/web/public/assets/model-store-NhJgW8wq.js +0 -1
- package/web/public/assets/parsePatchFiles-B433dV5r.js +0 -2
- package/web/public/assets/pierre-dark-Dkue_Ycs.js +0 -1
- package/web/public/assets/pierre-light-BSpDZVY4.js +0 -1
- package/web/public/assets/r-BjiStVkJ.js +0 -1
- package/web/public/assets/r-rdDIhDK8.js +0 -1
- package/web/public/assets/regexp-BbCrcKjn.js +0 -1
- package/web/public/assets/regexp-Y5ti0BKu.js +0 -1
- package/web/public/assets/scss-DrMMzxFY.js +0 -1
- package/web/public/assets/scss-a6SFBKT5.js +0 -1
- package/web/public/assets/settings-RvjCqP-Z.js +0 -1
- package/web/public/assets/shellscript-DzFbcKnv.js +0 -1
- package/web/public/assets/shellscript-yo20ha4w.js +0 -1
- package/web/public/assets/sql-BwmtsbRY.js +0 -1
- package/web/public/assets/sql-Cigyp1SO.js +0 -1
- package/web/public/assets/tsx-CUSFgtHy.js +0 -1
- package/web/public/assets/tsx-DgIHkbwf.js +0 -1
- package/web/public/assets/typescript-15oSVc7C.js +0 -1
- package/web/public/assets/typescript-aRFFLtTZ.js +0 -1
- package/web/public/assets/use-media-query-BIqDs21v.js +0 -1
- package/web/public/assets/useHasTabbableChild-DxWNQ_JF.js +0 -1
- package/web/public/assets/xml-BwthnBQz.js +0 -1
- package/web/public/assets/xml-miX9dRbM.js +0 -1
- package/web/public/assets/yaml-DkAPUzRH.js +0 -1
- package/web/public/assets/yaml-s6kFNfpY.js +0 -1
- /package/web/public/assets/{abap-D-EGwWJY.js → abap-BYgfS2J7.js} +0 -0
- /package/web/public/assets/{actionscript-3-BgEzobaq.js → actionscript-3-CWRCR4iE.js} +0 -0
- /package/web/public/assets/{ada-CK_QIbnr.js → ada-C49PBMn9.js} +0 -0
- /package/web/public/assets/{andromeeda-7Uyrbc3l.js → andromeeda-BBhAo6p7.js} +0 -0
- /package/web/public/assets/{apache-Dh3lWCDO.js → apache-BIH3t0yU.js} +0 -0
- /package/web/public/assets/{apex-Diyrmqfh.js → apex-ChBAwGH0.js} +0 -0
- /package/web/public/assets/{applescript-CGbSGD4R.js → applescript-F6IQpFHw.js} +0 -0
- /package/web/public/assets/{ara-BKT6no2T.js → ara-C7jg9iGE.js} +0 -0
- /package/web/public/assets/{asciidoc-BmRKQHbQ.js → asciidoc-BNeev37S.js} +0 -0
- /package/web/public/assets/{asm-Cqt8SHGO.js → asm-C_FYSSlO.js} +0 -0
- /package/web/public/assets/{aurora-x-CK7ktht2.js → aurora-x-BrXKjfbm.js} +0 -0
- /package/web/public/assets/{awk-B3FFpX_J.js → awk-Dhzptovp.js} +0 -0
- /package/web/public/assets/{ayu-dark-xJfjuCq8.js → ayu-dark-Bc6YaM0t.js} +0 -0
- /package/web/public/assets/{ballerina-DACRT-sT.js → ballerina-BMtRaYfJ.js} +0 -0
- /package/web/public/assets/{bat-DU4--CMj.js → bat-C-_iWjni.js} +0 -0
- /package/web/public/assets/{beancount-DvXvE1x-.js → beancount-SMCafKaA.js} +0 -0
- /package/web/public/assets/{berry-DCFF4Zj1.js → berry-B1oQ9RhK.js} +0 -0
- /package/web/public/assets/{bibtex-42-C5dln.js → bibtex-BH2gsObK.js} +0 -0
- /package/web/public/assets/{bicep-Dqm4PFuz.js → bicep-CzfNgsCD.js} +0 -0
- /package/web/public/assets/{cadence-C7hktLdb.js → cadence-BPDgYNWy.js} +0 -0
- /package/web/public/assets/{catppuccin-frappe-BFZAZJr3.js → catppuccin-frappe-D5TUFPbv.js} +0 -0
- /package/web/public/assets/{catppuccin-latte-2OpvPHma.js → catppuccin-latte-wUX3NN1_.js} +0 -0
- /package/web/public/assets/{catppuccin-macchiato-DOwBDSZG.js → catppuccin-macchiato-DXVcU9LJ.js} +0 -0
- /package/web/public/assets/{catppuccin-mocha-CPO4jaGM.js → catppuccin-mocha-CofYr3Sw.js} +0 -0
- /package/web/public/assets/{clarity-Rka6Ibys.js → clarity-Cmao5KSK.js} +0 -0
- /package/web/public/assets/{clojure-CEvM-ay9.js → clojure-D2dPuTkk.js} +0 -0
- /package/web/public/assets/{cmake-C-HulLqg.js → cmake-DaqQuj4A.js} +0 -0
- /package/web/public/assets/{codeowners-Bqxy-1en.js → codeowners-B748jmvc.js} +0 -0
- /package/web/public/assets/{codeql-aVPOmvJw.js → codeql-CXb_8gHR.js} +0 -0
- /package/web/public/assets/{common-lisp-CoH5Bypy.js → common-lisp-UZn9nc_5.js} +0 -0
- /package/web/public/assets/{coq-DHxvo73o.js → coq-DtO6yBIf.js} +0 -0
- /package/web/public/assets/{csharp-D1r0FgxE.js → csharp-BnPoTBy3.js} +0 -0
- /package/web/public/assets/{csv-C7wYOwss.js → csv-BBwiVr0X.js} +0 -0
- /package/web/public/assets/{cue-DVrj2AhX.js → cue-ScBFXY5f.js} +0 -0
- /package/web/public/assets/{cypher-CzVprHrl.js → cypher-CGStaC1X.js} +0 -0
- /package/web/public/assets/{d-x3a3_Xaw.js → d-CuTCIvnX.js} +0 -0
- /package/web/public/assets/{dark-plus-C0kLyDb3.js → dark-plus-B3ok_MHp.js} +0 -0
- /package/web/public/assets/{dart-DpnlYij3.js → dart-CqEodbm2.js} +0 -0
- /package/web/public/assets/{dax-Syv_hoiD.js → dax-UdE5S0Dh.js} +0 -0
- /package/web/public/assets/{desktop-D-wRHhtZ.js → desktop-DfmsfHJA.js} +0 -0
- /package/web/public/assets/{diff-DK3WLOEN.js → diff-CW0RWGd9.js} +0 -0
- /package/web/public/assets/{docker-BD8m_NS-.js → docker-B1qtW4ha.js} +0 -0
- /package/web/public/assets/{dotenv-CEeS2qc8.js → dotenv-BUzOh1k8.js} +0 -0
- /package/web/public/assets/{dracula-BbbBTYdV.js → dracula-NHy-p_Sb.js} +0 -0
- /package/web/public/assets/{dracula-soft-DEnCbN_E.js → dracula-soft-Dd1um8Q4.js} +0 -0
- /package/web/public/assets/{dream-maker-G83xWHtA.js → dream-maker-CBvk18nW.js} +0 -0
- /package/web/public/assets/{emacs-lisp-BMx_yBNe.js → emacs-lisp-DvSgLhDc.js} +0 -0
- /package/web/public/assets/{everforest-dark-BIGnUa1K.js → everforest-dark-BdLm24PG.js} +0 -0
- /package/web/public/assets/{everforest-light-DPDFUUUm.js → everforest-light-Cgvecm8J.js} +0 -0
- /package/web/public/assets/{fennel-D7bUTXOY.js → fennel-C-1kWlGf.js} +0 -0
- /package/web/public/assets/{fish-DACMRGFm.js → fish-CCpdtwqS.js} +0 -0
- /package/web/public/assets/{fluent-DoOY2028.js → fluent-BLg032oD.js} +0 -0
- /package/web/public/assets/{fortran-free-form-BMVGiZsS.js → fortran-free-form-DIFTDnRp.js} +0 -0
- /package/web/public/assets/{gdscript-qeX4viki.js → gdscript-BLGfbRse.js} +0 -0
- /package/web/public/assets/{gdshader-D4QG_LtG.js → gdshader-D4XNAEs9.js} +0 -0
- /package/web/public/assets/{genie-BZz7sgTg.js → genie-DmN-ICAN.js} +0 -0
- /package/web/public/assets/{gherkin-2F0Hux6H.js → gherkin-cuHHmRcX.js} +0 -0
- /package/web/public/assets/{github-dark-Ca_Q9Ef-.js → github-dark-BDEAeF5S.js} +0 -0
- /package/web/public/assets/{github-dark-default-B1hvTzqD.js → github-dark-default-B-VFdUi6.js} +0 -0
- /package/web/public/assets/{github-dark-dimmed-Czc28Paq.js → github-dark-dimmed-2DcdHZGe.js} +0 -0
- /package/web/public/assets/{github-dark-high-contrast-ClAFj_yD.js → github-dark-high-contrast-AfozBrrn.js} +0 -0
- /package/web/public/assets/{github-light-DXMgzlkd.js → github-light-B_HSK8-e.js} +0 -0
- /package/web/public/assets/{github-light-default-C0heX20M.js → github-light-default-DMQ1Mkip.js} +0 -0
- /package/web/public/assets/{github-light-high-contrast-Bdso7WSe.js → github-light-high-contrast-B9a-IAhW.js} +0 -0
- /package/web/public/assets/{gleam-CKujK_9r.js → gleam-D8VhqPDN.js} +0 -0
- /package/web/public/assets/{gnuplot-BnBldI7s.js → gnuplot-CsDpqO9X.js} +0 -0
- /package/web/public/assets/{go-D6V3e4Pz.js → go-BKDYqdrY.js} +0 -0
- /package/web/public/assets/{groovy-IfwXezsJ.js → groovy-Bi4Ll6no.js} +0 -0
- /package/web/public/assets/{gruvbox-dark-hard-CyHULVus.js → gruvbox-dark-hard-uWDvDB_Y.js} +0 -0
- /package/web/public/assets/{gruvbox-dark-medium-qJ9c8ND8.js → gruvbox-dark-medium-07z7e6Pn.js} +0 -0
- /package/web/public/assets/{gruvbox-dark-soft-C3qjYIJM.js → gruvbox-dark-soft-Bd5D-IiK.js} +0 -0
- /package/web/public/assets/{gruvbox-light-hard-DkgPegzV.js → gruvbox-light-hard-Co4Cca5U.js} +0 -0
- /package/web/public/assets/{gruvbox-light-medium-B_nBvpHM.js → gruvbox-light-medium-D4j8sDK2.js} +0 -0
- /package/web/public/assets/{gruvbox-light-soft-DPS00qzJ.js → gruvbox-light-soft-CT6vuid9.js} +0 -0
- /package/web/public/assets/{haskell-D_Wr4SP2.js → haskell-D62N_CAU.js} +0 -0
- /package/web/public/assets/{haxe-ChYRFbqx.js → haxe-DaOPEPd0.js} +0 -0
- /package/web/public/assets/{hcl-Cp5RP0NG.js → hcl-CKZP2LV2.js} +0 -0
- /package/web/public/assets/{hjson-C4qJjjHJ.js → hjson-ZrcQLLvz.js} +0 -0
- /package/web/public/assets/{hlsl-D179HP7y.js → hlsl-tDveWUL8.js} +0 -0
- /package/web/public/assets/{houston-CGv9NbgY.js → houston-DraBEKDe.js} +0 -0
- /package/web/public/assets/{hy-BtEqxKCs.js → hy-B2TuzEnV.js} +0 -0
- /package/web/public/assets/{imba-CRJbREiM.js → imba-WHJcCHli.js} +0 -0
- /package/web/public/assets/{ini-DSBqdtZl.js → ini-WzVu4r_S.js} +0 -0
- /package/web/public/assets/{json5-DMIvwtR8.js → json5-uChlRsCy.js} +0 -0
- /package/web/public/assets/{jsonc-BdlCXPtc.js → jsonc-o1JbODDc.js} +0 -0
- /package/web/public/assets/{jsonl-BpVOCxVu.js → jsonl-DsFPqTWt.js} +0 -0
- /package/web/public/assets/{jsonnet-D3jmEwtD.js → jsonnet-Do87PjDg.js} +0 -0
- /package/web/public/assets/{jssm-D7adz0Zk.js → jssm-DsKQKyHh.js} +0 -0
- /package/web/public/assets/{kanagawa-dragon-C8xtaWaa.js → kanagawa-dragon-DILUCdKU.js} +0 -0
- /package/web/public/assets/{kanagawa-lotus-Dkvwz-sh.js → kanagawa-lotus-B2Kuykzq.js} +0 -0
- /package/web/public/assets/{kanagawa-wave-CVz5XkfW.js → kanagawa-wave-CZqOKF3_.js} +0 -0
- /package/web/public/assets/{kdl-B0l_UDtx.js → kdl-B2a5Hdo5.js} +0 -0
- /package/web/public/assets/{kotlin-D4Z4sobD.js → kotlin-CwntYu9G.js} +0 -0
- /package/web/public/assets/{kusto-DBK7U6YD.js → kusto-C7xLiDy1.js} +0 -0
- /package/web/public/assets/{laserwave-DEPeWYLv.js → laserwave-CLp9KmkC.js} +0 -0
- /package/web/public/assets/{lean-BrTxhtiv.js → lean-C0OcwREI.js} +0 -0
- /package/web/public/assets/{less-duanLLE_.js → less-Dycz37IB.js} +0 -0
- /package/web/public/assets/{light-plus-BMUJ881T.js → light-plus-CASdk9mM.js} +0 -0
- /package/web/public/assets/{llvm-DFpB8htZ.js → llvm-subw26Uf.js} +0 -0
- /package/web/public/assets/{log-DUaYj482.js → log-CM4eTPwH.js} +0 -0
- /package/web/public/assets/{logo-U-be5s9s.js → logo-DCYIDlXZ.js} +0 -0
- /package/web/public/assets/{luau-ENKSAnK9.js → luau-DJkYOK-N.js} +0 -0
- /package/web/public/assets/{make-DjZta7xH.js → make-Bep3F-fA.js} +0 -0
- /package/web/public/assets/{markdown-DuOOcY8R.js → markdown-DXxotAxn.js} +0 -0
- /package/web/public/assets/{material-theme-XDSyYav6.js → material-theme-CfqmFDHZ.js} +0 -0
- /package/web/public/assets/{material-theme-darker-DhqKKVGd.js → material-theme-darker-MsbnpuuF.js} +0 -0
- /package/web/public/assets/{material-theme-lighter-vYkeG0w7.js → material-theme-lighter-BTEEfJMo.js} +0 -0
- /package/web/public/assets/{material-theme-ocean-Cw5ndLhJ.js → material-theme-ocean-CBzqTWI5.js} +0 -0
- /package/web/public/assets/{material-theme-palenight--eyVzvO9.js → material-theme-palenight-RKraSPMB.js} +0 -0
- /package/web/public/assets/{matlab-BoQcPd8Y.js → matlab-BjvFQgI4.js} +0 -0
- /package/web/public/assets/{mdx-B3HnIKti.js → mdx-DnKU9cqA.js} +0 -0
- /package/web/public/assets/{mermaid-CjOIJZ_2.js → mermaid-PsCdFMP4.js} +0 -0
- /package/web/public/assets/{min-dark-BcaiaifK.js → min-dark-Cv_rJJe3.js} +0 -0
- /package/web/public/assets/{min-light-CV0Zl-N6.js → min-light-adtpsoGt.js} +0 -0
- /package/web/public/assets/{mipsasm-D4P2J3AH.js → mipsasm-OAAwCDEg.js} +0 -0
- /package/web/public/assets/{mojo-DdFmV95X.js → mojo-C98RG4zx.js} +0 -0
- /package/web/public/assets/{monokai-CdNjJcyb.js → monokai-R__67SiO.js} +0 -0
- /package/web/public/assets/{move-BbTBpY6E.js → move-BKs_wrSq.js} +0 -0
- /package/web/public/assets/{narrat-D90YM_aP.js → narrat-DXBAGtnK.js} +0 -0
- /package/web/public/assets/{nextflow-CjzhFVAq.js → nextflow-DnO2XFP7.js} +0 -0
- /package/web/public/assets/{night-owl-Br_mJtsB.js → night-owl-c-XUdzNN.js} +0 -0
- /package/web/public/assets/{nix-CJ7FQB3j.js → nix-DSVQz1Vb.js} +0 -0
- /package/web/public/assets/{nord-CzGMyUS4.js → nord-CfpzYV6O.js} +0 -0
- /package/web/public/assets/{nushell-CGk3MG_2.js → nushell-CW8y6_6S.js} +0 -0
- /package/web/public/assets/{objective-c-brSW1tDJ.js → objective-c-GRClK1S7.js} +0 -0
- /package/web/public/assets/{objective-cpp-Bi4qA4YK.js → objective-cpp-l3qYw-v5.js} +0 -0
- /package/web/public/assets/{ocaml-CK8oFJnL.js → ocaml-BBDyhyMH.js} +0 -0
- /package/web/public/assets/{one-dark-pro-uX4CVnLO.js → one-dark-pro-NuzFmTft.js} +0 -0
- /package/web/public/assets/{one-light-BLm888ve.js → one-light-Cgxj9GbU.js} +0 -0
- /package/web/public/assets/{openscad-Bc9f44ux.js → openscad-DCmPLSXt.js} +0 -0
- /package/web/public/assets/{pascal-DSCI7D66.js → pascal-BMY45JJO.js} +0 -0
- /package/web/public/assets/{pkl-DUO2X8D0.js → pkl-ML-dWShO.js} +0 -0
- /package/web/public/assets/{plastic-BH7hI5Jl.js → plastic-Dm5h_fPp.js} +0 -0
- /package/web/public/assets/{plsql-C_HlhCbf.js → plsql-0vd5cLro.js} +0 -0
- /package/web/public/assets/{po-ZbEDR6yR.js → po-CbZ_uqQA.js} +0 -0
- /package/web/public/assets/{poimandres-BNZEf_z5.js → poimandres-BMiDntUw.js} +0 -0
- /package/web/public/assets/{polar-H99ZI9gT.js → polar-C4hfV8Nc.js} +0 -0
- /package/web/public/assets/{postcss-D9V1cTEE.js → postcss-Ct0ld0vz.js} +0 -0
- /package/web/public/assets/{powerquery-C21Kh7oG.js → powerquery-CTlGUQPj.js} +0 -0
- /package/web/public/assets/{powershell-C7SVh4_l.js → powershell-DyZsOmuq.js} +0 -0
- /package/web/public/assets/{prisma-t7qarfT3.js → prisma-SS92PO_I.js} +0 -0
- /package/web/public/assets/{prolog-ezNDDDSD.js → prolog-B1O1NNVC.js} +0 -0
- /package/web/public/assets/{proto-Loi3x7gt.js → proto-DSThcTAU.js} +0 -0
- /package/web/public/assets/{puppet-ICbQHavt.js → puppet-tvtRVdr6.js} +0 -0
- /package/web/public/assets/{purescript-5K0_DFG7.js → purescript-Dtbpb7D-.js} +0 -0
- /package/web/public/assets/{python-5Ey56Pua.js → python-D1NFioGW.js} +0 -0
- /package/web/public/assets/{qmldir-DFDAfCFp.js → qmldir-B-iEOngH.js} +0 -0
- /package/web/public/assets/{qss-CFcBGfuz.js → qss-Ba0p-aHw.js} +0 -0
- /package/web/public/assets/{racket-BUwKPmlz.js → racket-BXDsxf2U.js} +0 -0
- /package/web/public/assets/{raku-dc8o5u1F.js → raku-Dw1WWFXK.js} +0 -0
- /package/web/public/assets/{red-BxvfZNpB.js → red-KFYbzZV7.js} +0 -0
- /package/web/public/assets/{reg-C4HODx1j.js → reg-DXFHGaM4.js} +0 -0
- /package/web/public/assets/{rel-BGn9N5c7.js → rel-Dc5_Ytx2.js} +0 -0
- /package/web/public/assets/{riscv-CZ95sp2F.js → riscv-ZgswiWij.js} +0 -0
- /package/web/public/assets/{rose-pine-TrkZn1sZ.js → rose-pine-CgpG0Wwm.js} +0 -0
- /package/web/public/assets/{rose-pine-dawn-DIS6YmyK.js → rose-pine-dawn-DnQykvhA.js} +0 -0
- /package/web/public/assets/{rose-pine-moon-D66xAo56.js → rose-pine-moon-BxLEuV3_.js} +0 -0
- /package/web/public/assets/{rosmsg-3tIdVMbs.js → rosmsg-CcBwQf5j.js} +0 -0
- /package/web/public/assets/{rust-D4fV7JlL.js → rust-ppknoGus.js} +0 -0
- /package/web/public/assets/{sass-Bp0UJY9L.js → sass-Baw41att.js} +0 -0
- /package/web/public/assets/{scala-Csvg1HO_.js → scala-DtlnBhKt.js} +0 -0
- /package/web/public/assets/{scheme-C_BP1Igg.js → scheme-DYQMayIi.js} +0 -0
- /package/web/public/assets/{sdbl-C6SSRmZg.js → sdbl-B_1cHVNm.js} +0 -0
- /package/web/public/assets/{slack-dark-D8xiiB5S.js → slack-dark-DaitoxIJ.js} +0 -0
- /package/web/public/assets/{slack-ochin-ZhRUeH14.js → slack-ochin-CKzff-0L.js} +0 -0
- /package/web/public/assets/{smalltalk-BV1BGSHN.js → smalltalk-DRM3jr39.js} +0 -0
- /package/web/public/assets/{snazzy-light-Cr_XMyAN.js → snazzy-light-Cfj-ApKF.js} +0 -0
- /package/web/public/assets/{solarized-dark-Cn9jek_l.js → solarized-dark-syg5rn82.js} +0 -0
- /package/web/public/assets/{solarized-light-DsiZEVCv.js → solarized-light-BAea3eBG.js} +0 -0
- /package/web/public/assets/{solidity-Benh37UM.js → solidity-CYAp_sJG.js} +0 -0
- /package/web/public/assets/{splunk-CaLVgio7.js → splunk-LsCTpuOP.js} +0 -0
- /package/web/public/assets/{ssh-config-B-O8GtxC.js → ssh-config-QxQe7y21.js} +0 -0
- /package/web/public/assets/{stylus-Ym_SHhEQ.js → stylus-DZvi0832.js} +0 -0
- /package/web/public/assets/{swift-VXxF3sbs.js → swift-CDjbPYoV.js} +0 -0
- /package/web/public/assets/{synthwave-84-w6Szqqjc.js → synthwave-84-7RM1a-o6.js} +0 -0
- /package/web/public/assets/{system-verilog-BGjucJg8.js → system-verilog-CYey0nam.js} +0 -0
- /package/web/public/assets/{systemd-izjjzSiM.js → systemd-CP-_B7Hs.js} +0 -0
- /package/web/public/assets/{talonscript-CvTvX6MJ.js → talonscript-KcJSLq0g.js} +0 -0
- /package/web/public/assets/{tasl-B4UTsqP6.js → tasl-UgGRncVE.js} +0 -0
- /package/web/public/assets/{tcl-DL-TVAfE.js → tcl-IEoxxKd9.js} +0 -0
- /package/web/public/assets/{terraform-BXdxo_8l.js → terraform-PrLLnyiL.js} +0 -0
- /package/web/public/assets/{tokyo-night-DIRnpZ_L.js → tokyo-night-CZ_TA08H.js} +0 -0
- /package/web/public/assets/{toml-D7Gs36bm.js → toml-W6nxcYtJ.js} +0 -0
- /package/web/public/assets/{tsv-DG6pavxb.js → tsv-BRx-N_Yl.js} +0 -0
- /package/web/public/assets/{turtle-DGLd8P-0.js → turtle-ZCrKgE8E.js} +0 -0
- /package/web/public/assets/{typespec-CDyTGGvc.js → typespec-EjcUAk3i.js} +0 -0
- /package/web/public/assets/{typst-DEENuDxs.js → typst-BV1BGyWG.js} +0 -0
- /package/web/public/assets/{v-CwAlU6ix.js → v-DsDLzPtW.js} +0 -0
- /package/web/public/assets/{vala-Dea7VvuX.js → vala-Bs3vV05i.js} +0 -0
- /package/web/public/assets/{vb-DDs8SBzi.js → vb-CPJ4fJKa.js} +0 -0
- /package/web/public/assets/{verilog-C5jTwd1F.js → verilog-sIfxvY5_.js} +0 -0
- /package/web/public/assets/{vesper-BSHPbApa.js → vesper-BdKAaT7q.js} +0 -0
- /package/web/public/assets/{vhdl-9KzRn3Yr.js → vhdl-BWTyDzra.js} +0 -0
- /package/web/public/assets/{viml-BWWUx-U5.js → viml-CkzrUc36.js} +0 -0
- /package/web/public/assets/{vitesse-black-UFUHYZOi.js → vitesse-black-BkwYYrqu.js} +0 -0
- /package/web/public/assets/{vitesse-dark-_tYBvODb.js → vitesse-dark-Dr-0tRFe.js} +0 -0
- /package/web/public/assets/{vitesse-light-CRsR_EUr.js → vitesse-light-Dwi9BR_i.js} +0 -0
- /package/web/public/assets/{vyper-CHnSipMd.js → vyper-Ddg9ynNK.js} +0 -0
- /package/web/public/assets/{wasm-DH36lyNj.js → wasm-0ag0zszG.js} +0 -0
- /package/web/public/assets/{wasm-BkG5Qr1Q.js → wasm-xPljl98P.js} +0 -0
- /package/web/public/assets/{wenyan-CpA4iUgB.js → wenyan-BVy5yENW.js} +0 -0
- /package/web/public/assets/{wgsl-tgmVqEpe.js → wgsl-JVNN3zi8.js} +0 -0
- /package/web/public/assets/{wikitext-BSHwRUpE.js → wikitext-CJsbZHwi.js} +0 -0
- /package/web/public/assets/{wit-C4w9cEVY.js → wit-DEFTvUMf.js} +0 -0
- /package/web/public/assets/{wolfram-D7mQULT_.js → wolfram-CrHN9vWl.js} +0 -0
- /package/web/public/assets/{zenscript-mED8Cq2o.js → zenscript-CNDMZH8q.js} +0 -0
- /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 {
|
|
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
|
-
|
|
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
|
|
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
|
|
313
|
-
run [
|
|
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
|
|
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() ||
|
|
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
|
|
406
|
-
const
|
|
407
|
-
const
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
const
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
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
|
-
|
|
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(`
|
|
626
|
+
console.log(` ${provider === "claude" ? "Instance Key" : "Backend Port"}: ${backendPort}`);
|
|
435
627
|
console.log(` Hostname: ${hostname}`);
|
|
436
628
|
try {
|
|
437
|
-
const
|
|
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
|
-
|
|
445
|
-
|
|
446
|
-
|
|
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
|
|
451
|
-
|
|
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
|
-
|
|
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
|
|
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() ||
|
|
472
|
-
const
|
|
473
|
-
const
|
|
474
|
-
const
|
|
475
|
-
if (
|
|
476
|
-
const
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
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
|
|
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(`
|
|
491
|
-
console.log(` Hostname: ${
|
|
694
|
+
console.log(` ${provider === "claude" ? "Instance Key" : "Backend Port"}: ${backendPort}`);
|
|
695
|
+
console.log(` Hostname: ${backendHost}`);
|
|
492
696
|
try {
|
|
493
|
-
|
|
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
|
-
|
|
500
|
-
|
|
501
|
-
|
|
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
|
|
506
|
-
|
|
507
|
-
|
|
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
|
|
510
|
-
|
|
511
|
-
|
|
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
|
|
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
|
|
524
|
-
|
|
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
|
-
|
|
772
|
+
const provider = getInstanceProvider(removed);
|
|
773
|
+
const backendPid = getInstanceBackendPid(removed);
|
|
774
|
+
if (backendPid !== null) {
|
|
529
775
|
try {
|
|
530
|
-
process.kill(
|
|
531
|
-
console.log(`Stopped
|
|
776
|
+
process.kill(backendPid, "SIGTERM");
|
|
777
|
+
console.log(`Stopped ${providerName(provider)} (PID: ${backendPid})`);
|
|
532
778
|
} catch {
|
|
533
|
-
console.log(
|
|
779
|
+
console.log(`${providerName(provider)} was already stopped.`);
|
|
534
780
|
}
|
|
535
781
|
}
|
|
536
|
-
if (
|
|
782
|
+
if (removed.webPid !== null) {
|
|
537
783
|
try {
|
|
538
|
-
process.kill(
|
|
539
|
-
console.log(`Stopped Web UI (PID: ${
|
|
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: ${
|
|
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\
|
|
802
|
+
console.log("ID\t\tNAME\t\t\tPROVIDER\tPORT\tBACKEND\tSTATUS\t\tDIRECTORY");
|
|
559
803
|
console.log("-".repeat(110));
|
|
560
|
-
const
|
|
804
|
+
const liveIds = new Set;
|
|
561
805
|
for (const instance of config.instances) {
|
|
562
|
-
const
|
|
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 (
|
|
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 (
|
|
568
|
-
status =
|
|
817
|
+
else if (backendRunning)
|
|
818
|
+
status = provider;
|
|
569
819
|
else if (webRunning)
|
|
570
820
|
status = "web only";
|
|
571
|
-
if (
|
|
572
|
-
|
|
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
|
|
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 (
|
|
578
|
-
|
|
579
|
-
|
|
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
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
const
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
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. ${
|
|
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
|
-
|
|
860
|
+
const commandProvider = parseProvider(command);
|
|
861
|
+
if (!command || command === "." || command.startsWith("/") || command.startsWith("./") || commandProvider) {
|
|
606
862
|
if (command && command !== ".") {
|
|
607
|
-
|
|
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
|
-
|
|
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;
|