@vantran-se/openchamber-web 2.0.3 → 2.0.4

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 (93) hide show
  1. package/README.md +20 -28
  2. package/bin/cli.js +3 -1
  3. package/bin/cli.test.js +13 -4
  4. package/bin/lib/DOCUMENTATION.md +4 -1
  5. package/bin/lib/commands-serve.js +9 -0
  6. package/dist/assets/{CodeMirrorCommentWidgets-CWhdh0wf.js → CodeMirrorCommentWidgets-DZF8ntaq.js} +1 -1
  7. package/dist/assets/{DiffView-CX3wAX2S.js → DiffView-D2p4Ar0H.js} +1 -1
  8. package/dist/assets/{FilesView-OL3CON3r.js → FilesView-BeTtbsip.js} +1 -1
  9. package/dist/assets/{GitView-DKIjpnu4.js → GitView-DwQwqDvu.js} +1 -1
  10. package/dist/assets/{GuestAttachDialog-BIa9jCfL.js → GuestAttachDialog-CoXM0gh_.js} +1 -1
  11. package/dist/assets/{GuestSurfacePane-B_cqX5I5.js → GuestSurfacePane-DIJvkkM-.js} +1 -1
  12. package/dist/assets/{JsonTreeView-CtI1Mqwo.js → JsonTreeView-Cq_27v0y.js} +1 -1
  13. package/dist/assets/{LinearIssuesView-BD2zLu-r.js → LinearIssuesView-CsSSRMhn.js} +1 -1
  14. package/dist/assets/{MarkdownImageGallery-DFiTFZgj.js → MarkdownImageGallery-CY0dWTaE.js} +1 -1
  15. package/dist/assets/{MarkdownRendererImpl-DZm5sf1W.js → MarkdownRendererImpl-ILdXzLrt.js} +1 -1
  16. package/dist/assets/{OnboardingScreen-B8TxloXZ.js → OnboardingScreen-ClatMQAX.js} +1 -1
  17. package/dist/assets/{PatchDiff--Civs1xY.js → PatchDiff-DOwlrIK9.js} +1 -1
  18. package/dist/assets/{PierreDiffViewer-BlDmw3-A.js → PierreDiffViewer-CrcGqqD_.js} +1 -1
  19. package/dist/assets/{PlanView-DyH2SyCP.js → PlanView-BGLsMgQk.js} +1 -1
  20. package/dist/assets/{PluginPane-BibJit86.js → PluginPane-B39JEUL8.js} +1 -1
  21. package/dist/assets/{SettingsView-h-VpVO47.js → SettingsView-13B2_G-A.js} +1 -1
  22. package/dist/assets/{SettingsWindow-y9WpZqK6.js → SettingsWindow-B0BAy-f9.js} +1 -1
  23. package/dist/assets/{SubmoduleDiffSummary-DeFmhPFZ.js → SubmoduleDiffSummary-fcdDzCSW.js} +1 -1
  24. package/dist/assets/{ToolOutputDialog-8DmF7_PZ.js → ToolOutputDialog-B7xaUz2H.js} +1 -1
  25. package/dist/assets/{ToolPartDiffPreview-Ca15DKE1.js → ToolPartDiffPreview-CkWCaUmZ.js} +1 -1
  26. package/dist/assets/{VirtualizedFileDiff-BfEBad09.js → VirtualizedFileDiff-DONC4eI2.js} +1 -1
  27. package/dist/assets/{WalkthroughView-Cj3K8Xz6.js → WalkthroughView-CXDImOXW.js} +1 -1
  28. package/dist/assets/{appThemeRegistry-DAdawJZn.js → appThemeRegistry-Br2TLSlb.js} +1 -1
  29. package/dist/assets/{commitAndPush-BIPfOMXY.js → commitAndPush-CcI4ol7c.js} +1 -1
  30. package/dist/assets/{computeVirtualFileMetrics-RF-KjfUH.js → computeVirtualFileMetrics-_-20umCs.js} +1 -1
  31. package/dist/assets/{de-BqCNGROu.js → de-BtYnUgII.js} +1 -1
  32. package/dist/assets/{es-BTPpTRgN.js → es-crP5qPye.js} +1 -1
  33. package/dist/assets/{fr-hxbzMdAg.js → fr-CLSRuALk.js} +1 -1
  34. package/dist/assets/{index-CL7ZQ94-.js → index-OKDYjcMF.js} +1 -1
  35. package/dist/assets/{isDiffPlainText-D2yJ9fO6.js → isDiffPlainText-D77M6q1f.js} +1 -1
  36. package/dist/assets/{isFilePlainText-BwMEq1Ey.js → isFilePlainText-C54B4Mns.js} +1 -1
  37. package/dist/assets/{ja-_zLwwYiy.js → ja-SZ1-ucLV.js} +1 -1
  38. package/dist/assets/{ko-CFn3Dzhc.js → ko-HthbT_Ve.js} +1 -1
  39. package/dist/assets/{main-BLJaug9I.js → main-BJklC7Cl.js} +4 -4
  40. package/dist/assets/{main-quLSA7jc.js → main-CGEvLMd2.js} +2 -2
  41. package/dist/assets/{markdownCore-DS9FdwrI.js → markdownCore-BzQuETm0.js} +1 -1
  42. package/dist/assets/{miniChat-D-lJJibr.js → miniChat-BSxkRQLj.js} +2 -2
  43. package/dist/assets/{mobile-VTtphbW6.js → mobile-C5KRTNOB.js} +2 -2
  44. package/dist/assets/{patchFileDiff-D9iBcTEi.js → patchFileDiff-DGw2KryM.js} +1 -1
  45. package/dist/assets/{pl-DFHE7xac.js → pl-C8eYfjL1.js} +1 -1
  46. package/dist/assets/{pt-BR-CUjZF179.js → pt-BR-cYOrZdxS.js} +1 -1
  47. package/dist/assets/{renderElectronMiniChatApp-DF7ch5eM.js → renderElectronMiniChatApp-CnkAQV6o.js} +2 -2
  48. package/dist/assets/{renderMobileApp-CNQhdXsi.js → renderMobileApp-CMxjwisj.js} +3 -3
  49. package/dist/assets/{runtimeEndpointReset-DeaERc0M.js → runtimeEndpointReset-C45jrFq4.js} +3 -3
  50. package/dist/assets/{scheduledTasksApi-BD6Vx9pu.js → scheduledTasksApi-CkK1F9s2.js} +1 -1
  51. package/dist/assets/{shikiHighlight-_HeCCHx1.js → shikiHighlight-4O0ZM14D.js} +1 -1
  52. package/dist/assets/{textMateThemeFromAppTheme-C95XdFGj.js → textMateThemeFromAppTheme-yNq7b0DZ.js} +1 -1
  53. package/dist/assets/{tr-BB6sA_zH.js → tr-B4IQ5t-T.js} +1 -1
  54. package/dist/assets/{uk-CB4o8g-o.js → uk-DCoXG6ve.js} +1 -1
  55. package/dist/assets/{useAppFontEffects-ZM9ij19-.js → useAppFontEffects-Bzyszv2N.js} +9 -9
  56. package/dist/assets/{useInlineCommentController-CkfxMJPy.js → useInlineCommentController-zOf6ORAq.js} +1 -1
  57. package/dist/assets/{useRootScrollLock-BtiAC1fj.js → useRootScrollLock-DCaZ4BWi.js} +2 -2
  58. package/dist/assets/{vendor-codemirror-language-data-U-lXzXNK.js → vendor-codemirror-language-data-6cEFPNUR.js} +2 -2
  59. package/dist/assets/{web-components-C583Pmfm.js → web-components-BEo4-ISu.js} +1 -1
  60. package/dist/assets/{zh-CN-BRyDuWhc.js → zh-CN-BXBoxsFk.js} +1 -1
  61. package/dist/assets/{zh-TW-BDGbWA1Q.js → zh-TW-C6oelpnL.js} +1 -1
  62. package/dist/index.html +1 -1
  63. package/dist/mini-chat.html +1 -1
  64. package/dist/mobile.html +1 -1
  65. package/package.json +1 -1
  66. package/server/index.d.ts +2 -0
  67. package/server/index.js +114 -52
  68. package/server/lib/agent-tool/DOCUMENTATION.md +47 -127
  69. package/server/lib/agent-tool/runtime.js +66 -47
  70. package/server/lib/agent-tool/runtime.test.js +2 -0
  71. package/server/lib/event-stream/DOCUMENTATION.md +2 -2
  72. package/server/lib/event-stream/global-hub.js +22 -6
  73. package/server/lib/event-stream/global-hub.test.js +93 -2
  74. package/server/lib/event-stream/rebind.test.js +1 -0
  75. package/server/lib/event-stream/runtime.js +1 -2
  76. package/server/lib/opencode/DOCUMENTATION.md +23 -23
  77. package/server/lib/opencode/lifecycle.js +126 -0
  78. package/server/lib/opencode/lifecycle.test.js +228 -1
  79. package/server/lib/opencode/network-runtime.js +16 -7
  80. package/server/lib/opencode/network-runtime.test.js +29 -1
  81. package/server/lib/opencode/proxy.js +15 -14
  82. package/server/lib/opencode/server-startup-runtime.js +25 -0
  83. package/server/lib/opencode/server-startup-runtime.test.js +67 -1
  84. package/server/lib/opencode/shared-service-runtime.js +155 -0
  85. package/server/lib/opencode/shared-service-runtime.test.js +180 -0
  86. package/server/lib/opencode/shutdown-runtime.js +11 -5
  87. package/server/lib/opencode/shutdown-runtime.test.js +77 -2
  88. package/server/lib/opencode/startup-pipeline-runtime.js +5 -4
  89. package/server/lib/opencode/startup-pipeline-runtime.test.js +18 -7
  90. package/server/lib/opencode/watcher.test.js +54 -0
  91. package/server/opencode-proxy.test.js +158 -0
  92. package/server/proxy-headers.js +8 -2
  93. package/server/proxy-headers.test.js +20 -0
