sliccy 2.1.0 → 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ui/assets/agent-bridge-BQWM5sQP.js +1 -0
- package/dist/ui/assets/{index-DS_S39OY.js → index-DvKgWKET.js} +5 -4
- package/dist/ui/assets/index-wKcIJS6-.css +1 -0
- package/dist/ui/assets/lick-manager-D1bfS_SD.js +1 -0
- package/dist/ui/assets/secret-env-D4m7q3Dc.js +1 -0
- package/dist/ui/assets/shell-DKDHQ8Ux.js +1 -0
- package/dist/ui/assets/sprinkle-renderer-Dj8JsQhW.js +1 -0
- package/dist/ui/index.html +2 -2
- package/dist/ui/packages/webapp/index.html +2 -2
- package/package.json +1 -1
- package/dist/ui/assets/agent-bridge-B7tR-xiU.js +0 -1
- package/dist/ui/assets/index-CqFhWOY-.css +0 -1
- package/dist/ui/assets/lick-manager-BmCjku48.js +0 -1
- package/dist/ui/assets/secret-env-Zk-sdab2.js +0 -1
- package/dist/ui/assets/shell-1lwva6GM.js +0 -1
- package/dist/ui/assets/sprinkle-renderer-CYyt-iZc.js +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e}from"./index-DvKgWKET.js";export{e as publishAgentBridgeProxy};
|
|
@@ -239,7 +239,7 @@ ${t.includes(`<slicc-editor`)?`<script src="/slicc-editor.js"><\/script>`:``}
|
|
|
239
239
|
${t.includes(`<slicc-diff`)?`<script src="/slicc-diff.js"><\/script>`:``}
|
|
240
240
|
<script src="/lucide-icons.js"><\/script>
|
|
241
241
|
</head>
|
|
242
|
-
<body class="sprinkle-inline">${t}</body></html>`;if(ui)return hi(e,r,n);let i=document.createElement(`iframe`);i.setAttribute(`sandbox`,`allow-scripts allow-same-origin`),i.style.cssText=`width:100%;border:none;overflow:hidden;display:block;`,i.srcdoc=r,e.appendChild(i);let a=e=>{if(e.source!==i.contentWindow)return;let t=e.data;t?.type&&(t.type===`inline-sprinkle-lick`?n(t.action,t.data):t.type===`inline-sprinkle-height`&&(i.style.height=t.height+`px`))};return window.addEventListener(`message`,a),{dispose(){window.removeEventListener(`message`,a),i.remove()}}}function pi(e,t){let n=e.querySelectorAll(`pre > code.language-shtml`);if(n.length===0)return[];let r=[];for(let e of n){let n=e.parentElement,i=e.textContent??``,a=document.createElement(`div`);a.className=`msg__inline-sprinkle`,n.replaceWith(a),r.push(fi(a,i,t))}return r}function mi(e){for(let t of e)try{t.dispose()}catch{}e.length=0}function hi(e,t,n){let r=document.createElement(`iframe`);r.src=chrome.runtime.getURL(`sprinkle-sandbox.html`),r.style.cssText=`width:100%;border:none;overflow:hidden;display:block;`,e.appendChild(r);let i=e=>{if(e.source!==r.contentWindow)return;let t=e.data;t?.type&&(t.type===`inline-sprinkle-lick`?n(t.action,t.data):t.type===`inline-sprinkle-height`&&(r.style.height=t.height+`px`))};return window.addEventListener(`message`,i),r.addEventListener(`load`,()=>{r.contentWindow?.postMessage({type:`inline-sprinkle-render`,srcdoc:t},`*`)},{once:!0}),{dispose(){window.removeEventListener(`message`,i),r.remove()}}}var gi=n(`tool-ui-renderer`),_i=typeof chrome<`u`&&!!chrome?.runtime?.id,vi=class{container;iframe=null;inlineSprinkle=null;messageHandler=null;requestId;nonce;constructor(e,t){this.container=e,this.requestId=t,this.nonce=crypto.randomUUID()}async render(e){_i?await this.renderInSandbox(e):this.renderWithInlineSprinkle(e)}async renderInSandbox(e){let t=document.createElement(`iframe`);t.src=chrome.runtime.getURL(`tool-ui-sandbox.html`),t.style.cssText=`width: 100%; border: none; min-height: 60px;`,this.iframe=t,await new Promise((e,n)=>{let r=setTimeout(()=>{gi.error(`Tool UI iframe load timed out`),t.remove(),this.iframe=null,n(Error(`tool-ui sandbox iframe load timed out`))},5e3);t.addEventListener(`load`,()=>{clearTimeout(r),e()},{once:!0}),t.addEventListener(`error`,()=>{clearTimeout(r),t.remove(),this.iframe=null,n(Error(`tool-ui sandbox iframe failed to load`))},{once:!0}),this.container.appendChild(t)}),this.messageHandler=e=>{if(e.source!==t.contentWindow)return;let n=e.data;if(n?.type){if(n.nonce!==this.nonce){gi.warn(`Tool UI message nonce mismatch`,{expected:this.nonce,received:n.nonce});return}n.type===`tool-ui-action`&&n.id===this.requestId?(gi.info(`Tool UI action received`,{id:n.id,action:n.action}),v.handleAction(n.id,{action:n.action,data:n.data})):n.type===`tool-ui-rendered`&&n.id===this.requestId?n.height&&this.iframe&&(this.iframe.style.height=`${Math.max(60,n.height)}px`):n.type===`tool-ui-resize`&&n.id===this.requestId&&n.height&&this.iframe&&(this.iframe.style.height=`${Math.max(60,n.height)}px`)}},window.addEventListener(`message`,this.messageHandler);let{collectThemeCSS:n}=await r(async()=>{let{collectThemeCSS:e}=await import(`./sprinkle-renderer-CYyt-iZc.js`);return{collectThemeCSS:e}},[]),i=n();t.contentWindow.postMessage({type:`tool-ui-render`,id:this.requestId,nonce:this.nonce,html:e,themeCSS:i},`*`)}renderWithInlineSprinkle(e){let t=document.createElement(`div`);t.className=`msg__inline-sprinkle`,this.container.appendChild(t),this.inlineSprinkle=fi(t,e,(e,t)=>{gi.info(`Tool UI action (inline sprinkle)`,{id:this.requestId,action:e}),v.handleAction(this.requestId,{action:e,data:t})})}dispose(){this.messageHandler&&=(window.removeEventListener(`message`,this.messageHandler),null),this.iframe&&=(this.iframe.remove(),null),this.inlineSprinkle&&=(this.inlineSprinkle.dispose(),null)}},yi=new Map;function bi(e,t,n){let r=yi.get(t);r&&r.dispose();let i=new vi(e,t);return yi.set(t,i),i.render(n).catch(e=>{gi.error(`Failed to render tool UI`,{requestId:t,error:e.message})}),i}function xi(e){let t=yi.get(e);t&&(t.dispose(),yi.delete(e))}var Si=n(`chat-panel`);function Ci(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}var wi={bash:`$`,browser:`B`,read_file:`R`,write_file:`W`,edit_file:`E`,javascript:`JS`,delegate_to_scoop:`D`,send_message:`M`,schedule_task:`T`,list_scoops:`LS`,list_tasks:`LT`,register_scoop:`RS`,update_global_memory:`GM`};function Ti(e){return wi[e]??`?`}function Ei(e){return e.role===`assistant`?Kr(e.content):Gr(e.content)}var Di=class{container;messagesEl;messagesInner;inputArea;textarea;sendBtn;stopBtn;micBtn;voiceInput=null;voiceMode=!1;keydownListener=null;messages=[];agent=null;unsubscribe=null;isStreaming=!1;currentStreamId=null;sessionStore;sessionId;readOnly=!1;terminalOutputCallback=null;currentScoopName=null;autoScrollAttached=!0;lastScrollTop=0;jumpPill;onDeleteQueuedMessage=null;pendingDeltaText=``;streamingRafId=null;inlineSprinkles=new Map;onInlineSprinkleLick;modelSelectorEl;onModelChange;constructor(e){this.container=e,this.sessionStore=new Qr,this.sessionId=`default`,this.render()}setAgent(e){this.unsubscribe?.(),this.agent=e,this.unsubscribe=e.onEvent(e=>this.handleAgentEvent(e))}onTerminalOutput(e){this.terminalOutputCallback=e}setDeleteQueuedMessageCallback(e){this.onDeleteQueuedMessage=e}async initSession(e){await this.sessionStore.init(),this.sessionId=e??`default`;let t=await this.sessionStore.load(this.sessionId);t&&t.messages.length>0&&(this.messages=t.messages.map(e=>({...e,isStreaming:!1})),this.renderMessages())}async clearSession(){this.messages=[],this.renderMessages(),await this.sessionStore.delete(this.sessionId)}async deleteSessionById(e){await this.sessionStore.delete(e)}async switchToContext(e,t,n){await this.persistSessionAsync(),this.setStreamingState(!1),this.currentStreamId=null,this.cancelPendingDelta(),this.sessionId=e,this.currentScoopName=n??null,this.setReadOnly(t);let r=await this.sessionStore.load(this.sessionId);r&&r.messages.length>0?this.messages=r.messages.map(e=>({...e,isStreaming:!1})):this.messages=[],this.renderMessages()}setReadOnly(e){this.readOnly=e,this.inputArea&&(this.inputArea.style.display=e?`none`:``)}async persistSessionAsync(){try{await this.sessionStore.saveMessages(this.sessionId,this.messages)}catch{}}setProcessing(e){e?this.setStreamingState(!0):this.setStreamingState(!1)}addSystemMessage(e){let t={id:Ci(),role:`assistant`,content:e,timestamp:Date.now()};this.messages.push(t),this.appendMessageEl(t),this.persistSession()}addLickMessage(e,t,n){let r={id:e,role:`user`,content:t,timestamp:Date.now(),source:`lick`,channel:n};this.messages.push(r),this.appendMessageEl(r),this.persistSession()}getMessages(){return[...this.messages]}loadMessages(e){this.messages=e.map(e=>({...e,isStreaming:!1})),this.renderMessages(),this.persistSession(),this.renderModelSelector()}clear(){this.messages=[],this.renderMessages(),this.renderModelSelector()}addUserMessage(e){let t={id:Ci(),role:`user`,content:e,timestamp:Date.now()};this.messages.push(t),this.appendMessageEl(t)}deleteQueuedMessage(e){let t=this.messages.findIndex(t=>t.id===e);if(t===-1)return;this.messages.splice(t,1);let n=this.messagesEl.querySelector(`[data-msg-id="${e}"]`);n&&n.remove(),this.persistSession(),this.onDeleteQueuedMessage?.(e)}render(){this.container.innerHTML=``,this.container.classList.add(`chat`),this.messagesEl=document.createElement(`div`),this.messagesEl.className=`chat__messages`,this.messagesInner=document.createElement(`div`),this.messagesInner.className=`chat__messages-inner`,this.messagesEl.appendChild(this.messagesInner),this.container.appendChild(this.messagesEl),this.messagesEl.addEventListener(`scroll`,()=>{let{scrollTop:e,scrollHeight:t,clientHeight:n}=this.messagesEl;t-e-n<=250?(this.autoScrollAttached=!0,this.hideJumpPill()):e<this.lastScrollTop&&(this.autoScrollAttached=!1),this.lastScrollTop=e},{passive:!0}),this.inputArea=document.createElement(`div`);let e=this.inputArea;e.className=`chat__input-area`;let t=document.createElement(`div`);t.className=`chat__input-area-inner`,this.textarea=document.createElement(`textarea`),this.textarea.className=`chat__textarea`,this.textarea.placeholder=`What shall we build?`,this.textarea.rows=1,this.sendBtn=document.createElement(`button`),this.sendBtn.className=`chat__send-btn`,this.sendBtn.innerHTML=`<svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor"><path d="M10 1.25C5.167 1.25 1.25 5.167 1.25 10s3.917 8.75 8.75 8.75 8.75-3.918 8.75-8.75S14.833 1.25 10 1.25zm3.527 8.284a.75.75 0 0 1-1.06 0L10.75 7.82v6.172a.75.75 0 0 1-1.5 0V7.812L7.527 9.534a.75.75 0 1 1-1.06-1.06l2.998-2.998a.75.75 0 0 1 1.06-.001l3.002 2.998a.75.75 0 0 1 0 1.061z"/></svg>`,this.sendBtn.dataset.tooltip=`Send message`,this.sendBtn.dataset.tooltipPos=`top`,this.stopBtn=document.createElement(`button`),this.stopBtn.className=`chat__stop-btn`,this.stopBtn.innerHTML=`<svg width="16" height="16" viewBox="0 0 20 20" fill="currentColor"><path d="M13.75 4H6.25A2.25 2.25 0 0 0 4 6.25v7.5A2.25 2.25 0 0 0 6.25 16h7.5A2.25 2.25 0 0 0 16 13.75v-7.5A2.25 2.25 0 0 0 13.75 4z"/></svg>`,this.stopBtn.dataset.tooltip=`Stop generation`,this.stopBtn.style.display=`none`,this.micBtn=document.createElement(`button`),this.micBtn.className=`chat__mic-btn`;let n=`http://www.w3.org/2000/svg`,r=document.createElementNS(n,`svg`);r.setAttribute(`width`,`16`),r.setAttribute(`height`,`16`),r.setAttribute(`viewBox`,`0 0 24 24`),r.setAttribute(`fill`,`none`),r.setAttribute(`stroke`,`currentColor`),r.setAttribute(`stroke-width`,`2`),r.setAttribute(`stroke-linecap`,`round`),r.setAttribute(`stroke-linejoin`,`round`);let i=document.createElementNS(n,`path`);i.setAttribute(`d`,`M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z`);let a=document.createElementNS(n,`path`);a.setAttribute(`d`,`M19 10v2a7 7 0 0 1-14 0v-2`);let o=document.createElementNS(n,`line`);o.setAttribute(`x1`,`12`),o.setAttribute(`y1`,`19`),o.setAttribute(`x2`,`12`),o.setAttribute(`y2`,`23`);let s=document.createElementNS(n,`line`);s.setAttribute(`x1`,`8`),s.setAttribute(`y1`,`23`),s.setAttribute(`x2`,`16`),s.setAttribute(`y2`,`23`),r.append(i,a,o,s),this.micBtn.appendChild(r),this.micBtn.dataset.tooltip=`Voice (Ctrl+Shift+V)`;let c=document.createElement(`div`);c.className=`chat__input-wrapper`,c.appendChild(this.textarea);let l=document.createElement(`div`);l.className=`chat__action-bar`;let u=document.createElement(`div`);u.className=`chat__action-bar-left`,u.appendChild(this.micBtn),l.appendChild(u),this.modelSelectorEl=document.createElement(`div`),this.modelSelectorEl.className=`chat__model-selector`,this.renderModelSelector(),l.appendChild(this.modelSelectorEl);let d=document.createElement(`div`);d.className=`chat__action-bar-right`,d.appendChild(this.sendBtn),d.appendChild(this.stopBtn),l.appendChild(d),c.appendChild(l),t.appendChild(c),e.appendChild(t),this.container.appendChild(e),this.jumpPill=document.createElement(`button`),this.jumpPill.className=`chat__jump-pill`,this.jumpPill.textContent=`↓ New activity`,this.jumpPill.addEventListener(`click`,()=>{this.autoScrollAttached=!0,this.hideJumpPill(),this.scrollToBottom(!0)}),this.container.appendChild(this.jumpPill),this.textarea.addEventListener(`keydown`,e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),this.sendMessage())}),this.textarea.addEventListener(`input`,()=>{this.textarea.style.height=`auto`,this.textarea.style.height=Math.min(this.textarea.scrollHeight,120)+`px`}),this.sendBtn.addEventListener(`click`,()=>this.sendMessage()),this.stopBtn.addEventListener(`click`,()=>{this.agent?.stop();for(let e of this.messages)e.queued&&(e.queued=!1,this.updateMessageEl(e.id));this.setStreamingState(!1)}),this.voiceInput=new ni({onTranscript:(e,t)=>{this.textarea.value=e,this.textarea.style.height=`auto`,this.textarea.style.height=Math.min(this.textarea.scrollHeight,120)+`px`},onStateChange:e=>{e===`error`?(this.voiceMode=!1,this.micBtn.classList.remove(`chat__mic-btn--active`,`chat__mic-btn--listening`)):this.voiceMode?e===`listening`&&this.micBtn.classList.add(`chat__mic-btn--listening`):this.micBtn.classList.toggle(`chat__mic-btn--listening`,e===`listening`)},onError:e=>{Si.debug(`Voice input error`,{error:e}),!(this.voiceMode&&e.includes(`No speech detected`))&&this.addSystemMessage(e)},autoSend:!0,onAutoSend:e=>{this.textarea.value=e,this.sendMessage()},onAutoDisable:()=>{this.voiceMode=!1,this.micBtn.classList.remove(`chat__mic-btn--active`,`chat__mic-btn--listening`),this.addSystemMessage(`Voice mode disabled after 2 minutes of inactivity.`)},lang:ii()}),this.micBtn.addEventListener(`click`,()=>{this.toggleVoiceMode()}),this.keydownListener=e=>{e.shiftKey&&(e.ctrlKey||e.metaKey)&&e.key===`V`&&(e.preventDefault(),this.toggleVoiceMode())},document.addEventListener(`keydown`,this.keydownListener)}toggleVoiceMode(){this.voiceMode=!this.voiceMode,this.micBtn.classList.toggle(`chat__mic-btn--active`,this.voiceMode),this.voiceMode?this.voiceInput?.start():this.voiceInput?.stop()}sendMessage(){let e=this.textarea.value.trim();if(!e)return;this.autoScrollAttached=!0,this.hideJumpPill();let t=this.isStreaming,n={id:Ci(),role:`user`,content:e,timestamp:Date.now(),queued:t||void 0};this.messages.push(n),this.appendMessageEl(n),this.persistSession(),this.textarea.value=``,this.textarea.style.height=`auto`,this.isStreaming||this.setStreamingState(!0),this.agent?.sendMessage(e,n.id)}handleAgentEvent(e){switch(Si.debug(`Agent event`,{type:e.type}),e.type){case`message_start`:this.handleMessageStart(e.messageId);break;case`content_delta`:this.handleContentDelta(e.messageId,e.text);break;case`content_done`:this.handleContentDone(e.messageId);break;case`tool_use_start`:this.handleToolUseStart(e.messageId,e.toolName,e.toolInput);break;case`tool_result`:this.handleToolResult(e.messageId,e.toolName,e.result,e.isError);break;case`tool_ui`:this.handleToolUI(e.messageId,e.toolName,e.requestId,e.html);break;case`tool_ui_done`:this.handleToolUIDone(e.messageId,e.requestId);break;case`turn_end`:this.handleTurnEnd(e.messageId);break;case`error`:this.handleError(e.error);break;case`screenshot`:break;case`terminal_output`:this.terminalOutputCallback?.(e.text);break}}handleMessageStart(e){this.setStreamingState(!0),this.currentStreamId=e;let t={id:e,role:`assistant`,content:``,timestamp:Date.now(),isStreaming:!0,toolCalls:[]};this.messages.push(t),this.appendMessageEl(t)}handleContentDelta(e,t){this.findMessage(e)&&(this.pendingDeltaText+=t,this.streamingRafId===null&&(this.streamingRafId=requestAnimationFrame(()=>this.flushPendingDelta())))}handleContentDone(e){if(this.pendingDeltaText&&this.currentStreamId===e){let t=this.findMessage(e);t&&(t.content+=this.pendingDeltaText)}this.cancelPendingDelta();let t=this.findMessage(e);t&&(t.isStreaming=!1,this.updateMessageEl(e))}handleToolUseStart(e,t,n){let r=this.findMessage(e);r&&(r.toolCalls||=[],r.toolCalls.push({id:Ci(),name:t,input:n}),this.updateMessageEl(e))}handleToolResult(e,t,n,r){let i=this.findMessage(e);if(!i||!i.toolCalls)return;let a=[...i.toolCalls].reverse().find(e=>e.name===t&&e.result===void 0);if(a){let e=n.match(/<img:(data:image\/[^>]+)>/);a.result=n.replace(/<img:data:image\/[^>]+>/g,``).trim(),e&&(a._screenshotDataUrl=e[1]),a.isError=r}this.updateMessageEl(e)}handleToolUI(e,t,n,r,i=0){let a=this.findMessage(e);if(!a||!a.toolCalls){if(i<10){setTimeout(()=>this.handleToolUI(e,t,n,r,i+1),100);return}Si.warn(`handleToolUI: message or toolCalls not found after retries`,{messageId:e});return}let o=[...a.toolCalls].reverse().find(e=>e.name===t&&e.result===void 0);if(!o){Si.warn(`handleToolUI: no matching tool call found`,{messageId:e,toolName:t});return}o._toolUIRequestId=n;let s=this.messagesEl.querySelector(`[data-msg-id="${e}"]`);if(!s){if(i<10){setTimeout(()=>this.handleToolUI(e,t,n,r,i+1),100);return}Si.warn(`handleToolUI: wrapper element not found after retries`,{messageId:e});return}let c=[...s.querySelectorAll(`.tool-call`)].reverse().find(e=>e.querySelector(`.tool-call__name`)?.textContent===t);if(c){c instanceof HTMLDetailsElement&&(c.open=!0);let e=c.querySelector(`.tool-call__ui`);e||(e=document.createElement(`div`),e.className=`tool-call__ui`,c.appendChild(e)),bi(e,n,r)}else i<10?setTimeout(()=>this.handleToolUI(e,t,n,r,i+1),100):Si.warn(`handleToolUI: tool call element not found in DOM after retries`,{toolName:t})}handleToolUIDone(e,t){xi(t)}handleTurnEnd(e){this.setStreamingState(!1),this.currentStreamId=null,this.persistSession()}handleError(e){this.setStreamingState(!1),this.currentStreamId=null;let t=this.messages[this.messages.length-1];if(t?.role===`assistant`&&t.isStreaming)t.isStreaming=!1,t.content+=`\n\n**Error:** ${e}`,this.updateMessageEl(t.id);else{let t={id:Ci(),role:`assistant`,content:`**Error:** ${e}`,timestamp:Date.now()};this.messages.push(t),this.appendMessageEl(t)}this.persistSession()}setStreamingState(e){this.isStreaming=e;try{this.renderModelSelector()}catch{}if(this.stopBtn.style.display=e?`flex`:`none`,this.sendBtn.style.display=e?`none`:`flex`,this.textarea.disabled=!1,e){this.voiceInput?.isListening()&&this.voiceInput.stop(),this.micBtn.classList.remove(`chat__mic-btn--listening`);let e=this.messages.find(e=>e.queued);e&&(e.queued=!1,this.updateMessageEl(e.id))}e||(this.voiceMode?(this.micBtn.classList.add(`chat__mic-btn--listening`),this.voiceInput?.start()):this.textarea.focus())}renderModelSelector(){let e=this.modelSelectorEl;if(!e)return;for(;e.firstChild;)e.removeChild(e.firstChild);let t=j(),n=C(),r=te(),i=[];for(let e of t)for(let t of e.models)i.push({providerId:e.providerId,id:t.id,name:t.name,reasoning:t.reasoning});i.sort((e,t)=>e.reasoning===t.reasoning?e.name.localeCompare(t.name):e.reasoning?-1:1);let a=i.find(e=>e.id===n&&e.providerId===r)||i[0];if(!a)return;let o=this.isStreaming,s=document.createElement(`button`);if(s.className=`chat__model-btn chat__model-btn--compact`,o&&s.classList.add(`chat__model-btn--disabled`),s.textContent=a.name,!o){let e=document.createElement(`span`);e.className=`chat__model-chevron`,e.innerHTML=`<svg width="12" height="12" viewBox="0 0 16 16" fill="currentColor"><path d="M4.5 6l3.5 4 3.5-4z"/></svg>`,s.appendChild(e)}if(o)e.appendChild(s);else{let t=!1,a=document.createElement(`div`);a.className=`chat__model-menu`;let o=()=>{for(a.style.display=t?`block`:`none`;a.firstChild;)a.removeChild(a.firstChild);if(t)for(let e of i){let i=document.createElement(`div`);i.className=`chat__model-menu-item`;let o=e.id===n&&e.providerId===r;o&&i.classList.add(`chat__model-menu-item--active`);let s=document.createElement(`span`);if(s.textContent=e.name,i.appendChild(s),o){let e=document.createElement(`span`);e.className=`chat__model-check`,e.innerHTML=`<svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M6.5 12.5l-4-4 1.4-1.4 2.6 2.6 5.6-5.6 1.4 1.4z"/></svg>`,i.appendChild(e)}i.addEventListener(`click`,()=>{let n=`${e.providerId}:${e.id}`;b(n),this.onModelChange?.(n),t=!1,this.renderModelSelector()}),a.appendChild(i)}};s.addEventListener(`click`,e=>{e.stopPropagation(),t=!t,o()}),document.addEventListener(`click`,()=>{t=!1,o()},{once:!0}),e.appendChild(s),e.appendChild(a),o()}}refreshModelSelector(){this.renderModelSelector()}findMessage(e){return this.messages.find(t=>t.id===e)}flushPendingDelta(){if(this.streamingRafId=null,!this.pendingDeltaText||!this.currentStreamId)return;let e=this.findMessage(this.currentStreamId);if(!e){this.pendingDeltaText=``;return}e.content+=this.pendingDeltaText,this.pendingDeltaText=``,this.updateStreamingContent(this.currentStreamId)}cancelPendingDelta(){this.streamingRafId!==null&&(cancelAnimationFrame(this.streamingRafId),this.streamingRafId=null),this.pendingDeltaText=``}updateStreamingContent(e){let t=this.findMessage(e);if(!t)return;let n=this.messagesEl.querySelector(`[data-msg-id="${e}"]`);if(!n)return;let r=n.querySelector(`.msg__content`);if(r){if(r.innerHTML=Ei(t),t.isStreaming){let e=document.createElement(`span`);e.className=`streaming-cursor`,r.appendChild(e)}}else if(t.content.trim().length>0){this.updateMessageEl(e);return}this.scrollToBottom()}renderMessages(){this.disposeAllInlineSprinkles(),this.messagesInner.innerHTML=``;let e=null,t=0,n=-1;for(let e=this.messages.length-1;e>=0;e--)if(this.messages[e].role===`assistant`){n=e;break}for(let r=0;r<this.messages.length;r++){let i=this.messages[r],a=this.shouldShowLabel(i,e,t),o=this.createMessageEl(i,a,r===n);this.messagesInner.appendChild(o),e=i.role,t=i.timestamp}this.autoScrollAttached=!0,this.hideJumpPill(),this.scrollToBottom(!0)}appendMessageEl(e){let t=this.messagesInner.querySelector(`.msg__feedback`);t&&t.remove();let n=this.messages.length>=2?this.messages[this.messages.length-2]:null,r=this.shouldShowLabel(e,n?.role??null,n?.timestamp??0),i=e.role===`assistant`,a=this.createMessageEl(e,r,i);this.messagesInner.appendChild(a),this.scrollToBottom()}shouldShowLabel(e,t,n){return e.source===`lick`||e.channel===`webhook`||e.channel===`cron`||e.role!==t||e.timestamp-n>12e4}updateMessageEl(e){let t=this.findMessage(e);if(!t)return;let n=this.messagesEl.querySelector(`[data-msg-id="${e}"]`);if(n){this.disposeInlineSprinklesForMessage(e);let r=this.messages.indexOf(t),i=r>0?this.messages[r-1]:null,a=this.shouldShowLabel(t,i?.role??null,i?.timestamp??0),o=!1;if(t.role===`assistant`){let e=-1;for(let t=this.messages.length-1;t>=0;t--)if(this.messages[t].role===`assistant`){e=t;break}o=r===e}let s=this.createMessageEl(t,a,o);n.replaceWith(s)}this.scrollToBottom()}createMessageEl(e,t=!0,n=!1){if(e.source===`lick`||e.channel===`webhook`||e.channel===`cron`||e.channel===`fswatch`){let t=document.createElement(`div`);return t.className=`msg-group`,t.setAttribute(`data-msg-id`,e.id),t.appendChild(this.createLickEl(e)),t}let r=document.createElement(`div`);r.className=`msg-group${t?``:` msg-group--continuation`}`,r.setAttribute(`data-msg-id`,e.id);let i=document.createElement(`div`);if(i.className=`msg msg--${e.role}${e.queued?` msg--queued`:``}`,t){let t,n,r=this.currentScoopName!==null;e.role===`user`?e.source===`delegation`||e.channel===`delegation`?(t=`S`,n=`sliccy`):(t=`U`,n=`You`):r?(t=(this.currentScoopName||`S`).charAt(0).toUpperCase(),n=`@${this.currentScoopName}`):e.source&&e.source!==`cone`?(t=e.source.charAt(0).toUpperCase(),n=e.source):(t=`S`,n=`sliccy`);let a=document.createElement(`div`);a.className=`msg__role`;let o=document.createElement(`span`);if(o.className=`msg__icon`,o.textContent=t,a.appendChild(o),a.appendChild(document.createTextNode(` ${n}`)),e.queued){let t=document.createElement(`span`);t.className=`msg__queued-badge`,t.textContent=`queued`,a.appendChild(t);let n=document.createElement(`button`);n.className=`msg__queued-delete`,n.textContent=`×`,n.title=`Remove queued message`,n.addEventListener(`click`,t=>{t.stopPropagation(),this.deleteQueuedMessage(e.id)}),a.appendChild(n)}i.appendChild(a)}let a=(e.source===`lick`||e.channel===`webhook`||e.channel===`cron`||e.channel===`fswatch`)&&this.sessionId===`session-cone`,o=e.source&&e.source!==`cone`&&e.source!==`lick`&&e.role===`assistant`&&this.sessionId===`session-cone`;if(a||o){let t=document.createElement(`details`);t.className=`msg__collapsible`;let n=document.createElement(`summary`);n.className=`msg__summary`,n.textContent=e.content.slice(0,60).replace(/\n/g,` `)+(e.content.length>60?`...`:``),t.appendChild(n);let r=document.createElement(`div`);r.className=`msg__content`,r.innerHTML=Ei(e),e.isStreaming||this.hydrateInlineSprinklesInEl(r,e.id),t.appendChild(r),i.appendChild(t)}else{let t=document.createElement(`div`);if(t.className=`msg__content`,t.innerHTML=Ei(e),e.isStreaming){let e=document.createElement(`span`);e.className=`streaming-cursor`,t.appendChild(e)}else this.hydrateInlineSprinklesInEl(t,e.id);i.appendChild(t)}let s=e.content.trim().length>0;if(s&&r.appendChild(i),e.toolCalls)for(let t of e.toolCalls)r.appendChild(this.createToolCallEl(t));return e.role===`assistant`&&!e.isStreaming&&!e.queued&&s&&n&&r.appendChild(this.createFeedbackRow()),r}createFeedbackRow(){let e=document.createElement(`div`);e.className=`msg__feedback`;let t=document.createElement(`button`);return t.className=`msg__feedback-btn`,t.dataset.tooltip=`Copy chat`,t.setAttribute(`aria-label`,`Copy chat`),t.innerHTML=`<svg width="16" height="16" viewBox="0 0 20 20" fill="currentColor"><path d="m11.75,18h-7.5c-1.24,0-2.25-1.01-2.25-2.25v-7.5c0-1.24,1.01-2.25,2.25-2.25.41,0,.75.34.75.75s-.34.75-.75.75c-.41,0-.75.34-.75.75v7.5c0,.41.34.75.75.75h7.5c.41,0,.75-.34.75-.75,0-.41.34-.75.75-.75s.75.34.75.75c0,1.24-1.01,2.25-2.25,2.25Z"/><path d="m6.75,5c-.41,0-.75-.34-.75-.75,0-1.24,1.01-2.25,2.25-2.25.41,0,.75.34.75.75s-.34.75-.75.75c-.41,0-.75.34-.75.75,0,.41-.34.75-.75.75Z"/><path d="m13,3.5h-2c-.41,0-.75-.34-.75-.75s.34-.75.75-.75h2c.41,0,.75.34.75.75s-.34.75-.75.75Z"/><path d="m13,14h-2c-.41,0-.75-.34-.75-.75s.34-.75.75-.75h2c.41,0,.75.34.75.75s-.34.75-.75.75Z"/><path d="m15.75,14c-.41,0-.75-.34-.75-.75s.34-.75.75-.75c.41,0,.75-.34.75-.75,0-.41.34-.75.75-.75s.75.34.75.75c0,1.24-1.01,2.25-2.25,2.25Z"/><path d="m17.25,5c-.41,0-.75-.34-.75-.75,0-.41-.34-.75-.75-.75-.41,0-.75-.34-.75-.75s.34-.75.75-.75c1.24,0,2.25,1.01,2.25,2.25,0,.41-.34.75-.75.75Z"/><path d="m17.25,9.75c-.41,0-.75-.34-.75-.75v-2c0-.41.34-.75.75-.75s.75.34.75.75v2c0,.41-.34.75-.75.75Z"/><path d="m6.75,9.75c-.41,0-.75-.34-.75-.75v-2c0-.41.34-.75.75-.75s.75.34.75.75v2c0,.41-.34.75-.75.75Z"/><path d="m8.25,14c-1.24,0-2.25-1.01-2.25-2.25,0-.41.34-.75.75-.75s.75.34.75.75c0,.41.34.75.75.75.41,0,.75.34.75.75s-.34.75-.75.75Z"/></svg>`,t.addEventListener(`click`,async()=>{let e=this.getMessages(),n=``;for(let t of e){let e=t.role===`user`?`User`:`Assistant`;if(n+=`## ${e}\n${t.content}\n\n`,t.toolCalls)for(let e of t.toolCalls)n+=`### Tool: ${e.name}\nInput: ${JSON.stringify(e.input,null,2)}\nResult: ${e.result??``}\n\n`}await navigator.clipboard.writeText(n),t.style.color=`var(--s2-positive)`,setTimeout(()=>{t.style.color=``},1500)}),e.appendChild(t),e}createLickEl(e){let t=document.createElement(`details`);t.className=`lick`;let n=e.channel===`webhook`?`Webhook`:e.channel===`cron`?`Cron`:e.channel===`fswatch`?`File Watch`:e.channel===`navigate`?`Navigate`:`Event`,r=document.createElement(`summary`);r.className=`lick__header`,r.innerHTML=`<span class="lick__icon">E</span> <span class="lick__type">${n}</span>`;let i=document.createElement(`span`);i.className=`lick__preview`;let a=e.content.replace(/\[Webhook Event:.*?\]\n```json\n?/s,``).slice(0,50);i.textContent=a.replace(/\n/g,` `)+(a.length>=50?`...`:``),r.appendChild(i),t.appendChild(r);let o=document.createElement(`div`);return o.className=`lick__details`,o.innerHTML=Gr(e.content),t.appendChild(o),t}createToolCallEl(e){Ti(e.name);let t=document.createElement(`details`);t.className=`tool-call`;let n=document.createElement(`summary`);if(n.className=`tool-call__header`,n.innerHTML=`<span class="tool-call__icon"><svg width="10" height="10" viewBox="0 0 10 10" fill="currentColor"><path d="M2 3.5L5 6.5L8 3.5" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg></span> <span class="tool-call__name">${Mr(e.name)}</span>`,e.input!==void 0){let t=document.createElement(`span`);t.className=`tool-call__preview`;let r=typeof e.input==`string`?e.input:JSON.stringify(e.input);t.textContent=r.slice(0,40)+(r.length>40?`...`:``),n.appendChild(t)}let r=document.createElement(`span`);e.result===void 0?r.className=`tool-call__status tool-call__status--running`:e.isError?(r.className=`tool-call__status tool-call__status--error`,r.textContent=`failed`):(r.className=`tool-call__status tool-call__status--success`,r.textContent=`✓`),n.appendChild(r),t.appendChild(n);let i=document.createElement(`div`);if(i.className=`tool-call__details`,e.input!==void 0){let t=document.createElement(`div`);t.className=`tool-call__input`;let n=document.createElement(`div`);n.className=`tool-call__label`,n.textContent=`Input:`,t.appendChild(n);let r=document.createElement(`pre`);r.innerHTML=qr(e.input),t.appendChild(r),i.appendChild(t)}if(e.result!==void 0){let t=document.createElement(`div`);t.className=`tool-call__result${e.isError?` tool-call__result--error`:``}`;let n=document.createElement(`div`);n.className=`tool-call__label`,n.textContent=e.isError?`Error:`:`Result:`,t.appendChild(n);let r=document.createElement(`pre`);r.textContent=e.result,t.appendChild(r),i.appendChild(t)}let a=e._screenshotDataUrl;if(a){let e=document.createElement(`img`);e.src=a,e.className=`tool-call__screenshot`,e.title=`Click to view full size`,e.addEventListener(`click`,e=>{e.stopPropagation();let t=window.open(`about:blank`);if(t){let e=t.document.createElement(`img`);e.src=a,t.document.title=`Screenshot`,t.document.body.style.margin=`0`,t.document.body.style.background=document.documentElement.classList.contains(`theme-light`)?`#f0f0f0`:`#141414`,t.document.body.appendChild(e)}}),i.appendChild(e)}return t.appendChild(i),t}scrollToBottom(e=!1){if(!e&&!this.autoScrollAttached){this.showJumpPill();return}requestAnimationFrame(()=>{this.messagesEl.scrollTop=this.messagesEl.scrollHeight,this.lastScrollTop=this.messagesEl.scrollTop})}showJumpPill(){this.jumpPill.classList.add(`chat__jump-pill--visible`)}hideJumpPill(){this.jumpPill.classList.remove(`chat__jump-pill--visible`)}persistSession(){this.sessionStore.saveMessages(this.sessionId,this.messages).catch(()=>{})}disposeInlineSprinklesForMessage(e){let t=this.inlineSprinkles.get(e);t&&(mi(t),this.inlineSprinkles.delete(e))}disposeAllInlineSprinkles(){for(let[,e]of this.inlineSprinkles)mi(e);this.inlineSprinkles.clear()}hydrateInlineSprinklesInEl(e,t){let n=pi(e,(e,t)=>this.onInlineSprinkleLick?.(e,t));n.length&&this.inlineSprinkles.set(t,n)}dispose(){this.cancelPendingDelta(),this.disposeAllInlineSprinkles(),this.unsubscribe?.(),this.voiceInput?.destroy(),this.keydownListener&&=(document.removeEventListener(`keydown`,this.keydownListener),null),this.container.innerHTML=``}},Oi=class{container;terminalViewEl;previewViewEl;previewEmptyEl;previewBtn;shell=null;activeView=`terminal`;onClearTerminal;constructor(e,t={}){this.container=e,this.onClearTerminal=t.onClearTerminal??null,this.render()}async mountShell(e){this.shell?.setPreviewStateListener(null),this.shell=e;let t=document.createElement(`div`);t.className=`terminal-panel__mount`,this.terminalViewEl.appendChild(t),await e.mount(t);let n=t.querySelector(`.terminal-panel__terminal-host`),r=t.querySelector(`.terminal-panel__preview`);if(!n||!r)throw Error(`terminal mount did not create expected hosts`);this.terminalViewEl.replaceChildren(n),this.previewViewEl.replaceChildren(this.previewEmptyEl),this.previewViewEl.appendChild(r),e.setPreviewStateListener(e=>this.handlePreviewStateChange(e))}clearTerminal(){this.shell?.clearTerminal()}async runCommand(e){return this.shell?(/^\s*imgcat(?:\s|$)/.test(e)||this.setActiveView(`terminal`),this.shell.executeCommandInTerminal(e)):{stdout:``,stderr:`terminal is unavailable
|
|
242
|
+
<body class="sprinkle-inline">${t}</body></html>`;if(ui)return hi(e,r,n);let i=document.createElement(`iframe`);i.setAttribute(`sandbox`,`allow-scripts allow-same-origin`),i.style.cssText=`width:100%;border:none;overflow:hidden;display:block;`,i.srcdoc=r,e.appendChild(i);let a=e=>{if(e.source!==i.contentWindow)return;let t=e.data;t?.type&&(t.type===`inline-sprinkle-lick`?n(t.action,t.data):t.type===`inline-sprinkle-height`&&(i.style.height=t.height+`px`))};return window.addEventListener(`message`,a),{dispose(){window.removeEventListener(`message`,a),i.remove()}}}function pi(e,t){let n=e.querySelectorAll(`pre > code.language-shtml`);if(n.length===0)return[];let r=[];for(let e of n){let n=e.parentElement,i=e.textContent??``,a=document.createElement(`div`);a.className=`msg__inline-sprinkle`,n.replaceWith(a),r.push(fi(a,i,t))}return r}function mi(e){for(let t of e)try{t.dispose()}catch{}e.length=0}function hi(e,t,n){let r=document.createElement(`iframe`);r.src=chrome.runtime.getURL(`sprinkle-sandbox.html`),r.style.cssText=`width:100%;border:none;overflow:hidden;display:block;`,e.appendChild(r);let i=e=>{if(e.source!==r.contentWindow)return;let t=e.data;t?.type&&(t.type===`inline-sprinkle-lick`?n(t.action,t.data):t.type===`inline-sprinkle-height`&&(r.style.height=t.height+`px`))};return window.addEventListener(`message`,i),r.addEventListener(`load`,()=>{r.contentWindow?.postMessage({type:`inline-sprinkle-render`,srcdoc:t},`*`)},{once:!0}),{dispose(){window.removeEventListener(`message`,i),r.remove()}}}var gi=n(`tool-ui-renderer`),_i=typeof chrome<`u`&&!!chrome?.runtime?.id,vi=class{container;iframe=null;inlineSprinkle=null;messageHandler=null;requestId;nonce;constructor(e,t){this.container=e,this.requestId=t,this.nonce=crypto.randomUUID()}async render(e){_i?await this.renderInSandbox(e):this.renderWithInlineSprinkle(e)}async renderInSandbox(e){let t=document.createElement(`iframe`);t.src=chrome.runtime.getURL(`tool-ui-sandbox.html`),t.style.cssText=`width: 100%; border: none; min-height: 60px;`,this.iframe=t,await new Promise((e,n)=>{let r=setTimeout(()=>{gi.error(`Tool UI iframe load timed out`),t.remove(),this.iframe=null,n(Error(`tool-ui sandbox iframe load timed out`))},5e3);t.addEventListener(`load`,()=>{clearTimeout(r),e()},{once:!0}),t.addEventListener(`error`,()=>{clearTimeout(r),t.remove(),this.iframe=null,n(Error(`tool-ui sandbox iframe failed to load`))},{once:!0}),this.container.appendChild(t)}),this.messageHandler=e=>{if(e.source!==t.contentWindow)return;let n=e.data;if(n?.type){if(n.nonce!==this.nonce){gi.warn(`Tool UI message nonce mismatch`,{expected:this.nonce,received:n.nonce});return}n.type===`tool-ui-action`&&n.id===this.requestId?(gi.info(`Tool UI action received`,{id:n.id,action:n.action}),v.handleAction(n.id,{action:n.action,data:n.data})):n.type===`tool-ui-rendered`&&n.id===this.requestId?n.height&&this.iframe&&(this.iframe.style.height=`${Math.max(60,n.height)}px`):n.type===`tool-ui-resize`&&n.id===this.requestId&&n.height&&this.iframe&&(this.iframe.style.height=`${Math.max(60,n.height)}px`)}},window.addEventListener(`message`,this.messageHandler);let{collectThemeCSS:n}=await r(async()=>{let{collectThemeCSS:e}=await import(`./sprinkle-renderer-Dj8JsQhW.js`);return{collectThemeCSS:e}},[]),i=n();t.contentWindow.postMessage({type:`tool-ui-render`,id:this.requestId,nonce:this.nonce,html:e,themeCSS:i},`*`)}renderWithInlineSprinkle(e){let t=document.createElement(`div`);t.className=`msg__inline-sprinkle`,this.container.appendChild(t),this.inlineSprinkle=fi(t,e,(e,t)=>{gi.info(`Tool UI action (inline sprinkle)`,{id:this.requestId,action:e}),v.handleAction(this.requestId,{action:e,data:t})})}dispose(){this.messageHandler&&=(window.removeEventListener(`message`,this.messageHandler),null),this.iframe&&=(this.iframe.remove(),null),this.inlineSprinkle&&=(this.inlineSprinkle.dispose(),null)}},yi=new Map;function bi(e,t,n){let r=yi.get(t);r&&r.dispose();let i=new vi(e,t);return yi.set(t,i),i.render(n).catch(e=>{gi.error(`Failed to render tool UI`,{requestId:t,error:e.message})}),i}function xi(e){let t=yi.get(e);t&&(t.dispose(),yi.delete(e))}var Si=n(`chat-panel`);function Ci(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}var wi={bash:`$`,browser:`B`,read_file:`R`,write_file:`W`,edit_file:`E`,javascript:`JS`,delegate_to_scoop:`D`,send_message:`M`,schedule_task:`T`,list_scoops:`LS`,list_tasks:`LT`,register_scoop:`RS`,update_global_memory:`GM`};function Ti(e){return wi[e]??`?`}function Ei(e){return e.role===`assistant`?Kr(e.content):Gr(e.content)}var Di=class{container;messagesEl;messagesInner;inputArea;textarea;sendBtn;stopBtn;micBtn;voiceInput=null;voiceMode=!1;keydownListener=null;messages=[];agent=null;unsubscribe=null;isStreaming=!1;currentStreamId=null;sessionStore;sessionId;readOnly=!1;terminalOutputCallback=null;currentScoopName=null;autoScrollAttached=!0;lastScrollTop=0;jumpPill;onDeleteQueuedMessage=null;pendingDeltaText=``;streamingRafId=null;inlineSprinkles=new Map;onInlineSprinkleLick;modelSelectorEl;onModelChange;constructor(e){this.container=e,this.sessionStore=new Qr,this.sessionId=`default`,this.render()}setAgent(e){this.unsubscribe?.(),this.agent=e,this.unsubscribe=e.onEvent(e=>this.handleAgentEvent(e))}onTerminalOutput(e){this.terminalOutputCallback=e}setDeleteQueuedMessageCallback(e){this.onDeleteQueuedMessage=e}async initSession(e){await this.sessionStore.init(),this.sessionId=e??`default`;let t=await this.sessionStore.load(this.sessionId);t&&t.messages.length>0&&(this.messages=t.messages.map(e=>({...e,isStreaming:!1})),this.renderMessages())}async clearSession(){this.messages=[],this.renderMessages(),await this.sessionStore.delete(this.sessionId)}async deleteSessionById(e){await this.sessionStore.delete(e)}async switchToContext(e,t,n){await this.persistSessionAsync(),this.setStreamingState(!1),this.currentStreamId=null,this.cancelPendingDelta(),this.sessionId=e,this.currentScoopName=n??null,this.setReadOnly(t);let r=await this.sessionStore.load(this.sessionId);r&&r.messages.length>0?this.messages=r.messages.map(e=>({...e,isStreaming:!1})):this.messages=[],this.renderMessages()}setReadOnly(e){this.readOnly=e,this.inputArea&&(this.inputArea.style.display=e?`none`:``)}async persistSessionAsync(){try{await this.sessionStore.saveMessages(this.sessionId,this.messages)}catch{}}setProcessing(e){e?this.setStreamingState(!0):this.setStreamingState(!1)}addSystemMessage(e){let t={id:Ci(),role:`assistant`,content:e,timestamp:Date.now()};this.messages.push(t),this.appendMessageEl(t),this.persistSession()}addLickMessage(e,t,n){let r={id:e,role:`user`,content:t,timestamp:Date.now(),source:`lick`,channel:n};this.messages.push(r),this.appendMessageEl(r),this.persistSession()}getMessages(){return[...this.messages]}loadMessages(e){this.messages=e.map(e=>({...e,isStreaming:!1})),this.renderMessages(),this.persistSession(),this.renderModelSelector()}clear(){this.messages=[],this.renderMessages(),this.renderModelSelector()}addUserMessage(e){let t={id:Ci(),role:`user`,content:e,timestamp:Date.now()};this.messages.push(t),this.appendMessageEl(t)}deleteQueuedMessage(e){let t=this.messages.findIndex(t=>t.id===e);if(t===-1)return;this.messages.splice(t,1);let n=this.messagesEl.querySelector(`[data-msg-id="${e}"]`);n&&n.remove(),this.persistSession(),this.onDeleteQueuedMessage?.(e)}render(){this.container.innerHTML=``,this.container.classList.add(`chat`),this.messagesEl=document.createElement(`div`),this.messagesEl.className=`chat__messages`,this.messagesInner=document.createElement(`div`),this.messagesInner.className=`chat__messages-inner`,this.messagesEl.appendChild(this.messagesInner),this.container.appendChild(this.messagesEl),this.messagesEl.addEventListener(`scroll`,()=>{let{scrollTop:e,scrollHeight:t,clientHeight:n}=this.messagesEl;t-e-n<=250?(this.autoScrollAttached=!0,this.hideJumpPill()):e<this.lastScrollTop&&(this.autoScrollAttached=!1),this.lastScrollTop=e},{passive:!0}),this.inputArea=document.createElement(`div`);let e=this.inputArea;e.className=`chat__input-area`;let t=document.createElement(`div`);t.className=`chat__input-area-inner`,this.textarea=document.createElement(`textarea`),this.textarea.className=`chat__textarea`,this.textarea.placeholder=`What shall we build?`,this.textarea.rows=1,this.sendBtn=document.createElement(`button`),this.sendBtn.className=`chat__send-btn`,this.sendBtn.innerHTML=`<svg width="20" height="20" viewBox="0 0 20 20" fill="currentColor"><path d="M10 1.25C5.167 1.25 1.25 5.167 1.25 10s3.917 8.75 8.75 8.75 8.75-3.918 8.75-8.75S14.833 1.25 10 1.25zm3.527 8.284a.75.75 0 0 1-1.06 0L10.75 7.82v6.172a.75.75 0 0 1-1.5 0V7.812L7.527 9.534a.75.75 0 1 1-1.06-1.06l2.998-2.998a.75.75 0 0 1 1.06-.001l3.002 2.998a.75.75 0 0 1 0 1.061z"/></svg>`,this.sendBtn.dataset.tooltip=`Send message`,this.sendBtn.dataset.tooltipPos=`top`,this.stopBtn=document.createElement(`button`),this.stopBtn.className=`chat__stop-btn`,this.stopBtn.innerHTML=`<svg width="16" height="16" viewBox="0 0 20 20" fill="currentColor"><path d="M13.75 4H6.25A2.25 2.25 0 0 0 4 6.25v7.5A2.25 2.25 0 0 0 6.25 16h7.5A2.25 2.25 0 0 0 16 13.75v-7.5A2.25 2.25 0 0 0 13.75 4z"/></svg>`,this.stopBtn.dataset.tooltip=`Stop generation`,this.stopBtn.style.display=`none`,this.micBtn=document.createElement(`button`),this.micBtn.className=`chat__mic-btn`;let n=`http://www.w3.org/2000/svg`,r=document.createElementNS(n,`svg`);r.setAttribute(`width`,`16`),r.setAttribute(`height`,`16`),r.setAttribute(`viewBox`,`0 0 24 24`),r.setAttribute(`fill`,`none`),r.setAttribute(`stroke`,`currentColor`),r.setAttribute(`stroke-width`,`2`),r.setAttribute(`stroke-linecap`,`round`),r.setAttribute(`stroke-linejoin`,`round`);let i=document.createElementNS(n,`path`);i.setAttribute(`d`,`M12 1a3 3 0 0 0-3 3v8a3 3 0 0 0 6 0V4a3 3 0 0 0-3-3z`);let a=document.createElementNS(n,`path`);a.setAttribute(`d`,`M19 10v2a7 7 0 0 1-14 0v-2`);let o=document.createElementNS(n,`line`);o.setAttribute(`x1`,`12`),o.setAttribute(`y1`,`19`),o.setAttribute(`x2`,`12`),o.setAttribute(`y2`,`23`);let s=document.createElementNS(n,`line`);s.setAttribute(`x1`,`8`),s.setAttribute(`y1`,`23`),s.setAttribute(`x2`,`16`),s.setAttribute(`y2`,`23`),r.append(i,a,o,s),this.micBtn.appendChild(r),this.micBtn.dataset.tooltip=`Voice (Ctrl+Shift+V)`;let c=document.createElement(`div`);c.className=`chat__input-wrapper`,c.appendChild(this.textarea);let l=document.createElement(`div`);l.className=`chat__action-bar`;let u=document.createElement(`div`);u.className=`chat__action-bar-left`,u.appendChild(this.micBtn),l.appendChild(u),this.modelSelectorEl=document.createElement(`div`),this.modelSelectorEl.className=`chat__model-selector`,this.renderModelSelector(),l.appendChild(this.modelSelectorEl);let d=document.createElement(`div`);d.className=`chat__action-bar-right`,d.appendChild(this.sendBtn),d.appendChild(this.stopBtn),l.appendChild(d),c.appendChild(l),t.appendChild(c),e.appendChild(t),this.container.appendChild(e),this.jumpPill=document.createElement(`button`),this.jumpPill.className=`chat__jump-pill`,this.jumpPill.textContent=`↓ New activity`,this.jumpPill.addEventListener(`click`,()=>{this.autoScrollAttached=!0,this.hideJumpPill(),this.scrollToBottom(!0)}),this.container.appendChild(this.jumpPill),this.textarea.addEventListener(`keydown`,e=>{e.key===`Enter`&&!e.shiftKey&&(e.preventDefault(),this.sendMessage())}),this.textarea.addEventListener(`input`,()=>{this.adjustTextareaHeight()}),this.sendBtn.addEventListener(`click`,()=>this.sendMessage()),this.stopBtn.addEventListener(`click`,()=>{this.agent?.stop();for(let e of this.messages)e.queued&&(e.queued=!1,this.updateMessageEl(e.id));this.setStreamingState(!1)}),this.voiceInput=new ni({onTranscript:(e,t)=>{this.textarea.value=e,this.adjustTextareaHeight()},onStateChange:e=>{e===`error`?(this.voiceMode=!1,this.micBtn.classList.remove(`chat__mic-btn--active`,`chat__mic-btn--listening`)):this.voiceMode?e===`listening`&&this.micBtn.classList.add(`chat__mic-btn--listening`):this.micBtn.classList.toggle(`chat__mic-btn--listening`,e===`listening`)},onError:e=>{Si.debug(`Voice input error`,{error:e}),!(this.voiceMode&&e.includes(`No speech detected`))&&this.addSystemMessage(e)},autoSend:!0,onAutoSend:e=>{this.textarea.value=e,this.sendMessage()},onAutoDisable:()=>{this.voiceMode=!1,this.micBtn.classList.remove(`chat__mic-btn--active`,`chat__mic-btn--listening`),this.addSystemMessage(`Voice mode disabled after 2 minutes of inactivity.`)},lang:ii()}),this.micBtn.addEventListener(`click`,()=>{this.toggleVoiceMode()}),this.keydownListener=e=>{e.shiftKey&&(e.ctrlKey||e.metaKey)&&e.key===`V`&&(e.preventDefault(),this.toggleVoiceMode())},document.addEventListener(`keydown`,this.keydownListener)}toggleVoiceMode(){this.voiceMode=!this.voiceMode,this.micBtn.classList.toggle(`chat__mic-btn--active`,this.voiceMode),this.voiceMode?this.voiceInput?.start():this.voiceInput?.stop()}adjustTextareaHeight(){let e=this.container.clientHeight||(typeof window<`u`?window.innerHeight:0)||0,t=Math.max(18,Math.floor(e*.3));this.textarea.style.height=`auto`;let n=this.textarea.scrollHeight,r=Math.min(n,t);this.textarea.style.height=r+`px`,this.textarea.style.overflowY=n>t?`auto`:`hidden`}resetTextareaHeight(){this.textarea.style.height=`auto`,this.textarea.style.overflowY=`hidden`}sendMessage(){let e=this.textarea.value.trim();if(!e)return;this.autoScrollAttached=!0,this.hideJumpPill();let t=this.isStreaming,n={id:Ci(),role:`user`,content:e,timestamp:Date.now(),queued:t||void 0};this.messages.push(n),this.appendMessageEl(n),this.persistSession(),this.textarea.value=``,this.resetTextareaHeight(),this.isStreaming||this.setStreamingState(!0),this.agent?.sendMessage(e,n.id)}handleAgentEvent(e){switch(Si.debug(`Agent event`,{type:e.type}),e.type){case`message_start`:this.handleMessageStart(e.messageId);break;case`content_delta`:this.handleContentDelta(e.messageId,e.text);break;case`content_done`:this.handleContentDone(e.messageId);break;case`tool_use_start`:this.handleToolUseStart(e.messageId,e.toolName,e.toolInput);break;case`tool_result`:this.handleToolResult(e.messageId,e.toolName,e.result,e.isError);break;case`tool_ui`:this.handleToolUI(e.messageId,e.toolName,e.requestId,e.html);break;case`tool_ui_done`:this.handleToolUIDone(e.messageId,e.requestId);break;case`turn_end`:this.handleTurnEnd(e.messageId);break;case`error`:this.handleError(e.error);break;case`screenshot`:break;case`terminal_output`:this.terminalOutputCallback?.(e.text);break}}handleMessageStart(e){this.setStreamingState(!0),this.currentStreamId=e;let t={id:e,role:`assistant`,content:``,timestamp:Date.now(),isStreaming:!0,toolCalls:[]};this.messages.push(t),this.appendMessageEl(t)}handleContentDelta(e,t){this.findMessage(e)&&(this.pendingDeltaText+=t,this.streamingRafId===null&&(this.streamingRafId=requestAnimationFrame(()=>this.flushPendingDelta())))}handleContentDone(e){if(this.pendingDeltaText&&this.currentStreamId===e){let t=this.findMessage(e);t&&(t.content+=this.pendingDeltaText)}this.cancelPendingDelta();let t=this.findMessage(e);t&&(t.isStreaming=!1,this.updateMessageEl(e))}handleToolUseStart(e,t,n){let r=this.findMessage(e);r&&(r.toolCalls||=[],r.toolCalls.push({id:Ci(),name:t,input:n}),this.updateMessageEl(e))}handleToolResult(e,t,n,r){let i=this.findMessage(e);if(!i||!i.toolCalls)return;let a=[...i.toolCalls].reverse().find(e=>e.name===t&&e.result===void 0);if(a){let e=n.match(/<img:(data:image\/[^>]+)>/);a.result=n.replace(/<img:data:image\/[^>]+>/g,``).trim(),e&&(a._screenshotDataUrl=e[1]),a.isError=r}this.updateMessageEl(e)}handleToolUI(e,t,n,r,i=0){let a=this.findMessage(e);if(!a||!a.toolCalls){if(i<10){setTimeout(()=>this.handleToolUI(e,t,n,r,i+1),100);return}Si.warn(`handleToolUI: message or toolCalls not found after retries`,{messageId:e});return}let o=[...a.toolCalls].reverse().find(e=>e.name===t&&e.result===void 0);if(!o){Si.warn(`handleToolUI: no matching tool call found`,{messageId:e,toolName:t});return}o._toolUIRequestId=n;let s=this.messagesEl.querySelector(`[data-msg-id="${e}"]`);if(!s){if(i<10){setTimeout(()=>this.handleToolUI(e,t,n,r,i+1),100);return}Si.warn(`handleToolUI: wrapper element not found after retries`,{messageId:e});return}let c=[...s.querySelectorAll(`.tool-call`)].reverse().find(e=>e.querySelector(`.tool-call__name`)?.textContent===t);if(c){c instanceof HTMLDetailsElement&&(c.open=!0);let e=c.querySelector(`.tool-call__ui`);e||(e=document.createElement(`div`),e.className=`tool-call__ui`,c.appendChild(e)),bi(e,n,r)}else i<10?setTimeout(()=>this.handleToolUI(e,t,n,r,i+1),100):Si.warn(`handleToolUI: tool call element not found in DOM after retries`,{toolName:t})}handleToolUIDone(e,t){xi(t)}handleTurnEnd(e){this.setStreamingState(!1),this.currentStreamId=null,this.persistSession()}handleError(e){this.setStreamingState(!1),this.currentStreamId=null;let t=this.messages[this.messages.length-1];if(t?.role===`assistant`&&t.isStreaming)t.isStreaming=!1,t.content+=`\n\n**Error:** ${e}`,this.updateMessageEl(t.id);else{let t={id:Ci(),role:`assistant`,content:`**Error:** ${e}`,timestamp:Date.now()};this.messages.push(t),this.appendMessageEl(t)}this.persistSession()}setStreamingState(e){this.isStreaming=e;try{this.renderModelSelector()}catch{}if(this.stopBtn.style.display=e?`flex`:`none`,this.sendBtn.style.display=e?`none`:`flex`,this.textarea.disabled=!1,e){this.voiceInput?.isListening()&&this.voiceInput.stop(),this.micBtn.classList.remove(`chat__mic-btn--listening`);let e=this.messages.find(e=>e.queued);e&&(e.queued=!1,this.updateMessageEl(e.id))}e||(this.voiceMode?(this.micBtn.classList.add(`chat__mic-btn--listening`),this.voiceInput?.start()):this.textarea.focus())}renderModelSelector(){let e=this.modelSelectorEl;if(!e)return;for(;e.firstChild;)e.removeChild(e.firstChild);let t=j(),n=C(),r=te(),i=[];for(let e of t)for(let t of e.models)i.push({providerId:e.providerId,id:t.id,name:t.name,reasoning:t.reasoning});i.sort((e,t)=>e.reasoning===t.reasoning?e.name.localeCompare(t.name):e.reasoning?-1:1);let a=i.find(e=>e.id===n&&e.providerId===r)||i[0];if(!a)return;let o=this.isStreaming,s=document.createElement(`button`);if(s.className=`chat__model-btn chat__model-btn--compact`,o&&s.classList.add(`chat__model-btn--disabled`),s.textContent=a.name,!o){let e=document.createElement(`span`);e.className=`chat__model-chevron`,e.innerHTML=`<svg width="12" height="12" viewBox="0 0 16 16" fill="currentColor"><path d="M4.5 6l3.5 4 3.5-4z"/></svg>`,s.appendChild(e)}if(o)e.appendChild(s);else{let t=!1,a=document.createElement(`div`);a.className=`chat__model-menu`;let o=()=>{for(a.style.display=t?`block`:`none`;a.firstChild;)a.removeChild(a.firstChild);if(t)for(let e of i){let i=document.createElement(`div`);i.className=`chat__model-menu-item`;let o=e.id===n&&e.providerId===r;o&&i.classList.add(`chat__model-menu-item--active`);let s=document.createElement(`span`);if(s.textContent=e.name,i.appendChild(s),o){let e=document.createElement(`span`);e.className=`chat__model-check`,e.innerHTML=`<svg width="14" height="14" viewBox="0 0 16 16" fill="currentColor"><path d="M6.5 12.5l-4-4 1.4-1.4 2.6 2.6 5.6-5.6 1.4 1.4z"/></svg>`,i.appendChild(e)}i.addEventListener(`click`,()=>{let n=`${e.providerId}:${e.id}`;b(n),this.onModelChange?.(n),t=!1,this.renderModelSelector()}),a.appendChild(i)}};s.addEventListener(`click`,e=>{e.stopPropagation(),t=!t,o()}),document.addEventListener(`click`,()=>{t=!1,o()},{once:!0}),e.appendChild(s),e.appendChild(a),o()}}refreshModelSelector(){this.renderModelSelector()}findMessage(e){return this.messages.find(t=>t.id===e)}flushPendingDelta(){if(this.streamingRafId=null,!this.pendingDeltaText||!this.currentStreamId)return;let e=this.findMessage(this.currentStreamId);if(!e){this.pendingDeltaText=``;return}e.content+=this.pendingDeltaText,this.pendingDeltaText=``,this.updateStreamingContent(this.currentStreamId)}cancelPendingDelta(){this.streamingRafId!==null&&(cancelAnimationFrame(this.streamingRafId),this.streamingRafId=null),this.pendingDeltaText=``}updateStreamingContent(e){let t=this.findMessage(e);if(!t)return;let n=this.messagesEl.querySelector(`[data-msg-id="${e}"]`);if(!n)return;let r=n.querySelector(`.msg__content`);if(r){if(r.innerHTML=Ei(t),t.isStreaming){let e=document.createElement(`span`);e.className=`streaming-cursor`,r.appendChild(e)}}else if(t.content.trim().length>0){this.updateMessageEl(e);return}this.scrollToBottom()}renderMessages(){this.disposeAllInlineSprinkles(),this.messagesInner.innerHTML=``;let e=null,t=0,n=-1;for(let e=this.messages.length-1;e>=0;e--)if(this.messages[e].role===`assistant`){n=e;break}for(let r=0;r<this.messages.length;r++){let i=this.messages[r],a=this.shouldShowLabel(i,e,t),o=this.createMessageEl(i,a,r===n);this.messagesInner.appendChild(o),e=i.role,t=i.timestamp}this.autoScrollAttached=!0,this.hideJumpPill(),this.scrollToBottom(!0)}appendMessageEl(e){let t=this.messagesInner.querySelector(`.msg__feedback`);t&&t.remove();let n=this.messages.length>=2?this.messages[this.messages.length-2]:null,r=this.shouldShowLabel(e,n?.role??null,n?.timestamp??0),i=e.role===`assistant`,a=this.createMessageEl(e,r,i);this.messagesInner.appendChild(a),this.scrollToBottom()}shouldShowLabel(e,t,n){return e.source===`lick`||e.channel===`webhook`||e.channel===`cron`||e.role!==t||e.timestamp-n>12e4}updateMessageEl(e){let t=this.findMessage(e);if(!t)return;let n=this.messagesEl.querySelector(`[data-msg-id="${e}"]`);if(n){this.disposeInlineSprinklesForMessage(e);let r=this.messages.indexOf(t),i=r>0?this.messages[r-1]:null,a=this.shouldShowLabel(t,i?.role??null,i?.timestamp??0),o=!1;if(t.role===`assistant`){let e=-1;for(let t=this.messages.length-1;t>=0;t--)if(this.messages[t].role===`assistant`){e=t;break}o=r===e}let s=this.createMessageEl(t,a,o);n.replaceWith(s)}this.scrollToBottom()}createMessageEl(e,t=!0,n=!1){if(e.source===`lick`||e.channel===`webhook`||e.channel===`cron`||e.channel===`fswatch`){let t=document.createElement(`div`);return t.className=`msg-group`,t.setAttribute(`data-msg-id`,e.id),t.appendChild(this.createLickEl(e)),t}let r=document.createElement(`div`);r.className=`msg-group${t?``:` msg-group--continuation`}`,r.setAttribute(`data-msg-id`,e.id);let i=document.createElement(`div`);if(i.className=`msg msg--${e.role}${e.queued?` msg--queued`:``}`,t){let t,n,r=this.currentScoopName!==null;e.role===`user`?e.source===`delegation`||e.channel===`delegation`?(t=`S`,n=`sliccy`):(t=`U`,n=`You`):r?(t=(this.currentScoopName||`S`).charAt(0).toUpperCase(),n=`@${this.currentScoopName}`):e.source&&e.source!==`cone`?(t=e.source.charAt(0).toUpperCase(),n=e.source):(t=`S`,n=`sliccy`);let a=document.createElement(`div`);a.className=`msg__role`;let o=document.createElement(`span`);if(o.className=`msg__icon`,o.textContent=t,a.appendChild(o),a.appendChild(document.createTextNode(` ${n}`)),e.queued){let t=document.createElement(`span`);t.className=`msg__queued-badge`,t.textContent=`queued`,a.appendChild(t);let n=document.createElement(`button`);n.className=`msg__queued-delete`,n.textContent=`×`,n.title=`Remove queued message`,n.addEventListener(`click`,t=>{t.stopPropagation(),this.deleteQueuedMessage(e.id)}),a.appendChild(n)}i.appendChild(a)}let a=(e.source===`lick`||e.channel===`webhook`||e.channel===`cron`||e.channel===`fswatch`)&&this.sessionId===`session-cone`,o=e.source&&e.source!==`cone`&&e.source!==`lick`&&e.role===`assistant`&&this.sessionId===`session-cone`;if(a||o){let t=document.createElement(`details`);t.className=`msg__collapsible`;let n=document.createElement(`summary`);n.className=`msg__summary`,n.textContent=e.content.slice(0,60).replace(/\n/g,` `)+(e.content.length>60?`...`:``),t.appendChild(n);let r=document.createElement(`div`);r.className=`msg__content`,r.innerHTML=Ei(e),e.isStreaming||this.hydrateInlineSprinklesInEl(r,e.id),t.appendChild(r),i.appendChild(t)}else{let t=document.createElement(`div`);if(t.className=`msg__content`,t.innerHTML=Ei(e),e.isStreaming){let e=document.createElement(`span`);e.className=`streaming-cursor`,t.appendChild(e)}else this.hydrateInlineSprinklesInEl(t,e.id);i.appendChild(t)}let s=e.content.trim().length>0;if(s&&r.appendChild(i),e.toolCalls)for(let t of e.toolCalls)r.appendChild(this.createToolCallEl(t));return e.role===`assistant`&&!e.isStreaming&&!e.queued&&s&&n&&r.appendChild(this.createFeedbackRow()),r}createFeedbackRow(){let e=document.createElement(`div`);e.className=`msg__feedback`;let t=document.createElement(`button`);return t.className=`msg__feedback-btn`,t.dataset.tooltip=`Copy chat`,t.setAttribute(`aria-label`,`Copy chat`),t.innerHTML=`<svg width="16" height="16" viewBox="0 0 20 20" fill="currentColor"><path d="m11.75,18h-7.5c-1.24,0-2.25-1.01-2.25-2.25v-7.5c0-1.24,1.01-2.25,2.25-2.25.41,0,.75.34.75.75s-.34.75-.75.75c-.41,0-.75.34-.75.75v7.5c0,.41.34.75.75.75h7.5c.41,0,.75-.34.75-.75,0-.41.34-.75.75-.75s.75.34.75.75c0,1.24-1.01,2.25-2.25,2.25Z"/><path d="m6.75,5c-.41,0-.75-.34-.75-.75,0-1.24,1.01-2.25,2.25-2.25.41,0,.75.34.75.75s-.34.75-.75.75c-.41,0-.75.34-.75.75,0,.41-.34.75-.75.75Z"/><path d="m13,3.5h-2c-.41,0-.75-.34-.75-.75s.34-.75.75-.75h2c.41,0,.75.34.75.75s-.34.75-.75.75Z"/><path d="m13,14h-2c-.41,0-.75-.34-.75-.75s.34-.75.75-.75h2c.41,0,.75.34.75.75s-.34.75-.75.75Z"/><path d="m15.75,14c-.41,0-.75-.34-.75-.75s.34-.75.75-.75c.41,0,.75-.34.75-.75,0-.41.34-.75.75-.75s.75.34.75.75c0,1.24-1.01,2.25-2.25,2.25Z"/><path d="m17.25,5c-.41,0-.75-.34-.75-.75,0-.41-.34-.75-.75-.75-.41,0-.75-.34-.75-.75s.34-.75.75-.75c1.24,0,2.25,1.01,2.25,2.25,0,.41-.34.75-.75.75Z"/><path d="m17.25,9.75c-.41,0-.75-.34-.75-.75v-2c0-.41.34-.75.75-.75s.75.34.75.75v2c0,.41-.34.75-.75.75Z"/><path d="m6.75,9.75c-.41,0-.75-.34-.75-.75v-2c0-.41.34-.75.75-.75s.75.34.75.75v2c0,.41-.34.75-.75.75Z"/><path d="m8.25,14c-1.24,0-2.25-1.01-2.25-2.25,0-.41.34-.75.75-.75s.75.34.75.75c0,.41.34.75.75.75.41,0,.75.34.75.75s-.34.75-.75.75Z"/></svg>`,t.addEventListener(`click`,async()=>{let e=this.getMessages(),n=``;for(let t of e){let e=t.role===`user`?`User`:`Assistant`;if(n+=`## ${e}\n${t.content}\n\n`,t.toolCalls)for(let e of t.toolCalls)n+=`### Tool: ${e.name}\nInput: ${JSON.stringify(e.input,null,2)}\nResult: ${e.result??``}\n\n`}await navigator.clipboard.writeText(n),t.style.color=`var(--s2-positive)`,setTimeout(()=>{t.style.color=``},1500)}),e.appendChild(t),e}createLickEl(e){let t=document.createElement(`details`);t.className=`lick`;let n=e.channel===`webhook`?`Webhook`:e.channel===`cron`?`Cron`:e.channel===`fswatch`?`File Watch`:e.channel===`navigate`?`Navigate`:`Event`,r=document.createElement(`summary`);r.className=`lick__header`,r.innerHTML=`<span class="lick__icon">E</span> <span class="lick__type">${n}</span>`;let i=document.createElement(`span`);i.className=`lick__preview`;let a=e.content.replace(/\[Webhook Event:.*?\]\n```json\n?/s,``).slice(0,50);i.textContent=a.replace(/\n/g,` `)+(a.length>=50?`...`:``),r.appendChild(i),t.appendChild(r);let o=document.createElement(`div`);return o.className=`lick__details`,o.innerHTML=Gr(e.content),t.appendChild(o),t}createToolCallEl(e){Ti(e.name);let t=document.createElement(`details`);t.className=`tool-call`;let n=document.createElement(`summary`);if(n.className=`tool-call__header`,n.innerHTML=`<span class="tool-call__icon"><svg width="10" height="10" viewBox="0 0 10 10" fill="currentColor"><path d="M2 3.5L5 6.5L8 3.5" stroke="currentColor" stroke-width="1.5" fill="none" stroke-linecap="round" stroke-linejoin="round"/></svg></span> <span class="tool-call__name">${Mr(e.name)}</span>`,e.input!==void 0){let t=document.createElement(`span`);t.className=`tool-call__preview`;let r=typeof e.input==`string`?e.input:JSON.stringify(e.input);t.textContent=r.slice(0,40)+(r.length>40?`...`:``),n.appendChild(t)}let r=document.createElement(`span`);e.result===void 0?r.className=`tool-call__status tool-call__status--running`:e.isError?(r.className=`tool-call__status tool-call__status--error`,r.textContent=`failed`):(r.className=`tool-call__status tool-call__status--success`,r.textContent=`✓`),n.appendChild(r),t.appendChild(n);let i=document.createElement(`div`);if(i.className=`tool-call__details`,e.input!==void 0){let t=document.createElement(`div`);t.className=`tool-call__input`;let n=document.createElement(`div`);n.className=`tool-call__label`,n.textContent=`Input:`,t.appendChild(n);let r=document.createElement(`pre`);r.innerHTML=qr(e.input),t.appendChild(r),i.appendChild(t)}if(e.result!==void 0){let t=document.createElement(`div`);t.className=`tool-call__result${e.isError?` tool-call__result--error`:``}`;let n=document.createElement(`div`);n.className=`tool-call__label`,n.textContent=e.isError?`Error:`:`Result:`,t.appendChild(n);let r=document.createElement(`pre`);r.textContent=e.result,t.appendChild(r),i.appendChild(t)}let a=e._screenshotDataUrl;if(a){let e=document.createElement(`img`);e.src=a,e.className=`tool-call__screenshot`,e.title=`Click to view full size`,e.addEventListener(`click`,e=>{e.stopPropagation();let t=window.open(`about:blank`);if(t){let e=t.document.createElement(`img`);e.src=a,t.document.title=`Screenshot`,t.document.body.style.margin=`0`,t.document.body.style.background=document.documentElement.classList.contains(`theme-light`)?`#f0f0f0`:`#141414`,t.document.body.appendChild(e)}}),i.appendChild(e)}return t.appendChild(i),t}scrollToBottom(e=!1){if(!e&&!this.autoScrollAttached){this.showJumpPill();return}requestAnimationFrame(()=>{this.messagesEl.scrollTop=this.messagesEl.scrollHeight,this.lastScrollTop=this.messagesEl.scrollTop})}showJumpPill(){this.jumpPill.classList.add(`chat__jump-pill--visible`)}hideJumpPill(){this.jumpPill.classList.remove(`chat__jump-pill--visible`)}persistSession(){this.sessionStore.saveMessages(this.sessionId,this.messages).catch(()=>{})}disposeInlineSprinklesForMessage(e){let t=this.inlineSprinkles.get(e);t&&(mi(t),this.inlineSprinkles.delete(e))}disposeAllInlineSprinkles(){for(let[,e]of this.inlineSprinkles)mi(e);this.inlineSprinkles.clear()}hydrateInlineSprinklesInEl(e,t){let n=pi(e,(e,t)=>this.onInlineSprinkleLick?.(e,t));n.length&&this.inlineSprinkles.set(t,n)}dispose(){this.cancelPendingDelta(),this.disposeAllInlineSprinkles(),this.unsubscribe?.(),this.voiceInput?.destroy(),this.keydownListener&&=(document.removeEventListener(`keydown`,this.keydownListener),null),this.container.innerHTML=``}},Oi=class{container;terminalViewEl;previewViewEl;previewEmptyEl;previewBtn;shell=null;activeView=`terminal`;onClearTerminal;constructor(e,t={}){this.container=e,this.onClearTerminal=t.onClearTerminal??null,this.render()}async mountShell(e){this.shell?.setPreviewStateListener(null),this.shell=e;let t=document.createElement(`div`);t.className=`terminal-panel__mount`,this.terminalViewEl.appendChild(t),await e.mount(t);let n=t.querySelector(`.terminal-panel__terminal-host`),r=t.querySelector(`.terminal-panel__preview`);if(!n||!r)throw Error(`terminal mount did not create expected hosts`);this.terminalViewEl.replaceChildren(n),this.previewViewEl.replaceChildren(this.previewEmptyEl),this.previewViewEl.appendChild(r),e.setPreviewStateListener(e=>this.handlePreviewStateChange(e))}clearTerminal(){this.shell?.clearTerminal()}async runCommand(e){return this.shell?(/^\s*imgcat(?:\s|$)/.test(e)||this.setActiveView(`terminal`),this.shell.executeCommandInTerminal(e)):{stdout:``,stderr:`terminal is unavailable
|
|
243
243
|
`,exitCode:1}}refit(){this.shell?.refit()}getBodyElement(){return this.container}render(){this.container.innerHTML=``,this.container.classList.add(`terminal-panel`);let e=document.createElement(`div`);e.className=`file-browser__header`;let t=document.createElement(`span`);if(t.className=`file-browser__header-title`,t.textContent=`Terminal`,e.appendChild(t),this.onClearTerminal){let t=document.createElement(`button`);t.className=`file-browser__header-btn`,t.dataset.tooltip=`Clear Terminal`,t.setAttribute(`aria-label`,`Clear Terminal`),t.innerHTML=`<svg width="14" height="14" viewBox="0 0 20 20" fill="none"><path d="m8.249,15.021c-.4,0-.733-.317-.748-.72l-.25-6.5c-.017-.414.307-.763.72-.778.01-.001.021-.001.03-.001.4,0,.733.317.748.72l.25,6.5c.017.414-.307.763-.72.778-.01.001-.021.001-.03.001Z" fill="currentColor"/><path d="m11.751,15.021c-.01,0-.02,0-.03-.001-.413-.016-.736-.364-.72-.778l.25-6.5c.015-.403.348-.72.748-.72.01,0,.02,0,.03.001.413.016.736.364.72.778l-.25,6.5c-.015.403-.348.72-.748.72Z" fill="currentColor"/><path d="m17,4h-3.5v-.75c0-1.24-1.01-2.25-2.25-2.25h-2.5c-1.24,0-2.25,1.01-2.25,2.25v.75h-3.5c-.414,0-.75.336-.75.75s.336.75.75.75h.52l.422,10.342c.048,1.21,1.036,2.158,2.248,2.158h7.619c1.212,0,2.2-.948,2.248-2.158l.422-10.342h.52c.414,0,.75-.336.75-.75s-.336-.75-.75-.75Zm-9-.75c0-.413.337-.75.75-.75h2.5c.413,0,.75.337.75.75v.75h-4v-.75Zm6.56,12.531c-.017.403-.346.719-.75.719h-7.619c-.404,0-.733-.316-.75-.719l-.42-10.281h9.959l-.42,10.281Z" fill="currentColor"/></svg>`,t.addEventListener(`click`,()=>this.onClearTerminal()),e.appendChild(t)}this.previewBtn=document.createElement(`button`),this.previewBtn.className=`file-browser__header-btn`,this.previewBtn.setAttribute(`aria-label`,`Toggle preview`),this.previewBtn.dataset.tooltip=`Preview`,this.previewBtn.disabled=!0;let n=`http://www.w3.org/2000/svg`,r=document.createElementNS(n,`svg`);r.setAttribute(`width`,`16`),r.setAttribute(`height`,`16`),r.setAttribute(`viewBox`,`0 0 20 20`),r.setAttribute(`fill`,`none`),r.setAttribute(`stroke`,`currentColor`),r.setAttribute(`stroke-width`,`1.5`),r.setAttribute(`stroke-linecap`,`round`),r.setAttribute(`stroke-linejoin`,`round`);let i=document.createElementNS(n,`path`);i.setAttribute(`d`,`M2 10s3-6 8-6 8 6 8 6-3 6-8 6-8-6-8-6z`),r.appendChild(i);let a=document.createElementNS(n,`circle`);a.setAttribute(`cx`,`10`),a.setAttribute(`cy`,`10`),a.setAttribute(`r`,`2.5`),r.appendChild(a),this.previewBtn.appendChild(r),this.previewBtn.addEventListener(`click`,()=>{this.previewBtn.disabled||this.setActiveView(this.activeView===`preview`?`terminal`:`preview`)}),e.appendChild(this.previewBtn),this.container.appendChild(e),this.terminalViewEl=document.createElement(`div`),this.terminalViewEl.className=`terminal-panel__view`,this.container.appendChild(this.terminalViewEl),this.previewViewEl=document.createElement(`div`),this.previewViewEl.className=`terminal-panel__view`,this.container.appendChild(this.previewViewEl),this.previewEmptyEl=document.createElement(`div`),this.previewEmptyEl.className=`terminal-panel__empty-state`,this.previewEmptyEl.textContent=`Run imgcat to preview media here.`,this.previewViewEl.appendChild(this.previewEmptyEl),this.setActiveView(`terminal`)}dispose(){this.shell?.setPreviewStateListener(null),this.shell?.dispose(),this.container.innerHTML=``}setActiveView(e){this.activeView=e,this.previewBtn.classList.toggle(`file-browser__header-btn--active`,e===`preview`),this.terminalViewEl.style.display=e===`terminal`?`flex`:`none`,this.previewViewEl.style.display=e===`preview`?`flex`:`none`,e===`terminal`&&this.refit()}handlePreviewStateChange(e){this.previewBtn.disabled=!e,this.previewEmptyEl.style.display=e?`none`:`flex`,e?this.setActiveView(`preview`):this.activeView===`preview`&&this.setActiveView(`terminal`)}};function ki(e){return e<1024?e+` B`:e<1024*1024?(e/1024).toFixed(1)+`K`:e<1024*1024*1024?(e/(1024*1024)).toFixed(1)+`M`:(e/(1024*1024*1024)).toFixed(1)+`G`}function Ai(e){let t=`http://www.w3.org/2000/svg`,n=document.createElementNS(t,`svg`);n.setAttribute(`width`,`14`),n.setAttribute(`height`,`14`),n.setAttribute(`viewBox`,`0 0 20 20`),n.setAttribute(`fill`,`none`),n.setAttribute(`stroke`,`currentColor`),n.setAttribute(`stroke-width`,`1.5`),n.setAttribute(`stroke-linecap`,`round`),n.setAttribute(`stroke-linejoin`,`round`),n.style.flexShrink=`0`;for(let r of e){let e=document.createElementNS(t,`path`);e.setAttribute(`d`,r),n.appendChild(e)}return n}function ji(){return Ai([`M2 6V5a1 1 0 0 1 1-1h4l2 2h8a1 1 0 0 1 1 1v8a1 1 0 0 1-1 1H3a1 1 0 0 1-1-1V6z`])}function Mi(){return Ai([`M6 2h5l5 5v9a1 1 0 0 1-1 1H6a1 1 0 0 1-1-1V3a1 1 0 0 1 1-1z`,`M11 2v5h5`])}function Ni(e){let t=`http://www.w3.org/2000/svg`,n=document.createElementNS(t,`svg`);n.setAttribute(`width`,`10`),n.setAttribute(`height`,`10`),n.setAttribute(`viewBox`,`0 0 20 20`),n.setAttribute(`fill`,`none`),n.setAttribute(`stroke`,`currentColor`),n.setAttribute(`stroke-width`,`2`),n.setAttribute(`stroke-linecap`,`round`),n.setAttribute(`stroke-linejoin`,`round`),n.style.flexShrink=`0`,n.style.transition=`transform 130ms ease`,e&&(n.style.transform=`rotate(90deg)`);let r=document.createElementNS(t,`path`);return r.setAttribute(`d`,`M7 5l5 5-5 5`),n.appendChild(r),n}function Pi(e){return`'${e.replace(/'/g,`'\\''`)}'`}function Fi(e){return`${f(e)?`imgcat`:`cat`} ${Pi(e)}`}var Ii=class{container;bodyEl;fs=null;expandedDirs=new Set([`/`]);refreshTimer=null;onRunCommand;selectedPath=null;keydownHandler=null;constructor(e,t={}){this.container=e,this.onRunCommand=t.onRunCommand??null,this.render()}setFs(e){this.fs=e,this.refresh(),this.refreshTimer=setInterval(()=>this.refresh(),3e3)}async refresh(){if(!this.fs)return;let e=document.createElement(`div`);try{await this.renderDir(`/`,e,0)}catch(e){console.warn(`[FileBrowser] Refresh failed:`,e instanceof Error?e.message:String(e));return}if(e.innerHTML===this.bodyEl.innerHTML){this.applySelection();return}let t=this.container.contains(document.activeElement);for(;this.bodyEl.firstChild;)this.bodyEl.removeChild(this.bodyEl.firstChild);for(;e.firstChild;)this.bodyEl.appendChild(e.firstChild);this.applySelection(),t&&this.selectedPath&&this.bodyEl.querySelector(`.file-browser__item--selected`)?.focus()}render(){for(;this.container.firstChild;)this.container.removeChild(this.container.firstChild);this.container.classList.add(`file-browser`);let e=document.createElement(`div`);e.className=`file-browser__header`;let t=document.createElement(`span`);t.className=`file-browser__header-title`,t.textContent=`Files`,e.appendChild(t),this.container.appendChild(e),this.bodyEl=document.createElement(`div`),this.bodyEl.className=`file-browser__body`,this.container.appendChild(this.bodyEl),this.setupKeydown()}async renderDir(e,t,n){if(!this.fs)return;let r;try{r=await this.fs.readDir(e)}catch(t){console.warn(`[FileBrowser] readDir failed:`,e,t instanceof Error?t.message:String(t));return}let i=r.filter(e=>e.type===`directory`).sort((e,t)=>e.name.localeCompare(t.name)),a=r.filter(e=>e.type===`file`).sort((e,t)=>e.name.localeCompare(t.name));for(let r of[...i,...a]){let i=e===`/`?`/`+r.name:e+`/`+r.name,a=document.createElement(`div`);if(a.className=`file-browser__item`,a.style.paddingLeft=12+n*16+`px`,a.dataset.path=r.type===`directory`&&!i.endsWith(`/`)?i+`/`:i,r.type===`directory`){let e=this.expandedDirs.has(i),o=document.createElement(`span`);o.className=`file-browser__arrow`,o.appendChild(Ni(e)),a.appendChild(o);let s=document.createElement(`span`);s.className=`file-browser__icon`,s.appendChild(ji()),a.appendChild(s);let c=document.createElement(`span`);c.className=`file-browser__name`,c.textContent=r.name,a.appendChild(c);let l=document.createElement(`button`);l.className=`file-browser__action-btn`,l.style.marginLeft=`auto`,l.textContent=`ZIP`,l.title=`Download as ZIP`,l.addEventListener(`click`,e=>{e.stopPropagation(),this.downloadDirAsZip(i,r.name)}),a.appendChild(l),a.style.cursor=`pointer`,a.addEventListener(`click`,()=>{this.selectPath(i,`directory`),this.expandedDirs.has(i)?this.expandedDirs.delete(i):this.expandedDirs.add(i),this.refresh()}),t.appendChild(a),e&&await this.renderDir(i,t,n+1)}else{let e=document.createElement(`span`);e.className=`file-browser__arrow`,a.appendChild(e);let n=document.createElement(`span`);n.className=`file-browser__icon`,n.appendChild(Mi()),a.appendChild(n);let o=document.createElement(`span`);o.className=`file-browser__name`,o.textContent=r.name,a.appendChild(o);try{let e=await this.fs.stat(i),t=document.createElement(`span`);t.className=`file-browser__size`,t.textContent=ki(e.size),a.appendChild(t)}catch(e){console.warn(`[FileBrowser] stat failed:`,i,e instanceof Error?e.message:String(e))}let s=document.createElement(`button`);s.className=`file-browser__action-btn`,s.style.marginLeft=`8px`,s.textContent=`CAT`,s.title=this.onRunCommand?f(i)?`Preview media in terminal`:`Preview in terminal`:`Terminal unavailable`,s.disabled=!this.onRunCommand,s.addEventListener(`click`,e=>{e.stopPropagation(),this.previewFile(i)}),a.appendChild(s),a.addEventListener(`click`,()=>{this.selectPath(i,`file`)}),t.appendChild(a)}}}async collectFiles(e,t){if(!this.fs)return{};let n={},r=await this.fs.readDir(e);for(let i of r){let r=e===`/`?`/`+i.name:e+`/`+i.name,a=t?t+`/`+i.name:i.name;if(i.type===`directory`){let e=await this.collectFiles(r,a);Object.assign(n,e)}else{let e=await this.fs.readFile(r,{encoding:`binary`});n[a]=e instanceof Uint8Array?e:new TextEncoder().encode(e)}}return n}async downloadDirAsZip(e,t){if(this.fs)try{let n=F(await this.collectFiles(e,``)),r=new Blob([n.buffer],{type:`application/zip`}),i=URL.createObjectURL(r),a=document.createElement(`a`);a.href=i,a.download=t+`.zip`,a.click(),URL.revokeObjectURL(i)}catch(t){console.error(`[FileBrowser] ZIP download failed:`,e,t instanceof Error?t.message:String(t))}}previewFile(e){if(!this.onRunCommand)return;let t=Fi(e);Promise.resolve(this.onRunCommand(t)).catch(t=>{console.error(`[FileBrowser] Preview command failed:`,e,t instanceof Error?t.message:String(t))})}selectPath(e,t){this.selectedPath=t===`directory`&&!e.endsWith(`/`)?e+`/`:e,this.applySelection(),this.bodyEl.querySelector(`.file-browser__item--selected`)?.focus()}applySelection(){let e=this.bodyEl.querySelector(`.file-browser__item--selected`);if(e&&(e.classList.remove(`file-browser__item--selected`),e.removeAttribute(`tabindex`)),!this.selectedPath)return;let t=this.bodyEl.querySelectorAll(`.file-browser__item`);for(let e of t)if(e.dataset.path===this.selectedPath){e.classList.add(`file-browser__item--selected`),e.tabIndex=0;break}}setupKeydown(){this.keydownHandler=e=>{!(e.metaKey||e.ctrlKey)||e.key!==`c`||this.selectedPath&&window.getSelection()?.isCollapsed!==!1&&(e.preventDefault(),navigator.clipboard.writeText(this.selectedPath).then(()=>{this.flashCopyFeedback()}).catch(e=>{console.warn(`[FileBrowser] Clipboard write failed:`,e instanceof Error?e.message:String(e))}))},this.container.addEventListener(`keydown`,this.keydownHandler)}flashCopyFeedback(){let e=this.bodyEl.querySelector(`.file-browser__item--selected`);e&&(e.classList.add(`file-browser__item--copy-flash`),setTimeout(()=>{e.classList.remove(`file-browser__item--copy-flash`)},300))}dispose(){for(this.keydownHandler&&=(this.container.removeEventListener(`keydown`,this.keydownHandler),null),this.refreshTimer&&=(clearInterval(this.refreshTimer),null);this.container.firstChild;)this.container.removeChild(this.container.firstChild)}},Li=class{container;bodyEl;orchestrator=null;selectedScoopJid=null;refreshTimer=null;constructor(e){this.container=e,this.render()}setOrchestrator(e){this.orchestrator=e,this.refresh(),this.refreshTimer=setInterval(()=>this.refresh(),5e3)}setSelectedScoop(e){this.selectedScoopJid=e,this.refresh()}async refresh(){if(!this.orchestrator)return;let e=document.createElement(`div`);e.className=`memory-panel__content`;let t=document.createElement(`div`);t.className=`memory-panel__section`;let n=document.createElement(`div`);n.className=`memory-panel__section-header`,n.textContent=`Global Memory (/shared/CLAUDE.md)`,t.appendChild(n);let r=document.createElement(`div`);r.className=`memory-panel__memory-content`;try{r.textContent=await this.orchestrator.getGlobalMemory()||`(empty)`}catch{r.textContent=`(not available)`}if(t.appendChild(r),e.appendChild(t),this.selectedScoopJid){let t=this.orchestrator.getScoopContext(this.selectedScoopJid),n=this.orchestrator.getScoop(this.selectedScoopJid);if(t&&n){let r=document.createElement(`div`);r.className=`memory-panel__section`;let i=document.createElement(`div`);i.className=`memory-panel__section-header`,i.textContent=`${n.isCone?`Cone`:`Scoop`}: ${n.assistantLabel}`,r.appendChild(i);let a=document.createElement(`div`);a.className=`memory-panel__memory-content`;try{let e=t.getFS();if(e){let t=n.isCone?`/workspace/CLAUDE.md`:`/scoops/${n.folder}/CLAUDE.md`,r=await e.readFile(t,{encoding:`utf-8`});a.textContent=typeof r==`string`?r:new TextDecoder().decode(r)}else a.textContent=`(filesystem not ready)`}catch{a.textContent=`(no memory file yet)`}r.appendChild(a),e.appendChild(r)}}if(e.innerHTML!==this.bodyEl.innerHTML){for(;this.bodyEl.firstChild;)this.bodyEl.removeChild(this.bodyEl.firstChild);for(;e.firstChild;)this.bodyEl.appendChild(e.firstChild)}}render(){for(;this.container.firstChild;)this.container.removeChild(this.container.firstChild);this.container.classList.add(`memory-panel`),this.bodyEl=document.createElement(`div`),this.bodyEl.className=`memory-panel__body`,this.container.appendChild(this.bodyEl)}dispose(){this.refreshTimer&&=(clearInterval(this.refreshTimer),null)}},Ri=n(`scoops-panel`),zi=class e{container;orchestrator=null;callbacks;selectedScoopJid=null;scoopStatuses=new Map;expanded=!1;eyesEl=null;hoveredJid=null;lastProcessingJid=null;coneJid=null;leftPupilGroup=null;rightPupilGroup=null;eyesSvg=null;mouseMoveBound=null;constructor(e,t){this.container=e,this.callbacks=t,this.render()}dispose(){this.mouseMoveBound&&=(document.removeEventListener(`mousemove`,this.mouseMoveBound),null),this.eyesEl?.remove(),this.eyesEl=null,this.eyesSvg=null,this.leftPupilGroup=null,this.rightPupilGroup=null,document.querySelectorAll(`.scoop-fixed-tooltip`).forEach(e=>e.remove())}toggleExpanded(){this.expanded=!this.expanded,this.container.classList.toggle(`layout__scoops--expanded`,this.expanded)}static LEFT_EYE={cx:55,cy:50,r:38};static RIGHT_EYE={cx:145,cy:50,r:38};static PUPIL_R=18;static MAX_OFFSET=16;createEyesEl(){let t=`http://www.w3.org/2000/svg`,n=document.createElement(`div`);n.className=`scoop-eyes`;let r=document.createElementNS(t,`svg`);r.setAttribute(`viewBox`,`0 0 200 100`),r.setAttribute(`width`,`100%`),r.setAttribute(`height`,`100%`);let{LEFT_EYE:i,RIGHT_EYE:a,PUPIL_R:o}=e,s=e=>{let n=document.createElementNS(t,`circle`);n.setAttribute(`cx`,String(e.cx)),n.setAttribute(`cy`,String(e.cy)),n.setAttribute(`r`,String(e.r)),n.setAttribute(`fill`,`#fff`),n.setAttribute(`stroke`,`#000`),n.setAttribute(`stroke-width`,`4`),r.appendChild(n);let i=document.createElementNS(t,`g`),a=document.createElementNS(t,`circle`);a.setAttribute(`cx`,String(e.cx)),a.setAttribute(`cy`,String(e.cy)),a.setAttribute(`r`,String(o)),a.setAttribute(`fill`,`#000`),i.appendChild(a);let s=document.createElementNS(t,`circle`);return s.setAttribute(`cx`,String(e.cx-o*.3)),s.setAttribute(`cy`,String(e.cy-o*.35)),s.setAttribute(`r`,String(o*.4)),s.setAttribute(`fill`,`#fff`),i.appendChild(s),r.appendChild(i),i};return this.leftPupilGroup=s(i),this.rightPupilGroup=s(a),n.appendChild(r),this.eyesSvg=r,this.mouseMoveBound||(this.mouseMoveBound=e=>this.onMouseMove(e),document.addEventListener(`mousemove`,this.mouseMoveBound)),n}onMouseMove(t){if(!this.eyesSvg||!this.leftPupilGroup||!this.rightPupilGroup)return;let n=this.eyesSvg.getBoundingClientRect();if(n.width===0||n.height===0)return;let r=200/n.width,i=100/n.height,a=(t.clientX-n.left)*r,o=(t.clientY-n.top)*i,{LEFT_EYE:s,RIGHT_EYE:c,MAX_OFFSET:l}=e;this.positionPupilGroup(this.leftPupilGroup,s.cx,s.cy,a,o,l),this.positionPupilGroup(this.rightPupilGroup,c.cx,c.cy,a,o,l)}positionPupilGroup(e,t,n,r,i,a){let o=r-t,s=i-n,c=Math.sqrt(o*o+s*s),l=Math.min(c,a),u=c>0?o/c*l:0,d=c>0?s/c*l:0;e.setAttribute(`transform`,`translate(${u},${d})`)}resolveEyesOwner(){if(this.hoveredJid&&this.hasScoopItem(this.hoveredJid))return this.hoveredJid;if(this.lastProcessingJid&&this.scoopStatuses.get(this.lastProcessingJid)===`processing`&&this.hasScoopItem(this.lastProcessingJid))return this.lastProcessingJid;for(let[e,t]of this.scoopStatuses)if(t===`processing`&&this.hasScoopItem(e))return this.lastProcessingJid=e,e;return this.coneJid}hasScoopItem(e){return!!this.container.querySelector(`.scoop-item[data-jid="${CSS.escape(e)}"]`)}moveEyes(){this.eyesEl||=this.createEyesEl();let e=this.resolveEyesOwner();if(!e)return;let t=this.container.querySelector(`.scoop-item[data-jid="${CSS.escape(e)}"]`);if(!t)return;let n=t.querySelector(`.scoop-icon-wrap`);n&&this.eyesEl.parentElement!==n&&n.appendChild(this.eyesEl)}setOrchestrator(e){this.orchestrator=e,this.refreshScoops()}updateScoopStatus(e,t){this.scoopStatuses.set(e,t),t===`processing`&&(this.lastProcessingJid=e),this.refreshScoops()}refreshScoops(){if(!this.orchestrator)return;document.querySelectorAll(`.scoop-fixed-tooltip`).forEach(e=>e.remove());let e=this.orchestrator.getScoops(),t=e.find(e=>e.isCone),n=e.filter(e=>!e.isCone),r=`http://www.w3.org/2000/svg`,i=[`#e8457a`,`#f08c5a`,`#9b6dd7`,`#42b8a0`,`#d4953e`],a=[`#fde4ec`,`#fef0e4`,`#efe4f8`,`#e0f5ef`,`#fef3e0`],o=this.container.querySelector(`.scoop-cone-header`);if(o){for(;o.firstChild;)o.removeChild(o.firstChild);if(t){this.coneJid=t.jid;let e=this.scoopStatuses.get(t.jid)??`inactive`,n=t.jid===this.selectedScoopJid,i=`#e07030`,a=`#fef0e0`,s=document.createElement(`div`);s.className=`scoop-item scoop-item--cone ${n?`selected`:``} status-${e}`,s.dataset.jid=t.jid,s.setAttribute(`aria-label`,t.assistantLabel),s.style.setProperty(`--scoop-accent`,i),s.style.setProperty(`--scoop-accent-bg`,a);let c=document.createElement(`div`);c.className=`scoop-icon-wrap scoop-icon-wrap--cone`,c.style.background=a,c.style.width=`40px`,c.style.height=`40px`;let l=document.createElementNS(r,`svg`);if(l.setAttribute(`width`,`24`),l.setAttribute(`height`,`24`),l.setAttribute(`viewBox`,`70 330 440 570`),l.innerHTML=`<path 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" fill="${i}" stroke="${i}" stroke-linejoin="round" stroke-width="12"/><path d="M261.93,482.48h0c15.03-15.03,4.46-40.72-16.79-40.83h0c-21.37-.11-32.14,25.72-17.03,40.83h0c9.34,9.34,24.48,9.34,33.82,0Z" fill="${a}"/><path d="M384.85,527.49l-51.82,51.82c-2.24,2.24-2.24,5.86,0,8.1l55.71,55.71c2.24,2.24,5.86,2.24,8.1,0h0c.62-.62,1.08-1.36,1.37-2.19l26.52-77.11c.71-2.07.18-4.36-1.37-5.91l-30.41-30.41c-2.24-2.24-5.86-2.24-8.1,0Z" fill="${a}"/><rect x="274.59" y="463.59" width="84.73" height="95.66" rx="42.36" ry="42.36" transform="translate(-268.79 373.91) rotate(-45)" fill="${a}"/><rect x="291.06" y="603.84" width="72.24" height="90.24" rx="36.12" ry="36.12" transform="translate(-363.06 421.43) rotate(-45)" fill="${a}"/><path d="M371.7,684.58l-25.94,25.94c-2.24,2.24-2.24,5.86,0,8.1l12.67,12.67c2.99,2.99,8.09,1.82,9.46-2.19l13.28-38.61c1.97-5.74-5.17-10.2-9.46-5.91Z" fill="${a}"/><path d="M159.42,564.14l2.73,6.83c1.52,3.82,6.46,4.83,9.37,1.93l2.05-2.05c2.24-2.24,2.24-5.86,0-8.1l-4.78-4.78c-4.4-4.4-11.67.39-9.37,6.17Z" fill="${a}"/><path d="M243.92,633.11l-48.65-48.65c-5.24-5.24-13.74-5.24-18.99,0h0c-3.8,3.8-4.97,9.49-2.98,14.47l27.77,69.54c3.58,8.95,15.14,11.33,21.96,4.51l20.89-20.89c5.24-5.24,5.24-13.74,0-18.99Z" fill="${a}"/><path d="M211.32,533.1h0c14.11-14.11,14.11-36.98,0-51.08l-34.94-34.94c-.72-.72-.72-1.89,0-2.62h0c1.16-1.16.34-3.15-1.3-3.16l-11.23-.06c-25.62-.13-43.23,25.72-33.73,49.51l5.37,13.45c1.82,4.55,4.54,8.68,8,12.15l16.74,16.74c14.11,14.11,36.98,14.11,51.08,0Z" fill="${a}"/><path d="M263.74,792.53h0c-5.69,5.69-7.45,14.23-4.46,21.71l22.5,56.36c6.92,17.34,31.68,16.74,37.75-.92l8.66-25.2c2.5-7.28.64-15.35-4.8-20.79l-31.17-31.17c-7.87-7.87-20.62-7.87-28.48,0Z" fill="${a}"/><path d="M392.94,503.07l40.81-40.81c2.24-2.24,5.86-2.24,8.1,0l.06.06c2.24,2.24,2.24,5.86,0,8.1l-40.81,40.81c-2.24,2.24-2.24,5.86,0,8.1l22.48,22.48c2.99,2.99,8.09,1.82,9.46-2.19l30.71-89.32c1.27-3.71-1.47-7.57-5.39-7.59l-120.63-.6c-5.11-.03-7.69,6.16-4.08,9.77l51.18,51.18c2.24,2.24,5.86,2.24,8.1,0Z" fill="${a}"/><rect x="217.18" y="527.25" width="72.24" height="95.66" rx="36.12" ry="36.12" transform="translate(-332.45 347.55) rotate(-45)" fill="${a}"/><path d="M350.28,739.46h0c-9.24-9.24-24.22-9.24-33.46,0l-13.94,13.94c-9.24,9.24-9.24,24.22,0,33.46l6.81,6.81c12.37,12.37,33.42,7.5,39.1-9.04l7.13-20.75c2.94-8.55.75-18.03-5.64-24.42Z" fill="${a}"/><path d="M234.18,749.12l13.2,33.06c1.52,3.82,6.46,4.83,9.37,1.93l9.93-9.93c2.24-2.24,2.24-5.86,0-8.1l-23.13-23.13c-4.4-4.4-11.67.39-9.37,6.17Z" fill="${a}"/><rect x="236.26" y="661.25" width="67.04" height="90.24" rx="33.52" ry="33.52" transform="translate(-420.46 397.65) rotate(-45)" fill="${a}"/><ellipse cx="288.37" cy="404.38" rx="182.34" ry="67.01" fill="${i}" stroke="${i}" stroke-miterlimit="10" stroke-width="12"/>`,c.appendChild(l),e===`processing`||e===`ready`||e===`error`){let t=document.createElement(`span`);t.className=`scoop-dot scoop-dot--${e}`,c.appendChild(t)}s.appendChild(c);let u=document.createElement(`div`);u.className=`scoop-info`;let d=document.createElement(`div`);if(d.className=`scoop-name`,d.textContent=t.assistantLabel,u.appendChild(d),e===`processing`||e===`error`){let t=document.createElement(`div`);t.className=`scoop-subtitle`,t.textContent=e===`processing`?`Working…`:`Error`,u.appendChild(t)}s.appendChild(u);let f=document.createElement(`div`);if(f.className=`scoop-actions`,e===`processing`){let e=document.createElement(`span`);e.className=`scoop-spin-dot`,f.appendChild(e)}else if(e===`error`){let e=document.createElement(`span`);e.className=`scoop-err-dot`,f.appendChild(e)}s.appendChild(f),s.addEventListener(`click`,()=>this.selectScoop(t)),s.addEventListener(`mouseenter`,()=>{this.hoveredJid=t.jid,this.moveEyes()}),s.addEventListener(`mouseleave`,()=>{this.hoveredJid===t.jid&&(this.hoveredJid=null),this.moveEyes()});let p=t.assistantLabel;s.addEventListener(`mouseenter`,()=>{if(this.expanded)return;let e=document.createElement(`div`);e.className=`scoop-fixed-tooltip`,e.textContent=p,document.body.appendChild(e);let t=s.getBoundingClientRect();e.style.top=`${t.top+t.height/2}px`,e.style.left=`${t.right+8}px`,s.__tip=e}),s.addEventListener(`mouseleave`,()=>{let e=s.__tip;e&&(e.remove(),s.__tip=null)}),o.appendChild(s)}}let s=this.container.querySelector(`.scoops-list`);if(s){for(;s.firstChild;)s.removeChild(s.firstChild);if(n.length===0){this.callbacks.onScoopsChanged?.(e),this.moveEyes();return}for(let e=0;e<n.length;e++){let t=n[e],o=this.scoopStatuses.get(t.jid)??`inactive`,c=t.jid===this.selectedScoopJid,l=i[e%i.length],u=a[e%a.length],d=document.createElement(`div`);d.className=`scoop-item ${c?`selected`:``} status-${o}`,d.dataset.jid=t.jid;let f=t.assistantLabel.replace(/-scoop$/,``);d.setAttribute(`aria-label`,f),d.style.setProperty(`--scoop-accent`,l),d.style.setProperty(`--scoop-accent-bg`,u);let p=document.createElement(`div`);p.className=`scoop-icon-wrap`,p.style.background=u;let m=document.createElementNS(r,`svg`);m.setAttribute(`width`,`20`),m.setAttribute(`height`,`20`),m.setAttribute(`viewBox`,`0 0 580 470`);let h=document.createElementNS(r,`path`);if(h.setAttribute(`d`,`M566.75,340.67c0-29.85-12.97-56.87-33.96-76.47,4.8-9.98,7.44-20.71,7.44-31.9,0-38.29-30.62-71.33-74.92-86.77.33-3.07.51-6.17.51-9.3,0-69.72-84.29-126.24-188.26-126.24s-188.26,56.52-188.26,126.24c0,4,.29,7.95.83,11.86-34.94,15.4-58.48,44.25-58.48,77.34,0,18.21,7.15,35.15,19.39,49.26-25.1,19.88-41.05,49.47-41.05,82.54,0,59.85,52.15,108.37,116.49,108.37,10.83,0,21.3-1.4,31.26-3.98,31.42,41.91,83.55,69.34,142.55,69.34,64.73,0,121.2-33,151.11-81.94,63.8-.57,115.34-48.85,115.34-108.34Z`),h.setAttribute(`fill`,l),h.setAttribute(`stroke`,l),h.setAttribute(`stroke-width`,`10`),m.appendChild(h),p.appendChild(m),o===`processing`||o===`ready`||o===`error`){let e=document.createElement(`span`);e.className=`scoop-dot scoop-dot--${o}`,p.appendChild(e)}d.appendChild(p);let g=document.createElement(`div`);g.className=`scoop-info`;let _=document.createElement(`div`);if(_.className=`scoop-name`,_.textContent=f,g.appendChild(_),o===`processing`||o===`error`){let e=document.createElement(`div`);e.className=`scoop-subtitle`,e.textContent=o===`processing`?`Working…`:`Error`,g.appendChild(e)}d.appendChild(g);let v=document.createElement(`div`);if(v.className=`scoop-actions`,o===`processing`){let e=document.createElement(`span`);e.className=`scoop-spin-dot`,v.appendChild(e)}else if(o===`error`){let e=document.createElement(`span`);e.className=`scoop-err-dot`,v.appendChild(e)}d.appendChild(v),d.addEventListener(`click`,()=>{this.selectScoop(t)}),d.addEventListener(`mouseenter`,()=>{this.hoveredJid=t.jid,this.moveEyes()}),d.addEventListener(`mouseleave`,()=>{this.hoveredJid===t.jid&&(this.hoveredJid=null),this.moveEyes()}),d.addEventListener(`mouseenter`,()=>{if(this.expanded)return;let e=document.createElement(`div`);e.className=`scoop-fixed-tooltip`,e.textContent=f,document.body.appendChild(e);let t=d.getBoundingClientRect();e.style.top=`${t.top+t.height/2}px`,e.style.left=`${t.right+8}px`,d.__tip=e}),d.addEventListener(`mouseleave`,()=>{let e=d.__tip;e&&(e.remove(),d.__tip=null)}),s.appendChild(d)}this.callbacks.onScoopsChanged?.(e),this.moveEyes()}}selectScoop(e){this.selectedScoopJid=e.jid,this.refreshScoops(),this.callbacks.onScoopSelect(e);let t=new URL(window.location.href);e.isCone?t.searchParams.delete(`scoop`):t.searchParams.set(`scoop`,e.folder),history.replaceState(null,``,t.toString())}selectScoopByFolder(e){if(!this.orchestrator)return;let t=this.orchestrator.getScoops().find(t=>t.folder===e);t&&this.selectScoop(t)}setSelectedJid(e){this.selectedScoopJid=e,this.refreshScoops()}getSelectedScoopJid(){return this.selectedScoopJid}async deleteScoop(e){if(!this.orchestrator)return;let t=this.orchestrator.getScoop(e);if(t){if(t.isCone){alert(`Cannot delete the cone`);return}if(confirm(`Delete scoop "${t.name}"? This cannot be undone.`)){try{await this.orchestrator.unregisterScoop(e)}catch(e){let t=e instanceof Error?e.message:String(e);alert(t);return}this.selectedScoopJid===e&&(this.selectedScoopJid=null),this.refreshScoops(),Ri.info(`Scoop deleted`,{jid:e,name:t.name})}}}async createCone(e=`Cone`){if(!this.orchestrator)throw Error(`Orchestrator not set`);let t={jid:`cone_${Date.now()}`,name:e,folder:`cone`,requiresTrigger:!1,isCone:!0,type:`cone`,assistantLabel:`sliccy`,addedAt:new Date().toISOString()};return await this.orchestrator.registerScoop(t),this.refreshScoops(),Ri.info(`Cone created`,{jid:t.jid,name:e}),t}render(){for(;this.container.firstChild;)this.container.removeChild(this.container.firstChild);let e=document.createElement(`div`);e.className=`scoops-panel`;let t=document.createElement(`div`);t.className=`scoop-cone-header`,e.appendChild(t);let n=document.createElement(`div`);n.className=`scoops-list`,e.appendChild(n),this.container.appendChild(e);let r=document.createElement(`style`);r.textContent=`
|
|
244
244
|
.scoops-panel {
|
|
245
245
|
display: flex;
|
|
@@ -13263,7 +13263,8 @@ ${t}
|
|
|
13263
13263
|
---`);let a=$y(n);return a&&(i+=a),i}},lb=n(`scheduler`),ub=class{callbacks;pollInterval=null;running=!1;constructor(e){this.callbacks=e}start(){this.running||(this.running=!0,this.pollInterval=window.setInterval(()=>this.checkTasks(),6e4),this.checkTasks(),lb.info(`Scheduler started`))}stop(){this.pollInterval&&=(clearInterval(this.pollInterval),null),this.running=!1,lb.info(`Scheduler stopped`)}async createTask(e,t,n,r){let i={id:`task-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,groupFolder:e,prompt:t,scheduleType:n,scheduleValue:r,status:`active`,nextRun:this.calculateNextRun(n,r),lastRun:null,createdAt:new Date().toISOString()};return await Ue(i),lb.info(`Task created`,{id:i.id,groupFolder:e,scheduleType:n}),i}async updateTask(e,t){let n=await Ne(e);if(!n)return null;let r={...n,...t};return(t.scheduleType||t.scheduleValue)&&(r.nextRun=this.calculateNextRun(r.scheduleType,r.scheduleValue)),await Ue(r),lb.info(`Task updated`,{id:e,updates:Object.keys(t)}),r}async pauseTask(e){return await this.updateTask(e,{status:`paused`})!==null}async resumeTask(e){return await Ne(e)?(await this.updateTask(e,{status:`active`}),!0):!1}async deleteTask(e){return await Ne(e)?(await we(e),lb.info(`Task deleted`,{id:e}),!0):!1}async getTasksByScoop(e){return(await Me()).filter(t=>t.groupFolder===e)}async getAllTasks(){return Me()}async checkTasks(){let e=await Me(),t=new Date;for(let n of e)n.status===`active`&&n.nextRun&&(new Date(n.nextRun)>t||await this.runTask(n))}async runTask(e){let t=this.callbacks.getScoop(e.groupFolder);if(!t){lb.warn(`Task scoop not found`,{taskId:e.id,groupFolder:e.groupFolder});return}lb.info(`Running task`,{id:e.id,groupFolder:e.groupFolder});try{let n=new Date().toISOString(),r=this.calculateNextRun(e.scheduleType,e.scheduleValue),i=e.scheduleType===`once`?`completed`:e.status;await Ue({...e,lastRun:n,nextRun:r,status:i}),await this.callbacks.onTaskRun(e,t),lb.info(`Task completed`,{id:e.id})}catch(t){lb.error(`Task execution failed`,{id:e.id,error:t instanceof Error?t.message:String(t)})}}calculateNextRun(e,t){let n=new Date;switch(e){case`cron`:return this.getNextCronTime(t,n)?.toISOString()??null;case`interval`:{let e=parseInt(t,10);return isNaN(e)||e<=0?null:new Date(n.getTime()+e).toISOString()}case`once`:return new Date(t)>n?t:null;default:return null}}getNextCronTime(e,t){let n=e.trim().split(/\s+/);if(n.length!==5)return null;let[r,i,a,o,s]=n,c=new Date(t);c.setSeconds(0),c.setMilliseconds(0),c.setMinutes(c.getMinutes()+1);for(let e=0;e<527040;e++){if(this.cronMatches(c,r,i,a,o,s))return c;c.setMinutes(c.getMinutes()+1)}return null}cronMatches(e,t,n,r,i,a){return this.cronFieldMatches(e.getMinutes(),t)&&this.cronFieldMatches(e.getHours(),n)&&this.cronFieldMatches(e.getDate(),r)&&this.cronFieldMatches(e.getMonth()+1,i)&&this.cronFieldMatches(e.getDay(),a)}cronFieldMatches(e,t){if(t===`*`)return!0;if(t.includes(`,`))return t.split(`,`).some(t=>this.cronFieldMatches(e,t.trim()));if(t.includes(`-`)){let[n,r]=t.split(`-`).map(e=>parseInt(e,10));return e>=n&&e<=r}if(t.includes(`/`)){let[n,r]=t.split(`/`),i=parseInt(r,10);if(n===`*`)return e%i===0;let a=parseInt(n,10);return e>=a&&(e-a)%i===0}return parseInt(t,10)===e}},db=n(`lick-manager`),fb=class{webhooks=new Map;crontasks=new Map;cronInterval=null;eventHandler=null;async init(){await Ae();let e=await Be();for(let t of e)this.webhooks.set(t.id,t);db.info(`Loaded webhooks`,{count:this.webhooks.size});let t=await Re();for(let e of t)this.crontasks.set(e.id,e);db.info(`Loaded crontasks`,{count:this.crontasks.size}),this.cronInterval=setInterval(()=>this.runCronScheduler(),6e4),db.info(`Cron scheduler started`)}dispose(){this.cronInterval&&=(clearInterval(this.cronInterval),null)}setEventHandler(e){this.eventHandler=e}emitEvent(e){db.info(`External lick event`,{type:e.type,target:e.targetScoop}),this.eventHandler?.(e)}async createWebhook(e,t,n){let r=this.generateId(),i={id:r,name:e,createdAt:new Date().toISOString(),filter:n,scoop:t};return n&&this.compileFilter(n,!0),this.webhooks.set(r,i),await Te(i),db.info(`Webhook created`,{id:r,name:e,scoop:t}),i}async deleteWebhook(e){return this.webhooks.has(e)?(this.webhooks.delete(e),await Fe(e),db.info(`Webhook deleted`,{id:e}),!0):!1}listWebhooks(){return Array.from(this.webhooks.values())}getWebhook(e){return this.webhooks.get(e)}handleWebhookEvent(e,t,n){let r=this.webhooks.get(e);if(!r){db.warn(`Webhook not found`,{webhookId:e});return}let i={type:`webhook`,webhookId:e,webhookName:r.name,targetScoop:r.scoop,timestamp:new Date().toISOString(),headers:t,body:n};if(r.filter)try{let t=this.compileFilter(r.filter,!0)(i);if(t===!1){db.debug(`Webhook event dropped by filter`,{webhookId:e,name:r.name});return}typeof t==`object`&&t&&(i=t)}catch(t){db.error(`Webhook filter error`,{webhookId:e,error:t instanceof Error?t.message:String(t)})}db.info(`Webhook event received`,{webhookId:e,name:r.name,targetScoop:r.scoop}),this.eventHandler?.(i)}async createCronTask(e,t,n,r){let i=this.getNextCronTime(t,new Date);if(!i)throw Error(`Invalid cron expression`);r&&this.compileFilter(r,!1);let a=this.generateId(),o={id:a,name:e,cron:t,scoop:n,filter:r,nextRun:i.toISOString(),lastRun:null,status:`active`,createdAt:new Date().toISOString()};return this.crontasks.set(a,o),await ke(o),db.info(`Cron task created`,{id:a,name:e,cron:t,scoop:n}),o}async deleteCronTask(e){return this.crontasks.has(e)?(this.crontasks.delete(e),await Pe(e),db.info(`Cron task deleted`,{id:e}),!0):!1}listCronTasks(){return Array.from(this.crontasks.values())}getCronTask(e){return this.crontasks.get(e)}getLicksForScoop(e,t){let n=n=>n===e||n===t||`${n}-scoop`===t;return{webhooks:Array.from(this.webhooks.values()).filter(e=>n(e.scoop)),cronTasks:Array.from(this.crontasks.values()).filter(e=>n(e.scoop))}}async runCronScheduler(){let e=new Date;for(let t of this.crontasks.values()){if(t.status!==`active`||!t.nextRun||new Date(t.nextRun)>e)continue;let n={time:e.toISOString()};if(t.filter)try{let r=this.compileFilter(t.filter,!1)(null);if(r===!1){db.debug(`Cron task skipped by filter`,{id:t.id,name:t.name}),t.nextRun=this.getNextCronTime(t.cron,e)?.toISOString()??null,t.lastRun=e.toISOString(),await ke(t);continue}typeof r==`object`&&r&&(n=r)}catch(e){db.error(`Cron filter error`,{id:t.id,error:e instanceof Error?e.message:String(e)})}let r={type:`cron`,cronId:t.id,cronName:t.name,targetScoop:t.scoop,timestamp:e.toISOString(),body:n};db.info(`Cron task running`,{id:t.id,name:t.name}),this.eventHandler?.(r),t.nextRun=this.getNextCronTime(t.cron,e)?.toISOString()??null,t.lastRun=e.toISOString(),await ke(t)}}generateId(){let e=``;for(let t=0;t<12;t++)e+=`abcdefghijklmnopqrstuvwxyz0123456789`[Math.floor(Math.random()*36)];return e}compileFilter(e,t){try{return t?Function(`event`,`return (${e})(event);`):Function(`return (${e})();`)}catch(e){throw Error(`Invalid filter function: ${e instanceof Error?e.message:String(e)}`)}}getNextCronTime(e,t){let n=e.trim().split(/\s+/);if(n.length!==5)return null;let[r,i,a,o,s]=n,c=new Date(t);c.setSeconds(0),c.setMilliseconds(0),c.setMinutes(c.getMinutes()+1);let l=(e,t)=>{if(t===`*`)return!0;if(t.includes(`,`))return t.split(`,`).some(t=>l(e,t.trim()));if(t.includes(`-`)){let[n,r]=t.split(`-`).map(e=>parseInt(e,10));return e>=n&&e<=r}if(t.includes(`/`)){let[n,r]=t.split(`/`),i=parseInt(r,10);if(n===`*`)return e%i===0;let a=parseInt(n,10);return e>=a&&(e-a)%i===0}return parseInt(t,10)===e};for(let e=0;e<527040;e++){if(l(c.getMinutes(),r)&&l(c.getHours(),i)&&l(c.getDate(),a)&&l(c.getMonth()+1,o)&&l(c.getDay(),s))return c;c.setMinutes(c.getMinutes()+1)}return null}};function pb(e,t,n){if(t.length===0&&n.length===0)return null;let r=[];t.length>0&&r.push(`${t.length} active webhook${t.length>1?`s`:``}`),n.length>0&&r.push(`${n.length} active cron task${n.length>1?`s`:``}`);let i=[...t.map(e=>` webhook delete ${e.id}`),...n.map(e=>` crontask delete ${e.id}`)].join(`
|
|
13264
13264
|
`);return Error(`Cannot remove scoop '${e}': it has ${r.join(` and `)}. Unregister them first:\n${i}`)}var mb=null;function hb(){return mb||=new fb,mb}var Q=n(`orchestrator`),gb=120*1e3,_b=class{scoops=new Map;tabs=new Map;contexts=new Map;messageQueues=new Map;lastAgentTimestamp=new Map;container;callbacks;config;pollInterval=null;scheduler=null;globalMemoryCache=``;sharedFs=null;scoopResponseBuffer=new Map;lickManager=null;sessionStore=null;fsWatcher=null;idleTimers=new Map;droppedScoopCosts=[];scoopObservers=new Map;constructor(e,t,n={name:`sliccy`,triggerPattern:/^@sliccy\b/i}){this.container=e,this.callbacks=t,this.config=n}async init(){await Ae(),this.sharedFs=await L.create({dbName:`slicc-fs`}),this.sessionStore=new y,this.fsWatcher=new oe,this.sharedFs.setWatcher(this.fsWatcher),globalThis.__slicc_fs_watcher=this.fsWatcher,await this.ensureRootStructure();let e=await Ee();for(let t of Object.values(e)){t.isCone&&(t.trigger=void 0,t.requiresTrigger=!1,t.assistantLabel=t.assistantLabel||`sliccy`),this.migrateScoopConfig(t),this.scoops.set(t.jid,t),this.messageQueues.set(t.jid,[]);let e=await Ie(`lastAgentTs_${t.jid}`);e&&this.lastAgentTimestamp.set(t.jid,e)}await this.ensureGlobalMemory(),this.scheduler=new ub({onTaskRun:async(e,t)=>{Q.info(`Running scheduled task`,{taskId:e.id,scoop:t.name}),await this.sendPrompt(t.jid,`[SCHEDULED TASK]\n\n${e.prompt}`,`scheduler`,`Scheduled Task`)},getScoop:e=>{for(let t of this.scoops.values())if(t.folder===e)return t}}),this.scheduler.start(),Q.info(`Orchestrator initialized`,{scoopCount:this.scoops.size});for(let e of this.scoops.values())await this.createScoopTab(e.jid);qe(()=>this.getSessionCosts()),this.startMessageLoop()}migrateScoopConfig(e){if(e.isCone)return;let t=e.configSchemaVersion??0;t>=2||(t<1&&(e.config={...e.config,visiblePaths:e.config?.visiblePaths??[`/workspace/`]}),t<2&&(e.config={...e.config,writablePaths:e.config?.writablePaths??[`/scoops/${e.folder}/`,`/shared/`]}),e.configSchemaVersion=2)}async ensureRootStructure(){if(this.sharedFs)for(let e of[`/workspace`,`/shared`,`/scoops`,`/home`,`/tmp`,`/mnt`])try{await this.sharedFs.mkdir(e,{recursive:!0})}catch{}}async ensureGlobalMemory(){if(this.sharedFs){await tb(this.sharedFs);try{let e=await this.sharedFs.readFile(`/shared/CLAUDE.md`,{encoding:`utf-8`});this.globalMemoryCache=typeof e==`string`?e:new TextDecoder().decode(e)}catch{Q.warn(`Global memory file not found after creating defaults`)}}}async getGlobalMemory(){if(this.globalMemoryCache)return this.globalMemoryCache;if(this.sharedFs)try{let e=await this.sharedFs.readFile(`/shared/CLAUDE.md`,{encoding:`utf-8`});this.globalMemoryCache=typeof e==`string`?e:new TextDecoder().decode(e)}catch{}return this.globalMemoryCache}async setGlobalMemory(e){this.sharedFs&&(await this.sharedFs.writeFile(`/shared/CLAUDE.md`,e),this.globalMemoryCache=e,Q.info(`Global memory updated`))}getSharedFS(){return this.sharedFs}getSessionStore(){return this.sessionStore}setLickManager(e){this.lickManager=e,globalThis.__slicc_lick_handler=e=>{this.lickManager?.emitEvent(e)}}observeScoop(e,t){let n=this.scoopObservers.get(e);return n||(n=new Set,this.scoopObservers.set(e,n)),n.add(t),()=>{let n=this.scoopObservers.get(e);n&&(n.delete(t),n.size===0&&this.scoopObservers.delete(e))}}maybeNotifyConeOnScoopComplete(e){let t=this.scoops.get(e);if(!t||t.isCone)return;let n=this.scoopResponseBuffer.get(e);if(this.scoopResponseBuffer.delete(e),!n||t.notifyOnComplete===!1)return;let r=Array.from(this.scoops.values()).find(e=>e.isCone);if(!r)return;let i=n.length>2e4?n.slice(0,2e4)+`
|
|
13265
13265
|
... (truncated)`:n,a={id:`scoop-done-${e}-${Date.now()}`,chatJid:r.jid,senderId:t.folder,senderName:t.assistantLabel,content:`[@${t.assistantLabel} completed]:\n${i}`,timestamp:new Date().toISOString(),fromAssistant:!1,channel:`scoop-notify`};Q.info(`Routing scoop completion to cone`,{scoop:t.folder,responseLength:n.length}),this.handleMessage(a).catch(e=>{let n=e instanceof Error?e.message:String(e);Q.error(`Failed to route scoop completion to cone`,{scoop:t.folder,error:n}),this.callbacks.onError(r.jid,`Scoop ${t.folder} completed but notification failed: ${n}`)})}dispatchScoopEvent(e,t,...n){let r=this.scoopObservers.get(e);if(r)for(let i of r){let r=i[t];if(r)try{r(...n)}catch(n){Q.warn(`scoop observer threw`,{jid:e,event:t,error:n instanceof Error?n.message:String(n)})}}}async registerScoop(e){await Ve(e),this.scoops.set(e.jid,e),this.messageQueues.set(e.jid,[]),Q.info(`Scoop registered`,{jid:e.jid,name:e.name});try{await this.createScoopTab(e.jid)}catch(t){throw Q.error(`Scoop init failed`,{jid:e.jid,name:e.name,error:t instanceof Error?t.message:String(t)}),await this.destroyScoopTab(e.jid).catch(()=>{}),this.scoops.delete(e.jid),this.messageQueues.delete(e.jid),await je(e.jid).catch(t=>{Q.warn(`Failed to rollback scoop registration`,{jid:e.jid,name:e.name,error:t instanceof Error?t.message:String(t)})}),t}}async unregisterScoop(e){let t=this.scoops.get(e);if(t&&this.lickManager){let{webhooks:e,cronTasks:n}=this.lickManager.getLicksForScoop(t.name,t.folder),r=pb(t.folder,e,n);if(r)throw r}this.snapshotScoopCost(e),this.clearIdleTimer(e),await this.destroyScoopTab(e),this.sessionStore?.delete(e).catch(t=>{Q.warn(`Failed to delete agent session`,{jid:e,error:t instanceof Error?t.message:String(t)})}),await je(e),this.scoops.delete(e),this.messageQueues.delete(e),this.lastAgentTimestamp.delete(e),this.scoopResponseBuffer.delete(e),this.scoopObservers.delete(e),Q.info(`Scoop unregistered`,{jid:e})}getScoops(){return Array.from(this.scoops.values())}getScoop(e){return this.scoops.get(e)}async resetFilesystem(){for(let[e,t]of this.contexts.entries())this.clearIdleTimer(e),t.stop(),this.contexts.delete(e);this.sharedFs=await L.create({dbName:`slicc-fs`,wipe:!0}),this.fsWatcher&&this.sharedFs.setWatcher(this.fsWatcher),await this.ensureRootStructure(),await this.ensureGlobalMemory(),await eb(this.sharedFs).catch(e=>{Q.warn(`Failed to re-seed default skills`,{error:e instanceof Error?e.message:String(e)})}),this.droppedScoopCosts=[],Q.info(`Filesystem reset and defaults re-seeded`)}async clearAllMessages(){await ze(),this.sessionStore&&await this.sessionStore.clearAll().catch(e=>{Q.warn(`Failed to clear agent sessions`,{error:e instanceof Error?e.message:String(e)})});for(let e of this.contexts.values())e.clearMessages();this.lastAgentTimestamp.clear();for(let e of this.scoops.keys())this.messageQueues.set(e,[]);this.droppedScoopCosts=[],Q.info(`All messages cleared`)}async handleMessage(e){Q.info(`handleMessage`,{id:e.id,chatJid:e.chatJid,sender:e.senderName,channel:e.channel,contentPreview:e.content.slice(0,80)});let t=this.scoops.get(e.chatJid);Yv(t?.isCone?`cone`:t?.name??`unknown`,localStorage.getItem(`selected-model`)??`unknown`),await Ce(e),await this.routeToScoop(e)}async delegateToScoop(e,t,n){let r=this.scoops.get(e);if(!r)throw Error(`Scoop not found: ${e}`);let i={id:`delegate-${Date.now()}-${Math.random().toString(36).slice(2)}`,chatJid:e,senderId:`cone`,senderName:n,content:t,timestamp:new Date().toISOString(),fromAssistant:!0,channel:`delegation`};await Ce(i),this.callbacks.onIncomingMessage?.(e,i),Q.info(`Delegating to scoop`,{scoopJid:e,scoopName:r.name,promptLength:t.length}),this.sendPrompt(e,t,`cone`,n).catch(t=>{let n=t instanceof Error?t.message:String(t);Q.error(`Delegation failed`,{scoopJid:e,error:n}),this.callbacks.onError(e,`Delegation failed: ${n}`)})}async routeToScoop(e){let t=this.scoops.get(e.chatJid);if(!t){Q.info(`routeToScoop: unregistered target`,{chatJid:e.chatJid});return}let n=e.channel===`webhook`||e.channel===`cron`||e.channel===`fswatch`||e.channel===`sprinkle`;if(!t.isCone&&t.requiresTrigger&&t.trigger&&!n&&!e.content.includes(t.trigger)){Q.info(`routeToScoop: trigger not found in content`,{chatJid:e.chatJid,trigger:t.trigger,contentPreview:e.content.slice(0,80)});return}let r=this.messageQueues.get(e.chatJid)??[];r.push(e),this.messageQueues.set(e.chatJid,r);let i=this.tabs.get(e.chatJid);if(Q.debug(`routeToScoop: queued`,{chatJid:e.chatJid,scoopName:t.name,tabStatus:i?.status??`no-tab`,queueLength:r.length}),i?.status===`error`){Q.info(`routeToScoop: tab in error state, retrying init`,{chatJid:e.chatJid});try{await this.createScoopTab(e.chatJid),i=this.tabs.get(e.chatJid)}catch{Q.warn(`routeToScoop: retry init failed`,{chatJid:e.chatJid})}}i?.status===`ready`&&await this.processScoopQueue(e.chatJid)}async createScoopTab(e){let t=this.scoops.get(e);if(!t)throw Error(`Scoop not found: ${e}`);if(this.contexts.has(e))if(this.tabs.get(e)?.status===`error`)Q.info(`Re-creating context after error`,{jid:e}),this.contexts.get(e)?.dispose(),this.contexts.delete(e),this.tabs.delete(e);else{Q.debug(`Context already exists`,{jid:e});return}if(!this.sharedFs)throw Error(`Shared filesystem not initialized`);let n=`scoop-${t.folder}-${Date.now()}`,r=t.isCone?this.sharedFs:new ce(this.sharedFs,t.config?.writablePaths?[...t.config.writablePaths]:[],t.config?.visiblePaths?[...t.config.visiblePaths]:[]),i=new cb(t,{onResponse:(n,r)=>{if(this.scoops.has(e)&&(this.callbacks.onResponse(e,n,r),this.dispatchScoopEvent(e,`onResponse`,n,r),!t.isCone))if(r){let t=this.scoopResponseBuffer.get(e)??``;this.scoopResponseBuffer.set(e,t+n)}else this.scoopResponseBuffer.set(e,n)},onResponseDone:()=>{if(!this.scoops.has(e))return;let t=this.tabs.get(e);t&&(t.lastActivity=new Date().toISOString(),this.tabs.set(e,t)),this.callbacks.onResponseDone(e)},onError:t=>{if(!this.scoops.has(e))return;let n=this.tabs.get(e);n&&(n.status=`error`,n.error=t,this.tabs.set(e,n)),this.callbacks.onError(e,t),this.callbacks.onStatusChange(e,`error`),this.dispatchScoopEvent(e,`onError`,t),this.dispatchScoopEvent(e,`onStatusChange`,`error`)},onStatusChange:n=>{if(!this.scoops.has(e))return;let r=this.tabs.get(e);r&&(r.status=n,r.lastActivity=new Date().toISOString(),this.tabs.set(e,r)),this.callbacks.onStatusChange(e,n),this.dispatchScoopEvent(e,`onStatusChange`,n),n===`ready`&&!t.isCone&&this.maybeNotifyConeOnScoopComplete(e)},onToolStart:(t,n)=>{this.callbacks.onToolStart?.(e,t,n)},onToolEnd:(t,n,r)=>{this.callbacks.onToolEnd?.(e,t,n,r)},onToolUI:(t,n,r)=>{this.callbacks.onToolUI?.(e,t,n,r)},onToolUIDone:t=>{this.callbacks.onToolUIDone?.(e,t)},onSendMessage:(t,n)=>{let r=`${n?`[${n}] `:``}${t}`;this.callbacks.onSendMessage(e,r),this.dispatchScoopEvent(e,`onSendMessage`,t)},getScoops:()=>this.getScoops(),getScoopTabState:t.isCone?e=>this.tabs.get(e):void 0,onFeedScoop:t.isCone?(e,n)=>this.delegateToScoop(e,n,t.assistantLabel):void 0,onScoopScoop:t.isCone?async e=>{let t={...e,jid:`scoop_${e.folder}_${Date.now()}`};return await this.registerScoop(t),t}:void 0,onDropScoop:t.isCone?async e=>{await this.unregisterScoop(e)}:void 0,getGlobalMemory:()=>this.getGlobalMemory(),setGlobalMemory:t.isCone?e=>this.setGlobalMemory(e):void 0,getBrowserAPI:()=>this.callbacks.getBrowserAPI()},r,this.sessionStore??void 0,this.sharedFs??void 0);this.contexts.set(e,i),this.tabs.set(e,{jid:e,contextId:n,status:`initializing`,lastActivity:new Date().toISOString()}),await i.init();let a=this.tabs.get(e);a&&a.status===`initializing`&&(a.status=`ready`,this.tabs.set(e,a),this.callbacks.onStatusChange(e,`ready`),this.dispatchScoopEvent(e,`onStatusChange`,`ready`));let o=this.scoops.get(e);o&&!o.isCone&&this.startIdleTimer(e),Q.info(`Scoop context created`,{jid:e,contextId:n})}async destroyScoopTab(e){this.clearIdleTimer(e);let t=this.contexts.get(e);t&&(t.dispose(),this.contexts.delete(e),this.tabs.delete(e),this.scoopObservers.delete(e),Q.info(`Scoop context destroyed`,{jid:e}))}isProcessing(e){return this.tabs.get(e)?.status===`processing`}getScoopContext(e){return this.contexts.get(e)}async clearQueuedMessages(e){let t=this.messageQueues.get(e);if(t&&t.length>0){for(let e of t)await Le(e.id);this.messageQueues.set(e,[])}}async deleteQueuedMessage(e,t){let n=this.messageQueues.get(e);if(n){let e=n.findIndex(e=>e.id===t);e!==-1&&n.splice(e,1)}await Le(t)}async getMessagesForScoop(e){return De(e)}async waitForTabReady(e,t=1e4){let n=Date.now();for(;Date.now()-n<t;){let t=this.tabs.get(e);if(!t)return!1;if(t.status===`ready`||t.status===`processing`)return!0;if(t.status===`error`)return!1;await new Promise(e=>setTimeout(e,100))}return Q.warn(`Timed out waiting for tab to become ready`,{jid:e}),!1}async sendPrompt(e,t,n,r){let i=this.contexts.get(e);i||=(await this.createScoopTab(e),this.contexts.get(e));let a=this.tabs.get(e);if(a?.status===`initializing`){if(Q.debug(`Context initializing, waiting to send message`,{jid:e}),!await this.waitForTabReady(e)){Q.error(`Context did not become ready in time, dropping prompt`,{jid:e});return}i=this.contexts.get(e),a=this.tabs.get(e)}if(!i){Q.error(`Context not found after creation`,{jid:e});return}this.clearIdleTimer(e),this.scoopResponseBuffer.delete(e),a&&(a.status=`processing`,a.lastActivity=new Date().toISOString(),this.tabs.set(e,a),this.callbacks.onStatusChange(e,`processing`),this.dispatchScoopEvent(e,`onStatusChange`,`processing`)),Q.debug(`Prompt sent to scoop`,{jid:e,textLength:t.length}),await i.prompt(t)}async processScoopQueue(e){let t=this.messageQueues.get(e);if(!t||t.length===0){Q.debug(`processScoopQueue: empty queue`,{jid:e});return}let n=this.tabs.get(e);if(n?.status!==`ready`){Q.debug(`processScoopQueue: tab not ready`,{jid:e,status:n?.status??`no-tab`});return}let r=this.scoops.get(e),i=r?.assistantLabel??e,a=this.lastAgentTimestamp.get(e)??``,o=await Oe(e,a,i);if(Q.debug(`processScoopQueue: DB query`,{jid:e,scoopName:r?.name,excludeName:i,since:a,dbMessageCount:o.length,queueLength:t.length}),o.length===0){Q.debug(`processScoopQueue: no messages from DB, clearing queue`,{jid:e}),this.messageQueues.set(e,[]);return}let s=o.map(e=>`[${new Date(e.timestamp).toLocaleString(`en-US`,{month:`short`,day:`numeric`,hour:`numeric`,minute:`2-digit`,hour12:!0})}] ${e.senderName}: ${e.content}`).join(`
|
|
13266
|
-
`);this.messageQueues.set(e,[]);let c=o[o.length-1];this.lastAgentTimestamp.set(e,c.timestamp),await He(`lastAgentTs_${e}`,c.timestamp),await this.sendPrompt(e,s,c.senderId,c.senderName)}startMessageLoop(){this.pollInterval||=window.setInterval(()=>{for(let e of this.scoops.keys())this.tabs.get(e)?.status===`ready`&&this.processScoopQueue(e).catch(t=>{let n=t instanceof Error?t.message:String(t);Q.error(`Message queue processing failed`,{jid:e,error:n}),this.callbacks.onError(e,`Queue processing failed: ${n}`)})},2e3)}stopMessageLoop(){this.pollInterval&&=(clearInterval(this.pollInterval),null)}updateModel(){for(let e of this.contexts.values())e.updateModel();Q.info(`Model updated on all active contexts`,{contextCount:this.contexts.size})}async reloadAllSkills(){let e=[];for(let[t,n]of this.contexts){let r=this.tabs.get(t);(r?.status===`ready`||r?.status===`processing`)&&e.push(n.reloadSkills().catch(e=>{Q.warn(`Failed to reload skills for scoop`,{jid:t,error:e instanceof Error?e.message:String(e)})}))}await Promise.all(e),Q.info(`Skills reloaded across all contexts`,{count:e.length})}stopScoop(e){let t=this.contexts.get(e);t&&t.stop()}buildScoopCost(e,t){let n=t.getAgentMessages().filter(e=>e.role===`assistant`);if(n.length===0)return null;let r={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},i=new Map;for(let e of n)r.input+=e.usage.input,r.output+=e.usage.output,r.cacheRead+=e.usage.cacheRead,r.cacheWrite+=e.usage.cacheWrite,r.totalTokens+=e.usage.totalTokens,r.cost.input+=e.usage.cost.input,r.cost.output+=e.usage.cost.output,r.cost.cacheRead+=e.usage.cost.cacheRead,r.cost.cacheWrite+=e.usage.cost.cacheWrite,r.cost.total+=e.usage.cost.total,i.set(e.model,(i.get(e.model)??0)+1);let a=``,o=0;for(let[e,t]of i)t>o&&(a=e,o=t);let s=n.map(e=>e.timestamp).sort((e,t)=>e-t),c=s[0],l=s[s.length-1],u=900*1e3,d=l-c,f=Math.max(1,Math.ceil(d/u))*u;return{name:e.assistantLabel,type:e.isCone?`cone`:`scoop`,model:a,usage:r,turns:n.length,firstActivity:c,lastActivity:l,activeTimeMs:f}}snapshotScoopCost(e){let t=this.scoops.get(e),n=this.contexts.get(e);if(!t||!n)return;let r=this.buildScoopCost(t,n);r&&this.droppedScoopCosts.push(r)}getSessionCosts(){let e=[];for(let t of this.scoops.values()){let n=this.contexts.get(t.jid);if(!n)continue;let r=this.buildScoopCost(t,n);r&&e.push(r)}return e.push(...this.droppedScoopCosts),e}startIdleTimer(e){if(this.clearIdleTimer(e),this.tabs.get(e)?.status===`processing`)return;let t=setTimeout(()=>{this.idleTimers.delete(e);let t=this.scoops.get(e);if(!t||t.isCone||this.tabs.get(e)?.status!==`ready`)return;let n=Array.from(this.scoops.values()).find(e=>e.isCone);if(!n)return;let r={id:`scoop-idle-${e}-${Date.now()}`,chatJid:n.jid,senderId:t.folder,senderName:t.assistantLabel,content:`[@${t.assistantLabel} idle]: Scoop "${t.name}" has been ready for 2 minutes without receiving any work. This is expected if the scoop is waiting for webhooks or cron tasks. If you intended to delegate work, use feed_scoop to send a prompt.`,timestamp:new Date().toISOString(),fromAssistant:!1,channel:`scoop-idle`};Q.info(`Scoop idle timeout`,{jid:e,scoop:t.folder}),this.handleMessage(r).catch(t=>{let n=t instanceof Error?t.message:String(t);Q.error(`Failed to send idle notification`,{jid:e,error:n})})},gb);this.idleTimers.set(e,t)}clearIdleTimer(e){let t=this.idleTimers.get(e);t&&(clearTimeout(t),this.idleTimers.delete(e))}async shutdown(){this.stopMessageLoop();for(let e of this.idleTimers.keys())this.clearIdleTimer(e);this.scheduler?.stop(),this.scheduler=null;for(let e of this.contexts.keys())await this.destroyScoopTab(e);Q.info(`Orchestrator shutdown`)}};n(`heartbeat`);var vb=n(`tray-follower`);function yb(e){let t=new URL(e);return t.searchParams.set(`json`,`true`),t.toString()}async function bb(e){let t=yb(e.joinUrl),n=await Db(await(e.fetchImpl??fetch)(t,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({controllerId:e.controllerId,runtime:e.runtime})}));return vb.info(`Follower tray attach response`,{trayId:n.trayId,action:n.result.action,code:n.result.code,participantCount:n.participantCount}),xb(n)}function xb(e){let t={trayId:e.trayId,controllerId:e.controllerId,participantCount:e.participantCount,leader:e.leader,action:e.result.action,code:e.result.code,iceServers:e.iceServers};return e.result.action===`wait`?{...t,retryAfterMs:e.result.retryAfterMs}:e.result.action===`signal`?{...t,bootstrap:e.result.bootstrap}:e.result.action===`fail`?{...t,error:e.result.error}:t}async function Sb(e){return Eb(await Ob(e,{action:`poll`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,cursor:e.cursor}))}async function Cb(e){return Eb(await Ob(e,{action:`answer`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,answer:e.answer}))}async function wb(e){return Eb(await Ob(e,{action:`ice-candidate`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,candidate:e.candidate}))}async function Tb(e){return Eb(await Ob(e,{action:`retry`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,runtime:e.runtime}))}function Eb(e){return{trayId:e.trayId,controllerId:e.controllerId,participantCount:e.participantCount,leader:e.leader,bootstrap:e.bootstrap,events:e.events}}async function Db(e){let t=null,n=null;try{t=await e.text(),n=JSON.parse(t)}catch{}if(!kb(n)){let n=t?t.slice(0,200):`(empty)`;throw vb.warn(`Tray follower attach returned an invalid response`,{status:e.status,body:n}),Error(`Tray follower attach returned an invalid response (${e.status}): ${n}`)}return n}async function Ob(e,t){let n=yb(e.joinUrl),r=await(e.fetchImpl??fetch)(n,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),i=await r.json().catch(()=>null);if(!Ab(i))throw Error(`Tray follower bootstrap returned an invalid response (${r.status})`);return i}function kb(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.trayId!=`string`||typeof t.controllerId!=`string`||t.role!==`follower`||typeof t.participantCount!=`number`)return!1;let n=t.result;if(!n||typeof n!=`object`)return!1;let r=n;return r.action===`wait`?(r.code===`LEADER_NOT_ELECTED`||r.code===`LEADER_NOT_CONNECTED`)&&typeof r.retryAfterMs==`number`:r.action===`signal`?r.code===`LEADER_CONNECTED`&&jb(r.bootstrap):r.action===`fail`?(r.code===`INVALID_JOIN_CAPABILITY`||r.code===`TRAY_EXPIRED`)&&typeof r.error==`string`:!1}function Ab(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.trayId==`string`&&typeof t.controllerId==`string`&&t.role===`follower`&&typeof t.participantCount==`number`&&jb(t.bootstrap)&&Array.isArray(t.events)}function jb(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.controllerId==`string`&&typeof t.bootstrapId==`string`&&typeof t.attempt==`number`&&typeof t.state==`string`&&typeof t.expiresAt==`string`&&typeof t.cursor==`number`&&typeof t.maxRetries==`number`&&typeof t.retriesRemaining==`number`}var Mb=n(`agent-bridge`),Nb=`__slicc_agent`,Pb=`agent-spawn-request`;function Fb(e,t,n=null,r={}){let i=r.generateName??Vb,a=r.generateUid??Rb,o=r.resolveModel??Ub;function s(){for(let t=0;t<8;t++){let t=i(),n=`agent_${Hb(t)}`;if(!e.getScoops().some(e=>e.jid===n))return t}return a()}function c(t){if(t===void 0)return null;let n=e.getScoops().find(e=>e.jid===t);if(!n)return null;let r=n.config?.modelId;return r&&r.length>0?r:null}async function l(r){let i=r.modelId;if(i!==void 0&&(i===``||o(i)===null))return{finalText:`agent: unknown model: ${i}`,exitCode:1};let a=i??c(r.parentJid)??``,l=s(),u=`agent-${l}`,d=`agent_${Hb(l)}`,f=`/scoops/${u}`,p=Wb(r.cwd),m={visiblePaths:Gb(r),writablePaths:Kb([p,`/shared/`,`${f}/`,`/tmp/`]),allowedCommands:r.allowedCommands};a&&(m.modelId=a);let h={jid:d,name:u,folder:u,isCone:!1,type:`scoop`,requiresTrigger:!1,assistantLabel:u,addedAt:new Date().toISOString(),config:m,configSchemaVersion:2,notifyOnComplete:!1},g=[],_=``,v=null,y=e.observeScoop(d,{onSendMessage:e=>{g.push(e)},onResponse:(e,t)=>{t?_+=e:_=e},onError:e=>{v===null&&(v=e)}});try{try{await e.registerScoop(h)}catch(e){return{finalText:v??qb(e),exitCode:1}}return await e.sendPrompt(d,r.prompt,`agent`,`agent`),v===null?{finalText:g.length>0?g[g.length-1]:_,exitCode:0}:{finalText:v,exitCode:1}}catch(e){return{finalText:v??qb(e),exitCode:1}}finally{y();try{await e.unregisterScoop(d)}catch(e){Mb.warn(`unregisterScoop failed`,{jid:d,error:qb(e)})}try{await t.rm(f,{recursive:!0})}catch(e){Jb(e,`ENOENT`)||Mb.warn(`scratch folder cleanup failed`,{folder:u,error:qb(e)})}if(n)try{await n.delete(d)}catch(e){Mb.warn(`sessionStore.delete failed`,{jid:d,error:qb(e)})}}}return{spawn:l}}function Ib(e,t,n=null,r={}){let i=Fb(e,t,n,r);return globalThis[Nb]=i,Mb.info(`agent bridge published on globalThis.__slicc_agent`),i}function Lb(){let e={spawn(e){return new Promise((t,n)=>{let r=globalThis.chrome?.runtime;if(!r||typeof r.sendMessage!=`function`){n(Error(`agent: chrome.runtime.sendMessage not available`));return}let i=e=>{let i=r.lastError;if(i){n(Error(i.message??`chrome.runtime error`));return}if(e==null){n(Error(`agent: empty response from offscreen bridge`));return}let a=e;if(!a.ok){n(Error(a.error??`agent: offscreen bridge error`));return}if(!a.result){n(Error(`agent: offscreen bridge returned no result`));return}t(a.result)};try{r.sendMessage({source:`panel`,payload:{type:Pb,options:e}},i)}catch(e){n(e instanceof Error?e:Error(String(e)))}})}};return globalThis[Nb]=e,Mb.info(`agent bridge proxy published on globalThis.__slicc_agent`),e}function Rb(){let e=globalThis;return typeof e.crypto?.randomUUID==`function`?e.crypto.randomUUID().replace(/-/g,``).slice(0,12):`${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}var zb=`amber.bouncy.breezy.bubbly.cheeky.chilly.cozy.dapper.dreamy.eager.exuberant.fluffy.frosty.gentle.giddy.glossy.jolly.lucky.mellow.merry.nimble.plucky.quirky.salty.sleepy.snappy.sparkly.spiffy.sunny.sweet.toasty.velvety.whimsy.zesty`.split(`.`),Bb=`blueberry.butterscotch.caramel.cherry.chocolate.cinnamon.coconut.coffee.cookies.custard.espresso.fudge.gelato.hazelnut.honeycomb.lavender.lemon.mango.maple.marzipan.matcha.mint.mocha.neapolitan.nougat.peach.pecan.pistachio.praline.raspberry.sherbet.sorbet.stracciatella.strawberry.tiramisu.toffee.vanilla`.split(`.`);function Vb(){return`${zb[Math.floor(Math.random()*zb.length)]}-${Bb[Math.floor(Math.random()*Bb.length)]}`}function Hb(e){return e.replace(/-/g,`_`)}function Ub(e){try{let t=j();for(let n of t)if(n.models.some(t=>t.id===e))return e;return null}catch{return null}}function Wb(e){let t=R(e);return t.endsWith(`/`)?t:`${t}/`}function Gb(e){if(e.visiblePaths!==void 0)return e.visiblePaths.map(Wb);let t=[`/workspace/`];return e.invokingCwd&&e.invokingCwd.length>0&&t.push(Wb(e.invokingCwd)),Kb(t)}function Kb(e){let t=new Set,n=[];for(let r of e)t.has(r)||(t.add(r),n.push(r));return n}function qb(e){return e instanceof Error?e.message:String(e)}function Jb(e,t){if(typeof e!=`object`||!e)return!1;let n=e.code;return typeof n==`string`&&n===t}var Yb=n(`tray-webrtc`),Xb=`tray-control`,Zb=250,Qb=class{peerConnectionFactory;dataChannelLabel;peers=new Map;iceServers;constructor(e){this.options=e,this.iceServers=e.iceServers,this.peerConnectionFactory=e.peerConnectionFactory??(()=>tx(this.iceServers)),this.dataChannelLabel=e.dataChannelLabel??Xb}setIceServers(e){this.iceServers=e}async handleControlMessage(e){e.type===`follower.join_requested`?(e.iceServers&&!this.iceServers&&(this.iceServers=e.iceServers),await this.handleJoinRequested(e)):e.type===`bootstrap.answer`?await this.peers.get(e.bootstrapId)?.peer.setRemoteDescription(e.answer):e.type===`bootstrap.ice_candidate`&&await this.peers.get(e.bootstrapId)?.peer.addIceCandidate(e.candidate)}getPeers(){return Array.from(this.peers.values()).map(({state:e})=>({...e}))}getChannel(e){return this.peers.get(e)?.channel??null}stop(){for(let e of this.peers.values())e.peer.close();this.peers.clear()}async handleJoinRequested(e){this.closeControllerPeers(e.controllerId);let t=this.peerConnectionFactory(),n={controllerId:e.controllerId,bootstrapId:e.bootstrapId,attempt:e.attempt,state:`connecting`,connectedAt:null,runtime:e.runtime},r=t.createDataChannel(this.dataChannelLabel);this.peers.set(e.bootstrapId,{state:n,peer:t,channel:r}),t.addEventListener(`icecandidate`,({candidate:t})=>{let n=rx(t);n&&this.options.sendControlMessage({type:`bootstrap.ice_candidate`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,candidate:n})}),t.addEventListener(`connectionstatechange`,()=>{let n=this.peers.get(e.bootstrapId);n&&(n.state.state===`connected`?(t.connectionState===`disconnected`||t.connectionState===`failed`)&&(Yb.warn(`Leader peer connection state changed post-connect`,{bootstrapId:e.bootstrapId,state:t.connectionState}),this.options.onPeerDisconnected?.(e.bootstrapId,`Peer connection ${t.connectionState}`)):t.connectionState===`failed`&&this.failPeer(e,`Leader peer connection failed before the data channel opened`))}),r.addEventListener(`open`,()=>{let t=this.peers.get(e.bootstrapId);!t||t.state.state===`connected`||(t.state.state=`connected`,t.state.connectedAt=new Date().toISOString(),this.options.onPeerConnected?.({...t.state},t.channel))}),r.addEventListener(`close`,()=>{let t=this.peers.get(e.bootstrapId);t&&(t.state.state===`connected`?(Yb.warn(`Leader data channel closed post-connect`,{bootstrapId:e.bootstrapId}),this.options.onPeerDisconnected?.(e.bootstrapId,`Data channel closed`)):this.failPeer(e,`Leader data channel closed before opening`))}),r.addEventListener(`error`,()=>{let t=this.peers.get(e.bootstrapId);t&&(t.state.state===`connected`?(Yb.warn(`Leader data channel error post-connect`,{bootstrapId:e.bootstrapId}),this.options.onPeerDisconnected?.(e.bootstrapId,`Data channel error`)):this.failPeer(e,`Leader data channel failed before opening`))});try{let n=await t.createOffer();await t.setLocalDescription(n),this.options.sendControlMessage({type:`bootstrap.offer`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,offer:nx(t.localDescription??n,`offer`)})}catch(t){this.failPeer(e,t instanceof Error?t.message:String(t))}}closeControllerPeers(e){for(let[t,n]of this.peers.entries())n.state.controllerId===e&&(n.peer.close(),this.peers.delete(t))}failPeer(e,t){let n=this.peers.get(e.bootstrapId);if(n){n.peer.close(),this.peers.delete(e.bootstrapId);try{this.options.sendControlMessage({type:`bootstrap.failed`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,code:`WEBRTC_BOOTSTRAP_FAILED`,message:t,retryable:!0,retryAfterMs:1e3})}catch(e){Yb.warn(`Failed to report tray bootstrap failure`,{error:e instanceof Error?e.message:String(e)})}}}},$b=class{fetchImpl;peerConnectionFactory;controllerIdFactory;sleep;pollIntervalMs;iceServers;activePeer=null;stopped=!1;constructor(e){this.options=e,this.fetchImpl=e.fetchImpl??fetch,this.iceServers=e.iceServers,this.peerConnectionFactory=e.peerConnectionFactory??(()=>tx(this.iceServers)),this.controllerIdFactory=e.controllerIdFactory??(()=>crypto.randomUUID()),this.sleep=e.sleep??(e=>new Promise(t=>setTimeout(t,e))),this.pollIntervalMs=e.pollIntervalMs??Zb}async start(){this.stopped=!1;let e=this.controllerIdFactory(),t=Date.now();p({state:`connecting`,joinUrl:this.options.joinUrl,trayId:null,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:0,lastAttachCode:null,connectingSince:t,lastError:null}),Yb.info(`Follower tray join starting`,{joinUrl:this.options.joinUrl});let n=0;for(;;){ix(this.stopped),n++;let t;try{t=await bb({joinUrl:this.options.joinUrl,controllerId:e,runtime:this.options.runtime,fetchImpl:this.fetchImpl})}catch(e){let t=e instanceof Error?e.message:String(e);throw p({...h(),attachAttempts:n,lastError:t}),e}if(p({...h(),attachAttempts:n,lastAttachCode:t.code}),t.action===`wait`){let e=t.retryAfterMs??1e3;Yb.info(`Follower tray attach waiting`,{attempt:n,code:t.code,retryAfterMs:e}),n%10==0&&Yb.warn(`Follower tray attach still waiting after ${n} attempts`,{attempt:n,code:t.code,retryAfterMs:e}),await this.sleep(e);continue}if(t.action===`fail`||!t.bootstrap){let e=t.error??`Tray follower attach failed (${t.code})`;throw p({state:`error`,joinUrl:this.options.joinUrl,trayId:null,error:e,lastPingTime:null,reconnectAttempts:0,attachAttempts:n,lastAttachCode:t.code,connectingSince:null,lastError:e}),Yb.warn(`Follower tray attach failed`,{error:e}),Error(e)}t.iceServers&&(this.iceServers=t.iceServers);try{let r=await this.completeBootstrap(t.trayId,e,t.bootstrap);return p({state:`connected`,joinUrl:this.options.joinUrl,trayId:r.trayId,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:n,lastAttachCode:t.code,connectingSince:null,lastError:null}),Yb.info(`Follower tray connected`,{trayId:r.trayId,controllerId:e}),r}catch(e){let r=e instanceof Error?e.message:String(e);throw p({state:`error`,joinUrl:this.options.joinUrl,trayId:t.trayId,error:r,lastPingTime:null,reconnectAttempts:0,attachAttempts:n,lastAttachCode:t.code,connectingSince:null,lastError:r}),Yb.warn(`Follower tray bootstrap failed`,{error:r}),e}}}stop(){this.stopped=!0,this.activePeer?.peer.close(),this.activePeer?.channel?.close(),this.activePeer=null,p({state:`inactive`,joinUrl:null,trayId:null,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:0,lastAttachCode:null,connectingSince:null,lastError:null})}async completeBootstrap(e,t,n){let r=n,i=0;for(this.activePeer=this.createFollowerPeer(t,r.bootstrapId);;){if(ix(this.stopped),this.activePeer.open&&this.activePeer.channel)return{trayId:e,controllerId:t,bootstrapId:r.bootstrapId,channel:this.activePeer.channel};if(this.activePeer.openError)throw Error(this.activePeer.openError);let n=await Sb({joinUrl:this.options.joinUrl,controllerId:t,bootstrapId:r.bootstrapId,cursor:i,fetchImpl:this.fetchImpl});r=n.bootstrap,i=r.cursor;try{for(let e of n.events)if(e.type===`bootstrap.offer`){await this.activePeer.peer.setRemoteDescription(e.offer);let n=await this.activePeer.peer.createAnswer();await this.activePeer.peer.setLocalDescription(n),await Cb({joinUrl:this.options.joinUrl,controllerId:t,bootstrapId:r.bootstrapId,answer:nx(this.activePeer.peer.localDescription??n,`answer`),fetchImpl:this.fetchImpl})}else if(e.type===`bootstrap.ice_candidate`)await this.activePeer.peer.addIceCandidate(e.candidate);else if(e.type===`bootstrap.failed`)throw Error(e.failure.message)}catch(e){if(r.failure?.retryable&&r.retriesRemaining>0){r=(await Tb({joinUrl:this.options.joinUrl,controllerId:t,bootstrapId:r.bootstrapId,runtime:this.options.runtime,fetchImpl:this.fetchImpl})).bootstrap,i=0,this.activePeer.peer.close(),this.activePeer=this.createFollowerPeer(t,r.bootstrapId);continue}throw e}this.activePeer.open||await this.sleep(this.pollIntervalMs)}}createFollowerPeer(e,t){let n=this.peerConnectionFactory(),r={peer:n,channel:null,open:!1,openError:null};return n.addEventListener(`connectionstatechange`,()=>{r.open&&(n.connectionState===`disconnected`||n.connectionState===`failed`)&&(Yb.warn(`Follower peer connection state changed post-connect`,{bootstrapId:t,state:n.connectionState}),this.options.onDisconnected?.(`Peer connection ${n.connectionState}`))}),n.addEventListener(`datachannel`,({channel:e})=>{r.channel=e,e.addEventListener(`open`,()=>{r.open=!0}),e.addEventListener(`close`,()=>{r.open?(Yb.warn(`Follower data channel closed post-connect`,{bootstrapId:t}),this.options.onDisconnected?.(`Data channel closed`)):r.openError=`Follower data channel closed before opening`}),e.addEventListener(`error`,()=>{r.open?(Yb.warn(`Follower data channel error post-connect`,{bootstrapId:t}),this.options.onDisconnected?.(`Data channel error`)):r.openError=`Follower data channel failed before opening`})}),n.addEventListener(`icecandidate`,({candidate:n})=>{let r=rx(n);r&&wb({joinUrl:this.options.joinUrl,controllerId:e,bootstrapId:t,candidate:r,fetchImpl:this.fetchImpl}).catch(e=>{Yb.warn(`Failed to send follower ICE candidate`,{error:e instanceof Error?e.message:String(e)})})}),r}};function ex(e,t){let n=t.baseDelayMs??1e3,r=t.backoffMultiplier??2,i=t.maxDelayMs??3e4,a=t.maxAttempts??10,o=t.sleep??e.sleep??(e=>new Promise(t=>setTimeout(t,e))),s=!1,c=!1,l=null,u={cancel(){s=!0,c=!1,l?.stop(),l=null},get reconnecting(){return c}},d=()=>{let t=new $b({...e,sleep:o,onDisconnected:e=>{s||(Yb.warn(`Follower disconnected, starting reconnect loop`,{reason:e}),f(e))}});return l=t,{manager:t,connectionPromise:t.start()}},f=async u=>{if(s||c)return;c=!0,l?.stop(),l=null;let f=0,m=n,g=u??`Unknown disconnect`;for(;!s&&f<a&&(f++,t.onReconnecting?.(f),p({...h(),state:`reconnecting`,error:null,reconnectAttempts:f}),Yb.info(`Reconnect attempt`,{attempt:f,delay:m}),await o(m),!s);){let n=null;try{let r=d();n=r.manager;let i=await r.connectionPromise;if(s){n.stop();break}c=!1,p({...h(),state:`connected`,joinUrl:e.joinUrl,trayId:i.trayId,error:null,lastPingTime:null,reconnectAttempts:0,connectingSince:null,lastError:null}),Yb.info(`Reconnect successful`,{attempt:f,trayId:i.trayId}),t.onConnected(i);return}catch(e){g=e instanceof Error?e.message:String(e),Yb.warn(`Reconnect attempt failed`,{attempt:f,error:g}),n?.stop(),l=null}m=Math.min(m*r,i)}s||(c=!1,p({...h(),state:`error`,error:`Reconnect failed after ${f} attempts: ${g}`,reconnectAttempts:f}),Yb.warn(`Reconnect gave up`,{attempts:f,lastError:g}),t.onGaveUp?.(g))},{connectionPromise:m}=d();return m.then(e=>{s||t.onConnected(e)}).catch(e=>{s||Yb.warn(`Initial follower connection failed`,{error:e instanceof Error?e.message:String(e)})}),u}function tx(e){if(typeof RTCPeerConnection>`u`)throw Error(`RTCPeerConnection is not available in this runtime`);let t=e?.length?{iceServers:e}:void 0;return new RTCPeerConnection(t)}function nx(e,t){if(!e||e.type!==t||typeof e.sdp!=`string`)throw Error(`Expected a local ${t} description before signaling`);return{type:e.type,sdp:e.sdp}}function rx(e){if(!e||typeof e!=`object`)return null;let t=e;return typeof t.candidate==`string`?{candidate:t.candidate,sdpMid:typeof t.sdpMid==`string`?t.sdpMid:null,sdpMLineIndex:typeof t.sdpMLineIndex==`number`?t.sdpMLineIndex:null,usernameFragment:typeof t.usernameFragment==`string`?t.usernameFragment:null}:null}function ix(e){if(e)throw Error(`Tray follower stopped before WebRTC bootstrap completed`)}var ax=64*1024;async function ox(e,t){try{switch(t.op){case`readFile`:return await sx(e,t.path,t.encoding);case`writeFile`:return[await cx(e,t.path,t.content,t.encoding)];case`stat`:return[await lx(e,t.path)];case`readDir`:return[await ux(e,t.path)];case`mkdir`:return[await dx(e,t.path,t.recursive)];case`rm`:return[await fx(e,t.path,t.recursive)];case`exists`:return[await px(e,t.path)];case`walk`:return[await mx(e,t.path)];default:return[{ok:!1,error:`Unknown fs operation: ${t.op}`}]}}catch(e){return[gx(e)]}}async function sx(e,t,n){return(n??`utf-8`)===`utf-8`?hx(await e.readFile(t,{encoding:`utf-8`}),`utf-8`):hx(_x(await e.readFile(t,{encoding:`binary`})),`base64`)}async function cx(e,t,n,r){if(r===`base64`){let r=vx(n);await e.writeFile(t,r)}else await e.writeFile(t,n);return{ok:!0,data:{type:`void`}}}async function lx(e,t){return{ok:!0,data:{type:`stat`,stat:await e.stat(t)}}}async function ux(e,t){return{ok:!0,data:{type:`dirEntries`,entries:await e.readDir(t)}}}async function dx(e,t,n){return await e.mkdir(t,{recursive:n}),{ok:!0,data:{type:`void`}}}async function fx(e,t,n){return await e.rm(t,{recursive:n}),{ok:!0,data:{type:`void`}}}async function px(e,t){return{ok:!0,data:{type:`exists`,exists:await e.exists(t)}}}async function mx(e,t){let n=[];for await(let r of e.walk(t))n.push(r);return{ok:!0,data:{type:`paths`,paths:n}}}function hx(e,t){if(e.length<=ax)return[{ok:!0,data:{type:`file`,content:e,encoding:t}}];let n=Math.ceil(e.length/ax),r=[];for(let i=0;i<n;i++){let a=i*ax,o=e.slice(a,a+ax);r.push({ok:!0,data:{type:`file`,content:o,encoding:t},chunkIndex:i,totalChunks:n})}return r}function gx(e){return e instanceof Error&&`code`in e?{ok:!1,error:e.message,code:e.code}:{ok:!1,error:e instanceof Error?e.message:String(e)}}function _x(e){let t=``;for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return btoa(t)}function vx(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var yx=class{runtimes=new Map;dirty=!1;setTargets(e,t){this.runtimes.set(e,t),this.dirty=!0}removeRuntime(e){this.runtimes.delete(e)&&(this.dirty=!0)}getEntries(){this.dirty=!1;let e=[];for(let[t,n]of this.runtimes)for(let r of n)e.push({targetId:`${t}:${r.targetId}`,localTargetId:r.targetId,runtimeId:t,title:r.title,url:r.url,isLocal:!1});return e}hasChanged(){return this.dirty}getRuntimeIds(){return[...this.runtimes.keys()]}},bx=n(`data-channel-keepalive`),xx=class{sendPing;onDead;intervalMs;maxMissed;timer=null;missedPongs=0;awaitingPong=!1;stopped=!1;constructor(e){this.sendPing=e.sendPing,this.onDead=e.onDead,this.intervalMs=e.intervalMs??1e4,this.maxMissed=e.maxMissed??3}start(){this.timer||this.stopped||(this.timer=setInterval(()=>this.tick(),this.intervalMs))}stop(){this.stopped=!0,this.timer&&=(clearInterval(this.timer),null)}receivePong(){this.awaitingPong=!1,this.missedPongs=0}receivePing(){this.missedPongs=0,this.awaitingPong=!1}get missed(){return this.missedPongs}tick(){if(!this.stopped){if(this.awaitingPong&&(this.missedPongs++,bx.debug(`Missed pong`,{missedPongs:this.missedPongs,maxMissed:this.maxMissed}),this.missedPongs>=this.maxMissed)){bx.warn(`Channel declared dead`,{missedPongs:this.missedPongs}),this.stop(),this.onDead();return}this.awaitingPong=!0,this.sendPing()}}},Sx=n(`tray-leader-sync`);function Cx(e){return e?e.includes(`standalone`)?`standalone`:e.includes(`extension`)?`extension`:e.includes(`electron`)?`electron`:`unknown`:`unknown`}var wx=class{followers=new Map;registry=new yx;runtimeToBootstrap=new Map;pendingCDPRoutes=new Map;cdpChunkBuffers=new Map;remoteTransports=new Map;pendingTabOpenRoutes=new Map;tabOpenResolvers=new Map;pendingFsRoutes=new Map;fsResolvers=new Map;constructor(e){this.options=e}addFollower(e,t,n){this.removeFollower(e);let r=ge(t),i=r.onMessage(t=>{this.handleFollowerMessage(e,t)}),a=new xx({sendPing:()=>r.send({type:`ping`}),onDead:()=>{Sx.warn(`Follower keepalive dead, removing follower`,{bootstrapId:e}),this.removeFollower(e),this.options.onFollowerDead?.(e)}});a.start(),this.followers.set(e,{bootstrapId:e,sync:r,unsubscribe:i,keepalive:a,runtime:n?.runtime,connectedAt:n?.connectedAt,lastActivity:Date.now(),floatType:Cx(n?.runtime)}),Sx.info(`Follower added to sync`,{bootstrapId:e,followerCount:this.followers.size}),this.sendSnapshotToFollower(e);let o=this.getConnectedEntries();o.length>0&&r.send({type:`targets.registry`,targets:o})}removeFollower(e){let t=this.followers.get(e);if(t){t.keepalive.stop(),t.unsubscribe(),t.sync.close(),this.followers.delete(e);for(let[t,n]of this.runtimeToBootstrap)if(n===e){this.cleanupRemoteTransports(t),this.registry.removeRuntime(t),this.runtimeToBootstrap.delete(t);break}this.registry.hasChanged()&&this.broadcastTargetRegistry(),Sx.info(`Follower removed from sync`,{bootstrapId:e,followerCount:this.followers.size})}}broadcastEvent(e){if(this.followers.size===0)return;let t={type:`agent_event`,event:e,scoopJid:this.options.getScoopJid()};for(let e of this.followers.values())e.sync.send(t)}broadcastUserMessage(e,t){if(this.followers.size===0)return;let n={type:`user_message_echo`,text:e,messageId:t,scoopJid:this.options.getScoopJid()};for(let e of this.followers.values())e.sync.send(n)}broadcastStatus(e){if(this.followers.size===0)return;let t={type:`status`,scoopStatus:e};for(let e of this.followers.values())e.sync.send(t)}sendSnapshotToFollower(e){let t=this.followers.get(e);if(!t)return;let n=this.options.getMessages(),r=this.options.getScoopJid();pe(t.sync,n,r),Sx.debug(`Snapshot sent to follower`,{bootstrapId:e,messageCount:n.length})}handleFollowerMessage(e,t){switch(t.type){case`user_message`:Sx.info(`Follower user message received`,{bootstrapId:e,messageId:t.messageId}),this.options.onFollowerMessage(t.text,t.messageId);break;case`abort`:Sx.info(`Follower abort received`,{bootstrapId:e}),this.options.onFollowerAbort();break;case`request_snapshot`:Sx.info(`Follower snapshot request received`,{bootstrapId:e}),this.sendSnapshotToFollower(e);break;case`targets.advertise`:Sx.info(`Follower targets advertised`,{bootstrapId:e,runtimeId:t.runtimeId,targetCount:t.targets.length});for(let e of[...this.remoteTransports.keys()]){let n=e.substring(0,e.indexOf(`:`));n!==`leader`&&!this.runtimeToBootstrap.has(n)&&n!==t.runtimeId&&(this.remoteTransports.get(e)?.disconnect(),this.remoteTransports.delete(e),Sx.debug(`Cleaned up orphaned remote transport on advertise`,{key:e}))}this.runtimeToBootstrap.set(t.runtimeId,e),this.registry.setTargets(t.runtimeId,t.targets),this.broadcastTargetRegistry();break;case`cdp.request`:{let{requestId:n,targetRuntimeId:r,localTargetId:i,method:a,params:o,sessionId:s}=t;r===`leader`?this.executeLocalCDP(n,i,a,o,s,e):this.forwardCDPRequest(n,r,i,a,o,s,e);break}case`cdp.response`:this.handleCDPResponse(t);break;case`cdp.event`:this.handleCDPEvent(e,t.method,t.params,t.sessionId);break;case`tab.open`:{let{requestId:n,targetRuntimeId:r,url:i}=t;r===`leader`?this.executeLocalTabOpen(n,i,e):this.forwardTabOpen(n,r,i,e);break}case`tab.opened`:this.handleTabOpenResponse(t.requestId,t.targetId);break;case`tab.open.error`:this.handleTabOpenError(t.requestId,t.error);break;case`fs.request`:{let{requestId:n,targetRuntimeId:r,request:i}=t;r===`leader`?this.executeLocalFs(n,i,e):this.forwardFsRequest(n,r,i,e);break}case`fs.response`:this.handleFsResponse(t.requestId,t.response);break;case`ping`:{let t=this.followers.get(e);t&&(t.keepalive.receivePing(),t.lastActivity=Date.now(),t.sync.send({type:`pong`}));break}case`pong`:{let t=this.followers.get(e);t&&(t.keepalive.receivePong(),t.lastActivity=Date.now());break}}}setLocalTargets(e){this.registry.setTargets(`leader`,e),this.registry.hasChanged()&&this.broadcastTargetRegistry()}broadcastTargetRegistry(){if(this.followers.size===0)return;let e={type:`targets.registry`,targets:this.getConnectedEntries()};for(let t of this.followers.values())t.sync.send(e)}getTargets(){return this.getConnectedEntries()}getConnectedEntries(){return this.registry.getEntries().filter(e=>{if(e.runtimeId===`leader`)return!0;let t=this.runtimeToBootstrap.get(e.runtimeId);return t?this.followers.has(t):!1})}createRemoteTransport(e,t){let n=new ve({sendCDPRequest:(n,r,i,a)=>{let o=this.runtimeToBootstrap.get(e),s=o?this.followers.get(o):void 0;if(!s){this.remoteTransports.get(`${e}:${t}`)?.handleResponse(n,void 0,`Target runtime "${e}" not connected`);return}this.pendingCDPRoutes.set(n,{requesterBootstrapId:`__leader__`,requestId:n}),s.sync.send({type:`cdp.request`,requestId:n,localTargetId:t,method:r,params:i,sessionId:a})}});return this.remoteTransports.set(`${e}:${t}`,n),n}removeRemoteTransport(e,t){let n=`${e}:${t}`,r=this.remoteTransports.get(n);r&&(r.disconnect(),this.remoteTransports.delete(n))}cleanupRemoteTransports(e){let t=`${e}:`;for(let e of[...this.remoteTransports.keys()])e.startsWith(t)&&(this.remoteTransports.get(e)?.disconnect(),this.remoteTransports.delete(e),Sx.debug(`Cleaned up stale remote transport`,{key:e}))}getConnectedFollowers(){return[...this.runtimeToBootstrap.entries()].map(([e,t])=>{let n=this.followers.get(t);return{runtimeId:e,runtime:n?.runtime,connectedAt:n?.connectedAt,lastActivity:n?.lastActivity,floatType:n?.floatType}})}getBestFollowerForTeleport(){let e=[];for(let[t,n]of this.runtimeToBootstrap){let r=this.followers.get(n);r&&e.push({runtimeId:t,bootstrapId:n,floatType:r.floatType,lastActivity:r.lastActivity})}if(e.length===0)return null;let t=e.filter(e=>e.floatType===`standalone`),n=t.length>0?t:e;return n.sort((e,t)=>t.lastActivity-e.lastActivity),n[0]}get hasFollowers(){return this.followers.size>0}stop(){for(let e of[...this.followers.keys()])this.removeFollower(e)}async executeLocalCDP(e,t,n,r,i,a){let o=this.followers.get(a);if(!o)return;let s=this.options.browserTransport;if(!s){o.sync.send({type:`cdp.response`,requestId:e,error:`Leader has no browser transport`});return}try{let t=await s.send(n,r,i);xe(o.sync,e,t)}catch(t){o.sync.send({type:`cdp.response`,requestId:e,error:t instanceof Error?t.message:String(t)})}}forwardCDPRequest(e,t,n,r,i,a,o){let s=this.runtimeToBootstrap.get(t),c=s?this.followers.get(s):void 0,l=this.followers.get(o);if(!c){l&&l.sync.send({type:`cdp.response`,requestId:e,error:`Target runtime "${t}" not connected`});return}this.pendingCDPRoutes.set(e,{requesterBootstrapId:o,requestId:e}),c.sync.send({type:`cdp.request`,requestId:e,localTargetId:n,method:r,params:i,sessionId:a})}handleCDPResponse(e){let{requestId:t,result:n,error:r,chunkData:i,chunkIndex:a,totalChunks:o}=e,s=this.pendingCDPRoutes.get(t);if(!s)return;let c=fe(this.cdpChunkBuffers,e);if(!c)return;if(this.pendingCDPRoutes.delete(t),s.requesterBootstrapId===`__leader__`){for(let e of this.remoteTransports.values())e.handleResponse(t,c.result,c.error);return}let l=this.followers.get(s.requesterBootstrapId);l&&xe(l.sync,t,c.result,c.error)}handleCDPEvent(e,t,n,r){let i;for(let[t,n]of this.runtimeToBootstrap)if(n===e){i=t;break}if(!i)return;let a=`${i}:`;for(let[e,r]of this.remoteTransports)e.startsWith(a)&&r.handleEvent(t,n)}openRemoteTab(e,t){let n=this.runtimeToBootstrap.get(e),r=n?this.followers.get(n):void 0;if(!r)return Promise.reject(Error(`Target runtime "${e}" not connected`));let i=`tab-open-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((e,n)=>{this.tabOpenResolvers.set(i,{resolve:e,reject:n}),this.pendingTabOpenRoutes.set(i,{requesterBootstrapId:`__leader__`,requestId:i}),r.sync.send({type:`tab.open`,requestId:i,url:t})})}async executeLocalTabOpen(e,t,n){let r=this.followers.get(n);if(!r)return;let i=this.options.browserTransport;if(!i){r.sync.send({type:`tab.open.error`,requestId:e,error:`Leader has no browser transport`});return}try{let n=(await i.send(`Target.createTarget`,{url:t,background:!0})).targetId;r.sync.send({type:`tab.opened`,requestId:e,targetId:`leader:${n}`})}catch(t){r.sync.send({type:`tab.open.error`,requestId:e,error:t instanceof Error?t.message:String(t)})}}forwardTabOpen(e,t,n,r){let i=this.runtimeToBootstrap.get(t),a=i?this.followers.get(i):void 0,o=this.followers.get(r);if(!a){o&&o.sync.send({type:`tab.open.error`,requestId:e,error:`Target runtime "${t}" not connected`});return}this.pendingTabOpenRoutes.set(e,{requesterBootstrapId:r,requestId:e}),a.sync.send({type:`tab.open`,requestId:e,url:n})}handleTabOpenResponse(e,t){let n=this.pendingTabOpenRoutes.get(e);if(!n)return;if(this.pendingTabOpenRoutes.delete(e),n.requesterBootstrapId===`__leader__`){let n=this.tabOpenResolvers.get(e);n&&(this.tabOpenResolvers.delete(e),n.resolve(t));return}let r=this.followers.get(n.requesterBootstrapId);r&&r.sync.send({type:`tab.opened`,requestId:e,targetId:t})}handleTabOpenError(e,t){let n=this.pendingTabOpenRoutes.get(e);if(!n)return;if(this.pendingTabOpenRoutes.delete(e),n.requesterBootstrapId===`__leader__`){let n=this.tabOpenResolvers.get(e);n&&(this.tabOpenResolvers.delete(e),n.reject(Error(t)));return}let r=this.followers.get(n.requesterBootstrapId);r&&r.sync.send({type:`tab.open.error`,requestId:e,error:t})}async executeLocalFs(e,t,n){let r=this.followers.get(n);if(!r)return;let i=this.options.vfs;if(!i){r.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:`Leader has no VFS`}});return}let a=await ox(i,t);for(let t of a)r.sync.send({type:`fs.response`,requestId:e,response:t})}forwardFsRequest(e,t,n,r){let i=this.runtimeToBootstrap.get(t),a=i?this.followers.get(i):void 0,o=this.followers.get(r);if(!a){o&&o.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:`Target runtime "${t}" not connected`}});return}this.pendingFsRoutes.set(e,{requesterBootstrapId:r,requestId:e,chunks:[],totalChunks:1}),a.sync.send({type:`fs.request`,requestId:e,request:n})}handleFsResponse(e,t){let n=this.pendingFsRoutes.get(e);if(!n){let n=this.fsResolvers.get(e);if(n){n.responses.push(t);let r=t.ok&&t.totalChunks||1;n.responses.length>=r&&(this.fsResolvers.delete(e),n.resolve(n.responses))}return}if(n.requesterBootstrapId===`__leader__`){let n=this.fsResolvers.get(e);if(n){n.responses.push(t);let r=t.ok&&t.totalChunks||1;n.responses.length>=r&&(this.fsResolvers.delete(e),this.pendingFsRoutes.delete(e),n.resolve(n.responses))}return}let r=this.followers.get(n.requesterBootstrapId);r&&r.sync.send({type:`fs.response`,requestId:e,response:t}),n.chunks.push(t),n.totalChunks=t.ok&&t.totalChunks||1,n.chunks.length>=n.totalChunks&&this.pendingFsRoutes.delete(e)}sendFsRequest(e,t){if(e===`leader`){let e=this.options.vfs;return e?ox(e,t):Promise.resolve([{ok:!1,error:`Leader has no VFS`}])}let n=this.runtimeToBootstrap.get(e),r=n?this.followers.get(n):void 0;if(!r)return Promise.resolve([{ok:!1,error:`Target runtime "${e}" not connected`}]);let i=`fs-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((e,n)=>{this.fsResolvers.set(i,{resolve:e,reject:n,responses:[]}),this.pendingFsRoutes.set(i,{requesterBootstrapId:`__leader__`,requestId:i,chunks:[],totalChunks:1}),r.sync.send({type:`fs.request`,requestId:i,request:t})})}},Tx=n(`tray-follower-sync`),Ex=class{sync;eventListeners=new Set;unsubscribe;keepalive;latestSnapshot=null;sentMessageIds=new Set;targetEntries=[];remoteTransports=new Map;cdpChunkBuffers=new Map;snapshotChunkBuffer=null;remoteCDPSessions=new Set;cdpEventCleanups=[];tabOpenResolvers=new Map;fsResolvers=new Map;constructor(e,t={}){this.options=t,this.sync=be(e),this.unsubscribe=this.sync.onMessage(e=>{this.handleLeaderMessage(e)}),this.keepalive=new xx({sendPing:()=>this.sync.send({type:`ping`}),onDead:()=>{Tx.warn(`Leader keepalive dead, cleaning up`),this.handleDisconnect(`Keepalive timeout — leader not responding`),this.options.onDead?.()}}),this.keepalive.start(),e.addEventListener(`close`,()=>{Tx.warn(`Data channel closed`),this.handleDisconnect(`Data channel closed`)}),e.addEventListener(`error`,()=>{Tx.warn(`Data channel error`),this.handleDisconnect(`Data channel error`)})}sendMessage(e,t){let n=t??`follower-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;this.sentMessageIds.add(n),this.sync.send({type:`user_message`,text:e,messageId:n}),Tx.info(`Sent user message to leader`,{messageId:n})}onEvent(e){return this.eventListeners.add(e),()=>this.eventListeners.delete(e)}stop(){this.sync.send({type:`abort`}),Tx.info(`Sent abort to leader`)}requestSnapshot(){this.sync.send({type:`request_snapshot`})}getLatestSnapshot(){return this.latestSnapshot}close(){this.keepalive.stop(),this.unsubscribe(),this.sync.close(),this.eventListeners.clear(),this.cleanupCDPEventForwarding(),Tx.info(`Follower sync closed`)}advertiseTargets(e,t){this.sync.send({type:`targets.advertise`,targets:e,runtimeId:t})}getTargets(){return this.targetEntries}disconnected=!1;handleDisconnect(e){this.disconnected||(this.disconnected=!0,p({...h(),state:`error`,error:e}),this.emitEvent({type:`error`,error:`Connection to leader lost: ${e}`}),this.keepalive.stop(),this.cleanupCDPEventForwarding(),this.unsubscribe(),this.sync.close(),this.options.onDisconnect?.(e))}handleLeaderMessage(e){switch(e.type){case`snapshot`:Tx.info(`Snapshot received from leader`,{messageCount:e.messages.length,scoopJid:e.scoopJid}),this.snapshotChunkBuffer=null,this.latestSnapshot={messages:e.messages,scoopJid:e.scoopJid},this.options.onSnapshot?.(e.messages,e.scoopJid);break;case`snapshot_chunk`:{let t=ye(this.snapshotChunkBuffer,e);this.snapshotChunkBuffer=t.buffer,t.result&&(Tx.info(`Chunked snapshot reassembled from leader`,{messageCount:t.result.messages.length,scoopJid:t.result.scoopJid}),this.latestSnapshot=t.result,this.options.onSnapshot?.(t.result.messages,t.result.scoopJid));break}case`agent_event`:this.emitEvent(e.event);break;case`user_message_echo`:if(this.sentMessageIds.has(e.messageId)){this.sentMessageIds.delete(e.messageId),Tx.debug(`Skipping own message echo`,{messageId:e.messageId});break}Tx.info(`User message echo received`,{messageId:e.messageId,scoopJid:e.scoopJid}),this.options.onUserMessage?.(e.text,e.messageId,e.scoopJid);break;case`status`:this.options.onStatus?.(e.scoopStatus);break;case`error`:Tx.warn(`Error from leader`,{error:e.error}),this.emitEvent({type:`error`,error:e.error});break;case`targets.registry`:Tx.info(`Target registry received from leader`,{targetCount:e.targets.length}),this.targetEntries=e.targets,this.options.onTargetsUpdated?.(this.targetEntries);break;case`cdp.request`:{let{requestId:t,localTargetId:n,method:r,params:i,sessionId:a}=e;this.executeLocalCDP(t,n,r,i,a);break}case`cdp.response`:this.routeCDPResponse(e);break;case`cdp.event`:for(let t of this.remoteTransports.values())t.handleEvent(e.method,e.params);break;case`tab.open`:this.executeLocalTabOpen(e.requestId,e.url);break;case`tab.opened`:{let t=this.tabOpenResolvers.get(e.requestId);t&&(this.tabOpenResolvers.delete(e.requestId),t.resolve(e.targetId));break}case`tab.open.error`:{let t=this.tabOpenResolvers.get(e.requestId);t&&(this.tabOpenResolvers.delete(e.requestId),t.reject(Error(e.error)));break}case`fs.request`:this.executeLocalFs(e.requestId,e.request);break;case`fs.response`:this.routeFsResponse(e.requestId,e.response);break;case`ping`:this.keepalive.receivePing(),this.sync.send({type:`pong`});break;case`pong`:this.keepalive.receivePong(),u(Date.now());break}}emitEvent(e){for(let t of this.eventListeners)try{t(e)}catch(t){Tx.error(`Listener error`,{eventType:e.type,error:t instanceof Error?t.message:String(t)})}}createRemoteTransport(e,t){let n=new ve({sendCDPRequest:(n,r,i,a)=>{this.sync.send({type:`cdp.request`,requestId:n,targetRuntimeId:e,localTargetId:t,method:r,params:i,sessionId:a})}});return this.remoteTransports.set(`${e}:${t}`,n),n}removeRemoteTransport(e,t){let n=`${e}:${t}`,r=this.remoteTransports.get(n);r&&(r.disconnect(),this.remoteTransports.delete(n))}openRemoteTab(e,t){let n=`tab-open-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((r,i)=>{this.tabOpenResolvers.set(n,{resolve:r,reject:i}),this.sync.send({type:`tab.open`,requestId:n,targetRuntimeId:e,url:t})})}async executeLocalTabOpen(e,t){let n=this.options.browserTransport;if(!n){this.sync.send({type:`tab.open.error`,requestId:e,error:`Follower has no browser transport`});return}try{let r=(await n.send(`Target.createTarget`,{url:t,background:!0})).targetId;this.sync.send({type:`tab.opened`,requestId:e,targetId:r}),this.options.onTargetsChanged?.()}catch(t){this.sync.send({type:`tab.open.error`,requestId:e,error:t instanceof Error?t.message:String(t)})}}async executeLocalCDP(e,t,n,r,i){let a=this.options.browserTransport;if(!a){this.sync.send({type:`cdp.response`,requestId:e,error:`Follower has no browser transport`});return}try{let t=await a.send(n,r,i);if(n===`Target.attachToTarget`&&t.sessionId){let e=t.sessionId;this.remoteCDPSessions.add(e),this.setupCDPEventForwarding(a,e),Tx.debug(`Tracking remote CDP session`,{remoteSessionId:e})}n===`Target.detachFromTarget`&&i&&this.remoteCDPSessions.has(i)&&(this.remoteCDPSessions.delete(i),Tx.debug(`Removed remote CDP session on detach`,{sessionId:i})),xe(this.sync,e,t)}catch(t){this.sync.send({type:`cdp.response`,requestId:e,error:t instanceof Error?t.message:String(t)})}}setupCDPEventForwarding(e,t){for(let n of[`Page.frameNavigated`,`Page.loadEventFired`,`Page.domContentEventFired`,`Network.responseReceived`,`Network.loadingFinished`,`Network.requestWillBeSent`]){let r=e=>{if(e.sessionId!==t||!this.remoteCDPSessions.has(t))return;let{sessionId:r,...i}=e;this.sync.send({type:`cdp.event`,method:n,params:i,sessionId:t})};e.on(n,r),this.cdpEventCleanups.push(()=>e.off(n,r))}}cleanupCDPEventForwarding(){for(let e of this.cdpEventCleanups)e();this.cdpEventCleanups.length=0,this.remoteCDPSessions.clear()}routeCDPResponse(e){let t=fe(this.cdpChunkBuffers,e);if(t)for(let n of this.remoteTransports.values())n.handleResponse(e.requestId,t.result,t.error)}async executeLocalFs(e,t){let n=this.options.vfs;if(!n){this.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:`Follower has no VFS`}});return}let r=await ox(n,t);for(let t of r)this.sync.send({type:`fs.response`,requestId:e,response:t})}routeFsResponse(e,t){let n=this.fsResolvers.get(e);if(!n)return;n.responses.push(t);let r=t.ok&&t.totalChunks||1;n.responses.length>=r&&(this.fsResolvers.delete(e),n.resolve(n.responses))}sendFsRequest(e,t){let n=`fs-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((r,i)=>{this.fsResolvers.set(n,{resolve:r,reject:i,responses:[]}),this.sync.send({type:`fs.request`,requestId:n,targetRuntimeId:e,request:t})})}};function Dx(e,t){if(t)return`extension`;try{return Ax(new URL(e))?`electron-overlay`:`standalone`}catch{return`standalone`}}function Ox(e,t){return e===`electron-overlay`||e===`standalone`&&t}function kx(e){try{let t=new URL(e).searchParams.get(`tab`);return t&&Yi(t)?t:qi}catch{return qi}}function Ax(e){return e.pathname===`/electron`||e.pathname===`/electron/`||e.searchParams.get(`runtime`)===`electron-overlay`}function jx(e){let t=new URL(e);return`${t.protocol===`https:`?`wss:`:`ws:`}//${t.host}/licks-ws`}function Mx(e,t){return`${new URL(e).origin}/webhooks/${t}`}function Nx(e,t){return`${e.replace(/\/+$/,``)}/${t.replace(/^\/+/,``)}`}function Px(e){return typeof e==`object`&&!!e&&`type`in e&&e.type===`slicc-electron-overlay:set-tab`}var Fx=[`/shared/sprinkles`];async function Ix(e){let t=new Map;for(let n of Fx)await e.exists(n)&&await Lx(e,n,t);return await Lx(e,`/`,t),t}async function Lx(e,t,n){for await(let r of e.walk(t)){if(!r.endsWith(`.shtml`))continue;let t=Rx(r);if(!n.has(t)){let i;try{i=await e.readFile(r,{encoding:`utf-8`})??``}catch{i=``}n.set(t,{name:t,path:r,title:zx(i,t),autoOpen:Bx(i)})}}}function Rx(e){let t=e.split(`/`).pop()??e;return t.endsWith(`.shtml`)?t.slice(0,-6):t}function zx(e,t){let n=e.match(/data-sprinkle-title=["']([^"']+)["']/);if(n)return n[1];let r=e.match(/<title>([^<]+)<\/title>/i);return r?r[1].trim():t}function Bx(e){return/data-sprinkle-autoopen\b/.test(e)}var Vx=n(`sprinkle-manager`),Hx=`slicc-open-sprinkles`,Ux=class{fs;bridge;callbacks;availableSprinkles=new Map;watcherUnsub;openSprinkles=new Map;constructor(e,t,n,r){this.fs=e,this.bridge=new Ph(e,t,e=>this.close(e),r),this.callbacks=n}async restoreOpenSprinkles(){try{let e=localStorage.getItem(Hx);if(!e){for(let e of this.availableSprinkles.values())if(e.autoOpen)try{await this.open(e.name)}catch{Vx.warn(`Failed to auto-open sprinkle`,{name:e.name})}return}let t=JSON.parse(e);for(let e of t)try{await this.open(e)}catch{Vx.warn(`Failed to restore sprinkle`,{name:e})}}catch{}}persistOpenSprinkles(){try{localStorage.setItem(Hx,JSON.stringify([...this.openSprinkles.keys()]))}catch{}}async openNewAutoOpenSprinkles(){await this.refresh();for(let e of this.availableSprinkles.values())if(e.autoOpen&&!this.openSprinkles.has(e.name))try{await this.open(e.name),Vx.info(`Auto-opened new sprinkle after install`,{name:e.name})}catch{Vx.warn(`Failed to auto-open new sprinkle`,{name:e.name})}}async refresh(){this.availableSprinkles=await Ix(this.fs),Vx.info(`Discovered sprinkles`,{count:this.availableSprinkles.size})}async open(e,t){if(this.openSprinkles.has(e)){Vx.info(`Sprinkle already open`,{name:e});return}let n=this.availableSprinkles.get(e);if(n||=(await this.refresh(),this.availableSprinkles.get(e)),!n)throw Error(`Sprinkle not found: ${e}`);let r=await this.fs.readFile(n.path,{encoding:`utf-8`}),i=document.createElement(`div`);i.className=`sprinkle-panel`,i.style.cssText=`width: 100%; height: 100%; display: flex; flex-direction: column; overflow: hidden;`,i.dataset.sprinkle=e,this.openSprinkles.set(e,{renderer:null,container:i}),this.callbacks.addSprinkle(e,n.title,i,t);let a=new si(i,this.bridge.createAPI(e));await a.render(r,e),this.openSprinkles.get(e).renderer=a,this.persistOpenSprinkles(),Zv(e),Vx.info(`Sprinkle opened`,{name:e,title:n.title})}close(e){let t=this.openSprinkles.get(e);t&&(t.renderer?.dispose(),t.container.remove(),this.bridge.removeSprinkle(e),this.openSprinkles.delete(e),this.callbacks.removeSprinkle(e),this.persistOpenSprinkles(),Vx.info(`Sprinkle closed`,{name:e}))}available(){return Array.from(this.availableSprinkles.values())}opened(){return Array.from(this.openSprinkles.keys())}setupWatcher(e){this.watcherUnsub=e.watch(`/workspace`,e=>e.endsWith(`.shtml`),()=>void this.refresh())}dispose(){this.watcherUnsub?.()}sendToSprinkle(e,t){let n=this.openSprinkles.get(e);if(!n){Vx.warn(`Cannot send to closed sprinkle`,{name:e});return}this.bridge.pushUpdate(e,t),n.renderer.pushUpdate(t)}},$=n(`main`),Wx=`slicc-pending-mount`,Gx=`pendingMount`;async function Kx(e){let t=await new Promise((e,t)=>{let n=indexedDB.open(Wx,1);n.onupgradeneeded=()=>n.result.createObjectStore(`handles`),n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)}),n=t.transaction(`handles`,`readwrite`);n.objectStore(`handles`).put(e,Gx),await new Promise(e=>n.oncomplete=()=>e()),t.close()}async function qx(e){let t;try{t=await new Promise((e,t)=>{let n=indexedDB.open(Wx,1);n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}catch{return}let n=t.transaction(`handles`,`readwrite`),r=await new Promise(e=>{let t=n.objectStore(`handles`).get(Gx);t.onsuccess=()=>e(t.result),t.onerror=()=>e(void 0)});if(r){n.objectStore(`handles`).delete(Gx),await new Promise(e=>n.oncomplete=()=>e());let t=`/mnt/${r.name}`;await e.mount(t,r),$.info(`Mounted folder from welcome onboarding`,{name:r.name,path:t})}t.close()}function Jx(){let e=document.createElement(`div`);e.className=`skill-drop-overlay`;let t=document.createElement(`div`);t.className=`skill-drop-overlay__card`;let n=document.createElement(`div`);n.className=`skill-drop-overlay__title`,t.appendChild(n);let r=document.createElement(`div`);return r.className=`skill-drop-overlay__desc`,t.appendChild(r),e.appendChild(t),document.body.appendChild(e),{show(t,i){n.textContent=t,r.textContent=i,e.classList.add(`skill-drop-overlay--visible`)},hide(){e.classList.remove(`skill-drop-overlay--visible`)}}}function Yx(){let e=document.createElement(`div`);return e.className=`skill-drop-toast-container`,document.body.appendChild(e),(t,n)=>{let r=document.createElement(`div`);r.className=`skill-drop-toast skill-drop-toast--${n}`,r.textContent=t,e.appendChild(r),requestAnimationFrame(()=>r.classList.add(`skill-drop-toast--visible`)),window.setTimeout(()=>{r.classList.remove(`skill-drop-toast--visible`),window.setTimeout(()=>r.remove(),180)},4200)}}function Xx(e,t,n){let r=Jx(),i=0,a=!1,o=()=>{i=0,a||r.hide()};window.addEventListener(`dragenter`,e=>{_a(e.dataTransfer)&&(e.preventDefault(),i+=1,a||r.show(`Drop .skill to install`,`Unpack into /workspace/skills/{name}.`))}),window.addEventListener(`dragover`,e=>{_a(e.dataTransfer)&&(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=`copy`),a||r.show(`Drop .skill to install`,`Unpack into /workspace/skills/{name}.`))}),window.addEventListener(`dragleave`,()=>{i!==0&&(i=Math.max(0,i-1),i===0&&!a&&r.hide())}),window.addEventListener(`dragend`,o),window.addEventListener(`blur`,o),window.addEventListener(`drop`,async s=>{let c=va(s.dataTransfer);if(!c){o();return}if(s.preventDefault(),i=0,a){r.hide(),t(`Another .skill installation is already in progress.`,`error`);return}a=!0,r.show(`Installing skill…`,c.name);try{let r=await ue(e,c);await n(),t(`Installed "${r.skillName}" to ${r.destinationPath} (${r.fileCount} files). Run "skill install ${r.skillName}" to apply it.`,`success`)}catch(e){t(`Failed to install dropped skill: ${e instanceof Error?e.message:String(e)}`,`error`)}finally{a=!1,r.hide()}})}async function Zx(e){let{OffscreenClient:t}=await r(async()=>{let{OffscreenClient:e}=await import(`./offscreen-client-vFDPYD-S.js`);return{OffscreenClient:e}},__vite__mapDeps([25,17])),{VirtualFS:n}=await r(async()=>{let{VirtualFS:e}=await import(`./fs-DUWoGzSN.js`).then(e=>e.t);return{VirtualFS:e}},__vite__mapDeps([22,4,17,23])),{publishAgentBridgeProxy:i}=await r(async()=>{let{publishAgentBridgeProxy:e}=await import(`./agent-bridge-B7tR-xiU.js`);return{publishAgentBridgeProxy:e}},[]),a=new ea(e,!0);window.__slicc_debug_tabs=e=>a.setDebugTabs(e),await a.panels.chat.initSession(`session-cone`),i();let o=null,s=await n.create({dbName:`slicc-fs`});a.panels.fileBrowser.setFs(s),$.info(`File browser wired to shared VFS (local IndexedDB)`);let l=new BroadcastChannel(`preview-vfs`);l.onmessage=e=>{if(e.data?.type!==`preview-vfs-read`)return;let{id:t,path:n,asText:r}=e.data;(async()=>{try{let e=r?`utf-8`:`binary`,i=await s.readFile(n,{encoding:e});l.postMessage({type:`preview-vfs-response`,id:t,content:i})}catch(e){let r=e instanceof Error?e.message:String(e);r.includes(`ENOENT`)||$.error(`Preview VFS read failed`,{path:n,error:r}),l.postMessage({type:`preview-vfs-response`,id:t,error:r})}})()},Xx(s,Yx(),async()=>{await a.panels.fileBrowser.refresh()});try{let{WasmShell:e}=await r(async()=>{let{WasmShell:e}=await import(`./shell-1lwva6GM.js`);return{WasmShell:e}},[]),{PanelCdpProxy:t,BrowserAPI:n}=await r(async()=>{let{PanelCdpProxy:e,BrowserAPI:t}=await import(`./cdp-CtEFOd-O.js`).then(e=>e.t);return{PanelCdpProxy:e,BrowserAPI:t}},__vite__mapDeps([26,4,1,17])),{fetchSecretEnvVars:i}=await r(async()=>{let{fetchSecretEnvVars:e}=await import(`./secret-env-Zk-sdab2.js`);return{fetchSecretEnvVars:e}},[]),o=new t;await o.connect();let c=new n(o),l=await i(),u=new e({fs:s,browserAPI:c,env:Object.keys(l).length>0?l:void 0});await a.panels.terminal.mountShell(u),$.info(`Terminal mounted with shared VFS and BrowserAPI (CDP proxy)`)}catch(e){$.warn(`Failed to mount shell to terminal`,e)}{let{registerSessionCostsProvider:e}=await r(async()=>{let{registerSessionCostsProvider:e}=await import(`./cost-command-CGzKvuNW.js`).then(e=>e.t);return{registerSessionCostsProvider:e}},__vite__mapDeps([27,4]));e(()=>new Promise(e=>{chrome.runtime.sendMessage({source:`panel`,payload:{type:`get-session-costs`}},t=>{if(chrome.runtime.lastError||!t?.ok){e([]);return}e(t.costs??[])})}))}let u,d=new Set,f=async e=>{o=e,u.selectedScoopJid=e.jid,a.panels.memory.setSelectedScoop(e.jid),a.setScoopSwitcherSelected?.(e.jid),a.panels.scoops.setSelectedJid(e.jid);let t=e.isCone?`session-cone`:`session-${e.folder}`,n=e.isCone?void 0:e.name;await a.panels.chat.switchToContext(t,!e.isCone,n),u.isProcessing(e.jid)&&a.panels.chat.setProcessing(!0)};u=new t({onStatusChange:(e,t)=>{a.panels.scoops.updateScoopStatus(e,t),a.updateScoopSwitcherStatus?.(e,t),o?.jid===e&&(a.setAgentProcessing(t===`processing`),t===`processing`?a.panels.chat.setProcessing(!0):t===`ready`&&a.panels.chat.setProcessing(!1))},onScoopCreated:e=>{a.panels.scoops.refreshScoops(),a.refreshScoopSwitcher?.(),o||(o=e,u.selectedScoopJid=e.jid,a.panels.memory.setSelectedScoop(e.jid))},onScoopListUpdate:()=>{let e=new Set(u.getScoops().map(e=>e.folder));for(let t of d)e.has(t)||a.panels.chat.deleteSessionById(`session-${t}`);if(d=e,a.panels.scoops.refreshScoops(),a.refreshScoopSwitcher?.(),!o){let e=u.getScoops().find(e=>e.isCone);e&&(o=e,u.selectedScoopJid=e.jid,a.panels.memory.setSelectedScoop(e.jid))}},onIncomingMessage:(e,t)=>{if(o?.jid===e){let e=t.channel===`delegation`?`**[Instructions from sliccy]**\n\n${t.content}`:t.content;a.panels.chat.addUserMessage(e)}},onReady:async()=>{try{$.info(`Offscreen engine ready, scoop count:`,u.getScoops().length),window.localStorage.getItem(`slicc.trayJoinUrl`)&&chrome.runtime.sendMessage({source:`panel`,payload:{type:`refresh-tray-runtime`}}).catch(()=>{});let e=o??u.getScoops().find(e=>e.isCone)??u.getScoops()[0];e&&(o=e,u.selectedScoopJid=e.jid,await f(e))}catch(e){$.error(`Failed to initialize on ready`,{error:e instanceof Error?e.message:String(e)})}}}),u.setLocalFS(s);let p=u.createAgentHandle();a.panels.chat.setAgent(p),a.panels.scoops.setOrchestrator(u),a.panels.memory.setOrchestrator(u),a.setScoopSwitcherOrchestrator?.(u),a.onScoopSelect=f,a.onModelChange=e=>{localStorage.setItem(`selected-model`,e),u.updateModel()},a.onClearChat=async()=>{let e=u.getScoops();for(let t of e){let e=t.isCone?`session-cone`:`session-${t.folder}`;await a.panels.chat.deleteSessionById(e)}u.clearAllMessages()},a.onClearFilesystem=async()=>{u.clearFilesystem()},a.panels.chat.onInlineSprinkleLick=(e,t)=>{u.sendSprinkleLick(`inline`,{action:e,data:t})};let m=new Ux(s,async e=>{if(e.type===`sprinkle`){if(e.sprinkleName===`welcome`){let t=e.body,n=t?.action;(n===`onboarding-complete`||n===`shortcut-migrate`)&&s.writeFile(`/shared/.welcomed`,`1`).catch(e=>$.warn(`Failed to persist welcome completion marker`,e)),n===`shortcut-migrate`&&m.close(`welcome`),n===`onboarding-complete`&&t?.data?.mountWorkspace&&qx(s).catch(e=>$.warn(`Failed to mount workspace from onboarding`,e))}if(e.sprinkleName===`welcome`&&e.body?.action===`request-mount`){try{let e=window;if(!e.showDirectoryPicker)throw Error(`showDirectoryPicker not supported`);let t=await e.showDirectoryPicker({mode:`readwrite`});await Kx(t),m.sendToSprinkle(`welcome`,{action:`mount-complete`,dirName:t.name})}catch(e){e.name!==`AbortError`&&$.warn(`Mount picker failed`,e),m.sendToSprinkle(`welcome`,{action:`mount-cancelled`})}return}u.sendSprinkleLick(e.sprinkleName,e.body,e.targetScoop)}},{addSprinkle:(e,t,n,r)=>a.addSprinkle(e,t,n,r),removeSprinkle:e=>a.removeSprinkle(e)},()=>{let e=u.getScoops().find(e=>e.isCone);e&&u.stopScoop(e.jid)});if(window.__slicc_sprinkleManager=m,window.__slicc_reloadSkills=()=>(chrome.runtime.sendMessage({source:`panel`,payload:{type:`reload-skills`}}),Promise.resolve()),u.setSprinkleOpHandler(e=>{let{id:t,op:n,name:r,data:i}=e;console.log(`[main-ext] sprinkle-op handler called`,{id:t,op:n,name:r}),(async()=>{try{let e;switch(n){case`list`:await m.refresh(),e=m.available();break;case`opened`:e=m.opened();break;case`refresh`:await m.refresh(),e=m.available().length;break;case`open`:await m.open(r),e=!0;break;case`close`:m.close(r),e=!0;break;case`send`:m.sendToSprinkle(r,i),e=!0;break;case`openNewAutoOpen`:await m.openNewAutoOpenSprinkles(),e=!0;break}console.log(`[main-ext] sprinkle-op response sending`,{id:t,op:n,result:typeof e}),chrome.runtime.sendMessage({source:`panel`,payload:{type:`sprinkle-op-response`,id:t,result:e}}).catch(()=>{})}catch(e){chrome.runtime.sendMessage({source:`panel`,payload:{type:`sprinkle-op-response`,id:t,error:e instanceof Error?e.message:String(e)}}).catch(()=>{})}})()}),await m.refresh(),a.onSprinkleClose=e=>m.close(e),a.getAvailableSprinkles=()=>{let e=new Set(m.opened());return m.available().filter(t=>!e.has(t.name)).map(e=>({name:e.name,title:e.title}))},a.onOpenSprinkle=(e,t)=>m.open(e,t),a.updateAddButtons(),await m.restoreOpenSprinkles(),!await s.exists(`/shared/.welcomed`)&&localStorage.getItem(`slicc-welcomed`)&&(await s.writeFile(`/shared/.welcomed`,`1`).catch(()=>{}),localStorage.removeItem(`slicc-welcomed`)),!await s.exists(`/shared/.welcomed`)&&!c(window.localStorage)&&m.available().some(e=>e.name===`welcome`))try{await m.open(`welcome`)}catch(e){$.warn(`Failed to open welcome sprinkle`,e)}$.info(`SprinkleManager initialized (extension mode)`),u.requestState(),$.info(`Extension UI connected to offscreen agent engine`),Jv().catch(()=>{})}function Qx(){if(typeof chrome<`u`&&chrome?.runtime?.id)return;let e=new Blob([`
|
|
13266
|
+
`);this.messageQueues.set(e,[]);let c=o[o.length-1];this.lastAgentTimestamp.set(e,c.timestamp),await He(`lastAgentTs_${e}`,c.timestamp),await this.sendPrompt(e,s,c.senderId,c.senderName)}startMessageLoop(){this.pollInterval||=window.setInterval(()=>{for(let e of this.scoops.keys())this.tabs.get(e)?.status===`ready`&&this.processScoopQueue(e).catch(t=>{let n=t instanceof Error?t.message:String(t);Q.error(`Message queue processing failed`,{jid:e,error:n}),this.callbacks.onError(e,`Queue processing failed: ${n}`)})},2e3)}stopMessageLoop(){this.pollInterval&&=(clearInterval(this.pollInterval),null)}updateModel(){for(let e of this.contexts.values())e.updateModel();Q.info(`Model updated on all active contexts`,{contextCount:this.contexts.size})}async reloadAllSkills(){let e=[];for(let[t,n]of this.contexts){let r=this.tabs.get(t);(r?.status===`ready`||r?.status===`processing`)&&e.push(n.reloadSkills().catch(e=>{Q.warn(`Failed to reload skills for scoop`,{jid:t,error:e instanceof Error?e.message:String(e)})}))}await Promise.all(e),Q.info(`Skills reloaded across all contexts`,{count:e.length})}stopScoop(e){let t=this.contexts.get(e);t&&t.stop()}buildScoopCost(e,t){let n=t.getAgentMessages().filter(e=>e.role===`assistant`);if(n.length===0)return null;let r={input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},i=new Map;for(let e of n)r.input+=e.usage.input,r.output+=e.usage.output,r.cacheRead+=e.usage.cacheRead,r.cacheWrite+=e.usage.cacheWrite,r.totalTokens+=e.usage.totalTokens,r.cost.input+=e.usage.cost.input,r.cost.output+=e.usage.cost.output,r.cost.cacheRead+=e.usage.cost.cacheRead,r.cost.cacheWrite+=e.usage.cost.cacheWrite,r.cost.total+=e.usage.cost.total,i.set(e.model,(i.get(e.model)??0)+1);let a=``,o=0;for(let[e,t]of i)t>o&&(a=e,o=t);let s=n.map(e=>e.timestamp).sort((e,t)=>e-t),c=s[0],l=s[s.length-1],u=900*1e3,d=l-c,f=Math.max(1,Math.ceil(d/u))*u;return{name:e.assistantLabel,type:e.isCone?`cone`:`scoop`,model:a,usage:r,turns:n.length,firstActivity:c,lastActivity:l,activeTimeMs:f}}snapshotScoopCost(e){let t=this.scoops.get(e),n=this.contexts.get(e);if(!t||!n)return;let r=this.buildScoopCost(t,n);r&&this.droppedScoopCosts.push(r)}getSessionCosts(){let e=[];for(let t of this.scoops.values()){let n=this.contexts.get(t.jid);if(!n)continue;let r=this.buildScoopCost(t,n);r&&e.push(r)}return e.push(...this.droppedScoopCosts),e}startIdleTimer(e){if(this.clearIdleTimer(e),this.tabs.get(e)?.status===`processing`)return;let t=setTimeout(()=>{this.idleTimers.delete(e);let t=this.scoops.get(e);if(!t||t.isCone||this.tabs.get(e)?.status!==`ready`)return;let n=Array.from(this.scoops.values()).find(e=>e.isCone);if(!n)return;let r={id:`scoop-idle-${e}-${Date.now()}`,chatJid:n.jid,senderId:t.folder,senderName:t.assistantLabel,content:`[@${t.assistantLabel} idle]: Scoop "${t.name}" has been ready for 2 minutes without receiving any work. This is expected if the scoop is waiting for webhooks or cron tasks. If you intended to delegate work, use feed_scoop to send a prompt.`,timestamp:new Date().toISOString(),fromAssistant:!1,channel:`scoop-idle`};Q.info(`Scoop idle timeout`,{jid:e,scoop:t.folder}),this.handleMessage(r).catch(t=>{let n=t instanceof Error?t.message:String(t);Q.error(`Failed to send idle notification`,{jid:e,error:n})})},gb);this.idleTimers.set(e,t)}clearIdleTimer(e){let t=this.idleTimers.get(e);t&&(clearTimeout(t),this.idleTimers.delete(e))}async shutdown(){this.stopMessageLoop();for(let e of this.idleTimers.keys())this.clearIdleTimer(e);this.scheduler?.stop(),this.scheduler=null;for(let e of this.contexts.keys())await this.destroyScoopTab(e);Q.info(`Orchestrator shutdown`)}};n(`heartbeat`);var vb=n(`tray-follower`);function yb(e){let t=new URL(e);return t.searchParams.set(`json`,`true`),t.toString()}async function bb(e){let t=yb(e.joinUrl),n=await Db(await(e.fetchImpl??fetch)(t,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({controllerId:e.controllerId,runtime:e.runtime})}));return vb.info(`Follower tray attach response`,{trayId:n.trayId,action:n.result.action,code:n.result.code,participantCount:n.participantCount}),xb(n)}function xb(e){let t={trayId:e.trayId,controllerId:e.controllerId,participantCount:e.participantCount,leader:e.leader,action:e.result.action,code:e.result.code,iceServers:e.iceServers};return e.result.action===`wait`?{...t,retryAfterMs:e.result.retryAfterMs}:e.result.action===`signal`?{...t,bootstrap:e.result.bootstrap}:e.result.action===`fail`?{...t,error:e.result.error}:t}async function Sb(e){return Eb(await Ob(e,{action:`poll`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,cursor:e.cursor}))}async function Cb(e){return Eb(await Ob(e,{action:`answer`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,answer:e.answer}))}async function wb(e){return Eb(await Ob(e,{action:`ice-candidate`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,candidate:e.candidate}))}async function Tb(e){return Eb(await Ob(e,{action:`retry`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,runtime:e.runtime}))}function Eb(e){return{trayId:e.trayId,controllerId:e.controllerId,participantCount:e.participantCount,leader:e.leader,bootstrap:e.bootstrap,events:e.events}}async function Db(e){let t=null,n=null;try{t=await e.text(),n=JSON.parse(t)}catch{}if(!kb(n)){let n=t?t.slice(0,200):`(empty)`;throw vb.warn(`Tray follower attach returned an invalid response`,{status:e.status,body:n}),Error(`Tray follower attach returned an invalid response (${e.status}): ${n}`)}return n}async function Ob(e,t){let n=yb(e.joinUrl),r=await(e.fetchImpl??fetch)(n,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify(t)}),i=await r.json().catch(()=>null);if(!Ab(i))throw Error(`Tray follower bootstrap returned an invalid response (${r.status})`);return i}function kb(e){if(!e||typeof e!=`object`)return!1;let t=e;if(typeof t.trayId!=`string`||typeof t.controllerId!=`string`||t.role!==`follower`||typeof t.participantCount!=`number`)return!1;let n=t.result;if(!n||typeof n!=`object`)return!1;let r=n;return r.action===`wait`?(r.code===`LEADER_NOT_ELECTED`||r.code===`LEADER_NOT_CONNECTED`)&&typeof r.retryAfterMs==`number`:r.action===`signal`?r.code===`LEADER_CONNECTED`&&jb(r.bootstrap):r.action===`fail`?(r.code===`INVALID_JOIN_CAPABILITY`||r.code===`TRAY_EXPIRED`)&&typeof r.error==`string`:!1}function Ab(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.trayId==`string`&&typeof t.controllerId==`string`&&t.role===`follower`&&typeof t.participantCount==`number`&&jb(t.bootstrap)&&Array.isArray(t.events)}function jb(e){if(!e||typeof e!=`object`)return!1;let t=e;return typeof t.controllerId==`string`&&typeof t.bootstrapId==`string`&&typeof t.attempt==`number`&&typeof t.state==`string`&&typeof t.expiresAt==`string`&&typeof t.cursor==`number`&&typeof t.maxRetries==`number`&&typeof t.retriesRemaining==`number`}var Mb=n(`agent-bridge`),Nb=`__slicc_agent`,Pb=`agent-spawn-request`;function Fb(e,t,n=null,r={}){let i=r.generateName??Vb,a=r.generateUid??Rb,o=r.resolveModel??Ub;function s(){for(let t=0;t<8;t++){let t=i(),n=`agent_${Hb(t)}`;if(!e.getScoops().some(e=>e.jid===n))return t}return a()}function c(t){if(t===void 0)return null;let n=e.getScoops().find(e=>e.jid===t);if(!n)return null;let r=n.config?.modelId;return r&&r.length>0?r:null}async function l(r){let i=r.modelId;if(i!==void 0&&(i===``||o(i)===null))return{finalText:`agent: unknown model: ${i}`,exitCode:1};let a=i??c(r.parentJid)??``,l=s(),u=`agent-${l}`,d=`agent_${Hb(l)}`,f=`/scoops/${u}`,p=Wb(r.cwd),m={visiblePaths:Gb(r),writablePaths:Kb([p,`/shared/`,`${f}/`,`/tmp/`]),allowedCommands:r.allowedCommands};a&&(m.modelId=a);let h={jid:d,name:u,folder:u,isCone:!1,type:`scoop`,requiresTrigger:!1,assistantLabel:u,addedAt:new Date().toISOString(),config:m,configSchemaVersion:2,notifyOnComplete:!1},g=[],_=``,v=null,y=e.observeScoop(d,{onSendMessage:e=>{g.push(e)},onResponse:(e,t)=>{t?_+=e:_=e},onError:e=>{v===null&&(v=e)}});try{try{await e.registerScoop(h)}catch(e){return{finalText:v??qb(e),exitCode:1}}return await e.sendPrompt(d,r.prompt,`agent`,`agent`),v===null?{finalText:g.length>0?g[g.length-1]:_,exitCode:0}:{finalText:v,exitCode:1}}catch(e){return{finalText:v??qb(e),exitCode:1}}finally{y();try{await e.unregisterScoop(d)}catch(e){Mb.warn(`unregisterScoop failed`,{jid:d,error:qb(e)})}try{await t.rm(f,{recursive:!0})}catch(e){Jb(e,`ENOENT`)||Mb.warn(`scratch folder cleanup failed`,{folder:u,error:qb(e)})}if(n)try{await n.delete(d)}catch(e){Mb.warn(`sessionStore.delete failed`,{jid:d,error:qb(e)})}}}return{spawn:l}}function Ib(e,t,n=null,r={}){let i=Fb(e,t,n,r);return globalThis[Nb]=i,Mb.info(`agent bridge published on globalThis.__slicc_agent`),i}function Lb(){let e={spawn(e){return new Promise((t,n)=>{let r=globalThis.chrome?.runtime;if(!r||typeof r.sendMessage!=`function`){n(Error(`agent: chrome.runtime.sendMessage not available`));return}let i=e=>{let i=r.lastError;if(i){n(Error(i.message??`chrome.runtime error`));return}if(e==null){n(Error(`agent: empty response from offscreen bridge`));return}let a=e;if(!a.ok){n(Error(a.error??`agent: offscreen bridge error`));return}if(!a.result){n(Error(`agent: offscreen bridge returned no result`));return}t(a.result)};try{r.sendMessage({source:`panel`,payload:{type:Pb,options:e}},i)}catch(e){n(e instanceof Error?e:Error(String(e)))}})}};return globalThis[Nb]=e,Mb.info(`agent bridge proxy published on globalThis.__slicc_agent`),e}function Rb(){let e=globalThis;return typeof e.crypto?.randomUUID==`function`?e.crypto.randomUUID().replace(/-/g,``).slice(0,12):`${Date.now().toString(36)}${Math.random().toString(36).slice(2,8)}`}var zb=`amber.bouncy.breezy.bubbly.cheeky.chilly.cozy.dapper.dreamy.eager.exuberant.fluffy.frosty.gentle.giddy.glossy.jolly.lucky.mellow.merry.nimble.plucky.quirky.salty.sleepy.snappy.sparkly.spiffy.sunny.sweet.toasty.velvety.whimsy.zesty`.split(`.`),Bb=`blueberry.butterscotch.caramel.cherry.chocolate.cinnamon.coconut.coffee.cookies.custard.espresso.fudge.gelato.hazelnut.honeycomb.lavender.lemon.mango.maple.marzipan.matcha.mint.mocha.neapolitan.nougat.peach.pecan.pistachio.praline.raspberry.sherbet.sorbet.stracciatella.strawberry.tiramisu.toffee.vanilla`.split(`.`);function Vb(){return`${zb[Math.floor(Math.random()*zb.length)]}-${Bb[Math.floor(Math.random()*Bb.length)]}`}function Hb(e){return e.replace(/-/g,`_`)}function Ub(e){try{let t=j();for(let n of t)if(n.models.some(t=>t.id===e))return e;return null}catch{return null}}function Wb(e){let t=R(e);return t.endsWith(`/`)?t:`${t}/`}function Gb(e){if(e.visiblePaths!==void 0)return e.visiblePaths.map(Wb);let t=[`/workspace/`];return e.invokingCwd&&e.invokingCwd.length>0&&t.push(Wb(e.invokingCwd)),Kb(t)}function Kb(e){let t=new Set,n=[];for(let r of e)t.has(r)||(t.add(r),n.push(r));return n}function qb(e){return e instanceof Error?e.message:String(e)}function Jb(e,t){if(typeof e!=`object`||!e)return!1;let n=e.code;return typeof n==`string`&&n===t}var Yb=n(`tray-webrtc`),Xb=`tray-control`,Zb=250,Qb=class{peerConnectionFactory;dataChannelLabel;peers=new Map;iceServers;constructor(e){this.options=e,this.iceServers=e.iceServers,this.peerConnectionFactory=e.peerConnectionFactory??(()=>tx(this.iceServers)),this.dataChannelLabel=e.dataChannelLabel??Xb}setIceServers(e){this.iceServers=e}async handleControlMessage(e){e.type===`follower.join_requested`?(e.iceServers&&!this.iceServers&&(this.iceServers=e.iceServers),await this.handleJoinRequested(e)):e.type===`bootstrap.answer`?await this.peers.get(e.bootstrapId)?.peer.setRemoteDescription(e.answer):e.type===`bootstrap.ice_candidate`&&await this.peers.get(e.bootstrapId)?.peer.addIceCandidate(e.candidate)}getPeers(){return Array.from(this.peers.values()).map(({state:e})=>({...e}))}getChannel(e){return this.peers.get(e)?.channel??null}stop(){for(let e of this.peers.values())e.peer.close();this.peers.clear()}async handleJoinRequested(e){this.closeControllerPeers(e.controllerId);let t=this.peerConnectionFactory(),n={controllerId:e.controllerId,bootstrapId:e.bootstrapId,attempt:e.attempt,state:`connecting`,connectedAt:null,runtime:e.runtime},r=t.createDataChannel(this.dataChannelLabel);this.peers.set(e.bootstrapId,{state:n,peer:t,channel:r}),t.addEventListener(`icecandidate`,({candidate:t})=>{let n=rx(t);n&&this.options.sendControlMessage({type:`bootstrap.ice_candidate`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,candidate:n})}),t.addEventListener(`connectionstatechange`,()=>{let n=this.peers.get(e.bootstrapId);n&&(n.state.state===`connected`?(t.connectionState===`disconnected`||t.connectionState===`failed`)&&(Yb.warn(`Leader peer connection state changed post-connect`,{bootstrapId:e.bootstrapId,state:t.connectionState}),this.options.onPeerDisconnected?.(e.bootstrapId,`Peer connection ${t.connectionState}`)):t.connectionState===`failed`&&this.failPeer(e,`Leader peer connection failed before the data channel opened`))}),r.addEventListener(`open`,()=>{let t=this.peers.get(e.bootstrapId);!t||t.state.state===`connected`||(t.state.state=`connected`,t.state.connectedAt=new Date().toISOString(),this.options.onPeerConnected?.({...t.state},t.channel))}),r.addEventListener(`close`,()=>{let t=this.peers.get(e.bootstrapId);t&&(t.state.state===`connected`?(Yb.warn(`Leader data channel closed post-connect`,{bootstrapId:e.bootstrapId}),this.options.onPeerDisconnected?.(e.bootstrapId,`Data channel closed`)):this.failPeer(e,`Leader data channel closed before opening`))}),r.addEventListener(`error`,()=>{let t=this.peers.get(e.bootstrapId);t&&(t.state.state===`connected`?(Yb.warn(`Leader data channel error post-connect`,{bootstrapId:e.bootstrapId}),this.options.onPeerDisconnected?.(e.bootstrapId,`Data channel error`)):this.failPeer(e,`Leader data channel failed before opening`))});try{let n=await t.createOffer();await t.setLocalDescription(n),this.options.sendControlMessage({type:`bootstrap.offer`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,offer:nx(t.localDescription??n,`offer`)})}catch(t){this.failPeer(e,t instanceof Error?t.message:String(t))}}closeControllerPeers(e){for(let[t,n]of this.peers.entries())n.state.controllerId===e&&(n.peer.close(),this.peers.delete(t))}failPeer(e,t){let n=this.peers.get(e.bootstrapId);if(n){n.peer.close(),this.peers.delete(e.bootstrapId);try{this.options.sendControlMessage({type:`bootstrap.failed`,controllerId:e.controllerId,bootstrapId:e.bootstrapId,code:`WEBRTC_BOOTSTRAP_FAILED`,message:t,retryable:!0,retryAfterMs:1e3})}catch(e){Yb.warn(`Failed to report tray bootstrap failure`,{error:e instanceof Error?e.message:String(e)})}}}},$b=class{fetchImpl;peerConnectionFactory;controllerIdFactory;sleep;pollIntervalMs;iceServers;activePeer=null;stopped=!1;constructor(e){this.options=e,this.fetchImpl=e.fetchImpl??fetch,this.iceServers=e.iceServers,this.peerConnectionFactory=e.peerConnectionFactory??(()=>tx(this.iceServers)),this.controllerIdFactory=e.controllerIdFactory??(()=>crypto.randomUUID()),this.sleep=e.sleep??(e=>new Promise(t=>setTimeout(t,e))),this.pollIntervalMs=e.pollIntervalMs??Zb}async start(){this.stopped=!1;let e=this.controllerIdFactory(),t=Date.now();p({state:`connecting`,joinUrl:this.options.joinUrl,trayId:null,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:0,lastAttachCode:null,connectingSince:t,lastError:null}),Yb.info(`Follower tray join starting`,{joinUrl:this.options.joinUrl});let n=0;for(;;){ix(this.stopped),n++;let t;try{t=await bb({joinUrl:this.options.joinUrl,controllerId:e,runtime:this.options.runtime,fetchImpl:this.fetchImpl})}catch(e){let t=e instanceof Error?e.message:String(e);throw p({...h(),attachAttempts:n,lastError:t}),e}if(p({...h(),attachAttempts:n,lastAttachCode:t.code}),t.action===`wait`){let e=t.retryAfterMs??1e3;Yb.info(`Follower tray attach waiting`,{attempt:n,code:t.code,retryAfterMs:e}),n%10==0&&Yb.warn(`Follower tray attach still waiting after ${n} attempts`,{attempt:n,code:t.code,retryAfterMs:e}),await this.sleep(e);continue}if(t.action===`fail`||!t.bootstrap){let e=t.error??`Tray follower attach failed (${t.code})`;throw p({state:`error`,joinUrl:this.options.joinUrl,trayId:null,error:e,lastPingTime:null,reconnectAttempts:0,attachAttempts:n,lastAttachCode:t.code,connectingSince:null,lastError:e}),Yb.warn(`Follower tray attach failed`,{error:e}),Error(e)}t.iceServers&&(this.iceServers=t.iceServers);try{let r=await this.completeBootstrap(t.trayId,e,t.bootstrap);return p({state:`connected`,joinUrl:this.options.joinUrl,trayId:r.trayId,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:n,lastAttachCode:t.code,connectingSince:null,lastError:null}),Yb.info(`Follower tray connected`,{trayId:r.trayId,controllerId:e}),r}catch(e){let r=e instanceof Error?e.message:String(e);throw p({state:`error`,joinUrl:this.options.joinUrl,trayId:t.trayId,error:r,lastPingTime:null,reconnectAttempts:0,attachAttempts:n,lastAttachCode:t.code,connectingSince:null,lastError:r}),Yb.warn(`Follower tray bootstrap failed`,{error:r}),e}}}stop(){this.stopped=!0,this.activePeer?.peer.close(),this.activePeer?.channel?.close(),this.activePeer=null,p({state:`inactive`,joinUrl:null,trayId:null,error:null,lastPingTime:null,reconnectAttempts:0,attachAttempts:0,lastAttachCode:null,connectingSince:null,lastError:null})}async completeBootstrap(e,t,n){let r=n,i=0;for(this.activePeer=this.createFollowerPeer(t,r.bootstrapId);;){if(ix(this.stopped),this.activePeer.open&&this.activePeer.channel)return{trayId:e,controllerId:t,bootstrapId:r.bootstrapId,channel:this.activePeer.channel};if(this.activePeer.openError)throw Error(this.activePeer.openError);let n=await Sb({joinUrl:this.options.joinUrl,controllerId:t,bootstrapId:r.bootstrapId,cursor:i,fetchImpl:this.fetchImpl});r=n.bootstrap,i=r.cursor;try{for(let e of n.events)if(e.type===`bootstrap.offer`){await this.activePeer.peer.setRemoteDescription(e.offer);let n=await this.activePeer.peer.createAnswer();await this.activePeer.peer.setLocalDescription(n),await Cb({joinUrl:this.options.joinUrl,controllerId:t,bootstrapId:r.bootstrapId,answer:nx(this.activePeer.peer.localDescription??n,`answer`),fetchImpl:this.fetchImpl})}else if(e.type===`bootstrap.ice_candidate`)await this.activePeer.peer.addIceCandidate(e.candidate);else if(e.type===`bootstrap.failed`)throw Error(e.failure.message)}catch(e){if(r.failure?.retryable&&r.retriesRemaining>0){r=(await Tb({joinUrl:this.options.joinUrl,controllerId:t,bootstrapId:r.bootstrapId,runtime:this.options.runtime,fetchImpl:this.fetchImpl})).bootstrap,i=0,this.activePeer.peer.close(),this.activePeer=this.createFollowerPeer(t,r.bootstrapId);continue}throw e}this.activePeer.open||await this.sleep(this.pollIntervalMs)}}createFollowerPeer(e,t){let n=this.peerConnectionFactory(),r={peer:n,channel:null,open:!1,openError:null};return n.addEventListener(`connectionstatechange`,()=>{r.open&&(n.connectionState===`disconnected`||n.connectionState===`failed`)&&(Yb.warn(`Follower peer connection state changed post-connect`,{bootstrapId:t,state:n.connectionState}),this.options.onDisconnected?.(`Peer connection ${n.connectionState}`))}),n.addEventListener(`datachannel`,({channel:e})=>{r.channel=e,e.addEventListener(`open`,()=>{r.open=!0}),e.addEventListener(`close`,()=>{r.open?(Yb.warn(`Follower data channel closed post-connect`,{bootstrapId:t}),this.options.onDisconnected?.(`Data channel closed`)):r.openError=`Follower data channel closed before opening`}),e.addEventListener(`error`,()=>{r.open?(Yb.warn(`Follower data channel error post-connect`,{bootstrapId:t}),this.options.onDisconnected?.(`Data channel error`)):r.openError=`Follower data channel failed before opening`})}),n.addEventListener(`icecandidate`,({candidate:n})=>{let r=rx(n);r&&wb({joinUrl:this.options.joinUrl,controllerId:e,bootstrapId:t,candidate:r,fetchImpl:this.fetchImpl}).catch(e=>{Yb.warn(`Failed to send follower ICE candidate`,{error:e instanceof Error?e.message:String(e)})})}),r}};function ex(e,t){let n=t.baseDelayMs??1e3,r=t.backoffMultiplier??2,i=t.maxDelayMs??3e4,a=t.maxAttempts??10,o=t.sleep??e.sleep??(e=>new Promise(t=>setTimeout(t,e))),s=!1,c=!1,l=null,u={cancel(){s=!0,c=!1,l?.stop(),l=null},get reconnecting(){return c}},d=()=>{let t=new $b({...e,sleep:o,onDisconnected:e=>{s||(Yb.warn(`Follower disconnected, starting reconnect loop`,{reason:e}),f(e))}});return l=t,{manager:t,connectionPromise:t.start()}},f=async u=>{if(s||c)return;c=!0,l?.stop(),l=null;let f=0,m=n,g=u??`Unknown disconnect`;for(;!s&&f<a&&(f++,t.onReconnecting?.(f),p({...h(),state:`reconnecting`,error:null,reconnectAttempts:f}),Yb.info(`Reconnect attempt`,{attempt:f,delay:m}),await o(m),!s);){let n=null;try{let r=d();n=r.manager;let i=await r.connectionPromise;if(s){n.stop();break}c=!1,p({...h(),state:`connected`,joinUrl:e.joinUrl,trayId:i.trayId,error:null,lastPingTime:null,reconnectAttempts:0,connectingSince:null,lastError:null}),Yb.info(`Reconnect successful`,{attempt:f,trayId:i.trayId}),t.onConnected(i);return}catch(e){g=e instanceof Error?e.message:String(e),Yb.warn(`Reconnect attempt failed`,{attempt:f,error:g}),n?.stop(),l=null}m=Math.min(m*r,i)}s||(c=!1,p({...h(),state:`error`,error:`Reconnect failed after ${f} attempts: ${g}`,reconnectAttempts:f}),Yb.warn(`Reconnect gave up`,{attempts:f,lastError:g}),t.onGaveUp?.(g))},{connectionPromise:m}=d();return m.then(e=>{s||t.onConnected(e)}).catch(e=>{s||Yb.warn(`Initial follower connection failed`,{error:e instanceof Error?e.message:String(e)})}),u}function tx(e){if(typeof RTCPeerConnection>`u`)throw Error(`RTCPeerConnection is not available in this runtime`);let t=e?.length?{iceServers:e}:void 0;return new RTCPeerConnection(t)}function nx(e,t){if(!e||e.type!==t||typeof e.sdp!=`string`)throw Error(`Expected a local ${t} description before signaling`);return{type:e.type,sdp:e.sdp}}function rx(e){if(!e||typeof e!=`object`)return null;let t=e;return typeof t.candidate==`string`?{candidate:t.candidate,sdpMid:typeof t.sdpMid==`string`?t.sdpMid:null,sdpMLineIndex:typeof t.sdpMLineIndex==`number`?t.sdpMLineIndex:null,usernameFragment:typeof t.usernameFragment==`string`?t.usernameFragment:null}:null}function ix(e){if(e)throw Error(`Tray follower stopped before WebRTC bootstrap completed`)}var ax=64*1024;async function ox(e,t){try{switch(t.op){case`readFile`:return await sx(e,t.path,t.encoding);case`writeFile`:return[await cx(e,t.path,t.content,t.encoding)];case`stat`:return[await lx(e,t.path)];case`readDir`:return[await ux(e,t.path)];case`mkdir`:return[await dx(e,t.path,t.recursive)];case`rm`:return[await fx(e,t.path,t.recursive)];case`exists`:return[await px(e,t.path)];case`walk`:return[await mx(e,t.path)];default:return[{ok:!1,error:`Unknown fs operation: ${t.op}`}]}}catch(e){return[gx(e)]}}async function sx(e,t,n){return(n??`utf-8`)===`utf-8`?hx(await e.readFile(t,{encoding:`utf-8`}),`utf-8`):hx(_x(await e.readFile(t,{encoding:`binary`})),`base64`)}async function cx(e,t,n,r){if(r===`base64`){let r=vx(n);await e.writeFile(t,r)}else await e.writeFile(t,n);return{ok:!0,data:{type:`void`}}}async function lx(e,t){return{ok:!0,data:{type:`stat`,stat:await e.stat(t)}}}async function ux(e,t){return{ok:!0,data:{type:`dirEntries`,entries:await e.readDir(t)}}}async function dx(e,t,n){return await e.mkdir(t,{recursive:n}),{ok:!0,data:{type:`void`}}}async function fx(e,t,n){return await e.rm(t,{recursive:n}),{ok:!0,data:{type:`void`}}}async function px(e,t){return{ok:!0,data:{type:`exists`,exists:await e.exists(t)}}}async function mx(e,t){let n=[];for await(let r of e.walk(t))n.push(r);return{ok:!0,data:{type:`paths`,paths:n}}}function hx(e,t){if(e.length<=ax)return[{ok:!0,data:{type:`file`,content:e,encoding:t}}];let n=Math.ceil(e.length/ax),r=[];for(let i=0;i<n;i++){let a=i*ax,o=e.slice(a,a+ax);r.push({ok:!0,data:{type:`file`,content:o,encoding:t},chunkIndex:i,totalChunks:n})}return r}function gx(e){return e instanceof Error&&`code`in e?{ok:!1,error:e.message,code:e.code}:{ok:!1,error:e instanceof Error?e.message:String(e)}}function _x(e){let t=``;for(let n=0;n<e.length;n++)t+=String.fromCharCode(e[n]);return btoa(t)}function vx(e){let t=atob(e),n=new Uint8Array(t.length);for(let e=0;e<t.length;e++)n[e]=t.charCodeAt(e);return n}var yx=class{runtimes=new Map;dirty=!1;setTargets(e,t){this.runtimes.set(e,t),this.dirty=!0}removeRuntime(e){this.runtimes.delete(e)&&(this.dirty=!0)}getEntries(){this.dirty=!1;let e=[];for(let[t,n]of this.runtimes)for(let r of n)e.push({targetId:`${t}:${r.targetId}`,localTargetId:r.targetId,runtimeId:t,title:r.title,url:r.url,isLocal:!1});return e}hasChanged(){return this.dirty}getRuntimeIds(){return[...this.runtimes.keys()]}},bx=n(`data-channel-keepalive`),xx=class{sendPing;onDead;intervalMs;maxMissed;timer=null;missedPongs=0;awaitingPong=!1;stopped=!1;constructor(e){this.sendPing=e.sendPing,this.onDead=e.onDead,this.intervalMs=e.intervalMs??1e4,this.maxMissed=e.maxMissed??3}start(){this.timer||this.stopped||(this.timer=setInterval(()=>this.tick(),this.intervalMs))}stop(){this.stopped=!0,this.timer&&=(clearInterval(this.timer),null)}receivePong(){this.awaitingPong=!1,this.missedPongs=0}receivePing(){this.missedPongs=0,this.awaitingPong=!1}get missed(){return this.missedPongs}tick(){if(!this.stopped){if(this.awaitingPong&&(this.missedPongs++,bx.debug(`Missed pong`,{missedPongs:this.missedPongs,maxMissed:this.maxMissed}),this.missedPongs>=this.maxMissed)){bx.warn(`Channel declared dead`,{missedPongs:this.missedPongs}),this.stop(),this.onDead();return}this.awaitingPong=!0,this.sendPing()}}},Sx=n(`tray-leader-sync`);function Cx(e){return e?e.includes(`standalone`)?`standalone`:e.includes(`extension`)?`extension`:e.includes(`electron`)?`electron`:`unknown`:`unknown`}var wx=class{followers=new Map;registry=new yx;runtimeToBootstrap=new Map;pendingCDPRoutes=new Map;cdpChunkBuffers=new Map;remoteTransports=new Map;pendingTabOpenRoutes=new Map;tabOpenResolvers=new Map;pendingFsRoutes=new Map;fsResolvers=new Map;constructor(e){this.options=e}addFollower(e,t,n){this.removeFollower(e);let r=ge(t),i=r.onMessage(t=>{this.handleFollowerMessage(e,t)}),a=new xx({sendPing:()=>r.send({type:`ping`}),onDead:()=>{Sx.warn(`Follower keepalive dead, removing follower`,{bootstrapId:e}),this.removeFollower(e),this.options.onFollowerDead?.(e)}});a.start(),this.followers.set(e,{bootstrapId:e,sync:r,unsubscribe:i,keepalive:a,runtime:n?.runtime,connectedAt:n?.connectedAt,lastActivity:Date.now(),floatType:Cx(n?.runtime)}),Sx.info(`Follower added to sync`,{bootstrapId:e,followerCount:this.followers.size}),this.sendSnapshotToFollower(e);let o=this.getConnectedEntries();o.length>0&&r.send({type:`targets.registry`,targets:o})}removeFollower(e){let t=this.followers.get(e);if(t){t.keepalive.stop(),t.unsubscribe(),t.sync.close(),this.followers.delete(e);for(let[t,n]of this.runtimeToBootstrap)if(n===e){this.cleanupRemoteTransports(t),this.registry.removeRuntime(t),this.runtimeToBootstrap.delete(t);break}this.registry.hasChanged()&&this.broadcastTargetRegistry(),Sx.info(`Follower removed from sync`,{bootstrapId:e,followerCount:this.followers.size})}}broadcastEvent(e){if(this.followers.size===0)return;let t={type:`agent_event`,event:e,scoopJid:this.options.getScoopJid()};for(let e of this.followers.values())e.sync.send(t)}broadcastUserMessage(e,t){if(this.followers.size===0)return;let n={type:`user_message_echo`,text:e,messageId:t,scoopJid:this.options.getScoopJid()};for(let e of this.followers.values())e.sync.send(n)}broadcastStatus(e){if(this.followers.size===0)return;let t={type:`status`,scoopStatus:e};for(let e of this.followers.values())e.sync.send(t)}sendSnapshotToFollower(e){let t=this.followers.get(e);if(!t)return;let n=this.options.getMessages(),r=this.options.getScoopJid();pe(t.sync,n,r),Sx.debug(`Snapshot sent to follower`,{bootstrapId:e,messageCount:n.length})}handleFollowerMessage(e,t){switch(t.type){case`user_message`:Sx.info(`Follower user message received`,{bootstrapId:e,messageId:t.messageId}),this.options.onFollowerMessage(t.text,t.messageId);break;case`abort`:Sx.info(`Follower abort received`,{bootstrapId:e}),this.options.onFollowerAbort();break;case`request_snapshot`:Sx.info(`Follower snapshot request received`,{bootstrapId:e}),this.sendSnapshotToFollower(e);break;case`targets.advertise`:Sx.info(`Follower targets advertised`,{bootstrapId:e,runtimeId:t.runtimeId,targetCount:t.targets.length});for(let e of[...this.remoteTransports.keys()]){let n=e.substring(0,e.indexOf(`:`));n!==`leader`&&!this.runtimeToBootstrap.has(n)&&n!==t.runtimeId&&(this.remoteTransports.get(e)?.disconnect(),this.remoteTransports.delete(e),Sx.debug(`Cleaned up orphaned remote transport on advertise`,{key:e}))}this.runtimeToBootstrap.set(t.runtimeId,e),this.registry.setTargets(t.runtimeId,t.targets),this.broadcastTargetRegistry();break;case`cdp.request`:{let{requestId:n,targetRuntimeId:r,localTargetId:i,method:a,params:o,sessionId:s}=t;r===`leader`?this.executeLocalCDP(n,i,a,o,s,e):this.forwardCDPRequest(n,r,i,a,o,s,e);break}case`cdp.response`:this.handleCDPResponse(t);break;case`cdp.event`:this.handleCDPEvent(e,t.method,t.params,t.sessionId);break;case`tab.open`:{let{requestId:n,targetRuntimeId:r,url:i}=t;r===`leader`?this.executeLocalTabOpen(n,i,e):this.forwardTabOpen(n,r,i,e);break}case`tab.opened`:this.handleTabOpenResponse(t.requestId,t.targetId);break;case`tab.open.error`:this.handleTabOpenError(t.requestId,t.error);break;case`fs.request`:{let{requestId:n,targetRuntimeId:r,request:i}=t;r===`leader`?this.executeLocalFs(n,i,e):this.forwardFsRequest(n,r,i,e);break}case`fs.response`:this.handleFsResponse(t.requestId,t.response);break;case`ping`:{let t=this.followers.get(e);t&&(t.keepalive.receivePing(),t.lastActivity=Date.now(),t.sync.send({type:`pong`}));break}case`pong`:{let t=this.followers.get(e);t&&(t.keepalive.receivePong(),t.lastActivity=Date.now());break}}}setLocalTargets(e){this.registry.setTargets(`leader`,e),this.registry.hasChanged()&&this.broadcastTargetRegistry()}broadcastTargetRegistry(){if(this.followers.size===0)return;let e={type:`targets.registry`,targets:this.getConnectedEntries()};for(let t of this.followers.values())t.sync.send(e)}getTargets(){return this.getConnectedEntries()}getConnectedEntries(){return this.registry.getEntries().filter(e=>{if(e.runtimeId===`leader`)return!0;let t=this.runtimeToBootstrap.get(e.runtimeId);return t?this.followers.has(t):!1})}createRemoteTransport(e,t){let n=new ve({sendCDPRequest:(n,r,i,a)=>{let o=this.runtimeToBootstrap.get(e),s=o?this.followers.get(o):void 0;if(!s){this.remoteTransports.get(`${e}:${t}`)?.handleResponse(n,void 0,`Target runtime "${e}" not connected`);return}this.pendingCDPRoutes.set(n,{requesterBootstrapId:`__leader__`,requestId:n}),s.sync.send({type:`cdp.request`,requestId:n,localTargetId:t,method:r,params:i,sessionId:a})}});return this.remoteTransports.set(`${e}:${t}`,n),n}removeRemoteTransport(e,t){let n=`${e}:${t}`,r=this.remoteTransports.get(n);r&&(r.disconnect(),this.remoteTransports.delete(n))}cleanupRemoteTransports(e){let t=`${e}:`;for(let e of[...this.remoteTransports.keys()])e.startsWith(t)&&(this.remoteTransports.get(e)?.disconnect(),this.remoteTransports.delete(e),Sx.debug(`Cleaned up stale remote transport`,{key:e}))}getConnectedFollowers(){return[...this.runtimeToBootstrap.entries()].map(([e,t])=>{let n=this.followers.get(t);return{runtimeId:e,runtime:n?.runtime,connectedAt:n?.connectedAt,lastActivity:n?.lastActivity,floatType:n?.floatType}})}getBestFollowerForTeleport(){let e=[];for(let[t,n]of this.runtimeToBootstrap){let r=this.followers.get(n);r&&e.push({runtimeId:t,bootstrapId:n,floatType:r.floatType,lastActivity:r.lastActivity})}if(e.length===0)return null;let t=e.filter(e=>e.floatType===`standalone`),n=t.length>0?t:e;return n.sort((e,t)=>t.lastActivity-e.lastActivity),n[0]}get hasFollowers(){return this.followers.size>0}stop(){for(let e of[...this.followers.keys()])this.removeFollower(e)}async executeLocalCDP(e,t,n,r,i,a){let o=this.followers.get(a);if(!o)return;let s=this.options.browserTransport;if(!s){o.sync.send({type:`cdp.response`,requestId:e,error:`Leader has no browser transport`});return}try{let t=await s.send(n,r,i);xe(o.sync,e,t)}catch(t){o.sync.send({type:`cdp.response`,requestId:e,error:t instanceof Error?t.message:String(t)})}}forwardCDPRequest(e,t,n,r,i,a,o){let s=this.runtimeToBootstrap.get(t),c=s?this.followers.get(s):void 0,l=this.followers.get(o);if(!c){l&&l.sync.send({type:`cdp.response`,requestId:e,error:`Target runtime "${t}" not connected`});return}this.pendingCDPRoutes.set(e,{requesterBootstrapId:o,requestId:e}),c.sync.send({type:`cdp.request`,requestId:e,localTargetId:n,method:r,params:i,sessionId:a})}handleCDPResponse(e){let{requestId:t,result:n,error:r,chunkData:i,chunkIndex:a,totalChunks:o}=e,s=this.pendingCDPRoutes.get(t);if(!s)return;let c=fe(this.cdpChunkBuffers,e);if(!c)return;if(this.pendingCDPRoutes.delete(t),s.requesterBootstrapId===`__leader__`){for(let e of this.remoteTransports.values())e.handleResponse(t,c.result,c.error);return}let l=this.followers.get(s.requesterBootstrapId);l&&xe(l.sync,t,c.result,c.error)}handleCDPEvent(e,t,n,r){let i;for(let[t,n]of this.runtimeToBootstrap)if(n===e){i=t;break}if(!i)return;let a=`${i}:`;for(let[e,r]of this.remoteTransports)e.startsWith(a)&&r.handleEvent(t,n)}openRemoteTab(e,t){let n=this.runtimeToBootstrap.get(e),r=n?this.followers.get(n):void 0;if(!r)return Promise.reject(Error(`Target runtime "${e}" not connected`));let i=`tab-open-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((e,n)=>{this.tabOpenResolvers.set(i,{resolve:e,reject:n}),this.pendingTabOpenRoutes.set(i,{requesterBootstrapId:`__leader__`,requestId:i}),r.sync.send({type:`tab.open`,requestId:i,url:t})})}async executeLocalTabOpen(e,t,n){let r=this.followers.get(n);if(!r)return;let i=this.options.browserTransport;if(!i){r.sync.send({type:`tab.open.error`,requestId:e,error:`Leader has no browser transport`});return}try{let n=(await i.send(`Target.createTarget`,{url:t,background:!0})).targetId;r.sync.send({type:`tab.opened`,requestId:e,targetId:`leader:${n}`})}catch(t){r.sync.send({type:`tab.open.error`,requestId:e,error:t instanceof Error?t.message:String(t)})}}forwardTabOpen(e,t,n,r){let i=this.runtimeToBootstrap.get(t),a=i?this.followers.get(i):void 0,o=this.followers.get(r);if(!a){o&&o.sync.send({type:`tab.open.error`,requestId:e,error:`Target runtime "${t}" not connected`});return}this.pendingTabOpenRoutes.set(e,{requesterBootstrapId:r,requestId:e}),a.sync.send({type:`tab.open`,requestId:e,url:n})}handleTabOpenResponse(e,t){let n=this.pendingTabOpenRoutes.get(e);if(!n)return;if(this.pendingTabOpenRoutes.delete(e),n.requesterBootstrapId===`__leader__`){let n=this.tabOpenResolvers.get(e);n&&(this.tabOpenResolvers.delete(e),n.resolve(t));return}let r=this.followers.get(n.requesterBootstrapId);r&&r.sync.send({type:`tab.opened`,requestId:e,targetId:t})}handleTabOpenError(e,t){let n=this.pendingTabOpenRoutes.get(e);if(!n)return;if(this.pendingTabOpenRoutes.delete(e),n.requesterBootstrapId===`__leader__`){let n=this.tabOpenResolvers.get(e);n&&(this.tabOpenResolvers.delete(e),n.reject(Error(t)));return}let r=this.followers.get(n.requesterBootstrapId);r&&r.sync.send({type:`tab.open.error`,requestId:e,error:t})}async executeLocalFs(e,t,n){let r=this.followers.get(n);if(!r)return;let i=this.options.vfs;if(!i){r.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:`Leader has no VFS`}});return}let a=await ox(i,t);for(let t of a)r.sync.send({type:`fs.response`,requestId:e,response:t})}forwardFsRequest(e,t,n,r){let i=this.runtimeToBootstrap.get(t),a=i?this.followers.get(i):void 0,o=this.followers.get(r);if(!a){o&&o.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:`Target runtime "${t}" not connected`}});return}this.pendingFsRoutes.set(e,{requesterBootstrapId:r,requestId:e,chunks:[],totalChunks:1}),a.sync.send({type:`fs.request`,requestId:e,request:n})}handleFsResponse(e,t){let n=this.pendingFsRoutes.get(e);if(!n){let n=this.fsResolvers.get(e);if(n){n.responses.push(t);let r=t.ok&&t.totalChunks||1;n.responses.length>=r&&(this.fsResolvers.delete(e),n.resolve(n.responses))}return}if(n.requesterBootstrapId===`__leader__`){let n=this.fsResolvers.get(e);if(n){n.responses.push(t);let r=t.ok&&t.totalChunks||1;n.responses.length>=r&&(this.fsResolvers.delete(e),this.pendingFsRoutes.delete(e),n.resolve(n.responses))}return}let r=this.followers.get(n.requesterBootstrapId);r&&r.sync.send({type:`fs.response`,requestId:e,response:t}),n.chunks.push(t),n.totalChunks=t.ok&&t.totalChunks||1,n.chunks.length>=n.totalChunks&&this.pendingFsRoutes.delete(e)}sendFsRequest(e,t){if(e===`leader`){let e=this.options.vfs;return e?ox(e,t):Promise.resolve([{ok:!1,error:`Leader has no VFS`}])}let n=this.runtimeToBootstrap.get(e),r=n?this.followers.get(n):void 0;if(!r)return Promise.resolve([{ok:!1,error:`Target runtime "${e}" not connected`}]);let i=`fs-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((e,n)=>{this.fsResolvers.set(i,{resolve:e,reject:n,responses:[]}),this.pendingFsRoutes.set(i,{requesterBootstrapId:`__leader__`,requestId:i,chunks:[],totalChunks:1}),r.sync.send({type:`fs.request`,requestId:i,request:t})})}},Tx=n(`tray-follower-sync`),Ex=class{sync;eventListeners=new Set;unsubscribe;keepalive;latestSnapshot=null;sentMessageIds=new Set;targetEntries=[];remoteTransports=new Map;cdpChunkBuffers=new Map;snapshotChunkBuffer=null;remoteCDPSessions=new Set;cdpEventCleanups=[];tabOpenResolvers=new Map;fsResolvers=new Map;constructor(e,t={}){this.options=t,this.sync=be(e),this.unsubscribe=this.sync.onMessage(e=>{this.handleLeaderMessage(e)}),this.keepalive=new xx({sendPing:()=>this.sync.send({type:`ping`}),onDead:()=>{Tx.warn(`Leader keepalive dead, cleaning up`),this.handleDisconnect(`Keepalive timeout — leader not responding`),this.options.onDead?.()}}),this.keepalive.start(),e.addEventListener(`close`,()=>{Tx.warn(`Data channel closed`),this.handleDisconnect(`Data channel closed`)}),e.addEventListener(`error`,()=>{Tx.warn(`Data channel error`),this.handleDisconnect(`Data channel error`)})}sendMessage(e,t){let n=t??`follower-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;this.sentMessageIds.add(n),this.sync.send({type:`user_message`,text:e,messageId:n}),Tx.info(`Sent user message to leader`,{messageId:n})}onEvent(e){return this.eventListeners.add(e),()=>this.eventListeners.delete(e)}stop(){this.sync.send({type:`abort`}),Tx.info(`Sent abort to leader`)}requestSnapshot(){this.sync.send({type:`request_snapshot`})}getLatestSnapshot(){return this.latestSnapshot}close(){this.keepalive.stop(),this.unsubscribe(),this.sync.close(),this.eventListeners.clear(),this.cleanupCDPEventForwarding(),Tx.info(`Follower sync closed`)}advertiseTargets(e,t){this.sync.send({type:`targets.advertise`,targets:e,runtimeId:t})}getTargets(){return this.targetEntries}disconnected=!1;handleDisconnect(e){this.disconnected||(this.disconnected=!0,p({...h(),state:`error`,error:e}),this.emitEvent({type:`error`,error:`Connection to leader lost: ${e}`}),this.keepalive.stop(),this.cleanupCDPEventForwarding(),this.unsubscribe(),this.sync.close(),this.options.onDisconnect?.(e))}handleLeaderMessage(e){switch(e.type){case`snapshot`:Tx.info(`Snapshot received from leader`,{messageCount:e.messages.length,scoopJid:e.scoopJid}),this.snapshotChunkBuffer=null,this.latestSnapshot={messages:e.messages,scoopJid:e.scoopJid},this.options.onSnapshot?.(e.messages,e.scoopJid);break;case`snapshot_chunk`:{let t=ye(this.snapshotChunkBuffer,e);this.snapshotChunkBuffer=t.buffer,t.result&&(Tx.info(`Chunked snapshot reassembled from leader`,{messageCount:t.result.messages.length,scoopJid:t.result.scoopJid}),this.latestSnapshot=t.result,this.options.onSnapshot?.(t.result.messages,t.result.scoopJid));break}case`agent_event`:this.emitEvent(e.event);break;case`user_message_echo`:if(this.sentMessageIds.has(e.messageId)){this.sentMessageIds.delete(e.messageId),Tx.debug(`Skipping own message echo`,{messageId:e.messageId});break}Tx.info(`User message echo received`,{messageId:e.messageId,scoopJid:e.scoopJid}),this.options.onUserMessage?.(e.text,e.messageId,e.scoopJid);break;case`status`:this.options.onStatus?.(e.scoopStatus);break;case`error`:Tx.warn(`Error from leader`,{error:e.error}),this.emitEvent({type:`error`,error:e.error});break;case`targets.registry`:Tx.info(`Target registry received from leader`,{targetCount:e.targets.length}),this.targetEntries=e.targets,this.options.onTargetsUpdated?.(this.targetEntries);break;case`cdp.request`:{let{requestId:t,localTargetId:n,method:r,params:i,sessionId:a}=e;this.executeLocalCDP(t,n,r,i,a);break}case`cdp.response`:this.routeCDPResponse(e);break;case`cdp.event`:for(let t of this.remoteTransports.values())t.handleEvent(e.method,e.params);break;case`tab.open`:this.executeLocalTabOpen(e.requestId,e.url);break;case`tab.opened`:{let t=this.tabOpenResolvers.get(e.requestId);t&&(this.tabOpenResolvers.delete(e.requestId),t.resolve(e.targetId));break}case`tab.open.error`:{let t=this.tabOpenResolvers.get(e.requestId);t&&(this.tabOpenResolvers.delete(e.requestId),t.reject(Error(e.error)));break}case`fs.request`:this.executeLocalFs(e.requestId,e.request);break;case`fs.response`:this.routeFsResponse(e.requestId,e.response);break;case`ping`:this.keepalive.receivePing(),this.sync.send({type:`pong`});break;case`pong`:this.keepalive.receivePong(),u(Date.now());break}}emitEvent(e){for(let t of this.eventListeners)try{t(e)}catch(t){Tx.error(`Listener error`,{eventType:e.type,error:t instanceof Error?t.message:String(t)})}}createRemoteTransport(e,t){let n=new ve({sendCDPRequest:(n,r,i,a)=>{this.sync.send({type:`cdp.request`,requestId:n,targetRuntimeId:e,localTargetId:t,method:r,params:i,sessionId:a})}});return this.remoteTransports.set(`${e}:${t}`,n),n}removeRemoteTransport(e,t){let n=`${e}:${t}`,r=this.remoteTransports.get(n);r&&(r.disconnect(),this.remoteTransports.delete(n))}openRemoteTab(e,t){let n=`tab-open-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((r,i)=>{this.tabOpenResolvers.set(n,{resolve:r,reject:i}),this.sync.send({type:`tab.open`,requestId:n,targetRuntimeId:e,url:t})})}async executeLocalTabOpen(e,t){let n=this.options.browserTransport;if(!n){this.sync.send({type:`tab.open.error`,requestId:e,error:`Follower has no browser transport`});return}try{let r=(await n.send(`Target.createTarget`,{url:t,background:!0})).targetId;this.sync.send({type:`tab.opened`,requestId:e,targetId:r}),this.options.onTargetsChanged?.()}catch(t){this.sync.send({type:`tab.open.error`,requestId:e,error:t instanceof Error?t.message:String(t)})}}async executeLocalCDP(e,t,n,r,i){let a=this.options.browserTransport;if(!a){this.sync.send({type:`cdp.response`,requestId:e,error:`Follower has no browser transport`});return}try{let t=await a.send(n,r,i);if(n===`Target.attachToTarget`&&t.sessionId){let e=t.sessionId;this.remoteCDPSessions.add(e),this.setupCDPEventForwarding(a,e),Tx.debug(`Tracking remote CDP session`,{remoteSessionId:e})}n===`Target.detachFromTarget`&&i&&this.remoteCDPSessions.has(i)&&(this.remoteCDPSessions.delete(i),Tx.debug(`Removed remote CDP session on detach`,{sessionId:i})),xe(this.sync,e,t)}catch(t){this.sync.send({type:`cdp.response`,requestId:e,error:t instanceof Error?t.message:String(t)})}}setupCDPEventForwarding(e,t){for(let n of[`Page.frameNavigated`,`Page.loadEventFired`,`Page.domContentEventFired`,`Network.responseReceived`,`Network.loadingFinished`,`Network.requestWillBeSent`]){let r=e=>{if(e.sessionId!==t||!this.remoteCDPSessions.has(t))return;let{sessionId:r,...i}=e;this.sync.send({type:`cdp.event`,method:n,params:i,sessionId:t})};e.on(n,r),this.cdpEventCleanups.push(()=>e.off(n,r))}}cleanupCDPEventForwarding(){for(let e of this.cdpEventCleanups)e();this.cdpEventCleanups.length=0,this.remoteCDPSessions.clear()}routeCDPResponse(e){let t=fe(this.cdpChunkBuffers,e);if(t)for(let n of this.remoteTransports.values())n.handleResponse(e.requestId,t.result,t.error)}async executeLocalFs(e,t){let n=this.options.vfs;if(!n){this.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:`Follower has no VFS`}});return}let r=await ox(n,t);for(let t of r)this.sync.send({type:`fs.response`,requestId:e,response:t})}routeFsResponse(e,t){let n=this.fsResolvers.get(e);if(!n)return;n.responses.push(t);let r=t.ok&&t.totalChunks||1;n.responses.length>=r&&(this.fsResolvers.delete(e),n.resolve(n.responses))}sendFsRequest(e,t){let n=`fs-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((r,i)=>{this.fsResolvers.set(n,{resolve:r,reject:i,responses:[]}),this.sync.send({type:`fs.request`,requestId:n,targetRuntimeId:e,request:t})})}};function Dx(e,t){if(t)return`extension`;try{return Ax(new URL(e))?`electron-overlay`:`standalone`}catch{return`standalone`}}function Ox(e,t){return e===`electron-overlay`||e===`standalone`&&t}function kx(e){try{let t=new URL(e).searchParams.get(`tab`);return t&&Yi(t)?t:qi}catch{return qi}}function Ax(e){return e.pathname===`/electron`||e.pathname===`/electron/`||e.searchParams.get(`runtime`)===`electron-overlay`}function jx(e){let t=new URL(e);return`${t.protocol===`https:`?`wss:`:`ws:`}//${t.host}/licks-ws`}function Mx(e,t){return`${new URL(e).origin}/webhooks/${t}`}function Nx(e,t){return`${e.replace(/\/+$/,``)}/${t.replace(/^\/+/,``)}`}function Px(e){return typeof e==`object`&&!!e&&`type`in e&&e.type===`slicc-electron-overlay:set-tab`}var Fx=[`/shared/sprinkles`];async function Ix(e){let t=new Map;for(let n of Fx)await e.exists(n)&&await Lx(e,n,t);return await Lx(e,`/`,t),t}async function Lx(e,t,n){for await(let r of e.walk(t)){if(!r.endsWith(`.shtml`))continue;let t=Rx(r);if(!n.has(t)){let i;try{i=await e.readFile(r,{encoding:`utf-8`})??``}catch{i=``}n.set(t,{name:t,path:r,title:zx(i,t),autoOpen:Bx(i)})}}}function Rx(e){let t=e.split(`/`).pop()??e;return t.endsWith(`.shtml`)?t.slice(0,-6):t}function zx(e,t){let n=e.match(/data-sprinkle-title=["']([^"']+)["']/);if(n)return n[1];let r=e.match(/<title>([^<]+)<\/title>/i);return r?r[1].trim():t}function Bx(e){return/data-sprinkle-autoopen\b/.test(e)}var Vx=n(`sprinkle-manager`),Hx=`slicc-open-sprinkles`,Ux=class{fs;bridge;callbacks;availableSprinkles=new Map;watcherUnsub;openSprinkles=new Map;constructor(e,t,n,r){this.fs=e,this.bridge=new Ph(e,t,e=>this.close(e),r),this.callbacks=n}async restoreOpenSprinkles(){try{let e=localStorage.getItem(Hx);if(!e){for(let e of this.availableSprinkles.values())if(e.autoOpen)try{await this.open(e.name)}catch{Vx.warn(`Failed to auto-open sprinkle`,{name:e.name})}return}let t=JSON.parse(e);for(let e of t)try{await this.open(e)}catch{Vx.warn(`Failed to restore sprinkle`,{name:e})}}catch{}}persistOpenSprinkles(){try{localStorage.setItem(Hx,JSON.stringify([...this.openSprinkles.keys()]))}catch{}}async openNewAutoOpenSprinkles(){await this.refresh();for(let e of this.availableSprinkles.values())if(e.autoOpen&&!this.openSprinkles.has(e.name))try{await this.open(e.name),Vx.info(`Auto-opened new sprinkle after install`,{name:e.name})}catch{Vx.warn(`Failed to auto-open new sprinkle`,{name:e.name})}}async refresh(){this.availableSprinkles=await Ix(this.fs),Vx.info(`Discovered sprinkles`,{count:this.availableSprinkles.size})}async open(e,t){if(this.openSprinkles.has(e)){Vx.info(`Sprinkle already open`,{name:e});return}let n=this.availableSprinkles.get(e);if(n||=(await this.refresh(),this.availableSprinkles.get(e)),!n)throw Error(`Sprinkle not found: ${e}`);let r=await this.fs.readFile(n.path,{encoding:`utf-8`}),i=document.createElement(`div`);i.className=`sprinkle-panel`,i.style.cssText=`width: 100%; height: 100%; display: flex; flex-direction: column; overflow: hidden;`,i.dataset.sprinkle=e,this.openSprinkles.set(e,{renderer:null,container:i}),this.callbacks.addSprinkle(e,n.title,i,t);let a=new si(i,this.bridge.createAPI(e));await a.render(r,e),this.openSprinkles.get(e).renderer=a,this.persistOpenSprinkles(),Zv(e),Vx.info(`Sprinkle opened`,{name:e,title:n.title})}close(e){let t=this.openSprinkles.get(e);t&&(t.renderer?.dispose(),t.container.remove(),this.bridge.removeSprinkle(e),this.openSprinkles.delete(e),this.callbacks.removeSprinkle(e),this.persistOpenSprinkles(),Vx.info(`Sprinkle closed`,{name:e}))}available(){return Array.from(this.availableSprinkles.values())}opened(){return Array.from(this.openSprinkles.keys())}setupWatcher(e){this.watcherUnsub=e.watch(`/workspace`,e=>e.endsWith(`.shtml`),()=>void this.refresh())}dispose(){this.watcherUnsub?.()}sendToSprinkle(e,t){let n=this.openSprinkles.get(e);if(!n){Vx.warn(`Cannot send to closed sprinkle`,{name:e});return}this.bridge.pushUpdate(e,t),n.renderer.pushUpdate(t)}};async function Wx(e,t,n){let r=[],i=[];for(let{path:a,handle:o}of e){let e=typeof o?.name==`string`?o.name:``;if(!o||!(`queryPermission`in o)){i.push({path:a,dirName:e});continue}let s;try{s=await o.queryPermission({mode:`readwrite`})}catch(t){n?.warn?.(`queryPermission threw on persisted handle`,{path:a,error:t instanceof Error?t.message:String(t)}),i.push({path:a,dirName:e});continue}if(s!==`granted`){i.push({path:a,dirName:e});continue}try{await t.mount(a,o),n?.info?.(`Restored mount from previous session`,{path:a,name:e}),r.push({path:a,dirName:e})}catch(t){n?.warn?.(`Failed to re-mount persisted handle`,{path:a,error:t instanceof Error?t.message:String(t)}),i.push({path:a,dirName:e})}}return{restored:r,needsRecovery:i}}function Gx(e){return`'${e.replace(/'/g,`'\\''`)}'`}function Kx(e){let t=e.replace(/\r\n|[\r\n]/g,` `),n=t.match(/`+/g),r=n?Math.max(...n.map(e=>e.length))+1:1,i="`".repeat(r);return`${i}${t.startsWith("`")||t.endsWith("`")?` ${t} `:t}${i}`}function qx(e){if(!Array.isArray(e)||e.length===0)return null;let t=e.map(({path:e,dirName:t})=>{let n=t?` (previously mounted from ${Kx(t)})`:``;return`- ${Kx(e)}${n}`}),n=e.map(({path:e})=>` mount ${Gx(e)}`),r=e.length===1?`mount point`:`mount points`,i=e.length===1?`it`:`them`;return[`[Session Reload] Mount recovery required for ${e.length} ${r}.`,``,`The page was reloaded and the following ${r} lost filesystem permission. The browser cannot restore access without a fresh user gesture, so ${i} cannot be used until the user re-authorizes:`,``,...t,``,`Please tell the user what happened and ask whether they want to re-mount. If yes, run the corresponding command(s) so the folder picker opens and they can re-select the same directory:`,``,...n,``,"If the user no longer needs a mount, run `mount unmount <path>` (with the path shell-quoted the same way) to clear the stale entry instead."].join(`
|
|
13267
|
+
`)}var $=n(`main`),Jx=`slicc-pending-mount`,Yx=`pendingMount`;async function Xx(e){let t=await new Promise((e,t)=>{let n=indexedDB.open(Jx,1);n.onupgradeneeded=()=>n.result.createObjectStore(`handles`),n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)}),n=t.transaction(`handles`,`readwrite`);n.objectStore(`handles`).put(e,Yx),await new Promise(e=>n.oncomplete=()=>e()),t.close()}async function Zx(e){let t;try{t=await new Promise((e,t)=>{let n=indexedDB.open(Jx,1);n.onsuccess=()=>e(n.result),n.onerror=()=>t(n.error)})}catch{return}let n=t.transaction(`handles`,`readwrite`),r=await new Promise(e=>{let t=n.objectStore(`handles`).get(Yx);t.onsuccess=()=>e(t.result),t.onerror=()=>e(void 0)});if(r){n.objectStore(`handles`).delete(Yx),await new Promise(e=>n.oncomplete=()=>e());let t=`/mnt/${r.name}`;await e.mount(t,r),$.info(`Mounted folder from welcome onboarding`,{name:r.name,path:t})}t.close()}function Qx(){let e=document.createElement(`div`);e.className=`skill-drop-overlay`;let t=document.createElement(`div`);t.className=`skill-drop-overlay__card`;let n=document.createElement(`div`);n.className=`skill-drop-overlay__title`,t.appendChild(n);let r=document.createElement(`div`);return r.className=`skill-drop-overlay__desc`,t.appendChild(r),e.appendChild(t),document.body.appendChild(e),{show(t,i){n.textContent=t,r.textContent=i,e.classList.add(`skill-drop-overlay--visible`)},hide(){e.classList.remove(`skill-drop-overlay--visible`)}}}function $x(){let e=document.createElement(`div`);return e.className=`skill-drop-toast-container`,document.body.appendChild(e),(t,n)=>{let r=document.createElement(`div`);r.className=`skill-drop-toast skill-drop-toast--${n}`,r.textContent=t,e.appendChild(r),requestAnimationFrame(()=>r.classList.add(`skill-drop-toast--visible`)),window.setTimeout(()=>{r.classList.remove(`skill-drop-toast--visible`),window.setTimeout(()=>r.remove(),180)},4200)}}function eS(e,t,n){let r=Qx(),i=0,a=!1,o=()=>{i=0,a||r.hide()};window.addEventListener(`dragenter`,e=>{_a(e.dataTransfer)&&(e.preventDefault(),i+=1,a||r.show(`Drop .skill to install`,`Unpack into /workspace/skills/{name}.`))}),window.addEventListener(`dragover`,e=>{_a(e.dataTransfer)&&(e.preventDefault(),e.dataTransfer&&(e.dataTransfer.dropEffect=`copy`),a||r.show(`Drop .skill to install`,`Unpack into /workspace/skills/{name}.`))}),window.addEventListener(`dragleave`,()=>{i!==0&&(i=Math.max(0,i-1),i===0&&!a&&r.hide())}),window.addEventListener(`dragend`,o),window.addEventListener(`blur`,o),window.addEventListener(`drop`,async s=>{let c=va(s.dataTransfer);if(!c){o();return}if(s.preventDefault(),i=0,a){r.hide(),t(`Another .skill installation is already in progress.`,`error`);return}a=!0,r.show(`Installing skill…`,c.name);try{let r=await ue(e,c);await n(),t(`Installed "${r.skillName}" to ${r.destinationPath} (${r.fileCount} files). Run "skill install ${r.skillName}" to apply it.`,`success`)}catch(e){t(`Failed to install dropped skill: ${e instanceof Error?e.message:String(e)}`,`error`)}finally{a=!1,r.hide()}})}async function tS(e){let{OffscreenClient:t}=await r(async()=>{let{OffscreenClient:e}=await import(`./offscreen-client-vFDPYD-S.js`);return{OffscreenClient:e}},__vite__mapDeps([25,17])),{VirtualFS:n}=await r(async()=>{let{VirtualFS:e}=await import(`./fs-DUWoGzSN.js`).then(e=>e.t);return{VirtualFS:e}},__vite__mapDeps([22,4,17,23])),{publishAgentBridgeProxy:i}=await r(async()=>{let{publishAgentBridgeProxy:e}=await import(`./agent-bridge-BQWM5sQP.js`);return{publishAgentBridgeProxy:e}},[]),a=new ea(e,!0);window.__slicc_debug_tabs=e=>a.setDebugTabs(e),await a.panels.chat.initSession(`session-cone`),i();let o=null,s=await n.create({dbName:`slicc-fs`});a.panels.fileBrowser.setFs(s),$.info(`File browser wired to shared VFS (local IndexedDB)`);let l=new BroadcastChannel(`preview-vfs`);l.onmessage=e=>{if(e.data?.type!==`preview-vfs-read`)return;let{id:t,path:n,asText:r}=e.data;(async()=>{try{let e=r?`utf-8`:`binary`,i=await s.readFile(n,{encoding:e});l.postMessage({type:`preview-vfs-response`,id:t,content:i})}catch(e){let r=e instanceof Error?e.message:String(e);r.includes(`ENOENT`)||$.error(`Preview VFS read failed`,{path:n,error:r}),l.postMessage({type:`preview-vfs-response`,id:t,error:r})}})()},eS(s,$x(),async()=>{await a.panels.fileBrowser.refresh()});try{let{WasmShell:e}=await r(async()=>{let{WasmShell:e}=await import(`./shell-DKDHQ8Ux.js`);return{WasmShell:e}},[]),{PanelCdpProxy:t,BrowserAPI:n}=await r(async()=>{let{PanelCdpProxy:e,BrowserAPI:t}=await import(`./cdp-CtEFOd-O.js`).then(e=>e.t);return{PanelCdpProxy:e,BrowserAPI:t}},__vite__mapDeps([26,4,1,17])),{fetchSecretEnvVars:i}=await r(async()=>{let{fetchSecretEnvVars:e}=await import(`./secret-env-D4m7q3Dc.js`);return{fetchSecretEnvVars:e}},[]),o=new t;await o.connect();let c=new n(o),l=await i(),u=new e({fs:s,browserAPI:c,env:Object.keys(l).length>0?l:void 0});await a.panels.terminal.mountShell(u),$.info(`Terminal mounted with shared VFS and BrowserAPI (CDP proxy)`)}catch(e){$.warn(`Failed to mount shell to terminal`,e)}{let{registerSessionCostsProvider:e}=await r(async()=>{let{registerSessionCostsProvider:e}=await import(`./cost-command-CGzKvuNW.js`).then(e=>e.t);return{registerSessionCostsProvider:e}},__vite__mapDeps([27,4]));e(()=>new Promise(e=>{chrome.runtime.sendMessage({source:`panel`,payload:{type:`get-session-costs`}},t=>{if(chrome.runtime.lastError||!t?.ok){e([]);return}e(t.costs??[])})}))}let u,d=new Set,f=async e=>{o=e,u.selectedScoopJid=e.jid,a.panels.memory.setSelectedScoop(e.jid),a.setScoopSwitcherSelected?.(e.jid),a.panels.scoops.setSelectedJid(e.jid);let t=e.isCone?`session-cone`:`session-${e.folder}`,n=e.isCone?void 0:e.name;await a.panels.chat.switchToContext(t,!e.isCone,n),u.isProcessing(e.jid)&&a.panels.chat.setProcessing(!0)};u=new t({onStatusChange:(e,t)=>{a.panels.scoops.updateScoopStatus(e,t),a.updateScoopSwitcherStatus?.(e,t),o?.jid===e&&(a.setAgentProcessing(t===`processing`),t===`processing`?a.panels.chat.setProcessing(!0):t===`ready`&&a.panels.chat.setProcessing(!1))},onScoopCreated:e=>{a.panels.scoops.refreshScoops(),a.refreshScoopSwitcher?.(),o||(o=e,u.selectedScoopJid=e.jid,a.panels.memory.setSelectedScoop(e.jid))},onScoopListUpdate:()=>{let e=new Set(u.getScoops().map(e=>e.folder));for(let t of d)e.has(t)||a.panels.chat.deleteSessionById(`session-${t}`);if(d=e,a.panels.scoops.refreshScoops(),a.refreshScoopSwitcher?.(),!o){let e=u.getScoops().find(e=>e.isCone);e&&(o=e,u.selectedScoopJid=e.jid,a.panels.memory.setSelectedScoop(e.jid))}},onIncomingMessage:(e,t)=>{if(o?.jid===e){let e=t.channel===`delegation`?`**[Instructions from sliccy]**\n\n${t.content}`:t.content;a.panels.chat.addUserMessage(e)}},onReady:async()=>{try{$.info(`Offscreen engine ready, scoop count:`,u.getScoops().length),window.localStorage.getItem(`slicc.trayJoinUrl`)&&chrome.runtime.sendMessage({source:`panel`,payload:{type:`refresh-tray-runtime`}}).catch(()=>{});let e=o??u.getScoops().find(e=>e.isCone)??u.getScoops()[0];e&&(o=e,u.selectedScoopJid=e.jid,await f(e))}catch(e){$.error(`Failed to initialize on ready`,{error:e instanceof Error?e.message:String(e)})}}}),u.setLocalFS(s);let p=u.createAgentHandle();a.panels.chat.setAgent(p),a.panels.scoops.setOrchestrator(u),a.panels.memory.setOrchestrator(u),a.setScoopSwitcherOrchestrator?.(u),a.onScoopSelect=f,a.onModelChange=e=>{localStorage.setItem(`selected-model`,e),u.updateModel()},a.onClearChat=async()=>{let e=u.getScoops();for(let t of e){let e=t.isCone?`session-cone`:`session-${t.folder}`;await a.panels.chat.deleteSessionById(e)}u.clearAllMessages()},a.onClearFilesystem=async()=>{u.clearFilesystem()},a.panels.chat.onInlineSprinkleLick=(e,t)=>{u.sendSprinkleLick(`inline`,{action:e,data:t})};let m=new Ux(s,async e=>{if(e.type===`sprinkle`){if(e.sprinkleName===`welcome`){let t=e.body,n=t?.action;(n===`onboarding-complete`||n===`shortcut-migrate`)&&s.writeFile(`/shared/.welcomed`,`1`).catch(e=>$.warn(`Failed to persist welcome completion marker`,e)),n===`shortcut-migrate`&&m.close(`welcome`),n===`onboarding-complete`&&t?.data?.mountWorkspace&&Zx(s).catch(e=>$.warn(`Failed to mount workspace from onboarding`,e))}if(e.sprinkleName===`welcome`&&e.body?.action===`request-mount`){try{let e=window;if(!e.showDirectoryPicker)throw Error(`showDirectoryPicker not supported`);let t=await e.showDirectoryPicker({mode:`readwrite`});await Xx(t),m.sendToSprinkle(`welcome`,{action:`mount-complete`,dirName:t.name})}catch(e){e.name!==`AbortError`&&$.warn(`Mount picker failed`,e),m.sendToSprinkle(`welcome`,{action:`mount-cancelled`})}return}u.sendSprinkleLick(e.sprinkleName,e.body,e.targetScoop)}},{addSprinkle:(e,t,n,r)=>a.addSprinkle(e,t,n,r),removeSprinkle:e=>a.removeSprinkle(e)},()=>{let e=u.getScoops().find(e=>e.isCone);e&&u.stopScoop(e.jid)});if(window.__slicc_sprinkleManager=m,window.__slicc_reloadSkills=()=>(chrome.runtime.sendMessage({source:`panel`,payload:{type:`reload-skills`}}),Promise.resolve()),u.setSprinkleOpHandler(e=>{let{id:t,op:n,name:r,data:i}=e;console.log(`[main-ext] sprinkle-op handler called`,{id:t,op:n,name:r}),(async()=>{try{let e;switch(n){case`list`:await m.refresh(),e=m.available();break;case`opened`:e=m.opened();break;case`refresh`:await m.refresh(),e=m.available().length;break;case`open`:await m.open(r),e=!0;break;case`close`:m.close(r),e=!0;break;case`send`:m.sendToSprinkle(r,i),e=!0;break;case`openNewAutoOpen`:await m.openNewAutoOpenSprinkles(),e=!0;break}console.log(`[main-ext] sprinkle-op response sending`,{id:t,op:n,result:typeof e}),chrome.runtime.sendMessage({source:`panel`,payload:{type:`sprinkle-op-response`,id:t,result:e}}).catch(()=>{})}catch(e){chrome.runtime.sendMessage({source:`panel`,payload:{type:`sprinkle-op-response`,id:t,error:e instanceof Error?e.message:String(e)}}).catch(()=>{})}})()}),await m.refresh(),a.onSprinkleClose=e=>m.close(e),a.getAvailableSprinkles=()=>{let e=new Set(m.opened());return m.available().filter(t=>!e.has(t.name)).map(e=>({name:e.name,title:e.title}))},a.onOpenSprinkle=(e,t)=>m.open(e,t),a.updateAddButtons(),await m.restoreOpenSprinkles(),!await s.exists(`/shared/.welcomed`)&&localStorage.getItem(`slicc-welcomed`)&&(await s.writeFile(`/shared/.welcomed`,`1`).catch(()=>{}),localStorage.removeItem(`slicc-welcomed`)),!await s.exists(`/shared/.welcomed`)&&!c(window.localStorage)&&m.available().some(e=>e.name===`welcome`))try{await m.open(`welcome`)}catch(e){$.warn(`Failed to open welcome sprinkle`,e)}$.info(`SprinkleManager initialized (extension mode)`),u.requestState(),$.info(`Extension UI connected to offscreen agent engine`),Jv().catch(()=>{})}function nS(){if(typeof chrome<`u`&&chrome?.runtime?.id)return;let e=new Blob([`
|
|
13267
13268
|
let lastPong = Date.now();
|
|
13268
13269
|
let frozen = false;
|
|
13269
13270
|
setInterval(() => {
|
|
@@ -13283,7 +13284,7 @@ ${t}
|
|
|
13283
13284
|
}
|
|
13284
13285
|
}
|
|
13285
13286
|
};
|
|
13286
|
-
`],{type:`application/javascript`}),t=URL.createObjectURL(e),n=new Worker(t);URL.revokeObjectURL(t),n.onmessage=e=>{if(e.data.type===`ping`)n.postMessage({type:`pong`});else if(e.data.type===`freeze-detected`)console.error(`[freeze-watchdog] Main thread blocked for ${e.data.elapsed}ms — capturing trace on recovery`);else if(e.data.type===`freeze-recovered`){console.error(`[freeze-watchdog] Main thread recovered. Stack trace at recovery point:`),console.trace(`[freeze-watchdog] recovery stack`);let e=performance.getEntriesByType(`longtask`);e.length>0&&console.error(`[freeze-watchdog] Long tasks:`,e.map(e=>({duration:e.duration,startTime:e.startTime,name:e.name})))}},window.addEventListener(`beforeunload`,()=>{n.terminate()},{once:!0})}async function
|
|
13287
|
+
`],{type:`application/javascript`}),t=URL.createObjectURL(e),n=new Worker(t);URL.revokeObjectURL(t),n.onmessage=e=>{if(e.data.type===`ping`)n.postMessage({type:`pong`});else if(e.data.type===`freeze-detected`)console.error(`[freeze-watchdog] Main thread blocked for ${e.data.elapsed}ms — capturing trace on recovery`);else if(e.data.type===`freeze-recovered`){console.error(`[freeze-watchdog] Main thread recovered. Stack trace at recovery point:`),console.trace(`[freeze-watchdog] recovery stack`);let e=performance.getEntriesByType(`longtask`);e.length>0&&console.error(`[freeze-watchdog] Long tasks:`,e.map(e=>({duration:e.duration,startTime:e.startTime,name:e.name})))}},window.addEventListener(`beforeunload`,()=>{n.terminate()},{once:!0})}async function rS(){nS(),oa(),ma();let e=document.getElementById(`app`);if(!e)throw Error(`#app element not found`);`serviceWorker`in navigator&&navigator.serviceWorker.register(`/preview-sw.js`,{scope:`/preview/`}).then(()=>$.info(`Preview SW registered`)).catch(e=>$.error(`Preview SW registration failed — preview feature will not work`,e)),k();let t=T(),n=c(window.localStorage);if(!t&&!n){let e=window.location.port===`5710`||window.location.port===`3000`;window.location.port===``&&window.location.pathname.includes(`/join/`)?await ne({autoJoinUrl:window.location.origin+window.location.pathname}):!e&&window.location.port!==``?await ne({preferTrayJoin:!0}):await ne(),t=T()}let a=!t&&c(window.localStorage),o=typeof chrome<`u`&&!!chrome?.runtime?.id,l=Dx(window.location.href,o);if(l===`extension`)return tS(e);let u=new ea(e,l===`electron-overlay`);if(l===`electron-overlay`){let e=kx(window.location.href);u.setActiveTab(e);let t=document.createElement(`style`);t.id=`slicc-electron-overlay-runtime-style`,t.textContent=`
|
|
13287
13288
|
#app > .tab-bar { display: none !important; }
|
|
13288
13289
|
#app > .tab-content {
|
|
13289
13290
|
height: calc(100vh - var(--s2-header-height));
|
|
@@ -13291,4 +13292,4 @@ ${t}
|
|
|
13291
13292
|
#app > .tab-content > .tab-content__panel {
|
|
13292
13293
|
height: 100%;
|
|
13293
13294
|
}
|
|
13294
|
-
`,document.head.appendChild(t),window.addEventListener(`message`,e=>{e.source===window.parent&&Px(e.data)&&u.setActiveTab(kx(`http://localhost/?tab=${e.data.tab??``}`))}),window.addEventListener(`keydown`,e=>{e.code===`Semicolon`&&(e.metaKey||e.ctrlKey)&&!e.shiftKey&&!e.altKey&&!e.repeat&&(e.preventDefault(),e.stopPropagation(),window.parent.postMessage({type:`slicc-electron-overlay:toggle`},`*`))},!0)}let f=Yx();await u.panels.chat.initSession(`session-cone`),$.info(`Session initialized`);let p=new me,m=new Set,h=e=>{$.debug(`Emit to UI`,{type:e.type,listenerCount:m.size});for(let t of m)try{t(e)}catch(t){$.error(`Listener error`,{eventType:e.type,error:t instanceof Error?t.message:String(t)})}},_=null,v=new Map,y=new Map;function b(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function x(e){let t=y.get(e);return t||(t=[],y.set(e,t)),t}function S(e,t){let n=x(e),r=v.get(e);if(r){let e=n.find(e=>e.id===r);if(e)return e}r=`scoop-${e}-${b()}`,v.set(e,r);let i=C.getScoops().find(t=>t.jid===e),a=i?.isCone?`cone`:i?.name??`unknown`,o={id:r,role:`assistant`,content:``,timestamp:Date.now(),toolCalls:[],isStreaming:!0,source:a,channel:t};return n.push(o),_?.jid===e&&h({type:`message_start`,messageId:r}),o}let C=new _b(u.getIframeContainer(),{onResponse:(e,t,n)=>{let r=S(e);n?r.content+=t:(r.content=t,r.isStreaming=!1),_?.jid===e&&(h({type:`content_delta`,messageId:r.id,text:t}),n||h({type:`content_done`,messageId:r.id}))},onResponseDone:e=>{let t=x(e),n=v.get(e);if(n){let r=t.find(e=>e.id===n);r&&(r.isStreaming=!1),_?.jid===e&&h({type:`content_done`,messageId:n}),v.delete(e)}},onSendMessage:(e,t)=>{$.debug(`Send message requested`,{targetJid:e,textLength:t.length});let n=`msg-${b()}`,r={id:n,chatJid:e,senderId:`assistant`,senderName:`sliccy`,content:t,timestamp:new Date().toISOString(),fromAssistant:!0,channel:`web`};C.handleMessage(r),x(e).push({id:n,role:`assistant`,content:t,timestamp:Date.now()}),_?.jid===e&&(h({type:`message_start`,messageId:n}),h({type:`content_delta`,messageId:n,text:t}),h({type:`content_done`,messageId:n}))},onStatusChange:(e,t)=>{if(u.panels.scoops.updateScoopStatus(e,t),u.updateScoopSwitcherStatus?.(e,t),_?.jid===e){if(u.setAgentProcessing(t===`processing`),t===`processing`)u.panels.chat.setProcessing(!0);else if(t===`ready`){u.panels.chat.setProcessing(!1);let t=v.get(e)??`done-${e}-${b()}`;v.delete(e),h({type:`turn_end`,messageId:t})}}},onError:(e,t)=>{$.error(`Scoop error`,{scoopJid:e,error:t}),_?.jid===e&&h({type:`error`,error:t})},getBrowserAPI:()=>p,onToolStart:(e,t,n)=>{if(new Set([`send_message`,`list_scoops`,`list_tasks`]).has(t))return;let r=S(e);r.toolCalls||=[],r.toolCalls.push({id:b(),name:t,input:n}),_?.jid===e&&h({type:`tool_use_start`,messageId:r.id,toolName:t,toolInput:n})},onToolEnd:(e,t,n,r)=>{if(new Set([`send_message`,`list_scoops`,`list_tasks`]).has(t))return;let i=x(e),a=v.get(e);if(a){let e=i.find(e=>e.id===a);if(e?.toolCalls){let i=[...e.toolCalls].reverse().find(e=>e.name===t&&e.result===void 0);i&&(i.result=n,i.isError=r)}}_?.jid===e&&a&&h({type:`tool_result`,messageId:a,toolName:t,result:n,isError:r})},onToolUI:(e,t,n,r)=>{let i=v.get(e);i?h({type:`tool_ui`,messageId:i,toolName:t,requestId:n,html:r}):$.warn(`Cannot emit tool_ui - no message ID for scoop`,{scoopJid:e,requestId:n})},onToolUIDone:(e,t)=>{let n=v.get(e);n&&h({type:`tool_ui_done`,messageId:n,requestId:t})},onIncomingMessage:(e,t)=>{let n={id:t.id,role:`user`,content:t.channel===`delegation`?`**[Instructions from sliccy]**\n\n${t.content}`:t.content,timestamp:new Date(t.timestamp).getTime(),source:t.channel===`delegation`?`delegation`:void 0,channel:t.channel};x(e).push(n),_?.jid===e&&(h({type:`message_start`,messageId:t.id}),h({type:`content_delta`,messageId:t.id,text:n.content}),h({type:`content_done`,messageId:t.id}))}});await C.init(),u.panels.scoops.setOrchestrator(C),u.panels.memory.setOrchestrator(C),u.setScoopSwitcherOrchestrator?.(C);{let e=C.getSharedFS();e?Ib(C,e,C.getSessionStore()):$.warn(`AgentBridge not published — orchestrator.getSharedFS() returned null`)}let w=C.getSharedFS();if(w){u.panels.fileBrowser.setFs(w),$.info(`File browser wired to shared VFS`);let e=new BroadcastChannel(`preview-vfs`);e.onmessage=t=>{if(t.data?.type!==`preview-vfs-read`)return;let{id:n,path:r,asText:i}=t.data;(async()=>{try{let t=i?`utf-8`:`binary`,a=await w.readFile(r,{encoding:t});e.postMessage({type:`preview-vfs-response`,id:n,content:a})}catch(t){let i=t instanceof Error?t.message:String(t);i.includes(`ENOENT`)||$.error(`Preview VFS read failed`,{path:r,error:i}),e.postMessage({type:`preview-vfs-response`,id:n,error:i})}})()},Xx(w,(e,t)=>{t===`error`?$.warn(`Dropped skill install failed`,{message:e}):$.info(`Dropped skill installed`,{message:e}),f(e,t)},async()=>{await u.panels.fileBrowser.refresh()});try{let{WasmShell:e}=await r(async()=>{let{WasmShell:e}=await import(`./shell-1lwva6GM.js`);return{WasmShell:e}},[]),{fetchSecretEnvVars:t}=await r(async()=>{let{fetchSecretEnvVars:e}=await import(`./secret-env-Zk-sdab2.js`);return{fetchSecretEnvVars:e}},[]),n=await t(),i=new e({fs:w,browserAPI:p,env:Object.keys(n).length>0?n:void 0});await u.panels.terminal.mountShell(i),$.info(`Terminal mounted with shared VFS`);try{let{BshWatchdog:e}=await r(async()=>{let{BshWatchdog:e}=await import(`./bsh-watchdog-XFikI_DX.js`);return{BshWatchdog:e}},__vite__mapDeps([28,17])),t=new e({browserAPI:p,scriptCatalog:i.getScriptCatalog(),fs:w});t.start(),window.addEventListener(`beforeunload`,()=>t.stop(),{once:!0}),$.info(`BSH navigation watchdog started`)}catch(e){$.warn(`Failed to start BSH watchdog`,e)}}catch(e){$.warn(`Failed to mount shell to terminal`,e)}}let E=C.getScoops(),D=E.some(e=>e.isCone);if(a)$.info(`Skipping local cone bootstrap while joining a tray without a configured provider`);else if(!D)_=await u.panels.scoops.createCone(),$.info(`Created cone`);else{let e=new URLSearchParams(window.location.search).get(`scoop`);if(e){let t=E.find(t=>t.folder===e);t?(_=t,$.info(`Restored scoop from URL`,{folder:e})):_=E.find(e=>e.isCone)??E[0]}else _=E.find(e=>e.isCone)??E[0]}_&&u.panels.memory.setSelectedScoop(_.jid);let O=null,A={sendMessage(e,t){if(!_){h({type:`error`,error:`No scoop selected`});return}let n={id:t??`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,chatJid:_.jid,senderId:`user`,senderName:`User`,content:e,timestamp:new Date().toISOString(),fromAssistant:!1,channel:`web`};x(_.jid).push({id:n.id,role:`user`,content:e,timestamp:Date.now()}),O?.broadcastUserMessage(e,n.id),C.handleMessage(n),C.createScoopTab(_.jid)},onEvent(e){return m.add(e),()=>m.delete(e)},stop(){_&&(C.stopScoop(_.jid),C.clearQueuedMessages(_.jid).catch(e=>{$.error(`Failed to clear queued messages on stop`,{error:e instanceof Error?e.message:String(e)})}))}};u.panels.chat.setAgent(A),u.panels.chat.setDeleteQueuedMessageCallback(e=>{if(_){C.deleteQueuedMessage(_.jid,e).catch(t=>{$.error(`Failed to delete queued message`,{messageId:e,error:t instanceof Error?t.message:String(t)})});let t=y.get(_.jid);if(t){let n=t.findIndex(t=>t.id===e);n!==-1&&t.splice(n,1)}}}),$.info(`Cone agent handle wired to chat UI`);let{getLickManager:ee}=await r(async()=>{let{getLickManager:e}=await import(`./lick-manager-BmCjku48.js`);return{getLickManager:e}},[]),j=ee();await j.init(),C.setLickManager(j);let te=e=>{let t=e.type===`webhook`,n=e.type===`sprinkle`,r=e.type===`fswatch`,i=e.type===`session-reload`,a=e.type===`navigate`,o=t?e.webhookName:n?e.sprinkleName:r?e.fswatchName:i?`session-reload`:a?e.navigateUrl:e.cronName,s=t?e.webhookId:n?e.sprinkleName:r?e.fswatchId:i?`session-reload`:a?e.navigateUrl:e.cronId,c=e.type;if($.debug(`Lick event`,{type:e.type,name:o,targetScoop:e.targetScoop}),n&&e.sprinkleName===`welcome`){let t=e.body,n=t?.action;(n===`onboarding-complete`||n===`shortcut-migrate`)&&w?.writeFile(`/shared/.welcomed`,`1`).catch(e=>$.warn(`Failed to persist welcome marker`,e)),n===`shortcut-migrate`&&M?.close(`welcome`),n===`onboarding-complete`&&t?.data?.mountWorkspace&&w&&qx(w).catch(e=>$.warn(`Failed to mount workspace from onboarding`,e))}if(n&&e.sprinkleName===`welcome`&&e.body?.action===`request-mount`){(async()=>{try{let e=window;if(!e.showDirectoryPicker)throw Error(`showDirectoryPicker not supported`);let t=await e.showDirectoryPicker({mode:`readwrite`});await Kx(t),M?.sendToSprinkle(`welcome`,{action:`mount-complete`,dirName:t.name})}catch(e){e.name!==`AbortError`&&$.warn(`Mount picker failed`,e),M?.sendToSprinkle(`welcome`,{action:`mount-cancelled`})}})();return}let l=C.getScoops(),d;if(d=e.targetScoop?l.find(t=>t.name===e.targetScoop||t.folder===e.targetScoop||t.folder===`${e.targetScoop}-scoop`):l.find(e=>e.isCone),d){let l=`${c}-${s}-${Date.now()}`,f=`[${t?`Webhook Event`:n?`Sprinkle Event`:r?`File Watch Event`:i?`Session Reload`:a?`Navigate Event`:`Cron Event`}: ${o}]\n\`\`\`json\n${JSON.stringify(e.body,null,2)}\n\`\`\``,p={id:l,chatJid:d.jid,senderId:c,senderName:`${c}:${o}`,content:f,timestamp:e.timestamp,fromAssistant:!1,channel:c};x(d.jid).push({id:l,role:`user`,content:f,timestamp:Date.now(),source:`lick`,channel:c}),_?.jid===d.jid&&u.panels.chat.addLickMessage(l,f,c),$.info(`Routing lick to scoop`,{type:c,name:o,scoopJid:d.jid}),C.handleMessage(p)}else $.warn(`Lick target scoop not found`,{targetScoop:e.targetScoop})};j.setEventHandler(te);let re=new _e(p.getTransport(),e=>{j.emitEvent({type:`navigate`,navigateUrl:e.url,targetScoop:void 0,timestamp:new Date().toISOString(),body:{url:e.url,sliccHeader:e.sliccHeader,title:e.title}})});(async()=>{try{await p.connect(),await re.start(),$.info(`Navigation watcher started`)}catch(e){$.warn(`Failed to start navigation watcher`,{error:e instanceof Error?e.message:String(e)})}})(),w&&ae().then(async e=>{if(e.length===0)return;let t=[];for(let{path:n,handle:r}of e)try{if(!(`queryPermission`in r)){t.push({path:n,dirName:r.name});continue}await r.queryPermission({mode:`readwrite`})===`granted`?(await w.mount(n,r),$.info(`Restored mount from previous session`,{path:n,name:r.name})):t.push({path:n,dirName:r.name})}catch{t.push({path:n,dirName:r.name})}t.length>0&&te({type:`session-reload`,targetScoop:void 0,timestamp:new Date().toISOString(),body:{reason:`mount-recovery`,mounts:t}})}).catch(e=>$.warn(`Failed to restore persisted mounts`,e)),u.panels.chat.onInlineSprinkleLick=(e,t)=>{te({type:`sprinkle`,sprinkleName:`inline`,targetScoop:void 0,timestamp:new Date().toISOString(),body:{action:e,data:t}})};let M=null;if(w){if(M=new Ux(w,te,{addSprinkle:(e,t,n,r)=>u.addSprinkle(e,t,n,r),removeSprinkle:e=>u.removeSprinkle(e)},()=>{let e=C.getScoops().find(e=>e.isCone);e&&(C.stopScoop(e.jid),C.clearQueuedMessages(e.jid).catch(e=>{$.error(`Failed to clear queued messages on sprinkle stopCone`,{error:e instanceof Error?e.message:String(e)})}))}),window.__slicc_sprinkleManager=M,window.__slicc_reloadSkills=()=>C.reloadAllSkills(),await M.refresh(),u.onSprinkleClose=e=>M.close(e),u.getAvailableSprinkles=()=>{let e=new Set(M.opened());return M.available().filter(t=>!e.has(t.name)).map(e=>({name:e.name,title:e.title}))},u.onOpenSprinkle=(e,t)=>M.open(e,t),u.updateAddButtons(),!await w.exists(`/shared/.welcomed`)&&localStorage.getItem(`slicc-welcomed`)&&(await w.writeFile(`/shared/.welcomed`,`1`).catch(()=>{}),localStorage.removeItem(`slicc-welcomed`)),!await w.exists(`/shared/.welcomed`)&&!a&&M.available().some(e=>e.name===`welcome`))try{await M.open(`welcome`)}catch(e){$.warn(`Failed to open welcome sprinkle`,e)}await M.restoreOpenSprinkles(),$.info(`SprinkleManager initialized`)}let N=()=>{let e=jx(window.location.href),t=new WebSocket(e);t.onopen=()=>{$.info(`Lick WebSocket connected`)},t.onmessage=async e=>{try{let n=JSON.parse(e.data);if(n.requestId){let e;try{switch(n.type){case`list_webhooks`:e={type:`response`,requestId:n.requestId,data:j.listWebhooks()};break;case`create_webhook`:{let t=await j.createWebhook(n.name||`default`,n.scoop,n.filter),r=qp().session,i=r?.webhookUrl?Nx(r.webhookUrl,t.id):Mx(window.location.href,t.id);e={type:`response`,requestId:n.requestId,data:{...t,url:i}};break}case`delete_webhook`:e=await j.deleteWebhook(n.id)?{type:`response`,requestId:n.requestId,data:{ok:!0}}:{type:`response`,requestId:n.requestId,data:{error:`Webhook not found`}};break;case`list_crontasks`:e={type:`response`,requestId:n.requestId,data:j.listCronTasks()};break;case`create_crontask`:{if(!n.name)throw Error(`name is required`);if(!n.cron)throw Error(`cron is required`);let t=await j.createCronTask(n.name,n.cron,n.scoop,n.filter);e={type:`response`,requestId:n.requestId,data:t};break}case`delete_crontask`:e=await j.deleteCronTask(n.id)?{type:`response`,requestId:n.requestId,data:{ok:!0}}:{type:`response`,requestId:n.requestId,data:{error:`Cron task not found`}};break;case`tray_status`:{let t=qp();e={type:`response`,requestId:n.requestId,data:{state:t.state,joinUrl:t.session?.joinUrl??null,workerBaseUrl:t.session?.workerBaseUrl??null,trayId:t.session?.trayId??null}};break}default:e={type:`response`,requestId:n.requestId,error:`Unknown request type: ${n.type}`}}}catch(t){e={type:`response`,requestId:n.requestId,error:t instanceof Error?t.message:String(t)}}t.send(JSON.stringify(e));return}if(n.type===`webhook_event`&&j.handleWebhookEvent(n.webhookId,n.headers,n.body),n.type===`navigate_event`){let e=typeof n.sliccHeader==`string`?n.sliccHeader:``,t=typeof n.url==`string`&&n.url.length>0?n.url:``;e&&t&&j.emitEvent({type:`navigate`,navigateUrl:t,targetScoop:void 0,timestamp:typeof n.timestamp==`string`?n.timestamp:new Date().toISOString(),body:{url:t,sliccHeader:e,title:typeof n.title==`string`?n.title:void 0}})}}catch(e){$.error(`Failed to process lick message`,{error:e instanceof Error?e.message:String(e)})}},t.onclose=()=>{$.warn(`Lick WebSocket disconnected, reconnecting in 3s...`),setTimeout(N,3e3)},t.onerror=e=>{$.error(`Lick WebSocket error`,{error:String(e)})}};N(),u.onModelChange=e=>{localStorage.setItem(`selected-model`,e),C.updateModel()};let P=new Set;u.onClearChat=async()=>{await C.clearAllMessages(),y.clear(),P.clear()},u.onClearFilesystem=async()=>{await C.resetFilesystem()};let F=async e=>{$.info(`Scoop selected`,{jid:e.jid,name:e.name}),_=e,C.createScoopTab(e.jid),u.panels.memory.setSelectedScoop(e.jid),u.panels.scoops.setSelectedJid(e.jid);let t=e.isCone?`session-cone`:`session-${e.folder}`,n=y.get(e.jid),r=!P.has(e.jid),i=e.isCone?void 0:e.name;if(!r&&n&&n.length>0)await u.panels.chat.switchToContext(t,!e.isCone,i),u.panels.chat.loadMessages(n);else{if(await u.panels.chat.switchToContext(t,!e.isCone,i),u.panels.chat.getMessages().length===0){let t=await C.getMessagesForScoop(e.jid);for(let e of t){let t=e.channel===`webhook`||e.channel===`cron`,n=e.channel===`delegation`;t?u.panels.chat.addUserMessage(e.content):n?u.panels.chat.addUserMessage(`**[Instructions from sliccy]**\n\n${e.content}`):e.fromAssistant?(h({type:`message_start`,messageId:e.id}),h({type:`content_delta`,messageId:e.id,text:e.content}),h({type:`content_done`,messageId:e.id})):u.panels.chat.addUserMessage(e.content)}}let n=u.panels.chat.getMessages(),r=new Set(n.map(e=>e.id)),a=x(e.jid),o=a.filter(e=>!r.has(e.id));a.length=0,a.push(...n,...o),o.length>0&&u.panels.chat.loadMessages(a)}e.isCone&&C.isProcessing(e.jid)&&u.panels.chat.setProcessing(!0),P.add(e.jid)};if(u.onScoopSelect=F,_&&(C.createScoopTab(_.jid),await F(_)),l===`standalone`||l===`electron-overlay`){let e=await i(),t=Ox(l,e!==null)?s:null,n=await g({locationHref:window.location.href,storage:window.localStorage,envBaseUrl:null,defaultWorkerBaseUrl:t,runtimeConfigFetcher:async()=>e}),r=null,a=null,o=null;eg(()=>O?(e,t)=>O.sendFsRequest(e,t):r?(e,t)=>r.sendFsRequest(e,t):null),Vf(()=>O?()=>O.getBestFollowerForTeleport():null),Hf(()=>O?()=>O.getConnectedFollowers():null);let c=e=>{o&&=(clearInterval(o),null),r?.close();let t=`follower-${e.bootstrapId}`,n=new Ex(e.channel,{browserTransport:p.getTransport(),browserAPI:p,onSnapshot:e=>{u.panels.chat.loadMessages(e)},onUserMessage:e=>{u.panels.chat.addUserMessage(e)},onStatus:e=>{u.panels.chat.setProcessing(e===`processing`)},onTargetsChanged:()=>void i()});r=n,p.setTrayTargetProvider(n),u.panels.chat.setAgent(n),n.requestSnapshot();let i=async()=>{try{let e=await p.listPages();n.advertiseTargets(e.map(e=>({targetId:e.targetId,title:e.title,url:e.url})),t)}catch{}};o=setInterval(i,5e3),i(),$.info(`Follower sync wired to chat panel`,{trayId:e.trayId})},f=e=>{a?.cancel(),o&&=(clearInterval(o),null),r?.close(),r=null,a=ex({joinUrl:e,runtime:`slicc-standalone`,fetchImpl:tm()},{onConnected:e=>c(e),onReconnecting:e=>{$.info(`Follower reconnecting`,{attempt:e})},onGaveUp:e=>{$.warn(`Follower reconnect gave up`,{lastError:e})}})};if(window.addEventListener(`slicc:tray-join`,(e=>{f(e.detail.joinUrl)})),window.addEventListener(`beforeunload`,()=>{o&&clearInterval(o),r?.close(),a?.cancel()},{once:!0}),n?.joinUrl)f(n.joinUrl);else if(n?.workerBaseUrl){let e,t,r,i,a=()=>{t=new wx({browserTransport:p.getTransport(),browserAPI:p,getMessages:()=>u.panels.chat.getMessages(),getScoopJid:()=>_?.jid??`cone`,onFollowerMessage:(e,t)=>{u.panels.chat.addUserMessage(e),A.sendMessage(e,t)},onFollowerAbort:()=>{A.stop()}}),O=t,rm(()=>t.getConnectedFollowers()),p.setTrayTargetProvider(t),i&&clearInterval(i);let n=async()=>{try{let e=await p.listPages();t.setLocalTargets(e.map(e=>({targetId:e.targetId,title:e.title,url:e.url})))}catch{}};i=setInterval(n,5e3),n(),r=new Qb({sendControlMessage:t=>e.sendControlMessage(t),onPeerConnected:(e,n)=>{$.info(`Tray follower data channel opened`,{controllerId:e.controllerId,bootstrapId:e.bootstrapId,attempt:e.attempt,runtime:e.runtime}),t.addFollower(e.bootstrapId,n,{runtime:e.runtime,connectedAt:e.connectedAt??void 0})}})};a(),m.add(e=>{t.broadcastEvent(e)}),e=new Zp({workerBaseUrl:n.workerBaseUrl,runtime:`slicc-standalone`,fetchImpl:tm(),onControlMessage:e=>{if(e.type===`webhook.event`){j.handleWebhookEvent(e.webhookId,e.headers,e.body);return}r.handleControlMessage(e).catch(e=>{$.warn(`Tray leader bootstrap handling failed`,{error:e instanceof Error?e.message:String(e)})})}}),om(async()=>{t.stop(),r.stop(),e.stop(),await e.clearSession();let n=await e.start(),i=d(window.location.href,n.workerBaseUrl,n.trayId);return i!==window.location.href&&window.history.replaceState(window.history.state,``,i),a(),qp()}),e.start().then(e=>{let t=d(window.location.href,e.workerBaseUrl,e.trayId);t!==window.location.href&&window.history.replaceState(window.history.state,``,t)}).catch(e=>{$.warn(`Leader tray join failed`,{error:e instanceof Error?e.message:String(e)})}),window.addEventListener(`beforeunload`,()=>{clearInterval(i),t.stop(),r.stop(),e.stop()},{once:!0})}}$.info(`Orchestrator initialized — cone+scoops ready`,{scoopCount:C.getScoops().length}),Jv().catch(()=>{})}$x().catch(e=>{$.error(`Fatal error`,e);let t=document.getElementById(`app`);if(t){let n=document.createElement(`div`);n.style.cssText=`padding: 2rem; text-align: center;`;let r=document.createElement(`h1`);r.style.color=`var(--s2-negative, #e34850)`,r.textContent=`Failed to start`;let i=document.createElement(`p`);i.style.color=`var(--s2-content-tertiary, #717171)`,i.textContent=e.message,n.appendChild(r),n.appendChild(i);let a=document.createElement(`button`);for(a.textContent=`Reset all data & reload`,a.style.cssText=`margin-top: 1rem; padding: 0.5rem 1.5rem; background: var(--s2-negative, #e34850); color: #fff; border: none; border-radius: 6px; cursor: pointer; font-size: 14px;`,a.addEventListener(`click`,async()=>{a.disabled=!0,a.textContent=`Resetting…`;let e=await indexedDB.databases();await Promise.all(e.map(e=>e.name?new Promise(t=>{let n=indexedDB.deleteDatabase(e.name);n.onsuccess=()=>t(),n.onerror=()=>t(),n.onblocked=()=>t()}):Promise.resolve())),location.reload()}),n.appendChild(a);t.firstChild;)t.removeChild(t.firstChild);t.appendChild(n)}});export{Lb as a,hb as c,Ea as d,si as f,Ib as i,ab as l,oi as m,Pb as n,fb as o,li as p,Fb as r,pb as s,Nb as t,sy as u};
|
|
13295
|
+
`,document.head.appendChild(t),window.addEventListener(`message`,e=>{e.source===window.parent&&Px(e.data)&&u.setActiveTab(kx(`http://localhost/?tab=${e.data.tab??``}`))}),window.addEventListener(`keydown`,e=>{e.code===`Semicolon`&&(e.metaKey||e.ctrlKey)&&!e.shiftKey&&!e.altKey&&!e.repeat&&(e.preventDefault(),e.stopPropagation(),window.parent.postMessage({type:`slicc-electron-overlay:toggle`},`*`))},!0)}let f=$x();await u.panels.chat.initSession(`session-cone`),$.info(`Session initialized`);let p=new me,m=new Set,h=e=>{$.debug(`Emit to UI`,{type:e.type,listenerCount:m.size});for(let t of m)try{t(e)}catch(t){$.error(`Listener error`,{eventType:e.type,error:t instanceof Error?t.message:String(t)})}},_=null,v=new Map,y=new Map;function b(){return Date.now().toString(36)+Math.random().toString(36).slice(2,8)}function x(e){let t=y.get(e);return t||(t=[],y.set(e,t)),t}function S(e,t){let n=x(e),r=v.get(e);if(r){let e=n.find(e=>e.id===r);if(e)return e}r=`scoop-${e}-${b()}`,v.set(e,r);let i=C.getScoops().find(t=>t.jid===e),a=i?.isCone?`cone`:i?.name??`unknown`,o={id:r,role:`assistant`,content:``,timestamp:Date.now(),toolCalls:[],isStreaming:!0,source:a,channel:t};return n.push(o),_?.jid===e&&h({type:`message_start`,messageId:r}),o}let C=new _b(u.getIframeContainer(),{onResponse:(e,t,n)=>{let r=S(e);n?r.content+=t:(r.content=t,r.isStreaming=!1),_?.jid===e&&(h({type:`content_delta`,messageId:r.id,text:t}),n||h({type:`content_done`,messageId:r.id}))},onResponseDone:e=>{let t=x(e),n=v.get(e);if(n){let r=t.find(e=>e.id===n);r&&(r.isStreaming=!1),_?.jid===e&&h({type:`content_done`,messageId:n}),v.delete(e)}},onSendMessage:(e,t)=>{$.debug(`Send message requested`,{targetJid:e,textLength:t.length});let n=`msg-${b()}`,r={id:n,chatJid:e,senderId:`assistant`,senderName:`sliccy`,content:t,timestamp:new Date().toISOString(),fromAssistant:!0,channel:`web`};C.handleMessage(r),x(e).push({id:n,role:`assistant`,content:t,timestamp:Date.now()}),_?.jid===e&&(h({type:`message_start`,messageId:n}),h({type:`content_delta`,messageId:n,text:t}),h({type:`content_done`,messageId:n}))},onStatusChange:(e,t)=>{if(u.panels.scoops.updateScoopStatus(e,t),u.updateScoopSwitcherStatus?.(e,t),_?.jid===e){if(u.setAgentProcessing(t===`processing`),t===`processing`)u.panels.chat.setProcessing(!0);else if(t===`ready`){u.panels.chat.setProcessing(!1);let t=v.get(e)??`done-${e}-${b()}`;v.delete(e),h({type:`turn_end`,messageId:t})}}},onError:(e,t)=>{$.error(`Scoop error`,{scoopJid:e,error:t}),_?.jid===e&&h({type:`error`,error:t})},getBrowserAPI:()=>p,onToolStart:(e,t,n)=>{if(new Set([`send_message`,`list_scoops`,`list_tasks`]).has(t))return;let r=S(e);r.toolCalls||=[],r.toolCalls.push({id:b(),name:t,input:n}),_?.jid===e&&h({type:`tool_use_start`,messageId:r.id,toolName:t,toolInput:n})},onToolEnd:(e,t,n,r)=>{if(new Set([`send_message`,`list_scoops`,`list_tasks`]).has(t))return;let i=x(e),a=v.get(e);if(a){let e=i.find(e=>e.id===a);if(e?.toolCalls){let i=[...e.toolCalls].reverse().find(e=>e.name===t&&e.result===void 0);i&&(i.result=n,i.isError=r)}}_?.jid===e&&a&&h({type:`tool_result`,messageId:a,toolName:t,result:n,isError:r})},onToolUI:(e,t,n,r)=>{let i=v.get(e);i?h({type:`tool_ui`,messageId:i,toolName:t,requestId:n,html:r}):$.warn(`Cannot emit tool_ui - no message ID for scoop`,{scoopJid:e,requestId:n})},onToolUIDone:(e,t)=>{let n=v.get(e);n&&h({type:`tool_ui_done`,messageId:n,requestId:t})},onIncomingMessage:(e,t)=>{let n={id:t.id,role:`user`,content:t.channel===`delegation`?`**[Instructions from sliccy]**\n\n${t.content}`:t.content,timestamp:new Date(t.timestamp).getTime(),source:t.channel===`delegation`?`delegation`:void 0,channel:t.channel};x(e).push(n),_?.jid===e&&(h({type:`message_start`,messageId:t.id}),h({type:`content_delta`,messageId:t.id,text:n.content}),h({type:`content_done`,messageId:t.id}))}});await C.init(),u.panels.scoops.setOrchestrator(C),u.panels.memory.setOrchestrator(C),u.setScoopSwitcherOrchestrator?.(C);{let e=C.getSharedFS();e?Ib(C,e,C.getSessionStore()):$.warn(`AgentBridge not published — orchestrator.getSharedFS() returned null`)}let w=C.getSharedFS();if(w){u.panels.fileBrowser.setFs(w),$.info(`File browser wired to shared VFS`);let e=new BroadcastChannel(`preview-vfs`);e.onmessage=t=>{if(t.data?.type!==`preview-vfs-read`)return;let{id:n,path:r,asText:i}=t.data;(async()=>{try{let t=i?`utf-8`:`binary`,a=await w.readFile(r,{encoding:t});e.postMessage({type:`preview-vfs-response`,id:n,content:a})}catch(t){let i=t instanceof Error?t.message:String(t);i.includes(`ENOENT`)||$.error(`Preview VFS read failed`,{path:r,error:i}),e.postMessage({type:`preview-vfs-response`,id:n,error:i})}})()},eS(w,(e,t)=>{t===`error`?$.warn(`Dropped skill install failed`,{message:e}):$.info(`Dropped skill installed`,{message:e}),f(e,t)},async()=>{await u.panels.fileBrowser.refresh()});try{let{WasmShell:e}=await r(async()=>{let{WasmShell:e}=await import(`./shell-DKDHQ8Ux.js`);return{WasmShell:e}},[]),{fetchSecretEnvVars:t}=await r(async()=>{let{fetchSecretEnvVars:e}=await import(`./secret-env-D4m7q3Dc.js`);return{fetchSecretEnvVars:e}},[]),n=await t(),i=new e({fs:w,browserAPI:p,env:Object.keys(n).length>0?n:void 0});await u.panels.terminal.mountShell(i),$.info(`Terminal mounted with shared VFS`);try{let{BshWatchdog:e}=await r(async()=>{let{BshWatchdog:e}=await import(`./bsh-watchdog-XFikI_DX.js`);return{BshWatchdog:e}},__vite__mapDeps([28,17])),t=new e({browserAPI:p,scriptCatalog:i.getScriptCatalog(),fs:w});t.start(),window.addEventListener(`beforeunload`,()=>t.stop(),{once:!0}),$.info(`BSH navigation watchdog started`)}catch(e){$.warn(`Failed to start BSH watchdog`,e)}}catch(e){$.warn(`Failed to mount shell to terminal`,e)}}let E=C.getScoops(),D=E.some(e=>e.isCone);if(a)$.info(`Skipping local cone bootstrap while joining a tray without a configured provider`);else if(!D)_=await u.panels.scoops.createCone(),$.info(`Created cone`);else{let e=new URLSearchParams(window.location.search).get(`scoop`);if(e){let t=E.find(t=>t.folder===e);t?(_=t,$.info(`Restored scoop from URL`,{folder:e})):_=E.find(e=>e.isCone)??E[0]}else _=E.find(e=>e.isCone)??E[0]}_&&u.panels.memory.setSelectedScoop(_.jid);let O=null,A={sendMessage(e,t){if(!_){h({type:`error`,error:`No scoop selected`});return}let n={id:t??`msg-${Date.now()}-${Math.random().toString(36).slice(2,8)}`,chatJid:_.jid,senderId:`user`,senderName:`User`,content:e,timestamp:new Date().toISOString(),fromAssistant:!1,channel:`web`};x(_.jid).push({id:n.id,role:`user`,content:e,timestamp:Date.now()}),O?.broadcastUserMessage(e,n.id),C.handleMessage(n),C.createScoopTab(_.jid)},onEvent(e){return m.add(e),()=>m.delete(e)},stop(){_&&(C.stopScoop(_.jid),C.clearQueuedMessages(_.jid).catch(e=>{$.error(`Failed to clear queued messages on stop`,{error:e instanceof Error?e.message:String(e)})}))}};u.panels.chat.setAgent(A),u.panels.chat.setDeleteQueuedMessageCallback(e=>{if(_){C.deleteQueuedMessage(_.jid,e).catch(t=>{$.error(`Failed to delete queued message`,{messageId:e,error:t instanceof Error?t.message:String(t)})});let t=y.get(_.jid);if(t){let n=t.findIndex(t=>t.id===e);n!==-1&&t.splice(n,1)}}}),$.info(`Cone agent handle wired to chat UI`);let{getLickManager:ee}=await r(async()=>{let{getLickManager:e}=await import(`./lick-manager-D1bfS_SD.js`);return{getLickManager:e}},[]),j=ee();await j.init(),C.setLickManager(j);let te=e=>{let t=e.type===`webhook`,n=e.type===`sprinkle`,r=e.type===`fswatch`,i=e.type===`session-reload`,a=e.type===`navigate`,o=t?e.webhookName:n?e.sprinkleName:r?e.fswatchName:i?`session-reload`:a?e.navigateUrl:e.cronName,s=t?e.webhookId:n?e.sprinkleName:r?e.fswatchId:i?`session-reload`:a?e.navigateUrl:e.cronId,c=e.type;if($.debug(`Lick event`,{type:e.type,name:o,targetScoop:e.targetScoop}),n&&e.sprinkleName===`welcome`){let t=e.body,n=t?.action;(n===`onboarding-complete`||n===`shortcut-migrate`)&&w?.writeFile(`/shared/.welcomed`,`1`).catch(e=>$.warn(`Failed to persist welcome marker`,e)),n===`shortcut-migrate`&&M?.close(`welcome`),n===`onboarding-complete`&&t?.data?.mountWorkspace&&w&&Zx(w).catch(e=>$.warn(`Failed to mount workspace from onboarding`,e))}if(n&&e.sprinkleName===`welcome`&&e.body?.action===`request-mount`){(async()=>{try{let e=window;if(!e.showDirectoryPicker)throw Error(`showDirectoryPicker not supported`);let t=await e.showDirectoryPicker({mode:`readwrite`});await Xx(t),M?.sendToSprinkle(`welcome`,{action:`mount-complete`,dirName:t.name})}catch(e){e.name!==`AbortError`&&$.warn(`Mount picker failed`,e),M?.sendToSprinkle(`welcome`,{action:`mount-cancelled`})}})();return}let l=C.getScoops(),d;if(d=e.targetScoop?l.find(t=>t.name===e.targetScoop||t.folder===e.targetScoop||t.folder===`${e.targetScoop}-scoop`):l.find(e=>e.isCone),d){let l=`${c}-${s}-${Date.now()}`,f=t?`Webhook Event`:n?`Sprinkle Event`:r?`File Watch Event`:i?`Session Reload`:a?`Navigate Event`:`Cron Event`,p=null;if(i){let t=e.body;if(t?.reason===`mount-recovery`&&(p=qx(t.mounts??[]),p===null)){$.debug(`Dropping session-reload lick with empty mount-recovery list`);return}}p===null&&(p=`[${f}: ${o}]\n\`\`\`json\n${JSON.stringify(e.body,null,2)}\n\`\`\``);let m={id:l,chatJid:d.jid,senderId:c,senderName:`${c}:${o}`,content:p,timestamp:e.timestamp,fromAssistant:!1,channel:c};x(d.jid).push({id:l,role:`user`,content:p,timestamp:Date.now(),source:`lick`,channel:c}),_?.jid===d.jid&&u.panels.chat.addLickMessage(l,p,c),$.info(`Routing lick to scoop`,{type:c,name:o,scoopJid:d.jid}),C.handleMessage(m)}else $.warn(`Lick target scoop not found`,{targetScoop:e.targetScoop})};j.setEventHandler(te);let re=new _e(p.getTransport(),e=>{j.emitEvent({type:`navigate`,navigateUrl:e.url,targetScoop:void 0,timestamp:new Date().toISOString(),body:{url:e.url,sliccHeader:e.sliccHeader,title:e.title}})});(async()=>{try{await p.connect(),await re.start(),$.info(`Navigation watcher started`)}catch(e){$.warn(`Failed to start navigation watcher`,{error:e instanceof Error?e.message:String(e)})}})(),w&&ae().then(async e=>{if(e.length===0)return;let{needsRecovery:t}=await Wx(e,w,$);t.length!==0&&te({type:`session-reload`,targetScoop:void 0,timestamp:new Date().toISOString(),body:{reason:`mount-recovery`,mounts:t}})}).catch(e=>$.warn(`Failed to restore persisted mounts`,e)),u.panels.chat.onInlineSprinkleLick=(e,t)=>{te({type:`sprinkle`,sprinkleName:`inline`,targetScoop:void 0,timestamp:new Date().toISOString(),body:{action:e,data:t}})};let M=null;if(w){if(M=new Ux(w,te,{addSprinkle:(e,t,n,r)=>u.addSprinkle(e,t,n,r),removeSprinkle:e=>u.removeSprinkle(e)},()=>{let e=C.getScoops().find(e=>e.isCone);e&&(C.stopScoop(e.jid),C.clearQueuedMessages(e.jid).catch(e=>{$.error(`Failed to clear queued messages on sprinkle stopCone`,{error:e instanceof Error?e.message:String(e)})}))}),window.__slicc_sprinkleManager=M,window.__slicc_reloadSkills=()=>C.reloadAllSkills(),await M.refresh(),u.onSprinkleClose=e=>M.close(e),u.getAvailableSprinkles=()=>{let e=new Set(M.opened());return M.available().filter(t=>!e.has(t.name)).map(e=>({name:e.name,title:e.title}))},u.onOpenSprinkle=(e,t)=>M.open(e,t),u.updateAddButtons(),!await w.exists(`/shared/.welcomed`)&&localStorage.getItem(`slicc-welcomed`)&&(await w.writeFile(`/shared/.welcomed`,`1`).catch(()=>{}),localStorage.removeItem(`slicc-welcomed`)),!await w.exists(`/shared/.welcomed`)&&!a&&M.available().some(e=>e.name===`welcome`))try{await M.open(`welcome`)}catch(e){$.warn(`Failed to open welcome sprinkle`,e)}await M.restoreOpenSprinkles(),$.info(`SprinkleManager initialized`)}let N=()=>{let e=jx(window.location.href),t=new WebSocket(e);t.onopen=()=>{$.info(`Lick WebSocket connected`)},t.onmessage=async e=>{try{let n=JSON.parse(e.data);if(n.requestId){let e;try{switch(n.type){case`list_webhooks`:e={type:`response`,requestId:n.requestId,data:j.listWebhooks()};break;case`create_webhook`:{let t=await j.createWebhook(n.name||`default`,n.scoop,n.filter),r=qp().session,i=r?.webhookUrl?Nx(r.webhookUrl,t.id):Mx(window.location.href,t.id);e={type:`response`,requestId:n.requestId,data:{...t,url:i}};break}case`delete_webhook`:e=await j.deleteWebhook(n.id)?{type:`response`,requestId:n.requestId,data:{ok:!0}}:{type:`response`,requestId:n.requestId,data:{error:`Webhook not found`}};break;case`list_crontasks`:e={type:`response`,requestId:n.requestId,data:j.listCronTasks()};break;case`create_crontask`:{if(!n.name)throw Error(`name is required`);if(!n.cron)throw Error(`cron is required`);let t=await j.createCronTask(n.name,n.cron,n.scoop,n.filter);e={type:`response`,requestId:n.requestId,data:t};break}case`delete_crontask`:e=await j.deleteCronTask(n.id)?{type:`response`,requestId:n.requestId,data:{ok:!0}}:{type:`response`,requestId:n.requestId,data:{error:`Cron task not found`}};break;case`tray_status`:{let t=qp();e={type:`response`,requestId:n.requestId,data:{state:t.state,joinUrl:t.session?.joinUrl??null,workerBaseUrl:t.session?.workerBaseUrl??null,trayId:t.session?.trayId??null}};break}default:e={type:`response`,requestId:n.requestId,error:`Unknown request type: ${n.type}`}}}catch(t){e={type:`response`,requestId:n.requestId,error:t instanceof Error?t.message:String(t)}}t.send(JSON.stringify(e));return}if(n.type===`webhook_event`&&j.handleWebhookEvent(n.webhookId,n.headers,n.body),n.type===`navigate_event`){let e=typeof n.sliccHeader==`string`?n.sliccHeader:``,t=typeof n.url==`string`&&n.url.length>0?n.url:``;e&&t&&j.emitEvent({type:`navigate`,navigateUrl:t,targetScoop:void 0,timestamp:typeof n.timestamp==`string`?n.timestamp:new Date().toISOString(),body:{url:t,sliccHeader:e,title:typeof n.title==`string`?n.title:void 0}})}}catch(e){$.error(`Failed to process lick message`,{error:e instanceof Error?e.message:String(e)})}},t.onclose=()=>{$.warn(`Lick WebSocket disconnected, reconnecting in 3s...`),setTimeout(N,3e3)},t.onerror=e=>{$.error(`Lick WebSocket error`,{error:String(e)})}};N(),u.onModelChange=e=>{localStorage.setItem(`selected-model`,e),C.updateModel()};let P=new Set;u.onClearChat=async()=>{await C.clearAllMessages(),y.clear(),P.clear()},u.onClearFilesystem=async()=>{await C.resetFilesystem()};let F=async e=>{$.info(`Scoop selected`,{jid:e.jid,name:e.name}),_=e,C.createScoopTab(e.jid),u.panels.memory.setSelectedScoop(e.jid),u.panels.scoops.setSelectedJid(e.jid);let t=e.isCone?`session-cone`:`session-${e.folder}`,n=y.get(e.jid),r=!P.has(e.jid),i=e.isCone?void 0:e.name;if(!r&&n&&n.length>0)await u.panels.chat.switchToContext(t,!e.isCone,i),u.panels.chat.loadMessages(n);else{if(await u.panels.chat.switchToContext(t,!e.isCone,i),u.panels.chat.getMessages().length===0){let t=await C.getMessagesForScoop(e.jid);for(let e of t){let t=e.channel===`webhook`||e.channel===`cron`,n=e.channel===`delegation`;t?u.panels.chat.addUserMessage(e.content):n?u.panels.chat.addUserMessage(`**[Instructions from sliccy]**\n\n${e.content}`):e.fromAssistant?(h({type:`message_start`,messageId:e.id}),h({type:`content_delta`,messageId:e.id,text:e.content}),h({type:`content_done`,messageId:e.id})):u.panels.chat.addUserMessage(e.content)}}let n=u.panels.chat.getMessages(),r=new Set(n.map(e=>e.id)),a=x(e.jid),o=a.filter(e=>!r.has(e.id));a.length=0,a.push(...n,...o),o.length>0&&u.panels.chat.loadMessages(a)}e.isCone&&C.isProcessing(e.jid)&&u.panels.chat.setProcessing(!0),P.add(e.jid)};if(u.onScoopSelect=F,_&&(C.createScoopTab(_.jid),await F(_)),l===`standalone`||l===`electron-overlay`){let e=await i(),t=Ox(l,e!==null)?s:null,n=await g({locationHref:window.location.href,storage:window.localStorage,envBaseUrl:null,defaultWorkerBaseUrl:t,runtimeConfigFetcher:async()=>e}),r=null,a=null,o=null;eg(()=>O?(e,t)=>O.sendFsRequest(e,t):r?(e,t)=>r.sendFsRequest(e,t):null),Vf(()=>O?()=>O.getBestFollowerForTeleport():null),Hf(()=>O?()=>O.getConnectedFollowers():null);let c=e=>{o&&=(clearInterval(o),null),r?.close();let t=`follower-${e.bootstrapId}`,n=new Ex(e.channel,{browserTransport:p.getTransport(),browserAPI:p,onSnapshot:e=>{u.panels.chat.loadMessages(e)},onUserMessage:e=>{u.panels.chat.addUserMessage(e)},onStatus:e=>{u.panels.chat.setProcessing(e===`processing`)},onTargetsChanged:()=>void i()});r=n,p.setTrayTargetProvider(n),u.panels.chat.setAgent(n),n.requestSnapshot();let i=async()=>{try{let e=await p.listPages();n.advertiseTargets(e.map(e=>({targetId:e.targetId,title:e.title,url:e.url})),t)}catch{}};o=setInterval(i,5e3),i(),$.info(`Follower sync wired to chat panel`,{trayId:e.trayId})},f=e=>{a?.cancel(),o&&=(clearInterval(o),null),r?.close(),r=null,a=ex({joinUrl:e,runtime:`slicc-standalone`,fetchImpl:tm()},{onConnected:e=>c(e),onReconnecting:e=>{$.info(`Follower reconnecting`,{attempt:e})},onGaveUp:e=>{$.warn(`Follower reconnect gave up`,{lastError:e})}})};if(window.addEventListener(`slicc:tray-join`,(e=>{f(e.detail.joinUrl)})),window.addEventListener(`beforeunload`,()=>{o&&clearInterval(o),r?.close(),a?.cancel()},{once:!0}),n?.joinUrl)f(n.joinUrl);else if(n?.workerBaseUrl){let e,t,r,i,a=()=>{t=new wx({browserTransport:p.getTransport(),browserAPI:p,getMessages:()=>u.panels.chat.getMessages(),getScoopJid:()=>_?.jid??`cone`,onFollowerMessage:(e,t)=>{u.panels.chat.addUserMessage(e),A.sendMessage(e,t)},onFollowerAbort:()=>{A.stop()}}),O=t,rm(()=>t.getConnectedFollowers()),p.setTrayTargetProvider(t),i&&clearInterval(i);let n=async()=>{try{let e=await p.listPages();t.setLocalTargets(e.map(e=>({targetId:e.targetId,title:e.title,url:e.url})))}catch{}};i=setInterval(n,5e3),n(),r=new Qb({sendControlMessage:t=>e.sendControlMessage(t),onPeerConnected:(e,n)=>{$.info(`Tray follower data channel opened`,{controllerId:e.controllerId,bootstrapId:e.bootstrapId,attempt:e.attempt,runtime:e.runtime}),t.addFollower(e.bootstrapId,n,{runtime:e.runtime,connectedAt:e.connectedAt??void 0})}})};a(),m.add(e=>{t.broadcastEvent(e)}),e=new Zp({workerBaseUrl:n.workerBaseUrl,runtime:`slicc-standalone`,fetchImpl:tm(),onControlMessage:e=>{if(e.type===`webhook.event`){j.handleWebhookEvent(e.webhookId,e.headers,e.body);return}r.handleControlMessage(e).catch(e=>{$.warn(`Tray leader bootstrap handling failed`,{error:e instanceof Error?e.message:String(e)})})}}),om(async()=>{t.stop(),r.stop(),e.stop(),await e.clearSession();let n=await e.start(),i=d(window.location.href,n.workerBaseUrl,n.trayId);return i!==window.location.href&&window.history.replaceState(window.history.state,``,i),a(),qp()}),e.start().then(e=>{let t=d(window.location.href,e.workerBaseUrl,e.trayId);t!==window.location.href&&window.history.replaceState(window.history.state,``,t)}).catch(e=>{$.warn(`Leader tray join failed`,{error:e instanceof Error?e.message:String(e)})}),window.addEventListener(`beforeunload`,()=>{clearInterval(i),t.stop(),r.stop(),e.stop()},{once:!0})}}$.info(`Orchestrator initialized — cone+scoops ready`,{scoopCount:C.getScoops().length}),Jv().catch(()=>{})}rS().catch(e=>{$.error(`Fatal error`,e);let t=document.getElementById(`app`);if(t){let n=document.createElement(`div`);n.style.cssText=`padding: 2rem; text-align: center;`;let r=document.createElement(`h1`);r.style.color=`var(--s2-negative, #e34850)`,r.textContent=`Failed to start`;let i=document.createElement(`p`);i.style.color=`var(--s2-content-tertiary, #717171)`,i.textContent=e.message,n.appendChild(r),n.appendChild(i);let a=document.createElement(`button`);for(a.textContent=`Reset all data & reload`,a.style.cssText=`margin-top: 1rem; padding: 0.5rem 1.5rem; background: var(--s2-negative, #e34850); color: #fff; border: none; border-radius: 6px; cursor: pointer; font-size: 14px;`,a.addEventListener(`click`,async()=>{a.disabled=!0,a.textContent=`Resetting…`;let e=await indexedDB.databases();await Promise.all(e.map(e=>e.name?new Promise(t=>{let n=indexedDB.deleteDatabase(e.name);n.onsuccess=()=>t(),n.onerror=()=>t(),n.onblocked=()=>t()}):Promise.resolve())),location.reload()}),n.appendChild(a);t.firstChild;)t.removeChild(t.firstChild);t.appendChild(n)}});export{Lb as a,hb as c,Ea as d,si as f,Ib as i,ab as l,oi as m,Pb as n,fb as o,li as p,Fb as r,pb as s,Nb as t,sy as u};
|
|
@@ -0,0 +1 @@
|
|
|
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}.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-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__inline-sprinkle{border-radius:var(--s2-radius-default);min-height:32px;margin:.6em 0;overflow:hidden}.msg__inline-sprinkle 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__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__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);color:#fff;cursor:pointer;width:32px;height:32px;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__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__mic-btn svg{width:20px;height:20px}.chat__mic-btn:hover{background:var(--s2-bg-elevated);color:var(--s2-content-default)}.chat__mic-btn:disabled{opacity:.3;cursor:not-allowed}.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{padding:0;font-size:12px}.tool-call summary{cursor:pointer;background:var(--s2-bg-layer-1);color:var(--s2-content-secondary);transition:background var(--s2-transition-default);border-radius:8px;align-items:center;gap:4px;padding:11px 12px;font-size:12px;font-weight:400;line-height:1.5;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:4px;display:flex}.tool-call__icon{background:0 0;border-radius:0;flex-shrink:0;justify-content:center;align-items:center;width:10px;height:10px;font-size:10px;transition:transform .15s;display:inline-flex}.tool-call[open] .tool-call__icon{transform:rotate(180deg)}.tool-call__name{color:var(--s2-content-secondary);font-weight:400;font-family:var(--s2-font-family);font-size:12px}.tool-call__preview{color:var(--s2-content-tertiary);text-overflow:ellipsis;white-space:nowrap;max-width:300px;font-size:11px;font-family:var(--s2-font-mono);margin-left:4px;overflow:hidden}.tool-call__status{font-size:10px;font-weight:500;font-family:var(--s2-font-mono);margin-left:auto}.tool-call__status--running{color:var(--s2-content-tertiary)}.tool-call__status--running:after{content:"";background:var(--s2-content-tertiary);vertical-align:middle;border-radius:1px;width:16px;height:2px;margin-left:4px;animation:1s ease-in-out infinite status-bar;display:inline-block}@keyframes status-bar{0%,to{opacity:.3}50%{opacity:1}}.tool-call__status--success{color:var(--s2-content-tertiary)}.tool-call__status--error{color:var(--s2-negative)}.tool-call__details{padding:var(--s2-spacing-50) var(--s2-spacing-75) var(--s2-spacing-75) 22px;border-left:2px solid var(--s2-border-subtle);margin-top:2px;margin-left:var(--s2-spacing-75)}.tool-call__label{color:var(--s2-content-tertiary);text-transform:none;margin-bottom:2px;font-size:9px;font-weight:500}.tool-call__input pre,.tool-call__result pre{white-space:pre-wrap;font-family:var(--s2-font-mono);font-size:var(--s2-font-size-50);color:var(--s2-content-secondary);background:var(--s2-bg-sunken);max-height:150px;padding:var(--s2-spacing-75);border-radius:var(--s2-radius-s);margin:0;overflow-y:auto}.tool-call__result--error pre{color:var(--s2-negative)}.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)}.lick{font-size:var(--s2-font-size-75);margin-left:20px;padding:0}.lick summary{cursor:pointer;padding:2px var(--s2-spacing-75);align-items:center;gap:var(--s2-spacing-50);border-radius:var(--s2-radius-default);color:var(--s2-content-tertiary);transition:background var(--s2-transition-default);list-style:none;display:flex}.lick summary:hover{background:var(--s2-bg-layer-2)}.lick summary::-webkit-details-marker{display:none}.lick__header{align-items:center;gap:var(--s2-spacing-50);cursor:pointer;display:flex}.lick__icon{border-radius:var(--s2-radius-s);background:var(--s2-gray-200);width:18px;height:18px;color:var(--s2-content-secondary);flex-shrink:0;justify-content:center;align-items:center;font-size:10px;font-weight:700;display:inline-flex}.lick__type{color:var(--s2-content-secondary);font-weight:500}.lick__preview{color:var(--s2-content-tertiary);font-size:var(--s2-font-size-50);margin-left:var(--s2-spacing-50);text-overflow:ellipsis;white-space:nowrap;max-width:300px;font-family:var(--s2-font-mono);overflow:hidden}.lick__details{padding:var(--s2-spacing-50) var(--s2-spacing-75) var(--s2-spacing-75) 22px;border-left:2px solid var(--s2-border-subtle);margin-top:2px;margin-left:var(--s2-spacing-75);font-size:var(--s2-font-size-75);color:var(--s2-content-secondary)}.lick__details pre{background:var(--s2-bg-sunken);padding:var(--s2-spacing-75);border-radius:var(--s2-radius-s);font-size:var(--s2-font-size-50);overflow-x: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:#fff;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:#fff}.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{color:#fff;background:#ffffff2e}.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:#fff}.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)}.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);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);background:#ffffffd9;padding:0 16px;display:inline-flex}.sprinkle-btn:hover{background:#fff}.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:var(--s2-gray-25);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{border-color:var(--s2-gray-200);color:var(--s2-gray-800);background:#ffffffd9}.sprinkle-btn--secondary:hover{background:#fff}.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:var(--s2-gray-25)}.sprinkle-badge--accent{background:var(--s2-accent);color:var(--s2-gray-25)}.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))}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as e}from"./index-DvKgWKET.js";export{e as getLickManager};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{l as e}from"./index-DvKgWKET.js";export{e as fetchSecretEnvVars};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{u as e}from"./index-DvKgWKET.js";export{e as WasmShell};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{p as e}from"./index-DvKgWKET.js";export{e as collectThemeCSS};
|
package/dist/ui/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>slicc</title>
|
|
7
7
|
<link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-DvKgWKET.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-zsgVPwQN.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-D4M6sveU.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/logger-B-No_qN_.js">
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/db-UiVJ_81p.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="/assets/magick-wasm-D4KIq0y6.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/skills-agEj4Eg8.js">
|
|
27
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
27
|
+
<link rel="stylesheet" crossorigin href="/assets/index-wKcIJS6-.css">
|
|
28
28
|
</head>
|
|
29
29
|
<body>
|
|
30
30
|
<div id="app"></div>
|
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<title>slicc</title>
|
|
7
7
|
<link rel="icon" type="image/png" href="/logos/sliccy-color-1scoops-32x32.png" />
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-DvKgWKET.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/chunk-zsgVPwQN.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-D4M6sveU.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/logger-B-No_qN_.js">
|
|
@@ -24,7 +24,7 @@
|
|
|
24
24
|
<link rel="modulepreload" crossorigin href="/assets/db-UiVJ_81p.js">
|
|
25
25
|
<link rel="modulepreload" crossorigin href="/assets/magick-wasm-D4KIq0y6.js">
|
|
26
26
|
<link rel="modulepreload" crossorigin href="/assets/skills-agEj4Eg8.js">
|
|
27
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
27
|
+
<link rel="stylesheet" crossorigin href="/assets/index-wKcIJS6-.css">
|
|
28
28
|
</head>
|
|
29
29
|
<body>
|
|
30
30
|
<div id="app"></div>
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e}from"./index-DS_S39OY.js";export{e as publishAgentBridgeProxy};
|
|
@@ -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}.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-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__inline-sprinkle{border-radius:var(--s2-radius-default);min-height:32px;margin:.6em 0;overflow:hidden}.msg__inline-sprinkle 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__textarea{resize:none;min-height:18px;max-height:120px;color:var(--s2-content-default);font-family:var(--s2-font-family);letter-spacing:0;background:0 0;border:none;outline:none;flex:1;padding:0;font-size:14px;font-weight:400;line-height:18px}.chat__textarea::placeholder{color:var(--s2-content-tertiary)}.chat__action-bar{flex-shrink:0;justify-content:space-between;align-items:center;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__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);color:#fff;cursor:pointer;width:32px;height:32px;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__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__mic-btn svg{width:20px;height:20px}.chat__mic-btn:hover{background:var(--s2-bg-elevated);color:var(--s2-content-default)}.chat__mic-btn:disabled{opacity:.3;cursor:not-allowed}.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{padding:0;font-size:12px}.tool-call summary{cursor:pointer;background:var(--s2-bg-layer-1);color:var(--s2-content-secondary);transition:background var(--s2-transition-default);border-radius:8px;align-items:center;gap:4px;padding:11px 12px;font-size:12px;font-weight:400;line-height:1.5;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:4px;display:flex}.tool-call__icon{background:0 0;border-radius:0;flex-shrink:0;justify-content:center;align-items:center;width:10px;height:10px;font-size:10px;transition:transform .15s;display:inline-flex}.tool-call[open] .tool-call__icon{transform:rotate(180deg)}.tool-call__name{color:var(--s2-content-secondary);font-weight:400;font-family:var(--s2-font-family);font-size:12px}.tool-call__preview{color:var(--s2-content-tertiary);text-overflow:ellipsis;white-space:nowrap;max-width:300px;font-size:11px;font-family:var(--s2-font-mono);margin-left:4px;overflow:hidden}.tool-call__status{font-size:10px;font-weight:500;font-family:var(--s2-font-mono);margin-left:auto}.tool-call__status--running{color:var(--s2-content-tertiary)}.tool-call__status--running:after{content:"";background:var(--s2-content-tertiary);vertical-align:middle;border-radius:1px;width:16px;height:2px;margin-left:4px;animation:1s ease-in-out infinite status-bar;display:inline-block}@keyframes status-bar{0%,to{opacity:.3}50%{opacity:1}}.tool-call__status--success{color:var(--s2-content-tertiary)}.tool-call__status--error{color:var(--s2-negative)}.tool-call__details{padding:var(--s2-spacing-50) var(--s2-spacing-75) var(--s2-spacing-75) 22px;border-left:2px solid var(--s2-border-subtle);margin-top:2px;margin-left:var(--s2-spacing-75)}.tool-call__label{color:var(--s2-content-tertiary);text-transform:none;margin-bottom:2px;font-size:9px;font-weight:500}.tool-call__input pre,.tool-call__result pre{white-space:pre-wrap;font-family:var(--s2-font-mono);font-size:var(--s2-font-size-50);color:var(--s2-content-secondary);background:var(--s2-bg-sunken);max-height:150px;padding:var(--s2-spacing-75);border-radius:var(--s2-radius-s);margin:0;overflow-y:auto}.tool-call__result--error pre{color:var(--s2-negative)}.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)}.lick{font-size:var(--s2-font-size-75);margin-left:20px;padding:0}.lick summary{cursor:pointer;padding:2px var(--s2-spacing-75);align-items:center;gap:var(--s2-spacing-50);border-radius:var(--s2-radius-default);color:var(--s2-content-tertiary);transition:background var(--s2-transition-default);list-style:none;display:flex}.lick summary:hover{background:var(--s2-bg-layer-2)}.lick summary::-webkit-details-marker{display:none}.lick__header{align-items:center;gap:var(--s2-spacing-50);cursor:pointer;display:flex}.lick__icon{border-radius:var(--s2-radius-s);background:var(--s2-gray-200);width:18px;height:18px;color:var(--s2-content-secondary);flex-shrink:0;justify-content:center;align-items:center;font-size:10px;font-weight:700;display:inline-flex}.lick__type{color:var(--s2-content-secondary);font-weight:500}.lick__preview{color:var(--s2-content-tertiary);font-size:var(--s2-font-size-50);margin-left:var(--s2-spacing-50);text-overflow:ellipsis;white-space:nowrap;max-width:300px;font-family:var(--s2-font-mono);overflow:hidden}.lick__details{padding:var(--s2-spacing-50) var(--s2-spacing-75) var(--s2-spacing-75) 22px;border-left:2px solid var(--s2-border-subtle);margin-top:2px;margin-left:var(--s2-spacing-75);font-size:var(--s2-font-size-75);color:var(--s2-content-secondary)}.lick__details pre{background:var(--s2-bg-sunken);padding:var(--s2-spacing-75);border-radius:var(--s2-radius-s);font-size:var(--s2-font-size-50);overflow-x: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:#fff;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:#fff}.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{color:#fff;background:#ffffff2e}.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:#fff}.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)}.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);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);background:#ffffffd9;padding:0 16px;display:inline-flex}.sprinkle-btn:hover{background:#fff}.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:var(--s2-gray-25);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{border-color:var(--s2-gray-200);color:var(--s2-gray-800);background:#ffffffd9}.sprinkle-btn--secondary:hover{background:#fff}.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:var(--s2-gray-25)}.sprinkle-badge--accent{background:var(--s2-accent);color:var(--s2-gray-25)}.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{c as e}from"./index-DS_S39OY.js";export{e as getLickManager};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{l as e}from"./index-DS_S39OY.js";export{e as fetchSecretEnvVars};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{u as e}from"./index-DS_S39OY.js";export{e as WasmShell};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{p as e}from"./index-DS_S39OY.js";export{e as collectThemeCSS};
|