openportal 0.1.31 → 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 +258 -55
- package/package.json +1 -1
- package/web/nitro.json +1 -1
- 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/{angular-html-tYBVGGly.js → angular-html-CyxhxxC6.js} +1 -1
- package/web/public/assets/{angular-ts-Bt2cFJZh.js → angular-ts-DKwzvk_A.js} +1 -1
- package/web/public/assets/{apl-D7UjtY_t.js → apl-D9JhLyA8.js} +1 -1
- package/web/public/assets/{astro-Bn0abwOQ.js → astro-D35iUAk4.js} +1 -1
- package/web/public/assets/{blade-CihxQpr_.js → blade-CQ_yb9AJ.js} +1 -1
- package/web/public/assets/{breadcrumb-context-B3YglwWs.js → breadcrumb-context-BSiNOVxE.js} +1 -1
- package/web/public/assets/{bsl-BKETj7-F.js → bsl-BDVOE52A.js} +1 -1
- package/web/public/assets/{button-BwXxlJmo.js → button-CoQU6poF.js} +2 -2
- package/web/public/assets/{cairo-Bm1QXIgL.js → cairo-BDZ6TRZS.js} +1 -1
- package/web/public/assets/{cobol-fzIUfU2w.js → cobol-Cj7rLdF4.js} +1 -1
- package/web/public/assets/{coffee-dgVnJ94q.js → coffee-BEqQ7khn.js} +1 -1
- package/web/public/assets/{cpp-DlBarvJx.js → cpp-K58e7MPy.js} +1 -1
- package/web/public/assets/{crystal-DPdyMMKb.js → crystal-WvacFQuU.js} +1 -1
- package/web/public/assets/{diff-BIfGXO1H.js → diff-Bggc2a-A.js} +5 -5
- package/web/public/assets/{edge-DvOMU0HI.js → edge-C2YjZt3E.js} +1 -1
- package/web/public/assets/{elixir-iK-aYBAj.js → elixir-DGL2pFx1.js} +1 -1
- package/web/public/assets/{elm-C5hsl51h.js → elm-CrPEbkYU.js} +1 -1
- package/web/public/assets/{erb-CI326ZCF.js → erb-Pjl6MxSx.js} +1 -1
- package/web/public/assets/{erlang-Lh_bsUxs.js → erlang-cuhwpmsu.js} +1 -1
- package/web/public/assets/{field-CNYjTNih.js → field-BD1fYKgU.js} +1 -1
- package/web/public/assets/{fortran-fixed-form-By4uV00l.js → fortran-fixed-form-CS9qOEPh.js} +1 -1
- package/web/public/assets/{fsharp-C-Qeuhxq.js → fsharp-CQ5iYSPA.js} +1 -1
- package/web/public/assets/{gdresource-DPsh07f8.js → gdresource-BAudk4qB.js} +1 -1
- package/web/public/assets/{git-commit-BNVf7D3_.js → git-commit-6e79eN7Q.js} +1 -1
- package/web/public/assets/{git-rebase-BIZfUgsJ.js → git-rebase-0YNSjhVf.js} +1 -1
- package/web/public/assets/{glimmer-js-CcSxB70m.js → glimmer-js-BWHy9y50.js} +1 -1
- package/web/public/assets/{glimmer-ts-lBmudEJy.js → glimmer-ts-DX8iZiOc.js} +1 -1
- package/web/public/assets/{glsl-vJqP49sD.js → glsl-COW3sf6s.js} +1 -1
- package/web/public/assets/{graphql-CXLKnjj9.js → graphql-Dd2Tpr9E.js} +1 -1
- package/web/public/assets/{hack-BbuBzOS8.js → hack-DAJwWGZ4.js} +1 -1
- package/web/public/assets/{haml-EDAfFCO2.js → haml-t0kHqiMk.js} +1 -1
- package/web/public/assets/{handlebars-Ciwrn25b.js → handlebars-qamPNlYY.js} +1 -1
- package/web/public/assets/{html-DUYkrbwC.js → html-D_X3PCw-.js} +1 -1
- package/web/public/assets/{html-derivative-NBKo_PD-.js → html-derivative-CkXhljkj.js} +1 -1
- package/web/public/assets/{http-Dag2VdjG.js → http-Cy1i-1jR.js} +1 -1
- package/web/public/assets/{hurl-CSTE4pPR.js → hurl-BtIML1gH.js} +1 -1
- package/web/public/assets/{hxml-DlOl0PEf.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/{jinja-BsyWcE95.js → jinja-C5RLRSh5.js} +1 -1
- package/web/public/assets/{jison-_rx2Ho-A.js → jison-CEtCKWto.js} +1 -1
- package/web/public/assets/{julia-CCJJT-JW.js → julia-DYZnQ9C_.js} +1 -1
- package/web/public/assets/{latex-Co-P5NWx.js → latex-DmbAavtk.js} +1 -1
- package/web/public/assets/{link-DOqotFDp.js → link-e2hDme49.js} +1 -1
- package/web/public/assets/{liquid-BYtAj9cp.js → liquid-DRMm6-P7.js} +1 -1
- package/web/public/assets/{lua-Cj1ZB8IY.js → lua-D5x9Ej0C.js} +1 -1
- package/web/public/assets/lucide-oITxMZUb.js +1 -0
- package/web/public/assets/{marko-D4sshstR.js → marko-BRjURZmp.js} +1 -1
- package/web/public/assets/{mdc-DMiSn-di.js → mdc-BORe-lTd.js} +1 -1
- package/web/public/assets/{nginx-D-dqvf7r.js → nginx--G2djEeU.js} +1 -1
- package/web/public/assets/{nim-Cyko-abd.js → nim-Bg97nylc.js} +1 -1
- package/web/public/assets/{perl-DaTblz0l.js → perl-BObf9N37.js} +1 -1
- package/web/public/assets/{php-BPoBt8_6.js → php-inqyeXtA.js} +1 -1
- package/web/public/assets/{popover-CRR_NOES.js → popover-D7DqQzYd.js} +2 -2
- package/web/public/assets/{pug-C-YQyY8x.js → pug-CyUw5FPt.js} +1 -1
- package/web/public/assets/{qml-D8Rfk3Lb.js → qml-IWAIEnkZ.js} +1 -1
- package/web/public/assets/{razor-ouagoKWa.js → razor-DHWbGfqh.js} +1 -1
- package/web/public/assets/{rst-PkFRPdn9.js → rst-BOV1Iu5T.js} +1 -1
- package/web/public/assets/{ruby-B_aIajfM.js → ruby-MEoEfPKM.js} +1 -1
- package/web/public/assets/{sas-DW15znt6.js → sas-Dxq9CzH7.js} +1 -1
- package/web/public/assets/{scss-CieAHW_V.js → scss-BMjNhvSM.js} +1 -1
- package/web/public/assets/settings-BtPmV_Mc.js +1 -0
- package/web/public/assets/{shaderlab-Cg-cNaa-.js → shaderlab-BiweuU0M.js} +1 -1
- package/web/public/assets/{shellsession--I7Uz6My.js → shellsession-BlrJ09y9.js} +1 -1
- package/web/public/assets/{soy-ziRqYDcy.js → soy-BpQ0SMiq.js} +1 -1
- package/web/public/assets/{sparql-CRKvL8Qo.js → sparql-J1VOnnwM.js} +1 -1
- package/web/public/assets/{stata-C-5qfhys.js → stata-DC5z9YAe.js} +1 -1
- package/web/public/assets/{svelte-B6BW65xu.js → svelte-CF6QDu1s.js} +1 -1
- package/web/public/assets/{templ-PEIZqAK1.js → templ-tkdPKNAc.js} +1 -1
- package/web/public/assets/{tex-D2mC87Vl.js → tex-Bt2c8D58.js} +1 -1
- package/web/public/assets/{ts-tags-RFn1CcJv.js → ts-tags-B6ZGEqrj.js} +1 -1
- package/web/public/assets/{twig-BVylsIfB.js → twig-DRzX5__m.js} +1 -1
- package/web/public/assets/{use-media-query-DJ49EUkO.js → use-media-query-DDfzZruf.js} +1 -1
- 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-CHiJUiGj.js → useNavigate-CwkeBifN.js} +1 -1
- package/web/public/assets/useTextField-4MIBK5lD.js +1 -0
- package/web/public/assets/{vue-s3Ia2KDE.js → vue-C1vQecwS.js} +1 -1
- package/web/public/assets/{vue-html-DDGKH-ua.js → vue-html-BrJuM9_k.js} +1 -1
- package/web/public/assets/{vue-vine-YrT0fNHh.js → vue-vine-eoaT5X-O.js} +1 -1
- package/web/public/assets/{xml-Cs6nNM2A.js → xml-CK_MCESO.js} +1 -1
- package/web/public/assets/{xsl-7GSlcAnI.js → xsl-CGwehH9h.js} +1 -1
- package/web/server/_chunks/error-message.mjs +32 -0
- package/web/server/_chunks/renderer-template.mjs +1 -1
- package/web/server/_libs/anthropic-ai__claude-agent-sdk.mjs +27103 -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/instances.mjs +152 -27
- 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/opencode_client.mjs +2 -2
- package/web/server/_routes/api/lib/process_cwd.mjs +91 -0
- package/web/server/_routes/api/opencode/[port]/agents.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/config.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/events.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/files/search.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/git/diff.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/health.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/permission/[requestId]/reply.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/permissions.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/project/current.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/providers.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/question/[requestId]/reject.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/question/[requestId]/reply.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/questions.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/session/[id]/abort.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/session/[id]/messages.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/session/[id]/prompt.mjs +14 -7
- package/web/server/_routes/api/opencode/[port]/session/[id].mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/session/[id]2.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/session/create.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/session/status.mjs +1 -1
- package/web/server/_routes/api/opencode/[port]/sessions.mjs +1 -1
- package/web/server/index.mjs +1780 -1306
- package/web/public/assets/_app-Bx3mWCTp.js +0 -1
- package/web/public/assets/_app-DgHMSgay.js +0 -41
- package/web/public/assets/_id-C9ATpjbp.js +0 -37
- package/web/public/assets/index-BNen-9-N.css +0 -2
- package/web/public/assets/index-CXZ33Z-X.js +0 -10
- package/web/public/assets/instances-B2NvyI6f.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/lucide-BTUlgFgW.js +0 -1
- package/web/public/assets/select-CvO3JtqA.js +0 -1
- package/web/public/assets/settings-B0-RWpao.js +0 -1
- package/web/public/assets/use-session-messages--pfdFXZh.js +0 -4
- package/web/public/assets/useMatch-CKjponJB.js +0 -1
- /package/web/public/assets/{abap-cWYhO34H.js → abap-BYgfS2J7.js} +0 -0
- /package/web/public/assets/{about-BxxiVFq8.js → about-B4D-YQvu.js} +0 -0
- /package/web/public/assets/{actionscript-3-oRNhS_cT.js → actionscript-3-CWRCR4iE.js} +0 -0
- /package/web/public/assets/{ada-C0C0SoYB.js → ada-C49PBMn9.js} +0 -0
- /package/web/public/assets/{andromeeda-DijoPaKL.js → andromeeda-BBhAo6p7.js} +0 -0
- /package/web/public/assets/{apache-DBwBm4bB.js → apache-BIH3t0yU.js} +0 -0
- /package/web/public/assets/{apex-CXRs1L9t.js → apex-ChBAwGH0.js} +0 -0
- /package/web/public/assets/{applescript-hQs8VNpS.js → applescript-F6IQpFHw.js} +0 -0
- /package/web/public/assets/{ara-BOadBOZg.js → ara-C7jg9iGE.js} +0 -0
- /package/web/public/assets/{asciidoc-B8GRwlcK.js → asciidoc-BNeev37S.js} +0 -0
- /package/web/public/assets/{asm-C2vUqzqz.js → asm-C_FYSSlO.js} +0 -0
- /package/web/public/assets/{aurora-x-D8CoY9RX.js → aurora-x-BrXKjfbm.js} +0 -0
- /package/web/public/assets/{awk-D4e-eeZT.js → awk-Dhzptovp.js} +0 -0
- /package/web/public/assets/{ayu-dark-BJ1wuoej.js → ayu-dark-Bc6YaM0t.js} +0 -0
- /package/web/public/assets/{ballerina-BzvFqbha.js → ballerina-BMtRaYfJ.js} +0 -0
- /package/web/public/assets/{bat-CFyw2ERn.js → bat-C-_iWjni.js} +0 -0
- /package/web/public/assets/{beancount-a6Gsu5WX.js → beancount-SMCafKaA.js} +0 -0
- /package/web/public/assets/{berry-C2jyz4Ah.js → berry-B1oQ9RhK.js} +0 -0
- /package/web/public/assets/{bibtex-Dyet-B83.js → bibtex-BH2gsObK.js} +0 -0
- /package/web/public/assets/{bicep-CghvUIvy.js → bicep-CzfNgsCD.js} +0 -0
- /package/web/public/assets/{c-B0n6eOZ6.js → c-DP4PuxsC.js} +0 -0
- /package/web/public/assets/{cadence-CONiM5ZJ.js → cadence-BPDgYNWy.js} +0 -0
- /package/web/public/assets/{catppuccin-frappe-BSTaQ0EA.js → catppuccin-frappe-D5TUFPbv.js} +0 -0
- /package/web/public/assets/{catppuccin-latte-CJvpSF0g.js → catppuccin-latte-wUX3NN1_.js} +0 -0
- /package/web/public/assets/{catppuccin-macchiato-5S4j0Hfd.js → catppuccin-macchiato-DXVcU9LJ.js} +0 -0
- /package/web/public/assets/{catppuccin-mocha-CqCcNZ-i.js → catppuccin-mocha-CofYr3Sw.js} +0 -0
- /package/web/public/assets/{clarity-8uYwFS0g.js → clarity-Cmao5KSK.js} +0 -0
- /package/web/public/assets/{clojure-B91hPl1J.js → clojure-D2dPuTkk.js} +0 -0
- /package/web/public/assets/{cmake-CLvI-L08.js → cmake-DaqQuj4A.js} +0 -0
- /package/web/public/assets/{codeowners-CQ0GhFko.js → codeowners-B748jmvc.js} +0 -0
- /package/web/public/assets/{codeql-DfO2RO4c.js → codeql-CXb_8gHR.js} +0 -0
- /package/web/public/assets/{common-lisp-Dxsy__BF.js → common-lisp-UZn9nc_5.js} +0 -0
- /package/web/public/assets/{coq-BEB_SJbO.js → coq-DtO6yBIf.js} +0 -0
- /package/web/public/assets/{csharp-Db9xj6ZZ.js → csharp-BnPoTBy3.js} +0 -0
- /package/web/public/assets/{css-Ctd6TcjM.js → css-D8-m18hd.js} +0 -0
- /package/web/public/assets/{csv-CjsQX1YE.js → csv-BBwiVr0X.js} +0 -0
- /package/web/public/assets/{cue-Brer6idk.js → cue-ScBFXY5f.js} +0 -0
- /package/web/public/assets/{cypher-t9UY6Shl.js → cypher-CGStaC1X.js} +0 -0
- /package/web/public/assets/{d-CUrh2xWw.js → d-CuTCIvnX.js} +0 -0
- /package/web/public/assets/{dark-plus-BipXJdiu.js → dark-plus-B3ok_MHp.js} +0 -0
- /package/web/public/assets/{dart-CGSq4we3.js → dart-CqEodbm2.js} +0 -0
- /package/web/public/assets/{dax-d2Al1_rU.js → dax-UdE5S0Dh.js} +0 -0
- /package/web/public/assets/{desktop-CWvOdYyW.js → desktop-DfmsfHJA.js} +0 -0
- /package/web/public/assets/{diff-Dv7n7lNd.js → diff-CW0RWGd9.js} +0 -0
- /package/web/public/assets/{docker-CtUqO3OU.js → docker-B1qtW4ha.js} +0 -0
- /package/web/public/assets/{dotenv-2LOM2hac.js → dotenv-BUzOh1k8.js} +0 -0
- /package/web/public/assets/{dracula-rRmBdd8R.js → dracula-NHy-p_Sb.js} +0 -0
- /package/web/public/assets/{dracula-soft-CHy0pPYg.js → dracula-soft-Dd1um8Q4.js} +0 -0
- /package/web/public/assets/{dream-maker-SPySPaGW.js → dream-maker-CBvk18nW.js} +0 -0
- /package/web/public/assets/{emacs-lisp-CXsFziPU.js → emacs-lisp-DvSgLhDc.js} +0 -0
- /package/web/public/assets/{everforest-dark-CykMLuzs.js → everforest-dark-BdLm24PG.js} +0 -0
- /package/web/public/assets/{everforest-light-CpVrrr0x.js → everforest-light-Cgvecm8J.js} +0 -0
- /package/web/public/assets/{fennel-BabMDVkY.js → fennel-C-1kWlGf.js} +0 -0
- /package/web/public/assets/{fish-xyAFhjKI.js → fish-CCpdtwqS.js} +0 -0
- /package/web/public/assets/{fluent-54nGyXmc.js → fluent-BLg032oD.js} +0 -0
- /package/web/public/assets/{fortran-free-form-AY5m6gNy.js → fortran-free-form-DIFTDnRp.js} +0 -0
- /package/web/public/assets/{gdscript-iJ71dLLS.js → gdscript-BLGfbRse.js} +0 -0
- /package/web/public/assets/{gdshader-COD-4C51.js → gdshader-D4XNAEs9.js} +0 -0
- /package/web/public/assets/{genie-D2zj675s.js → genie-DmN-ICAN.js} +0 -0
- /package/web/public/assets/{gherkin-C-x-qfU_.js → gherkin-cuHHmRcX.js} +0 -0
- /package/web/public/assets/{github-dark-DskMQXcy.js → github-dark-BDEAeF5S.js} +0 -0
- /package/web/public/assets/{github-dark-default-CKKGJpm5.js → github-dark-default-B-VFdUi6.js} +0 -0
- /package/web/public/assets/{github-dark-dimmed-ywk1Z1Hc.js → github-dark-dimmed-2DcdHZGe.js} +0 -0
- /package/web/public/assets/{github-dark-high-contrast-DXBnpOEd.js → github-dark-high-contrast-AfozBrrn.js} +0 -0
- /package/web/public/assets/{github-light-CKm9zhSR.js → github-light-B_HSK8-e.js} +0 -0
- /package/web/public/assets/{github-light-default-A5tU6qEQ.js → github-light-default-DMQ1Mkip.js} +0 -0
- /package/web/public/assets/{github-light-high-contrast-DgXlJLHk.js → github-light-high-contrast-B9a-IAhW.js} +0 -0
- /package/web/public/assets/{gleam-yEn05q-o.js → gleam-D8VhqPDN.js} +0 -0
- /package/web/public/assets/{gnuplot-C40vWoS_.js → gnuplot-CsDpqO9X.js} +0 -0
- /package/web/public/assets/{go-DccdSYyo.js → go-BKDYqdrY.js} +0 -0
- /package/web/public/assets/{groovy-42TXi0JD.js → groovy-Bi4Ll6no.js} +0 -0
- /package/web/public/assets/{gruvbox-dark-hard-BlUzB-ID.js → gruvbox-dark-hard-uWDvDB_Y.js} +0 -0
- /package/web/public/assets/{gruvbox-dark-medium-yOGwRy_J.js → gruvbox-dark-medium-07z7e6Pn.js} +0 -0
- /package/web/public/assets/{gruvbox-dark-soft-Df4UJJBE.js → gruvbox-dark-soft-Bd5D-IiK.js} +0 -0
- /package/web/public/assets/{gruvbox-light-hard-D3rD9jDI.js → gruvbox-light-hard-Co4Cca5U.js} +0 -0
- /package/web/public/assets/{gruvbox-light-medium-Dlem6WY4.js → gruvbox-light-medium-D4j8sDK2.js} +0 -0
- /package/web/public/assets/{gruvbox-light-soft-BKHDJWWt.js → gruvbox-light-soft-CT6vuid9.js} +0 -0
- /package/web/public/assets/{haskell-C5VEzHiR.js → haskell-D62N_CAU.js} +0 -0
- /package/web/public/assets/{haxe-DxCG7g2C.js → haxe-DaOPEPd0.js} +0 -0
- /package/web/public/assets/{hcl-B-KEcm-b.js → hcl-CKZP2LV2.js} +0 -0
- /package/web/public/assets/{hjson-KcqWy6wG.js → hjson-ZrcQLLvz.js} +0 -0
- /package/web/public/assets/{hlsl-CU9ay1Rj.js → hlsl-tDveWUL8.js} +0 -0
- /package/web/public/assets/{houston-CH1dbl71.js → houston-DraBEKDe.js} +0 -0
- /package/web/public/assets/{hy-9kqolRdI.js → hy-B2TuzEnV.js} +0 -0
- /package/web/public/assets/{imba-AWBATAYY.js → imba-WHJcCHli.js} +0 -0
- /package/web/public/assets/{ini-P5JLg6LV.js → ini-WzVu4r_S.js} +0 -0
- /package/web/public/assets/{java-D0oQWejR.js → java-DWvpLZQg.js} +0 -0
- /package/web/public/assets/{javascript-CxVj7Jc3.js → javascript-rQslrTlU.js} +0 -0
- /package/web/public/assets/{json-EtpIiJca.js → json-BtCTWCCg.js} +0 -0
- /package/web/public/assets/{json5-Cj9weIvR.js → json5-uChlRsCy.js} +0 -0
- /package/web/public/assets/{jsonc-CwVZHrLL.js → jsonc-o1JbODDc.js} +0 -0
- /package/web/public/assets/{jsonl-CfYcxfNz.js → jsonl-DsFPqTWt.js} +0 -0
- /package/web/public/assets/{jsonnet-B351KcBZ.js → jsonnet-Do87PjDg.js} +0 -0
- /package/web/public/assets/{jssm-CVNVxyp8.js → jssm-DsKQKyHh.js} +0 -0
- /package/web/public/assets/{jsx-DK_2aoiX.js → jsx-CC-anpHJ.js} +0 -0
- /package/web/public/assets/{kanagawa-dragon-BjHcqwla.js → kanagawa-dragon-DILUCdKU.js} +0 -0
- /package/web/public/assets/{kanagawa-lotus-BtMeuNWW.js → kanagawa-lotus-B2Kuykzq.js} +0 -0
- /package/web/public/assets/{kanagawa-wave-BCUyH5oD.js → kanagawa-wave-CZqOKF3_.js} +0 -0
- /package/web/public/assets/{kdl-BwK60g80.js → kdl-B2a5Hdo5.js} +0 -0
- /package/web/public/assets/{kotlin-Dbd9Vi-v.js → kotlin-CwntYu9G.js} +0 -0
- /package/web/public/assets/{kusto-ex953Wvs.js → kusto-C7xLiDy1.js} +0 -0
- /package/web/public/assets/{laserwave-DDLF2HLL.js → laserwave-CLp9KmkC.js} +0 -0
- /package/web/public/assets/{lean-Dy5OcUX-.js → lean-C0OcwREI.js} +0 -0
- /package/web/public/assets/{less-D4uen21c.js → less-Dycz37IB.js} +0 -0
- /package/web/public/assets/{lib-Dc1_wrAX.js → lib-hFmyZdda.js} +0 -0
- /package/web/public/assets/{light-plus-S9OiFplU.js → light-plus-CASdk9mM.js} +0 -0
- /package/web/public/assets/{llvm-BA_FKqoX.js → llvm-subw26Uf.js} +0 -0
- /package/web/public/assets/{log-BGUxlsk3.js → log-CM4eTPwH.js} +0 -0
- /package/web/public/assets/{logo-wVUhvQ1b.js → logo-DCYIDlXZ.js} +0 -0
- /package/web/public/assets/{luau-IVIxedd2.js → luau-DJkYOK-N.js} +0 -0
- /package/web/public/assets/{make-BmPf6m0P.js → make-Bep3F-fA.js} +0 -0
- /package/web/public/assets/{markdown-eTx7AQ7x.js → markdown-DXxotAxn.js} +0 -0
- /package/web/public/assets/{material-theme-C2qrTJh3.js → material-theme-CfqmFDHZ.js} +0 -0
- /package/web/public/assets/{material-theme-darker-yeSCVODt.js → material-theme-darker-MsbnpuuF.js} +0 -0
- /package/web/public/assets/{material-theme-lighter-BNPkZFoP.js → material-theme-lighter-BTEEfJMo.js} +0 -0
- /package/web/public/assets/{material-theme-ocean-ChKI1Aff.js → material-theme-ocean-CBzqTWI5.js} +0 -0
- /package/web/public/assets/{material-theme-palenight-B7vumNwu.js → material-theme-palenight-RKraSPMB.js} +0 -0
- /package/web/public/assets/{matlab-BOj_BDQv.js → matlab-BjvFQgI4.js} +0 -0
- /package/web/public/assets/{mdx-Cm6cDkDI.js → mdx-DnKU9cqA.js} +0 -0
- /package/web/public/assets/{mermaid-DqM5g0pq.js → mermaid-PsCdFMP4.js} +0 -0
- /package/web/public/assets/{min-dark-CJhlVEH7.js → min-dark-Cv_rJJe3.js} +0 -0
- /package/web/public/assets/{min-light--7-PEYLd.js → min-light-adtpsoGt.js} +0 -0
- /package/web/public/assets/{mipsasm-DYpHF-GA.js → mipsasm-OAAwCDEg.js} +0 -0
- /package/web/public/assets/{mojo-COfWc10j.js → mojo-C98RG4zx.js} +0 -0
- /package/web/public/assets/{monokai-CbE9SdIz.js → monokai-R__67SiO.js} +0 -0
- /package/web/public/assets/{move-CVSiumye.js → move-BKs_wrSq.js} +0 -0
- /package/web/public/assets/{narrat-NioX5-_j.js → narrat-DXBAGtnK.js} +0 -0
- /package/web/public/assets/{nextflow-QC1Jp_kA.js → nextflow-DnO2XFP7.js} +0 -0
- /package/web/public/assets/{night-owl-C6yVJF2Q.js → night-owl-c-XUdzNN.js} +0 -0
- /package/web/public/assets/{nix-DOTTFI08.js → nix-DSVQz1Vb.js} +0 -0
- /package/web/public/assets/{nord-D3OhLmlk.js → nord-CfpzYV6O.js} +0 -0
- /package/web/public/assets/{nushell-Bm-Eoj_U.js → nushell-CW8y6_6S.js} +0 -0
- /package/web/public/assets/{objective-c-BOMijZ4c.js → objective-c-GRClK1S7.js} +0 -0
- /package/web/public/assets/{objective-cpp-CbvrehWN.js → objective-cpp-l3qYw-v5.js} +0 -0
- /package/web/public/assets/{ocaml-ik-NqCFm.js → ocaml-BBDyhyMH.js} +0 -0
- /package/web/public/assets/{one-dark-pro-BQwYNK-V.js → one-dark-pro-NuzFmTft.js} +0 -0
- /package/web/public/assets/{one-light-Bp-joYds.js → one-light-Cgxj9GbU.js} +0 -0
- /package/web/public/assets/{openscad-DbmtYX8R.js → openscad-DCmPLSXt.js} +0 -0
- /package/web/public/assets/{parsePatchFiles-BuO13j3v.js → parsePatchFiles-D3jLD0yV.js} +0 -0
- /package/web/public/assets/{pascal-BPYu8HR0.js → pascal-BMY45JJO.js} +0 -0
- /package/web/public/assets/{pierre-dark-Gtc9M_gS.js → pierre-dark-pqLturbW.js} +0 -0
- /package/web/public/assets/{pierre-light-EDxMHmhf.js → pierre-light-xEQF8aEA.js} +0 -0
- /package/web/public/assets/{pkl-qxepEfsD.js → pkl-ML-dWShO.js} +0 -0
- /package/web/public/assets/{plastic-xlIdlTab.js → plastic-Dm5h_fPp.js} +0 -0
- /package/web/public/assets/{plsql-B78xoJMt.js → plsql-0vd5cLro.js} +0 -0
- /package/web/public/assets/{po-CoMDg-5x.js → po-CbZ_uqQA.js} +0 -0
- /package/web/public/assets/{poimandres-D86B5bTz.js → poimandres-BMiDntUw.js} +0 -0
- /package/web/public/assets/{polar-BRmDPSGP.js → polar-C4hfV8Nc.js} +0 -0
- /package/web/public/assets/{postcss-BHCm7Qae.js → postcss-Ct0ld0vz.js} +0 -0
- /package/web/public/assets/{powerquery-Dm5a9IoW.js → powerquery-CTlGUQPj.js} +0 -0
- /package/web/public/assets/{powershell-BjmzcPTN.js → powershell-DyZsOmuq.js} +0 -0
- /package/web/public/assets/{prisma-Bd0_snUb.js → prisma-SS92PO_I.js} +0 -0
- /package/web/public/assets/{prolog-UaJ8cqTq.js → prolog-B1O1NNVC.js} +0 -0
- /package/web/public/assets/{proto-BemTv6Bq.js → proto-DSThcTAU.js} +0 -0
- /package/web/public/assets/{puppet-DF4VqKgy.js → puppet-tvtRVdr6.js} +0 -0
- /package/web/public/assets/{purescript-BJT-wLCH.js → purescript-Dtbpb7D-.js} +0 -0
- /package/web/public/assets/{python-B3yVAntA.js → python-D1NFioGW.js} +0 -0
- /package/web/public/assets/{qmldir-DtWLyrB6.js → qmldir-B-iEOngH.js} +0 -0
- /package/web/public/assets/{qss-DsrpEJaX.js → qss-Ba0p-aHw.js} +0 -0
- /package/web/public/assets/{r-4yEvCsNo.js → r-B7wiE8s0.js} +0 -0
- /package/web/public/assets/{racket-XY2Y45wx.js → racket-BXDsxf2U.js} +0 -0
- /package/web/public/assets/{raku-D3iN2fBx.js → raku-Dw1WWFXK.js} +0 -0
- /package/web/public/assets/{red-I5fLwuNS.js → red-KFYbzZV7.js} +0 -0
- /package/web/public/assets/{reg-CSHQTRsk.js → reg-DXFHGaM4.js} +0 -0
- /package/web/public/assets/{regexp-Cq-Qrxd6.js → regexp-B5tDXh-D.js} +0 -0
- /package/web/public/assets/{rel-D65xriOC.js → rel-Dc5_Ytx2.js} +0 -0
- /package/web/public/assets/{riscv-C1otibmh.js → riscv-ZgswiWij.js} +0 -0
- /package/web/public/assets/{rose-pine-Crsr1Wh6.js → rose-pine-CgpG0Wwm.js} +0 -0
- /package/web/public/assets/{rose-pine-dawn-BseHwNCh.js → rose-pine-dawn-DnQykvhA.js} +0 -0
- /package/web/public/assets/{rose-pine-moon-CTJjJU-f.js → rose-pine-moon-BxLEuV3_.js} +0 -0
- /package/web/public/assets/{rosmsg-BV7oEC-E.js → rosmsg-CcBwQf5j.js} +0 -0
- /package/web/public/assets/{rust-Ca_38JKc.js → rust-ppknoGus.js} +0 -0
- /package/web/public/assets/{sass-3Jwb14GH.js → sass-Baw41att.js} +0 -0
- /package/web/public/assets/{scala-CWwtO5O_.js → scala-DtlnBhKt.js} +0 -0
- /package/web/public/assets/{scheme-lOuCDGJc.js → scheme-DYQMayIi.js} +0 -0
- /package/web/public/assets/{sdbl-DmWX-P82.js → sdbl-B_1cHVNm.js} +0 -0
- /package/web/public/assets/{shellscript-DrB_N96g.js → shellscript-P32R2bme.js} +0 -0
- /package/web/public/assets/{slack-dark-BayPwCVM.js → slack-dark-DaitoxIJ.js} +0 -0
- /package/web/public/assets/{slack-ochin-BHVQSD4w.js → slack-ochin-CKzff-0L.js} +0 -0
- /package/web/public/assets/{smalltalk-CffKAivC.js → smalltalk-DRM3jr39.js} +0 -0
- /package/web/public/assets/{snazzy-light-BW8nJzRx.js → snazzy-light-Cfj-ApKF.js} +0 -0
- /package/web/public/assets/{solarized-dark-3dkbIcKM.js → solarized-dark-syg5rn82.js} +0 -0
- /package/web/public/assets/{solarized-light-D_iKV2-Z.js → solarized-light-BAea3eBG.js} +0 -0
- /package/web/public/assets/{solidity-q6T1qSBn.js → solidity-CYAp_sJG.js} +0 -0
- /package/web/public/assets/{splunk-CnHG51Wl.js → splunk-LsCTpuOP.js} +0 -0
- /package/web/public/assets/{sql-CFWVA4QB.js → sql-DBpDxsUe.js} +0 -0
- /package/web/public/assets/{ssh-config-tpfZ5PR3.js → ssh-config-QxQe7y21.js} +0 -0
- /package/web/public/assets/{stylus-C6-cY1Et.js → stylus-DZvi0832.js} +0 -0
- /package/web/public/assets/{swift-DwtgONLE.js → swift-CDjbPYoV.js} +0 -0
- /package/web/public/assets/{synthwave-84-B-ytnfkh.js → synthwave-84-7RM1a-o6.js} +0 -0
- /package/web/public/assets/{system-verilog-C-3uC-Vc.js → system-verilog-CYey0nam.js} +0 -0
- /package/web/public/assets/{systemd-C5TwcQRY.js → systemd-CP-_B7Hs.js} +0 -0
- /package/web/public/assets/{talonscript-dvJcRKQN.js → talonscript-KcJSLq0g.js} +0 -0
- /package/web/public/assets/{tasl-D2BFZx-U.js → tasl-UgGRncVE.js} +0 -0
- /package/web/public/assets/{tcl-aSJhsMVX.js → tcl-IEoxxKd9.js} +0 -0
- /package/web/public/assets/{terraform-D_tAWup-.js → terraform-PrLLnyiL.js} +0 -0
- /package/web/public/assets/{tokyo-night-CDKf-sdq.js → tokyo-night-CZ_TA08H.js} +0 -0
- /package/web/public/assets/{toml-CRhT2y7i.js → toml-W6nxcYtJ.js} +0 -0
- /package/web/public/assets/{tsv-DStxpcCr.js → tsv-BRx-N_Yl.js} +0 -0
- /package/web/public/assets/{tsx-OY4UwPsG.js → tsx-DsDbze4C.js} +0 -0
- /package/web/public/assets/{turtle-BSEJiBFZ.js → turtle-ZCrKgE8E.js} +0 -0
- /package/web/public/assets/{typescript-DwMe_b5N.js → typescript-y69KCpjV.js} +0 -0
- /package/web/public/assets/{typespec-CyCcmlcK.js → typespec-EjcUAk3i.js} +0 -0
- /package/web/public/assets/{typst-CLmYclOg.js → typst-BV1BGyWG.js} +0 -0
- /package/web/public/assets/{v-Bhb8K_N8.js → v-DsDLzPtW.js} +0 -0
- /package/web/public/assets/{vala-B-FTNUML.js → vala-Bs3vV05i.js} +0 -0
- /package/web/public/assets/{vb-3ZoibnYf.js → vb-CPJ4fJKa.js} +0 -0
- /package/web/public/assets/{verilog-CWwkQYXJ.js → verilog-sIfxvY5_.js} +0 -0
- /package/web/public/assets/{vesper-Dnn_ZQ4I.js → vesper-BdKAaT7q.js} +0 -0
- /package/web/public/assets/{vhdl-B2LcSxiS.js → vhdl-BWTyDzra.js} +0 -0
- /package/web/public/assets/{viml-DOrLkmuY.js → viml-CkzrUc36.js} +0 -0
- /package/web/public/assets/{vitesse-black-CaGwBPUU.js → vitesse-black-BkwYYrqu.js} +0 -0
- /package/web/public/assets/{vitesse-dark-PIVIzvpJ.js → vitesse-dark-Dr-0tRFe.js} +0 -0
- /package/web/public/assets/{vitesse-light-MdjLbxun.js → vitesse-light-Dwi9BR_i.js} +0 -0
- /package/web/public/assets/{vyper-BYZ02-QF.js → vyper-Ddg9ynNK.js} +0 -0
- /package/web/public/assets/{wasm-BqG9CUph.js → wasm-0ag0zszG.js} +0 -0
- /package/web/public/assets/{wasm-Cv4XAECo.js → wasm-xPljl98P.js} +0 -0
- /package/web/public/assets/{wenyan-qkaNnHss.js → wenyan-BVy5yENW.js} +0 -0
- /package/web/public/assets/{wgsl-sv8-wynF.js → wgsl-JVNN3zi8.js} +0 -0
- /package/web/public/assets/{wikitext-Cu72Vn0T.js → wikitext-CJsbZHwi.js} +0 -0
- /package/web/public/assets/{wit-n-57eWWN.js → wit-DEFTvUMf.js} +0 -0
- /package/web/public/assets/{wolfram-HLKUTjDF.js → wolfram-CrHN9vWl.js} +0 -0
- /package/web/public/assets/{yaml-pCWCy5TU.js → yaml-okado1J8.js} +0 -0
- /package/web/public/assets/{zenscript-CeFKqaq9.js → zenscript-CNDMZH8q.js} +0 -0
- /package/web/public/assets/{zig-DGyC_AQX.js → zig-DNDqsL3g.js} +0 -0
package/dist/index.js
CHANGED
|
@@ -273,8 +273,11 @@ var __dirname2 = dirname(__filename2);
|
|
|
273
273
|
var CONFIG_PATH = join(homedir(), ".portal.json");
|
|
274
274
|
var CONFIG_LOCK_PATH = `${CONFIG_PATH}.lock`;
|
|
275
275
|
var DEFAULT_HOSTNAME = "0.0.0.0";
|
|
276
|
+
var DEFAULT_CODEX_HOSTNAME = "127.0.0.1";
|
|
276
277
|
var DEFAULT_PORT = 3000;
|
|
277
278
|
var DEFAULT_OPENCODE_PORT = 4000;
|
|
279
|
+
var DEFAULT_CODEX_PORT = 4500;
|
|
280
|
+
var DEFAULT_CLAUDE_PORT = 4600;
|
|
278
281
|
var WEB_SERVER_PATH = join(__dirname2, "..", "web", "server", "index.mjs");
|
|
279
282
|
function readConfig() {
|
|
280
283
|
try {
|
|
@@ -282,6 +285,9 @@ function readConfig() {
|
|
|
282
285
|
const config = JSON.parse(readFileSync(CONFIG_PATH, "utf-8"));
|
|
283
286
|
config.instances = config.instances.map((instance) => ({
|
|
284
287
|
...instance,
|
|
288
|
+
provider: instance.provider ?? "opencode",
|
|
289
|
+
backendPort: instance.backendPort ?? instance.opencodePort,
|
|
290
|
+
backendPid: instance.backendPid ?? instance.opencodePid ?? null,
|
|
285
291
|
opencodePid: instance.opencodePid ?? null,
|
|
286
292
|
webPid: instance.webPid ?? null
|
|
287
293
|
}));
|
|
@@ -361,18 +367,51 @@ function isProcessRunning(pid) {
|
|
|
361
367
|
return false;
|
|
362
368
|
}
|
|
363
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
|
+
}
|
|
364
379
|
function isInstanceRunning(instance) {
|
|
365
|
-
|
|
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}`;
|
|
366
405
|
}
|
|
367
406
|
function printHelp() {
|
|
368
407
|
console.log(`
|
|
369
|
-
OpenPortal CLI - Run
|
|
408
|
+
OpenPortal CLI - Run coding agents with a web UI
|
|
370
409
|
|
|
371
410
|
Usage: openportal [command] [options]
|
|
372
411
|
|
|
373
412
|
Commands:
|
|
374
|
-
(default) Start
|
|
375
|
-
run [
|
|
413
|
+
(default) Start provider backend and Web UI
|
|
414
|
+
run [provider] Start only a provider backend (opencode, codex, or claude)
|
|
376
415
|
stop Stop running instances
|
|
377
416
|
list, ls List running instances
|
|
378
417
|
clean Clean up stale entries
|
|
@@ -381,15 +420,27 @@ Options:
|
|
|
381
420
|
-h, --help Show this help message
|
|
382
421
|
-d, --directory <path> Working directory (default: current directory)
|
|
383
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
|
|
384
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
|
|
385
431
|
--hostname <host> Hostname to bind (default: 0.0.0.0)
|
|
386
432
|
--name <name> Instance name
|
|
387
433
|
|
|
388
434
|
Examples:
|
|
389
435
|
openportal Start OpenCode + Web UI
|
|
436
|
+
openportal --provider codex Start Codex + Web UI
|
|
437
|
+
openportal --provider claude Start Claude + Web UI
|
|
390
438
|
openportal . Start OpenCode + Web UI in current dir
|
|
391
439
|
openportal run Start only OpenCode server
|
|
392
|
-
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
|
|
393
444
|
openportal --port 8080 Use custom web UI port
|
|
394
445
|
openportal stop Stop running instances
|
|
395
446
|
openportal list List running instances
|
|
@@ -428,6 +479,36 @@ function parseArgs() {
|
|
|
428
479
|
}
|
|
429
480
|
return { args, flags };
|
|
430
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
|
+
}
|
|
431
512
|
async function startOpenCodeServer(directory, opencodePort, hostname) {
|
|
432
513
|
console.log(`Starting OpenCode server...`);
|
|
433
514
|
const proc = Bun.spawn([
|
|
@@ -444,6 +525,30 @@ async function startOpenCodeServer(directory, opencodePort, hostname) {
|
|
|
444
525
|
});
|
|
445
526
|
return proc.pid;
|
|
446
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
|
+
}
|
|
447
552
|
async function startWebServer(port, hostname) {
|
|
448
553
|
console.log(`Starting Web UI server...`);
|
|
449
554
|
const proc = Bun.spawn(["bun", "run", WEB_SERVER_PATH], {
|
|
@@ -459,23 +564,53 @@ async function startWebServer(port, hostname) {
|
|
|
459
564
|
});
|
|
460
565
|
return proc.pid;
|
|
461
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
|
+
}
|
|
462
591
|
async function cmdDefault(options) {
|
|
592
|
+
const provider = getProviderOption(options);
|
|
463
593
|
const hostname = options.hostname || DEFAULT_HOSTNAME;
|
|
464
594
|
const directory = resolve(options.directory || options.d || process.cwd());
|
|
465
|
-
const name = options.name || directory.split("/").pop() ||
|
|
595
|
+
const name = options.name || directory.split("/").pop() || provider;
|
|
466
596
|
const port = options.port || options.p ? parseInt(options.port || options.p, 10) : await getPort({ host: hostname, port: DEFAULT_PORT });
|
|
467
|
-
const
|
|
468
|
-
const
|
|
469
|
-
|
|
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);
|
|
470
604
|
console.log(`OpenPortal is already running for this directory.`);
|
|
471
605
|
console.log(` Name: ${existing.name}`);
|
|
606
|
+
console.log(` Provider: ${existingProvider}`);
|
|
472
607
|
console.log(` Web UI Port: ${existing.port ?? "N/A"}`);
|
|
473
|
-
console.log(`
|
|
608
|
+
console.log(` ${existingProvider === "claude" ? "Instance Key" : "Backend Port"}: ${existingBackendPort}`);
|
|
474
609
|
if (existing.port) {
|
|
475
610
|
console.log(`
|
|
476
611
|
\uD83D\uDCF1 Access OpenPortal at http://${hostname === "0.0.0.0" ? "localhost" : hostname}:${existing.port}`);
|
|
477
612
|
}
|
|
478
|
-
console.log(`\uD83D\uDD27
|
|
613
|
+
console.log(`\uD83D\uDD27 ${backendName(existingProvider)} at ${backendLocation(existingProvider, backendHost, existingBackendPort)}`);
|
|
479
614
|
return;
|
|
480
615
|
}
|
|
481
616
|
if (!existsSync(WEB_SERVER_PATH)) {
|
|
@@ -485,36 +620,49 @@ async function cmdDefault(options) {
|
|
|
485
620
|
}
|
|
486
621
|
console.log(`Starting OpenPortal...`);
|
|
487
622
|
console.log(` Name: ${name}`);
|
|
623
|
+
console.log(` Provider: ${provider}`);
|
|
488
624
|
console.log(` Directory: ${directory}`);
|
|
489
625
|
console.log(` Web UI Port: ${port}`);
|
|
490
|
-
console.log(`
|
|
626
|
+
console.log(` ${provider === "claude" ? "Instance Key" : "Backend Port"}: ${backendPort}`);
|
|
491
627
|
console.log(` Hostname: ${hostname}`);
|
|
492
628
|
try {
|
|
493
|
-
const
|
|
629
|
+
const backendPid = await startBackendServer(provider, directory, backendPort, hostname);
|
|
494
630
|
const webPid = await startWebServer(port, hostname);
|
|
495
631
|
const instance = {
|
|
496
632
|
id: generateId(),
|
|
497
633
|
name,
|
|
498
634
|
directory,
|
|
499
635
|
port,
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
636
|
+
provider,
|
|
637
|
+
backendPort,
|
|
638
|
+
backendPid,
|
|
639
|
+
opencodePort: backendPort,
|
|
640
|
+
hostname: backendHost,
|
|
641
|
+
opencodePid: provider === "opencode" ? backendPid : null,
|
|
503
642
|
webPid,
|
|
504
|
-
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
|
+
} : {}
|
|
505
649
|
};
|
|
506
650
|
mutateConfig((config) => {
|
|
507
|
-
config.instances = config.instances.filter((i) => i.directory !== directory);
|
|
651
|
+
config.instances = config.instances.filter((i) => i.directory !== directory || getInstanceProvider(i) !== provider);
|
|
508
652
|
config.instances.push(instance);
|
|
509
653
|
});
|
|
510
654
|
const displayHost = hostname === "0.0.0.0" ? "localhost" : hostname;
|
|
511
655
|
console.log(`
|
|
512
656
|
\u2705 OpenPortal started!`);
|
|
513
|
-
|
|
657
|
+
if (backendPid) {
|
|
658
|
+
console.log(` ${providerName(provider)} PID: ${backendPid}`);
|
|
659
|
+
} else {
|
|
660
|
+
console.log(` ${backendName(provider)}: managed by Web UI`);
|
|
661
|
+
}
|
|
514
662
|
console.log(` Web UI PID: ${webPid}`);
|
|
515
663
|
console.log(`
|
|
516
664
|
\uD83D\uDCF1 Access OpenPortal at http://${displayHost}:${port}`);
|
|
517
|
-
console.log(`\uD83D\uDD27
|
|
665
|
+
console.log(`\uD83D\uDD27 ${backendName(provider)} at ${backendLocation(provider, backendHost, backendPort)}`);
|
|
518
666
|
} catch (error) {
|
|
519
667
|
if (error instanceof Error) {
|
|
520
668
|
console.error(`
|
|
@@ -523,50 +671,87 @@ async function cmdDefault(options) {
|
|
|
523
671
|
process.exit(1);
|
|
524
672
|
}
|
|
525
673
|
}
|
|
526
|
-
async function cmdRun(options) {
|
|
674
|
+
async function cmdRun(options, provider = getProviderOption(options)) {
|
|
527
675
|
const hostname = options.hostname || DEFAULT_HOSTNAME;
|
|
528
676
|
const directory = resolve(options.directory || options.d || process.cwd());
|
|
529
|
-
const name = options.name || directory.split("/").pop() ||
|
|
530
|
-
const
|
|
531
|
-
const
|
|
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);
|
|
532
681
|
if (existing && isInstanceRunning(existing)) {
|
|
533
|
-
|
|
682
|
+
const existingBackendPort = getInstanceBackendPort(existing);
|
|
683
|
+
console.log(`${providerName(provider)} is already running for this directory.`);
|
|
534
684
|
console.log(` Name: ${existing.name}`);
|
|
535
|
-
console.log(`
|
|
536
|
-
console.log(
|
|
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)}`);
|
|
537
688
|
return;
|
|
538
689
|
}
|
|
539
|
-
console.log(`Starting
|
|
690
|
+
console.log(provider === "claude" ? "Registering Claude SDK backend..." : `Starting ${backendName(provider)}...`);
|
|
540
691
|
console.log(` Name: ${name}`);
|
|
692
|
+
console.log(` Provider: ${provider}`);
|
|
541
693
|
console.log(` Directory: ${directory}`);
|
|
542
|
-
console.log(`
|
|
543
|
-
console.log(` Hostname: ${
|
|
694
|
+
console.log(` ${provider === "claude" ? "Instance Key" : "Backend Port"}: ${backendPort}`);
|
|
695
|
+
console.log(` Hostname: ${backendHost}`);
|
|
544
696
|
try {
|
|
545
|
-
|
|
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);
|
|
546
727
|
const instance = {
|
|
547
728
|
id: generateId(),
|
|
548
729
|
name,
|
|
549
730
|
directory,
|
|
550
731
|
port: null,
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
732
|
+
provider,
|
|
733
|
+
backendPort,
|
|
734
|
+
backendPid,
|
|
735
|
+
opencodePort: backendPort,
|
|
736
|
+
hostname: backendHost,
|
|
737
|
+
opencodePid: provider === "opencode" ? backendPid : null,
|
|
554
738
|
webPid: null,
|
|
555
739
|
startedAt: new Date().toISOString()
|
|
556
740
|
};
|
|
557
741
|
mutateConfig((config) => {
|
|
558
|
-
config.instances = config.instances.filter((i) => i.directory !== directory);
|
|
742
|
+
config.instances = config.instances.filter((i) => i.directory !== directory || getInstanceProvider(i) !== provider);
|
|
559
743
|
config.instances.push(instance);
|
|
560
744
|
});
|
|
561
|
-
const displayHost = hostname === "0.0.0.0" ? "localhost" : hostname;
|
|
562
745
|
console.log(`
|
|
563
|
-
\u2705
|
|
564
|
-
|
|
565
|
-
|
|
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)}`);
|
|
566
751
|
} catch (error) {
|
|
567
752
|
if (error instanceof Error) {
|
|
568
753
|
console.error(`
|
|
569
|
-
\u274C Failed to start
|
|
754
|
+
\u274C Failed to start ${providerName(provider)}: ${error.message}`);
|
|
570
755
|
}
|
|
571
756
|
process.exit(1);
|
|
572
757
|
}
|
|
@@ -584,12 +769,14 @@ async function cmdStop(options) {
|
|
|
584
769
|
console.error("No instance found.");
|
|
585
770
|
process.exit(1);
|
|
586
771
|
}
|
|
587
|
-
|
|
772
|
+
const provider = getInstanceProvider(removed);
|
|
773
|
+
const backendPid = getInstanceBackendPid(removed);
|
|
774
|
+
if (backendPid !== null) {
|
|
588
775
|
try {
|
|
589
|
-
process.kill(
|
|
590
|
-
console.log(`Stopped
|
|
776
|
+
process.kill(backendPid, "SIGTERM");
|
|
777
|
+
console.log(`Stopped ${providerName(provider)} (PID: ${backendPid})`);
|
|
591
778
|
} catch {
|
|
592
|
-
console.log(
|
|
779
|
+
console.log(`${providerName(provider)} was already stopped.`);
|
|
593
780
|
}
|
|
594
781
|
}
|
|
595
782
|
if (removed.webPid !== null) {
|
|
@@ -612,24 +799,30 @@ async function cmdList() {
|
|
|
612
799
|
console.log(`
|
|
613
800
|
OpenPortal Instances:
|
|
614
801
|
`);
|
|
615
|
-
console.log("ID\t\tNAME\t\t\tPORT\
|
|
802
|
+
console.log("ID\t\tNAME\t\t\tPROVIDER\tPORT\tBACKEND\tSTATUS\t\tDIRECTORY");
|
|
616
803
|
console.log("-".repeat(110));
|
|
617
804
|
const liveIds = new Set;
|
|
618
805
|
for (const instance of config.instances) {
|
|
619
|
-
const
|
|
806
|
+
const provider = getInstanceProvider(instance);
|
|
807
|
+
const backendRunning = isProcessRunning(getInstanceBackendPid(instance));
|
|
620
808
|
const webRunning = isProcessRunning(instance.webPid);
|
|
621
809
|
let status = "stopped";
|
|
622
|
-
if (
|
|
810
|
+
if (provider === "claude") {
|
|
811
|
+
if (webRunning)
|
|
812
|
+
status = "running";
|
|
813
|
+
else if (backendRunning)
|
|
814
|
+
status = "registered";
|
|
815
|
+
} else if (backendRunning && webRunning)
|
|
623
816
|
status = "running";
|
|
624
|
-
else if (
|
|
625
|
-
status =
|
|
817
|
+
else if (backendRunning)
|
|
818
|
+
status = provider;
|
|
626
819
|
else if (webRunning)
|
|
627
820
|
status = "web only";
|
|
628
|
-
if (
|
|
821
|
+
if (backendRunning || webRunning) {
|
|
629
822
|
liveIds.add(instance.id);
|
|
630
823
|
}
|
|
631
824
|
const portDisplay = instance.port ?? "-";
|
|
632
|
-
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}`);
|
|
633
826
|
}
|
|
634
827
|
if (liveIds.size !== config.instances.length) {
|
|
635
828
|
mutateConfig((latest) => {
|
|
@@ -664,17 +857,27 @@ async function main() {
|
|
|
664
857
|
return;
|
|
665
858
|
}
|
|
666
859
|
const command = args[0]?.toLowerCase();
|
|
667
|
-
|
|
860
|
+
const commandProvider = parseProvider(command);
|
|
861
|
+
if (!command || command === "." || command.startsWith("/") || command.startsWith("./") || commandProvider) {
|
|
668
862
|
if (command && command !== ".") {
|
|
669
|
-
|
|
863
|
+
if (commandProvider) {
|
|
864
|
+
flags.provider = commandProvider;
|
|
865
|
+
} else {
|
|
866
|
+
flags.directory = command;
|
|
867
|
+
}
|
|
670
868
|
}
|
|
671
869
|
await cmdDefault(flags);
|
|
672
870
|
return;
|
|
673
871
|
}
|
|
674
872
|
switch (command) {
|
|
675
|
-
case "run":
|
|
676
|
-
|
|
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);
|
|
677
879
|
break;
|
|
880
|
+
}
|
|
678
881
|
case "stop":
|
|
679
882
|
await cmdStop(flags);
|
|
680
883
|
break;
|
package/package.json
CHANGED
package/web/nitro.json
CHANGED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{i as e}from"./jsx-runtime-BE_tW6Ee.js";import{V as t}from"./lucide-oITxMZUb.js";import{F as n,N as r,_t as i,bt as a,d as o,dt as s,ht as c,m as l,ot as u,p as d,st as f,tt as p,x as m}from"./button-CoQU6poF.js";var h=e(t(),1),g=(0,h.createContext)(null),_={badInput:!1,customError:!1,patternMismatch:!1,rangeOverflow:!1,rangeUnderflow:!1,stepMismatch:!1,tooLong:!1,tooShort:!1,typeMismatch:!1,valueMissing:!1,valid:!0},v={..._,customError:!0,valid:!1},y={isInvalid:!1,validationDetails:_,validationErrors:[]},b=(0,h.createContext)({}),x=`__reactAriaFormValidationState`;function S(e){if(e.__reactAriaFormValidationState){let{realtimeValidation:t,displayValidation:n,updateValidation:r,resetValidation:i,commitValidation:a}=e[x];return{realtimeValidation:t,displayValidation:n,updateValidation:r,resetValidation:i,commitValidation:a}}return C(e)}function C(e){let{isInvalid:t,validationState:n,name:r,value:i,builtinValidation:a,validate:o,validationBehavior:s=`aria`}=e;n&&(t||=n===`invalid`);let c=t===void 0?null:{isInvalid:t,validationErrors:[],validationDetails:v},l=(0,h.useMemo)(()=>!o||i==null?null:E(T(o,i)),[o,i]);a?.validationDetails.valid&&(a=void 0);let u=(0,h.useContext)(b),d=(0,h.useMemo)(()=>r?Array.isArray(r)?r.flatMap(e=>w(u[e])):w(u[r]):[],[u,r]),[f,p]=(0,h.useState)(u),[m,g]=(0,h.useState)(!1);u!==f&&(p(u),g(!1));let _=(0,h.useMemo)(()=>E(m?[]:d),[m,d]),x=(0,h.useRef)(y),[S,C]=(0,h.useState)(y),O=(0,h.useRef)(y),k=()=>{if(!A)return;j(!1);let e=l||a||x.current;D(e,O.current)||(O.current=e,C(e))},[A,j]=(0,h.useState)(!1);return(0,h.useEffect)(k),{realtimeValidation:c||_||l||a||y,displayValidation:s===`native`?c||_||S:c||_||l||a||S,updateValidation(e){s===`aria`&&!D(S,e)?C(e):x.current=e},resetValidation(){let e=y;D(e,O.current)||(O.current=e,C(e)),s===`native`&&j(!1),g(!0)},commitValidation(){s===`native`&&j(!0),g(!0)}}}function w(e){return e?Array.isArray(e)?e:[e]:[]}function T(e,t){if(typeof e==`function`){let n=e(t);if(n&&typeof n!=`boolean`)return w(n)}return[]}function E(e){return e.length?{isInvalid:!0,validationErrors:e,validationDetails:v}:null}function D(e,t){return e===t?!0:!!e&&!!t&&e.isInvalid===t.isInvalid&&e.validationErrors.length===t.validationErrors.length&&e.validationErrors.every((e,n)=>e===t.validationErrors[n])&&Object.entries(e.validationDetails).every(([e,n])=>t.validationDetails[e]===n)}var O=(0,h.createContext)(null);function k(e){let{description:t,errorMessage:n,isInvalid:r,validationState:a}=e,{labelProps:s,fieldProps:l}=o(e),u=i([!!t,!!n,r,a]),d=i([!!t,!!n,r,a]);return l=c(l,{"aria-describedby":[u,d,e[`aria-describedby`]].filter(Boolean).join(` `)||void 0}),{labelProps:s,fieldProps:l,descriptionProps:{id:u},errorMessageProps:{id:d}}}function A(e,t,n){let i=r(e=>{n&&!e.defaultPrevented&&n(t)});(0,h.useEffect)(()=>{let t=e?.current?.form;return t?.addEventListener(`reset`,i),()=>{t?.removeEventListener(`reset`,i)}},[e])}function j(e,t,i){let{validationBehavior:o,focus:s}=e;a(()=>{if(o===`native`&&i?.current&&!i.current.disabled){let e=t.realtimeValidation.isInvalid?t.realtimeValidation.validationErrors.join(` `)||`Invalid value.`:``;i.current.setCustomValidity(e),i.current.hasAttribute(`title`)||(i.current.title=``),t.realtimeValidation.isInvalid||t.updateValidation(N(i.current))}});let c=(0,h.useRef)(!1),l=r(()=>{c.current||t.resetValidation()}),u=r(e=>{t.displayValidation.isInvalid||t.commitValidation();let r=i?.current?.form;!e.defaultPrevented&&i&&r&&P(r)===i.current&&(s?s():i.current?.focus(),n(`keyboard`)),e.preventDefault()}),d=r(()=>{t.commitValidation()});(0,h.useEffect)(()=>{let e=i?.current;if(!e)return;let t=e.form,n=t?.reset;return t&&(t.reset=()=>{c.current=!window.event||window.event.type===`message`&&p(window.event)instanceof MessagePort,n?.call(t),c.current=!1}),e.addEventListener(`invalid`,u),e.addEventListener(`change`,d),t?.addEventListener(`reset`,l),()=>{e.removeEventListener(`invalid`,u),e.removeEventListener(`change`,d),t?.removeEventListener(`reset`,l),t&&(t.reset=n)}},[i,o])}function M(e){let t=e.validity;return{badInput:t.badInput,customError:t.customError,patternMismatch:t.patternMismatch,rangeOverflow:t.rangeOverflow,rangeUnderflow:t.rangeUnderflow,stepMismatch:t.stepMismatch,tooLong:t.tooLong,tooShort:t.tooShort,typeMismatch:t.typeMismatch,valueMissing:t.valueMissing,valid:t.valid}}function N(e){return{isInvalid:!e.validity.valid,validationDetails:M(e),validationErrors:e.validationMessage?[e.validationMessage]:[]}}function P(e){for(let t=0;t<e.elements.length;t++){let n=e.elements[t];if(n.validity?.valid===!1)return n}return null}var F=(0,h.createContext)({}),I=(0,h.forwardRef)(function(e,t){[e,t]=u(e,t,F);let{isDisabled:n,isInvalid:r,isReadOnly:i,onHoverStart:a,onHoverChange:o,onHoverEnd:p,...m}=e;n??=!!e[`aria-disabled`]&&e[`aria-disabled`]!==`false`,r??=!!e[`aria-invalid`]&&e[`aria-invalid`]!==`false`;let{hoverProps:g,isHovered:_}=d({onHoverStart:a,onHoverChange:o,onHoverEnd:p,isDisabled:n}),{isFocused:v,isFocusVisible:y,focusProps:b}=l({within:!0}),x=f({...e,values:{isHovered:_,isFocusWithin:v,isFocusVisible:y,isDisabled:n,isInvalid:r},defaultClassName:`react-aria-Group`});return h.createElement(s.div,{...c(m,b,g),...x,ref:t,role:e.role??`group`,slot:e.slot??void 0,"data-focus-within":v||void 0,"data-hovered":_||void 0,"data-focus-visible":y||void 0,"data-disabled":n||void 0,"data-invalid":r||void 0,"data-readonly":i||void 0},x.children)}),L=(0,h.createContext)({}),R=e=>{let{onHoverStart:t,onHoverChange:n,onHoverEnd:r,...i}=e;return i},z=m(function(e,t){[e,t]=u(e,t,L);let{hoverProps:n,isHovered:r}=d({...e,isDisabled:e.disabled}),{isFocused:i,isFocusVisible:a,focusProps:o}=l({isTextInput:!0,autoFocus:e.autoFocus}),p=!!e[`aria-invalid`]&&e[`aria-invalid`]!==`false`,m=f({...e,values:{isHovered:r,isFocused:i,isFocusVisible:a,isDisabled:e.disabled||!1,isInvalid:p},defaultClassName:`react-aria-Input`});return h.createElement(s.input,{...c(R(e),o,n),...m,ref:t,"data-focused":i||void 0,"data-disabled":e.disabled||void 0,"data-hovered":r||void 0,"data-focus-visible":a||void 0,"data-invalid":p||void 0})});export{j as a,O as c,g as d,F as i,x as l,z as n,A as o,I as r,k as s,L as t,S as u};
|