sliccy 5.2.0 → 5.4.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/{account-store-B9L-iw3_.js → account-store-C6_gIZ9b.js} +2 -2
- package/dist/ui/assets/{account-store-J1i56LXB.js → account-store-DFegnWPt.js} +2 -2
- package/dist/ui/assets/{adobe-uU9WScyf.js → adobe-CCrNID9W.js} +1 -1
- package/dist/ui/assets/{adobe-BE4O6RpW.js → adobe-CyL6g4I7.js} +1 -1
- package/dist/ui/assets/{adobe-oauth-state-BSzOZOb6.js → adobe-oauth-state-BPiIC94C.js} +1 -1
- package/dist/ui/assets/{agent-message-to-chat-BDsWz4XM.js → agent-message-to-chat-BWe23vP6.js} +1 -1
- package/dist/ui/assets/{apps-D9vX8Iuh.js → apps-DgoHi_Jt.js} +1 -1
- package/dist/ui/assets/{azure-openai-BANs3KGr.js → azure-openai-B8RJsHT-.js} +1 -1
- package/dist/ui/assets/{azure-openai-D6toPyQ8.js → azure-openai-hJ0wnltF.js} +1 -1
- package/dist/ui/assets/{connect-surface-DAC3CNei.js → connect-surface-w5IyESwF.js} +1 -1
- package/dist/ui/assets/dip-BPGGcpgQ.js +1 -0
- package/dist/ui/assets/{dist-BWYQOlqM.js → dist-CC-3PhWb.js} +1 -1
- package/dist/ui/assets/{dist--TcGqpJG.js → dist-DVFuglk5.js} +1 -1
- package/dist/ui/assets/{ensure-speech-assets-B-pBwbKb.js → ensure-speech-assets-Cis-PX6Z.js} +1 -1
- package/dist/ui/assets/esp8266-CgUXgl1_.js +1 -0
- package/dist/ui/assets/{esptool-operations-CP9wpmtB.js → esptool-operations-9UQedhXq.js} +2 -2
- package/dist/ui/assets/{fs-BMm4juUO.js → fs-B8VqdCUY.js} +2 -2
- package/dist/ui/assets/{fs-CDxFmHhs.js → fs-RC1NWcFZ.js} +1 -1
- package/dist/ui/assets/{github-igAb2Tr3.js → github-BDhArZ5j.js} +1 -1
- package/dist/ui/assets/{github-Bv3awCy-.js → github-DL1eb7HW.js} +2 -2
- package/dist/ui/assets/{github-copilot-EhpEoXT_.js → github-copilot-B9SO52A1.js} +1 -1
- package/dist/ui/assets/{github-copilot-Bo6St-mj.js → github-copilot-C8u3akzN.js} +1 -1
- package/dist/ui/assets/{hear-CTBETRuZ.js → hear-C_Cy0mUe.js} +1 -1
- package/dist/ui/assets/{kernel-worker-DU2Lsjyz.js → kernel-worker-BOiHtoD5.js} +18 -18
- package/dist/ui/assets/{kokoro-engine-qxvtO16S.js → kokoro-engine-C39-3JHF.js} +1 -1
- package/dist/ui/assets/{lick-ws-bridge-D_Q0B4_w.js → lick-ws-bridge-Bix1ByUo.js} +1 -1
- package/dist/ui/assets/{lick-ws-bridge-CAy0-YSl.js → lick-ws-bridge-BkAmRj1Z.js} +1 -1
- package/dist/ui/assets/{local-llm-yvkTurpV.js → local-llm-BSI0PlfX.js} +1 -1
- package/dist/ui/assets/main-Bpuh8nYF.js +24 -0
- package/dist/ui/assets/{mount-BMTmsC-u.js → mount-Bax8wvuA.js} +1 -1
- package/dist/ui/assets/{mount-C0n7eObT.js → mount-N_JmQdl5.js} +2 -2
- package/dist/ui/assets/{new-session-BgzUQaQk.js → new-session-sPDR0jnx.js} +2 -2
- package/dist/ui/assets/{oauth-bootstrap-B35kl1hZ.js → oauth-bootstrap-Dm-vVRTU.js} +2 -2
- package/dist/ui/assets/{openai-codex-CNXAYokU.js → openai-codex-DUpVk0wP.js} +1 -1
- package/dist/ui/assets/{openai-codex-BziCxD0k.js → openai-codex-bYCB3ofj.js} +1 -1
- package/dist/ui/assets/{page-follower-tray-tXYeooU8.js → page-follower-tray-CgF4beVv.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-Cxg9OE7o.js → panel-rpc-handlers-DI4DAW21.js} +1 -1
- package/dist/ui/assets/{provider-CzdDndd-.js → provider-9p5HvPY9.js} +2 -2
- package/dist/ui/assets/{provider-DOAeQgJY.js → provider-NnBB2k3A.js} +1 -1
- package/dist/ui/assets/provider-store-access-5pcZED05.js +1 -0
- package/dist/ui/assets/provider-store-access-Bv09jBJf.js +1 -0
- package/dist/ui/assets/{providers-Kx_BEFqJ.js → providers-BYT33r_r.js} +1 -1
- package/dist/ui/assets/{quick-llm-BW-brmSb.js → quick-llm-BtUslSmP.js} +1 -1
- package/dist/ui/assets/session-freezer-Znp08p_F.js +1 -0
- package/dist/ui/assets/{speak-B8c3oh9Y.js → speak-CT1k5FTD.js} +1 -1
- package/dist/ui/assets/{sprinkle-manager-BpLedeCo.js → sprinkle-manager-j1ikTeY0.js} +1 -1
- package/dist/ui/assets/{store-Ccl5ODaE.js → store-ihd6OnKT.js} +1 -1
- package/dist/ui/assets/{sudo-D6_01n3k.js → sudo-D3T4jmgn.js} +1 -1
- package/dist/ui/assets/{transformers-env-D2tn9gLL.js → transformers-env-CoQS_92g.js} +1 -1
- package/dist/ui/assets/{tray-leader-DGFajpwM.js → tray-leader-CaTLZ0nn.js} +1 -1
- package/dist/ui/assets/{tray-leave-runtime-taK1Ebp7.js → tray-leave-runtime-BsLt7Kau.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-DrfEt3Mi.js → upgrade-detection-qlGMMdg_.js} +1 -1
- package/dist/ui/assets/{wc-attach-DBF_z5mw.js → wc-attach-B6M5u9Mf.js} +2 -2
- package/dist/ui/assets/{wc-detached-Wt3lzK1R.js → wc-detached-CvvTnnwH.js} +1 -1
- package/dist/ui/assets/{wc-extension-DfX8q6Ih.js → wc-extension-CxcxNKVO.js} +2 -2
- package/dist/ui/assets/{wc-follower-BVeqP5KF.js → wc-follower-Pgc81YTH.js} +2 -2
- package/dist/ui/assets/wc-live-Chbuwmqb.js +253 -0
- package/dist/ui/assets/wc-nav-CkFqKz85.js +2 -0
- package/dist/ui/assets/{wc-onboarding-CEjOIdK5.js → wc-onboarding-BEbuwhSQ.js} +2 -2
- package/dist/ui/assets/{wc-placeholder-CHDb9Kuo.js → wc-placeholder-Gu8g7ydZ.js} +3 -3
- package/dist/ui/assets/{wc-settings-qlpR6Q6T.js → wc-settings-BteAfHGT.js} +2 -2
- package/dist/ui/assets/{wc-shell-DTsW2ra1.js → wc-shell-DjTIqVcb.js} +9 -9
- package/dist/ui/assets/{wc-sprinkles-D_fwWOq8.js → wc-sprinkles-DvkKhy2T.js} +2 -2
- package/dist/ui/assets/{wc-tray-2mdLomRm.js → wc-tray-BVb6lvIH.js} +2 -2
- package/dist/ui/assets/{whisper-engine-CvJzjL-a.js → whisper-engine-CyUutfK8.js} +1 -1
- package/dist/ui/assets/{xai-grok-BoTmSfDH.js → xai-grok-BvUbyyZg.js} +1 -1
- package/dist/ui/assets/{xai-grok-U2afiu3-.js → xai-grok-MczhRIwJ.js} +1 -1
- package/dist/ui/electron-overlay-entry.js +2 -2
- 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/dip-3VX86RoF.js +0 -1
- package/dist/ui/assets/esp8266-DEulqnXg.js +0 -1
- package/dist/ui/assets/main-DYwi5YqO.js +0 -24
- package/dist/ui/assets/provider-store-access-02kN2Pzi.js +0 -1
- package/dist/ui/assets/provider-store-access-DOOb1KbA.js +0 -1
- package/dist/ui/assets/session-freezer-D6kbwY6i.js +0 -1
- package/dist/ui/assets/wc-live-DqgXrP0F.js +0 -253
- package/dist/ui/assets/wc-nav-6aYy7HCy.js +0 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
import{t as e}from"./logger-DDBAeTLF.js";import{a as t,l as n,t as r,u as i}from"./proxied-fetch-CKDBmEMl.js";import{g as a}from"./main-DYwi5YqO.js";var o=`slicc-groups`,s=3,c={SCOOPS:`scoops`,MESSAGES:`messages`,SESSIONS:`sessions`,TASKS:`tasks`,STATE:`state`,WEBHOOKS:`webhooks`,CRONTASKS:`crontasks`},l=null;function u(e){if(!e.objectStoreNames.contains(c.MESSAGES)){let t=e.createObjectStore(c.MESSAGES,{keyPath:`id`});t.createIndex(`chatJid`,`chatJid`),t.createIndex(`timestamp`,`timestamp`),t.createIndex(`chatJid_timestamp`,[`chatJid`,`timestamp`])}e.objectStoreNames.contains(c.SESSIONS)||e.createObjectStore(c.SESSIONS,{keyPath:`groupFolder`}),e.objectStoreNames.contains(c.TASKS)||e.createObjectStore(c.TASKS,{keyPath:`id`}).createIndex(`groupFolder`,`groupFolder`),e.objectStoreNames.contains(c.STATE)||e.createObjectStore(c.STATE,{keyPath:`key`})}function d(e){let t=e.isMain??!1;return{jid:e.jid,name:e.name,folder:e.folder,trigger:t?void 0:e.trigger||`@${e.folder}`,requiresTrigger:!t&&(e.requiresTrigger??!0),isCone:t,type:t?`cone`:`scoop`,assistantLabel:t?`sliccy`:e.config?.assistantName||e.folder,addedAt:e.addedAt,config:e.config?{systemPromptAppend:e.config.systemPromptAppend,timeout:e.config.timeout,assistantName:e.config.assistantName}:void 0}}function f(e,t){if(t.objectStoreNames.contains(`groups`)){let n=e.target.transaction.objectStore(`groups`).getAll();n.onsuccess=()=>{let e=n.result;t.deleteObjectStore(`groups`);let r=t.createObjectStore(c.SCOOPS,{keyPath:`jid`});r.createIndex(`type`,`type`);for(let t of e)r.put(d(t))};return}t.objectStoreNames.contains(c.SCOOPS)||t.createObjectStore(c.SCOOPS,{keyPath:`jid`}).createIndex(`type`,`type`)}function p(e){e.objectStoreNames.contains(c.WEBHOOKS)||e.createObjectStore(c.WEBHOOKS,{keyPath:`id`}),e.objectStoreNames.contains(c.CRONTASKS)||e.createObjectStore(c.CRONTASKS,{keyPath:`id`})}function m(e){let t=e.target.result,n=e.oldVersion;n<1&&u(t),n<2&&f(e,t),n<3&&p(t)}function h(){if(!l)return null;let e=Object.values(c).every(e=>l.objectStoreNames.contains(e));return l.version===s&&e?l:(l.close(),l=null,null)}function g(e){e.onversionchange=()=>{e.close(),l===e&&(l=null)},e.onclose=()=>{l===e&&(l=null)}}async function _(){return h()||new Promise((e,t)=>{let n=indexedDB.open(o,s);n.onupgradeneeded=m,n.onsuccess=()=>{let t=n.result;g(t),l=t,e(t)},n.onerror=()=>t(n.error)})}async function v(e,t=`readonly`){return(await _()).transaction(e,t).objectStore(e)}async function y(e){let t=await v(c.STATE);return new Promise((n,r)=>{let i=t.get(e);i.onsuccess=()=>n(i.result?.value??null),i.onerror=()=>r(i.error)})}async function b(e,t){let n=await v(c.STATE,`readwrite`);return new Promise((r,i)=>{let a=n.put({key:e,value:t});a.onsuccess=()=>r(),a.onerror=()=>i(a.error)})}var x=e(`tray-leader`),S=`leader-tray-session`,C=3e4,w=1e4,T=1e3,E=3e4,D=2,O=20,k={state:`inactive`,session:null,error:null};function A(){return{...k,session:k.session?{...k.session}:null}}var j=new Set;function M(e){return j.add(e),()=>{j.delete(e)}}function N(e){if(k={...e,session:e.session?{...e.session}:null},j.size!==0)for(let e of[...j])try{e(A())}catch{}}var P=class{key;constructor(e=S){this.key=e}async load(){return F(await y(this.key))}async save(e){await b(this.key,JSON.stringify(e))}async clear(){await b(this.key,``)}};function F(e){if(!e)return null;try{let t=JSON.parse(e);return typeof t.workerBaseUrl!=`string`||typeof t.trayId!=`string`||typeof t.createdAt!=`string`||typeof t.controllerId!=`string`||typeof t.controllerUrl!=`string`||typeof t.joinUrl!=`string`||typeof t.webhookUrl!=`string`||typeof t.runtime!=`string`?null:{workerBaseUrl:t.workerBaseUrl,trayId:t.trayId,createdAt:t.createdAt,controllerId:t.controllerId,controllerUrl:t.controllerUrl,joinUrl:t.joinUrl,webhookUrl:t.webhookUrl,leaderKey:typeof t.leaderKey==`string`?t.leaderKey:void 0,leaderWebSocketUrl:typeof t.leaderWebSocketUrl==`string`?t.leaderWebSocketUrl:null,runtime:t.runtime}}catch{return null}}var I=class{options;store;fetchImpl;webSocketFactory;pingIntervalMs;connectTimeoutMs;reconnectEnabled;reconnectBaseDelayMs;reconnectMaxDelayMs;reconnectBackoffMultiplier;reconnectMaxAttempts;reconnectSleep;socket=null;pingTimer=null;currentSession=null;stopped=!1;reconnecting=!1;reconnectGeneration=0;constructor(e){this.options=e,this.store=e.store??new P,this.fetchImpl=e.fetchImpl??V(),this.webSocketFactory=e.webSocketFactory??(e=>new WebSocket(e)),this.pingIntervalMs=e.pingIntervalMs??C,this.connectTimeoutMs=e.connectTimeoutMs??w;let t=e.reconnect;this.reconnectEnabled=t!==!1;let n=t===!1||!t?{}:t;this.reconnectBaseDelayMs=n.baseDelayMs??T,this.reconnectMaxDelayMs=n.maxDelayMs??E,this.reconnectBackoffMultiplier=n.backoffMultiplier??D,this.reconnectMaxAttempts=n.maxAttempts??O,this.reconnectSleep=n.sleep??(e=>new Promise(t=>setTimeout(t,e)))}async start(){if(this.stopped=!1,this.currentSession&&this.socket)return N({state:`leader`,session:this.currentSession,error:null}),this.currentSession;N({state:`connecting`,session:null,error:null}),this.currentSession=null;try{let e=await this.connectOnce();x.info(`Leader joined tray`,{trayId:e.trayId,controllerId:e.controllerId,runtime:e.runtime});try{this.options.onLeaderReady?.(e)}catch(e){x.warn(`onLeaderReady callback threw`,{error:e instanceof Error?e.message:String(e)})}return e}catch(e){throw N({state:`error`,session:this.currentSession,error:e instanceof Error?e.message:String(e)}),e}}stop(){this.stopped=!0,this.reconnecting=!1,this.reconnectGeneration++,this.tearDownSocket(),this.currentSession=null,N({state:`inactive`,session:null,error:null})}tearDownSocket(){this.pingTimer&&=(clearInterval(this.pingTimer),null);let e=this.socket;if(this.socket=null,e)try{e.close()}catch{}}async connectOnce(){let e=await this.store.load(),t=e?.workerBaseUrl===this.options.workerBaseUrl?e:null,n=await this.attachWithRecovery(t);this.currentSession=n;let r=await this.openLeaderSocket(n.leaderWebSocketUrl);return this.socket=r,this.startPingLoop(r),N({state:`leader`,session:n,error:null}),n}async handleUnexpectedDisconnect(e){if(this.stopped)return;if(!this.reconnectEnabled){x.warn(`Leader WebSocket dropped and auto-reconnect is disabled`,{reason:e}),this.tearDownSocket(),this.currentSession=null,N({state:`error`,session:null,error:`Leader WebSocket dropped: ${e}`});return}if(this.reconnecting)return;this.reconnecting=!0;let t=++this.reconnectGeneration;x.warn(`Leader WebSocket dropped — starting reconnect loop`,{reason:e}),this.tearDownSocket();let n=0,r=this.reconnectBaseDelayMs,i=e;for(;!this.stopped&&t===this.reconnectGeneration&&n<this.reconnectMaxAttempts&&(n++,N({state:`reconnecting`,session:this.currentSession,error:null,reconnectAttempts:n}),this.options.onReconnecting?.(n,i),x.info(`Leader reconnect attempt`,{attempt:n,delay:r}),await this.reconnectSleep(r),!(this.stopped||t!==this.reconnectGeneration));){try{let e=await this.connectOnce();if(this.stopped||t!==this.reconnectGeneration){this.tearDownSocket();break}this.reconnecting=!1,x.info(`Leader reconnect successful`,{attempt:n,trayId:e.trayId}),this.options.onReconnected?.(e);try{this.options.onLeaderReady?.(e)}catch(e){x.warn(`onLeaderReady callback threw`,{error:e instanceof Error?e.message:String(e)})}return}catch(e){i=e instanceof Error?e.message:String(e),x.warn(`Leader reconnect attempt failed`,{attempt:n,error:i}),this.tearDownSocket()}r=Math.min(r*this.reconnectBackoffMultiplier,this.reconnectMaxDelayMs)}!this.stopped&&t===this.reconnectGeneration&&(this.reconnecting=!1,this.currentSession=null,N({state:`error`,session:null,error:`Leader reconnect failed after ${n} attempts: ${i}`,reconnectAttempts:n}),x.warn(`Leader reconnect gave up`,{attempts:n,lastError:i}),this.options.onReconnectGaveUp?.(i,n))}async clearSession(){await this.store.clear()}sendControlMessage(e){if(!this.socket)throw Error(`Tray leader WebSocket is not connected`);this.socket.send(JSON.stringify(e))}async attachWithRecovery(e){try{return await this.claimLeaderSession(e)}catch(t){if(!e||!z(t))throw t;return x.warn(`Stored tray session is stale, creating a fresh tray`,{trayId:e.trayId,error:t instanceof Error?t.message:String(t)}),await this.store.clear(),this.claimLeaderSession(null)}}async claimLeaderSession(e){let t=e??await this.createTraySession(),n=await this.fetchJson(t.controllerUrl,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({controllerId:t.controllerId,leaderKey:t.leaderKey,runtime:this.options.runtime})});if(n.role!==`leader`||!n.leaderKey||!n.websocket?.url)throw Error(`Tray attach did not return leader access for controller ${n.controllerId}`);let r={...t,trayId:n.trayId,controllerId:n.controllerId,leaderKey:n.leaderKey,leaderWebSocketUrl:n.websocket.url,runtime:this.options.runtime};return await this.store.save(r),r}async createTraySession(){let e=this.options.kind?JSON.stringify({kind:this.options.kind}):void 0,t=await this.fetchJson(a(this.options.workerBaseUrl,`tray`),{method:`POST`,...e?{headers:{"content-type":`application/json`}}:{},...e?{body:e}:{}});return{workerBaseUrl:this.options.workerBaseUrl,trayId:t.trayId,createdAt:t.createdAt,controllerId:crypto.randomUUID(),controllerUrl:t.capabilities.controller.url,joinUrl:t.capabilities.join.url,webhookUrl:t.capabilities.webhook.url,runtime:this.options.runtime}}async openLeaderSocket(e){return await new Promise((t,n)=>{let r=this.webSocketFactory(e),i=!1,a=setTimeout(()=>{o(`Tray leader WebSocket timed out after ${this.connectTimeoutMs}ms waiting for leader.connected`);try{r.close(1e3,`leader.connected timeout`)}catch{}},this.connectTimeoutMs),o=e=>{i||(i=!0,clearTimeout(a),n(Error(e)))};r.addEventListener(`message`,e=>{let n=B(e.data);if(n){if(n.type===`leader.connected`){i||(i=!0,clearTimeout(a),t(r));return}if(n.type===`pong`){x.debug(`Tray leader heartbeat acknowledged`,{trayId:this.currentSession?.trayId});return}this.options.onControlMessage?.(n)}}),r.addEventListener(`close`,()=>o(`Tray leader WebSocket closed before leader.connected`)),r.addEventListener(`error`,()=>o(`Tray leader WebSocket failed before leader.connected`))})}startPingLoop(e){this.pingTimer&&clearInterval(this.pingTimer);let t=t=>{this.stopped||this.socket!==e||this.handleUnexpectedDisconnect(t).catch(e=>{x.warn(`Leader reconnect loop crashed`,{error:e instanceof Error?e.message:String(e)})})},n=()=>{try{e.send(JSON.stringify({type:`ping`}))}catch(e){t(`Leader ping send failed: ${e instanceof Error?e.message:String(e)}`)}};n(),this.pingTimer=setInterval(n,this.pingIntervalMs),e.addEventListener(`close`,()=>t(`Leader WebSocket closed`)),e.addEventListener(`error`,()=>t(`Leader WebSocket errored`))}async fetchJson(e,t){let n=await this.fetchImpl(e,t);if(!n.ok)throw await L.fromResponse(n);return await n.json()}},L=class e extends Error{status;code;constructor(e,t,n){super(n),this.status=e,this.code=t,this.name=`LeaderTrayHttpError`}static async fromResponse(t){try{let n=await t.json();return new e(t.status,n.code??null,n.error??`Tray request failed (${t.status})`)}catch{return new e(t.status,null,`Tray request failed (${t.status})`)}}},R=class extends Error{constructor(e){super(e),this.name=`TrayProxyFetchError`}};function z(e){return e instanceof R?!0:e instanceof L?e.status===403||e.status===404||e.status===410||e.status>=500:!1}function B(e){if(typeof e!=`string`)return null;try{return JSON.parse(e)}catch{return null}}function V(e=fetch){return typeof chrome<`u`&&chrome?.runtime?.id?(t,n)=>e(t,n):async(a,o={})=>{let s=typeof a==`string`?a:a.toString();try{if(new URL(s).origin===window.location.origin)return e(s,{...o,cache:`no-store`})}catch{}let c=new Headers(o.headers);c.set(`X-Target-URL`,s);for(let[e,t]of Object.entries(r()))c.set(e,t);let l=await e(t(`/api/fetch-proxy`),{...o,headers:c,cache:`no-store`});if(n(l))throw new R(await i(l));return l}}export{M as i,A as n,N as r,I as t};
|
|
1
|
+
import{t as e}from"./logger-DDBAeTLF.js";import{a as t,l as n,t as r,u as i}from"./proxied-fetch-CKDBmEMl.js";import{_ as a}from"./main-Bpuh8nYF.js";var o=`slicc-groups`,s=3,c={SCOOPS:`scoops`,MESSAGES:`messages`,SESSIONS:`sessions`,TASKS:`tasks`,STATE:`state`,WEBHOOKS:`webhooks`,CRONTASKS:`crontasks`},l=null;function u(e){if(!e.objectStoreNames.contains(c.MESSAGES)){let t=e.createObjectStore(c.MESSAGES,{keyPath:`id`});t.createIndex(`chatJid`,`chatJid`),t.createIndex(`timestamp`,`timestamp`),t.createIndex(`chatJid_timestamp`,[`chatJid`,`timestamp`])}e.objectStoreNames.contains(c.SESSIONS)||e.createObjectStore(c.SESSIONS,{keyPath:`groupFolder`}),e.objectStoreNames.contains(c.TASKS)||e.createObjectStore(c.TASKS,{keyPath:`id`}).createIndex(`groupFolder`,`groupFolder`),e.objectStoreNames.contains(c.STATE)||e.createObjectStore(c.STATE,{keyPath:`key`})}function d(e){let t=e.isMain??!1;return{jid:e.jid,name:e.name,folder:e.folder,trigger:t?void 0:e.trigger||`@${e.folder}`,requiresTrigger:!t&&(e.requiresTrigger??!0),isCone:t,type:t?`cone`:`scoop`,assistantLabel:t?`sliccy`:e.config?.assistantName||e.folder,addedAt:e.addedAt,config:e.config?{systemPromptAppend:e.config.systemPromptAppend,timeout:e.config.timeout,assistantName:e.config.assistantName}:void 0}}function f(e,t){if(t.objectStoreNames.contains(`groups`)){let n=e.target.transaction.objectStore(`groups`).getAll();n.onsuccess=()=>{let e=n.result;t.deleteObjectStore(`groups`);let r=t.createObjectStore(c.SCOOPS,{keyPath:`jid`});r.createIndex(`type`,`type`);for(let t of e)r.put(d(t))};return}t.objectStoreNames.contains(c.SCOOPS)||t.createObjectStore(c.SCOOPS,{keyPath:`jid`}).createIndex(`type`,`type`)}function p(e){e.objectStoreNames.contains(c.WEBHOOKS)||e.createObjectStore(c.WEBHOOKS,{keyPath:`id`}),e.objectStoreNames.contains(c.CRONTASKS)||e.createObjectStore(c.CRONTASKS,{keyPath:`id`})}function m(e){let t=e.target.result,n=e.oldVersion;n<1&&u(t),n<2&&f(e,t),n<3&&p(t)}function h(){if(!l)return null;let e=Object.values(c).every(e=>l.objectStoreNames.contains(e));return l.version===s&&e?l:(l.close(),l=null,null)}function g(e){e.onversionchange=()=>{e.close(),l===e&&(l=null)},e.onclose=()=>{l===e&&(l=null)}}async function _(){return h()||new Promise((e,t)=>{let n=indexedDB.open(o,s);n.onupgradeneeded=m,n.onsuccess=()=>{let t=n.result;g(t),l=t,e(t)},n.onerror=()=>t(n.error)})}async function v(e,t=`readonly`){return(await _()).transaction(e,t).objectStore(e)}async function y(e){let t=await v(c.STATE);return new Promise((n,r)=>{let i=t.get(e);i.onsuccess=()=>n(i.result?.value??null),i.onerror=()=>r(i.error)})}async function b(e,t){let n=await v(c.STATE,`readwrite`);return new Promise((r,i)=>{let a=n.put({key:e,value:t});a.onsuccess=()=>r(),a.onerror=()=>i(a.error)})}var x=e(`tray-leader`),S=`leader-tray-session`,C=3e4,w=1e4,T=1e3,E=3e4,D=2,O=20,k={state:`inactive`,session:null,error:null};function A(){return{...k,session:k.session?{...k.session}:null}}var j=new Set;function M(e){return j.add(e),()=>{j.delete(e)}}function N(e){if(k={...e,session:e.session?{...e.session}:null},j.size!==0)for(let e of[...j])try{e(A())}catch{}}var P=class{key;constructor(e=S){this.key=e}async load(){return F(await y(this.key))}async save(e){await b(this.key,JSON.stringify(e))}async clear(){await b(this.key,``)}};function F(e){if(!e)return null;try{let t=JSON.parse(e);return typeof t.workerBaseUrl!=`string`||typeof t.trayId!=`string`||typeof t.createdAt!=`string`||typeof t.controllerId!=`string`||typeof t.controllerUrl!=`string`||typeof t.joinUrl!=`string`||typeof t.webhookUrl!=`string`||typeof t.runtime!=`string`?null:{workerBaseUrl:t.workerBaseUrl,trayId:t.trayId,createdAt:t.createdAt,controllerId:t.controllerId,controllerUrl:t.controllerUrl,joinUrl:t.joinUrl,webhookUrl:t.webhookUrl,leaderKey:typeof t.leaderKey==`string`?t.leaderKey:void 0,leaderWebSocketUrl:typeof t.leaderWebSocketUrl==`string`?t.leaderWebSocketUrl:null,runtime:t.runtime}}catch{return null}}var I=class{options;store;fetchImpl;webSocketFactory;pingIntervalMs;connectTimeoutMs;reconnectEnabled;reconnectBaseDelayMs;reconnectMaxDelayMs;reconnectBackoffMultiplier;reconnectMaxAttempts;reconnectSleep;socket=null;pingTimer=null;currentSession=null;stopped=!1;reconnecting=!1;reconnectGeneration=0;constructor(e){this.options=e,this.store=e.store??new P,this.fetchImpl=e.fetchImpl??V(),this.webSocketFactory=e.webSocketFactory??(e=>new WebSocket(e)),this.pingIntervalMs=e.pingIntervalMs??C,this.connectTimeoutMs=e.connectTimeoutMs??w;let t=e.reconnect;this.reconnectEnabled=t!==!1;let n=t===!1||!t?{}:t;this.reconnectBaseDelayMs=n.baseDelayMs??T,this.reconnectMaxDelayMs=n.maxDelayMs??E,this.reconnectBackoffMultiplier=n.backoffMultiplier??D,this.reconnectMaxAttempts=n.maxAttempts??O,this.reconnectSleep=n.sleep??(e=>new Promise(t=>setTimeout(t,e)))}async start(){if(this.stopped=!1,this.currentSession&&this.socket)return N({state:`leader`,session:this.currentSession,error:null}),this.currentSession;N({state:`connecting`,session:null,error:null}),this.currentSession=null;try{let e=await this.connectOnce();x.info(`Leader joined tray`,{trayId:e.trayId,controllerId:e.controllerId,runtime:e.runtime});try{this.options.onLeaderReady?.(e)}catch(e){x.warn(`onLeaderReady callback threw`,{error:e instanceof Error?e.message:String(e)})}return e}catch(e){throw N({state:`error`,session:this.currentSession,error:e instanceof Error?e.message:String(e)}),e}}stop(){this.stopped=!0,this.reconnecting=!1,this.reconnectGeneration++,this.tearDownSocket(),this.currentSession=null,N({state:`inactive`,session:null,error:null})}tearDownSocket(){this.pingTimer&&=(clearInterval(this.pingTimer),null);let e=this.socket;if(this.socket=null,e)try{e.close()}catch{}}async connectOnce(){let e=await this.store.load(),t=e?.workerBaseUrl===this.options.workerBaseUrl?e:null,n=await this.attachWithRecovery(t);this.currentSession=n;let r=await this.openLeaderSocket(n.leaderWebSocketUrl);return this.socket=r,this.startPingLoop(r),N({state:`leader`,session:n,error:null}),n}async handleUnexpectedDisconnect(e){if(this.stopped)return;if(!this.reconnectEnabled){x.warn(`Leader WebSocket dropped and auto-reconnect is disabled`,{reason:e}),this.tearDownSocket(),this.currentSession=null,N({state:`error`,session:null,error:`Leader WebSocket dropped: ${e}`});return}if(this.reconnecting)return;this.reconnecting=!0;let t=++this.reconnectGeneration;x.warn(`Leader WebSocket dropped — starting reconnect loop`,{reason:e}),this.tearDownSocket();let n=0,r=this.reconnectBaseDelayMs,i=e;for(;!this.stopped&&t===this.reconnectGeneration&&n<this.reconnectMaxAttempts&&(n++,N({state:`reconnecting`,session:this.currentSession,error:null,reconnectAttempts:n}),this.options.onReconnecting?.(n,i),x.info(`Leader reconnect attempt`,{attempt:n,delay:r}),await this.reconnectSleep(r),!(this.stopped||t!==this.reconnectGeneration));){try{let e=await this.connectOnce();if(this.stopped||t!==this.reconnectGeneration){this.tearDownSocket();break}this.reconnecting=!1,x.info(`Leader reconnect successful`,{attempt:n,trayId:e.trayId}),this.options.onReconnected?.(e);try{this.options.onLeaderReady?.(e)}catch(e){x.warn(`onLeaderReady callback threw`,{error:e instanceof Error?e.message:String(e)})}return}catch(e){i=e instanceof Error?e.message:String(e),x.warn(`Leader reconnect attempt failed`,{attempt:n,error:i}),this.tearDownSocket()}r=Math.min(r*this.reconnectBackoffMultiplier,this.reconnectMaxDelayMs)}!this.stopped&&t===this.reconnectGeneration&&(this.reconnecting=!1,this.currentSession=null,N({state:`error`,session:null,error:`Leader reconnect failed after ${n} attempts: ${i}`,reconnectAttempts:n}),x.warn(`Leader reconnect gave up`,{attempts:n,lastError:i}),this.options.onReconnectGaveUp?.(i,n))}async clearSession(){await this.store.clear()}sendControlMessage(e){if(!this.socket)throw Error(`Tray leader WebSocket is not connected`);this.socket.send(JSON.stringify(e))}async attachWithRecovery(e){try{return await this.claimLeaderSession(e)}catch(t){if(!e||!z(t))throw t;return x.warn(`Stored tray session is stale, creating a fresh tray`,{trayId:e.trayId,error:t instanceof Error?t.message:String(t)}),await this.store.clear(),this.claimLeaderSession(null)}}async claimLeaderSession(e){let t=e??await this.createTraySession(),n=await this.fetchJson(t.controllerUrl,{method:`POST`,headers:{"content-type":`application/json`},body:JSON.stringify({controllerId:t.controllerId,leaderKey:t.leaderKey,runtime:this.options.runtime})});if(n.role!==`leader`||!n.leaderKey||!n.websocket?.url)throw Error(`Tray attach did not return leader access for controller ${n.controllerId}`);let r={...t,trayId:n.trayId,controllerId:n.controllerId,leaderKey:n.leaderKey,leaderWebSocketUrl:n.websocket.url,runtime:this.options.runtime};return await this.store.save(r),r}async createTraySession(){let e=this.options.kind?JSON.stringify({kind:this.options.kind}):void 0,t=await this.fetchJson(a(this.options.workerBaseUrl,`tray`),{method:`POST`,...e?{headers:{"content-type":`application/json`}}:{},...e?{body:e}:{}});return{workerBaseUrl:this.options.workerBaseUrl,trayId:t.trayId,createdAt:t.createdAt,controllerId:crypto.randomUUID(),controllerUrl:t.capabilities.controller.url,joinUrl:t.capabilities.join.url,webhookUrl:t.capabilities.webhook.url,runtime:this.options.runtime}}async openLeaderSocket(e){return await new Promise((t,n)=>{let r=this.webSocketFactory(e),i=!1,a=setTimeout(()=>{o(`Tray leader WebSocket timed out after ${this.connectTimeoutMs}ms waiting for leader.connected`);try{r.close(1e3,`leader.connected timeout`)}catch{}},this.connectTimeoutMs),o=e=>{i||(i=!0,clearTimeout(a),n(Error(e)))};r.addEventListener(`message`,e=>{let n=B(e.data);if(n){if(n.type===`leader.connected`){i||(i=!0,clearTimeout(a),t(r));return}if(n.type===`pong`){x.debug(`Tray leader heartbeat acknowledged`,{trayId:this.currentSession?.trayId});return}this.options.onControlMessage?.(n)}}),r.addEventListener(`close`,()=>o(`Tray leader WebSocket closed before leader.connected`)),r.addEventListener(`error`,()=>o(`Tray leader WebSocket failed before leader.connected`))})}startPingLoop(e){this.pingTimer&&clearInterval(this.pingTimer);let t=t=>{this.stopped||this.socket!==e||this.handleUnexpectedDisconnect(t).catch(e=>{x.warn(`Leader reconnect loop crashed`,{error:e instanceof Error?e.message:String(e)})})},n=()=>{try{e.send(JSON.stringify({type:`ping`}))}catch(e){t(`Leader ping send failed: ${e instanceof Error?e.message:String(e)}`)}};n(),this.pingTimer=setInterval(n,this.pingIntervalMs),e.addEventListener(`close`,()=>t(`Leader WebSocket closed`)),e.addEventListener(`error`,()=>t(`Leader WebSocket errored`))}async fetchJson(e,t){let n=await this.fetchImpl(e,t);if(!n.ok)throw await L.fromResponse(n);return await n.json()}},L=class e extends Error{status;code;constructor(e,t,n){super(n),this.status=e,this.code=t,this.name=`LeaderTrayHttpError`}static async fromResponse(t){try{let n=await t.json();return new e(t.status,n.code??null,n.error??`Tray request failed (${t.status})`)}catch{return new e(t.status,null,`Tray request failed (${t.status})`)}}},R=class extends Error{constructor(e){super(e),this.name=`TrayProxyFetchError`}};function z(e){return e instanceof R?!0:e instanceof L?e.status===403||e.status===404||e.status===410||e.status>=500:!1}function B(e){if(typeof e!=`string`)return null;try{return JSON.parse(e)}catch{return null}}function V(e=fetch){return typeof chrome<`u`&&chrome?.runtime?.id?(t,n)=>e(t,n):async(a,o={})=>{let s=typeof a==`string`?a:a.toString();try{if(new URL(s).origin===window.location.origin)return e(s,{...o,cache:`no-store`})}catch{}let c=new Headers(o.headers);c.set(`X-Target-URL`,s);for(let[e,t]of Object.entries(r()))c.set(e,t);let l=await e(t(`/api/fetch-proxy`),{...o,headers:c,cache:`no-store`});if(n(l))throw new R(await i(l));return l}}export{M as i,A as n,N as r,I as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{h as e,m as t}from"./main-Bpuh8nYF.js";async function n(n,i){let a=i.getLeader()?`leader`:i.getFollower()?`follower`:`inactive`,o=i.getLeader();i.setLeader(null);let s=i.getFollower();i.setFollower(null),i.clearLeaderHooks();let{requestId:c}=n;try{o?.stop()}catch(e){i.log.error(`Leader stop threw during tray-leave — resources may have leaked`,{requestId:c,error:e instanceof Error?e.message:String(e)})}try{s?.stop()}catch(e){i.log.error(`Follower stop threw during tray-leave — resources may have leaked`,{requestId:c,error:e instanceof Error?e.message:String(e)})}if(r(()=>i.storage.removeItem(t),i.log,`join-clear`,c),n.workerBaseUrl===null)return r(()=>i.storage.removeItem(e),i.log,`worker-clear`,c),a===`inactive`?{kind:`noop`}:{kind:`left`,previousMode:a};let l=n.workerBaseUrl,u;try{u=i.startLeader(l)}catch(t){throw i.log.error(`startLeader failed during tray-leave — runtime is now dormant`,{workerBaseUrl:l,requestId:c,error:t instanceof Error?t.message:String(t)}),r(()=>i.storage.removeItem(e),i.log,`worker-clear-on-failure`,c),t}return i.setLeader(u),i.wireLeaderHooks(u),r(()=>i.storage.setItem(e,l),i.log,`worker-set`,c),{kind:`switched`,previousMode:a,workerBaseUrl:l}}function r(e,t,n,r){try{e()}catch(e){t.error(`tray-leave storage write failed`,{kind:n,requestId:r,error:e instanceof Error?e.message:String(e)})}}export{n as performTrayLeave};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{C as e,w as t}from"./kernel-worker-
|
|
1
|
+
import{C as e,w as t}from"./kernel-worker-BOiHtoD5.js";const n=`slicc:last-seen-version`;function r(){return{version:`5.4.0`,releasedAt:`2026-06-25T10:21:51Z`}}async function i(){let t=await e(n);return t&&t.length>0?t:null}async function a(e){await t(n,e)}async function o(){let e=r(),t=await i();return t===null?(await a(e.version),{bundled:e,lastSeen:null,isUpgrade:!1}):t===e.version?{bundled:e,lastSeen:t,isUpgrade:!1}:{bundled:e,lastSeen:t,isUpgrade:!0}}async function s(e){await a(e)}export{o as detectUpgrade,s as recordVersionSeen};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/wc-shell-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/wc-shell-DjTIqVcb.js","assets/chunk-aKtaBQYM.js","assets/preload-helper-zJ_50EbN.js","assets/icons-BU6llBsN.js","assets/main-Bpuh8nYF.js","assets/modulepreload-polyfill-Dezn_h7o.js","assets/account-store-DFegnWPt.js","assets/dist-BmWy99kl.js","assets/event-stream-BJI_nGaK.js","assets/json-parse-BUunmmNl.js","assets/__vite-browser-external-C7iut881.js","assets/context-compaction-CFWyOzX1.js","assets/logger-DDBAeTLF.js","assets/src-DlEHAkLd.js","assets/proxied-fetch-CKDBmEMl.js","assets/fetch-body-D2PwksUW.js","assets/secret-topology-bwXIzzAK.js","assets/secrets-bridge-client-BSipj-5f.js","assets/panel-rpc-DqT2FG7c.js","assets/bedrock-camp-9-QEmC9Z.js","assets/transform-messages-DzB_lMo-.js","assets/tool-ui-DfXu6quJ.js","assets/clipboard-DgFtRQbq.js","assets/soundscape-cues-5_sT5Un6.js","assets/speech-CqQdPtyQ.js","assets/wc-shell-WkeczD9x.css"])))=>i.map(i=>d[i]);
|
|
2
2
|
import{t as e}from"./preload-helper-zJ_50EbN.js";import{t}from"./wc-permissions-registry-CR1rTd2H.js";var n=8,r=2e3,i=[`/workspace`,`/shared`,`/tmp`],a=8,o=new Set([`node_modules`,`.git`]),s=1e4,c=/\.(png|jpe?g|gif|webp|svg|avif)$/i,l=4*1024*1024,u=256*1024;function d(){return`att-${Date.now()}-${Math.random().toString(36).slice(2,8)}`}function f(e){let t=``,n=32768;for(let r=0;r<e.length;r+=n)t+=String.fromCharCode(...e.subarray(r,r+n));return btoa(t)}function p(e){return{png:`image/png`,jpg:`image/jpeg`,jpeg:`image/jpeg`,gif:`image/gif`,webp:`image/webp`,svg:`image/svg+xml`,avif:`image/avif`,md:`text/markdown`,json:`application/json`}[e.toLowerCase().split(`.`).pop()??``]??`text/plain`}function m(e,t){let n={id:d(),name:e,size:t.length};if(c.test(e))return t.length>l?{...n,mimeType:p(e),kind:`image`,error:`image too large to inline`}:{...n,mimeType:p(e),kind:`image`,data:f(t)};let r={...n,mimeType:p(e),kind:`file`};return t.length>u?{...r,error:`file too large to inline`}:r}async function h(e){let t=new Uint8Array(await e.arrayBuffer()),n=m(e.name,t);return e.type?{...n,mimeType:e.type}:n}function g(e,t){let n=t.match(/^data:(image\/[^;]+);base64,(.+)$/);return n?{id:d(),name:e,mimeType:n[1],size:Math.floor(n[2].length*3/4),kind:`image`,data:n[2]}:null}var _=`/tmp/upload`,v=1568;function y(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}async function b(e,t,n){await e.mkdir(_,{recursive:!0}).catch(()=>void 0);let r=`${_}/${Date.now()}-${t.replace(/[^A-Za-z0-9._-]+/g,`_`)}`;return await e.writeFile(r,n),r}async function x(e,t=v){let n=new Image;n.src=e;try{await n.decode()}catch{return e}let r=Math.min(1,t/Math.max(n.naturalWidth,n.naturalHeight,1));if(r>=1)return e;let i=document.createElement(`canvas`);return i.width=Math.round(n.naturalWidth*r),i.height=Math.round(n.naturalHeight*r),i.getContext(`2d`)?.drawImage(n,0,0,i.width,i.height),i.toDataURL(`image/jpeg`,.85)}async function S(e,t,n){let r=g(e,t);if(!r)return null;let i;return n&&r.data&&(i=await b(n,e,y(r.data)).catch(()=>void 0)),{...g(e,await x(t).catch(()=>t))??r,name:e,path:i}}async function C(e,t,n){if(!n)return null;let r=new Uint8Array(await t.arrayBuffer()),i=await b(n,e,r).catch(()=>void 0);return i?{id:d(),name:e,mimeType:t.type||`video/webm`,size:r.length,kind:`file`,path:i}:null}async function w(e){let t=[],n=i.map(e=>({dir:e,depth:0}));for(;n.length>0&&t.length<r;){let{dir:i,depth:s}=n.shift(),c;try{c=await e.readDir(i)}catch{continue}for(let e of c){let c=`${i}/${e.name}`;if(e.type===`directory`)s<a&&!o.has(e.name)&&n.push({dir:c,depth:s+1});else if(t.push(c),t.length>=r)break}}return t}function T(e){let t=null;return async r=>{let i=await e.openReader();(!t||Date.now()-t.at>s)&&(t={at:Date.now(),paths:await w(i)});let a=e=>r===``||e.toLowerCase().includes(r),o=t.paths.filter(e=>a(e)).slice(0,n).map(e=>({id:e,label:e.split(`/`).pop()??e,sub:e.slice(0,e.lastIndexOf(`/`))})),c=[];try{c=(await i.readDir(`/workspace/skills`)).filter(e=>e.type===`directory`&&a(e.name)).slice(0,n).map(e=>({id:e.name,label:e.name}))}catch{}let l=(await e.listConversations().catch(()=>[])).filter(e=>a(e.label)).slice(0,n);return[{kind:`file`,label:`Files`,icon:`file`,entries:o},{kind:`skill`,label:`Skills`,icon:`sparkles`,entries:c},{kind:`conversation`,label:`Conversations`,icon:`message-square`,entries:l}]}}var E=`slicc-wc-attach-style`,D=`
|
|
3
3
|
.wcatt{display:flex;flex-wrap:wrap;gap:6px;padding:8px 10px 0;font-family:var(--ui);}
|
|
4
4
|
.wcatt:empty{display:none;}
|
|
@@ -10,4 +10,4 @@ import{t as e}from"./preload-helper-zJ_50EbN.js";import{t}from"./wc-permissions-
|
|
|
10
10
|
.wcatt__x{appearance:none;background:none;border:none;cursor:pointer;color:var(--txt-3);
|
|
11
11
|
font:inherit;padding:0;line-height:1;}
|
|
12
12
|
.wcatt__x:hover{color:var(--ink);}
|
|
13
|
-
`,O=class{#e;#t=[];constructor(e){if(!document.getElementById(E)){let e=document.createElement(`style`);e.id=E,e.textContent=D,document.head.appendChild(e)}this.#e=document.createElement(`div`),this.#e.className=`wcatt`,e.prepend(this.#e)}get items(){return this.#t}add(e){this.#t.push(e),this.#n()}take(){let e=this.#t;return this.#t=[],this.#n(),e}#n(){this.#e.replaceChildren(...this.#t.map(e=>this.#r(e)))}#r(t){let n=document.createElement(`span`);if(n.className=`wcatt__chip`,t.kind===`image`&&t.data){let r=document.createElement(`img`);r.className=`wcatt__thumb`,r.src=`data:${t.mimeType};base64,${t.data}`,r.alt=t.name,r.addEventListener(`click`,()=>{e(async()=>{let{SliccImagePreview:e}=await import(`./wc-shell-
|
|
13
|
+
`,O=class{#e;#t=[];constructor(e){if(!document.getElementById(E)){let e=document.createElement(`style`);e.id=E,e.textContent=D,document.head.appendChild(e)}this.#e=document.createElement(`div`),this.#e.className=`wcatt`,e.prepend(this.#e)}get items(){return this.#t}add(e){this.#t.push(e),this.#n()}take(){let e=this.#t;return this.#t=[],this.#n(),e}#n(){this.#e.replaceChildren(...this.#t.map(e=>this.#r(e)))}#r(t){let n=document.createElement(`span`);if(n.className=`wcatt__chip`,t.kind===`image`&&t.data){let r=document.createElement(`img`);r.className=`wcatt__thumb`,r.src=`data:${t.mimeType};base64,${t.data}`,r.alt=t.name,r.addEventListener(`click`,()=>{e(async()=>{let{SliccImagePreview:e}=await import(`./wc-shell-DjTIqVcb.js`).then(e=>e.h);return{SliccImagePreview:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25])).then(({SliccImagePreview:e})=>e.show(r.src,r))}),n.append(r)}let r=document.createElement(`span`);r.className=`wcatt__name`,r.textContent=t.name;let i=document.createElement(`button`);return i.type=`button`,i.className=`wcatt__x`,i.setAttribute(`aria-label`,`Remove ${t.name}`),i.textContent=`×`,i.addEventListener(`click`,()=>{this.#t=this.#t.filter(e=>e.id!==t.id),this.#n()}),n.append(r,i),n}};async function k(e){let t=document.createElement(`video`);t.srcObject=e,t.muted=!0;try{await t.play(),await new Promise(e=>requestAnimationFrame(()=>e(null)));let e=document.createElement(`canvas`);return e.width=t.videoWidth,e.height=t.videoHeight,e.width===0||e.height===0?null:(e.getContext(`2d`)?.drawImage(t,0,0),e.toDataURL(`image/png`))}finally{for(let t of e.getTracks())t.stop();t.srcObject=null}}async function A(){let e=t();if(e){let t=await e.request(`screenshare`,{constraints:{video:!0}});if(!t)return null;let n=t.stream;return k(n)}return k(await navigator.mediaDevices.getDisplayMedia({video:!0}))}async function j(e,n){let r=t();if(!r)return null;let i=await r.prompt({kinds:e,description:n});for(let e of i.grants)if(e.kind===`camera`||e.kind===`microphone`||e.kind===`screenshare`)for(let t of e.stream.getTracks())t.stop();return i.status===`granted`}var M=`slicc_camera_device`,N=`slicc_microphone_device`,P=[`position:absolute`,`left:50%`,`right:auto`,`transform:translateX(-50%)`,`bottom:56px`,`width:calc(100% - 32px)`,`max-width:680px`,`z-index:3`].join(`;`);async function F(e,t){if(await j([`camera`,`microphone`],`Slicc is requesting access to your camera and microphone to capture a photo or video for this conversation.`)===!1)return null;let n=document.createElement(`slicc-composer-capture`),r=localStorage.getItem(M);r&&n.setAttribute(`preferred-device`,r);let i=localStorage.getItem(N);i&&n.setAttribute(`preferred-audio-device`,i),n.style.cssText=P,n.hidden=!0,n.addEventListener(`slicc-capture-device-change`,e=>{let t=e.detail;if(!t?.deviceId)return;let n=t.kind===`microphone`?N:M;localStorage.setItem(n,t.deviceId)}),e.append(n);try{return await n.open(t)}finally{n.remove()}}async function I(e,t,n){if(!e.dataUrl)return;let r=`photo-${Date.now()}.png`,i=await t.openWriter?.().catch(()=>null)??null,a=await S(r,e.dataUrl,i);a&&n.add(a)}async function L(e,t,n){if(!e.blob)return;let r=/webm/i.test(e.mimeType)?`webm`:`bin`,i=`video-${Date.now()}.${r}`,a=await t.openWriter?.().catch(()=>null)??null,o=await C(i,e.blob,a);o&&n.add(o)}async function R(e,t,n){if(e.mode===`photo`){if(!t.composer){let e=await z();if(!e)return;let r=await S(`photo-${Date.now()}.png`,e,await t.openWriter?.().catch(()=>null)??null);r&&n.add(r);return}let e=await F(t.composer,`photo`);if(!e)return;e.kind===`image`?await I(e,t,n):e.kind===`video`&&await L(e,t,n);return}let r=await A();if(!r)return;let i=await S(`screenshot-${Date.now()}.png`,r,await t.openWriter?.().catch(()=>null)??null);i&&n.add(i)}async function z(){if(await j([`camera`],`Slicc is requesting access to your camera to capture a photo for this conversation.`)===!1)return null;let e=document.createElement(`slicc-camera-dialog`),t=localStorage.getItem(M);t&&e.setAttribute(`preferred-device`,t),e.addEventListener(`slicc-camera-device-change`,e=>{let t=e.detail?.deviceId;t&&localStorage.setItem(M,t)}),document.body.append(e);try{return await e.open()}finally{e.remove()}}async function B(e,t,n){let r=await n.openWriter?.().catch(()=>null)??null,i=r?await b(r,e.name,t).catch(()=>void 0):void 0;return i?{...e,error:void 0,path:i}:e.kind===`image`?e:{...e,error:`could not be saved to the virtual filesystem`}}async function V(e,t,n){let r=e.split(`/`).pop()??e;if(c.test(r)){let i=await(await t.openReader()).readFile(e),a=m(r,typeof i==`string`?new TextEncoder().encode(i):i);n.add({...a,error:void 0,path:e});return}let i=0;try{i=(await(await t.openReader()).stat(e)).size}catch{}n.add({id:d(),name:r,mimeType:p(r),size:i,kind:`file`,path:e})}function H(e,t){let n=t.value??t.getAttribute(`value`)??``,r=n&&!n.endsWith(` `)?` `:``;t.setAttribute(`value`,`${n}${r}Use the "${e}" skill: `)}async function U(e,t,n){if(e.kind===`upload`&&e.file instanceof File){let r=new Uint8Array(await e.file.arrayBuffer());n.add(await B(await h(e.file),r,t))}else e.kind===`capture`?await R(e,t,n):e.kind===`file`&&typeof e.id==`string`?await V(e.id,t,n):e.kind===`skill`&&typeof e.label==`string`?H(e.label,t.inputCard):e.kind===`conversation`&&typeof e.id==`string`&&t.freezer.dispatchEvent(new CustomEvent(`freezer-card-select`,{bubbles:!0,composed:!0,detail:{slug:e.id}}))}function W(e){let{inputCard:t,log:n}=e,r=new O(t),i=t.querySelector(`slicc-add-menu`);return i&&(i.provider=T({openReader:e.openReader,listConversations:e.listConversations}),i.setAttribute(`global-drop`,``)),t.addEventListener(`slicc-add`,t=>{let i=t.detail;i&&U(i,e,r).catch(e=>n.error(`WC add-menu action failed`,e))}),r}export{W as wireWcAttach};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{
|
|
1
|
+
import{S as e}from"./main-Bpuh8nYF.js";var t=`slicc-detached-overlay`;function n(t){let{client:n,isDetachedSelf:r}=t;chrome.runtime.onMessage.addListener(t=>(!e(t)||t.source!==`service-worker`||t.payload.type!==`detached-active`||r||i(n),!1)),r&&chrome.runtime.sendMessage({source:`panel`,payload:{type:`detached-claim`}}).catch(()=>void 0)}function r(){chrome.runtime.sendMessage({source:`panel`,payload:{type:`detached-popout-request`}}).catch(e=>{console.warn(`[slicc] detached-popout-request failed`,e)})}function i(e){try{window.close()}catch{}e.setLocked(!0),a()}function a(){if(document.getElementById(t))return;let e=document.createElement(`div`);e.id=t,e.style.cssText=`position:fixed;inset:0;z-index:9999;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;padding:24px;text-align:center;background:var(--canvas,#fff);color:var(--ink,#111);font:14px/1.5 var(--ui,system-ui)`;let n=document.createElement(`strong`);n.textContent=`SLICC is open in a detached window`;let r=document.createElement(`span`);r.textContent=`This panel yields while the detached window is active.`;let i=document.createElement(`button`);i.textContent=`Close this window`,i.style.cssText=`margin-top:8px;padding:8px 16px;border:none;border-radius:999px;cursor:pointer;background:var(--ink,#111);color:var(--canvas,#fff);font:600 13px var(--ui,system-ui)`,i.addEventListener(`click`,()=>window.close()),e.append(n,r,i),document.body.appendChild(e)}export{r as requestDetachedPopout,n as wireWcDetached};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/main-
|
|
2
|
-
import{t as e}from"./preload-helper-zJ_50EbN.js";import{wireWcDetached as t}from"./wc-detached-
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/main-Bpuh8nYF.js","assets/chunk-aKtaBQYM.js","assets/modulepreload-polyfill-Dezn_h7o.js","assets/preload-helper-zJ_50EbN.js","assets/account-store-DFegnWPt.js","assets/dist-BmWy99kl.js","assets/event-stream-BJI_nGaK.js","assets/json-parse-BUunmmNl.js","assets/__vite-browser-external-C7iut881.js","assets/context-compaction-CFWyOzX1.js","assets/logger-DDBAeTLF.js","assets/src-DlEHAkLd.js","assets/proxied-fetch-CKDBmEMl.js","assets/fetch-body-D2PwksUW.js","assets/secret-topology-bwXIzzAK.js","assets/secrets-bridge-client-BSipj-5f.js","assets/panel-rpc-DqT2FG7c.js","assets/bedrock-camp-9-QEmC9Z.js","assets/transform-messages-DzB_lMo-.js","assets/tool-ui-DfXu6quJ.js","assets/clipboard-DgFtRQbq.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{t as e}from"./preload-helper-zJ_50EbN.js";import{wireWcDetached as t}from"./wc-detached-CvvTnnwH.js";import{attachWcClient as n,createWcLiveCallbacks as r,n as i,prepareWcShell as a}from"./wc-live-Chbuwmqb.js";async function o(o,s,c=!1){let l=a(o,`extension · wc`),u=new i(r(l.wiring));n(l,u,s),t({client:u,isDetachedSelf:c});let{setupSudoExtension:d}=await e(async()=>{let{setupSudoExtension:e}=await import(`./main-Bpuh8nYF.js`).then(e=>e.f);return{setupSudoExtension:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20]));await d({log:s}),u.requestState(),s.info(`WC extension shell connected to offscreen engine`)}export{o as mountWcUiExtension};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/wc-live-
|
|
2
|
-
import{t as e}from"./preload-helper-zJ_50EbN.js";import{t}from"./logger-DDBAeTLF.js";import{
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/wc-live-Chbuwmqb.js","assets/preload-helper-zJ_50EbN.js","assets/account-store-DFegnWPt.js","assets/chunk-aKtaBQYM.js","assets/dist-BmWy99kl.js","assets/event-stream-BJI_nGaK.js","assets/json-parse-BUunmmNl.js","assets/__vite-browser-external-C7iut881.js","assets/context-compaction-CFWyOzX1.js","assets/logger-DDBAeTLF.js","assets/src-DlEHAkLd.js","assets/proxied-fetch-CKDBmEMl.js","assets/fetch-body-D2PwksUW.js","assets/secret-topology-bwXIzzAK.js","assets/secrets-bridge-client-BSipj-5f.js","assets/panel-rpc-DqT2FG7c.js","assets/bedrock-camp-9-QEmC9Z.js","assets/transform-messages-DzB_lMo-.js","assets/tool-ui-DfXu6quJ.js","assets/wc-shell-DjTIqVcb.js","assets/icons-BU6llBsN.js","assets/main-Bpuh8nYF.js","assets/modulepreload-polyfill-Dezn_h7o.js","assets/clipboard-DgFtRQbq.js","assets/soundscape-cues-5_sT5Un6.js","assets/speech-CqQdPtyQ.js","assets/wc-shell-WkeczD9x.css","assets/hid-device-registry-D2LsJCRr.js","assets/usb-operations-CkcrNzZw.js","assets/serial-port-registry-Bc4wlwED.js","assets/usb-device-registry-BP58Vi0S.js","assets/tray-leader-CaTLZ0nn.js","assets/sprinkle-bridge-Du2dCM8G.js","assets/shared-Bn9ltvMZ.js","assets/mime-types-ugOWOUZ9.js","assets/path-utils-DU6QhF_k.js","assets/sprinkle-renderer-GiRRbdBx.js","assets/theme-BBwuyzvz.js","assets/wc-permissions-registry-CR1rTd2H.js","assets/follower-navigate-watcher-CnHWEu_l.js","assets/navigation-watcher-BxAAD5To.js","assets/handoff-link-ywwq4k0t.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{t as e}from"./preload-helper-zJ_50EbN.js";import{t}from"./logger-DDBAeTLF.js";import{d as n,h as r,m as i,x as a,y as o}from"./main-Bpuh8nYF.js";import{n as s}from"./remote-cdp-transport-Cf0sDZ5N.js";import{i as c}from"./wc-shell-DjTIqVcb.js";import{prepareWcShell as l,t as u}from"./wc-live-Chbuwmqb.js";import{t as d}from"./page-follower-tray-CgF4beVv.js";import{WcSprinkleZone as f}from"./wc-sprinkles-DvkKhy2T.js";var p=t(`follower-switch-out`);function m(e,t){t.stopFollower();try{t.storage.removeItem(i),e.workerBaseUrl===null?t.storage.removeItem(r):t.storage.setItem(r,e.workerBaseUrl)}catch(e){p.error(`follower switch-out: storage write failed — state may revert on reload`,{error:e instanceof Error?e.message:String(e)})}try{let e=t.getHref(),n=a(e);n!==e&&t.replaceHref(n)}catch(e){p.error(`follower switch-out: URL normalize failed — may re-enter follower on reload`,{error:e instanceof Error?e.message:String(e)})}t.reload()}var h=t(`wc-follower`),g={sendMessage:()=>{},onEvent:()=>()=>{},stop:()=>{}};function _(e,t){for(;e.firstChild;)e.removeChild(e.firstChild);let n=document.createElement(`div`);n.style.cssText=`padding:2rem;text-align:center;font-family:system-ui;`;let r=document.createElement(`h1`);r.style.color=`var(--s2-negative, #e34850)`,r.textContent=`Could not start follower`;let i=document.createElement(`p`);i.style.color=`var(--s2-content-tertiary, #717171)`,i.textContent=t,n.append(r,i),e.appendChild(n)}function v(e,t,n){let r=e=>{let t=document.createElement(`div`);return t.className=`wcui-placeholder`,t.textContent=e,t};e.style.display=`none`,e.parentElement?.append(r(`Files live on the leader. A follower mirrors the leader’s chat, sprinkles, and browser tabs — not its filesystem.`)),t.append(r(`The shell runs on the leader. A follower has no local terminal — drive the session through chat.`)),n.append(r(`Memory lives on the leader. A follower has no local memory store.`))}async function y(t,r,i){let a=i===`cherry`,p;try{p=await n({runtimeMode:i,envBaseUrl:null,window,log:r})}catch(e){let n=e instanceof Error?e.message:String(e);h.error(`follower prelude failed`,{runtimeMode:i,error:n}),_(t,n);return}let y=a?p.cherryJoinUrl:o(window.location.href,window.localStorage);if(!y){h.error(`follower mount with no join URL — falling back to live boot`);let{mountWcUiLive:n}=await e(async()=>{let{mountWcUiLive:e}=await import(`./wc-live-Chbuwmqb.js`);return{mountWcUiLive:e}},__vite__mapDeps([0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38]));return n(t,r,`standalone`)}let b=l(t,a?`cherry · follower`:`follower`);v(b.refs.fileTree,b.refs.termSurface,b.refs.memoryHost);let x=new u({thread:b.refs.thread,agent:g});b.setController(x);let S=`Connecting to leader…`,C=(e,t)=>{b.refs.inputCard.setAttribute(`placeholder`,t),e?b.refs.inputCard.removeAttribute(`disabled`):b.refs.inputCard.setAttribute(`disabled`,``)};C(!1,S),b.refs.inputCard.addEventListener(`submit`,e=>{let t=c(e);t&&x.sendUserMessage(t)});let w=new f(b.refs).callbacks(),T=d({joinUrl:y,runtime:a?s:`slicc-standalone`,browserAPI:p.browser,onSnapshot:e=>x.loadMessages(e),onUserMessage:(e,t,n,r)=>x.addUserMessage(e,r),onStatus:e=>x.setProcessing(e===`processing`),setChatAgent:e=>x.setAgent(e),onConnectionChange:e=>C(e,e?`Ask the leader, or describe a change…`:S),onGaveUp:e=>{h.error(`follower gave up reaching the leader`,{error:e}),C(!1,`Couldn't reach the leader. Reload to retry.`)},addSprinkle:w.addSprinkle,removeSprinkle:w.removeSprinkle,onOpen:e=>{/^https?:\/\//.test(e)?window.open(e,`_blank`,`noopener`):h.warn(`follower sprinkle open() of a local path is unavailable`,{path:e})},...a?{onCherrySliccEvent:(e,t)=>p.cherryTransport?.emitSliccEventToHost(e,t)}:{}});a&&p.cherryTransport&&(p.cherryTransport.onHostEvent=(e,t)=>T.currentSync?.sendCherryHostEvent(e,t));let E=null;if(!a){let{startFollowerNavigateWatcher:t}=await e(async()=>{let{startFollowerNavigateWatcher:e}=await import(`./follower-navigate-watcher-CnHWEu_l.js`);return{startFollowerNavigateWatcher:e}},__vite__mapDeps([39,40,9,41]));E=t(p.realCdpTransport,()=>T.currentSync)}b.refs.avatarMenu.items=[{kind:`separator`},{id:`tray-stop`,label:`Disconnect from leader`,icon:`unplug`,danger:!0}],b.refs.avatarMenu.addEventListener(`slicc-avatar-action`,e=>{e.detail?.id===`tray-stop`&&window.dispatchEvent(new CustomEvent(`slicc:tray-leave`,{detail:{workerBaseUrl:null}}))}),window.addEventListener(`slicc:tray-leave`,e=>{m({workerBaseUrl:(e.detail??{}).workerBaseUrl??null},{storage:window.localStorage,stopFollower:()=>{E?.(),T.stop()},getHref:()=>window.location.href,replaceHref:e=>window.history.replaceState(null,``,e),reload:()=>window.location.reload()})}),h.info(`follower mounted`,{runtimeMode:i,isCherry:a})}export{y as mountWcUiFollower};
|