sliccy 3.18.2 → 3.18.3
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/node-server/_cloud_core/src/index.d.ts +14 -14
- package/dist/node-server/_cloud_core/src/index.d.ts.map +1 -1
- package/dist/node-server/_cloud_core/src/index.js +8 -8
- package/dist/node-server/_cloud_core/src/operations/start.d.ts.map +1 -1
- package/dist/node-server/_cloud_core/src/operations/start.js +1 -1
- package/dist/node-server/_cloud_core/src/polling.d.ts.map +1 -1
- package/dist/node-server/_cloud_core/src/substrate.d.ts +1 -3
- package/dist/node-server/_cloud_core/src/substrate.d.ts.map +1 -1
- package/dist/node-server/_cloud_core/tests/fixtures/fake-substrate.d.ts.map +1 -1
- package/dist/node-server/_cloud_core/tests/fixtures/index.d.ts +1 -1
- package/dist/node-server/_cloud_core/tests/fixtures/index.d.ts.map +1 -1
- package/dist/node-server/_cloud_core/tests/kill.test.js +1 -1
- package/dist/node-server/_cloud_core/tests/list.test.js +1 -1
- package/dist/node-server/_cloud_core/tests/pause.test.js +2 -2
- package/dist/node-server/_cloud_core/tests/resume.test.js +1 -1
- package/dist/node-server/_cloud_core/tests/secrets-filter.test.js +1 -1
- package/dist/node-server/_cloud_core/tests/start.test.js +2 -2
- package/dist/node-server/_shared/index.d.ts +1 -1
- package/dist/node-server/_shared/index.d.ts.map +1 -1
- package/dist/node-server/_shared/index.js +1 -1
- package/dist/node-server/_shared/index.js.map +1 -1
- package/dist/node-server/_shared/secrets-pipeline.js +1 -1
- package/dist/node-server/_shared/secrets-pipeline.js.map +1 -1
- package/dist/node-server/chrome-launch.d.ts +1 -1
- package/dist/node-server/chrome-launch.js +1 -1
- package/dist/node-server/cloud/start.d.ts +1 -1
- package/dist/node-server/cloud-status.d.ts +1 -1
- package/dist/node-server/cloud-status.js +1 -1
- package/dist/node-server/electron-controller.js +4 -2
- package/dist/node-server/electron-main.js +3 -3
- package/dist/node-server/electron-runtime.js +2 -4
- package/dist/node-server/file-logger.js +2 -3
- package/dist/node-server/index.js +28 -28
- package/dist/node-server/leader-restart.d.ts +1 -1
- package/dist/node-server/leader-restart.js +1 -1
- package/dist/node-server/publish-chrome-web-store.js +3 -3
- package/dist/node-server/qa-setup.js +2 -2
- package/dist/node-server/release-package.js +4 -4
- package/dist/node-server/secrets/env-secret-store.js +2 -2
- package/dist/node-server/secrets/index.d.ts +2 -2
- package/dist/node-server/secrets/index.js +1 -1
- package/dist/node-server/secrets/proxy-manager.d.ts +2 -2
- package/dist/node-server/secrets/session-id-file.js +1 -1
- package/dist/ui/assets/adobe-B_oiTyco.js +2 -0
- package/dist/ui/assets/adobe-Dx8BWfmR.js +1 -0
- package/dist/ui/assets/agent-bridge-IiBaczw0.js +1 -0
- package/dist/ui/assets/{agent-message-to-chat-BE57ZBLh.js → agent-message-to-chat-2QE1DrD6.js} +1 -1
- package/dist/ui/assets/{anthropic-BcSdV8pD.js → anthropic-BrlNmBB_.js} +4 -4
- package/dist/ui/assets/{anthropic-DQxPCIFH.js → anthropic-CGp3Y61f.js} +2 -2
- package/dist/ui/assets/{apps-mO8aDMrq.js → apps-DHtdXEFC.js} +1 -1
- package/dist/ui/assets/azure-openai-B_oi7W3l.js +1 -0
- package/dist/ui/assets/azure-openai-EdQM9uf6.js +1 -0
- package/dist/ui/assets/{azure-openai-responses-BU_XGpvM.js → azure-openai-responses-BZzQ7ATE.js} +1 -1
- package/dist/ui/assets/{azure-openai-responses-BRhJy7L9.js → azure-openai-responses-DN4_pPiZ.js} +1 -1
- package/dist/ui/assets/{biome_wasm-Dsby769g.js → biome_wasm-CCwZjySm.js} +1 -1
- package/dist/ui/assets/{bsh-watchdog-B2VnB8Hc.js → bsh-watchdog-09B0mtSV.js} +1 -1
- package/dist/ui/assets/{cdp-CZFLwITr.js → cdp-DuHXZFOf.js} +5 -5
- package/dist/ui/assets/cdp-ws-page-bridge-DKOUju_v.js +1 -0
- package/dist/ui/assets/cloud-CyzxzXN0.css +1 -0
- package/dist/ui/assets/{common-C5EHUwRw.js → common-96rh56ZH.js} +1 -1
- package/dist/ui/assets/cost-command-SgdLPGNY.js +1 -0
- package/dist/ui/assets/{es-CIePRJNx.js → es-NL1lARQ_.js} +3 -3
- package/dist/ui/assets/{follower-sprinkle-bridge-BCZtC5oQ.js → follower-sprinkle-bridge-C8rbQ_8W.js} +1 -1
- package/dist/ui/assets/{github-Cuml-aMN.js → github-Bqo8KbG9.js} +2 -2
- package/dist/ui/assets/github-copilot-BlU2VxkS.js +1 -0
- package/dist/ui/assets/github-copilot-CPYBnjPP.js +2 -0
- package/dist/ui/assets/github-dM1Ro3vF.js +1 -0
- package/dist/ui/assets/{google-DP32XT6z.js → google-Cz81OJtC.js} +1 -1
- package/dist/ui/assets/google-q1B6LTkX.js +1 -0
- package/dist/ui/assets/{google-shared-B8LClwJs.js → google-shared-Be3L7xgF.js} +3 -3
- package/dist/ui/assets/{google-shared-BE7O5JRJ.js → google-shared-WRo2J0Bu.js} +3 -3
- package/dist/ui/assets/{google-vertex-CVNzlGFS.js → google-vertex-B77AACy4.js} +1 -1
- package/dist/ui/assets/google-vertex-t5SxXj3M.js +1 -0
- package/dist/ui/assets/{intercepted-oauth-Yq6VnKOU.js → intercepted-oauth-Dq0-yq7X.js} +1 -1
- package/dist/ui/assets/js-realm-worker-XtbGPqy4.js +5 -0
- package/dist/ui/assets/{kernel-worker-DUwEvDLP.js → kernel-worker-CqKKwX7-.js} +2812 -2812
- package/dist/ui/assets/lick-manager-proxy-DCbHSHHW.js +1 -0
- package/dist/ui/assets/{lick-ws-bridge-DGd0ungq.js → lick-ws-bridge-BJY-5mGm.js} +1 -1
- package/dist/ui/assets/{local-llm-BWfSS02u.js → local-llm-C3kYsr4y.js} +2 -2
- package/dist/ui/assets/{magick-wasm-DMpZ0xn7.js → magick-wasm-BsOHWHIp.js} +1 -1
- package/dist/ui/assets/main-BxXY3xQw.css +1 -0
- package/dist/ui/assets/main-DFJvoInU.js +1625 -0
- package/dist/ui/assets/{mistral-D2ZFaMYs.js → mistral-Bkf4jH6E.js} +2 -2
- package/dist/ui/assets/{mistral-DmDZQCDp.js → mistral-DF5zG6nb.js} +2 -2
- package/dist/ui/assets/{nodejs-CC19Ujs5.js → nodejs-L8rKjihg.js} +1 -1
- package/dist/ui/assets/{nuke-command-BI3M3eyO.js → nuke-command-BH60fg0s.js} +1 -1
- package/dist/ui/assets/oauth-BgrN6guG.js +1 -0
- package/dist/ui/assets/oauth-bootstrap-BEZrEp-1.js +2 -0
- package/dist/ui/assets/{oauth-service-vw0jayqa.js → oauth-service-BoibOCV1.js} +1 -1
- package/dist/ui/assets/{oauth-service-Oq-gdFyA.js → oauth-service-xFLnN2ZO.js} +1 -1
- package/dist/ui/assets/offscreen-client-WvRelD8x.js +1 -0
- package/dist/ui/assets/onboarding-orchestrator-BwJtEG3C.js +1 -0
- package/dist/ui/assets/openai-codex-BrK1yWdt.js +1 -0
- package/dist/ui/assets/openai-codex-DM_n6_7c.js +1 -0
- package/dist/ui/assets/{openai-codex-responses-CCUkmTRh.js → openai-codex-responses-C-HE1mmG.js} +2 -2
- package/dist/ui/assets/{openai-codex-responses-BTV1saBU.js → openai-codex-responses-C_mhTGmx.js} +5 -5
- package/dist/ui/assets/{openai-completions-Bb61sCiV.js → openai-completions-D6cHHSwW.js} +3 -3
- package/dist/ui/assets/{openai-responses-BVG3U8zk.js → openai-responses-DC8Eto72.js} +1 -1
- package/dist/ui/assets/openai-responses-DcZBtqsy.js +1 -0
- package/dist/ui/assets/{openai-responses-shared-DA49Rfb_.js → openai-responses-shared-DCGKA7Ra.js} +5 -5
- package/dist/ui/assets/{openai-responses-shared-DUZclpEl.js → openai-responses-shared-DIAfUN0c.js} +4 -4
- package/dist/ui/assets/{openrouter-BV7zAGwj.js → openrouter-30Lmo_jf.js} +1 -1
- package/dist/ui/assets/{openrouter-CXUaOOUz.js → openrouter-D2Bbll7p.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-BuCgwxyv.js → panel-rpc-handlers-BIsm349P.js} +1 -1
- package/dist/ui/assets/provider-0OWW3xWe.js +2 -0
- package/dist/ui/assets/provider-BgnHgZk7.js +1 -0
- package/dist/ui/assets/provider-store-access-DHl8WEbW.js +1 -0
- package/dist/ui/assets/provider-store-access-HEl9ZaJY.js +1 -0
- package/dist/ui/assets/{proxied-fetch-Co4xc8Zx.js → proxied-fetch-c_Mp6CN0.js} +1 -1
- package/dist/ui/assets/{pyodide-Rf0RrGzC.js → pyodide-CuorL_q6.js} +2 -2
- package/dist/ui/assets/{remote-terminal-view-D_Pz424p.js → remote-terminal-view-DRcVnXe_.js} +1 -1
- package/dist/ui/assets/secret-env-D-RwiR-b.js +1 -0
- package/dist/ui/assets/{slicc-editor-CXe5pc1V.js → slicc-editor-IcTxVUUL.js} +1 -1
- package/dist/ui/assets/{spawn-BcsTqDoe.js → spawn-AgPhx71I.js} +1 -1
- package/dist/ui/assets/sprinkle-bridge-channel-BceIr6aT.js +1 -0
- package/dist/ui/assets/sprinkle-bridge-channel-gxatjtur.js +1 -0
- package/dist/ui/assets/{sql-wasm-CkcgI_g8.js → sql-wasm-nA0NVJ7m.js} +1 -1
- package/dist/ui/assets/store-ETS7Mwlz.js +1 -0
- package/dist/ui/assets/{tray-leave-runtime-DT7p1Dfo.js → tray-leave-runtime-CwZDtopA.js} +1 -1
- package/dist/ui/assets/{typescript-DrOHgpWs.js → typescript-deRIT_gO.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-DHPHdclH.js → upgrade-detection-uhFX1JOq.js} +1 -1
- package/dist/ui/assets/{web-d_o69eQn.js → web-DtS4s_Zi.js} +1 -1
- package/dist/ui/assets/{ws-subscribers-C9zq_zPO.js → ws-subscribers-Cb5lL5l2.js} +1 -1
- package/dist/ui/assets/xai-grok-BglvsGaG.js +1 -0
- package/dist/ui/assets/xai-grok-D4S50SbZ.js +1 -0
- package/dist/ui/electron-overlay-entry.js +7 -7
- package/dist/ui/index.html +2 -2
- package/dist/ui/packages/webapp/cloud/index.html +2 -2
- package/dist/ui/packages/webapp/index.html +2 -2
- package/dist/ui/slicc-editor.js +18 -18
- package/package.json +7 -10
- package/dist/ui/assets/adobe-8f0cDD-F.js +0 -2
- package/dist/ui/assets/adobe-9jZbPWGY.js +0 -1
- package/dist/ui/assets/agent-bridge-DrpsAjAx.js +0 -1
- package/dist/ui/assets/azure-openai-BMtvo9nb.js +0 -1
- package/dist/ui/assets/azure-openai-rwKIzRjs.js +0 -1
- package/dist/ui/assets/cdp-ws-page-bridge-CpiFdZR-.js +0 -1
- package/dist/ui/assets/cloud-DyAca2cv.css +0 -1
- package/dist/ui/assets/cost-command-Cip9dmhS.js +0 -1
- package/dist/ui/assets/github-D16_NU5e.js +0 -1
- package/dist/ui/assets/github-copilot-B9ezHXqR.js +0 -2
- package/dist/ui/assets/github-copilot-DidI-khP.js +0 -1
- package/dist/ui/assets/google-DMkt2uz8.js +0 -1
- package/dist/ui/assets/google-vertex-riDIQY3Z.js +0 -1
- package/dist/ui/assets/js-realm-worker-BQqgSA_p.js +0 -5
- package/dist/ui/assets/lick-manager-proxy-B749hY0Y.js +0 -1
- package/dist/ui/assets/main-CvlDeETm.css +0 -1
- package/dist/ui/assets/main-DDbwoA-3.js +0 -1625
- package/dist/ui/assets/oauth-VHJ6dPF1.js +0 -1
- package/dist/ui/assets/oauth-bootstrap-CIKm1VRy.js +0 -2
- package/dist/ui/assets/offscreen-client-DnCeFiGk.js +0 -1
- package/dist/ui/assets/onboarding-orchestrator-Db5FENNP.js +0 -1
- package/dist/ui/assets/openai-codex-CaycRa7E.js +0 -1
- package/dist/ui/assets/openai-codex-Shax5egE.js +0 -1
- package/dist/ui/assets/openai-responses-CL7uUIsc.js +0 -1
- package/dist/ui/assets/provider-BuO5v5qG.js +0 -2
- package/dist/ui/assets/provider-Db6MdNxx.js +0 -1
- package/dist/ui/assets/provider-store-access-BgYDz9cL.js +0 -1
- package/dist/ui/assets/provider-store-access-SVZWIGcz.js +0 -1
- package/dist/ui/assets/secret-env-BY7tW9md.js +0 -1
- package/dist/ui/assets/sprinkle-bridge-channel-DwDzRdg8.js +0 -1
- package/dist/ui/assets/sprinkle-bridge-channel-gvVv6R_O.js +0 -1
- package/dist/ui/assets/store-7TTPXkQU.js +0 -1
- package/dist/ui/assets/xai-grok-Di0THC-7.js +0 -1
- package/dist/ui/assets/xai-grok-DycJT1IK.js +0 -1
- /package/dist/ui/assets/{cloud-BDR25NRv.js → cloud-CZM-12lk.js} +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sliccy",
|
|
3
|
-
"version": "3.18.
|
|
3
|
+
"version": "3.18.3",
|
|
4
4
|
"description": "Browser-based coding agent with thin CLI server",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -52,7 +52,8 @@
|
|
|
52
52
|
"test:server-integration": "vitest run --config packages/node-server/tests/integration/server/vitest.config.ts",
|
|
53
53
|
"test:e2e": "npx playwright test --config packages/webapp/tests/e2e/playwright.config.ts",
|
|
54
54
|
"start:extension": "npm run build -w @slicc/chrome-extension && npm run dev -- --profile=extension",
|
|
55
|
-
"lint": "
|
|
55
|
+
"lint": "biome check --write . && prettier --write .",
|
|
56
|
+
"lint:ci": "biome check . && prettier --check .",
|
|
56
57
|
"deadcode": "knip --include files,dependencies,devDependencies,unlisted,binaries,unresolved,duplicates",
|
|
57
58
|
"deadcode:full": "knip",
|
|
58
59
|
"deadcode:files": "knip --include files",
|
|
@@ -71,16 +72,13 @@
|
|
|
71
72
|
"ws": "^8.18.0"
|
|
72
73
|
},
|
|
73
74
|
"devDependencies": {
|
|
74
|
-
"@
|
|
75
|
+
"@biomejs/biome": "2.4.16",
|
|
75
76
|
"@playwright/test": "^1.58.2",
|
|
76
77
|
"@semantic-release/exec": "7.1.0",
|
|
77
78
|
"@semantic-release/git": "10.0.1",
|
|
78
79
|
"@types/node": "^24.0.0",
|
|
79
80
|
"@vitest/coverage-v8": "^4.1.5",
|
|
80
81
|
"esbuild": "0.28.0",
|
|
81
|
-
"eslint": "10.4.0",
|
|
82
|
-
"eslint-config-prettier": "10.1.8",
|
|
83
|
-
"globals": "17.6.0",
|
|
84
82
|
"husky": "9.1.7",
|
|
85
83
|
"knip": "^6.11.0",
|
|
86
84
|
"lint-staged": "17.0.5",
|
|
@@ -88,15 +86,14 @@
|
|
|
88
86
|
"semantic-release": "25.0.3",
|
|
89
87
|
"tsx": "4.22.3",
|
|
90
88
|
"typescript": "^6.0.0",
|
|
91
|
-
"typescript-eslint": "8.60.0",
|
|
92
89
|
"vite": "8.0.14",
|
|
93
90
|
"vitest": "4.1.7"
|
|
94
91
|
},
|
|
95
92
|
"lint-staged": {
|
|
96
|
-
"**/*.{ts,js,mjs}": [
|
|
97
|
-
"
|
|
93
|
+
"**/*.{ts,tsx,js,jsx,mjs,cjs,json,jsonc,css}": [
|
|
94
|
+
"biome check --write --no-errors-on-unmatched --files-ignore-unknown=true"
|
|
98
95
|
],
|
|
99
|
-
"**/*.{
|
|
96
|
+
"**/*.{md,html,yaml,yml}": [
|
|
100
97
|
"prettier --write"
|
|
101
98
|
]
|
|
102
99
|
}
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/oauth-service-Oq-gdFyA.js","assets/main-DDbwoA-3.js","assets/modulepreload-polyfill-Dezn_h7o.js","assets/main-CvlDeETm.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{F as e,J as t,L as n,V as r,W as i,Y as a,Z as o,et as s,g as c,l,p as u,u as d,z as f}from"./main-DDbwoA-3.js";import{getOAuthPageOrigin as p}from"./oauth-service-Oq-gdFyA.js";var m=Object.assign({"/packages/webapp/providers/adobe-config.json":{proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`}})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function h(){let e=u(`adobe`);if(e)return e.replace(/\/$/,``);if(m.proxyEndpoint)return m.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}var g=new Map,_=new Map;async function v(e){let t=g.get(e);if(t)return t;try{let t=await fetch(`${e}/v1/config`,{headers:{[N]:`3.18.2`}});if(t.ok){let n=await t.json();return g.set(e,n),n}console.warn(`[adobe] Proxy /v1/config returned ${t.status}, falling back to build-time config`)}catch(e){console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e))}let n={};return g.set(e,n),n}function y(e){let t=e.clientId||m.clientId;if(!t)throw Error(`Could not determine IMS client ID — proxy /v1/config did not return one and adobe-config.json is empty`);return t}function b(e){return e.scopes||m.scopes}function x(e){return e.imsEnvironment||m.imsEnvironment||`prod`}var S={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function C(e){return S[e??m.imsEnvironment??`prod`]??S.prod}var w=typeof chrome<`u`&&!!chrome?.runtime?.id;function T(){return d().find(e=>e.providerId===`adobe`)}async function E(e,t){try{let n=await fetch(`${C(t)}/ims/userinfo/v2`,{headers:{Authorization:`Bearer ${e}`}});if(n.ok){let e=await n.json();return{name:e.displayName||e.name||e.email,avatar:e.picture||e.avatar_url}}console.warn(`[adobe] User profile fetch returned ${n.status}, account will have no display name`)}catch(e){console.warn(`[adobe] Failed to fetch user profile:`,e instanceof Error?e.message:String(e))}return{}}function D(e){let t=e.indexOf(`#`);if(t<0)return null;let n=new URLSearchParams(e.slice(t+1)),r=n.get(`access_token`);return r?{accessToken:r,expiresIn:parseInt(n.get(`expires_in`)??`86400`,10)}:null}var O={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!m.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,oauthTokenDomains:[`ims-na1.adobelogin.com`,`ims-na1-stg1.adobelogin.com`,`*.adobelogin.com`,`*.adobe.io`,`firefall.adobe.io`,`admin.hlx.page`,`admin.hlx.live`,`admin.aem.page`,`admin.aem.live`],getModelIds:()=>{let e=e=>{let t={id:e.id,name:e.name??e.id},n=_.get(e.id);return n?.api&&(t.api=n.api),n?.context_window!==void 0&&(t.context_window=n.context_window),n?.max_tokens!==void 0&&(t.max_tokens=n.max_tokens),n?.reasoning!==void 0&&(t.reasoning=n.reasoning),n?.input&&(t.input=n.input),/haiku/i.test(e.id)&&(t.compat={supportsEagerToolInputStreaming:!1}),t};for(let t of U.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id}));try{localStorage.setItem(`slicc-adobe-models`,JSON.stringify(n))}catch{}return n}for(let t of g.values())if(t.models?.length)return t.models.map(e);try{let e=localStorage.getItem(`slicc-adobe-models`);if(e){let t=JSON.parse(e);if(t.length)return t}}catch{}return[{id:`claude-sonnet-4-6`,name:`Claude Sonnet 4.6`}]},onOAuthLogin:async(e,t,n)=>{let r=h(),i=await v(r),a=y(i),o=b(i),s=x(i),l=w?null:await p(),u=w?m.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:m.redirectUri??`${l.origin}/auth/callback`,d=w?void 0:btoa(JSON.stringify({port:parseInt(new URL(l.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),f=d?JSON.parse(atob(d)).nonce:null,g=new URLSearchParams({client_id:a,scope:o,response_type:`token`,redirect_uri:u});d&&g.set(`state`,d),n?.forceReauth&&g.set(`prompt`,`login`);let _=await e(`${C(s)}/ims/authorize/v2?${g}`);if(!_)return;if(f&&_)try{if(new URL(_).searchParams.get(`nonce`)!==f){console.error(`[adobe] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let S=D(_);if(!S){console.error(`[adobe] Could not extract token from redirect URL`);return}let T=await E(S.accessToken,s);await c({providerId:`adobe`,accessToken:S.accessToken,tokenExpiresAt:Date.now()+S.expiresIn*1e3,userName:T.name,userAvatar:T.avatar,baseUrl:m.proxyEndpoint?void 0:r}),await W().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),t()},onOAuthLogout:async()=>{let e=T();if(e?.accessToken)try{let t=g.values().next().value??{},n=t.clientId||m.clientId,r=x(t);if(n){let t=await fetch(`${C(r)}/ims/revoke`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({token:e.accessToken,token_type_hint:`access_token`,client_id:n})});t.ok||console.warn(`[adobe] Token revocation returned ${t.status}, token may still be valid server-side`)}}catch(e){console.warn(`[adobe] Failed to revoke token:`,e instanceof Error?e.message:String(e))}await c({providerId:`adobe`,accessToken:``})},onSilentRenew:async()=>T()?.accessToken?M():null},k=null;async function A(){let e=T();if(!e?.accessToken)throw Error(`Not logged in to Adobe — please log in first`);if((e.tokenExpiresAt??0)-Date.now()>6e4)return e.accessToken;console.log(`[adobe] Token expired or expiring soon, attempting silent renewal...`);try{let e=await M();if(e)return e}catch(e){console.warn(`[adobe] Silent renewal failed:`,e instanceof Error?e.message:String(e))}let t=T();if((t?.tokenExpiresAt??0)-Date.now()>0&&t?.accessToken)return t.accessToken;throw Error(`Adobe session expired — please log in again`)}function j(){let e=T();return e?.tokenExpiresAt?Date.now()>e.tokenExpiresAt-6e4:!0}async function M(){return typeof window>`u`?null:k||(k=(async()=>{try{let e=h(),t=await v(e),n=y(t),r=b(t),i=x(t),a=w?m.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:m.redirectUri??`${window.location.origin}/auth/callback`,o=w?void 0:btoa(JSON.stringify({port:parseInt(new URL(window.location.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),l=o?JSON.parse(atob(o)).nonce:null,u=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:a,prompt:`none`});o&&u.set(`state`,o);let d=`${C(i)}/ims/authorize/v2?${u}`,{createOAuthLauncher:f}=await s(async()=>{let{createOAuthLauncher:e}=await import(`./oauth-service-Oq-gdFyA.js`);return{createOAuthLauncher:e}},__vite__mapDeps([0,1,2,3])),p=await f()(d);if(!p)return null;if(l&&p)try{if(new URL(p).searchParams.get(`nonce`)!==l)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),null}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let g=D(p);if(!g)return null;let _=T();return await c({providerId:`adobe`,accessToken:g.accessToken,tokenExpiresAt:Date.now()+g.expiresIn*1e3,userName:_?.userName,userAvatar:_?.userAvatar,baseUrl:m.proxyEndpoint?void 0:e}),console.log(`[adobe] Token renewed silently`),await W().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),g.accessToken}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}finally{k=null}})(),k)}var N=`X-Slicc-Version`;function P(e){let t={},n=N.toLowerCase();if(e.headers)for(let[r,i]of Object.entries(e.headers))r.toLowerCase()!==n&&(t[r]=i);return t[N]=`3.18.2`,{...e,headers:t}}var F=`adobe-provider-fallback`,I=new Set;function L(e,t){if(e.headers){for(let t of Object.keys(e.headers))if(t.toLowerCase()===`x-session-id`)return e}return I.has(t)||(I.add(t),console.warn(`[adobe] Missing X-Session-Id from ${t} — using daily fallback. Attach an X-Session-Id header at the call site (see scoop-context.ts streamWithSessionId or docs/pitfalls.md).`)),{...e,headers:{...e.headers??{},"X-Session-Id":l(F)}}}function R(){I.clear()}function z(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`adobe-anthropic`,provider:`adobe`,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}var B=(t,r,a={})=>{let o=i();return(async()=>{try{let i=await A();if(String(t.api).includes(`openai`)){let e=n({...t,baseUrl:`${h()}/v1`,api:`openai-completions`,compat:{...t.compat,supportsStore:!1,supportsDeveloperRole:!1}},r,P(L({...a,apiKey:i},`streamAdobe[openai]`)));for await(let t of e)o.push(t)}else{let n=e({...t,baseUrl:h(),api:`anthropic-messages`},r,P(L({...a,apiKey:i},`streamAdobe[anthropic]`)));for await(let e of n)o.push(e)}o.end()}catch(e){console.error(`[adobe] Stream error:`,e instanceof Error?e.message:String(e)),o.push(z(t,e)),o.end()}})(),o},V=(e,t,n)=>{let a=i();return(async()=>{try{let i=await A();if(String(e.api).includes(`openai`)){let o=r({...e,baseUrl:`${h()}/v1`,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1}},t,P(L({...n,apiKey:i},`streamSimpleAdobe[openai]`)));for await(let e of o)a.push(e)}else{let r=f({...e,baseUrl:h(),api:`anthropic-messages`},t,P(L({...n,apiKey:i},`streamSimpleAdobe[anthropic]`)));for await(let e of r)a.push(e)}a.end()}catch(t){console.error(`[adobe] Stream error:`,t instanceof Error?t.message:String(t)),a.push(z(e,t)),a.end()}})(),a};async function H(){try{let e=await A(),n=h(),r=await fetch(`${n}/v1/models`,{headers:{Authorization:`Bearer ${e}`,[N]:`3.18.2`}});if(r.ok){let e=await r.json();if(e.data?.length){for(let t of e.data){let e={id:t.id,name:t.name};t.api!==void 0&&(e.api=t.api),t.context_window!==void 0&&(e.context_window=t.context_window),t.max_tokens!==void 0&&(e.max_tokens=t.max_tokens),t.reasoning!==void 0&&(e.reasoning=t.reasoning),t.input!==void 0&&(e.input=t.input),_.set(t.id,e)}let r=new Map;for(let e of a())try{for(let n of t(e))r.set(n.id,n)}catch{}return e.data.map(e=>{let t=r.get(e.id),i=`adobe-${e.api===`openai`?`openai`:`anthropic`}`;return t?{...t,provider:`adobe`,api:i}:{id:e.id,name:e.name??e.id,provider:`adobe`,api:i,baseUrl:n,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},inputCost:0,outputCost:0,cacheReadCost:0,cacheWriteCost:0,reasoning:!0}})}}else console.warn(`[adobe] Proxy /v1/models returned ${r.status}, falling back to Anthropic models`)}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return t(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}var U=new Map;async function W(){let e=h(),t=U.get(e);if(t)return t;let n=await H();return U.set(e,n),n}function G(){o({api:`adobe-anthropic`,stream:B,streamSimple:V}),o({api:`adobe-openai`,stream:B,streamSimple:V})}export{R as __resetAdobeSessionIdWarningCacheForTests,O as config,W as getAdobeModels,A as getValidAccessToken,j as isTokenExpired,G as register};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{G as e,I as t,K as n,M as r,P as i,R as a,V as o,Y as s,h as c,p as l,t as u,v as d}from"./kernel-worker-DUwEvDLP.js";import{getOAuthPageOrigin as f}from"./oauth-service-vw0jayqa.js";const p=Object.assign({"/packages/webapp/providers/adobe-config.json":{proxyEndpoint:`https://adobe-llm-proxy.paolo-moz.workers.dev`,redirectUri:`https://www.sliccy.ai/auth/callback`,extensionRedirectUri:`https://akjjllgokmbgpbdbmafpiefnhidlmbgf.chromiumapp.org/adobe`}})[`/packages/webapp/providers/adobe-config.json`]??{clientId:``,proxyEndpoint:``,scopes:`openid,profile,email`};function m(){let e=c(`adobe`);if(e)return e.replace(/\/$/,``);if(p.proxyEndpoint)return p.proxyEndpoint.replace(/\/$/,``);throw Error(`Adobe proxy endpoint not configured — set it in Settings or adobe-config.json`)}const h=new Map,g=new Map;async function _(e){let t=h.get(e);if(t)return t;try{let t=await fetch(`${e}/v1/config`,{headers:{[M]:`3.18.2`}});if(t.ok){let n=await t.json();return h.set(e,n),n}console.warn(`[adobe] Proxy /v1/config returned ${t.status}, falling back to build-time config`)}catch(e){console.warn(`[adobe] Failed to fetch proxy config:`,e instanceof Error?e.message:String(e))}let n={};return h.set(e,n),n}function v(e){let t=e.clientId||p.clientId;if(!t)throw Error(`Could not determine IMS client ID — proxy /v1/config did not return one and adobe-config.json is empty`);return t}function y(e){return e.scopes||p.scopes}function b(e){return e.imsEnvironment||p.imsEnvironment||`prod`}const x={prod:`https://ims-na1.adobelogin.com`,stg1:`https://ims-na1-stg1.adobelogin.com`};function S(e){return x[e??p.imsEnvironment??`prod`]??x.prod}const C=typeof chrome<`u`&&!!chrome?.runtime?.id;function w(){return l().find(e=>e.providerId===`adobe`)}async function T(e,t){try{let n=await fetch(`${S(t)}/ims/userinfo/v2`,{headers:{Authorization:`Bearer ${e}`}});if(n.ok){let e=await n.json();return{name:e.displayName||e.name||e.email,avatar:e.picture||e.avatar_url}}console.warn(`[adobe] User profile fetch returned ${n.status}, account will have no display name`)}catch(e){console.warn(`[adobe] Failed to fetch user profile:`,e instanceof Error?e.message:String(e))}return{}}function E(e){let t=e.indexOf(`#`);if(t<0)return null;let n=new URLSearchParams(e.slice(t+1)),r=n.get(`access_token`);return r?{accessToken:r,expiresIn:parseInt(n.get(`expires_in`)??`86400`,10)}:null}const D={id:`adobe`,name:`Adobe`,description:`Claude via Adobe — login with your Adobe ID`,requiresApiKey:!1,requiresBaseUrl:!p.proxyEndpoint,baseUrlPlaceholder:`https://your-proxy.example.com`,baseUrlDescription:`Anthropic-compatible proxy endpoint`,isOAuth:!0,defaultModelId:`sonnet`,oauthTokenDomains:[`ims-na1.adobelogin.com`,`ims-na1-stg1.adobelogin.com`,`*.adobelogin.com`,`*.adobe.io`,`firefall.adobe.io`,`admin.hlx.page`,`admin.hlx.live`,`admin.aem.page`,`admin.aem.live`],getModelIds:()=>{let e=e=>{let t={id:e.id,name:e.name??e.id},n=g.get(e.id);return n?.api&&(t.api=n.api),n?.context_window!==void 0&&(t.context_window=n.context_window),n?.max_tokens!==void 0&&(t.max_tokens=n.max_tokens),n?.reasoning!==void 0&&(t.reasoning=n.reasoning),n?.input&&(t.input=n.input),/haiku/i.test(e.id)&&(t.compat={supportsEagerToolInputStreaming:!1}),t};for(let t of V.values())if(t.length){let n=t.map(t=>e({id:t.id,name:t.name??t.id}));try{localStorage.setItem(`slicc-adobe-models`,JSON.stringify(n))}catch{}return n}for(let t of h.values())if(t.models?.length)return t.models.map(e);try{let e=localStorage.getItem(`slicc-adobe-models`);if(e){let t=JSON.parse(e);if(t.length)return t}}catch{}return[{id:`claude-sonnet-4-6`,name:`Claude Sonnet 4.6`}]},onOAuthLogin:async(e,t,n)=>{let r=m(),i=await _(r),a=v(i),o=y(i),s=b(i),c=C?null:await f(),l=C?p.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:p.redirectUri??`${c.origin}/auth/callback`,u=C?void 0:btoa(JSON.stringify({port:parseInt(new URL(c.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),h=u?JSON.parse(atob(u)).nonce:null,g=new URLSearchParams({client_id:a,scope:o,response_type:`token`,redirect_uri:l});u&&g.set(`state`,u),n?.forceReauth&&g.set(`prompt`,`login`);let x=await e(`${S(s)}/ims/authorize/v2?${g}`);if(!x)return;if(h&&x)try{if(new URL(x).searchParams.get(`nonce`)!==h){console.error(`[adobe] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let w=E(x);if(!w){console.error(`[adobe] Could not extract token from redirect URL`);return}let D=await T(w.accessToken,s);await d({providerId:`adobe`,accessToken:w.accessToken,tokenExpiresAt:Date.now()+w.expiresIn*1e3,userName:D.name,userAvatar:D.avatar,baseUrl:p.proxyEndpoint?void 0:r}),await H().catch(e=>console.warn(`[adobe] Failed to fetch models after login:`,e instanceof Error?e.message:String(e))),t()},onOAuthLogout:async()=>{let e=w();if(e?.accessToken)try{let t=h.values().next().value??{},n=t.clientId||p.clientId,r=b(t);if(n){let t=await fetch(`${S(r)}/ims/revoke`,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:new URLSearchParams({token:e.accessToken,token_type_hint:`access_token`,client_id:n})});t.ok||console.warn(`[adobe] Token revocation returned ${t.status}, token may still be valid server-side`)}}catch(e){console.warn(`[adobe] Failed to revoke token:`,e instanceof Error?e.message:String(e))}await d({providerId:`adobe`,accessToken:``})},onSilentRenew:async()=>w()?.accessToken?j():null};let O=null;async function k(){let e=w();if(!e?.accessToken)throw Error(`Not logged in to Adobe — please log in first`);if((e.tokenExpiresAt??0)-Date.now()>6e4)return e.accessToken;console.log(`[adobe] Token expired or expiring soon, attempting silent renewal...`);try{let e=await j();if(e)return e}catch(e){console.warn(`[adobe] Silent renewal failed:`,e instanceof Error?e.message:String(e))}let t=w();if((t?.tokenExpiresAt??0)-Date.now()>0&&t?.accessToken)return t.accessToken;throw Error(`Adobe session expired — please log in again`)}function A(){let e=w();return e?.tokenExpiresAt?Date.now()>e.tokenExpiresAt-6e4:!0}async function j(){return typeof window>`u`?null:O||(O=(async()=>{try{let e=m(),t=await _(e),n=v(t),r=y(t),i=b(t),a=C?p.extensionRedirectUri??`https://${chrome.runtime.id}.chromiumapp.org/`:p.redirectUri??`${window.location.origin}/auth/callback`,o=C?void 0:btoa(JSON.stringify({port:parseInt(new URL(window.location.href).port||`5710`,10),path:`/auth/callback`,nonce:crypto.randomUUID()})),s=o?JSON.parse(atob(o)).nonce:null,c=new URLSearchParams({client_id:n,scope:r,response_type:`token`,redirect_uri:a,prompt:`none`});o&&c.set(`state`,o);let l=`${S(i)}/ims/authorize/v2?${c}`,{createOAuthLauncher:u}=await import(`./oauth-service-vw0jayqa.js`),f=await u()(l);if(!f)return null;if(s&&f)try{if(new URL(f).searchParams.get(`nonce`)!==s)return console.error(`[adobe] OAuth nonce mismatch — possible CSRF`),null}catch(e){console.warn(`[adobe] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let h=E(f);if(!h)return null;let g=w();return await d({providerId:`adobe`,accessToken:h.accessToken,tokenExpiresAt:Date.now()+h.expiresIn*1e3,userName:g?.userName,userAvatar:g?.userAvatar,baseUrl:p.proxyEndpoint?void 0:e}),console.log(`[adobe] Token renewed silently`),await H().catch(e=>console.warn(`[adobe] Failed to refresh models after silent renewal:`,e instanceof Error?e.message:String(e))),h.accessToken}catch(e){return console.warn(`[adobe] Silent renewal error:`,e instanceof Error?e.message:String(e)),null}finally{O=null}})(),O)}const M=`X-Slicc-Version`;function N(e){let t={};if(e.headers)for(let[n,r]of Object.entries(e.headers))n.toLowerCase()!==`x-slicc-version`&&(t[n]=r);return t[M]=`3.18.2`,{...e,headers:t}}const P=new Set;function F(e,t){if(e.headers){for(let t of Object.keys(e.headers))if(t.toLowerCase()===`x-session-id`)return e}return P.has(t)||(P.add(t),console.warn(`[adobe] Missing X-Session-Id from ${t} — using daily fallback. Attach an X-Session-Id header at the call site (see scoop-context.ts streamWithSessionId or docs/pitfalls.md).`)),{...e,headers:{...e.headers??{},"X-Session-Id":u(`adobe-provider-fallback`)}}}function I(){P.clear()}function L(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:`adobe-anthropic`,provider:`adobe`,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}const R=(e,t,n={})=>{let a=o();return(async()=>{try{let o=await k();if(String(e.api).includes(`openai`)){let r=i({...e,baseUrl:`${m()}/v1`,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1}},t,N(F({...n,apiKey:o},`streamAdobe[openai]`)));for await(let e of r)a.push(e)}else{let i=r({...e,baseUrl:m(),api:`anthropic-messages`},t,N(F({...n,apiKey:o},`streamAdobe[anthropic]`)));for await(let e of i)a.push(e)}a.end()}catch(t){console.error(`[adobe] Stream error:`,t instanceof Error?t.message:String(t)),a.push(L(e,t)),a.end()}})(),a},z=(e,n,r)=>{let i=o();return(async()=>{try{let o=await k();if(String(e.api).includes(`openai`)){let t=a({...e,baseUrl:`${m()}/v1`,api:`openai-completions`,compat:{...e.compat,supportsStore:!1,supportsDeveloperRole:!1}},n,N(F({...r,apiKey:o},`streamSimpleAdobe[openai]`)));for await(let e of t)i.push(e)}else{let a=t({...e,baseUrl:m(),api:`anthropic-messages`},n,N(F({...r,apiKey:o},`streamSimpleAdobe[anthropic]`)));for await(let e of a)i.push(e)}i.end()}catch(t){console.error(`[adobe] Stream error:`,t instanceof Error?t.message:String(t)),i.push(L(e,t)),i.end()}})(),i};async function B(){try{let t=await k(),r=m(),i=await fetch(`${r}/v1/models`,{headers:{Authorization:`Bearer ${t}`,[M]:`3.18.2`}});if(i.ok){let t=await i.json();if(t.data?.length){for(let e of t.data){let t={id:e.id,name:e.name};e.api!==void 0&&(t.api=e.api),e.context_window!==void 0&&(t.context_window=e.context_window),e.max_tokens!==void 0&&(t.max_tokens=e.max_tokens),e.reasoning!==void 0&&(t.reasoning=e.reasoning),e.input!==void 0&&(t.input=e.input),g.set(e.id,t)}let i=new Map;for(let t of n())try{for(let n of e(t))i.set(n.id,n)}catch{}return t.data.map(e=>{let t=i.get(e.id),n=`adobe-${e.api===`openai`?`openai`:`anthropic`}`;return t?{...t,provider:`adobe`,api:n}:{id:e.id,name:e.name??e.id,provider:`adobe`,api:n,baseUrl:r,contextWindow:2e5,maxTokens:16384,input:[`text`,`image`],cost:{input:0,output:0,cacheRead:0,cacheWrite:0},inputCost:0,outputCost:0,cacheReadCost:0,cacheWriteCost:0,reasoning:!0}})}}else console.warn(`[adobe] Proxy /v1/models returned ${i.status}, falling back to Anthropic models`)}catch(e){console.warn(`[adobe] Failed to fetch proxy models:`,e instanceof Error?e.message:String(e))}return e(`anthropic`).map(e=>({...e,provider:`adobe`,api:`adobe-anthropic`}))}const V=new Map;async function H(){let e=m(),t=V.get(e);if(t)return t;let n=await B();return V.set(e,n),n}function U(){s({api:`adobe-anthropic`,stream:R,streamSimple:z}),s({api:`adobe-openai`,stream:R,streamSimple:z})}export{I as __resetAdobeSessionIdWarningCacheForTests,D as config,H as getAdobeModels,k as getValidAccessToken,A as isTokenExpired,U as register};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{tt as e}from"./main-DDbwoA-3.js";var t=e(`agent-bridge`),n=`__slicc_agent`,r=`agent-spawn-request`;function i(){let e={spawn(e){return new Promise((t,n)=>{let i=globalThis.chrome?.runtime;if(!i||typeof i.sendMessage!=`function`){n(Error(`agent: chrome.runtime.sendMessage not available`));return}let a=e=>{let r=i.lastError;if(r){n(Error(r.message??`chrome.runtime error`));return}if(e==null){n(Error(`agent: empty response from offscreen bridge`));return}let a=e;if(!a.ok){n(Error(a.error??`agent: offscreen bridge error`));return}if(!a.result){n(Error(`agent: offscreen bridge returned no result`));return}t(a.result)};try{i.sendMessage({source:`panel`,payload:{type:r,options:e}},a)}catch(e){n(e instanceof Error?e:Error(String(e)))}})}};return globalThis[n]=e,t.info(`agent bridge proxy published on globalThis.__slicc_agent`),e}export{i as publishAgentBridgeProxy};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{H as e,V as t,Y as n,b as r,c as i,g as a,m as o,x as s}from"./kernel-worker-DUwEvDLP.js";const c=`azure-openai`,l=`2024-12-01-preview`,u={id:c,name:`Azure OpenAI`,description:`GPT models via Azure AI Foundry`,requiresApiKey:!0,apiKeyPlaceholder:`Azure API key`,apiKeyEnvVar:`AZURE_OPENAI_API_KEY`,requiresBaseUrl:!0,baseUrlPlaceholder:`https://your-resource.cognitiveservices.azure.com/`,baseUrlDescription:`Azure resource endpoint`,requiresDeployment:!0,deploymentPlaceholder:`gpt-4.1-mini, gpt-4o, o4-mini`,deploymentDescription:`Comma-separated deployment names (from Azure Portal → Deployments)`,requiresApiVersion:!0,apiVersionDefault:l,apiVersionDescription:`Azure OpenAI API version`,getModelIds:()=>{let e=a(c);if(!e)return[{id:`azure-unconfigured`,name:`Azure OpenAI (set deployments in Settings)`}];let t=e.split(`,`).map(e=>e.trim()).filter(Boolean);return t.length===0?[{id:`azure-unconfigured`,name:`Azure OpenAI (set deployments in Settings)`}]:t.map(e=>{let t=e.startsWith(`o1`)||e.startsWith(`o3`)||e.startsWith(`o4`);return{id:e,name:`${e} (Azure)`,reasoning:t,input:[`text`,`image`]}})}};function d(e){return e.replace(/[^a-zA-Z0-9_-]/g,`_`).slice(0,64)}function f(e,t){let n=s(e.messages,t,d),r=[];for(let e of n)if(e.role===`user`)if(typeof e.content==`string`)r.push({role:`user`,content:e.content});else{let t=e.content.map(e=>e.type===`text`?{type:`text`,text:e.text??``}:e.type===`image`?{type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}}:{type:`text`,text:JSON.stringify(e)});r.push({role:`user`,content:t})}else if(e.role===`assistant`){let t=e.content,n=t.filter(e=>e.type===`text`).map(e=>e.text??``).join(``),i=t.filter(e=>e.type===`toolCall`).map(e=>({id:e.id??``,type:`function`,function:{name:e.name??``,arguments:JSON.stringify(e.arguments??{})}}));i.length?r.push({role:`assistant`,content:n||null,tool_calls:i}):r.push({role:`assistant`,content:n})}else if(e.role===`toolResult`){let t=e.content;r.push({role:`tool`,tool_call_id:e.toolCallId??``,content:t?.map(e=>e.type===`text`?e.text??``:JSON.stringify(e)).join(``)||``})}return r}function p(e){if(e?.length)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}function m(e){let t=e.content.find(e=>e.type===`text`);if(t)return{block:t,index:e.content.indexOf(t)};let n={type:`text`,text:``};return e.content.push(n),{block:n,index:e.content.length-1}}function h(e,t){return e.content.find(e=>e.type===`toolCall`&&e.id===t)}const g=(n,r,a={})=>{let s=t();return(async()=>{let t={role:`assistant`,content:[],api:`azure-openai-anthropic`,provider:c,model:n.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`stop`,timestamp:Date.now()};try{let u=a.apiKey;if(!u)throw Error(`Azure API key is required`);let d=n.baseUrl;if(!d)throw Error(`Azure endpoint is required`);let g=n.id,_={};n.headers&&Object.assign(_,n.headers),a.headers&&Object.assign(_,a.headers);let v=o(c)||l,y=new i({endpoint:d.replace(/\/+$/,``),apiKey:u,deployment:g,apiVersion:v,dangerouslyAllowBrowser:!0,defaultHeaders:_}),b=[...r.systemPrompt?[{role:`system`,content:r.systemPrompt}]:[],...f(r,n)],x=p(r.tools),S=await y.chat.completions.create({model:g,messages:b,stream:!0,stream_options:{include_usage:!0},...a.maxTokens?{max_completion_tokens:a.maxTokens}:{},...a.temperature===void 0?{}:{temperature:a.temperature},...x?{tools:x}:{}});s.push({type:`start`,partial:t});for await(let r of S){r.usage&&(t.usage.input=r.usage.prompt_tokens??0,t.usage.output=r.usage.completion_tokens??0,t.usage.totalTokens=r.usage.total_tokens??0,e(n,t.usage));for(let e of r.choices??[]){let n=e.delta;if(n){if(n.content){let{block:e,index:r}=m(t);e.text===``&&s.push({type:`text_start`,contentIndex:r,partial:t}),e.text+=n.content,s.push({type:`text_delta`,contentIndex:r,delta:n.content,partial:t})}if(n.tool_calls)for(let e of n.tool_calls){let n=e.id?h(t,e.id):void 0;if(!n&&e.id&&(n={type:`toolCall`,id:e.id,name:e.function?.name??``,arguments:{},_partialJson:``},t.content.push(n),s.push({type:`toolcall_start`,contentIndex:t.content.length-1,partial:t})),n&&e.function?.arguments){n._partialJson+=e.function.arguments;try{n.arguments=JSON.parse(n._partialJson)}catch{}s.push({type:`toolcall_delta`,contentIndex:t.content.indexOf(n),delta:e.function.arguments,partial:t})}}e.finish_reason&&(t.stopReason=e.finish_reason===`tool_calls`?`toolUse`:e.finish_reason===`length`?`length`:`stop`)}}}for(let e of t.content){let n=t.content.indexOf(e);if(e.type===`toolCall`){let r=e;try{r.arguments=JSON.parse(r._partialJson||`{}`)}catch{}delete r._partialJson,s.push({type:`toolcall_end`,contentIndex:n,toolCall:e,partial:t})}else e.type===`text`&&s.push({type:`text_end`,contentIndex:n,content:e.text,partial:t})}s.push({type:`done`,reason:t.stopReason,message:t}),s.end()}catch(e){t.stopReason=a.signal?.aborted?`aborted`:`error`,t.errorMessage=e instanceof Error?e.message:JSON.stringify(e),s.push({type:`error`,reason:t.stopReason,error:t}),s.end()}})(),s},_=(e,t,n)=>{let i=n?.apiKey;if(!i)throw Error(`Azure API key is required`);return g(e,t,{...r(e,n,i)})};function v(){n({api:`azure-openai-anthropic`,stream:g,streamSimple:_})}export{u as config,v as register};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{G as e,W as t,Z as n,b as r,f as i,m as a,x as o}from"./main-DDbwoA-3.js";import{t as s}from"./openai-Cn5LRPCm.js";var c=`azure-openai`,l=`2024-12-01-preview`,u={id:c,name:`Azure OpenAI`,description:`GPT models via Azure AI Foundry`,requiresApiKey:!0,apiKeyPlaceholder:`Azure API key`,apiKeyEnvVar:`AZURE_OPENAI_API_KEY`,requiresBaseUrl:!0,baseUrlPlaceholder:`https://your-resource.cognitiveservices.azure.com/`,baseUrlDescription:`Azure resource endpoint`,requiresDeployment:!0,deploymentPlaceholder:`gpt-4.1-mini, gpt-4o, o4-mini`,deploymentDescription:`Comma-separated deployment names (from Azure Portal → Deployments)`,requiresApiVersion:!0,apiVersionDefault:l,apiVersionDescription:`Azure OpenAI API version`,getModelIds:()=>{let e=a(c);if(!e)return[{id:`azure-unconfigured`,name:`Azure OpenAI (set deployments in Settings)`}];let t=e.split(`,`).map(e=>e.trim()).filter(Boolean);return t.length===0?[{id:`azure-unconfigured`,name:`Azure OpenAI (set deployments in Settings)`}]:t.map(e=>{let t=e.startsWith(`o1`)||e.startsWith(`o3`)||e.startsWith(`o4`);return{id:e,name:`${e} (Azure)`,reasoning:t,input:[`text`,`image`]}})}};function d(e){return e.replace(/[^a-zA-Z0-9_-]/g,`_`).slice(0,64)}function f(e,t){let n=o(e.messages,t,d),r=[];for(let e of n)if(e.role===`user`)if(typeof e.content==`string`)r.push({role:`user`,content:e.content});else{let t=e.content.map(e=>e.type===`text`?{type:`text`,text:e.text??``}:e.type===`image`?{type:`image_url`,image_url:{url:`data:${e.mimeType};base64,${e.data}`}}:{type:`text`,text:JSON.stringify(e)});r.push({role:`user`,content:t})}else if(e.role===`assistant`){let t=e.content,n=t.filter(e=>e.type===`text`).map(e=>e.text??``).join(``),i=t.filter(e=>e.type===`toolCall`).map(e=>({id:e.id??``,type:`function`,function:{name:e.name??``,arguments:JSON.stringify(e.arguments??{})}}));i.length?r.push({role:`assistant`,content:n||null,tool_calls:i}):r.push({role:`assistant`,content:n})}else if(e.role===`toolResult`){let t=e.content;r.push({role:`tool`,tool_call_id:e.toolCallId??``,content:t?.map(e=>e.type===`text`?e.text??``:JSON.stringify(e)).join(``)||``})}return r}function p(e){if(e?.length)return e.map(e=>({type:`function`,function:{name:e.name,description:e.description,parameters:e.parameters}}))}function m(e){let t=e.content.find(e=>e.type===`text`);if(t)return{block:t,index:e.content.indexOf(t)};let n={type:`text`,text:``};return e.content.push(n),{block:n,index:e.content.length-1}}function h(e,t){return e.content.find(e=>e.type===`toolCall`&&e.id===t)}var g=(n,r,a={})=>{let o=t();return(async()=>{let t={role:`assistant`,content:[],api:`azure-openai-anthropic`,provider:c,model:n.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`stop`,timestamp:Date.now()};try{let u=a.apiKey;if(!u)throw Error(`Azure API key is required`);let d=n.baseUrl;if(!d)throw Error(`Azure endpoint is required`);let g=n.id,_={};n.headers&&Object.assign(_,n.headers),a.headers&&Object.assign(_,a.headers);let v=i(c)||l,y=new s({endpoint:d.replace(/\/+$/,``),apiKey:u,deployment:g,apiVersion:v,dangerouslyAllowBrowser:!0,defaultHeaders:_}),b=[...r.systemPrompt?[{role:`system`,content:r.systemPrompt}]:[],...f(r,n)],x=p(r.tools),S=await y.chat.completions.create({model:g,messages:b,stream:!0,stream_options:{include_usage:!0},...a.maxTokens?{max_completion_tokens:a.maxTokens}:{},...a.temperature===void 0?{}:{temperature:a.temperature},...x?{tools:x}:{}});o.push({type:`start`,partial:t});for await(let r of S){r.usage&&(t.usage.input=r.usage.prompt_tokens??0,t.usage.output=r.usage.completion_tokens??0,t.usage.totalTokens=r.usage.total_tokens??0,e(n,t.usage));for(let e of r.choices??[]){let n=e.delta;if(n){if(n.content){let{block:e,index:r}=m(t);e.text===``&&o.push({type:`text_start`,contentIndex:r,partial:t}),e.text+=n.content,o.push({type:`text_delta`,contentIndex:r,delta:n.content,partial:t})}if(n.tool_calls)for(let e of n.tool_calls){let n=e.id?h(t,e.id):void 0;if(!n&&e.id&&(n={type:`toolCall`,id:e.id,name:e.function?.name??``,arguments:{},_partialJson:``},t.content.push(n),o.push({type:`toolcall_start`,contentIndex:t.content.length-1,partial:t})),n&&e.function?.arguments){n._partialJson+=e.function.arguments;try{n.arguments=JSON.parse(n._partialJson)}catch{}o.push({type:`toolcall_delta`,contentIndex:t.content.indexOf(n),delta:e.function.arguments,partial:t})}}e.finish_reason&&(t.stopReason=e.finish_reason===`tool_calls`?`toolUse`:e.finish_reason===`length`?`length`:`stop`)}}}for(let e of t.content){let n=t.content.indexOf(e);if(e.type===`toolCall`){let r=e;try{r.arguments=JSON.parse(r._partialJson||`{}`)}catch{}delete r._partialJson,o.push({type:`toolcall_end`,contentIndex:n,toolCall:e,partial:t})}else e.type===`text`&&o.push({type:`text_end`,contentIndex:n,content:e.text,partial:t})}o.push({type:`done`,reason:t.stopReason,message:t}),o.end()}catch(e){t.stopReason=a.signal?.aborted?`aborted`:`error`,t.errorMessage=e instanceof Error?e.message:JSON.stringify(e),o.push({type:`error`,reason:t.stopReason,error:t}),o.end()}})(),o},_=(e,t,n)=>{let i=n?.apiKey;if(!i)throw Error(`Azure API key is required`);return g(e,t,{...r(e,n,i)})};function v(){n({api:`azure-openai-anthropic`,stream:g,streamSimple:_})}export{u as config,v as register};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{dt as e}from"./kernel-worker-DUwEvDLP.js";function t(e){let t=e;if(t.__sliccWsRouter)return;let n=new Map;function r(e){if(e!==void 0)try{return new RegExp(e)}catch{return null}}function i(e){return typeof e==`object`&&!!e&&!Array.isArray(e)}function a(e,t){for(let n of Object.keys(t)){let r=t[n],o=e[n];if(i(r)){if(!i(o)||!a(o,r))return!1;continue}if(!Object.is(o,r))return!1}return!0}function o(e,t){if(t===`text`)return e;try{return JSON.parse(e)}catch{return}}function s(e,t){if(!t||t.length===0||!i(e))return e;let n={};for(let r of t)r in e&&(n[r]=e[r]);return n}function c(e,n){let r=t.__sliccWsRouterReport;if(typeof r==`function`)try{r(JSON.stringify({subId:e,payload:n}))}catch{}}function l(e,t){if(n.size!==0)for(let r of n.values()){if(r.urlMatch!==void 0){let t=r._urlMatchRe;if(t===null||t&&!t.test(e))continue}let n=o(t,r.filter?.parseAs);n!==void 0&&(r.filter?.where&&Object.keys(r.filter.where).length>0&&(!i(n)||!a(n,r.filter.where))||c(r.id,s(n,r.filter?.project)))}}let u=new WeakSet;function d(e){u.has(e)||(u.add(e),e.addEventListener(`message`,t=>{if(typeof t.data==`string`)try{l(e.url,t.data)}catch{}}))}let f=e.WebSocket;if(!f)return;let p=f.prototype.send;f.prototype.send=function(e){return d(this),p.call(this,e)},Object.defineProperty(t,"__sliccWsRouter",{value:{register(e){n.set(e.id,{...e,_urlMatchRe:r(e.urlMatch)})},update(e,t){let i=n.get(e);if(!i)return;let a={...i,id:e};Object.prototype.hasOwnProperty.call(t,`urlMatch`)&&(t.urlMatch===null?(delete a.urlMatch,a._urlMatchRe=void 0):typeof t.urlMatch==`string`&&(a.urlMatch=t.urlMatch,a._urlMatchRe=r(t.urlMatch))),Object.prototype.hasOwnProperty.call(t,`filter`)&&(t.filter===null?delete a.filter:t.filter!==void 0&&(a.filter=t.filter)),n.set(e,a)},unregister(e){n.delete(e)},_dispatch:l},configurable:!1})}const n=`(${t.toString()})(globalThis);`,r=e(`cdp-ws-page-bridge`),i=`__sliccWsRouterReport`;var a=class{browser;installs=new Map;frameHandler=null;bindingListenerAttached=!1;onBindingCalled=e=>{if(e.name!==i)return;let t=e.payload;if(typeof t!=`string`)return;let n;try{n=JSON.parse(t)}catch{return}if(typeof n!=`object`||!n)return;let a=n.subId;if(typeof a!=`string`)return;let o=n.payload;try{this.frameHandler?.(a,o)}catch(e){r.warn(`frame handler threw`,{subId:a,error:e instanceof Error?e.message:String(e)})}};constructor(e){this.browser=e.browser}async installRouter(e){if(this.installs.has(e))return;this.ensureBindingListener();let t=await this.browser.withTab(e,async()=>{await this.browser.sendCDP(`Runtime.enable`),await this.browser.sendCDP(`Runtime.addBinding`,{name:i});let e=await this.browser.sendCDP(`Page.addScriptToEvaluateOnNewDocument`,{source:n});return await this.browser.sendCDP(`Runtime.evaluate`,{expression:n,returnByValue:!0}),e}),r=typeof t.identifier==`string`?t.identifier:null;this.installs.set(e,{scriptIdentifier:r})}async registerSelector(e,t,n,r){await this.evalRouterCall(e,`register`,{id:t,...n===void 0?{}:{urlMatch:n},...r===void 0?{}:{filter:r}})}async updateSelector(e,t,n,r){await this.browser.withTab(e,async()=>{let e={};n===null?e.urlMatch=null:n!==void 0&&(e.urlMatch=n),r===null?e.filter=null:r!==void 0&&(e.filter=r);let i=`window.__sliccWsRouter && window.__sliccWsRouter.update(${JSON.stringify(t)}, ${JSON.stringify(e)})`;await this.browser.sendCDP(`Runtime.evaluate`,{expression:i,returnByValue:!0})})}async unregisterSelector(e,t){await this.browser.withTab(e,async()=>{let e=`window.__sliccWsRouter && window.__sliccWsRouter.unregister(${JSON.stringify(t)})`;await this.browser.sendCDP(`Runtime.evaluate`,{expression:e,returnByValue:!0})})}onMatchedFrame(e){return this.frameHandler=e,()=>{this.frameHandler===e&&(this.frameHandler=null)}}dispose(){this.bindingListenerAttached&&=(this.browser.getTransport().off(`Runtime.bindingCalled`,this.onBindingCalled),!1),this.installs.clear(),this.frameHandler=null}ensureBindingListener(){this.bindingListenerAttached||=(this.browser.getTransport().on(`Runtime.bindingCalled`,this.onBindingCalled),!0)}async evalRouterCall(e,t,n){await this.browser.withTab(e,async()=>{let e=`window.__sliccWsRouter && window.__sliccWsRouter.${t}(${JSON.stringify(n)})`;await this.browser.sendCDP(`Runtime.evaluate`,{expression:e,returnByValue:!0})})}};export{a as CdpWsPageBridge};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{--bg:#fbfaf7;--surface:#fff;--border:#ece8df;--text:#1f1d1a;--muted:#6e655d;--accent:#e8516b;--accent-deep:#c4344f;--accent-soft:#fce4e8;--running:#2ec27e;--paused:#c5b8a6;--dead:#d96363;--shadow:0 2px 8px #281e190f;--radius:14px}*{box-sizing:border-box}body{background:var(--bg);color:var(--text);min-height:100vh;margin:0;padding:32px 24px;font:14.5px/1.55 -apple-system,BlinkMacSystemFont,SF Pro Text,system-ui,sans-serif}main,header{max-width:720px;margin:0 auto}header{border-radius:var(--radius);box-shadow:var(--shadow);background:linear-gradient(135deg,#ffe8d6 0%,#ffc9c9 100%);justify-content:space-between;align-items:center;margin-bottom:24px;padding:20px 24px;display:flex}header h1{letter-spacing:-.01em;color:#4a2a1f;margin:0;font-size:22px;font-weight:600}header h1:before{content:"🍦 "}#user-label{color:var(--muted);margin-right:12px;font-size:13px}.hidden{display:none!important}button{font:inherit;border:1px solid var(--border);background:var(--surface);color:var(--text);cursor:pointer;border-radius:8px;padding:8px 14px;transition:all .15s}button:hover:not(:disabled){border-color:var(--accent);color:var(--accent-deep)}button:active:not(:disabled){transform:translateY(1px)}button:disabled{opacity:.5;cursor:not-allowed}.cone--busy{opacity:.7}.cone-busy-badge{color:var(--accent-deep);font-weight:500}.cone--busy .cone-busy-badge:before{content:"";border:2px solid var(--accent);vertical-align:-1px;border-top-color:#0000;border-radius:50%;width:10px;height:10px;margin-right:6px;animation:.8s linear infinite cone-spin;display:inline-block}@keyframes cone-spin{to{transform:rotate(360deg)}}button:focus-visible{outline:2px solid var(--accent);outline-offset:2px}#sign-in-btn,#create-btn{background:var(--accent);color:#fff;border-color:var(--accent);padding:10px 18px;font-weight:500}#sign-in-btn:hover:not(:disabled),#create-btn:hover:not(:disabled){background:var(--accent-deep);border-color:var(--accent-deep);color:#fff}#signed-out{text-align:center;padding:48px 24px}.create-row{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);align-items:center;gap:10px;margin:20px 0 24px;padding:16px;display:flex}#cone-name{font:inherit;border:1px solid var(--border);background:var(--bg);color:var(--text);border-radius:8px;flex:1;padding:10px 14px}#cone-name:focus{border-color:var(--accent);background:var(--surface);outline:none}#cone-list{margin:0;padding:0;list-style:none}.cone{background:var(--surface);border:1px solid var(--border);border-radius:var(--radius);box-shadow:var(--shadow);justify-content:space-between;align-items:center;margin-bottom:12px;padding:16px 18px;transition:transform .15s;display:flex}.cone:hover{transform:translateY(-1px)}.state-dot{border-radius:50%;width:10px;height:10px;margin-right:10px;display:inline-block;box-shadow:0 0 0 3px #ffffffb3}.cone.running .state-dot{background:var(--running)}.cone.paused .state-dot{background:var(--paused)}.cone.dead .state-dot{background:var(--dead)}.cone.reserved .state-dot{background:var(--accent)}.cone strong{font-weight:600}.cone-actions{gap:8px;display:flex}.cone-actions a{background:var(--accent-soft);color:var(--accent-deep);border:1px solid #0000;border-radius:8px;align-items:center;padding:8px 12px;font-weight:500;text-decoration:none;display:inline-flex}.cone-actions a:hover{border-color:var(--accent)}.status{color:var(--muted);font-size:12px}.cap-info{color:var(--muted);text-align:right;margin-top:12px;padding-right:6px;font-size:12px}.toast{color:#fff;background:#2b2723;border-radius:10px;max-width:320px;padding:14px 18px;font-size:13.5px;animation:.3s toast-in;position:fixed;top:24px;right:24px;box-shadow:0 6px 20px #0003}@keyframes toast-in{0%{opacity:0;transform:translateY(-8px)}to{opacity:1;transform:translateY(0)}}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import"./main-DDbwoA-3.js";function e(e){}export{e as registerSessionCostsProvider};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{_ as e,ct as t,et as n,p as r,st as i,v as a}from"./kernel-worker-DUwEvDLP.js";import{getOAuthPageOrigin as o}from"./oauth-service-vw0jayqa.js";var s={clientId:``,scopes:`repo,read:user,user:email`};function c(){try{let e=localStorage.getItem(t);if(e)return e.replace(/\/$/,``)}catch{}return i}async function l(e){let t=`${c()}/oauth/token`,n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({provider:e.provider,code:e.code,redirect_uri:e.redirectUri})}),r;try{r=await n.json()}catch{throw Error(`Token exchange failed (HTTP ${n.status}): non-JSON response`)}if(!n.ok&&n.status!==200){let e=r.error_description??r.error??`Token exchange failed (HTTP ${n.status})`;throw Error(e)}if(r.error){let e=r.error_description??r.error;throw Error(e)}return r}async function u(e){let t=`${c()}/oauth/revoke`,n=await fetch(t,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({provider:e.provider,access_token:e.accessToken})});if(!(n.status===204||n.ok)){if(n.status===400)try{if((await n.json()).error===`unsupported`)return}catch{}throw Error(`Token revocation failed (HTTP ${n.status})`)}}const d=Object.assign({"/packages/webapp/providers/github-config.json":s})[`/packages/webapp/providers/github-config.json`]??{clientId:``,scopes:`repo,read:user,user:email`};let f=null,p=null;async function m(){if(f)return f;if(h){try{let e=await fetch(`${c()}/api/runtime-config`);if(e.ok){let t=await e.json();if(t.oauth?.github)return f=t.oauth.github,f}}catch{}return d.clientId}try{let e=await fetch(`/api/runtime-config`);if(e.ok){let t=await e.json();if(t.oauth?.github)return f=t.oauth.github,f;if(t.trayWorkerBaseUrl){p=t.trayWorkerBaseUrl;let e=await fetch(`${t.trayWorkerBaseUrl}/api/runtime-config`);if(e.ok){let t=await e.json();if(t.oauth?.github)return f=t.oauth.github,f}}}}catch{}return d.clientId}const h=typeof chrome<`u`&&!!chrome?.runtime?.id;function g(){return r().find(e=>e.providerId===`github`)}function _(e){try{return new URL(e).searchParams.get(`code`)}catch{return null}}async function v(e){try{let t=await fetch(`https://api.github.com/user`,{headers:{Authorization:`Bearer ${e}`,Accept:`application/vnd.github+json`}});if(t.ok){let e=await t.json();return{name:e.name||e.login,avatar:e.avatar_url,login:e.login,id:e.id}}}catch(e){console.warn(`[github] Failed to fetch user profile:`,e instanceof Error?e.message:String(e))}return{}}function y(e,t){return`${e}+${t}@users.noreply.github.com`}async function b(e){try{let{VirtualFS:t}=await import(`./kernel-worker-DUwEvDLP.js`).then(e=>e.nt);await(await t.create({dbName:n})).writeFile(`/workspace/.git/github-token`,e),typeof window<`u`&&window.dispatchEvent(new CustomEvent(`github-token-changed`))}catch(e){console.warn(`[github] Failed to write git token:`,e instanceof Error?e.message:String(e))}}async function x(){try{let{VirtualFS:e}=await import(`./kernel-worker-DUwEvDLP.js`).then(e=>e.nt);await(await e.create({dbName:n})).rm(`/workspace/.git/github-token`),typeof window<`u`&&window.dispatchEvent(new CustomEvent(`github-token-changed`))}catch{}}async function S(e){if(!(!e.login||e.id===void 0))try{let{VirtualFS:t}=await import(`./kernel-worker-DUwEvDLP.js`).then(e=>e.nt),{readGlobalGitConfigValue:r,writeGlobalGitConfigValue:i}=await import(`./kernel-worker-DUwEvDLP.js`).then(e=>e.Q),a=await t.create({dbName:n}),o=e.name||e.login,s=y(e.id,e.login);!await r(a,`user.name`)&&o&&await i(a,`user.name`,o),await r(a,`user.email`)||await i(a,`user.email`,s)}catch(e){console.warn(`[github] Failed to seed git identity:`,e instanceof Error?e.message:String(e))}}async function C(){let e=g();if(!e?.accessToken)throw Error(`Not logged in to GitHub — please log in first`);return e.accessToken}const w={id:`github`,name:`GitHub`,description:"Sign in with GitHub for git authentication (push/pull/clone) and the `oauth-token github` shell command. Does not expose LLM models — use the GitHub Copilot provider for those.",requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,oauthTokenDomains:[`github.com`,`*.github.com`,`api.github.com`,`raw.githubusercontent.com`],getModelIds:()=>[],onOAuthLogin:async(t,n,r)=>{let i=await m();if(!i)throw Error(`GitHub OAuth not configured — no client ID available`);let s=r?.scopes??d.scopes,u=h?null:await o(),f=h?`${c()}/auth/callback`:`${p??u.origin}/auth/callback`,g=crypto.randomUUID(),y=h?chrome.runtime.id:``,C=h?{source:`extension`,extensionId:y,path:`/github`,nonce:g}:{port:parseInt(new URL(u.href).port||`5710`,10),path:`/auth/callback`,nonce:g},w=btoa(JSON.stringify(C)),T=g,E=new URLSearchParams({client_id:i,scope:s,redirect_uri:f});w&&E.set(`state`,w);let D=await t(`https://github.com/login/oauth/authorize?${E}`);if(!D)return;if(T)try{if(new URL(D).searchParams.get(`nonce`)!==T){console.error(`[github] OAuth nonce mismatch — possible CSRF`);return}}catch(e){console.warn(`[github] Nonce check skipped (URL parse failed):`,e instanceof Error?e.message:String(e))}let O=_(D);if(!O){console.error(`[github] Could not extract authorization code from redirect URL`);return}let k=await l({provider:`github`,code:O,redirectUri:f}),A=await v(k.access_token);await a({providerId:`github`,accessToken:k.access_token,userName:A.name,userAvatar:A.avatar});let j=e(`github`)?.maskedValue;j?await b(j):await x(),await S(A),n()},onOAuthLogout:async()=>{let e=g();e?.accessToken&&await u({provider:`github`,accessToken:e.accessToken}).catch(e=>console.warn(`[github] Token revocation failed:`,e instanceof Error?e.message:String(e))),await x(),await a({providerId:`github`,accessToken:``})},getOAuthLogoutUrl:e=>`https://github.com/logout`};export{y as buildNoreplyEmail,w as config,_ as extractCodeFromUrl,C as getValidAccessToken,S as syncGitIdentityFromGitHub};
|
|
@@ -1,2 +0,0 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/main-DDbwoA-3.js","assets/modulepreload-polyfill-Dezn_h7o.js","assets/main-CvlDeETm.css"])))=>i.map(i=>d[i]);
|
|
2
|
-
import{F as e,H as t,J as n,L as r,R as i,V as a,W as o,Z as s,et as c,g as l,q as u,u as d,z as f}from"./main-DDbwoA-3.js";var p=`github-copilot`,m=atob(`SXYxLmI1MDdhMDhjODdlY2ZlOTg=`),h=`https://github.com/login/device/code`,g=`https://github.com/login/oauth/access_token`,_=`https://api.github.com/copilot_internal/v2/token`,v={Accept:`application/json`,"Editor-Version":`vscode/1.107.0`,"Editor-Plugin-Version":`copilot-chat/0.35.0`,"Copilot-Integration-Id":`vscode-chat`},y={Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`},b=`https://github.com/login/device/success*`;function x(){return d().find(e=>e.providerId===p)}async function S(){let e=await fetch(h,{method:`POST`,headers:y,body:new URLSearchParams({client_id:m,scope:`read:user`})});if(!e.ok)throw Error(`GitHub device-code request failed: ${e.status} ${e.statusText} — ${await e.text().catch(()=>``)}`);let t=await e.json();if(typeof t.device_code!=`string`||typeof t.user_code!=`string`||typeof t.verification_uri!=`string`||typeof t.expires_in!=`number`||typeof t.interval!=`number`)throw Error(`GitHub device-code response had an unexpected shape`);return t}async function C(e,t){let n=Date.now()+e.expires_in*1e3,r=Math.max(1e3,Math.floor(e.interval*1e3)),i=1.2;for(;Date.now()<n;){if(t.aborted)throw Error(`Copilot login cancelled`);await w(Math.ceil(r*i),t);let n=await fetch(g,{method:`POST`,headers:y,body:new URLSearchParams({client_id:m,device_code:e.device_code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`})});if(!n.ok)throw Error(`GitHub token poll failed: ${n.status} ${n.statusText} — ${await n.text().catch(()=>``)}`);let a=await n.json();if(typeof a.access_token==`string`&&a.access_token.length>0)return a.access_token;if(a.error!==`authorization_pending`){if(a.error===`slow_down`){r=typeof a.interval==`number`?a.interval*1e3:r+5e3,i=1.4;continue}if(a.error){let e=a.error_description?`: ${a.error_description}`:``;throw Error(`Device flow failed (${a.error})${e}`)}}}throw Error(`Copilot device flow timed out (device code expired)`)}function w(e,t){return new Promise((n,r)=>{if(t.aborted){r(Error(`Copilot login cancelled`));return}let i=setTimeout(n,e);t.addEventListener(`abort`,()=>{clearTimeout(i),r(Error(`Copilot login cancelled`))},{once:!0})})}function T(e){let t=e.match(/proxy-ep=([^;]+)/);return t?`https://${t[1].replace(/^proxy\./,`api.`)}`:null}async function E(e){let t=await fetch(_,{headers:{...v,Authorization:`Bearer ${e}`}});if(!t.ok){let e=await t.text().catch(()=>``);throw Error(`Copilot token exchange failed: ${t.status} ${t.statusText} — ${e.slice(0,300)}`)}let n=await t.json();if(typeof n.token!=`string`||typeof n.expires_at!=`number`)throw Error(`Copilot token exchange returned an unexpected payload`);if(n.chat_enabled===!1)throw Error(`GitHub Copilot Chat is disabled for this account (no chat features granted)`);return{copilotToken:n.token,expiresAtMs:n.expires_at*1e3-300*1e3,apiBaseUrl:T(n.token)??`https://api.individual.githubcopilot.com`,githubAccessToken:e}}var D=`github-copilot.models.v1`;function O(e){let t=e.supported_endpoints??[],n=(e.vendor??``).toLowerCase(),r=e.id;return n===`anthropic`&&t.includes(`/v1/messages`)?`anthropic-messages`:n===`openai`&&(/^gpt-5/i.test(r)||/codex/i.test(r)||/^o\d/i.test(r))?`openai-responses`:`openai-completions`}function k(e){if(!e||typeof e!=`object`)return[];let t=e.data;if(!Array.isArray(t))return[];let n=[];for(let e of t)e.capabilities?.type&&e.capabilities.type!==`chat`||e.model_picker_enabled!==!1&&e.id&&n.push({id:e.id,name:e.name??e.id,vendor:e.vendor??``,api:O(e),contextWindow:e.capabilities?.limits?.max_context_window_tokens??e.capabilities?.limits?.max_prompt_tokens??128e3,maxTokens:e.capabilities?.limits?.max_output_tokens??8192,supportsTools:e.capabilities?.supports?.tool_calls===!0,supportsStreaming:e.capabilities?.supports?.streaming!==!1,supportsVision:e.capabilities?.supports?.vision===!0,supportsReasoning:e.capabilities?.supports?.adaptive_thinking===!0||Array.isArray(e.capabilities?.supports?.reasoning_effort),policyState:e.policy?.state??`enabled`});return n}async function A(e){let t=await fetch(`${e.apiBaseUrl}/models`,{headers:{...v,Authorization:`Bearer ${e.copilotToken}`,Accept:`application/json`}});if(!t.ok)throw Error(`Copilot /models returned ${t.status} ${t.statusText}`);return k(await t.json())}function j(){if(typeof localStorage>`u`)return[];try{let e=localStorage.getItem(D);if(!e)return[];let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function M(e){if(!(typeof localStorage>`u`))try{localStorage.setItem(D,JSON.stringify(e))}catch{}}function N(e){return j().find(t=>t.id===e)??null}async function P(e){let t;try{t=await A(e)}catch(e){console.warn(`[github-copilot] Catalog refresh failed; keeping previous cache.`,e instanceof Error?e.message:String(e));return}M(t),await Promise.all(t.filter(e=>e.policyState===`disabled`).map(async t=>{let n=`${e.apiBaseUrl}/models/${encodeURIComponent(t.id)}/policy`;try{let r=await fetch(n,{method:`POST`,headers:{...v,"Content-Type":`application/json`,Authorization:`Bearer ${e.copilotToken}`,"openai-intent":`chat-policy`,"x-interaction-type":`chat-policy`},body:JSON.stringify({state:`enabled`})});r.ok?t.policyState=`enabled`:r.status!==404&&r.status!==400&&console.warn(`[github-copilot] enable policy for ${t.id} returned ${r.status} ${r.statusText}`)}catch(e){console.warn(`[github-copilot] enable policy for ${t.id} failed:`,e instanceof Error?e.message:String(e))}})),M(t)}async function F(e,t){await l({providerId:p,accessToken:e.copilotToken,refreshToken:e.githubAccessToken,tokenExpiresAt:e.expiresAtMs,baseUrl:e.apiBaseUrl,userName:t})}async function I(){let e=x();if(!e?.accessToken||!e.refreshToken)throw Error(`Not logged in to GitHub Copilot — click "Login" in the provider settings`);let t=e.tokenExpiresAt??0;if(Date.now()<t-6e4)return e.accessToken;let n=await E(e.refreshToken);return await F(n,e.userName),n.copilotToken}var L=[`mini`,`nano`,`flash`,`haiku`,`lite`,`embedding`];function R(e){let t=[e.id,e.name??``].flatMap(e=>{let t=e.toLowerCase();return[t,t.replace(/[\s_.:]+/g,`-`)]});return!L.some(e=>t.some(t=>t.includes(e)))}function z(){if(!x()?.accessToken)return[];let e=j();if(e.length>0)return e.filter(e=>!e.policyState.startsWith(`unavailable:`)).filter(e=>R(e)).map(e=>({id:e.id,name:e.name,api:e.api===`anthropic-messages`?`anthropic`:`openai`,context_window:e.contextWindow,max_tokens:e.maxTokens,reasoning:e.supportsReasoning,input:e.supportsVision?[`text`,`image`]:[`text`]}));let t;try{t=n(`github-copilot`)}catch{return[]}return t.filter(e=>R({id:e.id,name:e.name})).map(e=>({id:e.id,name:e.name??e.id,api:e.api===`anthropic-messages`?`anthropic`:`openai`,context_window:e.contextWindow,max_tokens:e.maxTokens,reasoning:e.reasoning,input:e.input}))}function B(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:e.api,provider:p,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}var V={"User-Agent":`GitHubCopilotChat/0.35.0`,"Editor-Version":`vscode/1.107.0`,"Editor-Plugin-Version":`copilot-chat/0.35.0`,"Copilot-Integration-Id":`vscode-chat`};function H(e){let t=x(),n=t?.baseUrl??`https://api.individual.githubcopilot.com`,r=N(e);if(r)return{api:r.api,baseUrl:n,headers:{...V}};try{let n=u(`github-copilot`,e);return{api:n.api,baseUrl:t?.baseUrl??n.baseUrl,headers:{...n.headers??{},...V}}}catch{return null}}function U(e,t){let n=j(),r=n.findIndex(t=>t.id===e);r<0||(n[r]={...n[r],policyState:`unavailable:${t}`},M(n))}function W(e,t){return`GitHub Copilot rejected "${e}" with model_not_supported. This usually means the model isn't included in your Copilot plan (Opus and other premium models require Copilot Pro / Pro+ / Business / Enterprise). Try Claude Sonnet 4.6 or another model that appears in the picker after a fresh login. Original error: ${t}`}function G(e){if(!e||typeof e!=`object`)return null;let t=e;if(t.type!==`error`)return null;if(t.error&&typeof t.error==`object`){let e=t.error.errorMessage;if(typeof e==`string`)return e}return typeof t.errorMessage==`string`?t.errorMessage:null}function K(n){return(s,c,l={})=>{let u=o();return(async()=>{try{let o=await I(),d=H(s.id);if(!d)throw Error(`GitHub Copilot does not recognize "${s.id}" — open the picker (the model list refreshes on login) and pick a current model.`);let p={...s,api:d.api,baseUrl:d.baseUrl,headers:d.headers,provider:`github-copilot`},m={...l,apiKey:o},h;h=d.api===`anthropic-messages`?(n?f:e)(p,c,m):d.api===`openai-responses`?(n?t:i)(p,c,m):(n?a:r)(p,c,m);for await(let e of h){let t=G(e);if(t&&/model_not_supported/i.test(t)){U(s.id,`model_not_supported`);let e=W(s.id,t);console.error(`[github-copilot] Plan-gated model rejection:`,e),u.push(B(s,Error(e))),u.end();return}u.push(e)}u.end()}catch(e){let t=e instanceof Error?e.message:String(e),n=e;/model_not_supported/i.test(t)&&(U(s.id,`model_not_supported`),n=Error(W(s.id,t))),console.error(`[github-copilot] Stream error:`,n instanceof Error?n.message:String(n)),u.push(B(s,n)),u.end()}})(),u}}var q=K(!1),J=K(!0),Y=({userCode:e,verificationUrl:t})=>typeof document>`u`?(console.info(`[github-copilot] Device verification code: ${e} — open ${t} in a browser to authorize.`),Promise.resolve(`continue`)):new Promise(t=>{let n=document.createElement(`div`);n.setAttribute(`data-slicc-overlay`,`github-copilot-device`),n.style.cssText=[`position:fixed`,`top:24px`,`right:24px`,`z-index:2147483647`,`background:#0d1117`,`color:#e6edf3`,`border:1px solid #30363d`,`border-radius:10px`,`padding:16px 18px`,`box-shadow:0 8px 32px rgba(0,0,0,0.45)`,`font:13px/1.4 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif`,`min-width:260px`,`max-width:340px`].join(`;`);let r=document.createElement(`div`);r.textContent=`GitHub Copilot — verification code`,r.style.cssText=`font-weight:600;margin-bottom:8px;color:#7ee787`;let i=document.createElement(`div`);i.textContent=e,i.style.cssText=[`font:600 22px ui-monospace, SFMono-Regular, Menlo, monospace`,`letter-spacing:2px`,`background:#161b22`,`border:1px solid #30363d`,`border-radius:6px`,`padding:10px 12px`,`text-align:center`,`margin-bottom:10px`,`user-select:all`,`cursor:text`].join(`;`);let a=document.createElement(`div`);a.style.cssText=`color:#8b949e;font-size:12px;line-height:1.5`,a.textContent=`Copy the code, then click Continue to open the GitHub authorization page in a new tab.`;let o=document.createElement(`div`);o.style.cssText=`display:flex;gap:8px;margin-top:12px;justify-content:flex-end`;let s=document.createElement(`button`);s.type=`button`,s.textContent=`Cancel`,s.style.cssText=[`background:transparent`,`color:#e6edf3`,`border:1px solid #30363d`,`border-radius:6px`,`padding:6px 12px`,`font:600 12px inherit`,`cursor:pointer`].join(`;`);let l=document.createElement(`button`);l.type=`button`,l.textContent=`Copy & Continue`,l.style.cssText=[`background:#238636`,`color:#fff`,`border:0`,`border-radius:6px`,`padding:6px 12px`,`font:600 12px inherit`,`cursor:pointer`].join(`;`);let u=()=>{try{n.remove()}catch{}};s.addEventListener(`click`,()=>{u(),t(`cancel`)}),l.addEventListener(`click`,()=>{(async()=>{try{let{copyTextToClipboard:t}=await c(async()=>{let{copyTextToClipboard:e}=await import(`./main-DDbwoA-3.js`).then(e=>e.S);return{copyTextToClipboard:e}},__vite__mapDeps([0,1,2]));await t(e)}catch{}u(),t(`continue`)})()}),o.appendChild(s),o.appendChild(l),n.appendChild(r),n.appendChild(i),n.appendChild(a),n.appendChild(o),document.body.appendChild(n)}),X={id:p,name:`GitHub Copilot`,description:`Use your GitHub Copilot subscription to access Claude, GPT-5, Codex, Gemini, and Grok models. Sign in with the GitHub device-code flow.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:`claude-sonnet-4.6`,oauthTokenDomains:[`*.githubcopilot.com`,`api.individual.githubcopilot.com`,`api.business.githubcopilot.com`,`api.enterprise.githubcopilot.com`],getModelIds:z,onOAuthLoginIntercepted:async(e,t,n)=>{let r=await S(),i=new URL(r.verification_uri);if(i.searchParams.set(`user_code`,r.user_code),await(n?.presentDeviceCode??Y)({userCode:r.user_code,verificationUrl:i.toString(),expiresInSeconds:r.expires_in})===`cancel`)throw Error(`GitHub Copilot login cancelled`);let a=new AbortController,o=e({authorizeUrl:i.toString(),redirectUriPattern:b,onCapture:`close`,timeoutMs:r.expires_in*1e3}).catch(e=>(console.warn(`[github-copilot] Launcher failed:`,e instanceof Error?e.message:String(e)),null)),s;try{s=await C(r,a.signal)}catch(e){throw a.abort(),await o,e}await o;let c=await E(s),l;try{let e=await fetch(`https://api.github.com/user`,{headers:{Authorization:`Bearer ${s}`,Accept:`application/json`}});if(e.ok){let t=await e.json();l=t.name||t.login}}catch{}await F(c,l),await P(c),t()},onOAuthLogout:async()=>{await l({providerId:p,accessToken:``})},onSilentRenew:async()=>{let e=x();if(!e?.refreshToken)return null;try{let t=await E(e.refreshToken);return await F(t,e.userName),await P(t),t.copilotToken}catch(e){return console.warn(`[github-copilot] Silent renew failed:`,e instanceof Error?e.message:String(e)),null}}};function Z(){s({api:`github-copilot-anthropic`,stream:q,streamSimple:J}),s({api:`github-copilot-openai`,stream:q,streamSimple:J})}export{X as config,R as isCopilotConeCompatible,Z as register};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{F as e,G as t,I as n,M as r,P as i,R as a,V as o,W as s,Y as c,p as l,v as u,z as d}from"./kernel-worker-DUwEvDLP.js";const f=`github-copilot`,p=atob(`SXYxLmI1MDdhMDhjODdlY2ZlOTg=`),m={Accept:`application/json`,"Editor-Version":`vscode/1.107.0`,"Editor-Plugin-Version":`copilot-chat/0.35.0`,"Copilot-Integration-Id":`vscode-chat`},h={Accept:`application/json`,"Content-Type":`application/x-www-form-urlencoded`};function g(){return l().find(e=>e.providerId===f)}async function _(){let e=await fetch(`https://github.com/login/device/code`,{method:`POST`,headers:h,body:new URLSearchParams({client_id:p,scope:`read:user`})});if(!e.ok)throw Error(`GitHub device-code request failed: ${e.status} ${e.statusText} — ${await e.text().catch(()=>``)}`);let t=await e.json();if(typeof t.device_code!=`string`||typeof t.user_code!=`string`||typeof t.verification_uri!=`string`||typeof t.expires_in!=`number`||typeof t.interval!=`number`)throw Error(`GitHub device-code response had an unexpected shape`);return t}async function v(e,t){let n=Date.now()+e.expires_in*1e3,r=Math.max(1e3,Math.floor(e.interval*1e3)),i=1.2;for(;Date.now()<n;){if(t.aborted)throw Error(`Copilot login cancelled`);await y(Math.ceil(r*i),t);let n=await fetch(`https://github.com/login/oauth/access_token`,{method:`POST`,headers:h,body:new URLSearchParams({client_id:p,device_code:e.device_code,grant_type:`urn:ietf:params:oauth:grant-type:device_code`})});if(!n.ok)throw Error(`GitHub token poll failed: ${n.status} ${n.statusText} — ${await n.text().catch(()=>``)}`);let a=await n.json();if(typeof a.access_token==`string`&&a.access_token.length>0)return a.access_token;if(a.error!==`authorization_pending`){if(a.error===`slow_down`){r=typeof a.interval==`number`?a.interval*1e3:r+5e3,i=1.4;continue}if(a.error){let e=a.error_description?`: ${a.error_description}`:``;throw Error(`Device flow failed (${a.error})${e}`)}}}throw Error(`Copilot device flow timed out (device code expired)`)}function y(e,t){return new Promise((n,r)=>{if(t.aborted){r(Error(`Copilot login cancelled`));return}let i=setTimeout(n,e);t.addEventListener(`abort`,()=>{clearTimeout(i),r(Error(`Copilot login cancelled`))},{once:!0})})}function b(e){let t=e.match(/proxy-ep=([^;]+)/);return t?`https://${t[1].replace(/^proxy\./,`api.`)}`:null}async function x(e){let t=await fetch(`https://api.github.com/copilot_internal/v2/token`,{headers:{...m,Authorization:`Bearer ${e}`}});if(!t.ok){let e=await t.text().catch(()=>``);throw Error(`Copilot token exchange failed: ${t.status} ${t.statusText} — ${e.slice(0,300)}`)}let n=await t.json();if(typeof n.token!=`string`||typeof n.expires_at!=`number`)throw Error(`Copilot token exchange returned an unexpected payload`);if(n.chat_enabled===!1)throw Error(`GitHub Copilot Chat is disabled for this account (no chat features granted)`);return{copilotToken:n.token,expiresAtMs:n.expires_at*1e3-300*1e3,apiBaseUrl:b(n.token)??`https://api.individual.githubcopilot.com`,githubAccessToken:e}}const S=`github-copilot.models.v1`;function C(e){let t=e.supported_endpoints??[],n=(e.vendor??``).toLowerCase(),r=e.id;return n===`anthropic`&&t.includes(`/v1/messages`)?`anthropic-messages`:n===`openai`&&(/^gpt-5/i.test(r)||/codex/i.test(r)||/^o\d/i.test(r))?`openai-responses`:`openai-completions`}function w(e){if(!e||typeof e!=`object`)return[];let t=e.data;if(!Array.isArray(t))return[];let n=[];for(let e of t)e.capabilities?.type&&e.capabilities.type!==`chat`||e.model_picker_enabled!==!1&&e.id&&n.push({id:e.id,name:e.name??e.id,vendor:e.vendor??``,api:C(e),contextWindow:e.capabilities?.limits?.max_context_window_tokens??e.capabilities?.limits?.max_prompt_tokens??128e3,maxTokens:e.capabilities?.limits?.max_output_tokens??8192,supportsTools:e.capabilities?.supports?.tool_calls===!0,supportsStreaming:e.capabilities?.supports?.streaming!==!1,supportsVision:e.capabilities?.supports?.vision===!0,supportsReasoning:e.capabilities?.supports?.adaptive_thinking===!0||Array.isArray(e.capabilities?.supports?.reasoning_effort),policyState:e.policy?.state??`enabled`});return n}async function T(e){let t=await fetch(`${e.apiBaseUrl}/models`,{headers:{...m,Authorization:`Bearer ${e.copilotToken}`,Accept:`application/json`}});if(!t.ok)throw Error(`Copilot /models returned ${t.status} ${t.statusText}`);return w(await t.json())}function E(){if(typeof localStorage>`u`)return[];try{let e=localStorage.getItem(S);if(!e)return[];let t=JSON.parse(e);return Array.isArray(t)?t:[]}catch{return[]}}function D(e){if(!(typeof localStorage>`u`))try{localStorage.setItem(S,JSON.stringify(e))}catch{}}function O(e){return E().find(t=>t.id===e)??null}async function k(e){let t;try{t=await T(e)}catch(e){console.warn(`[github-copilot] Catalog refresh failed; keeping previous cache.`,e instanceof Error?e.message:String(e));return}D(t),await Promise.all(t.filter(e=>e.policyState===`disabled`).map(async t=>{let n=`${e.apiBaseUrl}/models/${encodeURIComponent(t.id)}/policy`;try{let r=await fetch(n,{method:`POST`,headers:{...m,"Content-Type":`application/json`,Authorization:`Bearer ${e.copilotToken}`,"openai-intent":`chat-policy`,"x-interaction-type":`chat-policy`},body:JSON.stringify({state:`enabled`})});r.ok?t.policyState=`enabled`:r.status!==404&&r.status!==400&&console.warn(`[github-copilot] enable policy for ${t.id} returned ${r.status} ${r.statusText}`)}catch(e){console.warn(`[github-copilot] enable policy for ${t.id} failed:`,e instanceof Error?e.message:String(e))}})),D(t)}async function A(e,t){await u({providerId:f,accessToken:e.copilotToken,refreshToken:e.githubAccessToken,tokenExpiresAt:e.expiresAtMs,baseUrl:e.apiBaseUrl,userName:t})}async function j(){let e=g();if(!e?.accessToken||!e.refreshToken)throw Error(`Not logged in to GitHub Copilot — click "Login" in the provider settings`);let t=e.tokenExpiresAt??0;if(Date.now()<t-6e4)return e.accessToken;let n=await x(e.refreshToken);return await A(n,e.userName),n.copilotToken}const M=[`mini`,`nano`,`flash`,`haiku`,`lite`,`embedding`];function N(e){let t=[e.id,e.name??``].flatMap(e=>{let t=e.toLowerCase();return[t,t.replace(/[\s_.:]+/g,`-`)]});return!M.some(e=>t.some(t=>t.includes(e)))}function P(){if(!g()?.accessToken)return[];let e=E();if(e.length>0)return e.filter(e=>!e.policyState.startsWith(`unavailable:`)).filter(e=>N(e)).map(e=>({id:e.id,name:e.name,api:e.api===`anthropic-messages`?`anthropic`:`openai`,context_window:e.contextWindow,max_tokens:e.maxTokens,reasoning:e.supportsReasoning,input:e.supportsVision?[`text`,`image`]:[`text`]}));let n;try{n=t(`github-copilot`)}catch{return[]}return n.filter(e=>N({id:e.id,name:e.name})).map(e=>({id:e.id,name:e.name??e.id,api:e.api===`anthropic-messages`?`anthropic`:`openai`,context_window:e.contextWindow,max_tokens:e.maxTokens,reasoning:e.reasoning,input:e.input}))}function F(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:e.api,provider:f,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}const I={"User-Agent":`GitHubCopilotChat/0.35.0`,"Editor-Version":`vscode/1.107.0`,"Editor-Plugin-Version":`copilot-chat/0.35.0`,"Copilot-Integration-Id":`vscode-chat`};function L(e){let t=g(),n=t?.baseUrl??`https://api.individual.githubcopilot.com`,r=O(e);if(r)return{api:r.api,baseUrl:n,headers:{...I}};try{let n=s(`github-copilot`,e);return{api:n.api,baseUrl:t?.baseUrl??n.baseUrl,headers:{...n.headers??{},...I}}}catch{return null}}function R(e,t){let n=E(),r=n.findIndex(t=>t.id===e);r<0||(n[r]={...n[r],policyState:`unavailable:${t}`},D(n))}function z(e,t){return`GitHub Copilot rejected "${e}" with model_not_supported. This usually means the model isn't included in your Copilot plan (Opus and other premium models require Copilot Pro / Pro+ / Business / Enterprise). Try Claude Sonnet 4.6 or another model that appears in the picker after a fresh login. Original error: ${t}`}function B(e){if(!e||typeof e!=`object`)return null;let t=e;if(t.type!==`error`)return null;if(t.error&&typeof t.error==`object`){let e=t.error.errorMessage;if(typeof e==`string`)return e}return typeof t.errorMessage==`string`?t.errorMessage:null}function V(t){return(s,c,l={})=>{let u=o();return(async()=>{try{let o=await j(),f=L(s.id);if(!f)throw Error(`GitHub Copilot does not recognize "${s.id}" — open the picker (the model list refreshes on login) and pick a current model.`);let p={...s,api:f.api,baseUrl:f.baseUrl,headers:f.headers,provider:`github-copilot`},m={...l,apiKey:o},h;h=f.api===`anthropic-messages`?(t?n:r)(p,c,m):f.api===`openai-responses`?(t?d:e)(p,c,m):(t?a:i)(p,c,m);for await(let e of h){let t=B(e);if(t&&/model_not_supported/i.test(t)){R(s.id,`model_not_supported`);let e=z(s.id,t);console.error(`[github-copilot] Plan-gated model rejection:`,e),u.push(F(s,Error(e))),u.end();return}u.push(e)}u.end()}catch(e){let t=e instanceof Error?e.message:String(e),n=e;/model_not_supported/i.test(t)&&(R(s.id,`model_not_supported`),n=Error(z(s.id,t))),console.error(`[github-copilot] Stream error:`,n instanceof Error?n.message:String(n)),u.push(F(s,n)),u.end()}})(),u}}const H=V(!1),U=V(!0),W=({userCode:e,verificationUrl:t})=>typeof document>`u`?(console.info(`[github-copilot] Device verification code: ${e} — open ${t} in a browser to authorize.`),Promise.resolve(`continue`)):new Promise(t=>{let n=document.createElement(`div`);n.setAttribute(`data-slicc-overlay`,`github-copilot-device`),n.style.cssText=[`position:fixed`,`top:24px`,`right:24px`,`z-index:2147483647`,`background:#0d1117`,`color:#e6edf3`,`border:1px solid #30363d`,`border-radius:10px`,`padding:16px 18px`,`box-shadow:0 8px 32px rgba(0,0,0,0.45)`,`font:13px/1.4 -apple-system, BlinkMacSystemFont, "Segoe UI", sans-serif`,`min-width:260px`,`max-width:340px`].join(`;`);let r=document.createElement(`div`);r.textContent=`GitHub Copilot — verification code`,r.style.cssText=`font-weight:600;margin-bottom:8px;color:#7ee787`;let i=document.createElement(`div`);i.textContent=e,i.style.cssText=[`font:600 22px ui-monospace, SFMono-Regular, Menlo, monospace`,`letter-spacing:2px`,`background:#161b22`,`border:1px solid #30363d`,`border-radius:6px`,`padding:10px 12px`,`text-align:center`,`margin-bottom:10px`,`user-select:all`,`cursor:text`].join(`;`);let a=document.createElement(`div`);a.style.cssText=`color:#8b949e;font-size:12px;line-height:1.5`,a.textContent=`Copy the code, then click Continue to open the GitHub authorization page in a new tab.`;let o=document.createElement(`div`);o.style.cssText=`display:flex;gap:8px;margin-top:12px;justify-content:flex-end`;let s=document.createElement(`button`);s.type=`button`,s.textContent=`Cancel`,s.style.cssText=[`background:transparent`,`color:#e6edf3`,`border:1px solid #30363d`,`border-radius:6px`,`padding:6px 12px`,`font:600 12px inherit`,`cursor:pointer`].join(`;`);let c=document.createElement(`button`);c.type=`button`,c.textContent=`Copy & Continue`,c.style.cssText=[`background:#238636`,`color:#fff`,`border:0`,`border-radius:6px`,`padding:6px 12px`,`font:600 12px inherit`,`cursor:pointer`].join(`;`);let l=()=>{try{n.remove()}catch{}};s.addEventListener(`click`,()=>{l(),t(`cancel`)}),c.addEventListener(`click`,()=>{(async()=>{try{let{copyTextToClipboard:t}=await import(`./kernel-worker-DUwEvDLP.js`).then(e=>e.S);await t(e)}catch{}l(),t(`continue`)})()}),o.appendChild(s),o.appendChild(c),n.appendChild(r),n.appendChild(i),n.appendChild(a),n.appendChild(o),document.body.appendChild(n)}),G={id:f,name:`GitHub Copilot`,description:`Use your GitHub Copilot subscription to access Claude, GPT-5, Codex, Gemini, and Grok models. Sign in with the GitHub device-code flow.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:`claude-sonnet-4.6`,oauthTokenDomains:[`*.githubcopilot.com`,`api.individual.githubcopilot.com`,`api.business.githubcopilot.com`,`api.enterprise.githubcopilot.com`],getModelIds:P,onOAuthLoginIntercepted:async(e,t,n)=>{let r=await _(),i=new URL(r.verification_uri);if(i.searchParams.set(`user_code`,r.user_code),await(n?.presentDeviceCode??W)({userCode:r.user_code,verificationUrl:i.toString(),expiresInSeconds:r.expires_in})===`cancel`)throw Error(`GitHub Copilot login cancelled`);let a=new AbortController,o=e({authorizeUrl:i.toString(),redirectUriPattern:`https://github.com/login/device/success*`,onCapture:`close`,timeoutMs:r.expires_in*1e3}).catch(e=>(console.warn(`[github-copilot] Launcher failed:`,e instanceof Error?e.message:String(e)),null)),s;try{s=await v(r,a.signal)}catch(e){throw a.abort(),await o,e}await o;let c=await x(s),l;try{let e=await fetch(`https://api.github.com/user`,{headers:{Authorization:`Bearer ${s}`,Accept:`application/json`}});if(e.ok){let t=await e.json();l=t.name||t.login}}catch{}await A(c,l),await k(c),t()},onOAuthLogout:async()=>{await u({providerId:f,accessToken:``})},onSilentRenew:async()=>{let e=g();if(!e?.refreshToken)return null;try{let t=await x(e.refreshToken);return await A(t,e.userName),await k(t),t.copilotToken}catch(e){return console.warn(`[github-copilot] Silent renew failed:`,e instanceof Error?e.message:String(e)),null}}};function K(){c({api:`github-copilot-anthropic`,stream:H,streamSimple:U}),c({api:`github-copilot-openai`,stream:H,streamSimple:U})}export{G as config,N as isCopilotConeCompatible,K as register};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{B as e,H as t,U as n,b as r,o as i,q as a}from"./kernel-worker-DUwEvDLP.js";import{a as o,i as s,n as c,o as l,r as u,s as d,t as f}from"./google-shared-BE7O5JRJ.js";let p=0;const m=(n,r,i)=>{let o=new e;return(async()=>{let e={role:`assistant`,content:[],api:`google-generative-ai`,provider:n.provider,model:n.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`stop`,timestamp:Date.now()};try{let c=g(n,i?.apiKey||a(n.provider)||``,i?.headers),d=_(n,r,i),f=await i?.onPayload?.(d,n);f!==void 0&&(d=f);let m=await c.models.generateContentStream(d);o.push({type:`start`,partial:e});let h=null,v=e.content,y=()=>v.length-1;for await(let r of m){e.responseId||=r.responseId;let i=r.candidates?.[0];if(i?.content?.parts)for(let t of i.content.parts){if(t.text!==void 0){let n=u(t);(!h||n&&h.type!==`thinking`||!n&&h.type!==`text`)&&(h&&(h.type===`text`?o.push({type:`text_end`,contentIndex:v.length-1,content:h.text,partial:e}):o.push({type:`thinking_end`,contentIndex:y(),content:h.thinking,partial:e})),n?(h={type:`thinking`,thinking:``,thinkingSignature:void 0},e.content.push(h),o.push({type:`thinking_start`,contentIndex:y(),partial:e})):(h={type:`text`,text:``},e.content.push(h),o.push({type:`text_start`,contentIndex:y(),partial:e}))),h.type===`thinking`?(h.thinking+=t.text,h.thinkingSignature=l(h.thinkingSignature,t.thoughtSignature),o.push({type:`thinking_delta`,contentIndex:y(),delta:t.text,partial:e})):(h.text+=t.text,h.textSignature=l(h.textSignature,t.thoughtSignature),o.push({type:`text_delta`,contentIndex:y(),delta:t.text,partial:e}))}if(t.functionCall){h&&=(h.type===`text`?o.push({type:`text_end`,contentIndex:y(),content:h.text,partial:e}):o.push({type:`thinking_end`,contentIndex:y(),content:h.thinking,partial:e}),null);let n=t.functionCall.id,r={type:`toolCall`,id:!n||e.content.some(e=>e.type===`toolCall`&&e.id===n)?`${t.functionCall.name}_${Date.now()}_${++p}`:n,name:t.functionCall.name||``,arguments:t.functionCall.args??{},...t.thoughtSignature&&{thoughtSignature:t.thoughtSignature}};e.content.push(r),o.push({type:`toolcall_start`,contentIndex:y(),partial:e}),o.push({type:`toolcall_delta`,contentIndex:y(),delta:JSON.stringify(r.arguments),partial:e}),o.push({type:`toolcall_end`,contentIndex:y(),toolCall:r,partial:e})}}i?.finishReason&&(e.stopReason=s(i.finishReason),e.content.some(e=>e.type===`toolCall`)&&(e.stopReason=`toolUse`)),r.usageMetadata&&(e.usage={input:(r.usageMetadata.promptTokenCount||0)-(r.usageMetadata.cachedContentTokenCount||0),output:(r.usageMetadata.candidatesTokenCount||0)+(r.usageMetadata.thoughtsTokenCount||0),cacheRead:r.usageMetadata.cachedContentTokenCount||0,cacheWrite:0,totalTokens:r.usageMetadata.totalTokenCount||0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},t(n,e.usage))}if(h&&(h.type===`text`?o.push({type:`text_end`,contentIndex:y(),content:h.text,partial:e}):o.push({type:`thinking_end`,contentIndex:y(),content:h.thinking,partial:e})),i?.signal?.aborted)throw Error(`Request was aborted`);if(e.stopReason===`aborted`||e.stopReason===`error`)throw Error(`An unknown error occurred`);o.push({type:`done`,reason:e.stopReason,message:e}),o.end()}catch(t){for(let t of e.content)`index`in t&&delete t.index;e.stopReason=i?.signal?.aborted?`aborted`:`error`,e.errorMessage=t instanceof Error?t.message:JSON.stringify(t),o.push({type:`error`,reason:e.stopReason,error:e}),o.end()}})(),o},h=(e,t,i)=>{let o=i?.apiKey||a(e.provider);if(!o)throw Error(`No API key for provider: ${e.provider}`);let s=r(e,i,o);if(!i?.reasoning)return m(e,t,{...s,thinking:{enabled:!1}});let c=n(e,i.reasoning),l=c===`off`?`high`:c,u=e;return y(u)||b(u)||v(u)?m(e,t,{...s,thinking:{enabled:!0,level:S(l,u)}}):m(e,t,{...s,thinking:{enabled:!0,budgetTokens:C(u,l,i.thinkingBudgets)}})};function g(e,t,n){let r={};return e.baseUrl&&(r.baseUrl=e.baseUrl,r.apiVersion=``),(e.headers||n)&&(r.headers={...e.headers,...n}),new d({apiKey:t,httpOptions:Object.keys(r).length>0?r:void 0})}function _(e,t,n={}){let r=f(e,t),a={};n.temperature!==void 0&&(a.temperature=n.temperature),n.maxTokens!==void 0&&(a.maxOutputTokens=n.maxTokens);let s={...Object.keys(a).length>0&&a,...t.systemPrompt&&{systemInstruction:i(t.systemPrompt)},...t.tools&&t.tools.length>0&&{tools:c(t.tools)}};if(t.tools&&t.tools.length>0&&n.toolChoice?s.toolConfig={functionCallingConfig:{mode:o(n.toolChoice)}}:s.toolConfig=void 0,n.thinking?.enabled&&e.reasoning){let e={includeThoughts:!0};n.thinking.level===void 0?n.thinking.budgetTokens!==void 0&&(e.thinkingBudget=n.thinking.budgetTokens):e.thinkingLevel=n.thinking.level,s.thinkingConfig=e}else e.reasoning&&n.thinking&&!n.thinking.enabled&&(s.thinkingConfig=x(e));if(n.signal){if(n.signal.aborted)throw Error(`Request aborted`);s.abortSignal=n.signal}return{model:e.id,contents:r,config:s}}function v(e){return/gemma-?4/.test(e.id.toLowerCase())}function y(e){return/gemini-3(?:\.\d+)?-pro/.test(e.id.toLowerCase())}function b(e){return/gemini-3(?:\.\d+)?-flash/.test(e.id.toLowerCase())}function x(e){return y(e)?{thinkingLevel:`LOW`}:b(e)||v(e)?{thinkingLevel:`MINIMAL`}:{thinkingBudget:0}}function S(e,t){if(y(t))switch(e){case`minimal`:case`low`:return`LOW`;case`medium`:case`high`:return`HIGH`}if(v(t))switch(e){case`minimal`:case`low`:return`MINIMAL`;case`medium`:case`high`:return`HIGH`}switch(e){case`minimal`:return`MINIMAL`;case`low`:return`LOW`;case`medium`:return`MEDIUM`;case`high`:return`HIGH`}}function C(e,t,n){return n?.[t]===void 0?e.id.includes(`2.5-pro`)?{minimal:128,low:2048,medium:8192,high:32768}[t]:e.id.includes(`2.5-flash-lite`)?{minimal:512,low:2048,medium:8192,high:24576}[t]:e.id.includes(`2.5-flash`)?{minimal:128,low:2048,medium:8192,high:24576}[t]:-1:n[t]}export{m as streamGoogle,h as streamSimpleGoogle};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{B as e,H as t,U as n,b as r,o as i}from"./kernel-worker-DUwEvDLP.js";import{a,c as o,i as s,l as c,n as l,o as u,r as d,s as f,t as p}from"./google-shared-BE7O5JRJ.js";const m={THINKING_LEVEL_UNSPECIFIED:c.THINKING_LEVEL_UNSPECIFIED,MINIMAL:c.MINIMAL,LOW:c.LOW,MEDIUM:c.MEDIUM,HIGH:c.HIGH};let h=0;const g=(n,r,i)=>{let a=new e;return(async()=>{let e={role:`assistant`,content:[],api:`google-vertex`,provider:n.provider,model:n.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`stop`,timestamp:Date.now()};try{let o=C(i),c=o?y(n,o,i?.headers):v(n,T(i),E(i),i?.headers),l=D(n,r,i),f=await i?.onPayload?.(l,n);f!==void 0&&(l=f);let p=await c.models.generateContentStream(l);a.push({type:`start`,partial:e});let m=null,g=e.content,_=()=>g.length-1;for await(let r of p){e.responseId||=r.responseId;let i=r.candidates?.[0];if(i?.content?.parts)for(let t of i.content.parts){if(t.text!==void 0){let n=d(t);(!m||n&&m.type!==`thinking`||!n&&m.type!==`text`)&&(m&&(m.type===`text`?a.push({type:`text_end`,contentIndex:g.length-1,content:m.text,partial:e}):a.push({type:`thinking_end`,contentIndex:_(),content:m.thinking,partial:e})),n?(m={type:`thinking`,thinking:``,thinkingSignature:void 0},e.content.push(m),a.push({type:`thinking_start`,contentIndex:_(),partial:e})):(m={type:`text`,text:``},e.content.push(m),a.push({type:`text_start`,contentIndex:_(),partial:e}))),m.type===`thinking`?(m.thinking+=t.text,m.thinkingSignature=u(m.thinkingSignature,t.thoughtSignature),a.push({type:`thinking_delta`,contentIndex:_(),delta:t.text,partial:e})):(m.text+=t.text,m.textSignature=u(m.textSignature,t.thoughtSignature),a.push({type:`text_delta`,contentIndex:_(),delta:t.text,partial:e}))}if(t.functionCall){m&&=(m.type===`text`?a.push({type:`text_end`,contentIndex:_(),content:m.text,partial:e}):a.push({type:`thinking_end`,contentIndex:_(),content:m.thinking,partial:e}),null);let n=t.functionCall.id,r={type:`toolCall`,id:!n||e.content.some(e=>e.type===`toolCall`&&e.id===n)?`${t.functionCall.name}_${Date.now()}_${++h}`:n,name:t.functionCall.name||``,arguments:t.functionCall.args??{},...t.thoughtSignature&&{thoughtSignature:t.thoughtSignature}};e.content.push(r),a.push({type:`toolcall_start`,contentIndex:_(),partial:e}),a.push({type:`toolcall_delta`,contentIndex:_(),delta:JSON.stringify(r.arguments),partial:e}),a.push({type:`toolcall_end`,contentIndex:_(),toolCall:r,partial:e})}}i?.finishReason&&(e.stopReason=s(i.finishReason),e.content.some(e=>e.type===`toolCall`)&&(e.stopReason=`toolUse`)),r.usageMetadata&&(e.usage={input:(r.usageMetadata.promptTokenCount||0)-(r.usageMetadata.cachedContentTokenCount||0),output:(r.usageMetadata.candidatesTokenCount||0)+(r.usageMetadata.thoughtsTokenCount||0),cacheRead:r.usageMetadata.cachedContentTokenCount||0,cacheWrite:0,totalTokens:r.usageMetadata.totalTokenCount||0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},t(n,e.usage))}if(m&&(m.type===`text`?a.push({type:`text_end`,contentIndex:_(),content:m.text,partial:e}):a.push({type:`thinking_end`,contentIndex:_(),content:m.thinking,partial:e})),i?.signal?.aborted)throw Error(`Request was aborted`);if(e.stopReason===`aborted`||e.stopReason===`error`)throw Error(`An unknown error occurred`);a.push({type:`done`,reason:e.stopReason,message:e}),a.end()}catch(t){for(let t of e.content)`index`in t&&delete t.index;e.stopReason=i?.signal?.aborted?`aborted`:`error`,e.errorMessage=t instanceof Error?t.message:JSON.stringify(t),a.push({type:`error`,reason:e.stopReason,error:e}),a.end()}})(),a},_=(e,t,i)=>{let a=r(e,i,void 0);if(!i?.reasoning)return g(e,t,{...a,thinking:{enabled:!1}});let o=n(e,i.reasoning),s=o===`off`?`high`:o,c=e;return O(c)||k(c)?g(e,t,{...a,thinking:{enabled:!0,level:j(s,c)}}):g(e,t,{...a,thinking:{enabled:!0,budgetTokens:M(c,s,i.thinkingBudgets)}})};function v(e,t,n,r){return new f({vertexai:!0,project:t,location:n,apiVersion:`v1`,httpOptions:b(e,r)})}function y(e,t,n){return new f({vertexai:!0,apiKey:t,apiVersion:`v1`,httpOptions:b(e,n)})}function b(e,t){let n={},r=x(e.baseUrl);return r&&(n.baseUrl=r,n.baseUrlResourceScope=o.COLLECTION,S(r)&&(n.apiVersion=``)),(e.headers||t)&&(n.headers={...e.headers,...t}),Object.keys(n).length>0?n:void 0}function x(e){let t=e.trim();if(!(!t||t.includes(`{location}`)))return t}function S(e){try{return new URL(e).pathname.split(`/`).some(e=>/^v\d+(?:beta\d*)?$/.test(e))}catch{return/(?:^|\/)v\d+(?:beta\d*)?(?:\/|$)/.test(e)}}function C(e){let t=e?.apiKey?.trim()||{}.GOOGLE_CLOUD_API_KEY?.trim();if(!(!t||t===`gcp-vertex-credentials`||w(t)))return t}function w(e){return/^<[^>]+>$/.test(e)}function T(e){let t=e?.project||{}.GOOGLE_CLOUD_PROJECT||{}.GCLOUD_PROJECT;if(!t)throw Error(`Vertex AI requires a project ID. Set GOOGLE_CLOUD_PROJECT/GCLOUD_PROJECT or pass project in options.`);return t}function E(e){let t=e?.location||{}.GOOGLE_CLOUD_LOCATION;if(!t)throw Error(`Vertex AI requires a location. Set GOOGLE_CLOUD_LOCATION or pass location in options.`);return t}function D(e,t,n={}){let r=p(e,t),o={};n.temperature!==void 0&&(o.temperature=n.temperature),n.maxTokens!==void 0&&(o.maxOutputTokens=n.maxTokens);let s={...Object.keys(o).length>0&&o,...t.systemPrompt&&{systemInstruction:i(t.systemPrompt)},...t.tools&&t.tools.length>0&&{tools:l(t.tools)}};if(t.tools&&t.tools.length>0&&n.toolChoice?s.toolConfig={functionCallingConfig:{mode:a(n.toolChoice)}}:s.toolConfig=void 0,n.thinking?.enabled&&e.reasoning){let e={includeThoughts:!0};n.thinking.level===void 0?n.thinking.budgetTokens!==void 0&&(e.thinkingBudget=n.thinking.budgetTokens):e.thinkingLevel=m[n.thinking.level],s.thinkingConfig=e}else e.reasoning&&n.thinking&&!n.thinking.enabled&&(s.thinkingConfig=A(e));if(n.signal){if(n.signal.aborted)throw Error(`Request aborted`);s.abortSignal=n.signal}return{model:e.id,contents:r,config:s}}function O(e){return/gemini-3(?:\.\d+)?-pro/.test(e.id.toLowerCase())}function k(e){return/gemini-3(?:\.\d+)?-flash/.test(e.id.toLowerCase())}function A(e){let t=e;return O(t)?{thinkingLevel:c.LOW}:k(t)?{thinkingLevel:c.MINIMAL}:{thinkingBudget:0}}function j(e,t){if(O(t))switch(e){case`minimal`:case`low`:return`LOW`;case`medium`:case`high`:return`HIGH`}switch(e){case`minimal`:return`MINIMAL`;case`low`:return`LOW`;case`medium`:return`MEDIUM`;case`high`:return`HIGH`}}function M(e,t,n){return n?.[t]===void 0?e.id.includes(`2.5-pro`)?{minimal:128,low:2048,medium:8192,high:32768}[t]:e.id.includes(`2.5-flash`)?{minimal:128,low:2048,medium:8192,high:24576}[t]:-1:n[t]}export{g as streamGoogleVertex,_ as streamSimpleGoogleVertex};
|
|
@@ -1,5 +0,0 @@
|
|
|
1
|
-
[`unpkg`,`com`].join(`.`);const e=[`esm`,`sh`].join(`.`);[`cdn`,`jsdelivr`,`net`].join(`.`);function t(e,t){return new URL(t,`https://${e}`)}function n(n,r={}){let i=t(e,n.startsWith(`/`)?n:`/${n}`),a=[];if(r.bundle&&a.push(`bundle`),r.target&&a.push(`target=${encodeURIComponent(r.target)}`),r.query)for(let[e,t]of Object.entries(r.query))a.push(t===!0?e:`${e}=${encodeURIComponent(t)}`);return a.length>0&&(i.search=`?${a.join(`&`)}`),i}var r=class{port;nextId=1;pending=new Map;handler;disposed=!1;constructor(e){this.port=e,this.handler=e=>{if(e.data?.type!==`realm-rpc-res`)return;let t=e.data,n=this.pending.get(t.id);n&&(this.pending.delete(t.id),typeof t.error==`string`?n.reject(Error(t.error)):n.resolve(t.result))},e.addEventListener(`message`,this.handler),e.start?.()}call(e,t,n=[]){if(this.disposed)return Promise.reject(Error(`realm-rpc: client disposed`));let r=this.nextId++,i={type:`realm-rpc-req`,id:r,channel:e,op:t,args:n};return new Promise((e,t)=>{this.pending.set(r,{resolve:e,reject:t}),this.port.postMessage(i)})}dispose(){if(this.disposed)return;this.disposed=!0,this.port.removeEventListener(`message`,this.handler);let e=Error(`realm-rpc: client disposed`);for(let t of this.pending.values())t.reject(e);this.pending.clear()}};const i=new Set([`bcrypt`,`better-sqlite3`,`canvas`,`cpu-features`,`fsevents`,`leveldown`,`libxmljs`,`libxmljs2`,`node-gyp-build`,`node-sass`,`puppeteer`,`robotjs`,`sass-embedded`,`sharp`,`snappy`,`sqlite3`,`tree-sitter`,`usb`]),a={sharp:` Use the built-in 'convert' shell command for image work.`,canvas:` Use the built-in 'convert' / OffscreenCanvas for image work.`,"better-sqlite3":` Use the built-in 'sqlite3' shell command (sql.js WASM).`,sqlite3:` Use the built-in 'sqlite3' shell command (sql.js WASM).`,bcrypt:` Use crypto.subtle.digest() with PBKDF2 / Argon2 in pure JS.`,puppeteer:` Use the built-in browser-automation shell commands.`};function o(e){let t=e?.SLICC_REALM_PREFETCH_BUDGET_MS;if(typeof t==`string`&&t.length>0){let e=Number.parseInt(t,10);if(Number.isFinite(e)&&e>0)return e}return 15e3}function s(e,t){let n=a[t]??``;return Error(`require('${e}'): '${t}' is a Node native module (C++ bindings) — it cannot run in the browser sandbox.${n}`)}function c(e,t,n){return new Promise((r,i)=>{let a=setTimeout(()=>{i(Error(`Timed out after ${t/1e3}s loading ${n}`))},t);e.then(e=>{clearTimeout(a),r(e)},e=>{clearTimeout(a),i(e)})})}function l(e){if(!e)return``;let t=e.lastIndexOf(`/`);return t<0?``:t===0?`/`:e.substring(0,t)}function u(e){return/^[A-Za-z0-9_\-./:@]+$/.test(e)?e:`'`+e.replace(/'/g,`'\\''`)+`'`}function d(e,t){return e===``?t:e===`/`?`/${t}`:`${e}/${t}`}function f(e){let t=l(e.argv[1]??``),n=d(t,`references`),r=d(t,`assets`),i=d(t,`.config`);async function a(){let t;try{t=await e.fs.exists(i)}catch{return null}if(!t)return null;let n;try{n=await e.fs.readFile(i)}catch{return null}let r=typeof n==`string`?n:String(n);if(!r.trim())return null;let a;try{a=JSON.parse(r)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`skill.config(): failed to parse ${i}: ${t}`)}if(a&&typeof a==`object`&&!Array.isArray(a))return a;throw Error(`skill.config(): ${i} must contain a JSON object`)}async function o(t){let n=await a();if(t===void 0)return n;if(typeof t!=`object`||!t||Array.isArray(t))throw TypeError(`skill.config(updates): updates must be a plain object`);let r={...n??{},...t};return await e.fs.writeFile(i,JSON.stringify(r,null,2)+`
|
|
2
|
-
`),r}async function s(t){if(typeof t!=`string`||!t.trim())throw TypeError(`skill.token(providerId): providerId must be a non-empty string`);let n=`oauth-token ${u(t)}`,{stdout:r,stderr:i,exitCode:a}=await e.exec(n);if(a!==0){let e=i.trim()||`oauth-token exited with code ${a}`;throw Error(`skill.token('${t}'): ${e}`)}return r.replace(/\r?\n+$/,``)}return Object.freeze({dir:t,refs:n,assets:r,config:o,token:s})}var p=class extends Error{status;statusText;url;body;constructor(e,t,n,r){let i=typeof r==`string`&&r?`: ${r.slice(0,200)}`:r&&typeof r==`object`?`: ${m(r).slice(0,200)}`:``;super(`HTTP ${e} ${t} ${n}${i}`),this.status=e,this.statusText=t,this.url=n,this.body=r,this.name=`HttpError`}};function m(e){try{return JSON.stringify(e)}catch{return String(e)}}function h(e){return new Promise(t=>setTimeout(t,e))}function g(e,t,n){let r;if(r=/^[a-z][a-z0-9+.-]*:\/\//i.test(t)?t:e?`${e.endsWith(`/`)?e.slice(0,-1):e}${t.startsWith(`/`)?t:`/${t}`}`:t,!n)return r;let i=[];for(let[e,t]of Object.entries(n))if(t!=null)if(Array.isArray(t))for(let n of t)n!=null&&i.push(`${encodeURIComponent(e)}=${encodeURIComponent(String(n))}`);else i.push(`${encodeURIComponent(e)}=${encodeURIComponent(String(t))}`);return i.length===0?r:r+(r.includes(`?`)?`&`:`?`)+i.join(`&`)}function _(e,t){let n={};if(e)for(let[t,r]of Object.entries(e))n[t]=r;if(t)for(let[e,r]of Object.entries(t))n[e]=r;return n}function v(e){if(!e)return!1;let t=e.toLowerCase();return t.startsWith(`application/json`)||/[+/]json(;|$|\s)/.test(t)}function y(e){if(!e)return null;let t=e.trim();if(!t)return null;if(/^\d+(\.\d+)?$/.test(t)){let e=Number(t);if(Number.isFinite(e)&&e>=0)return Math.round(e*1e3)}let n=Date.parse(t);if(Number.isFinite(n)){let e=n-Date.now();return e>0?e:0}return null}async function b(e){if(v(e.headers.get(`content-type`))){let t=await e.text();if(!t)return null;try{return JSON.parse(t)}catch{return t}}return e.text()}function x(e,t){if(e!=null)return typeof e==`string`||e instanceof ArrayBuffer||ArrayBuffer.isView(e)||typeof Blob<`u`&&e instanceof Blob||typeof FormData<`u`&&e instanceof FormData||typeof URLSearchParams<`u`&&e instanceof URLSearchParams||typeof ReadableStream<`u`&&e instanceof ReadableStream?e:typeof e==`object`?(Object.keys(t).some(e=>e.toLowerCase()===`content-type`)||(t[`Content-Type`]=`application/json`),JSON.stringify(e)):String(e)}function ee(e){let t=e.sleep??h;function n(n){let r=new Set(n.retry?.on??[]),i=Math.max(1,Math.trunc(n.retry?.maxAttempts??1));async function a(a,o,s={}){let c=g(n.baseUrl,o,s.params),l=_(n.headers,s.headers);if(n.token){let e=await n.token({method:a,path:o,url:c});e&&(Object.keys(l).some(e=>e.toLowerCase()===`authorization`)||(l.Authorization=`Bearer ${e}`))}let u=x(s.body,l),d={method:a,headers:l};u!==void 0&&(d.body=u);let f=null;for(let a=0;a<i;a++){let o=n.timeoutMs?new AbortController:null,l=o?setTimeout(()=>o.abort(Error(`timeout`)),n.timeoutMs):null,u=s.signal&&o?.signal?AbortSignal.any([s.signal,o.signal]):s.signal??o?.signal,m=u?{...d,signal:u}:d,h;try{h=await e.fetch(c,m)}finally{l!==null&&clearTimeout(l)}if(f=h,h.ok){let e=await b(h);return s.raw?{body:e,headers:Object.fromEntries(h.headers.entries()),status:h.status}:e}if(!(a+1<i&&r.has(h.status))){let e=await b(h).catch(()=>null);throw new p(h.status,h.statusText,c,e)}let g=y(h.headers.get(`retry-after`)),_=500*2**a;await t(g===null?_:g)}if(f){let e=await b(f).catch(()=>null);throw new p(f.status,f.statusText,c,e)}throw Error(`http: no attempts made for ${a} ${c}`)}return Object.freeze({get:((e,t)=>a(`GET`,e,t)),post:((e,t)=>a(`POST`,e,t)),put:((e,t)=>a(`PUT`,e,t)),delete:((e,t)=>a(`DELETE`,e,t))})}return Object.freeze({client:n})}function S(e){let t=[],n={},r=[],i=(e,t)=>{if(e in n){let r=n[e];Array.isArray(r)?r.push(String(t)):n[e]=[String(r),String(t)]}else n[e]=t},a=2;for(;a<e.length;){let n=e[a];if(n===`--`){r.push(...e.slice(a+1));break}if(n.startsWith(`--`)){let t=n.slice(2),r=t.indexOf(`=`);if(r!==-1){i(t.slice(0,r),t.slice(r+1)),a++;continue}let o=e[a+1];if(o!==void 0&&!o.startsWith(`-`)){i(t,o),a+=2;continue}i(t,!0),a++;continue}if(n.startsWith(`-`)&&n.length>1){for(let e of n.slice(1))i(e,!0);a++;continue}t.push(n),a++}return{positional:t,flags:n,subcommand:t.length>0&&/^[a-z][\w-]*$/i.test(t[0])?t[0]:null,passthrough:r}}function C(e){let t=[...e];return Object.defineProperty(t,"parseFlags",{value:()=>S(t),enumerable:!1,writable:!1,configurable:!1}),t}function w(e){let t=e=>{if(typeof e==`string`)return e;if(e instanceof Error)return e.message;if(e==null)return String(e);try{return JSON.stringify(e)}catch{return String(e)}},n=(e,t,n)=>t===void 0?`${e(`Error:`)} ${n}\n`:t===``?`${e(n)}\n`:`${e(`${t}:`)} ${n}\n`,r=(t,n)=>t===void 0?`${e.color.yellow(`Warning:`)} ${n}\n`:t===``?`${e.color.yellow(n)}\n`:`${e.color.yellow(`${t}:`)} ${n}\n`;return{die(r,i){let a=typeof i==`number`?i:i?.exitCode??1,o=typeof i==`object`&&i&&`prefix`in i?i.prefix:void 0,s=t(r);throw e.writeStderr(n(e.color.red,o,s)),e.exit(a),Error(`unreachable`)},out(t){if(typeof t==`string`){e.writeStdout(t.endsWith(`
|
|
3
|
-
`)?t:`${t}\n`);return}try{e.writeStdout(`${JSON.stringify(t,null,2)}\n`)}catch{e.writeStdout(`${String(t)}\n`)}},warn(n,i){let a=typeof i==`object`&&i&&`prefix`in i?i.prefix:void 0;e.writeStderr(r(a,t(n)))},help(t){throw e.writeStdout(t.endsWith(`
|
|
4
|
-
`)?t:`${t}\n`),e.exit(0),Error(`unreachable`)}}}const T={reset:`\x1B[0m`,green:`\x1B[32m`,red:`\x1B[31m`,yellow:`\x1B[33m`,gray:`\x1B[90m`,bold:`\x1B[1m`,cyan:`\x1B[36m`,dim:`\x1B[2m`};function E(e){let t=e.isTTY&&!e.noColor,n=e=>n=>t?`${e}${n}${T.reset}`:String(n);return{enabled:t,green:n(T.green),red:n(T.red),yellow:n(T.yellow),gray:n(T.gray),bold:n(T.bold),cyan:n(T.cyan),dim:n(T.dim)}}const D={ms:1,s:1e3,m:6e4,h:36e5,d:864e5,w:6048e5,M:26298e5,y:315576e5};function O(e){if(typeof e==`number`&&Number.isFinite(e))return Math.trunc(e);if(typeof e!=`string`)throw TypeError(`time.parseDuration: spec must be string or number`);let t=e.trim(),n=/^([0-9]+(?:\.[0-9]+)?)\s*(ms|s|m|h|d|w|M|y)?$/.exec(t);if(!n)throw RangeError(`time.parseDuration: unrecognized spec "${e}"`);let r=Number(n[1]),i=n[2]??`ms`;return Math.trunc(r*D[i])}function k(e){return e<10?`0${e}`:String(e)}const A={parseDuration:O,ago(e,t=new Date){return new Date(t.getTime()-O(e))},range(e,t=new Date){let n=new Date(t.getTime());return{start:new Date(n.getTime()-O(e)),end:n}},future(e,t=new Date){let n=new Date(t.getTime());return{start:n,end:new Date(n.getTime()+O(e))}},gmailDate(e,t=new Date){let n=new Date(t.getTime()-O(e));return`${n.getFullYear()}/${k(n.getMonth()+1)}/${k(n.getDate())}`}},j=/\u001b\[[0-9;]*m/g;function M(e){return e.replace(j,``)}function N(e){return M(e).length}function P(e,t){let n=String(e??``);return t<=0?``:N(n)<=t?n:t<=1?n.slice(0,t):`${M(n).slice(0,t-1)}…`}function F(e,t){let n=String(e??``),r=N(n);return r===t?n:r>t?P(n,t):n+` `.repeat(t-r)}function I(e,t){if(!e.length)return``;let n=Math.max(...e.map(e=>e.length)),r=[];for(let i=0;i<n;i++)if(t&&t[i]!==void 0)r[i]=t[i];else{let t=0;for(let n of e){let e=i<n.length?String(n[i]??``):``;t=Math.max(t,N(e))}r[i]=t}return e.map(e=>r.map((t,n)=>F(n<e.length?String(e[n]??``):``,t)).join(` `).replace(/\s+$/,``)).join(`
|
|
5
|
-
`)}function L(e){return e instanceof Date?e:new Date(e)}function R(e,t=`short`){let n=L(e);if(Number.isNaN(n.getTime()))return String(e);if(t===`iso`)return n.toISOString();if(t===`locale`)return new Intl.DateTimeFormat(void 0,{dateStyle:`medium`}).format(n);if(t===`human`){let e=Date.now()-n.getTime(),t=Math.abs(e);if(t<6e4)return e>=0?`just now`:`in a moment`;let r=(t,n)=>e>=0?`${t} ${n}${t===1?``:`s`} ago`:`in ${t} ${n}${t===1?``:`s`}`;return t<36e5?r(Math.round(t/6e4),`minute`):t<864e5?r(Math.round(t/36e5),`hour`):t<26298e5?r(Math.round(t/864e5),`day`):t<315576e5?r(Math.round(t/26298e5),`month`):r(Math.round(t/315576e5),`year`)}return`${n.getFullYear()}-${k(n.getMonth()+1)}-${k(n.getDate())}`}const z={trunc:P,col:F,table:I,date:R},B=async(e,t,n)=>{let r=Math.max(1,Math.trunc(e)||1),i=Array(t.length),a=0,o=[],s=async()=>{for(;;){let e=a++;if(e>=t.length)return;i[e]=await n(t[e],e)}};for(let e=0;e<Math.min(r,t.length);e++)o.push(s());return await Promise.all(o),i},V=new Set([`http`,`https`,`net`,`tls`,`dgram`,`dns`,`cluster`,`worker_threads`,`child_process`,`crypto`,`os`,`stream`,`zlib`,`vm`,`v8`,`perf_hooks`,`readline`,`repl`,`tty`,`inspector`]),te=new Set([`fs`,`process`,`buffer`]);var H=class extends Error{code;constructor(e){super(`Process exited with code ${e}`),this.code=e,this.name=`NodeExitError`}};function U(e){let t=/\brequire\s*\(\s*(['"`])([^'"`\s]+)\1\s*\)/g,n=new Set,r;for(;(r=t.exec(e))!==null;)n.add(r[2]);return[...n]}function W(e){if(typeof e==`string`)return e;if(e==null)return String(e);try{return JSON.stringify(e)}catch{return String(e)}}async function G(e,t,a=q){let l=[],u=[],d=e=>{l.push(typeof e==`string`?e:String(e))},p=e=>{u.push(typeof e==`string`?e:String(e))},m={log:(...e)=>d(`${e.map(W).join(` `)}\n`),info:(...e)=>d(`${e.map(W).join(` `)}\n`),warn:(...e)=>p(`${e.map(W).join(` `)}\n`),error:(...e)=>p(`${e.map(W).join(` `)}\n`)},h=e.stdin??``,g=!1,_={isTTY:!1,read(){return g?null:(g=!0,h)},toString(){return h},[Symbol.asyncIterator](){return{async next(){return g?{value:void 0,done:!0}:(g=!0,{value:h,done:!1})}}}},v=C(e.argv),y=!!e.env?.NO_COLOR,b={argv:v,env:e.env,cwd:()=>e.cwd,exit:e=>{throw new H(Number.isFinite(e)?Number(e):0)},stdin:_,stdout:{write:d,isTTY:!y},stderr:{write:p,isTTY:!y}},x=E({isTTY:!y,noColor:y}),S=w({writeStdout:d,writeStderr:p,exit:e=>{throw new H(e)},color:x}),T=new r(t),D={readFile:e=>T.call(`vfs`,`readFile`,[e]),readFileBinary:e=>T.call(`vfs`,`readFileBinary`,[e]),writeFile:(e,t)=>T.call(`vfs`,`writeFile`,[e,t]),writeFileBinary:(e,t)=>T.call(`vfs`,`writeFileBinary`,[e,t]),readDir:e=>T.call(`vfs`,`readDir`,[e]),exists:e=>T.call(`vfs`,`exists`,[e]),stat:e=>T.call(`vfs`,`stat`,[e]),mkdir:e=>T.call(`vfs`,`mkdir`,[e]),rm:e=>T.call(`vfs`,`rm`,[e]),fetchToFile:async(e,t)=>{let n=await N(e);if(!n.ok)throw Error(`fetch ${n.status} ${n.statusText}`);let r=new Uint8Array(await n.arrayBuffer());return await T.call(`vfs`,`writeFileBinary`,[t,r]),r.byteLength}},O=Object.assign(e=>T.call(`exec`,`run`,[e]),{spawn:e=>T.call(`exec`,`spawn`,[e])}),k=f({argv:e.argv,fs:D,exec:O}),j={findTab:e=>T.call(`browser`,`findTab`,[Z(e)]),ensureTab:(e,t={})=>T.call(`browser`,`ensureTab`,[e,ne(t)]),eval:(e,t)=>T.call(`browser`,`eval`,[J(e),Y(t,!1)]),evalAsync:(e,t)=>T.call(`browser`,`evalAsync`,[J(e),Y(t,!0)]),cookie:(e,t)=>T.call(`browser`,`cookie`,[J(e),t]),localStorage:(e,t)=>T.call(`browser`,`localStorage`,[J(e),t]),fetch:(e,t,n={})=>T.call(`browser`,`evalAsync`,[J(e),X(t,n)]),websocket:re(T)},M=ee({fetch:N});async function N(e,t){let n=e instanceof Request?e.url:e instanceof URL?e.toString():String(e),r=await T.call(`fetch`,`request`,[n,K(t,e)]),i=r.body.byteLength===0?null:r.body.buffer.slice(r.body.byteOffset,r.body.byteOffset+r.body.byteLength),a=new Response(i,{status:r.status,statusText:r.statusText,headers:r.headers});return Object.defineProperty(a,"url",{value:r.url||n}),a}let P=U(e.code).map(e=>e.startsWith(`node:`)?e.slice(5):e).filter(e=>!te.has(e)&&!V.has(e)),F=P.filter(e=>i.has(e)),I=P.filter(e=>!i.has(e));for(let e of F)p(`Warning: ${s(e,e).message}\n`);let L=Object.create(null),R=o(e.env);if(I.length>0){let e=await Promise.allSettled(I.map(async e=>{let t=await c(a(e),R,`require('${e}')`);L[e]=t&&`default`in t?t.default:t}));for(let t=0;t<e.length;t++){let n=e[t];if(n.status===`rejected`){let e=n.reason instanceof Error?n.reason.message:String(n.reason);p(`Warning: failed to pre-load require('${I[t]}'): ${e}\n`)}}}let G=e=>{let t=e.startsWith(`node:`)?e.slice(5):e;if(t===`fs`)return D;if(t===`process`)return b;if(t===`buffer`)return{Buffer:globalThis.Buffer};if(t===`path`){if(`path`in L)return L.path;if(e in L)return L[e];throw Error(`require('${e}'): path module not pre-loaded. Add require('path') as a static import.`)}if(i.has(t))throw s(e,t);if(V.has(t))throw Error(`require('${e}'): Node built-in '${t}' is not available in the browser environment.${{http:` Use fetch() instead.`,https:` Use fetch() instead.`,child_process:` Use exec() which is available as a shell bridge.`,crypto:` Use globalThis.crypto (Web Crypto API) instead.`}[t]||``}`);if(e in L)return L[e];if(t in L)return L[t];throw Error(`require('${e}'): module not pre-loaded. Use a string literal so it can be pre-fetched, or use \`await import('${n(e).toString()}')\` directly.`)},Q={exports:{},filename:e.filename},$=0;try{let t=Object.getPrototypeOf(async function(){}).constructor;await new t(`fs`,`process`,`console`,`require`,`module`,`exports`,`exec`,`fetch`,`skill`,`http`,`browser`,`cli`,`c`,`time`,`fmt`,`pool`,`"use strict";\n${e.code}`)(D,b,m,G,Q,Q.exports,O,N,k,M,j,S,x,A,z,B)}catch(e){e instanceof H?$=e.code:(p(`${e instanceof Error?e.stack??e.message:String(e)}\n`),$=1)}T.dispose();let ie={type:`realm-done`,stdout:l.join(``),stderr:u.join(``),exitCode:$};t.postMessage(ie)}function K(e,t){if(!e&&!(t instanceof Request))return;let n=t instanceof Request?t:null,r=(e?.method??n?.method??`GET`).toUpperCase(),i={};if(e?.headers)if(e.headers instanceof Headers)e.headers.forEach((e,t)=>{i[t]=e});else if(Array.isArray(e.headers))for(let[t,n]of e.headers)i[t]=n;else Object.assign(i,e.headers);else n&&n.headers.forEach((e,t)=>{i[t]=e});let a;return e?.body!==void 0&&e?.body!==null&&e?.body!==``&&(a=typeof e.body==`string`?e.body:String(e.body)),{method:r,headers:i,body:a}}async function q(e){return await import(n(e).toString())}function J(e){if(typeof e==`string`)return e;if(e&&typeof e==`object`&&typeof e.targetId==`string`)return e.targetId;throw TypeError(`browser: expected a tab handle or targetId string`)}function Y(e,t){if(typeof e==`function`)return`(${e.toString()})()`;if(typeof e==`string`)return e;throw TypeError(`browser.eval/evalAsync: source must be a function or string`)}function X(e,t={}){let n={},r=t.headers??{};for(let[e,t]of Object.entries(r))typeof t==`string`&&(n[e]=t);let i=typeof t.method==`string`?t.method:`GET`,a=t.credentials===`same-origin`||t.credentials===`omit`?t.credentials:`include`,o;t.body!==void 0&&t.body!==null&&(typeof t.body==`string`?o=t.body:(o=JSON.stringify(t.body),Object.keys(n).some(e=>e.toLowerCase()===`content-type`)||(n[`Content-Type`]=`application/json`)));let s={method:i,credentials:a,headers:n};o!==void 0&&(s.body=o);for(let e of[`mode`,`cache`,`redirect`,`referrer`,`referrerPolicy`,`integrity`,`keepalive`]){let n=t[e];n!==void 0&&(s[e]=n)}return`(async () => {const r = await fetch(`+JSON.stringify(e)+`, `+JSON.stringify(s)+`);const h = {};r.headers.forEach((v, k) => { h[k] = v; });const ct = r.headers.get('content-type') || '';let b;if (ct.indexOf('application/json') !== -1) {try { b = await r.json(); } catch (e) { b = await r.text(); }} else { b = await r.text(); }return { ok: r.ok, status: r.status, headers: h, body: b };})()`}function Z(e){let t={};return e.domain!==void 0&&(t.domain=e.domain),e.urlMatch!==void 0&&(t.urlMatch=e.urlMatch instanceof RegExp?e.urlMatch.source:e.urlMatch),t}function ne(e){return e.matchUrl===void 0?{}:{matchUrl:e.matchUrl instanceof RegExp?e.matchUrl.source:e.matchUrl}}function re(e){function t(t){return{...t,async update(n){let r={};return n.urlMatch!==void 0&&(r.urlMatch=n.urlMatch===null?null:n.urlMatch instanceof RegExp?n.urlMatch.source:n.urlMatch),n.filter!==void 0&&(r.filter=n.filter),e.call(`browser`,`wsUpdate`,[t.id,r])},async close(){return e.call(`browser`,`wsClose`,[t.id])}}}return{on(n,r={}){let i=J(n),a=r.urlMatch===void 0?void 0:r.urlMatch instanceof RegExp?r.urlMatch.source:r.urlMatch,o,s={filter(e){if(typeof e==`function`||typeof e==`string`)throw TypeError(`browser.websocket: filter must be a declarative JSON object, not a function or string`);return o=e,s},async forward(n){return t(await e.call(`browser`,`wsObserve`,[{targetId:i,urlMatch:a,filter:o,forward:n}]))}};return s},async list(){return e.call(`browser`,`wsList`,[])}}}const Q={postMessage:(e,t)=>t?self.postMessage(e,t):self.postMessage(e),addEventListener:(e,t)=>self.addEventListener(e,t),removeEventListener:(e,t)=>self.removeEventListener(e,t)};self.addEventListener(`message`,e=>{if(e.data?.type!==`realm-init`)return;let t=e.data;t.kind===`js`&&G(t,Q).catch(e=>{let t={type:`realm-error`,message:e instanceof Error?e.message:String(e)};self.postMessage(t)})});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const e=5e3;function t(t,n=[]){let r=`lm-${Date.now()}-${Math.random().toString(36).slice(2)}`,i=new BroadcastChannel(`slicc-lick-manager`);return new Promise((a,o)=>{let s=setTimeout(()=>{i.close(),o(Error(`LickManager '${t}' timed out after ${e}ms — is the offscreen document running and has startLickManagerHost() been called?`))},e);i.onmessage=e=>{let t=e.data;!t||t.type!==`lick-op-response`||t.id!==r||(clearTimeout(s),i.close(),t.error?o(Error(t.error)):a(t.result))};try{i.postMessage({type:`lick-op`,id:r,op:t,args:n})}catch(e){clearTimeout(s),i.close(),o(Error(`LickManager '${t}' postMessage failed: ${e instanceof Error?e.message:String(e)}`))}})}function n(){return{createCronTask:(e,n,r,i)=>t(`createCronTask`,[e,n,r,i]),deleteCronTask:e=>t(`deleteCronTask`,[e]),createWebhook:(e,n,r)=>t(`createWebhook`,[e,n,r]),deleteWebhook:e=>t(`deleteWebhook`,[e])}}function r(){return t(`listCronTasks`)}function i(){return t(`listWebhooks`)}function a(){return t(`getTrayWebhookUrl`)}export{n as createLickManagerProxy,a as getTrayWebhookUrlAsync,r as listCronTasksAsync,i as listWebhooksAsync};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
@font-face{font-family:Adobe Clean;src:url(/fonts/AdobeClean-Regular.otf)format("opentype");font-weight:400;font-style:normal;font-display:swap}@font-face{font-family:Adobe Clean;src:url(/fonts/AdobeClean-Medium.otf)format("opentype");font-weight:500;font-style:normal;font-display:swap}@font-face{font-family:Adobe Clean;src:url(/fonts/AdobeClean-Bold.otf)format("opentype");font-weight:700;font-style:normal;font-display:swap}@font-face{font-family:Adobe Clean;src:url(/fonts/AdobeClean-ExtraBold.otf)format("opentype");font-weight:800;font-style:normal;font-display:swap}:root{--s2-gray-25:#1a1a1a;--s2-gray-50:#1e1e1e;--s2-gray-75:#252525;--s2-gray-100:#2c2c2c;--s2-gray-200:#3a3a3a;--s2-gray-300:#4a4a4a;--s2-gray-400:#5a5a5a;--s2-gray-500:#6e6e6e;--s2-gray-600:#8a8a8a;--s2-gray-700:#a1a1a1;--s2-gray-800:#cfcfcf;--s2-gray-900:#e8e8e8;--s2-gray-1000:#fff;--s2-bg-base:var(--s2-gray-25);--s2-bg-layer-1:var(--s2-gray-50);--s2-bg-layer-2:var(--s2-gray-75);--s2-bg-elevated:var(--s2-gray-100);--s2-bg-sunken:#141414;--s2-content-default:var(--s2-gray-900);--s2-content-secondary:var(--s2-gray-700);--s2-content-tertiary:var(--s2-gray-600);--s2-content-disabled:var(--s2-gray-400);--slicc-cone:#ef7000;--slicc-scoop-blue:#3562ff;--slicc-scoop-purple:#a962e8;--slicc-scoop-teal:#2db9be;--slicc-accent:#15d675;--s2-accent:var(--slicc-scoop-blue);--s2-accent-hover:#4a75ff;--s2-accent-down:#2a52e0;--s2-negative:#e34850;--s2-positive:#2d9d78;--s2-informative:var(--slicc-scoop-blue);--s2-notice:#e68619;--s2-border-default:var(--s2-gray-300);--s2-border-subtle:var(--s2-gray-200);--s2-border-focus:var(--s2-accent);--s2-font-family:"Adobe Clean", "Source Sans Pro", -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, sans-serif;--s2-font-mono:"Source Code Pro", "JetBrains Mono", "Fira Code", "Cascadia Code", monospace;--s2-font-size-50:11px;--s2-font-size-75:12px;--s2-font-size-100:14px;--s2-font-size-200:16px;--s2-font-size-300:18px;--s2-font-size-400:20px;--s2-font-size-500:22px;--s2-font-size-600:25px;--s2-line-height-50:14px;--s2-line-height-75:16px;--s2-line-height-100:18px;--s2-line-height-200:20px;--s2-line-height-300:22px;--s2-spacing-50:4px;--s2-spacing-75:6px;--s2-spacing-100:8px;--s2-spacing-200:12px;--s2-spacing-300:16px;--s2-spacing-400:24px;--s2-spacing-500:32px;--s2-spacing-600:40px;--s2-radius-s:4px;--s2-radius-default:8px;--s2-radius-l:12px;--s2-radius-xl:16px;--s2-radius-pill:9999px;--s2-shadow-elevated:0 4px 16px #0006, 0 1px 4px #0000004d;--s2-shadow-container:0 1px 4px #0003;--s2-transition-default:.13s ease;--s2-header-height:56px;--uxc-yellow-subtle-bg:#fff197;--uxc-yellow-subtle-text:#9e6600;--uxc-purple-subtle-bg:#f4ebfc;--uxc-purple-subtle-text:#9a47e2;--uxc-cyan-subtle-bg:#d9f4fd;--uxc-cyan-subtle-text:#0b78b3;--uxc-magenta-subtle-bg:#ffe8f0;--uxc-magenta-subtle-text:#d92361;--uxc-indigo-subtle-bg:#ebeeff;--uxc-indigo-subtle-text:#5424db;--uxc-gray-subtle-bg:#efefef;--uxc-gray-subtle-text:#292929;--uxc-positive-subtle-bg:#d7f7e1;--uxc-positive-subtle-text:#079355;--uxc-notice-subtle-bg:#ffeccf;--uxc-notice-subtle-text:#d45b00;--uxc-negative-subtle-bg:#ffe8f0;--uxc-negative-subtle-text:#d92361;--uxc-accent-subtle-bg:#e5f0fe;--uxc-accent-subtle-text:#3b63fb;--uxc-neutral-subtle-bg:#f3f3f3;--uxc-nav-rail-width:58px;--uxc-thread-header-height:56px;--uxc-content-max-width:800px;--slicc-warm-bg:color-mix(in oklch, var(--s2-gray-50) 94%, var(--slicc-cone) 6%);--slicc-brand-gradient:linear-gradient(90deg, var(--slicc-cone) 0%, var(--slicc-scoop-blue) 50%, var(--slicc-scoop-purple) 100%)}:root.theme-light{--s2-gray-25:#fff;--s2-gray-50:#f8f8f8;--s2-gray-75:#f3f3f3;--s2-gray-100:#e9e9e9;--s2-gray-200:#e1e1e1;--s2-gray-300:#dadada;--s2-gray-400:#c6c6c6;--s2-gray-500:#8f8f8f;--s2-gray-600:#717171;--s2-gray-700:#505050;--s2-gray-800:#292929;--s2-gray-900:#131313;--s2-gray-1000:#000;--s2-bg-sunken:#f3f3f3;--s2-accent:#3b63fb;--s2-accent-hover:#2b54db;--s2-accent-down:#1e44c4;--s2-negative:#d92361;--s2-positive:#05834e;--s2-notice:#d45b00;--s2-shadow-elevated:0 4px 12px #00000014, 0 2px 6px #0000000a, 0 0px 2px #0000001f;--s2-shadow-container:0 2px 8px #00000014, 0 1px 4px #0000000a, 0 0px 1px #00000014}.theme-light .tok-keyword{color:#8839ef}.theme-light .tok-string{color:#40a02b}.theme-light .tok-number{color:#d05d1a}.theme-light .tok-comment{color:var(--s2-gray-500)}.theme-light .tok-punct{color:#1e66f5}.theme-light .tok-fn{color:#2b6cb0}.theme-light .s2-tooltip{background:var(--s2-gray-900);color:var(--s2-gray-25)}.theme-light ::-webkit-scrollbar-thumb{background:var(--s2-gray-300)}.theme-light ::-webkit-scrollbar-thumb:hover{background:var(--s2-gray-400)}*,:before,:after{box-sizing:border-box;margin:0;padding:0}html,body{height:100%;overflow:hidden}body{font-family:var(--s2-font-family);background:var(--s2-bg-base);color:var(--s2-content-default);font-size:var(--s2-font-size-100);line-height:1.5}#app{flex-direction:column;height:100%;display:flex}:focus-visible{outline:2px solid var(--s2-accent);outline-offset:2px}::-webkit-scrollbar{width:6px;height:6px}::-webkit-scrollbar-track{background:0 0}::-webkit-scrollbar-thumb{background:var(--s2-gray-300);border-radius:3px}::-webkit-scrollbar-thumb:hover{background:var(--s2-gray-400)}.layout{flex:1;min-height:0;display:flex}.layout__scoops{width:var(--uxc-nav-rail-width);min-width:var(--uxc-nav-rail-width);max-width:var(--uxc-nav-rail-width);background:var(--s2-bg-layer-1);flex-direction:column;flex-shrink:0;transition:width .2s,min-width .2s,max-width .2s;display:flex;overflow:visible}.layout__scoops--expanded{width:230px;min-width:230px;max-width:230px}.layout__left{background:var(--s2-bg-layer-1);flex-direction:column;flex:1;min-width:320px;display:flex}.layout__right{background:var(--s2-gray-25);flex-direction:column;flex:1;min-width:240px;display:flex;overflow:hidden}.layout__divider{cursor:col-resize;background:var(--s2-border-subtle);width:1px;transition:background var(--s2-transition-default);flex-shrink:0;position:relative}.layout__divider:after{content:"";position:absolute;inset:0 -3px}.layout__divider:hover,.layout__divider.active{background:var(--s2-accent)}.thread-header{height:var(--uxc-thread-header-height);min-height:var(--uxc-thread-header-height);background:var(--s2-gray-25);border-bottom:none;border-top-left-radius:12px;flex-shrink:0;justify-content:space-between;align-items:center;padding:0 16px;display:flex;position:relative;overflow:hidden}.thread-header:before{content:"";background:var(--slicc-brand-gradient);opacity:.5;height:1px;position:absolute;bottom:0;left:0;right:0}.thread-header:after{content:"";background:var(--s2-accent);transform-origin:0;opacity:0;height:2px;transition:opacity .2s;position:absolute;bottom:0;left:0;right:0;transform:scaleX(0)}.thread-header--processing:after{opacity:1;animation:1.8s ease-in-out infinite thread-progress}@keyframes thread-progress{0%{transform:scaleX(0)translate(0)}50%{transform:scaleX(.4)translate(125%)}to{transform:scaleX(0)translate(300%)}}.thread-header__title{flex:1;align-items:center;gap:8px;min-width:0;display:flex}.thread-header__name{letter-spacing:0;color:var(--s2-gray-900);white-space:nowrap;text-overflow:ellipsis;font-size:14px;font-weight:700;line-height:18px;overflow:hidden}.thread-header__icon{width:20px;height:20px;color:var(--s2-content-default);flex-shrink:0;justify-content:center;align-items:center;display:flex}.thread-header__actions{flex-shrink:0;align-items:center;gap:4px;display:flex}.thread-header--with-switcher{z-index:12;overflow:visible}.thread-header--with-switcher .thread-header__title{gap:0}.thread-header--with-switcher .scoop-switcher{align-items:center;margin-left:0;display:flex}.layout__right-divider{cursor:row-resize;background:var(--s2-border-subtle);height:1px;transition:background var(--s2-transition-default);flex-shrink:0;position:relative}.layout__right-divider:after{content:"";position:absolute;inset:-3px 0}.layout__right-divider:hover,.layout__right-divider.active{background:var(--s2-accent)}.thread-header__panel-toggle{width:32px;height:32px;color:var(--s2-content-secondary);border-radius:var(--s2-radius-pill);cursor:pointer;transition:background var(--s2-transition-default), color var(--s2-transition-default);background:0 0;border:none;justify-content:center;align-items:center;display:inline-flex}.thread-header__panel-toggle:hover{background:var(--s2-gray-200);color:var(--s2-content-default)}.thread-header__panel-toggle svg{width:16px;height:16px}.thread-header__new-session.glow{color:var(--s2-notice,#c97a00);background:#c97a0014;box-shadow:0 0 0 1px #c97a0040,0 0 12px #c97a0073}.thread-header__new-session.glow--hot{color:var(--s2-negative,#d73220);background:#d732201a;animation:2.4s ease-in-out infinite new-session-pulse;box-shadow:0 0 0 1px #d7322059,0 0 16px #d732208c}@keyframes new-session-pulse{0%,to{box-shadow:0 0 0 1px #d7322059,0 0 16px #d732208c}50%{box-shadow:0 0 0 1px #d732208c,0 0 22px #d73220d9}}.chat__gradient-top{background:linear-gradient(to bottom, var(--s2-bg-base) 0%, transparent 100%);pointer-events:none;z-index:1;height:80px;position:absolute;top:0;left:0;right:0}.layout__left--fullpage-hidden,.layout__divider--fullpage-hidden,.layout__scoops--fullpage-hidden{display:none!important}.layout__right--fullpage{flex:1;min-width:0;width:auto!important;box-shadow:none!important;position:static!important;transform:none!important}@media (width>=1024px){.thread-header__panel-toggle--right{display:none}}@media (width<=1023px){.layout__right{right:0;top:var(--s2-header-height);z-index:50;width:50vw;min-width:400px;transition:transform .25s;position:fixed;bottom:0;transform:translate(100%);box-shadow:-4px 0 24px #0000001a}.layout__right--open{transform:translate(0)}.layout__divider--vertical{display:none}.layout__left{flex:1;min-width:0}}@media (width<=767px){.layout__scoops{left:0;top:var(--s2-header-height);z-index:60;border-right:1px solid var(--s2-border-subtle);width:var(--uxc-nav-rail-width);min-width:var(--uxc-nav-rail-width);max-width:var(--uxc-nav-rail-width);transition:transform .25s;position:fixed;bottom:0;transform:translate(-100%);box-shadow:4px 0 24px #0000001a}.layout__scoops--expanded{width:200px;min-width:200px;max-width:200px;transform:translate(0)}.layout__divider--scoops{display:none}.layout__right{width:100vw;min-width:100vw}.thread-header{padding:0 var(--s2-spacing-200)}.chat__input-area{padding:var(--s2-spacing-200)}}@media (width>=1440px){.layout__left,.layout__right{flex:1}}.header{height:var(--s2-header-height);min-height:var(--s2-header-height);background:var(--s2-bg-layer-2);z-index:10;flex-shrink:0;justify-content:space-between;align-items:center;padding:8px 16px;display:flex}.header__row{align-items:center;gap:6px;width:100%;display:flex}.header__brand{align-items:center;gap:10px;display:flex}.header__spacer{flex:1}.header__logo{flex-shrink:0;width:32px;height:32px;margin-right:12px;transition:viewBox .3s}.header__brand .scoops-hamburger{width:32px;height:32px;color:var(--s2-content-secondary);cursor:pointer;background:0 0;border:none;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;transition:background .13s,color .13s;display:flex}.header__brand .scoops-hamburger:hover{background:var(--s2-bg-elevated);color:var(--s2-content-default)}.logo-scoop-enter{transform-box:fill-box;transform-origin:50%;animation:.6s cubic-bezier(.34,1.56,.64,1) both scoop-drop}@keyframes scoop-drop{0%{opacity:0;transform:translateY(-18px)scale(.2)}40%{opacity:1;transform:translateY(1px)scale(1.15)}60%{transform:translateY(-2px)scale(.95)}80%{transform:translateY(.5px)scale(1.03)}to{opacity:1;transform:translateY(0)scale(1)}}.logo-scoop-wiggle{transform-box:fill-box;transform-origin:50%;animation:.5s both scoop-wiggle}@keyframes scoop-wiggle{0%{transform:translateY(0)}20%{transform:translateY(1.5px)}40%{transform:translateY(-1px)}60%{transform:translateY(.5px)}to{transform:translateY(0)}}.logo-cone-squash{transform-box:fill-box;transform-origin:top;animation:.5s both cone-squash}@keyframes cone-squash{0%{transform:scaleY(1)scaleX(1)}30%{transform:scaleY(.92)scaleX(1.06)}60%{transform:scaleY(1.03)scaleX(.98)}to{transform:scaleY(1)scaleX(1)}}.header__title{color:var(--s2-gray-900);letter-spacing:-.01em;font-size:18px;font-weight:800;line-height:20px}.header__actions{align-items:center;gap:8px;display:flex}.header__separator{background:var(--s2-border-subtle);width:1px;height:20px;margin:0}.header__btn{color:var(--s2-content-default);width:32px;height:32px;font-size:14px;font-family:var(--s2-font-family);cursor:pointer;transition:background var(--s2-transition-default), color var(--s2-transition-default), transform var(--s2-transition-default);background:0 0;border:none;border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}.header__btn:hover{background:var(--s2-bg-elevated);color:var(--s2-content-default)}.header__btn:active{transform:scale(.92)}.header__btn svg{width:20px;height:20px}.header__btn--text{width:auto;padding:var(--s2-spacing-50) var(--s2-spacing-200);font-size:var(--s2-font-size-75);border-radius:var(--s2-radius-default);gap:var(--s2-spacing-75);font-weight:500}.s2-tooltip{background:var(--s2-gray-900);color:var(--s2-gray-25);font-size:11px;font-weight:500;font-family:var(--s2-font-family);white-space:pre-line;text-align:left;border-radius:var(--s2-radius-s);pointer-events:none;opacity:0;z-index:10000;max-width:280px;padding:4px 8px;line-height:1.3;transition:opacity .13s;position:fixed}.s2-tooltip--visible{opacity:1}.header__avatar{cursor:pointer;width:28px;height:28px;transition:border-color var(--s2-transition-default), box-shadow var(--s2-transition-default);background:var(--s2-gray-200);color:var(--s2-content-tertiary);border:2px solid #0000;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;display:flex;position:relative;overflow:hidden}.header__avatar:hover{border-color:var(--s2-gray-300);box-shadow:0 0 0 2px color-mix(in srgb, var(--s2-accent) 20%, transparent)}.header__avatar img{object-fit:cover;border-radius:50%;width:100%;height:100%}.header__avatar--initials{background:var(--slicc-cone);color:#fff;font-size:11px;font-weight:700;font-family:var(--s2-font-family);line-height:1}.header__avatar--placeholder svg{width:16px;height:16px}.avatar-popover{z-index:10001;background:var(--s2-bg-layer-2);border:1px solid var(--s2-border-subtle);border-radius:var(--s2-radius-default);min-width:220px;font-family:var(--s2-font-family);padding:8px 0;position:fixed;box-shadow:0 8px 24px #0000001f,0 2px 8px #00000014}.avatar-popover__user{border-bottom:1px solid var(--s2-border-subtle);padding:12px 16px}.avatar-popover__name{color:var(--s2-content-default);font-size:14px;font-weight:600}.avatar-popover__provider{color:var(--s2-content-tertiary);margin-top:2px;font-size:11px}.avatar-popover__caption{color:var(--s2-content-tertiary);padding:4px 16px 8px;font-size:11px}.avatar-popover__item{width:100%;color:var(--s2-content-default);font-size:13px;font-family:var(--s2-font-family);cursor:pointer;text-align:left;transition:background var(--s2-transition-default);background:0 0;border:none;align-items:center;gap:8px;padding:8px 16px;display:flex}.avatar-popover__item:hover{background:var(--s2-bg-elevated)}.avatar-popover__item--danger{color:var(--s2-negative)}.avatar-popover__item--danger:hover{background:color-mix(in srgb, var(--s2-negative) 8%, transparent)}.avatar-popover__separator{background:var(--s2-border-subtle);height:1px;margin:4px 0}.header__popout-btn{color:inherit;cursor:pointer;opacity:.7;background:0 0;border:1px solid;border-radius:4px;padding:4px 8px;font-size:14px}.header__popout-btn:hover{opacity:1}.header__popout-btn:disabled{opacity:.3;cursor:not-allowed}.layout-detached-overlay{z-index:99999;color:#fff;text-align:center;background:#000000b3;flex-direction:column;justify-content:center;align-items:center;padding:2rem;font-size:16px;display:flex;position:fixed;inset:0}.layout-detached-overlay-close{color:#000;cursor:pointer;background:#fff;border:none;border-radius:6px;margin-top:1.5rem;padding:.6rem 1.5rem;font-size:14px}.chat{background:var(--s2-bg-base);flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.chat__messages{flex-direction:column;flex:1;gap:16px;padding:16px;display:flex;overflow-y:auto}.chat__messages-inner{width:100%;max-width:var(--uxc-content-max-width);flex-direction:column;gap:16px;margin:0 auto;display:flex}.chat__jump-pill{background:var(--s2-bg-layer-2);color:var(--s2-content-default);border:1px solid var(--s2-border-subtle);border-radius:var(--s2-radius-l);cursor:pointer;z-index:10;opacity:0;pointer-events:none;padding:5px 14px;font-size:12px;transition:opacity .2s;position:absolute;bottom:68px;left:50%;transform:translate(-50%)}.chat__jump-pill--visible{opacity:1;pointer-events:auto}.chat__jump-pill:hover{background:var(--s2-bg-elevated)}.msg{word-wrap:break-word;letter-spacing:0;max-width:100%;color:var(--s2-content-default);padding:0;font-size:14px;line-height:1.5}.msg--user{color:#fff;letter-spacing:0;background:#7155fa;border-radius:10px;align-self:flex-end;min-width:80px;max-width:560px;padding:8px 16px;font-size:14px;font-weight:500;line-height:18px}.msg--user .msg__content a,.msg--user .msg__content a:visited{color:#c8bbff!important;text-decoration:underline!important}.msg--user .msg__content a:hover{color:#fff!important}.msg--user :not(pre)>code{color:#fff!important;background:#ffffff2e!important}.msg--user pre{background:#00000040!important;border-color:#ffffff1a!important}.msg--user pre code{color:#e8e0ff!important}.msg--user .msg__attachments{margin-bottom:8px}.msg-group--continuation .msg--user{padding-left:0}.msg--assistant{background:0 0;align-self:stretch}.msg--assistant .msg__content{white-space:normal;color:var(--s2-content-default);font-size:14px;line-height:1.5}.msg--assistant .msg__error{margin:var(--s2-spacing-75) 0}.msg--assistant .msg__error-label{color:var(--s2-negative);font-size:10px;font-weight:600;font-family:var(--s2-font-mono);text-transform:uppercase;letter-spacing:.04em;align-items:center;gap:6px;display:inline-flex}.msg--assistant .msg__error-label:before{content:"!";border-radius:var(--s2-radius-s);background:color-mix(in srgb, var(--s2-negative) 18%, transparent);border:1px solid color-mix(in srgb, var(--s2-negative) 45%, var(--s2-border-subtle));justify-content:center;align-items:center;width:16px;height:16px;display:inline-flex}.msg--assistant .msg__error-body{padding:var(--s2-spacing-75);border-left:2px solid color-mix(in srgb, var(--s2-negative) 60%, var(--s2-border-subtle));background:color-mix(in srgb, var(--s2-negative) 8%, var(--s2-bg-sunken));border-radius:var(--s2-radius-s);color:var(--s2-content-secondary);font-family:var(--s2-font-mono);font-size:var(--s2-font-size-50);white-space:pre-wrap;margin-top:2px;overflow-x:auto}.msg--assistant .msg__error-body code{font-size:inherit}.msg__dip{border-radius:var(--s2-radius-default);min-height:32px;margin:.6em 0;overflow:hidden}.msg__dip iframe{background:0 0;border:none;width:100%;display:block;overflow:hidden}.msg__seg--shtml{cursor:progress;opacity:.92;margin:.6em 0}.msg__dip-pending{background:var(--s2-bg-layer-1);color:var(--s2-content-secondary);font-size:var(--s2-font-size-75);border-radius:8px;align-items:center;gap:8px;margin:.6em 0;padding:8px 12px;line-height:1.4;display:flex}.msg__dip-pending-label{font-family:var(--s2-font-family);color:var(--s2-content-secondary);font-weight:500}.msg__dip-pending-status{background:#e6a23c;border-radius:50%;flex-shrink:0;width:7px;height:7px;margin-left:auto;animation:1.2s ease-in-out infinite tool-status-pulse}@media (prefers-reduced-motion:reduce){.msg__dip-pending-status{animation:none}}.msg-group--continuation .msg{padding-left:0}.msg__role,.msg__icon{display:none}.msg__collapsible{cursor:pointer}.msg__collapsible summary{cursor:pointer;color:var(--s2-content-tertiary);font-size:var(--s2-font-size-75);padding:var(--s2-spacing-50) 0;list-style:none}.msg__collapsible summary::-webkit-details-marker{display:none}.msg__collapsible summary:before{content:"▸";color:var(--s2-content-tertiary);transition:transform var(--s2-transition-default);margin-right:var(--s2-spacing-50);font-size:10px;display:inline-block}.msg__collapsible[open] summary:before{transform:rotate(90deg)}.msg__collapsible[open] .msg__content{margin-top:var(--s2-spacing-100)}.msg-group{flex-direction:column;gap:8px;display:flex}.msg-group:empty{display:none}.msg-group--compaction{align-self:flex-start;max-width:70%}.msg-group--compaction__bubble{border-radius:var(--s2-radius-l,14px);background:var(--s2-bg-elevated,#0000000a);color:var(--s2-content-secondary);border:1px dashed var(--s2-border-subtle,#0000001f);align-items:center;gap:8px;padding:8px 12px;font-size:13px;font-style:italic;animation:2s ease-in-out infinite msg-compaction-pulse;display:inline-flex}.msg-group--compaction__icon{opacity:.8;flex-shrink:0}.msg-group--compaction__label{white-space:pre-wrap}.msg-group--compaction__dots{gap:2px;margin-left:2px;display:inline-flex}.msg-group--compaction__dots span{opacity:.4;background:currentColor;border-radius:50%;width:4px;height:4px;animation:1.2s ease-in-out infinite msg-compaction-dot}.msg-group--compaction__dots span:nth-child(2){animation-delay:.15s}.msg-group--compaction__dots span:nth-child(3){animation-delay:.3s}@keyframes msg-compaction-pulse{0%,to{background:var(--s2-bg-elevated,#0000000a)}50%{background:#00000012}}@keyframes msg-compaction-dot{0%,80%,to{opacity:.25;transform:translateY(0)}40%{opacity:1;transform:translateY(-2px)}}.msg--queued{opacity:.55}.msg__queued-badge{text-transform:uppercase;background:var(--s2-bg-elevated);color:var(--s2-content-disabled);border-radius:var(--s2-radius-s);letter-spacing:.5px;vertical-align:middle;margin-left:8px;padding:1px 6px;font-size:9px;font-weight:600;display:inline-block}.msg__queued-delete{color:var(--s2-content-disabled);cursor:pointer;vertical-align:middle;background:0 0;border:none;margin-left:6px;padding:0 4px;font-size:14px;line-height:1}.msg__queued-delete:hover{color:var(--s2-negative)}.streaming-cursor{background:var(--s2-accent);vertical-align:text-bottom;border-radius:1px;width:2px;height:16px;margin-left:2px;animation:1s step-end infinite blink;display:inline-block}@keyframes blink{50%{opacity:0}}.chat__input-area{padding:var(--s2-spacing-300);background:var(--s2-bg-base);border-top:none}.chat__input-area-inner{max-width:var(--uxc-content-max-width);width:100%;margin:0 auto}.chat__suggested-actions{gap:var(--s2-spacing-100);margin-bottom:var(--s2-spacing-200);flex-wrap:wrap;justify-content:center;display:flex}.chat__suggested-btn{align-items:center;gap:var(--s2-spacing-75);border:1px solid var(--s2-gray-200);border-radius:var(--s2-radius-pill);background:var(--s2-bg-base);height:32px;color:var(--s2-content-default);font-size:var(--s2-font-size-75);font-weight:600;font-family:var(--s2-font-family);cursor:pointer;transition:background var(--s2-transition-default), border-color var(--s2-transition-default);padding:0 16px;display:inline-flex}.chat__suggested-btn:hover{background:var(--s2-gray-75);border-color:var(--s2-gray-300)}.chat__suggested-btn--accent{background:var(--s2-accent);color:#fff;border-color:#0000}.chat__suggested-btn--accent:hover{background:var(--s2-accent-hover)}.chat__input-wrapper{border:1px solid var(--s2-border-subtle);background:var(--s2-gray-25);transition:border-color var(--s2-transition-default), box-shadow var(--s2-transition-default);border-radius:16px;flex-direction:column;min-height:112px;padding:16px;display:flex;box-shadow:0 0 1px #00000014,0 1px 4px #0000000a,0 2px 8px #00000014}.chat__input-wrapper:focus-within{border-color:var(--s2-accent);box-shadow:0 0 1px #00000014,0 1px 4px #0000000a,0 4px 16px #0000001f}.chat__attachments,.msg__attachments{flex-wrap:wrap;gap:8px;display:none}.chat__attachments--visible,.msg__attachments{display:flex}.chat__attachments{margin-bottom:10px}.attachment-chip{border-radius:var(--s2-radius-default);border:1px solid var(--s2-border-subtle);background:var(--s2-bg-base);max-width:min(260px,100%);min-height:36px;color:var(--s2-content-default);align-items:center;gap:8px;padding:5px 8px 5px 6px;font-size:12px;line-height:1.2;display:inline-flex}.msg--user .attachment-chip{color:#fff;background:#ffffff24;border-color:#fff3}.attachment-chip__visual{background:color-mix(in srgb, var(--s2-bg-elevated) 80%, transparent);border-radius:6px;flex:none;justify-content:center;align-items:center;width:26px;height:26px;display:inline-flex;overflow:hidden}.msg--user .attachment-chip__visual{background:#ffffff29}.attachment-chip__visual img{object-fit:cover;width:100%;height:100%}.attachment-chip__body{flex-direction:column;gap:1px;min-width:0;display:flex}.attachment-chip__name,.attachment-chip__meta,.attachment-chip__path{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.attachment-chip__name{font-weight:600}.attachment-chip__meta{color:var(--s2-content-tertiary);font-size:11px}.attachment-chip__path{color:var(--s2-content-tertiary);font-size:11px;font-family:var(--s2-font-mono,ui-monospace, monospace)}.msg--user .attachment-chip__meta,.msg--user .attachment-chip__path{color:#ffffffb3}.attachment-chip__remove{border-radius:var(--s2-radius-s);width:22px;height:22px;color:var(--s2-content-tertiary);cursor:pointer;background:0 0;border:none;flex:none;justify-content:center;align-items:center;display:inline-flex}.attachment-chip__remove:hover{background:var(--s2-bg-elevated);color:var(--s2-content-default)}.chat__textarea{resize:none;min-height:18px;max-height:30vh;color:var(--s2-content-default);font-family:var(--s2-font-family);letter-spacing:0;background:0 0;border:none;outline:none;flex:none;padding:0;font-size:14px;font-weight:400;line-height:18px;overflow-y:auto}.chat__textarea::placeholder{color:var(--s2-content-tertiary)}.chat__action-bar{flex-shrink:0;justify-content:space-between;align-items:center;margin-top:auto;display:flex}.chat__action-bar-left{align-items:center;gap:8px;display:flex}.chat__action-bar-right{align-items:center;gap:8px;margin-left:12px;display:flex}.chat__model-selector{flex:1;justify-content:flex-end;align-items:center;gap:6px;display:flex;position:relative}.chat__thinking-btn{border-radius:var(--s2-radius-default);cursor:pointer;width:28px;height:28px;color:var(--s2-content-default);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;transition:opacity .13s,transform .13s,background .13s,color .13s;display:flex}.chat__thinking-btn svg{width:18px;height:18px}.chat__thinking-btn:hover{background:var(--s2-bg-elevated)}.chat__thinking-btn:active{transform:scale(.92)}.chat__thinking-btn[hidden]{display:none}.chat__thinking-btn[data-level=off]{opacity:.5}.chat__thinking-btn[data-level=minimal],.chat__thinking-btn[data-level=low]{opacity:.75}.chat__thinking-btn[data-level=medium],.chat__thinking-btn[data-level=high]{opacity:1;color:var(--s2-accent,var(--slicc-cone,#6b8afd))}.chat__thinking-btn[data-level=xhigh]{opacity:1;color:#fff;background:linear-gradient(135deg, var(--slicc-cone-mint,#b8e6c9), var(--slicc-cone-strawberry,#ffb3c1), var(--slicc-cone-vanilla,#fff4c2), var(--slicc-cone-blueberry,#b8c9ff));background-size:300% 300%;animation:6s ease-in-out infinite chat-thinking-shimmer}@keyframes chat-thinking-shimmer{0%,to{background-position:0%}50%{background-position:100%}}@media (prefers-reduced-motion:reduce){.chat__thinking-btn[data-level=xhigh]{animation:none}}.chat__model-pill{border:1px solid var(--s2-border-subtle);color:var(--s2-content-secondary);border-radius:var(--s2-radius-pill);font-size:12px;font-family:var(--s2-font-family);cursor:pointer;white-space:nowrap;background:0 0;padding:4px 12px;transition:background .13s,color .13s,border-color .13s}.chat__model-pill:hover{background:var(--s2-bg-elevated);color:var(--s2-content-default)}.chat__model-pill--active{background:var(--s2-accent);color:#fff;border-color:var(--s2-accent)}.chat__model-pill--active:hover{background:var(--s2-accent-hover);border-color:var(--s2-accent-hover)}.chat__model-btn--compact{border:1px solid var(--s2-border-subtle);color:var(--s2-content-secondary);border-radius:var(--s2-radius-pill);font-size:12px;font-family:var(--s2-font-family);cursor:pointer;white-space:nowrap;background:0 0;align-items:center;gap:4px;padding:4px 8px 4px 12px;transition:background .13s,color .13s;display:flex}.chat__model-btn--compact:hover{background:var(--s2-bg-elevated);color:var(--s2-content-default)}.chat__model-chevron{opacity:.6;align-items:center;display:flex}.chat__model-btn-provider{color:var(--s2-content-secondary);border-left:1px solid var(--s2-border-subtle);margin-left:6px;padding-left:6px;font-weight:400}.chat__model-btn--disabled{cursor:default;opacity:.5;pointer-events:none}.chat__model-menu{background:var(--s2-bg-base);border:1px solid var(--s2-border-subtle);z-index:100;border-radius:12px;min-width:200px;max-height:240px;padding:6px;display:none;position:absolute;bottom:calc(100% + 6px);right:0;overflow-y:auto;box-shadow:0 4px 24px #0000001f}.chat__model-menu-item{cursor:pointer;font-size:13px;font-family:var(--s2-font-family);color:var(--s2-content-default);border-radius:8px;justify-content:space-between;align-items:center;gap:12px;padding:8px 12px;transition:background .1s;display:flex}.chat__model-menu-item:hover{background:var(--s2-bg-elevated)}.chat__model-menu-item--active{font-weight:600}.chat__model-menu-left{align-items:baseline;gap:8px;min-width:0;display:flex}.chat__model-menu-provider{color:var(--s2-content-secondary);font-size:11px;font-weight:400}.chat__model-check{color:var(--s2-accent);align-items:center;display:flex}.chat__send-btn{background:var(--s2-gray-100);width:32px;height:32px;color:var(--s2-gray-400);cursor:pointer;transition:background var(--s2-transition-default), color var(--s2-transition-default), transform var(--s2-transition-default);border:none;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-size:14px;display:flex}.chat__send-btn:not(:disabled){color:#fff;background:#7155fa}.chat__send-btn:not(:disabled):hover{background:#6248e0}.chat__send-btn:active{transform:scale(.92)}.chat__send-btn:disabled{cursor:not-allowed}.chat__stop-btn{background:var(--s2-gray-800);width:32px;height:32px;color:var(--s2-gray-25);cursor:pointer;transition:background var(--s2-transition-default), transform var(--s2-transition-default);border:none;border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;font-size:14px;display:flex}.chat__stop-btn:hover{background:var(--s2-gray-900)}.chat__stop-btn:active{transform:scale(.92)}.chat__attach-btn,.chat__mic-btn{border-radius:var(--s2-radius-default);width:32px;height:32px;color:var(--s2-content-default);cursor:pointer;transition:background var(--s2-transition-default), color var(--s2-transition-default), transform var(--s2-transition-default);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;display:flex}.chat__attach-btn svg,.chat__mic-btn svg{width:20px;height:20px}.chat__attach-btn:hover,.chat__mic-btn:hover{background:var(--s2-bg-elevated);color:var(--s2-content-default)}.chat__attach-btn:disabled,.chat__mic-btn:disabled{opacity:.3;cursor:not-allowed}.chat__attach-btn--busy{color:var(--s2-accent)}.chat__file-input{display:none}.chat__mic-btn--active{color:var(--slicc-cone)}.chat__mic-btn--active.chat__mic-btn--listening,.chat__mic-btn--listening{background:var(--slicc-cone);color:#fff;animation:1.5s ease-in-out infinite mic-pulse}.chat__mic-btn--listening:hover{background:#d96600}@keyframes mic-pulse{0%,to{opacity:1;transform:scale(1)}50%{opacity:.85;transform:scale(1.06)}}.msg__feedback{align-items:center;gap:8px;padding-top:8px;display:flex}.msg__feedback-btn{width:24px;height:24px;color:var(--s2-content-secondary);cursor:pointer;transition:color var(--s2-transition-default), background var(--s2-transition-default);background:0 0;border:none;border-radius:7px;flex-shrink:0;justify-content:center;align-items:center;padding:4px;display:inline-flex}.msg__feedback-btn:hover{color:var(--s2-content-default);background:var(--s2-bg-elevated)}.msg__feedback-btn svg{width:16px;height:16px}.theme-light .msg__content a{color:#1e66f5}.theme-light .msg__content a:hover{color:#1444b0}.theme-light .msg__content a:visited{color:#1e66f5}.tool-call{font-size:var(--s2-font-size-75);--tool-status-color:var(--s2-gray-500);padding:0}.tool-call--running{--tool-status-color:#e6a23c}.tool-call--success{--tool-status-color:var(--s2-positive)}.tool-call--error{--tool-status-color:var(--s2-negative)}.tool-call--other{--tool-status-color:var(--s2-accent)}.tool-call summary{cursor:pointer;background:var(--s2-bg-layer-1);color:var(--s2-content-secondary);font-weight:400;font-size:var(--s2-font-size-75);transition:background var(--s2-transition-default);border-radius:8px;align-items:center;gap:8px;padding:8px 12px;line-height:1.4;list-style:none;display:flex}.tool-call summary:hover{background:var(--s2-bg-layer-2)}.tool-call summary::-webkit-details-marker{display:none}.tool-call__header{cursor:pointer;align-items:center;gap:8px;width:100%;display:flex}.tool-call__icon{width:16px;height:16px;color:var(--s2-content-secondary);flex-shrink:0;justify-content:center;align-items:center;display:inline-flex}.tool-call__icon svg{width:14px;height:14px;display:block}.tool-call__name{color:var(--s2-content-secondary);font-weight:500;font-family:var(--s2-font-family);font-size:var(--s2-font-size-75);flex-shrink:0}.tool-call__preview{color:var(--s2-content-tertiary);font-size:var(--s2-font-size-75);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--s2-font-mono);flex:1;overflow:hidden}.tool-call__status{background:var(--tool-status-color);border-radius:50%;flex-shrink:0;width:7px;height:7px;margin-left:auto}.tool-call__status--running{animation:1.2s ease-in-out infinite tool-status-pulse}@keyframes tool-status-pulse{0%,to{opacity:.4}50%{opacity:1}}.tool-call--stale .tool-call__status{opacity:.5}.tool-call--stale .tool-call__status--running{animation:none}.tool-call-cluster{font-size:var(--s2-font-size-75);padding:0}.tool-call-cluster>summary{cursor:pointer;background:var(--s2-bg-layer-1);color:var(--s2-content-secondary);font-weight:500;font-size:var(--s2-font-size-75);transition:background var(--s2-transition-default);border-radius:8px;align-items:center;gap:8px;padding:8px 12px;line-height:1.4;list-style:none;display:flex}.tool-call-cluster>summary:hover{background:var(--s2-bg-layer-2)}.tool-call-cluster>summary::-webkit-details-marker{display:none}.tool-call-cluster__dots{flex-wrap:wrap;flex-shrink:0;justify-content:flex-end;align-items:center;gap:4px;max-width:50%;margin-left:auto;display:inline-flex}.tool-call-cluster__dot{margin-left:0}.tool-call-cluster__body{border-left:2px solid var(--s2-border-subtle);flex-direction:column;gap:2px;margin-top:4px;margin-left:10px;padding-left:18px;display:flex}.tool-call-cluster.tool-call--stale>summary .tool-call__status{opacity:.5}.tool-call-cluster.tool-call--stale>summary .tool-call__status--running{animation:none}.tool-call__details{margin-top:2px;padding:8px 12px 12px 30px}.tool-call__body{flex-direction:column;gap:8px;display:flex}.tool-call__yaml{border-radius:var(--s2-radius-s);background:var(--s2-bg-sunken);color:var(--s2-content-default);font-family:var(--s2-font-mono);font-size:var(--s2-font-size-75);white-space:pre;max-height:320px;margin:0;padding:10px 12px;line-height:1.55;overflow-x:auto}.tool-call__yaml-key{color:var(--slicc-scoop-blue);font-weight:600}.tool-call__yaml-string{color:var(--s2-content-default)}.tool-call__yaml-scalar{color:var(--s2-content-tertiary)}.tool-call__yaml-null{color:var(--s2-content-tertiary);font-style:italic}.tool-call__result{border-radius:var(--s2-radius-s);background:var(--s2-bg-sunken);color:var(--s2-content-secondary);font-family:var(--s2-font-mono);font-size:var(--s2-font-size-75);white-space:pre-wrap;word-break:break-word;max-height:240px;margin:0;padding:10px 12px;line-height:1.5;overflow-y:auto}.tool-call__result--error{color:var(--s2-negative);background:color-mix(in oklch, var(--s2-negative) 10%, var(--s2-bg-sunken))}.tool-call__terminal{border-radius:var(--s2-radius-s);color:#e6e6e6;font-family:var(--s2-font-mono);font-size:var(--s2-font-size-75);background:#0d0d0f;border:1px solid #ffffff0f;padding:12px 14px;line-height:1.55;overflow:hidden}.tool-call__terminal-prompt{color:#f5f5f5;word-break:break-word;flex-wrap:wrap;align-items:flex-start;gap:8px;display:flex}.tool-call__terminal-sigil{color:#50d79a;flex-shrink:0;font-weight:600}.tool-call__terminal-cmd{white-space:pre-wrap;word-break:break-word}.tool-call__terminal-output{color:#c8c8c8;font-family:var(--s2-font-mono);font-size:var(--s2-font-size-75);white-space:pre-wrap;word-break:break-word;background:0 0;max-height:280px;margin:8px 0 0;padding:0;overflow-y:auto}.tool-call__terminal-output--error{color:#f38ba8}.tool-call__terminal-pending{color:gray;letter-spacing:2px;margin-top:8px}.tool-call__diff-path{font-family:var(--s2-font-mono);font-size:var(--s2-font-size-75);color:var(--s2-content-secondary);padding:4px 0}.tool-call__diff{font-family:var(--s2-font-mono);font-size:var(--s2-font-size-75);white-space:pre-wrap;word-break:break-word;background:0 0;max-height:320px;margin:0;padding:0;line-height:1.55;overflow:hidden auto}.tool-call__diff-del,.tool-call__diff-add{white-space:pre-wrap;word-break:break-word;border-radius:2px;padding:1px 6px;display:block}.tool-call__diff-del{background:color-mix(in oklch, var(--s2-negative) 15%, transparent);color:var(--s2-negative)}.tool-call__diff-add{background:color-mix(in oklch, var(--s2-positive) 18%, transparent);color:var(--s2-positive)}.tool-call__screenshot{border-radius:var(--s2-radius-default);max-width:100%;max-height:200px;margin-top:var(--s2-spacing-50);cursor:pointer;border:1px solid var(--s2-border-subtle);transition:border-color var(--s2-transition-default)}.tool-call__screenshot:hover{border-color:var(--slicc-cone)}.tool-call__ui{margin-top:8px}.lick{width:100%;max-width:560px;font-size:var(--s2-font-size-75);align-self:flex-end;padding:0}.lick summary{cursor:pointer;background:var(--s2-bg-layer-1);color:var(--s2-content-secondary);border:1px solid var(--s2-border-subtle);transition:background var(--s2-transition-default);border-radius:10px;flex-direction:row;align-items:center;gap:8px;padding:8px 12px;list-style:none;display:flex}.lick summary:hover{background:var(--s2-bg-layer-2)}.lick summary::-webkit-details-marker{display:none}.lick__header{cursor:pointer;justify-content:flex-start;align-items:center;gap:8px;width:100%;display:flex}.lick__type{color:var(--s2-content-secondary);font-weight:500;font-size:var(--s2-font-size-75);flex-shrink:0}.lick__preview{color:var(--s2-content-tertiary);font-size:var(--s2-font-size-75);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-family:var(--s2-font-mono);flex:1;overflow:hidden}.lick__icon{width:16px;height:16px;color:var(--s2-content-secondary);flex-shrink:0;order:99;justify-content:center;align-items:center;margin-left:auto;display:inline-flex}.lick__icon svg{width:14px;height:14px;display:block}.lick__details{border-radius:var(--s2-radius-s);background:var(--s2-bg-sunken);color:var(--s2-content-secondary);font-size:var(--s2-font-size-75);word-break:break-word;margin-top:6px;padding:12px 14px;line-height:1.55}.lick__details>:first-child{margin-top:0}.lick__details>:last-child{margin-bottom:0}.lick__details p,.lick__details ul,.lick__details ol{margin:.5em 0}.lick__details ul,.lick__details ol{padding-left:1.4em}.lick__details pre{font-size:var(--s2-font-size-75);font-family:var(--s2-font-mono);white-space:pre;background:0 0;border:0;max-height:320px;margin:0;padding:0;overflow:auto}.msg__content p,.msg__content ul,.msg__content ol,.msg__content table,.msg__content blockquote{margin:.45em 0}.msg__content h1,.msg__content h2,.msg__content h3,.msg__content h4,.msg__content h5,.msg__content h6{margin:1.2em 0 .35em;font-weight:700}.msg__content>:first-child{margin-top:0}.msg__content>:last-child{margin-bottom:0}.msg__content h1{font-size:22px}.msg__content h2{font-size:var(--s2-font-size-300)}.msg__content h3{font-size:var(--s2-font-size-200)}.msg__content ul,.msg__content ol{padding-left:1.4em}.msg__content table{border-collapse:collapse;font-size:var(--s2-font-size-75)}.msg__content th,.msg__content td{border:1px solid var(--s2-border-subtle);padding:var(--s2-spacing-50) var(--s2-spacing-200);text-align:left}.msg__content th{background:var(--s2-bg-layer-2);font-weight:700}.msg__content blockquote{border-left:3px solid var(--slicc-cone);padding-left:var(--s2-spacing-200);color:var(--s2-content-secondary)}.msg__content a{color:#82aaff;text-decoration:none}.msg__content a:hover{color:#a0c4ff;text-decoration:underline}.msg__content a:visited{color:#82aaff}.msg pre{background:var(--s2-bg-sunken);padding:var(--s2-spacing-200);border-radius:var(--s2-radius-default);margin:var(--s2-spacing-100) 0;font-size:12px;font-family:var(--s2-font-mono);white-space:pre-wrap;border:1px solid var(--s2-border-subtle);overflow-x:auto}.msg code{font-family:var(--s2-font-mono);font-size:12px}.msg :not(pre)>code{background:var(--s2-gray-200);border-radius:var(--s2-radius-s);padding:2px 6px;font-size:.9em}.tok-keyword{color:#d19afc}.tok-string{color:#87d68d}.tok-number{color:#f5a76c}.tok-comment{color:var(--s2-gray-500);font-style:italic}.tok-punct{color:#7cc5e9}.tok-fn{color:#7ea8f8}.panel-header{padding:var(--s2-spacing-100) var(--s2-spacing-300);background:var(--s2-bg-layer-1);border-bottom:1px solid var(--s2-border-subtle);font-size:var(--s2-font-size-50);color:var(--s2-content-tertiary);letter-spacing:.05em;text-transform:uppercase;flex-shrink:0;align-items:center;font-weight:700;display:flex}.terminal-panel{background:var(--s2-bg-layer-1);flex-direction:column;flex:1;min-height:0;display:flex;position:relative}.terminal-panel__view{background:var(--s2-bg-sunken);flex-direction:column;flex:1;min-height:0;padding-bottom:5px;display:flex;overflow:hidden}.terminal-panel__mount{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.terminal-panel__terminal-host{flex:1;min-height:0;padding:8px;overflow:hidden}.terminal-panel__terminal-host .xterm{padding:0}.terminal-panel__terminal-host .xterm-viewport{background-color:var(--s2-bg-sunken)!important}.terminal-panel__terminal-host .xterm-viewport::-webkit-scrollbar{width:6px}.terminal-panel__terminal-host .xterm-viewport::-webkit-scrollbar-thumb{background:var(--s2-gray-300);border-radius:3px}.terminal-panel__preview{min-height:0;padding:var(--s2-spacing-200);background:var(--s2-bg-sunken);flex:1;display:none;overflow:auto}.terminal-panel__preview.terminal-panel__preview--visible{flex-direction:column;display:flex}.terminal-panel__preview-item{gap:var(--s2-spacing-100);flex-direction:column;display:flex}.terminal-panel__preview-item+.terminal-panel__preview-item{margin-top:var(--s2-spacing-200)}.terminal-panel__preview-label{color:var(--s2-content-tertiary);font-size:var(--s2-font-size-50);font-family:var(--s2-font-mono)}.terminal-panel__preview-media{object-fit:contain;border-radius:var(--s2-radius-default);background:var(--s2-bg-sunken);border:1px solid var(--s2-border-subtle);width:100%;max-width:100%;max-height:min(100%,520px);display:block}.terminal-panel__empty-state{min-height:0;padding:var(--s2-spacing-400);color:var(--s2-content-disabled);font-size:var(--s2-font-size-75);flex:1;justify-content:center;align-items:center;display:flex}.file-browser__header{height:32px;min-height:32px;padding:0 var(--s2-spacing-200);border-bottom:1px solid var(--s2-border-subtle);align-items:center;gap:var(--s2-spacing-100);flex-shrink:0;display:flex}.file-browser__header-title{font-size:var(--s2-font-size-50);color:var(--s2-content-tertiary);letter-spacing:.05em;text-transform:uppercase;flex:1;font-weight:700}.file-browser__header-btn{color:var(--s2-content-tertiary);cursor:pointer;border-radius:var(--s2-radius-s);width:24px;height:24px;transition:background var(--s2-transition-default), color var(--s2-transition-default);background:0 0;border:none;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:flex}.file-browser__header-btn:hover{background:var(--s2-gray-200);color:var(--s2-content-default)}.file-browser__header-btn svg{width:14px;height:14px}.file-browser__header-btn--active{color:var(--s2-content-default);background:var(--s2-gray-300)}.file-browser__header-btn--active:hover{background:var(--s2-gray-300)}.file-browser__header-btn:disabled{color:var(--s2-content-disabled);cursor:default}.file-browser__header-btn:disabled:hover{color:var(--s2-content-disabled);background:0 0}.file-browser{flex-direction:column;flex:1;min-height:0;display:flex}.file-browser__body{min-height:0;padding:var(--s2-spacing-50) 0;font-family:var(--s2-font-mono);font-size:var(--s2-font-size-75);flex:1;overflow-y:auto}.file-browser__item{align-items:center;gap:var(--s2-spacing-50);padding:3px var(--s2-spacing-100);color:var(--s2-content-default);white-space:nowrap;text-overflow:ellipsis;border-radius:var(--s2-radius-s);margin:0 var(--s2-spacing-50);transition:background var(--s2-transition-default);display:flex;overflow:hidden}.file-browser__item:hover{background:var(--s2-bg-elevated)}.file-browser__item--selected{background:var(--s2-bg-elevated);box-shadow:inset 2px 0 0 var(--s2-accent)}.file-browser__item--selected:hover{background:var(--s2-bg-elevated)}.file-browser__item--selected.file-browser__item--copy-flash{background:color-mix(in srgb, var(--s2-positive) 20%, transparent)}.file-browser__arrow{width:12px;color:var(--s2-content-tertiary);flex-shrink:0;justify-content:center;align-items:center;display:flex}.file-browser__icon{color:var(--s2-content-tertiary);flex-shrink:0;align-items:center;display:flex}.file-browser__name{text-overflow:ellipsis;overflow:hidden}.file-browser__size{color:var(--s2-content-tertiary);font-size:var(--s2-font-size-50);padding-left:var(--s2-spacing-100);flex-shrink:0;margin-left:auto}.file-browser__action-btn{color:var(--s2-content-tertiary);cursor:pointer;padding:2px var(--s2-spacing-75);border-radius:var(--s2-radius-pill);font-size:9px;line-height:1.2;font-family:var(--s2-font-mono);letter-spacing:.05em;transition:all var(--s2-transition-default);opacity:0;background:0 0;border:none;flex-shrink:0;font-weight:600}.file-browser__item:hover .file-browser__action-btn{opacity:1}.file-browser__action-btn:hover{background:var(--s2-accent);color:#fff}.file-browser__action-btn:active{transform:scale(.92)}.file-browser__action-btn:disabled{opacity:0;cursor:not-allowed}.memory-panel{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.memory-panel__body{min-height:0;padding:var(--s2-spacing-100);font-family:var(--s2-font-mono);font-size:var(--s2-font-size-75);flex:1;height:100%;overflow-y:auto}.memory-panel__section{margin-bottom:var(--s2-spacing-300)}.memory-panel__section-header{font-weight:700;font-family:var(--s2-font-family);color:var(--slicc-cone);margin-bottom:var(--s2-spacing-100);padding-bottom:var(--s2-spacing-50);border-bottom:1px solid var(--s2-border-subtle);font-size:var(--s2-font-size-75)}.memory-panel__memory-content{white-space:pre-wrap;color:var(--s2-content-default);background:var(--s2-bg-sunken);padding:var(--s2-spacing-100);border-radius:var(--s2-radius-default);line-height:1.5}.mini-tabs{gap:var(--s2-spacing-100);padding:var(--s2-spacing-200) var(--s2-spacing-300);flex-shrink:0;align-items:center;display:flex;overflow:hidden}.mini-tabs__scroll{gap:var(--s2-spacing-100);scrollbar-width:none;flex:1;align-items:center;min-width:0;display:flex;overflow-x:auto}.mini-tabs__scroll::-webkit-scrollbar{display:none}.mini-tabs__tab{padding:7px var(--s2-spacing-300);background:var(--s2-gray-100);color:var(--s2-content-default);font-size:14px;font-weight:500;font-family:var(--s2-font-family);letter-spacing:0;cursor:pointer;white-space:nowrap;border-radius:var(--s2-radius-default);transition:color var(--s2-transition-default), background var(--s2-transition-default), border-color var(--s2-transition-default);align-items:center;gap:var(--s2-spacing-75);border:1px solid #0000;flex:none;height:32px;line-height:18px;display:inline-flex;position:relative}.mini-tabs__tab:after{display:none}.mini-tabs__tab:hover{color:var(--s2-content-default);background:var(--s2-gray-300);border-color:#0000}.mini-tabs__tab--active{color:var(--s2-gray-25);background:var(--s2-gray-800);border-color:var(--s2-gray-800)}.mini-tabs__tab--active:hover{background:var(--s2-gray-800);border-color:var(--s2-gray-800);color:var(--s2-gray-25)}.mini-tabs__tab-badge{background:color-mix(in srgb, var(--s2-accent) 20%, #fff);min-width:18px;height:18px;color:var(--s2-accent);border-radius:999px;justify-content:center;align-items:center;padding:0 6px;font-size:11px;font-weight:700;line-height:1;display:inline-flex}.mini-tabs__tab--active .mini-tabs__tab-badge{background:color-mix(in srgb, var(--s2-gray-25) 18%, transparent);color:var(--s2-gray-25)}.mini-tabs__tab:focus-visible{outline:2px solid var(--s2-accent);outline-offset:2px;border-radius:var(--s2-radius-default)}.mini-tabs__tab:disabled{color:var(--s2-content-disabled);cursor:not-allowed}.mini-tabs__tab--add{color:var(--s2-content-tertiary);background:0 0;border-color:#0000;font-size:16px}.mini-tabs__tab--add:hover{border-color:var(--s2-gray-200);background:var(--s2-gray-75);color:var(--s2-content-default)}.mini-tabs__tab--icon{width:32px;height:32px;color:var(--s2-content-default);background:0 0;border-color:#0000;justify-content:center;padding:0}.mini-tabs__tab--icon svg{flex-shrink:0;width:16px;height:16px}.mini-tabs__tab--icon:hover{background:var(--s2-gray-200);border-color:#0000}.mini-tabs__tab--icon.mini-tabs__tab--active,.mini-tabs__tab--icon.mini-tabs__tab--active:hover{background:var(--s2-gray-800);color:var(--s2-gray-25)}.mini-tabs__tab--dimmed{opacity:.3}.mini-tabs__tab--dimmed:hover{opacity:.65}.mini-tabs__separator{background:var(--s2-border-subtle);width:1px;height:20px;margin:0 var(--s2-spacing-75);flex-shrink:0}.mini-tabs__tab--fullpage{color:var(--s2-content-tertiary);background:0 0;border-color:#0000;justify-content:center;width:32px;margin-left:auto;padding:0}.mini-tabs__tab--fullpage:hover{background:var(--s2-gray-75);color:var(--s2-content-default)}.mini-tabs__tab--fullpage svg{flex-shrink:0}.tab-bar{background:var(--s2-bg-layer-1);border-bottom:1px solid var(--s2-border-subtle);flex-shrink:0;display:flex}.tab-bar__tab{padding:var(--s2-spacing-100) 0;color:var(--s2-content-tertiary);font-size:var(--s2-font-size-75);font-weight:600;font-family:var(--s2-font-family);cursor:pointer;text-align:center;transition:color var(--s2-transition-default), border-color var(--s2-transition-default);letter-spacing:.02em;background:0 0;border:none;border-bottom:2px solid #0000;flex:1;justify-content:center;align-items:center;gap:6px;display:flex}.tab-bar__tab-badge{background:color-mix(in srgb, var(--s2-accent) 18%, transparent);min-width:18px;height:18px;color:var(--s2-accent);border-radius:999px;justify-content:center;align-items:center;padding:0 6px;font-size:11px;font-weight:700;line-height:1;display:inline-flex}.tab-bar__tab:hover{color:var(--s2-content-default)}.tab-bar__tab-close{border-radius:var(--s2-radius-s);width:16px;height:16px;color:var(--s2-content-tertiary);opacity:.6;justify-content:center;align-items:center;margin-left:6px;font-size:11px;line-height:1;display:inline-flex}.tab-bar__tab-close:hover{opacity:1;color:var(--s2-negative);background:color-mix(in srgb, var(--s2-negative) 10%, transparent)}.tab-bar__tab--active{color:var(--s2-content-default);border-bottom-color:var(--s2-accent)}.tab-bar__tab--active .tab-bar__tab-badge{background:color-mix(in srgb, var(--s2-accent) 22%, transparent);color:var(--s2-content-default)}.tab-content{flex-direction:column;flex:1;min-height:0;display:flex}.tab-content__panel{flex-direction:column;flex:1;min-height:0;display:flex;overflow:hidden}.mini-tabs__tab--utility{color:var(--s2-content-tertiary);background:0 0;border-color:#0000;flex:none;justify-content:center;width:28px;height:28px;padding:0}.mini-tabs__tab--utility:hover{background:var(--s2-gray-200);color:var(--s2-content-default);border-color:#0000}.mini-tabs__tab--utility svg{flex-shrink:0;width:14px;height:14px}.mini-tabs__tab-close{border-radius:var(--s2-radius-s);width:16px;height:16px;color:var(--s2-content-tertiary);justify-content:center;align-items:center;margin-left:6px;font-size:12px;line-height:1;display:inline-flex}.mini-tabs__tab-close:hover{color:var(--s2-negative);background:color-mix(in srgb, var(--s2-negative) 10%, transparent)}.rail{background:var(--s2-bg-layer-1);border-left:1px solid var(--s2-border-subtle);width:48px;padding:var(--s2-spacing-200) var(--s2-spacing-100);gap:var(--s2-spacing-100);flex-direction:column;flex-shrink:0;display:flex}.rail__section{gap:var(--s2-spacing-100);flex-direction:column;align-items:center;display:flex}.rail__section--top{flex:1;min-height:0;overflow:hidden}.rail__section--bottom{flex:none}.rail__section--header{height:var(--uxc-thread-header-height);border-bottom:1px solid var(--s2-border-subtle);margin-bottom:var(--s2-spacing-100);flex:none;justify-content:center;align-items:center;display:flex}.rail__section--header .header__avatar{margin:0 auto}.rail:has(.rail__section--header){padding-top:0}.rail__item{width:32px;height:32px;color:var(--s2-content-default);border-radius:var(--s2-radius-default);cursor:pointer;transition:background var(--s2-transition-default), color var(--s2-transition-default), border-color var(--s2-transition-default);background:0 0;border:1px solid #0000;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex;position:relative}.rail__item svg{z-index:1;flex-shrink:0;width:16px;height:16px;position:relative}slicc-press-button{display:inline-flex}.slicc-press-btn__btn{appearance:none;font:inherit;color:inherit;cursor:inherit;border-radius:inherit;background:0 0;border:none;justify-content:center;align-items:center;width:100%;height:100%;margin:0;padding:0;display:inline-flex;position:relative}.slicc-press-btn__press-layer{border-radius:inherit;pointer-events:none;z-index:0;position:absolute;inset:0;overflow:hidden}.slicc-press-btn__btn>:not(.slicc-press-btn__press-layer){z-index:1;position:relative}.slicc-press-btn__press{background:var(--s2-accent);opacity:.85;pointer-events:none;will-change:width, height;border-radius:50%;transition-property:width,height;transition-timing-function:cubic-bezier(.4,0,.2,1);position:absolute;transform:translate(-50%,-50%)}.rail__item--active .slicc-press-btn__press{background:var(--s2-accent);opacity:1}.rail__item:hover{background:var(--s2-gray-200)}.rail__item--active,.rail__item--active:hover{background:var(--s2-gray-800);color:var(--s2-gray-25)}.rail__item--active img{filter:brightness(0)}:root.theme-light .rail__item--active img{filter:brightness(0)invert()}.rail__item:focus-visible{outline:2px solid var(--s2-accent);outline-offset:2px}.rail__item--add{color:var(--s2-content-tertiary)}.rail__item--add:hover{color:var(--s2-content-default);background:var(--s2-gray-75)}.rail__item--attention{color:var(--s2-accent);animation:1.6s ease-in-out infinite rail-item-attention}.rail__item--attention:hover{background:var(--s2-gray-200);animation:none}.rail__item--attention:after{content:"";background:var(--s2-accent);width:6px;height:6px;box-shadow:0 0 0 2px var(--s2-bg-layer-1);pointer-events:none;z-index:2;border-radius:50%;position:absolute;top:4px;right:4px}@keyframes rail-item-attention{0%,to{opacity:1;transform:scale(1)}50%{opacity:.85;transform:scale(1.06)}}.rail-content{border-left:1px solid var(--s2-border-subtle);background:var(--s2-bg-base);flex-direction:column;flex:none;width:360px;min-width:280px;max-width:50vw;display:flex;overflow:hidden}.rail-content--collapsed{display:none!important}.layout:has(.rail-content--collapsed) .layout__divider--vertical,.layout--rail-fullpage .layout__left,.layout--rail-fullpage .layout__divider--vertical,.layout--rail-fullpage .layout__scoops{display:none}.layout--rail-fullpage .rail-content{flex:1;width:auto;max-width:none}.dialog-overlay{z-index:100;backdrop-filter:blur(4px);background:#0000008c;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.dialog{background:var(--s2-bg-layer-2);border-radius:var(--s2-radius-xl);padding:var(--s2-spacing-500);width:440px;max-width:90vw;box-shadow:var(--s2-shadow-elevated);border:1px solid var(--s2-border-subtle)}.dialog__title{font-size:var(--s2-font-size-300);color:var(--s2-content-default);margin-bottom:var(--s2-spacing-100);font-weight:700}.dialog__desc{font-size:var(--s2-font-size-75);color:var(--s2-content-secondary);margin-bottom:var(--s2-spacing-300);line-height:1.5}.dialog__input{width:100%;padding:var(--s2-spacing-100) var(--s2-spacing-200);border-radius:var(--s2-radius-default);border:1px solid var(--s2-border-default);background:var(--s2-bg-sunken);color:var(--s2-content-default);font-family:var(--s2-font-mono);font-size:var(--s2-font-size-100);margin-bottom:var(--s2-spacing-300);transition:border-color var(--s2-transition-default);outline:none}.dialog__input:focus{border-color:var(--s2-accent)}.dialog__btn{border-radius:var(--s2-radius-pill);background:var(--s2-accent);color:#fff;width:100%;font-size:var(--s2-font-size-100);font-weight:600;font-family:var(--s2-font-family);cursor:pointer;transition:background var(--s2-transition-default), transform var(--s2-transition-default);border:none;padding:10px}.dialog__btn:hover{background:var(--s2-accent-hover)}.dialog__btn:active{transform:scale(.98)}.dialog__btn:disabled{opacity:.4;cursor:not-allowed}.dialog__btn--secondary{border:1px solid var(--s2-border-default);color:var(--s2-content-default);background:0 0}.dialog__btn--secondary:hover{background:var(--s2-gray-200)}.sprinkle-content{padding:var(--s2-spacing-200)}.sprinkle-heading{font-size:var(--s2-font-size-300);color:var(--s2-gray-900);margin:0 0 var(--s2-spacing-100);letter-spacing:0;font-weight:700;line-height:1.3}.sprinkle-heading--m{font-size:var(--s2-font-size-200)}.sprinkle-heading--s{font-size:var(--s2-font-size-100)}.sprinkle-label{font-size:var(--s2-font-size-50);text-transform:uppercase;letter-spacing:.06em;color:var(--s2-gray-600);margin:0;font-weight:600;line-height:1.3}.sprinkle-body{font-size:var(--s2-font-size-100);color:var(--s2-content-default);font-weight:400;line-height:1.5}.sprinkle-detail{font-size:var(--s2-font-size-75);color:var(--s2-gray-600);font-weight:500;line-height:1.3}.sprinkle-icon{stroke-width:2px;vertical-align:middle;width:16px;height:16px;display:inline-block}.sprinkle-icon svg{width:100%;height:100%;display:block}.sprinkle-icon--xs{width:12px;height:12px}.sprinkle-icon--s{width:14px;height:14px}.sprinkle-icon--m{width:16px;height:16px}.sprinkle-icon--l{width:20px;height:20px}.sprinkle-icon--xl{width:24px;height:24px}.sprinkle-btn{justify-content:center;align-items:center;gap:var(--s2-spacing-75);border:1px solid var(--s2-gray-200);border-radius:var(--s2-radius-xl);background:var(--s2-gray-50);height:32px;color:var(--s2-gray-800);font-size:var(--s2-font-size-100);font-weight:700;font-family:var(--s2-font-family);cursor:default;box-shadow:var(--s2-shadow-container);transition:background var(--s2-transition-default), border-color var(--s2-transition-default), transform var(--s2-transition-default);padding:0 16px;display:inline-flex}.sprinkle-btn:hover{background:var(--s2-gray-100)}.sprinkle-btn:active{transform:scale(.98)}.sprinkle-btn:focus-visible{outline:2px solid var(--s2-border-focus);outline-offset:2px}.sprinkle-btn:disabled,.sprinkle-btn[disabled]{opacity:.4;pointer-events:none}.sprinkle-btn--primary{background:var(--s2-accent);color:#fff;border-radius:var(--s2-radius-pill);box-shadow:none;border-color:#0000}.sprinkle-btn--primary:hover{background:var(--s2-accent-hover)}.sprinkle-btn--primary:active{background:var(--s2-accent-down);transform:scale(.98)}.sprinkle-btn--secondary{background:var(--s2-gray-50);border-color:var(--s2-gray-200);color:var(--s2-gray-800)}.sprinkle-btn--secondary:hover{background:var(--s2-gray-100)}.sprinkle-btn--negative{background:var(--s2-negative);color:var(--s2-gray-25);border-radius:var(--s2-radius-pill);box-shadow:none;border-color:#0000}.sprinkle-btn--negative:hover{background:color-mix(in srgb, var(--s2-negative) 85%, #000)}.sprinkle-btn--quiet{box-shadow:none;color:var(--s2-gray-800);background:0 0;border-color:#0000}.sprinkle-btn--quiet:hover{background:var(--s2-gray-100)}.sprinkle-btn-group{gap:var(--s2-spacing-100);display:inline-flex}.sprinkle-badge{white-space:nowrap;background:var(--s2-gray-800);color:var(--s2-gray-25);border-radius:8px;align-items:center;gap:4px;padding:4px 8px;font-size:12px;font-weight:700;line-height:16px;display:inline-flex}.sprinkle-badge--positive{background:var(--s2-positive);color:var(--s2-gray-25)}.sprinkle-badge--negative{background:var(--s2-negative);color:var(--s2-gray-25)}.sprinkle-badge--notice{background:var(--s2-notice);color:var(--s2-gray-25)}.sprinkle-badge--informative{background:var(--s2-informative);color:#fff}.sprinkle-badge--accent{background:var(--s2-accent);color:#fff}.sprinkle-badge--subtle{background:var(--uxc-neutral-subtle-bg);color:var(--s2-gray-700)}.sprinkle-badge--subtle.sprinkle-badge--positive{background:var(--uxc-positive-subtle-bg);color:var(--uxc-positive-subtle-text)}.sprinkle-badge--subtle.sprinkle-badge--negative{background:var(--uxc-negative-subtle-bg);color:var(--uxc-negative-subtle-text)}.sprinkle-badge--subtle.sprinkle-badge--notice{background:var(--uxc-notice-subtle-bg);color:var(--uxc-notice-subtle-text)}.sprinkle-badge--subtle.sprinkle-badge--informative,.sprinkle-badge--subtle.sprinkle-badge--accent{background:var(--uxc-accent-subtle-bg);color:var(--uxc-accent-subtle-text)}.sprinkle-badge--yellow{background:var(--uxc-yellow-subtle-bg);color:var(--uxc-yellow-subtle-text)}.sprinkle-badge--purple{background:var(--uxc-purple-subtle-bg);color:var(--uxc-purple-subtle-text)}.sprinkle-badge--cyan{background:var(--uxc-cyan-subtle-bg);color:var(--uxc-cyan-subtle-text)}.sprinkle-badge--magenta{background:var(--uxc-magenta-subtle-bg);color:var(--uxc-magenta-subtle-text)}.sprinkle-badge--indigo{background:var(--uxc-indigo-subtle-bg);color:var(--uxc-indigo-subtle-text)}.sprinkle-badge--gray{background:var(--uxc-gray-subtle-bg);color:var(--uxc-gray-subtle-text)}.sprinkle-badge--outline{color:var(--s2-content-secondary);box-shadow:inset 0 0 0 1px var(--s2-border-default);background:0 0}.sprinkle-badge--outline.sprinkle-badge--positive{color:var(--s2-positive);box-shadow:inset 0 0 0 1px var(--s2-positive)}.sprinkle-badge--outline.sprinkle-badge--negative{color:var(--s2-negative);box-shadow:inset 0 0 0 1px var(--s2-negative)}.sprinkle-badge--outline.sprinkle-badge--notice{color:var(--s2-notice);box-shadow:inset 0 0 0 1px var(--s2-notice)}.sprinkle-badge--outline.sprinkle-badge--informative{color:var(--s2-informative);box-shadow:inset 0 0 0 1px var(--s2-informative)}.sprinkle-chip{border:1px solid var(--s2-gray-200);border-radius:var(--s2-radius-pill);font-size:var(--s2-font-size-75);color:var(--s2-gray-800);cursor:default;transition:background var(--s2-transition-default);background:#fff;align-items:center;gap:6px;padding:6px 12px;font-weight:500;display:inline-flex}.sprinkle-chip:hover{background:var(--s2-gray-50)}.sprinkle-chip svg{flex-shrink:0;width:14px;height:14px}.sprinkle-status-light{align-items:center;gap:var(--s2-spacing-75);font-size:var(--s2-font-size-75);color:var(--s2-content-default);display:inline-flex}.sprinkle-status-light:before{content:"";background:var(--s2-content-tertiary);border-radius:50%;flex-shrink:0;width:8px;height:8px}.sprinkle-status-light--positive:before{background:var(--s2-positive)}.sprinkle-status-light--negative:before{background:var(--s2-negative)}.sprinkle-status-light--notice:before{background:var(--s2-notice)}.sprinkle-status-light--informative:before{background:var(--s2-informative)}.sprinkle-status-light--m{font-size:var(--s2-font-size-100);color:var(--s2-gray-600)}.sprinkle-status-light--m:before{width:10px;height:10px}.sprinkle-card{background:var(--s2-gray-25);border:1px solid var(--s2-gray-300);border-radius:var(--s2-radius-xl);padding:var(--s2-spacing-400);box-shadow:var(--s2-shadow-container);transition:box-shadow var(--s2-transition-default)}.sprinkle-card:hover{box-shadow:var(--s2-shadow-elevated)}.sprinkle-stat-card{background:var(--s2-gray-25);border:1px solid var(--s2-gray-300);border-radius:var(--s2-radius-xl);padding:var(--s2-spacing-200) var(--s2-spacing-300);text-align:center;box-shadow:var(--s2-shadow-container);transition:box-shadow var(--s2-transition-default)}.sprinkle-stat-card:hover{box-shadow:var(--s2-shadow-elevated)}.sprinkle-stat-card .value{font-size:var(--s2-font-size-500);color:var(--s2-content-default);font-weight:700;line-height:1.2}.sprinkle-stat-card .label{font-size:var(--s2-font-size-75);color:var(--s2-gray-600);margin-top:var(--s2-spacing-50);font-weight:500}.sprinkle-action-card{background:var(--s2-gray-25);border:1px solid var(--s2-gray-200);border-radius:var(--s2-radius-xl);box-shadow:var(--s2-shadow-container);flex-direction:column;display:flex;overflow:hidden}.sprinkle-action-card__header{color:var(--s2-gray-900);align-items:center;gap:12px;padding:16px 24px;font-size:16px;font-weight:700;line-height:1.3;display:flex}.sprinkle-action-card__header .sprinkle-badge{margin-left:auto}.sprinkle-action-card__icon{border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;width:40px;min-width:40px;height:40px;font-size:18px;display:flex}.sprinkle-action-card__icon--yellow{color:#9e6600;background:#fff197}.sprinkle-action-card__icon--blue{background:var(--uxc-accent-subtle-bg);color:var(--uxc-accent-subtle-text)}.sprinkle-action-card__icon--green{background:var(--uxc-positive-subtle-bg);color:var(--uxc-positive-subtle-text)}.sprinkle-action-card__icon--indigo{background:var(--uxc-indigo-subtle-bg);color:#5424db}.sprinkle-action-card__meta{color:var(--s2-gray-600);margin-top:2px;font-size:12px;font-weight:400}.sprinkle-action-card__header-actions{color:var(--s2-gray-800);align-items:center;gap:12px;margin-left:auto;font-size:12px;font-weight:500;display:flex}.sprinkle-action-card__header-actions a{color:var(--s2-gray-800);align-items:center;gap:4px;text-decoration:none;display:flex}.sprinkle-action-card__body{color:var(--s2-gray-700);padding:0 24px 16px;font-size:14px;line-height:1.5}.sprinkle-action-card__actions{border-top:1px solid var(--s2-gray-200);justify-content:flex-end;gap:8px;padding:12px 24px;display:flex}.sprinkle-list-item{border-top:1px solid var(--s2-gray-100);align-items:center;gap:16px;min-height:56px;padding:16px 24px;display:flex}.sprinkle-list-item__icon{background:var(--s2-gray-75);border-radius:8px;flex-shrink:0;justify-content:center;align-items:center;width:40px;min-width:40px;height:40px;font-size:16px;display:flex}.sprinkle-list-item__content{flex:1;min-width:0}.sprinkle-list-item__title{color:var(--s2-gray-900);align-items:center;gap:6px;font-size:14px;font-weight:700;line-height:1.3;display:flex}.sprinkle-list-item__subtitle{color:var(--s2-gray-600);margin-top:2px;font-size:14px;font-weight:400;line-height:1.5}.sprinkle-list-item__end{flex-shrink:0;align-items:center;gap:8px;display:flex}.sprinkle-table{border-collapse:collapse;border:1px solid var(--s2-gray-100);border-radius:var(--s2-radius-default);width:100%;font-size:14px;overflow:hidden}.sprinkle-table th{text-align:left;border-bottom:1px solid var(--s2-gray-100);color:var(--s2-gray-700);box-sizing:border-box;background:0 0;height:32px;padding:7px 16px;font-size:14px;font-weight:700;line-height:1.3}.sprinkle-table td{border-bottom:1px solid var(--s2-gray-100);color:var(--s2-content-default);box-sizing:border-box;padding:12px 16px;font-size:14px;line-height:1.5}.sprinkle-table tr:last-child td{border-bottom:none}.sprinkle-table tr:hover td{background:var(--s2-gray-50)}.sprinkle-task-group{background:var(--s2-gray-50);border-radius:var(--s2-radius-default);flex-direction:column;gap:8px;padding:16px;display:flex}.sprinkle-task-group__header{justify-content:space-between;align-items:center;display:flex}.sprinkle-task-group__title{color:var(--s2-gray-1000);align-items:center;gap:8px;font-size:16px;font-weight:700;display:flex}.sprinkle-task-group__title svg{flex-shrink:0;width:20px;height:20px}.sprinkle-task-group__meta{color:var(--s2-gray-600);align-items:center;gap:16px;font-size:12px;display:flex}.sprinkle-task-item{align-items:center;gap:8px;height:24px;padding-left:4px;font-size:14px;line-height:18px;display:flex}.sprinkle-task-item--done{color:var(--s2-gray-600)}.sprinkle-task-item--pending{color:var(--s2-gray-800)}.sprinkle-task-item__check{border:1.5px solid var(--s2-gray-400);border-radius:50%;flex-shrink:0;justify-content:center;align-items:center;width:16px;height:16px;display:flex}.sprinkle-task-item--done .sprinkle-task-item__check{background:var(--s2-positive);border-color:var(--s2-positive)}.sprinkle-task-item--done .sprinkle-task-item__check:after{content:"";border-bottom:1.5px solid #fff;border-left:1.5px solid #fff;width:8px;height:5px;transform:rotate(-45deg)translateY(-1px)}.sprinkle-progress-bar{gap:var(--s2-spacing-75);--_bar-color:var(--s2-accent);flex-direction:column;display:flex}.sprinkle-progress-bar--positive{--_bar-color:var(--s2-positive)}.sprinkle-progress-bar--negative{--_bar-color:var(--s2-negative)}.sprinkle-progress-bar--notice{--_bar-color:var(--s2-notice)}.sprinkle-progress-bar--informative{--_bar-color:var(--s2-informative)}.sprinkle-progress-bar__header{font-size:var(--s2-font-size-75);color:var(--s2-content-default);justify-content:space-between;align-items:baseline;display:flex}.sprinkle-progress-bar__header .label{font-weight:400}.sprinkle-progress-bar__header .value{color:var(--s2-gray-600);font-weight:400}.sprinkle-progress-bar__track{border-radius:var(--s2-radius-pill);background:var(--s2-gray-200);height:4px;position:relative;overflow:hidden}.sprinkle-progress-bar__track .fill{border-radius:var(--s2-radius-pill);background:var(--fill-color,var(--_bar-color,var(--s2-accent)));height:100%;transition:width .3s}.sprinkle-progress-bar__track:after{content:"";width:var(--progress,var(--value,0%));border-radius:var(--s2-radius-pill);background:var(--fill-color,var(--_bar-color,var(--s2-accent)));transition:width .3s;position:absolute;inset:0 auto 0 0}.sprinkle-progress-bar__track:has(>.fill):after{display:none}.sprinkle-progress-bar:not(:has(.sprinkle-progress-bar__track)){border-radius:var(--s2-radius-pill);background:var(--s2-gray-200);flex-direction:row;width:100%;height:4px;position:relative;overflow:hidden}.sprinkle-progress-bar:not(:has(.sprinkle-progress-bar__track))>.fill{border-radius:var(--s2-radius-pill);background:var(--fill-color,var(--_bar-color,var(--s2-accent)));height:100%;transition:width .3s}.sprinkle-progress-bar:not(:has(.sprinkle-progress-bar__track)):after{content:"";width:var(--progress,var(--value,0%));border-radius:var(--s2-radius-pill);background:var(--fill-color,var(--_bar-color,var(--s2-accent)));transition:width .3s;position:absolute;inset:0 auto 0 0}.sprinkle-progress-bar:not(:has(.sprinkle-progress-bar__track)):has(>.fill):after{display:none}.sprinkle-meter{gap:var(--s2-spacing-75);--_meter-color:var(--s2-informative);flex-direction:column;display:flex}.sprinkle-meter--positive{--_meter-color:var(--s2-positive)}.sprinkle-meter--notice{--_meter-color:var(--s2-notice)}.sprinkle-meter--negative{--_meter-color:var(--s2-negative)}.sprinkle-meter__header{font-size:var(--s2-font-size-75);color:var(--s2-content-default);justify-content:space-between;align-items:baseline;display:flex}.sprinkle-meter__header .label{font-weight:400}.sprinkle-meter__header .value{color:var(--s2-gray-600);font-weight:400}.sprinkle-meter__track{border-radius:var(--s2-radius-pill);background:var(--s2-gray-200);height:4px;position:relative;overflow:hidden}.sprinkle-meter__track .fill{border-radius:var(--s2-radius-pill);background:var(--fill-color,var(--_meter-color));height:100%;transition:width .3s}.sprinkle-meter__track:after{content:"";width:var(--progress,var(--value,0%));border-radius:var(--s2-radius-pill);background:var(--fill-color,var(--_meter-color));transition:width .3s;position:absolute;inset:0 auto 0 0}.sprinkle-meter__track:has(>.fill):after{display:none}.sprinkle-meter:not(:has(.sprinkle-meter__track)){border-radius:var(--s2-radius-pill);background:var(--s2-gray-200);flex-direction:row;width:100%;height:4px;position:relative;overflow:hidden}.sprinkle-meter:not(:has(.sprinkle-meter__track))>.fill{border-radius:var(--s2-radius-pill);background:var(--fill-color,var(--_meter-color));height:100%;transition:width .3s}.sprinkle-meter:not(:has(.sprinkle-meter__track)):after{content:"";width:var(--progress,var(--value,0%));border-radius:var(--s2-radius-pill);background:var(--fill-color,var(--_meter-color));transition:width .3s;position:absolute;inset:0 auto 0 0}.sprinkle-meter:not(:has(.sprinkle-meter__track)):has(>.fill):after{display:none}.sprinkle-kv-list{margin:0;padding:0;list-style:none}.sprinkle-kv-list li{padding:var(--s2-spacing-100) 0;border-bottom:1px solid var(--s2-border-subtle);font-size:var(--s2-font-size-75);justify-content:space-between;align-items:center;display:flex}.sprinkle-kv-list li:last-child{border-bottom:none}.sprinkle-kv-list .key{color:var(--s2-gray-600);font-weight:400}.sprinkle-kv-list .value{color:var(--s2-content-default);font-weight:700}dl.sprinkle-kv-list{font-size:var(--s2-font-size-75);grid-template-columns:auto 1fr;gap:0;display:grid}dl.sprinkle-kv-list dt,dl.sprinkle-kv-list dd{padding:var(--s2-spacing-100) 0;border-bottom:1px solid var(--s2-border-subtle);margin:0}dl.sprinkle-kv-list dt{color:var(--s2-gray-600);padding-right:var(--s2-spacing-300);font-weight:400}dl.sprinkle-kv-list dd{color:var(--s2-content-default);text-align:right;font-weight:700}dl.sprinkle-kv-list dt:last-of-type,dl.sprinkle-kv-list dd:last-of-type{border-bottom:none}.sprinkle-text-field{width:100%;font-size:var(--s2-font-size-100);font-family:var(--s2-font-family);color:var(--s2-content-default);border:1px solid var(--s2-gray-200);border-radius:var(--s2-radius-default);transition:border-color var(--s2-transition-default);box-sizing:border-box;background:#fff;outline:none;padding:7px 12px}.sprinkle-text-field::placeholder{color:var(--s2-gray-600)}.sprinkle-text-field:hover{border-color:var(--s2-gray-700)}.sprinkle-text-field:focus{border-color:var(--s2-accent);box-shadow:0 0 0 1px var(--s2-accent)}.sprinkle-grid{gap:var(--s2-spacing-200);grid-template-columns:repeat(auto-fit,minmax(180px,1fr));display:grid}.sprinkle-stack{gap:var(--s2-spacing-200);flex-direction:column;display:flex}.sprinkle-row{align-items:center;gap:var(--s2-spacing-200);display:flex}.sprinkle-divider{border:none;border-top:1px solid var(--s2-border-subtle);margin:var(--s2-spacing-200) 0}.sprinkle-divider--medium{border-top-width:2px;border-top-color:var(--s2-border-default);margin:var(--s2-spacing-300) 0}.sprinkle-empty-state{text-align:center;padding:var(--s2-spacing-500) var(--s2-spacing-300);color:var(--s2-content-tertiary);font-size:var(--s2-font-size-100)}.sprinkle-toolbar{align-items:center;gap:var(--s2-spacing-100);padding:var(--s2-spacing-100) var(--s2-spacing-200);border-bottom:1px solid var(--s2-gray-200);background:var(--s2-gray-50);flex-shrink:0;min-height:40px;display:flex}.sprinkle-toolbar__start{align-items:center;gap:var(--s2-spacing-100);display:flex}.sprinkle-toolbar__center{align-items:center;gap:var(--s2-spacing-100);flex:1;justify-content:center;display:flex}.sprinkle-toolbar__end{align-items:center;gap:var(--s2-spacing-100);margin-left:auto;display:flex}.sprinkle-tabs{border-bottom:1px solid var(--s2-gray-200);background:var(--s2-gray-50);flex-shrink:0;gap:0;display:flex;overflow-x:auto}.sprinkle-tabs__tab{padding:var(--s2-spacing-100) var(--s2-spacing-200);font-size:var(--s2-font-size-100);color:var(--s2-gray-600);cursor:default;white-space:nowrap;transition:color var(--s2-transition-default), border-color var(--s2-transition-default);font-weight:500;font-family:var(--s2-font-family);background:0 0;border:none;border-bottom:2px solid #0000}.sprinkle-tabs__tab:hover{color:var(--s2-gray-800)}.sprinkle-tabs__tab--active{color:var(--s2-gray-900);border-bottom-color:var(--s2-gray-900);font-weight:700}.sprinkle-tabs__panel{flex:1;min-height:0;display:none;overflow-y:auto}.sprinkle-tabs__panel--active{flex-direction:column;display:flex}.sprinkle-sidebar{flex:1;gap:0;min-height:0;display:flex}.sprinkle-sidebar__nav{border-right:1px solid var(--s2-gray-200);background:var(--s2-gray-50);width:240px;min-width:240px;padding:var(--s2-spacing-200) 0;overflow-y:auto}.sprinkle-sidebar__nav-item{align-items:center;gap:var(--s2-spacing-100);padding:var(--s2-spacing-100) var(--s2-spacing-200);font-size:var(--s2-font-size-100);color:var(--s2-gray-700);cursor:default;transition:background var(--s2-transition-default);border-radius:0;display:flex}.sprinkle-sidebar__nav-item:hover{background:var(--s2-gray-100)}.sprinkle-sidebar__nav-item--active{background:var(--s2-gray-800);color:var(--s2-gray-25);font-weight:600}.sprinkle-sidebar__nav-label{padding:var(--s2-spacing-200) var(--s2-spacing-200) var(--s2-spacing-50);font-size:var(--s2-font-size-50);text-transform:uppercase;letter-spacing:.04em;color:var(--s2-gray-600);font-weight:700}.sprinkle-sidebar__main{min-width:0;padding:var(--s2-spacing-200);flex:1;overflow-y:auto}.sprinkle-dialog{z-index:100;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.sprinkle-dialog[hidden]{display:none}.sprinkle-dialog__backdrop{backdrop-filter:blur(2px);background:#0006;position:absolute;inset:0}.sprinkle-dialog__content{background:var(--s2-gray-25);border-radius:var(--s2-radius-xl);box-shadow:var(--s2-shadow-elevated);padding:var(--s2-spacing-400);min-width:280px;max-width:min(560px,100% - 32px);max-height:calc(100% - 64px);position:relative;overflow-y:auto}.sprinkle-dialog__header{margin-bottom:var(--s2-spacing-300);justify-content:space-between;align-items:center;display:flex}.sprinkle-dialog__title{font-size:var(--s2-font-size-200);color:var(--s2-content-default);font-weight:700}.sprinkle-dialog__close{border-radius:var(--s2-radius-pill);width:28px;height:28px;color:var(--s2-gray-600);cursor:default;transition:background var(--s2-transition-default);background:0 0;border:none;justify-content:center;align-items:center;font-size:18px;display:flex}.sprinkle-dialog__close:hover{background:var(--s2-gray-100)}.sprinkle-dialog__footer{justify-content:flex-end;gap:var(--s2-spacing-100);margin-top:var(--s2-spacing-300);display:flex}.sprinkle-collapsible__header{align-items:center;gap:var(--s2-spacing-100);padding:var(--s2-spacing-100) var(--s2-spacing-200);cursor:default;font-size:var(--s2-font-size-100);color:var(--s2-content-default);text-align:left;border-radius:var(--s2-radius-default);width:100%;transition:background var(--s2-transition-default);font-weight:600;font-family:var(--s2-font-family);background:0 0;border:none;display:flex}.sprinkle-collapsible__header:hover{background:var(--s2-gray-100)}.sprinkle-collapsible__chevron{flex-shrink:0;width:16px;height:16px;transition:transform .2s;display:inline-block}.sprinkle-collapsible__chevron:before{content:"▶";color:var(--s2-gray-600);font-size:10px}.sprinkle-collapsible--open .sprinkle-collapsible__chevron{transform:rotate(90deg)}.sprinkle-collapsible__body{padding:var(--s2-spacing-100) var(--s2-spacing-200) var(--s2-spacing-200) calc(var(--s2-spacing-200) + 16px + var(--s2-spacing-100));display:none}.sprinkle-collapsible--open .sprinkle-collapsible__body{display:block}.sprinkle-split{flex:1;gap:0;min-height:0;display:flex}.sprinkle-split>*{flex:1;min-width:0;overflow-y:auto}.sprinkle-split>:not(:last-child){border-right:1px solid var(--s2-border-default)}.sprinkle-split--vertical{flex-direction:column}.sprinkle-split--vertical>:not(:last-child){border-right:none;border-bottom:1px solid var(--s2-border-default)}.sprinkle-canvas{border-radius:var(--s2-radius-l);background:var(--s2-bg-layer-1);width:100%;position:relative;overflow:hidden}.sprinkle-canvas--16x9{aspect-ratio:16/9}.sprinkle-canvas--4x3{aspect-ratio:4/3}.sprinkle-canvas--1x1{aspect-ratio:1}.sprinkle-canvas svg,.sprinkle-canvas canvas{width:100%;height:100%;display:block}.sprinkle-density-compact .sprinkle-content{padding:var(--s2-spacing-100)}.sprinkle-density-compact .sprinkle-heading{font-size:var(--s2-font-size-100);margin-bottom:var(--s2-spacing-50)}.sprinkle-density-compact .sprinkle-heading--m{font-size:13px}.sprinkle-density-compact .sprinkle-body{font-size:var(--s2-font-size-75);line-height:1.4}.sprinkle-density-compact .sprinkle-detail{font-size:var(--s2-font-size-50)}.sprinkle-density-compact .sprinkle-table th{font-size:var(--s2-font-size-50);height:28px;padding:5px 12px}.sprinkle-density-compact .sprinkle-table td{font-size:var(--s2-font-size-75);padding:6px 12px}.sprinkle-density-compact .sprinkle-btn{height:26px;font-size:var(--s2-font-size-75);padding:0 10px}.sprinkle-density-compact .sprinkle-badge{padding:2px 6px;font-size:10px}.sprinkle-density-compact .sprinkle-card{padding:var(--s2-spacing-200)}.sprinkle-density-compact .sprinkle-list-item{gap:10px;min-height:40px;padding:8px 16px}.sprinkle-density-compact .sprinkle-list-item__icon{width:28px;min-width:28px;height:28px;font-size:13px}.sprinkle-density-compact .sprinkle-list-item__title{font-size:var(--s2-font-size-75)}.sprinkle-density-compact .sprinkle-list-item__subtitle{font-size:11px}.sprinkle-density-compact .sprinkle-sidebar__nav-item{padding:6px var(--s2-spacing-200);font-size:var(--s2-font-size-75)}.sprinkle-density-compact .sprinkle-text-field{height:28px;font-size:var(--s2-font-size-75);padding:4px 8px}.sprinkle-density-compact .sprinkle-tabs__tab{padding:6px var(--s2-spacing-200);font-size:var(--s2-font-size-75)}.sprinkle-density-compact .sprinkle-kv-list li{font-size:var(--s2-font-size-50);padding:6px 0}.sprinkle-density-compact .sprinkle-chip{padding:3px 8px;font-size:11px}.sprinkle-density-spacious .sprinkle-content{padding:var(--s2-spacing-400)}.sprinkle-density-spacious .sprinkle-heading{font-size:var(--s2-font-size-500);margin-bottom:var(--s2-spacing-200)}.sprinkle-density-spacious .sprinkle-heading--m{font-size:var(--s2-font-size-300)}.sprinkle-density-spacious .sprinkle-body{font-size:15px;line-height:1.65}.sprinkle-density-spacious .sprinkle-card{padding:var(--s2-spacing-500)}.sprinkle-density-spacious .sprinkle-btn{height:36px;padding:0 20px}.sprinkle-density-spacious .sprinkle-action-card__body{padding:0 32px 24px;font-size:15px}.sprinkle-panel{container-type:inline-size}@container (width<=400px){.sprinkle-sidebar{flex-direction:column}.sprinkle-sidebar__nav{border-right:none;border-bottom:1px solid var(--s2-border-default);width:100%;min-width:0;max-height:200px}.sprinkle-grid{grid-template-columns:1fr}.sprinkle-split:not(.sprinkle-split--vertical){flex-direction:column}.sprinkle-split:not(.sprinkle-split--vertical)>:not(:last-child){border-right:none;border-bottom:1px solid var(--s2-border-default)}.sprinkle-toolbar{flex-wrap:wrap}}@container (width>=600px){.sprinkle-sidebar__nav{width:240px;min-width:240px}.sprinkle-grid{grid-template-columns:repeat(auto-fit,minmax(180px,1fr))}}.skill-drop-overlay{backdrop-filter:blur(3px);opacity:0;pointer-events:none;transition:opacity var(--s2-transition-default);z-index:180;background:#00000061;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.skill-drop-overlay--visible{opacity:1}.skill-drop-overlay__card{min-width:min(420px,100vw - 32px);max-width:calc(100vw - 32px);padding:var(--s2-spacing-400);border-radius:var(--s2-radius-xl);background:color-mix(in srgb, var(--s2-bg-layer-2) 92%, transparent);border:1px dashed var(--s2-accent);box-shadow:var(--s2-shadow-elevated);text-align:center}.skill-drop-overlay__title{font-size:var(--s2-font-size-300);color:var(--s2-content-default);font-weight:700}.skill-drop-overlay__desc{margin-top:var(--s2-spacing-75);color:var(--s2-content-secondary);font-size:var(--s2-font-size-75);font-family:var(--s2-font-mono);word-break:break-word}.skill-drop-toast-container{top:calc(var(--s2-header-height) + var(--s2-spacing-200));right:var(--s2-spacing-200);gap:var(--s2-spacing-100);z-index:190;pointer-events:none;flex-direction:column;display:flex;position:fixed}.skill-drop-toast{max-width:min(420px,100vw - 32px);padding:var(--s2-spacing-200) var(--s2-spacing-300);border-radius:var(--s2-radius-default);background:var(--s2-bg-layer-2);color:var(--s2-content-default);border:1px solid var(--s2-border-subtle);box-shadow:var(--s2-shadow-elevated);font-size:var(--s2-font-size-75);opacity:0;line-height:1.45;transition:opacity .16s,transform .16s;transform:translateY(-8px)}.skill-drop-toast--visible{opacity:1;transform:translateY(0)}.skill-drop-toast--success{border-color:color-mix(in srgb, var(--s2-positive) 55%, var(--s2-border-subtle))}.skill-drop-toast--error{border-color:color-mix(in srgb, var(--s2-negative) 65%, var(--s2-border-subtle))}.image-preview-overlay{z-index:1000;cursor:pointer;justify-content:center;align-items:center;display:flex;position:fixed;inset:0}.image-preview-backdrop{backdrop-filter:blur(8px);opacity:0;background:#0009;transition:opacity .35s cubic-bezier(.2,0,.13,1);position:absolute;inset:0}.image-preview-overlay--visible .image-preview-backdrop{opacity:1}.image-preview-overlay--closing .image-preview-backdrop{opacity:0}.image-preview-image{object-fit:contain;transform-origin:50%;will-change:transform;border-radius:6px;max-width:90vw;max-height:90vh;transition:transform .35s cubic-bezier(.2,0,.13,1),border-radius .35s cubic-bezier(.2,0,.13,1);position:absolute;box-shadow:0 20px 60px #0006,0 8px 20px #0000004d}
|