@openchambery/web 1.19.6 → 1.19.7-beta.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/assets/{AgentAvatar-CecaXP3U.js → AgentAvatar-Di8F4QJh.js} +1 -1
- package/dist/assets/AssistantView-DjRMIQm9.js +1 -0
- package/dist/assets/{ChatContainer-BNiQ84dy.js → ChatContainer-46JNO0wQ.js} +41 -41
- package/dist/assets/ContextPanel-C0ChXTuy.js +285 -0
- package/dist/assets/DiagramView-BgKMg0IV.js +1 -0
- package/dist/assets/FadeInOnReveal-CV2s6YN8.js +1 -0
- package/dist/assets/{Icon-Du1LX11Q.js → Icon-CLpn1mIz.js} +1 -1
- package/dist/assets/MarkdownRendererImpl-DeXN6UZF.js +7 -0
- package/dist/assets/MarkstreamRendererImpl-BRvprELo.js +1 -0
- package/dist/assets/MarkstreamRendererImpl-Ca7RATbs.css +1 -0
- package/dist/assets/MobileDetailNavigation-CyEjNnBa.js +1 -0
- package/dist/assets/MobileShareBridge-b_P7CIM8.js +4 -0
- package/dist/assets/MobileSurface-GUoCE7e3.js +2 -0
- package/dist/assets/{MultiRunWindow-BT7jpOmw.js → MultiRunWindow-BXKiOGl3.js} +1 -1
- package/dist/assets/OnboardingScreen-D6rtE7rj.js +1 -0
- package/dist/assets/OverlayScrollbar-DlNZho3q.js +2 -0
- package/dist/assets/SettingsView-CmQ9Gihu.js +25 -0
- package/dist/assets/{SettingsWindow-fsuSYQpN.js → SettingsWindow-oomlikIc.js} +1 -1
- package/dist/assets/TerminalView-DukmFrpQ.js +8 -0
- package/dist/assets/ToolOutputDialog-DfyASOZ3.js +10 -0
- package/dist/assets/__vite-optional-peer-dep_mermaid_markstream-react-CQGbcmkI.js +1 -0
- package/dist/assets/appThemeRegistry-BPIyegL1.js +2 -0
- package/dist/assets/{button-p6vbd3r6.js → button-z0GOBtWi.js} +1 -1
- package/dist/assets/clipboard-D35XSwID.js +1 -0
- package/dist/assets/{collapsible-Cimoz0kx.js → collapsible-D9zJRpeB.js} +1 -1
- package/dist/assets/d2_markstream-react-DtM9g53j.js +1 -0
- package/dist/assets/desktop-CfLlmafK.js +1 -0
- package/dist/assets/desktopHosts-C1Ns3DUu.js +1 -0
- package/dist/assets/desktopRelayRestore-8pvI_dSc.js +1 -0
- package/dist/assets/{diagram-DX_MPRs3.js → diagram-CoEqmReY.js} +1 -1
- package/dist/assets/{dialog-Bjnvo5pk.js → dialog-x2hirWBd.js} +1 -1
- package/dist/assets/{es-D9KcV5TX.js → es-C8Sqjsia.js} +1 -1
- package/dist/assets/fileQueries-DGHZqZHc.js +1 -0
- package/dist/assets/{fr-DPA9qUl3.js → fr-p-Zwm_j2.js} +1 -1
- package/dist/assets/{gitApi-DpRVHaQE.js → gitApi-CDZC-Lk_.js} +1 -1
- package/dist/assets/infographic_markstream-react-C3vVus-4.js +1 -0
- package/dist/assets/{input-gaFVNq1P.js → input-BG3VWTIF.js} +1 -1
- package/dist/assets/insertionBoundaries-COMpolc-.js +4 -0
- package/dist/assets/{ja-Dsif3NoD.js → ja-B6REu1qP.js} +1 -1
- package/dist/assets/{ko-Dixx4Ctg.js → ko-CJBNH9IZ.js} +1 -1
- package/dist/assets/main-BUoqbfN5.js +29 -0
- package/dist/assets/main-CzBK9fLh.js +2 -0
- package/dist/assets/markdown-worker-y3ewaqAK.js +4 -0
- package/dist/assets/markdownHeightCache-CvUyZT4q.js +1 -0
- package/dist/assets/markdownTheme-SPe4jOwX.js +2 -0
- package/dist/assets/miniChat-B_1WEof_.js +2 -0
- package/dist/assets/mobile-BeF7OWnn.js +2 -0
- package/dist/assets/multirun-CIJ8QEaF.js +4 -0
- package/dist/assets/persistence-w-AiX2i4.js +3 -0
- package/dist/assets/{pl-Bj78ZGgf.js → pl-B2cBI_7K.js} +1 -1
- package/dist/assets/platform-4eCmsdol.js +2 -0
- package/dist/assets/projectMeta-DDlv5Ikc.js +3 -0
- package/dist/assets/{pt-BR-CFL3xSAf.js → pt-BR-CrCc9hmt.js} +1 -1
- package/dist/assets/radio-CavTQQap.js +1 -0
- package/dist/assets/renderElectronMiniChatApp-BsJ8uce6.js +2 -0
- package/dist/assets/renderMobileApp-DlUGMmJA.js +28 -0
- package/dist/assets/runtime-switch-BkpTTbEi.js +1 -0
- package/dist/assets/runtimeConfig-Bd6v740T.js +2 -0
- package/dist/assets/runtimeEndpointReset-BWSOrCQV.js +4 -0
- package/dist/assets/{shikiHighlight-Bs6Tt3X-.js → shikiHighlight-B-VbG24L.js} +1 -1
- package/dist/assets/sortable-tabs-strip-CNDgyX0B.js +1 -0
- package/dist/assets/{src-2eFAiBLq.css → src-DZt1nWf5.css} +1 -1
- package/dist/assets/{store-DzpbXWX1.js → store-CL3WP48T.js} +2 -2
- package/dist/assets/terminalApi-CGtOtc8I.js +1 -0
- package/dist/assets/{tooltip-D1a6rKLA.js → tooltip-CtH61mQh.js} +1 -1
- package/dist/assets/{uk-BY60Ub3Z.js → uk-C8YKAz0x.js} +1 -1
- package/dist/assets/url-KeihbE0d.js +1 -0
- package/dist/assets/useAppFontEffects-DgTFkg79.js +7 -0
- package/dist/assets/useAssistantUIStore-I0VWrB5V.js +1 -0
- package/dist/assets/useDesktopWindowControlsLayout-D7acNtOm.js +1 -0
- package/dist/assets/{useEffectiveDirectory-CmjO98kZ.js → useEffectiveDirectory-SLhBW8Ri.js} +1 -1
- package/dist/assets/useFontPreferences-BLZ3y6mN.js +1 -0
- package/dist/assets/useMobileNavigationStore-BDD3R1c_.js +412 -0
- package/dist/assets/useSessionAutoCleanup-da8DkQd4.js +1 -0
- package/dist/assets/useUIStore-CNLmCoPU.js +1 -0
- package/dist/assets/useWorkerHighlightedLines-CG8Rl5i3.js +7 -0
- package/dist/assets/utils-CTL16t2f.js +1 -0
- package/dist/assets/vendor-floating-ui-core-Co1I1lFV.js +1 -0
- package/dist/assets/vendor-floating-ui-dom-BHhLtF5l.js +1 -0
- package/dist/assets/vendor-katex--B5dHUyk.js +257 -0
- package/dist/assets/vendor-markstream-core-Cm34iPLL.js +3 -0
- package/dist/assets/vendor-markstream-react-CGQrpq8a.css +1 -0
- package/dist/assets/vendor-markstream-react-CwvbEg9R.js +173 -0
- package/dist/assets/vendor-pierre-diffs-DX7XTPG3.js +2795 -0
- package/dist/assets/vendor-pierre-theme-D9JzKBPc.js +1 -0
- package/dist/assets/vendor-stream-diffs-DWy3xSmp.js +6 -0
- package/dist/assets/{zh-CN-Cox1LaOW.js → zh-CN-CCYwUnmB.js} +1 -1
- package/dist/assets/{zh-TW-B6RU0mxa.js → zh-TW-D8Y6py08.js} +1 -1
- package/dist/index.html +11 -9
- package/dist/mini-chat.html +11 -9
- package/dist/mobile.html +11 -9
- package/package.json +1 -1
- package/server/lib/notifications/APNS.md +4 -4
- package/server/lib/notifications/DOCUMENTATION.md +1 -1
- package/server/lib/notifications/apns-runtime.js +139 -20
- package/server/lib/notifications/apns-runtime.test.js +66 -7
- package/server/lib/notifications/apns-titles.js +62 -62
- package/server/lib/notifications/apns-titles.test.js +3 -1
- package/server/lib/notifications/routes.js +1 -1
- package/server/lib/notifications/runtime.js +29 -49
- package/server/lib/notifications/runtime.test.js +22 -0
- package/server/lib/opencode/settings-runtime.js +16 -0
- package/dist/assets/AssistantView-BJv9QUM-.js +0 -1
- package/dist/assets/ContextPanel-Df7BbJaq.js +0 -285
- package/dist/assets/DiagramView-Cw96eBGZ.js +0 -1
- package/dist/assets/FadeInOnReveal-Cj9ZC3Ab.js +0 -1
- package/dist/assets/MarkdownRendererImpl-DtZOlgmm.js +0 -7
- package/dist/assets/MobileDetailNavigation-C_4Y_X61.js +0 -1
- package/dist/assets/MobileShareBridge-CRpk-w3Q.js +0 -4
- package/dist/assets/MobileSurface-Brh-Z1KZ.js +0 -2
- package/dist/assets/OnboardingScreen-BkbprNa7.js +0 -1
- package/dist/assets/OverlayScrollbar-oOLMqq2s.js +0 -2
- package/dist/assets/SettingsView-BFP8FEvx.js +0 -25
- package/dist/assets/TerminalView-Z11uL87z.js +0 -8
- package/dist/assets/ToolOutputDialog-BV2y1sgg.js +0 -10
- package/dist/assets/appThemeRegistry-CNVnIaLQ.js +0 -2
- package/dist/assets/clipboard-C0bgPFn5.js +0 -1
- package/dist/assets/desktopHosts-DceeVBky.js +0 -1
- package/dist/assets/desktopRelayRestore-B0MRdR5y.js +0 -1
- package/dist/assets/fileQueries-BDld6h3B.js +0 -1
- package/dist/assets/insertionBoundaries-Dj5ZcWxy.js +0 -4
- package/dist/assets/main-B_kb4yxM.js +0 -29
- package/dist/assets/main-BqE-HYIY.js +0 -2
- package/dist/assets/markdown-worker-CoO82KYF.js +0 -4
- package/dist/assets/markdownTheme-St8zxDvJ.js +0 -2
- package/dist/assets/miniChat-CUYIqudA.js +0 -2
- package/dist/assets/mobile-C4xx6vwy.js +0 -2
- package/dist/assets/multirun-CfDp-MKW.js +0 -4
- package/dist/assets/persistence-CLUawIlm.js +0 -3
- package/dist/assets/platform-BrncW9ab.js +0 -2
- package/dist/assets/projectMeta-DuKavDZ0.js +0 -3
- package/dist/assets/radio-BgPFAtiV.js +0 -1
- package/dist/assets/renderElectronMiniChatApp-BjwbnKC-.js +0 -2
- package/dist/assets/renderMobileApp-DzGInnvc.js +0 -25
- package/dist/assets/runtimeConfig-D5qWnnR3.js +0 -2
- package/dist/assets/runtimeEndpointReset-kob_Gqd0.js +0 -4
- package/dist/assets/sortable-tabs-strip-oDpTDVoQ.js +0 -1
- package/dist/assets/terminalApi-D2OzR0I3.js +0 -1
- package/dist/assets/url-zwuNq3GS.js +0 -1
- package/dist/assets/useAppFontEffects-DR99zjde.js +0 -7
- package/dist/assets/useAssistantUIStore-D699Sbdb.js +0 -1
- package/dist/assets/useDesktopWindowControlsLayout-DT4BmF4D.js +0 -1
- package/dist/assets/useFontPreferences-F2QPNE2V.js +0 -1
- package/dist/assets/useMobileNavigationStore-DLW9tcn6.js +0 -412
- package/dist/assets/useSessionAutoCleanup-BE7yfJLF.js +0 -1
- package/dist/assets/useUIStore-BXjMQrel.js +0 -1
- package/dist/assets/useWorkerHighlightedLines-5n25LYcg.js +0 -7
- package/dist/assets/utils-D94hxQYq.js +0 -1
- package/dist/assets/vendor-katex-CNGgSigB.js +0 -257
- package/dist/assets/vendor-pierre-diffs-BenIz2TM.js +0 -1418
- package/dist/assets/vendor-pierre-theme-F9vQJHIe.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var e={HttpRequest:1,HttpBody:2,HttpResponse:3,StreamEnd:4,StreamAbort:5,WsOpen:6,WsOpened:7,WsText:8,WsBinary:9,WsClose:10,Ping:11,Pong:12},t=new Set(Object.values(e)),n=e=>t.has(e),r={ControlReplaced:4001,DuplicateClient:4002,StuckControlReset:4003,HostUnavailable:4008,AuthFailed:4010,LimitExceeded:4029,HostWentAway:1012,RekeyMismatch:1008,ChannelFailure:1011},i=globalThis.crypto.subtle,a={name:`ECDH`,namedCurve:`P-256`},o=16,s=32,c=16,l=4,u=8,d=class extends Error{constructor(e){super(e),this.name=`RelayCryptoError`}},f=()=>i.generateKey(a,!0,[`deriveBits`]),p=async e=>{let t=await i.exportKey(`jwk`,e);return{kty:t.kty,crv:t.crv,x:t.x,y:t.y}},m=async e=>{if(e.kty!==`EC`||e.crv!==`P-256`||typeof e.x!=`string`||typeof e.y!=`string`)throw new d(`invalid ECDH public key JWK`);try{return await i.importKey(`jwk`,{kty:e.kty,crv:e.crv,x:e.x,y:e.y,ext:!0},a,!0,[])}catch{throw new d(`invalid ECDH public key JWK`)}},h=()=>{let e=new Uint8Array(o);return globalThis.crypto.getRandomValues(e),e},g=async(e,t,n)=>{if(n.length!==o)throw new d(`invalid handshake nonce length`);let r=await i.deriveBits({name:`ECDH`,public:t},e,256),a=await i.importKey(`raw`,r,`HKDF`,!1,[`deriveBits`]),c=new Uint8Array(await i.deriveBits({name:`HKDF`,hash:`SHA-256`,salt:n,info:new TextEncoder().encode(`openchamber-relay-v1`)},a,512)),l=(e,t)=>i.importKey(`raw`,e,{name:`AES-GCM`},!1,t);return{clientToHost:await l(c.slice(0,s),[`encrypt`,`decrypt`]),hostToClient:await l(c.slice(s),[`encrypt`,`decrypt`])}},ee=(e,t,n)=>{for(let r=7;r>=0;--r)e[t+r]=Number(n&255n),n>>=8n},_=(e,t)=>{let n=0n;for(let r=0;r<u;r+=1)n=n<<8n|BigInt(e[t+r]);return n},v=e=>{let t=new Uint8Array(l);globalThis.crypto.getRandomValues(t);let n=0n;return{async encrypt(r){if(r.length>65536)throw new d(`plaintext frame exceeds maximum size`);n+=1n;let a=new Uint8Array(12);a.set(t,0),ee(a,l,n);let o=new Uint8Array(await i.encrypt({name:`AES-GCM`,iv:a},e,r)),s=new Uint8Array(13+o.length);return s[0]=1,s.set(a,1),s.set(o,13),s}}},y=e=>{let t=0n;return{async decrypt(n){if(n.length<13+c)throw new d(`encrypted frame too short`);if(n[0]!==1)throw new d(`unsupported encrypted frame version`);let r=n.slice(1,13),a=_(r,l);if(a<=t)throw new d(`frame counter regression`);let o;try{o=await i.decrypt({name:`AES-GCM`,iv:r},e,n.slice(13))}catch{throw new d(`frame decryption failed`)}return t=a,new Uint8Array(o)}}},b=`ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_`,x=e=>{let t=``;for(let n=0;n<e.length;n+=3){let r=e[n],i=n+1<e.length?e[n+1]:void 0,a=n+2<e.length?e[n+2]:void 0;t+=b[r>>2],t+=b[(r&3)<<4|(i??0)>>4],i!==void 0&&(t+=b[(i&15)<<2|(a??0)>>6]),a!==void 0&&(t+=b[a&63])}return t},S=e=>{let t;try{t=JSON.parse(e)}catch{return null}if(typeof t!=`object`||!t)return null;let n=t;if(n.v!==1)return null;let r=n.batch===!0;return n.t===`ready`?{t:`ready`,v:1,batch:r}:n.t===`hello`&&typeof n.nonce==`string`&&typeof n.clientPubJwk==`object`&&n.clientPubJwk!==null?{t:`hello`,v:1,clientPubJwk:n.clientPubJwk,nonce:n.nonce,batch:r}:null},te=e=>({type:`fail`,closeCode:r.ChannelFailure,reason:e}),ne=async(e,t={})=>{let n=t.batch!==!1,r=await m(e),i=await f(),a=h(),o={t:`hello`,v:1,clientPubJwk:await p(i.publicKey),nonce:x(a),...n?{batch:!0}:{}},s=!1;return{helloText:JSON.stringify(o),get established(){return s},async handleText(e){if(s)return S(e)?.t===`ready`?{type:`ignore`}:te(`plaintext frame on established channel`);let t=S(e);if(t?.t!==`ready`)return{type:`ignore`};let o=await g(i.privateKey,r,a);return s=!0,{type:`established`,batch:n&&t.batch===!0,channel:{encryptor:v(o.clientToHost),decryptor:y(o.hostToClient)}}}}},re=4294967295,C=class extends Error{constructor(e){super(e),this.name=`TunnelCodecError`}},w=(e,t,n,r=!1)=>{if(!Number.isInteger(t)||t<0||t>re)throw new C(`invalid stream id`);if(n.length>65526)throw new C(`tunnel payload exceeds maximum size`);let i=new Uint8Array(5+n.length);return i[0]=r?e|128:e,i[1]=t>>>24&255,i[2]=t>>>16&255,i[3]=t>>>8&255,i[4]=t&255,i.set(n,5),i},ie=e=>{if(e.length<5)throw new C(`tunnel frame too short`);let t=e[0],r=!!(t&128),i=t&-129;if(!n(i))throw new C(`unknown tunnel frame type ${i}`);return{frameType:i,streamId:(e[1]<<24|e[2]<<16|e[3]<<8|e[4])>>>0,payload:e.slice(5),hasMoreFragments:r}},ae=new TextEncoder,T=new TextDecoder,E=e=>ae.encode(JSON.stringify(e)),D=(e,t)=>{let n;try{n=JSON.parse(T.decode(e))}catch{throw new C(`malformed JSON tunnel payload`)}if(!t(n))throw new C(`unexpected JSON tunnel payload shape`);return n},O=(e,t=65526)=>{if(t<=0||t>65526)throw new C(`invalid chunk size`);if(e.length===0)return[new Uint8Array];let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n},k=(e,t,n)=>{let r=O(n);return r.map((n,i)=>w(e,t,n,i<r.length-1))},oe=(e=16777216)=>{let t=new Map;return{push(n){let r=`${n.streamId}:${n.frameType}`,i=t.get(r);if(!n.hasMoreFragments&&!i)return n.payload;let a=i?.chunks??[],o=(i?.totalBytes??0)+n.payload.length;if(o>e)throw t.delete(r),new C(`fragmented message exceeds maximum size`);if(a.push(n.payload),n.hasMoreFragments)return t.set(r,{chunks:a,totalBytes:o}),null;t.delete(r);let s=new Uint8Array(o),c=0;for(let e of a)s.set(e,c),c+=e.length;return s},dropStream(e){for(let n of t.keys())n.startsWith(`${e}:`)&&t.delete(n)}}},A=e=>{if(e.length===0)throw new C(`cannot encode an empty frame batch`);if(e.length===1){let t=e[0],n=new Uint8Array(1+t.length);if(n[0]=0,n.set(t,1),n.length>65536)throw new C(`frame batch exceeds maximum plaintext size`);return n}let t=1;for(let n of e)t+=4+n.length;if(t>65536)throw new C(`frame batch exceeds maximum plaintext size`);let n=new Uint8Array(t);n[0]=1;let r=1;for(let t of e)n[r]=t.length>>>24&255,n[r+1]=t.length>>>16&255,n[r+2]=t.length>>>8&255,n[r+3]=t.length&255,r+=4,n.set(t,r),r+=t.length;return n},se=e=>{if(e.length<1)throw new C(`empty batch plaintext`);let t=e[0];if(t===0)return[e.slice(1)];if(t!==1)throw new C(`unknown batch container tag ${t}`);let n=[],r=1;for(;r<e.length;){if(r+4>e.length)throw new C(`truncated batch frame length`);let t=(e[r]<<24|e[r+1]<<16|e[r+2]<<8|e[r+3])>>>0;if(r+=4,r+t>e.length)throw new C(`truncated batch frame body`);n.push(e.slice(r,r+t)),r+=t}if(n.length===0)throw new C(`empty frame batch`);return n},j=new Set([e.HttpBody,e.WsText,e.WsBinary]),ce=e=>{let t=e.windowMs??150,n=e.maxBatchBytes??24576,r=e.maxBatchFrames??32,i=e.now??(()=>Date.now()),a=e.setTimer??((e,t)=>setTimeout(e,t)),o=e.clearTimer??(e=>clearTimeout(e)),s=[],c=0,l=null,u=0,d=!1,f=()=>{l!==null&&(o(l),l=null)},p=()=>{if(f(),s.length===0)return;let t=s;s=[],c=0,u=i(),e.sendBatch(A(t))};return{enqueue:e=>{if(d)return;let o=e[0]&-129;if(!j.has(o)){s.push(e),p();return}let f=i();if(s.length===0&&f-u>=t){s.push(e),p();return}let m=4+e.length;if(s.length>0&&1+c+m>65536&&p(),s.push(e),c+=m,c>=n||s.length>=r){p();return}l===null&&(l=a(p,t))},flush:p,dispose(){d=!0,f(),s=[],c=0}}},le=()=>{let e=1;return{next(){if(e>re)throw new C(`stream id space exhausted`);let t=e;return e+=2,t}}},M=e=>typeof e==`object`&&!!e&&!Array.isArray(e),ue=e=>M(e)&&Object.values(e).every(e=>typeof e==`string`),N=e=>M(e)&&typeof e.status==`number`&&ue(e.headers),P=e=>M(e)&&typeof e.reason==`string`,de=e=>M(e)&&typeof e.code==`number`&&typeof e.reason==`string`,fe=/^[a-z][a-z\d+.-]*:\/\//i,F=`http://tunnel.invalid`,I=e=>{try{let t=fe.test(e)?new URL(e):new URL(e,F);return`${t.pathname}${t.search}`}catch{return e}},L=e=>({async*[Symbol.asyncIterator](){yield e}}),pe=e=>({async*[Symbol.asyncIterator](){let t=e.getReader();try{for(;;){let{done:e,value:n}=await t.read();if(e)return;n&&(yield n)}}finally{t.releaseLock()}}}),me=e=>{let t=new Uint8Array(e.byteLength);return t.set(new Uint8Array(e.buffer,e.byteOffset,e.byteLength)),t},he=async e=>{if(e==null)return{body:null};if(e instanceof ReadableStream)return{body:pe(e)};if(typeof e==`string`)return{body:L(new TextEncoder().encode(e))};if(e instanceof ArrayBuffer)return{body:L(new Uint8Array(e.slice(0)))};if(ArrayBuffer.isView(e))return{body:L(me(e))};let t=new Response(e),n=t.headers.get(`content-type`)??void 0;return{body:L(new Uint8Array(await t.arrayBuffer())),contentType:n}},ge=async(e,t)=>{let n,r=new Headers,i=`GET`,a=null,o;e instanceof Request?(n=e.url,i=e.method,e.headers.forEach((e,t)=>r.set(t,e)),o=e.signal,a=e.body):n=e.toString(),t&&(t.method&&(i=t.method),t.headers&&new Headers(t.headers).forEach((e,t)=>r.set(t,e)),t.body!==void 0&&(a=t.body),t.signal&&(o=t.signal));let s=fe.test(n)?new URL(n):new URL(n,F),{body:c,contentType:l}=await he(a);l&&!r.has(`content-type`)&&r.set(`content-type`,l);let u={};return r.forEach((e,t)=>{u[t]=e}),{method:i.toUpperCase(),path:s.pathname,query:s.search.startsWith(`?`)?s.search.slice(1):s.search,headers:u,body:c,signal:o}},_e=new Uint8Array,ve=new TextEncoder,ye=new TextDecoder,R=e=>e instanceof Error?e:Error(String(e)),be=()=>new DOMException(`The operation was aborted.`,`AbortError`),xe=e=>{e.binaryType=`arraybuffer`;let t={get readyState(){return e.readyState},send(t){e.send(t)},close(t,n){e.close(t,n)},onopen:null,onmessage:null,onclose:null,onerror:null};return e.onopen=()=>t.onopen?.(),e.onmessage=e=>t.onmessage?.({data:e.data}),e.onclose=e=>t.onclose?.({code:e.code,reason:e.reason}),e.onerror=()=>t.onerror?.(),t},Se=e=>{let t={get readyState(){return e.readyState},get binaryType(){return e.binaryType},set binaryType(t){t&&(e.binaryType=t)},onopen:null,onmessage:null,onerror:null,onclose:null,send(t){e.send(t)},close(t,n){e.close(t,n)}};return e.onopen=()=>t.onopen?.(),e.onmessage=e=>{let n=e.data;(typeof n==`string`||n instanceof ArrayBuffer)&&t.onmessage?.({data:n})},e.onerror=()=>t.onerror?.(),e.onclose=e=>t.onclose?.({code:e.code,reason:e.reason}),t},Ce=0,we=1,Te=2,Ee=3,De=new Set([r.AuthFailed,r.DuplicateClient,r.LimitExceeded]),Oe={[r.AuthFailed]:`relay authentication failed`,[r.DuplicateClient]:`relay connection replaced by another client`,[r.LimitExceeded]:`relay connection limit reached`},ke=()=>{let e=typeof navigator<`u`&&navigator.onLine===!1,t=typeof document<`u`&&document.visibilityState===`hidden`;return e||t},Ae=t=>{let n=t.helloRetryMs??1e3,r=t.helloTimeoutMs??3e4,i=t.pingIntervalMs??3e4,a=t.pingTimeoutMs??15e3,o=t.batchWindowMs??150,s=t.batch!==!1,c=t.reconnectBaseDelayMs??1e3,l=t.reconnectMaxDelayMs??3e4,u=t.hiddenOrOfflineMaxDelayMs??6e4,d=t.createWireSocket??(e=>xe(new WebSocket(e))),f=!1,p={state:`idle`},m=new Set,h=null,g=null,ee=null,_=0,v=0,y=null,b=[],x=!1,S=e=>{if(p.state!==e.state||p.lastError!==e.lastError){p=e;for(let e of m)try{e(p)}catch{}}},te=e=>{let t=b;b=[];for(let n of t)n.reject(e)},re=e=>{let t=b;b=[];for(let n of t)n.resolve(e)},C=(e,t)=>{e.dead=!0;let n=Array.from(e.streams.values());e.streams.clear();for(let e of n)try{e.fail(t)}catch{}},ae=()=>{y!==null&&(clearTimeout(y),y=null)},T=()=>{f||y===null||ke()||(ae(),M(),F())},A=()=>{typeof document<`u`&&document.visibilityState===`visible`&&T()},j=()=>{x||typeof window>`u`||(x=!0,window.addEventListener(`online`,T),typeof document<`u`&&document.addEventListener(`visibilitychange`,A))},M=()=>{!x||typeof window>`u`||(x=!1,window.removeEventListener(`online`,T),typeof document<`u`&&document.removeEventListener(`visibilitychange`,A))},ue=()=>{if(f||y!==null)return;let e=Math.max(0,v-1),t=c*2**Math.min(e,10),n=ke()?u:l,r=Math.min(n,t);j(),y=setTimeout(()=>{y=null,M(),F()},r)},fe=()=>{let e=new URL(t.relayUrl);return e.searchParams.set(`v`,`1`),e.searchParams.set(`role`,`client`),e.searchParams.set(`serverId`,t.serverId),t.grant&&e.searchParams.set(`grant`,t.grant),e.toString()},F=async()=>{if(f)return;ae(),_+=1;let c=_;S({state:v>0?`reconnecting`:`connecting`,lastError:p.lastError});let l;try{l=await ne(t.hostEncPubJwk,{batch:s})}catch(e){if(c!==_||f)return;I(c,R(e),!0);return}if(c!==_||f)return;let u;try{u=d(fe())}catch(e){I(c,R(e));return}g=u;let m=!1,y=null,b=null,x=null,T=null,E=Promise.resolve(),D=null,O=null,k=!1,A=null,j=Date.now(),M=()=>{y!==null&&(clearInterval(y),y=null),b!==null&&(clearTimeout(b),b=null),x!==null&&(clearInterval(x),x=null),T!==null&&(clearTimeout(T),T=null),A!==null&&(A.dispose(),A=null)};ee=M;function N(e,t=!1,n=!1){if(!(m||c!==_)){m=!0,M(),D&&(h=null,C(D,Error(`relay tunnel reset: ${e.message}`))),te(e);try{u.close()}catch{}if(g===u&&(g=null),!f){if(v+=1,n){S({state:`error`,lastError:e.message});return}S({state:t?`error`:`reconnecting`,lastError:e.message}),ue()}}}let P=()=>{try{u.send(l.helloText)}catch{}},de=(t,n)=>{O=t,k=n,y!==null&&(clearInterval(y),y=null),b!==null&&(clearTimeout(b),b=null);let r=new Map,s=le(),c=oe(),l=Promise.resolve(),d=e=>{l=l.then(async()=>{if(p.dead)return;let n=await t.encryptor.encrypt(e);u.send(n)}).catch(()=>{})},f=n?ce({windowMs:o,sendBatch:d}):null;A=f;let p={streams:r,assembler:c,nextStreamId:()=>s.next(),dead:!1,send(t){if(p.dead)return;let n=t[0]&-129;n!==e.Ping&&n!==e.Pong&&(j=Date.now()),f?f.enqueue(t):d(t)}};D=p,h=p,v=0,j=Date.now(),S({state:`connected`}),re(p),x=setInterval(()=>{Date.now()-j<i||(p.send(w(e.Ping,0,_e)),T===null&&(T=setTimeout(()=>{T=null,N(Error(`relay keepalive timeout`))},a)))},i)},F=(t,n)=>{let r;try{r=ie(n)}catch(e){N(R(e));return}if(T!==null&&(clearTimeout(T),T=null),r.frameType===e.Ping){t.send(w(e.Pong,r.streamId,_e));return}if(r.frameType===e.Pong)return;j=Date.now();let i=r.payload;if(r.frameType===e.WsText||r.frameType===e.WsBinary){let e;try{e=t.assembler.push(r)}catch(e){N(R(e));return}if(e===null)return;i=e}else if(r.hasMoreFragments){N(Error(`unexpected fragmented tunnel frame`));return}let a=t.streams.get(r.streamId);a&&a.handleFrame(r.frameType,i)};u.onopen=()=>{m||c!==_||(P(),y=setInterval(P,n))},u.onmessage=e=>{if(m||c!==_)return;let t=e.data;if(typeof t==`string`){E=E.then(async()=>{if(m||c!==_)return;let e=await l.handleText(t);if(e.type===`established`){if(O)return;de(e.channel,e.batch)}else e.type===`fail`&&N(Error(`relay handshake failed: ${e.reason}`))}).catch(e=>{N(R(e))});return}let n=t instanceof ArrayBuffer?new Uint8Array(t):t instanceof Uint8Array?t:null;n&&(E=E.then(async()=>{if(m||c!==_)return;let e=D,t=O;if(!e||!t){N(Error(`encrypted frame before handshake completed`));return}let r;try{r=await t.decryptor.decrypt(n)}catch(e){N(R(e));return}if(k){let t;try{t=se(r)}catch(e){N(R(e));return}for(let n of t){if(m||c!==_||e.dead)return;F(e,n)}return}F(e,r)}).catch(e=>{N(R(e))}))},u.onclose=e=>{let t=De.has(e.code);N(Error(Oe[e.code]??`relay socket closed (code ${e.code})`),t,t)},u.onerror=()=>{},b=setTimeout(()=>{b=null,N(Error(`relay handshake timeout`),!0)},r);function I(e,t,n=!1){e!==_||f||(te(t),v+=1,S({state:n?`error`:`reconnecting`,lastError:t.message}),ue())}},I=e=>f?Promise.reject(Error(`relay tunnel closed`)):e?.aborted?Promise.reject(be()):h&&!h.dead?Promise.resolve(h):new Promise((t,n)=>{let r=null,i={resolve(n){r&&e&&e.removeEventListener(`abort`,r),t(n)},reject(t){r&&e&&e.removeEventListener(`abort`,r),n(t)}};e&&(r=()=>{b=b.filter(e=>e!==i),n(be())},e.addEventListener(`abort`,r,{once:!0})),b.push(i)}),L=async(t,n)=>{let r=await ge(t,n),i=r.signal;if(i?.aborted)throw be();let a=await I(i),o=a.nextStreamId();return await new Promise((t,n)=>{let s=!1,c=!1,l=null,u=null,d=()=>{a.streams.delete(o),a.assembler.dropStream(o),u&&i&&i.removeEventListener(`abort`,u)},f=e=>{if(!c){if(c=!0,d(),!s){n(e);return}try{l?.error(e)}catch{}}},p=t=>{a.dead||a.send(w(e.StreamAbort,o,E({reason:t})))};u=()=>{p(`aborted`),f(be())},a.streams.set(o,{handleFrame(n,r){if(n===e.HttpResponse){if(s||c)return;let e;try{e=D(r,N)}catch(e){p(`malformed response head`),f(R(e));return}let n=e.status===204||e.status===205||e.status===304,i=null;n||(i=new ReadableStream({start(e){l=e},cancel(){c||(c=!0,d(),p(`response body cancelled`))}})),s=!0,t(new Response(i,{status:e.status,headers:e.headers})),n&&(c=!0,d());return}if(n===e.HttpBody){if(!s||c)return;try{l?.enqueue(r)}catch{}return}if(n===e.StreamEnd){if(c)return;if(!s){f(Error(`tunnel stream ended before response head`));return}c=!0,d();try{l?.close()}catch{}return}if(n===e.StreamAbort){let e=`stream aborted by host`;try{e=D(r,P).reason}catch{}f(Error(e))}},fail(e){f(e)}}),i&&i.addEventListener(`abort`,u,{once:!0});let m={method:r.method,path:r.path,query:r.query,headers:r.headers};a.send(w(e.HttpRequest,o,E(m))),(async()=>{try{if(r.body)for await(let t of r.body){if(c||a.dead)return;for(let n of O(t))a.send(w(e.HttpBody,o,n))}!c&&!a.dead&&a.send(w(e.StreamEnd,o,_e))}catch(e){p(`request body failed`),f(R(e))}})()})},pe=e=>{let t=e.indexOf(`?`);return t===-1?{path:e,query:``}:{path:e.slice(0,t),query:e.slice(t+1)}};return F(),{fetch:L,openWebSocket:(t,n,r)=>{let i=Ce,a=null,o=0,s=!1,c={get readyState(){return i},onopen:null,onmessage:null,onerror:null,onclose:null,send(t){if(i!==we||!a||a.dead)throw Error(`relay tunnel socket is not open`);if(typeof t==`string`){for(let n of k(e.WsText,o,ve.encode(t)))a.send(n);return}let n=t instanceof ArrayBuffer?new Uint8Array(t.slice(0)):(()=>{let e=new Uint8Array(t.byteLength);return e.set(new Uint8Array(t.buffer,t.byteOffset,t.byteLength)),e})();for(let t of k(e.WsBinary,o,n))a.send(t)},close(t=1e3,n=``){i!==Ee&&i!==Te&&(i===we&&a&&!a.dead&&(i=Te,a.send(w(e.WsClose,o,E({code:t,reason:n})))),l(t,n))}},l=(e,t,n=!1)=>{if(!s){if(s=!0,a&&(a.streams.delete(o),a.assembler.dropStream(o)),i=Ee,n)try{c.onerror?.()}catch{}try{c.onclose?.({code:e,reason:t})}catch{}}};return(async()=>{let u;try{u=await I()}catch(e){l(1006,R(e).message,!0);return}if(s)return;a=u,o=u.nextStreamId(),u.streams.set(o,{handleFrame(t,n){if(t===e.WsOpened){if(i===Ce){i=we;try{c.onopen?.()}catch{}}return}if(t===e.WsText){try{c.onmessage?.({data:ye.decode(n)})}catch{}return}if(t===e.WsBinary){let e=new ArrayBuffer(n.byteLength);new Uint8Array(e).set(n);try{c.onmessage?.({data:e})}catch{}return}if(t===e.WsClose){let e=1e3,t=``;try{let r=D(n,de);e=r.code,t=r.reason}catch{}l(e,t);return}if(t===e.StreamAbort){let e=`stream aborted`;try{e=D(n,P).reason}catch{}l(1006,e,!0)}},fail(e){l(1012,e.message,!0)}});let{path:d,query:f}=pe(t),p={path:d,query:f,...n&&n.length>0?{protocols:n}:{},...r&&Object.keys(r).length>0?{headers:r}:{}};u.send(w(e.WsOpen,o,E(p)))})(),c},getStatus:()=>p,subscribeStatus(e){return m.add(e),()=>{m.delete(e)}},close:()=>{if(f)return;f=!0,_+=1,ae(),M(),ee?.(),ee=null;let e=h;h=null;let t=Error(`relay tunnel closed`);e&&C(e,t),te(t);try{g?.close()}catch{}g=null,S({state:`idle`})}}},z=null,B=null,je=(e,t)=>e.relayUrl===t.relayUrl&&e.serverId===t.serverId&&e.grant===t.grant&&JSON.stringify(e.hostEncPubJwk)===JSON.stringify(t.hostEncPubJwk),Me=()=>z,Ne=()=>B,Pe=()=>z!==null,Fe=()=>z?.getStatus().state===`connected`,Ie=e=>z&&B&&je(B,e)?z:(z?.close(),B=e,z=Ae(e),z),Le=(e,t)=>{z!==t&&(z?.close(),B=e,z=t)},Re=()=>{z?.close(),z=null,B=null},ze=()=>null,Be=``,V={},H=``,U=0,W=null,G=``,K=0,q=null,J=0,Ve=1e4,He=()=>J,Ue=e=>e.toLowerCase()===`authorization`,We=e=>{let t={};for(let[n,r]of Object.entries(e||{})){let e=n.trim(),i=r.trim();e&&i&&!Ue(e)&&(t[e]=i)}return t},Ge=(e,t)=>{let n=Object.entries(e);return n.length===Object.keys(t).length&&n.every(([e,n])=>t[e]===n)},Ke=e=>typeof e==`string`?e.trim():``,qe=()=>{if(typeof window>`u`)return``;let e=window.__OPENCHAMBER_CLIENT_TOKEN__;return Ke(e)},Je=()=>{if(typeof window>`u`)return``;let e=window.__OPENCHAMBER_API_BASE_URL__;return typeof e==`string`?e.trim():``},Ye=(e,t)=>{let n=typeof e==`string`&&e.trim()?e.trim():Je();if(!n)return t;try{return new URL(t,`${n.replace(/\/+$/,``)}/`).toString()}catch{return t}},Y=()=>{H=``,U=0,G=``,K=0},Xe=()=>{J+=1,W=null,Y(),gt()},Ze=e=>{let t=Ke(e),n=t===et();Be=t,ze=()=>t?{type:`bearer`,token:t}:null,!n&&Xe()},Qe=e=>{let t=We(e);Ge(V,t)||(V=t,Xe())},$e=()=>{if(Object.keys(V).length>0)return V;if(typeof window>`u`)return{};let e=window.__OPENCHAMBER_RUNTIME_HEADERS__;return e&&typeof e==`object`?We(e):{}},et=()=>Be||qe(),tt=(e,t)=>{let n=Ke(e);if(!n||typeof t!=`number`||!Number.isFinite(t)){Y();return}let r=H;H=n,U=t,r&&r!==n&&mt()},nt=()=>!H||U<=Date.now()+Ve?(Y(),``):H,rt=()=>!G||K<=Date.now()+Ve?(G=``,K=0,``):G,it=()=>{let e=nt();return!e&&(et()||typeof window<`u`)&<().catch(()=>{}),e},at=e=>{let t=rt();return!t&&e&&typeof window<`u`&&ut(e).catch(()=>{}),t},ot=async()=>{let e=await ze(),t=e?.type===`bearer`?Ke(e.token):et();return t?{type:`bearer`,token:t}:null},st=e=>{if(W)return W;let t=J,n=(async()=>{let n=await ot(),r=new Headers;for(let[e,t]of Object.entries($e()))r.set(e,t);n?.type===`bearer`&&r.set(`Authorization`,`Bearer ${n.token}`);let i=Me(),a=i?await i.fetch(`/auth/url-token`,{method:`POST`,headers:r}):await fetch(Ye(e,`/auth/url-token`),{method:`POST`,headers:r,credentials:`include`});if(!a.ok)throw t===J&&Y(),Error(`Failed to mint runtime URL auth token (${a.status})`);let o=await a.json().catch(()=>null),s=typeof o?.token==`string`?o.token.trim():``,c=typeof o?.expiresAt==`number`?o.expiresAt:0;if(t!==J)throw Error(`Runtime URL auth token response is stale`);if(tt(s,c),!H)throw Error(`Runtime URL auth token response was invalid`);return H})().finally(()=>{W===n&&(W=null)});return W=n,W},ct=e=>{if(q)return q;let t=(async()=>{let t=await fetch(Ye(e,`/auth/url-token`),{method:`POST`,credentials:`include`});if(!t.ok)throw G=``,K=0,Error(`Failed to mint local runtime URL auth token (${t.status})`);let n=await t.json().catch(()=>null),r=typeof n?.token==`string`?n.token.trim():``,i=typeof n?.expiresAt==`number`?n.expiresAt:0;if(!r||!Number.isFinite(i))throw Error(`Local runtime URL auth token response was invalid`);return G=r,K=i,r})().finally(()=>{q===t&&(q=null)});return q=t,q},lt=async e=>nt()||st(e),ut=async e=>rt()||ct(e),X=0,Z=null,dt=null,ft=new Set,pt=5e3,mt=()=>{for(let e of ft)try{e()}catch{}},ht=()=>{Z!==null&&(clearTimeout(Z),Z=null)},gt=()=>{if(ht(),X<=0||typeof window>`u`)return;let e=U-Ve-pt,t=U>0?Math.max(0,e-Date.now()):0;Z=setTimeout(()=>{Z=null,!(X<=0)&&st(dt).catch(()=>{}).finally(()=>{gt()})},t)},_t=e=>{typeof e==`string`&&e.trim()&&(dt=e.trim()),X+=1,gt();let t=!1;return()=>{t||(t=!0,X=Math.max(0,X-1),X===0&&ht())}},vt=e=>(ft.add(e),()=>{ft.delete(e)}),yt=async e=>{let t=new Headers(e);for(let[e,n]of Object.entries($e()))t.has(e)||t.set(e,n);if(t.has(`Authorization`))return t;let n=await ot();return n?.type===`bearer`&&t.set(`Authorization`,`Bearer ${n.token}`),t},bt=/^[a-z][a-z\d+.-]*:\/\//i,xt=e=>{let t=e.trim();return t?t.startsWith(`/`)?t:`/${t}`:`/`},St=e=>typeof e==`string`?e.trim().replace(/\/+$/,``):``,Ct=()=>{if(typeof window>`u`)return``;let e=window.__OPENCHAMBER_API_BASE_URL__;return St(e)},wt=()=>{if(typeof window>`u`)return``;let e=window.__OPENCHAMBER_LOCAL_ORIGIN__;return St(e)},Tt=()=>Object.keys($e()).length>0,Et=e=>e.currentHref?.()||(typeof window<`u`?window.location.href||window.location.origin:``),Dt=(e,t)=>{if(!t)return;let n=t instanceof URLSearchParams?Array.from(t.entries()):Object.entries(t);for(let[t,r]of n)r!=null&&e.searchParams.set(t,String(r))},Ot=(e,t)=>{if(!t)return e;let n=new URLSearchParams;Dt({searchParams:n},t);let r=n.toString();return r?e.includes(`?`)?`${e}&${r}`:`${e}?${r}`:e},kt=(e,t,n)=>{if(bt.test(t)){let e=new URL(t);return Dt(e,n),e.toString()}let r=xt(t);if(!e)return Ot(r,n);let i=new URL(r,`${e}/`);return Dt(i,n),i.toString()},At=e=>{let t=it();if(!t)return e;let n=bt.test(e)?new URL(e):new URL(e,`http://openchamber.local`);return n.searchParams.set(`oc_url_token`,t),bt.test(e)?n.toString():`${n.pathname}${n.search}${n.hash}`},jt=(e,t)=>{let n=bt.test(e)?new URL(e):new URL(e,Et(t));return n.protocol===`ws:`||n.protocol===`wss:`||(n.protocol=n.protocol===`https:`?`wss:`:`ws:`),n.toString()},Mt=(e,t,n)=>{if(!Tt())return null;let r=wt();if(!r)return null;try{let i=new URL(`/api/openchamber/realtime-proxy/${e===`sse`?`sse`:`ws`}`,`${r}/`);i.searchParams.set(`url`,t);let a=at(r);return a&&i.searchParams.set(`oc_url_token`,a),e===`ws`?(i.protocol=i.protocol===`https:`?`wss:`:`ws:`,jt(i.toString(),n)):i.toString()}catch{return null}},Nt=(e={})=>{let t=St(e.apiBaseUrl),n=St(e.realtimeBaseUrl),r=()=>t||Ct(),i=()=>n||r(),a=(e,t)=>kt(r(),e,t),o=(e,t)=>kt(i(),e,t);return{api:a,authenticatedAsset:(e,t)=>At(a(e,t)),auth:a,health:e=>a(`/health`,e),rawFile:(e,t)=>a(`/api/fs/raw`,{path:e,download:t?.download===!0||void 0,allowOutsideWorkspace:t?.allowOutsideWorkspace===!0||void 0,outsideFileGrant:t?.outsideFileGrant}),sse:(t,n)=>{let r=At(o(t,n));return Mt(`sse`,r,e)||r},websocket:(t,n)=>{let r=jt(At(o(t,n)),e);return Mt(`ws`,r,e)||r}}},Pt=Nt(),Ft=()=>Pt,It=e=>{Pt=e},Lt=e=>(Pt=Nt(e),Pt),Rt=`openchamber:runtime-endpoint-changed`,zt=``,Q=``,Bt=``,Vt=``,Ht=0,Ut=e=>Array.isArray(e)?`[${e.map(Ut).join(`,`)}]`:e&&typeof e==`object`?`{${Object.entries(e).sort(([e],[t])=>e.localeCompare(t)).map(([e,t])=>`${JSON.stringify(e)}:${Ut(t)}`).join(`,`)}}`:JSON.stringify(e)??`undefined`,Wt=e=>e?Object.entries(e).map(([e,t])=>[e.trim().toLowerCase(),t]).filter(([e])=>e.length>0).sort(([e],[t])=>e.localeCompare(t)):[],Gt=e=>Ut({apiBaseUrl:e.apiBaseUrl.replace(/\/+$/,``),clientToken:e.clientToken||null,runtimeKey:e.runtimeKey,requestHeaders:Wt(e.requestHeaders),relay:e.relay??null}),Kt=(e,t,n)=>{try{e[t]=n}catch{}},$=e=>{try{let t=new URL(e);return t.hash=``,t.search=``,t.pathname=t.pathname.replace(/\/+$/,``)||`/`,`url:${t.toString().replace(/\/+$/,``)}`}catch{return`url:${e.trim().replace(/\/+$/,``)||`default`}`}},qt=(e,t)=>t?`relay:${Ut({relayUrl:t.relayUrl,serverId:t.serverId,hostEncPubJwk:t.hostEncPubJwk})}`:`direct:${$(e)}`,Jt=e=>e.transportIdentityChanged??$(e.apiBaseUrl)!==$(e.previousApiBaseUrl),Yt=e=>e.runtimeKey!==e.previousRuntimeKey,Xt=()=>{if(typeof window>`u`)return``;let e=window.__OPENCHAMBER_API_BASE_URL__;return typeof e==`string`?e.trim():``},Zt=()=>{if(typeof window>`u`)return``;let e=window.__OPENCHAMBER_LOCAL_ORIGIN__;return typeof e==`string`?e.trim():``},Qt=(e,t)=>{if(!e||!t)return!1;try{return new URL(e).origin===new URL(t).origin}catch{return!1}},$t=()=>zt||Xt(),en=()=>Vt||qt($t()),tn=()=>Ht,nn=()=>{if(Q)return Q;let e=$t();return Qt(e,Zt())?`local`:$(e)},rn=(e={})=>{if(zt||Q)return;let t=e.apiBaseUrl?.trim()||Xt();t&&(zt=t,Q=e.runtimeKey?.trim()||(Qt(t,Zt())?`local`:$(t)),Vt=qt(t,null))},an=e=>{let t=e.apiBaseUrl.trim(),n=$t(),r=nn(),i=$(t)===$(n),a=e.runtimeKey?.trim()||(i?r:$(t)),o=Gt({...e,apiBaseUrl:t,runtimeKey:a});if(o===Bt)return;let s=en(),c=qt(t,e.relay),l=c!==s;if(Bt=o,Vt=c,l&&(Ht+=1),zt=t,Q=a,typeof window<`u`){let n=window;Kt(n,`__OPENCHAMBER_API_BASE_URL__`,t),Kt(n,`__OPENCHAMBER_CLIENT_TOKEN__`,e.clientToken||void 0),Kt(n,`__OPENCHAMBER_RUNTIME_HEADERS__`,e.requestHeaders||void 0)}Lt({apiBaseUrl:t,realtimeBaseUrl:t}),Qe(e.requestHeaders||null),Ze(e.clientToken||null),e.relay?Ie(e.relay):Me()&&(console.warn(`[runtime-switch] dropping active relay transport`,{runtimeKey:a,previousRuntimeKey:r,apiBaseUrl:t,relayServerId:Ne()?.serverId??null},Error(`relay dropped here`).stack),Re()),lt(t).catch(()=>{}),typeof window<`u`&&window.dispatchEvent(new CustomEvent(Rt,{detail:{apiBaseUrl:t,previousApiBaseUrl:n,runtimeKey:a,previousRuntimeKey:r,transportIdentityChanged:l}}))},on=e=>{if(typeof window>`u`)return()=>{};let t=t=>{e(t.detail)};return window.addEventListener(Rt,t),()=>window.removeEventListener(Rt,t)};export{Ae as A,Qe as C,Me as D,Ne as E,F as M,I as N,Pe as O,Ze as S,Le as T,He as _,rn as a,ut as b,on as c,Nt as d,Ft as f,Y as g,yt as h,en as i,Se as j,Fe as k,an as l,_t as m,tn as n,Jt as o,It as p,nn as r,Yt as s,$t as t,Lt as u,et as v,vt as w,lt as x,$e as y};
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/vendor-capacitor-app-PzT84wSx.js","assets/rolldown-runtime-C0FnF6B9.js","assets/vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{C as e,S as t,a as n,b as r,d as i,f as a,p as o,u as s,x as c,y as l}from"./runtime-switch-BkpTTbEi.js";import{Ft as u,It as d,et as f}from"./persistence-w-AiX2i4.js";import{t as ee}from"./desktopRelayRestore-8pvI_dSc.js";import{$ as te,A as ne,B as re,Ct as ie,D as ae,E as oe,F as se,H as ce,I as le,J as ue,L as de,M as fe,N as pe,P as me,Q as he,R as ge,S as _e,T as ve,U as ye,V as be,W as xe,X as Se,Y as p,Z as Ce,_ as we,_t as Te,a as Ee,at as De,b as Oe,bt as ke,c as Ae,ct as je,d as Me,dt as m,et as h,f as g,ft as _,g as v,gt as y,h as b,ht as x,i as Ne,j as Pe,k as Fe,l as Ie,lt as Le,m as Re,mt as ze,n as S,nt as Be,o as Ve,ot as He,p as Ue,pt as We,q as Ge,s as Ke,st as qe,t as Je,tt as Ye,u as Xe,ut as Ze,v as C,vt as Qe,x as w,y as $e,yt as T}from"./platform-4eCmsdol.js";import{n as E,o as D}from"./vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js";import{a as et,c as tt,l as nt,n as rt,r as it,s as at,t as ot}from"./terminalApi-CGtOtc8I.js";import{t as O}from"./types-BuiqMmh_.js";import{n as k,t as A}from"./capgoAdapter-DCowZ2ab.js";(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var st=e=>{let t=e?.retry;return{maxRetries:t?.maxRetries??3,initialRetryDelay:t?.initialDelayMs??1e3,maxRetryDelay:t?.maxDelayMs??8e3,connectionTimeout:e?.connectionTimeoutMs??1e4}},ct=()=>({async createSession(e){return it(e)},connect(e,t,n){let r=rt(e,t.onEvent,t.onError,st(n));return{close:()=>r()}},async sendInput(e,t){await nt(e,t)},async resize(e){await at(e.sessionId,e.cols,e.rows)},async close(e){await ot(e)},async restartSession(e,t){return tt(e,{cwd:t.cwd??``,cols:t.cols,rows:t.rows})},async forceKill(e){await et(e)}}),lt=()=>({checkIsGitRepository:Ae,getGitStatus:de,getGitDiff:pe,getGitFileDiff:me,revertGitFile:He,stageGitFile:Le,stageGitFiles:Ze,unstageGitFile:x,unstageGitFiles:y,stageGitHunk:m,unstageGitHunk:Te,revertGitHunk:qe,isLinkedWorktree:Ge,getGitBranches:fe,deleteGitBranch:$e,deleteRemoteBranch:_e,removeRemote:h,generateCommitMessage:oe,generatePullRequestDescription:ae,listGitWorktrees:p,validateGitWorktree:T,createGitWorktree:C,deleteGitWorktree:w,validateWorktreeDirectory:ke,canonicalizeWorktreeState:Ke,createGitCommit(e,t,n){return v(e,t,n)},gitPush:ye,gitPull:ce,gitFetch:be,listGitStashes:ue,countGitStashFiles:Re,stashGitChanges:We,applyGitStash:Ve,popGitStash:Ce,dropGitStash:ve,checkoutBranch:Ie,createBranch:b,renameBranch:Ye,getGitLog(e,t){return le(e,t)},getCommitFiles:Fe,getCurrentGitIdentity:Pe,hasLocalIdentity:xe,setGitIdentity:je,getGitIdentities:se,createGitIdentity:we,updateGitIdentity:Qe,deleteGitIdentity:Oe,getRemotes:re,rebase:te,abortRebase:Ee,continueRebase:Ue,merge:Se,abortMerge:Ne,continueMerge:g,checkoutCommit:Xe,cherryPick:Me,revertCommit:De,resetToCommit:Be,stash:_,stashPop:ze,getConflictDetails:ne,worktree:{list:p,validate:T,bootstrapStatus:ge,preview:he,create:C,remove:w}}),j=e=>e.replace(/\\/g,`/`),ut=(e,t)=>({directory:j(t?.directory||t?.path||e),entries:(Array.isArray(t?.entries)?t.entries:[]).filter(e=>!!(e&&typeof e.name==`string`&&typeof e.path==`string`)).map(e=>({name:e.name,path:j(e.path),isDirectory:!!e.isDirectory}))}),M=(e,t)=>{let n=t||e?.();return n?{"x-opencode-directory":n}:void 0},dt=({getDirectory:e})=>({async listDirectory(t,n){let r=j(t),i=new URLSearchParams;r&&i.set(`path`,r),n?.respectGitignore&&i.set(`respectGitignore`,`true`);let a=await d(`/api/fs/list`,{query:i,headers:M(e)});if(!a.ok){let e=await a.json().catch(()=>({error:a.statusText}));throw Error(e.error||`Failed to list directory`)}return ut(r,await a.json())},async search(t){let n=new URLSearchParams,r=j(t.directory);r&&n.set(`directory`,r),n.set(`query`,t.query),n.set(`dirs`,`false`),n.set(`type`,`file`),typeof t.maxResults==`number`&&Number.isFinite(t.maxResults)&&n.set(`limit`,String(t.maxResults));let i=await d(`/api/find/file`,{query:n,headers:M(e)});if(!i.ok){let e=await i.json().catch(()=>({error:i.statusText}));throw Error(e.error||`Failed to search files`)}let a=await i.json();return(Array.isArray(a)?a:[]).map(e=>({path:j(`${r}/${e}`),preview:[j(e)]}))},async createDirectory(t){let n=j(t),r=await d(`/api/fs/mkdir`,{method:`POST`,headers:{"Content-Type":`application/json`,...M(e)},body:JSON.stringify({path:n})});if(!r.ok){let e=await r.json().catch(()=>({error:r.statusText}));throw Error(e.error||`Failed to create directory`)}let i=await r.json();return{success:!!i?.success,path:typeof i?.path==`string`?j(i.path):n}},async statFile(t,n){let r=j(t),i=new URLSearchParams({path:r});n?.allowOutsideWorkspace&&i.set(`allowOutsideWorkspace`,`true`),n?.outsideFileGrant&&i.set(`outsideFileGrant`,n.outsideFileGrant);let a=await d(`/api/fs/stat`,{query:i,headers:M(e,n?.directory)});if(!a.ok){let e=await a.json().catch(()=>({error:a.statusText}));throw Error(e.error||`Failed to stat file`)}let o=await a.json().catch(()=>({}));return{path:typeof o.path==`string`?j(o.path):r,isFile:!!o.isFile,size:typeof o.size==`number`?o.size:0,mtimeMs:typeof o.mtimeMs==`number`?o.mtimeMs:void 0,isBinary:typeof o.isBinary==`boolean`?o.isBinary:void 0}},async readFile(t,n){let r=j(t),i=new URLSearchParams({path:r});n?.allowOutsideWorkspace&&i.set(`allowOutsideWorkspace`,`true`),n?.outsideFileGrant&&i.set(`outsideFileGrant`,n.outsideFileGrant),n?.optional&&i.set(`optional`,`true`);let a=await d(`/api/fs/read`,{query:i,cache:n?.optional?`no-store`:`default`,headers:M(e,n?.directory)});if(!a.ok){let e=await a.json().catch(()=>({error:a.statusText}));throw Error(e.error||`Failed to read file`)}let o=await a.text();if(n?.optional){let e=a.headers.get(`x-openchamber-file-exists`);if(e!==`true`&&e!==`false`)throw Error(`Optional file read requires an existence response header`);return{content:o,path:r,exists:e===`true`}}return{content:o,path:r,exists:!0}},async writeFile(t,n){let r=j(t),i=await d(`/api/fs/write`,{method:`POST`,headers:{"Content-Type":`application/json`,...M(e)},body:JSON.stringify({path:r,content:n})});if(!i.ok){let e=await i.json().catch(()=>({error:i.statusText}));throw Error(e.error||`Failed to write file`)}let a=await i.json().catch(()=>({}));return{success:!!a.success,path:typeof a.path==`string`?j(a.path):r}},async delete(t){let n=j(t),r=await d(`/api/fs/delete`,{method:`POST`,headers:{"Content-Type":`application/json`,...M(e)},body:JSON.stringify({path:n})});if(!r.ok){let e=await r.json().catch(()=>({error:r.statusText}));throw Error(e.error||`Failed to delete file`)}return{success:!!(await r.json().catch(()=>({}))).success}},async rename(t,n){let r=await d(`/api/fs/rename`,{method:`POST`,headers:{"Content-Type":`application/json`,...M(e)},body:JSON.stringify({oldPath:t,newPath:n})});if(!r.ok){let e=await r.json().catch(()=>({error:r.statusText}));throw Error(e.error||`Failed to rename file`)}let i=await r.json().catch(()=>({}));return{success:!!i.success,path:typeof i.path==`string`?j(i.path):n}},async revealPath(t){let n=await d(`/api/fs/reveal`,{method:`POST`,headers:{"Content-Type":`application/json`,...M(e)},body:JSON.stringify({path:j(t)})});if(!n.ok){let e=await n.json().catch(()=>({error:n.statusText}));throw Error(e.error||`Failed to reveal path`)}return{success:!!(await n.json().catch(()=>({}))).success}},async downloadFile(t){let n=j(t),r=await d(`/api/fs/raw`,{query:{path:n,download:!0},headers:M(e)});if(!r.ok)throw Error(`Download failed (${r.status})`);let i=await r.blob(),a=URL.createObjectURL(i),o=document.createElement(`a`);o.href=a,o.download=n.split(`/`).pop()||`file`,document.body.appendChild(o),o.click(),document.body.removeChild(o),setTimeout(()=>URL.revokeObjectURL(a),100)}}),N=`/api/config/settings`,ft=`/api/config/reload`,P=e=>!e||typeof e!=`object`?{}:e,pt=()=>({async load(){let e=await d(N,{method:`GET`,headers:{Accept:`application/json`}});if(!e.ok)throw Error(`Failed to load settings: ${e.statusText}`);return{settings:P(await e.json().catch(()=>({}))),source:`web`}},async save(e){let t=await d(N,{method:`PUT`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify(e)});if(!t.ok){let e=await t.json().catch(()=>({error:t.statusText}));throw Error(e.error||`Failed to save settings`)}return P(await t.json().catch(()=>({})))},async restartOpenCode(){let e=await d(ft,{method:`POST`});if(!e.ok){let t=await e.json().catch(()=>({error:e.statusText}));throw Error(t.error||`Failed to restart OpenCode`)}return{restarted:!0}}}),mt=()=>({async requestDirectoryAccess(e){return{success:!0,path:e.path}},async startAccessingDirectory(e){return{success:!0}},async stopAccessingDirectory(e){return{success:!0}}}),ht=1500,F=5e3,gt=`openchamber-notification-claim:`,I=new Map,_t=()=>typeof document>`u`||document.visibilityState===`visible`&&document.hasFocus(),vt=e=>(typeof e?.tag==`string`?e.tag.trim():``)||[e?.sessionId,e?.kind,e?.title,e?.body].filter(e=>typeof e==`string`&&e.trim().length>0).map(e=>e.trim()).join(`|`),yt=e=>{for(let[t,n]of I)e-n>F&&I.delete(t)},bt=e=>{let t=vt(e);if(!t)return!0;let n=Date.now();if(yt(n),n-(I.get(t)??0)<F)return!1;try{if(typeof window<`u`&&window.localStorage){let e=`${gt}${t}`,r=Number(window.localStorage.getItem(e)??`0`);if(Number.isFinite(r)&&n-r<F)return I.set(t,r),!1;Number.isFinite(r)&&r>0&&window.localStorage.removeItem(e),window.localStorage.setItem(e,String(n))}}catch{}return I.set(t,n),!0},L=async()=>{if(typeof navigator>`u`||!(`serviceWorker`in navigator))return null;let e=null;try{e=await navigator.serviceWorker.getRegistration()??null}catch{e=null}if(e?.active)return e;if(!e)return null;try{return await Promise.race([navigator.serviceWorker.ready,new Promise(e=>{setTimeout(()=>e(null),ht)})])??e}catch{return e}},xt=async e=>{let t=await L();if(!t||typeof t.showNotification!=`function`)return!1;try{return await t.showNotification(e?.title??`OpenChamber`,{body:e?.body,tag:e?.tag}),!0}catch(e){return console.warn(`Failed to send notification via service worker`,e),!1}},St=async()=>{let e=await L();if(!e||!(`pushManager`in e)||!e.pushManager)return!1;try{return!!await e.pushManager.getSubscription()}catch{return!1}},Ct=async e=>{if(e?.requireHidden&&typeof document<`u`&&document.hasFocus())return!0;if(typeof Notification>`u`)return!1;if(Notification.permission==="default"&&await Notification.requestPermission()!==`granted`||Notification.permission!==`granted`)return console.warn(`Notification permission not granted`),!1;if(!_t()&&await St()||!bt(e))return!0;try{return await xt(e)||new Notification(e?.title??`OpenChamber`,{body:e?.body,tag:e?.tag}),!0}catch(e){return console.warn(`Failed to send notification`,e),!1}},wt=async e=>{if(typeof window>`u`)return!1;let t=window.__OPENCHAMBER_DESKTOP__;if(!t?.invoke)return!1;try{return await t.invoke(`desktop_notify`,{payload:{title:e?.title,body:e?.body,tag:e?.tag,kind:e?.kind,sessionId:e?.sessionId,directory:e?.directory,requireHidden:e?.requireHidden}}),!0}catch(e){return console.warn(`Failed to send native notification (desktop)`,e),!1}},Tt=()=>({async notifyAgentCompletion(e){return await wt(e)||await Ct(e)},canNotify:()=>typeof window<`u`&&window.__OPENCHAMBER_DESKTOP__?.invoke?!0:typeof Notification<`u`&&Notification.permission===`granted`}),Et=()=>({async getAvailableTools(){let e=await d(`/api/experimental/tool/ids`);if(!e.ok)throw Error(`Tools API returned ${e.status} ${e.statusText}`);let t=await e.json();if(!Array.isArray(t))throw Error(`Tools API returned invalid data format`);return t.filter(e=>typeof e==`string`&&e!==`invalid`).sort()}}),R=async(e,t)=>{try{let n=await d(e,{...t,credentials:`include`,headers:{Accept:`application/json`,...t?.headers??{}}});return n.ok?await n.json():null}catch{return null}},Dt=()=>({async getVapidPublicKey(){return R(`/api/push/vapid-public-key`)},async subscribe(e){return R(`/api/push/subscribe`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})},async unsubscribe(e){return R(`/api/push/subscribe`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})},async setVisibility(e){return R(`/api/push/visibility`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e),keepalive:!0})},async registerApnsToken(e){return R(`/api/push/apns-token`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})},async unregisterApnsToken(e){return R(`/api/push/apns-token`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})},async registerLiveActivityToken(e){return R(`/api/push/live-activity-token`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})},async unregisterLiveActivityToken(e){return R(`/api/push/live-activity-token`,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e)})}}),z=async e=>await e.json().catch(()=>null),Ot=({urls:e})=>({async authStatus(){let e=await d(`/api/github/auth/status`,{method:`GET`,headers:{Accept:`application/json`}}),t=await z(e);if(!e.ok||!t)throw Error(t?.error||e.statusText||`Failed to load GitHub status`);return t},async authStart(){let e=await d(`/api/github/auth/start`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify({})}),t=await z(e);if(!e.ok||!t||!(`deviceCode`in t))throw Error(t?.error||e.statusText||`Failed to start GitHub auth`);return t},async authComplete(e){let t=await d(`/api/github/auth/complete`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify({deviceCode:e})}),n=await z(t);if(!t.ok||!n)throw Error(n?.error||t.statusText||`Failed to complete GitHub auth`);return n},async authDisconnect(){let e=await d(`/api/github/auth`,{method:`DELETE`,headers:{Accept:`application/json`}}),t=await z(e);if(!e.ok)throw Error(t?.error||e.statusText||`Failed to disconnect GitHub`);return{removed:!!t?.removed}},async authActivate(e){let t=await d(`/api/github/auth/activate`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify({accountId:e})}),n=await z(t);if(!t.ok||!n)throw Error(n?.error||t.statusText||`Failed to activate GitHub account`);return n},async authSetGhCliDisabled(e){let t=await d(`/api/github/auth/gh-cli`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify({disabled:e})}),n=await z(t);if(!t.ok||!n)throw Error(n?.error||t.statusText||`Failed to update gh CLI setting`);return{disabled:!!n.disabled}},async me(){let e=await d(`/api/github/me`,{method:`GET`,headers:{Accept:`application/json`}}),t=await z(e);if(!e.ok||!t)throw Error(t?.error||e.statusText||`Failed to fetch GitHub user`);return t},async prStatus(e,t,n,r){let i=new URLSearchParams({directory:e,branch:t,...n?{remote:n}:{},...r?.force?{force:`true`}:{}}),a=await d(`/api/github/pr/status?${i.toString()}`,{method:`GET`,headers:{Accept:`application/json`}}),o=await z(a);if(!a.ok||!o)throw Error(o?.error||a.statusText||`Failed to load PR status`);return o},async prCreate(e){let t=await d(`/api/github/pr/create`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify(e)}),n=await z(t);if(!t.ok||!n)throw Error(n?.error||t.statusText||`Failed to create PR`);return n},async prUpdate(e){let t=await d(`/api/github/pr/update`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify(e)}),n=await z(t);if(!t.ok||!n)throw Error(n?.error||t.statusText||`Failed to update PR`);return n},async prMerge(e){let t=await d(`/api/github/pr/merge`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify(e)}),n=await z(t);if(!t.ok||!n)throw Error(n?.error||t.statusText||`Failed to merge PR`);return n},async prReady(e){let t=await d(`/api/github/pr/ready`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify(e)}),n=await z(t);if(!t.ok||!n)throw Error(n?.error||t.statusText||`Failed to mark PR ready`);return n},async repoUpstream(e){let t=await d(`/api/github/repo/upstream?directory=${encodeURIComponent(e)}`,{method:`GET`,headers:{Accept:`application/json`}}),n=await z(t);if(!t.ok||!n)throw Error(n?.error||t.statusText||`Failed to detect upstream repo`);return n},async repoBranches(e,t){let n=await d(`/api/github/repo/branches?owner=${encodeURIComponent(e)}&repo=${encodeURIComponent(t)}`,{method:`GET`,headers:{Accept:`application/json`}}),r=await z(n);if(!n.ok||!r)throw Error(r?.error||n.statusText||`Failed to fetch repo branches`);return r.branches??[]},async prsList(e,t){let n=t?.page??1,r=new URLSearchParams({directory:e,page:String(n)});t?.query&&r.set(`query`,t.query);let i=await d(`/api/github/pulls/list?${r.toString()}`,{method:`GET`,headers:{Accept:`application/json`}}),a=await z(i);if(!i.ok||!a)throw Error(a?.error||i.statusText||`Failed to load pull requests`);return a},async prContext(t,n,r){let i=new URLSearchParams({directory:t,number:String(n)});r?.includeDiff&&i.set(`diff`,`1`),r?.includeCheckDetails&&i.set(`checkDetails`,`1`),r?.sourceRepo?.owner&&r.sourceRepo.repo&&(i.set(`owner`,r.sourceRepo.owner),i.set(`repo`,r.sourceRepo.repo));let a=await d(e.api(`/api/github/pulls/context`,i),{method:`GET`,headers:{Accept:`application/json`}}),o=await z(a);if(!a.ok||!o)throw Error(o?.error||a.statusText||`Failed to load pull request context`);return o},async issuesList(e,t){let n=t?.page??1,r=new URLSearchParams({directory:e,page:String(n)});t?.query&&r.set(`query`,t.query);let i=await d(`/api/github/issues/list?${r.toString()}`,{method:`GET`,headers:{Accept:`application/json`}}),a=await z(i);if(!i.ok||!a)throw Error(a?.error||i.statusText||`Failed to load issues`);return a},async issueGet(t,n,r){let i=new URLSearchParams({directory:t,number:String(n)});r?.sourceRepo?.owner&&r.sourceRepo.repo&&(i.set(`owner`,r.sourceRepo.owner),i.set(`repo`,r.sourceRepo.repo));let a=await d(e.api(`/api/github/issues/get`,i),{method:`GET`,headers:{Accept:`application/json`}}),o=await z(a);if(!a.ok||!o)throw Error(o?.error||a.statusText||`Failed to load issue`);return o},async issueComments(t,n,r){let i=new URLSearchParams({directory:t,number:String(n)});r?.sourceRepo?.owner&&r.sourceRepo.repo&&(i.set(`owner`,r.sourceRepo.owner),i.set(`repo`,r.sourceRepo.repo));let a=await d(e.api(`/api/github/issues/comments`,i),{method:`GET`,headers:{Accept:`application/json`}}),o=await z(a);if(!a.ok||!o)throw Error(o?.error||a.statusText||`Failed to load issue comments`);return o}}),B=async e=>await e.json().catch(()=>null),kt=()=>({async listClients(){let e=await d(`/api/client-auth/clients`,{method:`GET`,headers:{Accept:`application/json`}}),t=await B(e);if(!e.ok||!t)throw Error(t?.error||e.statusText||`Failed to load remote clients`);return Array.isArray(t.clients)?t.clients:[]},async createClient(e={}){let t=await d(`/api/client-auth/clients`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify({label:e.label??``})}),n=await B(t);if(!t.ok||!n?.client||typeof n.token!=`string`)throw Error(n?.error||t.statusText||`Failed to create remote client token`);return n},async createPairingSession(e={}){let t=await d(`/api/client-auth/pairing/sessions`,{method:`POST`,headers:{"Content-Type":`application/json`,Accept:`application/json`},body:JSON.stringify({label:e.label??``,...e.allowedClientKinds?{allowedClientKinds:e.allowedClientKinds}:{},...e.serverUrl?{serverUrl:e.serverUrl}:{},...typeof e.includeRelay==`boolean`?{includeRelay:e.includeRelay}:{},...typeof e.includeDirect==`boolean`?{includeDirect:e.includeDirect}:{},...e.relayUrl?{relayUrl:e.relayUrl}:{}})}),n=await B(t);if(!t.ok||typeof n?.pairing?.secret!=`string`||!n?.server)throw Error(n?.error||t.statusText||`Failed to create pairing session`);return n},async listPendingPairings(){let e=await d(`/api/client-auth/pairing/sessions`,{method:`GET`,headers:{Accept:`application/json`}}),t=await B(e);if(!e.ok||!t)throw Error(t?.error||e.statusText||`Failed to load pending pairings`);return Array.isArray(t.pending)?t.pending:[]},async getPairingTransports(){let e=await d(`/api/client-auth/pairing/transports`,{method:`GET`,headers:{Accept:`application/json`}}),t=await B(e);if(!e.ok||!t)throw Error(t?.error||e.statusText||`Failed to load pairing transports`);return{local:t.local??null,lan:t.lan??null,relayAvailable:t.relayAvailable===!0,...typeof t.relayUrl==`string`?{relayUrl:t.relayUrl}:{},...typeof t.relayUrlLocked==`boolean`?{relayUrlLocked:t.relayUrlLocked}:{}}},async cancelPairing(e){let t=await d(`/api/client-auth/pairing/sessions/${encodeURIComponent(e)}`,{method:`DELETE`,headers:{Accept:`application/json`}}),n=await B(t);if(!t.ok||!n)throw Error(n?.error||t.statusText||`Failed to cancel pairing`);return{cancelled:n.cancelled===!0}},async revokeClient(e){let t=await d(`/api/client-auth/clients/${encodeURIComponent(e)}`,{method:`DELETE`,headers:{Accept:`application/json`}}),n=await B(t);if(!t.ok||!n)throw Error(n?.error||t.statusText||`Failed to revoke remote client`);return n},async purgeRevokedClients(){let e=await d(`/api/client-auth/clients`,{method:`DELETE`,headers:{Accept:`application/json`}}),t=await B(e);if(!e.ok||!t)throw Error(t?.error||e.statusText||`Failed to clear revoked clients`);return t}}),V=e=>typeof e==`object`&&!!e&&!Array.isArray(e),H=e=>typeof e==`number`&&Number.isFinite(e),At=e=>{if(!V(e)||typeof e.ok!=`boolean`)return!1;if(e.ok===!0)return V(e.session)&&typeof e.session.id==`string`&&typeof e.messageID==`string`;let t=e.phase;if(typeof t!=`string`)return!1;switch(t){case`validate`:return typeof e.error==`string`&&Array.isArray(e.errors)&&e.errors.every(e=>typeof e==`string`);case`create`:return!(typeof e.error!=`string`||`status`in e&&e.status!==void 0&&!H(e.status));case`prompt`:return V(e.session)&&typeof e.session.id==`string`&&typeof e.messageID==`string`&&typeof e.ambiguous==`boolean`&&typeof e.error==`string`&&(!(`status`in e)||e.status===void 0||H(e.status));case`conflict`:return typeof e.error==`string`;case`unavailable`:return typeof e.error==`string`;case`internal`:return typeof e.error==`string`;default:return!1}},jt=()=>({async createWithPrompt(e,t){let n;try{n=await d(`/api/openchamber/conversations`,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(e),signal:t})}catch{throw Error(`Conversation request failed`)}let r;try{r=await n.json()}catch{throw Error(`Unexpected server response: invalid JSON`)}if(!At(r))throw Error(`Unexpected server response: result shape mismatch`);return r}}),Mt=`https://openchamber.xiaobe.top/v1/mobile/update/check`,Nt=`https://openchamber-update.vercel.app/v1/mobile/update/check`,Pt=1e4,U=`openchamber.mobile-ota.device-id.v1`,W=e=>typeof e==`string`&&e.trim().length>0?e.trim():null,G=()=>{try{let e=E;return((typeof e.getConfig==`function`?e.getConfig():void 0)??e.config)?.OpenChamberOTA??{}}catch{return{}}},Ft=e=>e===`beta`||e===`stable`?e:G().channel===`stable`?`stable`:`beta`,It=()=>{let e=G().shellApiVersion;return typeof e==`number`&&Number.isFinite(e)&&e>0?Math.floor(e):1},Lt=()=>{let e=Je();if(e===`ios`||e===`android`)return e;try{let e=E.getPlatform();if(e===`ios`||e===`android`)return e}catch{}return`android`},Rt=()=>{if(typeof window>`u`)return null;try{return W(window.localStorage.getItem(U))}catch{return null}},K=e=>{if(!(typeof window>`u`))try{window.localStorage.setItem(U,e)}catch{}},zt=async e=>{if(e)try{let t=W((await e.getDeviceId()).deviceId);if(t)return K(t),t}catch{}let t=Rt();if(t)return t;let n=f();return K(n),n},Bt=async()=>{let e=W(`1.19.7-beta.10`);if(S())try{let{App:t}=await D(async()=>{let{App:e}=await import(`./vendor-capacitor-app-PzT84wSx.js`).then(e=>e.t);return{App:e}},__vite__mapDeps([0,1,2])),n=await t.getInfo(),r=W(n.version)??e??`0.0.0`,i=W(n.build),a=i?Number.parseInt(i,10):0;return{version:r,build:Number.isFinite(a)?a:0}}catch{}return{version:e??`0.0.0`,build:0}},q=(e,t,n)=>{let r=W(e?.version),i=W(t);if(n===`beta`&&i)return i;if(r&&r!==`builtin`)return i&&i!==r&&i.startsWith(`${r}-`)?i:r;let a=W(e?.id);return a&&a!==`builtin`?a:i??`builtin`},Vt=()=>W(`1.19.7-beta.10`),Ht=async(e,t)=>{let n=Vt();if(!e)return q(null,n,t);try{return q((await e.current()).bundle,n,t)}catch{return q(null,n,t)}},Ut=()=>[Mt,Nt],Wt=(e,t,n)=>{let r=e-n();return r<=0||t<=0?null:Math.max(1,Math.ceil(r/t))};async function Gt(e,t,n,r){try{if(S())try{let{CapacitorHttp:r}=await D(async()=>{let{CapacitorHttp:e}=await import(`./vendor-aparajita-capacitor-secure-storage-CjQdwfjS.js`).then(e=>e.i);return{CapacitorHttp:e}},__vite__mapDeps([2,1])),i=Object.fromEntries(new Headers(t.headers).entries()),a;if(typeof t.body==`string`)try{a=JSON.parse(t.body)}catch{a=t.body}let o=await Promise.race([r.request({url:e,method:t.method||`GET`,headers:i,data:a,connectTimeout:n,readTimeout:n}),new Promise(e=>{window.setTimeout(()=>e(null),n)})]);return o?{ok:o.status>=200&&o.status<300,status:o.status,json:async()=>{if(typeof o.data==`string`)try{return JSON.parse(o.data)}catch{return o.data}return o.data}}:null}catch{}let i=await r(e,{...t,signal:AbortSignal.timeout(n)});return{ok:i.ok,status:i.status,json:()=>i.json()}}catch{return null}}var J=e=>{if(!e||typeof e!=`object`)return!1;let t=e;return!(t.status!==`ok`||t.primaryAction!==`none`&&t.primaryAction!==`apply_ota`&&t.primaryAction!==`install_native_required`||!t.ota||typeof t.ota!=`object`||!t.native||typeof t.native!=`object`||typeof t.nextCheckInSec!=`number`||!Number.isFinite(t.nextCheckInSec))},Kt=e=>{let t=e;return t.isChannelRollback===!0||t.is_channel_rollback===!0?{...e,isChannelRollback:!0}:e};async function qt(e,t,n,r){let i=await Gt(e,{method:`POST`,headers:{Accept:`application/json`,"Content-Type":`application/json`},body:JSON.stringify(t)},n,r);if(!i?.ok)return null;let a;try{a=await i.json()}catch{return null}return J(a)?Kt(a):null}async function Jt(e={}){let t=e.updater===void 0?await A():e.updater;if(!t&&!S())throw new O;let n=e.fetchImpl??fetch,r=e.now??Date.now,i=Ft(e.channelOverride),[a,o,s]=await Promise.all([zt(t),Bt(),Ht(t,i)]),c={channel:i,platform:Lt(),deviceId:a,nativeVersion:o.version,nativeBuild:o.build,shellApiVersion:It(),currentBundleId:s},l=Ut(),u=r()+Pt,d=null;for(let[e,t]of l.entries()){let i=Wt(u,l.length-e,r);if(i===null)break;try{let e=await qt(t,c,i,n);if(e)return e;d=Error(`Mobile OTA check failed at ${t}`)}catch(e){d=e instanceof Error?e:Error(`Mobile OTA check failed`)}}throw d??Error(`Unable to check for mobile OTA updates`)}async function Yt(e){let t=await A();if(!t)return null;try{let{bundles:n}=await t.list();return n.find(t=>t.checksum===e.checksum&&t.version===e.releaseVersion&&(t.status===`success`||t.status===`pending`))?.id??null}catch{return null}}async function Xt(e){let t=await A();if(!t)throw new O;return(await t.download({url:e.url,version:e.releaseVersion,checksum:e.checksum,...e.sessionKey?{sessionKey:e.sessionKey}:{}})).id}async function Zt(){let e=await A();if(!e)throw new O;await e.reload()}async function Qt(e){let t=await A();if(!t)throw new O;await t.next({id:e})}var Y=null,X=e=>typeof e==`string`&&e.trim().length>0?e.trim():null,Z=async()=>{let e=X(`1.19.7-beta.10`);try{if(E.isNativePlatform()){let{App:t}=await D(async()=>{let{App:e}=await import(`./vendor-capacitor-app-PzT84wSx.js`).then(e=>e.t);return{App:e}},__vite__mapDeps([0,1,2]));return X((await t.getInfo()).version)??e??`unknown`}}catch{}return e??`unknown`},$t=()=>({async checkForOtaUpdate(e){if(!k()&&!E.isNativePlatform())throw new O;return Jt(e?.channelOverride?{channelOverride:e.channelOverride}:{})},async downloadOtaUpdate(e){if(!k())throw new O;let t=await Yt(e);return t?(Y=t,{skipped:!0}):(Y=await Xt(e),{skipped:!1})},async applyOtaUpdateNow(){if(!k())throw new O;await Zt()},async queueOtaUpdateForNextLaunch(){if(!k())throw new O;let e=Y;if(!e)throw Error(`No downloaded OTA bundle to queue`);await Qt(e)},async getOtaStatus(){if(!k())return{supported:!1,currentBundleId:`builtin`,nativeVersion:await Z()};let e=await A();if(!e)return{supported:!1,currentBundleId:`builtin`,nativeVersion:await Z()};try{let[t,n]=await Promise.all([e.current(),Z()]);return{supported:!0,currentBundleId:X(t.bundle?.id)||`builtin`,nativeVersion:n}}catch{return{supported:!0,currentBundleId:`builtin`,nativeVersion:await Z()}}}}),en=()=>({api:(...e)=>a().api(...e),authenticatedAsset:(...e)=>a().authenticatedAsset(...e),auth:(...e)=>a().auth(...e),health:(...e)=>a().health(...e),rawFile:(...e)=>a().rawFile(...e),sse:(...e)=>a().sse(...e),websocket:(...e)=>a().websocket(...e)}),tn=(e={})=>{let t=e.urls??i();o(t);let n=en();return{runtime:{platform:`web`,isDesktop:!1,isVSCode:!1,label:`web`},terminal:ct(),git:lt(),files:dt({urls:n,getDirectory:()=>ie.getState().currentDirectory}),settings:pt(),permissions:mt(),notifications:Tt(),github:Ot({urls:n}),push:Dt(),mobileUpdates:$t(),clientAuth:kt(),tools:Et(),conversations:jt()}},Q=(e,t)=>{if(!e||!t)return!1;try{return new URL(e).origin===new URL(t).origin}catch{return!1}},$=Promise.resolve(),nn=()=>$,rn=()=>{let i=typeof window.__OPENCHAMBER_API_BASE_URL__==`string`?window.__OPENCHAMBER_API_BASE_URL__.trim():``,a=typeof window.__OPENCHAMBER_CLIENT_TOKEN__==`string`?window.__OPENCHAMBER_CLIENT_TOKEN__.trim():``,o=typeof window.__OPENCHAMBER_LOCAL_ORIGIN__==`string`?window.__OPENCHAMBER_LOCAL_ORIGIN__.trim():``,d=s({apiBaseUrl:i||void 0,realtimeBaseUrl:i||void 0});n({apiBaseUrl:i,runtimeKey:Q(i,o)?`local`:null}),t(a||null),e(window.__OPENCHAMBER_RUNTIME_HEADERS__||null),c(i||void 0).catch(()=>{}),o&&!Q(i,o)&&Object.keys(l()).length>0&&r(o).catch(()=>{}),u();let f=window.__OPENCHAMBER_RELAY_HOST_ID__;return $=Promise.race([ee(typeof f==`string`&&f?f:void 0).catch(()=>{}),new Promise(e=>{window.setTimeout(e,1e4)})]),tn({urls:d})};export{nn as n,rn as t};
|