@@ -1 +1 @@
1
- import{r as D,j as e,R as c,f as G}from"./vendor-react-BUCujlKS.js";import{f as J,B as U,X as z,g as me,O as Ce,h as ne,I as O}from"./useAppFontEffects-ZM9ij19-.js";import{P as W,cR as Ne,cO as le,cK as V,E as B,aw as H,e2 as Se,aD as ue,X as pe,h as X,aM as he,t as xe,U as re}from"./index-CvLgnuNI.js";import"./vendor-scheduler-7OC5HNn7.js";import"./vendor-zod-Gea9uBlY.js";import"./vendor-simplewebauthn-browser-VDA66rT_.js";import"./vendor-vite-runtime-DD1OZmLC.js";import"./vendor-zustand-BAGL70zf.js";import"./vendor-base-ui-CsXYnR5c.js";import"./vendor-floating-ui-utils-D6FqdtJt.js";import"./vendor-floating-ui-react-dom-DxYCWdHj.js";import"./vendor-floating-ui-dom-BTvzWks8.js";import"./vendor-floating-ui-core-PuGzNPnN.js";import"./vendor-use-sync-external-store-D6wYuSt-.js";import"./vendor-class-variance-authority-5VPnzWs2.js";import"./vendor-clsx-B-dksMZM.js";import"./vendor-dnd-kit-core-BZknOX2w.js";import"./vendor-dnd-kit-utilities-B_MdXhJC.js";import"./vendor-dnd-kit-accessibility-BHxJPORy.js";import"./vendor-dnd-kit-sortable-CsEagZ81.js";import"./vendor-framer-motion-Bq3iTZ6r.js";import"./vendor-motion-dom-DcCgeG69.js";import"./vendor-motion-utils-BGh8QBgx.js";import"./vendor-tanstack-react-virtual-ClYN8CzB.js";import"./vendor-tanstack-virtual-core-BewVQryB.js";import"./contextPanelEmbeddedChat-CirXEPJq.js";import"./vendor-sonner-DFyL3AvE.js";import"./vendor-cmdk-DgLInKvT.js";import"./vendor-radix-ui-react-dialog-B94Bt2qq.js";import"./vendor-radix-ui-primitive-Dc_FVRD7.js";import"./vendor-radix-ui-react-compose-refs-DcAh5WdT.js";import"./vendor-radix-ui-react-context-Czxm7Z62.js";import"./vendor-radix-ui-react-id-f5BLKEVw.js";import"./vendor-radix-ui-react-use-layout-effect-D_3IhJdJ.js";import"./vendor-radix-ui-react-use-controllable-state-BFT5YmkA.js";import"./vendor-radix-ui-react-dismissable-layer-D7kXcwgJ.js";import"./vendor-radix-ui-react-primitive-DhVoX9SD.js";import"./vendor-radix-ui-react-slot-BQgQOasS.js";import"./vendor-radix-ui-react-use-callback-ref-BZPnuXAC.js";import"./vendor-radix-ui-react-use-escape-keydown-oph88g-F.js";import"./vendor-radix-ui-react-focus-scope-CiaxW4dD.js";import"./vendor-radix-ui-react-portal-BMJYHWck.js";import"./vendor-radix-ui-react-presence-CNxf-uq4.js";import"./vendor-radix-ui-react-focus-guards-B6qJXYua.js";import"./vendor-react-remove-scroll-DO7dCTnK.js";import"./vendor-tslib-De9GV7Vy.js";import"./vendor-react-remove-scroll-bar-BcFYyj3E.js";import"./vendor-react-style-singleton-q6EMHnwf.js";import"./vendor-get-nonce-C-Z93AgS.js";import"./vendor-use-sidecar-zDC0RhA3.js";import"./vendor-use-callback-ref-D3RC8gqK.js";import"./vendor-aria-hidden-DvXkyWUv.js";import"./vendor-codemirror-language-BgPj_McA.js";import"./vendor-lezer-common-B3-cUCR_.js";import"./vendor-codemirror-state-C9awkmn-.js";import"./vendor-marijn-find-cluster-break-DXwl3gUT.js";import"./vendor-codemirror-view-CiLROUVV.js";import"./vendor-style-mod-NZ5MEPvj.js";import"./vendor-w3c-keyname-Vcq4gwWv.js";import"./vendor-crelt-C8TCjufn.js";import"./vendor-lezer-highlight-CDMHUZ74.js";import"./vendor-codemirror-lang-javascript-Cc2ZYbgX.js";import"./vendor-lezer-javascript-D7Tj24ot.js";import"./vendor-lezer-lr-bhwg1HMg.js";import"./vendor-codemirror-autocomplete-DzPz9Wgq.js";import"./vendor-codemirror-lang-json-CMBS2tG9.js";import"./vendor-lezer-json-Iaex0UN-.js";import"./vendor-codemirror-lang-css-O0cZX78y.js";import"./vendor-lezer-css-C5xB6jxd.js";import"./vendor-codemirror-lang-html-CfgK872x.js";import"./vendor-lezer-html-C0I1p52t.js";import"./vendor-codemirror-lang-markdown-BPGOH9ye.js";import"./vendor-lezer-markdown-C6g-d6P3.js";import"./vendor-codemirror-language-data-U-lXzXNK.js";import"./vendor-codemirror-lang-python-HahnQaAS.js";import"./vendor-lezer-python-CvuFxeZl.js";import"./vendor-codemirror-commands-B7H_j0iU.js";import"./vendor-legendapp-list-BuBPBC3R.js";import"./vendor-tailwind-merge-CPcsbTWB.js";import"./vendor-fuse.js-Dw8P0qyA.js";import"./vendor-opencode-client-_BAHQo4R.js";function Re(a){switch(a){case"ok":return null;case"auth":return"onboarding.remoteConnection.probe.authMessage";case"update-recommended":return"onboarding.remoteConnection.probe.updateRecommendedMessage";case"incompatible":return"onboarding.remoteConnection.probe.incompatibleMessage";case"wrong-service":return"onboarding.remoteConnection.probe.wrongServiceMessage";case"unreachable":return"onboarding.remoteConnection.probe.unreachableMessage";default:return null}}function oe(a){return a==="wrong-service"||a==="unreachable"||a==="incompatible"}function fe({onBack:a,showBackButton:t=!0,initialUrl:s="",initialLabel:i="",isRecoveryMode:n=!1,onConnect:l,onSwitchToLocal:u,showInstancePicker:r=!1}){const{t:o}=J(),[w,R]=D.useState(s),[j,T]=D.useState(i),[I,x]=D.useState("idle"),[m,k]=D.useState(null),[C,b]=D.useState(""),[N,K]=D.useState([]),[y,f]=D.useState(()=>r?"instances":"add"),[g,L]=D.useState("");D.useEffect(()=>{r&&W().then(h=>K(h.hosts)).catch(h=>{b(h instanceof Error?h.message:String(h))})},[r]);const S=Ne(w),A=S?.persistedUrl??null,E=D.useCallback(h=>{R(h.target.value),x("idle"),k(null),b("")},[]),F=D.useCallback(h=>{T(h.target.value)},[]),d=D.useCallback(async()=>{if(A){x("testing"),k(null),b("");try{const h=await le(A);k(h),x(h.status==="ok"||h.status==="update-recommended"?"success":"error")}catch(h){b(h instanceof Error?h.message:o("onboarding.remoteConnection.errors.connectionTestFailed")),x("error")}}},[A,o]),_=D.useCallback(async()=>{if(!S)return;const h=S.persistedUrl;x("testing"),k(null),b("");try{const M=await le(h);if(k(M),oe(M.status)){x("error");return}const Z=await W(),je=j.trim()||h,ee=Z.hosts.find(q=>q.url===h),te=ee?ee.id:`host-${Date.now().toString(16)}`,ie={id:te,label:je,url:h,apiUrl:h},ke=ee?Z.hosts.map(q=>q.id===te?ie:q):[...Z.hosts,ie];if(await V({hosts:ke,defaultHostId:te,initialHostChoiceCompleted:!0}),l?.(),S.redeemUrl){window.location.assign(S.redeemUrl);return}B()&&await H()}catch(M){b(M instanceof Error?M.message:o("onboarding.remoteConnection.errors.failedToSaveConnection")),x("error")}},[S,j,l,o]),$=D.useCallback(async h=>{const M=await W();await V({hosts:M.hosts,defaultHostId:h,initialHostChoiceCompleted:!0}),await H()},[]),p=D.useCallback(async()=>{x("testing"),b("");try{const h=await W(),M=await Se(g,h.hosts);await V({hosts:M.hosts,defaultHostId:M.hostId,initialHostChoiceCompleted:!0}),await H()}catch(h){b(h instanceof Error&&h.message==="invalid-connect-link"?o("settings.remoteInstances.direct.error.invalidConnectLink"):o("onboarding.remoteConnection.errors.failedToSaveConnection")),x("error")}},[g,o]),v=I==="testing",P=A!==null&&!v,Q=A!==null&&!v&&!oe(m?.status??null),Y=Re(m?.status??null),ye=m?.status==="ok",ve=m?.status==="update-recommended",we=m?.status==="auth",ae=oe(m?.status??null);return r&&y==="instances"?e.jsx("div",{className:"flex flex-col items-center justify-center h-full p-8",children:e.jsxs("div",{className:"w-full max-w-md space-y-6",children:[e.jsxs("div",{className:"space-y-2 text-center",children:[e.jsx("h1",{className:"typography-ui-header text-xl font-semibold text-foreground",children:o("desktopHostSwitcher.actions.switchInstance")}),e.jsx("p",{className:"text-muted-foreground text-sm",children:o("settings.remoteInstances.direct.description")})]}),C?e.jsx("div",{className:"text-sm text-[var(--status-error)]",children:C}):null,e.jsx("div",{className:"space-y-2",children:N.length===0?e.jsx("div",{className:"py-4 text-center text-sm text-muted-foreground",children:o("settings.remoteInstances.direct.state.empty")}):N.map(h=>e.jsx(U,{variant:"outline",className:"w-full justify-start",onClick:()=>{$(h.id)},children:e.jsx("span",{className:"min-w-0 truncate",children:h.label})},h.id))}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(U,{variant:"outline",className:"flex-1",onClick:()=>f("import"),children:o("settings.remoteInstances.direct.import.action")}),e.jsx(U,{className:"flex-1",onClick:()=>f("add"),children:o("settings.remoteInstances.direct.actions.add")})]})]})}):r&&y==="import"?e.jsx("div",{className:"flex flex-col items-center justify-center h-full p-8",children:e.jsxs("div",{className:"w-full max-w-md space-y-6",children:[e.jsx(U,{variant:"ghost",onClick:()=>f("instances"),className:"p-0 text-muted-foreground",children:o("onboarding.common.actions.back")}),e.jsxs("div",{className:"space-y-2 text-center",children:[e.jsx("h1",{className:"typography-ui-header text-xl font-semibold text-foreground",children:o("settings.remoteInstances.direct.import.action")}),e.jsx("p",{className:"text-muted-foreground text-sm",children:o("settings.remoteInstances.direct.import.description")})]}),e.jsx(z,{value:g,onChange:h=>L(h.target.value),placeholder:o("settings.remoteInstances.direct.import.placeholder"),disabled:v,autoFocus:!0}),C?e.jsx("div",{className:"text-sm text-[var(--status-error)]",children:C}):null,e.jsx(U,{onClick:()=>{p()},disabled:v||!g.trim(),children:o("settings.remoteInstances.direct.import.action")})]})}):e.jsx("div",{className:"flex flex-col items-center justify-center h-full p-8",children:e.jsxs("div",{className:"w-full max-w-md space-y-6",children:[(t||r)&&e.jsx("div",{className:"flex items-center",children:e.jsx(U,{variant:"ghost",onClick:r?()=>f("instances"):a,className:"p-0 text-muted-foreground hover:text-foreground",children:o("onboarding.common.actions.back")})}),e.jsxs("div",{className:"space-y-2 text-center",children:[e.jsx("h1",{className:"typography-ui-header text-xl font-semibold text-foreground",children:o(n?"onboarding.remoteConnection.titleRecovery":"onboarding.remoteConnection.title")}),e.jsx("p",{className:"text-muted-foreground text-sm",children:o("onboarding.remoteConnection.description")})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"remote-url",className:"text-sm text-foreground",children:o("onboarding.remoteConnection.field.serverAddress")}),e.jsx(z,{id:"remote-url",type:"url",value:w,onChange:E,placeholder:o("onboarding.remoteConnection.field.serverAddressPlaceholder"),disabled:v})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"remote-label",className:"text-sm text-foreground",children:o("onboarding.remoteConnection.field.nameOptional")}),e.jsx(z,{id:"remote-label",type:"text",value:j,onChange:F,placeholder:o("onboarding.remoteConnection.field.namePlaceholder"),disabled:v})]})]}),m&&ye&&e.jsx("div",{className:"rounded-lg border p-3 text-sm",style:{borderColor:"var(--status-success)",color:"var(--status-success)"},children:o("onboarding.remoteConnection.status.connectedSuccessfully",{latencyMs:m.latencyMs})}),m&&we&&e.jsx("div",{className:"rounded-lg border p-3 text-sm",style:{borderColor:"var(--status-warning)",color:"var(--status-warning)"},children:o("onboarding.remoteConnection.status.authWarning")}),m&&ve&&e.jsx("div",{className:"rounded-lg border p-3 text-sm",style:{borderColor:"var(--status-warning)",color:"var(--status-warning)"},children:Y?o(Y):null}),m&&ae&&e.jsxs("div",{className:"rounded-lg border p-3 text-sm space-y-3",style:{borderColor:"var(--status-error)",color:"var(--status-error)"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"font-semibold mb-1",children:o("onboarding.remoteConnection.status.connectionFailed")}),e.jsx("div",{className:"opacity-90",children:Y?o(Y):null})]}),e.jsx("div",{className:"text-xs opacity-80",children:m.status==="unreachable"?o("onboarding.remoteConnection.status.suggestionsUnreachable"):o("onboarding.remoteConnection.status.suggestionsWrongService")})]}),C&&e.jsx("div",{className:"rounded-lg border p-3 text-sm",style:{borderColor:"var(--status-error)",color:"var(--status-error)"},children:C}),e.jsxs("div",{className:"flex gap-3",children:[e.jsx(U,{variant:"outline",onClick:d,disabled:!P,children:o(v?"onboarding.remoteConnection.actions.testing":"onboarding.remoteConnection.actions.testConnection")}),e.jsx(U,{onClick:_,disabled:!Q,children:o("onboarding.remoteConnection.actions.connectAndRestart")})]}),ae&&e.jsxs("div",{className:"flex flex-col gap-2 pt-2 border-t border-border",children:[e.jsx("div",{className:"text-xs text-muted-foreground text-center",children:o("onboarding.remoteConnection.actions.whatToDo")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(U,{variant:"outline",size:"sm",onClick:a,className:"flex-1",children:o("onboarding.remoteConnection.actions.chooseDifferentServer")}),!n&&u&&e.jsx(U,{variant:"outline",size:"sm",onClick:u,className:"flex-1",children:o("onboarding.remoteConnection.actions.useLocalInstead")})]})]})]})})}const Le="curl -fsSL https://opencode.ai/v2/install | bash",ge="npm install -g @opencode/cli",Ue="https://opencode.ai/download",ce=2500;function Ie(a){const t=G.c(9),{windows:s,onCopy:i,copyTitle:n}=a;let l;t[0]!==s?(l=e.jsx("code",{className:"flex-1 min-w-0 text-left overflow-x-auto whitespace-nowrap",children:s?e.jsx("span",{style:{color:"var(--syntax-keyword)"},children:ge}):e.jsxs(e.Fragment,{children:[e.jsx("span",{style:{color:"var(--syntax-keyword)"},children:"curl"}),e.jsx("span",{className:"text-muted-foreground",children:" -fsSL "}),e.jsx("span",{style:{color:"var(--syntax-string)"},children:"https://opencode.ai/v2/install"}),e.jsx("span",{className:"text-muted-foreground",children:" | "}),e.jsx("span",{style:{color:"var(--syntax-keyword)"},children:"bash"})]})}),t[0]=s,t[1]=l):l=t[1];let u;t[2]===Symbol.for("react.memo_cache_sentinel")?(u=e.jsx(O,{name:"file-copy",className:"h-4 w-4"}),t[2]=u):u=t[2];let r;t[3]!==n||t[4]!==i?(r=e.jsx("button",{onClick:i,className:"inline-flex items-center text-muted-foreground hover:text-foreground transition-colors shrink-0",title:n,"aria-label":n,children:u}),t[3]=n,t[4]=i,t[5]=r):r=t[5];let o;return t[6]!==l||t[7]!==r?(o=e.jsxs("div",{className:"flex items-center justify-between gap-3 w-full",children:[l,r]}),t[6]=l,t[7]=r,t[8]=o):o=t[8],o}function Te({onCliAvailable:a,localAvailable:t=!0}){const{t:s}=J(),[i,n]=c.useState(!1),[l,u]=c.useState(!1),[r,o]=c.useState(!1),[w,R]=c.useState(!1),[j,T]=c.useState(""),[I,x]=c.useState("unknown"),[m,k]=c.useState(()=>t?"local":"remote"),[C,b]=c.useState(!1),[N,K]=c.useState(!1);c.useEffect(()=>{u(B())},[]),c.useEffect(()=>{if(typeof navigator>"u"){x("unknown");return}const p=navigator.userAgent||"";/Windows/i.test(p)?x("windows"):/Macintosh|Mac OS X/i.test(p)?x("macos"):/Linux/i.test(p)?x("linux"):x("unknown")},[]),c.useEffect(()=>{let p=!1;return(async()=>{try{const v=await ue();if(!v||p)return;const P=v.opencodeBinary??"";P&&T(P)}catch{}})(),()=>{p=!0}},[]);const y=c.useCallback(async p=>{const v=p.target;v.closest(".app-region-no-drag")||v.closest("button, a, input, select, textarea, code, summary, details")||p.button===0&&l&&await pe()},[l]),f=c.useCallback(async()=>{try{const p=await X("/health");if(!p.ok)return!1;const v=await p.json();return v.openCodeRunning===!0||v.isOpenCodeReady===!0}catch{return!1}},[]),g=c.useCallback(async p=>{if(!l)return;const v=await W();await V({...v,...p==="local"?{defaultHostId:"local"}:{},initialHostChoiceCompleted:!0})},[l]),L=c.useCallback(async()=>{l&&await g("local"),a?.()},[l,a,g]);c.useEffect(()=>{if(!t||m!=="local")return;let p=!1,v=null;const P=async()=>{if(!p){try{const Q=await f();if(p)return;if(Q){await L();return}}catch{}p||(v=setTimeout(P,ce))}};return v=setTimeout(P,ce),()=>{p=!0,v&&clearTimeout(v)}},[m,f,L,t]);const S=c.useCallback(async()=>{R(!0);try{await f()&&await L()}finally{R(!1)}},[f,L]),A=c.useCallback(async()=>{if(!(typeof window>"u")&&l)try{const p=await he();p.success&&p.path&&p.path.trim().length>0&&T(p.path.trim())}catch{}},[l]),E=c.useCallback(async()=>{o(!0);try{if(await xe({opencodeBinary:j.trim()}),l){await g("local"),await H();return}await X("/api/config/reload",{method:"POST"})}finally{setTimeout(()=>o(!1),1e3)}},[l,j,g]),F=c.useCallback(async()=>{const p=await me(I==="windows"?ge:Le);p.ok?(n(!0),setTimeout(()=>n(!1),2e3)):console.error("Failed to copy:",p.error)},[I]),d=Ue,_=I==="windows"?"C:\\Users\\you\\AppData\\Roaming\\npm\\opencode.cmd":I==="linux"?"/home/you/.opencode/bin/opencode":"/Users/you/.opencode/bin/opencode",$=t&&(!l||m==="local");return e.jsx("div",{className:"app-region-drag h-full flex items-center justify-center bg-transparent p-8 cursor-default select-none overflow-y-auto",onMouseDown:y,children:e.jsxs("div",{className:"w-full max-w-md",children:[e.jsxs("header",{className:"flex flex-col items-center text-center",children:[e.jsx(Ce,{width:48,height:48}),e.jsx("h1",{className:"mt-6 text-xl font-semibold tracking-tight text-foreground",children:s("onboarding.chooser.title")}),e.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:s("onboarding.chooser.description")})]}),l&&t&&e.jsxs("div",{role:"tablist",className:"app-region-no-drag mt-7 flex gap-1 rounded-lg border border-border p-1",children:[e.jsx("button",{type:"button",role:"tab","aria-selected":m==="local",className:ne("flex-1 rounded-md px-3 py-1.5 text-sm transition-colors",m==="local"?"bg-[var(--interactive-selection)] text-[var(--interactive-selection-foreground)]":"text-muted-foreground hover:text-foreground"),onClick:()=>k("local"),children:s("onboarding.chooser.tabs.localInstall")}),e.jsx("button",{type:"button",role:"tab","aria-selected":m==="remote",className:ne("flex-1 rounded-md px-3 py-1.5 text-sm transition-colors",m==="remote"?"bg-[var(--interactive-selection)] text-[var(--interactive-selection-foreground)]":"text-muted-foreground hover:text-foreground"),onClick:()=>k("remote"),children:s("onboarding.chooser.tabs.connectRemote")})]}),l&&m==="remote"?e.jsx("div",{className:"app-region-no-drag mt-6",children:e.jsx(fe,{onBack:()=>t&&k("local"),showBackButton:!1,showInstancePicker:!t,onSwitchToLocal:t?()=>k("local"):void 0})}):null,$&&e.jsxs("div",{className:"mt-6",children:[I==="windows"&&e.jsxs("div",{className:"mb-4 rounded-lg border border-border p-4",children:[e.jsx("div",{className:"text-sm text-foreground",children:s("onboarding.localSetup.windows.title")}),e.jsxs("ol",{className:"mt-2 list-decimal space-y-1 pl-5 text-sm text-muted-foreground",children:[e.jsx("li",{children:s("onboarding.localSetup.windows.stepRunInstallInWsl")}),e.jsx("li",{children:s("onboarding.localSetup.windows.stepSetBinaryPath")})]})]}),e.jsx("p",{className:"text-center text-sm leading-relaxed text-muted-foreground text-balance",children:s("onboarding.localSetup.intro")}),e.jsx("div",{className:"app-region-no-drag mt-3 rounded-lg border border-border bg-background/60 px-4 py-3 font-mono text-sm",children:i?e.jsxs("div",{className:"flex items-center gap-2",style:{color:"var(--status-success)"},children:[e.jsx(O,{name:"check",className:"h-4 w-4"}),s("onboarding.common.status.copiedToClipboard")]}):e.jsx(Ie,{windows:I==="windows",onCopy:F,copyTitle:s("onboarding.common.copyToClipboard")})}),e.jsxs("div",{className:"app-region-no-drag mt-3 flex items-center gap-2.5 px-1",role:"status","aria-live":"polite",children:[e.jsx("span",{className:"relative inline-flex h-2 w-2 shrink-0","aria-hidden":!0,children:e.jsx("span",{className:"absolute inset-0 rounded-full",style:{backgroundColor:"var(--primary-base)",animation:"pulse-opacity 1.6s ease-in-out infinite"}})}),e.jsxs("span",{className:"min-w-0 flex-1 text-xs text-muted-foreground",children:[e.jsx("span",{className:"text-foreground",children:s("onboarding.localSetup.status.watching")})," · ",s("onboarding.localSetup.status.autoContinue")]}),e.jsx("button",{type:"button",onClick:S,disabled:w,className:"shrink-0 text-xs text-muted-foreground transition-colors hover:text-foreground disabled:opacity-50",children:s(w?"onboarding.localSetup.actions.checking":"onboarding.localSetup.actions.checkNow")})]}),e.jsxs("div",{className:"mt-6 divide-y divide-border/60 border-y border-border/60",children:[e.jsxs("details",{className:"app-region-no-drag group",open:C,onToggle:p=>b(p.currentTarget.open),children:[e.jsxs("summary",{className:"flex cursor-pointer list-none items-center justify-between py-3 text-sm text-muted-foreground transition-colors hover:text-foreground [&::-webkit-details-marker]:hidden",children:[e.jsx("span",{children:s("onboarding.localSetup.advanced.title")}),e.jsx(O,{name:"arrow-down-s",className:"h-4 w-4 transition-transform group-open:rotate-180"})]}),e.jsxs("div",{className:"space-y-2 pb-4",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx(z,{value:j,onChange:p=>T(p.target.value),placeholder:_,disabled:r,className:"flex-1 font-mono text-xs"}),e.jsx(U,{type:"button",variant:"secondary",size:"sm",onClick:A,disabled:r||!l,children:s("onboarding.localSetup.actions.browse")}),e.jsx(U,{type:"button",size:"sm",onClick:E,disabled:r||!j.trim(),children:s("onboarding.localSetup.actions.apply")})]}),e.jsx("p",{className:"text-xs text-muted-foreground/70",children:s("onboarding.localSetup.helper.saveAndReload")})]})]}),e.jsxs("details",{className:"app-region-no-drag group",open:N,onToggle:p=>K(p.currentTarget.open),children:[e.jsxs("summary",{className:"flex cursor-pointer list-none items-center justify-between py-3 text-sm text-muted-foreground transition-colors hover:text-foreground [&::-webkit-details-marker]:hidden",children:[e.jsx("span",{children:s("onboarding.localSetup.troubleshoot.title")}),e.jsx(O,{name:"arrow-down-s",className:"h-4 w-4 transition-transform group-open:rotate-180"})]}),e.jsx("ul",{className:"list-disc space-y-1.5 pb-4 pl-4 text-xs text-muted-foreground",children:I==="windows"?e.jsx("li",{children:s("onboarding.localSetup.windows.hintDetectionFailed")}):e.jsxs(e.Fragment,{children:[e.jsx("li",{children:s("onboarding.localSetup.hint.ensurePath")}),e.jsx("li",{children:s("onboarding.localSetup.hint.setEnv")}),e.jsx("li",{children:s("onboarding.localSetup.hint.missingRuntime")})]})})]})]}),e.jsx("div",{className:"app-region-no-drag mt-5 text-center",children:e.jsxs("a",{href:d,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 text-xs text-muted-foreground transition-colors hover:text-foreground",children:[s(I==="windows"?"onboarding.localSetup.docs.windows":"onboarding.localSetup.docs.default"),e.jsx(O,{name:"external-link",className:"h-3 w-3"})]})})]})]})})}const Ke="curl -fsSL https://opencode.ai/v2/install | bash",be="npm install -g @opencode/cli",De="https://opencode.ai/download";function _e(a){const t=G.c(9),{windows:s,onCopy:i,copyTitle:n}=a;let l;t[0]!==s?(l=e.jsx("code",{className:"flex-1 min-w-0 text-left overflow-x-auto whitespace-nowrap",children:s?e.jsx("span",{style:{color:"var(--syntax-keyword)"},children:be}):e.jsxs(e.Fragment,{children:[e.jsx("span",{style:{color:"var(--syntax-keyword)"},children:"curl"}),e.jsx("span",{className:"text-muted-foreground",children:" -fsSL "}),e.jsx("span",{style:{color:"var(--syntax-string)"},children:"https://opencode.ai/v2/install"}),e.jsx("span",{className:"text-muted-foreground",children:" | "}),e.jsx("span",{style:{color:"var(--syntax-keyword)"},children:"bash"})]})}),t[0]=s,t[1]=l):l=t[1];let u;t[2]===Symbol.for("react.memo_cache_sentinel")?(u=e.jsx(O,{name:"file-copy",className:"h-4 w-4"}),t[2]=u):u=t[2];let r;t[3]!==n||t[4]!==i?(r=e.jsx("button",{onClick:i,className:"inline-flex items-center text-muted-foreground hover:text-foreground transition-colors",title:n,"aria-label":n,children:u}),t[3]=n,t[4]=i,t[5]=r):r=t[5];let o;return t[6]!==l||t[7]!==r?(o=e.jsxs("div",{className:"flex items-center justify-center gap-3",children:[l,r]}),t[6]=l,t[7]=r,t[8]=o):o=t[8],o}const Ae=3e4;function Oe({onBack:a,onCliAvailable:t,isFromRecovery:s=!1,onSwitchToRemote:i}){const{t:n}=J(),[l,u]=c.useState(!1),[r,o]=c.useState(!1),[w,R]=c.useState(!1),[j,T]=c.useState(!1),[I,x]=c.useState(!1),[m,k]=c.useState(null),[C,b]=c.useState(""),[N,K]=c.useState("unknown");c.useEffect(()=>{const d=setTimeout(()=>o(!0),Ae);return()=>clearTimeout(d)},[]),c.useEffect(()=>{R(B())},[]),c.useEffect(()=>{if(typeof navigator>"u"){K("unknown");return}const d=navigator.userAgent||"";if(/Windows/i.test(d)){K("windows");return}if(/Macintosh|Mac OS X/i.test(d)){K("macos");return}if(/Linux/i.test(d)){K("linux");return}K("unknown")},[]),c.useEffect(()=>{let d=!1;return(async()=>{try{const _=await ue();if(!_||d)return;const $=_.opencodeBinary??"";$&&b($)}catch{}})(),()=>{d=!0}},[]);const y=c.useCallback(async d=>{d.target.closest("button, a, input, select, textarea, code")||d.button===0&&w&&await pe()},[w]),f=c.useCallback(async()=>{try{const d=await X("/health");if(!d.ok)return!1;const _=await d.json();return _.openCodeRunning===!0||_.isOpenCodeReady===!0}catch{return!1}},[]),g=c.useCallback(async()=>{if(!(typeof window>"u")&&w)try{const d=await he();d.success&&d.path&&d.path.trim().length>0&&b(d.path.trim())}catch{}},[w]),L=c.useCallback(async()=>{T(!0);try{if(await xe({opencodeBinary:C.trim()}),w){await H();return}await X("/api/config/reload",{method:"POST"})}finally{setTimeout(()=>T(!1),1e3)}},[w,C]),S=c.useCallback(async()=>{const d=await me(N==="windows"?be:Ke);d.ok?(u(!0),setTimeout(()=>u(!1),2e3)):console.error("Failed to copy:",d.error)},[N]),A=c.useCallback(async()=>{x(!0),k(null);try{await f()?t?.():k(n("onboarding.localSetup.errors.cliNotReady"))}catch(d){k(d instanceof Error?d.message:n("onboarding.localSetup.errors.detectionFailed"))}finally{x(!1)}},[f,t,n]),E=De,F=N==="windows"?"C:\\Users\\you\\AppData\\Roaming\\npm\\opencode.cmd":N==="linux"?"/home/you/.opencode/bin/opencode":"/Users/you/.opencode/bin/opencode";return e.jsxs("div",{className:"h-full flex items-center justify-center bg-transparent p-8 relative cursor-default select-none",onMouseDown:y,children:[e.jsxs("div",{className:"w-full max-w-lg space-y-4 text-center",children:[e.jsx("div",{className:"flex items-center",children:e.jsx(U,{variant:"ghost",onClick:a,className:"p-0 text-muted-foreground hover:text-foreground",children:n("onboarding.common.actions.back")})}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h1",{className:"text-3xl font-semibold tracking-tight text-foreground",children:n("onboarding.localSetup.title")}),e.jsx("p",{className:"text-muted-foreground",children:n("onboarding.localSetup.description")})]}),N==="windows"&&e.jsxs("div",{className:"mx-auto max-w-2xl rounded-lg border border-border bg-background/50 p-4 text-left",children:[e.jsx("div",{className:"text-sm text-foreground",children:n("onboarding.localSetup.windows.title")}),e.jsxs("ol",{className:"mt-2 list-decimal space-y-1 pl-5 text-sm text-muted-foreground",children:[e.jsx("li",{children:n("onboarding.localSetup.windows.stepRunInstallInWsl")}),e.jsx("li",{children:n("onboarding.localSetup.windows.stepSetBinaryPath")})]})]}),e.jsx("div",{className:"flex justify-center",children:e.jsx("div",{className:"bg-background/60 backdrop-blur-sm border border-border rounded-lg px-5 py-3 font-mono text-sm w-fit",children:l?e.jsxs("div",{className:"flex items-center justify-center gap-2",style:{color:"var(--status-success)"},children:[e.jsx(O,{name:"check",className:"h-4 w-4"}),n("onboarding.common.status.copiedToClipboard")]}):e.jsx(_e,{windows:N==="windows",onCopy:S,copyTitle:n("onboarding.common.copyToClipboard")})})}),e.jsxs("a",{href:E,target:"_blank",rel:"noopener noreferrer",className:"text-sm text-muted-foreground hover:text-foreground transition-colors inline-flex items-center gap-1 justify-center",children:[n(N==="windows"?"onboarding.localSetup.docs.windows":"onboarding.localSetup.docs.default"),e.jsx(O,{name:"external-link",className:"h-3 w-3"})]}),m&&e.jsx("div",{className:"mx-auto max-w-md rounded-lg border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive",children:m}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(U,{type:"button",onClick:A,disabled:I,className:"w-full max-w-xs",size:"lg",children:n(I?"onboarding.localSetup.actions.checking":"onboarding.localSetup.actions.checkAndContinue")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:n("onboarding.localSetup.helper.checkAndContinue")})]}),e.jsx("div",{className:"mx-auto w-full max-w-xl pt-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:n("onboarding.localSetup.field.alreadyInstalled")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(z,{value:C,onChange:d=>b(d.target.value),placeholder:F,disabled:j,className:"flex-1 font-mono text-xs"}),e.jsx(U,{type:"button",variant:"secondary",onClick:g,disabled:j||!w,children:n("onboarding.localSetup.actions.browse")}),e.jsx(U,{type:"button",onClick:L,disabled:j,children:n("onboarding.localSetup.actions.apply")})]}),e.jsx("div",{className:"text-xs text-muted-foreground/70",children:n("onboarding.localSetup.helper.saveAndReload")})]})}),s&&i&&e.jsxs("div",{className:"text-center pt-4",children:[e.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:n("onboarding.localSetup.remotePreference")}),e.jsx(U,{variant:"link",onClick:i,children:n("onboarding.localSetup.actions.connectRemoteServer")})]})]}),r&&e.jsx("div",{className:"absolute bottom-8 left-0 right-0 text-center space-y-1",children:N==="windows"?e.jsx(e.Fragment,{children:e.jsx("p",{className:"text-sm text-muted-foreground/70",children:n("onboarding.localSetup.windows.hintDetectionFailed")})}):e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"text-sm text-muted-foreground/70",children:n("onboarding.localSetup.hint.ensurePath")}),e.jsx("p",{className:"text-sm text-muted-foreground/70",children:n("onboarding.localSetup.hint.setEnv")}),e.jsx("p",{className:"text-sm text-muted-foreground/70",children:n("onboarding.localSetup.hint.missingRuntime")})]})})]})}function se(a,t){if(a?.trim())return re(a.trim());if(t)return re(t)}function Ee(a,t,s){switch(a){case"local-unavailable":return{title:"Local OpenCode Unavailable",description:"OpenCode CLI could not be started or is not installed. Install OpenCode or connect to a remote server instead.",titleKey:"onboarding.desktopRecovery.localUnavailable.title",descriptionKey:"onboarding.desktopRecovery.localUnavailable.description",iconKey:"local",showRetry:!0,retryLabel:"Retry Local",retryLabelKey:"onboarding.desktopRecovery.localUnavailable.retry",showUseLocal:!0,showUseRemote:!0,useLocalLabel:"Set Up Local",useLocalLabelKey:"onboarding.desktopRecovery.localUnavailable.useLocal",useRemoteLabel:"Use Remote",useRemoteLabelKey:"onboarding.desktopRecovery.common.useRemote"};case"remote-missing":return{title:"No Default Connection",description:"Your saved default connection could not be found. Choose how you want to connect.",titleKey:"onboarding.desktopRecovery.noDefaultConnection.title",descriptionKey:"onboarding.desktopRecovery.noDefaultConnection.description",iconKey:"local",showRetry:!1,showUseLocal:!0,showUseRemote:!0,useLocalLabel:"Use Local",useLocalLabelKey:"onboarding.desktopRecovery.common.useLocal",useRemoteLabel:"Use Remote",useRemoteLabelKey:"onboarding.desktopRecovery.common.useRemote"};case"remote-unreachable":{const i=se(t,s);return{title:"Remote Server Unreachable",description:`Could not connect to "${i||"the remote server"}". Check your network connection and verify the server address.`,titleKey:"onboarding.desktopRecovery.remoteUnreachable.title",descriptionKey:"onboarding.desktopRecovery.remoteUnreachable.description",descriptionParams:i?{host:i}:void 0,iconKey:"remote",showRetry:!0,retryLabel:"Retry Connection",retryLabelKey:"onboarding.desktopRecovery.remoteUnreachable.retry",showUseLocal:!0,showUseRemote:!0,useLocalLabel:"Use Local",useLocalLabelKey:"onboarding.desktopRecovery.common.useLocal",useRemoteLabel:"Use Remote",useRemoteLabelKey:"onboarding.desktopRecovery.common.useRemote"}}case"remote-wrong-service":{const i=se(t,s);return{title:"Incompatible Server",description:`The server at "${i||"unknown"}" is not running OpenChamber. Verify the address points to an OpenChamber server.`,titleKey:"onboarding.desktopRecovery.incompatibleServer.title",descriptionKey:"onboarding.desktopRecovery.incompatibleServer.description",descriptionParams:i?{host:i}:void 0,iconKey:"remote",showRetry:!1,showUseLocal:!0,showUseRemote:!0,useLocalLabel:"Use Local",useLocalLabelKey:"onboarding.desktopRecovery.common.useLocal",useRemoteLabel:"Use Remote",useRemoteLabelKey:"onboarding.desktopRecovery.common.useRemote"}}case"remote-incompatible":{const i=se(t,s);return{title:"Server Update Required",description:`The OpenChamber server at "${i||"unknown"}" is not compatible with this app version. Update OpenChamber on the server, then try again.`,titleKey:"onboarding.desktopRecovery.remoteIncompatible.title",descriptionKey:"onboarding.desktopRecovery.remoteIncompatible.description",descriptionParams:i?{host:i}:void 0,iconKey:"remote",showRetry:!0,retryLabel:"Retry Connection",retryLabelKey:"onboarding.desktopRecovery.remoteUnreachable.retry",showUseLocal:!0,showUseRemote:!0,useLocalLabel:"Use Local",useLocalLabelKey:"onboarding.desktopRecovery.common.useLocal",useRemoteLabel:"Use Remote",useRemoteLabelKey:"onboarding.desktopRecovery.common.useRemote"}}case"missing-default-host":return{title:"No Default Connection",description:"Your saved default connection could not be found. Choose how you want to connect.",titleKey:"onboarding.desktopRecovery.noDefaultConnection.title",descriptionKey:"onboarding.desktopRecovery.noDefaultConnection.description",iconKey:"local",showRetry:!1,showUseLocal:!0,showUseRemote:!0,useLocalLabel:"Use Local",useLocalLabelKey:"onboarding.desktopRecovery.common.useLocal",useRemoteLabel:"Use Remote",useRemoteLabelKey:"onboarding.desktopRecovery.common.useRemote"};default:{const i=a;throw new Error(`Unknown recovery variant: ${i}`)}}}function Me(a){switch(a){case"local":return e.jsx(O,{name:"macbook",className:"h-8 w-8"});case"remote":return e.jsx(O,{name:"server",className:"h-8 w-8"})}}function Fe({variant:a,hostLabel:t,hostUrl:s,onRetry:i,onUseLocal:n,onUseRemote:l,isRetrying:u=!1}){const{t:r}=J(),o=Ee(a,t,s),w=o.retryLabelKey??"onboarding.desktopRecovery.actions.retryConnection",R=c.useMemo(()=>{if(o.descriptionParams?.host)return o.descriptionParams;if(a==="remote-unreachable")return{host:r("onboarding.desktopRecovery.placeholders.remoteServer")};if(a==="remote-wrong-service"||a==="remote-incompatible")return{host:r("onboarding.desktopRecovery.placeholders.unknownServer")}},[o.descriptionParams,r,a]);return e.jsx("div",{className:"flex flex-col items-center justify-center h-full p-8",children:e.jsxs("div",{className:"w-full max-w-md space-y-6",children:[e.jsxs("div",{className:"flex flex-col items-center space-y-3 text-center",children:[e.jsx("div",{className:"p-3 rounded-full",style:{backgroundColor:"var(--status-warning)",opacity:.15},children:e.jsx("div",{style:{color:"var(--status-warning)"},children:Me(o.iconKey)})}),e.jsx("h1",{className:"typography-ui-header text-xl font-semibold text-foreground",children:r(o.titleKey)}),e.jsx("p",{className:"text-muted-foreground text-sm max-w-sm",children:r(o.descriptionKey,R)})]}),s&&(a==="remote-unreachable"||a==="remote-wrong-service"||a==="remote-incompatible")&&e.jsxs("div",{className:"rounded-lg border border-border bg-background/50 p-3",children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:r("onboarding.remoteConnection.field.serverAddress")}),e.jsx("div",{className:"font-mono text-sm text-foreground truncate",children:re(s)})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[o.showRetry&&i&&e.jsxs(U,{onClick:i,disabled:u,className:"w-full",children:[e.jsx(O,{name:"refresh",className:ne("h-4 w-4",u&&"animate-spin")}),r(u?"onboarding.desktopRecovery.actions.retrying":w)]}),e.jsxs("div",{className:"flex gap-2",children:[o.showUseLocal&&n&&e.jsxs(U,{variant:"outline",onClick:n,disabled:u,className:"flex-1",children:[e.jsx(O,{name:"macbook",className:"h-4 w-4"}),r(o.useLocalLabelKey)]}),o.showUseRemote&&l&&e.jsxs(U,{variant:"outline",onClick:l,disabled:u,className:"flex-1",children:[e.jsx(O,{name:"server",className:"h-4 w-4"}),r(o.useRemoteLabelKey)]})]})]})]})})}function de(a,t){if(t==="use-remote")return{kind:"remote-form"};switch(a){case"local-unavailable":return{kind:"local-setup"};case"remote-unreachable":case"remote-incompatible":case"remote-wrong-service":case"remote-missing":case"missing-default-host":return{kind:"switch-default-to-local"};default:{const s=a;throw new Error(`Unhandled RecoveryVariant: ${s}`)}}}function He(a){const t=G.c(29),{variant:s,hostUrl:i,hostLabel:n,onRetry:l,onChooseRemote:u,showRemoteForm:r,onCloseRemoteForm:o,onSwitchToLocalFromRemote:w,onEnterLocalSetup:R,isRetrying:j,localAvailable:T}=a,I=r===void 0?!1:r,x=j===void 0?!1:j,m=T===void 0?!0:T,k=Pe;let C;t[0]!==l?(C=async()=>{if(B()){await H();return}await X("/api/config/reload",{method:"POST"}),l?.()},t[0]=l,t[1]=C):C=t[1];const b=C;let N;t[2]!==R||t[3]!==s?(N=async()=>{if(de(s,"use-local").kind==="local-setup"){R?.();return}if(await k("local"),B()){await H();return}window.location.reload()},t[2]=R,t[3]=s,t[4]=N):N=t[4];const K=N;let y;t[5]!==u||t[6]!==s?(y=()=>{de(s,"use-remote").kind==="remote-form"&&u?.()},t[5]=u,t[6]=s,t[7]=y):y=t[7];const f=y;if(I){const S=s==="remote-wrong-service"?"":i||"",A=s==="remote-wrong-service"?"":n||"";let E;t[8]!==u||t[9]!==o?(E=o||(()=>u?.()),t[8]=u,t[9]=o,t[10]=E):E=t[10];const F=!m;let d;t[11]!==m||t[12]!==R||t[13]!==w?(d=m?w||(()=>{k("local").then(()=>{B()?H():R?.()})}):void 0,t[11]=m,t[12]=R,t[13]=w,t[14]=d):d=t[14];let _;return t[15]!==A||t[16]!==S||t[17]!==E||t[18]!==F||t[19]!==d?(_=e.jsx(fe,{onBack:E,initialUrl:S,initialLabel:A,isRecoveryMode:!0,showInstancePicker:F,onSwitchToLocal:d}),t[15]=A,t[16]=S,t[17]=E,t[18]=F,t[19]=d,t[20]=_):_=t[20],_}const g=m?K:void 0;let L;return t[21]!==b||t[22]!==f||t[23]!==n||t[24]!==i||t[25]!==x||t[26]!==g||t[27]!==s?(L=e.jsx(Fe,{variant:s,hostLabel:n,hostUrl:i,onRetry:b,onUseLocal:g,onUseRemote:f,isRetrying:x}),t[21]=b,t[22]=f,t[23]=n,t[24]=i,t[25]=x,t[26]=g,t[27]=s,t[28]=L):L=t[28],L}async function Pe(a){if(!B())return;const t=await W();await V({...t,...a==="local"?{defaultHostId:"local"}:{},initialHostChoiceCompleted:!0})}function fo(a){const t=G.c(29),{onBack:s,onCliAvailable:i,mode:n,recoveryVariant:l,recoveryHostUrl:u,recoveryHostLabel:r,onEnterLocalSetup:o,localAvailable:w}=a,R=n===void 0?"first-launch":n,j=l===void 0?"missing-default-host":l,T=w===void 0?!0:w,[I,x]=c.useState(!1),[m,k]=c.useState(!1);let C;t[0]===Symbol.for("react.memo_cache_sentinel")?(C=()=>{k(!1),x(!1)},t[0]=C):C=t[0];let b;t[1]!==R||t[2]!==r||t[3]!==u||t[4]!==j?(b=[R,j,u,r],t[1]=R,t[2]=r,t[3]=u,t[4]=j,t[5]=b):b=t[5],c.useEffect(C,b);const N=m?"local-setup":R;if(N==="recovery"){let y;t[6]===Symbol.for("react.memo_cache_sentinel")?(y=()=>x(!0),t[6]=y):y=t[6];let f,g;t[7]===Symbol.for("react.memo_cache_sentinel")?(f=()=>x(!1),g=()=>{x(!1),k(!0)},t[7]=f,t[8]=g):(f=t[7],g=t[8]);let L;t[9]!==o?(L=()=>{k(!0),o?.()},t[9]=o,t[10]=L):L=t[10];let S;return t[11]!==T||t[12]!==r||t[13]!==u||t[14]!==j||t[15]!==I||t[16]!==L?(S=e.jsx(He,{variant:j,hostUrl:u,hostLabel:r,onChooseRemote:y,showRemoteForm:I,onCloseRemoteForm:f,onSwitchToLocalFromRemote:g,onEnterLocalSetup:L,localAvailable:T}),t[11]=T,t[12]=r,t[13]=u,t[14]=j,t[15]=I,t[16]=L,t[17]=S):S=t[17],S}if(N==="local-setup"){let y;t[18]!==s||t[19]!==m?(y=()=>{m?k(!1):s?.()},t[18]=s,t[19]=m,t[20]=y):y=t[20];let f;t[21]===Symbol.for("react.memo_cache_sentinel")?(f=()=>x(!0),t[21]=f):f=t[21];let g;return t[22]!==i||t[23]!==m||t[24]!==y?(g=e.jsx(Oe,{onBack:y,onCliAvailable:i,isFromRecovery:m,onSwitchToRemote:f}),t[22]=i,t[23]=m,t[24]=y,t[25]=g):g=t[25],g}let K;return t[26]!==T||t[27]!==i?(K=e.jsx(Te,{onCliAvailable:i,localAvailable:T}),t[26]=T,t[27]=i,t[28]=K):K=t[28],K}export{fo as OnboardingScreen};
1
+ import{r as D,j as e,R as c,f as G}from"./vendor-react-BUCujlKS.js";import{f as J,B as U,X as z,g as me,O as Ce,h as ne,I as O}from"./useAppFontEffects-Bzyszv2N.js";import{P as W,cR as Ne,cO as le,cK as V,E as B,aw as H,e2 as Se,aD as ue,X as pe,h as X,aM as he,t as xe,U as re}from"./index-CvLgnuNI.js";import"./vendor-scheduler-7OC5HNn7.js";import"./vendor-zod-Gea9uBlY.js";import"./vendor-simplewebauthn-browser-VDA66rT_.js";import"./vendor-vite-runtime-DD1OZmLC.js";import"./vendor-zustand-BAGL70zf.js";import"./vendor-base-ui-CsXYnR5c.js";import"./vendor-floating-ui-utils-D6FqdtJt.js";import"./vendor-floating-ui-react-dom-DxYCWdHj.js";import"./vendor-floating-ui-dom-BTvzWks8.js";import"./vendor-floating-ui-core-PuGzNPnN.js";import"./vendor-use-sync-external-store-D6wYuSt-.js";import"./vendor-class-variance-authority-5VPnzWs2.js";import"./vendor-clsx-B-dksMZM.js";import"./vendor-dnd-kit-core-BZknOX2w.js";import"./vendor-dnd-kit-utilities-B_MdXhJC.js";import"./vendor-dnd-kit-accessibility-BHxJPORy.js";import"./vendor-dnd-kit-sortable-CsEagZ81.js";import"./vendor-framer-motion-Bq3iTZ6r.js";import"./vendor-motion-dom-DcCgeG69.js";import"./vendor-motion-utils-BGh8QBgx.js";import"./vendor-tanstack-react-virtual-ClYN8CzB.js";import"./vendor-tanstack-virtual-core-BewVQryB.js";import"./contextPanelEmbeddedChat-CirXEPJq.js";import"./vendor-sonner-DFyL3AvE.js";import"./vendor-cmdk-DgLInKvT.js";import"./vendor-radix-ui-react-dialog-B94Bt2qq.js";import"./vendor-radix-ui-primitive-Dc_FVRD7.js";import"./vendor-radix-ui-react-compose-refs-DcAh5WdT.js";import"./vendor-radix-ui-react-context-Czxm7Z62.js";import"./vendor-radix-ui-react-id-f5BLKEVw.js";import"./vendor-radix-ui-react-use-layout-effect-D_3IhJdJ.js";import"./vendor-radix-ui-react-use-controllable-state-BFT5YmkA.js";import"./vendor-radix-ui-react-dismissable-layer-D7kXcwgJ.js";import"./vendor-radix-ui-react-primitive-DhVoX9SD.js";import"./vendor-radix-ui-react-slot-BQgQOasS.js";import"./vendor-radix-ui-react-use-callback-ref-BZPnuXAC.js";import"./vendor-radix-ui-react-use-escape-keydown-oph88g-F.js";import"./vendor-radix-ui-react-focus-scope-CiaxW4dD.js";import"./vendor-radix-ui-react-portal-BMJYHWck.js";import"./vendor-radix-ui-react-presence-CNxf-uq4.js";import"./vendor-radix-ui-react-focus-guards-B6qJXYua.js";import"./vendor-react-remove-scroll-DO7dCTnK.js";import"./vendor-tslib-De9GV7Vy.js";import"./vendor-react-remove-scroll-bar-BcFYyj3E.js";import"./vendor-react-style-singleton-q6EMHnwf.js";import"./vendor-get-nonce-C-Z93AgS.js";import"./vendor-use-sidecar-zDC0RhA3.js";import"./vendor-use-callback-ref-D3RC8gqK.js";import"./vendor-aria-hidden-DvXkyWUv.js";import"./vendor-codemirror-language-BgPj_McA.js";import"./vendor-lezer-common-B3-cUCR_.js";import"./vendor-codemirror-state-C9awkmn-.js";import"./vendor-marijn-find-cluster-break-DXwl3gUT.js";import"./vendor-codemirror-view-CiLROUVV.js";import"./vendor-style-mod-NZ5MEPvj.js";import"./vendor-w3c-keyname-Vcq4gwWv.js";import"./vendor-crelt-C8TCjufn.js";import"./vendor-lezer-highlight-CDMHUZ74.js";import"./vendor-codemirror-lang-javascript-Cc2ZYbgX.js";import"./vendor-lezer-javascript-D7Tj24ot.js";import"./vendor-lezer-lr-bhwg1HMg.js";import"./vendor-codemirror-autocomplete-DzPz9Wgq.js";import"./vendor-codemirror-lang-json-CMBS2tG9.js";import"./vendor-lezer-json-Iaex0UN-.js";import"./vendor-codemirror-lang-css-O0cZX78y.js";import"./vendor-lezer-css-C5xB6jxd.js";import"./vendor-codemirror-lang-html-CfgK872x.js";import"./vendor-lezer-html-C0I1p52t.js";import"./vendor-codemirror-lang-markdown-BPGOH9ye.js";import"./vendor-lezer-markdown-C6g-d6P3.js";import"./vendor-codemirror-language-data-6cEFPNUR.js";import"./vendor-codemirror-lang-python-HahnQaAS.js";import"./vendor-lezer-python-CvuFxeZl.js";import"./vendor-codemirror-commands-B7H_j0iU.js";import"./vendor-legendapp-list-BuBPBC3R.js";import"./vendor-tailwind-merge-CPcsbTWB.js";import"./vendor-fuse.js-Dw8P0qyA.js";import"./vendor-opencode-client-_BAHQo4R.js";function Re(a){switch(a){case"ok":return null;case"auth":return"onboarding.remoteConnection.probe.authMessage";case"update-recommended":return"onboarding.remoteConnection.probe.updateRecommendedMessage";case"incompatible":return"onboarding.remoteConnection.probe.incompatibleMessage";case"wrong-service":return"onboarding.remoteConnection.probe.wrongServiceMessage";case"unreachable":return"onboarding.remoteConnection.probe.unreachableMessage";default:return null}}function oe(a){return a==="wrong-service"||a==="unreachable"||a==="incompatible"}function fe({onBack:a,showBackButton:t=!0,initialUrl:s="",initialLabel:i="",isRecoveryMode:n=!1,onConnect:l,onSwitchToLocal:u,showInstancePicker:r=!1}){const{t:o}=J(),[w,R]=D.useState(s),[j,T]=D.useState(i),[I,x]=D.useState("idle"),[m,k]=D.useState(null),[C,b]=D.useState(""),[N,K]=D.useState([]),[y,f]=D.useState(()=>r?"instances":"add"),[g,L]=D.useState("");D.useEffect(()=>{r&&W().then(h=>K(h.hosts)).catch(h=>{b(h instanceof Error?h.message:String(h))})},[r]);const S=Ne(w),A=S?.persistedUrl??null,E=D.useCallback(h=>{R(h.target.value),x("idle"),k(null),b("")},[]),F=D.useCallback(h=>{T(h.target.value)},[]),d=D.useCallback(async()=>{if(A){x("testing"),k(null),b("");try{const h=await le(A);k(h),x(h.status==="ok"||h.status==="update-recommended"?"success":"error")}catch(h){b(h instanceof Error?h.message:o("onboarding.remoteConnection.errors.connectionTestFailed")),x("error")}}},[A,o]),_=D.useCallback(async()=>{if(!S)return;const h=S.persistedUrl;x("testing"),k(null),b("");try{const M=await le(h);if(k(M),oe(M.status)){x("error");return}const Z=await W(),je=j.trim()||h,ee=Z.hosts.find(q=>q.url===h),te=ee?ee.id:`host-${Date.now().toString(16)}`,ie={id:te,label:je,url:h,apiUrl:h},ke=ee?Z.hosts.map(q=>q.id===te?ie:q):[...Z.hosts,ie];if(await V({hosts:ke,defaultHostId:te,initialHostChoiceCompleted:!0}),l?.(),S.redeemUrl){window.location.assign(S.redeemUrl);return}B()&&await H()}catch(M){b(M instanceof Error?M.message:o("onboarding.remoteConnection.errors.failedToSaveConnection")),x("error")}},[S,j,l,o]),$=D.useCallback(async h=>{const M=await W();await V({hosts:M.hosts,defaultHostId:h,initialHostChoiceCompleted:!0}),await H()},[]),p=D.useCallback(async()=>{x("testing"),b("");try{const h=await W(),M=await Se(g,h.hosts);await V({hosts:M.hosts,defaultHostId:M.hostId,initialHostChoiceCompleted:!0}),await H()}catch(h){b(h instanceof Error&&h.message==="invalid-connect-link"?o("settings.remoteInstances.direct.error.invalidConnectLink"):o("onboarding.remoteConnection.errors.failedToSaveConnection")),x("error")}},[g,o]),v=I==="testing",P=A!==null&&!v,Q=A!==null&&!v&&!oe(m?.status??null),Y=Re(m?.status??null),ye=m?.status==="ok",ve=m?.status==="update-recommended",we=m?.status==="auth",ae=oe(m?.status??null);return r&&y==="instances"?e.jsx("div",{className:"flex flex-col items-center justify-center h-full p-8",children:e.jsxs("div",{className:"w-full max-w-md space-y-6",children:[e.jsxs("div",{className:"space-y-2 text-center",children:[e.jsx("h1",{className:"typography-ui-header text-xl font-semibold text-foreground",children:o("desktopHostSwitcher.actions.switchInstance")}),e.jsx("p",{className:"text-muted-foreground text-sm",children:o("settings.remoteInstances.direct.description")})]}),C?e.jsx("div",{className:"text-sm text-[var(--status-error)]",children:C}):null,e.jsx("div",{className:"space-y-2",children:N.length===0?e.jsx("div",{className:"py-4 text-center text-sm text-muted-foreground",children:o("settings.remoteInstances.direct.state.empty")}):N.map(h=>e.jsx(U,{variant:"outline",className:"w-full justify-start",onClick:()=>{$(h.id)},children:e.jsx("span",{className:"min-w-0 truncate",children:h.label})},h.id))}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(U,{variant:"outline",className:"flex-1",onClick:()=>f("import"),children:o("settings.remoteInstances.direct.import.action")}),e.jsx(U,{className:"flex-1",onClick:()=>f("add"),children:o("settings.remoteInstances.direct.actions.add")})]})]})}):r&&y==="import"?e.jsx("div",{className:"flex flex-col items-center justify-center h-full p-8",children:e.jsxs("div",{className:"w-full max-w-md space-y-6",children:[e.jsx(U,{variant:"ghost",onClick:()=>f("instances"),className:"p-0 text-muted-foreground",children:o("onboarding.common.actions.back")}),e.jsxs("div",{className:"space-y-2 text-center",children:[e.jsx("h1",{className:"typography-ui-header text-xl font-semibold text-foreground",children:o("settings.remoteInstances.direct.import.action")}),e.jsx("p",{className:"text-muted-foreground text-sm",children:o("settings.remoteInstances.direct.import.description")})]}),e.jsx(z,{value:g,onChange:h=>L(h.target.value),placeholder:o("settings.remoteInstances.direct.import.placeholder"),disabled:v,autoFocus:!0}),C?e.jsx("div",{className:"text-sm text-[var(--status-error)]",children:C}):null,e.jsx(U,{onClick:()=>{p()},disabled:v||!g.trim(),children:o("settings.remoteInstances.direct.import.action")})]})}):e.jsx("div",{className:"flex flex-col items-center justify-center h-full p-8",children:e.jsxs("div",{className:"w-full max-w-md space-y-6",children:[(t||r)&&e.jsx("div",{className:"flex items-center",children:e.jsx(U,{variant:"ghost",onClick:r?()=>f("instances"):a,className:"p-0 text-muted-foreground hover:text-foreground",children:o("onboarding.common.actions.back")})}),e.jsxs("div",{className:"space-y-2 text-center",children:[e.jsx("h1",{className:"typography-ui-header text-xl font-semibold text-foreground",children:o(n?"onboarding.remoteConnection.titleRecovery":"onboarding.remoteConnection.title")}),e.jsx("p",{className:"text-muted-foreground text-sm",children:o("onboarding.remoteConnection.description")})]}),e.jsxs("div",{className:"space-y-4",children:[e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"remote-url",className:"text-sm text-foreground",children:o("onboarding.remoteConnection.field.serverAddress")}),e.jsx(z,{id:"remote-url",type:"url",value:w,onChange:E,placeholder:o("onboarding.remoteConnection.field.serverAddressPlaceholder"),disabled:v})]}),e.jsxs("div",{className:"space-y-2",children:[e.jsx("label",{htmlFor:"remote-label",className:"text-sm text-foreground",children:o("onboarding.remoteConnection.field.nameOptional")}),e.jsx(z,{id:"remote-label",type:"text",value:j,onChange:F,placeholder:o("onboarding.remoteConnection.field.namePlaceholder"),disabled:v})]})]}),m&&ye&&e.jsx("div",{className:"rounded-lg border p-3 text-sm",style:{borderColor:"var(--status-success)",color:"var(--status-success)"},children:o("onboarding.remoteConnection.status.connectedSuccessfully",{latencyMs:m.latencyMs})}),m&&we&&e.jsx("div",{className:"rounded-lg border p-3 text-sm",style:{borderColor:"var(--status-warning)",color:"var(--status-warning)"},children:o("onboarding.remoteConnection.status.authWarning")}),m&&ve&&e.jsx("div",{className:"rounded-lg border p-3 text-sm",style:{borderColor:"var(--status-warning)",color:"var(--status-warning)"},children:Y?o(Y):null}),m&&ae&&e.jsxs("div",{className:"rounded-lg border p-3 text-sm space-y-3",style:{borderColor:"var(--status-error)",color:"var(--status-error)"},children:[e.jsxs("div",{children:[e.jsx("div",{className:"font-semibold mb-1",children:o("onboarding.remoteConnection.status.connectionFailed")}),e.jsx("div",{className:"opacity-90",children:Y?o(Y):null})]}),e.jsx("div",{className:"text-xs opacity-80",children:m.status==="unreachable"?o("onboarding.remoteConnection.status.suggestionsUnreachable"):o("onboarding.remoteConnection.status.suggestionsWrongService")})]}),C&&e.jsx("div",{className:"rounded-lg border p-3 text-sm",style:{borderColor:"var(--status-error)",color:"var(--status-error)"},children:C}),e.jsxs("div",{className:"flex gap-3",children:[e.jsx(U,{variant:"outline",onClick:d,disabled:!P,children:o(v?"onboarding.remoteConnection.actions.testing":"onboarding.remoteConnection.actions.testConnection")}),e.jsx(U,{onClick:_,disabled:!Q,children:o("onboarding.remoteConnection.actions.connectAndRestart")})]}),ae&&e.jsxs("div",{className:"flex flex-col gap-2 pt-2 border-t border-border",children:[e.jsx("div",{className:"text-xs text-muted-foreground text-center",children:o("onboarding.remoteConnection.actions.whatToDo")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(U,{variant:"outline",size:"sm",onClick:a,className:"flex-1",children:o("onboarding.remoteConnection.actions.chooseDifferentServer")}),!n&&u&&e.jsx(U,{variant:"outline",size:"sm",onClick:u,className:"flex-1",children:o("onboarding.remoteConnection.actions.useLocalInstead")})]})]})]})})}const Le="curl -fsSL https://opencode.ai/v2/install | bash",ge="npm install -g @opencode/cli",Ue="https://opencode.ai/download",ce=2500;function Ie(a){const t=G.c(9),{windows:s,onCopy:i,copyTitle:n}=a;let l;t[0]!==s?(l=e.jsx("code",{className:"flex-1 min-w-0 text-left overflow-x-auto whitespace-nowrap",children:s?e.jsx("span",{style:{color:"var(--syntax-keyword)"},children:ge}):e.jsxs(e.Fragment,{children:[e.jsx("span",{style:{color:"var(--syntax-keyword)"},children:"curl"}),e.jsx("span",{className:"text-muted-foreground",children:" -fsSL "}),e.jsx("span",{style:{color:"var(--syntax-string)"},children:"https://opencode.ai/v2/install"}),e.jsx("span",{className:"text-muted-foreground",children:" | "}),e.jsx("span",{style:{color:"var(--syntax-keyword)"},children:"bash"})]})}),t[0]=s,t[1]=l):l=t[1];let u;t[2]===Symbol.for("react.memo_cache_sentinel")?(u=e.jsx(O,{name:"file-copy",className:"h-4 w-4"}),t[2]=u):u=t[2];let r;t[3]!==n||t[4]!==i?(r=e.jsx("button",{onClick:i,className:"inline-flex items-center text-muted-foreground hover:text-foreground transition-colors shrink-0",title:n,"aria-label":n,children:u}),t[3]=n,t[4]=i,t[5]=r):r=t[5];let o;return t[6]!==l||t[7]!==r?(o=e.jsxs("div",{className:"flex items-center justify-between gap-3 w-full",children:[l,r]}),t[6]=l,t[7]=r,t[8]=o):o=t[8],o}function Te({onCliAvailable:a,localAvailable:t=!0}){const{t:s}=J(),[i,n]=c.useState(!1),[l,u]=c.useState(!1),[r,o]=c.useState(!1),[w,R]=c.useState(!1),[j,T]=c.useState(""),[I,x]=c.useState("unknown"),[m,k]=c.useState(()=>t?"local":"remote"),[C,b]=c.useState(!1),[N,K]=c.useState(!1);c.useEffect(()=>{u(B())},[]),c.useEffect(()=>{if(typeof navigator>"u"){x("unknown");return}const p=navigator.userAgent||"";/Windows/i.test(p)?x("windows"):/Macintosh|Mac OS X/i.test(p)?x("macos"):/Linux/i.test(p)?x("linux"):x("unknown")},[]),c.useEffect(()=>{let p=!1;return(async()=>{try{const v=await ue();if(!v||p)return;const P=v.opencodeBinary??"";P&&T(P)}catch{}})(),()=>{p=!0}},[]);const y=c.useCallback(async p=>{const v=p.target;v.closest(".app-region-no-drag")||v.closest("button, a, input, select, textarea, code, summary, details")||p.button===0&&l&&await pe()},[l]),f=c.useCallback(async()=>{try{const p=await X("/health");if(!p.ok)return!1;const v=await p.json();return v.openCodeRunning===!0||v.isOpenCodeReady===!0}catch{return!1}},[]),g=c.useCallback(async p=>{if(!l)return;const v=await W();await V({...v,...p==="local"?{defaultHostId:"local"}:{},initialHostChoiceCompleted:!0})},[l]),L=c.useCallback(async()=>{l&&await g("local"),a?.()},[l,a,g]);c.useEffect(()=>{if(!t||m!=="local")return;let p=!1,v=null;const P=async()=>{if(!p){try{const Q=await f();if(p)return;if(Q){await L();return}}catch{}p||(v=setTimeout(P,ce))}};return v=setTimeout(P,ce),()=>{p=!0,v&&clearTimeout(v)}},[m,f,L,t]);const S=c.useCallback(async()=>{R(!0);try{await f()&&await L()}finally{R(!1)}},[f,L]),A=c.useCallback(async()=>{if(!(typeof window>"u")&&l)try{const p=await he();p.success&&p.path&&p.path.trim().length>0&&T(p.path.trim())}catch{}},[l]),E=c.useCallback(async()=>{o(!0);try{if(await xe({opencodeBinary:j.trim()}),l){await g("local"),await H();return}await X("/api/config/reload",{method:"POST"})}finally{setTimeout(()=>o(!1),1e3)}},[l,j,g]),F=c.useCallback(async()=>{const p=await me(I==="windows"?ge:Le);p.ok?(n(!0),setTimeout(()=>n(!1),2e3)):console.error("Failed to copy:",p.error)},[I]),d=Ue,_=I==="windows"?"C:\\Users\\you\\AppData\\Roaming\\npm\\opencode.cmd":I==="linux"?"/home/you/.opencode/bin/opencode":"/Users/you/.opencode/bin/opencode",$=t&&(!l||m==="local");return e.jsx("div",{className:"app-region-drag h-full flex items-center justify-center bg-transparent p-8 cursor-default select-none overflow-y-auto",onMouseDown:y,children:e.jsxs("div",{className:"w-full max-w-md",children:[e.jsxs("header",{className:"flex flex-col items-center text-center",children:[e.jsx(Ce,{width:48,height:48}),e.jsx("h1",{className:"mt-6 text-xl font-semibold tracking-tight text-foreground",children:s("onboarding.chooser.title")}),e.jsx("p",{className:"mt-2 text-sm text-muted-foreground",children:s("onboarding.chooser.description")})]}),l&&t&&e.jsxs("div",{role:"tablist",className:"app-region-no-drag mt-7 flex gap-1 rounded-lg border border-border p-1",children:[e.jsx("button",{type:"button",role:"tab","aria-selected":m==="local",className:ne("flex-1 rounded-md px-3 py-1.5 text-sm transition-colors",m==="local"?"bg-[var(--interactive-selection)] text-[var(--interactive-selection-foreground)]":"text-muted-foreground hover:text-foreground"),onClick:()=>k("local"),children:s("onboarding.chooser.tabs.localInstall")}),e.jsx("button",{type:"button",role:"tab","aria-selected":m==="remote",className:ne("flex-1 rounded-md px-3 py-1.5 text-sm transition-colors",m==="remote"?"bg-[var(--interactive-selection)] text-[var(--interactive-selection-foreground)]":"text-muted-foreground hover:text-foreground"),onClick:()=>k("remote"),children:s("onboarding.chooser.tabs.connectRemote")})]}),l&&m==="remote"?e.jsx("div",{className:"app-region-no-drag mt-6",children:e.jsx(fe,{onBack:()=>t&&k("local"),showBackButton:!1,showInstancePicker:!t,onSwitchToLocal:t?()=>k("local"):void 0})}):null,$&&e.jsxs("div",{className:"mt-6",children:[I==="windows"&&e.jsxs("div",{className:"mb-4 rounded-lg border border-border p-4",children:[e.jsx("div",{className:"text-sm text-foreground",children:s("onboarding.localSetup.windows.title")}),e.jsxs("ol",{className:"mt-2 list-decimal space-y-1 pl-5 text-sm text-muted-foreground",children:[e.jsx("li",{children:s("onboarding.localSetup.windows.stepRunInstallInWsl")}),e.jsx("li",{children:s("onboarding.localSetup.windows.stepSetBinaryPath")})]})]}),e.jsx("p",{className:"text-center text-sm leading-relaxed text-muted-foreground text-balance",children:s("onboarding.localSetup.intro")}),e.jsx("div",{className:"app-region-no-drag mt-3 rounded-lg border border-border bg-background/60 px-4 py-3 font-mono text-sm",children:i?e.jsxs("div",{className:"flex items-center gap-2",style:{color:"var(--status-success)"},children:[e.jsx(O,{name:"check",className:"h-4 w-4"}),s("onboarding.common.status.copiedToClipboard")]}):e.jsx(Ie,{windows:I==="windows",onCopy:F,copyTitle:s("onboarding.common.copyToClipboard")})}),e.jsxs("div",{className:"app-region-no-drag mt-3 flex items-center gap-2.5 px-1",role:"status","aria-live":"polite",children:[e.jsx("span",{className:"relative inline-flex h-2 w-2 shrink-0","aria-hidden":!0,children:e.jsx("span",{className:"absolute inset-0 rounded-full",style:{backgroundColor:"var(--primary-base)",animation:"pulse-opacity 1.6s ease-in-out infinite"}})}),e.jsxs("span",{className:"min-w-0 flex-1 text-xs text-muted-foreground",children:[e.jsx("span",{className:"text-foreground",children:s("onboarding.localSetup.status.watching")})," · ",s("onboarding.localSetup.status.autoContinue")]}),e.jsx("button",{type:"button",onClick:S,disabled:w,className:"shrink-0 text-xs text-muted-foreground transition-colors hover:text-foreground disabled:opacity-50",children:s(w?"onboarding.localSetup.actions.checking":"onboarding.localSetup.actions.checkNow")})]}),e.jsxs("div",{className:"mt-6 divide-y divide-border/60 border-y border-border/60",children:[e.jsxs("details",{className:"app-region-no-drag group",open:C,onToggle:p=>b(p.currentTarget.open),children:[e.jsxs("summary",{className:"flex cursor-pointer list-none items-center justify-between py-3 text-sm text-muted-foreground transition-colors hover:text-foreground [&::-webkit-details-marker]:hidden",children:[e.jsx("span",{children:s("onboarding.localSetup.advanced.title")}),e.jsx(O,{name:"arrow-down-s",className:"h-4 w-4 transition-transform group-open:rotate-180"})]}),e.jsxs("div",{className:"space-y-2 pb-4",children:[e.jsxs("div",{className:"flex gap-2",children:[e.jsx(z,{value:j,onChange:p=>T(p.target.value),placeholder:_,disabled:r,className:"flex-1 font-mono text-xs"}),e.jsx(U,{type:"button",variant:"secondary",size:"sm",onClick:A,disabled:r||!l,children:s("onboarding.localSetup.actions.browse")}),e.jsx(U,{type:"button",size:"sm",onClick:E,disabled:r||!j.trim(),children:s("onboarding.localSetup.actions.apply")})]}),e.jsx("p",{className:"text-xs text-muted-foreground/70",children:s("onboarding.localSetup.helper.saveAndReload")})]})]}),e.jsxs("details",{className:"app-region-no-drag group",open:N,onToggle:p=>K(p.currentTarget.open),children:[e.jsxs("summary",{className:"flex cursor-pointer list-none items-center justify-between py-3 text-sm text-muted-foreground transition-colors hover:text-foreground [&::-webkit-details-marker]:hidden",children:[e.jsx("span",{children:s("onboarding.localSetup.troubleshoot.title")}),e.jsx(O,{name:"arrow-down-s",className:"h-4 w-4 transition-transform group-open:rotate-180"})]}),e.jsx("ul",{className:"list-disc space-y-1.5 pb-4 pl-4 text-xs text-muted-foreground",children:I==="windows"?e.jsx("li",{children:s("onboarding.localSetup.windows.hintDetectionFailed")}):e.jsxs(e.Fragment,{children:[e.jsx("li",{children:s("onboarding.localSetup.hint.ensurePath")}),e.jsx("li",{children:s("onboarding.localSetup.hint.setEnv")}),e.jsx("li",{children:s("onboarding.localSetup.hint.missingRuntime")})]})})]})]}),e.jsx("div",{className:"app-region-no-drag mt-5 text-center",children:e.jsxs("a",{href:d,target:"_blank",rel:"noopener noreferrer",className:"inline-flex items-center gap-1 text-xs text-muted-foreground transition-colors hover:text-foreground",children:[s(I==="windows"?"onboarding.localSetup.docs.windows":"onboarding.localSetup.docs.default"),e.jsx(O,{name:"external-link",className:"h-3 w-3"})]})})]})]})})}const Ke="curl -fsSL https://opencode.ai/v2/install | bash",be="npm install -g @opencode/cli",De="https://opencode.ai/download";function _e(a){const t=G.c(9),{windows:s,onCopy:i,copyTitle:n}=a;let l;t[0]!==s?(l=e.jsx("code",{className:"flex-1 min-w-0 text-left overflow-x-auto whitespace-nowrap",children:s?e.jsx("span",{style:{color:"var(--syntax-keyword)"},children:be}):e.jsxs(e.Fragment,{children:[e.jsx("span",{style:{color:"var(--syntax-keyword)"},children:"curl"}),e.jsx("span",{className:"text-muted-foreground",children:" -fsSL "}),e.jsx("span",{style:{color:"var(--syntax-string)"},children:"https://opencode.ai/v2/install"}),e.jsx("span",{className:"text-muted-foreground",children:" | "}),e.jsx("span",{style:{color:"var(--syntax-keyword)"},children:"bash"})]})}),t[0]=s,t[1]=l):l=t[1];let u;t[2]===Symbol.for("react.memo_cache_sentinel")?(u=e.jsx(O,{name:"file-copy",className:"h-4 w-4"}),t[2]=u):u=t[2];let r;t[3]!==n||t[4]!==i?(r=e.jsx("button",{onClick:i,className:"inline-flex items-center text-muted-foreground hover:text-foreground transition-colors",title:n,"aria-label":n,children:u}),t[3]=n,t[4]=i,t[5]=r):r=t[5];let o;return t[6]!==l||t[7]!==r?(o=e.jsxs("div",{className:"flex items-center justify-center gap-3",children:[l,r]}),t[6]=l,t[7]=r,t[8]=o):o=t[8],o}const Ae=3e4;function Oe({onBack:a,onCliAvailable:t,isFromRecovery:s=!1,onSwitchToRemote:i}){const{t:n}=J(),[l,u]=c.useState(!1),[r,o]=c.useState(!1),[w,R]=c.useState(!1),[j,T]=c.useState(!1),[I,x]=c.useState(!1),[m,k]=c.useState(null),[C,b]=c.useState(""),[N,K]=c.useState("unknown");c.useEffect(()=>{const d=setTimeout(()=>o(!0),Ae);return()=>clearTimeout(d)},[]),c.useEffect(()=>{R(B())},[]),c.useEffect(()=>{if(typeof navigator>"u"){K("unknown");return}const d=navigator.userAgent||"";if(/Windows/i.test(d)){K("windows");return}if(/Macintosh|Mac OS X/i.test(d)){K("macos");return}if(/Linux/i.test(d)){K("linux");return}K("unknown")},[]),c.useEffect(()=>{let d=!1;return(async()=>{try{const _=await ue();if(!_||d)return;const $=_.opencodeBinary??"";$&&b($)}catch{}})(),()=>{d=!0}},[]);const y=c.useCallback(async d=>{d.target.closest("button, a, input, select, textarea, code")||d.button===0&&w&&await pe()},[w]),f=c.useCallback(async()=>{try{const d=await X("/health");if(!d.ok)return!1;const _=await d.json();return _.openCodeRunning===!0||_.isOpenCodeReady===!0}catch{return!1}},[]),g=c.useCallback(async()=>{if(!(typeof window>"u")&&w)try{const d=await he();d.success&&d.path&&d.path.trim().length>0&&b(d.path.trim())}catch{}},[w]),L=c.useCallback(async()=>{T(!0);try{if(await xe({opencodeBinary:C.trim()}),w){await H();return}await X("/api/config/reload",{method:"POST"})}finally{setTimeout(()=>T(!1),1e3)}},[w,C]),S=c.useCallback(async()=>{const d=await me(N==="windows"?be:Ke);d.ok?(u(!0),setTimeout(()=>u(!1),2e3)):console.error("Failed to copy:",d.error)},[N]),A=c.useCallback(async()=>{x(!0),k(null);try{await f()?t?.():k(n("onboarding.localSetup.errors.cliNotReady"))}catch(d){k(d instanceof Error?d.message:n("onboarding.localSetup.errors.detectionFailed"))}finally{x(!1)}},[f,t,n]),E=De,F=N==="windows"?"C:\\Users\\you\\AppData\\Roaming\\npm\\opencode.cmd":N==="linux"?"/home/you/.opencode/bin/opencode":"/Users/you/.opencode/bin/opencode";return e.jsxs("div",{className:"h-full flex items-center justify-center bg-transparent p-8 relative cursor-default select-none",onMouseDown:y,children:[e.jsxs("div",{className:"w-full max-w-lg space-y-4 text-center",children:[e.jsx("div",{className:"flex items-center",children:e.jsx(U,{variant:"ghost",onClick:a,className:"p-0 text-muted-foreground hover:text-foreground",children:n("onboarding.common.actions.back")})}),e.jsxs("div",{className:"space-y-4",children:[e.jsx("h1",{className:"text-3xl font-semibold tracking-tight text-foreground",children:n("onboarding.localSetup.title")}),e.jsx("p",{className:"text-muted-foreground",children:n("onboarding.localSetup.description")})]}),N==="windows"&&e.jsxs("div",{className:"mx-auto max-w-2xl rounded-lg border border-border bg-background/50 p-4 text-left",children:[e.jsx("div",{className:"text-sm text-foreground",children:n("onboarding.localSetup.windows.title")}),e.jsxs("ol",{className:"mt-2 list-decimal space-y-1 pl-5 text-sm text-muted-foreground",children:[e.jsx("li",{children:n("onboarding.localSetup.windows.stepRunInstallInWsl")}),e.jsx("li",{children:n("onboarding.localSetup.windows.stepSetBinaryPath")})]})]}),e.jsx("div",{className:"flex justify-center",children:e.jsx("div",{className:"bg-background/60 backdrop-blur-sm border border-border rounded-lg px-5 py-3 font-mono text-sm w-fit",children:l?e.jsxs("div",{className:"flex items-center justify-center gap-2",style:{color:"var(--status-success)"},children:[e.jsx(O,{name:"check",className:"h-4 w-4"}),n("onboarding.common.status.copiedToClipboard")]}):e.jsx(_e,{windows:N==="windows",onCopy:S,copyTitle:n("onboarding.common.copyToClipboard")})})}),e.jsxs("a",{href:E,target:"_blank",rel:"noopener noreferrer",className:"text-sm text-muted-foreground hover:text-foreground transition-colors inline-flex items-center gap-1 justify-center",children:[n(N==="windows"?"onboarding.localSetup.docs.windows":"onboarding.localSetup.docs.default"),e.jsx(O,{name:"external-link",className:"h-3 w-3"})]}),m&&e.jsx("div",{className:"mx-auto max-w-md rounded-lg border border-destructive/50 bg-destructive/10 p-3 text-sm text-destructive",children:m}),e.jsxs("div",{className:"space-y-3",children:[e.jsx(U,{type:"button",onClick:A,disabled:I,className:"w-full max-w-xs",size:"lg",children:n(I?"onboarding.localSetup.actions.checking":"onboarding.localSetup.actions.checkAndContinue")}),e.jsx("p",{className:"text-xs text-muted-foreground",children:n("onboarding.localSetup.helper.checkAndContinue")})]}),e.jsx("div",{className:"mx-auto w-full max-w-xl pt-4",children:e.jsxs("div",{className:"space-y-2",children:[e.jsx("div",{className:"text-sm text-muted-foreground",children:n("onboarding.localSetup.field.alreadyInstalled")}),e.jsxs("div",{className:"flex gap-2",children:[e.jsx(z,{value:C,onChange:d=>b(d.target.value),placeholder:F,disabled:j,className:"flex-1 font-mono text-xs"}),e.jsx(U,{type:"button",variant:"secondary",onClick:g,disabled:j||!w,children:n("onboarding.localSetup.actions.browse")}),e.jsx(U,{type:"button",onClick:L,disabled:j,children:n("onboarding.localSetup.actions.apply")})]}),e.jsx("div",{className:"text-xs text-muted-foreground/70",children:n("onboarding.localSetup.helper.saveAndReload")})]})}),s&&i&&e.jsxs("div",{className:"text-center pt-4",children:[e.jsx("p",{className:"text-sm text-muted-foreground mb-2",children:n("onboarding.localSetup.remotePreference")}),e.jsx(U,{variant:"link",onClick:i,children:n("onboarding.localSetup.actions.connectRemoteServer")})]})]}),r&&e.jsx("div",{className:"absolute bottom-8 left-0 right-0 text-center space-y-1",children:N==="windows"?e.jsx(e.Fragment,{children:e.jsx("p",{className:"text-sm text-muted-foreground/70",children:n("onboarding.localSetup.windows.hintDetectionFailed")})}):e.jsxs(e.Fragment,{children:[e.jsx("p",{className:"text-sm text-muted-foreground/70",children:n("onboarding.localSetup.hint.ensurePath")}),e.jsx("p",{className:"text-sm text-muted-foreground/70",children:n("onboarding.localSetup.hint.setEnv")}),e.jsx("p",{className:"text-sm text-muted-foreground/70",children:n("onboarding.localSetup.hint.missingRuntime")})]})})]})}function se(a,t){if(a?.trim())return re(a.trim());if(t)return re(t)}function Ee(a,t,s){switch(a){case"local-unavailable":return{title:"Local OpenCode Unavailable",description:"OpenCode CLI could not be started or is not installed. Install OpenCode or connect to a remote server instead.",titleKey:"onboarding.desktopRecovery.localUnavailable.title",descriptionKey:"onboarding.desktopRecovery.localUnavailable.description",iconKey:"local",showRetry:!0,retryLabel:"Retry Local",retryLabelKey:"onboarding.desktopRecovery.localUnavailable.retry",showUseLocal:!0,showUseRemote:!0,useLocalLabel:"Set Up Local",useLocalLabelKey:"onboarding.desktopRecovery.localUnavailable.useLocal",useRemoteLabel:"Use Remote",useRemoteLabelKey:"onboarding.desktopRecovery.common.useRemote"};case"remote-missing":return{title:"No Default Connection",description:"Your saved default connection could not be found. Choose how you want to connect.",titleKey:"onboarding.desktopRecovery.noDefaultConnection.title",descriptionKey:"onboarding.desktopRecovery.noDefaultConnection.description",iconKey:"local",showRetry:!1,showUseLocal:!0,showUseRemote:!0,useLocalLabel:"Use Local",useLocalLabelKey:"onboarding.desktopRecovery.common.useLocal",useRemoteLabel:"Use Remote",useRemoteLabelKey:"onboarding.desktopRecovery.common.useRemote"};case"remote-unreachable":{const i=se(t,s);return{title:"Remote Server Unreachable",description:`Could not connect to "${i||"the remote server"}". Check your network connection and verify the server address.`,titleKey:"onboarding.desktopRecovery.remoteUnreachable.title",descriptionKey:"onboarding.desktopRecovery.remoteUnreachable.description",descriptionParams:i?{host:i}:void 0,iconKey:"remote",showRetry:!0,retryLabel:"Retry Connection",retryLabelKey:"onboarding.desktopRecovery.remoteUnreachable.retry",showUseLocal:!0,showUseRemote:!0,useLocalLabel:"Use Local",useLocalLabelKey:"onboarding.desktopRecovery.common.useLocal",useRemoteLabel:"Use Remote",useRemoteLabelKey:"onboarding.desktopRecovery.common.useRemote"}}case"remote-wrong-service":{const i=se(t,s);return{title:"Incompatible Server",description:`The server at "${i||"unknown"}" is not running OpenChamber. Verify the address points to an OpenChamber server.`,titleKey:"onboarding.desktopRecovery.incompatibleServer.title",descriptionKey:"onboarding.desktopRecovery.incompatibleServer.description",descriptionParams:i?{host:i}:void 0,iconKey:"remote",showRetry:!1,showUseLocal:!0,showUseRemote:!0,useLocalLabel:"Use Local",useLocalLabelKey:"onboarding.desktopRecovery.common.useLocal",useRemoteLabel:"Use Remote",useRemoteLabelKey:"onboarding.desktopRecovery.common.useRemote"}}case"remote-incompatible":{const i=se(t,s);return{title:"Server Update Required",description:`The OpenChamber server at "${i||"unknown"}" is not compatible with this app version. Update OpenChamber on the server, then try again.`,titleKey:"onboarding.desktopRecovery.remoteIncompatible.title",descriptionKey:"onboarding.desktopRecovery.remoteIncompatible.description",descriptionParams:i?{host:i}:void 0,iconKey:"remote",showRetry:!0,retryLabel:"Retry Connection",retryLabelKey:"onboarding.desktopRecovery.remoteUnreachable.retry",showUseLocal:!0,showUseRemote:!0,useLocalLabel:"Use Local",useLocalLabelKey:"onboarding.desktopRecovery.common.useLocal",useRemoteLabel:"Use Remote",useRemoteLabelKey:"onboarding.desktopRecovery.common.useRemote"}}case"missing-default-host":return{title:"No Default Connection",description:"Your saved default connection could not be found. Choose how you want to connect.",titleKey:"onboarding.desktopRecovery.noDefaultConnection.title",descriptionKey:"onboarding.desktopRecovery.noDefaultConnection.description",iconKey:"local",showRetry:!1,showUseLocal:!0,showUseRemote:!0,useLocalLabel:"Use Local",useLocalLabelKey:"onboarding.desktopRecovery.common.useLocal",useRemoteLabel:"Use Remote",useRemoteLabelKey:"onboarding.desktopRecovery.common.useRemote"};default:{const i=a;throw new Error(`Unknown recovery variant: ${i}`)}}}function Me(a){switch(a){case"local":return e.jsx(O,{name:"macbook",className:"h-8 w-8"});case"remote":return e.jsx(O,{name:"server",className:"h-8 w-8"})}}function Fe({variant:a,hostLabel:t,hostUrl:s,onRetry:i,onUseLocal:n,onUseRemote:l,isRetrying:u=!1}){const{t:r}=J(),o=Ee(a,t,s),w=o.retryLabelKey??"onboarding.desktopRecovery.actions.retryConnection",R=c.useMemo(()=>{if(o.descriptionParams?.host)return o.descriptionParams;if(a==="remote-unreachable")return{host:r("onboarding.desktopRecovery.placeholders.remoteServer")};if(a==="remote-wrong-service"||a==="remote-incompatible")return{host:r("onboarding.desktopRecovery.placeholders.unknownServer")}},[o.descriptionParams,r,a]);return e.jsx("div",{className:"flex flex-col items-center justify-center h-full p-8",children:e.jsxs("div",{className:"w-full max-w-md space-y-6",children:[e.jsxs("div",{className:"flex flex-col items-center space-y-3 text-center",children:[e.jsx("div",{className:"p-3 rounded-full",style:{backgroundColor:"var(--status-warning)",opacity:.15},children:e.jsx("div",{style:{color:"var(--status-warning)"},children:Me(o.iconKey)})}),e.jsx("h1",{className:"typography-ui-header text-xl font-semibold text-foreground",children:r(o.titleKey)}),e.jsx("p",{className:"text-muted-foreground text-sm max-w-sm",children:r(o.descriptionKey,R)})]}),s&&(a==="remote-unreachable"||a==="remote-wrong-service"||a==="remote-incompatible")&&e.jsxs("div",{className:"rounded-lg border border-border bg-background/50 p-3",children:[e.jsx("div",{className:"text-xs text-muted-foreground mb-1",children:r("onboarding.remoteConnection.field.serverAddress")}),e.jsx("div",{className:"font-mono text-sm text-foreground truncate",children:re(s)})]}),e.jsxs("div",{className:"flex flex-col gap-2",children:[o.showRetry&&i&&e.jsxs(U,{onClick:i,disabled:u,className:"w-full",children:[e.jsx(O,{name:"refresh",className:ne("h-4 w-4",u&&"animate-spin")}),r(u?"onboarding.desktopRecovery.actions.retrying":w)]}),e.jsxs("div",{className:"flex gap-2",children:[o.showUseLocal&&n&&e.jsxs(U,{variant:"outline",onClick:n,disabled:u,className:"flex-1",children:[e.jsx(O,{name:"macbook",className:"h-4 w-4"}),r(o.useLocalLabelKey)]}),o.showUseRemote&&l&&e.jsxs(U,{variant:"outline",onClick:l,disabled:u,className:"flex-1",children:[e.jsx(O,{name:"server",className:"h-4 w-4"}),r(o.useRemoteLabelKey)]})]})]})]})})}function de(a,t){if(t==="use-remote")return{kind:"remote-form"};switch(a){case"local-unavailable":return{kind:"local-setup"};case"remote-unreachable":case"remote-incompatible":case"remote-wrong-service":case"remote-missing":case"missing-default-host":return{kind:"switch-default-to-local"};default:{const s=a;throw new Error(`Unhandled RecoveryVariant: ${s}`)}}}function He(a){const t=G.c(29),{variant:s,hostUrl:i,hostLabel:n,onRetry:l,onChooseRemote:u,showRemoteForm:r,onCloseRemoteForm:o,onSwitchToLocalFromRemote:w,onEnterLocalSetup:R,isRetrying:j,localAvailable:T}=a,I=r===void 0?!1:r,x=j===void 0?!1:j,m=T===void 0?!0:T,k=Pe;let C;t[0]!==l?(C=async()=>{if(B()){await H();return}await X("/api/config/reload",{method:"POST"}),l?.()},t[0]=l,t[1]=C):C=t[1];const b=C;let N;t[2]!==R||t[3]!==s?(N=async()=>{if(de(s,"use-local").kind==="local-setup"){R?.();return}if(await k("local"),B()){await H();return}window.location.reload()},t[2]=R,t[3]=s,t[4]=N):N=t[4];const K=N;let y;t[5]!==u||t[6]!==s?(y=()=>{de(s,"use-remote").kind==="remote-form"&&u?.()},t[5]=u,t[6]=s,t[7]=y):y=t[7];const f=y;if(I){const S=s==="remote-wrong-service"?"":i||"",A=s==="remote-wrong-service"?"":n||"";let E;t[8]!==u||t[9]!==o?(E=o||(()=>u?.()),t[8]=u,t[9]=o,t[10]=E):E=t[10];const F=!m;let d;t[11]!==m||t[12]!==R||t[13]!==w?(d=m?w||(()=>{k("local").then(()=>{B()?H():R?.()})}):void 0,t[11]=m,t[12]=R,t[13]=w,t[14]=d):d=t[14];let _;return t[15]!==A||t[16]!==S||t[17]!==E||t[18]!==F||t[19]!==d?(_=e.jsx(fe,{onBack:E,initialUrl:S,initialLabel:A,isRecoveryMode:!0,showInstancePicker:F,onSwitchToLocal:d}),t[15]=A,t[16]=S,t[17]=E,t[18]=F,t[19]=d,t[20]=_):_=t[20],_}const g=m?K:void 0;let L;return t[21]!==b||t[22]!==f||t[23]!==n||t[24]!==i||t[25]!==x||t[26]!==g||t[27]!==s?(L=e.jsx(Fe,{variant:s,hostLabel:n,hostUrl:i,onRetry:b,onUseLocal:g,onUseRemote:f,isRetrying:x}),t[21]=b,t[22]=f,t[23]=n,t[24]=i,t[25]=x,t[26]=g,t[27]=s,t[28]=L):L=t[28],L}async function Pe(a){if(!B())return;const t=await W();await V({...t,...a==="local"?{defaultHostId:"local"}:{},initialHostChoiceCompleted:!0})}function fo(a){const t=G.c(29),{onBack:s,onCliAvailable:i,mode:n,recoveryVariant:l,recoveryHostUrl:u,recoveryHostLabel:r,onEnterLocalSetup:o,localAvailable:w}=a,R=n===void 0?"first-launch":n,j=l===void 0?"missing-default-host":l,T=w===void 0?!0:w,[I,x]=c.useState(!1),[m,k]=c.useState(!1);let C;t[0]===Symbol.for("react.memo_cache_sentinel")?(C=()=>{k(!1),x(!1)},t[0]=C):C=t[0];let b;t[1]!==R||t[2]!==r||t[3]!==u||t[4]!==j?(b=[R,j,u,r],t[1]=R,t[2]=r,t[3]=u,t[4]=j,t[5]=b):b=t[5],c.useEffect(C,b);const N=m?"local-setup":R;if(N==="recovery"){let y;t[6]===Symbol.for("react.memo_cache_sentinel")?(y=()=>x(!0),t[6]=y):y=t[6];let f,g;t[7]===Symbol.for("react.memo_cache_sentinel")?(f=()=>x(!1),g=()=>{x(!1),k(!0)},t[7]=f,t[8]=g):(f=t[7],g=t[8]);let L;t[9]!==o?(L=()=>{k(!0),o?.()},t[9]=o,t[10]=L):L=t[10];let S;return t[11]!==T||t[12]!==r||t[13]!==u||t[14]!==j||t[15]!==I||t[16]!==L?(S=e.jsx(He,{variant:j,hostUrl:u,hostLabel:r,onChooseRemote:y,showRemoteForm:I,onCloseRemoteForm:f,onSwitchToLocalFromRemote:g,onEnterLocalSetup:L,localAvailable:T}),t[11]=T,t[12]=r,t[13]=u,t[14]=j,t[15]=I,t[16]=L,t[17]=S):S=t[17],S}if(N==="local-setup"){let y;t[18]!==s||t[19]!==m?(y=()=>{m?k(!1):s?.()},t[18]=s,t[19]=m,t[20]=y):y=t[20];let f;t[21]===Symbol.for("react.memo_cache_sentinel")?(f=()=>x(!0),t[21]=f):f=t[21];let g;return t[22]!==i||t[23]!==m||t[24]!==y?(g=e.jsx(Oe,{onBack:y,onCliAvailable:i,isFromRecovery:m,onSwitchToRemote:f}),t[22]=i,t[23]=m,t[24]=y,t[25]=g):g=t[25],g}let K;return t[26]!==T||t[27]!==i?(K=e.jsx(Te,{onCliAvailable:i,localAvailable:T}),t[26]=T,t[27]=i,t[28]=K):K=t[28],K}export{fo as OnboardingScreen};
@@ -1 +1 @@
1
- import{k4 as k,k9 as j,kh as y}from"./useAppFontEffects-ZM9ij19-.js";import{k as D,a as C}from"./web-components-C583Pmfm.js";import{M as P,G as O,u as L,W as A,a as M,b as R,n as F,t as H}from"./Virtualizer-CZlLSacm.js";import{j as d,r as w}from"./vendor-react-BUCujlKS.js";import{V as _,F as N}from"./VirtualizedFileDiff-BfEBad09.js";function T({hunkIndex:e,lineIndex:t,conflictIndex:n}){return`merge-conflict-action-${e}-${t}-${n}`}function V(e,t){const n=t.hunks[e.hunkIndex];if(n!=null)return{hunkIndex:e.hunkIndex,lineIndex:z(n,e.startContentIndex)}}function z(e,t){let n=e.unifiedLineStart;for(let l=0;l<t;l++){const o=e.hunkContent[l];n+=o.type==="context"?o.lines:o.deletions+o.additions}return n}function U(e){const t=k(e);if(t.length!==1)throw console.error(t),new Error("PatchDiff: Provided patch must include only 1 patch, with 1 diff");const{files:n}=t[0];if(n.length!==1)throw console.error(n),new Error("FileDiff: Provided patch must contain exactly 1 file diff");return n[0]}function $({fileDiff:e,actions:t,renderCustomHeader:n,renderHeaderPrefix:l,renderHeaderFilenameSuffix:o,renderHeaderMetadata:x,renderAnnotation:f,renderGutterUtility:u,renderMergeConflictUtility:s,lineAnnotations:a,getHoveredLine:p,getInstance:m}){const g=n?.(e),c=l?.(e),i=o?.(e),v=x?.(e);return d.jsxs(d.Fragment,{children:[g!=null?d.jsx("div",{slot:j,children:g}):d.jsxs(d.Fragment,{children:[c!=null&&d.jsx("div",{slot:"header-prefix",children:c}),i!=null&&d.jsx("div",{slot:"header-filename-suffix",children:i}),v!=null&&d.jsx("div",{slot:"header-metadata",children:v})]}),f!=null&&a?.map((r,h)=>d.jsx("div",{slot:D(r),children:f(r)},h)),t!=null&&s!=null&&m!=null&&t.map(r=>{if(r==null)return;const h=b(r,e);return d.jsx("div",{slot:h,style:P,children:s(r,m)},h)}),u!=null&&d.jsx("div",{slot:"gutter-utility-slot",style:O,children:u(p)})]})}function b(e,t){const n=V(e,t);return n!=null?T({hunkIndex:n.hunkIndex,lineIndex:n.lineIndex,conflictIndex:e.conflictIndex}):void 0}const S=typeof window>"u"?w.useEffect:w.useLayoutEffect;function G({fileDiff:e,options:t,lineAnnotations:n,selectedLines:l,prerenderedHTML:o,metrics:x,hasGutterRenderUtility:f,hasCustomHeader:u,disableWorkerPool:s,contentEditable:a}){const p=L(),m=l!==void 0,g=w.useContext(A),c=M(),i=w.useRef(null),v=R(r=>{if(r!=null){if(i.current!=null)throw new Error("useFileDiffInstance: An instance should not already exist when a node is created");p!=null?i.current=new _(E({controlledSelection:m,contentEditable:a,hasCustomHeader:u,hasEditor:c!==void 0,hasGutterRenderUtility:f,options:t}),p,x,s?void 0:g,!0):i.current=new N(E({controlledSelection:m,contentEditable:a,hasCustomHeader:u,hasEditor:c!==void 0,hasGutterRenderUtility:f,options:t}),s?void 0:g,!0),i.current.hydrate({fileDiff:e,fileContainer:r,lineAnnotations:n,prerenderedHTML:o})}else{if(i.current==null)throw new Error("useFileDiffInstance: A FileDiff instance should exist when unmounting");i.current.cleanUp(),i.current=null}});return S(()=>{const{current:r}=i;if(r==null)return;const h=E({controlledSelection:m,contentEditable:a,hasCustomHeader:u,hasEditor:c!==void 0,hasGutterRenderUtility:f,options:t}),I=!C(r.options,h);r.setOptions(h),r.render({forceRender:I,fileDiff:e,lineAnnotations:n}),l!==void 0&&r.setSelectedLines(l)}),S(()=>{if(a&&i.current!=null){if(c===void 0)throw new Error("FileDiff: Editor is not attached");return c.edit(i.current)}},[a,c]),{ref:v,getHoveredLine:w.useCallback(()=>i.current?.getHoveredLine(),[])}}function E({options:e,controlledSelection:t,contentEditable:n,hasCustomHeader:l,hasEditor:o,hasGutterRenderUtility:x}){const f=n&&o,u=t||x||l;if(!u&&!f)return e;let s={...e};return u&&(s={...s,controlledSelection:t,renderCustomHeader:l?F:e?.renderCustomHeader,renderGutterUtility:x?F:e?.renderGutterUtility}),f&&(s={...s,useTokenTransformer:!0,enableGutterUtility:!1,enableLineSelection:!1,expandUnchanged:!0,lineHoverHighlight:"disabled"}),s}function X({patch:e,options:t,metrics:n,lineAnnotations:l,selectedLines:o,className:x,style:f,prerenderedHTML:u,renderAnnotation:s,renderCustomHeader:a,renderHeaderPrefix:p,renderHeaderFilenameSuffix:m,renderHeaderMetadata:g,renderGutterUtility:c,disableWorkerPool:i=!1,contentEditable:v=!1}){const r=q(e),{ref:h,getHoveredLine:I}=G({fileDiff:r,options:t,metrics:n,lineAnnotations:l,selectedLines:o,prerenderedHTML:u,hasGutterRenderUtility:c!=null,hasCustomHeader:a!=null,disableWorkerPool:i,contentEditable:v});return d.jsx(y,{ref:h,className:x,style:f,children:H($({fileDiff:r,renderCustomHeader:a,renderHeaderPrefix:p,renderHeaderFilenameSuffix:m,renderHeaderMetadata:g,renderAnnotation:s,lineAnnotations:l,renderGutterUtility:c,getHoveredLine:I}),u)})}function q(e){return w.useMemo(()=>U(e),[e])}export{X as P};
1
+ import{k4 as k,k9 as j,kh as y}from"./useAppFontEffects-Bzyszv2N.js";import{k as D,a as C}from"./web-components-BEo4-ISu.js";import{M as P,G as O,u as L,W as A,a as M,b as R,n as F,t as H}from"./Virtualizer-CZlLSacm.js";import{j as d,r as w}from"./vendor-react-BUCujlKS.js";import{V as _,F as N}from"./VirtualizedFileDiff-DONC4eI2.js";function T({hunkIndex:e,lineIndex:t,conflictIndex:n}){return`merge-conflict-action-${e}-${t}-${n}`}function V(e,t){const n=t.hunks[e.hunkIndex];if(n!=null)return{hunkIndex:e.hunkIndex,lineIndex:z(n,e.startContentIndex)}}function z(e,t){let n=e.unifiedLineStart;for(let l=0;l<t;l++){const o=e.hunkContent[l];n+=o.type==="context"?o.lines:o.deletions+o.additions}return n}function U(e){const t=k(e);if(t.length!==1)throw console.error(t),new Error("PatchDiff: Provided patch must include only 1 patch, with 1 diff");const{files:n}=t[0];if(n.length!==1)throw console.error(n),new Error("FileDiff: Provided patch must contain exactly 1 file diff");return n[0]}function $({fileDiff:e,actions:t,renderCustomHeader:n,renderHeaderPrefix:l,renderHeaderFilenameSuffix:o,renderHeaderMetadata:x,renderAnnotation:f,renderGutterUtility:u,renderMergeConflictUtility:s,lineAnnotations:a,getHoveredLine:p,getInstance:m}){const g=n?.(e),c=l?.(e),i=o?.(e),v=x?.(e);return d.jsxs(d.Fragment,{children:[g!=null?d.jsx("div",{slot:j,children:g}):d.jsxs(d.Fragment,{children:[c!=null&&d.jsx("div",{slot:"header-prefix",children:c}),i!=null&&d.jsx("div",{slot:"header-filename-suffix",children:i}),v!=null&&d.jsx("div",{slot:"header-metadata",children:v})]}),f!=null&&a?.map((r,h)=>d.jsx("div",{slot:D(r),children:f(r)},h)),t!=null&&s!=null&&m!=null&&t.map(r=>{if(r==null)return;const h=b(r,e);return d.jsx("div",{slot:h,style:P,children:s(r,m)},h)}),u!=null&&d.jsx("div",{slot:"gutter-utility-slot",style:O,children:u(p)})]})}function b(e,t){const n=V(e,t);return n!=null?T({hunkIndex:n.hunkIndex,lineIndex:n.lineIndex,conflictIndex:e.conflictIndex}):void 0}const S=typeof window>"u"?w.useEffect:w.useLayoutEffect;function G({fileDiff:e,options:t,lineAnnotations:n,selectedLines:l,prerenderedHTML:o,metrics:x,hasGutterRenderUtility:f,hasCustomHeader:u,disableWorkerPool:s,contentEditable:a}){const p=L(),m=l!==void 0,g=w.useContext(A),c=M(),i=w.useRef(null),v=R(r=>{if(r!=null){if(i.current!=null)throw new Error("useFileDiffInstance: An instance should not already exist when a node is created");p!=null?i.current=new _(E({controlledSelection:m,contentEditable:a,hasCustomHeader:u,hasEditor:c!==void 0,hasGutterRenderUtility:f,options:t}),p,x,s?void 0:g,!0):i.current=new N(E({controlledSelection:m,contentEditable:a,hasCustomHeader:u,hasEditor:c!==void 0,hasGutterRenderUtility:f,options:t}),s?void 0:g,!0),i.current.hydrate({fileDiff:e,fileContainer:r,lineAnnotations:n,prerenderedHTML:o})}else{if(i.current==null)throw new Error("useFileDiffInstance: A FileDiff instance should exist when unmounting");i.current.cleanUp(),i.current=null}});return S(()=>{const{current:r}=i;if(r==null)return;const h=E({controlledSelection:m,contentEditable:a,hasCustomHeader:u,hasEditor:c!==void 0,hasGutterRenderUtility:f,options:t}),I=!C(r.options,h);r.setOptions(h),r.render({forceRender:I,fileDiff:e,lineAnnotations:n}),l!==void 0&&r.setSelectedLines(l)}),S(()=>{if(a&&i.current!=null){if(c===void 0)throw new Error("FileDiff: Editor is not attached");return c.edit(i.current)}},[a,c]),{ref:v,getHoveredLine:w.useCallback(()=>i.current?.getHoveredLine(),[])}}function E({options:e,controlledSelection:t,contentEditable:n,hasCustomHeader:l,hasEditor:o,hasGutterRenderUtility:x}){const f=n&&o,u=t||x||l;if(!u&&!f)return e;let s={...e};return u&&(s={...s,controlledSelection:t,renderCustomHeader:l?F:e?.renderCustomHeader,renderGutterUtility:x?F:e?.renderGutterUtility}),f&&(s={...s,useTokenTransformer:!0,enableGutterUtility:!1,enableLineSelection:!1,expandUnchanged:!0,lineHoverHighlight:"disabled"}),s}function X({patch:e,options:t,metrics:n,lineAnnotations:l,selectedLines:o,className:x,style:f,prerenderedHTML:u,renderAnnotation:s,renderCustomHeader:a,renderHeaderPrefix:p,renderHeaderFilenameSuffix:m,renderHeaderMetadata:g,renderGutterUtility:c,disableWorkerPool:i=!1,contentEditable:v=!1}){const r=q(e),{ref:h,getHoveredLine:I}=G({fileDiff:r,options:t,metrics:n,lineAnnotations:l,selectedLines:o,prerenderedHTML:u,hasGutterRenderUtility:c!=null,hasCustomHeader:a!=null,disableWorkerPool:i,contentEditable:v});return d.jsx(y,{ref:h,className:x,style:f,children:H($({fileDiff:r,renderCustomHeader:a,renderHeaderPrefix:p,renderHeaderFilenameSuffix:m,renderHeaderMetadata:g,renderAnnotation:s,lineAnnotations:l,renderGutterUtility:c,getHoveredLine:I}),u)})}function q(e){return w.useMemo(()=>U(e),[e])}export{X as P};
@@ -1,4 +1,4 @@
1
- import{R as $,j as F,c as we,r as l}from"./vendor-react-BUCujlKS.js";import{a as nt}from"./web-components-C583Pmfm.js";import{f as We}from"./computeVirtualFileMetrics-RF-KjfUH.js";import{V as rt,F as it}from"./VirtualizedFileDiff-BfEBad09.js";import{V as ot}from"./Virtualizer-D_a8gKmg.js";import{eE as st,eF as je,bj as at,c8 as lt,h as Be}from"./useAppFontEffects-ZM9ij19-.js";import{I as _e,a as ct,u as dt}from"./useInlineCommentController-CkfxMJPy.js";import"./index-CvLgnuNI.js";import{at as ut}from"./runtimeEndpointReset-DeaERc0M.js";import{ensurePierreThemeRegistered as Ve,getResolvedShikiTheme as Ue}from"./appThemeRegistry-DAdawJZn.js";const xe=n=>{if(n.type==="new"){const r=Math.min(n.selection.start,n.selection.end),i=Math.max(n.selection.start,n.selection.end);return`new-comment-${n.selection.side??"additions"}-${r}-${i}`}return`draft-${n.draft.id}`},ft=n=>{const{drafts:r,editingDraftId:i,selection:s}=n,c=[];for(const m of r){if(!Number.isFinite(m.endLine))continue;const x=Math.max(1,Math.floor(m.endLine)),M=m.side==="original"?"deletions":"additions";c.push({lineNumber:x,side:M,metadata:{type:m.id===i?"edit":"saved",draft:m}})}return s&&!i&&c.push({lineNumber:Math.max(s.start,s.end),side:s.side??"additions",metadata:{type:"new",selection:s}}),c};function ht(n){const r=n.trim();if(!r)return null;if(/^-?\d+(\.\d+)?$/.test(r)){const i=Number.parseFloat(r);return Number.isFinite(i)?i:null}if(r.endsWith("px")){const i=Number.parseFloat(r.slice(0,-2));return Number.isFinite(i)?i:null}return null}function Ke(n){if(!(!n||n<=0))return Math.max(200,Math.floor(n))}function pt(n){const{diffRootRef:r,drafts:i,selection:s,editingDraftId:c,commentText:m,onTextChange:x,fileLabel:M,onSave:d,onCancel:R,onEdit:z,onDelete:N}=n,[ue,W]=$.useState(0),[O,U]=$.useState(null),D=$.useMemo(()=>!s||c?null:xe({type:"new",selection:s}),[c,s]),Z=$.useMemo(()=>{const h=i.map(E=>xe({type:E.id===c?"edit":"saved",draft:E}));return D&&h.push(D),h},[i,c,D]),A=$.useCallback(h=>{const E=r.current;if(!E)return null;const T=E.querySelector("diffs-container");if(!(T instanceof HTMLElement))return null;const w=T.querySelector(`[data-annotation-id="${h}"]`);if(w instanceof HTMLElement)return w;const C=T.shadowRoot;return C?C.querySelector(`[data-annotation-id="${h}"]`):null},[r]);$.useEffect(()=>{if(Z.length===0)return;let h=!1,E=0;const T=12,w=()=>{h||Z.every(q=>!!A(q))||E>=T||(E+=1,requestAnimationFrame(()=>{h||(W(q=>q+1),w())}))};return w(),()=>{h=!0}},[Z,A]),$.useEffect(()=>{const h=r.current;if(!h)return;const E=()=>{const w=getComputedStyle(h),C=ht(w.getPropertyValue("--oc-context-panel-width")),q=h.getBoundingClientRect(),I=C??q.width;U(I>0?I:null)};E();const T=new ResizeObserver(()=>{E()});return T.observe(h),window.addEventListener("resize",E),()=>{T.disconnect(),window.removeEventListener("resize",E)}},[r]);const ee=$.useCallback(h=>{const T=r.current?.getBoundingClientRect(),w=h.closest("[data-annotation-content]"),C=w instanceof HTMLElement?w.getBoundingClientRect():h.getBoundingClientRect(),q=[C.width];T&&q.push(T.right-C.left);const I=q.filter(K=>Number.isFinite(K)&&K>0);return I.length>0?Ke(Math.min(...I)):Ke(O)},[r,O]);return F.jsxs(F.Fragment,{children:[i.map(h=>{const E=xe({type:h.id===c?"edit":"saved",draft:h}),T=A(E);if(!T)return null;const w=ee(T);return h.id===c?we.createPortal(F.jsx(_e,{initialText:m,onTextChange:x,fileLabel:M,lineRange:{start:h.startLine,end:h.endLine,side:h.side==="original"?"deletions":"additions"},isEditing:!0,onSave:d,onCancel:R,maxWidth:w}),T,`draft-edit-${h.id}`):we.createPortal(F.jsx(ct,{draft:h,onEdit:()=>z(h),onDelete:()=>N(h),maxWidth:w}),T,`draft-card-${h.id}`)}),s&&!c&&D&&(()=>{const h=A(D);if(!h)return null;const E=ee(h);return we.createPortal(F.jsx(_e,{initialText:m,onTextChange:x,fileLabel:M,lineRange:s,isEditing:!1,onSave:d,onCancel:R,maxWidth:E}),h,D)})()]})}const Ge=[],mt=`
1
+ import{R as $,j as F,c as we,r as l}from"./vendor-react-BUCujlKS.js";import{a as nt}from"./web-components-BEo4-ISu.js";import{f as We}from"./computeVirtualFileMetrics-_-20umCs.js";import{V as rt,F as it}from"./VirtualizedFileDiff-DONC4eI2.js";import{V as ot}from"./Virtualizer-D_a8gKmg.js";import{eE as st,eF as je,bj as at,c8 as lt,h as Be}from"./useAppFontEffects-Bzyszv2N.js";import{I as _e,a as ct,u as dt}from"./useInlineCommentController-zOf6ORAq.js";import"./index-CvLgnuNI.js";import{at as ut}from"./runtimeEndpointReset-C45jrFq4.js";import{ensurePierreThemeRegistered as Ve,getResolvedShikiTheme as Ue}from"./appThemeRegistry-Br2TLSlb.js";const xe=n=>{if(n.type==="new"){const r=Math.min(n.selection.start,n.selection.end),i=Math.max(n.selection.start,n.selection.end);return`new-comment-${n.selection.side??"additions"}-${r}-${i}`}return`draft-${n.draft.id}`},ft=n=>{const{drafts:r,editingDraftId:i,selection:s}=n,c=[];for(const m of r){if(!Number.isFinite(m.endLine))continue;const x=Math.max(1,Math.floor(m.endLine)),M=m.side==="original"?"deletions":"additions";c.push({lineNumber:x,side:M,metadata:{type:m.id===i?"edit":"saved",draft:m}})}return s&&!i&&c.push({lineNumber:Math.max(s.start,s.end),side:s.side??"additions",metadata:{type:"new",selection:s}}),c};function ht(n){const r=n.trim();if(!r)return null;if(/^-?\d+(\.\d+)?$/.test(r)){const i=Number.parseFloat(r);return Number.isFinite(i)?i:null}if(r.endsWith("px")){const i=Number.parseFloat(r.slice(0,-2));return Number.isFinite(i)?i:null}return null}function Ke(n){if(!(!n||n<=0))return Math.max(200,Math.floor(n))}function pt(n){const{diffRootRef:r,drafts:i,selection:s,editingDraftId:c,commentText:m,onTextChange:x,fileLabel:M,onSave:d,onCancel:R,onEdit:z,onDelete:N}=n,[ue,W]=$.useState(0),[O,U]=$.useState(null),D=$.useMemo(()=>!s||c?null:xe({type:"new",selection:s}),[c,s]),Z=$.useMemo(()=>{const h=i.map(E=>xe({type:E.id===c?"edit":"saved",draft:E}));return D&&h.push(D),h},[i,c,D]),A=$.useCallback(h=>{const E=r.current;if(!E)return null;const T=E.querySelector("diffs-container");if(!(T instanceof HTMLElement))return null;const w=T.querySelector(`[data-annotation-id="${h}"]`);if(w instanceof HTMLElement)return w;const C=T.shadowRoot;return C?C.querySelector(`[data-annotation-id="${h}"]`):null},[r]);$.useEffect(()=>{if(Z.length===0)return;let h=!1,E=0;const T=12,w=()=>{h||Z.every(q=>!!A(q))||E>=T||(E+=1,requestAnimationFrame(()=>{h||(W(q=>q+1),w())}))};return w(),()=>{h=!0}},[Z,A]),$.useEffect(()=>{const h=r.current;if(!h)return;const E=()=>{const w=getComputedStyle(h),C=ht(w.getPropertyValue("--oc-context-panel-width")),q=h.getBoundingClientRect(),I=C??q.width;U(I>0?I:null)};E();const T=new ResizeObserver(()=>{E()});return T.observe(h),window.addEventListener("resize",E),()=>{T.disconnect(),window.removeEventListener("resize",E)}},[r]);const ee=$.useCallback(h=>{const T=r.current?.getBoundingClientRect(),w=h.closest("[data-annotation-content]"),C=w instanceof HTMLElement?w.getBoundingClientRect():h.getBoundingClientRect(),q=[C.width];T&&q.push(T.right-C.left);const I=q.filter(K=>Number.isFinite(K)&&K>0);return I.length>0?Ke(Math.min(...I)):Ke(O)},[r,O]);return F.jsxs(F.Fragment,{children:[i.map(h=>{const E=xe({type:h.id===c?"edit":"saved",draft:h}),T=A(E);if(!T)return null;const w=ee(T);return h.id===c?we.createPortal(F.jsx(_e,{initialText:m,onTextChange:x,fileLabel:M,lineRange:{start:h.startLine,end:h.endLine,side:h.side==="original"?"deletions":"additions"},isEditing:!0,onSave:d,onCancel:R,maxWidth:w}),T,`draft-edit-${h.id}`):we.createPortal(F.jsx(ct,{draft:h,onEdit:()=>z(h),onDelete:()=>N(h),maxWidth:w}),T,`draft-card-${h.id}`)}),s&&!c&&D&&(()=>{const h=A(D);if(!h)return null;const E=ee(h);return we.createPortal(F.jsx(_e,{initialText:m,onTextChange:x,fileLabel:M,lineRange:s,isEditing:!1,onSave:d,onCancel:R,maxWidth:E}),h,D)})()]})}const Ge=[],mt=`
2
2
  [data-gutter-buffer="annotation"] { min-height: 0; }
