@openchambery/web 1.17.1-beta.7 → 1.17.1-beta.9

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 (140) hide show
  1. package/README.md +3 -39
  2. package/bin/cli-output.js +0 -16
  3. package/bin/cli.js +3 -66
  4. package/bin/cli.test.js +4 -81
  5. package/bin/lib/DOCUMENTATION.md +5 -19
  6. package/bin/lib/cli-args.js +3 -327
  7. package/bin/lib/cli-http.js +0 -16
  8. package/bin/lib/cli-lifecycle.js +2 -111
  9. package/bin/lib/cli-paths.js +0 -57
  10. package/dist/assets/{AgentAvatar-htFrIvQx.js → AgentAvatar-C6Hxu5_o.js} +1 -1
  11. package/dist/assets/{AssistantView-BZiJsNuI.js → AssistantView-BKg8KK5a.js} +1 -1
  12. package/dist/assets/{ChatContainer-CdmcMnL3.js → ChatContainer-CuxynsBz.js} +5 -5
  13. package/dist/assets/{DiagramView-B7sq74V-.js → DiagramView-CjMblW4W.js} +1 -1
  14. package/dist/assets/{FadeInOnReveal-8fY7XL23.js → FadeInOnReveal-CvNA_aGD.js} +1 -1
  15. package/dist/assets/{Icon-B7eLbnyj.js → Icon-BPJ_quEe.js} +1 -1
  16. package/dist/assets/{MarkdownRendererImpl-DICju9ve.js → MarkdownRendererImpl--oy9PEaq.js} +1 -1
  17. package/dist/assets/{MobileDetailNavigation-CuxWU1yf.js → MobileDetailNavigation-j5XTy0wI.js} +1 -1
  18. package/dist/assets/{MobileShareBridge-CPg9Eyro.js → MobileShareBridge-BnF86wui.js} +1 -1
  19. package/dist/assets/{MobileSurface-D7sDH_tx.js → MobileSurface-D0LTFt1w.js} +1 -1
  20. package/dist/assets/{MultiRunWindow-MSO0Equt.js → MultiRunWindow-BTTFYUzI.js} +1 -1
  21. package/dist/assets/{OnboardingScreen-C87u_MLg.js → OnboardingScreen-CdvaEBtt.js} +1 -1
  22. package/dist/assets/{OverlayScrollbar-Kmmybw-z.js → OverlayScrollbar-DyP73J3X.js} +1 -1
  23. package/dist/assets/SettingsView-JQxnmG9X.js +25 -0
  24. package/dist/assets/{SettingsWindow-Bl25cfXX.js → SettingsWindow-Ddr1B6Hc.js} +1 -1
  25. package/dist/assets/{TerminalView-jR5jP1b0.js → TerminalView-bHOuUIxH.js} +1 -1
  26. package/dist/assets/{ToolOutputDialog-DCEZb2DZ.js → ToolOutputDialog-CbGv7HQ5.js} +1 -1
  27. package/dist/assets/{appThemeRegistry-aiRF-s3c.js → appThemeRegistry-DIDGDdQq.js} +2 -2
  28. package/dist/assets/{button-bYWkDtDI.js → button-BmNJBT13.js} +1 -1
  29. package/dist/assets/{clipboard-CzpzN4Um.js → clipboard-CXWbHCAk.js} +1 -1
  30. package/dist/assets/{collapsible-A1PFvMRp.js → collapsible-68IqWBM1.js} +1 -1
  31. package/dist/assets/{context-menu-CkpHn-Bm.js → context-menu-B-8pAqjS.js} +1 -1
  32. package/dist/assets/desktopHosts-BpjUSDz4.js +1 -0
  33. package/dist/assets/{desktopRelayRestore-C5vYnSTd.js → desktopRelayRestore-BzUEk1i7.js} +1 -1
  34. package/dist/assets/{diagram-BkwKWaTO.js → diagram-YN0GZ1Q0.js} +1 -1
  35. package/dist/assets/{dialog-DW7-_iqo.js → dialog-BV1ENlLf.js} +1 -1
  36. package/dist/assets/es-EXZUX1sB.js +15 -0
  37. package/dist/assets/{fileQueries-P9SX4YwC.js → fileQueries-i4oziMnC.js} +1 -1
  38. package/dist/assets/fr-jWNPO91J.js +13 -0
  39. package/dist/assets/{gitApi-CMsZ2v08.js → gitApi-BuTpcy5P.js} +1 -1
  40. package/dist/assets/{gitApiHttp-DvIIcDAO.js → gitApiHttp-C1DaEMKR.js} +1 -1
  41. package/dist/assets/{input-B9aNttqV.js → input-BLVhPvhN.js} +1 -1
  42. package/dist/assets/{insertionBoundaries-Di3rCXgN.js → insertionBoundaries-D8FUCksc.js} +1 -1
  43. package/dist/assets/ja-Dcb0VtDE.js +15 -0
  44. package/dist/assets/ko-CX71xNDX.js +15 -0
  45. package/dist/assets/{main-DY27kMV5.js → main-Bz2igSmw.js} +2 -2
  46. package/dist/assets/{main-Chtf300b.js → main-C3JiVxSp.js} +5 -5
  47. package/dist/assets/{markdown-worker-BoB1_DPo.js → markdown-worker-Cq3Twp1A.js} +1 -1
  48. package/dist/assets/{markdownTheme-om5XcPqq.js → markdownTheme-CCnvI6L0.js} +1 -1
  49. package/dist/assets/{miniChat-BWbpl5SN.js → miniChat-6EMGKhlG.js} +2 -2
  50. package/dist/assets/mobile-DP5GfqmN.js +2 -0
  51. package/dist/assets/{multirun-BfPcVktg.js → multirun-9f6WZ3Jd.js} +1 -1
  52. package/dist/assets/persistence-C_KCiMcY.js +3 -0
  53. package/dist/assets/{pl-BSjLn4dm.js → pl-mR_3Sqr8.js} +2 -2
  54. package/dist/assets/{projectMeta-CiAR7MRG.js → projectMeta-Dsa2wr8n.js} +1 -1
  55. package/dist/assets/pt-BR-D1RpVOvC.js +15 -0
  56. package/dist/assets/radio-CrWrJ2b-.js +1 -0
  57. package/dist/assets/{renderElectronMiniChatApp-CiEXAVSt.js → renderElectronMiniChatApp-4adD-9dD.js} +2 -2
  58. package/dist/assets/{renderMobileApp-BHvgSVPk.js → renderMobileApp-bSjLTDsy.js} +3 -3
  59. package/dist/assets/{runtimeConfig-49YbZaqI.js → runtimeConfig-JSaYFA5x.js} +1 -1
  60. package/dist/assets/{runtimeEndpointReset-CdhtjuPe.js → runtimeEndpointReset-DW-MKG59.js} +1 -1
  61. package/dist/assets/{sortable-tabs-strip-XeYica3j.js → sortable-tabs-strip-NTPx-T_l.js} +1 -1
  62. package/dist/assets/src-B8mzksNL.css +2 -0
  63. package/dist/assets/store-oojlrF4d.js +15 -0
  64. package/dist/assets/{terminalApi-DAu7xKli.js → terminalApi-BYTA045F.js} +1 -1
  65. package/dist/assets/{tooltip-BSlxaNrR.js → tooltip-BYGBBTc2.js} +1 -1
  66. package/dist/assets/uk-UvnVqWv-.js +15 -0
  67. package/dist/assets/{url-DjkTDrad.js → url-CGHw6D-E.js} +1 -1
  68. package/dist/assets/useAppFontEffects-BIO3lPVM.js +7 -0
  69. package/dist/assets/{useDesktopWindowControlsLayout-BwYnhrEy.js → useDesktopWindowControlsLayout-Df2h_cM_.js} +1 -1
  70. package/dist/assets/{useEffectiveDirectory-CEmsrrEs.js → useEffectiveDirectory-D0vaM832.js} +1 -1
  71. package/dist/assets/{useFontPreferences-BxMT_kty.js → useFontPreferences-Bu4ME5hk.js} +1 -1
  72. package/dist/assets/useMobileNavigationStore-7HNp5YHY.js +475 -0
  73. package/dist/assets/useSessionAutoCleanup-BPNLtDRJ.js +1 -0
  74. package/dist/assets/{useWorkerHighlightedLines-CFW2AoPL.js → useWorkerHighlightedLines-DYfBlGb-.js} +1 -1
  75. package/dist/assets/{utils-RUACCsOs.js → utils-DyUyiLje.js} +1 -1
  76. package/dist/assets/zh-CN-9v-RC966.js +15 -0
  77. package/dist/assets/zh-TW-BZ_wZdC-.js +15 -0
  78. package/dist/index.html +8 -8
  79. package/dist/mini-chat.html +8 -8
  80. package/dist/mobile.html +8 -8
  81. package/package.json +1 -1
  82. package/server/index.d.ts +0 -6
  83. package/server/index.js +5 -153
  84. package/server/lib/opencode/DOCUMENTATION.md +6 -10
  85. package/server/lib/opencode/cli-entry-runtime.js +0 -10
  86. package/server/lib/opencode/cli-options.js +0 -65
  87. package/server/lib/opencode/core-routes.js +2 -4
  88. package/server/lib/opencode/routes.test.js +0 -1
  89. package/server/lib/opencode/server-startup-runtime.js +0 -55
  90. package/server/lib/opencode/settings-helpers.js +0 -55
  91. package/server/lib/opencode/settings-helpers.test.js +0 -20
  92. package/server/lib/opencode/settings-normalization-runtime.js +0 -87
  93. package/server/lib/opencode/settings-normalization-runtime.test.js +0 -3
  94. package/server/lib/opencode/settings-runtime.js +9 -102
  95. package/server/lib/opencode/settings-runtime.test.js +0 -10
  96. package/server/lib/opencode/shutdown-runtime.js +1 -9
  97. package/server/lib/opencode/shutdown-runtime.test.js +0 -2
  98. package/server/lib/opencode/startup-pipeline-runtime.js +0 -20
  99. package/server/lib/opencode/startup-pipeline-runtime.test.js +2 -3
  100. package/server/lib/opencode/tunnel-wiring-runtime.js +2 -80
  101. package/server/lib/relay/DOCUMENTATION.md +1 -1
  102. package/bin/lib/cli-tunnel-capabilities.js +0 -9
  103. package/bin/lib/cli-tunnel-profiles.js +0 -366
  104. package/bin/lib/cli-tunnel-utils.js +0 -300
  105. package/bin/lib/commands-tunnel.js +0 -1761
  106. package/dist/assets/SettingsView-5YNu54KI.js +0 -25
  107. package/dist/assets/desktopHosts-D5m_ggY1.js +0 -1
  108. package/dist/assets/es-Cei_75Jt.js +0 -15
  109. package/dist/assets/fr-Dn7WSHh2.js +0 -13
  110. package/dist/assets/ja-DFARVqVj.js +0 -15
  111. package/dist/assets/ko-pyLnIyDY.js +0 -15
  112. package/dist/assets/mobile-DEQeGskq.js +0 -2
  113. package/dist/assets/persistence-CHA81Od7.js +0 -3
  114. package/dist/assets/pt-BR-DaWvr_0A.js +0 -15
  115. package/dist/assets/radio-BnF4XhCC.js +0 -1
  116. package/dist/assets/src-BtkWqMFu.css +0 -2
  117. package/dist/assets/store-DIpqFVjs.js +0 -15
  118. package/dist/assets/uk-CHCRqRKf.js +0 -15
  119. package/dist/assets/useAppFontEffects-BRNICZS2.js +0 -7
  120. package/dist/assets/useMobileNavigationStore-DryW-QdG.js +0 -475
  121. package/dist/assets/useSessionAutoCleanup-DMJ1LiW_.js +0 -1
  122. package/dist/assets/zh-CN-BWEQZKXk.js +0 -15
  123. package/dist/assets/zh-TW-BbO-gJq3.js +0 -15
  124. package/server/lib/cloudflare-tunnel.js +0 -618
  125. package/server/lib/ngrok-tunnel.js +0 -343
  126. package/server/lib/ngrok-tunnel.test.js +0 -50
  127. package/server/lib/tunnels/DOCUMENTATION.md +0 -21
  128. package/server/lib/tunnels/executable-search.js +0 -140
  129. package/server/lib/tunnels/executable-search.test.js +0 -96
  130. package/server/lib/tunnels/index.js +0 -179
  131. package/server/lib/tunnels/index.test.js +0 -93
  132. package/server/lib/tunnels/install-help.js +0 -56
  133. package/server/lib/tunnels/install-help.test.js +0 -31
  134. package/server/lib/tunnels/managed-config.js +0 -201
  135. package/server/lib/tunnels/providers/cloudflare.js +0 -266
  136. package/server/lib/tunnels/providers/ngrok.js +0 -123
  137. package/server/lib/tunnels/registry.js +0 -51
  138. package/server/lib/tunnels/routes.js +0 -610
  139. package/server/lib/tunnels/types.js +0 -245
  140. package/server/lib/tunnels/types.test.js +0 -34
