sliccy 2.26.2 → 2.27.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (25) hide show
  1. package/README.md +5 -2
  2. package/dist/ui/assets/{anthropic-BCfzikVk.js → anthropic-Bbl8Sg5y.js} +1 -1
  3. package/dist/ui/assets/{azure-openai-responses-CGU2TZAi.js → azure-openai-responses-B3trwv0k.js} +1 -1
  4. package/dist/ui/assets/{es-CJWl2MN2.js → es-BKvQPtb5.js} +1 -1
  5. package/dist/ui/assets/{fs-BOiXGVkS.js → fs-t3D13Hd5.js} +1 -1
  6. package/dist/ui/assets/{google-BO7PilpD.js → google-C7sZ3HlN.js} +1 -1
  7. package/dist/ui/assets/index-B83C5cLK.css +1 -0
  8. package/dist/ui/assets/{index-D4tp1ANR.js → index-Bv5amGny.js} +2611 -2611
  9. package/dist/ui/assets/{mistral-Bl7QoMFH.js → mistral-ppKGJAy7.js} +1 -1
  10. package/dist/ui/assets/offscreen-client-DCrdvikK.js +1 -0
  11. package/dist/ui/assets/{onboarding-orchestrator-B-aufPPu.js → onboarding-orchestrator-Dvwfz7ld.js} +1 -1
  12. package/dist/ui/assets/{openai-codex-responses-B_UruyNV.js → openai-codex-responses-Gx5Fi-2N.js} +1 -1
  13. package/dist/ui/assets/{openai-completions-BFlhnFqz.js → openai-completions-CboEkAw6.js} +1 -1
  14. package/dist/ui/assets/{openai-responses-D_eDRlIR.js → openai-responses-Bza0SYF0.js} +1 -1
  15. package/dist/ui/assets/provider-settings-DS3C0NKi.js +95 -0
  16. package/dist/ui/assets/{skills-D15e98qd.js → skills-DclcqNBg.js} +1 -1
  17. package/dist/ui/electron-overlay-entry.js +4 -4
  18. package/dist/ui/index.html +9 -9
  19. package/dist/ui/packages/webapp/index.html +9 -9
  20. package/package.json +13 -7
  21. package/dist/ui/assets/index-BqtzdP8d.css +0 -1
  22. package/dist/ui/assets/offscreen-client-DRN1fwvT.js +0 -1
  23. package/dist/ui/assets/provider-settings-xCthm0Wq.js +0 -95
  24. /package/dist/ui/assets/{db-QbwB670D.js → db-CmHnV4DS.js} +0 -0
  25. /package/dist/ui/assets/{path-utils-DAY6ORUp.js → path-utils-Dzkyzd3x.js} +0 -0