3
3
  [data-code] { min-height: 2.5rem; align-content: start; }
4
4
  `,Ye=5e5,gt=`
@@ -1,4 +1,4 @@
1
- import{R as t,j as n}from"./vendor-react-BUCujlKS.js";import{n as jt,u as Qe,a as he,x as Xe,h as qe,y as xt}from"./index-CvLgnuNI.js";import{c as bt,s as Ct,P as Rt,C as Mt}from"./shikiHighlight-_HeCCHx1.js";import{f as Tt,z as G,cC as Pt,aJ as kt,b as Ze,K as Nt,ai as Et,_ as It,bj as Dt,T as Vt,fY as Ft,a3 as Lt,ix as At,l as et,fX as Ot,ay as tt,hy as zt,fV as Kt,dy as nt,f_ as Wt,f$ as _t,m as Bt,iy as $t,as as rt,ae as ge,af as ve,at as st,B as ee,I as L,ag as we,av as it,bh as te,g as Gt,c8 as Jt,aB as Ut,cp as Ht,iz as Yt}from"./useAppFontEffects-ZM9ij19-.js";import{u as Qt,n as Xt}from"./useInlineCommentController-CkfxMJPy.js";import{b as qt}from"./CodeMirrorCommentWidgets-CWhdh0wf.js";import{getResolvedShikiTheme as Zt}from"./appThemeRegistry-DAdawJZn.js";import{E as en}from"./vendor-codemirror-view-CiLROUVV.js";import{as as tn}from"./runtimeEndpointReset-DeaERc0M.js";import"./vendor-scheduler-7OC5HNn7.js";import"./vendor-zod-Gea9uBlY.js";import"./vendor-vite-runtime-DD1OZmLC.js";import"./vendor-zustand-BAGL70zf.js";import"./vendor-opencode-client-_BAHQo4R.js";import"./vendor-codemirror-state-C9awkmn-.js";import"./vendor-marijn-find-cluster-break-DXwl3gUT.js";import"./vendor-codemirror-commands-B7H_j0iU.js";import"./vendor-codemirror-language-BgPj_McA.js";import"./vendor-lezer-common-B3-cUCR_.js";import"./vendor-lezer-highlight-CDMHUZ74.js";import"./vendor-style-mod-NZ5MEPvj.js";import"./vendor-codemirror-search-BmS-GmcX.js";import"./vendor-crelt-C8TCjufn.js";import"./vendor-replit-codemirror-vim-B2DJlAhT.js";import"./vendor-replit-codemirror-vim-core-FHzKdNUS.js";import"./vendor-simplewebauthn-browser-VDA66rT_.js";import"./vendor-base-ui-CsXYnR5c.js";import"./vendor-floating-ui-utils-D6FqdtJt.js";import"./vendor-floating-ui-react-dom-DxYCWdHj.js";import"./vendor-floating-ui-dom-BTvzWks8.js";import"./vendor-floating-ui-core-PuGzNPnN.js";import"./vendor-use-sync-external-store-D6wYuSt-.js";import"./vendor-class-variance-authority-5VPnzWs2.js";import"./vendor-clsx-B-dksMZM.js";import"./vendor-dnd-kit-core-BZknOX2w.js";import"./vendor-dnd-kit-utilities-B_MdXhJC.js";import"./vendor-dnd-kit-accessibility-BHxJPORy.js";import"./vendor-dnd-kit-sortable-CsEagZ81.js";import"./vendor-framer-motion-Bq3iTZ6r.js";import"./vendor-motion-dom-DcCgeG69.js";import"./vendor-motion-utils-BGh8QBgx.js";import"./vendor-tanstack-react-virtual-ClYN8CzB.js";import"./vendor-tanstack-virtual-core-BewVQryB.js";import"./contextPanelEmbeddedChat-CirXEPJq.js";import"./vendor-sonner-DFyL3AvE.js";import"./vendor-cmdk-DgLInKvT.js";import"./vendor-radix-ui-react-dialog-B94Bt2qq.js";import"./vendor-radix-ui-primitive-Dc_FVRD7.js";import"./vendor-radix-ui-react-compose-refs-DcAh5WdT.js";import"./vendor-radix-ui-react-context-Czxm7Z62.js";import"./vendor-radix-ui-react-id-f5BLKEVw.js";import"./vendor-radix-ui-react-use-layout-effect-D_3IhJdJ.js";import"./vendor-radix-ui-react-use-controllable-state-BFT5YmkA.js";import"./vendor-radix-ui-react-dismissable-layer-D7kXcwgJ.js";import"./vendor-radix-ui-react-primitive-DhVoX9SD.js";import"./vendor-radix-ui-react-slot-BQgQOasS.js";import"./vendor-radix-ui-react-use-callback-ref-BZPnuXAC.js";import"./vendor-radix-ui-react-use-escape-keydown-oph88g-F.js";import"./vendor-radix-ui-react-focus-scope-CiaxW4dD.js";import"./vendor-radix-ui-react-portal-BMJYHWck.js";import"./vendor-radix-ui-react-presence-CNxf-uq4.js";import"./vendor-radix-ui-react-focus-guards-B6qJXYua.js";import"./vendor-react-remove-scroll-DO7dCTnK.js";import"./vendor-tslib-De9GV7Vy.js";import"./vendor-react-remove-scroll-bar-BcFYyj3E.js";import"./vendor-react-style-singleton-q6EMHnwf.js";import"./vendor-get-nonce-C-Z93AgS.js";import"./vendor-use-sidecar-zDC0RhA3.js";import"./vendor-use-callback-ref-D3RC8gqK.js";import"./vendor-aria-hidden-DvXkyWUv.js";import"./vendor-codemirror-lang-javascript-Cc2ZYbgX.js";import"./vendor-lezer-javascript-D7Tj24ot.js";import"./vendor-lezer-lr-bhwg1HMg.js";import"./vendor-codemirror-autocomplete-DzPz9Wgq.js";import"./vendor-w3c-keyname-Vcq4gwWv.js";import"./vendor-codemirror-lang-json-CMBS2tG9.js";import"./vendor-lezer-json-Iaex0UN-.js";import"./vendor-codemirror-lang-css-O0cZX78y.js";import"./vendor-lezer-css-C5xB6jxd.js";import"./vendor-codemirror-lang-html-CfgK872x.js";import"./vendor-lezer-html-C0I1p52t.js";import"./vendor-codemirror-lang-markdown-BPGOH9ye.js";import"./vendor-lezer-markdown-C6g-d6P3.js";import"./vendor-codemirror-language-data-U-lXzXNK.js";import"./vendor-codemirror-lang-python-HahnQaAS.js";import"./vendor-lezer-python-CvuFxeZl.js";import"./vendor-legendapp-list-BuBPBC3R.js";import"./vendor-tailwind-merge-CPcsbTWB.js";import"./vendor-fuse.js-Dw8P0qyA.js";import"./textMateThemeFromAppTheme-C95XdFGj.js";import"./themeResolver-BmJyTmjJ.js";import"./vendor-pierre-theming-C6Z4M5_u.js";import"./vendor-shikijs-core-CGM_jqPK.js";import"./vendor-shikijs-types-CPSbSeK6.js";import"./vendor-shikijs-vscode-textmate-BgLrS_2D.js";import"./vendor-hast-util-to-html-BKBhbTDb.js";import"./vendor-html-void-elements-CkdplsNl.js";import"./vendor-property-information-rJCbAzvX.js";import"./vendor-zwitch-C2o2j-tx.js";import"./vendor-stringify-entities-CsH1VEn9.js";import"./vendor-character-entities-legacy-BpoLgcEt.js";import"./vendor-character-entities-html4-D7taRCQ7.js";import"./vendor-ccount-c2V3InAJ.js";import"./vendor-comma-separated-tokens-D8TqSuIK.js";import"./vendor-space-separated-tokens-DD3iYX1K.js";import"./vendor-hast-util-whitespace-D4Wp6AEg.js";import"./GuestAttachDialog-BIa9jCfL.js";import"./PluginPane-BibJit86.js";const nn=()=>{const l=new Map,d=new Map;return{schedule:(c,s,m)=>{if(s<=(d.get(c)??Number.NEGATIVE_INFINITY))return l.get(c)??Promise.resolve();d.set(c,s);const h=(l.get(c)??Promise.resolve()).then(m,m);return l.set(c,h.catch(()=>{d.get(c)===s&&d.delete(c)})),h},pendingFor:async c=>{await l.get(c)},reset:c=>{d.delete(c)}}},y=l=>{if(!l)return"";const d=l.replace(/\\/g,"/");return d==="/"?"/":d.replace(/\/+$/,"")},rn=(l,d)=>{const c=y(d.currentDirectory),s=y(d.homeDirectory),m=y(l);return c&&m.startsWith(c+"/")?m.slice(c.length+1):s&&m===s?"~":s&&m.startsWith(s+"/")?`~${m.slice(s.length)}`:m},sn=(l,d,c)=>{const s=y(l.trim());if(!s)return null;const m=c?d.find(h=>h.id===c)??null:null;if(m?.path){const h=y(m.path);if(s===h||s.startsWith(`${h}/`))return{id:m.id,path:m.path}}const R=d.filter(h=>{const M=y(h.path);return s===M||s.startsWith(`${M}/`)}).sort((h,M)=>y(M.path).length-y(h.path).length)[0];return R?{id:R.id,path:R.path}:null},on=l=>xt(()=>l()),as=({targetPath:l=null,savedProjectPlan:d=null,onNavigatedToChat:c})=>{const{t:s}=Tt(),m=G(e=>e.currentSessionId),R=G(e=>e.createSession),h=G(e=>e.initializeNewOpenChamberSession),M=G(e=>e.sendMessage),Se=G(e=>e.setCurrentSession),ye=Pt(),J=jt(e=>e.homeDirectory),je=kt(e=>e.planModeEnabled),xe=Ze(e=>e.projects),be=Ze(e=>e.activeProjectId),Ce=Nt(e=>e.directories),Re=Et()??"",Me=Qe(e=>e.setSessionSwitcherOpen),A=It(),O=t.useSyncExternalStore(on,he,he),{isMobile:Te}=Dt(),{currentTheme:U}=Vt(),ne=t.useMemo(()=>m?ye.find(e=>e.id===m)??null:null,[m,ye]),E=t.useMemo(()=>{const e=typeof ne?.directory=="string"?ne.directory:"";return y(e||"")},[ne?.directory]),Pe=t.useMemo(()=>y(Re||E),[Re,E]),z=t.useMemo(()=>sn(Pe,xe,be),[be,Pe,xe]),re=d?.projectRef.id??null,se=d?.projectRef.path??null,g=t.useMemo(()=>re&&se?{id:re,path:se}:null,[re,se]),x=d?.planId??null,K=g&&x?JSON.stringify(["saved-plan",O,Ft(g),x]):null,I=g?.id===Lt,H=t.useMemo(()=>{const e=g??z;return e?Ce.get(e.path)?.isGitRepo===!0:!1},[z,Ce,g]),[T,D]=t.useState(null),[ke,Ne]=t.useState(!1),[u,W]=t.useState(null),[ie,oe]=t.useState(null),ot=!!u||!!ie,ae=t.useMemo(()=>!u||!E||!J?u:rn(u,{currentDirectory:E,homeDirectory:J}),[u,E,J]),[f,P]=t.useState(""),{isPlaying:Y,play:at,stop:lt}=At(),ct=et(e=>e.showMessageTTSButtons),[Ee,le]=t.useState(null),[Ie,ce]=t.useState(null),ue=t.useMemo(()=>ae&&ae.split("/").pop()||s("planView.file.defaultName"),[ae,s]),de=t.useMemo(()=>f.trim()?Ot(f,s("planView.title.default")).title:s("planView.title.default"),[f,s]),Q=t.useMemo(()=>de.trim()||s("planView.title.default"),[de,s]),[ut,_]=t.useState(!1),[dt,De]=t.useState(!1),[X,Ve]=t.useState("edit"),B=t.useRef(null),[a,w]=t.useState(null),Fe=t.useRef(null),mt=t.useRef(null),Le="openchamber:plan:md-viewer-mode";t.useEffect(()=>{try{const e=localStorage.getItem(Le);if(!e)return;const i=JSON.parse(e);(i==="preview"||i==="edit")&&Ve(i)}catch{}},[]);const pt=t.useCallback(e=>{Ve(e);try{localStorage.setItem(Le,JSON.stringify(e))}catch{}},[]),V=t.useRef(!1),b=t.useRef(null),[Ae,F]=t.useState(!1);t.useEffect(()=>{const e=()=>{V.current=!1,b.current=null,F(!1)};return document.addEventListener("mouseup",e),()=>document.removeEventListener("mouseup",e)},[]);const ft=t.useCallback((e,i)=>{const o=e.split(`
1
+ import{R as t,j as n}from"./vendor-react-BUCujlKS.js";import{n as jt,u as Qe,a as he,x as Xe,h as qe,y as xt}from"./index-CvLgnuNI.js";import{c as bt,s as Ct,P as Rt,C as Mt}from"./shikiHighlight-4O0ZM14D.js";import{f as Tt,z as G,cC as Pt,aJ as kt,b as Ze,K as Nt,ai as Et,_ as It,bj as Dt,T as Vt,fY as Ft,a3 as Lt,ix as At,l as et,fX as Ot,ay as tt,hy as zt,fV as Kt,dy as nt,f_ as Wt,f$ as _t,m as Bt,iy as $t,as as rt,ae as ge,af as ve,at as st,B as ee,I as L,ag as we,av as it,bh as te,g as Gt,c8 as Jt,aB as Ut,cp as Ht,iz as Yt}from"./useAppFontEffects-Bzyszv2N.js";import{u as Qt,n as Xt}from"./useInlineCommentController-zOf6ORAq.js";import{b as qt}from"./CodeMirrorCommentWidgets-DZF8ntaq.js";import{getResolvedShikiTheme as Zt}from"./appThemeRegistry-Br2TLSlb.js";import{E as en}from"./vendor-codemirror-view-CiLROUVV.js";import{as as tn}from"./runtimeEndpointReset-C45jrFq4.js";import"./vendor-scheduler-7OC5HNn7.js";import"./vendor-zod-Gea9uBlY.js";import"./vendor-vite-runtime-DD1OZmLC.js";import"./vendor-zustand-BAGL70zf.js";import"./vendor-opencode-client-_BAHQo4R.js";import"./vendor-codemirror-state-C9awkmn-.js";import"./vendor-marijn-find-cluster-break-DXwl3gUT.js";import"./vendor-codemirror-commands-B7H_j0iU.js";import"./vendor-codemirror-language-BgPj_McA.js";import"./vendor-lezer-common-B3-cUCR_.js";import"./vendor-lezer-highlight-CDMHUZ74.js";import"./vendor-style-mod-NZ5MEPvj.js";import"./vendor-codemirror-search-BmS-GmcX.js";import"./vendor-crelt-C8TCjufn.js";import"./vendor-replit-codemirror-vim-B2DJlAhT.js";import"./vendor-replit-codemirror-vim-core-FHzKdNUS.js";import"./vendor-simplewebauthn-browser-VDA66rT_.js";import"./vendor-base-ui-CsXYnR5c.js";import"./vendor-floating-ui-utils-D6FqdtJt.js";import"./vendor-floating-ui-react-dom-DxYCWdHj.js";import"./vendor-floating-ui-dom-BTvzWks8.js";import"./vendor-floating-ui-core-PuGzNPnN.js";import"./vendor-use-sync-external-store-D6wYuSt-.js";import"./vendor-class-variance-authority-5VPnzWs2.js";import"./vendor-clsx-B-dksMZM.js";import"./vendor-dnd-kit-core-BZknOX2w.js";import"./vendor-dnd-kit-utilities-B_MdXhJC.js";import"./vendor-dnd-kit-accessibility-BHxJPORy.js";import"./vendor-dnd-kit-sortable-CsEagZ81.js";import"./vendor-framer-motion-Bq3iTZ6r.js";import"./vendor-motion-dom-DcCgeG69.js";import"./vendor-motion-utils-BGh8QBgx.js";import"./vendor-tanstack-react-virtual-ClYN8CzB.js";import"./vendor-tanstack-virtual-core-BewVQryB.js";import"./contextPanelEmbeddedChat-CirXEPJq.js";import"./vendor-sonner-DFyL3AvE.js";import"./vendor-cmdk-DgLInKvT.js";import"./vendor-radix-ui-react-dialog-B94Bt2qq.js";import"./vendor-radix-ui-primitive-Dc_FVRD7.js";import"./vendor-radix-ui-react-compose-refs-DcAh5WdT.js";import"./vendor-radix-ui-react-context-Czxm7Z62.js";import"./vendor-radix-ui-react-id-f5BLKEVw.js";import"./vendor-radix-ui-react-use-layout-effect-D_3IhJdJ.js";import"./vendor-radix-ui-react-use-controllable-state-BFT5YmkA.js";import"./vendor-radix-ui-react-dismissable-layer-D7kXcwgJ.js";import"./vendor-radix-ui-react-primitive-DhVoX9SD.js";import"./vendor-radix-ui-react-slot-BQgQOasS.js";import"./vendor-radix-ui-react-use-callback-ref-BZPnuXAC.js";import"./vendor-radix-ui-react-use-escape-keydown-oph88g-F.js";import"./vendor-radix-ui-react-focus-scope-CiaxW4dD.js";import"./vendor-radix-ui-react-portal-BMJYHWck.js";import"./vendor-radix-ui-react-presence-CNxf-uq4.js";import"./vendor-radix-ui-react-focus-guards-B6qJXYua.js";import"./vendor-react-remove-scroll-DO7dCTnK.js";import"./vendor-tslib-De9GV7Vy.js";import"./vendor-react-remove-scroll-bar-BcFYyj3E.js";import"./vendor-react-style-singleton-q6EMHnwf.js";import"./vendor-get-nonce-C-Z93AgS.js";import"./vendor-use-sidecar-zDC0RhA3.js";import"./vendor-use-callback-ref-D3RC8gqK.js";import"./vendor-aria-hidden-DvXkyWUv.js";import"./vendor-codemirror-lang-javascript-Cc2ZYbgX.js";import"./vendor-lezer-javascript-D7Tj24ot.js";import"./vendor-lezer-lr-bhwg1HMg.js";import"./vendor-codemirror-autocomplete-DzPz9Wgq.js";import"./vendor-w3c-keyname-Vcq4gwWv.js";import"./vendor-codemirror-lang-json-CMBS2tG9.js";import"./vendor-lezer-json-Iaex0UN-.js";import"./vendor-codemirror-lang-css-O0cZX78y.js";import"./vendor-lezer-css-C5xB6jxd.js";import"./vendor-codemirror-lang-html-CfgK872x.js";import"./vendor-lezer-html-C0I1p52t.js";import"./vendor-codemirror-lang-markdown-BPGOH9ye.js";import"./vendor-lezer-markdown-C6g-d6P3.js";import"./vendor-codemirror-language-data-6cEFPNUR.js";import"./vendor-codemirror-lang-python-HahnQaAS.js";import"./vendor-lezer-python-CvuFxeZl.js";import"./vendor-legendapp-list-BuBPBC3R.js";import"./vendor-tailwind-merge-CPcsbTWB.js";import"./vendor-fuse.js-Dw8P0qyA.js";import"./textMateThemeFromAppTheme-yNq7b0DZ.js";import"./themeResolver-BmJyTmjJ.js";import"./vendor-pierre-theming-C6Z4M5_u.js";import"./vendor-shikijs-core-CGM_jqPK.js";import"./vendor-shikijs-types-CPSbSeK6.js";import"./vendor-shikijs-vscode-textmate-BgLrS_2D.js";import"./vendor-hast-util-to-html-BKBhbTDb.js";import"./vendor-html-void-elements-CkdplsNl.js";import"./vendor-property-information-rJCbAzvX.js";import"./vendor-zwitch-C2o2j-tx.js";import"./vendor-stringify-entities-CsH1VEn9.js";import"./vendor-character-entities-legacy-BpoLgcEt.js";import"./vendor-character-entities-html4-D7taRCQ7.js";import"./vendor-ccount-c2V3InAJ.js";import"./vendor-comma-separated-tokens-D8TqSuIK.js";import"./vendor-space-separated-tokens-DD3iYX1K.js";import"./vendor-hast-util-whitespace-D4Wp6AEg.js";import"./GuestAttachDialog-CoXM0gh_.js";import"./PluginPane-B39JEUL8.js";const nn=()=>{const l=new Map,d=new Map;return{schedule:(c,s,m)=>{if(s<=(d.get(c)??Number.NEGATIVE_INFINITY))return l.get(c)??Promise.resolve();d.set(c,s);const h=(l.get(c)??Promise.resolve()).then(m,m);return l.set(c,h.catch(()=>{d.get(c)===s&&d.delete(c)})),h},pendingFor:async c=>{await l.get(c)},reset:c=>{d.delete(c)}}},y=l=>{if(!l)return"";const d=l.replace(/\\/g,"/");return d==="/"?"/":d.replace(/\/+$/,"")},rn=(l,d)=>{const c=y(d.currentDirectory),s=y(d.homeDirectory),m=y(l);return c&&m.startsWith(c+"/")?m.slice(c.length+1):s&&m===s?"~":s&&m.startsWith(s+"/")?`~${m.slice(s.length)}`:m},sn=(l,d,c)=>{const s=y(l.trim());if(!s)return null;const m=c?d.find(h=>h.id===c)??null:null;if(m?.path){const h=y(m.path);if(s===h||s.startsWith(`${h}/`))return{id:m.id,path:m.path}}const R=d.filter(h=>{const M=y(h.path);return s===M||s.startsWith(`${M}/`)}).sort((h,M)=>y(M.path).length-y(h.path).length)[0];return R?{id:R.id,path:R.path}:null},on=l=>xt(()=>l()),as=({targetPath:l=null,savedProjectPlan:d=null,onNavigatedToChat:c})=>{const{t:s}=Tt(),m=G(e=>e.currentSessionId),R=G(e=>e.createSession),h=G(e=>e.initializeNewOpenChamberSession),M=G(e=>e.sendMessage),Se=G(e=>e.setCurrentSession),ye=Pt(),J=jt(e=>e.homeDirectory),je=kt(e=>e.planModeEnabled),xe=Ze(e=>e.projects),be=Ze(e=>e.activeProjectId),Ce=Nt(e=>e.directories),Re=Et()??"",Me=Qe(e=>e.setSessionSwitcherOpen),A=It(),O=t.useSyncExternalStore(on,he,he),{isMobile:Te}=Dt(),{currentTheme:U}=Vt(),ne=t.useMemo(()=>m?ye.find(e=>e.id===m)??null:null,[m,ye]),E=t.useMemo(()=>{const e=typeof ne?.directory=="string"?ne.directory:"";return y(e||"")},[ne?.directory]),Pe=t.useMemo(()=>y(Re||E),[Re,E]),z=t.useMemo(()=>sn(Pe,xe,be),[be,Pe,xe]),re=d?.projectRef.id??null,se=d?.projectRef.path??null,g=t.useMemo(()=>re&&se?{id:re,path:se}:null,[re,se]),x=d?.planId??null,K=g&&x?JSON.stringify(["saved-plan",O,Ft(g),x]):null,I=g?.id===Lt,H=t.useMemo(()=>{const e=g??z;return e?Ce.get(e.path)?.isGitRepo===!0:!1},[z,Ce,g]),[T,D]=t.useState(null),[ke,Ne]=t.useState(!1),[u,W]=t.useState(null),[ie,oe]=t.useState(null),ot=!!u||!!ie,ae=t.useMemo(()=>!u||!E||!J?u:rn(u,{currentDirectory:E,homeDirectory:J}),[u,E,J]),[f,P]=t.useState(""),{isPlaying:Y,play:at,stop:lt}=At(),ct=et(e=>e.showMessageTTSButtons),[Ee,le]=t.useState(null),[Ie,ce]=t.useState(null),ue=t.useMemo(()=>ae&&ae.split("/").pop()||s("planView.file.defaultName"),[ae,s]),de=t.useMemo(()=>f.trim()?Ot(f,s("planView.title.default")).title:s("planView.title.default"),[f,s]),Q=t.useMemo(()=>de.trim()||s("planView.title.default"),[de,s]),[ut,_]=t.useState(!1),[dt,De]=t.useState(!1),[X,Ve]=t.useState("edit"),B=t.useRef(null),[a,w]=t.useState(null),Fe=t.useRef(null),mt=t.useRef(null),Le="openchamber:plan:md-viewer-mode";t.useEffect(()=>{try{const e=localStorage.getItem(Le);if(!e)return;const i=JSON.parse(e);(i==="preview"||i==="edit")&&Ve(i)}catch{}},[]);const pt=t.useCallback(e=>{Ve(e);try{localStorage.setItem(Le,JSON.stringify(e))}catch{}},[]),V=t.useRef(!1),b=t.useRef(null),[Ae,F]=t.useState(!1);t.useEffect(()=>{const e=()=>{V.current=!1,b.current=null,F(!1)};return document.addEventListener("mouseup",e),()=>document.removeEventListener("mouseup",e)},[]);const ft=t.useCallback((e,i)=>{const o=e.split(`
2
2
  `),r=Math.max(1,i.start),p=Math.min(o.length,i.end);return r>p?"":o.slice(r-1,p).join(`
3
3
  `)},[]),ht=Qt({source:"plan",fileLabel:ue,language:u&&tt(u)||"markdown",getCodeForRange:e=>ft(f,Xt(e)),toStoreRange:e=>({startLine:e.start,endLine:e.end}),fromDraftRange:e=>({start:e.startLine,end:e.endLine})}),{drafts:Oe,commentText:q,setCommentText:ze,editingDraftId:me,setSelection:Ke,saveComment:We,cancel:$,reset:_e,startEdit:Be,deleteDraft:$e}=ht;t.useEffect(()=>{w(null),_e()},[f,_e]),t.useEffect(()=>{Ke(a)},[a,Ke]);const Ge=t.useCallback(()=>{w(null),$()},[$]),Je=t.useCallback((e,i)=>{i&&w(i),We(e,i??a??void 0),w(null)},[a,We]);t.useEffect(()=>{if(!a)return;const e=o=>{const r=o.target;r.closest('[data-comment-card="true"]')||r.closest('[data-comment-input="true"]')||r.closest(".oc-block-widget")||r.closest(".cm-gutterElement")||r.closest("[data-sonner-toast]")||r.closest("[data-sonner-toaster]")||q.trim()||(w(null),$())},i=window.setTimeout(()=>{document.addEventListener("click",e)},100);return()=>{window.clearTimeout(i),document.removeEventListener("click",e)}},[$,q,me,Te,a]);const pe=Qe(e=>e.editorFontSize),gt=t.useMemo(()=>{const e=u?tt(u):null,i=!!e&&e!=="markdown",o=[bt(U,i?{syntaxColors:!1,fontSize:pe}:{fontSize:pe})],r=zt(u||"plan.md");return r&&o.push(r),i&&e&&o.push(Ct({language:e,themeName:U.metadata.id,theme:Zt(U)})),o.push(en.lineWrapping),o},[U,u,pe]),j=t.useRef({key:null,target:null,content:"",editRevision:0,savedRevision:0,runtimeKey:""}),k=t.useState(nn)[0],Ue=t.useCallback(async(e,i)=>{if("filePath"in e){const r=A.files??Xe()?.files;if(r?.writeFile){if(!(await r.writeFile(e.filePath,i))?.success)throw new Error("Plan file write failed");return}const p=await qe("/api/fs/write",{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify({path:e.filePath,content:i})});if(!p.ok)throw new Error(`Failed to write plan file (${p.status})`);return}if(!await Kt.getState().savePlan(e.projectRef,e.planId,i))throw new Error("Plan save rejected: the plan no longer exists")},[A.files]),He=t.useRef(Ue);He.current=Ue;const N=t.useCallback(()=>{const e=j.current;if(!e.key||!e.target||e.editRevision<=e.savedRevision)return;const i={key:e.key,target:e.target,content:e.content,revision:e.editRevision,runtimeKey:e.runtimeKey,write:He.current};k.schedule(i.key,i.revision,async()=>{if(he()!==i.runtimeKey)return;await i.write(i.target,i.content);const o=j.current;o.key===i.key&&(o.savedRevision=Math.max(o.savedRevision,i.revision),le(null))}).catch(o=>{j.current.key===i.key&&le(o instanceof Error?o.message:"Plan save failed")})},[k]);t.useEffect(()=>{if(!je&&!l&&!x){N(),j.current={key:null,target:null,content:"",editRevision:0,savedRevision:0,runtimeKey:""},W(null),oe(null),P(""),_(!1);return}let e=!1;const i=async r=>{if(A.files?.readFile)return(await A.files.readFile(r))?.content??"";const p=Xe()?.files;if(p?.readFile)return(await p.readFile(r,{optional:!0}))?.content??"";const v=await qe(`/api/fs/read?path=${encodeURIComponent(r)}&optional=true`,{cache:"no-store"});if(!v.ok)throw new Error(`Failed to read plan file (${v.status})`);return v.text()};return(async()=>{if(N(),j.current={key:null,target:null,content:"",editRevision:0,savedRevision:0,runtimeKey:""},W(null),oe(null),P(""),le(null),ce(null),x&&g&&K){if(await k.pendingFor(K),e)return;k.reset(K),_(!0);try{const r=await Yt(g,x);if(e)return;if(!r){ce("Plan not found");return}j.current={key:K,target:{projectRef:g,planId:x},content:r.raw,editRevision:0,savedRevision:0,runtimeKey:O},P(r.raw),oe(x)}catch(r){if(e)return;ce(r instanceof Error?r.message:"Plan load failed")}finally{e||_(!1)}return}if(l){const r=JSON.stringify(["plan-file",O,l]);if(await k.pendingFor(r),e)return;k.reset(r),_(!0);try{const p=await i(l);if(e)return;j.current={key:r,target:{filePath:l},content:p,editRevision:0,savedRevision:0,runtimeKey:O},W(l),P(p)}catch{if(e)return;W(null),P("")}finally{e||_(!1)}return}W(null),P("")})(),()=>{e=!0}},[O,J,je,A.files,x,K,g,k,N,E,l]);const vt=t.useCallback(e=>{j.current.content=e,j.current.editRevision+=1,P(e)},[]);t.useEffect(()=>{if(!u&&!ie)return;const e=window.setTimeout(()=>{N()},350);return()=>{window.clearTimeout(e)}},[f,ie,u,N]),t.useEffect(()=>()=>{N()},[N]),t.useEffect(()=>()=>{B.current!==null&&window.clearTimeout(B.current)},[]);const Ye=t.useCallback(()=>{Me(!1),c?.()},[c,Me]),wt=t.useCallback(async e=>{const i=g??z;if(!i||!T||I)return;const o=await nt(T.action==="improve"?"plan.improve.visible":"plan.implement.visible",{plan_title:Q}),r=await nt(T.action==="improve"?"plan.improve.instructions":"plan.implement.instructions",{plan_title:Q,plan_path:u??""}),v=[{synthetic:!0,text:u?r:[r,"","The plan is not stored as a file in the repository and has no file path. Its full current contents follow below this note and are the source of truth for the plan. Where the instructions above refer to the plan file, treat the plan as stored in OpenChamber project knowledge (it is edited through the OpenChamber UI): propose plan revisions as plan text in the chat rather than editing a file.","",f].join(`
4
4
  `)}];Ne(!0);try{Ye();let S=null,fe=i.path;if(T.target==="worktree"){if(!H)return;const C=await Wt(i.path,_t());if(!C?.id)return;S=C.id,fe=C.path}else{const C=await R(void 0,i.path,void 0,{model:{providerID:e.providerID,id:e.modelID,variant:e.variant||void 0},agent:e.agent.trim()||void 0});if(!C?.id)return;S=C.id,fe=C.directory??i.path,h(C.id,et.getState().agents??[])}if(!S)return;const Z=Bt.getState();Z.saveSessionModelSelection(S,e.providerID,e.modelID),e.agent.trim()&&(Z.saveSessionAgentSelection(S,e.agent),Z.saveAgentModelForSession(S,e.agent,e.providerID,e.modelID),Z.saveAgentModelVariantForSession(S,e.agent,e.providerID,e.modelID,e.variant||void 0)),Se(S,fe);const yt=e.runAsGoal===!0?[`Implement the plan "${Q}" end-to-end${u?` (plan file: ${u})`:" (the full plan follows)"}.`,u?"Re-read that file for full details — it is the source of truth.":"The full plan follows in this message and is the source of truth.","",f].join(`
@@ -1,3 +1,3 @@
1
- import{f as Kn,R as y,j as ce}from"./vendor-react-BUCujlKS.js";import{iD as Me,iE as Pe,iF as Wn,iG as Vn,iH as Yn,iI as je,iJ as Zn,iK as Ht,iL as Qn,iM as es,iN as ts,iO as ns,iP as ss,iQ as rs,iR as os,iS as as,iT as is,iU as Bt,iV as cs,iW as ls,iX as us,iY as ds,iZ as ps,i_ as ms,i$ as fs,j0 as ys,j1 as Ft,j2 as hs,j3 as Ss,j4 as W,j5 as V,j6 as ln,j7 as un,j8 as gs,j9 as Es,ja as Ts,jb as ks,jc as dn,jd as ws,je as vt,jf as pn,jg as mn,jh as fn,ji as yn,jj as xs,jk as $t,jl as _s,jm as vs,jn as hn,jo as bs,jp as Rs,jq as As,jr as Sn,js as Is,jt as Os,ju as Cs,jv as Ps,jw as Xt,jx as qt,jy as Ms,jz as zt,jA as Jt,jB as Kt,jC as Wt,jD as js,jE as Gs,jF as Ns,jG as Us,jH as Ds,jI as bt,jJ as Ls,jK as Hs,jL as Bs,jM as Fs,jN as $s,jO as Xs,u as Rt,z as ne,b as At,er as gn,dp as En,l as ue,jP as Tn,jQ as qs,ft as kn,bD as zs,fs as Js,ei as Ks,fz as Ws,jR as Vs,jS as Ys,fu as Zs,m as Qs,fA as er,fB as tr,fC as nr,fj as sr,fe as rr,f as wn,B as Vt,g as xn,T as or,ai as ar,H as ir,jT as cr,b_ as He,hR as ft,jU as Yt,cX as Zt,jV as lr,jW as Qt,jX as ur,h as dr,jY as pr,o as en,bu as ie,jZ as mr,cI as yt}from"./useAppFontEffects-ZM9ij19-.js";import{o as r,s,r as Ze,b as U,n as G,_ as g,c as X,a as I,l as c,e as _n,d as de,j as Qe,N as fr}from"./vendor-zod-Gea9uBlY.js";import{h as q,a as F,u as et,aV as yr,dW as hr,a1 as ht,dX as Sr,a3 as gr,y as tt,o as $,a8 as Er}from"./index-CvLgnuNI.js";import{c as Tr}from"./vendor-zustand-BAGL70zf.js";import{toast as J}from"./vendor-sonner-DFyL3AvE.js";const kr=128,wr=65536,xr=2e3,_r=/^(>=)?\d+\.\d+\.\d+$/;class K extends Error{code;constructor(t,n){super(n),this.name="HostRequestError",this.code=t}}const vr=/^[a-z][a-z0-9-]*$/,br=r({connected:U(),account:s(),hasClient:U(),settings:Ze(s().regex(vr),s()),redirectUri:s().optional()}),Rr=r({authorizationUrl:s().min(1)}),Ar=r({status:G().int().min(100).max(599),body:s()}),Ir=r({error:s().min(1),message:s().min(1).optional()}),ze=(e,t)=>({ok:!1,code:e,message:t}),Or=async e=>{const t=await e.json().catch(()=>null);if(!e.ok){const o=Ir.safeParse(t);return o.success?ze(Me(o.data.error),o.data.message??o.data.error):ze("HOST_REJECTED","Request failed.")}const n=Ar.safeParse(t);return n.success?{ok:!0,result:n.data}:ze("HOST_REJECTED","Request failed.")},Cr=e=>({connection:{connected:e.connected,account:e.account},settings:e.settings,hasClient:e.hasClient,redirectUri:e.redirectUri??""}),Ge=async e=>{if(!e.ok)return null;const t=br.safeParse(await e.json().catch(()=>null));return t.success?Cr(t.data):null},Pr=async e=>{try{return await Ge(await q(`/api/guests/${e}/oauth/status`))}catch{return null}},$a=async(e,t,n)=>{const o={clientId:t};n&&(o.clientSecret=n);try{return await Ge(await q(`/api/guests/${e}/oauth/client`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}))}catch{return null}},Xa=async(e,t,n)=>{try{return await Ge(await q(`/api/guests/${e}/token`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(n?{token:t,username:n}:{token:t})}))}catch{return null}},qa=async(e,t)=>{try{return await Ge(await q(`/api/guests/${e}/settings`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}))}catch{return null}},Mr=async e=>{try{const t=await q(`/api/guests/${e}/oauth/start`,{method:"POST"});if(!t.ok)return null;const n=Rr.safeParse(await t.json().catch(()=>null));return n.success?n.data.authorizationUrl:null}catch{return null}},jr=async e=>{try{return await Ge(await q(`/api/guests/${e}/oauth`,{method:"DELETE"}))}catch{return null}},Gr=3*6e4,Nr=1500,Ur=(e,t)=>t.connected?e.connected?t.account!==e.account:!0:!1,Dr=async(e,t)=>{try{const n=await q(`/api/guests/${e}/request`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return Or(n)}catch{return ze("HOST_REJECTED","Request failed.")}};let St=0;const Be=Tr(e=>({byId:{},setStatus:(t,n)=>{e(o=>({byId:{...o.byId,[t]:n}}))},refresh:async t=>{const n=St,o=F(),a=await Pr(t);return n!==St||F()!==o?null:(a&&e(d=>({byId:{...d.byId,[t]:a}})),a)},resetForRuntimeSwitch:()=>{St++,e({byId:{}})}})),Lr=r({status:G().int().min(100).max(599),body:s()}),Hr=r({error:s().min(1),message:s().min(1).optional()}),Br=r({status:g(["stopped","starting","ready","failed"])}),Je=(e,t)=>({ok:!1,code:e,message:t}),Fr=async e=>{const t=await e.json().catch(()=>null);if(!e.ok){const o=Hr.safeParse(t);return o.success?Je(Me(o.data.error),o.data.message??o.data.error):Je("HOST_REJECTED","Request failed.")}const n=Lr.safeParse(t);return n.success?{ok:!0,result:n.data}:Je("HOST_REJECTED","Request failed.")},$r=async(e,t)=>{try{const n=await q(`/api/guests/${e}/service/request`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return Fr(n)}catch{return Je("HOST_REJECTED","Request failed.")}},Xr=async e=>{try{const t=await q(`/api/guests/${e}/service/status`);if(!t.ok)return{ok:!1,code:"NO_SERVICE",message:"No service for this extension."};const n=Br.safeParse(await t.json().catch(()=>null));return n.success?{ok:!0,result:n.data}:{ok:!1,code:"HOST_REJECTED",message:"Service status was empty."}}catch{return{ok:!1,code:"HOST_REJECTED",message:"Could not read service status."}}},qr=r({guest:r({id:s().min(1)}).passthrough()}),za=async(e,t,n)=>{try{const o=await q(`/api/guests/${e}/service/sockets`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:t,path:n})});return o.ok?qr.safeParse(await o.json().catch(()=>null)).success:!1}catch{return!1}},vn=e=>{const t=et.getState();for(const[n,o]of Object.entries(t.contextPanelByDirectory)){const a=o.tabs.filter(d=>d.mode===e).map(d=>d.id);a.length>0&&t.closeContextPanelTabs(n,a)}},Ja=e=>vn(yr(e)),It=e=>je.test(e)||Ss(e),tn=e=>{try{const t=new URL(e);return t.protocol==="https:"&&t.username===""&&t.password===""}catch{return!1}},bn=e=>{try{const t=new URL(e);return t.protocol==="https:"&&t.username===""&&t.password===""&&t.pathname==="/"&&t.search===""&&t.hash===""&&e===t.origin}catch{return!1}},Rn=e=>!e.startsWith("/")||e.includes("\0")||e.includes("\\")||e.includes("://")?!1:!e.split("/").some(n=>n==="."||n===".."),An=/^[A-Za-z][A-Za-z0-9_]*(\.[A-Za-z][A-Za-z0-9_]*)*$/,In=g(["panel","dialog"]),zr=r({mode:In,entry:s().trim().refine(Pe).optional()}).refine(e=>e.mode==="dialog"||e.entry===void 0,{path:["entry"]}),Jr=X([U(),In,zr]),Kr=r({id:s().trim().regex(je),name:s().trim().min(1),icon:s().trim().refine(It),entry:s().trim().refine(Pe).optional(),dock:g(Yn).optional(),size:G().int().min(Wn).max(Vn).optional()}),Wr=r({id:s().trim().regex(je),label:s().trim().min(1)}),Vr=r({authorizeUrl:s().trim().refine(tn),tokenUrl:s().trim().refine(tn),apiOrigin:s().trim().refine(bn),scopes:I(s().trim().min(1)).optional(),account:r({path:s().trim().refine(Rn),name:s().trim().regex(An)}).optional()}),Yr=r({apiOrigin:s().trim().refine(bn),account:r({path:s().trim().refine(Rn),name:s().trim().regex(An)}).optional(),scheme:g(["raw","bearer","basic"]).optional(),usernameLabel:s().trim().min(1).max(64).optional()}),Zr=r({provider:g(["linear"])}),Qr=r({name:s().trim().min(1),description:s().trim().min(1),oauth:Vr.optional(),token:Yr.optional(),host:Zr.optional(),settings:I(Wr).optional()}).refine(e=>Zn(e)!==null,{path:["oauth"]}),nn=["linux","darwin","win32"],Ce=s().trim().min(1).max(512),eo=r({linux:I(Ce).max(16).optional(),darwin:I(Ce).max(16).optional(),win32:I(Ce).max(16).optional()}).strict(),to=r({id:s().trim().regex(je).max(64),path:Ce.optional(),candidates:eo.optional()}).strict().refine(e=>!!e.path||!!e.candidates,{message:"socket binding needs path or candidates"}),no=e=>{const t={};if(e.candidates)for(const n of nn){const o=e.candidates[n];o&&o.length>0&&(t[n]=[...o])}else if(e.path)for(const n of nn)t[n]=[e.path];return{id:e.id,candidatesByPlatform:t}},so=X([Ce.transform(e=>({id:e,candidatesByPlatform:{linux:[e],darwin:[e],win32:[e]}})),to.transform(no)]),ro=r({sockets:I(so).max(32).optional(),exec:I(s().trim().min(1).max(128)).max(32).optional()}).strict().transform(e=>{const t={};return e.sockets&&e.sockets.length>0&&(t.sockets=e.sockets),e.exec&&e.exec.length>0&&(t.exec=[...e.exec]),t}),oo=r({entry:s().trim().refine(Pe),runtime:c("host"),permissions:ro.optional(),provides:I(g(Ht)).min(1).max(Ht.length).refine(e=>new Set(e).size===e.length,{message:"provides entries must be unique"}).optional(),surface:c(!0).optional()}),On=(e,t)=>new Set(e.map(t)).size===e.length,ao=r({id:s().trim().regex(je).max(64),label:s().trim().min(1).max(Qn),icon:s().trim().refine(It).optional(),where:g(["message","session"]),mode:g(["open","background"]).optional(),roles:I(g(["user","assistant"])).min(1).max(2).optional(),payload:I(g(["messages"])).max(1).optional()}).refine(e=>e.where==="message"||e.roles===void 0,{path:["roles"]}).refine(e=>e.where==="session"||e.payload===void 0,{path:["payload"]}),io=I(ao).min(1).max(es).refine(e=>On(e,t=>t.id),{message:"action ids must be unique"}),co=r({name:s().trim().regex(ns),description:s().trim().min(1).max(ts).optional()}),lo=I(co).min(1).max(ss).refine(e=>On(e,t=>t.name),{message:"command names must be unique"}),uo=r({match:s().trim().min(1).max(ls).regex(us),name:s().trim().min(1).max(cs).optional(),icon:s().trim().refine(It).optional(),title:s().trim().min(1).max(Bt).optional(),subtitle:s().trim().min(1).max(Bt).optional(),output:g(is).optional(),language:s().trim().min(1).max(as).optional(),columns:I(s().trim().min(1).max(rs)).min(1).max(os).optional()}).refine(e=>e.output==="code"||e.language===void 0,{path:["language"]}).refine(e=>e.output==="table"==(e.columns!==void 0),{path:["columns"]}),po=I(uo).min(1).max(ds),mo=r({panel:Kr,background:r({entry:s().trim().refine(e=>Pe(e)&&e.toLowerCase().endsWith(".html"))}).optional(),attach:Jr.optional(),page:X([c(!0),r({entry:s().trim().refine(Pe),title:s().trim().min(1).max(200).optional()})]).optional(),capabilities:I(g(ys)).max(8).optional(),integration:Qr.optional(),service:oo.optional(),filesystem:I(s().max(ps).refine(ms)).min(1).max(fs).optional(),actions:io.optional(),commands:lo.optional(),tools:po.optional()}),fo=e=>{const t=[];return e.page!==void 0&&t.push("page"),e.attach!==void 0&&e.attach!==!1&&t.push("attach"),e.capabilities&&e.capabilities.length>0&&t.push("capabilities"),e.integration!==void 0&&t.push("integration"),e.service!==void 0&&!e.service.provides?.length&&!e.service.surface&&t.push("service"),e.filesystem!==void 0&&t.push("filesystem"),e.actions!==void 0&&t.push("actions"),e.commands!==void 0&&t.push("commands"),t},yo=r({apiVersion:c(hs[0]),engines:r({openchamber:s().trim().regex(_r)}).strict().optional(),contributes:mo.superRefine((e,t)=>{if((e.panel.dock!==void 0||e.panel.size!==void 0)&&!(e.service?.surface&&Ft(e))){t.addIssue({code:"custom",path:["panel","dock"],message:"panel.dock and panel.size place panel.entry beside service.surface; they need both."});return}if(Ft(e))return;if(e.background){const a=[];e.page!==void 0&&a.push("page"),e.attach!==void 0&&e.attach!==!1&&a.push("attach"),e.actions?.some(d=>d.mode!=="background")&&a.push('actions with mode "open"'),a.length>0&&t.addIssue({code:"custom",path:["panel"],message:`${a.join(", ")} needs panel.entry; background-only actions must declare mode "background".`});return}const o=fo(e);o.length!==0&&t.addIssue({code:"custom",path:["panel"],message:`${o.map(a=>`contributes.${a}`).join(", ")} needs panel.entry or background.entry; an extension without either may only declare tools.`})})}),ho=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/,So=s().trim().regex(ho).max(64);r({version:So.optional(),openchamber:yo});X([r({openchamber:_n()}),r({openchamber:r({}).passthrough()})]);const z=s().trim().min(1).max(1024),Fe=g(["loading","ready","error"]),sn=r({directory:z,name:s(),branch:s(),status:g(["ready","pending","invalid","missing"])}),rn=de("kind",[r({kind:c("projects")}).strict(),r({kind:c("worktrees"),projectId:z}).strict(),r({kind:c("sessions"),projectId:z}).strict()]),Cn=de("kind",[r({kind:c("projects"),state:Fe,projects:I(r({id:z,name:s(),directory:z}))}),r({kind:c("worktrees"),projectId:z,state:Fe,worktrees:I(sn)}),r({kind:c("sessions"),projectId:z,state:Fe,coverage:I(r({directory:z,state:Fe})),sessions:I(r({id:z,title:s(),projectId:z,directory:z,parentId:z.nullable(),createdAt:G(),updatedAt:G(),archivedAt:G().nullable(),worktree:sn.nullable(),activity:g(["unknown","idle","running","retrying","waiting-permission","waiting-question"]),outcome:g(["completed","failed"]).nullable(),items:I(r({id:z,data:Qe().optional()}))}))})]),go=X([U(),r({kind:c("existing"),directory:z}).strict(),r({kind:c("new"),name:s().trim().min(1).max(200).optional(),baseBranch:s().trim().min(1).max(200).optional()}).strict()]),Ke=s().min(1).max(kr),Eo=de("op",[r({op:c("get"),key:Ke}).strict(),r({op:c("delete"),key:Ke}).strict(),r({op:c("set"),key:Ke,value:Qe().refine(e=>new TextEncoder().encode(JSON.stringify(e)).length<=wr)}).strict(),r({op:c("keys")}).strict()]),Pn=X([r({storage:c(!0),op:c("get"),found:c(!1)}),r({storage:c(!0),op:c("get"),found:c(!0),value:Qe()}),r({storage:c(!0),op:g(["set","delete"])}),r({storage:c(!0),op:c("keys"),keys:I(Ke).max(xr)})]),T={channel:c(V),v:c(W)},To=r({background:s().min(1),elevated:s().min(1),foreground:s().min(1),muted:s().min(1),subtle:s().min(1),border:s().min(1),hover:s().min(1),selection:s().min(1),focus:s().min(1),primary:s().min(1),mutedSurface:s().min(1),elevatedForeground:s().min(1),active:s().min(1),selectionForeground:s().min(1),primaryForeground:s().min(1),primaryText:s().min(1),successText:s().min(1),warningText:s().min(1),errorText:s().min(1),infoText:s().min(1),success:s().min(1),warning:s().min(1),error:s().min(1),info:s().min(1),font:s().min(1),mono:s().min(1),radius:s().min(1)}),Mn=r({id:s().min(1),title:s().min(1),busy:U().optional().default(!1),model:s().min(1).max(un).optional(),agent:s().min(1).max(ln).optional()}).nullable(),jn=r({connected:U(),account:s().max(gs)}),Gn=Ze(s().regex(Ts),s().max(Es)),ko=r({status:G().int().min(100).max(599),body:s().max(ks)}),on=r({directory:s(),name:s(),branch:s(),status:g(["ready","pending","invalid","missing"])}),wo=X([r({sessionId:s().min(1),sent:g(dn),directory:s().optional(),worktree:on.optional(),linked:U().optional()}),r({sessionId:_n(),sent:c("skipped"),directory:s(),worktree:on,failure:g(["bootstrap-failed","session-create-failed"])})]),xo=r({sent:g(dn)}),_o=r({status:g(ws)}),vo=r({content:s().max(vt)}),bo=r({written:c(!0)}),Ro=r({entries:I(r({name:s().min(1),kind:g(pn)})).max(mn)}),Ao=r({kind:g(fn),size:G().int().min(0),mtime:G().int().min(0)}),Io=r({text:s().max(yn)}),Oo=X([Pn,Cn,wo,ko,xo,_o,vo,bo,Ro,Ao,Io]),Oe=r({providerId:s().trim().regex(As),id:s().trim().min(1).max(Rs),title:s().trim().min(1).max(bs),url:s().trim().min(1).max(hn),text:s().trim().min(1).max(vs).optional(),kind:g(["issue","pull"]).optional(),author:s().trim().min(1).max(_s).optional(),branches:r({head:s().trim().min(1).max($t),base:s().trim().min(1).max($t)}).optional(),data:Qe().refine(e=>JSON.stringify(e).length<=xs).optional()}),Nn=g(["user","assistant"]),Un=r({kind:c("message"),action:s().trim().min(1).max(64),sessionId:s().min(1),sessionTitle:s(),directory:s().nullable(),messageId:s().min(1),role:Nn,text:s().max(Sn)}),Dn=r({kind:c("session"),action:s().trim().min(1).max(64),sessionId:s().min(1),sessionTitle:s(),directory:s().nullable(),messages:I(r({id:s().min(1),role:Nn,text:s().max(Sn),createdAt:G().int().min(0)})).optional(),truncated:U().optional()}).refine(e=>JSON.stringify(e).length<=Is),Ln=X([Un,Dn,Oe]).nullable(),Co=r({theme:r({mode:g(["light","dark"]),tokens:To}),locale:s().min(1),directory:s().nullable(),session:Mn,surface:g(["panel","dialog","page","background"]),connection:jn,settings:Gn,item:Ln}),Po=r({...T,type:c("result"),id:s().min(1),ok:U(),error:s().min(1).optional(),code:s().min(1).optional(),payload:Oo.optional()}).transform((e,t)=>e.ok?e.payload?{channel:e.channel,v:e.v,type:"result",id:e.id,ok:!0,payload:e.payload}:{channel:e.channel,v:e.v,type:"result",id:e.id,ok:!0}:e.error?{channel:e.channel,v:e.v,type:"result",id:e.id,ok:!1,error:e.error,code:Me(e.code)}:(t.addIssue({code:"custom",message:"Failed result needs an error string."}),fr));X([r({...T,type:c("workspace"),payload:r({subscriptionId:s().min(1).max(128),snapshot:Cn})}),r({...T,type:c("ready"),payload:Co}),r({...T,type:c("directory"),payload:r({directory:s().nullable()})}),r({...T,type:c("session"),payload:r({session:Mn})}),r({...T,type:c("connection"),payload:r({connection:jn})}),r({...T,type:c("settings"),payload:r({settings:Gn})}),r({...T,type:c("session-lifecycle"),payload:r({sessionId:s().min(1),phase:g(Os)})}),r({...T,type:c("item"),payload:r({item:Ln})}),r({...T,type:c("resolve"),id:s().min(1),payload:r({command:s().min(1),args:s()})}),Po,r({...T,type:c("action"),id:s().min(1),payload:X([Un,Dn])})]);const $e=s().min(1).max(Cs).refine(Ps),Mo=de("type",[r({...T,type:c("action-result"),id:s().min(1),payload:de("ok",[r({ok:c(!0)}),r({ok:c(!1),error:s().trim().min(1).max(Xt)})])}),r({...T,type:c("workspace-read"),id:s().min(1),payload:rn}),r({...T,type:c("workspace-subscribe"),id:s().min(1),payload:r({subscriptionId:s().min(1).max(128),query:rn})}),r({...T,type:c("workspace-unsubscribe"),id:s().min(1),payload:r({subscriptionId:s().min(1).max(128)})}),r({...T,type:c("storage"),id:s().min(1),payload:Eo}),r({...T,type:c("open-session"),id:s().min(1),payload:r({sessionId:s().min(1).max(1024)})}),r({...T,type:c("hello")}),r({...T,type:c("toast"),id:s().min(1),payload:r({kind:g(["info","success","error"]),message:s().trim().min(1).max(Ms),copy:X([U(),r({text:s().min(1).max(qt)})]).optional(),dismiss:U().optional(),persistent:U().optional()})}),r({...T,type:c("open-url"),id:s().min(1),payload:r({url:s().trim().min(1).max(hn)})}),r({...T,type:c("open-surface"),id:s().min(1),payload:r({surfaceId:s().trim().min(1).max(64)})}),r({...T,type:c("clipboard-write"),id:s().min(1),payload:r({text:s().min(1).max(qt)})}),r({...T,type:c("compose"),id:s().min(1),payload:r({text:s().trim().min(1).max(zt),mode:g(["replace","append"]).optional()})}),r({...T,type:c("attach"),id:s().min(1),payload:Oe}),r({...T,type:c("start-session"),id:s().min(1),payload:Oe.extend({worktree:go.optional(),projectId:s().trim().min(1).max(1024).optional(),navigation:g(["preserve","open"]).optional()})}),r({...T,type:c("prompt"),id:s().min(1),payload:r({text:s().trim().min(1).max(zt),send:U().optional()})}),r({...T,type:c("session-link"),id:s().min(1),payload:Oe}),r({...T,type:c("close"),id:s().min(1)}),r({...T,type:c("oauth-start"),id:s().min(1)}),r({...T,type:c("oauth-disconnect"),id:s().min(1)}),r({...T,type:c("request"),id:s().min(1),payload:r({method:g(["GET","POST","PUT","PATCH","DELETE"]),path:s().trim().min(1).max(Kt).refine(Wt),query:Ze(s().min(1).max(128),s().max(2e3)).optional(),body:s().max(Jt).optional()})}),r({...T,type:c("service-request"),id:s().min(1),payload:r({method:g(["GET","POST","PUT","PATCH","DELETE"]),path:s().trim().min(1).max(Kt).refine(Wt),query:Ze(s().min(1).max(128),s().max(2e3)).optional(),body:s().max(Jt).optional()})}),r({...T,type:c("service-status"),id:s().min(1)}),r({...T,type:c("file-read"),id:s().min(1),payload:r({path:$e})}),r({...T,type:c("file-write"),id:s().min(1),payload:r({path:$e,content:s().max(vt)})}),r({...T,type:c("file-list"),id:s().min(1),payload:r({path:$e})}),r({...T,type:c("file-stat"),id:s().min(1),payload:r({path:$e})}),r({...T,type:c("generate"),id:s().min(1),payload:r({prompt:s().trim().min(1).max(Ns),system:s().trim().min(1).max(Gs).optional(),maxOutputTokens:G().int().min(1).max(js).optional()})}),r({...T,type:c("badge"),id:s().min(1),payload:r({count:G().int().min(0).max(Us).nullable()})}),r({...T,type:c("resolve-result"),id:s().min(1),payload:X([r({item:Oe.nullable()}),r({error:s().trim().min(1).max(Xt)})])})]);X([r({ok:c(!0),data:r({}).passthrough()}),r({ok:c(!1),error:s().min(1).max(2e3)})]);g(Ds);const gt=r({alt:U(),ctrl:U(),meta:U(),shift:U()}),xe=G().finite(),jo=de("type",[r({type:c("pointer"),action:g(["down","up","move"]),x:xe,y:xe,button:G().int().min(-1).max(4),buttons:G().int().min(0).max(31),modifiers:gt}),r({type:c("wheel"),x:xe,y:xe,deltaX:xe,deltaY:xe,modifiers:gt}),r({type:c("key"),action:g(["down","up"]),key:s().min(1).max(64),code:s().max(64),modifiers:gt}),r({type:c("text"),text:s().min(1).max(bt)})]),le=G().int().min(1).max(Ls);de("type",[r({type:c("ack"),seq:G().int().min(0)}),r({type:c("input"),events:I(jo).min(1).max(Hs)}),r({type:c("release")}),r({type:c("resize"),width:le,height:le}),r({type:c("clipboard-read"),id:s().min(1).max(64)})]);const Go=g(Bs),Ka=de("type",[r({type:c("hello"),viewerId:s().min(1)}),r({type:c("frame"),seq:G().int().min(0),width:le,height:le,mime:g($s),bytes:G().int().min(1),title:s().max(Fs).optional(),agentActive:U()}),r({type:c("control"),controller:Go,mine:U()}),r({type:c("resized"),width:le,height:le}),r({type:c("clipboard"),id:s().min(1).max(64),text:s().max(bt)}),r({type:c("error"),code:s().min(1).max(64),message:s().min(1).max(500)}),r({type:c("ended"),reason:g(["service-stopped","extension-unavailable","host-shutdown"])})]);r({width:le,height:le});r({text:s().max(bt)});const No=e=>({channel:V,v:W,type:"ready",payload:e}),Uo=e=>({channel:V,v:W,type:"directory",payload:{directory:e}}),Do=e=>({channel:V,v:W,type:"session",payload:{session:e}}),Lo=e=>({channel:V,v:W,type:"connection",payload:{connection:e}}),Ho=e=>({channel:V,v:W,type:"settings",payload:{settings:e}}),Bo=e=>({channel:V,v:W,type:"item",payload:{item:e}}),Fo=(e,t,n)=>({channel:V,v:W,type:"resolve",id:e,payload:{command:t,args:n}}),$o=e=>({channel:V,v:W,type:"session-lifecycle",payload:e}),Xo=e=>e?.type==="busy"||e?.type==="retry"?"started":e?.type==="idle"?"completed":e?.type?"failure":null,qo=e=>{const t=e?.providerID?.trim(),n=e?.id?.trim();if(!(!t||!n))return`${t}/${n}`},zo=e=>{if(!e?.id)return null;const t=e.title?.trim(),n={id:e.id,title:t||e.id,busy:!!e.busy},o=e.model?.trim().slice(0,un);o&&(n.model=o);const a=e.agent?.trim().slice(0,ln);return a&&(n.agent=a),n},M=(e,t)=>t?{channel:V,v:W,type:"result",id:e,ok:!0,payload:t}:{channel:V,v:W,type:"result",id:e,ok:!0},N=(e,t,n="HOST_REJECTED")=>({channel:V,v:W,type:"result",id:e,ok:!1,error:t,code:n}),Xe=(e,t)=>t.ok?M(e,t.result):N(e,t.message,t.code),qe=e=>{try{const t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return!1}},Jo=async(e,t)=>{try{switch(e.type){case"workspace-read":return M(e.id,t.workspaceRead(e.payload));case"workspace-subscribe":return t.workspaceSubscribe(e.payload),M(e.id);case"workspace-unsubscribe":return t.workspaceUnsubscribe(e.payload.subscriptionId),M(e.id);case"storage":return M(e.id,await t.storage(e.payload));case"open-session":return t.openSession(e.payload.sessionId),M(e.id);case"hello":case"action-result":return null;case"toast":return t.toast(e.payload),M(e.id);case"open-url":return qe(e.payload.url)?await t.openUrl(e.payload.url)?M(e.id):N(e.id,"Could not open URL."):N(e.id,"URL must be http or https.");case"open-surface":return hr(e.payload.surfaceId)?(t.openSurface(e.payload.surfaceId),M(e.id)):N(e.id,"Unknown surface.");case"clipboard-write":return await t.writeClipboard(e.payload.text)?M(e.id):N(e.id,"Could not write clipboard.");case"compose":return t.compose(e.payload.text,e.payload.mode??"append"),M(e.id);case"attach":return qe(e.payload.url)?(t.attach(e.payload),M(e.id)):N(e.id,"URL must be http or https.");case"start-session":{if(!qe(e.payload.url))return N(e.id,"URL must be http or https.");const n=await t.startSession(e.payload);return n?"sessionId"in n?M(e.id,n):N(e.id,n.message,n.code):N(e.id,"Could not start that session.")}case"prompt":{const n=await t.prompt(e.payload);return n.ok?M(e.id,n.result):N(e.id,n.message,n.code)}case"session-link":{if(!qe(e.payload.url))return N(e.id,"URL must be http or https.");const n=await t.sessionLink(e.payload);return n.ok?M(e.id):N(e.id,n.message,n.code)}case"close":return t.close(),M(e.id);case"oauth-start":return await t.oauthStart()?M(e.id):N(e.id,"Could not start OAuth.");case"oauth-disconnect":return await t.oauthDisconnect()?M(e.id):N(e.id,"Could not disconnect.");case"request":{const n=await t.request(e.payload);return n.ok?M(e.id,n.result):N(e.id,n.message,n.code)}case"service-request":{const n=await t.serviceRequest(e.payload);return n.ok?M(e.id,n.result):N(e.id,n.message,n.code)}case"service-status":{const n=await t.serviceStatus();return n.ok?M(e.id,n.result):N(e.id,n.message,n.code)}case"file-read":return Xe(e.id,await t.file({op:"read",path:e.payload.path}));case"file-write":return Xe(e.id,await t.file({op:"write",path:e.payload.path,content:e.payload.content}));case"file-list":return Xe(e.id,await t.file({op:"list",path:e.payload.path}));case"file-stat":return Xe(e.id,await t.file({op:"stat",path:e.payload.path}));case"generate":{const n=await t.generate(e.payload);return n.ok?M(e.id,n.result):N(e.id,n.message,n.code)}case"badge":return t.setBadge(e.payload.count),M(e.id);case"resolve-result":return t.resolveResult(e.id,e.payload),null}}catch(n){return e.type==="hello"?null:N(e.id,n instanceof K?n.message:"Extension operation failed.",n instanceof K?n.code:"HOST_REJECTED")}},Ko=X([r({content:s().max(vt)}),r({written:c(!0)}),r({entries:I(r({name:s().min(1),kind:g(pn)})).max(mn)}),r({kind:g(fn),size:G().int().min(0),mtime:G().int().min(0)})]),Wo=r({ok:c(!0),result:Ko}),Vo=r({error:s().min(1),message:s().min(1).optional()}),We=(e,t)=>({ok:!1,code:e,message:t}),Yo=async e=>{const t=await e.json().catch(()=>null);if(!e.ok){const o=Vo.safeParse(t);return o.success?We(Me(o.data.error),o.data.message??o.data.error):We("HOST_REJECTED","File operation failed.")}const n=Wo.safeParse(t);return n.success?{ok:!0,result:n.data.result}:We("HOST_REJECTED","File operation failed.")},Zo=async(e,t,n)=>{const o=new Headers({"Content-Type":"application/json"});n&&o.set("x-opencode-directory",n);try{const a=await q(`/api/guests/${e}/files`,{method:"POST",headers:o,body:JSON.stringify(t)});return Yo(a)}catch{return We("HOST_REJECTED","File operation failed.")}},Qo=r({ok:c(!0),result:r({text:s().max(yn)})}),ea=r({error:s().min(1),message:s().min(1).optional()}),Ve=(e,t)=>({ok:!1,code:e,message:t}),xt="Text generation failed.",ta=async e=>{const t=await e.json().catch(()=>null);if(!e.ok){const o=ea.safeParse(t);return o.success?Ve(Me(o.data.error),o.data.message??o.data.error):Ve("HOST_REJECTED",xt)}const n=Qo.safeParse(t);return n.success?{ok:!0,result:n.data.result}:Ve("HOST_REJECTED",xt)},na=async(e,t,n)=>{const o=new Headers({"Content-Type":"application/json"});n&&o.set("x-opencode-directory",n);try{const a=await q(`/api/guests/${e}/generate`,{method:"POST",headers:o,body:JSON.stringify(t)});return ta(a)}catch{return Ve("HOST_REJECTED",xt)}},Et="https://extension.invalid",sa=500,ra=40*1024*1024,an=64*1024*1024,Tt=async e=>{const t=new Uint8Array(await e.arrayBuffer());let n="";for(let o=0;o<t.length;o+=8192)n+=String.fromCharCode(...t.subarray(o,o+8192));return`data:${e.type||"application/octet-stream"};base64,${btoa(n)}`},oa=e=>e.replace(/\\(?:([0-9a-f]{1,6})\s?|([\s\S]))/gi,(t,n,o)=>{if(n){const a=Number.parseInt(n,16);return a>0&&a<=1114111?String.fromCodePoint(a):"�"}return o===`
1
+ import{f as Kn,R as y,j as ce}from"./vendor-react-BUCujlKS.js";import{iD as Me,iE as Pe,iF as Wn,iG as Vn,iH as Yn,iI as je,iJ as Zn,iK as Ht,iL as Qn,iM as es,iN as ts,iO as ns,iP as ss,iQ as rs,iR as os,iS as as,iT as is,iU as Bt,iV as cs,iW as ls,iX as us,iY as ds,iZ as ps,i_ as ms,i$ as fs,j0 as ys,j1 as Ft,j2 as hs,j3 as Ss,j4 as W,j5 as V,j6 as ln,j7 as un,j8 as gs,j9 as Es,ja as Ts,jb as ks,jc as dn,jd as ws,je as vt,jf as pn,jg as mn,jh as fn,ji as yn,jj as xs,jk as $t,jl as _s,jm as vs,jn as hn,jo as bs,jp as Rs,jq as As,jr as Sn,js as Is,jt as Os,ju as Cs,jv as Ps,jw as Xt,jx as qt,jy as Ms,jz as zt,jA as Jt,jB as Kt,jC as Wt,jD as js,jE as Gs,jF as Ns,jG as Us,jH as Ds,jI as bt,jJ as Ls,jK as Hs,jL as Bs,jM as Fs,jN as $s,jO as Xs,u as Rt,z as ne,b as At,er as gn,dp as En,l as ue,jP as Tn,jQ as qs,ft as kn,bD as zs,fs as Js,ei as Ks,fz as Ws,jR as Vs,jS as Ys,fu as Zs,m as Qs,fA as er,fB as tr,fC as nr,fj as sr,fe as rr,f as wn,B as Vt,g as xn,T as or,ai as ar,H as ir,jT as cr,b_ as He,hR as ft,jU as Yt,cX as Zt,jV as lr,jW as Qt,jX as ur,h as dr,jY as pr,o as en,bu as ie,jZ as mr,cI as yt}from"./useAppFontEffects-Bzyszv2N.js";import{o as r,s,r as Ze,b as U,n as G,_ as g,c as X,a as I,l as c,e as _n,d as de,j as Qe,N as fr}from"./vendor-zod-Gea9uBlY.js";import{h as q,a as F,u as et,aV as yr,dW as hr,a1 as ht,dX as Sr,a3 as gr,y as tt,o as $,a8 as Er}from"./index-CvLgnuNI.js";import{c as Tr}from"./vendor-zustand-BAGL70zf.js";import{toast as J}from"./vendor-sonner-DFyL3AvE.js";const kr=128,wr=65536,xr=2e3,_r=/^(>=)?\d+\.\d+\.\d+$/;class K extends Error{code;constructor(t,n){super(n),this.name="HostRequestError",this.code=t}}const vr=/^[a-z][a-z0-9-]*$/,br=r({connected:U(),account:s(),hasClient:U(),settings:Ze(s().regex(vr),s()),redirectUri:s().optional()}),Rr=r({authorizationUrl:s().min(1)}),Ar=r({status:G().int().min(100).max(599),body:s()}),Ir=r({error:s().min(1),message:s().min(1).optional()}),ze=(e,t)=>({ok:!1,code:e,message:t}),Or=async e=>{const t=await e.json().catch(()=>null);if(!e.ok){const o=Ir.safeParse(t);return o.success?ze(Me(o.data.error),o.data.message??o.data.error):ze("HOST_REJECTED","Request failed.")}const n=Ar.safeParse(t);return n.success?{ok:!0,result:n.data}:ze("HOST_REJECTED","Request failed.")},Cr=e=>({connection:{connected:e.connected,account:e.account},settings:e.settings,hasClient:e.hasClient,redirectUri:e.redirectUri??""}),Ge=async e=>{if(!e.ok)return null;const t=br.safeParse(await e.json().catch(()=>null));return t.success?Cr(t.data):null},Pr=async e=>{try{return await Ge(await q(`/api/guests/${e}/oauth/status`))}catch{return null}},$a=async(e,t,n)=>{const o={clientId:t};n&&(o.clientSecret=n);try{return await Ge(await q(`/api/guests/${e}/oauth/client`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(o)}))}catch{return null}},Xa=async(e,t,n)=>{try{return await Ge(await q(`/api/guests/${e}/token`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(n?{token:t,username:n}:{token:t})}))}catch{return null}},qa=async(e,t)=>{try{return await Ge(await q(`/api/guests/${e}/settings`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)}))}catch{return null}},Mr=async e=>{try{const t=await q(`/api/guests/${e}/oauth/start`,{method:"POST"});if(!t.ok)return null;const n=Rr.safeParse(await t.json().catch(()=>null));return n.success?n.data.authorizationUrl:null}catch{return null}},jr=async e=>{try{return await Ge(await q(`/api/guests/${e}/oauth`,{method:"DELETE"}))}catch{return null}},Gr=3*6e4,Nr=1500,Ur=(e,t)=>t.connected?e.connected?t.account!==e.account:!0:!1,Dr=async(e,t)=>{try{const n=await q(`/api/guests/${e}/request`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return Or(n)}catch{return ze("HOST_REJECTED","Request failed.")}};let St=0;const Be=Tr(e=>({byId:{},setStatus:(t,n)=>{e(o=>({byId:{...o.byId,[t]:n}}))},refresh:async t=>{const n=St,o=F(),a=await Pr(t);return n!==St||F()!==o?null:(a&&e(d=>({byId:{...d.byId,[t]:a}})),a)},resetForRuntimeSwitch:()=>{St++,e({byId:{}})}})),Lr=r({status:G().int().min(100).max(599),body:s()}),Hr=r({error:s().min(1),message:s().min(1).optional()}),Br=r({status:g(["stopped","starting","ready","failed"])}),Je=(e,t)=>({ok:!1,code:e,message:t}),Fr=async e=>{const t=await e.json().catch(()=>null);if(!e.ok){const o=Hr.safeParse(t);return o.success?Je(Me(o.data.error),o.data.message??o.data.error):Je("HOST_REJECTED","Request failed.")}const n=Lr.safeParse(t);return n.success?{ok:!0,result:n.data}:Je("HOST_REJECTED","Request failed.")},$r=async(e,t)=>{try{const n=await q(`/api/guests/${e}/service/request`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});return Fr(n)}catch{return Je("HOST_REJECTED","Request failed.")}},Xr=async e=>{try{const t=await q(`/api/guests/${e}/service/status`);if(!t.ok)return{ok:!1,code:"NO_SERVICE",message:"No service for this extension."};const n=Br.safeParse(await t.json().catch(()=>null));return n.success?{ok:!0,result:n.data}:{ok:!1,code:"HOST_REJECTED",message:"Service status was empty."}}catch{return{ok:!1,code:"HOST_REJECTED",message:"Could not read service status."}}},qr=r({guest:r({id:s().min(1)}).passthrough()}),za=async(e,t,n)=>{try{const o=await q(`/api/guests/${e}/service/sockets`,{method:"PUT",headers:{"Content-Type":"application/json"},body:JSON.stringify({id:t,path:n})});return o.ok?qr.safeParse(await o.json().catch(()=>null)).success:!1}catch{return!1}},vn=e=>{const t=et.getState();for(const[n,o]of Object.entries(t.contextPanelByDirectory)){const a=o.tabs.filter(d=>d.mode===e).map(d=>d.id);a.length>0&&t.closeContextPanelTabs(n,a)}},Ja=e=>vn(yr(e)),It=e=>je.test(e)||Ss(e),tn=e=>{try{const t=new URL(e);return t.protocol==="https:"&&t.username===""&&t.password===""}catch{return!1}},bn=e=>{try{const t=new URL(e);return t.protocol==="https:"&&t.username===""&&t.password===""&&t.pathname==="/"&&t.search===""&&t.hash===""&&e===t.origin}catch{return!1}},Rn=e=>!e.startsWith("/")||e.includes("\0")||e.includes("\\")||e.includes("://")?!1:!e.split("/").some(n=>n==="."||n===".."),An=/^[A-Za-z][A-Za-z0-9_]*(\.[A-Za-z][A-Za-z0-9_]*)*$/,In=g(["panel","dialog"]),zr=r({mode:In,entry:s().trim().refine(Pe).optional()}).refine(e=>e.mode==="dialog"||e.entry===void 0,{path:["entry"]}),Jr=X([U(),In,zr]),Kr=r({id:s().trim().regex(je),name:s().trim().min(1),icon:s().trim().refine(It),entry:s().trim().refine(Pe).optional(),dock:g(Yn).optional(),size:G().int().min(Wn).max(Vn).optional()}),Wr=r({id:s().trim().regex(je),label:s().trim().min(1)}),Vr=r({authorizeUrl:s().trim().refine(tn),tokenUrl:s().trim().refine(tn),apiOrigin:s().trim().refine(bn),scopes:I(s().trim().min(1)).optional(),account:r({path:s().trim().refine(Rn),name:s().trim().regex(An)}).optional()}),Yr=r({apiOrigin:s().trim().refine(bn),account:r({path:s().trim().refine(Rn),name:s().trim().regex(An)}).optional(),scheme:g(["raw","bearer","basic"]).optional(),usernameLabel:s().trim().min(1).max(64).optional()}),Zr=r({provider:g(["linear"])}),Qr=r({name:s().trim().min(1),description:s().trim().min(1),oauth:Vr.optional(),token:Yr.optional(),host:Zr.optional(),settings:I(Wr).optional()}).refine(e=>Zn(e)!==null,{path:["oauth"]}),nn=["linux","darwin","win32"],Ce=s().trim().min(1).max(512),eo=r({linux:I(Ce).max(16).optional(),darwin:I(Ce).max(16).optional(),win32:I(Ce).max(16).optional()}).strict(),to=r({id:s().trim().regex(je).max(64),path:Ce.optional(),candidates:eo.optional()}).strict().refine(e=>!!e.path||!!e.candidates,{message:"socket binding needs path or candidates"}),no=e=>{const t={};if(e.candidates)for(const n of nn){const o=e.candidates[n];o&&o.length>0&&(t[n]=[...o])}else if(e.path)for(const n of nn)t[n]=[e.path];return{id:e.id,candidatesByPlatform:t}},so=X([Ce.transform(e=>({id:e,candidatesByPlatform:{linux:[e],darwin:[e],win32:[e]}})),to.transform(no)]),ro=r({sockets:I(so).max(32).optional(),exec:I(s().trim().min(1).max(128)).max(32).optional()}).strict().transform(e=>{const t={};return e.sockets&&e.sockets.length>0&&(t.sockets=e.sockets),e.exec&&e.exec.length>0&&(t.exec=[...e.exec]),t}),oo=r({entry:s().trim().refine(Pe),runtime:c("host"),permissions:ro.optional(),provides:I(g(Ht)).min(1).max(Ht.length).refine(e=>new Set(e).size===e.length,{message:"provides entries must be unique"}).optional(),surface:c(!0).optional()}),On=(e,t)=>new Set(e.map(t)).size===e.length,ao=r({id:s().trim().regex(je).max(64),label:s().trim().min(1).max(Qn),icon:s().trim().refine(It).optional(),where:g(["message","session"]),mode:g(["open","background"]).optional(),roles:I(g(["user","assistant"])).min(1).max(2).optional(),payload:I(g(["messages"])).max(1).optional()}).refine(e=>e.where==="message"||e.roles===void 0,{path:["roles"]}).refine(e=>e.where==="session"||e.payload===void 0,{path:["payload"]}),io=I(ao).min(1).max(es).refine(e=>On(e,t=>t.id),{message:"action ids must be unique"}),co=r({name:s().trim().regex(ns),description:s().trim().min(1).max(ts).optional()}),lo=I(co).min(1).max(ss).refine(e=>On(e,t=>t.name),{message:"command names must be unique"}),uo=r({match:s().trim().min(1).max(ls).regex(us),name:s().trim().min(1).max(cs).optional(),icon:s().trim().refine(It).optional(),title:s().trim().min(1).max(Bt).optional(),subtitle:s().trim().min(1).max(Bt).optional(),output:g(is).optional(),language:s().trim().min(1).max(as).optional(),columns:I(s().trim().min(1).max(rs)).min(1).max(os).optional()}).refine(e=>e.output==="code"||e.language===void 0,{path:["language"]}).refine(e=>e.output==="table"==(e.columns!==void 0),{path:["columns"]}),po=I(uo).min(1).max(ds),mo=r({panel:Kr,background:r({entry:s().trim().refine(e=>Pe(e)&&e.toLowerCase().endsWith(".html"))}).optional(),attach:Jr.optional(),page:X([c(!0),r({entry:s().trim().refine(Pe),title:s().trim().min(1).max(200).optional()})]).optional(),capabilities:I(g(ys)).max(8).optional(),integration:Qr.optional(),service:oo.optional(),filesystem:I(s().max(ps).refine(ms)).min(1).max(fs).optional(),actions:io.optional(),commands:lo.optional(),tools:po.optional()}),fo=e=>{const t=[];return e.page!==void 0&&t.push("page"),e.attach!==void 0&&e.attach!==!1&&t.push("attach"),e.capabilities&&e.capabilities.length>0&&t.push("capabilities"),e.integration!==void 0&&t.push("integration"),e.service!==void 0&&!e.service.provides?.length&&!e.service.surface&&t.push("service"),e.filesystem!==void 0&&t.push("filesystem"),e.actions!==void 0&&t.push("actions"),e.commands!==void 0&&t.push("commands"),t},yo=r({apiVersion:c(hs[0]),engines:r({openchamber:s().trim().regex(_r)}).strict().optional(),contributes:mo.superRefine((e,t)=>{if((e.panel.dock!==void 0||e.panel.size!==void 0)&&!(e.service?.surface&&Ft(e))){t.addIssue({code:"custom",path:["panel","dock"],message:"panel.dock and panel.size place panel.entry beside service.surface; they need both."});return}if(Ft(e))return;if(e.background){const a=[];e.page!==void 0&&a.push("page"),e.attach!==void 0&&e.attach!==!1&&a.push("attach"),e.actions?.some(d=>d.mode!=="background")&&a.push('actions with mode "open"'),a.length>0&&t.addIssue({code:"custom",path:["panel"],message:`${a.join(", ")} needs panel.entry; background-only actions must declare mode "background".`});return}const o=fo(e);o.length!==0&&t.addIssue({code:"custom",path:["panel"],message:`${o.map(a=>`contributes.${a}`).join(", ")} needs panel.entry or background.entry; an extension without either may only declare tools.`})})}),ho=/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?(?:\+[0-9A-Za-z.-]+)?$/,So=s().trim().regex(ho).max(64);r({version:So.optional(),openchamber:yo});X([r({openchamber:_n()}),r({openchamber:r({}).passthrough()})]);const z=s().trim().min(1).max(1024),Fe=g(["loading","ready","error"]),sn=r({directory:z,name:s(),branch:s(),status:g(["ready","pending","invalid","missing"])}),rn=de("kind",[r({kind:c("projects")}).strict(),r({kind:c("worktrees"),projectId:z}).strict(),r({kind:c("sessions"),projectId:z}).strict()]),Cn=de("kind",[r({kind:c("projects"),state:Fe,projects:I(r({id:z,name:s(),directory:z}))}),r({kind:c("worktrees"),projectId:z,state:Fe,worktrees:I(sn)}),r({kind:c("sessions"),projectId:z,state:Fe,coverage:I(r({directory:z,state:Fe})),sessions:I(r({id:z,title:s(),projectId:z,directory:z,parentId:z.nullable(),createdAt:G(),updatedAt:G(),archivedAt:G().nullable(),worktree:sn.nullable(),activity:g(["unknown","idle","running","retrying","waiting-permission","waiting-question"]),outcome:g(["completed","failed"]).nullable(),items:I(r({id:z,data:Qe().optional()}))}))})]),go=X([U(),r({kind:c("existing"),directory:z}).strict(),r({kind:c("new"),name:s().trim().min(1).max(200).optional(),baseBranch:s().trim().min(1).max(200).optional()}).strict()]),Ke=s().min(1).max(kr),Eo=de("op",[r({op:c("get"),key:Ke}).strict(),r({op:c("delete"),key:Ke}).strict(),r({op:c("set"),key:Ke,value:Qe().refine(e=>new TextEncoder().encode(JSON.stringify(e)).length<=wr)}).strict(),r({op:c("keys")}).strict()]),Pn=X([r({storage:c(!0),op:c("get"),found:c(!1)}),r({storage:c(!0),op:c("get"),found:c(!0),value:Qe()}),r({storage:c(!0),op:g(["set","delete"])}),r({storage:c(!0),op:c("keys"),keys:I(Ke).max(xr)})]),T={channel:c(V),v:c(W)},To=r({background:s().min(1),elevated:s().min(1),foreground:s().min(1),muted:s().min(1),subtle:s().min(1),border:s().min(1),hover:s().min(1),selection:s().min(1),focus:s().min(1),primary:s().min(1),mutedSurface:s().min(1),elevatedForeground:s().min(1),active:s().min(1),selectionForeground:s().min(1),primaryForeground:s().min(1),primaryText:s().min(1),successText:s().min(1),warningText:s().min(1),errorText:s().min(1),infoText:s().min(1),success:s().min(1),warning:s().min(1),error:s().min(1),info:s().min(1),font:s().min(1),mono:s().min(1),radius:s().min(1)}),Mn=r({id:s().min(1),title:s().min(1),busy:U().optional().default(!1),model:s().min(1).max(un).optional(),agent:s().min(1).max(ln).optional()}).nullable(),jn=r({connected:U(),account:s().max(gs)}),Gn=Ze(s().regex(Ts),s().max(Es)),ko=r({status:G().int().min(100).max(599),body:s().max(ks)}),on=r({directory:s(),name:s(),branch:s(),status:g(["ready","pending","invalid","missing"])}),wo=X([r({sessionId:s().min(1),sent:g(dn),directory:s().optional(),worktree:on.optional(),linked:U().optional()}),r({sessionId:_n(),sent:c("skipped"),directory:s(),worktree:on,failure:g(["bootstrap-failed","session-create-failed"])})]),xo=r({sent:g(dn)}),_o=r({status:g(ws)}),vo=r({content:s().max(vt)}),bo=r({written:c(!0)}),Ro=r({entries:I(r({name:s().min(1),kind:g(pn)})).max(mn)}),Ao=r({kind:g(fn),size:G().int().min(0),mtime:G().int().min(0)}),Io=r({text:s().max(yn)}),Oo=X([Pn,Cn,wo,ko,xo,_o,vo,bo,Ro,Ao,Io]),Oe=r({providerId:s().trim().regex(As),id:s().trim().min(1).max(Rs),title:s().trim().min(1).max(bs),url:s().trim().min(1).max(hn),text:s().trim().min(1).max(vs).optional(),kind:g(["issue","pull"]).optional(),author:s().trim().min(1).max(_s).optional(),branches:r({head:s().trim().min(1).max($t),base:s().trim().min(1).max($t)}).optional(),data:Qe().refine(e=>JSON.stringify(e).length<=xs).optional()}),Nn=g(["user","assistant"]),Un=r({kind:c("message"),action:s().trim().min(1).max(64),sessionId:s().min(1),sessionTitle:s(),directory:s().nullable(),messageId:s().min(1),role:Nn,text:s().max(Sn)}),Dn=r({kind:c("session"),action:s().trim().min(1).max(64),sessionId:s().min(1),sessionTitle:s(),directory:s().nullable(),messages:I(r({id:s().min(1),role:Nn,text:s().max(Sn),createdAt:G().int().min(0)})).optional(),truncated:U().optional()}).refine(e=>JSON.stringify(e).length<=Is),Ln=X([Un,Dn,Oe]).nullable(),Co=r({theme:r({mode:g(["light","dark"]),tokens:To}),locale:s().min(1),directory:s().nullable(),session:Mn,surface:g(["panel","dialog","page","background"]),connection:jn,settings:Gn,item:Ln}),Po=r({...T,type:c("result"),id:s().min(1),ok:U(),error:s().min(1).optional(),code:s().min(1).optional(),payload:Oo.optional()}).transform((e,t)=>e.ok?e.payload?{channel:e.channel,v:e.v,type:"result",id:e.id,ok:!0,payload:e.payload}:{channel:e.channel,v:e.v,type:"result",id:e.id,ok:!0}:e.error?{channel:e.channel,v:e.v,type:"result",id:e.id,ok:!1,error:e.error,code:Me(e.code)}:(t.addIssue({code:"custom",message:"Failed result needs an error string."}),fr));X([r({...T,type:c("workspace"),payload:r({subscriptionId:s().min(1).max(128),snapshot:Cn})}),r({...T,type:c("ready"),payload:Co}),r({...T,type:c("directory"),payload:r({directory:s().nullable()})}),r({...T,type:c("session"),payload:r({session:Mn})}),r({...T,type:c("connection"),payload:r({connection:jn})}),r({...T,type:c("settings"),payload:r({settings:Gn})}),r({...T,type:c("session-lifecycle"),payload:r({sessionId:s().min(1),phase:g(Os)})}),r({...T,type:c("item"),payload:r({item:Ln})}),r({...T,type:c("resolve"),id:s().min(1),payload:r({command:s().min(1),args:s()})}),Po,r({...T,type:c("action"),id:s().min(1),payload:X([Un,Dn])})]);const $e=s().min(1).max(Cs).refine(Ps),Mo=de("type",[r({...T,type:c("action-result"),id:s().min(1),payload:de("ok",[r({ok:c(!0)}),r({ok:c(!1),error:s().trim().min(1).max(Xt)})])}),r({...T,type:c("workspace-read"),id:s().min(1),payload:rn}),r({...T,type:c("workspace-subscribe"),id:s().min(1),payload:r({subscriptionId:s().min(1).max(128),query:rn})}),r({...T,type:c("workspace-unsubscribe"),id:s().min(1),payload:r({subscriptionId:s().min(1).max(128)})}),r({...T,type:c("storage"),id:s().min(1),payload:Eo}),r({...T,type:c("open-session"),id:s().min(1),payload:r({sessionId:s().min(1).max(1024)})}),r({...T,type:c("hello")}),r({...T,type:c("toast"),id:s().min(1),payload:r({kind:g(["info","success","error"]),message:s().trim().min(1).max(Ms),copy:X([U(),r({text:s().min(1).max(qt)})]).optional(),dismiss:U().optional(),persistent:U().optional()})}),r({...T,type:c("open-url"),id:s().min(1),payload:r({url:s().trim().min(1).max(hn)})}),r({...T,type:c("open-surface"),id:s().min(1),payload:r({surfaceId:s().trim().min(1).max(64)})}),r({...T,type:c("clipboard-write"),id:s().min(1),payload:r({text:s().min(1).max(qt)})}),r({...T,type:c("compose"),id:s().min(1),payload:r({text:s().trim().min(1).max(zt),mode:g(["replace","append"]).optional()})}),r({...T,type:c("attach"),id:s().min(1),payload:Oe}),r({...T,type:c("start-session"),id:s().min(1),payload:Oe.extend({worktree:go.optional(),projectId:s().trim().min(1).max(1024).optional(),navigation:g(["preserve","open"]).optional()})}),r({...T,type:c("prompt"),id:s().min(1),payload:r({text:s().trim().min(1).max(zt),send:U().optional()})}),r({...T,type:c("session-link"),id:s().min(1),payload:Oe}),r({...T,type:c("close"),id:s().min(1)}),r({...T,type:c("oauth-start"),id:s().min(1)}),r({...T,type:c("oauth-disconnect"),id:s().min(1)}),r({...T,type:c("request"),id:s().min(1),payload:r({method:g(["GET","POST","PUT","PATCH","DELETE"]),path:s().trim().min(1).max(Kt).refine(Wt),query:Ze(s().min(1).max(128),s().max(2e3)).optional(),body:s().max(Jt).optional()})}),r({...T,type:c("service-request"),id:s().min(1),payload:r({method:g(["GET","POST","PUT","PATCH","DELETE"]),path:s().trim().min(1).max(Kt).refine(Wt),query:Ze(s().min(1).max(128),s().max(2e3)).optional(),body:s().max(Jt).optional()})}),r({...T,type:c("service-status"),id:s().min(1)}),r({...T,type:c("file-read"),id:s().min(1),payload:r({path:$e})}),r({...T,type:c("file-write"),id:s().min(1),payload:r({path:$e,content:s().max(vt)})}),r({...T,type:c("file-list"),id:s().min(1),payload:r({path:$e})}),r({...T,type:c("file-stat"),id:s().min(1),payload:r({path:$e})}),r({...T,type:c("generate"),id:s().min(1),payload:r({prompt:s().trim().min(1).max(Ns),system:s().trim().min(1).max(Gs).optional(),maxOutputTokens:G().int().min(1).max(js).optional()})}),r({...T,type:c("badge"),id:s().min(1),payload:r({count:G().int().min(0).max(Us).nullable()})}),r({...T,type:c("resolve-result"),id:s().min(1),payload:X([r({item:Oe.nullable()}),r({error:s().trim().min(1).max(Xt)})])})]);X([r({ok:c(!0),data:r({}).passthrough()}),r({ok:c(!1),error:s().min(1).max(2e3)})]);g(Ds);const gt=r({alt:U(),ctrl:U(),meta:U(),shift:U()}),xe=G().finite(),jo=de("type",[r({type:c("pointer"),action:g(["down","up","move"]),x:xe,y:xe,button:G().int().min(-1).max(4),buttons:G().int().min(0).max(31),modifiers:gt}),r({type:c("wheel"),x:xe,y:xe,deltaX:xe,deltaY:xe,modifiers:gt}),r({type:c("key"),action:g(["down","up"]),key:s().min(1).max(64),code:s().max(64),modifiers:gt}),r({type:c("text"),text:s().min(1).max(bt)})]),le=G().int().min(1).max(Ls);de("type",[r({type:c("ack"),seq:G().int().min(0)}),r({type:c("input"),events:I(jo).min(1).max(Hs)}),r({type:c("release")}),r({type:c("resize"),width:le,height:le}),r({type:c("clipboard-read"),id:s().min(1).max(64)})]);const Go=g(Bs),Ka=de("type",[r({type:c("hello"),viewerId:s().min(1)}),r({type:c("frame"),seq:G().int().min(0),width:le,height:le,mime:g($s),bytes:G().int().min(1),title:s().max(Fs).optional(),agentActive:U()}),r({type:c("control"),controller:Go,mine:U()}),r({type:c("resized"),width:le,height:le}),r({type:c("clipboard"),id:s().min(1).max(64),text:s().max(bt)}),r({type:c("error"),code:s().min(1).max(64),message:s().min(1).max(500)}),r({type:c("ended"),reason:g(["service-stopped","extension-unavailable","host-shutdown"])})]);r({width:le,height:le});r({text:s().max(bt)});const No=e=>({channel:V,v:W,type:"ready",payload:e}),Uo=e=>({channel:V,v:W,type:"directory",payload:{directory:e}}),Do=e=>({channel:V,v:W,type:"session",payload:{session:e}}),Lo=e=>({channel:V,v:W,type:"connection",payload:{connection:e}}),Ho=e=>({channel:V,v:W,type:"settings",payload:{settings:e}}),Bo=e=>({channel:V,v:W,type:"item",payload:{item:e}}),Fo=(e,t,n)=>({channel:V,v:W,type:"resolve",id:e,payload:{command:t,args:n}}),$o=e=>({channel:V,v:W,type:"session-lifecycle",payload:e}),Xo=e=>e?.type==="busy"||e?.type==="retry"?"started":e?.type==="idle"?"completed":e?.type?"failure":null,qo=e=>{const t=e?.providerID?.trim(),n=e?.id?.trim();if(!(!t||!n))return`${t}/${n}`},zo=e=>{if(!e?.id)return null;const t=e.title?.trim(),n={id:e.id,title:t||e.id,busy:!!e.busy},o=e.model?.trim().slice(0,un);o&&(n.model=o);const a=e.agent?.trim().slice(0,ln);return a&&(n.agent=a),n},M=(e,t)=>t?{channel:V,v:W,type:"result",id:e,ok:!0,payload:t}:{channel:V,v:W,type:"result",id:e,ok:!0},N=(e,t,n="HOST_REJECTED")=>({channel:V,v:W,type:"result",id:e,ok:!1,error:t,code:n}),Xe=(e,t)=>t.ok?M(e,t.result):N(e,t.message,t.code),qe=e=>{try{const t=new URL(e);return t.protocol==="http:"||t.protocol==="https:"}catch{return!1}},Jo=async(e,t)=>{try{switch(e.type){case"workspace-read":return M(e.id,t.workspaceRead(e.payload));case"workspace-subscribe":return t.workspaceSubscribe(e.payload),M(e.id);case"workspace-unsubscribe":return t.workspaceUnsubscribe(e.payload.subscriptionId),M(e.id);case"storage":return M(e.id,await t.storage(e.payload));case"open-session":return t.openSession(e.payload.sessionId),M(e.id);case"hello":case"action-result":return null;case"toast":return t.toast(e.payload),M(e.id);case"open-url":return qe(e.payload.url)?await t.openUrl(e.payload.url)?M(e.id):N(e.id,"Could not open URL."):N(e.id,"URL must be http or https.");case"open-surface":return hr(e.payload.surfaceId)?(t.openSurface(e.payload.surfaceId),M(e.id)):N(e.id,"Unknown surface.");case"clipboard-write":return await t.writeClipboard(e.payload.text)?M(e.id):N(e.id,"Could not write clipboard.");case"compose":return t.compose(e.payload.text,e.payload.mode??"append"),M(e.id);case"attach":return qe(e.payload.url)?(t.attach(e.payload),M(e.id)):N(e.id,"URL must be http or https.");case"start-session":{if(!qe(e.payload.url))return N(e.id,"URL must be http or https.");const n=await t.startSession(e.payload);return n?"sessionId"in n?M(e.id,n):N(e.id,n.message,n.code):N(e.id,"Could not start that session.")}case"prompt":{const n=await t.prompt(e.payload);return n.ok?M(e.id,n.result):N(e.id,n.message,n.code)}case"session-link":{if(!qe(e.payload.url))return N(e.id,"URL must be http or https.");const n=await t.sessionLink(e.payload);return n.ok?M(e.id):N(e.id,n.message,n.code)}case"close":return t.close(),M(e.id);case"oauth-start":return await t.oauthStart()?M(e.id):N(e.id,"Could not start OAuth.");case"oauth-disconnect":return await t.oauthDisconnect()?M(e.id):N(e.id,"Could not disconnect.");case"request":{const n=await t.request(e.payload);return n.ok?M(e.id,n.result):N(e.id,n.message,n.code)}case"service-request":{const n=await t.serviceRequest(e.payload);return n.ok?M(e.id,n.result):N(e.id,n.message,n.code)}case"service-status":{const n=await t.serviceStatus();return n.ok?M(e.id,n.result):N(e.id,n.message,n.code)}case"file-read":return Xe(e.id,await t.file({op:"read",path:e.payload.path}));case"file-write":return Xe(e.id,await t.file({op:"write",path:e.payload.path,content:e.payload.content}));case"file-list":return Xe(e.id,await t.file({op:"list",path:e.payload.path}));case"file-stat":return Xe(e.id,await t.file({op:"stat",path:e.payload.path}));case"generate":{const n=await t.generate(e.payload);return n.ok?M(e.id,n.result):N(e.id,n.message,n.code)}case"badge":return t.setBadge(e.payload.count),M(e.id);case"resolve-result":return t.resolveResult(e.id,e.payload),null}}catch(n){return e.type==="hello"?null:N(e.id,n instanceof K?n.message:"Extension operation failed.",n instanceof K?n.code:"HOST_REJECTED")}},Ko=X([r({content:s().max(vt)}),r({written:c(!0)}),r({entries:I(r({name:s().min(1),kind:g(pn)})).max(mn)}),r({kind:g(fn),size:G().int().min(0),mtime:G().int().min(0)})]),Wo=r({ok:c(!0),result:Ko}),Vo=r({error:s().min(1),message:s().min(1).optional()}),We=(e,t)=>({ok:!1,code:e,message:t}),Yo=async e=>{const t=await e.json().catch(()=>null);if(!e.ok){const o=Vo.safeParse(t);return o.success?We(Me(o.data.error),o.data.message??o.data.error):We("HOST_REJECTED","File operation failed.")}const n=Wo.safeParse(t);return n.success?{ok:!0,result:n.data.result}:We("HOST_REJECTED","File operation failed.")},Zo=async(e,t,n)=>{const o=new Headers({"Content-Type":"application/json"});n&&o.set("x-opencode-directory",n);try{const a=await q(`/api/guests/${e}/files`,{method:"POST",headers:o,body:JSON.stringify(t)});return Yo(a)}catch{return We("HOST_REJECTED","File operation failed.")}},Qo=r({ok:c(!0),result:r({text:s().max(yn)})}),ea=r({error:s().min(1),message:s().min(1).optional()}),Ve=(e,t)=>({ok:!1,code:e,message:t}),xt="Text generation failed.",ta=async e=>{const t=await e.json().catch(()=>null);if(!e.ok){const o=ea.safeParse(t);return o.success?Ve(Me(o.data.error),o.data.message??o.data.error):Ve("HOST_REJECTED",xt)}const n=Qo.safeParse(t);return n.success?{ok:!0,result:n.data.result}:Ve("HOST_REJECTED",xt)},na=async(e,t,n)=>{const o=new Headers({"Content-Type":"application/json"});n&&o.set("x-opencode-directory",n);try{const a=await q(`/api/guests/${e}/generate`,{method:"POST",headers:o,body:JSON.stringify(t)});return ta(a)}catch{return Ve("HOST_REJECTED",xt)}},Et="https://extension.invalid",sa=500,ra=40*1024*1024,an=64*1024*1024,Tt=async e=>{const t=new Uint8Array(await e.arrayBuffer());let n="";for(let o=0;o<t.length;o+=8192)n+=String.fromCharCode(...t.subarray(o,o+8192));return`data:${e.type||"application/octet-stream"};base64,${btoa(n)}`},oa=e=>e.replace(/\\(?:([0-9a-f]{1,6})\s?|([\s\S]))/gi,(t,n,o)=>{if(n){const a=Number.parseInt(n,16);return a>0&&a<=1114111?String.fromCodePoint(a):"�"}return o===`
2
2
  `||o==="\r"?"":o??""}),aa=/\/\*[\s\S]*?\*\/|"(?:\\[\s\S]|[^"\\])*"|'(?:\\[\s\S]|[^'\\])*'|\burl\(\s*(?:"((?:\\[\s\S]|[^"\\])*)"|'((?:\\[\s\S]|[^'\\])*)'|((?:\\[\s\S]|[^)\\])*?))\s*\)|@import\s+(?:"((?:\\[\s\S]|[^"\\])*)"|'((?:\\[\s\S]|[^'\\])*)')/gi,ia=async(e,t,n)=>{const o=`/api/guests/${e}/`,a=new URL(t,`${Et}${o}`),d=new Map;let b=0,x=0;const _=async i=>{if(i.origin!==Et||!i.pathname.startsWith(o))throw new Error("Extension resource is outside its package");const f=await n(`${i.pathname}${i.search}`);if(!f.ok)throw new Error(`Could not load extension resource (HTTP ${f.status})`);const v=f.body?.getReader();if(!v)throw new Error("Extension resource has no response body");const m=[];try{for(;;){const{done:l,value:u}=await v.read();if(l)break;if(b+=u.byteLength,b>ra)throw new Error("Extension document exceeds the resource size limit");m.push(new Uint8Array(u))}}catch(l){throw await v.cancel().catch(()=>{}),l}finally{v.releaseLock()}return new Blob(m,{type:f.headers.get("content-type")?.split(";")[0]||"application/octet-stream"})},j=async(i,f,v)=>{const m=i.trim();if(!m||m.startsWith("#"))return i;const l=new URL(m,f);if(l.origin!==Et)return l.href;const u=l.hash;l.hash="";const k=l.href;if(v.includes(k))throw new Error("Circular extension resource reference");let E=d.get(k);if(!E){if(d.size>=sa)throw new Error("Extension document has too many resources");const A=[...v,k];E=_(l).then(async D=>{const Z=D.type.split(";")[0];return Z==="text/css"||l.pathname.endsWith(".css")?Tt(new Blob([await h(await D.text(),l,A)],{type:"text/css"})):Tt(Z==="text/html"?new Blob([await C(await D.text(),l,A)],{type:"text/html"}):D)}),d.set(k,E)}const P=`${await E}${u}`;if(x+=P.length,x>an)throw new Error("Extension document exceeds the embedded size limit");return P},h=async(i,f,v)=>{let m="",l=0;for(const u of i.matchAll(aa)){const k=u[1]??u[2]??u[3]??u[4]??u[5];if(k===void 0)continue;m+=i.slice(l,u.index);const E=await j(oa(k.trim()),f,v),P=JSON.stringify(E);m+=u[4]!==void 0||u[5]!==void 0?`@import url(${P})`:`url(${P})`,l=u.index+u[0].length}return m+i.slice(l)},R=async(i,f,v)=>{const m=[];let l=i;for(;l.trim();){l=l.replace(/^[\s,]+/,"");const u=/^\S+/.exec(l);if(!u)break;const k=u[0];l=l.slice(k.length);let E="";if(!k.endsWith(",")){const A=l.indexOf(",");E=(A<0?l:l.slice(0,A)).trim(),l=A<0?"":l.slice(A+1)}const P=await j(k.replace(/,+$/,""),f,v);m.push(E?`${P} ${E}`:P)}return m.join(", ")},C=async(i,f,v)=>{const m=new DOMParser().parseFromString(i,"text/html"),l=m.querySelector("base[href]")?.getAttribute("href"),u=m.querySelector("base[target]")?.getAttribute("target"),k=l?new URL(l,f):f;for(const A of m.querySelectorAll("base"))A.remove();const E=m.createElement("base");E.href=k.href,u&&(E.target=u),m.head.prepend(E);for(const A of m.querySelectorAll("script[src], link[href], img[src], source[src], video[src], audio[src], iframe[src], embed[src], object[data], image[href], image[xlink\\:href], use[href], use[xlink\\:href]"))for(const D of["src","href","data","xlink:href"]){const Z=A.getAttribute(D);Z!==null&&A.setAttribute(D,await j(Z,k,v))}for(const A of m.querySelectorAll("[poster]"))A.setAttribute("poster",await j(A.getAttribute("poster")??"",k,v));for(const A of m.querySelectorAll("img[srcset], source[srcset]"))A.setAttribute("srcset",await R(A.getAttribute("srcset")??"",k,v));for(const A of m.querySelectorAll("style"))A.textContent=await h(A.textContent??"",k,v);for(const A of m.querySelectorAll("[style]"))A.setAttribute("style",await h(A.getAttribute("style")??"",k,v));const P=`<!doctype html>
3
3
  ${m.documentElement.outerHTML}`;if(P.length>an)throw new Error("Extension document exceeds the size limit");return P},S=await _(a);if(S.type.split(";")[0]!=="text/html")throw new Error("Extension entry is not HTML");return C(await S.text(),a,[a.href])},ca=async(e,t,n)=>{const o=F(),a=ht();if(a){const x=await ia(e,t,_=>{if(F()!==o||ht()!==a||n?.aborted)throw new DOMException("Extension frame owner changed","AbortError");return q(_,{signal:n})});if(F()!==o||ht()!==a||n?.aborted)throw new DOMException("Extension frame owner changed","AbortError");return{kind:"document",html:x}}const{token:d,expiresAt:b}=await Sr(e);if(o!==F())throw new Error("Runtime changed while authorizing extension frame");return{kind:"url",url:gr().assetWithUrlToken(`/api/guests/${e}/${t}`,d,{oc_ui:"issue-page"}),expiresAt:b}},la=e=>{const t=Kn.c(31),{guestId:n,entry:o,instanceKey:a,enabled:d}=e,[b,x]=y.useState(null),[_,j]=y.useState(0),h=y.useRef(!1),[R,C]=y.useState(F);let S;t[0]!==d||t[1]!==o||t[2]!==n||t[3]!==a||t[4]!==R?(S=JSON.stringify([R,n,o,a,d]),t[0]=d,t[1]=o,t[2]=n,t[3]=a,t[4]=R,t[5]=S):S=t[5];const i=S;let f,v;t[6]===Symbol.for("react.memo_cache_sentinel")?(f=()=>tt(se=>{C(se.runtimeKey)}),v=[],t[6]=f,t[7]=v):(f=t[6],v=t[7]),y.useEffect(f,v);let m;t[8]===Symbol.for("react.memo_cache_sentinel")?(m=()=>{h.current=!1},t[8]=m):m=t[8];let l;t[9]!==i?(l=[i],t[9]=i,t[10]=l):l=t[10],y.useEffect(m,l);let u;t[11]!==d||t[12]!==o||t[13]!==n||t[14]!==i?(u=()=>{if(x({key:i,status:"loading"}),!o||!d)return;let se=!1;const me=new AbortController;return ca(n,o,me.signal).then(Re=>{se||x({key:i,status:"ready",source:Re})}).catch(()=>{se||x({key:i,status:"error"})}),()=>{se=!0,me.abort()}},t[11]=d,t[12]=o,t[13]=n,t[14]=i,t[15]=u):u=t[15];let k;t[16]!==d||t[17]!==o||t[18]!==n||t[19]!==i||t[20]!==_?(k=[d,o,n,i,_],t[16]=d,t[17]=o,t[18]=n,t[19]=i,t[20]=_,t[21]=k):k=t[21],y.useEffect(u,k);const E=b?.key===i&&b.status==="ready"?b.source:null;let P;t[22]!==E||t[23]!==i?(P=()=>E?E.kind==="document"||Date.now()<E.expiresAt?!1:(h.current?x({key:i,status:"error"}):(x({key:i,status:"loading"}),h.current=!0,j(ua)),!0):!0,t[22]=E,t[23]=i,t[24]=P):P=t[24];const A=P;let D;t[25]===Symbol.for("react.memo_cache_sentinel")?(D=()=>{h.current=!1},t[25]=D):D=t[25];const Z=D,ge=E?.kind==="url"?E.url:"",ve=E?.kind==="document"?E.html:void 0,be=b?.key===i?b.status:"loading";let pe;return t[26]!==A||t[27]!==ge||t[28]!==ve||t[29]!==be?(pe={src:ge,srcDoc:ve,status:be,recoverExpiredNavigation:A,acknowledgeHandshake:Z},t[26]=A,t[27]=ge,t[28]=ve,t[29]=be,t[30]=pe):pe=t[30],pe};function ua(e){return e+1}const Hn="/api/linear/issues/get",da=(e,t)=>e==="host"&&t.method==="GET"&&t.path===Hn,pa=async(e,t)=>{if(da(e,t))try{const n=await q(Hn,{query:t.query});return{status:n.status,body:await n.text()}}catch{return null}},ma=e=>{const t=At.getState();if(!t.hasServerSnapshot)throw new K("HOST_UNAVAILABLE","The project registry has not loaded.");const n=t.projects.find(o=>o.id===e);if(!n)throw new K("NOT_FOUND","Project is not registered.");return n},Ye=e=>ne.getState().availableWorktreesByProject.get($(e)??e)??[],Bn=e=>({directory:e.path,name:e.name??e.label,branch:e.branch,status:e.worktreeStatus==="not-a-repo"?"invalid":e.worktreeStatus??"ready"}),fa=e=>e.includes("error")?"error":e.includes("loading")?"loading":"ready",ya=(e,t,n,o)=>{const a=e.directory,d=Tn(a),b=En.getState(),x=b.statusById.get(e.id),_=(x&&$(x.directory)===$(a)?x.status:void 0)??d?.session_status[e.id],j=b.observedById.get(e.id),h=j&&$(j.directory)===$(a)?j:void 0,R=ne.getState().worktreeMetadata.get(e.id),C=o.get($(a)??a)??(R&&$(R.path)===$(a)?Bn(R):null),S=ue.getState().isConnected;let i="unknown";return S&&(_?.type==="busy"?i="running":_?.type==="retry"?i="retrying":(_?.type==="idle"||d?.sessionStatusReady||h)&&(i="idle"),d?.permission[e.id]?.length?i="waiting-permission":d?.form[e.id]?.length&&(i="waiting-question")),{id:e.id,title:e.title||e.id,projectId:t,directory:a,parentId:e.parentID??null,createdAt:e.time.created,updatedAt:e.time.updated,archivedAt:e.time.archived||null,worktree:C,activity:i,outcome:i==="idle"?h?.outcome??null:null,items:qs(e).flatMap(f=>{if(f.kind!=="guest"||f.providerId!==n)return[];const v={id:f.identifier};return f.data!==void 0&&(v.data=f.data),[v]})}},_t=(e,t)=>{const n=At.getState();if(e.kind==="projects")return{kind:"projects",state:n.serverSnapshotFailed?"error":n.hasServerSnapshot?"ready":"loading",projects:n.hasServerSnapshot?n.projects.map(i=>({id:i.id,name:i.label||i.path.split("/").pop()||i.path,directory:i.path})):[]};const o=n.projects.find(i=>i.id===e.projectId),a=ne.getState(),d=o?$(o.path)??o.path:"",b=o?a.worktreeDiscoveryByProject.get(d)??"loading":n.hasServerSnapshot?"error":"loading",x=o?Ye(o.path).map(Bn):[];if(e.kind==="worktrees")return{...e,state:b,worktrees:x};const _=new Set(o?[d,...x.map(i=>$(i.directory)??i.directory)]:[]),j=gn(),h=Rt.getState(),R=[..._].map(i=>{const v=j.getBootstrapState(i)==="failed"||h.status==="error"?"error":h.status==="ready"?"ready":"loading";return{directory:i,state:v}}),C=new Map;for(const i of _)for(const f of h.structure.activeIdsByDirectory.get(i)??[]){const v=h.entityById.get(f);v&&C.set(f,v)}for(const i of h.archivedSessions)_.has($(i.directory)??i.directory)&&C.set(i.id,i);for(const i of _)for(const f of Tn(i)?.session??[])_.has($(f.directory)??f.directory)&&(C.has(f.id)||C.set(f.id,f));const S=new Map(x.map(i=>[$(i.directory)??i.directory,i]));return{...e,state:fa([b,...R.map(i=>i.state)]),coverage:R,sessions:[...C.values()].map(i=>ya(i,e.projectId,t,S))}},kt=new Map,ha=(e,t,n)=>{const o=JSON.stringify([F(),t,e]);let a=kt.get(o);if(!a){const b=new Set,x={listeners:b,snapshot:_t(e,t),dispose:()=>{}};let _=!1,j=!1,h=JSON.stringify(x.snapshot);const R=()=>{_||j||(_=!0,queueMicrotask(()=>{if(_=!1,j)return;const S=_t(e,t),i=JSON.stringify(S);if(i!==h){h=i,x.snapshot=S;for(const f of b)f(S)}}))},C=[At.subscribe((S,i)=>{(S.projects!==i.projects||S.hasServerSnapshot!==i.hasServerSnapshot||S.serverSnapshotFailed!==i.serverSnapshotFailed)&&R()})];if(e.kind!=="projects"&&C.push(ne.subscribe((S,i)=>{(S.availableWorktreesByProject!==i.availableWorktreesByProject||S.worktreeDiscoveryByProject!==i.worktreeDiscoveryByProject||S.worktreeMetadata!==i.worktreeMetadata)&&R()})),e.kind==="sessions"){const S=gn();C.push(Rt.subscribe((i,f)=>{(i.activeSessions!==f.activeSessions||i.archivedSessions!==f.archivedSessions||i.status!==f.status)&&R()}),En.subscribe(R),ue.subscribe((i,f)=>{i.isConnected!==f.isConnected&&R()}),S.subscribeBootstrap(R),S.subscribeAllSelected(i=>i.session,R),S.subscribeAllSelected(i=>i.permission,R),S.subscribeAllSelected(i=>i.form,R),S.subscribeAllSelected(i=>i.sessionStatusReady,R))}x.dispose=()=>{j=!0;for(const S of C)S();kt.delete(o)},C.push(tt(x.dispose)),kt.set(o,x),a=x}a.listeners.add(n),n(a.snapshot);const d=a;return()=>{d.listeners.delete(n),d.listeners.size===0&&d.dispose()}},Sa=e=>{const t=Xs().get(e)??Rt.getState().entityById.get(e);if(!t?.directory)throw new K("NO_SESSION","Session is not available.");ne.getState().setCurrentSession(e,t.directory),et.getState().closeMainSurfaces()},ga=e=>`${e.id} ${e.title}`.trim(),Ea=(e,t)=>{const n=e.replace(/[^a-zA-Z0-9]+/g,"-").replace(/^-+|-+$/g,"").toLowerCase();return`${t==="pull"?"pr":"issue"}-${n||"guest"}`},Fn=(e,t,n)=>{const o=t?.trim()??"";if(!o)return{ok:!1,reason:"no-directory"};const a=Ys(e),d=a.kind==="pull"?"pull":"issue",b={ok:!0,directory:o,title:ga(a),worktree:!!a.worktree,branchName:Ea(a.id,d),kind:d==="pull"?"pr":"standard",linked:Zs({providerId:a.providerId,identifier:a.id,title:a.title,url:a.url,thread:d,author:a.author,head:a.branches?.head,base:a.branches?.base,data:a.data,linkedAt:n})};return a.text&&(b.text=a.text),b},Ta=async(e,t)=>{const n=e.worktree?await t.createWorktree(e.directory,e.branchName,e.kind):await t.createSession(e.title,e.directory);if(!n)return{ok:!1,reason:e.worktree?"worktree-failed":"create-failed"};if(t.initializeSession(n.id),t.closeSurfaces(),await t.setLinkedIssue(n.id,n.directory,e.linked),!e.text)return{ok:!0,sessionId:n.id,sent:"skipped"};const o=await t.sendFirstMessage(n.id,n.directory,e.text);return{ok:!0,sessionId:n.id,sent:o}},ka=()=>{const e=ue.getState();if(e.settingsDefaultAgent)return e.settingsDefaultAgent;const t=e.agents.filter(n=>!n.hidden);return e.currentAgentName||t.find(n=>n.mode==="primary"||!n.mode)?.name||t[0]?.name},wa=()=>{const e=sr(ue.getState().settingsDefaultModel);return!e||!ue.getState().getModelMetadata(e.providerId,e.modelId)?null:{providerID:e.providerId,modelID:e.modelId}},xa=(e,t)=>{const n=ue.getState(),o=n.settingsDefaultVariant,a=n.currentProviderId===e&&n.currentModelId===t?n.currentVariant:void 0,b=n.providers.find(_=>_.id===e)?.models.find(_=>_.id===t),x=rr(b);if(x.length===0)return o||a||void 0;if(o&&x.includes(o))return o;if(a&&x.includes(a))return a},$n=()=>{const e=ue.getState(),t=Qs.getState().lastUsedProvider,n=wa(),o=n?.providerID||e.currentProviderId||t?.providerID,a=n?.modelID||e.currentModelId||t?.modelID,d=ka()||e.currentAgentName||void 0;return!o||!a?null:{providerID:o,modelID:a,agentName:d,variant:xa(o,a)}},Xn=async(e,t,n,o=$n())=>{if(!o)return"no-model";try{return await ne.getState().sendMessage(n,o.providerID,o.modelID,o.agentName,void 0,void 0,void 0,o.variant,void 0,{sessionId:e,directory:t}),"sent"}catch{return"failed"}},_a=(e,t,n,o)=>{const a=n?.trim()??"";if(!a)return{ok:!1,code:"HOST_REJECTED",message:"Open a project first.",toastKey:"contextPanel.plugin.startSession.noProject"};const d=t?.trim()??"";if(!d)return{ok:!1,code:"NO_SESSION",message:"No open session.",toastKey:"contextPanel.plugin.sessionLink.noSession"};const b=Fn(e,a,o);return b.ok?{ok:!0,sessionId:d,directory:a,linked:b.linked}:{ok:!1,code:"HOST_REJECTED",message:"Open a project first.",toastKey:"contextPanel.plugin.startSession.noProject"}},va=async e=>{const t=_a(e.request,e.sessionId,e.directory,Date.now());if(!t.ok)return J.error(e.t(t.toastKey)),{ok:!1,code:t.code,message:t.message};try{return await kn(t.sessionId,t.directory,t.linked,!0),J.success(e.t("contextPanel.plugin.sessionLink.linked")),{ok:!0}}catch{return J.error(e.t("contextPanel.plugin.sessionLink.failed")),{ok:!1,code:"HOST_REJECTED",message:"Could not link that item."}}},ba=e=>{const t=Vs(e.request),n=e.sessionId?.trim()??"";if(!n)return{ok:!1,code:"NO_SESSION",message:"No open session.",toastKey:"contextPanel.plugin.prompt.noSession"};if(!t.send)return{ok:!0,action:"compose",text:t.text};if(e.busy)return{ok:!1,code:"SESSION_BUSY",message:"Session is busy.",toastKey:"contextPanel.plugin.prompt.busy"};const o=e.directory?.trim()??"";return o?{ok:!0,action:"send",text:t.text,sessionId:n,directory:o}:{ok:!1,code:"HOST_REJECTED",message:"Open a project first.",toastKey:"contextPanel.plugin.startSession.noProject"}},Ra=async e=>{const t=ba(e);if(!t.ok)return J.error(e.t(t.toastKey)),{ok:!1,code:t.code,message:t.message};if(t.action==="compose")return e.compose(t.text,"replace"),{ok:!0,result:{sent:"skipped"}};const n=await Xn(t.sessionId,t.directory,t.text);return n==="no-model"?J.error(e.t("contextPanel.plugin.prompt.noModel")):n==="failed"&&J.error(e.t("contextPanel.plugin.prompt.sendFailed")),{ok:!0,result:{sent:n}}},Aa=async e=>{e.assertAuthorized();const t=e.request.projectId?ma(e.request.projectId):e.directory?zs(e.directory):null,n=e.request.worktree;let o=e.request.projectId?t?.path??null:e.directory,a;if(n&&n!==!0&&n.kind==="existing"){if(!t)throw new K("NO_DIRECTORY","Project is not registered.");if(a=Ye(t.path).find(m=>$(m.path)===$(n.directory)),!a)throw new K("NOT_FOUND","Worktree does not belong to this project or has not loaded yet.");if(a.worktreeStatus==="missing"||a.worktreeStatus==="invalid"||a.worktreeStatus==="not-a-repo")throw new K("HOST_REJECTED","Worktree is unavailable.");o=a.path}const d=n===!0||!!(n&&n.kind==="new"),b=Fn({...e.request,worktree:d},o,Date.now());if(!b.ok)return J.error(e.t("contextPanel.plugin.startSession.noProject")),null;const x=e.request.navigation??"preserve",_=$n();let j=!1;const h=tt(()=>{j=!0}),R=()=>{if(j)throw new K("DISCONNECTED","The connected server changed.");e.assertAuthorized()};let C="session-create-failed",S=!0,i=o??"";const f=()=>{if(!a)return;const m=t?Ye(t.path).find(l=>l.path===a?.path)??a:a;return{directory:m.path,name:m.name??m.label,branch:m.branch,status:m.worktreeStatus==="not-a-repo"?"invalid":m.worktreeStatus??"ready"}},v=async(m,l)=>{if(a&&t){C="bootstrap-failed";const k=await er(t);R(),k&&await tr(a.path)}R(),C="session-create-failed";const u=await nr(m,l,void 0,void 0,_?{model:{providerID:_.providerID,id:_.modelID,variant:_.variant},agent:_.agentName}:void 0,x);if(R(),!u)return null;if(i=u.directory??l,a){const k=t?Ye(t.path).find(E=>E.path===a?.path):void 0;a={...a,worktreeStatus:k?.worktreeStatus??a.worktreeStatus},ne.getState().setWorktreeMetadata(u.id,a)}return{id:u.id,directory:i}};try{const m=await Ta(b,{createSession:v,createWorktree:async(l,u,k)=>{if(!t)throw new K("NO_DIRECTORY","Project is not registered.");const E=n&&n!==!0&&n.kind==="new"?n:void 0,P=E?.name??`${u}-${Js()}`,A=await Ks(t);return R(),a=await Ws(t,{preferredName:P,mode:"new",branchName:P,worktreeName:P,startRef:E?.baseBranch,setupCommands:A,returnAfterDirectoryCreated:!0}),R(),a={...a,kind:k,createdFromBranch:E?.baseBranch},v(b.title,a.path)},initializeSession:l=>{ne.getState().initializeNewOpenChamberSession(l,ue.getState().agents)},setLinkedIssue:async(l,u,k)=>{R(),await kn(l,u,k,!0).catch(()=>{S=!1}),R()},sendFirstMessage:(l,u,k)=>(R(),Xn(l,u,k,_)),closeSurfaces:()=>{x==="open"&&et.getState().closeMainSurfaces()}});if(R(),!m.ok){const l=f();return l?{sessionId:null,sent:"skipped",directory:l.directory,worktree:l,failure:C}:(J.error(e.t("contextPanel.plugin.startSession.failed")),null)}return m.sent==="no-model"?J.error(e.t("contextPanel.plugin.startSession.noModel")):m.sent==="failed"?J.error(e.t("contextPanel.plugin.startSession.sendFailed")):J.success(e.t("contextPanel.plugin.startSession.created")),{sessionId:m.sessionId,sent:m.sent,directory:i,worktree:f(),linked:S}}catch(m){R();const l=f();if(l)return{sessionId:null,sent:"skipped",directory:l.directory,worktree:l,failure:C};throw m}finally{h()}},Ia=async(e,t)=>{const n=await q(`/api/guests/${encodeURIComponent(e)}/storage`,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(t)});if(!n.ok)throw new K("HOST_REJECTED","Storage operation failed. Check extension approval and storage limits.");return Pn.parse(await n.json())},Oa=({copyText:e,dismiss:t,onDismiss:n})=>{const{t:o}=wn(),[a,d]=y.useState("idle"),b=async()=>{if(!(e===void 0||a==="copying")){d("copying");try{const x=await xn(e);d(x.ok?"copied":"failed")}catch{d("failed")}}};return ce.jsxs("div",{className:"ml-auto flex shrink-0 flex-col items-end gap-1",children:[ce.jsxs("div",{className:"flex items-center gap-2",children:[e!==void 0&&ce.jsx(Vt,{type:"button",variant:"secondary",size:"xs",disabled:a==="copying",onClick:()=>{b()},"aria-live":"polite",children:o(a==="copied"?"contextPanel.plugin.toast.copied":"contextPanel.plugin.toast.copy")}),t&&ce.jsx(Vt,{type:"button",size:"xs",onClick:n,children:o("contextPanel.plugin.toast.ok")})]}),a==="failed"&&ce.jsx("span",{role:"status",className:"typography-micro text-[var(--status-error-text)]",children:o("contextPanel.plugin.toast.copyFailed")})]})},Ca=e=>{const t=e.copy===!0?e.message:e.copy?e.copy.text:void 0,n=e.dismiss===!0||e.persistent===!0;if(t===void 0&&!n){J[e.kind](e.message);return}const o=crypto.randomUUID(),a={id:o,action:ce.jsx(Oa,{copyText:t,dismiss:n,onDismiss:()=>J.dismiss(o)})};e.persistent&&(a.duration=1/0),J[e.kind](e.message,a)},cn="*",Pa='"SF Pro Text", -apple-system, BlinkMacSystemFont, "Segoe UI", system-ui, sans-serif',Ma='ui-monospace, "SFMono-Regular", "Menlo", "Cascadia Mono", "Segoe UI Mono", monospace',ja="0.5625rem",_e="The user has not allowed this capability for the extension.",Ga=(e,t)=>e.type==="attach"||e.type==="start-session"||e.type==="session-link"?e.payload.providerId===t?e:{...e,payload:{...e.payload,providerId:t}}:e,wt=(e,t)=>getComputedStyle(document.documentElement).getPropertyValue(e).trim()||t,Na=({mode:e,surface:t="panel",item:n,headless:o=!1,backgroundAction:a,onDismiss:d,onAttach:b,onSessionStarted:x})=>{const{t:_,locale:j}=wn(),{currentTheme:h}=or(),R=ar(),C=ne(w=>w.currentSessionId),S=a?a.item.directory??"":R,i=a?a.item.sessionId:C,f=ir(i,S||void 0),v=cr(i??"",S||void 0),m=y.useRef(null),l=Er(e),u=He(w=>w.guests.find(Y=>Y.id===l)??null),k=He(w=>w.status),E=u?ft(u):!0,P=Be(w=>w.byId[l]),A=Be(w=>w.setStatus),D=Be(w=>w.refresh),Z=Yt(w=>w.pendingItemByGuest[l]),ge=Yt(w=>w.takePendingItem),[ve,be]=y.useState(null);y.useEffect(()=>{o||n!==void 0||!Z||be(ge(l))},[l,o,n,Z,ge]);const pe=o?null:n!==void 0?n:ve,se=Zt(w=>w.clearBadge);y.useEffect(()=>{t==="panel"&&!o&&se(l)},[se,l,o,t]);const me=v?.type==="busy"||v?.type==="retry",Re=Xo(v),Ot=y.useMemo(()=>zo(i?{id:f?.id??i,title:f?.title??a?.item.sessionTitle,busy:me,model:qo(f?.model),agent:f?.agent}:null),[a,i,f,me]),fe=y.useMemo(()=>lr(h),[h]),nt=y.useMemo(()=>({theme:{mode:h.metadata.variant==="dark"?"dark":"light",tokens:{background:h.colors.surface.background,elevated:h.colors.surface.elevated,foreground:h.colors.surface.foreground,muted:h.colors.surface.mutedForeground,subtle:h.colors.surface.subtle,border:h.colors.interactive.border,hover:h.colors.interactive.hover,selection:h.colors.interactive.selection,focus:h.colors.interactive.focusRing,primary:h.colors.primary.base,mutedSurface:h.colors.surface.muted,elevatedForeground:h.colors.surface.elevatedForeground,active:h.colors.interactive.active,selectionForeground:fe.selectionForeground,primaryForeground:h.colors.primary.foreground??"#ffffff",primaryText:fe.tinted.primary,successText:fe.tinted.success,warningText:fe.tinted.warning,errorText:fe.tinted.error,infoText:fe.tinted.info,success:h.colors.status.success,warning:h.colors.status.warning,error:h.colors.status.error,info:h.colors.status.info,font:wt("--font-sans",Pa),mono:wt("--font-mono",Ma),radius:wt("--radius",ja)}},locale:j,directory:S||null,session:Ot,surface:o&&u?.backgroundEntry?"background":t,connection:P?.connection??Qt,settings:P?.settings??{},item:pe}),[h,fe,S,u?.backgroundEntry,o,pe,j,P,Ot,t]),Ae=`${l}:${u?.version??""}:${E}:service-${u?.service?.granted?"1":"0"}:${u?.entry??""}:${u?.backgroundEntry??""}`,qn=u?o?u.backgroundEntry??u.entry??null:t==="page"?u.pageEntry??null:t==="dialog"&&u.attachEntry?u.attachEntry:u.entry??null:null,{src:Ne,srcDoc:Ue,status:st,recoverExpiredNavigation:zn,acknowledgeHandshake:Ct}=la({guestId:l,entry:qn,instanceKey:Ae,enabled:E}),Ee=y.useRef(nt);Ee.current=nt;const re=y.useRef(S);re.current=S;const rt=y.useRef(i);rt.current=i;const Pt=y.useRef(me);Pt.current=me;const H=y.useRef(l);H.current=l;const oe=y.useRef(E);oe.current=E;const Q=y.useRef(u);Q.current=u;const Mt=y.useRef(u?.integration?.auth);Mt.current=u?.integration?.auth;const De=y.useRef(_);De.current=_;const ot=y.useRef(b);ot.current=b;const at=y.useRef(d);at.current=d;const jt=y.useRef(x);jt.current=x;const Le=y.useRef(null),Te=y.useRef(new Map),Gt=y.useRef(0),ye=y.useCallback(()=>{Le.current!=null&&(window.clearInterval(Le.current),Le.current=null)},[]),B=y.useCallback(w=>{m.current?.contentWindow?.postMessage(w,cn)},[]),it=y.useCallback(()=>{const w=a?.takeMessage();w&&B(w)},[a,B]),ct=y.useRef(!1),lt=y.useRef(null),ut=y.useCallback(()=>{if(ct.current||t!=="panel"||!o&&Q.current?.backgroundEntry)return;ct.current=!0;const w=Q.current,Y=F();lt.current=ur(H.current,he=>{const ee=He.getState().guests.find(ae=>ae.id===w?.id);return F()!==Y||!ee||!ft(ee)||ee.version!==w?.version||ee.entry!==w?.entry||ee.backgroundEntry!==w?.backgroundEntry?Promise.resolve({ok:!1,reason:"unavailable"}):new Promise(ae=>{Gt.current+=1;const te=`resolve-${Gt.current}`,pt=window.setTimeout(()=>{Te.current.delete(te),ae({ok:!1,reason:"timeout"})},pr);Te.current.set(te,ke=>{window.clearTimeout(pt),Te.current.delete(te),ae(ke)}),m.current?.contentWindow?.postMessage(Fo(te,he.command,he.args),cn)})})},[o,t]);y.useEffect(()=>()=>{lt.current?.(),lt.current=null,ct.current=!1;for(const w of Te.current.values())w({ok:!1,reason:"unavailable"});Te.current.clear()},[Ae,Ne,Ue]);const Ie=y.useCallback(()=>{B(No(Ee.current)),B(Uo(re.current||null)),B(Do(Ee.current.session)),B(Lo(Ee.current.connection)),B(Ho(Ee.current.settings)),B(Bo(Ee.current.item))},[B]);y.useEffect(()=>{u?.integration&&D(u.id)},[u?.id,u?.integration,D]),y.useEffect(()=>{u&&!E&&d?.()},[u,E,d]),y.useEffect(()=>{const w=new Map;let Y=!1;const he=F(),ee=H.current,ae=()=>He.getState().guests.find(we=>we.id===ee)??null,te=()=>{for(const we of w.values())we();w.clear()},pt=tt(()=>{Y=!0,te(),ye()}),ke=()=>{if(!ie(ae(),"sessions"))throw new K("NOT_GRANTED",_e)},Nt=we=>{const mt=m.current;if(!mt||we.source!==mt.contentWindow)return;const Ut=Mo.safeParse(we.data);if(!Ut.success||Y||F()!==he||a&&!a.isActive())return;const Se=Ga(Ut.data,H.current),Dt=ae();if(!Dt||!ft(Dt)){te(),"id"in Se&&B({channel:V,v:W,type:"result",id:Se.id,ok:!1,error:"Extension is unavailable.",code:"DISABLED"});return}if(Se.type==="hello"){Ct(),te(),Ie(),ut(),it();return}if(Se.type==="action-result"){Se.id===a?.id&&a.complete(Se.payload);return}Jo(Se,{workspaceRead:p=>(ke(),_t(p,H.current)),workspaceSubscribe:({subscriptionId:p,query:O})=>{if(ke(),w.get(p)?.(),w.delete(p),w.size>=32)throw new K("HOST_REJECTED","At most 32 workspace subscriptions per frame.");w.set(p,ha(O,H.current,L=>{!Y&&ie(Q.current,"sessions")&&B({channel:V,v:W,type:"workspace",payload:{subscriptionId:p,snapshot:L}})}))},workspaceUnsubscribe:p=>{w.get(p)?.(),w.delete(p)},storage:p=>Ia(H.current,p),openSession:p=>{ke(),Sa(p)},toast:p=>{oe.current&&Ca(p)},openUrl:en,openSurface:p=>{const O=re.current||"";O&&et.getState().openContextSurface(O,p)},writeClipboard:async p=>(await xn(p)).ok,compose:(p,O)=>{yt.getState().setPendingInputText(p,O)},attach:p=>{if(ot.current){ot.current(p);return}yt.getState().setPendingGuestIssue(p)},startSession:async p=>{if(!ie(Q.current,"sessions")||p.text&&!ie(Q.current,"prompt"))return{ok:!1,code:"NOT_GRANTED",message:_e};const O=await Aa({request:p,directory:re.current||null,t:De.current,assertAuthorized:()=>{if(ke(),p.text&&!ie(ae(),"prompt"))throw new K("NOT_GRANTED",_e)}});return O?.sessionId&&p.navigation==="open"&&(jt.current?.(),at.current?.()),O},prompt:p=>p.send&&!ie(Q.current,"prompt")?Promise.resolve({ok:!1,code:"NOT_GRANTED",message:_e}):Ra({request:p,sessionId:rt.current,directory:re.current||null,busy:Pt.current,compose:(O,L)=>{yt.getState().setPendingInputText(O,L)},t:De.current}),sessionLink:p=>va({request:p,sessionId:rt.current,directory:re.current||null,t:De.current}),close:()=>{at.current?.()},oauthStart:async()=>{if(!oe.current)return!1;const p=H.current,O=Be.getState().byId[p]?.connection??Qt,L=await Mr(p);if(!L||Y||F()!==he)return!1;en(L),ye();const Jn=Date.now()+Gr;return Le.current=window.setInterval(()=>{(async()=>{if(Date.now()>Jn){ye();return}const Lt=await D(p);Lt&&Ur(O,Lt.connection)&&ye()})()},Nr),!0},oauthDisconnect:async()=>{const p=await jr(ee);return!p||Y||F()!==he?!1:(A(ee,p),!0)},request:async p=>{if(!oe.current)return{ok:!1,code:"DISABLED",message:"This extension is disabled in Settings → Extensions."};const O=await pa(Mt.current,p);if(O!==void 0)return O?{ok:!0,result:O}:{ok:!1,code:"HOST_REJECTED",message:"Request failed."};const L=await Dr(H.current,p);return L.ok||D(H.current),L},serviceRequest:p=>oe.current?$r(H.current,p):Promise.resolve({ok:!1,code:"DISABLED",message:"This extension is disabled in Settings → Extensions."}),serviceStatus:()=>Xr(H.current),file:p=>{if(!oe.current)return Promise.resolve({ok:!1,code:"DISABLED",message:"This extension is disabled in Settings → Extensions."});const O=mr(p.path);if(!ie(Q.current,O==="project"?"files":"filesystem"))return Promise.resolve({ok:!1,code:"NOT_GRANTED",message:_e});const L=re.current||null;return O==="project"&&!L?Promise.resolve({ok:!1,code:"NO_DIRECTORY",message:"No project is open."}):Zo(H.current,p,L)},generate:p=>oe.current?ie(Q.current,"model")?na(H.current,p,re.current||null):Promise.resolve({ok:!1,code:"NOT_GRANTED",message:_e}):Promise.resolve({ok:!1,code:"DISABLED",message:"This extension is disabled in Settings → Extensions."}),setBadge:p=>{oe.current&&Zt.getState().setBadge(H.current,p)},resolveResult:(p,O)=>{const L=Te.current.get(p);if(L){if("error"in O){L({ok:!1,reason:"error",message:O.error});return}L({ok:!0,item:O.item})}}}).then(p=>{p&&!Y&&mt===m.current&&F()===he&&(!a||a.isActive())&&B(p)})};return window.addEventListener("message",Nt),()=>{Y=!0,te(),pt(),window.removeEventListener("message",Nt)}},[Ct,a,Ae,E,B,Ie,D,ut,it,A,Ne,Ue,ye]),y.useEffect(()=>{a&&(st==="error"||!E)&&a.complete({ok:!1,reason:"unavailable"})},[a,st,E]);const dt=y.useRef(!1);return y.useEffect(()=>(dt.current=!0,()=>{dt.current=!1,queueMicrotask(()=>{dt.current||a?.complete({ok:!1,reason:"unavailable"})})}),[a]),y.useEffect(()=>()=>ye(),[Ae,ye]),y.useEffect(()=>{Ie()},[Ie,nt,S]),y.useEffect(()=>{o||k!=="ready"||u?.entry||(vn(e),d?.())},[k,u?.entry,o,e,d]),y.useEffect(()=>{!i||!Re||B($o({sessionId:i,phase:Re}))},[i,Re,B]),!u&&k!=="ready"&&k!=="error"?null:!u||!Ne&&!Ue?ce.jsx("div",{className:"flex h-full items-center justify-center px-6 text-sm text-muted-foreground",children:_(u&&st==="loading"?"common.loading":"contextPanel.plugin.loadFailed")}):E?ce.jsx("iframe",{ref:m,title:u.name,src:Ne||void 0,srcDoc:Ue,sandbox:"allow-scripts",className:dr("h-full w-full min-h-0 min-w-0 border-0 overflow-hidden",t==="dialog"?"bg-transparent":"bg-[var(--surface-background)]"),onLoad:()=>{zn()||(Ie(),ut(),it())}},Ae):null},Wa=Object.freeze(Object.defineProperty({__proto__:null,PluginPane:Na},Symbol.toStringTag,{value:"Module"}));export{Gr as A,Na as P,Ea as a,Mr as b,Ur as c,jr as d,Nr as e,Xa as f,ga as g,$a as h,Ja as i,za as j,Ka as k,Wa as l,qa as s,Be as u};