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.
Files changed (406) hide show
  1. package/dist/index.js +258 -55
  2. package/package.json +1 -1
  3. package/web/nitro.json +1 -1
  4. package/web/public/assets/Input-CabuNR46.js +1 -0
  5. package/web/public/assets/_app-BuWZVanD.js +41 -0
  6. package/web/public/assets/_app-C7teCofH.js +1 -0
  7. package/web/public/assets/_id-qj9enZSf.js +37 -0
  8. package/web/public/assets/{angular-html-tYBVGGly.js → angular-html-CyxhxxC6.js} +1 -1
  9. package/web/public/assets/{angular-ts-Bt2cFJZh.js → angular-ts-DKwzvk_A.js} +1 -1
  10. package/web/public/assets/{apl-D7UjtY_t.js → apl-D9JhLyA8.js} +1 -1
  11. package/web/public/assets/{astro-Bn0abwOQ.js → astro-D35iUAk4.js} +1 -1
  12. package/web/public/assets/{blade-CihxQpr_.js → blade-CQ_yb9AJ.js} +1 -1
  13. package/web/public/assets/{breadcrumb-context-B3YglwWs.js → breadcrumb-context-BSiNOVxE.js} +1 -1
  14. package/web/public/assets/{bsl-BKETj7-F.js → bsl-BDVOE52A.js} +1 -1
  15. package/web/public/assets/{button-BwXxlJmo.js → button-CoQU6poF.js} +2 -2
  16. package/web/public/assets/{cairo-Bm1QXIgL.js → cairo-BDZ6TRZS.js} +1 -1
  17. package/web/public/assets/{cobol-fzIUfU2w.js → cobol-Cj7rLdF4.js} +1 -1
  18. package/web/public/assets/{coffee-dgVnJ94q.js → coffee-BEqQ7khn.js} +1 -1
  19. package/web/public/assets/{cpp-DlBarvJx.js → cpp-K58e7MPy.js} +1 -1
  20. package/web/public/assets/{crystal-DPdyMMKb.js → crystal-WvacFQuU.js} +1 -1
  21. package/web/public/assets/{diff-BIfGXO1H.js → diff-Bggc2a-A.js} +5 -5
  22. package/web/public/assets/{edge-DvOMU0HI.js → edge-C2YjZt3E.js} +1 -1
  23. package/web/public/assets/{elixir-iK-aYBAj.js → elixir-DGL2pFx1.js} +1 -1
  24. package/web/public/assets/{elm-C5hsl51h.js → elm-CrPEbkYU.js} +1 -1
  25. package/web/public/assets/{erb-CI326ZCF.js → erb-Pjl6MxSx.js} +1 -1
  26. package/web/public/assets/{erlang-Lh_bsUxs.js → erlang-cuhwpmsu.js} +1 -1
  27. package/web/public/assets/{field-CNYjTNih.js → field-BD1fYKgU.js} +1 -1
  28. package/web/public/assets/{fortran-fixed-form-By4uV00l.js → fortran-fixed-form-CS9qOEPh.js} +1 -1
  29. package/web/public/assets/{fsharp-C-Qeuhxq.js → fsharp-CQ5iYSPA.js} +1 -1
  30. package/web/public/assets/{gdresource-DPsh07f8.js → gdresource-BAudk4qB.js} +1 -1
  31. package/web/public/assets/{git-commit-BNVf7D3_.js → git-commit-6e79eN7Q.js} +1 -1
  32. package/web/public/assets/{git-rebase-BIZfUgsJ.js → git-rebase-0YNSjhVf.js} +1 -1
  33. package/web/public/assets/{glimmer-js-CcSxB70m.js → glimmer-js-BWHy9y50.js} +1 -1
  34. package/web/public/assets/{glimmer-ts-lBmudEJy.js → glimmer-ts-DX8iZiOc.js} +1 -1
  35. package/web/public/assets/{glsl-vJqP49sD.js → glsl-COW3sf6s.js} +1 -1
  36. package/web/public/assets/{graphql-CXLKnjj9.js → graphql-Dd2Tpr9E.js} +1 -1
  37. package/web/public/assets/{hack-BbuBzOS8.js → hack-DAJwWGZ4.js} +1 -1
  38. package/web/public/assets/{haml-EDAfFCO2.js → haml-t0kHqiMk.js} +1 -1
  39. package/web/public/assets/{handlebars-Ciwrn25b.js → handlebars-qamPNlYY.js} +1 -1
  40. package/web/public/assets/{html-DUYkrbwC.js → html-D_X3PCw-.js} +1 -1
  41. package/web/public/assets/{html-derivative-NBKo_PD-.js → html-derivative-CkXhljkj.js} +1 -1
  42. package/web/public/assets/{http-Dag2VdjG.js → http-Cy1i-1jR.js} +1 -1
  43. package/web/public/assets/{hurl-CSTE4pPR.js → hurl-BtIML1gH.js} +1 -1
  44. package/web/public/assets/{hxml-DlOl0PEf.js → hxml-BlbkePaW.js} +1 -1
  45. package/web/public/assets/index-2xA55Y4b.css +2 -0
  46. package/web/public/assets/index-DxX6GAcL.js +10 -0
  47. package/web/public/assets/input-BmSt5bV_.js +1 -0
  48. package/web/public/assets/instances-BrhvsiT6.js +1 -0
  49. package/web/public/assets/{jinja-BsyWcE95.js → jinja-C5RLRSh5.js} +1 -1
  50. package/web/public/assets/{jison-_rx2Ho-A.js → jison-CEtCKWto.js} +1 -1
  51. package/web/public/assets/{julia-CCJJT-JW.js → julia-DYZnQ9C_.js} +1 -1
  52. package/web/public/assets/{latex-Co-P5NWx.js → latex-DmbAavtk.js} +1 -1
  53. package/web/public/assets/{link-DOqotFDp.js → link-e2hDme49.js} +1 -1
  54. package/web/public/assets/{liquid-BYtAj9cp.js → liquid-DRMm6-P7.js} +1 -1
  55. package/web/public/assets/{lua-Cj1ZB8IY.js → lua-D5x9Ej0C.js} +1 -1
  56. package/web/public/assets/lucide-oITxMZUb.js +1 -0
  57. package/web/public/assets/{marko-D4sshstR.js → marko-BRjURZmp.js} +1 -1
  58. package/web/public/assets/{mdc-DMiSn-di.js → mdc-BORe-lTd.js} +1 -1
  59. package/web/public/assets/{nginx-D-dqvf7r.js → nginx--G2djEeU.js} +1 -1
  60. package/web/public/assets/{nim-Cyko-abd.js → nim-Bg97nylc.js} +1 -1
  61. package/web/public/assets/{perl-DaTblz0l.js → perl-BObf9N37.js} +1 -1
  62. package/web/public/assets/{php-BPoBt8_6.js → php-inqyeXtA.js} +1 -1
  63. package/web/public/assets/{popover-CRR_NOES.js → popover-D7DqQzYd.js} +2 -2
  64. package/web/public/assets/{pug-C-YQyY8x.js → pug-CyUw5FPt.js} +1 -1
  65. package/web/public/assets/{qml-D8Rfk3Lb.js → qml-IWAIEnkZ.js} +1 -1
  66. package/web/public/assets/{razor-ouagoKWa.js → razor-DHWbGfqh.js} +1 -1
  67. package/web/public/assets/{rst-PkFRPdn9.js → rst-BOV1Iu5T.js} +1 -1
  68. package/web/public/assets/{ruby-B_aIajfM.js → ruby-MEoEfPKM.js} +1 -1
  69. package/web/public/assets/{sas-DW15znt6.js → sas-Dxq9CzH7.js} +1 -1
  70. package/web/public/assets/{scss-CieAHW_V.js → scss-BMjNhvSM.js} +1 -1
  71. package/web/public/assets/settings-BtPmV_Mc.js +1 -0
  72. package/web/public/assets/{shaderlab-Cg-cNaa-.js → shaderlab-BiweuU0M.js} +1 -1
  73. package/web/public/assets/{shellsession--I7Uz6My.js → shellsession-BlrJ09y9.js} +1 -1
  74. package/web/public/assets/{soy-ziRqYDcy.js → soy-BpQ0SMiq.js} +1 -1
  75. package/web/public/assets/{sparql-CRKvL8Qo.js → sparql-J1VOnnwM.js} +1 -1
  76. package/web/public/assets/{stata-C-5qfhys.js → stata-DC5z9YAe.js} +1 -1
  77. package/web/public/assets/{svelte-B6BW65xu.js → svelte-CF6QDu1s.js} +1 -1
  78. package/web/public/assets/{templ-PEIZqAK1.js → templ-tkdPKNAc.js} +1 -1
  79. package/web/public/assets/{tex-D2mC87Vl.js → tex-Bt2c8D58.js} +1 -1
  80. package/web/public/assets/{ts-tags-RFn1CcJv.js → ts-tags-B6ZGEqrj.js} +1 -1
  81. package/web/public/assets/{twig-BVylsIfB.js → twig-DRzX5__m.js} +1 -1
  82. package/web/public/assets/{use-media-query-DJ49EUkO.js → use-media-query-DDfzZruf.js} +1 -1
  83. package/web/public/assets/use-opencode-C9VP1bV0.js +1 -0
  84. package/web/public/assets/use-session-messages-Cd5WPqmc.js +4 -0
  85. package/web/public/assets/{useNavigate-CHiJUiGj.js → useNavigate-CwkeBifN.js} +1 -1
  86. package/web/public/assets/useTextField-4MIBK5lD.js +1 -0
  87. package/web/public/assets/{vue-s3Ia2KDE.js → vue-C1vQecwS.js} +1 -1
  88. package/web/public/assets/{vue-html-DDGKH-ua.js → vue-html-BrJuM9_k.js} +1 -1
  89. package/web/public/assets/{vue-vine-YrT0fNHh.js → vue-vine-eoaT5X-O.js} +1 -1
  90. package/web/public/assets/{xml-Cs6nNM2A.js → xml-CK_MCESO.js} +1 -1
  91. package/web/public/assets/{xsl-7GSlcAnI.js → xsl-CGwehH9h.js} +1 -1
  92. package/web/server/_chunks/error-message.mjs +32 -0
  93. package/web/server/_chunks/renderer-template.mjs +1 -1
  94. package/web/server/_libs/anthropic-ai__claude-agent-sdk.mjs +27103 -0
  95. package/web/server/_routes/api/claude/[port]/agents.mjs +10 -0
  96. package/web/server/_routes/api/claude/[port]/config.mjs +9 -0
  97. package/web/server/_routes/api/claude/[port]/events.mjs +30 -0
  98. package/web/server/_routes/api/claude/[port]/files/search.mjs +11 -0
  99. package/web/server/_routes/api/claude/[port]/git/diff.mjs +9 -0
  100. package/web/server/_routes/api/claude/[port]/health.mjs +9 -0
  101. package/web/server/_routes/api/claude/[port]/permission/[requestId]/reply.mjs +22 -0
  102. package/web/server/_routes/api/claude/[port]/permissions.mjs +9 -0
  103. package/web/server/_routes/api/claude/[port]/project/current.mjs +9 -0
  104. package/web/server/_routes/api/claude/[port]/providers.mjs +9 -0
  105. package/web/server/_routes/api/claude/[port]/question/[requestId]/reject.mjs +12 -0
  106. package/web/server/_routes/api/claude/[port]/question/[requestId]/reply.mjs +15 -0
  107. package/web/server/_routes/api/claude/[port]/questions.mjs +9 -0
  108. package/web/server/_routes/api/claude/[port]/session/[id]/abort.mjs +15 -0
  109. package/web/server/_routes/api/claude/[port]/session/[id]/messages.mjs +11 -0
  110. package/web/server/_routes/api/claude/[port]/session/[id]/prompt.mjs +55 -0
  111. package/web/server/_routes/api/claude/[port]/session/[id].mjs +11 -0
  112. package/web/server/_routes/api/claude/[port]/session/[id]2.mjs +11 -0
  113. package/web/server/_routes/api/claude/[port]/session/create.mjs +16 -0
  114. package/web/server/_routes/api/claude/[port]/session/status.mjs +9 -0
  115. package/web/server/_routes/api/claude/[port]/sessions.mjs +9 -0
  116. package/web/server/_routes/api/codex/[port]/agents.mjs +10 -0
  117. package/web/server/_routes/api/codex/[port]/config.mjs +9 -0
  118. package/web/server/_routes/api/codex/[port]/events.mjs +30 -0
  119. package/web/server/_routes/api/codex/[port]/files/search.mjs +19 -0
  120. package/web/server/_routes/api/codex/[port]/git/diff.mjs +26 -0
  121. package/web/server/_routes/api/codex/[port]/health.mjs +13 -0
  122. package/web/server/_routes/api/codex/[port]/permission/[requestId]/reply.mjs +22 -0
  123. package/web/server/_routes/api/codex/[port]/permissions.mjs +9 -0
  124. package/web/server/_routes/api/codex/[port]/project/current.mjs +9 -0
  125. package/web/server/_routes/api/codex/[port]/providers.mjs +30 -0
  126. package/web/server/_routes/api/codex/[port]/question/[requestId]/reject.mjs +12 -0
  127. package/web/server/_routes/api/codex/[port]/question/[requestId]/reply.mjs +15 -0
  128. package/web/server/_routes/api/codex/[port]/questions.mjs +9 -0
  129. package/web/server/_routes/api/codex/[port]/session/[id]/abort.mjs +28 -0
  130. package/web/server/_routes/api/codex/[port]/session/[id]/messages.mjs +22 -0
  131. package/web/server/_routes/api/codex/[port]/session/[id]/prompt.mjs +80 -0
  132. package/web/server/_routes/api/codex/[port]/session/[id].mjs +12 -0
  133. package/web/server/_routes/api/codex/[port]/session/[id]2.mjs +14 -0
  134. package/web/server/_routes/api/codex/[port]/session/create.mjs +24 -0
  135. package/web/server/_routes/api/codex/[port]/session/status.mjs +16 -0
  136. package/web/server/_routes/api/codex/[port]/sessions.mjs +12 -0
  137. package/web/server/_routes/api/instances.mjs +152 -27
  138. package/web/server/_routes/api/lib/claude_client.mjs +875 -0
  139. package/web/server/_routes/api/lib/codex_client.mjs +687 -0
  140. package/web/server/_routes/api/lib/opencode_client.mjs +2 -2
  141. package/web/server/_routes/api/lib/process_cwd.mjs +91 -0
  142. package/web/server/_routes/api/opencode/[port]/agents.mjs +1 -1
  143. package/web/server/_routes/api/opencode/[port]/config.mjs +1 -1
  144. package/web/server/_routes/api/opencode/[port]/events.mjs +1 -1
  145. package/web/server/_routes/api/opencode/[port]/files/search.mjs +1 -1
  146. package/web/server/_routes/api/opencode/[port]/git/diff.mjs +1 -1
  147. package/web/server/_routes/api/opencode/[port]/health.mjs +1 -1
  148. package/web/server/_routes/api/opencode/[port]/permission/[requestId]/reply.mjs +1 -1
  149. package/web/server/_routes/api/opencode/[port]/permissions.mjs +1 -1
  150. package/web/server/_routes/api/opencode/[port]/project/current.mjs +1 -1
  151. package/web/server/_routes/api/opencode/[port]/providers.mjs +1 -1
  152. package/web/server/_routes/api/opencode/[port]/question/[requestId]/reject.mjs +1 -1
  153. package/web/server/_routes/api/opencode/[port]/question/[requestId]/reply.mjs +1 -1
  154. package/web/server/_routes/api/opencode/[port]/questions.mjs +1 -1
  155. package/web/server/_routes/api/opencode/[port]/session/[id]/abort.mjs +1 -1
  156. package/web/server/_routes/api/opencode/[port]/session/[id]/messages.mjs +1 -1
  157. package/web/server/_routes/api/opencode/[port]/session/[id]/prompt.mjs +14 -7
  158. package/web/server/_routes/api/opencode/[port]/session/[id].mjs +1 -1
  159. package/web/server/_routes/api/opencode/[port]/session/[id]2.mjs +1 -1
  160. package/web/server/_routes/api/opencode/[port]/session/create.mjs +1 -1
  161. package/web/server/_routes/api/opencode/[port]/session/status.mjs +1 -1
  162. package/web/server/_routes/api/opencode/[port]/sessions.mjs +1 -1
  163. package/web/server/index.mjs +1780 -1306
  164. package/web/public/assets/_app-Bx3mWCTp.js +0 -1
  165. package/web/public/assets/_app-DgHMSgay.js +0 -41
  166. package/web/public/assets/_id-C9ATpjbp.js +0 -37
  167. package/web/public/assets/index-BNen-9-N.css +0 -2
  168. package/web/public/assets/index-CXZ33Z-X.js +0 -10
  169. package/web/public/assets/instances-B2NvyI6f.js +0 -1
  170. package/web/public/assets/inter-cyrillic-ext-wght-normal-BOeWTOD4.woff2 +0 -0
  171. package/web/public/assets/inter-cyrillic-wght-normal-DqGufNeO.woff2 +0 -0
  172. package/web/public/assets/inter-greek-ext-wght-normal-DlzME5K_.woff2 +0 -0
  173. package/web/public/assets/inter-greek-wght-normal-CkhJZR-_.woff2 +0 -0
  174. package/web/public/assets/inter-latin-ext-wght-normal-DO1Apj_S.woff2 +0 -0
  175. package/web/public/assets/inter-latin-wght-normal-Dx4kXJAl.woff2 +0 -0
  176. package/web/public/assets/inter-vietnamese-wght-normal-CBcvBZtf.woff2 +0 -0
  177. package/web/public/assets/lucide-BTUlgFgW.js +0 -1
  178. package/web/public/assets/select-CvO3JtqA.js +0 -1
  179. package/web/public/assets/settings-B0-RWpao.js +0 -1
  180. package/web/public/assets/use-session-messages--pfdFXZh.js +0 -4
  181. package/web/public/assets/useMatch-CKjponJB.js +0 -1
  182. /package/web/public/assets/{abap-cWYhO34H.js → abap-BYgfS2J7.js} +0 -0
  183. /package/web/public/assets/{about-BxxiVFq8.js → about-B4D-YQvu.js} +0 -0
  184. /package/web/public/assets/{actionscript-3-oRNhS_cT.js → actionscript-3-CWRCR4iE.js} +0 -0
  185. /package/web/public/assets/{ada-C0C0SoYB.js → ada-C49PBMn9.js} +0 -0
  186. /package/web/public/assets/{andromeeda-DijoPaKL.js → andromeeda-BBhAo6p7.js} +0 -0
  187. /package/web/public/assets/{apache-DBwBm4bB.js → apache-BIH3t0yU.js} +0 -0
  188. /package/web/public/assets/{apex-CXRs1L9t.js → apex-ChBAwGH0.js} +0 -0
  189. /package/web/public/assets/{applescript-hQs8VNpS.js → applescript-F6IQpFHw.js} +0 -0
  190. /package/web/public/assets/{ara-BOadBOZg.js → ara-C7jg9iGE.js} +0 -0
  191. /package/web/public/assets/{asciidoc-B8GRwlcK.js → asciidoc-BNeev37S.js} +0 -0
  192. /package/web/public/assets/{asm-C2vUqzqz.js → asm-C_FYSSlO.js} +0 -0
  193. /package/web/public/assets/{aurora-x-D8CoY9RX.js → aurora-x-BrXKjfbm.js} +0 -0
  194. /package/web/public/assets/{awk-D4e-eeZT.js → awk-Dhzptovp.js} +0 -0
  195. /package/web/public/assets/{ayu-dark-BJ1wuoej.js → ayu-dark-Bc6YaM0t.js} +0 -0
  196. /package/web/public/assets/{ballerina-BzvFqbha.js → ballerina-BMtRaYfJ.js} +0 -0
  197. /package/web/public/assets/{bat-CFyw2ERn.js → bat-C-_iWjni.js} +0 -0
  198. /package/web/public/assets/{beancount-a6Gsu5WX.js → beancount-SMCafKaA.js} +0 -0
  199. /package/web/public/assets/{berry-C2jyz4Ah.js → berry-B1oQ9RhK.js} +0 -0
  200. /package/web/public/assets/{bibtex-Dyet-B83.js → bibtex-BH2gsObK.js} +0 -0
  201. /package/web/public/assets/{bicep-CghvUIvy.js → bicep-CzfNgsCD.js} +0 -0
  202. /package/web/public/assets/{c-B0n6eOZ6.js → c-DP4PuxsC.js} +0 -0
  203. /package/web/public/assets/{cadence-CONiM5ZJ.js → cadence-BPDgYNWy.js} +0 -0
  204. /package/web/public/assets/{catppuccin-frappe-BSTaQ0EA.js → catppuccin-frappe-D5TUFPbv.js} +0 -0
  205. /package/web/public/assets/{catppuccin-latte-CJvpSF0g.js → catppuccin-latte-wUX3NN1_.js} +0 -0
  206. /package/web/public/assets/{catppuccin-macchiato-5S4j0Hfd.js → catppuccin-macchiato-DXVcU9LJ.js} +0 -0
  207. /package/web/public/assets/{catppuccin-mocha-CqCcNZ-i.js → catppuccin-mocha-CofYr3Sw.js} +0 -0
  208. /package/web/public/assets/{clarity-8uYwFS0g.js → clarity-Cmao5KSK.js} +0 -0
  209. /package/web/public/assets/{clojure-B91hPl1J.js → clojure-D2dPuTkk.js} +0 -0
  210. /package/web/public/assets/{cmake-CLvI-L08.js → cmake-DaqQuj4A.js} +0 -0
  211. /package/web/public/assets/{codeowners-CQ0GhFko.js → codeowners-B748jmvc.js} +0 -0
  212. /package/web/public/assets/{codeql-DfO2RO4c.js → codeql-CXb_8gHR.js} +0 -0
  213. /package/web/public/assets/{common-lisp-Dxsy__BF.js → common-lisp-UZn9nc_5.js} +0 -0
  214. /package/web/public/assets/{coq-BEB_SJbO.js → coq-DtO6yBIf.js} +0 -0
  215. /package/web/public/assets/{csharp-Db9xj6ZZ.js → csharp-BnPoTBy3.js} +0 -0
  216. /package/web/public/assets/{css-Ctd6TcjM.js → css-D8-m18hd.js} +0 -0
  217. /package/web/public/assets/{csv-CjsQX1YE.js → csv-BBwiVr0X.js} +0 -0
  218. /package/web/public/assets/{cue-Brer6idk.js → cue-ScBFXY5f.js} +0 -0
  219. /package/web/public/assets/{cypher-t9UY6Shl.js → cypher-CGStaC1X.js} +0 -0
  220. /package/web/public/assets/{d-CUrh2xWw.js → d-CuTCIvnX.js} +0 -0
  221. /package/web/public/assets/{dark-plus-BipXJdiu.js → dark-plus-B3ok_MHp.js} +0 -0
  222. /package/web/public/assets/{dart-CGSq4we3.js → dart-CqEodbm2.js} +0 -0
  223. /package/web/public/assets/{dax-d2Al1_rU.js → dax-UdE5S0Dh.js} +0 -0
  224. /package/web/public/assets/{desktop-CWvOdYyW.js → desktop-DfmsfHJA.js} +0 -0
  225. /package/web/public/assets/{diff-Dv7n7lNd.js → diff-CW0RWGd9.js} +0 -0
  226. /package/web/public/assets/{docker-CtUqO3OU.js → docker-B1qtW4ha.js} +0 -0
  227. /package/web/public/assets/{dotenv-2LOM2hac.js → dotenv-BUzOh1k8.js} +0 -0
  228. /package/web/public/assets/{dracula-rRmBdd8R.js → dracula-NHy-p_Sb.js} +0 -0
  229. /package/web/public/assets/{dracula-soft-CHy0pPYg.js → dracula-soft-Dd1um8Q4.js} +0 -0
  230. /package/web/public/assets/{dream-maker-SPySPaGW.js → dream-maker-CBvk18nW.js} +0 -0
  231. /package/web/public/assets/{emacs-lisp-CXsFziPU.js → emacs-lisp-DvSgLhDc.js} +0 -0
  232. /package/web/public/assets/{everforest-dark-CykMLuzs.js → everforest-dark-BdLm24PG.js} +0 -0
  233. /package/web/public/assets/{everforest-light-CpVrrr0x.js → everforest-light-Cgvecm8J.js} +0 -0
  234. /package/web/public/assets/{fennel-BabMDVkY.js → fennel-C-1kWlGf.js} +0 -0
  235. /package/web/public/assets/{fish-xyAFhjKI.js → fish-CCpdtwqS.js} +0 -0
  236. /package/web/public/assets/{fluent-54nGyXmc.js → fluent-BLg032oD.js} +0 -0
  237. /package/web/public/assets/{fortran-free-form-AY5m6gNy.js → fortran-free-form-DIFTDnRp.js} +0 -0
  238. /package/web/public/assets/{gdscript-iJ71dLLS.js → gdscript-BLGfbRse.js} +0 -0
  239. /package/web/public/assets/{gdshader-COD-4C51.js → gdshader-D4XNAEs9.js} +0 -0
  240. /package/web/public/assets/{genie-D2zj675s.js → genie-DmN-ICAN.js} +0 -0
  241. /package/web/public/assets/{gherkin-C-x-qfU_.js → gherkin-cuHHmRcX.js} +0 -0
  242. /package/web/public/assets/{github-dark-DskMQXcy.js → github-dark-BDEAeF5S.js} +0 -0
  243. /package/web/public/assets/{github-dark-default-CKKGJpm5.js → github-dark-default-B-VFdUi6.js} +0 -0
  244. /package/web/public/assets/{github-dark-dimmed-ywk1Z1Hc.js → github-dark-dimmed-2DcdHZGe.js} +0 -0
  245. /package/web/public/assets/{github-dark-high-contrast-DXBnpOEd.js → github-dark-high-contrast-AfozBrrn.js} +0 -0
  246. /package/web/public/assets/{github-light-CKm9zhSR.js → github-light-B_HSK8-e.js} +0 -0
  247. /package/web/public/assets/{github-light-default-A5tU6qEQ.js → github-light-default-DMQ1Mkip.js} +0 -0
  248. /package/web/public/assets/{github-light-high-contrast-DgXlJLHk.js → github-light-high-contrast-B9a-IAhW.js} +0 -0
  249. /package/web/public/assets/{gleam-yEn05q-o.js → gleam-D8VhqPDN.js} +0 -0
  250. /package/web/public/assets/{gnuplot-C40vWoS_.js → gnuplot-CsDpqO9X.js} +0 -0
  251. /package/web/public/assets/{go-DccdSYyo.js → go-BKDYqdrY.js} +0 -0
  252. /package/web/public/assets/{groovy-42TXi0JD.js → groovy-Bi4Ll6no.js} +0 -0
  253. /package/web/public/assets/{gruvbox-dark-hard-BlUzB-ID.js → gruvbox-dark-hard-uWDvDB_Y.js} +0 -0
  254. /package/web/public/assets/{gruvbox-dark-medium-yOGwRy_J.js → gruvbox-dark-medium-07z7e6Pn.js} +0 -0
  255. /package/web/public/assets/{gruvbox-dark-soft-Df4UJJBE.js → gruvbox-dark-soft-Bd5D-IiK.js} +0 -0
  256. /package/web/public/assets/{gruvbox-light-hard-D3rD9jDI.js → gruvbox-light-hard-Co4Cca5U.js} +0 -0
  257. /package/web/public/assets/{gruvbox-light-medium-Dlem6WY4.js → gruvbox-light-medium-D4j8sDK2.js} +0 -0
  258. /package/web/public/assets/{gruvbox-light-soft-BKHDJWWt.js → gruvbox-light-soft-CT6vuid9.js} +0 -0
  259. /package/web/public/assets/{haskell-C5VEzHiR.js → haskell-D62N_CAU.js} +0 -0
  260. /package/web/public/assets/{haxe-DxCG7g2C.js → haxe-DaOPEPd0.js} +0 -0
  261. /package/web/public/assets/{hcl-B-KEcm-b.js → hcl-CKZP2LV2.js} +0 -0
  262. /package/web/public/assets/{hjson-KcqWy6wG.js → hjson-ZrcQLLvz.js} +0 -0
  263. /package/web/public/assets/{hlsl-CU9ay1Rj.js → hlsl-tDveWUL8.js} +0 -0
  264. /package/web/public/assets/{houston-CH1dbl71.js → houston-DraBEKDe.js} +0 -0
  265. /package/web/public/assets/{hy-9kqolRdI.js → hy-B2TuzEnV.js} +0 -0
  266. /package/web/public/assets/{imba-AWBATAYY.js → imba-WHJcCHli.js} +0 -0
  267. /package/web/public/assets/{ini-P5JLg6LV.js → ini-WzVu4r_S.js} +0 -0
  268. /package/web/public/assets/{java-D0oQWejR.js → java-DWvpLZQg.js} +0 -0
  269. /package/web/public/assets/{javascript-CxVj7Jc3.js → javascript-rQslrTlU.js} +0 -0
  270. /package/web/public/assets/{json-EtpIiJca.js → json-BtCTWCCg.js} +0 -0
  271. /package/web/public/assets/{json5-Cj9weIvR.js → json5-uChlRsCy.js} +0 -0
  272. /package/web/public/assets/{jsonc-CwVZHrLL.js → jsonc-o1JbODDc.js} +0 -0
  273. /package/web/public/assets/{jsonl-CfYcxfNz.js → jsonl-DsFPqTWt.js} +0 -0
  274. /package/web/public/assets/{jsonnet-B351KcBZ.js → jsonnet-Do87PjDg.js} +0 -0
  275. /package/web/public/assets/{jssm-CVNVxyp8.js → jssm-DsKQKyHh.js} +0 -0
  276. /package/web/public/assets/{jsx-DK_2aoiX.js → jsx-CC-anpHJ.js} +0 -0
  277. /package/web/public/assets/{kanagawa-dragon-BjHcqwla.js → kanagawa-dragon-DILUCdKU.js} +0 -0
  278. /package/web/public/assets/{kanagawa-lotus-BtMeuNWW.js → kanagawa-lotus-B2Kuykzq.js} +0 -0
  279. /package/web/public/assets/{kanagawa-wave-BCUyH5oD.js → kanagawa-wave-CZqOKF3_.js} +0 -0
  280. /package/web/public/assets/{kdl-BwK60g80.js → kdl-B2a5Hdo5.js} +0 -0
  281. /package/web/public/assets/{kotlin-Dbd9Vi-v.js → kotlin-CwntYu9G.js} +0 -0
  282. /package/web/public/assets/{kusto-ex953Wvs.js → kusto-C7xLiDy1.js} +0 -0
  283. /package/web/public/assets/{laserwave-DDLF2HLL.js → laserwave-CLp9KmkC.js} +0 -0
  284. /package/web/public/assets/{lean-Dy5OcUX-.js → lean-C0OcwREI.js} +0 -0
  285. /package/web/public/assets/{less-D4uen21c.js → less-Dycz37IB.js} +0 -0
  286. /package/web/public/assets/{lib-Dc1_wrAX.js → lib-hFmyZdda.js} +0 -0
  287. /package/web/public/assets/{light-plus-S9OiFplU.js → light-plus-CASdk9mM.js} +0 -0
  288. /package/web/public/assets/{llvm-BA_FKqoX.js → llvm-subw26Uf.js} +0 -0
  289. /package/web/public/assets/{log-BGUxlsk3.js → log-CM4eTPwH.js} +0 -0
  290. /package/web/public/assets/{logo-wVUhvQ1b.js → logo-DCYIDlXZ.js} +0 -0
  291. /package/web/public/assets/{luau-IVIxedd2.js → luau-DJkYOK-N.js} +0 -0
  292. /package/web/public/assets/{make-BmPf6m0P.js → make-Bep3F-fA.js} +0 -0
  293. /package/web/public/assets/{markdown-eTx7AQ7x.js → markdown-DXxotAxn.js} +0 -0
  294. /package/web/public/assets/{material-theme-C2qrTJh3.js → material-theme-CfqmFDHZ.js} +0 -0
  295. /package/web/public/assets/{material-theme-darker-yeSCVODt.js → material-theme-darker-MsbnpuuF.js} +0 -0
  296. /package/web/public/assets/{material-theme-lighter-BNPkZFoP.js → material-theme-lighter-BTEEfJMo.js} +0 -0
  297. /package/web/public/assets/{material-theme-ocean-ChKI1Aff.js → material-theme-ocean-CBzqTWI5.js} +0 -0
  298. /package/web/public/assets/{material-theme-palenight-B7vumNwu.js → material-theme-palenight-RKraSPMB.js} +0 -0
  299. /package/web/public/assets/{matlab-BOj_BDQv.js → matlab-BjvFQgI4.js} +0 -0
  300. /package/web/public/assets/{mdx-Cm6cDkDI.js → mdx-DnKU9cqA.js} +0 -0
  301. /package/web/public/assets/{mermaid-DqM5g0pq.js → mermaid-PsCdFMP4.js} +0 -0
  302. /package/web/public/assets/{min-dark-CJhlVEH7.js → min-dark-Cv_rJJe3.js} +0 -0
  303. /package/web/public/assets/{min-light--7-PEYLd.js → min-light-adtpsoGt.js} +0 -0
  304. /package/web/public/assets/{mipsasm-DYpHF-GA.js → mipsasm-OAAwCDEg.js} +0 -0
  305. /package/web/public/assets/{mojo-COfWc10j.js → mojo-C98RG4zx.js} +0 -0
  306. /package/web/public/assets/{monokai-CbE9SdIz.js → monokai-R__67SiO.js} +0 -0
  307. /package/web/public/assets/{move-CVSiumye.js → move-BKs_wrSq.js} +0 -0
  308. /package/web/public/assets/{narrat-NioX5-_j.js → narrat-DXBAGtnK.js} +0 -0
  309. /package/web/public/assets/{nextflow-QC1Jp_kA.js → nextflow-DnO2XFP7.js} +0 -0
  310. /package/web/public/assets/{night-owl-C6yVJF2Q.js → night-owl-c-XUdzNN.js} +0 -0
  311. /package/web/public/assets/{nix-DOTTFI08.js → nix-DSVQz1Vb.js} +0 -0
  312. /package/web/public/assets/{nord-D3OhLmlk.js → nord-CfpzYV6O.js} +0 -0
  313. /package/web/public/assets/{nushell-Bm-Eoj_U.js → nushell-CW8y6_6S.js} +0 -0
  314. /package/web/public/assets/{objective-c-BOMijZ4c.js → objective-c-GRClK1S7.js} +0 -0
  315. /package/web/public/assets/{objective-cpp-CbvrehWN.js → objective-cpp-l3qYw-v5.js} +0 -0
  316. /package/web/public/assets/{ocaml-ik-NqCFm.js → ocaml-BBDyhyMH.js} +0 -0
  317. /package/web/public/assets/{one-dark-pro-BQwYNK-V.js → one-dark-pro-NuzFmTft.js} +0 -0
  318. /package/web/public/assets/{one-light-Bp-joYds.js → one-light-Cgxj9GbU.js} +0 -0
  319. /package/web/public/assets/{openscad-DbmtYX8R.js → openscad-DCmPLSXt.js} +0 -0
  320. /package/web/public/assets/{parsePatchFiles-BuO13j3v.js → parsePatchFiles-D3jLD0yV.js} +0 -0
  321. /package/web/public/assets/{pascal-BPYu8HR0.js → pascal-BMY45JJO.js} +0 -0
  322. /package/web/public/assets/{pierre-dark-Gtc9M_gS.js → pierre-dark-pqLturbW.js} +0 -0
  323. /package/web/public/assets/{pierre-light-EDxMHmhf.js → pierre-light-xEQF8aEA.js} +0 -0
  324. /package/web/public/assets/{pkl-qxepEfsD.js → pkl-ML-dWShO.js} +0 -0
  325. /package/web/public/assets/{plastic-xlIdlTab.js → plastic-Dm5h_fPp.js} +0 -0
  326. /package/web/public/assets/{plsql-B78xoJMt.js → plsql-0vd5cLro.js} +0 -0
  327. /package/web/public/assets/{po-CoMDg-5x.js → po-CbZ_uqQA.js} +0 -0
  328. /package/web/public/assets/{poimandres-D86B5bTz.js → poimandres-BMiDntUw.js} +0 -0
  329. /package/web/public/assets/{polar-BRmDPSGP.js → polar-C4hfV8Nc.js} +0 -0
  330. /package/web/public/assets/{postcss-BHCm7Qae.js → postcss-Ct0ld0vz.js} +0 -0
  331. /package/web/public/assets/{powerquery-Dm5a9IoW.js → powerquery-CTlGUQPj.js} +0 -0
  332. /package/web/public/assets/{powershell-BjmzcPTN.js → powershell-DyZsOmuq.js} +0 -0
  333. /package/web/public/assets/{prisma-Bd0_snUb.js → prisma-SS92PO_I.js} +0 -0
  334. /package/web/public/assets/{prolog-UaJ8cqTq.js → prolog-B1O1NNVC.js} +0 -0
  335. /package/web/public/assets/{proto-BemTv6Bq.js → proto-DSThcTAU.js} +0 -0
  336. /package/web/public/assets/{puppet-DF4VqKgy.js → puppet-tvtRVdr6.js} +0 -0
  337. /package/web/public/assets/{purescript-BJT-wLCH.js → purescript-Dtbpb7D-.js} +0 -0
  338. /package/web/public/assets/{python-B3yVAntA.js → python-D1NFioGW.js} +0 -0
  339. /package/web/public/assets/{qmldir-DtWLyrB6.js → qmldir-B-iEOngH.js} +0 -0
  340. /package/web/public/assets/{qss-DsrpEJaX.js → qss-Ba0p-aHw.js} +0 -0
  341. /package/web/public/assets/{r-4yEvCsNo.js → r-B7wiE8s0.js} +0 -0
  342. /package/web/public/assets/{racket-XY2Y45wx.js → racket-BXDsxf2U.js} +0 -0
  343. /package/web/public/assets/{raku-D3iN2fBx.js → raku-Dw1WWFXK.js} +0 -0
  344. /package/web/public/assets/{red-I5fLwuNS.js → red-KFYbzZV7.js} +0 -0
  345. /package/web/public/assets/{reg-CSHQTRsk.js → reg-DXFHGaM4.js} +0 -0
  346. /package/web/public/assets/{regexp-Cq-Qrxd6.js → regexp-B5tDXh-D.js} +0 -0
  347. /package/web/public/assets/{rel-D65xriOC.js → rel-Dc5_Ytx2.js} +0 -0
  348. /package/web/public/assets/{riscv-C1otibmh.js → riscv-ZgswiWij.js} +0 -0
  349. /package/web/public/assets/{rose-pine-Crsr1Wh6.js → rose-pine-CgpG0Wwm.js} +0 -0
  350. /package/web/public/assets/{rose-pine-dawn-BseHwNCh.js → rose-pine-dawn-DnQykvhA.js} +0 -0
  351. /package/web/public/assets/{rose-pine-moon-CTJjJU-f.js → rose-pine-moon-BxLEuV3_.js} +0 -0
  352. /package/web/public/assets/{rosmsg-BV7oEC-E.js → rosmsg-CcBwQf5j.js} +0 -0
  353. /package/web/public/assets/{rust-Ca_38JKc.js → rust-ppknoGus.js} +0 -0
  354. /package/web/public/assets/{sass-3Jwb14GH.js → sass-Baw41att.js} +0 -0
  355. /package/web/public/assets/{scala-CWwtO5O_.js → scala-DtlnBhKt.js} +0 -0
  356. /package/web/public/assets/{scheme-lOuCDGJc.js → scheme-DYQMayIi.js} +0 -0
  357. /package/web/public/assets/{sdbl-DmWX-P82.js → sdbl-B_1cHVNm.js} +0 -0
  358. /package/web/public/assets/{shellscript-DrB_N96g.js → shellscript-P32R2bme.js} +0 -0
  359. /package/web/public/assets/{slack-dark-BayPwCVM.js → slack-dark-DaitoxIJ.js} +0 -0
  360. /package/web/public/assets/{slack-ochin-BHVQSD4w.js → slack-ochin-CKzff-0L.js} +0 -0
  361. /package/web/public/assets/{smalltalk-CffKAivC.js → smalltalk-DRM3jr39.js} +0 -0
  362. /package/web/public/assets/{snazzy-light-BW8nJzRx.js → snazzy-light-Cfj-ApKF.js} +0 -0
  363. /package/web/public/assets/{solarized-dark-3dkbIcKM.js → solarized-dark-syg5rn82.js} +0 -0
  364. /package/web/public/assets/{solarized-light-D_iKV2-Z.js → solarized-light-BAea3eBG.js} +0 -0
  365. /package/web/public/assets/{solidity-q6T1qSBn.js → solidity-CYAp_sJG.js} +0 -0
  366. /package/web/public/assets/{splunk-CnHG51Wl.js → splunk-LsCTpuOP.js} +0 -0
  367. /package/web/public/assets/{sql-CFWVA4QB.js → sql-DBpDxsUe.js} +0 -0
  368. /package/web/public/assets/{ssh-config-tpfZ5PR3.js → ssh-config-QxQe7y21.js} +0 -0
  369. /package/web/public/assets/{stylus-C6-cY1Et.js → stylus-DZvi0832.js} +0 -0
  370. /package/web/public/assets/{swift-DwtgONLE.js → swift-CDjbPYoV.js} +0 -0
  371. /package/web/public/assets/{synthwave-84-B-ytnfkh.js → synthwave-84-7RM1a-o6.js} +0 -0
  372. /package/web/public/assets/{system-verilog-C-3uC-Vc.js → system-verilog-CYey0nam.js} +0 -0
  373. /package/web/public/assets/{systemd-C5TwcQRY.js → systemd-CP-_B7Hs.js} +0 -0
  374. /package/web/public/assets/{talonscript-dvJcRKQN.js → talonscript-KcJSLq0g.js} +0 -0
  375. /package/web/public/assets/{tasl-D2BFZx-U.js → tasl-UgGRncVE.js} +0 -0
  376. /package/web/public/assets/{tcl-aSJhsMVX.js → tcl-IEoxxKd9.js} +0 -0
  377. /package/web/public/assets/{terraform-D_tAWup-.js → terraform-PrLLnyiL.js} +0 -0
  378. /package/web/public/assets/{tokyo-night-CDKf-sdq.js → tokyo-night-CZ_TA08H.js} +0 -0
  379. /package/web/public/assets/{toml-CRhT2y7i.js → toml-W6nxcYtJ.js} +0 -0
  380. /package/web/public/assets/{tsv-DStxpcCr.js → tsv-BRx-N_Yl.js} +0 -0
  381. /package/web/public/assets/{tsx-OY4UwPsG.js → tsx-DsDbze4C.js} +0 -0
  382. /package/web/public/assets/{turtle-BSEJiBFZ.js → turtle-ZCrKgE8E.js} +0 -0
  383. /package/web/public/assets/{typescript-DwMe_b5N.js → typescript-y69KCpjV.js} +0 -0
  384. /package/web/public/assets/{typespec-CyCcmlcK.js → typespec-EjcUAk3i.js} +0 -0
  385. /package/web/public/assets/{typst-CLmYclOg.js → typst-BV1BGyWG.js} +0 -0
  386. /package/web/public/assets/{v-Bhb8K_N8.js → v-DsDLzPtW.js} +0 -0
  387. /package/web/public/assets/{vala-B-FTNUML.js → vala-Bs3vV05i.js} +0 -0
  388. /package/web/public/assets/{vb-3ZoibnYf.js → vb-CPJ4fJKa.js} +0 -0
  389. /package/web/public/assets/{verilog-CWwkQYXJ.js → verilog-sIfxvY5_.js} +0 -0
  390. /package/web/public/assets/{vesper-Dnn_ZQ4I.js → vesper-BdKAaT7q.js} +0 -0
  391. /package/web/public/assets/{vhdl-B2LcSxiS.js → vhdl-BWTyDzra.js} +0 -0
  392. /package/web/public/assets/{viml-DOrLkmuY.js → viml-CkzrUc36.js} +0 -0
  393. /package/web/public/assets/{vitesse-black-CaGwBPUU.js → vitesse-black-BkwYYrqu.js} +0 -0
  394. /package/web/public/assets/{vitesse-dark-PIVIzvpJ.js → vitesse-dark-Dr-0tRFe.js} +0 -0
  395. /package/web/public/assets/{vitesse-light-MdjLbxun.js → vitesse-light-Dwi9BR_i.js} +0 -0
  396. /package/web/public/assets/{vyper-BYZ02-QF.js → vyper-Ddg9ynNK.js} +0 -0
  397. /package/web/public/assets/{wasm-BqG9CUph.js → wasm-0ag0zszG.js} +0 -0
  398. /package/web/public/assets/{wasm-Cv4XAECo.js → wasm-xPljl98P.js} +0 -0
  399. /package/web/public/assets/{wenyan-qkaNnHss.js → wenyan-BVy5yENW.js} +0 -0
  400. /package/web/public/assets/{wgsl-sv8-wynF.js → wgsl-JVNN3zi8.js} +0 -0
  401. /package/web/public/assets/{wikitext-Cu72Vn0T.js → wikitext-CJsbZHwi.js} +0 -0
  402. /package/web/public/assets/{wit-n-57eWWN.js → wit-DEFTvUMf.js} +0 -0
  403. /package/web/public/assets/{wolfram-HLKUTjDF.js → wolfram-CrHN9vWl.js} +0 -0
  404. /package/web/public/assets/{yaml-pCWCy5TU.js → yaml-okado1J8.js} +0 -0
  405. /package/web/public/assets/{zenscript-CeFKqaq9.js → zenscript-CNDMZH8q.js} +0 -0
  406. /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