@@ -1,3 +1,3 @@
1
- import{r as e}from"./chunk-jRWAZmH_.js";import"./fs-BOiXGVkS.js";import{t}from"./browser-CFDl2kC3.js";import{r as n,t as r}from"./path-utils-DAY6ORUp.js";var i=`skills`,a=`.skill`,o=50*1024*1024,s=1e3,c=`/workspace/skills`,l=`SKILL.md`,u=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function d(e){if(e===`__MACOSX`||e.startsWith(`__MACOSX/`))return!0;let t=e.includes(`/`)?e.slice(e.lastIndexOf(`/`)+1):e;return!!(t===`.DS_Store`||t===`Thumbs.db`||t===`desktop.ini`||t.startsWith(`._`))}var f=class extends Error{};function p(e){let t=e.replace(/\\/g,`/`);if(!t||t.endsWith(`/`))return null;if(t.startsWith(`/`)||/^[A-Za-z]:\//.test(t))throw Error(`Blocked suspicious path "${e}".`);let n=t.split(`/`);if(n.some(e=>e===``||e===`.`||e===`..`))throw Error(`Blocked suspicious path "${e}".`);return n.join(`/`)}function m(e){if(!u.test(e))throw Error(`Invalid skill: skill name "${e}" must be a simple directory name.`)}function h(e){let t=[];for(let[n,r]of Object.entries(e)){let e=p(n);e&&(d(e)||t.push({originalPath:n,path:e,bytes:r}))}return t}function g(e){let t=e.filter(e=>e.path===`SKILL.md`||e.path.endsWith(`/SKILL.md`));if(t.length===0)throw Error(`Skill archive is missing ${l}.`);if(t.length>1)throw Error(`Skill archive contains multiple ${l} files.`);return t[0]}function _(e){let n=0,r=0;return t(e,{filter(e){if(n++,n>1e3)throw new f(`Skill archives may contain at most ${s} entries.`);if(r+=e.originalSize,r>52428800)throw new f(`Skill archives must expand to 50 MB or smaller after extraction.`);return!0}})}function v(e){return r(c,`.${e}.tmp-${`${Date.now()}-${Math.random().toString(16).slice(2,8)}`}`)}function y(e,t){return t===`SKILL.md`?e.replace(/\.skill$/i,``):t.slice(0,-9).split(`/`).pop()??``}async function b(e,t){if(!t.name.toLowerCase().endsWith(`.skill`))throw Error(`Only ${a} archives can be installed with drag and drop.`);if(t.size>52428800)throw Error(`Skill archives must be 50 MB or smaller.`);let i;try{i=_(new Uint8Array(await t.arrayBuffer()))}catch(e){if(e instanceof f)throw e;let t=e instanceof Error?e.message:String(e);throw Error(`Invalid .skill archive: ${t}`)}let o=h(i),s=g(o),u=y(t.name,s.path);m(u);let d=r(c,u);if(await e.exists(d))throw Error(`Skill "${u}" already exists at ${d}.`);let p=v(u),b=s.path===`SKILL.md`?``:s.path.slice(0,-(l.length+1));await e.mkdir(p,{recursive:!0});try{let t=0;for(let i of o){if(b&&(i.path===b||!i.path.startsWith(`${b}/`)))continue;let a=b?i.path.slice(b.length+1):i.path;if(!a)continue;let o=r(p,a),{dir:s}=n(o);s!==`/`&&await e.mkdir(s,{recursive:!0}),await e.writeFile(o,i.bytes),t++}return await e.rename(p,d),{skillName:u,destinationPath:d,fileCount:t}}catch(t){throw await e.exists(p)&&await e.rm(p,{recursive:!0}),t}}var x=[`native`,`agents`,`claude`],S=new Map([[`.agents`,`agents`],[`.claude`,`claude`]]),C=new Set([`.git`,`.slicc`]),w=[`mkdir`,`mount`,`rename`,`rm`,`unmount`,`writeFile`],T=new WeakMap,E=new WeakSet;async function D(e,t=c){let n=await A(e,t),r=await O(e);return[...x.flatMap(e=>(e===`native`?n:r.filter(t=>t.source===e)).sort((e,t)=>e.path.localeCompare(t.path)))]}async function O(e){M(e);let t=e,n=T.get(t);if(n)return n.map(e=>({...e}));let r=await j(e);return T.set(t,r),r.map(e=>({...e}))}function k(e,t){let n=new Map,r=new Map;for(let i of e){let e=t(i);if(!n.has(e)){n.set(e,i);continue}let a=r.get(e)??{name:e,winner:n.get(e),shadowed:[]};a.shadowed.push(i),r.set(e,a)}return{winners:Array.from(n.values()),collisions:Array.from(r.values())}}async function A(e,t){let n=await P(e,t),r=[];for(let i of n){if(i.type!==`directory`)continue;let n=`${t}/${i.name}`,a=`${n}/${l}`;await N(e,a)&&r.push({source:`native`,sourceRoot:t,path:n,skillFilePath:a})}return r}async function j(e){let t=[],n=new Set,r=[`/`];for(let i=0;i<r.length;i+=1){let a=r[i],o=await P(e,a);for(let i of o){if(i.type!==`directory`)continue;let o=a===`/`?`/${i.name}`:`${a}/${i.name}`,s=S.get(i.name);if(s){let r=`${o}/skills`,i=await P(e,r);for(let a of i){if(a.type!==`directory`)continue;let i=`${r}/${a.name}`,o=`${i}/${l}`;!await N(e,o)||n.has(i)||(n.add(i),t.push({source:s,sourceRoot:r,path:i,skillFilePath:o}))}}C.has(i.name)||r.push(o)}}return t}function M(e){let t=e;if(E.has(t))return;E.add(t);let n=e;for(let r of w){let i=n[r];if(typeof i!=`function`)continue;let a=i;try{n[r]=async(...n)=>{let r=await a.apply(e,n);return T.delete(t),r}}catch{}}}async function N(e,t){try{return await e.stat(t),!0}catch{return!1}}async function P(e,t){try{return[...await e.readDir(t)].sort((e,t)=>e.name.localeCompare(t.name))}catch{return[]}}async function F(e,t=`/workspace/skills`){let n=await D(e,t),r=[];for(let t of n){let n=t.path.split(`/`).pop()??t.path,i=``;if(t.skillFilePath)try{i=R(await e.readTextFile(t.skillFilePath))??``}catch{}r.push({name:n,source:t.source,sourceRoot:t.sourceRoot,path:t.path,skillFilePath:t.skillFilePath,description:i})}let{winners:i,collisions:a}=k(r,e=>e.name),o=new Map(a.map(e=>[e.winner.path,e.shadowed.map(e=>e.path)]));return i.map(e=>({...e,shadowedPaths:o.get(e.path)}))}async function I(e,t,n=`/workspace/skills`){return(await F(e,n)).find(e=>e.name===t)||null}async function L(e,t,n=`/workspace/skills`){let r=await I(e,t,n);if(!r?.skillFilePath)return null;try{return await e.readTextFile(r.skillFilePath)}catch{return null}}function R(e){let t=e.replace(/^\uFEFF/,``).replace(/\r\n?/g,`
1
+ import{r as e}from"./chunk-jRWAZmH_.js";import"./fs-t3D13Hd5.js";import{t}from"./browser-CFDl2kC3.js";import{r as n,t as r}from"./path-utils-Dzkyzd3x.js";var i=`skills`,a=`.skill`,o=50*1024*1024,s=1e3,c=`/workspace/skills`,l=`SKILL.md`,u=/^[A-Za-z0-9][A-Za-z0-9._-]*$/;function d(e){if(e===`__MACOSX`||e.startsWith(`__MACOSX/`))return!0;let t=e.includes(`/`)?e.slice(e.lastIndexOf(`/`)+1):e;return!!(t===`.DS_Store`||t===`Thumbs.db`||t===`desktop.ini`||t.startsWith(`._`))}var f=class extends Error{};function p(e){let t=e.replace(/\\/g,`/`);if(!t||t.endsWith(`/`))return null;if(t.startsWith(`/`)||/^[A-Za-z]:\//.test(t))throw Error(`Blocked suspicious path "${e}".`);let n=t.split(`/`);if(n.some(e=>e===``||e===`.`||e===`..`))throw Error(`Blocked suspicious path "${e}".`);return n.join(`/`)}function m(e){if(!u.test(e))throw Error(`Invalid skill: skill name "${e}" must be a simple directory name.`)}function h(e){let t=[];for(let[n,r]of Object.entries(e)){let e=p(n);e&&(d(e)||t.push({originalPath:n,path:e,bytes:r}))}return t}function g(e){let t=e.filter(e=>e.path===`SKILL.md`||e.path.endsWith(`/SKILL.md`));if(t.length===0)throw Error(`Skill archive is missing ${l}.`);if(t.length>1)throw Error(`Skill archive contains multiple ${l} files.`);return t[0]}function _(e){let n=0,r=0;return t(e,{filter(e){if(n++,n>1e3)throw new f(`Skill archives may contain at most ${s} entries.`);if(r+=e.originalSize,r>52428800)throw new f(`Skill archives must expand to 50 MB or smaller after extraction.`);return!0}})}function v(e){return r(c,`.${e}.tmp-${`${Date.now()}-${Math.random().toString(16).slice(2,8)}`}`)}function y(e,t){return t===`SKILL.md`?e.replace(/\.skill$/i,``):t.slice(0,-9).split(`/`).pop()??``}async function b(e,t){if(!t.name.toLowerCase().endsWith(`.skill`))throw Error(`Only ${a} archives can be installed with drag and drop.`);if(t.size>52428800)throw Error(`Skill archives must be 50 MB or smaller.`);let i;try{i=_(new Uint8Array(await t.arrayBuffer()))}catch(e){if(e instanceof f)throw e;let t=e instanceof Error?e.message:String(e);throw Error(`Invalid .skill archive: ${t}`)}let o=h(i),s=g(o),u=y(t.name,s.path);m(u);let d=r(c,u);if(await e.exists(d))throw Error(`Skill "${u}" already exists at ${d}.`);let p=v(u),b=s.path===`SKILL.md`?``:s.path.slice(0,-(l.length+1));await e.mkdir(p,{recursive:!0});try{let t=0;for(let i of o){if(b&&(i.path===b||!i.path.startsWith(`${b}/`)))continue;let a=b?i.path.slice(b.length+1):i.path;if(!a)continue;let o=r(p,a),{dir:s}=n(o);s!==`/`&&await e.mkdir(s,{recursive:!0}),await e.writeFile(o,i.bytes),t++}return await e.rename(p,d),{skillName:u,destinationPath:d,fileCount:t}}catch(t){throw await e.exists(p)&&await e.rm(p,{recursive:!0}),t}}var x=[`native`,`agents`,`claude`],S=new Map([[`.agents`,`agents`],[`.claude`,`claude`]]),C=new Set([`.git`,`.slicc`]),w=[`mkdir`,`mount`,`rename`,`rm`,`unmount`,`writeFile`],T=new WeakMap,E=new WeakSet;async function D(e,t=c){let n=await A(e,t),r=await O(e);return[...x.flatMap(e=>(e===`native`?n:r.filter(t=>t.source===e)).sort((e,t)=>e.path.localeCompare(t.path)))]}async function O(e){M(e);let t=e,n=T.get(t);if(n)return n.map(e=>({...e}));let r=await j(e);return T.set(t,r),r.map(e=>({...e}))}function k(e,t){let n=new Map,r=new Map;for(let i of e){let e=t(i);if(!n.has(e)){n.set(e,i);continue}let a=r.get(e)??{name:e,winner:n.get(e),shadowed:[]};a.shadowed.push(i),r.set(e,a)}return{winners:Array.from(n.values()),collisions:Array.from(r.values())}}async function A(e,t){let n=await P(e,t),r=[];for(let i of n){if(i.type!==`directory`)continue;let n=`${t}/${i.name}`,a=`${n}/${l}`;await N(e,a)&&r.push({source:`native`,sourceRoot:t,path:n,skillFilePath:a})}return r}async function j(e){let t=[],n=new Set,r=[`/`];for(let i=0;i<r.length;i+=1){let a=r[i],o=await P(e,a);for(let i of o){if(i.type!==`directory`)continue;let o=a===`/`?`/${i.name}`:`${a}/${i.name}`,s=S.get(i.name);if(s){let r=`${o}/skills`,i=await P(e,r);for(let a of i){if(a.type!==`directory`)continue;let i=`${r}/${a.name}`,o=`${i}/${l}`;!await N(e,o)||n.has(i)||(n.add(i),t.push({source:s,sourceRoot:r,path:i,skillFilePath:o}))}}C.has(i.name)||r.push(o)}}return t}function M(e){let t=e;if(E.has(t))return;E.add(t);let n=e;for(let r of w){let i=n[r];if(typeof i!=`function`)continue;let a=i;try{n[r]=async(...n)=>{let r=await a.apply(e,n);return T.delete(t),r}}catch{}}}async function N(e,t){try{return await e.stat(t),!0}catch{return!1}}async function P(e,t){try{return[...await e.readDir(t)].sort((e,t)=>e.name.localeCompare(t.name))}catch{return[]}}async function F(e,t=`/workspace/skills`){let n=await D(e,t),r=[];for(let t of n){let n=t.path.split(`/`).pop()??t.path,i=``;if(t.skillFilePath)try{i=R(await e.readTextFile(t.skillFilePath))??``}catch{}r.push({name:n,source:t.source,sourceRoot:t.sourceRoot,path:t.path,skillFilePath:t.skillFilePath,description:i})}let{winners:i,collisions:a}=k(r,e=>e.name),o=new Map(a.map(e=>[e.winner.path,e.shadowed.map(e=>e.path)]));return i.map(e=>({...e,shadowedPaths:o.get(e.path)}))}async function I(e,t,n=`/workspace/skills`){return(await F(e,n)).find(e=>e.name===t)||null}async function L(e,t,n=`/workspace/skills`){let r=await I(e,t,n);if(!r?.skillFilePath)return null;try{return await e.readTextFile(r.skillFilePath)}catch{return null}}function R(e){let t=e.replace(/^\uFEFF/,``).replace(/\r\n?/g,`
2
2
  `).trimStart().match(/^---\s*\n([\s\S]*?)\n---/);if(!t)return null;for(let e of t[1].split(`
3
3
  `)){let t=e.match(/^description:\s*(.*)$/);if(t)return t[1].trim()}return null}var z=e({MAX_SKILL_ARCHIVE_SIZE_BYTES:()=>o,SKILLS_DIR:()=>i,SKILL_ARCHIVE_EXTENSION:()=>a,SKILL_FILE:()=>l,WORKSPACE_SKILLS_PATH:()=>c,discoverSkillCandidates:()=>D,discoverSkills:()=>F,getSkillInfo:()=>I,installSkillFromDrop:()=>b,readSkillInstructions:()=>L,resolveSkillNameCollisions:()=>k});export{a as i,F as n,b as r,z as t};
@@ -1,4 +1,4 @@
1
- "use strict";(()=>{var H=[{id:"chat",label:"Chat"},{id:"terminal",label:"Terminal"},{id:"files",label:"Files"},{id:"memory",label:"Memory"}],rt="slicc-hidden-tabs",B=["terminal","memory"];function ot(){try{let r=localStorage.getItem(rt);return r?new Set(JSON.parse(r)):new Set(B)}catch{return new Set(B)}}var Z=H.filter(r=>!ot().has(r.id)),L="chat",gt=new Set(H.map(r=>r.id));function b(r,t=L){return r&&r.length>0?r:t}var nt=["top-left","top-right","bottom-left","bottom-right","top","right","bottom","left"];var at="top-right",it=6,st=12,lt=.6;function m(r,t=at){return nt.includes(r)?r:t}function S(r={}){return{open:r.open??!1,activeTab:b(r.activeTab,L),corner:m(r.corner)}}function j(r){return{...r,open:!r.open}}function C(r,t){return r.open===t?r:{...r,open:t}}function R(r,t){let e=b(t,r.activeTab);return r.activeTab===e?r:{...r,activeTab:e}}function k(r,t){let e=m(t,r.corner);return r.corner===e?r:{...r,corner:e}}function I(r,t){return r>=it||r>=st&&t>=lt}function z({clientX:r,clientY:t,viewportWidth:e,viewportHeight:o,velocityXPxPerMs:n=0,velocityYPxPerMs:a=0,flickProjectionMs:i=180}){let l=$(r+n*i,0,e),d=$(t+a*i,0,o),s=l/e,c=d/o,p=s>1/3&&s<2/3,u=c>1/3&&c<2/3;if(p&&u){let f=c,g=1-c,_=s,h=1-s,A=Math.min(f,g,_,h);return A===f?"top":A===g?"bottom":A===_?"left":"right"}if(p)return c<.5?"top":"bottom";if(u)return s<.5?"left":"right";let E=s<.5?"left":"right";return`${c<.5?"top":"bottom"}-${E}`}function $(r,t,e){return Math.min(Math.max(r,t),e)}var F="slicc-electron-overlay:set-tab";var G=`<?xml version="1.0" encoding="UTF-8"?>
1
+ "use strict";(()=>{var H=[{id:"chat",label:"Chat"},{id:"terminal",label:"Terminal"},{id:"files",label:"Files"},{id:"memory",label:"Memory"}],rt="slicc-hidden-tabs",B=["terminal","memory"];function ot(){try{let r=localStorage.getItem(rt);return r?new Set(JSON.parse(r)):new Set(B)}catch{return new Set(B)}}var Z=H.filter(r=>!ot().has(r.id)),_="chat",gt=new Set(H.map(r=>r.id));function b(r,t=_){return r&&r.length>0?r:t}var nt=["top-left","top-right","bottom-left","bottom-right","top","right","bottom","left"],at="top-right",it=6,st=12,lt=.6;function m(r,t=at){return nt.includes(r)?r:t}function L(r={}){return{open:r.open??!1,activeTab:b(r.activeTab,_),corner:m(r.corner)}}function j(r){return{...r,open:!r.open}}function T(r,t){return r.open===t?r:{...r,open:t}}function R(r,t){let e=b(t,r.activeTab);return r.activeTab===e?r:{...r,activeTab:e}}function k(r,t){let e=m(t,r.corner);return r.corner===e?r:{...r,corner:e}}function I(r,t){return r>=it||r>=st&&t>=lt}function z({clientX:r,clientY:t,viewportWidth:e,viewportHeight:o,velocityXPxPerMs:n=0,velocityYPxPerMs:a=0,flickProjectionMs:i=180}){let l=$(r+n*i,0,e),d=$(t+a*i,0,o),s=l/e,c=d/o,p=s>1/3&&s<2/3,u=c>1/3&&c<2/3;if(p&&u){let f=c,g=1-c,S=s,h=1-s,A=Math.min(f,g,S,h);return A===f?"top":A===g?"bottom":A===S?"left":"right"}if(p)return c<.5?"top":"bottom";if(u)return s<.5?"left":"right";let E=s<.5?"left":"right";return`${c<.5?"top":"bottom"}-${E}`}function $(r,t,e){return Math.min(Math.max(r,t),e)}var F="slicc-electron-overlay:set-tab";var G=`<?xml version="1.0" encoding="UTF-8"?>
2
2
  <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 1024 1024" width="100%" height="100%"><g transform="translate(191.47118749999993, 12.583024999999978) scale(1.1115000000000002)"><g transform="translate(0, 0)"><g id="Cone">
3
3
  <path id="Cone_Bottom" data-name="Cone Bottom" d="M108.22,414.88l189.84,460.03c1.36,3.3,6.09,3.16,7.25-.22l159.34-463.34c.87-2.53-1.03-5.16-3.7-5.13l-349.18,3.32c-2.74.03-4.59,2.82-3.55,5.35Z" style="fill: rgb(34, 34, 34); stroke: rgb(255, 255, 255); stroke-linejoin: round; stroke-width: 20px;"/>
4
4
  <g id="Waffle_Cross-Hatch" data-name="Waffle Cross-Hatch">
@@ -50,7 +50,7 @@
50
50
  </g><g id="Left_Eye" data-name="Left Eye">
51
51
  <circle id="Right_Eye_Outline" data-name="Right Eye Outline" cx="175.1" cy="250.34" r="64.78" style="fill: #fff; stroke: #000; stroke-miterlimit: 10; stroke-width: 6px;"/>
52
52
  <path id="Left_Pupil" data-name="Left Pupil" d="M213.74,233.23c-.13,1.98-.7,3.97-1.76,5.81-3.71,6.43-11.93,8.63-18.36,4.92-6.43-3.71-8.63-11.93-4.92-18.36,2.32-4.02,6.4-6.38,10.7-6.69-3.8-1.78-8.03-2.8-12.51-2.8-16.37,0-29.64,13.27-29.64,29.64s13.27,29.64,29.64,29.64,29.64-13.27,29.64-29.64c0-4.48-1.02-8.72-2.81-12.53Z" style="fill: rgb(0, 0, 0);"/>
53
- </g></g></g></svg>`;var N="slicc-electron-overlay-root",P="slicc-electron-overlay",pt="Semicolon",J=";",ht="slicc-electron-overlay:toggle",T="slicc-electron-launcher",O="slicc-electron-sidebar",v="",y=18,Q="slicc-electron-overlay-launcher-corner";function X(r,t){let e=r.createElement("style");return e.textContent=t,e}function K(r){return r.replace(/<\?xml[^?]*\?>\s*/i,"")}var V=`
53
+ </g></g></g></svg>`;var N="slicc-electron-overlay-root",P="slicc-electron-overlay",pt="Semicolon",J=";",ht="slicc-electron-overlay:toggle",C="slicc-electron-launcher",O="slicc-electron-sidebar",v="",y=18,Q="slicc-electron-overlay-launcher-corner";function X(r,t){let e=r.createElement("style");return e.textContent=t,e}function K(r){return r.replace(/<\?xml[^?]*\?>\s*/i,"")}var V=`
54
54
  :host {
55
55
  color-scheme: dark light;
56
56
  --s2-gray-25: #1a1a1a;
@@ -255,7 +255,7 @@
255
255
  iframe { border: 0; width: 100%; height: 100%; display: block; background: var(--s2-bg-base); }
256
256
  .empty-state { position: absolute; inset: 0; display: flex; align-items: center; justify-content: center; padding: 24px; text-align: center; color: var(--s2-content-secondary); font-size: 13px; line-height: 1.5; }
257
257
  .empty-state[hidden] { display: none; }
258
- `));let n=e.createElement("div");n.className="backdrop",n.setAttribute("part","backdrop"),n.addEventListener("click",()=>{this.dispatchEvent(new CustomEvent("slicc-overlay-close",{bubbles:!0,composed:!0}))}),t.appendChild(n);let a=e.createElement("aside");a.className="sidebar",a.setAttribute("part","sidebar"),a.setAttribute("aria-label","SLICC overlay sidebar");let i=e.createElement("header");i.className="header";let l=e.createElement("div");l.className="header__brand";let d=e.createElement("div"),s=e.createElement("div");s.className="header__title",s.textContent="slicc";let c=e.createElement("div");c.className="header__subtitle",c.textContent="electron float",d.appendChild(s),d.appendChild(c),l.appendChild(d),i.appendChild(l);let p=e.createElement("button");p.type="button",p.className="header__close",p.setAttribute("aria-label","Close SLICC overlay"),p.textContent="\xD7",p.addEventListener("click",()=>{this.dispatchEvent(new CustomEvent("slicc-overlay-close",{bubbles:!0,composed:!0}))}),i.appendChild(p),a.appendChild(i);let u=e.createElement("div");u.className="tab-bar",u.setAttribute("role","tablist"),u.setAttribute("aria-label","SLICC overlay tabs");for(let{id:g,label:_}of Z){let h=e.createElement("button");h.type="button",h.className="tab-bar__tab"+(g===o?" tab-bar__tab--active":""),h.setAttribute("role","tab"),h.setAttribute("aria-selected",String(g===o)),h.dataset.tab=g,h.textContent=_,this.tabButtons.set(g,h),h.addEventListener("click",()=>{this.dispatchEvent(new CustomEvent("slicc-overlay-select-tab",{bubbles:!0,composed:!0,detail:{tab:g}}))}),u.appendChild(h)}a.appendChild(u);let E=e.createElement("div");E.className="viewport";let x=e.createElement("iframe");x.title="SLICC electron float",this.iframe=x,x.addEventListener("load",()=>{this.frameLoaded=!0,this.postActiveTab()}),E.appendChild(x);let f=e.createElement("div");f.className="empty-state",f.textContent="Starting the local SLICC runtime\u2026",this.emptyState=f,E.appendChild(f),a.appendChild(E),t.appendChild(a),this.iframe?.addEventListener("load",()=>{this.frameLoaded=!0,this.postActiveTab()})}sync(){let t=b(this.getAttribute("active-tab")),e=this.getAttribute("app-url")?.trim()??v;for(let[o,n]of this.tabButtons){let a=o===t;n.classList.toggle("tab-bar__tab--active",a),n.setAttribute("aria-selected",String(a))}this.emptyState?.toggleAttribute("hidden",!!e),this.syncFrameUrl(e,t),this.postActiveTab()}syncFrameUrl(t,e){if(this.iframe){if(!t){this.currentAppUrl&&(this.currentAppUrl=v,this.frameLoaded=!1,this.lastPostedTab=null,this.iframe.removeAttribute("src"));return}t!==this.currentAppUrl&&(this.currentAppUrl=t,this.frameLoaded=!1,this.lastPostedTab=null,this.iframe.src=ut(t,e))}}postActiveTab(){if(!this.frameLoaded||!this.iframe?.contentWindow)return;let t=b(this.getAttribute("active-tab"));this.lastPostedTab!==t&&(this.iframe.contentWindow.postMessage({type:F,tab:t},"*"),this.lastPostedTab=t)}},w=class extends HTMLElement{static observedAttributes=["open","active-tab","app-url","corner"];state=S();appUrlValue=v;syncingAttributes=!1;connectedCallback(){this.state=S({open:this.hasAttribute("open"),activeTab:b(this.getAttribute("active-tab")),corner:m(this.getAttribute("corner")??D(this.ownerDocument.defaultView))}),this.appUrlValue=this.getAttribute("app-url")?.trim()??v,this.shadowRoot||this.render(),this.syncChildren(),M(this.ownerDocument.defaultView,this.state.corner),this.ownerDocument.addEventListener("keydown",this.onKeyDown,!0),this.ownerDocument.defaultView?.addEventListener("message",this.onMessage)}disconnectedCallback(){this.ownerDocument.removeEventListener("keydown",this.onKeyDown,!0),this.ownerDocument.defaultView?.removeEventListener("message",this.onMessage)}attributeChangedCallback(){this.syncingAttributes||(this.state=S({open:this.hasAttribute("open"),activeTab:b(this.getAttribute("active-tab")),corner:m(this.getAttribute("corner")??D(this.ownerDocument.defaultView))}),this.appUrlValue=this.getAttribute("app-url")?.trim()??v,this.syncChildren(),M(this.ownerDocument.defaultView,this.state.corner))}get open(){return this.state.open}set open(t){this.applyState(C(this.state,t))}get activeTab(){return this.state.activeTab}set activeTab(t){this.applyState(R(this.state,t))}get corner(){return this.state.corner}set corner(t){this.applyState(k(this.state,t))}get appUrl(){return this.appUrlValue}set appUrl(t){let e=t.trim();e!==this.appUrlValue&&(this.appUrlValue=e,this.syncingAttributes=!0,e?this.setAttribute("app-url",e):this.removeAttribute("app-url"),this.syncingAttributes=!1,this.syncChildren())}toggle(){this.applyState(j(this.state))}showSidebar(){this.applyState(C(this.state,!0))}hideSidebar(){this.applyState(C(this.state,!1))}applyState(t){t.open===this.state.open&&t.activeTab===this.state.activeTab&&t.corner===this.state.corner||(this.state=t,this.syncingAttributes=!0,this.toggleAttribute("open",t.open),this.setAttribute("active-tab",t.activeTab),this.setAttribute("corner",t.corner),this.syncingAttributes=!1,this.syncChildren(),M(this.ownerDocument.defaultView,this.state.corner))}onKeyDown=t=>{if((t.key===J||t.code===pt)&&(t.metaKey||t.ctrlKey)&&!t.shiftKey&&!t.altKey&&!t.repeat){t.preventDefault(),t.stopPropagation(),this.toggle();return}t.key!=="Escape"||!this.state.open||this.hideSidebar()};onMessage=t=>{t.data&&typeof t.data=="object"&&"type"in t.data&&t.data.type===ht&&this.toggle()};render(){let t=this.attachShadow({mode:"open"}),e=this.ownerDocument;t.appendChild(X(e,`
258
+ `));let n=e.createElement("div");n.className="backdrop",n.setAttribute("part","backdrop"),n.addEventListener("click",()=>{this.dispatchEvent(new CustomEvent("slicc-overlay-close",{bubbles:!0,composed:!0}))}),t.appendChild(n);let a=e.createElement("aside");a.className="sidebar",a.setAttribute("part","sidebar"),a.setAttribute("aria-label","SLICC overlay sidebar");let i=e.createElement("header");i.className="header";let l=e.createElement("div");l.className="header__brand";let d=e.createElement("div"),s=e.createElement("div");s.className="header__title",s.textContent="slicc";let c=e.createElement("div");c.className="header__subtitle",c.textContent="electron float",d.appendChild(s),d.appendChild(c),l.appendChild(d),i.appendChild(l);let p=e.createElement("button");p.type="button",p.className="header__close",p.setAttribute("aria-label","Close SLICC overlay"),p.textContent="\xD7",p.addEventListener("click",()=>{this.dispatchEvent(new CustomEvent("slicc-overlay-close",{bubbles:!0,composed:!0}))}),i.appendChild(p),a.appendChild(i);let u=e.createElement("div");u.className="tab-bar",u.setAttribute("role","tablist"),u.setAttribute("aria-label","SLICC overlay tabs");for(let{id:g,label:S}of Z){let h=e.createElement("button");h.type="button",h.className="tab-bar__tab"+(g===o?" tab-bar__tab--active":""),h.setAttribute("role","tab"),h.setAttribute("aria-selected",String(g===o)),h.dataset.tab=g,h.textContent=S,this.tabButtons.set(g,h),h.addEventListener("click",()=>{this.dispatchEvent(new CustomEvent("slicc-overlay-select-tab",{bubbles:!0,composed:!0,detail:{tab:g}}))}),u.appendChild(h)}a.appendChild(u);let E=e.createElement("div");E.className="viewport";let x=e.createElement("iframe");x.title="SLICC electron float",this.iframe=x,x.addEventListener("load",()=>{this.frameLoaded=!0,this.postActiveTab()}),E.appendChild(x);let f=e.createElement("div");f.className="empty-state",f.textContent="Starting the local SLICC runtime\u2026",this.emptyState=f,E.appendChild(f),a.appendChild(E),t.appendChild(a),this.iframe?.addEventListener("load",()=>{this.frameLoaded=!0,this.postActiveTab()})}sync(){let t=b(this.getAttribute("active-tab")),e=this.getAttribute("app-url")?.trim()??v;for(let[o,n]of this.tabButtons){let a=o===t;n.classList.toggle("tab-bar__tab--active",a),n.setAttribute("aria-selected",String(a))}this.emptyState?.toggleAttribute("hidden",!!e),this.syncFrameUrl(e,t),this.postActiveTab()}syncFrameUrl(t,e){if(this.iframe){if(!t){this.currentAppUrl&&(this.currentAppUrl=v,this.frameLoaded=!1,this.lastPostedTab=null,this.iframe.removeAttribute("src"));return}t!==this.currentAppUrl&&(this.currentAppUrl=t,this.frameLoaded=!1,this.lastPostedTab=null,this.iframe.src=ut(t,e))}}postActiveTab(){if(!this.frameLoaded||!this.iframe?.contentWindow)return;let t=b(this.getAttribute("active-tab"));this.lastPostedTab!==t&&(this.iframe.contentWindow.postMessage({type:F,tab:t},"*"),this.lastPostedTab=t)}},w=class extends HTMLElement{static observedAttributes=["open","active-tab","app-url","corner"];state=L();appUrlValue=v;syncingAttributes=!1;connectedCallback(){this.state=L({open:this.hasAttribute("open"),activeTab:b(this.getAttribute("active-tab")),corner:m(this.getAttribute("corner")??D(this.ownerDocument.defaultView))}),this.appUrlValue=this.getAttribute("app-url")?.trim()??v,this.shadowRoot||this.render(),this.syncChildren(),M(this.ownerDocument.defaultView,this.state.corner),this.ownerDocument.addEventListener("keydown",this.onKeyDown,!0),this.ownerDocument.defaultView?.addEventListener("message",this.onMessage)}disconnectedCallback(){this.ownerDocument.removeEventListener("keydown",this.onKeyDown,!0),this.ownerDocument.defaultView?.removeEventListener("message",this.onMessage)}attributeChangedCallback(){this.syncingAttributes||(this.state=L({open:this.hasAttribute("open"),activeTab:b(this.getAttribute("active-tab")),corner:m(this.getAttribute("corner")??D(this.ownerDocument.defaultView))}),this.appUrlValue=this.getAttribute("app-url")?.trim()??v,this.syncChildren(),M(this.ownerDocument.defaultView,this.state.corner))}get open(){return this.state.open}set open(t){this.applyState(T(this.state,t))}get activeTab(){return this.state.activeTab}set activeTab(t){this.applyState(R(this.state,t))}get corner(){return this.state.corner}set corner(t){this.applyState(k(this.state,t))}get appUrl(){return this.appUrlValue}set appUrl(t){let e=t.trim();e!==this.appUrlValue&&(this.appUrlValue=e,this.syncingAttributes=!0,e?this.setAttribute("app-url",e):this.removeAttribute("app-url"),this.syncingAttributes=!1,this.syncChildren())}toggle(){this.applyState(j(this.state))}showSidebar(){this.applyState(T(this.state,!0))}hideSidebar(){this.applyState(T(this.state,!1))}applyState(t){t.open===this.state.open&&t.activeTab===this.state.activeTab&&t.corner===this.state.corner||(this.state=t,this.syncingAttributes=!0,this.toggleAttribute("open",t.open),this.setAttribute("active-tab",t.activeTab),this.setAttribute("corner",t.corner),this.syncingAttributes=!1,this.syncChildren(),M(this.ownerDocument.defaultView,this.state.corner))}onKeyDown=t=>{if((t.key===J||t.code===pt)&&(t.metaKey||t.ctrlKey)&&!t.shiftKey&&!t.altKey&&!t.repeat){t.preventDefault(),t.stopPropagation(),this.toggle();return}t.key!=="Escape"||!this.state.open||this.hideSidebar()};onMessage=t=>{t.data&&typeof t.data=="object"&&"type"in t.data&&t.data.type===ht&&this.toggle()};render(){let t=this.attachShadow({mode:"open"}),e=this.ownerDocument;t.appendChild(X(e,`
259
259
  ${V}
260
260
  :host {
261
261
  all: initial;
@@ -266,4 +266,4 @@
266
266
  z-index: 2147483647;
267
267
  contain: layout style paint;
268
268
  }
269
- `));let o=e.createElement(T);o.addEventListener("slicc-overlay-toggle",()=>this.toggle()),o.addEventListener("slicc-overlay-move",a=>{let i=a.detail?.corner;this.applyState(k(this.state,i))}),t.appendChild(o);let n=e.createElement(O);n.addEventListener("slicc-overlay-close",()=>this.hideSidebar()),n.addEventListener("slicc-overlay-select-tab",a=>{let i=a.detail?.tab;this.applyState(R(this.state,i))}),t.appendChild(n)}syncChildren(){let t=this.shadowRoot;if(!t)return;let e=t.querySelector(T),o=t.querySelector(O);!e||!o||(e.toggleAttribute("open",this.state.open),e.setAttribute("corner",this.state.corner),o.toggleAttribute("open",this.state.open),o.setAttribute("corner",this.state.corner),o.setAttribute("active-tab",this.state.activeTab),this.appUrlValue?o.setAttribute("app-url",this.appUrlValue):o.removeAttribute("app-url"))}};function bt(r=customElements){r.get(T)||r.define(T,Y),r.get(O)||r.define(O,U),r.get(P)||r.define(P,w)}function tt(r=document,t={}){bt(r.defaultView?.customElements??customElements);let e=r.getElementById(N),o;return e instanceof w?o=e:(e?.remove(),o=r.createElement(P)),o.id=N,o.isConnected||(r.body??r.documentElement).appendChild(o),typeof t.open=="boolean"&&(o.open=t.open),t.activeTab!==void 0&&(o.activeTab=b(t.activeTab)),t.appUrl!==void 0&&(o.appUrl=t.appUrl??v),t.corner!==void 0&&(o.corner=t.corner??D(r.defaultView)),o}function et(r=document){r.getElementById(N)?.remove()}function D(r){try{return m(r?.localStorage.getItem(Q))}catch{return m(null)}}function M(r,t){try{r?.localStorage.setItem(Q,t)}catch{}}function q(r,t,e){return Math.min(Math.max(r,t),e)}window.__SLICC_ELECTRON_OVERLAY__={inject(r={}){try{tt(document,r)}catch(t){console.error("[slicc-overlay] Injection failed:",t)}},remove(){try{et(document)}catch(r){console.error("[slicc-overlay] Removal failed:",r)}}};})();
269
+ `));let o=e.createElement(C);o.addEventListener("slicc-overlay-toggle",()=>this.toggle()),o.addEventListener("slicc-overlay-move",a=>{let i=a.detail?.corner;this.applyState(k(this.state,i))}),t.appendChild(o);let n=e.createElement(O);n.addEventListener("slicc-overlay-close",()=>this.hideSidebar()),n.addEventListener("slicc-overlay-select-tab",a=>{let i=a.detail?.tab;this.applyState(R(this.state,i))}),t.appendChild(n)}syncChildren(){let t=this.shadowRoot;if(!t)return;let e=t.querySelector(C),o=t.querySelector(O);!e||!o||(e.toggleAttribute("open",this.state.open),e.setAttribute("corner",this.state.corner),o.toggleAttribute("open",this.state.open),o.setAttribute("corner",this.state.corner),o.setAttribute("active-tab",this.state.activeTab),this.appUrlValue?o.setAttribute("app-url",this.appUrlValue):o.removeAttribute("app-url"))}};function bt(r=customElements){r.get(C)||r.define(C,Y),r.get(O)||r.define(O,U),r.get(P)||r.define(P,w)}function tt(r=document,t={}){bt(r.defaultView?.customElements??customElements);let e=r.getElementById(N),o;return e instanceof w?o=e:(e?.remove(),o=r.createElement(P)),o.id=N,o.isConnected||(r.body??r.documentElement).appendChild(o),typeof t.open=="boolean"&&(o.open=t.open),t.activeTab!==void 0&&(o.activeTab=b(t.activeTab)),t.appUrl!==void 0&&(o.appUrl=t.appUrl??v),t.corner!==void 0&&(o.corner=t.corner??D(r.defaultView)),o}function et(r=document){r.getElementById(N)?.remove()}function D(r){try{return m(r?.localStorage.getItem(Q))}catch{return m(null)}}function M(r,t){try{r?.localStorage.setItem(Q,t)}catch{}}function q(r,t,e){return Math.min(Math.max(r,t),e)}window.__SLICC_ELECTRON_OVERLAY__={inject(r={}){try{tt(document,r)}catch(t){console.error("[slicc-overlay] Injection failed:",t)}},remove(){try{et(document)}catch(r){console.error("[slicc-overlay] Removal failed:",r)}}};})();
@@ -5,28 +5,28 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>slicc</title>
7
7
  <link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
8
- <script type="module" crossorigin src="/assets/index-D4tp1ANR.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-Bv5amGny.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-jRWAZmH_.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-ca-nBW7U.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/logger-GnnuzSDq.js">
12
- <link rel="modulepreload" crossorigin href="/assets/path-utils-DAY6ORUp.js">
13
- <link rel="modulepreload" crossorigin href="/assets/fs-BOiXGVkS.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/path-utils-Dzkyzd3x.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/fs-t3D13Hd5.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/simple-options-CDIijiMb.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/hash-BN8UQrrC.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/browser-CFDl2kC3.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/global-db-Cui6Md0w.js">
18
- <link rel="modulepreload" crossorigin href="/assets/db-QbwB670D.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/db-CmHnV4DS.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/types-U7svdiTt.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/fetch-body-DPMYsjzA.js">
21
21
  <link rel="modulepreload" crossorigin href="/assets/magick-wasm-DpuDwl7G.js">
22
- <link rel="modulepreload" crossorigin href="/assets/skills-D15e98qd.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/skills-DclcqNBg.js">
23
23
  <link rel="modulepreload" crossorigin href="/assets/__vite-browser-external-BD_HvDfc.js">
24
- <link rel="modulepreload" crossorigin href="/assets/index-D4tp1ANR.js">
24
+ <link rel="modulepreload" crossorigin href="/assets/index-Bv5amGny.js">
25
25
  <link rel="modulepreload" crossorigin href="/assets/headers-qDMOQQGF.js">
26
- <link rel="modulepreload" crossorigin href="/assets/openai-codex-responses-B_UruyNV.js">
26
+ <link rel="modulepreload" crossorigin href="/assets/openai-codex-responses-Gx5Fi-2N.js">
27
27
  <link rel="modulepreload" crossorigin href="/assets/openai-D4NSaQIs.js">
28
- <link rel="modulepreload" crossorigin href="/assets/provider-settings-xCthm0Wq.js">
29
- <link rel="stylesheet" crossorigin href="/assets/index-BqtzdP8d.css">
28
+ <link rel="modulepreload" crossorigin href="/assets/provider-settings-DS3C0NKi.js">
29
+ <link rel="stylesheet" crossorigin href="/assets/index-B83C5cLK.css">
30
30
  </head>
31
31
  <body>
32
32
  <div id="app"></div>
@@ -5,28 +5,28 @@
5
5
  <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
6
  <title>slicc</title>
7
7
  <link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
8
- <script type="module" crossorigin src="/assets/index-D4tp1ANR.js"></script>
8
+ <script type="module" crossorigin src="/assets/index-Bv5amGny.js"></script>
9
9
  <link rel="modulepreload" crossorigin href="/assets/chunk-jRWAZmH_.js">
10
10
  <link rel="modulepreload" crossorigin href="/assets/preload-helper-ca-nBW7U.js">
11
11
  <link rel="modulepreload" crossorigin href="/assets/logger-GnnuzSDq.js">
12
- <link rel="modulepreload" crossorigin href="/assets/path-utils-DAY6ORUp.js">
13
- <link rel="modulepreload" crossorigin href="/assets/fs-BOiXGVkS.js">
12
+ <link rel="modulepreload" crossorigin href="/assets/path-utils-Dzkyzd3x.js">
13
+ <link rel="modulepreload" crossorigin href="/assets/fs-t3D13Hd5.js">
14
14
  <link rel="modulepreload" crossorigin href="/assets/simple-options-CDIijiMb.js">
15
15
  <link rel="modulepreload" crossorigin href="/assets/hash-BN8UQrrC.js">
16
16
  <link rel="modulepreload" crossorigin href="/assets/browser-CFDl2kC3.js">
17
17
  <link rel="modulepreload" crossorigin href="/assets/global-db-Cui6Md0w.js">
18
- <link rel="modulepreload" crossorigin href="/assets/db-QbwB670D.js">
18
+ <link rel="modulepreload" crossorigin href="/assets/db-CmHnV4DS.js">
19
19
  <link rel="modulepreload" crossorigin href="/assets/types-U7svdiTt.js">
20
20
  <link rel="modulepreload" crossorigin href="/assets/fetch-body-DPMYsjzA.js">
21
21
  <link rel="modulepreload" crossorigin href="/assets/magick-wasm-DpuDwl7G.js">
22
- <link rel="modulepreload" crossorigin href="/assets/skills-D15e98qd.js">
22
+ <link rel="modulepreload" crossorigin href="/assets/skills-DclcqNBg.js">
23
23
  <link rel="modulepreload" crossorigin href="/assets/__vite-browser-external-BD_HvDfc.js">
24
- <link rel="modulepreload" crossorigin href="/assets/index-D4tp1ANR.js">
24
+ <link rel="modulepreload" crossorigin href="/assets/index-Bv5amGny.js">
25
25
  <link rel="modulepreload" crossorigin href="/assets/headers-qDMOQQGF.js">
26
- <link rel="modulepreload" crossorigin href="/assets/openai-codex-responses-B_UruyNV.js">
26
+ <link rel="modulepreload" crossorigin href="/assets/openai-codex-responses-Gx5Fi-2N.js">
27
27
  <link rel="modulepreload" crossorigin href="/assets/openai-D4NSaQIs.js">
28
- <link rel="modulepreload" crossorigin href="/assets/provider-settings-xCthm0Wq.js">
29
- <link rel="stylesheet" crossorigin href="/assets/index-BqtzdP8d.css">
28
+ <link rel="modulepreload" crossorigin href="/assets/provider-settings-DS3C0NKi.js">
29
+ <link rel="stylesheet" crossorigin href="/assets/index-B83C5cLK.css">
30
30
  </head>
31
31
  <body>
32
32
  <div id="app"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliccy",
3
- "version": "2.26.2",
3
+ "version": "2.27.0",
4
4
  "description": "Browser-based coding agent with thin CLI server",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -32,12 +32,15 @@
32
32
  "packages/swift-server"
33
33
  ],
34
34
  "scripts": {
35
- "dev": "npx tsx packages/node-server/src/index.ts --dev",
36
- "dev:electron": "npx tsx packages/node-server/src/index.ts --dev --electron",
35
+ "dev": "tsx packages/node-server/src/index.ts --dev",
36
+ "dev:electron": "tsx packages/node-server/src/index.ts --dev --electron",
37
37
  "build": "npm run build -w @slicc/webapp && npm run build -w @slicc/node-server && npm run build -w @slicc/chrome-extension && npm run build -w @slicc/cloudflare-worker && npm run build -w @slicc/swift-server && npm run build -w @slicc/swift-launcher",
38
38
  "start": "node dist/node-server/index.js",
39
39
  "start:electron": "node dist/node-server/index.js --electron",
40
+ "preflight": "node packages/dev-tools/tools/preflight-deps.mjs",
41
+ "pretypecheck": "npm run preflight",
40
42
  "typecheck": "tsc --noEmit -p tsconfig.cli.json && tsc --noEmit -p tsconfig.json && tsc --noEmit -p tsconfig.worker.json",
43
+ "pretest": "npm run preflight",
41
44
  "test": "vitest run",
42
45
  "test:coverage": "vitest run --coverage",
43
46
  "test:coverage:cloudflare-worker": "vitest run --project cloudflare-worker --coverage --coverage.thresholds.lines=75 --coverage.thresholds.statements=75 --coverage.thresholds.functions=85 --coverage.thresholds.branches=65",
@@ -48,6 +51,11 @@
48
51
  "test:e2e": "npx playwright test --config packages/webapp/tests/e2e/playwright.config.ts",
49
52
  "start:extension": "npm run build -w @slicc/chrome-extension && npm run dev -- --profile=extension",
50
53
  "lint": "prettier --write . && eslint . --fix",
54
+ "deadcode": "knip --include files,dependencies,devDependencies,unlisted,binaries,unresolved,duplicates",
55
+ "deadcode:full": "knip",
56
+ "deadcode:files": "knip --include files",
57
+ "deadcode:production": "knip --production --strict",
58
+ "deadcode:swift": "npm run deadcode -w @slicc/swift-server && npm run deadcode -w @slicc/swift-launcher",
51
59
  "package:release": "node dist/node-server/release-package.js",
52
60
  "publish:chrome": "node dist/node-server/publish-chrome-web-store.js",
53
61
  "publish:worker": "echo \"$CLOUDFLARE_TURN_API_TOKEN\" | npx wrangler secret put CLOUDFLARE_TURN_API_TOKEN --config packages/cloudflare-worker/wrangler.jsonc && echo \"$GITHUB_CLIENT_SECRET\" | npx wrangler secret put GITHUB_CLIENT_SECRET --config packages/cloudflare-worker/wrangler.jsonc && npx wrangler deploy --config packages/cloudflare-worker/wrangler.jsonc && MAX_ATTEMPTS=6; for attempt in $(seq 1 \"$MAX_ATTEMPTS\"); do if npx vitest run --project cloudflare-worker packages/cloudflare-worker/tests/deployed.test.ts; then exit 0; fi; if [ \"$attempt\" -eq \"$MAX_ATTEMPTS\" ]; then echo \"Deployed smoke test failed after $MAX_ATTEMPTS attempts\"; exit 1; fi; echo \"Deployed smoke test failed on attempt $attempt; waiting for edge propagation before retrying...\"; sleep 15; done",
@@ -61,12 +69,8 @@
61
69
  "devDependencies": {
62
70
  "@eslint/js": "10.0.1",
63
71
  "@playwright/test": "^1.58.2",
64
- "@semantic-release/commit-analyzer": "13.0.1",
65
72
  "@semantic-release/exec": "7.1.0",
66
73
  "@semantic-release/git": "10.0.1",
67
- "@semantic-release/github": "12.0.6",
68
- "@semantic-release/npm": "13.1.5",
69
- "@semantic-release/release-notes-generator": "14.1.0",
70
74
  "@types/node": "^24.0.0",
71
75
  "@vitest/coverage-v8": "^4.1.5",
72
76
  "esbuild": "0.28.0",
@@ -74,9 +78,11 @@
74
78
  "eslint-config-prettier": "10.1.8",
75
79
  "globals": "17.6.0",
76
80
  "husky": "9.1.7",
81
+ "knip": "^6.11.0",
77
82
  "lint-staged": "16.4.0",
78
83
  "prettier": "3.8.3",
79
84
  "semantic-release": "25.0.3",
85
+ "tsx": "4.21.0",
80
86
  "typescript": "^6.0.0",
81
87
  "typescript-eslint": "8.59.1",
82
88
  "vite": "8.0.10",
@@ -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}.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:nowrap;text-align:center;border-radius:var(--s2-radius-s);pointer-events:none;opacity:0;z-index:10000;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__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}.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-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--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--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;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-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}.rail__item-press-layer{border-radius:inherit;pointer-events:none;z-index:0;position:absolute;inset:0;overflow:hidden}.rail__item-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 .rail__item-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: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))}
@@ -1 +0,0 @@
1
- import{t as e}from"./logger-GnnuzSDq.js";var t=e(`offscreen-client`),n=class{eventListeners=new Set;callbacks;scoops=[];scoopStatuses=new Map;currentMessageId=new Map;ready=!1;stateRetryTimer=null;localFs=null;selectedScoopJid=null;constructor(e){this.callbacks=e,this.setupMessageListener()}setLocalFS(e){this.localFs=e}createAgentHandle(){return{sendMessage:(e,t,n)=>{if(!this.selectedScoopJid){this.emitToUI({type:`error`,error:`No scoop selected`});return}this.send({type:`user-message`,scoopJid:this.selectedScoopJid,text:e,attachments:n,messageId:t??`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`})},onEvent:e=>(this.eventListeners.add(e),()=>this.eventListeners.delete(e)),stop:()=>{this.selectedScoopJid&&this.send({type:`abort`,scoopJid:this.selectedScoopJid})}}}getScoops(){return this.scoops}getScoop(e){return this.scoops.find(t=>t.jid===e)}isProcessing(e){return this.scoopStatuses.get(e)===`processing`}async registerScoop(e){if(!e.isCone)throw Error(`OffscreenClient.registerScoop is cone-only; use scoop_scoop for non-cone scoops`);this.scoops.find(t=>t.name===e.name)||(this.scoops.push(e),this.scoopStatuses.set(e.jid,`initializing`)),this.send({type:`cone-create`,name:e.name})}async unregisterScoop(e){this.send({type:`scoop-drop`,scoopJid:e}),this.scoops=this.scoops.filter(t=>t.jid!==e),this.scoopStatuses.delete(e)}createScoopTab(e){}async getGlobalMemory(){if(!this.localFs)return``;try{let e=await this.localFs.readFile(`/shared/CLAUDE.md`,{encoding:`utf-8`});return typeof e==`string`?e:new TextDecoder().decode(e)}catch{return``}}getScoopContext(e){if(this.localFs)return{getFS:()=>this.localFs}}getSharedFS(){return this.localFs}stopScoop(e){this.send({type:`abort`,scoopJid:e})}async clearQueuedMessages(e){}async deleteQueuedMessage(e,t){}updateModel(){this.send({type:`refresh-model`})}setScoopThinkingLevel(e,t){this.send({type:`set-thinking-level`,scoopJid:e,level:t})}async clearAllMessages(){this.send({type:`clear-chat`})}clearFilesystem(){this.send({type:`clear-filesystem`})}requestState(){this.send({type:`request-state`});let e=0;this.stateRetryTimer=setInterval(()=>{if(e++,this.ready||e>20){this.stateRetryTimer&&=(clearInterval(this.stateRetryTimer),null);return}t.debug(`Retrying request-state`,{attempt:e}),this.send({type:`request-state`})},500)}isReady(){return this.ready}sprinkleOpHandler=null;sendSprinkleLick(e,t,n){this.send({type:`sprinkle-lick`,sprinkleName:e,body:t,targetScoop:n})}setSprinkleOpHandler(e){this.sprinkleOpHandler=e}setupMessageListener(){chrome.runtime.onMessage.addListener((e,t,n)=>{if(!i(e))return!1;let r=e;if(r.source===`offscreen`){let e=r.payload;if(e?.type===`debug-tabs`){let t=window.__slicc_debug_tabs;t?.(!!e.show)}else e?.type===`sprinkle-op`&&this.sprinkleOpHandler?this.sprinkleOpHandler(e):this.handleOffscreenMessage(r.payload)}return!1})}handleOffscreenMessage(e){switch(e.type){case`offscreen-ready`:t.info(`Offscreen engine ready`),this.ready||this.send({type:`request-state`});break;case`agent-event`:this.handleAgentEvent(e);break;case`scoop-status`:this.handleScoopStatus(e);break;case`scoop-created`:this.handleScoopCreated(e);break;case`scoop-list`:this.handleScoopList(e);break;case`state-snapshot`:this.handleStateSnapshot(e);break;case`error`:this.handleError(e);break;case`incoming-message`:this.handleIncomingMessage(e);break}}handleAgentEvent(e){if(e.scoopJid===this.selectedScoopJid)switch(e.eventType){case`text_delta`:{let t=this.currentMessageId.get(e.scoopJid);t||(t=`scoop-${e.scoopJid}-${r()}`,this.currentMessageId.set(e.scoopJid,t),this.emitToUI({type:`message_start`,messageId:t})),this.emitToUI({type:`content_delta`,messageId:t,text:e.text??``});break}case`tool_start`:{let t=this.currentMessageId.get(e.scoopJid);t||(t=`scoop-${e.scoopJid}-${r()}`,this.currentMessageId.set(e.scoopJid,t),this.emitToUI({type:`message_start`,messageId:t})),this.emitToUI({type:`tool_use_start`,messageId:t,toolName:e.toolName??``,toolInput:e.toolInput});break}case`tool_end`:{let t=this.currentMessageId.get(e.scoopJid);t&&this.emitToUI({type:`tool_result`,messageId:t,toolName:e.toolName??``,result:e.toolResult??``,isError:e.isError});break}case`tool_ui`:{let t=this.currentMessageId.get(e.scoopJid);t||(t=`scoop-${e.scoopJid}-${r()}`,this.currentMessageId.set(e.scoopJid,t),this.emitToUI({type:`message_start`,messageId:t})),this.emitToUI({type:`tool_ui`,messageId:t,toolName:e.toolName??``,requestId:e.requestId??``,html:e.html??``});break}case`tool_ui_done`:{let t=this.currentMessageId.get(e.scoopJid);t&&this.emitToUI({type:`tool_ui_done`,messageId:t,requestId:e.requestId??``});break}case`response_done`:{let t=this.currentMessageId.get(e.scoopJid);t&&(this.emitToUI({type:`content_done`,messageId:t}),this.currentMessageId.delete(e.scoopJid));break}case`turn_end`:{let t=this.currentMessageId.get(e.scoopJid)??`done-${e.scoopJid}-${r()}`;this.currentMessageId.delete(e.scoopJid),this.emitToUI({type:`turn_end`,messageId:t});break}}}handleScoopStatus(e){this.scoopStatuses.set(e.scoopJid,e.status),this.callbacks.onStatusChange(e.scoopJid,e.status)}handleScoopCreated(e){let t=this.msgScoopToRegistered(e.scoop);this.scoops=this.scoops.filter(e=>e.name!==t.name||e.jid===t.jid),this.scoops.find(e=>e.jid===t.jid)||this.scoops.push(t),this.scoopStatuses.set(t.jid,e.scoop.status),this.callbacks.onScoopCreated(t)}handleScoopList(e){this.scoops=e.scoops.map(e=>this.msgScoopToRegistered(e));for(let t of e.scoops)this.scoopStatuses.set(t.jid,t.status);this.callbacks.onScoopListUpdate(e.scoops)}handleStateSnapshot(e){t.info(`Received state snapshot`,{scoopCount:e.scoops.length}),this.scoops=e.scoops.map(e=>this.msgScoopToRegistered(e));for(let t of e.scoops)this.scoopStatuses.set(t.jid,t.status);let n=!this.ready;n&&(this.ready=!0,this.stateRetryTimer&&=(clearInterval(this.stateRetryTimer),null)),this.callbacks.onScoopListUpdate(e.scoops),n&&this.callbacks.onReady?.()}handleError(e){e.scoopJid===this.selectedScoopJid&&this.emitToUI({type:`error`,error:e.error})}handleIncomingMessage(e){this.callbacks.onIncomingMessage(e.scoopJid,e.message)}msgScoopToRegistered(e){return{jid:e.jid,name:e.name,folder:e.folder,isCone:e.isCone,type:e.isCone?`cone`:`scoop`,requiresTrigger:!e.isCone,assistantLabel:e.assistantLabel,addedAt:new Date().toISOString(),...e.config?{config:{...e.config}}:{}}}emitToUI(e){for(let n of this.eventListeners)try{n(e)}catch(e){t.error(`Listener error`,{error:e instanceof Error?e.message:String(e)})}}send(e){chrome.runtime.sendMessage({source:`panel`,payload:e}).catch(e=>{t.error(`Failed to send to offscreen`,{error:e instanceof Error?e.message:String(e)})})}};function r(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function i(e){return typeof e==`object`&&!!e&&`source`in e&&`payload`in e}export{n as OffscreenClient};