sliccy 3.46.0 → 3.46.2
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-Da115bHB.js → adobe-BPYxRlOy.js} +1 -1
- package/dist/ui/assets/{adobe-CSxcey5r.js → adobe-Bx7ArUhR.js} +2 -2
- package/dist/ui/assets/{agent-bridge-ZRdlTYxI.js → agent-bridge-MVNbwv9V.js} +1 -1
- package/dist/ui/assets/{agent-message-to-chat-B5VQCgc6.js → agent-message-to-chat-DQon7vlK.js} +1 -1
- package/dist/ui/assets/{apps-LCRJf-Bj.js → apps-B3W68_ue.js} +1 -1
- package/dist/ui/assets/{azure-openai-e68lAEyj.js → azure-openai-DuPzcNp5.js} +1 -1
- package/dist/ui/assets/{azure-openai-DrpoflZr.js → azure-openai-HLya0Rer.js} +1 -1
- package/dist/ui/assets/{bsh-watchdog-B1zIY2sM.js → bsh-watchdog-CeSz1rKM.js} +1 -1
- package/dist/ui/assets/{cdp-Cy4upOhT.js → cdp-D9MgzjDo.js} +3 -3
- package/dist/ui/assets/{connect-surface-BahfcMFA.js → connect-surface-BiRuikUp.js} +1 -1
- package/dist/ui/assets/cost-command-BbPl4yQZ.js +1 -0
- package/dist/ui/assets/{dist-DLO6_i_i.js → dist-CHqBWWnO.js} +1 -1
- package/dist/ui/assets/{dist-DUVVOtT3.js → dist-h-6KVvPV.js} +1 -1
- package/dist/ui/assets/{es-CBKhaKNo.js → es-BTcMkfTm.js} +1 -1
- package/dist/ui/assets/{follower-sprinkle-bridge-CknbkmDw.js → follower-sprinkle-bridge-BtEQTWgk.js} +1 -1
- package/dist/ui/assets/fs-CN47Zfyn.js +1 -0
- package/dist/ui/assets/{github-B4cLbBmQ.js → github-CTUWcPqZ.js} +1 -1
- package/dist/ui/assets/{github-BSaD-jMI.js → github-CTo-bVjK.js} +2 -2
- package/dist/ui/assets/{github-copilot-BsW7hhJu.js → github-copilot-BL2RJvgJ.js} +1 -1
- package/dist/ui/assets/{github-copilot-DodI4DS1.js → github-copilot-BpugRFfm.js} +1 -1
- package/dist/ui/assets/{kernel-worker-BTrLFznM.js → kernel-worker-DI44y1rM.js} +1032 -1032
- package/dist/ui/assets/{lick-ws-bridge-E1g3lRps.js → lick-ws-bridge-DYYVDXiL.js} +1 -1
- package/dist/ui/assets/{local-llm-CwKk0-sh.js → local-llm-987K5aju.js} +1 -1
- package/dist/ui/assets/{magick-wasm-Muqi5nQe.js → magick-wasm-d_ntAamr.js} +1 -1
- package/dist/ui/assets/{main-BAt3GJms.js → main-FJV8fvml.js} +8 -8
- package/dist/ui/assets/{main-cherry-TgxLxBGI.js → main-cherry-CzY8LoaT.js} +1 -1
- package/dist/ui/assets/{migration-run-BDogYJcC.js → migration-run-Bbt2m95S.js} +1 -1
- package/dist/ui/assets/{mount-CSayJ5xj.js → mount-DTNSzQR7.js} +1 -1
- package/dist/ui/assets/{nuke-command-B1G-iwiX.js → nuke-command-BiebxKg7.js} +1 -1
- package/dist/ui/assets/{oauth-bootstrap-CJO5Uc9n.js → oauth-bootstrap-Ckx49SXJ.js} +2 -2
- package/dist/ui/assets/{oauth-service-DB4fWEIw.js → oauth-service-kel2JbrT.js} +1 -1
- package/dist/ui/assets/{onboarding-orchestrator-xRYzOs-B.js → onboarding-orchestrator-By8tOo5U.js} +1 -1
- package/dist/ui/assets/{openai-codex-B5qZu8bN.js → openai-codex-BZtgrgRW.js} +1 -1
- package/dist/ui/assets/{openai-codex-CgxGUy87.js → openai-codex-DQCqhson.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-DbDQuWjm.js → panel-rpc-handlers-B4qmnxcs.js} +1 -1
- package/dist/ui/assets/{provider-BbqMcfYp.js → provider-DEt2BDJD.js} +2 -2
- package/dist/ui/assets/{provider-j_DAU9YR.js → provider-HfkqopgG.js} +1 -1
- package/dist/ui/assets/{provider-settings-BfWBLG45.js → provider-settings-BypemNFj.js} +2 -2
- package/dist/ui/assets/provider-store-access-BUc_zZUp.js +1 -0
- package/dist/ui/assets/provider-store-access-CkkJ08Cj.js +1 -0
- package/dist/ui/assets/{providers-B-eUneAQ.js → providers-nW69ll7b.js} +1 -1
- package/dist/ui/assets/{proxied-fetch-DLNoZln5.js → proxied-fetch-Dc_ihA54.js} +1 -1
- package/dist/ui/assets/py-realm-worker-BnG_DxBd.js +242 -0
- package/dist/ui/assets/{remote-terminal-view-8J05xBYs.js → remote-terminal-view-CDvc47F2.js} +1 -1
- package/dist/ui/assets/{store-s3uG1ved.js → store-4SmN_rTG.js} +1 -1
- package/dist/ui/assets/{sudo-6xMv5Je5.js → sudo-_mKG9Xdm.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-DnWFIWXy.js → tray-leave-runtime-CdVKVbnC.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-366FmFL3.js → upgrade-detection-BOOH96NA.js} +1 -1
- package/dist/ui/assets/{xai-grok-BG6yWHMj.js → xai-grok-BXxz_R_a.js} +1 -1
- package/dist/ui/assets/{xai-grok-hGf99Tc7.js → xai-grok-DsNhCehm.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-B1SUEdVQ.js +0 -1
- package/dist/ui/assets/fs-jtOU7if2.js +0 -1
- package/dist/ui/assets/provider-store-access-DREH5Rn0.js +0 -1
- package/dist/ui/assets/provider-store-access-Dvt6Obmo.js +0 -1
- package/dist/ui/assets/py-realm-worker-C75JGmXR.js +0 -242
|
@@ -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-FJV8fvml.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-FJV8fvml.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{v as e,y as t}from"./kernel-worker-
|
|
1
|
+
import{v as e,y as t}from"./kernel-worker-DI44y1rM.js";const n=`slicc:last-seen-version`;function r(){return{version:`3.46.2`,releasedAt:`2026-06-09T18:49:28Z`}}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-FJV8fvml.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-BypemNFj.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-FJV8fvml.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-FJV8fvml.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-BAt3GJms.js";function e(e){}export{e as registerSessionCostsProvider};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{r as e}from"./chunk-CMxvf4Kt.js";import{t}from"./logger-LESFN7Hj.js";import{t as n}from"./backend-local-CMfz45hs.js";import{t as r}from"./types-idfTVsM8.js";import{a as i,i as a,n as o,t as s}from"./mount-table-store-CQJEV6Ij.js";import{i as c,n as l,r as u,t as d}from"./path-utils-DU6QhF_k.js";const f=t(`fs-watcher`);let p=0;function m(e,t){return t===`/`||e===t||e.startsWith(t+`/`)}var h=class{registrations=new Map;watch(e,t,n){let r=`fsw-${++p}`;return this.registrations.set(r,{id:r,basePath:e,filter:t,callback:n}),f.debug(`Watch registered`,{id:r,basePath:e}),()=>{this.registrations.delete(r),f.debug(`Watch unregistered`,{id:r})}}notify(e){if(e.length!==0)for(let[,t]of this.registrations){let n=e.filter(e=>m(e.path,t.basePath)&&t.filter(e.path));if(n.length>0)try{t.callback(n)}catch(e){f.error(`Watch callback error`,{id:t.id,error:e instanceof Error?e.message:String(e)})}}}dispose(){this.registrations.clear(),f.debug(`All watchers disposed`)}get size(){return this.registrations.size}};const g=t(`mount-index`);var _=class{mounts=new Map;listeners=new Set;registerMount(e,t){this.mounts.get(e)?.abortController?.abort();let n=new AbortController,r={handle:t,state:{status:`pending`,indexed:0},files:new Set,directories:new Set,abortController:n};this.mounts.set(e,r),this.notifyListeners(),this.indexMount(e,r,n.signal)}unregisterMount(e){let t=this.mounts.get(e);t&&(t.abortController?.abort(),this.mounts.delete(e),this.notifyListeners())}async refreshMount(e){let t=this.mounts.get(e);if(!t)throw Error(`No mount at ${e}`);t.abortController?.abort();let n=new AbortController;t.abortController=n,t.state={status:`pending`,indexed:0},t.files.clear(),t.directories.clear(),this.notifyListeners(),await this.indexMount(e,t,n.signal)}isReady(e){return this.mounts.get(e)?.state.status===`ready`}isAnyIndexing(){for(let e of this.mounts.values())if(e.state.status===`indexing`||e.state.status===`pending`)return!0;return!1}dispose(){for(let e of this.mounts.values())e.abortController?.abort();this.mounts.clear(),this.listeners.clear()}getState(e){return this.mounts.get(e)?.state}getFiles(e,t){let n=this.mounts.get(e);if(n?.state.status!==`ready`)return;if(!t)return[...n.files];let r=[];for(let e of n.files)t(e)&&r.push(e);return r}getDirectoryEntries(e,t){let n=this.mounts.get(e);if(n?.state.status!==`ready`)return;let r=t===`/`?`/`:t+`/`,i=new Map;for(let e of n.files){if(!e.startsWith(r))continue;let t=e.slice(r.length);t.includes(`/`)||i.set(t,`file`)}for(let e of n.directories){if(!e.startsWith(r))continue;let t=e.slice(r.length);t.includes(`/`)||i.set(t,`directory`)}return[...i.entries()].map(([e,t])=>({name:e,type:t}))}hasPath(e,t){let n=this.mounts.get(e);if(n?.state.status===`ready`)return n.files.has(t)||n.directories.has(t)}notifyWrite(e){let t=this.findMountForPath(e);if(!t)return;let n=this.mounts.get(t);if(n?.state.status!==`ready`)return;n.files.add(e);let r=e;for(;r!==t;){let e=r.lastIndexOf(`/`);if(e<=0)break;r=r.slice(0,e)||`/`,r.length>=t.length&&n.directories.add(r)}}notifyDelete(e){let t=this.findMountForPath(e);if(!t)return;let n=this.mounts.get(t);if(n?.state.status!==`ready`)return;n.files.delete(e),n.directories.delete(e);let r=e+`/`;for(let e of n.files)e.startsWith(r)&&n.files.delete(e);for(let e of n.directories)e.startsWith(r)&&n.directories.delete(e)}notifyRename(e,t){let n=this.findMountForPath(e);if(!n)return;let r=this.mounts.get(n);if(r?.state.status===`ready`){if(r.files.has(e)){r.files.delete(e),r.files.add(t);return}if(r.directories.has(e)){r.directories.delete(e),r.directories.add(t);let n=e+`/`,i=t+`/`;for(let e of[...r.files])e.startsWith(n)&&(r.files.delete(e),r.files.add(i+e.slice(n.length)));for(let e of[...r.directories])e.startsWith(n)&&(r.directories.delete(e),r.directories.add(i+e.slice(n.length)))}}}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}findMountForPath(e){let t;for(let n of this.mounts.keys())(e===n||e.startsWith(n+`/`))&&(!t||n.length>t.length)&&(t=n);return t}notifyListeners(){for(let e of this.listeners)try{e()}catch{}}async indexMount(e,t,n){t.state={status:`indexing`,indexed:0},this.notifyListeners();try{if(await this.walkHandle(e,t.handle,t,n),n.aborted)return;t.state={status:`ready`,indexed:t.files.size+t.directories.size,total:t.files.size+t.directories.size},t.abortController=null,g.info(`Mount indexed`,{path:e,files:t.files.size,directories:t.directories.size})}catch(r){if(n.aborted)return;let i=r instanceof Error?r.message:String(r);t.state={status:`error`,indexed:0,error:i},g.error(`Mount indexing failed`,{path:e,error:i})}this.notifyListeners()}async walkHandle(e,t,n,r){if(r.aborted)return;n.directories.add(e);let i=t;for await(let[t,a]of i){if(r.aborted)return;let i=e===`/`?`/${t}`:`${e}/${t}`;a.kind===`file`?(n.files.add(i),n.state.indexed++):a.kind===`directory`&&await this.walkHandle(i,a,n,r),n.state.indexed%500==0&&(this.notifyListeners(),await new Promise(e=>setTimeout(e,0)))}}},v=class{vfs;allowedPrefixes;readOnlyPrefixes;constructor(e,t,n=[]){this.vfs=e;let r=e=>{let t=l(e);return t.endsWith(`/`)?t:t+`/`};this.allowedPrefixes=t.map(r),this.readOnlyPrefixes=n.map(r)}getAllPrefixes(){let e=this.vfs.listMounts().map(e=>e.endsWith(`/`)?e:e+`/`);return[...this.allowedPrefixes,...this.readOnlyPrefixes,...e]}isAllowed(e){let t=l(e);return this.getAllPrefixes().some(e=>t===e.slice(0,-1)||t.startsWith(e)||t===`/`||e.startsWith(t+`/`))}isAllowedStrict(e){let t=l(e);return this.getAllPrefixes().some(e=>t===e.slice(0,-1)||t.startsWith(e))}isWritable(e){let t=l(e);return this.allowedPrefixes.some(e=>t===e.slice(0,-1)||t.startsWith(e))}canWrite(e){return this.isWritable(e)}checkWrite(e){if(!this.isWritable(e))throw new r(`EACCES`,`permission denied`,l(e))}async resolveAndCheckRead(e){try{let t=await this.vfs.realpath(e);if(!this.isAllowedStrict(t))throw new r(`ENOENT`,`no such file or directory`,l(e));return t}catch(t){throw t instanceof r?t:new r(`ENOENT`,`no such file or directory`,l(e))}}async resolveAndCheckWrite(e){try{let t=await this.vfs.realpath(e);if(!this.isWritable(t))throw new r(`EACCES`,`permission denied`,l(e));return t}catch(t){throw t instanceof r?t:new r(`EACCES`,`permission denied`,l(e))}}getUnderlyingFS(){return this.vfs}isPathUnderMount(e){return this.vfs.isPathUnderMount(e)}async readFile(e,t){if(!this.isAllowedStrict(e))throw new r(`ENOENT`,`no such file or directory`,l(e));let n=await this.resolveAndCheckRead(e);return this.vfs.readFile(n,t)}async readDir(e){if(!this.isAllowed(e))return[];let t=e;if(this.isAllowedStrict(e))try{t=await this.resolveAndCheckRead(e)}catch{return[]}let n=await this.vfs.readDir(t);if(!this.isAllowedStrict(e)){let t=l(e);return n.filter(e=>{let n=t===`/`?`/${e.name}`:`${t}/${e.name}`;return this.isAllowed(n)})}return n}async stat(e){if(!this.isAllowed(e))throw new r(`ENOENT`,`no such file or directory`,l(e));if(this.isAllowedStrict(e)){let t=await this.resolveAndCheckRead(e);return this.vfs.stat(t)}return this.vfs.stat(e)}scanPathForSymlinks(e,t){let n=l(e);if(n===`/`)return!1;let r=n.slice(1).split(`/`),i=t?r.length:r.length-1,a=``;for(let e=0;e<i;e++){a=a+`/`+r[e];let t=this.vfs.lstatSync(a);if(t===null)return null;if(t.type===`symlink`)return!0}return!1}statSync(e){return!this.isAllowedStrict(e)||this.scanPathForSymlinks(e,!0)!==!1?null:this.vfs.statSync(e)}lstatSync(e){return!this.isAllowed(e)||this.scanPathForSymlinks(e,!1)!==!1?null:this.vfs.lstatSync(e)}readDirSync(e){if(!this.isAllowed(e)||this.scanPathForSymlinks(e,!0)!==!1)return null;let t=this.vfs.readDirSync(e);if(t===null)return null;if(this.isAllowedStrict(e))return t;let n=l(e);return t.filter(e=>{let t=n===`/`?`/${e.name}`:`${n}/${e.name}`;return this.isAllowed(t)})}async realpath(e){let t;try{t=await this.vfs.realpath(e)}catch(t){throw t instanceof r?t:new r(`ENOENT`,`no such file or directory`,l(e))}if(!this.isAllowedStrict(t))throw new r(`ENOENT`,`no such file or directory`,l(e));return t}async exists(e){if(!this.isAllowed(e))return!1;if(this.isAllowedStrict(e))try{await this.resolveAndCheckRead(e)}catch{return!1}return this.vfs.exists(e)}async readTextFile(e){if(!this.isAllowedStrict(e))throw new r(`ENOENT`,`no such file or directory`,l(e));let t=await this.resolveAndCheckRead(e);return this.vfs.readTextFile(t)}async*walk(e){if(!this.isAllowed(e))return;let t=e;if(this.isAllowedStrict(e))try{t=await this.resolveAndCheckRead(e)}catch{return}for await(let e of this.vfs.walk(t))this.isAllowed(e)&&(yield e)}async writeFile(e,t,n){this.checkWrite(e);let i=this.vfs.dirname(e),a=this.vfs.basename(e);try{let t=await this.vfs.realpath(i);if(!this.isWritable(t+`/`+a))throw new r(`EACCES`,`permission denied`,l(e))}catch(e){if(e instanceof r&&e.code===`EACCES`)throw e}try{(await this.vfs.lstat(e)).type===`symlink`&&await this.resolveAndCheckWrite(e)}catch(e){if(e instanceof r&&e.code===`EACCES`)throw e}return this.vfs.writeFile(e,t,n)}async mkdir(e,t){this.checkWrite(e);let n=this.vfs.dirname(e),i=this.vfs.basename(e);try{let t=await this.vfs.realpath(n);if(!this.isWritable(t+`/`+i))throw new r(`EACCES`,`permission denied`,l(e))}catch(e){if(e instanceof r&&e.code===`EACCES`)throw e}return this.vfs.mkdir(e,t)}async rm(e,t){this.checkWrite(e);try{(await this.vfs.lstat(e)).type===`symlink`||await this.resolveAndCheckWrite(e)}catch(e){if(e instanceof r&&e.code===`EACCES`)throw e}return this.vfs.rm(e,t)}async rename(e,t){this.checkWrite(e),this.checkWrite(t),await this.resolveAndCheckWrite(e);let n=this.vfs.dirname(t),i=this.vfs.basename(t);try{let e=await this.vfs.realpath(n);if(!this.isWritable(e+`/`+i))throw new r(`EACCES`,`permission denied`,l(t))}catch(e){if(e instanceof r&&e.code===`EACCES`)throw e}return this.vfs.rename(e,t)}async copyFile(e,t){if(!this.isAllowed(e))throw new r(`ENOENT`,`no such file or directory`,l(e));this.checkWrite(t);let n=await this.resolveAndCheckRead(e),i=this.vfs.dirname(t),a=this.vfs.basename(t);try{let e=await this.vfs.realpath(i);if(!this.isWritable(e+`/`+a))throw new r(`EACCES`,`permission denied`,l(t))}catch(e){if(e instanceof r&&e.code===`EACCES`)throw e}try{(await this.vfs.lstat(t)).type===`symlink`&&await this.resolveAndCheckWrite(t)}catch(e){if(e instanceof r&&e.code===`EACCES`)throw e}return this.vfs.copyFile(n,t)}async symlink(e,t){this.checkWrite(t);let n=this.vfs.dirname(t),i=this.vfs.basename(t);try{let e=await this.vfs.realpath(n);if(!this.isWritable(e+`/`+i))throw new r(`EACCES`,`permission denied`,l(t))}catch(e){if(e instanceof r&&e.code===`EACCES`)throw e}return this.vfs.symlink(e,t)}async readlink(e){if(!this.isAllowedStrict(e))throw new r(`ENOENT`,`no such file or directory`,l(e));let t=await this.vfs.readlink(e),n;if(n=t.startsWith(`/`)?l(t):l(this.vfs.dirname(e)+`/`+t),!this.isAllowedStrict(n))throw new r(`ENOENT`,`no such file or directory`,l(e));return t}async lstat(e){if(!this.isAllowed(e))throw new r(`ENOENT`,`no such file or directory`,l(e));let t=l(e),n=this.vfs.dirname(t),i=this.vfs.basename(t),a;if(n===t)a=n;else try{a=await this.vfs.realpath(n)}catch{throw new r(`ENOENT`,`no such file or directory`,t)}let o=a===`/`?`/${i}`:`${a}/${i}`;if(!this.isAllowed(o))throw new r(`ENOENT`,`no such file or directory`,t);return this.vfs.lstat(o)}watch(e,t,n){if(!this.isAllowed(e))throw new r(`EACCES`,`permission denied`,l(e));let i=this.vfs.getWatcher();if(!i)throw new r(`EINVAL`,`no watcher configured`);return i.watch(l(e),t,n)}dirname(e){return this.vfs.dirname(e)}basename(e){return this.vfs.basename(e)}async dispose(){await this.vfs.dispose()}};function y(){try{if(typeof globalThis.navigator?.storage?.getDirectory==`function`)return`opfs`}catch{}return`memory`}var b=class e{lfs;lfsSync;rawLfs=null;rawLfsSync=null;_ready;_readyResolved=!1;backend;mountPoints=new Map;opfsBackendFs=null;opfsHandle=null;mountRoot=``;internalMounts=new Set;watcher=null;dbName;mountSyncChannel=null;mountIndex=new _;constructor(t,n,r,i){if(this.dbName=t,this.backend=r===`opfs`?`opfs`:`memory`,this.lfs=this.makeDeferredLfs(),this.lfsSync=this.makeDeferredLfsSync(),this._ready=this.backend===`opfs`?e.initOpfsBackend(this,i,n===!0):e.initMemoryBackend(this,t,n===!0),this._ready.then(()=>{this._readyResolved=!0},()=>{}),typeof BroadcastChannel<`u`)try{this.mountSyncChannel=new BroadcastChannel(`vfs-mount-sync:${t}`),this.mountSyncChannel.onmessage=e=>{let{type:t,path:n,descriptor:r}=e.data??{};if(t===`mount`&&typeof n==`string`&&r)this.reconstructBackendFromDescriptor(r).then(e=>{this.mountPoints.set(n,e),e.kind===`local`&&this.mountIndex.registerMount(n,e.getHandle()),this.watcher?.notify([{type:`modify`,path:n,entryType:`directory`}])}).catch(()=>{});else if(t===`unmount`&&typeof n==`string`){let e=this.mountPoints.get(n);this.mountPoints.delete(n),this.mountIndex.unregisterMount(n),e?.close(),this.watcher?.notify([{type:`modify`,path:n,entryType:`directory`}])}}}catch{}}static async initOpfsBackend(t,n,r){let i=n??await e.acquireOpfsHandle(t.dbName,r);await e.seedOpfsMetadataSidecarIfMissing(i);let[a,{WebAccess:o}]=await Promise.all([import(`./dist-DUVVOtT3.js`).then(e=>e.t),import(`./dist-DLO6_i_i.js`)]);await e.ensureRootMount(a);let s=`/__opfs__/${t.dbName}`,c=e.opfsBackends.get(t.dbName);if(c&&r){try{a.umount(s)}catch{}e.opfsBackends.delete(t.dbName),c=void 0}if(!c){let n=await a.resolveMountConfig({backend:o,handle:i,metadata:`/.metadata.json`});try{a.mount(s,n)}catch{}c={backendFs:n,refs:0},e.opfsBackends.set(t.dbName,c)}c.refs+=1,t.opfsBackendFs=c.backendFs.index?c.backendFs:null,t.opfsHandle=i,t.mountRoot=s,t.rawLfs=a.promises,t.rawLfsSync=a}static async initMemoryBackend(t,n,r){let i=await import(`./dist-DUVVOtT3.js`).then(e=>e.t);await e.ensureRootMount(i);let a=`/__zenfs__/${n}`,o=e.memoryBackends.get(n);if(o&&r){try{i.umount(a)}catch{}e.memoryBackends.delete(n),o=void 0}o||(o={store:i.InMemory.create({label:n}),refs:0},e.memoryBackends.set(n,o)),o.refs+=1;try{i.mount(a,o.store)}catch{}t.mountRoot=a,t.rawLfs=i.promises,t.rawLfsSync=i,t.opfsBackendFs=null,t.opfsHandle=null}static rootMountReady=null;static memoryBackends=new Map;static opfsBackends=new Map;static async ensureRootMount(t){return e.rootMountReady||=(async()=>{await t.configureSingle({backend:t.InMemory,label:`__vfs_root__`})})(),e.rootMountReady}prefix(e){return this.mountRoot?e===`/`?this.mountRoot:this.mountRoot+e:e}unprefix(e){return!this.mountRoot||!e.startsWith(this.mountRoot)?e:e.slice(this.mountRoot.length)||`/`}makeDeferredLfs(){let e=e=>this.prefix(e),t=e=>this.unprefix(e),n=()=>{if(!this.rawLfs)throw Error(`VirtualFS used before init resolved`);return this.rawLfs};return{readFile:(t,r)=>this._readyResolved?n().readFile(e(t),r):this._ready.then(()=>n().readFile(e(t),r)),writeFile:(t,r,i)=>this._readyResolved?n().writeFile(e(t),r,i):this._ready.then(()=>n().writeFile(e(t),r,i)),readdir:t=>this._readyResolved?n().readdir(e(t)):this._ready.then(()=>n().readdir(e(t))),mkdir:(t,r)=>this._readyResolved?n().mkdir(e(t),r):this._ready.then(()=>n().mkdir(e(t),r)),rmdir:t=>this._readyResolved?n().rmdir(e(t)):this._ready.then(()=>n().rmdir(e(t))),unlink:t=>this._readyResolved?n().unlink(e(t)):this._ready.then(()=>n().unlink(e(t))),rename:(t,r)=>this._readyResolved?n().rename(e(t),e(r)):this._ready.then(()=>n().rename(e(t),e(r))),stat:t=>this._readyResolved?n().stat(e(t)):this._ready.then(()=>n().stat(e(t))),lstat:t=>this._readyResolved?n().lstat(e(t)):this._ready.then(()=>n().lstat(e(t))),symlink:(t,r)=>{let i=t.startsWith(`/`)?e(t):t;return this._readyResolved?n().symlink(i,e(r)):this._ready.then(()=>n().symlink(i,e(r)))},readlink:async r=>(this._readyResolved||await this._ready,t(await n().readlink(e(r)))),realpath:async r=>{this._readyResolved||await this._ready;let i=n();return typeof i.realpath==`function`?t(await i.realpath(e(r))):e(r)}}}makeDeferredLfsSync(){let e=e=>this.prefix(e),t=e=>this.unprefix(e);return{readdirSync:t=>{let n=this.rawLfsSync;return n?.readdirSync?n.readdirSync(e(t)):void 0},statSync:t=>{let n=this.rawLfsSync;return n?.statSync?n.statSync(e(t)):void 0},lstatSync:t=>{let n=this.rawLfsSync;return n?.lstatSync?n.lstatSync(e(t)):void 0},readlinkSync:n=>{let r=this.rawLfsSync;return r?.readlinkSync?t(r.readlinkSync(e(n))):void 0}}}static async seedOpfsMetadataSidecarIfMissing(e){let t=`.metadata.json`;try{await e.getFileHandle(t);return}catch(e){if(e?.name!==`NotFoundError`)throw e}let n=await(await e.getFileHandle(t,{create:!0})).createWritable(),r=JSON.stringify({version:1,maxSize:4294967295,entries:{}});await n.write(r),await n.close()}static async acquireOpfsHandle(e,t){let n=navigator.storage;if(!n?.getDirectory)throw new r(`EINVAL`,`OPFS is not available in this environment`);let i=await n.getDirectory();if(t)try{await i.removeEntry(e,{recursive:!0})}catch{}return i.getDirectoryHandle(e,{create:!0})}static async create(t){let n=t?.dbName??`browser-fs`,r=t?.wipe===!0,i=new e(n,r,t?.backend??y());return await i._ready,r&&await s().catch(()=>{}),i}async flush(){await this.writeOpfsMetadataSidecar()}async writeOpfsMetadataSidecar(){if(this.backend!==`opfs`)return;let e=this.opfsBackendFs,t=this.opfsHandle;if(!e||!t)return;let n=JSON.stringify(e.index.toJSON()),r=await(await t.getFileHandle(`.metadata.json`,{create:!0})).createWritable();await r.write(n),await r.close()}canWrite(e){return!0}setWatcher(e){this.watcher=e}getWatcher(){return this.watcher}async dispose(){if(this.mountSyncChannel?.close(),this.mountSyncChannel=null,this.watcher?.dispose(),this.watcher=null,this.mountIndex.dispose(),await this.writeOpfsMetadataSidecar(),this.mountRoot){let t=this.backend===`opfs`?e.opfsBackends:e.memoryBackends,n=t.get(this.dbName);if(n&&(--n.refs,n.refs<=0)){t.delete(this.dbName);try{(await import(`./dist-DUVVOtT3.js`).then(e=>e.t)).umount(this.mountRoot)}catch{}}}}readDirSync(e){let t=l(e);if(this.findMount(t))return null;let n=this.lfsSync;if(typeof n.readdirSync!=`function`||typeof n.lstatSync!=`function`)return null;try{let e=n.readdirSync(t),r=[];for(let i of e){let e=t===`/`?`/${i}`:`${t}/${i}`;try{let t=n.lstatSync(e),a=t.isSymbolicLink()?`symlink`:t.isDirectory()?`directory`:`file`;r.push({name:i,type:a})}catch{}}return r}catch{return null}}statSync(e){let t=l(e);if(this.findMount(t))return null;let n=this.lfsSync;if(typeof n.statSync!=`function`||typeof n.lstatSync!=`function`||typeof n.readlinkSync!=`function`)return null;let r=t;for(let e=0;e<=10;e++){let e;try{e=n.lstatSync(r)}catch{return null}if(!e.isSymbolicLink())return{type:e.isDirectory()?`directory`:`file`,size:e.size,mtime:e.mtimeMs,ctime:e.ctimeMs};let t;try{t=n.readlinkSync(r)}catch{return null}r=t.startsWith(`/`)?l(t):l(d(c(r).dir,t))}return null}lstatSync(e){let t=l(e);if(this.findMount(t))return null;let n=this.lfsSync;if(typeof n.lstatSync!=`function`)return null;try{let e=n.lstatSync(t);if(e.isSymbolicLink()){let r=n.readlinkSync?n.readlinkSync(t):``;return{type:`symlink`,size:e.size,mtime:e.mtimeMs,ctime:e.ctimeMs,isSymlink:!0,symlinkTarget:r}}return{type:e.isDirectory()?`directory`:`file`,size:e.size,mtime:e.mtimeMs,ctime:e.ctimeMs}}catch{return null}}async mount(e,t){let n=l(e);if(this.mountPoints.has(n))throw new r(`EEXIST`,`mount point is already mounted`,n);try{if((await this.lstat(n)).type!==`directory`)throw new r(`ENOTDIR`,`mount point must be a directory`,n);if((await this.readDir(n)).length>0)throw new r(`ENOTEMPTY`,`mount point must be empty to avoid shadowing existing files`,n)}catch(e){if(!(e instanceof r)||e.code!==`ENOENT`)throw e}let{dir:a}=c(n);a!==`/`&&await this.mkdir(a,{recursive:!0});try{await this.lfs.mkdir(n)}catch{}this.mountPoints.set(n,t),t.kind===`local`&&this.mountIndex.registerMount(n,t.getHandle());let o=t.kind===`local`?{kind:`local`,mountId:t.mountId,idbHandleKey:n}:t.kind===`s3`?{kind:`s3`,mountId:t.mountId,source:t.source,profile:t.profile??`default`}:{kind:`da`,mountId:t.mountId,source:t.source,profile:t.profile??`default`};try{this.mountSyncChannel?.postMessage({type:`mount`,path:n,descriptor:o})}catch{}this.watcher?.notify([{type:`modify`,path:n,entryType:`directory`}]);try{await i({targetPath:n,descriptor:o,createdAt:Date.now()},t.kind===`local`?t.getHandle():void 0)}catch{}}async unmount(e){let t=l(e),n=this.mountPoints.get(t);this.mountPoints.delete(t),this.mountIndex.unregisterMount(t);try{this.mountSyncChannel?.postMessage({type:`unmount`,path:t})}catch{}this.watcher?.notify([{type:`modify`,path:t,entryType:`directory`}]),await n?.close();try{await a(t)}catch{}}async reconstructBackendFromDescriptor(e){switch(e.kind){case`local`:{let t=await o(e.idbHandleKey);if(!t)throw Error(`no handle stored for ${e.idbHandleKey}`);return n.fromHandle(t,{mountId:e.mountId})}case`s3`:{let{S3MountBackend:t,RemoteMountCache:n,makeSignedFetchS3:r}=await import(`./mount-CSayJ5xj.js`).then(e=>e.t),i=new n({mountId:e.mountId,ttlMs:3e4});return new t({source:e.source,profile:e.profile,cache:i,mountId:e.mountId,signedFetch:r(e.profile)})}case`da`:{let{DaMountBackend:t,RemoteMountCache:n,makeSignedFetchDa:r}=await import(`./mount-CSayJ5xj.js`).then(e=>e.t),i=new n({mountId:e.mountId,ttlMs:3e4});return new t({source:e.source,profile:e.profile,cache:i,mountId:e.mountId,signedFetch:r()})}}}listMounts(){let e=[];for(let t of this.mountPoints.keys())this.internalMounts.has(t)||e.push(t);return e}listInternalMounts(){return[...this.internalMounts]}listMountPoints(){let e=[];for(let[t,n]of this.mountPoints)this.internalMounts.has(t)||e.push({path:t,kind:n.kind});return e}async mountInternal(e,t){let n=l(e);if(this.mountPoints.has(n))throw new r(`EEXIST`,`mount point is already mounted`,n);let{dir:i}=c(n);i!==`/`&&await this.mkdir(i,{recursive:!0});try{await this.lfs.mkdir(n)}catch{}this.mountPoints.set(n,t),this.internalMounts.add(n),this.watcher?.notify([{type:`modify`,path:n,entryType:`directory`}])}async unmountInternal(e){let t=l(e);if(!this.internalMounts.has(t))throw new r(`ENOENT`,`not an internal mount point`,t);let n=this.mountPoints.get(t);this.mountPoints.delete(t),this.internalMounts.delete(t),this.watcher?.notify([{type:`modify`,path:t,entryType:`directory`}]),await n?.close()}getMountIndex(){return this.mountIndex}async refreshMount(e,t){let n=l(e),i=this.mountPoints.get(n);if(!i)throw new r(`ENOENT`,`not a mount point`,n);let a=await i.refresh(t);return i.kind===`local`&&await this.mountIndex.refreshMount(n),a}isPathUnderMount(e){for(let t of this.mountPoints.keys())if(e===t||e.startsWith(t+`/`))return!0;return!1}static rebrandFsError(e,t){if(e instanceof r){let n=`${e.code}: `,i=e.message;throw i.startsWith(n)&&(i=i.slice(n.length)),e.path&&i.endsWith(` '${e.path}'`)&&(i=i.slice(0,i.length-` '${e.path}'`.length)),new r(e.code,i,t)}throw e}findMount(e){let t=null;for(let[n,r]of this.mountPoints)(e===n||e.startsWith(n+`/`))&&(!t||n.length>t.mountPath.length)&&(t={mountPath:n,backend:r});return t?e===t.mountPath?{path:t.mountPath,backend:t.backend,relParts:[]}:{path:t.mountPath,backend:t.backend,relParts:e.slice(t.mountPath.length+1).split(`/`).filter(Boolean)}:null}async readFile(t,n){let i=l(t),a=this.findMount(i);if(a){if(a.relParts.length===0)throw new r(`EISDIR`,`is a directory`,i);let t=a.relParts.join(`/`);try{let e=await a.backend.readFile(t);return(n?.encoding??`utf-8`)===`utf-8`?new TextDecoder(`utf-8`).decode(e):e}catch(t){e.rebrandFsError(t,i)}}let o=await this.resolveSymlinks(i);try{return(n?.encoding??`utf-8`)===`utf-8`?await this.lfs.readFile(o,{encoding:`utf8`}):await this.lfs.readFile(o)}catch(e){throw this.convertError(e,i)}}async writeFile(t,n,i){let a=l(t),o=this.findMount(a);if(o){if(o.relParts.length===0)throw new r(`EISDIR`,`is a directory`,a);let t=o.relParts.join(`/`),i=!1;try{await this.stat(a),i=!0}catch{}let s=typeof n==`string`?new TextEncoder().encode(n):n instanceof Uint8Array?new Uint8Array(n.buffer,n.byteOffset,n.byteLength):new Uint8Array(n);try{await o.backend.writeFile(t,s)}catch(t){e.rebrandFsError(t,a)}this.watcher?.notify([{type:i?`modify`:`create`,path:a,entryType:`file`}]),this.mountIndex.notifyWrite(a);return}let s;try{s=await this.resolveSymlinks(a)}catch{s=a}let u=!1;try{await this.lfs.stat(s),u=!0}catch{}let{dir:d}=c(s);d!==`/`&&await this.mkdir(d,{recursive:!0});try{await this.lfs.writeFile(s,n)}catch(e){throw this.convertError(e,a)}this.watcher?.notify([{type:u?`modify`:`create`,path:s,entryType:`file`}])}async readDir(t){let n=l(t),r=this.findMount(n);if(r){let t=this.mountIndex.getDirectoryEntries(r.path,n);if(t!==void 0){let e=new Map;for(let n of t)e.set(n.name,{name:n.name,type:n.type});let r=n===`/`?`/`:`${n}/`;for(let t of this.mountPoints.keys()){if(t===n||!t.startsWith(r))continue;let i=t.slice(r.length);!i||i.includes(`/`)||e.has(i)||e.set(i,{name:i,type:`directory`})}return[...e.values()]}let i=r.relParts.join(`/`)||`/`,a;try{a=await r.backend.readDir(i)}catch(t){e.rebrandFsError(t,n)}let o=new Map;for(let e of a)o.set(e.name,{name:e.name,type:e.kind===`directory`?`directory`:`file`});let s=n===`/`?`/`:`${n}/`;for(let e of this.mountPoints.keys()){if(e===n||!e.startsWith(s))continue;let t=e.slice(s.length);!t||t.includes(`/`)||o.has(t)||o.set(t,{name:t,type:`directory`})}return[...o.values()]}let i=await this.resolveSymlinks(n);try{let e=await this.lfs.readdir(i),t=[];for(let n of e){let e=i===`/`?`/${n}`:`${i}/${n}`;try{let r=await this.lfs.lstat(e);r.isSymbolicLink()?t.push({name:n,type:`symlink`}):t.push({name:n,type:r.isDirectory()?`directory`:`file`})}catch{}}return t}catch(e){throw this.convertError(e,n)}}async mkdir(t,n){let r=l(t);if(r===`/`)return;let i=this.findMount(r);if(i){if(i.relParts.length===0)return;let t=i.relParts.join(`/`),n=await this.exists(r);try{await i.backend.mkdir(t)}catch(t){e.rebrandFsError(t,r)}n||this.watcher?.notify([{type:`create`,path:r,entryType:`directory`}]);return}if(n?.recursive){let e=r.split(`/`).filter(Boolean),t=``;for(let n of e){t+=`/`+n;try{await this.lfs.mkdir(t)}catch(e){if(e instanceof Error&&!e.message.includes(`EEXIST`))throw this.convertError(e,t)}}}else{try{await this.lfs.mkdir(r)}catch(e){throw this.convertError(e,r)}this.watcher?.notify([{type:`create`,path:r,entryType:`directory`}])}}async rm(t,n){let i=l(t),a=this.findMount(i);if(a){if(a.relParts.length===0)throw new r(`EINVAL`,`cannot remove a mount point — use unmount`,i);let t;try{t=(await this.stat(i)).type}catch{}let o=a.relParts.join(`/`);try{await a.backend.remove(o,{recursive:n?.recursive})}catch(t){e.rebrandFsError(t,i)}this.watcher?.notify([{type:`delete`,path:i,entryType:t}]),this.mountIndex.notifyDelete(i);return}try{let e=await this.lfs.lstat(i);e.isSymbolicLink()?await this.lfs.unlink(i):e.isDirectory()?n?.recursive?await this.rmRecursive(i):await this.lfs.rmdir(i):await this.lfs.unlink(i)}catch(e){throw this.convertError(e,i)}this.watcher?.notify([{type:`delete`,path:i}])}async rmRecursive(e){let t=await this.lfs.readdir(e);for(let n of t){let t=e===`/`?`/${n}`:`${e}/${n}`;(await this.lfs.stat(t)).isDirectory()?await this.rmRecursive(t):await this.lfs.unlink(t)}await this.lfs.rmdir(e)}async stat(t){let n=l(t),r=this.findMount(n);if(r){if(r.relParts.length===0)try{let e=await this.lfs.stat(n);return{type:`directory`,size:e.size,mtime:e.mtimeMs,ctime:e.ctimeMs}}catch{return{type:`directory`,size:0,mtime:Date.now(),ctime:Date.now()}}let t=r.relParts.join(`/`);try{let e=await r.backend.stat(t);return{type:e.kind===`directory`?`directory`:`file`,size:e.size,mtime:e.mtime,ctime:e.mtime}}catch(t){e.rebrandFsError(t,n)}}let i=await this.resolveSymlinks(n);try{let e=await this.lfs.stat(i);return{type:e.isDirectory()?`directory`:`file`,size:e.size,mtime:e.mtimeMs,ctime:e.ctimeMs}}catch(e){throw this.convertError(e,n)}}async exists(e){let t=l(e),n=this.findMount(t);if(n){if(n.relParts.length===0)return!0;try{return await this.stat(t),!0}catch{return!1}}try{return await this.stat(t),!0}catch{try{return await this.lfs.lstat(t),!0}catch{return!1}}}async rename(e,t){let n=l(e),r=l(t),i;try{i=(await this.lstat(n)).type}catch{}try{await this.lfs.rename(n,r)}catch(e){throw this.convertError(e,n)}this.watcher?.notify([{type:`delete`,path:n,entryType:i},{type:`create`,path:r,entryType:i}]),this.mountIndex.notifyRename(n,r)}async readTextFile(e){return await this.readFile(e,{encoding:`utf-8`})}async*walk(e,t){let n=l(e);if(this.mountPoints.size>0&&this.mountPoints.has(n)&&![...this.mountPoints.keys()].some(e=>e!==n&&e.startsWith(n+`/`))&&this.mountIndex.isReady(n)){let e=this.mountIndex.getFiles(n);if(e){for(let t of e)yield t;return}}let r=t??new Set,i;try{i=await this.realpath(n)}catch{i=n}if(r.has(i))return;r.add(i);let a=await this.readDir(n);for(let e of a){let t=n===`/`?`/${e.name}`:`${n}/${e.name}`;if(e.type===`file`)yield t;else if(e.type===`symlink`)try{let e=await this.stat(t);e.type===`file`?yield t:e.type===`directory`&&(yield*this.walk(t,r))}catch{}else yield*this.walk(t,r)}}async copyFile(e,t){if((await this.stat(e)).type===`directory`)throw new r(`EISDIR`,`is a directory`,e);let n=await this.readFile(e,{encoding:`binary`});await this.writeFile(t,n)}dirname(e){return c(l(e)).dir}basename(e){return c(l(e)).base}async symlink(e,t){let n=l(t);if(this.findMount(n))throw new r(`EINVAL`,`symlinks not supported on mounted filesystems`,n);let{dir:i}=c(n);i!==`/`&&await this.mkdir(i,{recursive:!0});try{await this.lfs.symlink(e,n)}catch(e){throw this.convertError(e,n)}this.watcher?.notify([{type:`create`,path:n,entryType:`symlink`}])}async readlink(e){let t=l(e);try{return await this.lfs.readlink(t)}catch(e){throw this.convertError(e,t)}}async lstat(e){let t=l(e);if(this.findMount(t))return this.stat(t);try{let e=await this.lfs.lstat(t);if(e.isSymbolicLink()){let n=await this.lfs.readlink(t);return{type:`symlink`,size:e.size,mtime:e.mtimeMs,ctime:e.ctimeMs,isSymlink:!0,symlinkTarget:n}}return{type:e.isDirectory()?`directory`:`file`,size:e.size,mtime:e.mtimeMs,ctime:e.ctimeMs}}catch(e){throw this.convertError(e,t)}}async realpath(e){let t=l(e);if(this.findMount(t))return t;let n=0,i=t.split(`/`).filter(Boolean),a=`/`;for(let e=0;e<i.length;e++){let o=a===`/`?`/${i[e]}`:`${a}/${i[e]}`;for(;;){let s;try{s=await this.lfs.lstat(o)}catch(n){let r=this.convertError(n,t);if(r.code===`ENOENT`&&e===i.length-1)return a=o,a;throw r}if(!s.isSymbolicLink()){a=o;break}if(++n>10)throw new r(`ELOOP`,`too many symbolic links encountered`,t);let u;try{u=await this.lfs.readlink(o)}catch(e){throw this.convertError(e,t)}o=u.startsWith(`/`)?l(u):l(d(c(o).dir,u))}}return a}async resolveSymlinks(e){return this.findMount(e)?e:this.realpath(e)}convertError(e,t){if(e instanceof r)return e;let n=e?.code;if(typeof n==`string`){let i=n;if([`ENOENT`,`EEXIST`,`ENOTDIR`,`EISDIR`,`ENOTEMPTY`,`EINVAL`,`EACCES`,`ELOOP`,`EBUSY`,`EFBIG`,`EBADF`,`EIO`].includes(i))return new r(i,(e instanceof Error?e.message:String(e))||i,t)}let i=e instanceof Error?e.message:String(e);return i.includes(`ENOENT`)?new r(`ENOENT`,`no such file or directory`,t):i.includes(`EEXIST`)?new r(`EEXIST`,`file already exists`,t):i.includes(`ENOTDIR`)?new r(`ENOTDIR`,`not a directory`,t):i.includes(`EISDIR`)?new r(`EISDIR`,`is a directory`,t):i.includes(`ENOTEMPTY`)?new r(`ENOTEMPTY`,`directory not empty`,t):i.includes(`ELOOP`)?new r(`ELOOP`,`too many levels of symbolic links`,t):new r(`EINVAL`,i,t)}},x=e({FsError:()=>r,FsWatcher:()=>h,MountIndex:()=>_,RestrictedFS:()=>v,VirtualFS:()=>b,joinPath:()=>d,normalizePath:()=>l,pathSegments:()=>u,resolveVfsBackendFromEnv:()=>y,splitPath:()=>c});export{h as i,b as n,v as r,x as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./store-s3uG1ved.js";import"./provider-j_DAU9YR.js";export{e as readMcpAuthEntries};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./provider-BbqMcfYp.js";export{e as readMcpAuthEntries};
|
|
@@ -1,242 +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()}}function _(e){return`slicc: synchronous access to mounted path '${e}' is not supported. Use the async slicc.fs module (e.g. \`await slicc.fs.read_text('${e}')\` or \`await slicc.fs.listdir('${e}')\`), or copy the file into the VFS first (\`await slicc.fs.read_bytes('${e}/<file>')\` then write it under /tmp).`}function v(e,n){let r=new e.ErrnoError(t.EIO);return r.message=_(n),r}function y(e){let t={mount(n){let r=e.createNode(null,`/`,16877,0);return r.node_ops=t.node_ops,r.stream_ops=t.stream_ops,r.mount=n,r},createNode(n,r,i,a=0){let o=e.createNode(n,r,i,a);return o.node_ops=t.node_ops,o.stream_ops=t.stream_ops,n!==null&&(o.mount=n.mount),o},node_ops:{getattr:e=>{throw v(n(e),b(e))},setattr:e=>{throw v(n(e),b(e))},lookup:e=>{throw v(n(e),b(e))},mknod:e=>{throw v(n(e),b(e))},rename:e=>{throw v(n(e),b(e))},unlink:e=>{throw v(n(e),b(e))},rmdir:e=>{throw v(n(e),b(e))},readdir:e=>{throw v(n(e),b(e))},symlink:e=>{throw v(n(e),b(e))},readlink:e=>{throw v(n(e),b(e))}},stream_ops:{open:e=>{throw v(n(e.node),b(e.node))},close:()=>{},read:e=>{throw v(n(e.node),b(e.node))},write:e=>{throw v(n(e.node),b(e.node))},llseek:e=>{throw v(n(e.node),b(e.node))}}};function n(t){return e}return t}function b(e){let t=e.mount;return t?.opts?.mountPath??t?.mountpoint??`<unknown mount>`}function x(e,t){let n=e.MOUNT_BOMB_FS;return n||(n=y(t),e.MOUNT_BOMB_FS=n),n}function S(e,t,n=()=>{}){if(t.length===0)return;let r=x(e.filesystems,e);for(let i of t)try{try{e.stat(i)}catch{e.mkdirTree(i)}e.mount(r,{mountPath:i},i)}catch(e){n(`mount '${i}': bomb overlay failed: ${e instanceof Error?e.message:String(e)}`)}}function C(e){return _(e)}async function w(e,t){if(t.length===0)return;let n={};for(let e of t)n[e]=C(e);let r=JSON.stringify({prefixes:t,messages:n});e.globals.set(`__slicc_mount_data`,r);try{await e.runPythonAsync(`
|
|
2
|
-
import builtins as _slicc_builtins
|
|
3
|
-
import io as _slicc_io
|
|
4
|
-
import os as _slicc_os
|
|
5
|
-
import os.path as _slicc_osp
|
|
6
|
-
import errno as _slicc_errno
|
|
7
|
-
import json as _slicc_json
|
|
8
|
-
|
|
9
|
-
_slicc_data = _slicc_json.loads(__slicc_mount_data)
|
|
10
|
-
_slicc_mount_prefixes = list(_slicc_data['prefixes'])
|
|
11
|
-
_slicc_mount_messages = dict(_slicc_data['messages'])
|
|
12
|
-
del _slicc_data
|
|
13
|
-
|
|
14
|
-
def _slicc_match_mount_prefix(path):
|
|
15
|
-
if path is None:
|
|
16
|
-
return None
|
|
17
|
-
if isinstance(path, int):
|
|
18
|
-
return None
|
|
19
|
-
try:
|
|
20
|
-
s = _slicc_os.fspath(path)
|
|
21
|
-
except TypeError:
|
|
22
|
-
return None
|
|
23
|
-
if isinstance(s, bytes):
|
|
24
|
-
try:
|
|
25
|
-
s = s.decode('utf-8', 'surrogateescape')
|
|
26
|
-
except Exception:
|
|
27
|
-
return None
|
|
28
|
-
if not isinstance(s, str):
|
|
29
|
-
return None
|
|
30
|
-
try:
|
|
31
|
-
resolved = _slicc_osp.abspath(s)
|
|
32
|
-
except Exception:
|
|
33
|
-
return None
|
|
34
|
-
for prefix in _slicc_mount_prefixes:
|
|
35
|
-
if resolved == prefix or resolved.startswith(prefix + '/'):
|
|
36
|
-
return prefix
|
|
37
|
-
return None
|
|
38
|
-
|
|
39
|
-
def _slicc_raise_mount_guard(path, prefix):
|
|
40
|
-
msg = _slicc_mount_messages.get(prefix)
|
|
41
|
-
if not msg:
|
|
42
|
-
msg = "slicc: synchronous access to mounted path '" + prefix + "' is not supported; use the async slicc.fs module."
|
|
43
|
-
raise OSError(_slicc_errno.EIO, msg, str(path))
|
|
44
|
-
|
|
45
|
-
_slicc_orig_builtins_open = _slicc_builtins.open
|
|
46
|
-
_slicc_orig_io_open = _slicc_io.open
|
|
47
|
-
_slicc_orig_listdir = _slicc_os.listdir
|
|
48
|
-
_slicc_orig_scandir = _slicc_os.scandir
|
|
49
|
-
_slicc_orig_stat = _slicc_os.stat
|
|
50
|
-
_slicc_orig_lstat = _slicc_os.lstat
|
|
51
|
-
_slicc_orig_mkdir = _slicc_os.mkdir
|
|
52
|
-
_slicc_orig_remove = _slicc_os.remove
|
|
53
|
-
_slicc_orig_rename = _slicc_os.rename
|
|
54
|
-
|
|
55
|
-
def _slicc_guarded_builtins_open(file, *args, **kwargs):
|
|
56
|
-
if isinstance(file, int):
|
|
57
|
-
return _slicc_orig_builtins_open(file, *args, **kwargs)
|
|
58
|
-
prefix = _slicc_match_mount_prefix(file)
|
|
59
|
-
if prefix is not None:
|
|
60
|
-
_slicc_raise_mount_guard(file, prefix)
|
|
61
|
-
return _slicc_orig_builtins_open(file, *args, **kwargs)
|
|
62
|
-
|
|
63
|
-
def _slicc_guarded_io_open(file, *args, **kwargs):
|
|
64
|
-
if isinstance(file, int):
|
|
65
|
-
return _slicc_orig_io_open(file, *args, **kwargs)
|
|
66
|
-
prefix = _slicc_match_mount_prefix(file)
|
|
67
|
-
if prefix is not None:
|
|
68
|
-
_slicc_raise_mount_guard(file, prefix)
|
|
69
|
-
return _slicc_orig_io_open(file, *args, **kwargs)
|
|
70
|
-
|
|
71
|
-
def _slicc_make_path_guard(orig):
|
|
72
|
-
def _guarded(path, *args, **kwargs):
|
|
73
|
-
prefix = _slicc_match_mount_prefix(path)
|
|
74
|
-
if prefix is not None:
|
|
75
|
-
_slicc_raise_mount_guard(path, prefix)
|
|
76
|
-
return orig(path, *args, **kwargs)
|
|
77
|
-
return _guarded
|
|
78
|
-
|
|
79
|
-
def _slicc_guarded_rename(src, dst, *args, **kwargs):
|
|
80
|
-
for p in (src, dst):
|
|
81
|
-
prefix = _slicc_match_mount_prefix(p)
|
|
82
|
-
if prefix is not None:
|
|
83
|
-
_slicc_raise_mount_guard(p, prefix)
|
|
84
|
-
return _slicc_orig_rename(src, dst, *args, **kwargs)
|
|
85
|
-
|
|
86
|
-
_slicc_builtins.open = _slicc_guarded_builtins_open
|
|
87
|
-
_slicc_io.open = _slicc_guarded_io_open
|
|
88
|
-
_slicc_os.listdir = _slicc_make_path_guard(_slicc_orig_listdir)
|
|
89
|
-
_slicc_os.scandir = _slicc_make_path_guard(_slicc_orig_scandir)
|
|
90
|
-
_slicc_os.stat = _slicc_make_path_guard(_slicc_orig_stat)
|
|
91
|
-
_slicc_os.lstat = _slicc_make_path_guard(_slicc_orig_lstat)
|
|
92
|
-
_slicc_os.mkdir = _slicc_make_path_guard(_slicc_orig_mkdir)
|
|
93
|
-
_slicc_os.remove = _slicc_make_path_guard(_slicc_orig_remove)
|
|
94
|
-
_slicc_os.rename = _slicc_guarded_rename
|
|
95
|
-
`)}finally{try{e.runPython(`del __slicc_mount_data`)}catch{}}}var T=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()}};function E(e){return{listdir(t){return e.call(`vfs`,`readDir`,[t])},async readBytes(t){let n=await e.call(`vfs`,`readFileBinary`,[t]);return n instanceof Uint8Array?n:new Uint8Array(n)},async writeBytes(t,n){await e.call(`vfs`,`writeFileBinary`,[t,n])},stat(t){return e.call(`vfs`,`stat`,[t])},exists(t){return e.call(`vfs`,`exists`,[t])},async mkdir(t){await e.call(`vfs`,`mkdir`,[t])},async remove(t){await e.call(`vfs`,`rm`,[t])}}}async function D(e,t){let n=E(t);e.registerJsModule(`_slicc_fs_js`,n),await e.runPythonAsync(`
|
|
96
|
-
import sys
|
|
97
|
-
import types
|
|
98
|
-
import js
|
|
99
|
-
|
|
100
|
-
def _build_slicc_module(_bridge):
|
|
101
|
-
fs_module = types.ModuleType("slicc.fs")
|
|
102
|
-
|
|
103
|
-
async def listdir(path):
|
|
104
|
-
result = await _bridge.listdir(path)
|
|
105
|
-
return [str(name) for name in result.to_py()] if hasattr(result, "to_py") else [str(name) for name in result]
|
|
106
|
-
|
|
107
|
-
async def read_bytes(path):
|
|
108
|
-
result = await _bridge.readBytes(path)
|
|
109
|
-
# Pyodide returns JS Uint8Array as memoryview; coerce to bytes.
|
|
110
|
-
if hasattr(result, "to_bytes"):
|
|
111
|
-
return result.to_bytes()
|
|
112
|
-
if isinstance(result, memoryview):
|
|
113
|
-
return bytes(result)
|
|
114
|
-
return bytes(result)
|
|
115
|
-
|
|
116
|
-
async def read_text(path, encoding="utf-8"):
|
|
117
|
-
data = await read_bytes(path)
|
|
118
|
-
return data.decode(encoding)
|
|
119
|
-
|
|
120
|
-
async def write_bytes(path, data):
|
|
121
|
-
if isinstance(data, str):
|
|
122
|
-
raise TypeError("write_bytes expects bytes-like; use write_text for str")
|
|
123
|
-
if isinstance(data, (bytes, bytearray, memoryview)):
|
|
124
|
-
payload = bytes(data)
|
|
125
|
-
else:
|
|
126
|
-
payload = bytes(data)
|
|
127
|
-
# Convert Python bytes to a real JS Uint8Array before crossing
|
|
128
|
-
# the realm RPC boundary. The bridge call ultimately hits
|
|
129
|
-
# \`port.postMessage\` (see realm-rpc.ts), which structured-
|
|
130
|
-
# clones its argument; a Python \`bytes\` would arrive as a
|
|
131
|
-
# PyProxy and trigger DataCloneError. \`js.Uint8Array.new\`
|
|
132
|
-
# copies the buffer into a JS typed array that clones cleanly.
|
|
133
|
-
await _bridge.writeBytes(path, js.Uint8Array.new(payload))
|
|
134
|
-
|
|
135
|
-
async def write_text(path, text, encoding="utf-8"):
|
|
136
|
-
if not isinstance(text, str):
|
|
137
|
-
raise TypeError("write_text expects str; use write_bytes for bytes")
|
|
138
|
-
await write_bytes(path, text.encode(encoding))
|
|
139
|
-
|
|
140
|
-
async def stat(path):
|
|
141
|
-
result = await _bridge.stat(path)
|
|
142
|
-
obj = result.to_py() if hasattr(result, "to_py") else result
|
|
143
|
-
if isinstance(obj, dict):
|
|
144
|
-
return {
|
|
145
|
-
"isDirectory": bool(obj.get("isDirectory", False)),
|
|
146
|
-
"isFile": bool(obj.get("isFile", False)),
|
|
147
|
-
"size": int(obj.get("size", 0)),
|
|
148
|
-
}
|
|
149
|
-
return {
|
|
150
|
-
"isDirectory": bool(getattr(obj, "isDirectory", False)),
|
|
151
|
-
"isFile": bool(getattr(obj, "isFile", False)),
|
|
152
|
-
"size": int(getattr(obj, "size", 0)),
|
|
153
|
-
}
|
|
154
|
-
|
|
155
|
-
async def exists(path):
|
|
156
|
-
result = await _bridge.exists(path)
|
|
157
|
-
return bool(result)
|
|
158
|
-
|
|
159
|
-
async def mkdir(path, parents=False):
|
|
160
|
-
# The underlying vfs.mkdir is recursive ({recursive: true} in
|
|
161
|
-
# realm-host.ts), matching parents=True semantics. With
|
|
162
|
-
# parents=False we raise FileExistsError when the target
|
|
163
|
-
# already exists, mirroring pathlib.Path.mkdir(parents=False).
|
|
164
|
-
if not parents:
|
|
165
|
-
try:
|
|
166
|
-
already = await exists(path)
|
|
167
|
-
except Exception:
|
|
168
|
-
already = False
|
|
169
|
-
if already:
|
|
170
|
-
raise FileExistsError(path)
|
|
171
|
-
await _bridge.mkdir(path)
|
|
172
|
-
|
|
173
|
-
async def remove(path):
|
|
174
|
-
await _bridge.remove(path)
|
|
175
|
-
|
|
176
|
-
async def walk(path):
|
|
177
|
-
results = []
|
|
178
|
-
async def _visit(current):
|
|
179
|
-
names = await listdir(current)
|
|
180
|
-
dirnames = []
|
|
181
|
-
filenames = []
|
|
182
|
-
for name in names:
|
|
183
|
-
child = current + "/" + name if current != "/" else "/" + name
|
|
184
|
-
try:
|
|
185
|
-
st = await stat(child)
|
|
186
|
-
except Exception:
|
|
187
|
-
continue
|
|
188
|
-
if st["isDirectory"]:
|
|
189
|
-
dirnames.append(name)
|
|
190
|
-
elif st["isFile"]:
|
|
191
|
-
filenames.append(name)
|
|
192
|
-
results.append((current, dirnames, filenames))
|
|
193
|
-
for d in list(dirnames):
|
|
194
|
-
child = current + "/" + d if current != "/" else "/" + d
|
|
195
|
-
await _visit(child)
|
|
196
|
-
await _visit(path)
|
|
197
|
-
return results
|
|
198
|
-
|
|
199
|
-
fs_module.listdir = listdir
|
|
200
|
-
fs_module.read_bytes = read_bytes
|
|
201
|
-
fs_module.read_text = read_text
|
|
202
|
-
fs_module.write_bytes = write_bytes
|
|
203
|
-
fs_module.write_text = write_text
|
|
204
|
-
fs_module.stat = stat
|
|
205
|
-
fs_module.exists = exists
|
|
206
|
-
fs_module.mkdir = mkdir
|
|
207
|
-
fs_module.remove = remove
|
|
208
|
-
fs_module.walk = walk
|
|
209
|
-
|
|
210
|
-
slicc_module = types.ModuleType("slicc")
|
|
211
|
-
slicc_module.fs = fs_module
|
|
212
|
-
sys.modules["slicc"] = slicc_module
|
|
213
|
-
sys.modules["slicc.fs"] = fs_module
|
|
214
|
-
return slicc_module
|
|
215
|
-
|
|
216
|
-
import _slicc_fs_js as _bridge
|
|
217
|
-
_build_slicc_module(_bridge)
|
|
218
|
-
del _build_slicc_module
|
|
219
|
-
del _bridge
|
|
220
|
-
`)}`${e(`pyodide`,`0.29.4`)}`;async function O(e,t,n=()=>import(`./pyodide-M7UA50Oh.js`)){let r=[],i=[],a=new T(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=[],u=e.mountPoints??[],d=new Set(u.map(e=>e.path));if(e.opfsMountDbName!==void 0)try{l=(await M(o,s,e.opfsMountDbName,c,{skipMountPaths:d})).mounts}catch(e){c(`VFS→Pyodide OPFS mount failed: ${A(e)}`)}if(u.length>0){try{S(o.FS,u.map(e=>e.path),c)}catch(e){c(`bomb overlay install failed: ${A(e)}`)}try{await w(o,u.map(e=>e.path))}catch(e){c(`python mount guard install failed: ${A(e)}`)}}try{await D(o,a)}catch(e){c(`slicc.fs registration failed: ${A(e)}`)}try{o.FS.chdir(e.cwd)}catch{}o.setStdout({batched:e=>r.push(e+`
|
|
221
|
-
`)}),o.setStderr({batched:e=>i.push(e+`
|
|
222
|
-
`)});let f=!1;o.setStdin({stdin:()=>f||!e.stdin?null:(f=!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 p;try{await o.runPythonAsync(`
|
|
223
|
-
import sys
|
|
224
|
-
import traceback
|
|
225
|
-
|
|
226
|
-
__slicc_exit_code = 0
|
|
227
|
-
try:
|
|
228
|
-
sys.argv = __slicc_argv
|
|
229
|
-
exec(compile(__slicc_code, __slicc_filename, "exec"), {"__name__": "__main__", "__file__": __slicc_filename})
|
|
230
|
-
except SystemExit as exc:
|
|
231
|
-
code = exc.code
|
|
232
|
-
if code is None:
|
|
233
|
-
__slicc_exit_code = 0
|
|
234
|
-
elif isinstance(code, int):
|
|
235
|
-
__slicc_exit_code = code
|
|
236
|
-
else:
|
|
237
|
-
print(code, file=sys.stderr)
|
|
238
|
-
__slicc_exit_code = 1
|
|
239
|
-
except BaseException:
|
|
240
|
-
traceback.print_exc()
|
|
241
|
-
__slicc_exit_code = 1
|
|
242
|
-
`);let e=o.globals.get(`__slicc_exit_code`);p=typeof e==`number`?e:Number(e??1)}catch(e){let t=e instanceof Error?e.message:String(e);i.push(`${t}\n`),p=1}try{o.runPython(`del __slicc_code, __slicc_filename, __slicc_argv, __slicc_exit_code`)}catch{}if(e.opfsMountDbName!==void 0)try{await P(l)}catch(e){c(`Pyodide→VFS OPFS flush failed: ${e instanceof Error?e.message:String(e)}`)}a.dispose();let m={type:`realm-done`,stdout:r.join(``),stderr:i.join(``),exitCode:p};t.postMessage(m)}const k=new Set([`dev`,`proc`,`lib`,`tmp`,`home`]);function A(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 j(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 M(e,t,n,r=()=>{},i={}){let a=[],o=i.skipMountPaths??new Set,s=navigator.storage;if(!s?.getDirectory)return r(`VFS→Pyodide OPFS mount skipped: navigator.storage.getDirectory unavailable`),{mounts:a};let c;try{c=await s.getDirectory()}catch(e){return r(`VFS→Pyodide OPFS mount: getDirectory() failed: ${A(e)}`),{mounts:a}}let l;try{l=await c.getDirectoryHandle(n,{create:!0})}catch(e){return r(`VFS→Pyodide OPFS mount: opening '${n}' failed: ${A(e)}`),{mounts:a}}let u=j(e);for(let n of t){if(n===`/`){try{let t=l;for await(let[n,i]of t){if(i.kind!==`directory`||k.has(n))continue;let t=`/${n}`;if(!o.has(t))try{await N(e,u,t,i,a)}catch(e){r(`VFS→Pyodide OPFS mount '${t}' failed: ${A(e)}`)}}}catch(e){r(`VFS→Pyodide OPFS mount '/' failed: ${A(e)}`)}continue}if(!o.has(n))try{let t=l;for(let e of n.split(`/`).filter(Boolean))t=await t.getDirectoryHandle(e,{create:!0});await N(e,u,n,t,a)}catch(e){r(`VFS→Pyodide OPFS mount '${n}' failed: ${A(e)}`)}}return{mounts:a}}async function N(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 P(e){for(let t of e)await c(t.mount),await t.flushBuffers(t.rootHandle)}const F={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`&&O(t,F).catch(e=>{let t={type:`realm-error`,message:e instanceof Error?e.message:String(e)};self.postMessage(t)})});
|