@@ -1 +0,0 @@
1
- import{o as e}from"./rolldown-runtime-C0FnF6B9.js";import{T as t,j as n,q as r,t as i}from"./useUIStore-D6BTB4va.js";import{Kt as a,Zt as o,kn as s,qt as c,u as l}from"./persistence-CHA81Od7.js";import{c as u,d,f,t as p,u as m}from"./desktopHosts-D5m_ggY1.js";import{n as h}from"./desktopRelayRestore-C5vYnSTd.js";import{nt as g,rt as _}from"./vendor-base-ui-CnHfUmDN.js";import{kt as v}from"./gitApiHttp-DvIIcDAO.js";import{n as y}from"./vendor-react-DLPElpoQ.js";import{n as b}from"./vendor-tanstack-query-core-BWz0ose6.js";import{i as ee,r as te}from"./vendor-tanstack-react-query-D7pys_c9.js";import{n as ne,t as re}from"./clipboard-CzpzN4Um.js";import{i as x,t as S}from"./store-DIpqFVjs.js";import{$n as ie,Sr as C,Wi as w,l as T,pr as E,yr as ae}from"./useMobileNavigationStore-DryW-QdG.js";import{t as D}from"./utils-RUACCsOs.js";import{n as O}from"./Icon-B7eLbnyj.js";import{t as k}from"./button-bYWkDtDI.js";import{i as oe,n as se,r as ce,t as le}from"./vendor-simplewebauthn-browser-Dwhcdg_5.js";import{n as ue,r as de}from"./radio-BnF4XhCC.js";var A=y(),fe=e=>e===`unreachable`||e===`wrong-service`||e===`incompatible`,j=e=>e.id===`local`?`local`:`host:${e.id}`,pe=e=>t()===j(e),me=async(e,t)=>{if(!o())return{ok:!1,status:{status:`unreachable`,latencyMs:0},reason:`unsupported`};let i=m(u(e))||``;if(!i&&!e.relay)return{ok:!1,status:{status:`unreachable`,latencyMs:0},reason:`unreachable`};let a=(t,i)=>{i&&r({relayUrl:t.relayUrl,serverId:t.serverId,hostEncPubJwk:t.hostEncPubJwk},i),n({apiBaseUrl:typeof window<`u`?window.location.origin:``,clientToken:e.clientToken||null,runtimeKey:j(e),relay:t}),h(e.id)},s=t=>{n({apiBaseUrl:t,clientToken:e.clientToken||null,requestHeaders:e.requestHeaders||null,runtimeKey:j(e)})},c=t?.cachedProbe;if(c?.status===`ok`){if(c.via===`relay`&&e.relay)return a(e.relay),{ok:!0,via:`relay`,status:c};if(i&&c.via!==`relay`)return s(i),{ok:!0,via:`direct`,status:c};if(e.relay)return a(e.relay),{ok:!0,via:`relay`,status:{...c,via:`relay`}}}let l={status:`unreachable`,latencyMs:0},f=null,g;if(i){let t=await p(i,{clientToken:e.clientToken||null,requestHeaders:e.requestHeaders||null}).catch(()=>({status:`unreachable`,latencyMs:0}));l={status:t.status,latencyMs:t.latencyMs},fe(t.status)||(f=`direct`)}if(!f&&e.relay){let t=await d(e.relay,{keepTunnel:!0}).catch(()=>({status:`unreachable`,latencyMs:0}));t.status===`ok`?(l={status:t.status,latencyMs:t.latencyMs,via:`relay`},f=`relay`,g=`tunnel`in t?t.tunnel:void 0):i||(l={status:t.status,latencyMs:t.latencyMs})}return f?f===`relay`&&e.relay?(a(e.relay,g),{ok:!0,via:`relay`,status:l}):(s(i),{ok:!0,via:`direct`,status:l}):{ok:!1,status:l,reason:`unreachable`}},M=[`desktopHostSwitch`],N=class extends Error{result;host;constructor(e,t){super(e.reason),this.name=`DesktopHostSwitchError`,this.result=e,this.host=t}},he=(e,t)=>S(x.getState().dictionary,e,t),ge=async e=>{let{host:t}=e;if(t.id===`local`){let r=(e.localApiOrigin||``).trim();if(!r)throw new N({ok:!1,status:{status:`unreachable`,latencyMs:0},reason:`unreachable`},t);return n({apiBaseUrl:r,clientToken:e.localClientToken||null,runtimeKey:j(t)}),{ok:!0,via:`direct`,status:{status:`ok`,latencyMs:0}}}let r=await me(t,{cachedProbe:e.cachedProbe});if(!r.ok)throw new N(r,t);return r},P=null,_e=()=>P||(P=new b(l,{mutationKey:M,mutationFn:ge,onError:(e,t)=>{e instanceof N&&e.result.reason!==`unsupported`&&ie.error(he(`desktopHostSwitcher.toast.instanceUnreachable`,{host:f(t.host.label)}))}}),P.subscribe(()=>void 0),P),ve=async e=>{if(pe(e.host))return{ok:!0,via:`direct`,status:e.cachedProbe?.status===`ok`?e.cachedProbe:{status:`ok`,latencyMs:0}};if(l.isMutating({mutationKey:M})>0)return{ok:!1,status:{status:`unreachable`,latencyMs:0},reason:`unsupported`};try{return await _e().mutate(e)}catch(e){if(e instanceof N)return e.result;throw e}},ye=()=>{let e=(0,A.c)(1),t;return e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t={mutationKey:M},e[0]=t):t=e[0],te(t)>0},be=()=>{let e=(0,A.c)(1),t;return e[0]===Symbol.for(`react.memo_cache_sentinel`)?(t={filters:{mutationKey:M,status:`pending`},select:xe},e[0]=t):t=e[0],ee(t)[0]?.host.id??null};function xe(e){return e.state.variables}var F=e=>typeof e==`object`&&!!e,I=(e,t)=>{let n=e[t];return typeof n==`string`?n:null},L=(e,t)=>{let n=e[t];return typeof n==`number`&&Number.isFinite(n)?n:null},R=(e,t)=>{let n=e[t];return typeof n==`boolean`?n:null},Se=e=>Array.isArray(e)?e.filter(e=>typeof e==`string`):[],z=()=>a()?(e,t)=>c(e,t):null,Ce=e=>{if(!F(e))return;let t=R(e,`enabled`)??!1,n=I(e,`store`)?.toLowerCase()===`settings`?`settings`:`never`,r=I(e,`value`);return{enabled:t,store:n,...r?{value:r}:{}}},we=e=>e===`remote`||e===`dynamic`?e:`local`,Te=e=>{if(!F(e))return null;let t=I(e,`id`);if(!t)return null;let n=R(e,`enabled`)??!0,r=we(I(e,`type`)),i=I(e,`localHost`)||I(e,`local_host`)||void 0,a=L(e,`localPort`)??L(e,`local_port`)??void 0,o=I(e,`remoteHost`)||I(e,`remote_host`)||void 0,s=L(e,`remotePort`)??L(e,`remote_port`)??void 0;return{id:t,enabled:n,type:r,...i?{localHost:i}:{},...typeof a==`number`?{localPort:a}:{},...o?{remoteHost:o}:{},...typeof s==`number`?{remotePort:s}:{}}},Ee=e=>{if(!F(e))return null;let t=I(e,`id`),n=I(e,`sshCommand`)||I(e,`ssh_command`);if(!t||!n)return null;let r=I(e,`nickname`),i=e.sshParsed,a=F(i)?{destination:I(i,`destination`)||``,args:Se(i.args)}:void 0,o=F(e.remoteOpenchamber)?e.remoteOpenchamber:F(e.remote_openchamber)?e.remote_openchamber:{},s=F(e.localForward)?e.localForward:F(e.local_forward)?e.local_forward:{},c=F(e.auth)?e.auth:{},l=I(o,`mode`)?.toLowerCase()===`external`?`external`:`managed`,u=I(o,`installMethod`)||I(o,`install_method`),d=u===`npm`||u===`download_release`||u===`upload_bundle`?u:`bun`,f=I(s,`bindHost`)||I(s,`bind_host`)||`127.0.0.1`,p=f===`localhost`||f===`0.0.0.0`?f:`127.0.0.1`,m=(Array.isArray(e.portForwards)?e.portForwards:Array.isArray(e.port_forwards)?e.port_forwards:[]).map(e=>Te(e)).filter(e=>!!e),h=L(o,`preferredPort`)??L(o,`preferred_port`),g=L(s,`preferredLocalPort`)??L(s,`preferred_local_port`),_=Ce(c.sshPassword||c.ssh_password),v=Ce(c.openchamberPassword||c.openchamber_password);return{id:t,...r?{nickname:r}:{},sshCommand:n,...a&&a.destination?{sshParsed:a}:{},connectionTimeoutSec:L(e,`connectionTimeoutSec`)??L(e,`connection_timeout_sec`)??60,remoteOpenchamber:{mode:l,keepRunning:R(o,`keepRunning`)??R(o,`keep_running`)??!0,...h?{preferredPort:h}:{},installMethod:d,uploadBundleOverSsh:R(o,`uploadBundleOverSsh`)??R(o,`upload_bundle_over_ssh`)??!1},localForward:{...g?{preferredLocalPort:g}:{},bindHost:p},auth:{..._?{sshPassword:_}:{},...v?{openchamberPassword:v}:{}},portForwards:m}},De=e=>{switch(e){case`config_resolved`:case`auth_check`:case`master_connecting`:case`remote_probe`:case`installing`:case`updating`:case`server_detecting`:case`server_starting`:case`forwarding`:case`ready`:case`degraded`:case`error`:return e;default:return`idle`}},B=e=>{if(!F(e))return null;let t=I(e,`id`);return t?{id:t,phase:De(I(e,`phase`)),...I(e,`detail`)?{detail:I(e,`detail`)||void 0}:{},...I(e,`localUrl`)||I(e,`local_url`)?{localUrl:I(e,`localUrl`)||I(e,`local_url`)||void 0}:{},...typeof(L(e,`localPort`)??L(e,`local_port`))==`number`?{localPort:L(e,`localPort`)??L(e,`local_port`)??void 0}:{},...typeof(L(e,`remotePort`)??L(e,`remote_port`))==`number`?{remotePort:L(e,`remotePort`)??L(e,`remote_port`)??void 0}:{},startedByUs:R(e,`startedByUs`)??R(e,`started_by_us`)??!1,retryAttempt:L(e,`retryAttempt`)??L(e,`retry_attempt`)??0,requiresUserAction:R(e,`requiresUserAction`)??R(e,`requires_user_action`)??!1,updatedAtMs:L(e,`updatedAtMs`)??L(e,`updated_at_ms`)??Date.now()}:null},Oe=e=>{if(!F(e))return null;let t=I(e,`host`),n=I(e,`source`),r=I(e,`sshCommand`)||I(e,`ssh_command`);return!t||!n||!r?null:{host:t,source:n,sshCommand:r,pattern:R(e,`pattern`)??!1}},ke=(e,t)=>({id:e,sshCommand:t,connectionTimeoutSec:60,remoteOpenchamber:{mode:`managed`,keepRunning:!0,installMethod:`bun`,uploadBundleOverSsh:!1},localForward:{bindHost:`127.0.0.1`},auth:{},portForwards:[]}),Ae=async()=>{let e=z();if(!e)return{instances:[]};let t=await e(`desktop_ssh_instances_get`);return F(t)?{instances:(Array.isArray(t.instances)?t.instances:Array.isArray(t.desktopSshInstances)?t.desktopSshInstances:[]).map(e=>Ee(e)).filter(e=>!!e)}:{instances:[]}},je=async e=>{let t=z();t&&await t(`desktop_ssh_instances_set`,{config:{instances:e.instances}})},Me=async()=>{let e=z();if(!e)return[];let t=await e(`desktop_ssh_import_hosts`);return Array.isArray(t)?t.map(e=>Oe(e)).filter(e=>!!e):[]},Ne=async e=>{let t=z();t&&await t(`desktop_ssh_connect`,{id:e})},Pe=async e=>{let t=z();t&&await t(`desktop_ssh_disconnect`,{id:e})},Fe=async e=>{let t=z();if(!t)return[];let n=await t(`desktop_ssh_status`,{...e?{id:e}:{}});return Array.isArray(n)?n.map(e=>B(e)).filter(e=>!!e):[]},Ie=async(e,t)=>{let n=z();if(!n)return[];let r=await n(`desktop_ssh_logs`,{id:e,...typeof t==`number`?{limit:t}:{}});return Array.isArray(r)?r.filter(e=>typeof e==`string`):[]},Le=async e=>{let t=z();t&&await t(`desktop_ssh_logs_clear`,{id:e})},Re=async e=>{if(!a())return async()=>{};let t=window.__OPENCHAMBER_DESKTOP__?.listen;if(typeof t!=`function`)return async()=>{};let n=await t(`openchamber:ssh-instance-status`,t=>{let n=B(t?.payload);n&&e(n)});return async()=>{await n()}},ze=`/auth/passkey/authenticate/options`,Be=`/auth/passkey/authenticate/verify`,Ve=`/auth/passkey/register/options`,He=`/auth/passkey/register/verify`,V=`/api/passkeys`,Ue=`/auth/passkey/status`,We=`/api/auth/reset`,H={enabled:!1,hasPasskeys:!1,passkeyCount:0,rpID:null},U=async(e,t)=>s(e,{method:`POST`,credentials:`include`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:t===void 0?void 0:JSON.stringify(t)}),W=async(e,t)=>{try{let t=await e.json();if(t&&typeof t.error==`string`&&t.error.trim())return t.error}catch{}return t},Ge=e=>e instanceof oe&&e.code===`ERROR_CEREMONY_ABORTED`,Ke=()=>{ce.cancelCeremony()},G=()=>typeof window>`u`?{supported:!1,reason:`Passkeys are unavailable outside the browser.`}:window.isSecureContext?{supported:!0,reason:``}:{supported:!1,reason:`Passkeys require HTTPS or localhost.`},qe=async()=>{let e=G();if(!e.supported)throw Error(e.reason);let t=await U(Ve,{label:typeof navigator.userAgent==`string`&&navigator.userAgent.trim()?navigator.userAgent:`This device`});if(!t.ok)throw Error(await W(t,`Could not start passkey setup.`));let{requestId:n,optionsJSON:r}=await t.json(),i=await U(He,{requestId:n,response:await se({optionsJSON:r})});if(!i.ok)throw Error(await W(i,`Could not finish passkey setup.`));return i.json().catch(()=>null)},Je=async(e,t={})=>{let n=G();if(!n.supported)throw Error(n.reason);let r=await U(ze);if(!r.ok)throw Error(await W(r,`Passkey sign-in is not available right now.`));let{requestId:i,optionsJSON:a}=await r.json(),o=await U(Be,{requestId:i,response:await le({optionsJSON:a}),trustDevice:e,issueClientToken:t.issueClientToken===!0,clientLabel:t.clientLabel,clientKind:t.clientKind,dedupeKey:t.dedupeKey});if(!o.ok)throw Error(await W(o,`Passkey sign-in failed.`));return o.json().catch(()=>null)},Ye=async()=>{let e=await s(Ue,{method:`GET`,credentials:`include`,headers:{Accept:`application/json`}});if(!e.ok)return H;let t=await e.json().catch(()=>null);return{enabled:t?.enabled===!0,hasPasskeys:t?.hasPasskeys===!0,passkeyCount:typeof t?.passkeyCount==`number`?t.passkeyCount:0,rpID:typeof t?.rpID==`string`&&t.rpID?t.rpID:null}},Xe=async()=>{let e=await s(V,{method:`GET`,credentials:`include`,headers:{Accept:`application/json`}});if(!e.ok)throw Error(await W(e,`Could not load passkeys.`));let t=await e.json().catch(()=>null);return Array.isArray(t?.passkeys)?t.passkeys:[]},Ze=async e=>{let t=await s(`${V}/${encodeURIComponent(e)}`,{method:`DELETE`,credentials:`include`,headers:{Accept:`application/json`}});if(!t.ok)throw Error(await W(t,`Could not remove passkey.`));return t.json().catch(()=>null)},Qe=async()=>{let e=await U(We);if(!e.ok)throw Error(await W(e,`Could not clear saved authentication.`));return e.json().catch(()=>null)},K=e(_(),1),q=g();function J(e){let t=(0,A.c)(8),n,r;t[0]===e?(n=t[1],r=t[2]):({className:n,...r}=e,t[0]=e,t[1]=n,t[2]=r);let i;t[3]===n?i=t[4]:(i=D(`bg-card text-card-foreground flex flex-col gap-6 rounded-xl border py-6 shadow-none`,n),t[3]=n,t[4]=i);let a;return t[5]!==r||t[6]!==i?(a=(0,q.jsx)(`div`,{"data-slot":`card`,className:i,...r}),t[5]=r,t[6]=i,t[7]=a):a=t[7],a}function Y(e){let t=(0,A.c)(8),n,r;t[0]===e?(n=t[1],r=t[2]):({className:n,...r}=e,t[0]=e,t[1]=n,t[2]=r);let i;t[3]===n?i=t[4]:(i=D(`@container/card-header grid auto-rows-min grid-rows-[auto_auto] items-start gap-1.5 px-6 has-data-[slot=card-action]:grid-cols-[1fr_auto] [.border-b]:pb-6`,n),t[3]=n,t[4]=i);let a;return t[5]!==r||t[6]!==i?(a=(0,q.jsx)(`div`,{"data-slot":`card-header`,className:i,...r}),t[5]=r,t[6]=i,t[7]=a):a=t[7],a}function X(e){let t=(0,A.c)(8),n,r;t[0]===e?(n=t[1],r=t[2]):({className:n,...r}=e,t[0]=e,t[1]=n,t[2]=r);let i;t[3]===n?i=t[4]:(i=D(`leading-none font-semibold`,n),t[3]=n,t[4]=i);let a;return t[5]!==r||t[6]!==i?(a=(0,q.jsx)(`div`,{"data-slot":`card-title`,className:i,...r}),t[5]=r,t[6]=i,t[7]=a):a=t[7],a}function Z(e){let t=(0,A.c)(8),n,r;t[0]===e?(n=t[1],r=t[2]):({className:n,...r}=e,t[0]=e,t[1]=n,t[2]=r);let i;t[3]===n?i=t[4]:(i=D(`px-6`,n),t[3]=n,t[4]=i);let a;return t[5]!==r||t[6]!==i?(a=(0,q.jsx)(`div`,{"data-slot":`card-content`,className:i,...r}),t[5]=r,t[6]=i,t[7]=a):a=t[7],a}var $e=class extends K.Component{constructor(e){super(e),this.state={hasError:!1}}static getDerivedStateFromError(e){return{hasError:!0,error:e}}componentDidCatch(e,t){this.setState({error:e,errorInfo:t,copied:!1}),console.error(`Error caught by boundary:`,e,t)}handleReset=()=>{this.setState({hasError:!1,error:void 0,errorInfo:void 0})};handleCopy=async()=>{let{strings:e}=this.props,t=`${this.state.error?String(this.state.error):e.unknownError}${this.state.error?.stack?`\n\nStack:\n${this.state.error.stack}`:``}${this.state.errorInfo?.componentStack?`\n\n${e.componentStackLabel}${this.state.errorInfo.componentStack}`:``}`;(await re(t)).ok&&(this.setState({copied:!0}),window.setTimeout(()=>{this.setState(e=>e.copied?{copied:!1}:null)},1500))};render(){let{strings:e}=this.props;return this.state.hasError?this.props.fallback?this.props.fallback:(0,q.jsx)(`div`,{className:`p-4 flex items-center justify-center min-h-screen`,children:(0,q.jsxs)(J,{className:`w-full max-w-md`,children:[(0,q.jsx)(Y,{className:`text-center`,children:(0,q.jsxs)(X,{className:`flex items-center justify-center gap-2 text-destructive`,children:[(0,q.jsx)(O,{name:`error-warning`,className:`h-5 w-5`}),e.title]})}),(0,q.jsxs)(Z,{className:`space-y-4`,children:[(0,q.jsx)(`p`,{className:`text-sm text-muted-foreground text-center`,children:e.description}),this.state.error&&(0,q.jsxs)(`details`,{className:`text-xs font-mono bg-muted p-3 rounded`,children:[(0,q.jsx)(`summary`,{className:`cursor-pointer hover:bg-interactive-hover/80`,children:e.detailsSummary}),(0,q.jsxs)(`pre`,{className:`mt-2 max-h-48 overflow-auto`,children:[this.state.error.toString(),this.state.errorInfo?.componentStack?`\n\n${e.componentStackLabel}${this.state.errorInfo.componentStack}`:``]})]}),(0,q.jsxs)(`div`,{className:`flex gap-2`,children:[(0,q.jsxs)(k,{onClick:this.handleReset,variant:`outline`,className:`flex-1`,children:[(0,q.jsx)(O,{name:`restart`,className:`h-4 w-4 mr-2`}),e.tryAgain]}),(0,q.jsx)(k,{onClick:this.handleCopy,variant:`outline`,className:`flex-1`,children:this.state.copied?e.copied:e.copy})]})]})]})}):this.props.children}},et=e=>{let t=(0,A.c)(29),{children:n,fallback:r}=e,{t:i}=ne(),a;t[0]===i?a=t[1]:(a=i(`errorBoundary.state.unknownError`),t[0]=i,t[1]=a);let o;t[2]===i?o=t[3]:(o=i(`errorBoundary.title`),t[2]=i,t[3]=o);let s;t[4]===i?s=t[5]:(s=i(`errorBoundary.description`),t[4]=i,t[5]=s);let c;t[6]===i?c=t[7]:(c=i(`errorBoundary.actions.errorDetails`),t[6]=i,t[7]=c);let l;t[8]===i?l=t[9]:(l=i(`errorBoundary.state.componentStackLabel`),t[8]=i,t[9]=l);let u;t[10]===i?u=t[11]:(u=i(`errorBoundary.actions.tryAgain`),t[10]=i,t[11]=u);let d;t[12]===i?d=t[13]:(d=i(`errorBoundary.actions.copied`),t[12]=i,t[13]=d);let f;t[14]===i?f=t[15]:(f=i(`errorBoundary.actions.copy`),t[14]=i,t[15]=f);let p;t[16]!==a||t[17]!==o||t[18]!==s||t[19]!==c||t[20]!==l||t[21]!==u||t[22]!==d||t[23]!==f?(p={unknownError:a,title:o,description:s,detailsSummary:c,componentStackLabel:l,tryAgain:u,copied:d,copy:f},t[16]=a,t[17]=o,t[18]=s,t[19]=c,t[20]=l,t[21]=u,t[22]=d,t[23]=f,t[24]=p):p=t[24];let m=p,h;return t[25]!==n||t[26]!==r||t[27]!==m?(h=(0,q.jsx)($e,{fallback:r,strings:m,children:n}),t[25]=n,t[26]=r,t[27]=m,t[28]=h):h=t[28],h},Q=e=>S(x.getState().dictionary,e),tt=e=>typeof e!=`number`||!Number.isFinite(e)?null:Math.max(0,Math.min(100,Math.round(e))),nt=e=>typeof e!=`number`||!Number.isFinite(e)?`-`:`${Math.round(e)}%`,rt=(e,t)=>e??nt(t),it=(e,t,n=`auto`)=>{if(!e)return t??``;try{let r=new Date(e);if(!Number.isFinite(r.getTime()))return t??``;let i=new Date;return r.toDateString()===i.toDateString()?de(r,n,{fallback:t??``}):ue(r,n,{month:`short`,day:`numeric`,weekday:`short`,hour:`numeric`,minute:`2-digit`})}catch{return t??``}},at=e=>e===null?`safe`:e>=80?`critical`:e>=50?`warn`:`safe`,ot=e=>e===`5h`?Q(`quota.window.5h`):e===`7d`?Q(`quota.window.7d`):e===`7d-sonnet`?Q(`quota.window.7dSonnet`):e===`7d-opus`?Q(`quota.window.7dOpus`):e===`weekly`?Q(`quota.window.weekly`):e===`daily`?Q(`quota.window.daily`):e===`monthly`?Q(`quota.window.monthly`):e===`credits`?Q(`quota.window.credits`):e===`credits_balance`?Q(`quota.window.creditsBalance`):e===`billing_cycle`?Q(`quota.window.billingCycle`):e===`auto`?Q(`quota.window.auto`):e===`api`?Q(`quota.window.api`):e===`plan_limit`?Q(`quota.window.planLimit`):e===`on_demand`?Q(`quota.window.onDemand`):e===`session`?Q(`quota.window.session`):e===`premium`?Q(`quota.window.premium`):e===`chat`?Q(`quota.window.chat`):e===`completions`?Q(`quota.window.completions`):e===`premium_interactions`?Q(`quota.window.premiumInteractions`):e,st=e=>{let t=e.toLowerCase().trim();if(t===`5h`)return 18e3;if(t===`7d`||t===`weekly`||t===`7d-sonnet`||t===`7d-opus`)return 604800;if(t===`monthly`)return 2592e3;if(t===`24h`||t===`daily`)return 86400;if(t===`1h`)return 3600;let n=t.match(/^(\d+)h$/);if(n)return parseInt(n[1],10)*3600;let r=t.match(/^(\d+)d$/);return r?parseInt(r[1],10)*86400:null},ct=(e,t,n,r)=>{let i=n;if(i===null&&r&&(i=st(r)),e===null||t===null||i===null||i<=0)return null;let a=Math.max(0,(t-Date.now())/1e3),o=Math.max(0,Math.min(i,i-a)),s=Math.max(0,Math.min(1,o/i)),c=e/100,l=e>=100&&a>0,u;u=s>.01?Math.min(999,c/s*100):e;let d;d=l?`exhausted`:c<=s?`on-track`:u<=130?`slightly-fast`:`too-fast`;let f=i>=432e3,p=f?86400:3600,m=f?`d`:`h`,h=i/p,g=e/Math.max(o/p,h*.01),_=Number.isFinite(g)?`${Math.min(999.9,Math.max(0,g)).toFixed(1)}%/${m}`:`-`,v=u>100?`+${Math.round(u)}%`:`${Math.round(u)}%`,y=null,b=i/86400;return b>=7&&(y=100/b),{elapsedRatio:s,usageRatio:c,predictedFinalPercent:u,remainingSeconds:a,isExhausted:l,elapsedSeconds:o,totalSeconds:i,status:d,paceRateText:_,predictText:v,dailyAllocationPercent:y}},lt=e=>{switch(e){case`exhausted`:case`too-fast`:return`var(--status-error)`;case`slightly-fast`:return`var(--status-warning)`;case`on-track`:return`var(--status-success)`}},ut=e=>{let t=Math.floor(Math.max(0,Math.floor(e))/60),n=Math.floor(t/60),r=Math.floor(n/24),i=n%24,a=t%60;return r>0?`${r}d ${i}h`:n>0?`${n}h`:t===0?`<1m`:`${a}m`},dt=e=>Math.min(100,Math.max(0,e*100)),ft=[`standalone`,`minimal-ui`,`fullscreen`,`window-controls-overlay`],pt=`openchamber.pwaRecentSessions`,mt=e=>typeof window>`u`||typeof window.matchMedia!=`function`?!1:window.matchMedia(`(display-mode: ${e})`).matches,ht=()=>typeof window>`u`?`browser`:typeof document<`u`&&document.referrer.startsWith(`android-app://`)?`twa`:window.navigator.standalone?`standalone`:ft.find(e=>mt(e))??`browser`,gt=864e5,_t=5,vt=864e5,$=e=>e.time?.updated??e.time?.created??0,yt=({sessions:e,currentSessionId:t,cutoffDays:n,keepRecent:r=_t,now:i=Date.now()})=>{if(!Array.isArray(e)||n<=0)return[];let a=i-n*gt,o=[...e].sort((e,t)=>$(t)-$(e)),s=new Set(o.slice(0,r).map(e=>e.id));return o.filter(e=>{if(!e?.id||s.has(e.id)||e.id===t||e.share)return!1;let n=$(e);return n?n<a:!1}).map(e=>e.id)},bt=e=>{let t=typeof e==`object`?e:void 0,n=t?.autoRun!==!1,r=typeof e==`boolean`?e:t?.enabled??!0,a=T(e=>e.currentSessionId),o=T(e=>e.isLoading),s=C(e=>e.activeSessions),c=C(e=>e.hasLoadedFullCatalog),l=i(e=>e.autoDeleteEnabled),u=i(e=>e.autoDeleteAfterDays),d=i(e=>e.sessionRetentionAction),f=i(e=>e.autoDeleteLastRunAt),p=i(e=>e.setAutoDeleteLastRunAt),[m,h]=K.useState(!1),g=K.useRef(!1);K.useEffect(()=>{if(!r||!n||!l||u<=0)return;let e=window.setTimeout(()=>{E(w())},8e3);return()=>window.clearTimeout(e)},[u,l,n,r]);let _=K.useMemo(()=>u<=0?[]:yt({sessions:s,currentSessionId:a,cutoffDays:u}),[u,a,s]),y=K.useCallback(async({force:e=!1}={})=>{if(g.current)return{completedIds:[],failedIds:[],action:d,skippedReason:`running`};if((!l||u<=0)&&!e)return{completedIds:[],failedIds:[],action:d,skippedReason:`disabled`};if(o)return{completedIds:[],failedIds:[],action:d,skippedReason:`loading`};let t=Date.now();if(!e&&f&&t-f<vt)return{completedIds:[],failedIds:[],action:d,skippedReason:`cooldown`};let{activeSessions:n}=await E(w());if(n.length===0)return{completedIds:[],failedIds:[],action:d,skippedReason:`no-candidates`};let r=yt({sessions:n,currentSessionId:a,cutoffDays:u,now:t});if(r.length===0)return p(t),{completedIds:[],failedIds:[],action:d,skippedReason:`no-candidates`};g.current=!0,h(!0);try{let e=new Map(n.map(e=>[e.id,e])),t=[],i=[];for(let n of r){let r=e.get(n),a=r?ae(r):null;if(!a){i.push(n);continue}try{d===`archive`?await v.updateSession(n,{time:{archived:Date.now()}},a):await v.deleteSession(n,a),t.push(n)}catch{i.push(n)}}return d===`archive`?C.getState().archiveSessions(t):C.getState().removeSessions(t),{completedIds:t,failedIds:i,action:d}}finally{g.current=!1,h(!1),p(Date.now())}},[u,l,f,a,o,d,p]);return K.useEffect(()=>{r&&n&&(!l||u<=0||o||!c||s.length===0||f&&Date.now()-f<vt||y())},[u,l,f,n,r,c,s.length,o,y]),{candidates:_,isRunning:m,runCleanup:y,keepRecentCount:_t,action:d}};export{Pe as A,be as B,G as C,Ze as D,Qe as E,Le as F,j as H,Fe as I,Re as L,Ae as M,je as N,ke as O,Ie as P,ve as R,Xe as S,qe as T,pe as V,X as _,ct as a,H as b,rt as c,lt as d,at as f,Y as g,Z as h,dt as i,Me as j,Ne as k,ut as l,J as m,pt as n,tt as o,et as p,ht as r,it as s,bt as t,ot as u,Je as v,Ge as w,Ye as x,Ke as y,ye as z};