sliccy 6.136.0 → 6.136.1
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/.vite/manifest.json +140 -139
- package/dist/ui/assets/{SKILL-CLNwFz3P.js → SKILL-Dkk5iZlJ.js} +1 -1
- package/dist/ui/assets/{account-store-CG9Pz134.js → account-store-BzCpAbzU.js} +1 -1
- package/dist/ui/assets/{account-store-B8IgsGFb.js → account-store-IBc-Swl2.js} +1 -1
- package/dist/ui/assets/{adobe-BgPcRuIn.js → adobe-BlUDEEVT.js} +1 -1
- package/dist/ui/assets/{adobe-DJimoIir.js → adobe-xtVVXp2q.js} +1 -1
- package/dist/ui/assets/{agent-bridge-WC9o6r65.js → agent-bridge-Bgb7xaDh.js} +1 -1
- package/dist/ui/assets/{apply-layout-Dv1RaUFe.js → apply-layout-l78p8Bos.js} +1 -1
- package/dist/ui/assets/{apps-BOBYtKMD.js → apps-DDo9wnih.js} +1 -1
- package/dist/ui/assets/{azure-openai-CSeH1BDL.js → azure-openai-CRb9ZtBO.js} +1 -1
- package/dist/ui/assets/{azure-openai-C1v6YymB.js → azure-openai-zWPF524s.js} +1 -1
- package/dist/ui/assets/{cdp-0LZ0nstT.js → cdp-DKhmYptD.js} +1 -1
- package/dist/ui/assets/{cerebras-BUohc5O0.js → cerebras-COu_QlOd.js} +1 -1
- package/dist/ui/assets/{cerebras-C4a_X7D8.js → cerebras-DtLUDEbM.js} +1 -1
- package/dist/ui/assets/{connect-surface-D2e8Twf-.js → connect-surface-B4G8l--y.js} +1 -1
- package/dist/ui/assets/{dip-DjZvvl_D.js → dip-DySyh98z.js} +4 -4
- package/dist/ui/assets/{directed-approval-rMofdevJ.js → directed-approval-CZK0YFwX.js} +1 -1
- package/dist/ui/assets/{fs-DX7ZCHzZ.js → fs-BXsWV91k.js} +2 -2
- package/dist/ui/assets/{fs-Brsg4Rlu.js → fs-D5rn9Yg2.js} +1 -1
- package/dist/ui/assets/{github-D0j7COIL.js → github-CJd5WOrc.js} +1 -1
- package/dist/ui/assets/{github-BsDD6b6E.js → github-DzUDXVwm.js} +2 -2
- package/dist/ui/assets/{github-copilot-DmmtmUPS.js → github-copilot-CPDNi2pJ.js} +1 -1
- package/dist/ui/assets/{github-copilot-DJnyx6Kk.js → github-copilot-OMKzjJ2o.js} +1 -1
- package/dist/ui/assets/{github-install-DHWvp_ed.js → github-install-DY3uazWz.js} +1 -1
- package/dist/ui/assets/{github-zip-C7RqBdik.js → github-zip-BGeyA2Li.js} +1 -1
- package/dist/ui/assets/{help-Db3oErKr.js → help-CjuK8HDa.js} +1 -1
- package/dist/ui/assets/{js-realm-worker-7yCsdyVv.js → js-realm-worker-Ca9s6UEK.js} +1 -1
- package/dist/ui/assets/{kernel-worker-B28ddZ6G.js → kernel-worker-CC7asGg9.js} +31 -31
- package/dist/ui/assets/{local-llm-jlZx1MJC.js → local-llm-C4lmoelF.js} +1 -1
- package/dist/ui/assets/{local-llm-Xuq1mj9S.js → local-llm-DZ9jctP2.js} +1 -1
- package/dist/ui/assets/{main-DtQE8ZJN.js → main-CcfFeq6P.js} +3 -3
- package/dist/ui/assets/{main-cherry-BRvnemBM.js → main-cherry-Ibu56rin.js} +1 -1
- package/dist/ui/assets/{mount-CSNG1HDe.js → mount-DbUK_ouC.js} +3 -3
- package/dist/ui/assets/{mount-recovery-DG2kvUyT.js → mount-recovery-Dzskgqa7.js} +1 -1
- package/dist/ui/assets/{mount-dY50JDIC.js → mount-vbEbpo4N.js} +1 -1
- package/dist/ui/assets/{new-session-Ba4480Kn.js → new-session-BscrQvQH.js} +2 -2
- package/dist/ui/assets/{oauth-bootstrap-CSqwVxsH.js → oauth-bootstrap-CCnmEqBW.js} +2 -2
- package/dist/ui/assets/{openai-codex-uDeSXi0c.js → openai-codex-B-7bpkdM.js} +1 -1
- package/dist/ui/assets/{openai-codex-D0gE5hCX.js → openai-codex-BO7ubdvf.js} +1 -1
- package/dist/ui/assets/{openrouter-KPrk7aTG.js → openrouter-C2yH1Eg2.js} +1 -1
- package/dist/ui/assets/{openrouter-CELFnxj8.js → openrouter-c4UnAH0g.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-CRIb5OcK.js → openrouter-oauth-DOOgBCk9.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-C9851OCp.js → openrouter-oauth-SIQYiorE.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-zoyvF7_M.js → panel-rpc-handlers-DAdmCiAM.js} +2 -2
- package/dist/ui/assets/{provider-BuVKaW63.js → provider-DHmZizbV.js} +1 -1
- package/dist/ui/assets/{provider-DXM2_o56.js → provider-DSOEMASd.js} +2 -2
- package/dist/ui/assets/provider-settings-BS8lFD1q.js +1 -0
- package/dist/ui/assets/{provider-settings-BusT_5Y1.js → provider-settings-CGwq2ZSe.js} +1 -1
- package/dist/ui/assets/{provider-store-access-BJulUz_a.js → provider-store-access-CMRf7M8N.js} +2 -2
- package/dist/ui/assets/provider-store-access-CVOw7bhE.js +1 -0
- package/dist/ui/assets/{providers-CxGK6Fqy.js → providers-DEZ_uN7Q.js} +2 -2
- package/dist/ui/assets/{providers-IZ5cNVfA.js → providers-DfgkYKp3.js} +1 -1
- package/dist/ui/assets/{quick-llm-DBwEP6q1.js → quick-llm-CTm8kfpN.js} +1 -1
- package/dist/ui/assets/{recovery-screen-D1reb-pz.js → recovery-screen-D7czDrGy.js} +1 -1
- package/dist/ui/assets/{run-jqtaDwYu.js → run-BbwmmE0l.js} +1 -1
- package/dist/ui/assets/{run-Bo2fK4R4.js → run-CMPmBjRA.js} +1 -1
- package/dist/ui/assets/{run-BjclDk0Z.js → run-kHiTfPA_.js} +2 -2
- package/dist/ui/assets/{session-freezer-kUAj24xS.js → session-freezer-C7H1VByB.js} +3 -3
- package/dist/ui/assets/{setup-feature-flags-remote-CkzzcYU8.js → setup-feature-flags-remote-J95n02lO.js} +1 -1
- package/dist/ui/assets/{setup-standalone-prelude-C4d7EdCJ.js → setup-standalone-prelude-L6dqa7or.js} +2 -2
- package/dist/ui/assets/{setup-sudo-Fk7Y7Qt-.js → setup-sudo-DXCFEDCh.js} +2 -2
- package/dist/ui/assets/{skills-BAQj3H1g.js → skills-DLlIa_OZ.js} +1 -1
- package/dist/ui/assets/slicc-version-C8iZhVsg.js +1 -0
- package/dist/ui/assets/{snapshot-Cfd5BBqA.js → snapshot-BWdwScwG.js} +1 -1
- package/dist/ui/assets/{snapshot-features-Bluz5JNp.js → snapshot-features-CHwnS5pR.js} +1 -1
- package/dist/ui/assets/sprinkle-bridge-CeRz-DjR.js +2 -0
- package/dist/ui/assets/{sprinkle-manager-CtUCzppZ.js → sprinkle-manager-jHNM2oxy.js} +1 -1
- package/dist/ui/assets/{sprinkle-renderer-DJyQFvKt.js → sprinkle-renderer-Ce6YjEek.js} +72 -13
- package/dist/ui/assets/{state-99acinkj.js → state-BaXCc20k.js} +1 -1
- package/dist/ui/assets/{store-D48jOp3G.js → store-BDD3IHgP.js} +1 -1
- package/dist/ui/assets/{store-GRTMEtdq.js → store-Ca4Dnbdu.js} +1 -1
- package/dist/ui/assets/{sudo-BMl-vlg6.js → sudo-CA0RFOLj.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-DH1eohPP.js → upgrade-detection-C145Khtm.js} +1 -1
- package/dist/ui/assets/{wc-extension-CY666K0U.js → wc-extension-Bi0TRT8Q.js} +2 -2
- package/dist/ui/assets/{wc-follower-BWQOhNee.js → wc-follower-Bo_J3jq5.js} +3 -3
- package/dist/ui/assets/{wc-follower-oauth-ClOA_w6r.js → wc-follower-oauth-DCz20htV.js} +1 -1
- package/dist/ui/assets/{wc-live-B1dex7oL.js → wc-live-NRwfoCVf.js} +3 -3
- package/dist/ui/assets/{wc-nav-DVdmQDvN.js → wc-nav-DrHMR3BW.js} +2 -2
- package/dist/ui/assets/{wc-onboarding-NYG1uBXD.js → wc-onboarding-De4Igl1i.js} +2 -2
- package/dist/ui/assets/{wc-placeholder-MzB6mEv3.js → wc-placeholder-DPzXeItf.js} +2 -2
- package/dist/ui/assets/{wc-settings-DyL5gfGi.js → wc-settings-CVX_pOD-.js} +2 -2
- package/dist/ui/assets/{wc-shell-DchXcP-_.js → wc-shell-DgmtA7sH.js} +2 -2
- package/dist/ui/assets/{wc-sprinkles-DtoxWB3_.js → wc-sprinkles-FfifZkuL.js} +2 -2
- package/dist/ui/assets/{wc-tray-DWjggXZK.js → wc-tray-DJF61Czu.js} +4 -4
- package/dist/ui/assets/{xai-grok-BnXKBV79.js → xai-grok-9c2GZFuB.js} +1 -1
- package/dist/ui/assets/{xai-grok-BTJ50D3E.js → xai-grok-DrI5c3BY.js} +1 -1
- package/dist/ui/index.html +6 -6
- package/dist/ui/packages/webapp/index.html +6 -6
- package/package.json +1 -1
- package/dist/ui/assets/provider-settings-CHgRgntH.js +0 -1
- package/dist/ui/assets/provider-store-access-BSv6hr_9.js +0 -1
- package/dist/ui/assets/slicc-version-C3ORozzC.js +0 -1
- package/dist/ui/assets/sprinkle-bridge-B8DKuaxn.js +0 -2
|
@@ -92,7 +92,7 @@ Examples:
|
|
|
92
92
|
--authorize-url 'https://auth.x.ai/oauth2/auth?...' \\
|
|
93
93
|
--redirect-pattern 'http://127.0.0.1:56121/*'
|
|
94
94
|
curl -H "Authorization: Bearer $(oauth-token github)" https://api.github.com/user
|
|
95
|
-
`}async function d(n,r){let i=await import(`./account-store-
|
|
95
|
+
`}async function d(n,r){let i=await import(`./account-store-IBc-Swl2.js`).then(e=>e.t),a=await import(`./providers-DfgkYKp3.js`).then(e=>e.r);if(t(n,{valueFlags:c}))return{stdout:u(),stderr:``,exitCode:0};let o=e(n,{value:c,bool:l});if(`error`in o)return H(`oauth-token: ${o.error}`);if(o.bools.has(`--list`))return U(i.getAccounts,a.getRegisteredProviderIds,a.getRegisteredProviderConfig,i.getOAuthAccountInfo);if(o.bools.has(`--check`))return T(o.positionals);if(o.bools.has(`--expire`))return O(o.positionals);if(o.bools.has(`--renew`))return k(o.positionals);if(o.values.has(`--from-file`)||o.bools.has(`--intercept`))return L(o,n,r);let s=f(o);if(!s.ok)return s.result;let d=o.bools.has(`--force-login`),m=p(o,i,a);if(!m.ok)return m.result;let _=h(m.value,a.getRegisteredProviderConfig);if(!_.ok)return _.result;if(!d){let e=await g(m.value,_.value,i.getOAuthAccountInfo,i.ensureOAuthMaskReplica,s.value);if(e?.ok)return e.value;if(e)return e.result}return b(m.value,_.value,s.value,i.getOAuthAccountInfo,i.ensureOAuthMaskReplica)}function f(e){if(!e.values.has(`--scope`))return{ok:!0,value:void 0};let t=e.values.get(`--scope`)?.trim();return!t||t.startsWith(`-`)?{ok:!1,result:H(`oauth-token: --scope requires a value`)}:{ok:!0,value:t}}function p(e,t,n){if(e.values.has(`--provider`)){let t=e.values.get(`--provider`);return t?{ok:!0,value:t}:{ok:!1,result:H(`oauth-token: --provider requires a value`)}}if(e.positionals.length>0)return{ok:!0,value:e.positionals[0]};let r=t.getSelectedProvider();if(m(n.getRegisteredProviderConfig(r)))return{ok:!0,value:r};let i=n.getRegisteredProviderIds().find(e=>m(n.getRegisteredProviderConfig(e)));return i?{ok:!0,value:i}:{ok:!1,result:H(`oauth-token: no OAuth providers configured`)}}function m(e){return!!(e?.isOAuth&&(e.onOAuthLogin||e.onOAuthLoginIntercepted))}function h(e,t){let n=t(e);return n?m(n)?{ok:!0,value:n}:{ok:!1,result:H(`oauth-token: provider "${e}" is not an OAuth provider`)}:{ok:!1,result:H(`oauth-token: unknown provider "${e}"`)}}async function g(e,t,n,r,i){let a=n(e);return a&&!a.expired?_(e,a,i,r):!a?.expired||!t.onSilentRenew||!await C(t.onSilentRenew)?null:_(e,n(e),i,r)}async function _(e,t,n,r){if(n&&!s(t?.scopes,n))return null;let i=v(t?.maskedValue,t?.token);if(i)return{ok:!0,value:i};if(!t?.token)return null;let a=await r(e)??{},o=v(a.maskedValue,t.token);return o?{ok:!0,value:o}:{ok:!1,result:y(e,a.error)}}function v(e,t){return!e||t&&e===t?null:{stdout:`${e}\n`,stderr:``,exitCode:0}}function y(e,t){return H(`oauth-token: token held for ${e} but no masked replica${t?` (${t})`:``}`)}async function b(e,t,n,r,i){try{let a=await x(e,t,n);return a.error?a.error:S(e,r,i,a.succeeded)}catch(t){let n=t instanceof Error?t.message:String(t);return t instanceof Error&&t.name===`OAuthLaunchError`?(console.error(`[oauth-token] Provider ${e}: login could not be shown:`,n),H(`oauth-token: ${n}`)):(console.error(`[oauth-token] Provider ${e}: login failed:`,n),H(`oauth-token: login failed: ${n}`))}}async function x(e,t,n){let r=n?{scopes:n}:void 0,i=!1,a=()=>{i=!0};if(t.onOAuthLoginIntercepted){let{createInterceptingOAuthLauncherForCurrentRuntime:n}=await import(`./oauth-service-Bconf2Pz.js`),o=await n();return o?(await t.onOAuthLoginIntercepted(o,a,r),{error:null,succeeded:i}):{error:H(`oauth-token: provider "${e}" needs the controlled-browser interceptor, but no CDP transport is available in this runtime.`),succeeded:!1}}if(t.onOAuthLogin){let{createOAuthLauncher:e}=await import(`./oauth-service-Bconf2Pz.js`);return await t.onOAuthLogin(e(),a,r),{error:null,succeeded:i}}return{error:H(`oauth-token: provider "${e}" has no OAuth login hook`),succeeded:!1}}async function S(e,t,n,r){if(!r)return console.error(`[oauth-token] Provider ${e}: interactive login was not completed`),H(`oauth-token: interactive login was not completed (cancelled, timed out, or no one could approve it)`);let i=t(e);if(i?.token&&!i.expired){let t=v(i.maskedValue,i.token);if(t)return t;let r=await n(e)??{};return v(r.maskedValue,i.token)||y(e,r.error)}return i?.token?H(`oauth-token: login completed but the saved token is already expired`):(console.error(`[oauth-token] Provider ${e}: login completed but no token was saved`),H(`oauth-token: login completed but no token was saved`))}async function C(e){try{return await e()!==null}catch{return!1}}function w(e,t,n,r,i){let a=e[0];if(a)return a;let o=n();return r(o)?.[t]?o:i().find(e=>r(e)?.[t])}async function T(e){let{getSelectedProvider:t,getOAuthAccountInfo:n}=await import(`./account-store-IBc-Swl2.js`).then(e=>e.t),{getRegisteredProviderConfig:r,getRegisteredProviderIds:i}=await import(`./providers-DfgkYKp3.js`).then(e=>e.r),a=w(e,`onValidateToken`,t,r,i);if(!a)return H(`oauth-token --check: no provider supports an upstream token check`);let o=r(a);if(!o)return H(`oauth-token --check: unknown provider "${a}"`);if(!o.onValidateToken)return H(`oauth-token --check: provider "${a}" cannot be checked upstream (no onValidateToken hook); only locally stored state is known.`);let s=n(a),c=[`oauth-token --check ${a}`,` stored token: ${F(s)}`];if(!s)return c.push(` upstream check: skipped — nothing to check`,...M(a)),{stdout:c.join(`
|
|
96
96
|
`)+`
|
|
97
97
|
`,stderr:``,exitCode:3};let l=await j(o);if(l?.status===`accepted`){let e=l.userName?` (as ${l.userName})`:``;return c.push(` upstream check: ACCEPTED${e} — the provider honoured the token`),{stdout:c.join(`
|
|
98
98
|
`)+`
|
|
@@ -100,7 +100,7 @@ Examples:
|
|
|
100
100
|
`)+`
|
|
101
101
|
`,stderr:``,exitCode:e}}return c.push(` upstream check: UNKNOWN — the check itself could not run${D(l?.detail)}`,` This says nothing about the token. Retry when the provider is reachable.`),{stdout:c.join(`
|
|
102
102
|
`)+`
|
|
103
|
-
`,stderr:``,exitCode:1}}function E(e,t,n){let r=` upstream check: REJECTED — the provider refused the token${D(n)}`;return t?[r,` A stored refresh token may still be able to replace it — silent renewal`,` has not been tried yet.`,``,` → Next: oauth-token ${e} --renew`,` If that is declined too: oauth-token ${e} --force-login (needs a human).`]:[r,` This provider has no silent renewal, so nothing automated is left.`,...M(e)]}function D(e){return e?` (${e})`:``}async function O(e){let{getAccounts:t,getSelectedProvider:n,saveOAuthAccount:r}=await import(`./account-store-
|
|
103
|
+
`,stderr:``,exitCode:1}}function E(e,t,n){let r=` upstream check: REJECTED — the provider refused the token${D(n)}`;return t?[r,` A stored refresh token may still be able to replace it — silent renewal`,` has not been tried yet.`,``,` → Next: oauth-token ${e} --renew`,` If that is declined too: oauth-token ${e} --force-login (needs a human).`]:[r,` This provider has no silent renewal, so nothing automated is left.`,...M(e)]}function D(e){return e?` (${e})`:``}async function O(e){let{getAccounts:t,getSelectedProvider:n,saveOAuthAccount:r}=await import(`./account-store-IBc-Swl2.js`).then(e=>e.t),{getRegisteredProviderConfig:i,getRegisteredProviderIds:a}=await import(`./providers-DfgkYKp3.js`).then(e=>e.r),o=w(e,`onSilentRenew`,n,i,a);if(!o)return H(`oauth-token --expire: no provider supports silent renewal`);let s=i(o);if(!s)return H(`oauth-token --expire: unknown provider "${o}"`);if(!s.onSilentRenew)return H(`oauth-token --expire: provider "${o}" has no onSilentRenew hook`);let c=t().find(e=>e.providerId===o);if(!c?.accessToken)return H(`oauth-token --expire: no stored OAuth account for "${o}"`);try{await r({...c,accessToken:c.accessToken,tokenExpiresAt:Date.now()-1e3})}catch(e){return H(`oauth-token --expire: failed to update "${o}": ${e instanceof Error?e.message:String(e)}`)}return{stdout:`oauth-token ${o}: stored token marked expired; next network op will trigger silent renewal.\n`,stderr:``,exitCode:0}}async function k(e){let{getSelectedProvider:t,getOAuthAccountInfo:n}=await import(`./account-store-IBc-Swl2.js`).then(e=>e.t),{getRegisteredProviderConfig:r,getRegisteredProviderIds:i}=await import(`./providers-DfgkYKp3.js`).then(e=>e.r),a=w(e,`onSilentRenew`,t,r,i);if(!a)return H(`oauth-token --renew: no provider supports silent renewal`);let o=r(a);if(!o)return H(`oauth-token --renew: unknown provider "${a}"`);if(!o.onSilentRenew)return H(`oauth-token --renew: provider "${a}" has no onSilentRenew hook`);let s=n(a),c=s?.token,l=[`oauth-token --renew ${a}`];l.push(` stored token: ${F(s)}`);let u=null,d=null;try{u=await o.onSilentRenew()}catch(e){d=e instanceof Error?e.message:String(e)}if(u){let e=n(a),t=!!(c&&e?.token&&c!==e.token);return l.push(` silent renewal: SUCCESS${t?` — token refreshed`:` (token unchanged)`}`),l.push(` renewed token: ${F(e)}`),{stdout:l.join(`
|
|
104
104
|
`)+`
|
|
105
105
|
`,stderr:``,exitCode:0}}if(d)return l.push(` silent renewal: ERROR — ${d}`,...P(a)),{stdout:l.join(`
|
|
106
106
|
`)+`
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/quick-llm-
|
|
2
|
-
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{$ as t,Q as n,et as r}from"./account-store-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/quick-llm-CTm8kfpN.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/account-store-BzCpAbzU.js","assets/preload-helper-Czpn1I53.js","assets/claude-model-version-BJLrDjmH.js","assets/models-BSkXF4T6.js","assets/diagnostics-DN_idNHx.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-B-zmcypy.js","assets/libesm-BypnjKEL.js","assets/logger-DDBAeTLF.js","assets/proxied-fetch-CiijUcSt.js","assets/base64-DJRlyqZu.js","assets/fetch-body-D2PwksUW.js","assets/api-endpoint-DGxXvrur.js","assets/runtime-env-Dlaokqg1.js","assets/float-topology-hfgMx1Yq.js","assets/secret-topology-Yt0aO4Gz.js","assets/secrets-bridge-client-BVl0YuB2.js","assets/port-bridge-client-C1tBBqwu.js","assets/image-markers-BFDmhPy4.js","assets/tool-ui-eSQ1g2I1.js","assets/providers-DEZ_uN7Q.js","assets/panel-rpc-B3MSVImO.js","assets/bedrock-camp-compat-CgBMwna8.js","assets/llm-session-id-bZQs6gBN.js","assets/icons-D4SDtJW0.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{$ as t,Q as n,et as r}from"./account-store-BzCpAbzU.js";import{t as i}from"./preload-helper-Czpn1I53.js";import{o as a}from"./claude-model-version-BJLrDjmH.js";import{t as o}from"./logger-DDBAeTLF.js";import{r as s}from"./agent-message-to-chat-Df4an5Ei.js";import{t as c}from"./slugify-BYJ6QVAt.js";import{t as l}from"./types-Dgm4REV3.js";import{t as u}from"./icons-D4SDtJW0.js";import{d,f,n as p,r as ee,t as m,u as h}from"./record-DOq72weu.js";import{a as te}from"./dictation-priming-CNllGgNq.js";var ne=`---
|
|
3
3
|
writablePaths:
|
|
4
4
|
- /workspace/CLAUDE.md
|
|
5
5
|
visiblePaths:
|
|
@@ -158,6 +158,6 @@ ${n}
|
|
|
158
158
|
`:``)+(e.live?`live: true
|
|
159
159
|
`:``)+(e.live&&e.liveThrough?`liveThrough: ${e.liveThrough}\n`:``)+(e.live&&e.compactions?`compactions: ${e.compactions}\n`:``),r=`---\nid: ${e.id}\ntitle: ${JSON.stringify(e.title)}\nfrozenAt: ${e.frozenAt}\ncreatedAt: ${e.createdAt}\nupdatedAt: ${e.updatedAt}\nmessageCount: ${e.messageCount}\n`+t+n+`---
|
|
160
160
|
|
|
161
|
-
`,i=`${$e}${JSON.stringify(ot(e.messages)).replace(/-->/g,`-- >`)}${et}\n\n`,a=`# ${e.title}\n\n`;return r+i+a+Qe(e.messages)}async function ct(e){try{let t=await e.readFile(H,{encoding:`utf-8`}),n=typeof t==`string`?t:new TextDecoder().decode(t),r=JSON.parse(n);return Array.isArray(r)?r:[]}catch(e){if(e instanceof l&&e.code!==`ENOENT`)throw e;return[]}}var lt=`slicc:sessions-index`,ut=Promise.resolve();function q(e){let t=()=>{let t=globalThis.navigator?.locks;return typeof t?.request==`function`?t.request(lt,()=>e()):e()},n=ut.then(t,t);return ut=n.then(()=>void 0,()=>void 0),n}function dt(e,t){return e.writeFile(H,JSON.stringify(t,null,2))}async function ft(e,t){await dt(e,[t,...(await ct(e)).filter(e=>e.filename!==t.filename)])}function pt(e,t){return q(()=>ft(e,t))}var mt=e({PENDING_SESSION_ATTEMPT_LIMIT:()=>3,SESSIONS_INDEX_PATH:()=>H,curateFrozenSessionMemories:()=>bt,enrichPendingSession:()=>$,freezeConeSession:()=>yt,listPendingEnrichments:()=>Bt,markSnapshotUnavailable:()=>an,processPendingSessions:()=>Vt,readSessionsIndex:()=>U}),J=o(`session-freezer`),ht=4,gt=2048,_t=40,vt=`${V}/attachments`;async function yt(e){let t=await It(e.sessionStore,Y(e));if(!t||t.messages.length<ht)return J.info(`Skipping freeze: session below threshold or missing`,{messageCount:t?.messages.length??0}),null;let n=X(t.messages),r=e.mode??`full`,i=r===`full`&&!!(e.apiKey&&e.model);!e.agenticMemorySpawn&&e.memory!==`skip`&&await Ct(e,n,i);let a=await wt(e,n,i)||at(t.messages);return await Tt(e,t,a,r,i?await xt(e,a):void 0,!!e.agenticMemorySpawn&&e.memory!==`skip`)}async function bt(e,t){let n=X(t.archive.messages),r;try{r=await Ne({spawn:e.agenticMemorySpawn,vfs:e.vfs,sessionArchivePath:W(t),sessionCount:await w(e.vfs),...e.cone?{cone:e.cone}:{}})}catch(e){r={ok:!1,reason:e instanceof Error?e.message:String(e),legacyFallbackSafe:!1}}if(r.ok){let n=await $t(e.vfs,t.filename);return await Wt(e.vfs,t.filename),n?(delete t.memoryPending,J.info(`Agentic memory pass completed`,{filename:t.filename}),n):(J.info(`Agentic memory pass completed; index entry already gone`,{filename:t.filename}),null)}return await tn(e.vfs,t.filename,r.reason),r.legacyFallbackSafe?(J.warn(`Agentic memory pass failed after finishing — falling back to legacy extraction`,{filename:t.filename,reason:r.reason}),await Ct(e,n,!0),null):(J.warn(`Agentic memory pass unfinished — entry stays pending for boot catch-up`,{filename:t.filename,reason:r.reason,attemptLimit:3}),null)}async function xt(e,t){try{return St(await(e.pickIcon??(await i(async()=>{let{pickLucideIcon:e}=await import(`./quick-llm-
|
|
161
|
+
`,i=`${$e}${JSON.stringify(ot(e.messages)).replace(/-->/g,`-- >`)}${et}\n\n`,a=`# ${e.title}\n\n`;return r+i+a+Qe(e.messages)}async function ct(e){try{let t=await e.readFile(H,{encoding:`utf-8`}),n=typeof t==`string`?t:new TextDecoder().decode(t),r=JSON.parse(n);return Array.isArray(r)?r:[]}catch(e){if(e instanceof l&&e.code!==`ENOENT`)throw e;return[]}}var lt=`slicc:sessions-index`,ut=Promise.resolve();function q(e){let t=()=>{let t=globalThis.navigator?.locks;return typeof t?.request==`function`?t.request(lt,()=>e()):e()},n=ut.then(t,t);return ut=n.then(()=>void 0,()=>void 0),n}function dt(e,t){return e.writeFile(H,JSON.stringify(t,null,2))}async function ft(e,t){await dt(e,[t,...(await ct(e)).filter(e=>e.filename!==t.filename)])}function pt(e,t){return q(()=>ft(e,t))}var mt=e({PENDING_SESSION_ATTEMPT_LIMIT:()=>3,SESSIONS_INDEX_PATH:()=>H,curateFrozenSessionMemories:()=>bt,enrichPendingSession:()=>$,freezeConeSession:()=>yt,listPendingEnrichments:()=>Bt,markSnapshotUnavailable:()=>an,processPendingSessions:()=>Vt,readSessionsIndex:()=>U}),J=o(`session-freezer`),ht=4,gt=2048,_t=40,vt=`${V}/attachments`;async function yt(e){let t=await It(e.sessionStore,Y(e));if(!t||t.messages.length<ht)return J.info(`Skipping freeze: session below threshold or missing`,{messageCount:t?.messages.length??0}),null;let n=X(t.messages),r=e.mode??`full`,i=r===`full`&&!!(e.apiKey&&e.model);!e.agenticMemorySpawn&&e.memory!==`skip`&&await Ct(e,n,i);let a=await wt(e,n,i)||at(t.messages);return await Tt(e,t,a,r,i?await xt(e,a):void 0,!!e.agenticMemorySpawn&&e.memory!==`skip`)}async function bt(e,t){let n=X(t.archive.messages),r;try{r=await Ne({spawn:e.agenticMemorySpawn,vfs:e.vfs,sessionArchivePath:W(t),sessionCount:await w(e.vfs),...e.cone?{cone:e.cone}:{}})}catch(e){r={ok:!1,reason:e instanceof Error?e.message:String(e),legacyFallbackSafe:!1}}if(r.ok){let n=await $t(e.vfs,t.filename);return await Wt(e.vfs,t.filename),n?(delete t.memoryPending,J.info(`Agentic memory pass completed`,{filename:t.filename}),n):(J.info(`Agentic memory pass completed; index entry already gone`,{filename:t.filename}),null)}return await tn(e.vfs,t.filename,r.reason),r.legacyFallbackSafe?(J.warn(`Agentic memory pass failed after finishing — falling back to legacy extraction`,{filename:t.filename,reason:r.reason}),await Ct(e,n,!0),null):(J.warn(`Agentic memory pass unfinished — entry stays pending for boot catch-up`,{filename:t.filename,reason:r.reason,attemptLimit:3}),null)}async function xt(e,t){try{return St(await(e.pickIcon??(await i(async()=>{let{pickLucideIcon:e}=await import(`./quick-llm-CTm8kfpN.js`).then(e=>e.n);return{pickLucideIcon:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27]))).pickLucideIcon)({subject:`"${t}" — an archived chat session`})??void 0)}catch(e){J.warn(`Icon pick failed (freeze still proceeds)`,{error:e instanceof Error?e.message:String(e)});return}}function St(e){if(e)return u(e)?e:void 0}async function Ct(e,t,i){if(!i){J.info(`LLM unavailable — skipping memory extraction; freezing anyway`);return}let a=``;try{a=await r({messages:t,instruction:n,model:e.model,apiKey:e.apiKey,maxTokens:gt,headers:e.headers})}catch(e){J.warn(`Memory extraction call failed (freeze still proceeds)`,{error:e instanceof Error?e.message:String(e)});return}if(!a.trim()||a.trim()===`NONE`){J.info(`Memory extraction returned no durable memories`);return}try{await zt(e.vfs,Ft(Y(e)),a.trim(),`new-session`,{model:e.model,apiKey:e.apiKey,headers:e.headers}),J.info(`Memory extracted and appended on new-session`)}catch(e){J.warn(`Memory append failed`,{error:e instanceof Error?e.message:String(e)})}}async function wt(e,n,i){if(!i)return``;try{return Rt(await r({messages:n,instruction:t,model:e.model,apiKey:e.apiKey,maxTokens:_t,headers:e.headers}))}catch(e){return J.warn(`Title generation call failed (using heuristic)`,{error:e instanceof Error?e.message:String(e)}),``}}async function Tt(e,t,n,r,i,a=!1){let o=new Date().toISOString(),s=Y(e),c=await Lt(e.vfs,s),l=c?.sessionId??crypto.randomUUID(),u=c?.filename??(r===`quick`?`pending-${rt()}.md`:`${o.replace(/[:.]/g,`-`)}-${it(n)}.md`),d=Et(t.messages),f={cone:s,...s!==`cone`&&e.cone?.label?{coneLabel:e.cone.label}:{}},p={filename:u,sessionId:l,title:n,frozenAt:o,messageCount:t.messages.length,...d??{},...f,...i?{icon:i}:{},...r===`quick`||c?{pendingEnrichment:!0}:{},...a?{memoryPending:!0}:{},...e.memory===`skip`?{memorySkipped:!0}:{}};try{await Z(e.vfs,V);let r=await kt(e.vfs,t.messages,u.replace(/\.md$/,``)),i={id:t.id,title:n,frozenAt:o,createdAt:t.createdAt,updatedAt:t.updatedAt,messageCount:t.messages.length,messages:r,...d??{},...f,...e.memory===`skip`?{memorySkipped:!0}:{}},a=st(i);return await e.vfs.writeFile(`${V}/${u}`,a),await pt(e.vfs,p),await e.vfs.flush(),J.info(`Cone session frozen`,{filename:u,title:n,cone:s,messageCount:t.messages.length,completedLiveSnapshot:!!c}),{...p,archive:i}}catch(e){return J.warn(`Failed to write frozen session to VFS`,{error:e instanceof Error?e.message:String(e)}),null}}function Et(e){let t={total:0,input:0,output:0,cacheRead:0,cacheWrite:0},n=new Map,r=!1;for(let i of e){if(i.role!==`assistant`)continue;let{model:e,usage:a}=i;if(!e||!a||!Ot(a))return null;let o=a.cost;r=!0,t.total+=o.total,t.input+=o.input,t.output+=o.output,t.cacheRead+=o.cacheRead,t.cacheWrite+=o.cacheWrite;let s=n.get(e)??{model:e,cost:0,turns:0,tokens:0};s.cost+=o.total,s.turns+=1,s.tokens+=a.input+a.output+a.cacheRead+a.cacheWrite,n.set(e,s)}return r?{cost:t,models:[...n.values()].sort((e,t)=>t.cost-e.cost)}:null}function Dt(e){return typeof e==`number`&&Number.isFinite(e)}function Ot(e){let{cost:t}=e;return[e.input,e.output,e.cacheRead,e.cacheWrite].every(Dt)&&[t.input,t.output,t.cacheRead,t.cacheWrite,t.total].every(Dt)}async function kt(e,t,n){let r={vfs:e,archiveDir:`${vt}/${n}`,copiedPaths:new Map,fileIndex:0},i=[];for(let e of t){if(!e.attachments?.some(Mt)){i.push(e);continue}let t=[];for(let n of e.attachments)t.push(await At(r,n));i.push({...e,attachments:t})}return i}async function At(e,t){if(!Mt(t))return t;let n=e.copiedPaths.get(t.path);if(n)return{...t,path:n};let r=await jt(e.vfs,t.path);if(!r)return Pt(t);let i=t.name.replace(/[^A-Za-z0-9._-]+/g,`_`)||`attachment`,a=`${e.archiveDir}/${e.fileIndex++}-${i}`;return await Z(e.vfs,e.archiveDir),await e.vfs.writeFile(a,r),e.copiedPaths.set(t.path,a),{...t,path:a}}async function jt(e,t){try{if(!await Nt(e,t))return null;let n=await e.readFile(t,{encoding:`binary`});if(!(n instanceof Uint8Array))throw Error(`Expected binary attachment content at ${t}`);return n}catch{return null}}function Mt(e){return typeof e.path==`string`&&e.path.startsWith(`/tmp/`)&&e.data===void 0&&e.text===void 0}async function Nt(e,t){let n=t.split(`/`).slice(1);if(n.length<2||n[0]!==`tmp`||n.some(e=>!e||e===`.`||e===`..`))return!1;let r=`/`;for(let t=0;t<n.length;t+=1){let i=(await e.readDir(r)).find(e=>e.name===n[t]);if(!i)return!1;if(t===n.length-1)return i.type===`file`;if(i.type!==`directory`)return!1;r=r===`/`?`/${n[t]}`:`${r}/${n[t]}`}return!1}function Pt(e){let{path:t,...n}=e;return{...n,error:e.error??`Archived attachment file is missing or unsafe to preserve.`}}function Y(e){return e.cone?.folder||`cone`}function Ft(e){return _({parentJid:null,folder:e}).memoryPath}async function It(e,t){let n=p({folder:t});try{return await e.load(n)}catch(e){return J.warn(`Failed to load cone chat session`,{sessionId:n,error:e instanceof Error?e.message:String(e)}),null}}async function Lt(e,t){try{return nt(await ct(e),t)}catch(e){J.warn(`Sessions index unreadable while looking for a live snapshot`,{error:e instanceof Error?e.message:String(e)});return}}function X(e){return e.map(e=>({role:e.role,content:[{type:`text`,text:e.content}],timestamp:e.timestamp}))}function Rt(e){let t=e.trim();return t=t.replace(/^["'`]+|["'`]+$/g,``).trim(),t=t.replace(/\s+/g,` `),t.length>80&&(t=t.slice(0,80).trimEnd()),t}async function Z(e,t){try{await e.mkdir(t,{recursive:!0})}catch{}}async function zt(e,t,n,r,i){let a=t,o=``;try{let t=await e.readFile(a,{encoding:`utf-8`});o=typeof t==`string`?t:new TextDecoder().decode(t)}catch(t){if(!(t instanceof l)||t.code!==`ENOENT`)throw t;await Z(e,a.slice(0,a.lastIndexOf(`/`)))}let s=`## Auto-extracted (${new Date().toISOString().slice(0,10)}, ${r})`,c=`${o.length===0||o.endsWith(`
|
|
162
162
|
`)?``:`
|
|
163
163
|
`}\n${s}\n\n${n}\n`;await e.writeFile(a,o+c);try{await xe({vfs:e,memoryPath:a,model:i?.model,apiKey:i?.apiKey,headers:i?.headers,signal:i?.signal})}catch(e){J.warn(`Cone memory budget step threw (append already committed)`,{error:e instanceof Error?e.message:String(e)})}}async function Bt(e){return(await U(e)).filter(e=>(e.pendingEnrichment===!0||e.memoryPending===!0)&&Q(e)<3)}async function Vt(e){let t={attempted:0,completed:0};if(!e.model||!e.apiKey)return t;try{for(let t of await U(e.vfs))t.memoryPending===!0&&t.memoryFailed===void 0&&Q(t)>=3&&await tn(e.vfs,t.filename,`catch-up retries exhausted (3)`);let n=await Bt(e.vfs);for(let r of n)try{let n=await en(e.vfs,r.filename);if(!n)continue;t.attempted+=1,await $(e.vfs,n,{model:e.model,apiKey:e.apiKey,headers:e.headers})&&(t.completed+=1)}catch(e){J.warn(`Pending session catch-up attempt failed`,{filename:r.filename,error:e instanceof Error?e.message:String(e)})}}catch(e){J.warn(`Pending session catch-up failed`,{error:e instanceof Error?e.message:String(e)})}return t}function Q(e){let t=e.pendingAttemptCount;return typeof t==`number`&&Number.isInteger(t)&&t>0?t:0}async function $(e,t,n){if(!t.pendingEnrichment&&!t.memoryPending)return null;let r=await Kt(e,t);if(r===null)return null;let i=qt(t,r);if(i===null)return null;let a=t.memoryPending===!0&&n.skipMemory!==!0&&await Ut(e,t),o=a||t.memorySkipped===!0?{...n,skipMemory:!0}:n,s=await Jt(t,i,o);if(s===null)return null;let c=await Gt(o,s.newTitle);await Yt(e,t,s.bullets,o);let l=await Zt(e,t,r,s.newTitle,c,n.skipMemory===!0);return l&&a&&(await Wt(e,t.filename),await nn(e,l.filename),await Ht(e,t.filename)),l}async function Ht(e,t){for(let n of[R(`/sessions/${t}`),z(`/sessions/${t}`)])try{await e.rm(n)}catch{}}async function Ut(e,t){try{return await e.stat(I(`/sessions/${t.filename}`)),!0}catch{return!1}}async function Wt(e,t){try{await e.rm(I(`/sessions/${t}`))}catch{}}async function Gt(e,t){if(e.pickIcon)try{return await St(await e.pickIcon({subject:`"${t}" — an archived chat session`})??void 0)}catch(e){J.warn(`Enrichment icon pick failed (continuing without icon)`,{error:e instanceof Error?e.message:String(e)});return}}async function Kt(e,t){try{let n=await e.readFile(W(t),{encoding:`utf-8`});return typeof n==`string`?n:new TextDecoder().decode(n)}catch(e){return e?.code===`ENOENT`?J.info(`Pending archive missing — treating as already enriched`,{filename:t.filename}):J.warn(`Failed to read pending archive (entry stays pending)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)}),null}}function qt(e,t){let n;try{n=G(t).messages}catch(t){return J.warn(`Failed to parse pending archive — leaving entry intact`,{filename:e.filename,error:t instanceof Error?t.message:String(t)}),null}return n.length===0?(J.info(`Pending archive has no messages — skipping enrichment`,{filename:e.filename}),null):X(n)}async function Jt(e,i,a){let o=``;if(!a.skipMemory)try{o=await r({messages:i,instruction:n,model:a.model,apiKey:a.apiKey,maxTokens:gt,headers:a.headers})}catch(t){return J.warn(`Enrichment memory call failed (entry stays pending)`,{filename:e.filename,error:t instanceof Error?t.message:String(t)}),null}let s=``;try{s=Rt(await r({messages:i,instruction:t,model:a.model,apiKey:a.apiKey,maxTokens:_t,headers:a.headers}))}catch(t){return J.warn(`Enrichment title call failed (entry stays pending)`,{filename:e.filename,error:t instanceof Error?t.message:String(t)}),null}return s?{bullets:o,newTitle:s}:(J.info(`Enrichment title call returned empty — entry stays pending`,{filename:e.filename}),null)}async function Yt(e,t,n,r){let i=n.trim();if(!(!i||i===`NONE`))try{await zt(e,Ft(t.cone||`cone`),i,`pending-enrichment`,{model:r.model,apiKey:r.apiKey,headers:r.headers})}catch(e){J.warn(`Enrichment memory append failed (continuing with title rewrite)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)})}}function Xt(e,t,n,r,i){let a=r??e.icon;return{filename:t,title:n,frozenAt:e.frozenAt,messageCount:e.messageCount,...e.cost?{cost:e.cost}:{},...e.models?{models:e.models}:{},...e.cone?{cone:e.cone}:{},...e.coneLabel?{coneLabel:e.coneLabel}:{},...e.sessionId?{sessionId:e.sessionId}:{},...a?{icon:a}:{},...e.completeSnapshotUnavailable?{completeSnapshotUnavailable:!0}:{},...i&&e.memoryPending?{memoryPending:!0}:{},...e.memorySkipped?{memorySkipped:!0}:{}}}async function Zt(e,t,n,r,i,a=!1){let o=W(t),s=tt(t.filename),c=s?r:t.title,l=s?`${t.frozenAt.replace(/[:.]/g,`-`)}-${it(r)}.md`:t.filename,u=`${V}/${l}`;if(s)try{await Z(e,V),await e.writeFile(u,Qt(n,c))}catch(e){return J.warn(`Enrichment write failed (entry stays pending)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)}),null}let d=Xt(t,l,c,i,a);try{await rn(e,t.filename,d)}catch(e){return J.warn(`Enrichment index update failed (entry may stay pending)`,{filename:t.filename,error:e instanceof Error?e.message:String(e)}),null}if(u!==o)try{await e.rm(o)}catch(e){J.info(`Stale pending archive cleanup failed (harmless)`,{oldPath:o,error:e instanceof Error?e.message:String(e)})}try{await e.flush()}catch{}return J.info(`Pending session enriched`,{oldFilename:t.filename,newFilename:l,title:c}),d}function Qt(e,t){let n=e.match(/^---\n([\s\S]*?)\n---\n([\s\S]*)$/);if(!n)return e;let r=n[1].replace(/^title:\s*.+$/m,`title: ${JSON.stringify(t)}`),i=n[2];return i=i.replace(/^#\s+[^\n]*$/m,`# ${t}`),`---\n${r}\n---\n${i}`}async function $t(e,t){let n=null,r=q(async()=>{let r=await U(e),i=r.findIndex(e=>e.filename===t);if(i===-1)return;let{memoryPending:a,pendingEnrichment:o,pendingAttemptCount:s,memoryFailed:c,...l}=r[i],u={...l,memoryCuratedAt:new Date().toISOString()},d=r.slice();d[i]=u,await e.writeFile(H,JSON.stringify(d,null,2)),await e.flush(),n=u});try{await r}catch(e){J.warn(`Failed to clear agentic memory pending marker`,{filename:t,error:e instanceof Error?e.message:String(e)})}return n}async function en(e,t){let n=null;return await q(async()=>{let r=await U(e),i=r.findIndex(e=>e.filename===t);if(i===-1)return;let a=r[i];if(!a.pendingEnrichment&&!a.memoryPending)return;let o=Q(a);if(o>=3)return;n={...a,pendingAttemptCount:o+1};let s=r.slice();s[i]=n,await e.writeFile(H,JSON.stringify(s,null,2)),await e.flush()}),n}async function tn(e,t,n){let r=q(async()=>{let r=await U(e),i=r.findIndex(e=>e.filename===t);if(i===-1)return;let a=r.slice();a[i]={...r[i],memoryFailed:n.slice(0,300)},await e.writeFile(H,JSON.stringify(a,null,2)),await e.flush()});try{await r}catch(e){J.warn(`Failed to record curator failure in sessions index`,{filename:t,error:e instanceof Error?e.message:String(e)})}}async function nn(e,t){let n=q(async()=>{let n=await U(e),r=n.findIndex(e=>e.filename===t);if(r===-1)return;let{memoryFailed:i,...a}=n[r],o=n.slice();o[r]={...a,memoryCuratedAt:new Date().toISOString()},await e.writeFile(H,JSON.stringify(o,null,2)),await e.flush()});try{await n}catch(e){J.warn(`Failed to record curator completion in sessions index`,{filename:t,error:e instanceof Error?e.message:String(e)})}}async function rn(e,t,n){return q(async()=>{let r=[];try{let t=await e.readFile(H,{encoding:`utf-8`}),n=typeof t==`string`?t:new TextDecoder().decode(t),i=JSON.parse(n);Array.isArray(i)&&(r=i)}catch(e){if(!(e instanceof l)||e.code!==`ENOENT`)throw e}let i=r.findIndex(e=>e.filename===t),a;i===-1?a=[n,...r.filter(e=>e.filename!==n.filename)]:(a=r.slice(),a[i]=n,a=a.filter((e,t)=>t===i||e.filename!==n.filename)),await e.writeFile(H,JSON.stringify(a,null,2))})}async function an(e,t){return q(async()=>{let n=[];try{let t=await e.readFile(H,{encoding:`utf-8`}),r=typeof t==`string`?t:new TextDecoder().decode(t),i=JSON.parse(r);Array.isArray(i)&&(n=i)}catch(e){if(!(e instanceof l)||e.code!==`ENOENT`)throw e;return}if(!n.find(e=>e.filename===t))return;let r=n.map(e=>e.filename===t?{...e,completeSnapshotUnavailable:!0}:e);await e.writeFile(H,JSON.stringify(r,null,2))})}export{Vt as a,H as c,U as d,y as f,ie as h,an as i,W as l,ae as m,$ as n,mt as o,oe as p,yt as r,Qe as s,bt as t,G as u};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{h as e,n as t,t as n}from"./tray-runtime-config-BQL-GPqt.js";import{n as r}from"./feature-flags-DaSRRz0w.js";import{n as i,r as a}from"./main-
|
|
1
|
+
import{h as e,n as t,t as n}from"./tray-runtime-config-BQL-GPqt.js";import{n as r}from"./feature-flags-DaSRRz0w.js";import{n as i,r as a}from"./main-CcfFeq6P.js";var o=3e3;async function s(e,t){let n=i(t.storage);try{let i=new URL(`/api/flags`,`${t.workerBaseUrl.replace(/\/+$/,``)}/`);i.searchParams.set(`float`,e);let s=await c(i.toString(),t.fetchImpl??fetch,t.timeoutMs??o);if(!s)return;a(n,e,s),r(e,s)}catch{}}async function c(e,t,n){let r=new AbortController,i;try{let a=new Promise(e=>{i=setTimeout(()=>{r.abort(),e(null)},n)}),o=t(e,{cache:`no-store`,headers:{Accept:`application/json`},signal:r.signal}).then(async e=>e.ok?l(await e.json()):null).catch(()=>null);return await Promise.race([o,a])}catch{return null}finally{i!==void 0&&clearTimeout(i)}}function l(e){if(!u(e))return null;let t=e.flags;return!u(t)||Object.values(t).some(e=>typeof e!=`string`)?null:t}function u(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function d(e,t){return s(e,{workerBaseUrl:f(t),storage:t.storage})}function f(r){let i=p(r.storage),a=e(r.envBaseUrl??null);if(i)return i;if(a)return a;if(!r.isDev)try{let e=new URL(r.locationHref);if(e.protocol===`http:`||e.protocol===`https:`)return e.origin}catch{}return r.isDev?t:n}function p(t){try{return e(t?.getItem(`slicc.trayWorkerBaseUrl`)??null)}catch{return null}}export{d as refreshFeatureFlagsForPage};
|
package/dist/ui/assets/{setup-standalone-prelude-C4d7EdCJ.js → setup-standalone-prelude-L6dqa7or.js}
RENAMED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/extension-bridge-transport-DfRNjx8c.js","assets/logger-DDBAeTLF.js","assets/pending-request-table-Dgn6qYdL.js","assets/lick-ws-bridge-Bo5sH7lf.js","assets/logger-BoSvu4mW.js","assets/tray-leader-DabyaEs-.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/proxied-fetch-CiijUcSt.js","assets/preload-helper-Czpn1I53.js","assets/base64-DJRlyqZu.js","assets/fetch-body-D2PwksUW.js","assets/api-endpoint-DGxXvrur.js","assets/runtime-env-Dlaokqg1.js","assets/tray-runtime-config-BQL-GPqt.js","assets/bridge-protocol-06nbmp2X.js","assets/messages-BD4p8GuF.js","assets/db-cKsBsMMN.js","assets/cdp-
|
|
2
|
-
import{t as e}from"./preload-helper-Czpn1I53.js";import{t}from"./logger-DDBAeTLF.js";import{n,r,t as i}from"./bridge-protocol-06nbmp2X.js";import"./proxied-fetch-CiijUcSt.js";import{t as a}from"./runtime-env-Dlaokqg1.js";import{a as o,c as s,s as c,t as l}from"./tray-runtime-config-BQL-GPqt.js";import{c as u,o as d,s as f}from"./api-endpoint-DGxXvrur.js";import"./messages-BD4p8GuF.js";import{t as p}from"./setup-sudo-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/extension-bridge-transport-DfRNjx8c.js","assets/logger-DDBAeTLF.js","assets/pending-request-table-Dgn6qYdL.js","assets/lick-ws-bridge-Bo5sH7lf.js","assets/logger-BoSvu4mW.js","assets/tray-leader-DabyaEs-.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/proxied-fetch-CiijUcSt.js","assets/preload-helper-Czpn1I53.js","assets/base64-DJRlyqZu.js","assets/fetch-body-D2PwksUW.js","assets/api-endpoint-DGxXvrur.js","assets/runtime-env-Dlaokqg1.js","assets/tray-runtime-config-BQL-GPqt.js","assets/bridge-protocol-06nbmp2X.js","assets/messages-BD4p8GuF.js","assets/db-cKsBsMMN.js","assets/cdp-DKhmYptD.js","assets/navigation-watcher-C8xRyQBd.js","assets/wc-follower-oauth-DCz20htV.js","assets/agent-message-to-chat-Df4an5Ei.js","assets/image-markers-BFDmhPy4.js","assets/sprinkle-renderer-Ce6YjEek.js","assets/theme-CXRqxpw6.js","assets/theme-engine-By4GU_Wc.js","assets/slicc-app-url-B9OxaBDe.js","assets/transcript-export-DP-r8eDz.js","assets/tray-webrtc-uW6sTyIA.js","assets/tray-follower-status-BAjnN7Ar.js","assets/tray-sync-protocol-jKTx-dCF.js","assets/record-DOq72weu.js","assets/shared-Djytys1b.js","assets/mime-types-D0xZwlMO.js","assets/preview-url-r19H6zH1.js","assets/export-spool-CuNzzI8a.js","assets/src-BWaKqLvQ.js","assets/main-cherry-Ibu56rin.js","assets/synthetic-cdp-transport-Ds83IPjw.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{t as e}from"./preload-helper-Czpn1I53.js";import{t}from"./logger-DDBAeTLF.js";import{n,r,t as i}from"./bridge-protocol-06nbmp2X.js";import"./proxied-fetch-CiijUcSt.js";import{t as a}from"./runtime-env-Dlaokqg1.js";import{a as o,c as s,s as c,t as l}from"./tray-runtime-config-BQL-GPqt.js";import{c as u,o as d,s as f}from"./api-endpoint-DGxXvrur.js";import"./messages-BD4p8GuF.js";import{t as p}from"./setup-sudo-DXCFEDCh.js";var m=`role`;function h(e){try{let t=new URL(e);return`${t.protocol===`wss:`?`https:`:`http:`}//${t.host}`}catch{return null}}function g(e){try{let t=new URL(e);return`${t.protocol}//${t.host}/licks-ws`}catch{return null}}function _(e){let t;try{t=new URLSearchParams(e)}catch{return null}let a=t.get(r),o=t.get(n);if(!a||!o||!/^wss?:\/\//.test(a))return null;let s=t.get(m),c=s===`leader`||s===`follower`?s:null;return{url:a,subprotocol:`${i}${o}`,token:o,apiBaseUrl:h(a),lickWsUrl:g(a),role:c}}function v(e,t,n){if(t){try{if(new URL(e).searchParams.has(`detached`))return`extension-detached`}catch{}return`extension`}try{let t=new URL(e);if(t.searchParams.get(`connect`)===`1`)return`connect`;if(t.searchParams.get(`runtime`)===`hosted-leader`)return`hosted-leader`;if(t.searchParams.get(`cherry`)===`1`)return`cherry`;let r=n===void 0?typeof window<`u`?window.localStorage:null:n;return c(e,r)?`follower`:b(t)?`electron-overlay`:`standalone`}catch{return`standalone`}}function y(e,t){return e===`electron-overlay`||e===`hosted-leader`||e===`standalone`&&t}function b(e){return e.pathname===`/electron`||e.pathname===`/electron/`||e.searchParams.get(`runtime`)===`electron-overlay`}t(`stale-asset`);var x=`slicc-stale-asset-reload`;function S(e,t){if(typeof BroadcastChannel!=`function`)return()=>{};let n=new BroadcastChannel(x),r=n=>{let r=n.data;r?.type===`stale-asset-reload`&&r.instanceId===e&&t(r.replayTurn===!0)};return n.addEventListener(`message`,r),()=>{n.removeEventListener(`message`,r),n.close()}}var C=`slicc:stale-asset-reloaded-at`,w=6e4,T=`slicc:stale-asset-replay`;function E(e=window.sessionStorage){try{e.setItem(T,`1`)}catch{}}function D(e=window.sessionStorage){try{return e.getItem(T)===`1`&&(e.removeItem(T),!0)}catch{return!1}}function O(){return{reload:()=>window.location.reload(),storage:window.sessionStorage,now:()=>Date.now(),windowMs:w,storageKey:C}}function k(e,t,n){return e===null||t-e>=n}function A(e=O()){let t;try{t=e.storage.getItem(e.storageKey)}catch{return!1}let n=t===null?null:Number(t),r=n!==null&&Number.isFinite(n)?n:null,i=e.now();if(!k(r,i,e.windowMs))return!1;try{e.storage.setItem(e.storageKey,String(i))}catch{return!1}return e.reload(),!0}var j=null,M=null;function N(e){j||(M={...O(),...e},j=e=>{A(M)&&e.preventDefault()},window.addEventListener(`vite:preloadError`,j))}var P=null;function F(e){return P||(P=S(e,e=>{e&&E(),A(M??void 0)}),P)}var I=`slicc-cdp-superseded-banner`;function L(e){if(e.getElementById(I))return;let t=e.createElement(`div`);t.id=I,t.setAttribute(`role`,`alert`),t.textContent=`Another SLICC tab or window has taken control of this browser instance. Only one tab can drive the browser per instance — close the other tabs, then reload this page to resume.`,t.style.cssText=[`position:fixed`,`top:0`,`left:0`,`right:0`,`z-index:2147483647`,`padding:10px 16px`,`background:#b3261e`,`color:#fff`,`font:13px/1.4 system-ui,sans-serif`,`text-align:center`,`box-shadow:0 1px 4px rgba(0,0,0,0.3)`].join(`;`),e.body.appendChild(t)}function R(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`slicc-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function z(e){let t;try{t=new URLSearchParams(e)}catch{return null}if(t.get(`slicc`)!==`leader`)return null;let n=t.get(`ext`);return n?{extensionId:n}:null}var B=[100,200,400,800,1600];async function V(e,t,n,r=B,i=e=>new Promise(t=>setTimeout(t,e))){let a=r.length+1,o=null;for(let s=0;s<a;s++)try{await e.connect(t),s>0&&n.info(`CDP bridge connect succeeded after retry`,{attempt:s+1});return}catch(e){o=e,s<r.length&&await i(r[s]??0)}n.warn(`Initial CDP connect failed after retries; worker-forwarded commands will retry on demand`,o instanceof Error?o.message:String(o))}async function H(t,n,r){let{ExtensionBridgeTransport:i}=await e(async()=>{let{ExtensionBridgeTransport:e}=await import(`./extension-bridge-transport-DfRNjx8c.js`);return{ExtensionBridgeTransport:e}},__vite__mapDeps([0,1,2])),{mapDiscoveryPayloadToLickEvent:a,mapNavigatePayloadToLickEvent:o}=await e(async()=>{let{mapDiscoveryPayloadToLickEvent:e,mapNavigatePayloadToLickEvent:t}=await import(`./lick-ws-bridge-Bo5sH7lf.js`);return{mapDiscoveryPayloadToLickEvent:e,mapNavigatePayloadToLickEvent:t}},__vite__mapDeps([3,1,4,5,6,7,8,9,10,11,12,13,14,15,16])),s=null,c=[],l=!1,u=e=>{s=e;for(let t of c)e.sendForwardedLick(t);c.length=0},d=e=>{if(e){if(s){s.sendForwardedLick(e);return}c.length>=50&&(c.shift(),l||(l=!0,r.warn(`extension-bridge lick buffer overflow (cap 50); dropping oldest pending licks until the kernel client attaches`))),c.push(e)}},f=new t(new i({extensionId:n,onLick:e=>{d(o(e))},onDiscovery:e=>{d(a(e))},onOpenSettings:()=>{globalThis.dispatchEvent(new CustomEvent(`slicc:open-settings-from-panel`))}}));return await V(f,void 0,r),{browser:f,attachLickForwardingClient:u}}async function U(t){let{runtimeMode:n,envBaseUrl:r,window:i,log:c,sleep:m}=t,h=n===`electron-overlay`;c.info(`setting up standalone page runtime (BrowserAPI + CDP)`,{runtimeMode:n});let{BrowserAPI:g}=await e(async()=>{let{BrowserAPI:e}=await import(`./cdp-DKhmYptD.js`);return{BrowserAPI:e}},__vite__mapDeps([17,1,18,14,19,8,20,21,9,22,23,6,24,25,26,27,28,29,2,30,31,32,10,33,12,34,35]));await p({log:c});let v,b,x,S=null,C=null,w=null,T=null,E,D=n===`cherry`?null:z(i.location.search),O=!!D&&a(),k=n===`cherry`||O?null:_(i.location.search);k?.apiBaseUrl&&(S=k.apiBaseUrl,u(k.apiBaseUrl),C=k.token,d(k.token)),k?.lickWsUrl&&(w=k.lickWsUrl);let A=n===`cherry`||O||k!==null,j=await o(),M=y(n,j!==null)?l:null;if(await s({locationHref:i.location.href,storage:i.localStorage,envBaseUrl:r,defaultWorkerBaseUrl:M,runtimeConfigFetcher:async()=>j}),n===`cherry`){let{setupCherryFollower:t}=await e(async()=>{let{setupCherryFollower:e}=await import(`./main-cherry-Ibu56rin.js`);return{setupCherryFollower:e}},__vite__mapDeps([36,1,26,2,17,18,14,19,8,20,21,9,22,23,6,24,25,27,28,29,30,31,32,10,33,12,34,35,37])),n=await t();v=n.browser,b=n.joinUrl,x=n.transport}else if(D&&a()){c.info(`Routing CDP through the extension bridge (leader tab)`);let e=await H(g,D.extensionId,c);v=e.browser,E=e.attachLickForwardingClient,T=D.extensionId,f(D.extensionId)}else{v=new g,k&&c.info(`Routing CDP through local standalone bridge`,{url:k.url,role:k.role??`(unset)`});let e=k?{url:k.url,protocols:k.subprotocol}:void 0;k?.role===`follower`?(c.info(`Skipping CDP connect for follower overlay tab`),v.primeConnectOptions(e)):(await V(v,e,c,void 0,m),v.setCdpSupersededHandler(()=>L(i.document)))}let N=v.getTransport();return globalThis.__slicc_browser=v,{browser:v,realCdpTransport:N,hasLocalCdpSurface:A,cherryJoinUrl:b,cherryTransport:x,instanceId:R(),isElectronOverlay:h,localApiBaseUrl:S,bridgeToken:C,localLickWsUrl:w,extensionDelegateId:T,attachLickForwardingClient:E}}export{F as a,_ as c,A as i,U as n,N as o,D as r,v as s,z as t};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/sudo-
|
|
2
|
-
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./preload-helper-Czpn1I53.js";var n=e({setupSudoExtension:()=>i,setupSudoStandalone:()=>r});async function r(e){let{createSudoBroker:n,installSudoTestHook:r}=await t(async()=>{let{createSudoBroker:e,installSudoTestHook:t}=await import(`./sudo-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/sudo-CA0RFOLj.js","assets/preload-helper-Czpn1I53.js","assets/logger-DDBAeTLF.js","assets/quick-llm-CTm8kfpN.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/account-store-BzCpAbzU.js","assets/claude-model-version-BJLrDjmH.js","assets/models-BSkXF4T6.js","assets/diagnostics-DN_idNHx.js","assets/provider-env-CTOcDKrQ.js","assets/__vite-browser-external-5eBdwsFd.js","assets/openrouter.models-B-zmcypy.js","assets/libesm-BypnjKEL.js","assets/proxied-fetch-CiijUcSt.js","assets/base64-DJRlyqZu.js","assets/fetch-body-D2PwksUW.js","assets/api-endpoint-DGxXvrur.js","assets/runtime-env-Dlaokqg1.js","assets/float-topology-hfgMx1Yq.js","assets/secret-topology-Yt0aO4Gz.js","assets/secrets-bridge-client-BVl0YuB2.js","assets/port-bridge-client-C1tBBqwu.js","assets/image-markers-BFDmhPy4.js","assets/tool-ui-eSQ1g2I1.js","assets/providers-DEZ_uN7Q.js","assets/panel-rpc-B3MSVImO.js","assets/bedrock-camp-compat-CgBMwna8.js","assets/llm-session-id-bZQs6gBN.js","assets/icons-D4SDtJW0.js","assets/approval-decision-CS9Wwm5B.js","assets/capability-Bxl0SE1s.js","assets/rest-paths-DJCfupdz.js","assets/page-approval-service-IZdlRu-_.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./preload-helper-Czpn1I53.js";var n=e({setupSudoExtension:()=>i,setupSudoStandalone:()=>r});async function r(e){let{createSudoBroker:n,installSudoTestHook:r}=await t(async()=>{let{createSudoBroker:e,installSudoTestHook:t}=await import(`./sudo-CA0RFOLj.js`);return{createSudoBroker:e,installSudoTestHook:t}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32])),{createRestCapabilityBroker:i}=await t(async()=>{let{createRestCapabilityBroker:e}=await import(`./capability-Bxl0SE1s.js`).then(e=>e.t);return{createRestCapabilityBroker:e}},__vite__mapDeps([30,4,1,31]));r(n(i()))}async function i(e){let{installPanelSudoResponder:n}=await t(async()=>{let{installPanelSudoResponder:e}=await import(`./sudo-CA0RFOLj.js`);return{installPanelSudoResponder:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32]));n()}export{n,r as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-LESFN7Hj.js";import{n,r}from"./path-utils-DNJG-zQf.js";import{t as i}from"./types-Dgm4REV3.js";import"./fs-
|
|
1
|
+
import{n as e}from"./rolldown-runtime-Dd_uD5pT.js";import{t}from"./logger-LESFN7Hj.js";import{n,r}from"./path-utils-DNJG-zQf.js";import{t as i}from"./types-Dgm4REV3.js";import"./fs-D5rn9Yg2.js";import{d as a,i as o,m as s,n as c}from"./sudoers-KgJRnN4b.js";const l=t(`sudo:timeout`),u={"user-timeout":`no response from the user within 5 minutes. This is a TIMEOUT, not a denial — the user was not there to answer. Do not retry this action; report that the approval request went unanswered and wait for the user before trying again.`,"cone-timeout":`no response from the cone agent within 5 minutes. This is a TIMEOUT, not a denial — no human was ever prompted, the cone simply never resolved the request. Do not retry this action; report that the escalation went unanswered and continue with work that does not need it.`};function d(e){return u[e]}function f(e=`user-timeout`){return{decision:`deny`,reason:e}}function p(e,t){let n=t.decision===`deny`?t.reason:void 0;return n?`${e}: approval request timed out — ${d(n)}`:`${e}: approval denied`}function m(e,t={}){let n=t.timeoutMs??3e5;if(!Number.isFinite(n)||n<=0)return e;let r=t.setTimer??((e,t)=>setTimeout(e,t)),i=t.clearTimer??(e=>clearTimeout(e));return{requestApproval(t,a){return new Promise(o=>{let s=new AbortController,c=()=>s.abort();a?.signal?.addEventListener(`abort`,c,{once:!0});let u=!1,d=e=>{u=!0,a?.signal?.removeEventListener(`abort`,c),o(e)},p=r(()=>{u||(l.warn(`sudo approval timed out — failing closed`,{kind:t.kind,detail:t.detail,timeoutMs:n}),s.abort(),d(f(`user-timeout`)))},n),m=e=>{if(u){l.warn(`sudo decision arrived after timeout — discarded`,{kind:t.kind,detail:t.detail,decision:e.decision});return}i(p),d(e)};e.requestApproval(t,{signal:s.signal}).then(m,e=>{l.warn(`sudo broker threw — denying`,{error:e instanceof Error?e.message:String(e)}),m({decision:`deny`})})})}}}const h=t(`sudo:fs`),g=Symbol.for(`slicc.fs.monkeypatchUnsafe`),_=`${c}/granted`;function v(e){return p(`sudo`,e)}const y=[`readFile`,`readFileRange`,`getNativeFile`,`readTextFile`,`readDir`,`exists`,`stat`],b=[`writeFile`],x=[`mkdir`,`rm`];async function S(e,t,n,a){let o=s(a);if(!o)return;let l=t(),u={pattern:o,nopasswd:!0,regex:r(o)};(n===`read`?l.read:l.write).push(u);let d=`NOPASSWD ${n===`read`?`Read`:`Write`} ${o}\n`;try{await e.mkdir(c,{recursive:!0});let t=``;try{t=await e.readFile(_,{encoding:`utf-8`})}catch(e){if(!(e instanceof i&&e.code===`ENOENT`))throw e}let n=t.length>0&&!t.endsWith(`
|
|
2
2
|
`)?`
|
|
3
3
|
`:``;await e.writeFile(_,t+n+d)}catch(e){h.warn(`Failed to persist NOPASSWD grant; effective in-session only`,{error:e instanceof Error?e.message:String(e)})}}function C(e,t){let{broker:r,getPolicy:s}=t,c=t.defaultDisposition??`allow`,l=t.onGrant?t.onGrant:(t,n)=>S(e,s,t,n);async function u(e,t,u=!1){let d=n(t),f=a(s(),e,d,{isContentWrite:u});if((e===`write`?o(f,c):f)!==`require-approval`)return;let p=e,m=await r.requestApproval({kind:p,detail:d});if(m.decision===`deny`)throw new i(`EACCES`,v(m),d);m.decision===`always`&&await l(e,m.pattern?.trim()||d)}function d(e){return a(s(),`read`,n(e))!==`require-approval`}let f=t=>typeof e[t]==`function`,p={};for(let t of y)f(t)&&(p[t]=async(n,...r)=>(await u(`read`,n),e[t](n,...r)));for(let t of b)f(t)&&(p[t]=async(n,...r)=>(await u(`write`,n,!0),e[t](n,...r)));for(let t of x)f(t)&&(p[t]=async(n,...r)=>(await u(`write`,n),e[t](n,...r)));return f(`walk`)&&(p.walk=async function*(t,...n){await u(`read`,t),yield*e.walk(t,...n)}),f(`symlink`)&&(p.symlink=async(t,n)=>(await u(`write`,n),e.symlink(t,n))),f(`rename`)&&(p.rename=async(t,n)=>(await u(`read`,t),await u(`write`,t),await u(`write`,n),e.rename(t,n))),f(`copyFile`)&&(p.copyFile=async(t,n)=>(await u(`read`,t),await u(`write`,n),e.copyFile(t,n))),f(`mount`)&&(p.mount=async(t,...n)=>(await u(`write`,t),e.mount(t,...n))),f(`unmount`)&&(p.unmount=async t=>(await u(`write`,t),e.unmount(t))),f(`refreshMount`)&&(p.refreshMount=async(t,...n)=>(await u(`write`,t),e.refreshMount(t,...n))),f(`statSync`)&&(p.statSync=t=>d(t)?e.statSync(t):null),f(`readDirSync`)&&(p.readDirSync=t=>d(t)?e.readDirSync(t):null),new Proxy(e,{get(e,t,n){if(t===g)return!0;if(typeof t==`string`&&t in p)return p[t];let r=Reflect.get(e,t,n);return typeof r==`function`?r.bind(e):r}})}const w=`/workspace/skills`,T=`SKILL.md`,E=t(`skills-discovery`),D=[`native`,`agents`,`claude`,`marketplace`,`plugin`],O=new Map([[`.agents`,`agents`],[`.claude`,`claude`]]),k=new Set([`.git`,`.slicc`,`node_modules`]),A=2e4,j=[`mkdir`,`mount`,`rename`,`rm`,`unmount`,`writeFile`],M=new WeakMap,N=new WeakSet;async function P(e,t=w){let n=await z(e,t),r=await I(e),i=await F(e);return[...D.flatMap(e=>(e===`native`?n:e===`plugin`?i:r.filter(t=>t.source===e)).sort((e,t)=>e.path.localeCompare(t.path)))]}async function F(e){let t;try{let n=await e.readTextFile(`/workspace/.plugins/plugins.json`),r=JSON.parse(n);if(!r||typeof r!=`object`||!r.plugins)return[];t=Object.values(r.plugins).map(e=>e?.root).filter(e=>typeof e==`string`)}catch{return[]}let n=[];for(let r of t){let t=`${r}/skills`,i=await K(e,t);for(let r of i){if(r.type!==`directory`)continue;let i=`${t}/${r.name}`,a=`${i}/${T}`;await G(e,a)&&n.push({source:`plugin`,sourceRoot:t,path:i,skillFilePath:a})}}return n}async function I(e){if(L(e))return(await U(e)).map(e=>({...e}));W(e);let t=e,n=M.get(t);if(n)return n.map(e=>({...e}));let r=await U(e);return M.set(t,r),r.map(e=>({...e}))}function L(e){try{return e[g]===!0}catch{return!1}}function R(e,t){let n=new Map,r=new Map;for(let i of e){let e=t(i);if(!n.has(e)){n.set(e,i);continue}let a=r.get(e)??{name:e,winner:n.get(e),shadowed:[]};a.shadowed.push(i),r.set(e,a)}return{winners:Array.from(n.values()),collisions:Array.from(r.values())}}async function z(e,t){let n=await K(e,t),r=[];for(let i of n){if(i.type!==`directory`)continue;let n=`${t}/${i.name}`,a=`${n}/${T}`;await G(e,a)&&r.push({source:`native`,sourceRoot:t,path:n,skillFilePath:a})}return r}async function B(e,t){let n;try{n=await e.readTextFile(t)}catch{return[]}let r;try{r=JSON.parse(n)}catch{return[]}if(typeof r!=`object`||!r)return[];let i=r.plugins;if(!Array.isArray(i))return[];let a=t.replace(/\/[^/]+$/,``).replace(/\/.claude-plugin$/,``),o=[];for(let e of i){if(typeof e!=`object`||!e)continue;let t=e.source;if(typeof t!=`string`||t.startsWith(`/`)||t.split(`/`).includes(`..`))continue;let n=t.replace(/^\.\//,``).replace(/\/$/,``).replace(/^\.$/,``);o.push(n?`${a}/${n}`:a)}return o}async function V(e,t,n){let r=await B(e,`${t}/marketplace.json`),i=[];for(let t of r){let r=`${t}/skills`,a=await K(e,r);for(let t of a){if(t.type!==`directory`)continue;let a=`${r}/${t.name}`,o=`${a}/${T}`;!await G(e,o)||n.has(a)||(n.add(a),i.push({source:`marketplace`,sourceRoot:r,path:a,skillFilePath:o}))}}return i}async function H(e,t,n,r){let i=`${t}/skills`,a=await K(e,i),o=[];for(let t of a){if(t.type!==`directory`)continue;let a=`${i}/${t.name}`,s=`${a}/${T}`;!await G(e,s)||r.has(a)||(r.add(a),o.push({source:n,sourceRoot:i,path:a,skillFilePath:s}))}return o}async function U(e){let t=[],n=new Set,r=new Set([`/`]),i=[{path:`/`,depth:0}];for(let a=0;a<i.length;a+=1){if(a>=A){E.warn(`skills discovery: directory budget exhausted; walk truncated`,{budget:A});break}let{path:o,depth:s}=i[a],c=await K(e,o);for(let a of c){if(a.type!==`directory`||a.name===`.`||a.name===`..`)continue;let c=o===`/`?`/${a.name}`:`${o}/${a.name}`,l=O.get(a.name);if(l){let r=await H(e,c,l,n);t.push(...r)}if(a.name===`.claude-plugin`){let r=await V(e,c,n);t.push(...r);continue}!k.has(a.name)&&s<24&&!r.has(c)&&(r.add(c),i.push({path:c,depth:s+1}))}}return t}function W(e){if(L(e))return;let t=e;if(N.has(t))return;N.add(t);let n=e;for(let r of j){let i=n[r];if(typeof i==`function`)try{n[r]=async(...n)=>{let r=await i.apply(e,n);return M.delete(t),r}}catch{}}}async function G(e,t){try{return await e.stat(t),!0}catch{return!1}}async function K(e,t){try{return[...await e.readDir(t)].sort((e,t)=>e.name.localeCompare(t.name))}catch{return[]}}async function q(e,t=`/workspace/skills`){let n=await P(e,t),r=[];for(let t of n){let n=t.path.split(`/`).pop()??t.path,i=``;if(t.skillFilePath)try{i=X(await e.readTextFile(t.skillFilePath))??``}catch{}r.push({name:n,source:t.source,sourceRoot:t.sourceRoot,path:t.path,skillFilePath:t.skillFilePath,description:i})}let{winners:i,collisions:a}=R(r,e=>e.name),o=new Map(a.map(e=>[e.winner.path,e.shadowed.map(e=>e.path)]));return i.map(e=>({...e,shadowedPaths:o.get(e.path)}))}async function J(e,t,n=`/workspace/skills`){return(await q(e,n)).find(e=>e.name===t)||null}async function Y(e,t,n=`/workspace/skills`){let r=await J(e,t,n);if(!r?.skillFilePath)return null;try{return await e.readTextFile(r.skillFilePath)}catch{return null}}function X(e){let t=e.replace(/^\uFEFF/,``).replace(/\r\n?/g,`
|
|
4
4
|
`).trimStart().match(/^---\s*\n([\s\S]*?)\n---/);if(!t)return null;for(let e of t[1].split(`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
function e(){return{version:`6.136.1`,releasedAt:`2026-09-07T13:48:00Z`,buildId:`6.136.1-mtrapsvk`}}let t=null;function n(e){t=e}function r(){return t}export{e as n,n as r,r as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{n as e}from"./panel-rpc-BPwAqRch.js";import{m as t}from"./state-
|
|
1
|
+
import{n as e}from"./panel-rpc-BPwAqRch.js";import{m as t}from"./state-BaXCc20k.js";function n(e,t=``){if(e==null)return t;if(typeof e==`string`)return e;if(typeof e==`number`||typeof e==`boolean`||typeof e==`bigint`)return String(e);try{return JSON.stringify(e)??t}catch{return String(e)}}function r(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`).replace(/\n/g,`\\n`)}function i(e){return e.replace(/\\/g,`\\\\`).replace(/"/g,`\\"`)}const a=[`none`,`presentation`,`generic`,`rootwebarea`],o=[`textbox`,`button`,`link`,`checkbox`,`radio`];function s(e,t){return a.includes(e)?!1:!!t||o.includes(e)}function c(e,t){let n=i(t);return e===`button`&&t?[`button[aria-label="${n}"]`,`button[title="${n}"]`,`[role="button"][aria-label="${n}"]`,`[role="button"][title="${n}"]`,`input[type="button"][value="${n}"]`,`input[type="submit"][value="${n}"]`,`input[type="reset"][value="${n}"]`].join(`, `):e===`link`&&t?`a[aria-label="${n}"], a[title="${n}"], [role="link"][aria-label="${n}"], [role="link"][title="${n}"]`:e===`textbox`?t?`input[aria-label="${n}"], textarea[aria-label="${n}"], [contenteditable][aria-label="${n}"], input[placeholder="${n}"], textarea[placeholder="${n}"], [contenteditable][placeholder="${n}"], input[title="${n}"], textarea[title="${n}"], [contenteditable][title="${n}"]`:`input, textarea, [contenteditable]`:e===`checkbox`?`input[type="checkbox"]`:e===`radio`?`input[type="radio"]`:t?`[aria-label="${n}"], [title="${n}"]`:`[role="${e}"]`}function l(e,t,i,a,o=``,u=``){let d=[],f=n(e.role,`unknown`).toLowerCase(),p=n(e.name),m=n(e.value),h=``;s(f,p)&&(h=u+`e${++a.value}`,e.backendNodeId&&i.set(h,e.backendNodeId),t.set(h,c(f,p)));let g=`${o}- ${f}`;if(p&&(g+=` "${r(p)}"`),h&&(g+=` [ref=${h}]`),m&&(g+=`: "${r(m)}"`),d.push(g),e.children)for(let n of e.children)d.push(...l(n,t,i,a,o+` `,u));return d}async function u(e,t){if(t.appTabId)return;let n=await e.listPages(),r=await d(),i=n.find(e=>e.url.startsWith(r)&&!e.url.includes(`/preview/`));i&&(t.appTabId=i.targetId)}async function d(){if(typeof window<`u`)return window.location.origin;let t=e();if(t)try{let e=await t.call(`page-info`,void 0,{timeoutMs:2e3});if(e.origin)return e.origin}catch{}return`http://localhost:5710`}function f(e,t){return t===e.appTabId}function p(e){let t=e.url.trim(),n=e.title.trim();return n===`Omnibox Popup`||t.startsWith(`chrome://`)||t.startsWith(`chrome-search://`)||t.startsWith(`chrome-untrusted://`)||t.startsWith(`devtools://`)||t.length===0&&/popup$/i.test(n)}function m(e,t){return!f(e,t.targetId)&&!p(t)}async function h(e,n){return await u(e,n),(await t(e)).filter(e=>m(n,e))}function g(e,t){try{let n=new URL(e,t);return n.origin+n.pathname.replace(/\/$/,``)+n.search}catch{return null}}function _(e,t,n,r){let i=g(t,n);return e.find(e=>{if(r.has(e.frameId))return!1;let n=g(e.url);return n!==null&&i!==null?n===i:e.url===t})}async function v(e,t,n,r,i,a,o){try{let s=await e.getAccessibilityTreeForFrame(t),c=new Map,u=new Map,d=l(s,c,u,{value:0},n,r);for(let[e,n]of c)i.set(e,n),o.set(e,t);for(let[e,n]of u)a.set(e,n),o.set(e,t);return d}catch{return[]}}async function y(e,t,n,r,i,a){if(typeof e.getFrameTree!=`function`)return t;try{let o=(await e.getFrameTree()).filter(e=>e.parentFrameId);if(o.length===0)return t;let s=0,c=[],l=new Set;for(let u of t.split(`
|
|
2
2
|
`)){c.push(u);let t=u.match(/^(\s*)- iframe(?=\s|:)/);if(!t)continue;let d=u.match(/:\s*"([^"]+)"\s*$/);if(!d)continue;let f=_(o,d[1],n,l);f&&(l.add(f.frameId),s++,c.push(...await v(e,f.frameId,t[1]+` `,`f${s}`,r,i,a)))}return c.join(`
|
|
3
3
|
`)}catch{return t}}async function b(e,t){let n=await e.evaluate(`JSON.stringify({ url: location.href, title: document.title })`),{url:r,title:i}=JSON.parse(n),a=await e.getAccessibilityTree(),o=new Map,s=new Map,c=new Map,u=l(a,o,s,{value:0}).join(`
|
|
4
4
|
`);return t?.noIframes||(u=await y(e,u,r,o,s,c)),{url:r,title:i,text:u,refToSelector:o,refToBackendNodeId:s,refToFrameId:c}}async function x(e,t,n,r){await e.attachToPage(n);let{url:i,title:a,text:o,refToSelector:s,refToBackendNodeId:c,refToFrameId:l}=await b(e,r),u={url:i,title:a,refToSelector:s,refToBackendNodeId:c,refToFrameId:l,content:o,timestamp:Date.now()};return t.snapshots.set(n,u),{snapshot:u,output:[`Page URL: ${i}`,`Page Title: ${a}`,``,o].join(`
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{a as e}from"./snapshot-
|
|
1
|
+
import{a as e}from"./snapshot-BWdwScwG.js";import{g as t,v as n}from"./state-BaXCc20k.js";function r(e,t){let n=0,r=e.split(`
|
|
2
2
|
`).filter(e=>{let r=/^( *)- /.exec(e);return!r||r[1].length/2<t||(n++,!1)});return n>0&&r.push(`(${n} node(s) below depth ${t} elided — re-run without --depth for the full tree)`),r.join(`
|
|
3
3
|
`)}async function i(e,t,n){let r=e.getTransport(),i=e.getSessionId();await r.send(`DOM.enable`,{},i),await r.send(`Runtime.enable`,{},i);let a={};for(let[e,n]of t)if(!e.startsWith(`f`))try{let t=(await r.send(`DOM.resolveNode`,{backendNodeId:n},i)).object?.objectId;if(!t)continue;let o=(await r.send(`Runtime.callFunctionOn`,{objectId:t,functionDeclaration:`function() {
|
|
4
4
|
const r = this.getBoundingClientRect();
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
import{r as e}from"./sprinkle-renderer-Ce6YjEek.js";import{n as t,r as n}from"./hid-device-registry-B2R-0rNt.js";import{a as r,i}from"./serial-port-registry-CCqklAEr.js";import{A as a,C as o,D as s,O as c,S as l,T as u,_ as d,a as f,b as p,c as m,d as h,f as g,g as _,h as v,i as y,l as b,m as x,n as S,o as C,p as w,r as T,s as E,t as D,u as O,v as k,w as A}from"./usb-operations-BsAiCAWF.js";import{i as j,r as M}from"./usb-device-registry-DmUBqrA-.js";import"./shared-Djytys1b.js";import{t as N}from"./preview-url-r19H6zH1.js";var P=`slicc-sprinkle-routes`;function F(){try{let e=localStorage.getItem(P);return e?JSON.parse(e):{}}catch{return{}}}function I(e){return F()[e]}var L=`SLICCJSH`;function R(e){return e.length===0?`''`:`'${e.replace(/'/g,`'\\''`)}'`}function z(e,t){return`var REQ=${JSON.stringify({op:e,args:t})};var P=${JSON.stringify(L)};function emit(o){process.stdout.write(P+JSON.stringify(o));}try{var op=REQ.op,a=REQ.args||[],out;if(op==='fetch'){var r=await fetch(a[0],a[1]||undefined);var h={};r.headers.forEach(function(v,k){h[k]=v;});var u=new Uint8Array(await r.arrayBuffer());var bin="",C=0x8000;for(var i=0;i<u.length;i+=C){bin+=String.fromCharCode.apply(null,u.subarray(i,i+C));}out={ok:r.ok,status:r.status,statusText:r.statusText,url:r.url,headers:h,bodyBase64:btoa(bin)};}else if(op==='http'){var c=http.client(a[0]||{});var res=await c[a[1]](a[2],Object.assign({},a[3]||{},{raw:true}));out={status:res.status,headers:res.headers,body:res.body};}else if(op==='browser'){var m=a[0];if(typeof browser[m]!=="function")throw new Error("browser."+m+" is not available over the sprinkle bridge");out=await browser[m].apply(browser,a.slice(1));}else if(op==='spawn'){out=await exec.spawn(a[0]);}else if(op==='fetchToFile'){out=await fs.fetchToFile(a[0],a[1]);}else{throw new Error("unknown jsh op: "+op);}emit({ok:true,value:out});}catch(e){emit({ok:false,error:(e&&e.message)?e.message:String(e)});}`}function B(e,t){return`node -e ${R(z(e,t))}`}function V(e){let t=e.stdout.lastIndexOf(L);if(t===-1){let t=e.stderr.trim()||e.stdout.trim()||`exit code ${e.exitCode}`;throw Error(`jsh bridge: no result (${t})`)}let n;try{n=JSON.parse(e.stdout.slice(t+10))}catch{throw Error(`jsh bridge: malformed result`)}if(!n.ok)throw Error(n.error||`jsh bridge error`);return n.value}async function H(e,t,n){return V(await e(B(t,n)))}function U(e){let t=new ArrayBuffer(e.byteLength);return new Uint8Array(t).set(e),t}function W(e){let t=``,n=32768;for(let r=0;r<e.length;r+=n)t+=String.fromCharCode(...e.subarray(r,r+n));return btoa(t)}function G(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}function K(e){if(e instanceof Uint8Array)return e;if(e instanceof ArrayBuffer)return new Uint8Array(e);if(ArrayBuffer.isView(e)){let t=e;return new Uint8Array(t.buffer,t.byteOffset,t.byteLength)}if(Array.isArray(e))return new Uint8Array(e);throw Error(`expected Uint8Array, ArrayBuffer, or number[]`)}var q=new Set([101,103,204,205,304]);function J(e){let t=G(e.bodyBase64),n=q.has(e.status)?null:t,r=new Headers(e.headers),i;try{return i=new Response(n,{status:e.status,statusText:e.statusText,headers:r}),Object.defineProperty(i,"url",{value:e.url,configurable:!0}),i}catch{i=new Response(n,{headers:r});let t=e.status>=200&&e.status<300;return Object.defineProperty(i,"status",{value:e.status,configurable:!0}),Object.defineProperty(i,"statusText",{value:e.statusText,configurable:!0}),Object.defineProperty(i,"ok",{value:t,configurable:!0}),Object.defineProperty(i,"url",{value:e.url,configurable:!0}),i}}function Y(e){return e.length===0?`''`:`'${e.replace(/'/g,`'\\''`)}'`}var X=class{listeners=new Map;lickHandler;fs;closeHandler;minimizeHandler;stopConeHandler;attachImageHandler;captureScreenHandler;execHandler;hidSubs=new Map;iframePusher;constructor(e,t,n,r,i,a,o,s,c){this.fs=e,this.lickHandler=t,this.closeHandler=n,this.minimizeHandler=r,this.stopConeHandler=i,this.attachImageHandler=a,this.captureScreenHandler=o,this.execHandler=s,this.iframePusher=c}setIframePusher(e){this.iframePusher=e}async hidOp(e,r,i){let a=n();switch(r){case`list`:{let e=t();if(!e)throw Error(`WebHID is unavailable in this browser`);return d(a,e)}case`request`:{let e=t();if(!e)throw Error(`WebHID is unavailable in this browser`);return p(a,e,i[0]??[])}case`info`:return _(a,i[0]);case`open`:{let t=i[0];return await k(a,t),await this.attachHidInputReports(e,t),{ok:!0}}case`close`:{let t=i[0];return await this.detachHidInputReports(e,t),await v(a,t),{ok:!0}}case`sendReport`:{let e=i[0],t=i[1],n=K(i[2]),r=n.buffer.slice(n.byteOffset,n.byteOffset+n.byteLength);return await l(a,e,t,r),{ok:!0}}default:throw Error(`hid: unknown op '${r}'`)}}async serialOp(e,t,n){let o=r();switch(t){case`list`:{let e=i();if(!e)throw Error(`Web Serial is unavailable in this browser`);return s(o,e)}case`request`:{let e=i();if(!e)throw Error(`Web Serial is unavailable in this browser`);return a(o,e,n[0]??[])}case`info`:return u(o,n[0]);case`open`:{let e=n[0],t=n[1]??{baudRate:9600};return await c(o,e,t),{ok:!0}}case`close`:{let e=n[0];return await A(o,e),{ok:!0}}default:throw Error(`serial: unknown op '${t}'`)}}async usbOp(e,t,n){let r=j();switch(t){case`list`:{let e=M();if(!e)throw Error(`WebUSB is unavailable in this browser`);return E(r,e)}case`request`:{let e=M();if(!e)throw Error(`WebUSB is unavailable in this browser`);return O(r,e,n[0]??[])}case`info`:return C(r,n[0]);case`open`:return await m(r,n[0]),{ok:!0};case`close`:return await T(r,n[0]),{ok:!0};case`reset`:return await h(r,n[0]),{ok:!0};case`selectConfig`:return await g(r,n[0],n[1]),{ok:!0};case`claim`:return await D(r,n[0],n[1]),{ok:!0};case`release`:return await b(r,n[0],n[1]),{ok:!0};case`clearHalt`:return await S(r,n[0],n[1],n[2]),{ok:!0};case`controlIn`:{let e=await y(r,n[0],n[1],n[2]);return{status:e.status,base64:W(new Uint8Array(e.bytes))}}case`controlOut`:{let e=await f(r,n[0],n[1],U(G(n[2])));return{status:e.status,bytesWritten:e.bytesWritten}}case`transferIn`:{let e=await w(r,n[0],n[1],n[2]);return{status:e.status,base64:W(new Uint8Array(e.bytes))}}case`transferOut`:{let e=await x(r,n[0],n[1],U(G(n[2])));return{status:e.status,bytesWritten:e.bytesWritten}}default:throw Error(`usb: unknown op '${t}'`)}}async deviceOp(e,t,n,r){if(t===`hid`)return this.hidOp(e,n,r);if(t===`serial`)return this.serialOp(e,n,r);if(t===`usb`)return this.usbOp(e,n,r);throw Error(`unknown device channel '${t}'`)}async attachHidInputReports(e,t){let r=this.hidSubs.get(e);if(r||(r=new Map,this.hidSubs.set(e,r)),r.has(t))return;let i=await o(n(),t,n=>{let r=n.bytes instanceof Uint8Array?n.bytes:new Uint8Array(n.bytes);this.deliverHidInputReport(e,{handle:t,reportId:n.reportId,data:r})});r.set(t,i)}async detachHidInputReports(e,t){let n=this.hidSubs.get(e);if(!n)return;let r=n.get(t);if(r){n.delete(t);try{await Promise.resolve(r())}catch{}}n.size===0&&this.hidSubs.delete(e)}deliverHidInputReport(e,t){let n=this.listeners.get(`${e}:hid:inputreport`);if(n)for(let e of n){let r=n;setTimeout(()=>{if(r.has(e))try{e(t)}catch{}},0)}try{this.iframePusher?.(e,`hid:inputreport`,t)}catch{}}async runExec(e){if(!this.execHandler)return{stdout:``,stderr:`exec: shell bridge not available
|
|
2
|
+
`,exitCode:127};try{return await this.execHandler(e)}catch(e){return{stdout:``,stderr:`exec: ${e instanceof Error?e.message:String(e)}\n`,exitCode:1}}}async jshDispatch(e,t){if(e===`readFileBinary`)return{base64:W(await this.fs.readFile(t[0],{encoding:`binary`}))};if(e===`writeFileBinary`)return await this.fs.writeFile(t[0],G(t[1])),!0;let n=await H(e=>this.runExec(e),e,t);return e===`fetch`?J(n):n}createLickHandler(e){return t=>{let n=typeof t==`string`?t:t.action,r=typeof t==`string`?void 0:t.data,i={type:`sprinkle`,sprinkleName:e,targetScoop:I(e),timestamp:new Date().toISOString(),body:{action:n,data:r}};this.lickHandler(i)}}createScreenshotHandler(t){return async n=>t?e(n,t):``}createAgentHandler(){return async(e,t)=>{let n=t?.cwd??`.`,r=t?.allowedCommands??`*`,i=[`agent`];t?.model&&i.push(`--model`,Y(t.model)),t?.thinking&&i.push(`--thinking`,Y(t.thinking)),t?.readOnly&&i.push(`--read-only`,Y(t.readOnly)),i.push(Y(n),Y(r),Y(e));let a=await this.runExec(i.join(` `));return{stdout:a.stdout||a.stderr,exitCode:a.exitCode}}}createHidApi(e){return{list:()=>this.hidOp(e,`list`,[]),request:t=>this.hidOp(e,`request`,[t??[]]),open:async t=>{await this.hidOp(e,`open`,[t])},close:async t=>{await this.hidOp(e,`close`,[t])},sendReport:async(t,n,r)=>{await this.hidOp(e,`sendReport`,[t,n,r])},on:(t,n)=>{if(t!==`inputreport`)return;let r=`${e}:hid:inputreport`,i=this.listeners.get(r);i||(i=new Set,this.listeners.set(r,i)),i.add(n)},off:(t,n)=>{t===`inputreport`&&this.listeners.get(`${e}:hid:inputreport`)?.delete(n)}}}createSerialApi(e){return{list:()=>this.serialOp(e,`list`,[]),request:t=>this.serialOp(e,`request`,[t??[]]),open:async(t,n)=>{await this.serialOp(e,`open`,[t,n])},close:async t=>{await this.serialOp(e,`close`,[t])}}}createUsbApi(e){return{list:()=>this.usbOp(e,`list`,[]),request:t=>this.usbOp(e,`request`,[t??[]]),open:async t=>{await this.usbOp(e,`open`,[t])},close:async t=>{await this.usbOp(e,`close`,[t])},reset:async t=>{await this.usbOp(e,`reset`,[t])},selectConfiguration:async(t,n)=>{await this.usbOp(e,`selectConfig`,[t,n])},claimInterface:async(t,n)=>{await this.usbOp(e,`claim`,[t,n])},releaseInterface:async(t,n)=>{await this.usbOp(e,`release`,[t,n])},clearHalt:async(t,n,r)=>{await this.usbOp(e,`clearHalt`,[t,n,r])},controlTransferIn:async(t,n,r)=>{let i=await this.usbOp(e,`controlIn`,[t,n,r]);return{status:i.status,bytes:G(i.base64)}},controlTransferOut:async(t,n,r)=>this.usbOp(e,`controlOut`,[t,n,W(r)]),transferIn:async(t,n,r)=>{let i=await this.usbOp(e,`transferIn`,[t,n,r]);return{status:i.status,bytes:G(i.base64)}},transferOut:async(t,n,r)=>this.usbOp(e,`transferOut`,[t,n,W(r)])}}createHttpClient(e){let t=t=>(n,r)=>this.jshDispatch(`http`,[e,t,n,r??null]);return{get:t(`get`),post:t(`post`),put:t(`put`),patch:t(`patch`),delete:t(`delete`)}}createAPI(e){let t={name:e,lick:this.createLickHandler(e),on:(t,n)=>{let r=`${e}:${t}`,i=this.listeners.get(r);i||(i=new Set,this.listeners.set(r,i)),i.add(n)},off:(t,n)=>{let r=`${e}:${t}`;this.listeners.get(r)?.delete(n)},readFile:async e=>await this.fs.readFile(e,{encoding:`utf-8`}),writeFile:async(e,t)=>{await this.fs.writeFile(e,t)},readDir:async e=>(await this.fs.readDir(e)).map(e=>({name:e.name,type:e.type})),exists:async e=>this.fs.exists(e),stat:async e=>{let t=await this.fs.stat(e);return{type:t.type,size:t.size}},mkdir:async e=>{await this.fs.mkdir(e,{recursive:!0})},rm:async e=>{await this.fs.rm(e)},screenshot:e=>this.createScreenshotHandler(t._container)(e),setState:t=>{try{localStorage.setItem(`slicc-sprinkle-state:${e}`,JSON.stringify(t))}catch{}},getState:()=>{try{let t=localStorage.getItem(`slicc-sprinkle-state:${e}`);return t?JSON.parse(t):null}catch{return null}},open:e=>{let t=/^https?:|^chrome-extension:/.test(e)?e:N(e);window.open(t,`_blank`)},close:()=>this.closeHandler(e),minimize:()=>this.minimizeHandler(e),stopCone:()=>this.stopConeHandler(),attachImage:(e,t,n)=>this.attachImageHandler(e,t,n),captureScreen:()=>this.captureScreenHandler(),exec:Object.assign(e=>this.runExec(e),{spawn:e=>this.jshDispatch(`spawn`,[e])}),fetch:(e,t)=>this.jshDispatch(`fetch`,[e,t??null]),http:{client:e=>this.createHttpClient(e)},browser:{findTab:e=>this.jshDispatch(`browser`,[`findTab`,e]),ensureTab:(e,t)=>this.jshDispatch(`browser`,[`ensureTab`,e,t??{}]),eval:(e,t)=>this.jshDispatch(`browser`,[`eval`,e,t]),evalAsync:(e,t)=>this.jshDispatch(`browser`,[`evalAsync`,e,t]),cookie:(e,t)=>this.jshDispatch(`browser`,[`cookie`,e,t]),localStorage:(e,t)=>this.jshDispatch(`browser`,[`localStorage`,e,t]),fetch:(e,t,n)=>this.jshDispatch(`browser`,[`fetch`,e,t,n??{}])},hid:this.createHidApi(e),serial:this.createSerialApi(e),usb:this.createUsbApi(e),readFileBinary:async e=>G((await this.jshDispatch(`readFileBinary`,[e])).base64),writeFileBinary:async(e,t)=>{await this.jshDispatch(`writeFileBinary`,[e,W(t)])},fetchToFile:(e,t)=>this.jshDispatch(`fetchToFile`,[e,t]),_jsh:(e,t)=>this.jshDispatch(e,t),_device:(t,n,r)=>this.deviceOp(e,t,n,r),agent:this.createAgentHandler()};return t}pushUpdate(e,t){let n=`${e}:update`,r=this.listeners.get(n);if(r)for(let e of r){let n=r;setTimeout(()=>{if(n.has(e))try{e(t)}catch{}},0)}}removeSprinkle(e){for(let t of this.listeners.keys())t.startsWith(`${e}:`)&&this.listeners.delete(t);let t=this.hidSubs.get(e);if(t){for(let e of t.values())try{Promise.resolve(e()).catch(()=>{})}catch{}this.hidSubs.delete(e)}}};export{H as n,X as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./logger-DDBAeTLF.js";import{t}from"./sprinkle-renderer-DJyQFvKt.js";import{s as n}from"./telemetry-MJ77Fp1a.js";import{n as r,t as i}from"./panel-rpc-B3MSVImO.js";import{n as a,t as o}from"./bounded-walk-BjxKWNqp.js";import{t as s}from"./sprinkle-bridge-B8DKuaxn.js";import"./sprinkle-instances-B8n7h-oP.js";var c=[`/workspace`,`/shared`,`/scoops`,`/home`],l=[`/shared/sprinkles`],u=6,d=500,f=new Set([`welcome`,`connect-llm`]);async function p(e){let t=new Map;for(let n of[...l,...c])await e.exists(n)&&await m(e,n,t);return t}async function m(e,t,n){let r=a(e,t,{maxDepth:u,maxDirs:d,skip:o});for await(let t of r){if(!t.endsWith(`.shtml`))continue;let r=h(t);if(!f.has(r)&&!n.has(r)){let i;try{i=await e.readFile(t,{encoding:`utf-8`})??``}catch{i=``}n.set(r,{name:r,path:t,title:g(i,r),autoOpen:_(i),icon:v(i)})}}}function h(e){let t=e.split(`/`).pop()??e;return t.endsWith(`.shtml`)?t.slice(0,-6):t}function g(e,t){let n=e.match(/data-sprinkle-title=["']([^"']+)["']/);if(n)return n[1];let r=e.match(/<title>([^<]+)<\/title>/i);return r?r[1].trim():t}function _(e){return/data-sprinkle-autoopen\b/.test(e)}function v(e){let t=/<link\b/gi,n;for(;(n=t.exec(e))!==null;){let t=n.index+n[0].length,r=y(e,t);if(r<0)continue;let i=e.slice(t,r);if(!/\brel\s*=\s*("|')\s*(?:shortcut\s+)?icon\s*\1/i.test(i))continue;let a=b(i,`href`);if(a!==void 0)return a.trim()}let r=b(e,`data-sprinkle-icon`);if(r!==void 0)return r.trim()}function y(e,t){let n=!1,r=!1;for(let i=t;i<e.length;i++){let t=e.charCodeAt(i);if(n)t===34&&(n=!1);else if(r)t===39&&(r=!1);else if(t===34)n=!0;else if(t===39)r=!0;else if(t===62)return i}return-1}function b(e,t){let n=RegExp(`\\b${t}\\s*=\\s*(?:"([^"]*)"|'([^']*)')`,`i`),r=e.match(n);if(r)return r[1]??r[2]??void 0}var x=e(`sprinkle-manager`),S=`slicc-open-sprinkles`,C=`sprinkles`;function w(){try{if(typeof window>`u`||!window.location)return null;let e=new URLSearchParams(window.location.search).get(C);return e===null?null:e===``?[]:e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0)}catch{return null}}function T(e){try{if(typeof window>`u`||!window.location||typeof history>`u`||typeof history.replaceState!=`function`)return;let t=new URL(window.location.href);e.length===0?t.searchParams.delete(C):t.searchParams.set(C,e.join(`,`));let n=t.pathname+t.search+t.hash;history.replaceState(history.state??null,``,n)}catch{}}var E=`slicc-known-sprinkles`;function D(e){try{let t=new Set(e),n=O().filter(e=>t.has(e));localStorage.setItem(E,JSON.stringify(n))}catch{}}function O(){try{let e=localStorage.getItem(E);if(!e)return[];let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch{return[]}}var k=`slicc-autoopened-once`,A=c,j=250,M=class{fs;bridge;callbacks;availableSprinkles=new Map;watcherUnsub;openSprinkles=new Map;attentionOnly=new Set;inflightRefresh=null;lastRefreshAt=0;autoOpenBehavior;onSendToSprinkle;onSprinkleReloaded;registeredSprinkles=new Set;inlineSprinkles;changeListeners=new Set;changeNotifyScheduled=!1;urlWriteScheduled=!1;constructor(e,t,n,a,o={}){this.fs=e;let c=async()=>{let e=`image/png`,t=r(),n=i();if(!t&&!n)throw Error(`Screen capture unavailable in this environment`);if(t&&!navigator.mediaDevices?.getDisplayMedia)throw Error(`Screen capture not supported in this browser`);let a,o,s;if(t){let t=await navigator.mediaDevices.getDisplayMedia({video:!0,audio:!1});try{let n=document.createElement(`video`);n.srcObject=t,n.muted=!0,n.playsInline=!0,await new Promise((e,t)=>{n.onloadedmetadata=()=>n.play().then(()=>e()).catch(t),n.onerror=()=>t(Error(`Failed to load video stream`))}),await new Promise(e=>setTimeout(e,100)),o=n.videoWidth,s=n.videoHeight;let r=document.createElement(`canvas`);r.width=o,r.height=s;let i=r.getContext(`2d`);if(!i)throw Error(`Failed to get canvas context`);i.drawImage(n,0,0,o,s),a=await(await new Promise((t,n)=>{r.toBlob(e=>e?t(e):n(Error(`Failed to create image blob`)),e,1)})).arrayBuffer()}finally{for(let e of t.getTracks())e.stop()}}else{let t=await n.call(`screencapture`,{mimeType:e,quality:1},{timeoutMs:3e5});a=t.bytes,o=t.width,s=t.height}let c=new Uint8Array(a),l=[],u=8192;for(let e=0;e<c.length;e+=u)l.push(String.fromCharCode(...c.subarray(e,e+u)));return{base64:btoa(l.join(``)),width:o,height:s,mimeType:e}};this.bridge=new s(e,t,e=>this.close(e),e=>this.minimize(e),a,o.onAttachImage??(()=>{}),c,o.execHandler,(e,t,n)=>{this.openSprinkles.get(e)?.renderer.pushDeviceEvent(t,n)}),this.callbacks=n,this.autoOpenBehavior=o.autoOpenBehavior??`activate`,this.onSendToSprinkle=o.onSendToSprinkle,this.onSprinkleReloaded=o.onSprinkleReloaded,this.inlineSprinkles=o.inlineSprinkles??new Set}setSendToSprinkleHook(e){this.onSendToSprinkle&&!e&&x.error(`SprinkleManager broadcast hook detached`),this.onSendToSprinkle=e}setReloadHook(e){this.onSprinkleReloaded=e}async reload(e){let n=this.openSprinkles.get(e);if(!n){x.info(`Cannot reload closed sprinkle`,{name:e});return}let r=this.availableSprinkles.get(e);if(r||=(await this.refresh(),this.availableSprinkles.get(e)),!r){x.warn(`Sprinkle not found during reload`,{name:e});return}let i=await this.fs.readFile(r.path,{encoding:`utf-8`});if(i==null){x.warn(`Failed to read sprinkle content during reload`,{name:e});return}let a=typeof i==`string`?i:new TextDecoder(`utf-8`).decode(i);n.renderer?.dispose(),this.bridge.removeSprinkle(e);let o=this.bridge.createAPI(e),s=new t(n.container,o);if(await s.render(a,e),!this.openSprinkles.has(e)){s.dispose();return}if(n.renderer=s,s.activateBridgeLifecycle(),this.openSprinkles.has(e)&&(x.info(`Sprinkle reloaded`,{name:e}),this.notifyChange(),this.onSprinkleReloaded))try{this.onSprinkleReloaded(e)}catch(t){x.error(`onSprinkleReloaded hook threw`,{name:e,error:t instanceof Error?t.message:String(t)})}}async restoreOpenSprinkles(){try{let e=w();if(e!==null){await this.reopenInBackground(e);return}let t=localStorage.getItem(S);t?await this.restoreFromLegacyStorage(t):await this.autoOpenFirstRun()}catch{}await this.surfaceUnseenSprinkles()}async reopenInBackground(e){for(let t of e)try{await this.open(t,void 0,{background:!0})}catch{x.warn(`Failed to restore sprinkle`,{name:t})}}async restoreFromLegacyStorage(e){try{await this.reopenInBackground(JSON.parse(e))}finally{try{localStorage.removeItem(S)}catch{}}}async autoOpenFirstRun(){let e=this.autoOpenBehavior===`attention`,t=this.loadAutoOpenedOnce(),n=new Set;for(let r of this.availableSprinkles.values())if(!(!r.autoOpen||t.has(r.name)))try{await this.open(r.name,void 0,{attention:e}),n.add(r.name)}catch{x.warn(`Failed to auto-open sprinkle`,{name:r.name})}n.size>0&&this.persistAutoOpenedOnce(n)}async surfaceUnseenSprinkles(){let e=this.loadKnownSprinkles(),t=this.loadAutoOpenedOnce(),n=this.autoOpenBehavior===`attention`,r=new Set;for(let i of this.availableSprinkles.values())if(!e.has(i.name)&&!this.openSprinkles.has(i.name)&&!(i.autoOpen&&t.has(i.name)))try{await this.open(i.name,void 0,{attention:!i.autoOpen||n}),i.autoOpen&&r.add(i.name),x.info(`Surfaced previously-unseen sprinkle`,{name:i.name})}catch{x.warn(`Failed to surface unseen sprinkle`,{name:i.name})}this.persistKnownSprinkles(new Set(this.availableSprinkles.keys())),r.size>0&&this.persistAutoOpenedOnce(r)}loadKnownSprinkles(){return new Set(O())}persistKnownSprinkles(e){try{let t=new Set([...this.loadKnownSprinkles(),...e]);localStorage.setItem(E,JSON.stringify([...t]))}catch{}}loadAutoOpenedOnce(){try{let e=localStorage.getItem(k);if(!e)return new Set;let t=JSON.parse(e);return Array.isArray(t)?new Set(t.filter(e=>typeof e==`string`)):new Set}catch{return new Set}}persistAutoOpenedOnce(e){try{let t=new Set([...this.loadAutoOpenedOnce(),...e]);localStorage.setItem(k,JSON.stringify([...t]))}catch{}}persistOpenSprinkles(){try{let e=[...this.openSprinkles.keys()].filter(e=>!this.attentionOnly.has(e));localStorage.setItem(S,JSON.stringify(e))}catch{}this.schedulePersistOpenSprinklesToUrl()}schedulePersistOpenSprinklesToUrl(){this.urlWriteScheduled||(this.urlWriteScheduled=!0,queueMicrotask(()=>{this.urlWriteScheduled=!1,T([...this.openSprinkles.keys()].filter(e=>!this.attentionOnly.has(e)))}))}async openNewAutoOpenSprinkles(){if(this.inflightRefresh!==null)return this.inflightRefresh;if(!(Date.now()-this.lastRefreshAt<j))return this.inflightRefresh=this.runOpenNewAutoOpenSprinkles().finally(()=>{this.lastRefreshAt=Date.now(),this.inflightRefresh=null}),this.inflightRefresh}async runOpenNewAutoOpenSprinkles(){let e=new Set(this.availableSprinkles.keys());await this.refresh();let t=this.autoOpenBehavior===`attention`,n=this.loadAutoOpenedOnce(),r=new Set,i=!1;for(let a of this.availableSprinkles.values())if(!this.openSprinkles.has(a.name)&&!e.has(a.name)){if(i=!0,a.autoOpen){if(n.has(a.name)){x.info(`Skipped one-shot auto-open for previously-consumed sprinkle`,{name:a.name});continue}try{await this.open(a.name,void 0,{attention:t}),r.add(a.name),x.info(`Auto-opened new sprinkle after install`,{name:a.name,attention:t})}catch{x.warn(`Failed to auto-open new sprinkle`,{name:a.name})}}else try{await this.open(a.name,void 0,{attention:!0}),x.info(`Surfaced newly-installed sprinkle in rail`,{name:a.name})}catch{x.warn(`Failed to surface newly-installed sprinkle`,{name:a.name})}}i&&this.persistKnownSprinkles(new Set(this.availableSprinkles.keys())),r.size>0&&this.persistAutoOpenedOnce(r)}async refresh(){this.availableSprinkles=await p(this.fs),x.info(`Discovered sprinkles`,{count:this.availableSprinkles.size}),this.syncRegisteredIcons(),this.notifyChange()}syncRegisteredIcons(){if(!this.callbacks.registerSprinkle)return;let e=new Set;for(let t of this.availableSprinkles.values())this.inlineSprinkles.has(t.name)||e.add(t.name);for(let t of this.availableSprinkles.values())if(e.has(t.name)&&!this.registeredSprinkles.has(t.name))try{this.callbacks.registerSprinkle(t.name,t.title,{icon:t.icon}),this.registeredSprinkles.add(t.name)}catch(e){x.warn(`registerSprinkle callback threw`,{name:t.name,error:e instanceof Error?e.message:String(e)})}for(let t of[...this.registeredSprinkles])if(!e.has(t)){this.openSprinkles.has(t)&&this.close(t);try{this.callbacks.unregisterSprinkle?.(t)}catch(e){x.warn(`unregisterSprinkle callback threw`,{name:t,error:e instanceof Error?e.message:String(e)})}this.registeredSprinkles.delete(t)}}onChange(e){return this.changeListeners.add(e),()=>{this.changeListeners.delete(e)}}notifyChange(){this.changeNotifyScheduled||(this.changeNotifyScheduled=!0,queueMicrotask(()=>{this.changeNotifyScheduled=!1;for(let e of this.changeListeners)try{e()}catch(e){x.error(`SprinkleManager.onChange handler threw`,{error:e instanceof Error?e.message:String(e)})}}))}async open(e,r,i={}){if(this.openSprinkles.has(e)){x.info(`Sprinkle already open`,{name:e});return}let a=this.availableSprinkles.get(e);if(a||=(await this.refresh(),this.availableSprinkles.get(e)),!a)throw Error(`Sprinkle not found: ${e}`);let o=await this.fs.readFile(a.path,{encoding:`utf-8`});if(o==null)throw Error(`Failed to read sprinkle content: ${a.path} (file may be corrupted or missing)`);let s=typeof o==`string`?o:new TextDecoder(`utf-8`).decode(o),c=document.createElement(`div`);c.className=`sprinkle-panel`,c.style.cssText=`width: 100%; height: 100%; display: flex; flex-direction: column; overflow-y: auto;`,c.dataset.sprinkle=e,this.openSprinkles.set(e,{renderer:null,container:c}),i.attention?this.attentionOnly.add(e):this.attentionOnly.delete(e),this.callbacks.addSprinkle(e,a.title,c,r,{...i,icon:a.icon});let l=this.bridge.createAPI(e),u=new t(c,l);await u.render(s,e);let d=this.openSprinkles.get(e);if(!d){u.dispose();return}d.renderer=u,u.activateBridgeLifecycle(),this.openSprinkles.has(e)&&(this.persistOpenSprinkles(),n(e),x.info(`Sprinkle opened`,{name:e,title:a.title}),this.notifyChange())}markActivated(e){this.attentionOnly.has(e)&&(this.attentionOnly.delete(e),this.persistOpenSprinkles(),x.info(`Sprinkle promoted from attention to user-opened`,{name:e}),this.notifyChange())}async activate(e,t){if(this.attentionOnly.has(e)){this.markActivated(e);return}let n=this.openSprinkles.get(e);if(!n){try{await this.open(e,t)}catch(t){x.warn(`Failed to open sprinkle from rail-icon click`,{name:e,error:t instanceof Error?t.message:String(t)})}return}let r=this.availableSprinkles.get(e);this.callbacks.addSprinkle(e,r?.title??e,n.container,t,{icon:r?.icon})}close(e){let t=this.openSprinkles.get(e);t&&(t.renderer?.dispose(),t.container.remove(),this.bridge.removeSprinkle(e),this.openSprinkles.delete(e),this.attentionOnly.delete(e),this.callbacks.closeSprinkleContent?this.callbacks.closeSprinkleContent(e):this.callbacks.removeSprinkle(e),this.persistOpenSprinkles(),x.info(`Sprinkle closed`,{name:e}),this.notifyChange())}minimize(e){this.openSprinkles.has(e)&&(this.callbacks.minimizeSprinkle(e),x.info(`Sprinkle minimized`,{name:e}))}available(){return Array.from(this.availableSprinkles.values())}opened(){return Array.from(this.openSprinkles.keys())}setupWatcher(e){let t=null,n=new Map,r=e=>{let r=!1;for(let t of e){let e=this.findOpenSprinkleByPath(t.path);if(e){let t=n.get(e);t&&clearTimeout(t),n.set(e,setTimeout(()=>{n.delete(e),this.reload(e).catch(t=>{x.warn(`Sprinkle reload on watcher event failed`,{name:e,error:t instanceof Error?t.message:String(t)})})},300))}else r=!0}r&&!t&&(t=setTimeout(()=>{t=null,this.openNewAutoOpenSprinkles().catch(e=>{x.warn(`Sprinkle refresh on watcher event failed`,{error:e instanceof Error?e.message:String(e)})})},150))},i=A.map(t=>e.watch(t,e=>e.endsWith(`.shtml`),r));this.watcherUnsub=()=>{for(let e of i)e();t&&=(clearTimeout(t),null);for(let e of n.values())clearTimeout(e);n.clear()}}findOpenSprinkleByPath(e){for(let[t]of this.openSprinkles){let n=this.availableSprinkles.get(t);if(n&&n.path===e)return t}return null}dispose(){this.watcherUnsub?.()}sendToSprinkle(e,t,n){let r=!n?.runtime||n.runtime===`leader`,i=!n?.runtime||n.runtime!==`leader`,a={leader:!1,followers:[]};if(r){let n=this.openSprinkles.get(e);n?(this.bridge.pushUpdate(e,t),n.renderer.pushUpdate(t),a.leader=!0):x.warn(`Cannot send to closed sprinkle`,{name:e})}if(i&&this.onSendToSprinkle)try{let r=this.onSendToSprinkle(e,t,n);r&&(a.followers=r.followers,r.unknownRuntime&&(a.unknownRuntime=r.unknownRuntime))}catch(t){x.error(`onSendToSprinkle hook threw`,{name:e,error:t instanceof Error?t.message:String(t)})}return a}};export{M as SprinkleManager,D as pruneKnownSprinkleNames,O as readKnownSprinkleNames};
|
|
1
|
+
import{t as e}from"./logger-DDBAeTLF.js";import{t}from"./sprinkle-renderer-Ce6YjEek.js";import{s as n}from"./telemetry-MJ77Fp1a.js";import{n as r,t as i}from"./panel-rpc-B3MSVImO.js";import{n as a,t as o}from"./bounded-walk-BjxKWNqp.js";import{t as s}from"./sprinkle-bridge-CeRz-DjR.js";import"./sprinkle-instances-B8n7h-oP.js";var c=[`/workspace`,`/shared`,`/scoops`,`/home`],l=[`/shared/sprinkles`],u=6,d=500,f=new Set([`welcome`,`connect-llm`]);async function p(e){let t=new Map;for(let n of[...l,...c])await e.exists(n)&&await m(e,n,t);return t}async function m(e,t,n){let r=a(e,t,{maxDepth:u,maxDirs:d,skip:o});for await(let t of r){if(!t.endsWith(`.shtml`))continue;let r=h(t);if(!f.has(r)&&!n.has(r)){let i;try{i=await e.readFile(t,{encoding:`utf-8`})??``}catch{i=``}n.set(r,{name:r,path:t,title:g(i,r),autoOpen:_(i),icon:v(i)})}}}function h(e){let t=e.split(`/`).pop()??e;return t.endsWith(`.shtml`)?t.slice(0,-6):t}function g(e,t){let n=e.match(/data-sprinkle-title=["']([^"']+)["']/);if(n)return n[1];let r=e.match(/<title>([^<]+)<\/title>/i);return r?r[1].trim():t}function _(e){return/data-sprinkle-autoopen\b/.test(e)}function v(e){let t=/<link\b/gi,n;for(;(n=t.exec(e))!==null;){let t=n.index+n[0].length,r=y(e,t);if(r<0)continue;let i=e.slice(t,r);if(!/\brel\s*=\s*("|')\s*(?:shortcut\s+)?icon\s*\1/i.test(i))continue;let a=b(i,`href`);if(a!==void 0)return a.trim()}let r=b(e,`data-sprinkle-icon`);if(r!==void 0)return r.trim()}function y(e,t){let n=!1,r=!1;for(let i=t;i<e.length;i++){let t=e.charCodeAt(i);if(n)t===34&&(n=!1);else if(r)t===39&&(r=!1);else if(t===34)n=!0;else if(t===39)r=!0;else if(t===62)return i}return-1}function b(e,t){let n=RegExp(`\\b${t}\\s*=\\s*(?:"([^"]*)"|'([^']*)')`,`i`),r=e.match(n);if(r)return r[1]??r[2]??void 0}var x=e(`sprinkle-manager`),S=`slicc-open-sprinkles`,C=`sprinkles`;function w(){try{if(typeof window>`u`||!window.location)return null;let e=new URLSearchParams(window.location.search).get(C);return e===null?null:e===``?[]:e.split(`,`).map(e=>e.trim()).filter(e=>e.length>0)}catch{return null}}function T(e){try{if(typeof window>`u`||!window.location||typeof history>`u`||typeof history.replaceState!=`function`)return;let t=new URL(window.location.href);e.length===0?t.searchParams.delete(C):t.searchParams.set(C,e.join(`,`));let n=t.pathname+t.search+t.hash;history.replaceState(history.state??null,``,n)}catch{}}var E=`slicc-known-sprinkles`;function D(e){try{let t=new Set(e),n=O().filter(e=>t.has(e));localStorage.setItem(E,JSON.stringify(n))}catch{}}function O(){try{let e=localStorage.getItem(E);if(!e)return[];let t=JSON.parse(e);return Array.isArray(t)?t.filter(e=>typeof e==`string`):[]}catch{return[]}}var k=`slicc-autoopened-once`,A=c,j=250,M=class{fs;bridge;callbacks;availableSprinkles=new Map;watcherUnsub;openSprinkles=new Map;attentionOnly=new Set;inflightRefresh=null;lastRefreshAt=0;autoOpenBehavior;onSendToSprinkle;onSprinkleReloaded;registeredSprinkles=new Set;inlineSprinkles;changeListeners=new Set;changeNotifyScheduled=!1;urlWriteScheduled=!1;constructor(e,t,n,a,o={}){this.fs=e;let c=async()=>{let e=`image/png`,t=r(),n=i();if(!t&&!n)throw Error(`Screen capture unavailable in this environment`);if(t&&!navigator.mediaDevices?.getDisplayMedia)throw Error(`Screen capture not supported in this browser`);let a,o,s;if(t){let t=await navigator.mediaDevices.getDisplayMedia({video:!0,audio:!1});try{let n=document.createElement(`video`);n.srcObject=t,n.muted=!0,n.playsInline=!0,await new Promise((e,t)=>{n.onloadedmetadata=()=>n.play().then(()=>e()).catch(t),n.onerror=()=>t(Error(`Failed to load video stream`))}),await new Promise(e=>setTimeout(e,100)),o=n.videoWidth,s=n.videoHeight;let r=document.createElement(`canvas`);r.width=o,r.height=s;let i=r.getContext(`2d`);if(!i)throw Error(`Failed to get canvas context`);i.drawImage(n,0,0,o,s),a=await(await new Promise((t,n)=>{r.toBlob(e=>e?t(e):n(Error(`Failed to create image blob`)),e,1)})).arrayBuffer()}finally{for(let e of t.getTracks())e.stop()}}else{let t=await n.call(`screencapture`,{mimeType:e,quality:1},{timeoutMs:3e5});a=t.bytes,o=t.width,s=t.height}let c=new Uint8Array(a),l=[],u=8192;for(let e=0;e<c.length;e+=u)l.push(String.fromCharCode(...c.subarray(e,e+u)));return{base64:btoa(l.join(``)),width:o,height:s,mimeType:e}};this.bridge=new s(e,t,e=>this.close(e),e=>this.minimize(e),a,o.onAttachImage??(()=>{}),c,o.execHandler,(e,t,n)=>{this.openSprinkles.get(e)?.renderer.pushDeviceEvent(t,n)}),this.callbacks=n,this.autoOpenBehavior=o.autoOpenBehavior??`activate`,this.onSendToSprinkle=o.onSendToSprinkle,this.onSprinkleReloaded=o.onSprinkleReloaded,this.inlineSprinkles=o.inlineSprinkles??new Set}setSendToSprinkleHook(e){this.onSendToSprinkle&&!e&&x.error(`SprinkleManager broadcast hook detached`),this.onSendToSprinkle=e}setReloadHook(e){this.onSprinkleReloaded=e}async reload(e){let n=this.openSprinkles.get(e);if(!n){x.info(`Cannot reload closed sprinkle`,{name:e});return}let r=this.availableSprinkles.get(e);if(r||=(await this.refresh(),this.availableSprinkles.get(e)),!r){x.warn(`Sprinkle not found during reload`,{name:e});return}let i=await this.fs.readFile(r.path,{encoding:`utf-8`});if(i==null){x.warn(`Failed to read sprinkle content during reload`,{name:e});return}let a=typeof i==`string`?i:new TextDecoder(`utf-8`).decode(i);n.renderer?.dispose(),this.bridge.removeSprinkle(e);let o=this.bridge.createAPI(e),s=new t(n.container,o);if(await s.render(a,e),!this.openSprinkles.has(e)){s.dispose();return}if(n.renderer=s,s.activateBridgeLifecycle(),this.openSprinkles.has(e)&&(x.info(`Sprinkle reloaded`,{name:e}),this.notifyChange(),this.onSprinkleReloaded))try{this.onSprinkleReloaded(e)}catch(t){x.error(`onSprinkleReloaded hook threw`,{name:e,error:t instanceof Error?t.message:String(t)})}}async restoreOpenSprinkles(){try{let e=w();if(e!==null){await this.reopenInBackground(e);return}let t=localStorage.getItem(S);t?await this.restoreFromLegacyStorage(t):await this.autoOpenFirstRun()}catch{}await this.surfaceUnseenSprinkles()}async reopenInBackground(e){for(let t of e)try{await this.open(t,void 0,{background:!0})}catch{x.warn(`Failed to restore sprinkle`,{name:t})}}async restoreFromLegacyStorage(e){try{await this.reopenInBackground(JSON.parse(e))}finally{try{localStorage.removeItem(S)}catch{}}}async autoOpenFirstRun(){let e=this.autoOpenBehavior===`attention`,t=this.loadAutoOpenedOnce(),n=new Set;for(let r of this.availableSprinkles.values())if(!(!r.autoOpen||t.has(r.name)))try{await this.open(r.name,void 0,{attention:e}),n.add(r.name)}catch{x.warn(`Failed to auto-open sprinkle`,{name:r.name})}n.size>0&&this.persistAutoOpenedOnce(n)}async surfaceUnseenSprinkles(){let e=this.loadKnownSprinkles(),t=this.loadAutoOpenedOnce(),n=this.autoOpenBehavior===`attention`,r=new Set;for(let i of this.availableSprinkles.values())if(!e.has(i.name)&&!this.openSprinkles.has(i.name)&&!(i.autoOpen&&t.has(i.name)))try{await this.open(i.name,void 0,{attention:!i.autoOpen||n}),i.autoOpen&&r.add(i.name),x.info(`Surfaced previously-unseen sprinkle`,{name:i.name})}catch{x.warn(`Failed to surface unseen sprinkle`,{name:i.name})}this.persistKnownSprinkles(new Set(this.availableSprinkles.keys())),r.size>0&&this.persistAutoOpenedOnce(r)}loadKnownSprinkles(){return new Set(O())}persistKnownSprinkles(e){try{let t=new Set([...this.loadKnownSprinkles(),...e]);localStorage.setItem(E,JSON.stringify([...t]))}catch{}}loadAutoOpenedOnce(){try{let e=localStorage.getItem(k);if(!e)return new Set;let t=JSON.parse(e);return Array.isArray(t)?new Set(t.filter(e=>typeof e==`string`)):new Set}catch{return new Set}}persistAutoOpenedOnce(e){try{let t=new Set([...this.loadAutoOpenedOnce(),...e]);localStorage.setItem(k,JSON.stringify([...t]))}catch{}}persistOpenSprinkles(){try{let e=[...this.openSprinkles.keys()].filter(e=>!this.attentionOnly.has(e));localStorage.setItem(S,JSON.stringify(e))}catch{}this.schedulePersistOpenSprinklesToUrl()}schedulePersistOpenSprinklesToUrl(){this.urlWriteScheduled||(this.urlWriteScheduled=!0,queueMicrotask(()=>{this.urlWriteScheduled=!1,T([...this.openSprinkles.keys()].filter(e=>!this.attentionOnly.has(e)))}))}async openNewAutoOpenSprinkles(){if(this.inflightRefresh!==null)return this.inflightRefresh;if(!(Date.now()-this.lastRefreshAt<j))return this.inflightRefresh=this.runOpenNewAutoOpenSprinkles().finally(()=>{this.lastRefreshAt=Date.now(),this.inflightRefresh=null}),this.inflightRefresh}async runOpenNewAutoOpenSprinkles(){let e=new Set(this.availableSprinkles.keys());await this.refresh();let t=this.autoOpenBehavior===`attention`,n=this.loadAutoOpenedOnce(),r=new Set,i=!1;for(let a of this.availableSprinkles.values())if(!this.openSprinkles.has(a.name)&&!e.has(a.name)){if(i=!0,a.autoOpen){if(n.has(a.name)){x.info(`Skipped one-shot auto-open for previously-consumed sprinkle`,{name:a.name});continue}try{await this.open(a.name,void 0,{attention:t}),r.add(a.name),x.info(`Auto-opened new sprinkle after install`,{name:a.name,attention:t})}catch{x.warn(`Failed to auto-open new sprinkle`,{name:a.name})}}else try{await this.open(a.name,void 0,{attention:!0}),x.info(`Surfaced newly-installed sprinkle in rail`,{name:a.name})}catch{x.warn(`Failed to surface newly-installed sprinkle`,{name:a.name})}}i&&this.persistKnownSprinkles(new Set(this.availableSprinkles.keys())),r.size>0&&this.persistAutoOpenedOnce(r)}async refresh(){this.availableSprinkles=await p(this.fs),x.info(`Discovered sprinkles`,{count:this.availableSprinkles.size}),this.syncRegisteredIcons(),this.notifyChange()}syncRegisteredIcons(){if(!this.callbacks.registerSprinkle)return;let e=new Set;for(let t of this.availableSprinkles.values())this.inlineSprinkles.has(t.name)||e.add(t.name);for(let t of this.availableSprinkles.values())if(e.has(t.name)&&!this.registeredSprinkles.has(t.name))try{this.callbacks.registerSprinkle(t.name,t.title,{icon:t.icon}),this.registeredSprinkles.add(t.name)}catch(e){x.warn(`registerSprinkle callback threw`,{name:t.name,error:e instanceof Error?e.message:String(e)})}for(let t of[...this.registeredSprinkles])if(!e.has(t)){this.openSprinkles.has(t)&&this.close(t);try{this.callbacks.unregisterSprinkle?.(t)}catch(e){x.warn(`unregisterSprinkle callback threw`,{name:t,error:e instanceof Error?e.message:String(e)})}this.registeredSprinkles.delete(t)}}onChange(e){return this.changeListeners.add(e),()=>{this.changeListeners.delete(e)}}notifyChange(){this.changeNotifyScheduled||(this.changeNotifyScheduled=!0,queueMicrotask(()=>{this.changeNotifyScheduled=!1;for(let e of this.changeListeners)try{e()}catch(e){x.error(`SprinkleManager.onChange handler threw`,{error:e instanceof Error?e.message:String(e)})}}))}async open(e,r,i={}){if(this.openSprinkles.has(e)){x.info(`Sprinkle already open`,{name:e});return}let a=this.availableSprinkles.get(e);if(a||=(await this.refresh(),this.availableSprinkles.get(e)),!a)throw Error(`Sprinkle not found: ${e}`);let o=await this.fs.readFile(a.path,{encoding:`utf-8`});if(o==null)throw Error(`Failed to read sprinkle content: ${a.path} (file may be corrupted or missing)`);let s=typeof o==`string`?o:new TextDecoder(`utf-8`).decode(o),c=document.createElement(`div`);c.className=`sprinkle-panel`,c.style.cssText=`width: 100%; height: 100%; display: flex; flex-direction: column; overflow-y: auto;`,c.dataset.sprinkle=e,this.openSprinkles.set(e,{renderer:null,container:c}),i.attention?this.attentionOnly.add(e):this.attentionOnly.delete(e),this.callbacks.addSprinkle(e,a.title,c,r,{...i,icon:a.icon});let l=this.bridge.createAPI(e),u=new t(c,l);await u.render(s,e);let d=this.openSprinkles.get(e);if(!d){u.dispose();return}d.renderer=u,u.activateBridgeLifecycle(),this.openSprinkles.has(e)&&(this.persistOpenSprinkles(),n(e),x.info(`Sprinkle opened`,{name:e,title:a.title}),this.notifyChange())}markActivated(e){this.attentionOnly.has(e)&&(this.attentionOnly.delete(e),this.persistOpenSprinkles(),x.info(`Sprinkle promoted from attention to user-opened`,{name:e}),this.notifyChange())}async activate(e,t){if(this.attentionOnly.has(e)){this.markActivated(e);return}let n=this.openSprinkles.get(e);if(!n){try{await this.open(e,t)}catch(t){x.warn(`Failed to open sprinkle from rail-icon click`,{name:e,error:t instanceof Error?t.message:String(t)})}return}let r=this.availableSprinkles.get(e);this.callbacks.addSprinkle(e,r?.title??e,n.container,t,{icon:r?.icon})}close(e){let t=this.openSprinkles.get(e);t&&(t.renderer?.dispose(),t.container.remove(),this.bridge.removeSprinkle(e),this.openSprinkles.delete(e),this.attentionOnly.delete(e),this.callbacks.closeSprinkleContent?this.callbacks.closeSprinkleContent(e):this.callbacks.removeSprinkle(e),this.persistOpenSprinkles(),x.info(`Sprinkle closed`,{name:e}),this.notifyChange())}minimize(e){this.openSprinkles.has(e)&&(this.callbacks.minimizeSprinkle(e),x.info(`Sprinkle minimized`,{name:e}))}available(){return Array.from(this.availableSprinkles.values())}opened(){return Array.from(this.openSprinkles.keys())}setupWatcher(e){let t=null,n=new Map,r=e=>{let r=!1;for(let t of e){let e=this.findOpenSprinkleByPath(t.path);if(e){let t=n.get(e);t&&clearTimeout(t),n.set(e,setTimeout(()=>{n.delete(e),this.reload(e).catch(t=>{x.warn(`Sprinkle reload on watcher event failed`,{name:e,error:t instanceof Error?t.message:String(t)})})},300))}else r=!0}r&&!t&&(t=setTimeout(()=>{t=null,this.openNewAutoOpenSprinkles().catch(e=>{x.warn(`Sprinkle refresh on watcher event failed`,{error:e instanceof Error?e.message:String(e)})})},150))},i=A.map(t=>e.watch(t,e=>e.endsWith(`.shtml`),r));this.watcherUnsub=()=>{for(let e of i)e();t&&=(clearTimeout(t),null);for(let e of n.values())clearTimeout(e);n.clear()}}findOpenSprinkleByPath(e){for(let[t]of this.openSprinkles){let n=this.availableSprinkles.get(t);if(n&&n.path===e)return t}return null}dispose(){this.watcherUnsub?.()}sendToSprinkle(e,t,n){let r=!n?.runtime||n.runtime===`leader`,i=!n?.runtime||n.runtime!==`leader`,a={leader:!1,followers:[]};if(r){let n=this.openSprinkles.get(e);n?(this.bridge.pushUpdate(e,t),n.renderer.pushUpdate(t),a.leader=!0):x.warn(`Cannot send to closed sprinkle`,{name:e})}if(i&&this.onSendToSprinkle)try{let r=this.onSendToSprinkle(e,t,n);r&&(a.followers=r.followers,r.unknownRuntime&&(a.unknownRuntime=r.unknownRuntime))}catch(t){x.error(`onSendToSprinkle hook threw`,{name:e,error:t instanceof Error?t.message:String(t)})}return a}};export{M as SprinkleManager,D as pruneKnownSprinkleNames,O as readKnownSprinkleNames};
|
|
@@ -1,8 +1,12 @@
|
|
|
1
1
|
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/slicc-editor-Bhg4cWBq.js","assets/rolldown-runtime-Dd_uD5pT.js","assets/preload-helper-Czpn1I53.js","assets/dist-Bwf-JITi.js","assets/upgrade-own-properties-DI0JKxGt.js"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{t as e}from"./preload-helper-Czpn1I53.js";import{a as t,n,r}from"./theme-CXRqxpw6.js";function i(){try{let e=globalThis.window??globalThis;return e.self!==e.top}catch{return!0}}var a=new WeakSet;function o(e,t){if(a.has(e)){t?.();return}let n=!1;s(e,t,()=>{n=!0}),setTimeout(()=>{n||e.isConnected&&s(e)},500)}function s(e,t,n){if(a.has(e)){t?.();return}a.add(e);let r=e.style.display;e.style.display=`none`;let i=!1,o=o=>{i||(i=!0,e.style.display=r,a.delete(e),o&&n?.(),t?.())},s=globalThis.requestAnimationFrame;typeof s==`function`&&s(()=>{s(()=>o(!0))}),setTimeout(()=>o(!1),100)}function c(e){
|
|
2
|
+
import{t as e}from"./preload-helper-Czpn1I53.js";import{a as t,n,r}from"./theme-CXRqxpw6.js";function i(){try{let e=globalThis.window??globalThis;return e.self!==e.top}catch{return!0}}var a=new WeakSet;function o(e,t){if(a.has(e)){t?.();return}let n=!1;s(e,t,()=>{n=!0}),setTimeout(()=>{n||e.isConnected&&s(e)},500)}function s(e,t,n){if(a.has(e)){t?.();return}a.add(e);let r=e.style.display;e.style.display=`none`;let i=!1,o=o=>{i||(i=!0,e.style.display=r,a.delete(e),o&&n?.(),t?.())},s=globalThis.requestAnimationFrame;typeof s==`function`&&s(()=>{s(()=>o(!0))}),setTimeout(()=>o(!1),100)}function c(e,t){return e||(typeof document<`u`&&t===document.body?`document.body`:`container`)}function l(e,t,n){return`Element has zero dimensions (`+e+`, `+t+`x`+n+`)`}function u(e,t,n,r,i,a){let o=`Screenshot rendering failed (`+e+`; `+t+` `+n+`x`+r;return i&&(o+=`; serialised SVG `+i+` bytes`),a&&(o+=`; data URL `+a+` bytes`),o+`)`}function d(e,t,n){let r=e;return e.indexOf(`xmlns="http://www.w3.org/1999/xhtml"`)===-1&&(r=`<div xmlns="http://www.w3.org/1999/xhtml">`+e+`</div>`),`<svg xmlns="http://www.w3.org/2000/svg" width="`+t+`" height="`+n+`"><foreignObject width="100%" height="100%" xmlns="http://www.w3.org/1999/xhtml">`+r+`</foreignObject></svg>`}function f(){return`var screenshotTargetLabel = `+c.toString()+`;
|
|
3
|
+
var screenshotZeroDimensionError = `+l.toString()+`;
|
|
4
|
+
var screenshotRasteriseError = `+u.toString()+`;
|
|
5
|
+
var buildScreenshotSvg = `+d.toString()+`;
|
|
6
|
+
`}async function p(e,t){let n=t??document.body,r=e?n.querySelector(e):n,i=c(e,r);if(!r)throw Error(`Element not found: `+(e||i));let a=r.getBoundingClientRect(),o=Math.ceil(a.width),s=Math.ceil(a.height);if(o===0||s===0)throw Error(l(i,a.width,a.height));let f=document.createElement(`canvas`),p=window.devicePixelRatio||1;f.width=o*p,f.height=s*p;let g=f.getContext(`2d`);if(!g)throw Error(u(`canvas context unavailable`,i,o,s));g.scale(p,p);let _=r.cloneNode(!0);m(_);let v;try{v=new XMLSerializer().serializeToString(_)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(u(`XMLSerializer threw: `+t,i,o,s))}return h(d(v,o,s),g,f,i,o,s)}function m(e){if(!(`querySelectorAll`in e))return;let t=e.querySelectorAll(`script, link[rel="stylesheet"]`);for(let e=0;e<t.length;e++)t[e].parentNode?.removeChild(t[e])}function h(e,t,n,r,i,a){let o=e.length,s;try{s=`data:image/svg+xml;charset=utf-8,`+encodeURIComponent(e)}catch{return Promise.reject(Error(u(`data-URL too large`,r,i,a,o)))}let c=s.length,l=g(e,s,c,r,i,a);return l instanceof Error?Promise.reject(l):new Promise((e,s)=>{let d=new Image,f=()=>{if(l.blobUrl)try{URL.revokeObjectURL(l.blobUrl)}catch{}};d.onload=()=>{f(),t.drawImage(d,0,0),e(n.toDataURL(`image/png`))},d.onerror=()=>{f();let e=!l.blobUrl&&c>2097152?`data-URL too large`:`image decode failed`;s(Error(u(e,r,i,a,o,c)))},d.src=l.src})}function g(e,t,n,r,i,a){let o=()=>Error(u(`data-URL too large`,r,i,a,e.length,n));if(typeof URL<`u`&&typeof URL.createObjectURL==`function`)try{let t=URL.createObjectURL(new Blob([e],{type:`image/svg+xml;charset=utf-8`}));return{src:t,blobUrl:t}}catch{return n>2097152?o():{src:t,blobUrl:null}}return n>2097152?o():{src:t,blobUrl:null}}function _(e){let t=e.trimStart().toLowerCase();return t.startsWith(`<!doctype`)||t.startsWith(`<html`)}function v(e,t,n,r={}){e.contentWindow?.postMessage({type:t,id:n,...r},`*`)}function y(e,t,n,r,i){r.then(r=>v(e,t,n,i(r)),r=>v(e,t,n,{error:r instanceof Error?r.message:String(r)}))}function b(e){return{"sprinkle-lick":(t,n)=>e.lick({action:n.action,data:n.data}),"sprinkle-set-state":(t,n)=>e.setState(n.data),"sprinkle-close":()=>e.close(),"sprinkle-minimize":()=>e.minimize(),"sprinkle-stop-cone":()=>e.stopCone(),"sprinkle-attach-image":(t,n)=>e.attachImage(n.base64,n.name,n.mimeType),"sprinkle-readfile":(t,n)=>y(t,`sprinkle-readfile-response`,n.id,e.readFile(n.path),e=>({content:e})),"sprinkle-writefile":(t,n)=>y(t,`sprinkle-writefile-response`,n.id,e.writeFile(n.path,n.content),()=>({})),"sprinkle-readdir":(t,n)=>y(t,`sprinkle-readdir-response`,n.id,e.readDir(n.path),e=>({entries:e})),"sprinkle-exists":(t,n)=>y(t,`sprinkle-exists-response`,n.id,e.exists(n.path),e=>({exists:e})),"sprinkle-stat":(t,n)=>y(t,`sprinkle-stat-response`,n.id,e.stat(n.path),e=>({stat:e})),"sprinkle-mkdir":(t,n)=>y(t,`sprinkle-mkdir-response`,n.id,e.mkdir(n.path),()=>({})),"sprinkle-rm":(t,n)=>y(t,`sprinkle-rm-response`,n.id,e.rm(n.path),()=>({})),"sprinkle-capture-screen":(t,n)=>y(t,`sprinkle-capture-screen-response`,n.id,e.captureScreen(),e=>({base64:e.base64,width:e.width,height:e.height,mimeType:e.mimeType})),"sprinkle-exec":(t,n)=>y(t,`sprinkle-exec-response`,n.id,e.exec(n.cmd),e=>({result:e})),"sprinkle-agent":(t,n)=>y(t,`sprinkle-agent-response`,n.id,e.agent(n.prompt,n.opts),e=>({result:e})),"sprinkle-jsh":(t,n)=>y(t,`sprinkle-jsh-response`,n.id,e._jsh(n.op,n.args),e=>({result:e})),"sprinkle-device-op":(t,n)=>y(t,`sprinkle-device-op-response`,n.id,e._device(n.channel,n.op,n.args??[]),e=>({result:e}))}}function x(e,t){return n=>{if(n.source!==e.contentWindow)return;let r=n.data;r?.type&&t[r.type]?.(e,r)}}function S(t){if(t.includes(`<slicc-editor`)&&!customElements.get(`slicc-editor`)&&e(()=>import(`./slicc-editor-Bhg4cWBq.js`).then(e=>e.t),__vite__mapDeps([0,1,2,3,4])),t.includes(`<slicc-diff`)&&!customElements.get(`slicc-diff`)){let e=document.createElement(`script`);e.src=`/slicc-diff.js`,document.head.appendChild(e)}}function C(e){for(let t of e.querySelectorAll(`.fill[data-value]`)){let e=parseFloat(t.dataset.value||`0`);e>=0&&e<=100&&(t.style.width=`${e}%`)}}function w(e,t){let n=`window.__slicc_sprinkles[${JSON.stringify(t)}]`;for(let t of e.querySelectorAll(`[onclick]`)){let e=t.getAttribute(`onclick`)||``;/\b(slicc|bridge)\b/.test(e)&&t.setAttribute(`onclick`,e.replace(/\b(slicc|bridge)\b/g,n))}return n}function T(e){let t=new Set;for(let n of e.querySelectorAll(`[onclick]`)){let e=n.getAttribute(`onclick`)||``;for(let n of e.matchAll(/\b(\w+)\s*\(/g)){let e=n[1];[`slicc`,`bridge`,`lick`,`close`,`exec`,`agent`].includes(e)||t.add(e)}}return t}function E(e,t){let n=[];for(let r of Array.from(e.querySelectorAll(`script`))){r.remove();let i=document.createElement(`script`);for(let e of r.attributes)i.setAttribute(e.name,e.value);if(!r.src){let n=[...T(e)].map(e=>`if (typeof ${e} === 'function') window.${e} = ${e};`).join(`
|
|
3
7
|
`);i.textContent=`(function() { var slicc = ${t}; var bridge = slicc;\n`+r.textContent+(n?`
|
|
4
8
|
`+n:``)+`
|
|
5
|
-
})();`}e.appendChild(i),n.push(i)}return n}var
|
|
9
|
+
})();`}e.appendChild(i),n.push(i)}return n}var D=class{container;bridge;scripts=[];iframe=null;messageHandler=null;visibilityObserver=null;bridgeLifecycleReady=!1;pendingBridgeLifecycle=[];constructor(e,t){this.container=e,this.bridge=t}async render(e,t){if(this.dispose(),_(e))try{await this.renderFullDoc(e,t)}catch(e){throw this.dispose(),e}else this.renderInline(e,t)}activateBridgeLifecycle(){for(this.bridgeLifecycleReady=!0;this.bridgeLifecycleReady&&this.pendingBridgeLifecycle.length>0;)this.pendingBridgeLifecycle.shift()()}pushUpdate(e){this.iframe?.contentWindow&&this.iframe.contentWindow.postMessage({type:`sprinkle-update`,data:e},`*`)}pushDeviceEvent(e,t){this.iframe?.contentWindow&&this.iframe.contentWindow.postMessage({type:`sprinkle-device-event`,channel:e,payload:t},`*`)}collectThemeCSS(){return k()}generateBridgeScript(){return`(function() {
|
|
6
10
|
var _updateListeners = new Set();
|
|
7
11
|
var _hidInputReportListeners = new Set();
|
|
8
12
|
var _sprinkleName = '';
|
|
@@ -64,6 +68,8 @@ import{t as e}from"./preload-helper-Czpn1I53.js";import{a as t,n,r}from"./theme-
|
|
|
64
68
|
return btoa(bin);
|
|
65
69
|
}
|
|
66
70
|
|
|
71
|
+
${f()}
|
|
72
|
+
|
|
67
73
|
var api = {
|
|
68
74
|
lick: function(event) {
|
|
69
75
|
var action, data;
|
|
@@ -94,29 +100,82 @@ import{t as e}from"./preload-helper-Czpn1I53.js";import{a as t,n,r}from"./theme-
|
|
|
94
100
|
return _vfsCall('sprinkle-rm', { path: path });
|
|
95
101
|
},
|
|
96
102
|
screenshot: function(selector) {
|
|
103
|
+
// Keep in lockstep with captureSprinkleScreenshot in sprinkle-screenshot.ts.
|
|
97
104
|
return new Promise(function(resolve, reject) {
|
|
98
105
|
try {
|
|
99
106
|
var target = selector ? document.querySelector(selector) : document.body;
|
|
100
|
-
|
|
107
|
+
var label = screenshotTargetLabel(selector, target);
|
|
108
|
+
if (!target) { reject(new Error('Element not found: ' + (selector || label))); return; }
|
|
101
109
|
var rect = target.getBoundingClientRect();
|
|
102
110
|
var w = Math.ceil(rect.width);
|
|
103
111
|
var h = Math.ceil(rect.height);
|
|
104
|
-
if (w === 0 || h === 0) {
|
|
112
|
+
if (w === 0 || h === 0) {
|
|
113
|
+
reject(new Error(screenshotZeroDimensionError(label, rect.width, rect.height)));
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
105
116
|
var canvas = document.createElement('canvas');
|
|
106
117
|
var dpr = window.devicePixelRatio || 1;
|
|
107
118
|
canvas.width = w * dpr;
|
|
108
119
|
canvas.height = h * dpr;
|
|
109
120
|
var ctx = canvas.getContext('2d');
|
|
121
|
+
if (!ctx) {
|
|
122
|
+
reject(new Error(screenshotRasteriseError('canvas context unavailable', label, w, h)));
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
110
125
|
ctx.scale(dpr, dpr);
|
|
111
126
|
var clone = target.cloneNode(true);
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
127
|
+
if (clone.querySelectorAll) {
|
|
128
|
+
var junk = clone.querySelectorAll('script, link[rel="stylesheet"]');
|
|
129
|
+
for (var i = 0; i < junk.length; i++) {
|
|
130
|
+
if (junk[i].parentNode) junk[i].parentNode.removeChild(junk[i]);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
var xhtml;
|
|
134
|
+
try {
|
|
135
|
+
xhtml = new XMLSerializer().serializeToString(clone);
|
|
136
|
+
} catch (serErr) {
|
|
137
|
+
var serMsg = serErr && serErr.message ? serErr.message : String(serErr);
|
|
138
|
+
reject(new Error(screenshotRasteriseError('XMLSerializer threw: ' + serMsg, label, w, h)));
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
var svg = buildScreenshotSvg(xhtml, w, h);
|
|
142
|
+
var svgBytes = svg.length;
|
|
143
|
+
var dataUrl;
|
|
144
|
+
try {
|
|
145
|
+
dataUrl = 'data:image/svg+xml;charset=utf-8,' + encodeURIComponent(svg);
|
|
146
|
+
} catch (encErr) {
|
|
147
|
+
reject(new Error(screenshotRasteriseError('data-URL too large', label, w, h, svgBytes)));
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
var dataUrlBytes = dataUrl.length;
|
|
151
|
+
var src = dataUrl;
|
|
152
|
+
var blobUrl = null;
|
|
153
|
+
if (typeof URL !== 'undefined' && URL.createObjectURL) {
|
|
154
|
+
try {
|
|
155
|
+
blobUrl = URL.createObjectURL(new Blob([svg], { type: 'image/svg+xml;charset=utf-8' }));
|
|
156
|
+
src = blobUrl;
|
|
157
|
+
} catch (blobErr) {
|
|
158
|
+
if (dataUrlBytes > 2097152) {
|
|
159
|
+
reject(new Error(screenshotRasteriseError('data-URL too large', label, w, h, svgBytes, dataUrlBytes)));
|
|
160
|
+
return;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
} else if (dataUrlBytes > 2097152) {
|
|
164
|
+
reject(new Error(screenshotRasteriseError('data-URL too large', label, w, h, svgBytes, dataUrlBytes)));
|
|
165
|
+
return;
|
|
166
|
+
}
|
|
116
167
|
var img = new Image();
|
|
117
|
-
img.onload = function() {
|
|
118
|
-
|
|
119
|
-
|
|
168
|
+
img.onload = function() {
|
|
169
|
+
if (blobUrl) { try { URL.revokeObjectURL(blobUrl); } catch (e) {} }
|
|
170
|
+
ctx.drawImage(img, 0, 0);
|
|
171
|
+
resolve(canvas.toDataURL('image/png'));
|
|
172
|
+
};
|
|
173
|
+
img.onerror = function() {
|
|
174
|
+
if (blobUrl) { try { URL.revokeObjectURL(blobUrl); } catch (e) {} }
|
|
175
|
+
var reason = !blobUrl && dataUrlBytes > 2097152 ? 'data-URL too large' : 'image decode failed';
|
|
176
|
+
reject(new Error(screenshotRasteriseError(reason, label, w, h, svgBytes, dataUrlBytes)));
|
|
177
|
+
};
|
|
178
|
+
img.src = src;
|
|
120
179
|
} catch(e) { reject(e); }
|
|
121
180
|
});
|
|
122
181
|
},
|
|
@@ -214,9 +273,9 @@ import{t as e}from"./preload-helper-Czpn1I53.js";import{a as t,n,r}from"./theme-
|
|
|
214
273
|
};
|
|
215
274
|
window.slicc = api;
|
|
216
275
|
window.bridge = api;
|
|
217
|
-
})();`}async renderFullDoc(e,t){let a=`<script>${this.generateBridgeScript()}<\/script>`,s=this.collectThemeCSS(),c=s?`<style>${s}</style>`:``,l=e.includes(`<slicc-editor`)?`<script src="/slicc-editor.js"><\/script>`:``,u=e.includes(`<slicc-diff`)?`<script src="/slicc-diff.js"><\/script>`:``,
|
|
276
|
+
})();`}async renderFullDoc(e,t){let a=`<script>${this.generateBridgeScript()}<\/script>`,s=this.collectThemeCSS(),c=s?`<style>${s}</style>`:``,l=e.includes(`<slicc-editor`)?`<script src="/slicc-editor.js"><\/script>`:``,u=e.includes(`<slicc-diff`)?`<script src="/slicc-diff.js"><\/script>`:``,d=`<script>(function(){try{if(${n()?`true`:`false`})document.documentElement.classList.add('theme-light');}catch(e){}})();<\/script>`+a+c+l+u+`<script src="/lucide-icons.js"><\/script>`,f,p=e.match(/<head\b[^>]*>/i);if(p){let t=p.index+p[0].length;f=e.slice(0,t)+d+e.slice(t)}else{let t=e.match(/<script\b/i);if(t)f=e.slice(0,t.index)+d+e.slice(t.index);else{let t=e.match(/<html\b[^>]*>/i);if(t){let n=t.index+t[0].length;f=e.slice(0,n)+d+e.slice(n)}else f=d+e}}let m=document.createElement(`iframe`),h=i()?`allow-scripts allow-same-origin allow-popups`:`allow-scripts allow-same-origin`;m.setAttribute(`sandbox`,h),m.style.cssText=`width: 100%; flex: 1; border: none; min-height: 0;`+(i()?` transform: translateZ(0);`:``),m.srcdoc=f,this.iframe=m;let g=b(this.bridge);for(let e of[`sprinkle-close`,`sprinkle-minimize`]){let t=g[e];g[e]=(e,n)=>{if(!this.bridgeLifecycleReady){this.pendingBridgeLifecycle.push(()=>t(e,n));return}t(e,n)}}if(this.messageHandler=x(m,g),window.addEventListener(`message`,this.messageHandler),await new Promise((e,n)=>{let a=setTimeout(()=>{n(Error(`full-doc iframe load timed out`))},5e3);m.addEventListener(`load`,()=>{clearTimeout(a),r(m.contentWindow);let n=this.bridge.getState();m.contentWindow?.postMessage({type:`sprinkle-init`,name:t,savedState:n},`*`),i()&&o(m),e()},{once:!0}),m.addEventListener(`error`,()=>{clearTimeout(a),n(Error(`full-doc iframe failed to load`))},{once:!0}),this.container.appendChild(m)}),i()&&typeof IntersectionObserver<`u`){let e=!1,t=new IntersectionObserver(n=>{if(n[n.length-1].isIntersecting){if(e){e=!1;return}t.unobserve(m),o(m,()=>{e=!0,t.observe(m)})}});this.visibilityObserver=t,t.observe(m)}}renderInline(e,t){S(e),window.__slicc_sprinkles||(window.__slicc_sprinkles={}),window.__slicc_sprinkles[t]=this.bridge,this.bridge._container=this.container;let n=document.createElement(`div`);n.className=`sprinkle-content`,n.innerHTML=e,this.container.appendChild(n),C(n);let r=w(n,t);this.scripts=E(n,r)}dispose(){this.bridgeLifecycleReady=!1,this.pendingBridgeLifecycle=[],this.visibilityObserver&&=(this.visibilityObserver.disconnect(),null),this.messageHandler&&=(window.removeEventListener(`message`,this.messageHandler),null),this.iframe&&=(t(this.iframe.contentWindow),this.iframe.remove(),null);for(let e of this.scripts)e.remove();this.scripts=[];let e=this.container.querySelector(`.sprinkle-content`);e&&e.remove(),window.__slicc_sprinkles&&delete window.__slicc_sprinkles[this.bridge.name]}};function O(e,t){return e.replace(/url\(\s*['"]?([^'")]+)['"]?\s*\)/g,(e,n)=>{if(/^(https?:|data:|blob:)/i.test(n))return`url('${n}')`;try{return`url('${new URL(n,t).href}')`}catch{return`url('${n}')`}})}function k(){if(typeof getComputedStyle!=`function`)return``;let e=[],t=[],n=[],r=location.href,i=e=>e===`:root`||e===`:root.theme-light`||e.startsWith(`.theme-light `)||e===`.theme-light`||e.split(`,`).some(e=>{let t=e.trim();return t===`:root`||t===`:root.theme-light`||t.startsWith(`.theme-light `)||t===`.theme-light`});for(let a of document.styleSheets)try{for(let o of a.cssRules)if(o instanceof CSSFontFaceRule)e.push(O(o.cssText,r));else if(o instanceof CSSStyleRule){let e=o.selectorText;i(e)&&t.push(o.cssText),(e.includes(`.sprinkle-`)||e.includes(`.fill`))&&n.push(o.cssText)}}catch{}return e.join(`
|
|
218
277
|
`)+`
|
|
219
278
|
`+t.join(`
|
|
220
279
|
`)+`
|
|
221
280
|
`+n.join(`
|
|
222
|
-
`)}export{o as i,
|
|
281
|
+
`)}export{o as a,i,k as n,p as r,D as t};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{t as e}from"./logger-LESFN7Hj.js";import{n as t}from"./panel-rpc-BPwAqRch.js";import{t as n}from"./base64-DzRgusa4.js";import{t as r}from"./types-Dgm4REV3.js";import"./fs-
|
|
1
|
+
import{t as e}from"./logger-LESFN7Hj.js";import{n as t}from"./panel-rpc-BPwAqRch.js";import{t as n}from"./base64-DzRgusa4.js";import{t as r}from"./types-Dgm4REV3.js";import"./fs-D5rn9Yg2.js";import"./tray-storage-keys-DbThbnIh.js";function i(e){return e==null?[]:Array.isArray(e)?e:[e]}function a(e,t,n,r){var i,a=e[t],o=~r.string.indexOf(t)?n==null||n===!0?``:String(n):typeof n==`boolean`?n:~r.boolean.indexOf(t)?n===`false`?!1:n===`true`||(e._.push((i=+n,i*0==0?i:n)),!!n):(i=+n,i*0==0?i:n);e[t]=a==null?o:Array.isArray(a)?a.concat(o):[a,o]}function o(e,t){e||=[],t||={};var n,r,o,s,c,l={_:[]},u=0,d=0,f=0,p=e.length;let m=t.alias!==void 0,h=t.unknown!==void 0,g=t.default!==void 0;if(t.alias=t.alias||{},t.string=i(t.string),t.boolean=i(t.boolean),m)for(n in t.alias)for(r=t.alias[n]=i(t.alias[n]),u=0;u<r.length;u++)(t.alias[r[u]]=r.concat(n)).splice(u,1);for(u=t.boolean.length;u-->0;)for(r=t.alias[t.boolean[u]]||[],d=r.length;d-->0;)t.boolean.push(r[d]);for(u=t.string.length;u-->0;)for(r=t.alias[t.string[u]]||[],d=r.length;d-->0;)t.string.push(r[d]);if(g){for(n in t.default)if(s=typeof t.default[n],r=t.alias[n]=t.alias[n]||[],t[s]!==void 0)for(t[s].push(n),u=0;u<r.length;u++)t[s].push(r[u])}let _=h?Object.keys(t.alias):[];for(u=0;u<p;u++){if(o=e[u],o===`--`){l._=l._.concat(e.slice(++u));break}for(d=0;d<o.length&&o.charCodeAt(d)===45;d++);if(d===0)l._.push(o);else if(o.substring(d,d+3)===`no-`){if(s=o.substring(d+3),h&&!~_.indexOf(s))return t.unknown(o);l[s]=!1}else{for(f=d+1;f<o.length&&o.charCodeAt(f)!==61;f++);for(s=o.substring(d,f),c=o.substring(++f)||u+1===p||(``+e[u+1]).charCodeAt(0)===45||e[++u],r=d===2?[s]:s,f=0;f<r.length;f++){if(s=r[f],h&&!~_.indexOf(s))return t.unknown(`-`.repeat(d)+s);a(l,s,f+1<r.length||c,t)}}}if(g)for(n in t.default)l[n]===void 0&&(l[n]=t.default[n]);if(m)for(n in l)for(r=t.alias[n]||[];r.length>0;)l[r.shift()]=l[n];return l}function s(e,t){let n=[],r=new Map,i=new Set;for(let a=0;a<e.length;a++){let o=e[a];o.startsWith(`-`)?t.has(o)?r.set(o,e[++a]??``):i.add(o):n.push(o)}return{positionals:n,flags:r,bools:i}}function c(e){let t=new Set(e.string??[]),n=e.alias??{};for(let[e,r]of Object.entries(n)){let n=[e,...Array.isArray(r)?r:[r]];if(n.some(e=>t.has(e)))for(let e of n)t.add(e)}return t}const l=/^(--?)([^=]+)(=.*)?$/;function u(e){let t=new Set(e.string??[]);for(let n of e.boolean??[])t.add(n),t.add(`no-${n}`);for(let[n,r]of Object.entries(e.alias??{})){t.add(n);for(let e of Array.isArray(r)?r:[r])t.add(e)}return t}function d(e,t,n){let r=0;for(;r<e.length;r++){let i=e[r];if(!i.startsWith(`-`)||i===`-`)break;let a=l.exec(i);if(!a||!n.has(a[2]))break;!a[3]&&t.has(a[2])&&r+1<e.length&&r++}return r}function f(e,t){let n=[];for(let r=0;r<e.length;r++){let i=e[r],a=l.exec(i);a&&!a[3]&&t.has(a[2])&&r+1<e.length?(n.push(`${i}=${e[r+1]}`),r++):n.push(i)}return n}function p(e,t={}){let n=e,r=[];if(t[`--`]){let t=e.indexOf(`--`);t!==-1&&(n=e.slice(0,t),r=e.slice(t+1))}let i=c(t),a=n,s=[];if(t.stopEarly){let e=d(n,i,u(t));a=n.slice(0,e),s=n.slice(e)}let{_:l,...p}=o(f(a,i),{string:t.string?[...t.string]:void 0,boolean:t.boolean?[...t.boolean]:void 0,alias:t.alias,default:t.default}),m=t.stopEarly?s:l;return{_:m,positionals:m,flags:p,doubleDashRest:r}}const m=[`playwright-cli`,`playwright`,`puppeteer`],h=new WeakMap,g=e(`playwright`);function _(e,t){let n=h.get(e);n||(n=new WeakMap,h.set(e,n));let r=n.get(t);return r||(r={snapshots:new Map,appTabId:null,harRecorder:null,sessionDirsCreated:!1,teleportWatchers:new Map,consoleMessages:new Map,consoleCleanup:new Map,networkRequests:new Map,networkRequestIndex:new Map,networkCleanup:new Map,routes:new Map,routeCleanup:new Map,lastMousePosition:new Map},n.set(t,r)),r}const v=/^(f[0-9]+)?e[0-9]+$/;function y(e){return v.test(e)}function b(e){let t=e.match(/^(f[0-9]+)(e[0-9]+)$/);return t?{framePrefix:t[1],isIframe:!0}:{framePrefix:``,isIframe:!1}}const x=n,S=new Set([`click`,`dblclick`,`fill`,`type`,`press`,`goto`,`navigate`,`select`,`check`,`uncheck`,`drag`,`dialog-accept`,`dialog-dismiss`,`drop`]);function C(e){return e.toISOString().replace(/:/g,`-`)}function w(e){return e instanceof r||typeof e==`object`&&e&&`code`in e?e.code===`EEXIST`:e instanceof Error&&e.message.includes(`EEXIST`)}const T=`function(text) {
|
|
2
2
|
const el = this;
|
|
3
3
|
const tag = el.tagName;
|
|
4
4
|
const proto = tag === 'TEXTAREA' ? window.HTMLTextAreaElement.prototype : window.HTMLInputElement.prototype;
|