sliccy 3.42.1 → 3.43.0
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/ui/assets/{adobe-CFs49Ldo.js → adobe-BI2uhnZD.js} +1 -1
- package/dist/ui/assets/{adobe-6HAbKcn4.js → adobe-D4iM7Aw8.js} +2 -2
- package/dist/ui/assets/{agent-bridge-CaTifIJb.js → agent-bridge-Dd35hIPg.js} +1 -1
- package/dist/ui/assets/{agent-message-to-chat-DBdPeIAw.js → agent-message-to-chat-CGvMvbsx.js} +1 -1
- package/dist/ui/assets/{apps-C9HoJRHu.js → apps-CoufI6eq.js} +1 -1
- package/dist/ui/assets/{azure-openai-gbSUirDq.js → azure-openai-BRqLYWJW.js} +1 -1
- package/dist/ui/assets/{azure-openai-BUupHoQH.js → azure-openai-Bm7ozlSw.js} +1 -1
- package/dist/ui/assets/{bsh-watchdog-D760c-sw.js → bsh-watchdog-CpraCmMu.js} +1 -1
- package/dist/ui/assets/{cdp-DNq0N1OZ.js → cdp-C3KWUTPR.js} +3 -3
- package/dist/ui/assets/{connect-surface-1FUWatlV.js → connect-surface-J-fSGdR1.js} +1 -1
- package/dist/ui/assets/cost-command-BgI4Vpod.js +1 -0
- package/dist/ui/assets/{dist-D7Q91ot4.js → dist-B9EVsbsZ.js} +1 -1
- package/dist/ui/assets/{dist-BCLHnlgq.js → dist-_zbq8hcL.js} +1 -1
- package/dist/ui/assets/{es-N4-H4LyA.js → es-T65byM7G.js} +1 -1
- package/dist/ui/assets/{follower-sprinkle-bridge-C-chIyWh.js → follower-sprinkle-bridge-fXFMQvbu.js} +1 -1
- package/dist/ui/assets/{fs-B_Yiw-gA.js → fs-CVaO9nmT.js} +1 -1
- package/dist/ui/assets/{github-DXENDyDm.js → github-5Avk8m6S.js} +1 -1
- package/dist/ui/assets/{github-YMmsRSa5.js → github-aQjNbW79.js} +2 -2
- package/dist/ui/assets/{github-copilot-BexWH_uC.js → github-copilot-DQmwWqa0.js} +1 -1
- package/dist/ui/assets/{github-copilot-CTrj2O90.js → github-copilot-DaqobM8h.js} +1 -1
- package/dist/ui/assets/{kernel-worker-D9uT30rZ.js → kernel-worker-Db4cVMp1.js} +1119 -900
- package/dist/ui/assets/{lick-ws-bridge-CjOXgOAC.js → lick-ws-bridge-ulNyrPpu.js} +1 -1
- package/dist/ui/assets/{local-llm-DtrX5Uni.js → local-llm-DwN2IGO6.js} +1 -1
- package/dist/ui/assets/{magick-wasm-vsfBoBVf.js → magick-wasm-BvCVfok4.js} +1 -1
- package/dist/ui/assets/{main-COPO1-7A.js → main-NTOoEKjL.js} +8 -8
- package/dist/ui/assets/{main-cherry-CIlo3nad.js → main-cherry-B6JzfsA7.js} +1 -1
- package/dist/ui/assets/{migration-run-B4a5MEYh.js → migration-run-BgWD9oib.js} +1 -1
- package/dist/ui/assets/{mount-C4eQjArH.js → mount-yzoftHrR.js} +1 -1
- package/dist/ui/assets/{nuke-command-BpUsw-m7.js → nuke-command-D9-dbCYJ.js} +1 -1
- package/dist/ui/assets/{oauth-bootstrap-rJr6mJXj.js → oauth-bootstrap-CNdKZr46.js} +2 -2
- package/dist/ui/assets/{oauth-service-BbkAikCT.js → oauth-service-CziAqQV_.js} +1 -1
- package/dist/ui/assets/{onboarding-orchestrator-o71LxZLt.js → onboarding-orchestrator-B-FnIFwe.js} +1 -1
- package/dist/ui/assets/{openai-codex-CAuyH7cW.js → openai-codex-ARoxTqWI.js} +1 -1
- package/dist/ui/assets/{openai-codex-DndhWwHW.js → openai-codex-B2PPPq0K.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-AngexUJX.js → panel-rpc-handlers-LgGlb81w.js} +1 -1
- package/dist/ui/assets/{provider-wF_CzaeE.js → provider-BZaypnYm.js} +2 -2
- package/dist/ui/assets/{provider-CF53ENSZ.js → provider-DqeIN53r.js} +1 -1
- package/dist/ui/assets/{provider-settings-gNr8eGBz.js → provider-settings-CSKMTOfj.js} +2 -2
- package/dist/ui/assets/provider-store-access-BdiDIUwb.js +1 -0
- package/dist/ui/assets/provider-store-access-CFbgFYCq.js +1 -0
- package/dist/ui/assets/{providers-BPe5laJG.js → providers-DJ6UMUQK.js} +1 -1
- package/dist/ui/assets/{proxied-fetch-B_AGBn4c.js → proxied-fetch-D0DbPyX7.js} +1 -1
- package/dist/ui/assets/py-realm-worker-C75JGmXR.js +242 -0
- package/dist/ui/assets/{remote-terminal-view-CP8Lf876.js → remote-terminal-view-BD8JYN10.js} +1 -1
- package/dist/ui/assets/{store-BS4j8ZLu.js → store-BG1A0wUL.js} +1 -1
- package/dist/ui/assets/{sudo-DSdWsBdi.js → sudo-DoBsq3Yd.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-D89qWVP0.js → tray-leave-runtime-DgIZ0HrD.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-DrqwHzzN.js → upgrade-detection-BCqBtcxT.js} +1 -1
- package/dist/ui/assets/{xai-grok-BdtGxsQM.js → xai-grok-C1pU_6Zh.js} +1 -1
- package/dist/ui/assets/{xai-grok-BQ9_isXE.js → xai-grok-CHCF8XFi.js} +1 -1
- package/dist/ui/index.html +1 -1
- package/dist/ui/packages/webapp/index.html +1 -1
- package/package.json +1 -1
- package/dist/ui/assets/cost-command-Dra1U3jF.js +0 -1
- package/dist/ui/assets/provider-store-access-B3i7FLFm.js +0 -1
- package/dist/ui/assets/provider-store-access-BR8F8wd6.js +0 -1
- package/dist/ui/assets/py-realm-worker-DvbMqvZQ.js +0 -23
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{t as e}from"./logger-DDBAeTLF.js";import{a as t}from"./main-
|
|
1
|
+
import{t as e}from"./logger-DDBAeTLF.js";import{a as t}from"./main-NTOoEKjL.js";var n=e(`sudo-suggest`),r=[`You generalize a single shell command into a minimal glob pattern for an`,`allow-list rule. Output ONLY the pattern on one line — no prose, no quotes,`,`no backticks. Keep the leading command/sub-command verbatim and replace only`,`the volatile tail (args, paths, refs) with a single trailing "*".`,`Examples:`,` git push origin main -> git push*`,` rm -rf build/cache -> rm -rf*`,` npm install left-pad -> npm install*`].join(`
|
|
2
2
|
`),i=[`You generalize a single filesystem path into a minimal glob pattern for an`,`allow-list rule. Output ONLY the pattern on one line — no prose, no quotes,`,`no backticks. Keep the meaningful directory prefix and replace the volatile`,`leaf (and below) with "**". Examples:`,` /workspace/.git/config -> /workspace/.git/**`,` /shared/secrets/openai.key -> /shared/secrets/**`,` /workspace/src/app/main.ts -> /workspace/src/**`].join(`
|
|
3
3
|
`);async function a(e,a){if(e.suggestedPattern&&e.suggestedPattern.trim().length>0)return e.suggestedPattern.trim();let s=e.detail.trim(),c=e.kind===`command`?r:i,l=null;try{l=await t({prompt:s,system:c,maxTokens:40,temperature:0,signal:a})}catch(e){n.debug(`suggestPattern: quickLabel threw`,{error:e instanceof Error?e.message:String(e)}),l=null}return o(l)||s}function o(e){if(!e)return null;let t=(e.split(`
|
|
4
4
|
`,1)[0]?.trim()??``).replace(/^`+/,``).replace(/`+$/,``).replace(/^["']/,``).replace(/["']$/,``).trim();return t.length===0?null:t}var s=`sudo-request`,c=e(`sudo-ext`);function l(e={}){let t=e.suggest??a;return{async requestApproval(e){let n;try{n=await t(e)}catch{n=e.detail}return u({...e,suggestedPattern:n})}}}function u(e){return new Promise(t=>{let n=globalThis.chrome?.runtime;if(!n||typeof n.sendMessage!=`function`){c.warn(`chrome.runtime.sendMessage unavailable — denying`),t({decision:`deny`});return}let r=r=>{let i=n.lastError;if(i){c.warn(`sudo relay lastError — denying`,{error:i.message}),t({decision:`deny`});return}if(!r||typeof r!=`object`){c.warn(`sudo relay empty response — denying`),t({decision:`deny`});return}let a=r;if(!a.ok||!a.decision){c.warn(`sudo relay error response — denying`,{error:a.error}),t({decision:`deny`});return}t(d(a.decision,e.suggestedPattern??e.detail))};try{n.sendMessage({source:`offscreen`,payload:{type:s,request:e}},r)}catch(e){c.warn(`sudo relay threw — denying`,{error:e instanceof Error?e.message:String(e)}),t({decision:`deny`})}})}function d(e,t){return e.decision===`allow`?{decision:`allow`}:e.decision===`always`?{decision:`always`,pattern:typeof e.pattern==`string`&&e.pattern.trim().length>0?e.pattern.trim():t}:{decision:`deny`}}var f=e(`sudo-http`);function p(e={}){let t=e.fetchImpl??globalThis.fetch.bind(globalThis),n=e.path??`/api/sudo-approve`,r=e.suggest??a;return{async requestApproval(e){let i;try{i=await r(e)}catch{i=e.detail}try{let r=await t(n,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({kind:e.kind,detail:e.detail,suggestedPattern:i})});return r.ok?m(await r.json(),i):(f.warn(`sudo endpoint returned non-OK status — denying`,{status:r.status}),{decision:`deny`})}catch(e){return f.warn(`sudo endpoint request failed — denying`,{error:e instanceof Error?e.message:String(e)}),{decision:`deny`}}}}}function m(e,t){if(!e||typeof e!=`object`)return{decision:`deny`};let n=e.decision;if(n===`allow`)return{decision:`allow`};if(n===`always`){let n=e.pattern;return{decision:`always`,pattern:typeof n==`string`&&n.trim().length>0?n.trim():t}}return{decision:`deny`}}var h=e(`sudo-panel`);function g(e,t={}){let n=t.confirm??(e=>globalThis.confirm(e)),r=t.prompt??((e,t)=>globalThis.prompt(e,t));if(!n(`Approve ${e.kind}:\n\n${e.detail}\n\nOK = allow · Cancel = deny`))return{decision:`deny`};let i=e.suggestedPattern?.trim()||e.detail.trim();if(!n(`Always allow actions matching:\n\n${i}\n\nOK = always · Cancel = just this once`))return{decision:`allow`};let a=r(`Edit the "Always" allow pattern:`,i);return{decision:`always`,pattern:a&&a.trim().length>0?a.trim():i}}function _(e={}){let t=globalThis.chrome?.runtime?.onMessage;return!t||typeof t.addListener!=`function`?!1:(t.addListener((t,n,r)=>{if(!v(t))return;let i=t.payload.request;try{r({ok:!0,decision:g(i,e)})}catch(e){h.warn(`panel responder threw — denying`,{error:e instanceof Error?e.message:String(e)}),r({ok:!1,decision:{decision:`deny`},error:`panel responder error`})}return!1}),!0)}function v(e){if(!e||typeof e!=`object`)return!1;let t=e;if(t.source!==`offscreen`)return!1;let n=t.payload;if(!n||n.type!==`sudo-request`)return!1;let r=n.request;return!!r&&typeof r.kind==`string`&&typeof r.detail==`string`}var y=e(`sudo`),b=`__slicc_sudo`;function x(){return typeof chrome<`u`&&!!chrome?.runtime?.id}function S(){return x()?l():p()}function C(e=S()){let t={requestApproval:t=>e.requestApproval(t)};return globalThis[b]=t,y.info(`sudo broker test hook published on globalThis.__slicc_sudo`),t}export{_ as installPanelSudoResponder,C as installSudoTestHook};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{ct as e,st as t}from"./main-
|
|
1
|
+
import{ct as e,st as t}from"./main-NTOoEKjL.js";async function n(n,i){let a=i.getLeader()?`leader`:i.getFollower()?`follower`:`inactive`,o=i.getLeader();i.setLeader(null);let s=i.getFollower();i.setFollower(null),i.clearLeaderHooks();let{requestId:c}=n;try{o?.stop()}catch(e){i.log.error(`Leader stop threw during tray-leave — resources may have leaked`,{requestId:c,error:e instanceof Error?e.message:String(e)})}try{s?.stop()}catch(e){i.log.error(`Follower stop threw during tray-leave — resources may have leaked`,{requestId:c,error:e instanceof Error?e.message:String(e)})}if(r(()=>i.storage.removeItem(t),i.log,`join-clear`,c),n.workerBaseUrl===null)return r(()=>i.storage.removeItem(e),i.log,`worker-clear`,c),a===`inactive`?{kind:`noop`}:{kind:`left`,previousMode:a};let l=n.workerBaseUrl,u;try{u=i.startLeader(l)}catch(t){throw i.log.error(`startLeader failed during tray-leave — runtime is now dormant`,{workerBaseUrl:l,requestId:c,error:t instanceof Error?t.message:String(t)}),r(()=>i.storage.removeItem(e),i.log,`worker-clear-on-failure`,c),t}return i.setLeader(u),i.wireLeaderHooks(u),r(()=>i.storage.setItem(e,l),i.log,`worker-set`,c),{kind:`switched`,previousMode:a,workerBaseUrl:l}}function r(e,t,n,r){try{e()}catch(e){t.error(`tray-leave storage write failed`,{kind:n,requestId:r,error:e instanceof Error?e.message:String(e)})}}export{n as performTrayLeave};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{_ as e,v as t}from"./kernel-worker-
|
|
1
|
+
import{_ as e,v as t}from"./kernel-worker-Db4cVMp1.js";const n=`slicc:last-seen-version`;function r(){return{version:`3.43.0`,releasedAt:`2026-06-08T13:53:54Z`}}async function i(){let t=await e(n);return t&&t.length>0?t:null}async function a(e){await t(n,e)}async function o(){let e=r(),t=await i();return t===null?(await a(e.version),{bundled:e,lastSeen:null,isUpgrade:!1}):t===e.version?{bundled:e,lastSeen:t,isUpgrade:!1}:{bundled:e,lastSeen:t,isUpgrade:!0}}async function s(e){await a(e)}export{o as detectUpgrade,s as recordVersionSeen};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{l as e,m as t,p as n}from"./bedrock-camp-CWvhREqw.js";import{o as r}from"./transform-messages-B3Q-Bwv-.js";import{$ as i,W as a}from"./main-
|
|
1
|
+
import{l as e,m as t,p as n}from"./bedrock-camp-CWvhREqw.js";import{o as r}from"./transform-messages-B3Q-Bwv-.js";import{$ as i,W as a}from"./main-NTOoEKjL.js";import{XaiErrorCode as o,XaiOAuthError as s}from"./xai-grok-errors-bnlIBeu-.js";import{resolveModels as c,toModelMetadata as l}from"./xai-grok-models-CeEBaUMC.js";import{sanitizePayload as u}from"./xai-grok-sanitize-CR2JoOJd.js";var d=`xai-grok`,f=`https://auth.x.ai`,p=`${f}/oauth2/authorize`,m=`${f}/oauth2/token`,h=`b1a00492-073a-47ea-816f-4c329264a828`,g=`openid profile email offline_access grok-cli:access api:access`,_=`http://127.0.0.1:56121/callback`,v=`http://127.0.0.1:56121/*`,y=`https://api.x.ai/v1`,b=`openai-responses`,x=`${d}-openai`;function S(){return typeof process>`u`?null:{}.PI_XAI_OAUTH_MODELS??null}var C=c(S());function w(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function T(e){let t=new Uint8Array(e);return crypto.getRandomValues(t),t}function E(){return w(T(32))}async function D(e){let t=new TextEncoder().encode(e);return w(new Uint8Array(await crypto.subtle.digest(`SHA-256`,t)))}function O(){return w(T(16))}async function k(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:_,client_id:h,code_verifier:t}),r=await fetch(m,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new s(`xAI token exchange failed: ${r.status} ${await r.text()}`,o.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new s(`xAI token exchange did not return access_token.`,o.TOKEN_EXCHANGE_INVALID);return i}async function A(e){try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:h}),n=await fetch(m,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});return n.ok?await n.json():(console.error(`[xai-grok] refresh failed:`,n.status,await n.text()),null)}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function j(){return a().find(e=>e.providerId===d)}async function M(){let e=j();if(!e?.accessToken)throw new s("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",o.AUTH_MISSING,!0);let t=e.tokenExpiresAt??0;if(t&&Date.now()+6e4<t)return e.accessToken;if(e.refreshToken){let t=await A(e.refreshToken);if(t?.access_token)return await i({providerId:d,accessToken:t.access_token,refreshToken:t.refresh_token??e.refreshToken,tokenExpiresAt:Date.now()+(t.expires_in??21600)*1e3}),t.access_token}return e.accessToken}function N(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:x,provider:d,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function P(e,t){return n=>!n||typeof n!=`object`?n:u(n,e,t)}function F(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}var I=(t,n,i={})=>{let a=r();return(async()=>{try{let r=await M(),o=i.sessionId,s=e({...t,baseUrl:y,api:b},n,{...i,apiKey:r,headers:F(i.headers,o),onPayload:P(t.id,o)});for await(let e of s)a.push(e);a.end()}catch(e){console.error(`[xai-grok] Stream error:`,e instanceof Error?e.message:String(e)),a.push(N(t,e)),a.end()}})(),a},L=(e,t,i)=>{let a=r();return(async()=>{try{let r=await M(),o=i?.sessionId,s=n({...e,baseUrl:y,api:b},t,{...i,apiKey:r,headers:F(i?.headers,o),onPayload:P(e.id,o)});for await(let e of s)a.push(e);a.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),a.push(N(e,t)),a.end()}})(),a},R={id:d,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok Heavy.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:`grok-4.20-multi-agent-0309`,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`],getModelIds:()=>C.map(e=>{let t=l(e);return e.thinkingLevelMap?{...t,thinkingLevelMap:e.thinkingLevelMap}:t}),onOAuthLoginIntercepted:async(e,t,n)=>{let r=E(),a=await D(r),c=O(),l=O(),u=new URL(p);u.searchParams.set(`response_type`,`code`),u.searchParams.set(`client_id`,h),u.searchParams.set(`redirect_uri`,_),u.searchParams.set(`scope`,n?.scopes??g),u.searchParams.set(`code_challenge`,a),u.searchParams.set(`code_challenge_method`,`S256`),u.searchParams.set(`state`,c),u.searchParams.set(`nonce`,l),u.searchParams.set(`plan`,`generic`),u.searchParams.set(`referrer`,`slicc`);let f=await e({authorizeUrl:u.toString(),redirectUriPattern:v,onCapture:`close`});if(!f)throw new s(`xAI OAuth login was cancelled or timed out`,o.CALLBACK_TIMEOUT);let m=new URL(f),b=m.searchParams.get(`code`),x=m.searchParams.get(`state`);if(!b)throw new s(`xAI OAuth redirect did not include a code`,o.CODE_MISSING);if(x!==c)throw new s(`xAI OAuth state mismatch — possible CSRF, aborting`,o.STATE_MISMATCH);let S=await k(b,r);await i({providerId:d,accessToken:S.access_token,refreshToken:S.refresh_token,tokenExpiresAt:Date.now()+(S.expires_in??21600)*1e3,baseUrl:y}),t()},onOAuthLogout:async()=>{await i({providerId:d,accessToken:``})},onSilentRenew:async()=>{let e=j();if(!e?.refreshToken)return null;let t=await A(e.refreshToken);return t?.access_token?(await i({providerId:d,accessToken:t.access_token,refreshToken:t.refresh_token??e.refreshToken,tokenExpiresAt:Date.now()+(t.expires_in??21600)*1e3}),t.access_token):null}};function z(){t({api:x,stream:I,streamSimple:L})}export{o as XaiErrorCode,s as XaiOAuthError,R as config,z as register};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{m as e,t}from"./provider-settings-
|
|
1
|
+
import{m as e,t}from"./provider-settings-CSKMTOfj.js";import{_ as n,f as r,g as i}from"./bedrock-camp-Cg_vY0Xg.js";import{o as a}from"./transform-messages-C1X1O3BY.js";import{XaiErrorCode as o,XaiOAuthError as s}from"./xai-grok-errors-ByEMMSoz.js";import{resolveModels as c,toModelMetadata as l}from"./xai-grok-models-B0Tf--xf.js";import{sanitizePayload as u}from"./xai-grok-sanitize-CV6qvaEF.js";const d=`xai-grok`,f=`https://auth.x.ai`,p=`${f}/oauth2/authorize`,m=`${f}/oauth2/token`,h=`b1a00492-073a-47ea-816f-4c329264a828`,g=`http://127.0.0.1:56121/callback`,_=`https://api.x.ai/v1`,v=`openai-responses`,y=`${d}-openai`;function b(){return typeof process>`u`?null:{}.PI_XAI_OAUTH_MODELS??null}const x=c(b());function S(e){let t=``;for(let n of e)t+=String.fromCharCode(n);return btoa(t).replace(/\+/g,`-`).replace(/\//g,`_`).replace(/=+$/,``)}function C(e){let t=new Uint8Array(e);return crypto.getRandomValues(t),t}function w(){return S(C(32))}async function T(e){let t=new TextEncoder().encode(e);return S(new Uint8Array(await crypto.subtle.digest(`SHA-256`,t)))}function E(){return S(C(16))}async function D(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:g,client_id:h,code_verifier:t}),r=await fetch(m,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new s(`xAI token exchange failed: ${r.status} ${await r.text()}`,o.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new s(`xAI token exchange did not return access_token.`,o.TOKEN_EXCHANGE_INVALID);return i}async function O(e){try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:h}),n=await fetch(m,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});return n.ok?await n.json():(console.error(`[xai-grok] refresh failed:`,n.status,await n.text()),null)}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function k(){return t().find(e=>e.providerId===d)}async function A(){let t=k();if(!t?.accessToken)throw new s("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",o.AUTH_MISSING,!0);let n=t.tokenExpiresAt??0;if(n&&Date.now()+6e4<n)return t.accessToken;if(t.refreshToken){let n=await O(t.refreshToken);if(n?.access_token)return await e({providerId:d,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3}),n.access_token}return t.accessToken}function j(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:y,provider:d,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function M(e,t){return n=>!n||typeof n!=`object`?n:u(n,e,t)}function N(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}const P=(e,t,n={})=>{let i=a();return(async()=>{try{let a=await A(),o=n.sessionId,s=r({...e,baseUrl:_,api:v},t,{...n,apiKey:a,headers:N(n.headers,o),onPayload:M(e.id,o)});for await(let e of s)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(j(e,t)),i.end()}})(),i},F=(e,t,n)=>{let r=a();return(async()=>{try{let a=await A(),o=n?.sessionId,s=i({...e,baseUrl:_,api:v},t,{...n,apiKey:a,headers:N(n?.headers,o),onPayload:M(e.id,o)});for await(let e of s)r.push(e);r.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),r.push(j(e,t)),r.end()}})(),r},I={id:d,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok Heavy.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:`grok-4.20-multi-agent-0309`,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`],getModelIds:()=>x.map(e=>{let t=l(e);return e.thinkingLevelMap?{...t,thinkingLevelMap:e.thinkingLevelMap}:t}),onOAuthLoginIntercepted:async(t,n,r)=>{let i=w(),a=await T(i),c=E(),l=E(),u=new URL(p);u.searchParams.set(`response_type`,`code`),u.searchParams.set(`client_id`,h),u.searchParams.set(`redirect_uri`,g),u.searchParams.set(`scope`,r?.scopes??`openid profile email offline_access grok-cli:access api:access`),u.searchParams.set(`code_challenge`,a),u.searchParams.set(`code_challenge_method`,`S256`),u.searchParams.set(`state`,c),u.searchParams.set(`nonce`,l),u.searchParams.set(`plan`,`generic`),u.searchParams.set(`referrer`,`slicc`);let f=await t({authorizeUrl:u.toString(),redirectUriPattern:`http://127.0.0.1:56121/*`,onCapture:`close`});if(!f)throw new s(`xAI OAuth login was cancelled or timed out`,o.CALLBACK_TIMEOUT);let m=new URL(f),v=m.searchParams.get(`code`),y=m.searchParams.get(`state`);if(!v)throw new s(`xAI OAuth redirect did not include a code`,o.CODE_MISSING);if(y!==c)throw new s(`xAI OAuth state mismatch — possible CSRF, aborting`,o.STATE_MISMATCH);let b=await D(v,i);await e({providerId:d,accessToken:b.access_token,refreshToken:b.refresh_token,tokenExpiresAt:Date.now()+(b.expires_in??21600)*1e3,baseUrl:_}),n()},onOAuthLogout:async()=>{await e({providerId:d,accessToken:``})},onSilentRenew:async()=>{let t=k();if(!t?.refreshToken)return null;let n=await O(t.refreshToken);return n?.access_token?(await e({providerId:d,accessToken:n.access_token,refreshToken:n.refresh_token??t.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3}),n.access_token):null}};function L(){n({api:y,stream:P,streamSimple:F})}export{o as XaiErrorCode,s as XaiOAuthError,I as config,L as register};
|
package/dist/ui/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>slicc</title>
|
|
7
7
|
<link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
|
|
8
|
-
<script type="module" crossorigin src="/assets/main-
|
|
8
|
+
<script type="module" crossorigin src="/assets/main-NTOoEKjL.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-aKtaBQYM.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-Dezn_h7o.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-zJ_50EbN.js">
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>slicc</title>
|
|
7
7
|
<link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
|
|
8
|
-
<script type="module" crossorigin src="/assets/main-
|
|
8
|
+
<script type="module" crossorigin src="/assets/main-NTOoEKjL.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-aKtaBQYM.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-Dezn_h7o.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-zJ_50EbN.js">
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./main-COPO1-7A.js";function e(e){}export{e as registerSessionCostsProvider};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./provider-wF_CzaeE.js";export{e as readMcpAuthEntries};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./store-BS4j8ZLu.js";import"./provider-CF53ENSZ.js";export{e as readMcpAuthEntries};
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
function e(e,t){if(typeof t!=`string`||!/^\d+\.\d+\.\d+(?:-[0-9A-Za-z.-]+)?$/.test(t))throw Error(`${e} must use an exact semver version in package.json`);return t}const t={EBADF:8,EEXIST:20,EINVAL:28,EIO:29,EISDIR:31,ENOENT:44,ENOTDIR:54,ENOTEMPTY:55,EPERM:63},n=16877;async function r(e){let t=new Map;t.set(``,{kind:`directory`,dirHandle:e});async function n(e,r){let i=e;for await(let[e,a]of i){let i=r===``?e:`${r}/${e}`;if(a.kind===`directory`)t.set(i,{kind:`directory`,dirHandle:a}),await n(a,i);else{let e=a,n=await e.getFile();t.set(i,{kind:`file`,fileHandle:e,size:n.size,mtime:n.lastModified})}}}return await n(e,``),{entries:t}}function i(e,t){return e===``?t:`${e}/${t}`}function a(e){let r={mount(i){let{prewalk:a}=i.opts,o=a.entries.get(``);if(o?.kind!==`directory`)throw new e.ErrnoError(t.EINVAL);let s=r.createNode(null,`/`,n,0);s.mount=i,s.opfs.dirHandle=o.dirHandle,s.opfs.children=new Map;for(let[i,o]of a.entries){if(i===``)continue;let a=i.split(`/`),c=s;for(let n=0;n<a.length-1;n++){let r=a[n],i=c.opfs.children?.get(r);if(!i)throw new e.ErrnoError(t.EIO);c=i}let l=a[a.length-1];if(o.kind===`directory`){let e=r.createNode(c,l,n,0);e.opfs.dirHandle=o.dirHandle,e.opfs.children=new Map,c.opfs.children?.set(l,e)}else{let e=r.createNode(c,l,33188,0);e.opfs.fileHandle=o.fileHandle,e.opfs.size=o.size,e.opfs.mtime=o.mtime,e.timestamp=o.mtime,c.opfs.children?.set(l,e)}}return s},createNode(n,a,o,s=0){if(!e.isDir(o)&&!e.isFile(o)&&!e.isLink(o))throw new e.ErrnoError(t.EINVAL);let c=n===null?``:i(n.opfs?.relPath??``,a),l=e.createNode(n,a,o,s);return l.node_ops=r.node_ops,l.stream_ops=r.stream_ops,l.timestamp=Date.now(),n!==null&&(l.mount=n.mount),l.opfs={relPath:c,size:0,mtime:l.timestamp},e.isDir(o)&&(l.opfs.children=new Map),l},node_ops:{getattr(t){let n=e.isDir(t.mode),r=e.isLink(t.mode)?t.opfs.linkTarget?.length??0:n?4096:t.opfs.size,i=new Date(t.opfs.mtime||t.timestamp);return{dev:1,ino:t.id,mode:t.mode,nlink:1,uid:0,gid:0,rdev:0,size:r,atime:i,mtime:i,ctime:i,blksize:4096,blocks:Math.ceil(r/4096)}},setattr(t,n){if(n.mode!==void 0&&(t.mode=t.mode&61440|n.mode&-61441),n.size!==void 0&&e.isFile(t.mode)){let e=n.size;t.opfs.size=e,s(t.mount,async()=>{let n=await f(t),r=t.mount.opts.sahProvider.acquire(t.opfs.relPath,n);try{r.truncate(e),r.flush()}finally{r.close(),t.mount.opts.sahProvider.release(t.opfs.relPath)}})}if(n.mtime!==void 0){let e=n.mtime.getTime();t.opfs.mtime=e,t.timestamp=e}},lookup(n,r){let i=n.opfs.children?.get(r);if(!i)throw new e.ErrnoError(t.ENOENT);return i},mknod(n,i,a,o){if(n.opfs.children?.has(i))throw new e.ErrnoError(t.EEXIST);let c=r.createNode(n,i,a,o);return n.opfs.children?.set(i,c),e.isDir(a)?s(n.mount,async()=>{let e=await(await d(n)).getDirectoryHandle(i,{create:!0});c.opfs.dirHandle=e}):e.isFile(a)&&s(n.mount,async()=>{let e=await(await d(n)).getFileHandle(i,{create:!0});c.opfs.fileHandle=e}),c},rename(n,r,a){let o=n.parent,c=n.name;if(!(c===a&&o===r)){if(r.opfs.children?.has(a))throw new e.ErrnoError(t.EEXIST);o.opfs.children?.delete(c),r.opfs.children?.set(a,n),n.name=a,n.parent=r,p(n,i(r.opfs.relPath,a)),e.isFile(n.mode)?s(n.mount,()=>m(n,o,c,r,a)):e.isDir(n.mode)&&s(n.mount,()=>h(n,o,c,r,a))}},unlink(n,r){let i=n.opfs.children?.get(r);if(!i)throw new e.ErrnoError(t.ENOENT);if(e.isDir(i.mode))throw new e.ErrnoError(t.EISDIR);n.opfs.children?.delete(r),e.isFile(i.mode)&&s(n.mount,async()=>{try{n.mount.opts.sahProvider.release(i.opfs.relPath)}catch{}await(await d(n)).removeEntry(r)})},rmdir(n,r){let i=n.opfs.children?.get(r);if(!i)throw new e.ErrnoError(t.ENOENT);if(!e.isDir(i.mode))throw new e.ErrnoError(t.ENOTDIR);if((i.opfs.children?.size??0)>0)throw new e.ErrnoError(t.ENOTEMPTY);n.opfs.children?.delete(r),s(n.mount,async()=>{await(await d(n)).removeEntry(r)})},readdir(n){if(!e.isDir(n.mode))throw new e.ErrnoError(t.ENOTDIR);let r=[`.`,`..`];for(let e of n.opfs.children?.keys()??[])r.push(e);return r},symlink(n,i,a){if(n.opfs.children?.has(i))throw new e.ErrnoError(t.EEXIST);let o=r.createNode(n,i,41471,0);return o.opfs.linkTarget=a,n.opfs.children?.set(i,o),o},readlink(n){if(!e.isLink(n.mode))throw new e.ErrnoError(t.EINVAL);return n.opfs.linkTarget??``}},stream_ops:{open(t){let n=t.node;if(e.isDir(n.mode)||!e.isFile(n.mode))return;let r=n.mount.opts.sahProvider.acquire(n.opfs.relPath,n.opfs.fileHandle);t.sah=r,n.opfs.size=r.getSize()},close(e){let t=e.sah;if(t)try{t.flush()}finally{t.close(),e.node.mount.opts.sahProvider.release(e.node.opfs.relPath),e.sah=void 0}},read(n,r,i,a,o){let s=n.sah;if(!s)throw new e.ErrnoError(t.EBADF);let c=new Uint8Array(r.buffer,r.byteOffset+i,a);return s.read(c,{at:o})},write(n,r,i,a,o){let s=n.sah;if(!s)throw new e.ErrnoError(t.EBADF);let c=new Uint8Array(r.buffer,r.byteOffset+i,a),l=s.write(c,{at:o}),u=Math.max(n.node.opfs.size,o+l);return n.node.opfs.size=u,n.node.opfs.mtime=Date.now(),n.node.timestamp=n.node.opfs.mtime,l},llseek(n,r,i){let a=r;if(i===1)a=n.position+r;else if(i===2){let e=n.sah;a=(e?e.getSize():n.node.opfs.size)+r}if(a<0)throw new e.ErrnoError(t.EINVAL);return n.position=a,a}}};return r}const o=new WeakMap;function s(e,t){let n=(o.get(e)??Promise.resolve()).then(t,t);o.set(e,n),e.opts.flush||(e.opts.flush=()=>o.get(e)??Promise.resolve())}async function c(e){await(o.get(e)??Promise.resolve())}var l=class{backing;onClose;constructor(e,t){this.backing=e,this.onClose=t}read(e,t){let n=t?.at??0,r=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),i=Math.min(this.backing.data.length,n+r.byteLength),a=Math.max(0,i-n);return r.set(this.backing.data.subarray(n,n+a),0),a}write(e,t){let n=t?.at??0,r=new Uint8Array(e.buffer,e.byteOffset,e.byteLength),i=n+r.byteLength;if(i>this.backing.data.length){let e=new Uint8Array(i);e.set(this.backing.data),this.backing.data=e}return this.backing.data.set(r,n),this.backing.dirty=!0,r.byteLength}truncate(e){if(e===this.backing.data.length)return;let t=new Uint8Array(e);t.set(this.backing.data.subarray(0,Math.min(e,this.backing.data.length))),this.backing.data=t,this.backing.dirty=!0}getSize(){return this.backing.data.length}flush(){}close(){this.onClose()}};function u(){let e=new Map,t=new Set;return{provider:{acquire(n,r){if(t.has(n))throw Error(`OPFS SAH lease conflict: ${n}`);t.add(n);let i=e.get(n);return i||(i={data:new Uint8Array,dirty:!0},e.set(n,i)),new l(i,()=>{t.delete(n)})},release(e){t.delete(e)}},async preload(t){for(let[n,r]of t.entries){if(r.kind!==`file`)continue;let t=await r.fileHandle.getFile(),i=new Uint8Array(await t.arrayBuffer());e.set(n,{data:i,dirty:!1})}},async flush(t){for(let[n,r]of e){if(!r.dirty)continue;let e=n.split(`/`),i=t;for(let t of e.slice(0,-1))i=await i.getDirectoryHandle(t,{create:!0});let a=await(await i.getFileHandle(e[e.length-1],{create:!0})).createWritable(),o=new ArrayBuffer(r.data.byteLength);new Uint8Array(o).set(r.data),await a.write(o),await a.close(),r.dirty=!1}}}}async function d(e){if(e.opfs.dirHandle)return e.opfs.dirHandle;let t=e.opfs.relPath.split(`/`).filter(Boolean),n=e.mount.root.opfs.dirHandle;for(let e of t)n=await n.getDirectoryHandle(e,{create:!0});return e.opfs.dirHandle=n,n}async function f(e){if(e.opfs.fileHandle)return e.opfs.fileHandle;let t=await(await d(e.parent)).getFileHandle(e.name,{create:!0});return e.opfs.fileHandle=t,t}function p(e,t){if(e.opfs.relPath=t,e.opfs.children)for(let[n,r]of e.opfs.children)p(r,i(t,n))}async function m(e,t,n,r,i){let a=await d(t),o=await d(r),s=await(await a.getFileHandle(n)).getFile(),c=new Uint8Array(await s.arrayBuffer()),l=await o.getFileHandle(i,{create:!0}),u=e.mount.opts.sahProvider.acquire(e.opfs.relPath,l);try{u.truncate(0),c.byteLength>0&&u.write(c,{at:0}),u.flush()}finally{u.close(),e.mount.opts.sahProvider.release(e.opfs.relPath)}await a.removeEntry(n),e.opfs.fileHandle=l}async function h(e,t,n,r,i){let a=await d(t),o=await d(r),s=await a.getDirectoryHandle(n),c=await o.getDirectoryHandle(i,{create:!0});await g(s,c),await a.removeEntry(n,{recursive:!0}),e.opfs.dirHandle=c}async function g(e,t){let n=e;for await(let[e,r]of n)if(r.kind===`directory`)await g(r,await t.getDirectoryHandle(e,{create:!0}));else{let n=await r.getFile(),i=new Uint8Array(await n.arrayBuffer()),a=await(await t.getFileHandle(e,{create:!0})).createWritable();await a.write(i),await a.close()}}var _=class{port;nextId=1;pending=new Map;eventSubscribers=new Map;handler;disposed=!1;constructor(e){this.port=e,this.handler=e=>{let t=e.data;if(t?.type===`realm-rpc-res`){let t=e.data,n=this.pending.get(t.id);if(!n)return;this.pending.delete(t.id),typeof t.error==`string`?n.reject(Error(t.error)):n.resolve(t.result);return}if(t?.type===`realm-event`){let t=e.data,n=this.eventSubscribers.get(t.channel);if(!n)return;for(let e of[...n])try{e(t.payload)}catch{}}},e.addEventListener(`message`,this.handler),e.start?.()}call(e,t,n=[]){if(this.disposed)return Promise.reject(Error(`realm-rpc: client disposed`));let r=this.nextId++,i={type:`realm-rpc-req`,id:r,channel:e,op:t,args:n};return new Promise((e,t)=>{this.pending.set(r,{resolve:e,reject:t}),this.port.postMessage(i)})}onEvent(e,t){if(this.disposed)return()=>{};let n=this.eventSubscribers.get(e);return n||(n=new Set,this.eventSubscribers.set(e,n)),n.add(t),()=>{let n=this.eventSubscribers.get(e);n&&(n.delete(t),n.size===0&&this.eventSubscribers.delete(e))}}dispose(){if(this.disposed)return;this.disposed=!0,this.port.removeEventListener(`message`,this.handler);let e=Error(`realm-rpc: client disposed`);for(let t of this.pending.values())t.reject(e);this.pending.clear(),this.eventSubscribers.clear()}};`${e(`pyodide`,`0.29.4`)}`;async function v(e,t,n=()=>import(`./pyodide-M7UA50Oh.js`)){let r=[],i=[],a=new _(t),o;try{o=await(await n()).loadPyodide({indexURL:e.pyodideIndexURL,fullStdLib:!1})}catch(e){a.dispose();let n={type:`realm-error`,message:`loadPyodide: ${e instanceof Error?e.message:String(e)}`};t.postMessage(n);return}let s=e.pyodideMountDirs??[e.cwd,`/tmp`],c=e=>{i.push(`Warning: ${e}\n`)},l=[];if(e.opfsMountDbName!==void 0)try{l=(await S(o,s,e.opfsMountDbName,c)).mounts}catch(e){c(`VFS→Pyodide OPFS mount failed: ${b(e)}`)}try{o.FS.chdir(e.cwd)}catch{}o.setStdout({batched:e=>r.push(e+`
|
|
2
|
-
`)}),o.setStderr({batched:e=>i.push(e+`
|
|
3
|
-
`)});let u=!1;o.setStdin({stdin:()=>u||!e.stdin?null:(u=!0,e.stdin)}),o.globals.set(`__slicc_code`,e.code),o.globals.set(`__slicc_filename`,e.filename),o.globals.set(`__slicc_argv`,e.argv);let d;try{await o.runPythonAsync(`
|
|
4
|
-
import sys
|
|
5
|
-
import traceback
|
|
6
|
-
|
|
7
|
-
__slicc_exit_code = 0
|
|
8
|
-
try:
|
|
9
|
-
sys.argv = __slicc_argv
|
|
10
|
-
exec(compile(__slicc_code, __slicc_filename, "exec"), {"__name__": "__main__", "__file__": __slicc_filename})
|
|
11
|
-
except SystemExit as exc:
|
|
12
|
-
code = exc.code
|
|
13
|
-
if code is None:
|
|
14
|
-
__slicc_exit_code = 0
|
|
15
|
-
elif isinstance(code, int):
|
|
16
|
-
__slicc_exit_code = code
|
|
17
|
-
else:
|
|
18
|
-
print(code, file=sys.stderr)
|
|
19
|
-
__slicc_exit_code = 1
|
|
20
|
-
except BaseException:
|
|
21
|
-
traceback.print_exc()
|
|
22
|
-
__slicc_exit_code = 1
|
|
23
|
-
`);let e=o.globals.get(`__slicc_exit_code`);d=typeof e==`number`?e:Number(e??1)}catch(e){let t=e instanceof Error?e.message:String(e);i.push(`${t}\n`),d=1}try{o.runPython(`del __slicc_code, __slicc_filename, __slicc_argv, __slicc_exit_code`)}catch{}if(e.opfsMountDbName!==void 0)try{await w(l)}catch(e){c(`Pyodide→VFS OPFS flush failed: ${e instanceof Error?e.message:String(e)}`)}a.dispose();let f={type:`realm-done`,stdout:r.join(``),stderr:i.join(``),exitCode:d};t.postMessage(f)}const y=new Set([`dev`,`proc`,`lib`,`tmp`,`home`]);function b(e){if(e&&typeof e==`object`){let t=e,n=typeof t.errno==`number`,r=typeof t.code==`string`;if(n||r){let e=typeof t.name==`string`&&t.name?t.name:`Error`,i=typeof t.message==`string`?t.message:``,a=[];n&&a.push(`errno ${t.errno}`),r&&a.push(t.code);let o=a.length?` (${a.join(`, `)})`:``;return i?`${e}: ${i}${o}`:`${e}${o}`}}return e instanceof Error?e.message:String(e)}function x(e){let t=e.FS.filesystems,n=t.OPFS_SYNC_FS;return n||(n=a(e.FS),t.OPFS_SYNC_FS=n),n}async function S(e,t,n,r=()=>{}){let i=[],a=navigator.storage;if(!a?.getDirectory)return r(`VFS→Pyodide OPFS mount skipped: navigator.storage.getDirectory unavailable`),{mounts:i};let o;try{o=await a.getDirectory()}catch(e){return r(`VFS→Pyodide OPFS mount: getDirectory() failed: ${b(e)}`),{mounts:i}}let s;try{s=await o.getDirectoryHandle(n,{create:!0})}catch(e){return r(`VFS→Pyodide OPFS mount: opening '${n}' failed: ${b(e)}`),{mounts:i}}let c=x(e);for(let n of t){if(n===`/`){try{let t=s;for await(let[n,a]of t){if(a.kind!==`directory`||y.has(n))continue;let t=`/${n}`;try{await C(e,c,t,a,i)}catch(e){r(`VFS→Pyodide OPFS mount '${t}' failed: ${b(e)}`)}}}catch(e){r(`VFS→Pyodide OPFS mount '/' failed: ${b(e)}`)}continue}try{let t=s;for(let e of n.split(`/`).filter(Boolean))t=await t.getDirectoryHandle(e,{create:!0});await C(e,c,n,t,i)}catch(e){r(`VFS→Pyodide OPFS mount '${n}' failed: ${b(e)}`)}}return{mounts:i}}async function C(e,t,n,i,a){try{e.FS.stat(n)}catch{e.FS.mkdirTree(n)}let o=await r(i),s=u();await s.preload(o);let c={rootHandle:i,prewalk:o,sahProvider:s.provider},l=e.FS.mount(t,c,n),d=l?.mount??{opts:c,mountpoint:n,root:l};a.push({pyPath:n,mount:d,rootHandle:i,flushBuffers:s.flush})}async function w(e){for(let t of e)await c(t.mount),await t.flushBuffers(t.rootHandle)}const T={postMessage:(e,t)=>t?self.postMessage(e,t):self.postMessage(e),addEventListener:(e,t)=>self.addEventListener(e,t),removeEventListener:(e,t)=>self.removeEventListener(e,t)};self.addEventListener(`message`,e=>{if(e.data?.type!==`realm-init`)return;let t=e.data;t.kind===`py`&&v(t,T).catch(e=>{let t={type:`realm-error`,message:e instanceof Error?e.message:String(e)};self.postMessage(t)})});
|