- return isProcessRunning(instance.opencodePid) || isProcessRunning(instance.webPid);
380
+ if (getInstanceProvider(instance) === "claude") {
381
+ return isProcessRunning(getInstanceBackendPid(instance)) || isProcessRunning(instance.webPid);
382
+ }
383
+ return isProcessRunning(getInstanceBackendPid(instance)) || isProcessRunning(instance.webPid);
384
+ }
385
+ function providerName(provider) {
386
+ if (provider === "codex")
387
+ return "Codex";
388
+ if (provider === "claude")
389
+ return "Claude";
390
+ return "OpenCode";
391
+ }
392
+ function backendName(provider) {
393
+ if (provider === "codex")
394
+ return "Codex app-server";
395
+ if (provider === "claude")
396
+ return "Claude SDK";
397
+ return "OpenCode API";
398
+ }
399
+ function backendLocation(provider, host, port) {
400
+ if (provider === "claude") {
401
+ return `Claude SDK managed by Web UI (instance key: ${port})`;
402
+ }
403
+ const displayHost = host === "0.0.0.0" ? "localhost" : host;
404
+ return `http://${displayHost}:${port}`;
366
405
  }
367
406
  function printHelp() {
368
407
  console.log(`
369
- OpenPortal CLI - Run OpenCode with a web UI
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 OpenCode server and Web UI
375
- run [options] Start only OpenCode server (no Web UI)
413
+ (default) Start provider backend and Web UI
414
+ run [provider] Start only a provider backend (opencode, codex, or claude)
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 -d ./my-project Start OpenCode in specific directory
440
+ openportal run opencode Start only OpenCode server
441
+ openportal run codex Start only Codex app-server
442
+ openportal run claude Keep Claude SDK backend registered
443
+ openportal run codex -d ./my-project Start Codex in specific directory
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() || "opencode";
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 opencodePort = options["opencode-port"] ? parseInt(options["opencode-port"], 10) : await getPort({ host: hostname, port: DEFAULT_OPENCODE_PORT });
468
- const existing = readConfig().instances.find((i) => i.directory === directory);
469
- if (existing && isInstanceRunning(existing)) {
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(` OpenCode Port: ${existing.opencodePort}`);
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 OpenCode API at http://${hostname === "0.0.0.0" ? "localhost" : hostname}:${existing.opencodePort}`);
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(` OpenCode Port: ${opencodePort}`);
626
+ console.log(` ${provider === "claude" ? "Instance Key" : "Backend Port"}: ${backendPort}`);
491
627
  console.log(` Hostname: ${hostname}`);
492
628
  try {
493
- const opencodePid = await startOpenCodeServer(directory, opencodePort, hostname);
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
- opencodePort,
501
- hostname,
502
- opencodePid,
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
- console.log(` OpenCode PID: ${opencodePid}`);
657
+ if (backendPid) {
658
+ console.log(` ${providerName(provider)} PID: ${backendPid}`);
659
+ } else {
660
+ console.log(` ${backendName(provider)}: managed by Web UI`);
661
+ }
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 OpenCode API at http://${displayHost}:${opencodePort}`);
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() || "opencode";
530
- const opencodePort = options["opencode-port"] ? parseInt(options["opencode-port"], 10) : await getPort({ host: hostname, port: DEFAULT_OPENCODE_PORT });
531
- const existing = readConfig().instances.find((i) => i.directory === directory);
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
- console.log(`OpenCode is already running for this directory.`);
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(` OpenCode Port: ${existing.opencodePort}`);
536
- console.log(`\uD83D\uDD27 OpenCode API at http://${hostname === "0.0.0.0" ? "localhost" : hostname}:${existing.opencodePort}`);
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 OpenCode server...`);
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(` OpenCode Port: ${opencodePort}`);
543
- console.log(` Hostname: ${hostname}`);
694
+ console.log(` ${provider === "claude" ? "Instance Key" : "Backend Port"}: ${backendPort}`);
695
+ console.log(` Hostname: ${backendHost}`);
544
696
  try {
545
- const opencodePid = await startOpenCodeServer(directory, opencodePort, hostname);
697
+ if (provider === "claude") {
698
+ const instance2 = {
699
+ id: generateId(),
700
+ name,
701
+ directory,
702
+ port: null,
703
+ provider,
704
+ backendPort,
705
+ backendPid: process.pid,
706
+ opencodePort: backendPort,
707
+ hostname: backendHost,
708
+ opencodePid: null,
709
+ webPid: null,
710
+ startedAt: new Date().toISOString(),
711
+ claudeBinaryPath: options["claude-binary"],
712
+ claudeHomePath: options["claude-home"],
713
+ claudeLaunchArgs: options["claude-launch-args"] ?? options["claude-args"]
714
+ };
715
+ mutateConfig((config) => {
716
+ config.instances = config.instances.filter((i) => i.directory !== directory || getInstanceProvider(i) !== provider);
717
+ config.instances.push(instance2);
718
+ });
719
+ console.log(`
720
+ \u2705 Claude SDK backend registered!`);
721
+ console.log(` Claude holder PID: ${process.pid}`);
722
+ console.log(`\uD83D\uDD27 ${backendName(provider)} at ${backendLocation(provider, backendHost, backendPort)}`);
723
+ await waitForClaudeRegistration(instance2);
724
+ return;
725
+ }
726
+ const backendPid = await startBackendServer(provider, directory, backendPort, hostname);
546
727
  const instance = {
547
728
  id: generateId(),
548
729
  name,
549
730
  directory,
550
731
  port: null,
551
- opencodePort,
552
- hostname,
553
- opencodePid,
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 OpenCode server started!`);
564
- console.log(` OpenCode PID: ${opencodePid}`);
565
- console.log(`\uD83D\uDD27 OpenCode API at http://${displayHost}:${opencodePort}`);
746
+ \u2705 ${backendName(provider)} started!`);
747
+ if (backendPid) {
748
+ console.log(` ${providerName(provider)} PID: ${backendPid}`);
749
+ }
750
+ console.log(`\uD83D\uDD27 ${backendName(provider)} at ${backendLocation(provider, backendHost, backendPort)}`);
566
751
  } catch (error) {
567
752
  if (error instanceof Error) {
568
753
  console.error(`
569
- \u274C Failed to start OpenCode: ${error.message}`);
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
- if (removed.opencodePid !== null) {
772
+ const provider = getInstanceProvider(removed);
773
+ const backendPid = getInstanceBackendPid(removed);
774
+ if (backendPid !== null) {
588
775
  try {
589
- process.kill(removed.opencodePid, "SIGTERM");
590
- console.log(`Stopped OpenCode (PID: ${removed.opencodePid})`);
776
+ process.kill(backendPid, "SIGTERM");
777
+ console.log(`Stopped ${providerName(provider)} (PID: ${backendPid})`);
591
778
  } catch {
592
- console.log("OpenCode was already stopped.");
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\tOPENCODE\tSTATUS\t\tDIRECTORY");
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 opencodeRunning = isProcessRunning(instance.opencodePid);
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 (opencodeRunning && webRunning)
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 (opencodeRunning)
625
- status = "opencode";
817
+ else if (backendRunning)
818
+ status = provider;
626
819
  else if (webRunning)
627
820
  status = "web only";
628
- if (opencodeRunning || webRunning) {
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.opencodePort} ${status.padEnd(12)} ${instance.directory}`);
825
+ console.log(`${instance.id} ${instance.name.padEnd(16)} ${provider.padEnd(8)} ${String(portDisplay).padEnd(4)} ${getInstanceBackendPort(instance)} ${status.padEnd(12)} ${instance.directory}`);
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
- if (!command || command === "." || command.startsWith("/") || command.startsWith("./")) {
860
+ const commandProvider = parseProvider(command);
861
+ if (!command || command === "." || command.startsWith("/") || command.startsWith("./") || commandProvider) {
668
862
  if (command && command !== ".") {
669
- flags.directory = command;
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
- await cmdRun(flags);
873
+ case "run": {
874
+ const provider = parseProvider(args[1]) ?? getProviderOption(flags);
875
+ if (args[1] && !parseProvider(args[1])) {
876
+ flags.directory = args[1];
877
+ }
878
+ await cmdRun(flags, provider);
677
879
  break;
880
+ }
678
881
  case "stop":
679
882
  await cmdStop(flags);
680
883
  break;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "openportal",
3
- "version": "0.1.31",
3
+ "version": "0.1.32",
4
4
  "license": "MIT",
5
5
  "type": "module",
6
6
  "repository": {
package/web/nitro.json CHANGED
@@ -1,5 +1,5 @@
1
1
  {
2
- "date": "2026-05-09T06:36:01.974Z",
2
+ "date": "2026-05-12T13:03:23.142Z",
3
3
  "preset": "bun",
4
4
  "framework": {
5
5
  "name": "nitro",
@@ -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};