sliccy 6.7.1 → 6.7.2
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-DcRnavVA.js → account-store-CJEiowvN.js} +1 -1
- package/dist/ui/assets/{account-store-DIVNUQIo.js → account-store-CysBUUQJ.js} +1 -1
- package/dist/ui/assets/{adobe-D_SNyGSN.js → adobe-CNFykD03.js} +1 -1
- package/dist/ui/assets/{adobe-CF_jJ0UM.js → adobe-DVg3o99r.js} +1 -1
- package/dist/ui/assets/{apps-e_6VBmSq.js → apps-BW3Oz1Y-.js} +1 -1
- package/dist/ui/assets/{azure-openai-Djl4rJs-.js → azure-openai-Cw8XjNk4.js} +1 -1
- package/dist/ui/assets/{azure-openai-CxtqP-NJ.js → azure-openai-jOz-FRxG.js} +1 -1
- package/dist/ui/assets/{cerebras-BGrvllaj.js → cerebras-7j_cJCUH.js} +1 -1
- package/dist/ui/assets/{cerebras-Ba5_8dhF.js → cerebras-CARI-C52.js} +1 -1
- package/dist/ui/assets/{connect-surface-BfL-Hz8-.js → connect-surface-D4yI8jZH.js} +1 -1
- package/dist/ui/assets/dist-BlzIXVXL.js +2 -0
- package/dist/ui/assets/dist-DIYpvNeF.js +2 -0
- package/dist/ui/assets/{fs-dFnZMZlE.js → fs-CVsqBODM.js} +1 -1
- package/dist/ui/assets/{fs-BMKjfoBZ.js → fs-DL8cK1hj.js} +2 -2
- package/dist/ui/assets/{github-0TMFcANZ.js → github--kukodlK.js} +2 -2
- package/dist/ui/assets/{github-copilot-DNN7ukUL.js → github-copilot-DlmAfv3i.js} +1 -1
- package/dist/ui/assets/{github-copilot-B9_AQHaE.js → github-copilot-KQLyygnx.js} +1 -1
- package/dist/ui/assets/{github-BVpq_CRW.js → github-nhvWTo1J.js} +1 -1
- package/dist/ui/assets/{kernel-worker-lVell-lm.js → kernel-worker-B67oBRUh.js} +18 -18
- package/dist/ui/assets/{local-llm-C4iAjYRB.js → local-llm-7ddT86qb.js} +1 -1
- package/dist/ui/assets/{local-llm-DE4-Y_h8.js → local-llm-9V2nT_qC.js} +1 -1
- package/dist/ui/assets/{main-D27SqZeW.js → main-BATAIZJP.js} +3 -3
- package/dist/ui/assets/{mount-CumPEsj1.js → mount-CQwcMV_F.js} +1 -1
- package/dist/ui/assets/{mount-DVK2IjbO.js → mount-DLFFkSOw.js} +2 -2
- package/dist/ui/assets/{mount-recovery-DKXX_1FG.js → mount-recovery-D4LSB-KQ.js} +1 -1
- package/dist/ui/assets/{new-session-CQEb_ELT.js → new-session-FIXn2nko.js} +2 -2
- package/dist/ui/assets/{oauth-bootstrap-CYlXs7B2.js → oauth-bootstrap-CysuVxDa.js} +2 -2
- package/dist/ui/assets/{openai-codex-GH6Gu6dQ.js → openai-codex-DSWCeXF8.js} +1 -1
- package/dist/ui/assets/{openai-codex-DP-I3MPQ.js → openai-codex-L0P-RVew.js} +1 -1
- package/dist/ui/assets/{openrouter-D_A0LLAn.js → openrouter-B7xDa-L5.js} +1 -1
- package/dist/ui/assets/{openrouter-YF0qDkZL.js → openrouter-D80siy_U.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-CWQNt3C8.js → openrouter-oauth-BFWWLqj4.js} +1 -1
- package/dist/ui/assets/{openrouter-oauth-BdvGV1hT.js → openrouter-oauth-Bf47JNKK.js} +1 -1
- package/dist/ui/assets/{panel-rpc-handlers-DH5GGDDd.js → panel-rpc-handlers-DAgL3NAS.js} +2 -2
- package/dist/ui/assets/{provider--bQJkc5T.js → provider-BMlQ6-V6.js} +1 -1
- package/dist/ui/assets/{provider-BV6eZmoA.js → provider-L11hxHeS.js} +2 -2
- package/dist/ui/assets/{provider-settings-BAT6df9n.js → provider-settings-B4rEHMW6.js} +1 -1
- package/dist/ui/assets/{provider-settings-DzNWqjkF.js → provider-settings-a1nHhD_8.js} +1 -1
- package/dist/ui/assets/provider-store-access-C0EyiLUq.js +1 -0
- package/dist/ui/assets/{provider-store-access-D3z7HxfS.js → provider-store-access-CAWGqbUW.js} +2 -2
- package/dist/ui/assets/{providers-BqGRsgfs.js → providers-CLGnrQ6p.js} +2 -2
- package/dist/ui/assets/{providers-id1wrHDJ.js → providers-CZB0cXRu.js} +1 -1
- package/dist/ui/assets/{quick-llm-w90NI9-v.js → quick-llm-DKk9pK8_.js} +1 -1
- package/dist/ui/assets/{redirect-uri-D1Ck0rOI.js → redirect-uri-BqBUQdM5.js} +1 -1
- package/dist/ui/assets/{session-freezer-DMTLWQpb.js → session-freezer-DqAxoGJ_.js} +2 -2
- package/dist/ui/assets/{setup-feature-flags-remote-DhuliMqP.js → setup-feature-flags-remote-iZXxY35M.js} +1 -1
- package/dist/ui/assets/{setup-standalone-prelude-kjwkWB9z.js → setup-standalone-prelude-y8NGd_3h.js} +1 -1
- package/dist/ui/assets/{setup-sudo-DUk8aFKL.js → setup-sudo-vqSc8pzk.js} +2 -2
- package/dist/ui/assets/{skills-BvarZh19.js → skills-BcxxniVN.js} +1 -1
- package/dist/ui/assets/{store-6Or6yQCn.js → store-DKBwY1LO.js} +1 -1
- package/dist/ui/assets/{sudo-rNEZM9VR.js → sudo-B4W1O9pP.js} +1 -1
- package/dist/ui/assets/{upgrade-detection-BLm2WdEO.js → upgrade-detection-CNBV5I5-.js} +1 -1
- package/dist/ui/assets/{wc-extension-BOYGDoDe.js → wc-extension-DnoMXsSf.js} +2 -2
- package/dist/ui/assets/{wc-follower-DaAimIhN.js → wc-follower-CiEV5ftc.js} +3 -3
- package/dist/ui/assets/{wc-live-BZ18v3RK.js → wc-live-B1Iu67p2.js} +3 -3
- package/dist/ui/assets/{wc-nav-B8uMwG_o.js → wc-nav-4l0__ItF.js} +2 -2
- package/dist/ui/assets/{wc-onboarding-CMf55U73.js → wc-onboarding-BlB3EEKF.js} +2 -2
- package/dist/ui/assets/{wc-placeholder-ComAbt41.js → wc-placeholder-Dad2TVLF.js} +2 -2
- package/dist/ui/assets/{wc-settings-BqqP9tNw.js → wc-settings-Vbh_8eo_.js} +2 -2
- package/dist/ui/assets/{wc-shell-DZs5ls6O.js → wc-shell-D-sgt0Jv.js} +2 -2
- package/dist/ui/assets/{wc-sprinkles-m8vl63Ub.js → wc-sprinkles-BT3nD0Fl.js} +2 -2
- package/dist/ui/assets/{wc-tray-BAQeWy1x.js → wc-tray-BaxW8xKP.js} +2 -2
- package/dist/ui/assets/{xai-grok-Cnf1-HJF.js → xai-grok-BjDy3qLc.js} +1 -1
- package/dist/ui/assets/{xai-grok-QAH8xapu.js → xai-grok-C-SdAKKH.js} +1 -1
- package/dist/ui/index.html +6 -6
- package/dist/ui/packages/webapp/index.html +6 -6
- package/package.json +7 -6
- package/dist/ui/assets/dist-BhEJb2Dl.js +0 -2
- package/dist/ui/assets/dist-Bj10RLrf.js +0 -2
- package/dist/ui/assets/provider-store-access-DP-G6pVf.js +0 -1
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/panel-rpc-DmJSNs0I.js","assets/rolldown-runtime-aKtaBQYM.js","assets/panel-rpc-handlers-
|
|
2
|
-
import{P as e,d as t,z as n}from"./account-store-DIVNUQIo.js";import{t as r}from"./preload-helper-Czpn1I53.js";import{n as i}from"./attachments-CByeG2Ru.js";import{t as a}from"./logger-DDBAeTLF.js";import{n as o,t as s}from"./base64-DpPqYZJF.js";import{r as c}from"./src-BStYtmHq.js";import{a as l,l as u,n as d,o as f,r as p,u as m}from"./tray-sync-protocol-CQ9Z94EX.js";import{o as h,t as g}from"./proxied-fetch-A48etSCh.js";import{a as _,f as v,i as y,r as b}from"./tray-runtime-config-DRqOLcXQ.js";import{r as x}from"./panel-rpc-DmJSNs0I.js";import{n as ee,o as te,t as S}from"./tray-follower-status-5SqDRLX8.js";import"./provider-settings-BAT6df9n.js";import"./handoff-link-Da4o0fy_.js";import{t as ne}from"./remote-cdp-transport-CaLf00Hc.js";import"./browser-COVn7LPD.js";import{t as re}from"./terminal-session-client-BylrXUky.js";import{i as ie,n as C,t as ae}from"./tray-leader-CftlXLF8.js";import{t as w}from"./synthetic-cdp-transport-CtfKyiws.js";import{n as oe,t as se}from"./leader-session-events-m7I5BMZy.js";import{t as ce}from"./wc-scoop-color-CByZNEJo.js";import{a as T,i as le,n as E,o as ue,r as de,s as fe,t as pe}from"./wc-floatbar-online-B6FIfDc-.js";a(`scoops.tray-leave`),a(`scoops.tray-join`);var D=null;function O(e){D=e}function k(){return D?.()??[]}var me=`slicc.leaderTrayFollowers`;function A(e,t=globalThis.localStorage){try{t?.setItem(me,JSON.stringify(e))}catch{}}function j(e){if(e.userName)return`${e.providerId}:${e.userName}`;if(e.accessToken)try{let t=JSON.parse(atob(e.accessToken.split(`.`)[1].replace(/-/g,`+`).replace(/_/g,`/`))),n=t.email??t.user_id??t.sub;if(n)return`${e.providerId}:${n}`}catch{}return null}async function M(){try{let e=t().filter(e=>!e.loggedOut),n=[`adobe`,`github`].map(t=>e.find(e=>e.providerId===t)).find(Boolean)??e[0],r=n?j(n):null;if(!r)return`00000000`;let i=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(r));return Array.from(new Uint8Array(i,0,4),e=>e.toString(16).padStart(2,`0`)).join(``)}catch{return`00000000`}}function N(e,t){let n=e()?.currentLeaderSync;if(!n)throw Error(`serve ${t}: no active leader tray`);return n}function P(e,t){return{lifecycleRecords:[...e.getPreviewLifecycleRecords(t)]}}function F(e,t){return{cleared:e.clearPreviewLifecycleRecords(t),rearmed:e.rearmPreviewAnnouncements(t)}}async function I(e){let{instanceId:t,browser:n,remoteCdpBridge:i,remoteCdpPushChannel:a,getLeader:o,performTrayLeaveLocally:s,window:c}=e,{installPanelRpcHandler:l,createPanelRpcEventEmitter:u}=await r(async()=>{let{installPanelRpcHandler:e,createPanelRpcEventEmitter:t}=await import(`./panel-rpc-DmJSNs0I.js`).then(e=>e.i);return{installPanelRpcHandler:e,createPanelRpcEventEmitter:t}},__vite__mapDeps([0,1])),{createStandalonePanelRpcHandlers:d}=await r(async()=>{let{createStandalonePanelRpcHandlers:e}=await import(`./panel-rpc-handlers-DH5GGDDd.js`);return{createStandalonePanelRpcHandlers:e}},__vite__mapDeps([2,3,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,0,24,25,26,27,28,29,30,31,32,33,34,35,36])),{getLeaderPermissionsSurface:f}=await r(async()=>{let{getLeaderPermissionsSurface:e}=await import(`./wc-permissions-registry-Blyunq37.js`).then(e=>e.r);return{getLeaderPermissionsSurface:e}},__vite__mapDeps([37,1])),p=u({instanceId:t}),m=new Map,h=l({instanceId:t,handlers:d({resetTray:async()=>{let e=o();if(!e)throw Error(`no active tray session to reset`);return await e.reset()},leaveTray:async({workerBaseUrl:e,requestId:t})=>await s({workerBaseUrl:e,requestId:t}),joinTray:({joinUrl:e})=>(v(c.localStorage,e),c.dispatchEvent(new CustomEvent(`slicc:tray-join`,{detail:{joinUrl:e}})),{joinUrl:e}),emitEvent:(e,t)=>p.emit(e,t),emitCherrySliccEvent:(e,t,n)=>o()?.sync.emitCherrySliccEvent(e,t,n)??!1,execOnRemote:async({runtimeId:e,command:t,cwd:n,env:r,execToken:i,timeoutMs:a})=>{let s=o()?.currentLeaderSync;if(!s)throw Error(`ssh: no active leader tray`);let c=new AbortController;m.set(i,c);try{return await s.execOnRemote(e,t,{cwd:n,env:r,signal:c.signal,timeoutMs:a})}finally{m.delete(i)}},signalRemoteExec:({execToken:e})=>{m.get(e)?.abort()},mintPreview:async({entryPath:e,servedRoot:t,bridge:n,noBridge:i,maxTabs:a,quiet:s,webhookId:c})=>{let l=o()?.currentLeaderSync;if(!l)throw Error(`serve: no active leader tray; cannot mint preview`);let{getLeaderTrayRuntimeStatus:u}=await r(async()=>{let{getLeaderTrayRuntimeStatus:e}=await import(`./tray-leader-CftlXLF8.js`).then(e=>e.a);return{getLeaderTrayRuntimeStatus:e}},__vite__mapDeps([38,1,12,14,4,15,13,16,17,27,28,39])),d=u().session;if(!d)throw Error(`serve: leader tray has no active session`);let f=new URL(d.controllerUrl).pathname.split(`/`).pop()??``,{CHERRY_RUNTIME_TAG:p}=await r(async()=>{let{CHERRY_RUNTIME_TAG:e}=await import(`./tray-sync-protocol-CQ9Z94EX.js`).then(e=>e.s);return{CHERRY_RUNTIME_TAG:e}},__vite__mapDeps([40,1,12,13])),{mintPreviewViaWorker:m}=await r(async()=>{let{mintPreviewViaWorker:e}=await import(`./preview-mint-client-Dbqjxupb.js`);return{mintPreviewViaWorker:e}},[]),h=l.getConnectedFollowers().some(e=>e.runtime===p),g=!i&&(n||h),_=!i&&n,v=await M(),{url:y,previewToken:b}=await m({workerBaseUrl:d.workerBaseUrl,trayId:d.trayId,controllerToken:f,servedRoot:t,entryPath:e,allowLive:g,bridge:_,maxTabs:a,webhookId:c,userHash:v,quiet:s??!1}),x=e?e.split(`/`).pop()??`Preview`:`Preview`;return l.registerMintedPreview(b,{url:y,title:x,quiet:s??!1}),l.broadcastPreviewOpen(y),{url:y,pushed:l.getConnectedFollowers().length,previewToken:b}},revokePreview:async({previewToken:e})=>{let t=o()?.currentLeaderSync;if(!t)throw Error(`serve --stop: no active leader tray; cannot revoke preview`);let{getLeaderTrayRuntimeStatus:n}=await r(async()=>{let{getLeaderTrayRuntimeStatus:e}=await import(`./tray-leader-CftlXLF8.js`).then(e=>e.a);return{getLeaderTrayRuntimeStatus:e}},__vite__mapDeps([38,1,12,14,4,15,13,16,17,27,28,39])),i=n().session;if(!i)throw Error(`serve --stop: leader tray has no active session`);let a=new URL(i.controllerUrl).pathname.split(`/`).pop()??``,{revokePreviewViaWorker:s}=await r(async()=>{let{revokePreviewViaWorker:e}=await import(`./preview-mint-client-Dbqjxupb.js`);return{revokePreviewViaWorker:e}},[]),c=await s({workerBaseUrl:i.workerBaseUrl,trayId:i.trayId,controllerToken:a,previewToken:e});return t.dropMintedPreview(e),c},listPreviews:async()=>{let{getLeaderTrayRuntimeStatus:e}=await r(async()=>{let{getLeaderTrayRuntimeStatus:e}=await import(`./tray-leader-CftlXLF8.js`).then(e=>e.a);return{getLeaderTrayRuntimeStatus:e}},__vite__mapDeps([38,1,12,14,4,15,13,16,17,27,28,39])),t=e().session;if(!t)throw Error(`serve: leader tray has no active session`);let n=new URL(t.controllerUrl).pathname.split(`/`).pop()??``,{listPreviewsViaWorker:i}=await r(async()=>{let{listPreviewsViaWorker:e}=await import(`./preview-mint-client-Dbqjxupb.js`);return{listPreviewsViaWorker:e}},[]);return await i({workerBaseUrl:t.workerBaseUrl,trayId:t.trayId,controllerToken:n})},getPreviewLifecycleRecords:e=>P(N(o,`--logs`),e),truncatePreviewLifecycleRecords:e=>F(N(o,`--truncate`),e),listRemoteTargets:()=>n.listAllTargets(),remoteCdp:i,getPermissionsSurface:()=>f()})});c.addEventListener(`beforeunload`,()=>{h(),p.dispose(),i.disposeAll(),a?.close()},{once:!0})}async function L(t){let{log:i}=t;await new Promise(e=>setTimeout(e,5e3));try{let t=await fetch(h(`/api/hosted-bootstrap`),{signal:AbortSignal.timeout(1e4),headers:g()});if(!t.ok)return;let a=await t.json(),o=a.accounts??(a.adobeImsToken?[{providerId:`adobe`,kind:`oauth`,accessToken:a.adobeImsToken}]:[]);a.model?localStorage.setItem(`selected-model`,a.model):localStorage.getItem(`selected-model`)||localStorage.setItem(`selected-model`,`adobe:claude-opus-4-6`),a.effortLevel?localStorage.setItem(`slicc_locked_effort_level`,a.effortLevel):localStorage.removeItem(`slicc_locked_effort_level`);let[{applyHostedAccounts:s,prewarmHostedModels:c},l]=await Promise.all([r(()=>import(`./hosted-config-apply-uAym2aS5.js`),__vite__mapDeps([41,12])),r(()=>import(`./provider-settings-BAT6df9n.js`).then(e=>e.t),__vite__mapDeps([26,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,0,24,25,27,28,29,30,31,32]))]);await c(o,{getRefreshModels:e=>l.getProviderConfig(e).refreshModels});let u=JSON.parse(localStorage.getItem(`slicc_cloud_managed`)??`[]`);await s(o,{saveOAuthAccount:n,addAccount:l.addAccount,removeAccount:e,currentProviderIds:()=>l.getAccounts().map(e=>e.providerId),previouslyManaged:()=>u}),localStorage.setItem(`slicc_cloud_managed`,JSON.stringify(o.map(e=>e.providerId))),i.info(`hosted-leader: cone config applied`,{count:o.length})}catch(e){i.warn(`hosted-leader: bootstrap fetch failed; provider needs manual login`,{error:e instanceof Error?e.message:String(e)})}}var R=0;async function z(e,t){let n=new re({client:e,sid:`ssh-exec-${++R}-${Date.now()}`,onEvent:e=>{e.type===`terminal-output`&&t.onChunk(e.stream,e.data)}}),r=()=>n.signal(`SIGINT`);try{return await n.open({cwd:t.cwd,env:t.env}),t.signal.addEventListener(`abort`,r,{once:!0}),t.signal.aborted?{exitCode:130}:{exitCode:(await n.exec(t.command)).exitCode}}catch(e){return{exitCode:1,error:e instanceof Error?e.message:String(e)}}finally{t.signal.removeEventListener(`abort`,r),n.close(),n.dispose()}}function B(e,t){if(!e||!t||!e.startsWith(`/`)||t===`/`||/%2[eE]/.test(e)||e.split(`/`).some(e=>e===`.`||e===`..`))return!1;let n=t.endsWith(`/`)?t.slice(0,-1):t;return e===n||e.startsWith(n+`/`)}var he=64*1024;async function ge(e,t,n){let{reqId:r,servedRoot:i,asText:a}=e,s=e.vfsPath;if(!B(s,i)){t.send({type:`preview.response`,reqId:r,ok:!1,status:403});return}try{if((await n.stat(s)).type===`directory`&&(s=s.replace(/\/?$/,`/`)+`index.html`,!B(s,i))){t.send({type:`preview.response`,reqId:r,ok:!1,status:403});return}}catch{}let c,l;try{a?(c=await n.readFile(s,{encoding:`utf-8`}),l=`utf-8`):(c=o(await n.readFile(s,{encoding:`binary`})),l=`base64`)}catch(e){e?.code===`ENOENT`?t.send({type:`preview.response`,reqId:r,ok:!1,status:404}):t.send({type:`preview.response`,reqId:r,ok:!1,status:500,reason:String(e?.message??e)});return}let u=ve(s),d=_e(c,he);for(let e=0;e<d.length;e++)t.send({type:`preview.response`,reqId:r,ok:!0,mime:u,chunkIndex:e,totalChunks:d.length,content:d[e],encoding:l})}function _e(e,t){if(e.length<=t)return[e];let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function ve(e){return/\.html?$/i.test(e)?`text/html`:/\.css$/i.test(e)?`text/css`:/\.m?js$/i.test(e)?`application/javascript`:/\.json$/i.test(e)?`application/json`:/\.svg$/i.test(e)?`image/svg+xml`:/\.png$/i.test(e)?`image/png`:/\.jpe?g$/i.test(e)?`image/jpeg`:/\.gif$/i.test(e)?`image/gif`:/\.webp$/i.test(e)?`image/webp`:/\.ico$/i.test(e)?`image/x-icon`:/\.woff2$/i.test(e)?`font/woff2`:/\.woff$/i.test(e)?`font/woff`:/\.ttf$/i.test(e)?`font/ttf`:/\.mp4$/i.test(e)?`video/mp4`:/\.webm$/i.test(e)?`video/webm`:/\.mp3$/i.test(e)?`audio/mpeg`:/\.pdf$/i.test(e)?`application/pdf`:/\.xml$/i.test(e)?`application/xml`:/\.wasm$/i.test(e)?`application/wasm`:`application/octet-stream`}var V=32*1024,H=`[content too large to sync — view on leader]`;function ye(e){switch(e.type){case`tool_result`:return{...e,result:H};case`tool_use_start`:return{...e,toolInput:{note:H}};case`tool_ui`:return{...e,html:`<p>${H}</p>`};case`content_delta`:return{...e,text:H};case`terminal_output`:return{...e,text:H};case`screenshot`:return{type:`error`,error:`Screenshot ${H}`};default:return null}}var be=class{context;constructor(e){this.context=e}broadcastEvent(e){if(this.context.followers.followers.size===0)return;let t=this.context.options.getScoopJid(),n=this.context.followers.broadcastToAllFollowers({type:`agent_event`,event:e,scoopJid:t});if(n.length===0)return;let r=ye(e);if(r)for(let e of n)this.context.followers.followers.get(e)?.sync.send({type:`agent_event`,event:r,scoopJid:t})}broadcastUserMessage(e,t,n){if(this.context.followers.followers.size===0)return;let r=n?.length?i(n):n;this.broadcast({type:`user_message_echo`,text:e,messageId:t,scoopJid:this.context.options.getScoopJid(),attachments:r})}broadcastStatus(e){this.context.followers.followers.size!==0&&this.broadcast({type:`status`,scoopStatus:e})}async sendSnapshotToFollower(e,t){let n=this.context.followers.followers.get(e);if(!n)return;let{options:r}=this.context,i=t??n.selectedScoopJid??r.getScoopJid(),a;if(r.getMessagesForScoop&&i!==r.getScoopJid())try{a=await Promise.resolve(r.getMessagesForScoop(i))}catch(e){this.context.log.warn(`getMessagesForScoop failed, falling back to active scoop`,{targetJid:i,error:e instanceof Error?e.message:String(e)}),a=r.getMessages()}else a=r.getMessages();n.selectedScoopJid=i,f(n.sync,a,i),this.context.log.debug(`Snapshot sent to follower`,{bootstrapId:e,messageCount:a.length,scoopJid:i})}broadcastSnapshot(){if(this.context.followers.followers.size!==0)for(let e of this.context.followers.followers.keys())this.sendSnapshotToFollower(e)}sendScoopsListToFollower(e){let t=this.context.followers.followers.get(e);if(!t)return;let n=this.context.options.getScoops;if(n)try{t.sync.send({type:`scoops.list`,scoops:n(),activeScoopJid:this.context.options.getScoopJid()})}catch(t){this.context.log.warn(`Failed to send scoops.list`,{bootstrapId:e,error:t instanceof Error?t.message:String(t)})}}sendSprinklesListToFollower(e){let t=this.context.followers.followers.get(e);if(!t)return;let n=this.context.options.getSprinkles;if(n)try{t.sync.send({type:`sprinkles.list`,sprinkles:n()})}catch(t){this.context.log.warn(`Failed to send sprinkles.list`,{bootstrapId:e,error:t instanceof Error?t.message:String(t)})}}broadcastScoopsList(){if(this.context.followers.followers.size===0)return;let e=this.context.options.getScoops;if(!e)return;let t;try{t=e()}catch(e){this.context.log.warn(`Failed to compute scoops list`,{error:e instanceof Error?e.message:String(e)});return}this.broadcast({type:`scoops.list`,scoops:t,activeScoopJid:this.context.options.getScoopJid()})}broadcastSprinklesList(){if(this.context.followers.followers.size===0)return;let e=this.context.options.getSprinkles;if(!e)return;let t;try{t=e()}catch(e){this.context.log.warn(`Failed to compute sprinkles list`,{error:e instanceof Error?e.message:String(e)});return}this.broadcast({type:`sprinkles.list`,sprinkles:t})}broadcastSprinkleUpdate(e,t){this.context.followers.followers.size!==0&&this.broadcast({type:`sprinkle.update`,sprinkleName:e,data:t})}broadcastTheme(e){this.context.followers.followers.size!==0&&this.broadcast({type:`theme.apply`,themeJson:e})}broadcastSprinkleReloaded(e){this.context.followers.followers.size!==0&&this.broadcast({type:`sprinkle.reloaded`,sprinkleName:e})}broadcastPreviewOpen(e){this.context.followers.followers.size!==0&&this.broadcast({type:`preview.open`,requestId:`prv-${crypto.randomUUID()}`,url:e})}async handleSprinkleFetch(e,t,n){let r=this.context.followers.followers.get(e);if(!r)return;let i=this.context.options.readSprinkleContent;if(!i){r.sync.send({type:`sprinkle.content`,requestId:t,sprinkleName:n,content:``,error:`Leader has no sprinkle content reader`});return}let a=null;try{a=await Promise.resolve(i(n))}catch(e){r.sync.send({type:`sprinkle.content`,requestId:t,sprinkleName:n,content:``,error:e instanceof Error?e.message:String(e)});return}if(a==null){r.sync.send({type:`sprinkle.content`,requestId:t,sprinkleName:n,content:``,error:`Sprinkle not found: ${n}`});return}if(a.length<=65536){r.sync.send({type:`sprinkle.content`,requestId:t,sprinkleName:n,content:a});return}let o=Math.ceil(a.length/V);for(let e=0;e<o;e++)r.sync.send({type:`sprinkle.content`,requestId:t,sprinkleName:n,content:a.slice(e*V,(e+1)*V),chunkIndex:e,totalChunks:o})}broadcast(e){this.context.followers.broadcastToAllFollowers(e)}},xe=class{context;options;pendingCDPRoutes=new Map;cdpChunkBuffers=new Map;remoteTransports=new Map;constructor(e,t){this.context=e,this.options=t,e.followers.onFollowerRemoved({removeRuntime:(e,t)=>this.cleanupRemoteTransports(t)})}handleCDPRequest(e,t){let{requestId:n,targetRuntimeId:r,localTargetId:i,method:a,params:o,sessionId:s}=t;if(r===`leader`){this.executeLocalCDP(n,i,a,o,s,e);return}this.forwardCDPRequest(n,r,i,a,o,s,e)}async executeLocalCDP(e,t,n,r,i,a){let o=this.context.followers.followers.get(a);if(!o)return;let s=this.context.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);l(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.context.followers.runtimeToBootstrap.get(t),c=s?this.context.followers.followers.get(s):void 0,l=this.context.followers.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}=e,n=this.pendingCDPRoutes.get(t);if(!n)return;let r=p(this.cdpChunkBuffers,e);if(!r)return;if(this.pendingCDPRoutes.delete(t),n.requesterBootstrapId===`__leader__`){for(let e of this.remoteTransports.values())e.handleResponse(t,r.result,r.error);return}let i=this.context.followers.followers.get(n.requesterBootstrapId);i&&l(i.sync,t,r.result,r.error)}handleCDPEvent(e,t,n,r){let i=this.context.followers.runtimeIdForBootstrap(e);if(!i)return;let a=`${i}:`,o=r?{...n,sessionId:r}:n;for(let[e,n]of this.remoteTransports)e.startsWith(a)&&n.handleEvent(t,o)}createRemoteTransport(e,t){if(e===`preview`){let e=t.indexOf(`:`);if(e===-1)throw Error(`Invalid preview localTargetId format: expected "<token>:<connId>", got "${t}"`);let n=t.slice(e+1),r=this.options.getBridgeTransport(n);if(!r)throw Error(`Preview bridge connection "${n}" not found`);return r}let n=`${e}:${t}`,r=new ne({sendCDPRequest:(r,i,a,o)=>{let s=this.context.followers.runtimeToBootstrap.get(e),c=s?this.context.followers.followers.get(s):void 0;if(!c){this.remoteTransports.get(n)?.handleResponse(r,void 0,`Target runtime "${e}" not connected`);return}this.pendingCDPRoutes.set(r,{requesterBootstrapId:`__leader__`,requestId:r}),c.sync.send({type:`cdp.request`,requestId:r,localTargetId:t,method:i,params:a,sessionId:o})}});return this.remoteTransports.set(n,r),r}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),this.context.log.debug(`Cleaned up stale remote transport`,{key:e}));try{this.context.options.onRemoteTransportsCleaned?.(e)}catch(t){this.context.log.warn(`onRemoteTransportsCleaned handler threw`,{runtimeId:e,error:t instanceof Error?t.message:String(t)})}}cleanupOrphanedRemoteTransports(e){for(let t of[...this.remoteTransports.keys()]){let n=t.substring(0,t.indexOf(`:`));n!==`leader`&&!this.context.followers.runtimeToBootstrap.has(n)&&n!==e&&(this.remoteTransports.get(t)?.disconnect(),this.remoteTransports.delete(t),this.context.log.debug(`Cleaned up orphaned remote transport on advertise`,{key:t}))}}},Se=class{context;constructor(e){this.context=e}routeCherryHostEvent(e,t){if(!u(t))return;let n=this.context.options.onCherryHostEvent;if(!n){this.context.log.debug(`cherry.host_event received but no onCherryHostEvent wired`,{bootstrapId:e,name:t.name});return}let r=this.context.followers.runtimeIdForBootstrap(e);try{n(r,t.name,t.detail)}catch(n){this.context.log.warn(`Failed to route cherry.host_event to cone`,{bootstrapId:e,name:t.name,error:n instanceof Error?n.message:String(n)})}}emitCherrySliccEvent(e,t,n){let r=e.indexOf(`:`),i=r>=0?e.slice(0,r):e,a=this.context.followers.runtimeToBootstrap.get(i),o=a?this.context.followers.followers.get(a):void 0;return o?o.sync.send({type:`cherry.slicc_event`,targetId:e,name:t,detail:n}):(this.context.log.warn(`emitCherrySliccEvent: owning follower not connected`,{targetId:e,name:t}),!1)}};a(`lick-manager`);var Ce=new Set([`navigate`,`discovery`]);function we(e){return e?e.includes(`ios`)?`ios`:e.includes(`standalone`)?`standalone`:e.includes(`extension`)?`extension`:e.includes(`electron`)?`electron`:`unknown`:`unknown`}function U(e,t){switch(e){case`extension`:return`extension follower`;case`standalone`:return`standalone follower`;case`electron`:return`Electron follower`;case`ios`:return`iOS follower`;default:return t?`follower (${t})`:`follower`}}var Te=6e4,Ee=class{options;followers=new Map;runtimeToBootstrap=new Map;removalHooks=new Set;followerBroadcastErrorLogAt=new Map;constructor(e){this.options=e}addFollower(e,t,n){this.removeFollower(e);let r=d(t),i=r.onMessage(t=>this.options.onMessage(e,t)),a=new ue({sendPing:()=>r.send({type:`ping`}),isTransportOpen:()=>r.isOpen,onStalled:()=>{this.options.log.warn(`Follower stopped answering pings; channel still open, keeping it`,{bootstrapId:e})},onRecovered:()=>{this.options.log.info(`Follower is answering pings again`,{bootstrapId:e})},onDead:()=>{this.options.log.warn(`Follower keepalive dead, removing follower`,{bootstrapId:e}),this.removeFollower(e),this.options.onFollowerDead?.(e)}});a.start();let o={bootstrapId:e,sync:r,unsubscribe:i,keepalive:a,runtime:n?.runtime,connectedAt:n?.connectedAt,lastActivity:Date.now(),floatType:we(n?.runtime)};return this.followers.set(e,o),this.options.log.info(`Follower added to sync`,{bootstrapId:e,followerCount:this.followers.size}),this.notifyFollowerCountChanged(),o}removeFollower(e){let t=this.followers.get(e);if(!t)return;t.keepalive.stop(),t.unsubscribe(),t.sync.close(),this.followers.delete(e);for(let t of this.removalHooks)t.beforeRegistryCleanup?.(e);this.followerBroadcastErrorLogAt.delete(e);let n=this.runtimeIdForBootstrap(e);if(n){for(let t of this.removalHooks)t.removeRuntime?.(e,n);this.runtimeToBootstrap.delete(n)}for(let t of this.removalHooks)t.afterRegistryCleanup?.(e,n);this.options.log.info(`Follower removed from sync`,{bootstrapId:e,followerCount:this.followers.size}),this.notifyFollowerCountChanged()}onFollowerRemoved(e){return this.removalHooks.add(e),()=>this.removalHooks.delete(e)}notifyFollowerCountChanged(){this.options.onFollowerCountChanged?.(this.followers.size)}setRuntimeId(e,t){this.runtimeToBootstrap.set(e,t)}resolveFollowerByRuntimeId(e){let t=this.runtimeToBootstrap.get(e);if(t){let e=this.followers.get(t);if(e)return{bootstrapId:t,follower:e}}let n=[e];e.startsWith(`follower-`)&&n.push(e.slice(9));for(let e of n){let t=this.followers.get(e);if(t)return{bootstrapId:e,follower:t}}return null}runtimeIdForBootstrap(e){for(let[t,n]of this.runtimeToBootstrap)if(n===e)return t}getFollowerMotds(){let e=new Map;for(let[t,n]of this.followers)n.peerMotd&&e.set(t,n.peerMotd);return e}getExecCapableBootstrapIds(){let e=new Set;for(let[t,n]of this.followers)n.peerCapabilities?.exec&&e.add(t);return e}getBrowserCapableBootstrapIds(){return new Set(this.runtimeToBootstrap.values())}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}})}broadcastToAllFollowers(e){let t=performance.now(),n=[];for(let[r,i]of this.followers){let a=!1,o;try{a=i.sync.send(e)}catch(e){o=e}if(a){this.followerBroadcastErrorLogAt.delete(r);continue}n.push(r),t-(this.followerBroadcastErrorLogAt.get(r)??-1/0)>Te&&(this.followerBroadcastErrorLogAt.set(r,t),this.options.log.error(`Broadcast send to follower failed`,{bootstrapId:r,messageType:e.type,...o?{error:o instanceof Error?o.message:String(o)}:{}}))}return n}},De=class{context;collaborators;constructor(e,t){this.context=e,this.collaborators=t}dispatch(e,t){this.noteLegacyPeer(e,t);let{broadcast:n,cdpRouter:r,remoteExec:i,fsRouter:a,tabRouter:o}=this.collaborators,{teleportPool:s,transcriptExport:c,cherryRouter:l}=this.collaborators;switch(t.type){case`user_message`:this.handleFollowerUserMessage(e,t);break;case`abort`:this.context.log.info(`Follower abort received`,{bootstrapId:e}),this.context.options.onFollowerAbort();break;case`new_session`:this.handleFollowerNewSession(e,t.action);break;case`request_snapshot`:this.context.log.info(`Follower snapshot request received`,{bootstrapId:e,scoopJid:t.scoopJid}),n.sendSnapshotToFollower(e,t.scoopJid);break;case`scoops.select`:this.handleScoopSelection(e,t.scoopJid);break;case`sprinkles.refresh`:this.context.log.info(`Follower requested sprinkles refresh`,{bootstrapId:e}),n.sendSprinklesListToFollower(e);break;case`sprinkle.fetch`:n.handleSprinkleFetch(e,t.requestId,t.sprinkleName);break;case`sprinkle.lick`:this.handleFollowerSprinkleLick(e,t);break;case`lick`:this.handleFollowerLick(e,t);break;case`targets.advertise`:s.handleFollowerTargetsAdvertise(e,t);break;case`cdp.request`:r.handleCDPRequest(e,t);break;case`cdp.response`:r.handleCDPResponse(t);break;case`cdp.event`:r.handleCDPEvent(e,t.method,t.params,t.sessionId);break;case`tab.open`:this.routeTabOpen(e,t);break;case`tab.opened`:o.handleTabOpenResponse(t.requestId,t.targetId);break;case`tab.open.error`:o.handleTabOpenError(t.requestId,t.error);break;case`fs.request`:this.routeFsRequest(e,t);break;case`fs.response`:a.handleFsResponse(t.requestId,t.response);break;case`exec.request`:case`exec.chunk`:case`exec.response`:case`exec.signal`:i.handleFollowerExecMessage(e,t);break;case`transcript.export.request`:c.handleTranscriptExportRequest(e,t.requestId,t.selector);break;case`transcript.export.cancel`:c.handleTranscriptExportCancel(e,t.requestId);break;case`transcript.export.ack`:c.handleTranscriptExportAck(e,t.requestId,t.index);break;case`transcript.export.approve.response`:c.handleTranscriptExportApprovalResponse(e,t.requestId,t.approved);break;case`cherry.host_event`:l.routeCherryHostEvent(e,t);break;case`ping`:this.handlePing(e);break;case`pong`:this.handlePong(e);break;case`hello`:this.handleFollowerHello(e,t);break;default:{let n=m(t);this.context.log.warn(`Unknown follower message type — skewed follower?`,{bootstrapId:e,type:n.type})}}}noteLegacyPeer(e,t){if(t.type===`hello`)return;let n=this.context.followers.followers.get(e);!n||n.peerProtocolVersion!==void 0||n.legacyPeerLogged||(n.legacyPeerLogged=!0,this.context.log.info(`Follower sent no hello — legacy peer (pre-versioning build)`,{bootstrapId:e}))}handleFollowerUserMessage(e,t){this.context.log.info(`Follower user message received`,{bootstrapId:e,messageId:t.messageId});let n=t.attachments?.length?i(t.attachments):t.attachments;t.steer?this.context.options.onFollowerMessage(t.text,t.messageId,n,{steer:!0}):this.context.options.onFollowerMessage(t.text,t.messageId,n)}handleFollowerNewSession(e,t){this.context.log.info(`Follower new-session received`,{bootstrapId:e,action:t});try{this.context.options.onFollowerNewSession?.(t,e)}catch(e){this.context.log.warn(`onFollowerNewSession handler threw`,{error:e instanceof Error?e.message:String(e)})}}handleScoopSelection(e,t){this.context.log.info(`Follower selected scoop`,{bootstrapId:e,scoopJid:t});let n=this.context.followers.followers.get(e);n&&(n.selectedScoopJid=t,this.collaborators.broadcast.sendSnapshotToFollower(e,t))}handleFollowerSprinkleLick(e,t){this.context.log.info(`Follower sprinkle lick received`,{bootstrapId:e,sprinkleName:t.sprinkleName});let n=this.context.followers.followers.get(e),r=U(n?.floatType??`unknown`,n?.runtime);try{this.context.options.onSprinkleLick?.(t.sprinkleName,t.body,t.targetScoop,r)}catch(e){this.context.log.warn(`onSprinkleLick handler threw`,{error:e instanceof Error?e.message:String(e)})}}handleFollowerLick(e,t){let n=t.event;if(!n||!Ce.has(n.type)){this.context.log.warn(`Rejecting malformed or non-forwardable lick from follower`,{bootstrapId:e,type:n?.type});return}let r=this.context.followers.followers.get(e),{targetScoop:i,...a}=n,o={...a,originFollowerId:e,originLabel:U(r?.floatType??`unknown`,r?.runtime)};try{this.context.options.onForwardedLick?.(o,e)}catch(e){this.context.log.warn(`onForwardedLick handler threw`,{error:e instanceof Error?e.message:String(e)})}}routeTabOpen(e,t){let{requestId:n,targetRuntimeId:r,url:i}=t;r===`leader`?this.collaborators.tabRouter.executeLocalTabOpen(n,i,e):this.collaborators.tabRouter.forwardTabOpen(n,r,i,e)}routeFsRequest(e,t){let{requestId:n,targetRuntimeId:r,request:i}=t;r===`leader`?this.collaborators.fsRouter.executeLocalFs(n,i,e):this.collaborators.fsRouter.forwardFsRequest(n,r,i,e)}handlePing(e){let t=this.context.followers.followers.get(e);t&&(t.keepalive.receivePing(),t.lastActivity=Date.now(),t.sync.send({type:`pong`}))}handlePong(e){let t=this.context.followers.followers.get(e);t&&(t.keepalive.receivePong(),t.lastActivity=Date.now())}handleFollowerHello(e,t){let n=this.context.followers.followers.get(e);n&&(n.peerProtocolVersion=t.protocolVersion,n.peerCapabilities=t.capabilities,n.peerMotd=t.motd,this.context.followers.notifyFollowerCountChanged()),t.protocolVersion>4?this.context.log.warn(`Follower speaks a newer tray sync protocol — update this build`,{bootstrapId:e,followerVersion:t.protocolVersion,ourVersion:4}):this.context.log.info(`Follower hello`,{bootstrapId:e,protocolVersion:t.protocolVersion})}},Oe=class{context;pendingFsRoutes=new Map;fsResolvers=new Map;constructor(e){this.context=e,e.followers.onFollowerRemoved({afterRegistryCleanup:e=>this.rejectPendingForFollower(e)})}async executeLocalFs(e,t,n){let r=this.context.followers.followers.get(n);if(!r)return;let i=this.context.options.vfs;if(!i){r.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:`Leader has no VFS`}});return}let a=await T(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.context.followers.runtimeToBootstrap.get(t),a=i?this.context.followers.followers.get(i):void 0,o=this.context.followers.followers.get(r);if(!i||!a){o?.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:`Target runtime "${t}" not connected`}});return}this.pendingFsRoutes.set(e,{requesterBootstrapId:r,targetBootstrapId:i,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){this.resolveUnroutedLeaderResponse(e,t);return}n.requesterBootstrapId!==`__leader__`&&this.context.followers.followers.get(n.requesterBootstrapId)?.sync.send({type:`fs.response`,requestId:e,response:t});let r=this.addResponseChunk(n,t);if(r&&(this.pendingFsRoutes.delete(e),n.requesterBootstrapId===`__leader__`)){let t=this.fsResolvers.get(e);t&&(this.fsResolvers.delete(e),t.resolve(r))}}sendFsRequest(e,t){if(e===`leader`){let e=this.context.options.vfs;return e?T(e,t):Promise.resolve([{ok:!1,error:`Leader has no VFS`}])}let n=this.context.followers.runtimeToBootstrap.get(e),r=n?this.context.followers.followers.get(n):void 0;if(!n||!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,a)=>{this.fsResolvers.set(i,{resolve:e,reject:a,responses:[]}),this.pendingFsRoutes.set(i,{requesterBootstrapId:`__leader__`,targetBootstrapId:n,requestId:i,chunks:[],totalChunks:1}),r.sync.send({type:`fs.request`,requestId:i,request:t})})}addResponseChunk(e,t){return e.chunks.push(t),e.totalChunks=t.ok&&t.totalChunks||1,e.chunks.length<e.totalChunks?null:e.chunks}resolveUnroutedLeaderResponse(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))}rejectPendingForFollower(e){for(let[t,n]of this.pendingFsRoutes){if(n.targetBootstrapId!==e&&n.requesterBootstrapId!==e)continue;this.pendingFsRoutes.delete(t);let r=this.fsResolvers.get(t);r&&(this.fsResolvers.delete(t),r.reject(Error(`follower disconnected before the fs request completed`)))}}},ke=3e4,Ae={target:`preview-target`,session:`preview-session`,frame:`preview-frame`,loader:`preview-loader`},je=class extends w{connId;sendToWorker;nextId=1;pending=new Map;constructor(e){super({targetUrl:e.targetUrl,targetOrigin:e.targetOrigin,title:e.title,ids:e.ids??Ae}),this.connId=e.connId,this.sendToWorker=e.send}async connect(e){this._state=`connected`}onCloseTarget(){this.sendToWorker({type:`bridge.close`,connId:this.connId})}disconnect(){for(let[e,t]of this.pending)clearTimeout(t.timer),t.reject(Error(`PreviewBridgeCdpTransport disconnected`));this.pending.clear(),this._state=`disconnected`}async forward(e,t,n,r=ke){let i=this.nextId++;return new Promise((a,o)=>{let s=setTimeout(()=>{this.pending.delete(i),o(Error(`PreviewBridge CDP timed out after ${r}ms: ${e}`))},r);this.pending.set(i,{resolve:e=>{clearTimeout(s),a(e)},reject:e=>{clearTimeout(s),o(e)},timer:s}),this.sendToWorker({type:`bridge.cdp.request`,connId:this.connId,id:i,method:e,params:t,sessionId:n})})}deliverResponse(e,t){let n=this.pending.get(e);n&&(this.pending.delete(e),clearTimeout(n.timer),t.error?n.reject(Error(`PreviewBridge CDP error: ${t.error.message} (${t.error.code})`)):n.resolve(t.result??{}))}},Me=class{context;mintMap=new Map;bridgeConns=new Map;lifecycleRecords=[];lifecycleRecordStart=0;lifecycleRecordCount=0;constructor(e){this.context=e}registerMintedPreview(e,t){let n=this.mintMap.get(e)?.announced??!1;this.mintMap.set(e,{...t,announced:n})}restorePreviewState(e){let t=this.mintMap.get(e.previewToken);if(t){t.quiet=e.quiet,t.announced=e.announced;return}this.mintMap.set(e.previewToken,{url:``,title:`Preview`,quiet:e.quiet,announced:e.announced})}dropMintedPreview(e){this.mintMap.delete(e),this.clearPreviewLifecycleRecords(e)}onBridgeConnected(e){let{connId:t,previewToken:n,origin:r,userAgent:i,connectedAt:a}=e,o=e.replay===!0,s=o?this.restoreReplayedPreview(n,r):this.getOrCreatePreview(n,r);if(s.url||=r,this.bridgeConns.has(t)){if(o)return;this.recordLifecycle({timestamp:new Date().toISOString(),lifecycle:`connected`,connId:t,previewToken:n,origin:r,userAgent:i,connectedAt:a,announced:!1});return}let{url:c,title:l,quiet:u}=s,d=new je({connId:t,targetUrl:c,targetOrigin:r,title:l,send:e=>this.context.sendControl(e)});if(d.connect(),this.bridgeConns.set(t,{previewToken:n,origin:r,userAgent:i,connectedAt:a,url:c,title:l,quiet:u,transport:d}),this.context.log.info(`Preview bridge connected`,{connId:t,previewToken:n,origin:r,userAgent:i}),o)return;let f=new Date().toISOString(),p=!s.announced,m=p&&!u&&!!this.context.options.onPreviewLick;p&&(s.announced=!0,this.context.sendControl({type:`preview.state.update`,previewToken:n,announced:!0})),this.recordLifecycle({timestamp:f,lifecycle:`connected`,connId:t,previewToken:n,origin:r,userAgent:i,connectedAt:a,announced:m}),m&&this.emitPreviewConnectedLick(e,f)}onBridgeDisconnected(e){let{connId:t,reason:n}=e,r=this.bridgeConns.get(t);if(!r){this.recordLifecycle({timestamp:new Date().toISOString(),lifecycle:`disconnected`,connId:t,reason:n,announced:!1});return}let{previewToken:i,origin:a,userAgent:o,connectedAt:s}=r;r.transport.disconnect(),this.bridgeConns.delete(t),this.context.log.info(`Preview bridge disconnected`,{connId:t,reason:n}),this.recordLifecycle({timestamp:new Date().toISOString(),lifecycle:`disconnected`,connId:t,previewToken:i,origin:a,userAgent:o,connectedAt:s,reason:n,announced:!1})}onBridgeCdpResponse(e){let{connId:t,id:n,result:r,error:i}=e,a=this.bridgeConns.get(t);if(!a){this.context.log.warn(`Received bridge.cdp.response for unknown connId`,{connId:t,id:n});return}a.transport.deliverResponse(n,{result:r,error:i})}getBridgeTransport(e){return this.bridgeConns.get(e)?.transport}getTargetEntries(){return[...this.bridgeConns].map(([e,t])=>({targetId:`preview:${t.previewToken}:${e}`,localTargetId:e,runtimeId:`preview`,title:t.title,url:t.url,isLocal:!1,kind:`preview`}))}stop(){for(let e of this.bridgeConns.values())e.transport.disconnect();this.bridgeConns.clear(),this.mintMap.clear(),this.resetLifecycleRecords()}getPreviewLifecycleRecords(e){return this.snapshotLifecycleRecords().filter(t=>e===void 0||t.previewToken===e).map(e=>({...e}))}clearPreviewLifecycleRecords(e){let t=this.snapshotLifecycleRecords(),n=t.filter(t=>e!==void 0&&t.previewToken!==e),r=t.length-n.length;this.resetLifecycleRecords();for(let e of n)this.recordLifecycle(e);return r}rearmPreviewAnnouncements(e){let t=0;for(let[n,r]of this.mintMap)e!==void 0&&n!==e||(r.announced=!1,this.context.sendControl({type:`preview.state.update`,previewToken:n,announced:!1}),t+=1);return t}getOrCreatePreview(e,t){let n=this.mintMap.get(e);if(n)return n;let r={url:t,title:`Preview`,quiet:!1,announced:!1};return this.mintMap.set(e,r),r}restoreReplayedPreview(e,t){let n=this.mintMap.get(e);if(n)return n.announced||=!0,n;let r={url:t,title:`Preview`,quiet:!0,announced:!0};return this.mintMap.set(e,r),r}emitPreviewConnectedLick(e,t){let n={type:`preview`,previewLifecycle:`connected`,previewConnId:e.connId,previewToken:e.previewToken,previewOrigin:e.origin,previewUserAgent:e.userAgent,previewConnectedAt:e.connectedAt,timestamp:t,body:{}};try{this.context.options.onPreviewLick?.(n)}catch(e){this.context.log.warn(`onPreviewLick handler threw`,{error:e instanceof Error?e.message:String(e)})}}recordLifecycle(e){if(this.lifecycleRecordCount<500){let t=(this.lifecycleRecordStart+this.lifecycleRecordCount)%500;this.lifecycleRecords[t]=e,this.lifecycleRecordCount+=1;return}this.lifecycleRecords[this.lifecycleRecordStart]=e,this.lifecycleRecordStart=(this.lifecycleRecordStart+1)%500}snapshotLifecycleRecords(){return Array.from({length:this.lifecycleRecordCount},(e,t)=>{let n=(this.lifecycleRecordStart+t)%500;return this.lifecycleRecords[n]})}resetLifecycleRecords(){this.lifecycleRecords=[],this.lifecycleRecordStart=0,this.lifecycleRecordCount=0}},Ne=16*1024*1024,Pe=class{context;pendingRemoteExecs=new Map;localExecAborters=new Map;constructor(e){this.context=e,e.followers.onFollowerRemoved({beforeRegistryCleanup:e=>this.handleFollowerRemoved(e)})}async execOnRemote(e,t,n={}){let r=this.context.followers.resolveFollowerByRuntimeId(e);if(!r)throw Error(`No connected follower for '${e}'`);let{bootstrapId:i,follower:a}=r;if(!a.peerCapabilities?.exec)throw Error(`Follower '${e}' is not an exec target — only a 'slicc … follow' CLI accepts commands`);let o=`lexec-${crypto.randomUUID()}`;return new Promise((r,s)=>{let c={bootstrapId:i,stdout:``,stderr:``,stdoutDecoder:new TextDecoder(`utf-8`),stderrDecoder:new TextDecoder(`utf-8`),bytes:0,truncated:!1,onChunk:n.onChunk,resolve:r,reject:s};if(n.timeoutMs&&n.timeoutMs>0&&(c.timer=setTimeout(()=>{this.pendingRemoteExecs.delete(o)&&(this.sendExecSignal(i,o,`SIGKILL`),s(Error(`exec on '${e}' timed out after ${n.timeoutMs}ms`)))},n.timeoutMs)),this.pendingRemoteExecs.set(o,c),n.signal){let e=()=>this.sendExecSignal(i,o,`SIGINT`);n.signal.aborted?e():n.signal.addEventListener(`abort`,e,{once:!0})}a.sync.send({type:`exec.request`,requestId:o,command:t,cwd:n.cwd,env:n.env})||(this.pendingRemoteExecs.delete(o),c.timer&&clearTimeout(c.timer),s(Error(`Failed to send exec.request to follower '${e}'`)))})}handleFollowerExecMessage(e,t){switch(t.type){case`exec.request`:this.handleFollowerExecRequest(e,t);break;case`exec.chunk`:this.handleRemoteExecChunk(e,t);break;case`exec.response`:this.handleRemoteExecResponse(e,t);break;case`exec.signal`:this.handleFollowerExecSignal(e,t);break}}sendExecSignal(e,t,n){this.context.followers.followers.get(e)?.sync.send({type:`exec.signal`,requestId:t,signal:n})}handleRemoteExecChunk(e,t){let n=this.pendingRemoteExecs.get(t.requestId);if(!n||n.bootstrapId!==e)return;let r;try{r=s(t.data)}catch{return}if(n.truncated)return;n.bytes+=r.length,n.bytes>Ne&&(n.truncated=!0);let i=(t.stream===`stdout`?n.stdoutDecoder:n.stderrDecoder).decode(r,{stream:!0});t.stream===`stdout`?n.stdout+=i:n.stderr+=i,n.onChunk?.(t.stream,i)}handleRemoteExecResponse(e,t){let n=this.pendingRemoteExecs.get(t.requestId);!n||n.bootstrapId!==e||(this.pendingRemoteExecs.delete(t.requestId),n.timer&&clearTimeout(n.timer),n.stdout+=n.stdoutDecoder.decode(),n.stderr+=n.stderrDecoder.decode(),n.resolve({stdout:n.truncated?`${n.stdout}\n[output truncated at cap]`:n.stdout,stderr:n.stderr,exitCode:t.exitCode,error:t.error}))}async handleFollowerExecRequest(e,t){let{requestId:n,command:r,cwd:i,env:a}=t,s=this.context.options.execInShell;if(!s){this.context.followers.followers.get(e)?.sync.send({type:`exec.response`,requestId:n,exitCode:127,error:`exec is not supported on this leader`});return}let c=new AbortController,l=`${e}:${n}`;this.localExecAborters.set(l,{bootstrapId:e,controller:c});try{let t=await s(r,{cwd:i,env:a,signal:c.signal,onChunk:(t,r)=>{this.context.followers.followers.get(e)?.sync.send({type:`exec.chunk`,requestId:n,stream:t,data:o(new TextEncoder().encode(r))})}});this.context.followers.followers.get(e)?.sync.send({type:`exec.response`,requestId:n,exitCode:t.exitCode,error:t.error})}catch(t){this.context.followers.followers.get(e)?.sync.send({type:`exec.response`,requestId:n,exitCode:1,error:t instanceof Error?t.message:String(t)})}finally{this.localExecAborters.delete(l)}}handleFollowerExecSignal(e,t){this.localExecAborters.get(`${e}:${t.requestId}`)?.controller.abort()}handleFollowerRemoved(e){for(let[t,n]of this.pendingRemoteExecs)n.bootstrapId===e&&(this.pendingRemoteExecs.delete(t),n.timer&&clearTimeout(n.timer),n.reject(Error(`follower disconnected before the command completed`)));for(let[t,n]of this.localExecAborters)n.bootstrapId===e&&(n.controller.abort(),this.localExecAborters.delete(t))}},Fe=class{context;options;pendingTabOpenRoutes=new Map;tabOpenResolvers=new Map;constructor(e,t){this.context=e,this.options=t,e.followers.onFollowerRemoved({afterRegistryCleanup:e=>this.rejectPendingForFollower(e)})}canRuntimeOpenTab(e){let t=this.options.getTargetEntries().filter(t=>t.runtimeId===e);return t.length===0||t.some(e=>!this.options.isCherryTarget(e))}openRemoteTab(e,t){let n=this.context.followers.runtimeToBootstrap.get(e),r=n?this.context.followers.followers.get(n):void 0;if(!n||!r)return Promise.reject(Error(`Target runtime "${e}" not connected`));if(!this.canRuntimeOpenTab(e))return Promise.reject(Error(`Target runtime "${e}" is a cherry host that cannot open tabs`));let i=`tab-open-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((e,a)=>{this.tabOpenResolvers.set(i,{resolve:e,reject:a}),this.pendingTabOpenRoutes.set(i,{requesterBootstrapId:`__leader__`,targetBootstrapId:n,requestId:i}),r.sync.send({type:`tab.open`,requestId:i,url:t})})}async executeLocalTabOpen(e,t,n){let r=this.context.followers.followers.get(n);if(!r)return;let i=this.context.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.context.followers.runtimeToBootstrap.get(t),a=i?this.context.followers.followers.get(i):void 0,o=this.context.followers.followers.get(r);if(!i||!a){o?.sync.send({type:`tab.open.error`,requestId:e,error:`Target runtime "${t}" not connected`});return}if(!this.canRuntimeOpenTab(t)){o?.sync.send({type:`tab.open.error`,requestId:e,error:`Target runtime "${t}" is a cherry host that cannot open tabs`});return}this.pendingTabOpenRoutes.set(e,{requesterBootstrapId:r,targetBootstrapId:i,requestId:e}),a.sync.send({type:`tab.open`,requestId:e,url:n})}handleTabOpenResponse(e,t){let n=this.pendingTabOpenRoutes.get(e);if(n){if(this.pendingTabOpenRoutes.delete(e),n.requesterBootstrapId===`__leader__`){let n=this.tabOpenResolvers.get(e);n&&(this.tabOpenResolvers.delete(e),n.resolve(t));return}this.context.followers.followers.get(n.requesterBootstrapId)?.sync.send({type:`tab.opened`,requestId:e,targetId:t})}}handleTabOpenError(e,t){let n=this.pendingTabOpenRoutes.get(e);if(n){if(this.pendingTabOpenRoutes.delete(e),n.requesterBootstrapId===`__leader__`){let n=this.tabOpenResolvers.get(e);n&&(this.tabOpenResolvers.delete(e),n.reject(Error(t)));return}this.context.followers.followers.get(n.requesterBootstrapId)?.sync.send({type:`tab.open.error`,requestId:e,error:t})}}rejectPendingForFollower(e){for(let[t,n]of this.pendingTabOpenRoutes){if(n.targetBootstrapId!==e&&n.requesterBootstrapId!==e)continue;this.pendingTabOpenRoutes.delete(t);let r=this.tabOpenResolvers.get(t);r&&(this.tabOpenResolvers.delete(t),r.reject(Error(`follower disconnected before the tab opened`)))}}},Ie=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,kind:r.kind??`browser`,capabilities:r.capabilities});return e}hasChanged(){return this.dirty}getRuntimeIds(){return[...this.runtimes.keys()]}};function W(e){return e.kind===`cherry`}function Le(e,t){return e.filter(e=>e.kind===`preview`?!1:!W(e)||!t.requireNetwork||e.capabilities?.network===!0)}var Re=class{context;options;registry=new Ie;constructor(e,t){this.context=e,this.options=t,e.followers.onFollowerRemoved({removeRuntime:(e,t)=>this.registry.removeRuntime(t),afterRegistryCleanup:()=>{this.registry.hasChanged()&&this.broadcastTargetRegistry()}})}setLocalTargets(e){this.registry.setTargets(`leader`,e),this.registry.hasChanged()&&this.broadcastTargetRegistry()}broadcastTargetRegistry(){this.context.followers.followers.size!==0&&this.context.followers.broadcastToAllFollowers({type:`targets.registry`,targets:this.getFollowerBroadcastEntries()})}sendTargetRegistryToFollower(e){let t=this.getFollowerBroadcastEntries();t.length!==0&&this.context.followers.followers.get(e)?.sync.send({type:`targets.registry`,targets:t})}getTargets(){return this.getConnectedEntries()}getRegistryEntries(){return this.registry.getEntries()}getFollowerBroadcastEntries(){return this.getConnectedEntries().filter(e=>e.kind!==`preview`)}getConnectedEntries(){return[...this.registry.getEntries().filter(e=>{if(e.runtimeId===`leader`)return!0;let t=this.context.followers.runtimeToBootstrap.get(e.runtimeId);return t?this.context.followers.followers.has(t):!1}),...this.options.getPreviewTargetEntries()]}canRuntimeServeTeleport(e,t){if(t.runtime===`slicc-cherry`)return!1;let n=this.registry.getEntries().filter(t=>t.runtimeId===e);return n.length===0||Le(n,{requireNetwork:!0}).length>0}getBestFollowerForTeleport(){let e=[];for(let[t,n]of this.context.followers.runtimeToBootstrap){let r=this.context.followers.followers.get(n);!r||!this.canRuntimeServeTeleport(t,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]}handleFollowerTargetsAdvertise(e,t){this.context.log.info(`Follower targets advertised`,{bootstrapId:e,runtimeId:t.runtimeId,targetCount:t.targets.length}),this.options.cleanupOrphanedRemoteTransports(t.runtimeId),this.context.followers.setRuntimeId(t.runtimeId,e),this.registry.setTargets(t.runtimeId,t.targets);let n=this.context.followers.followers.get(e);if(n&&n.runtime===`slicc-cherry`){let e=t.targets.find(e=>e.kind===`cherry`);if(e)try{n.hostOrigin=new URL(e.url).origin}catch{}}this.broadcastTargetRegistry()}},G=32*1024,ze=1024*1024,Be=3e4,Ve=12e4,He=3;function Ue(e){let t=8192,n=``;for(let r=0;r<e.length;r+=t)n+=String.fromCharCode(...e.subarray(r,r+t));return btoa(n)}async function We(e,t,n){if(typeof e.bufferedAmount==`number`)for(;!n.aborted&&e.bufferedAmount>t;)await new Promise(e=>setTimeout(e,25))}var Ge=class e{context;activeExports=new Map;ackWaiters=new Map;approvalWaiters=new Map;constructor(e){this.context=e,e.followers.onFollowerRemoved({afterRegistryCleanup:e=>this.handleFollowerRemoved(e)})}static exportKey(e,t){return`${e}:${t}`}static ackKey(e,t,n){return`${e}:${t}:${n}`}clearAckWaiters(e,t){let n=`${e}:${t}:`;for(let[e,t]of this.ackWaiters)e.startsWith(n)&&(t.reject(Error(`export aborted`)),this.ackWaiters.delete(e))}handleFollowerRemoved(e){for(let[t,n]of this.activeExports){if(n.bootstrapId!==e)continue;n.abort.abort();let r=t.slice(e.length+1);this.clearAckWaiters(e,r),this.activeExports.delete(t)}for(let t of[...this.approvalWaiters.keys()])t.startsWith(`${e}:`)&&this.settleApproval(t,!1)}async handleTranscriptExportRequest(t,n,r){let i=e.exportKey(t,n);if(this.activeExports.has(i)){this.context.log.warn(`Duplicate transcript export request from same follower, ignoring`,{bootstrapId:t,requestId:n});return}let a=this.context.followers.followers.get(t);if(!a)return;let{requestTranscriptExportApproval:o,createTranscriptExport:s,headlessLeader:c}=this.context.options;if(!o&&!c||!s){a.sync.send({type:`transcript.export.denied`,requestId:n});return}if([...this.activeExports.values()].some(e=>e.bootstrapId===t)){this.context.log.warn(`Follower already has an in-flight export; denying duplicate`,{bootstrapId:t,requestId:n}),a.sync.send({type:`transcript.export.denied`,requestId:n});return}let l=new AbortController;this.activeExports.set(i,{bootstrapId:t,abort:l});let u=U(a.floatType,a.runtime);a.sync.send({type:`transcript.export.pending`,requestId:n});let d=!1;try{c?d=await this.requestDelegatedApproval(t,n,r):o&&(d=await o({requestId:n,followerLabel:u,hostOrigin:a.hostOrigin,selector:r}))}catch(e){this.context.log.warn(`transcript export approval threw`,{requestId:n,error:e instanceof Error?e.message:String(e)}),d=!1}let f=this.context.followers.followers.get(t);if(!this.activeExports.has(i)||!f){this.activeExports.delete(i);return}if(!d){f.sync.send({type:`transcript.export.denied`,requestId:n}),this.activeExports.delete(i);return}this.streamTranscriptExport(t,n,r,l)}handleTranscriptExportCancel(t,n){let r=e.exportKey(t,n),i=this.activeExports.get(r);i&&(this.context.log.info(`Transcript export cancelled by follower`,{requestId:n,bootstrapId:t}),i.abort.abort(),this.activeExports.delete(r),this.clearAckWaiters(t,n),this.settleApproval(r,!1))}requestDelegatedApproval(t,n,r){let i=this.context.followers.followers.get(t);if(!i)return Promise.resolve(!1);let a=e.exportKey(t,n);return new Promise(e=>{let o=setTimeout(()=>{this.context.log.warn(`Delegated transcript export approval timed out`,{bootstrapId:t,requestId:n}),this.settleApproval(a,!1)},Ve);this.approvalWaiters.set(a,t=>{clearTimeout(o),e(t)}),i.sync.send({type:`transcript.export.approve.request`,requestId:n,selector:r})||(this.context.log.warn(`Failed to send delegated approval prompt — denying`,{bootstrapId:t,requestId:n}),this.settleApproval(a,!1))})}settleApproval(e,t){let n=this.approvalWaiters.get(e);n&&(this.approvalWaiters.delete(e),n(t))}handleTranscriptExportApprovalResponse(t,n,r){this.settleApproval(e.exportKey(t,n),r===!0)}handleTranscriptExportAck(t,n,r){let i=e.ackKey(t,n,r),a=this.ackWaiters.get(i);a&&(this.ackWaiters.delete(i),a.resolve())}async streamTranscriptExport(t,n,i,a){let o=e.exportKey(t,n),{createTranscriptExport:s}=this.context.options;if(!this.context.followers.followers.get(t)||!s){this.activeExports.delete(o);return}let l=e=>{let r=this.context.followers.followers.get(t);r&&r.sync.send({type:`transcript.export.error`,requestId:n,code:e}),this.activeExports.delete(o)},u;try{u=await s(i,a.signal)}catch(e){if(a.signal.aborted){this.activeExports.delete(o);return}this.context.log.warn(`createTranscriptExport failed`,{requestId:n,error:e instanceof Error?e.message:String(e)}),l(e instanceof c?e.code:`session-not-found`);return}if(a.signal.aborted||!this.activeExports.has(o)){this.activeExports.delete(o);return}let d=this.context.followers.followers.get(t)?.sync;if(!d){this.activeExports.delete(o);return}d.send({type:`transcript.export.start`,requestId:n,filename:u.filename});let{sha256:f}=await r(async()=>{let{sha256:e}=await import(`./sha256-DmK25X5D.js`).then(e=>e.n);return{sha256:e}},__vite__mapDeps([42,1])),p=f.create(),m=(this.context.followers.followers.get(t)?.peerProtocolVersion??0)>=He,{streamError:h,chunkCount:g,byteLength:_}=await this.sendExportChunks({bootstrapId:t,requestId:n,chunks:u.chunks,hasher:p,abort:a,awaitAck:m,onSlice:(e,r)=>{let i=this.context.followers.followers.get(t);return i?(i.sync.send({type:`transcript.export.chunk`,requestId:n,index:e,data:r}),!0):!1}});if(h){l(`transfer-corrupt`);return}if(!this.activeExports.has(o))return;if(a.signal.aborted){l(`transfer-aborted`);return}let v;try{v=await u.completion}catch{if(a.signal.aborted){this.activeExports.delete(o);return}l(`transfer-aborted`);return}if(a.signal.aborted||!this.activeExports.has(o)){this.activeExports.delete(o);return}if(v.byteLength!==_){this.context.log.warn(`Transcript export byte count mismatch between service and leader stream`,{requestId:n,serviceByteLength:v.byteLength,leaderByteCount:_}),l(`transfer-corrupt`);return}let y=p.hex();if(v.sha256!==y){this.context.log.warn(`Transcript export SHA-256 mismatch between service and leader stream`,{requestId:n}),l(`transfer-corrupt`);return}let b=this.context.followers.followers.get(t);b&&b.sync.send({type:`transcript.export.complete`,requestId:n,chunks:g,byteLength:_,sha256:y}),this.activeExports.delete(o)}async sendExportChunks(t){let{bootstrapId:n,requestId:r,chunks:i,hasher:a,abort:o,onSlice:s,awaitAck:c}=t,l=e.exportKey(n,r),u=this.context.followers.followers.get(n)?.sync;if(!u)return{streamError:!0,chunkCount:0,byteLength:0};let d=0,f=0;try{for await(let e of i){if(o.signal.aborted||!this.activeExports.has(l))return{streamError:!1,chunkCount:d,byteLength:f};a.update(e),f+=e.byteLength;let t=await this.sendExportSlices({bootstrapId:n,requestId:r,b64:Ue(e),sync:u,key:l,abort:o,onSlice:s,awaitAck:c,startIdx:d});if(d=t.nextIdx,t.done!==`continue`)return{streamError:t.done===`error`,chunkCount:d,byteLength:f}}}catch(e){return o.signal.aborted?{streamError:!1,chunkCount:d,byteLength:f}:(this.context.log.warn(`Error streaming transcript export chunks`,{requestId:r,error:e instanceof Error?e.message:String(e)}),{streamError:!0,chunkCount:d,byteLength:f})}return{streamError:!1,chunkCount:d,byteLength:f}}async sendExportSlices(e){let{bootstrapId:t,requestId:n,b64:r,sync:i,key:a,abort:o,onSlice:s,awaitAck:c}=e,l=e.startIdx;for(let e=0;e<r.length;e+=G){if(o.signal.aborted||!this.activeExports.has(a)||(await We(i,ze,o.signal),o.signal.aborted||!this.activeExports.has(a)))return{nextIdx:l,done:`abort`};let u=r.slice(e,e+G);if(!s(l,u))return{nextIdx:l,done:`error`};if(c&&(!await this.waitForAck(t,n,l,o)||o.signal.aborted||!this.activeExports.has(a)))return{nextIdx:l+1,done:`abort`};l++}return{nextIdx:l,done:`continue`}}waitForAck(t,n,r,i){let a=i.signal;return new Promise(o=>{if(a.aborted){o(!1);return}let s=e.ackKey(t,n,r),c,l=()=>{c!==void 0&&(clearTimeout(c),c=void 0)},u=()=>{this.ackWaiters.delete(s),l()},d=()=>{u(),o(!1)};a.addEventListener(`abort`,d,{once:!0}),c=setTimeout(()=>{c=void 0,i.abort(),this.clearAckWaiters(t,n)},Be),this.ackWaiters.set(s,{resolve:()=>{a.removeEventListener(`abort`,d),u(),o(!0)},reject:()=>{a.removeEventListener(`abort`,d),u(),o(!1)}})})}},K=a(`tray-leader-sync`),Ke=class{options;followerRegistry;broadcast;cdpRouter;remoteExec;fsRouter;tabRouter;previewBridge;cherryRouter;teleportPool;transcriptExport;followerDispatch;get followers(){return this.followerRegistry.followers}constructor(e){this.options=e,this.followerRegistry=new Ee({log:K,onMessage:(e,t)=>this.followerDispatch.dispatch(e,t),onFollowerDead:e=>this.options.onFollowerDead?.(e),onFollowerCountChanged:e=>this.options.onFollowerCountChanged?.(e)});let t={options:e,followers:this.followerRegistry,log:K,sendControl:e.sendControl};this.broadcast=new be(t),this.previewBridge=new Me(t),this.cdpRouter=new xe(t,{getBridgeTransport:e=>this.previewBridge.getBridgeTransport(e)}),this.remoteExec=new Pe(t),this.teleportPool=new Re(t,{cleanupOrphanedRemoteTransports:e=>this.cdpRouter.cleanupOrphanedRemoteTransports(e),getPreviewTargetEntries:()=>this.previewBridge.getTargetEntries()}),this.transcriptExport=new Ge(t),this.fsRouter=new Oe(t),this.tabRouter=new Fe(t,{getTargetEntries:()=>this.teleportPool.getRegistryEntries(),isCherryTarget:W}),this.cherryRouter=new Se(t),this.followerDispatch=new De(t,{broadcast:this.broadcast,cdpRouter:this.cdpRouter,remoteExec:this.remoteExec,fsRouter:this.fsRouter,tabRouter:this.tabRouter,teleportPool:this.teleportPool,transcriptExport:this.transcriptExport,cherryRouter:this.cherryRouter}),Object.defineProperties(this,{activeExports:{get:()=>this.transcriptExport.activeExports},bridgeConns:{get:()=>this.previewBridge.bridgeConns},mintMap:{get:()=>this.previewBridge.mintMap}})}addFollower(e,t,n){let{sync:r}=this.followerRegistry.addFollower(e,t,n);r.send({type:`hello`,protocolVersion:4}),this.broadcast.sendSnapshotToFollower(e),this.broadcast.sendScoopsListToFollower(e),this.broadcast.sendSprinklesListToFollower(e),this.teleportPool.sendTargetRegistryToFollower(e)}removeFollower(e){this.followerRegistry.removeFollower(e)}broadcastEvent(e){this.broadcast.broadcastEvent(e)}broadcastUserMessage(e,t,n){this.broadcast.broadcastUserMessage(e,t,n)}broadcastStatus(e){this.broadcast.broadcastStatus(e)}broadcastSnapshot(){this.broadcast.broadcastSnapshot()}broadcastScoopsList(){this.broadcast.broadcastScoopsList()}broadcastSprinklesList(){this.broadcast.broadcastSprinklesList()}broadcastSprinkleUpdate(e,t){this.broadcast.broadcastSprinkleUpdate(e,t)}broadcastTheme(e){this.broadcast.broadcastTheme(e)}broadcastSprinkleReloaded(e){this.broadcast.broadcastSprinkleReloaded(e)}broadcastPreviewOpen(e){this.broadcast.broadcastPreviewOpen(e)}async execOnRemote(e,t,n={}){return this.remoteExec.execOnRemote(e,t,n)}getExecCapableBootstrapIds(){return this.followerRegistry.getExecCapableBootstrapIds()}getBrowserCapableBootstrapIds(){return this.followerRegistry.getBrowserCapableBootstrapIds()}getFollowerMotds(){return this.followerRegistry.getFollowerMotds()}setLocalTargets(e){this.teleportPool.setLocalTargets(e)}broadcastTargetRegistry(){this.teleportPool.broadcastTargetRegistry()}getTargets(){return this.teleportPool.getTargets()}createRemoteTransport(e,t){return this.cdpRouter.createRemoteTransport(e,t)}removeRemoteTransport(e,t){this.cdpRouter.removeRemoteTransport(e,t)}getConnectedFollowers(){return this.followerRegistry.getConnectedFollowers()}getBestFollowerForTeleport(){return this.teleportPool.getBestFollowerForTeleport()}get hasFollowers(){return this.followers.size>0}stop(){for(let e of[...this.followers.keys()])this.removeFollower(e);this.previewBridge.stop()}emitCherrySliccEvent(e,t,n){return this.cherryRouter.emitCherrySliccEvent(e,t,n)}openRemoteTab(e,t){return this.tabRouter.openRemoteTab(e,t)}sendFsRequest(e,t){return this.fsRouter.sendFsRequest(e,t)}registerMintedPreview(e,t){this.previewBridge.registerMintedPreview(e,t)}dropMintedPreview(e){this.previewBridge.dropMintedPreview(e)}restorePreviewState(e){this.previewBridge.restorePreviewState(e)}getPreviewLifecycleRecords(e){return this.previewBridge.getPreviewLifecycleRecords(e)}clearPreviewLifecycleRecords(e){return this.previewBridge.clearPreviewLifecycleRecords(e)}rearmPreviewAnnouncements(e){return this.previewBridge.rearmPreviewAnnouncements(e)}onBridgeConnected(e){this.previewBridge.onBridgeConnected(e)}onBridgeDisconnected(e){this.previewBridge.onBridgeDisconnected(e)}onBridgeCdpResponse(e){this.previewBridge.onBridgeCdpResponse(e)}getBridgeTransport(e){return this.previewBridge.getBridgeTransport(e)}},q=a(`page-leader-tray`);function qe(e,t){return new Ke({sendControl:e=>t().sendControlMessage(e),getMessages:e.getMessages,getMessagesForScoop:e.getMessagesForScoop,getScoopJid:e.getScoopJid,getScoops:e.getScoops,getSprinkles:e.getSprinkles,readSprinkleContent:e.readSprinkleContent,onSprinkleLick:e.onSprinkleLick,onForwardedLick:e.onForwardedLick,onFollowerMessage:e.onFollowerMessage,onFollowerAbort:e.onFollowerAbort,onFollowerNewSession:e.onFollowerNewSession,onFollowerCountChanged:e.onFollowerCountChanged,onRemoteTransportsCleaned:e.onRemoteTransportsCleaned,execInShell:e.execInShell,onCherryHostEvent:e.onCherryHostEvent,onPreviewLick:e.onPreviewLick,requestTranscriptExportApproval:e.requestTranscriptExportApproval,createTranscriptExport:e.createTranscriptExport,headlessLeader:e.kind===`hosted`,browserAPI:e.browserAPI,browserTransport:e.browserTransport,vfs:e.vfs})}function Je(e,t){return new le({sendControlMessage:t=>e().sendControlMessage(t),onPeerConnected:(e,n)=>{q.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})},onPeerDisconnected:(e,t)=>{q.info(`Tray follower disconnected`,{bootstrapId:e,reason:t})}})}function Ye(e,t,n,r,i,a){let o=t=>{e.browserTransport?.sendLeaderJoinUrl?.(t)};return new ae({workerBaseUrl:e.workerBaseUrl,runtime:e.runtime??`slicc-standalone`,...e.kind?{kind:e.kind}:{},onLeaderReady:t=>{e.onLeaderReady?.(t),o(t.joinUrl)},fetchImpl:r,...e._storeOverride?{store:e._storeOverride}:{},...e._webSocketFactory?{webSocketFactory:e._webSocketFactory}:{},onControlMessage:r=>{if(r.type===`webhook.event`){e.sendWebhookEvent(r.webhookId,r.headers,r.body);return}if(r.type===`preview.request`){let t=e.vfs;if(!t){a().sendControlMessage({type:`preview.response`,reqId:r.reqId,ok:!1,status:500,reason:`leader has no VFS bound`});return}ge(r,{send:e=>a().sendControlMessage(e)},t).catch(e=>{q.error(`preview.request handling failed`,{error:e instanceof Error?e.message:String(e)})});return}if(r.type===`preview.revoked`){q.info(`Preview revoked by worker`,{previewToken:r.previewToken}),n.dropMintedPreview(r.previewToken);return}if(r.type===`preview.state`){n.restorePreviewState(r);return}if(r.type===`bridge.connected`){n.onBridgeConnected(r);return}if(r.type===`bridge.disconnected`){n.onBridgeDisconnected(r);return}if(r.type===`bridge.cdp.response`){n.onBridgeCdpResponse(r);return}t.handleControlMessage(r).catch(e=>{q.error(`Tray leader bootstrap handling failed`,{error:e instanceof Error?e.message:String(e)})})},onReconnecting:(e,t)=>{q.info(`Leader tray reconnecting`,{attempt:e,lastError:t})},onReconnected:e=>{q.info(`Leader tray reconnected`,{trayId:e.trayId}),i(e),o(e.joinUrl)},onReconnectGaveUp:(e,t)=>{q.error(`Leader tray reconnect gave up`,{lastError:e,attempts:t}),o(null)}})}function Xe(e,t){let n=new fe(q,{failureMessage:`Leader CDP target refresh failed (best-effort, throttled)`,recoveryMessage:`Leader CDP target refresh recovered (stable for debounce window)`});return async()=>{let r;try{r=await e.browserAPI.listPages()}catch(e){n.reportFailure(e);return}n.reportSuccess();try{let e=r.map(e=>({targetId:e.targetId,title:e.title,url:e.url}));t.setLocalTargets(e)}catch(e){q.error(`Leader target broadcast failed (sync.setLocalTargets threw)`,{error:e instanceof Error?e.message:String(e)})}}}function Ze(e,t){return setInterval(()=>{try{e.broadcastScoopsList(),e.broadcastSprinklesList()}catch(e){q.error(`Failed to broadcast follower lists`,{error:e instanceof Error?e.message:String(e)})}},t)}function Qe(e){return t=>{let n=e._historyOverride??Y();if(n)try{let e=_(n.href,t.workerBaseUrl,t.trayId);e!==n.href&&n.replaceState(null,``,e)}catch(e){q.debug(`URL bar update skipped`,{error:e instanceof Error?e.message:String(e)})}}}function J(e){let t=e._refreshIntervalMs??5e3,n=e._fetchImpl??((e,t)=>fetch(e,t)),r,i=Qe(e),a=qe(e,()=>r);e.browserAPI.setTrayTargetProvider(a);let o=Je(()=>r,a);r=Ye(e,o,a,n,i,()=>r);let s=e.onAgentEvent(e=>a.broadcastEvent(e)),c=[],l=Xe(e,a);c.push(setInterval(l,t)),l(),c.push(Ze(a,t));let u=r.start();u.then(i).catch(e=>{q.error(`Leader tray start failed`,{error:e instanceof Error?e.message:String(e)})});let d=!1;return{ready:u,stop(){d=!0,s();for(let e of c)clearInterval(e);a.stop(),o.stop(),r.stop()},async reset(){a.stop(),o.stop(),r.stop(),await r.clearSession();let e=await r.start();return i(e),C()},leader:r,peers:o,sync:a,get currentLeaderSync(){return d?null:a}}}function Y(){return typeof window>`u`||!window.history||!window.location?null:{get href(){return window.location.href},replaceState(e,t,n){window.history.replaceState(e,t,n)}}}function $e(e){let t=new Map,n=(e,t)=>`${e}:${t}`,r=(r,i)=>{let a=n(r,i),o=t.get(a);if(!o){let n=e.getSync();if(!n)throw Error(`remote-cdp: leader tray not started`);o={runtimeId:r,localTargetId:i,transport:n.createRemoteTransport(r,i),forwarders:new Map},t.set(a,o)}return o},i=n=>{let r=t.get(n);if(!r)return;for(let[e,t]of r.forwarders)r.transport.off(e,t.listener);r.forwarders.clear();let i=e.getSync();i?.removeRemoteTransport?i.removeRemoteTransport(r.runtimeId,r.localTargetId):r.transport.disconnect(),t.delete(n)};return{async send({runtimeId:e,localTargetId:t,method:n,params:i,sessionId:a,timeout:o}){return r(e,t).transport.send(n,i,a,o)},async subscribe({runtimeId:t,localTargetId:n,event:i}){let a=r(t,n),o=a.forwarders.get(i);if(o)return o.count+=1,{ok:!0};let s=r=>e.postEvent({runtimeId:t,localTargetId:n,method:i,params:r});return a.transport.on(i,s),a.forwarders.set(i,{listener:s,count:1}),{ok:!0}},async unsubscribe({runtimeId:e,localTargetId:r,event:i}){let a=t.get(n(e,r)),o=a?.forwarders.get(i);return!a||!o?{ok:!0}:(--o.count,o.count<=0&&(a.transport.off(i,o.listener),a.forwarders.delete(i)),{ok:!0})},async detach({runtimeId:e,localTargetId:t}){return i(n(e,t)),{ok:!0}},async openTab({runtimeId:t,url:n}){let r=e.getSync();if(!r?.openRemoteTab)throw Error(`remote-cdp: openRemoteTab not available`);return{targetId:await r.openRemoteTab(t,n)}},cleanupRuntime(e){let n=`${e}:`;for(let e of[...t.keys()])e.startsWith(n)&&i(e)},disposeAll(){for(let e of[...t.keys()])i(e)}}}var X=a(`tray-leader-lock`);function et(e){return`slicc-tray-leader:${e}`}function Z(){let e=!1,t=null;return{release:()=>{e||(e=!0,t?.())},heldPromise:new Promise(e=>{t=e})}}async function Q(e,t){if(!t)return{status:`granted`,release:()=>{}};let n=et(e),r,i=new Promise(e=>{r=e}),a=Z();return t.request(n,{mode:`exclusive`,ifAvailable:!0},e=>e===null?(r(!1),Promise.resolve()):(r(!0),a.heldPromise)),await i?{status:`granted`,release:a.release}:{status:`deferred`,waitForPromotion:()=>new Promise(e=>{let r=Z();t.request(n,{mode:`exclusive`},()=>(e({release:r.release}),r.heldPromise))})}}async function tt(e){let t=await Q(e.workerBaseUrl,e.lockManager);if(t.status===`granted`){if(!e.shouldLead()){t.release();return}e.onGranted(t.release);return}X.error(`Another tab is already leading on this tray worker — deferring leader start until the other tab releases the lock.`);let{release:n}=await t.waitForPromotion();if(!e.shouldLead()){n();return}X.error(`Late promotion: this tab is now the tray leader.`),e.onGranted(n)}function nt(){return typeof navigator<`u`&&navigator.locks&&typeof navigator.locks.request==`function`?navigator.locks:null}function $(e,t){let{browser:n,client:r,getController:i}=e;return{joinUrl:t,onSnapshot:e=>i()?.loadMessages(e),onUserMessage:(e,t,n,r)=>i()?.addUserMessage(e,r),onStatus:e=>i()?.setProcessing(e===`processing`),setChatAgent:e=>i()?.setAgent(e),browserAPI:n,onForwardingToggle:e=>r.sendSetFollowerForwarding(e),addSprinkle:(t,n,r)=>e.addSprinkle(t,n,r),removeSprinkle:t=>e.removeSprinkle(t),onScoopsList:(t,n)=>{e.refs.switcher.scoops=t.map(e=>({key:e.jid,type:e.isCone?`cone`:`scoop`,color:ce(e),label:e.isCone?`sliccy`:e.name,eyes:`open`})),e.refs.switcher.setAttribute(`active`,n)}}}function rt(e,t,n){let{client:i,refs:a}=e;return o=>({workerBaseUrl:o,getMessages:()=>e.getController()?.getMessages()??[],getMessagesForScoop:e=>i.getMessagesForScoop(e),getScoopJid:()=>e.getSelectedJid(),getScoops:()=>i.getScoops().map(e=>({jid:e.jid,name:e.name,folder:e.folder,isCone:e.isCone,assistantLabel:e.assistantLabel,trigger:e.trigger})),getSprinkles:()=>{let t=new Set(e.sprinkleManager.opened());return e.sprinkleManager.available().map(e=>({name:e.name,title:e.title,path:e.path,open:t.has(e.name),autoOpen:e.autoOpen,icon:e.icon}))},readSprinkleContent:async t=>{let n=e.sprinkleManager.available().find(e=>e.name===t);if(!n)return null;try{let t=await(await e.openFs()).readFile(n.path,{encoding:`utf-8`});return typeof t==`string`?t:new TextDecoder(`utf-8`).decode(t)}catch{return null}},onSprinkleLick:(e,t,n,r)=>i.sendSprinkleLick(e,t,n,r),onFollowerMessage:(n,r,i,a)=>{e.getController()?.addUserMessage(n,i),e.agentHandle.sendMessage(n,r,i,a),t.leader?.sync.broadcastUserMessage(n,r,i)},onFollowerAbort:()=>e.agentHandle.stop(),onFollowerNewSession:t=>{e.window.dispatchEvent(new CustomEvent(oe,{detail:{action:t}}))},onFollowerCountChanged:t=>{a.floatbar.setAttribute(`label`,t>0?`tray · ${t} follower${t===1?``:`s`}`:e.baseFloatLabel??`standalone · live`),A(k())},onRemoteTransportsCleaned:e=>n.cleanupRuntime(e),onForwardedLick:e=>i.sendForwardedLick(e),onCherryHostEvent:(e,t,n)=>i.sendCherryHostEvent(e,t,n),onPreviewLick:e=>i.sendPreviewLick(e),requestTranscriptExportApproval:e=>r(async()=>{let{openTranscriptExportApproval:e}=await import(`./wc-transcript-export-C4O9AKQ6.js`);return{openTranscriptExportApproval:e}},__vite__mapDeps([43,4,44,13,42,1])).then(({openTranscriptExportApproval:t})=>t(e)),createTranscriptExport:async(e,t)=>{let{runTranscriptExportForFollower:n}=await r(async()=>{let{runTranscriptExportForFollower:e}=await import(`./wc-transcript-export-C4O9AKQ6.js`);return{runTranscriptExportForFollower:e}},__vite__mapDeps([43,4,44,13,42,1]));return n(e,t,i)},sendWebhookEvent:(e,t,n)=>i.sendWebhookEvent(e,t,n),onAgentEvent:t=>e.agentHandle.onEvent(t),execInShell:(e,t)=>z(i,{command:e,...t}),browserAPI:e.browser,browserTransport:e.realCdpTransport,vfs:{async stat(t){return(await e.openFs()).stat(t)},async readFile(t,n){return(await e.openFs()).readFile(t,n)}}})}function it(e,t){return{wireLeaderHooks:t=>{O(()=>{let e=t.sync.getExecCapableBootstrapIds(),n=t.sync.getBrowserCapableBootstrapIds(),r=t.sync.getFollowerMotds();return t.peers.getPeers().map(t=>({runtimeId:de(t.bootstrapId),runtime:t.runtime,connectedAt:t.connectedAt??void 0,exec:e.has(t.bootstrapId),cdp:n.has(t.bootstrapId),motd:r.get(t.bootstrapId)}))}),e.sprinkleManager.setSendToSprinkleHook((e,n)=>t.sync.broadcastSprinkleUpdate(e,n)),e.sprinkleManager.setReloadHook(e=>t.sync.broadcastSprinkleReloaded(e)),e.getController()?.setOnLocalUserMessage((e,n,r)=>t.sync.broadcastUserMessage(e,n,r)),e.getController()?.setOnLocalProcessingChange(e=>t.sync.broadcastStatus(e?`processing`:`ready`)),r(async()=>{let{setThemeChangeListener:e,getActiveThemeId:t}=await import(`./theme-engine-jfuTMXZM.js`).then(e=>e.p);return{setThemeChangeListener:e,getActiveThemeId:t}},__vite__mapDeps([45,1,12])).then(({setThemeChangeListener:e,getActiveThemeId:n})=>{let r;e(e=>{n()!==`__preview`&&(clearTimeout(r),r=setTimeout(()=>t.sync.broadcastTheme(e),150))})})},clearLeaderHooks:()=>{O(null),A([]),e.getController()?.setOnLocalUserMessage(void 0),e.getController()?.setOnLocalProcessingChange(void 0),e.sprinkleManager.setSendToSprinkleHook(void 0),e.sprinkleManager.setReloadHook(void 0),t.disposeAll(),r(async()=>{let{setThemeChangeListener:e}=await import(`./theme-engine-jfuTMXZM.js`).then(e=>e.p);return{setThemeChangeListener:e}},__vite__mapDeps([45,1,12])).then(({setThemeChangeListener:e})=>{e(null)})}}}function at(e){return{runtime:`slicc-hosted-leader`,kind:`hosted`,onLeaderReady:t=>{fetch(h(`/api/cloud-status`),{method:`POST`,headers:g({"content-type":`application/json`}),body:JSON.stringify({joinUrl:t.joinUrl,trayId:t.trayId,controllerUrl:t.controllerUrl,webhookUrl:t.webhookUrl,runtime:t.runtime,sliccVersion:`6.7.1`}),signal:AbortSignal.timeout(1e4)}).catch(t=>{e.log.error(`failed to POST /api/cloud-status`,{error:String(t)})})}}}function ot(e,t,n,r,i){let{window:a,log:o}=e;if(e.runtimeMode===`hosted-leader`){a.localStorage.removeItem(b);let i=a.localStorage.getItem(y);if(!i){o.error(`hosted-leader: tray worker base URL not seeded`);return}t.leader=J({...n(i),...at(e)}),r(t.leader),L({log:o});return}let s=a.localStorage.getItem(b),c=a.localStorage.getItem(y);s?t.follower=E($(e,s)):c&&st(c,e,t,n,r,i)}function st(e,t,n,r,i,a){tt({workerBaseUrl:e,lockManager:a,shouldLead:()=>!n.leader&&!n.follower&&t.window.localStorage.getItem(`slicc.trayWorkerBaseUrl`)===e,onGranted:t=>{n.lockRelease=t,n.leader=J(r(e)),i(n.leader)}})}function ct(e,t,n,r){let{window:i,log:a}=e;i.addEventListener(`slicc:tray-join`,r=>{let i=r.detail?.joinUrl;if(!i)return;let o=t.leader,s=t.lockRelease;t.leader=null,t.lockRelease=null,n();let c=t.follower;t.follower=null;try{o?.stop()}catch(e){a.error(`leader stop threw during tray-join switch`,e)}s?.();try{c?.stop()}catch(e){a.error(`previous follower stop threw during tray-join switch`,e)}try{t.follower=E($(e,i))}catch(e){a.error(`tray-join failed`,e)}}),i.addEventListener(`slicc:tray-leave`,e=>{let t=e;r({workerBaseUrl:t.detail?.workerBaseUrl??null,requestId:t.detail?.requestId}).catch(e=>a.error(`tray-leave failed`,e))}),i.addEventListener(`beforeunload`,()=>{t.leader?.stop(),t.follower?.stop(),t.lockRelease?.(),t.lockRelease=null},{once:!0})}async function lt(e){let{loadSprinkleStyles:t}=await r(async()=>{let{loadSprinkleStyles:e}=await import(`./legacy-styles-DcRu2WCJ.js`);return{loadSprinkleStyles:e}},__vite__mapDeps([46,4]));await t();let{client:n,instanceId:i,window:a,log:o}=e,s={leader:null,follower:null,lockRelease:null},c=nt(),l=typeof BroadcastChannel==`function`?new BroadcastChannel(x(i)):null,u=$e({getSync:()=>s.leader?.sync??null,postEvent:e=>{let t={type:`panel-rpc-push`,op:`remote-cdp-event`,payload:e};l?.postMessage(t)}});n.setForwardLickHandler(e=>{let t=s.follower?.currentSync;t?t.forwardLick(e):o.warn(`forward-lick dropped: no active follower sync`)});let d=rt(e,s,u),{wireLeaderHooks:f,clearLeaderHooks:p}=it(e,u);a.addEventListener(se,()=>{s.leader?.sync.broadcastSnapshot()});let m=async e=>{let{performTrayLeave:t}=await r(async()=>{let{performTrayLeave:e}=await import(`./tray-leave-runtime-DaD_0DSt.js`);return{performTrayLeave:e}},__vite__mapDeps([47,27,13,14,1,4,15,16,17,28])),n=()=>{s.leader||(s.lockRelease?.(),s.lockRelease=null)},i=t({workerBaseUrl:e.workerBaseUrl,requestId:e.requestId},{getLeader:()=>s.leader,setLeader:e=>{s.leader=e},getFollower:()=>s.follower,setFollower:e=>{s.follower=e},startLeader:e=>(s.lockRelease?.(),s.lockRelease=null,Q(e,c).then(e=>{if(e.status===`granted`){if(!s.leader){e.release();return}s.lockRelease=e.release}}),J(d(e))),clearLeaderHooks:p,wireLeaderHooks:f,storage:a.localStorage,log:o});try{let e=await i;return n(),e}catch(e){throw n(),e}};return await I({instanceId:i,browser:e.browser,remoteCdpBridge:u,remoteCdpPushChannel:l,getLeader:()=>s.leader,performTrayLeaveLocally:m,window:a}),ot(e,s,d,f,c),pe(e.refs.floatbar),ie(e=>{a.localStorage.setItem(`slicc.leaderTrayStatus`,JSON.stringify(e))}),a.localStorage.setItem(`slicc.leaderTrayStatus`,JSON.stringify(C())),te(e=>{a.localStorage.setItem(S,JSON.stringify(e))}),a.localStorage.setItem(S,JSON.stringify(ee())),A(k(),a.localStorage),ct(e,s,p,m),{getLeader:()=>s.leader,getFollower:()=>s.follower,performTrayLeaveLocally:m}}export{lt as wireWcTray};
|
|
1
|
+
const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/panel-rpc-DmJSNs0I.js","assets/rolldown-runtime-aKtaBQYM.js","assets/panel-rpc-handlers-DAgL3NAS.js","assets/account-store-CysBUUQJ.js","assets/preload-helper-Czpn1I53.js","assets/compat-CkpNnFQS.js","assets/models-Bnh9VDA1.js","assets/event-stream-qbAZIAKV.js","assets/provider-env-D37PhSJu.js","assets/__vite-browser-external-SwrSgYTf.js","assets/openrouter.models-DS1_VkCm.js","assets/context-compaction-C3e7rcEG.js","assets/logger-DDBAeTLF.js","assets/src-BStYtmHq.js","assets/proxied-fetch-A48etSCh.js","assets/base64-DpPqYZJF.js","assets/runtime-env-DH4NDw4t.js","assets/fetch-body-D2PwksUW.js","assets/secret-topology-CKyE_tTD.js","assets/secrets-bridge-client-CUeSRcdV.js","assets/port-bridge-client-B64OCgRQ.js","assets/tool-ui-DfXu6quJ.js","assets/tool-result-images-DwRGZUe_.js","assets/providers-CLGnrQ6p.js","assets/bedrock-camp-CJY4i7di.js","assets/transform-messages-wECJwtH0.js","assets/provider-settings-B4rEHMW6.js","assets/tray-runtime-config-DRqOLcXQ.js","assets/messages-BD4p8GuF.js","assets/tray-follower-status-5SqDRLX8.js","assets/clipboard-DuHpK59o.js","assets/telemetry-DqIqVG5n.js","assets/tray-join-url-BIvzbiFR.js","assets/hid-device-registry-DboUgvzI.js","assets/serial-port-registry-DsPZvGpT.js","assets/usb-operations-BQbhk96u.js","assets/usb-device-registry-BOGfZXgp.js","assets/wc-permissions-registry-Blyunq37.js","assets/tray-leader-CftlXLF8.js","assets/db-ysOO0kLr.js","assets/tray-sync-protocol-CQ9Z94EX.js","assets/hosted-config-apply-uAym2aS5.js","assets/sha256-DmK25X5D.js","assets/wc-transcript-export-C4O9AKQ6.js","assets/export-spool-Crzaptz9.js","assets/theme-engine-jfuTMXZM.js","assets/legacy-styles-DcRu2WCJ.js","assets/tray-leave-runtime-DaD_0DSt.js"])))=>i.map(i=>d[i]);
|
|
2
|
+
import{P as e,d as t,z as n}from"./account-store-CysBUUQJ.js";import{t as r}from"./preload-helper-Czpn1I53.js";import{n as i}from"./attachments-CByeG2Ru.js";import{t as a}from"./logger-DDBAeTLF.js";import{n as o,t as s}from"./base64-DpPqYZJF.js";import{r as c}from"./src-BStYtmHq.js";import{a as l,l as u,n as d,o as f,r as p,u as m}from"./tray-sync-protocol-CQ9Z94EX.js";import{o as h,t as g}from"./proxied-fetch-A48etSCh.js";import{a as _,f as v,i as y,r as b}from"./tray-runtime-config-DRqOLcXQ.js";import{r as x}from"./panel-rpc-DmJSNs0I.js";import{n as ee,o as te,t as S}from"./tray-follower-status-5SqDRLX8.js";import"./provider-settings-B4rEHMW6.js";import"./handoff-link-Da4o0fy_.js";import{t as ne}from"./remote-cdp-transport-CaLf00Hc.js";import"./browser-COVn7LPD.js";import{t as re}from"./terminal-session-client-BylrXUky.js";import{i as ie,n as C,t as ae}from"./tray-leader-CftlXLF8.js";import{t as w}from"./synthetic-cdp-transport-CtfKyiws.js";import{n as oe,t as se}from"./leader-session-events-m7I5BMZy.js";import{t as ce}from"./wc-scoop-color-CByZNEJo.js";import{a as T,i as le,n as E,o as ue,r as de,s as fe,t as pe}from"./wc-floatbar-online-B6FIfDc-.js";a(`scoops.tray-leave`),a(`scoops.tray-join`);var D=null;function O(e){D=e}function k(){return D?.()??[]}var me=`slicc.leaderTrayFollowers`;function A(e,t=globalThis.localStorage){try{t?.setItem(me,JSON.stringify(e))}catch{}}function j(e){if(e.userName)return`${e.providerId}:${e.userName}`;if(e.accessToken)try{let t=JSON.parse(atob(e.accessToken.split(`.`)[1].replace(/-/g,`+`).replace(/_/g,`/`))),n=t.email??t.user_id??t.sub;if(n)return`${e.providerId}:${n}`}catch{}return null}async function M(){try{let e=t().filter(e=>!e.loggedOut),n=[`adobe`,`github`].map(t=>e.find(e=>e.providerId===t)).find(Boolean)??e[0],r=n?j(n):null;if(!r)return`00000000`;let i=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(r));return Array.from(new Uint8Array(i,0,4),e=>e.toString(16).padStart(2,`0`)).join(``)}catch{return`00000000`}}function N(e,t){let n=e()?.currentLeaderSync;if(!n)throw Error(`serve ${t}: no active leader tray`);return n}function P(e,t){return{lifecycleRecords:[...e.getPreviewLifecycleRecords(t)]}}function F(e,t){return{cleared:e.clearPreviewLifecycleRecords(t),rearmed:e.rearmPreviewAnnouncements(t)}}async function I(e){let{instanceId:t,browser:n,remoteCdpBridge:i,remoteCdpPushChannel:a,getLeader:o,performTrayLeaveLocally:s,window:c}=e,{installPanelRpcHandler:l,createPanelRpcEventEmitter:u}=await r(async()=>{let{installPanelRpcHandler:e,createPanelRpcEventEmitter:t}=await import(`./panel-rpc-DmJSNs0I.js`).then(e=>e.i);return{installPanelRpcHandler:e,createPanelRpcEventEmitter:t}},__vite__mapDeps([0,1])),{createStandalonePanelRpcHandlers:d}=await r(async()=>{let{createStandalonePanelRpcHandlers:e}=await import(`./panel-rpc-handlers-DAgL3NAS.js`);return{createStandalonePanelRpcHandlers:e}},__vite__mapDeps([2,3,1,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,0,24,25,26,27,28,29,30,31,32,33,34,35,36])),{getLeaderPermissionsSurface:f}=await r(async()=>{let{getLeaderPermissionsSurface:e}=await import(`./wc-permissions-registry-Blyunq37.js`).then(e=>e.r);return{getLeaderPermissionsSurface:e}},__vite__mapDeps([37,1])),p=u({instanceId:t}),m=new Map,h=l({instanceId:t,handlers:d({resetTray:async()=>{let e=o();if(!e)throw Error(`no active tray session to reset`);return await e.reset()},leaveTray:async({workerBaseUrl:e,requestId:t})=>await s({workerBaseUrl:e,requestId:t}),joinTray:({joinUrl:e})=>(v(c.localStorage,e),c.dispatchEvent(new CustomEvent(`slicc:tray-join`,{detail:{joinUrl:e}})),{joinUrl:e}),emitEvent:(e,t)=>p.emit(e,t),emitCherrySliccEvent:(e,t,n)=>o()?.sync.emitCherrySliccEvent(e,t,n)??!1,execOnRemote:async({runtimeId:e,command:t,cwd:n,env:r,execToken:i,timeoutMs:a})=>{let s=o()?.currentLeaderSync;if(!s)throw Error(`ssh: no active leader tray`);let c=new AbortController;m.set(i,c);try{return await s.execOnRemote(e,t,{cwd:n,env:r,signal:c.signal,timeoutMs:a})}finally{m.delete(i)}},signalRemoteExec:({execToken:e})=>{m.get(e)?.abort()},mintPreview:async({entryPath:e,servedRoot:t,bridge:n,noBridge:i,maxTabs:a,quiet:s,webhookId:c})=>{let l=o()?.currentLeaderSync;if(!l)throw Error(`serve: no active leader tray; cannot mint preview`);let{getLeaderTrayRuntimeStatus:u}=await r(async()=>{let{getLeaderTrayRuntimeStatus:e}=await import(`./tray-leader-CftlXLF8.js`).then(e=>e.a);return{getLeaderTrayRuntimeStatus:e}},__vite__mapDeps([38,1,12,14,4,15,13,16,17,27,28,39])),d=u().session;if(!d)throw Error(`serve: leader tray has no active session`);let f=new URL(d.controllerUrl).pathname.split(`/`).pop()??``,{CHERRY_RUNTIME_TAG:p}=await r(async()=>{let{CHERRY_RUNTIME_TAG:e}=await import(`./tray-sync-protocol-CQ9Z94EX.js`).then(e=>e.s);return{CHERRY_RUNTIME_TAG:e}},__vite__mapDeps([40,1,12,13])),{mintPreviewViaWorker:m}=await r(async()=>{let{mintPreviewViaWorker:e}=await import(`./preview-mint-client-Dbqjxupb.js`);return{mintPreviewViaWorker:e}},[]),h=l.getConnectedFollowers().some(e=>e.runtime===p),g=!i&&(n||h),_=!i&&n,v=await M(),{url:y,previewToken:b}=await m({workerBaseUrl:d.workerBaseUrl,trayId:d.trayId,controllerToken:f,servedRoot:t,entryPath:e,allowLive:g,bridge:_,maxTabs:a,webhookId:c,userHash:v,quiet:s??!1}),x=e?e.split(`/`).pop()??`Preview`:`Preview`;return l.registerMintedPreview(b,{url:y,title:x,quiet:s??!1}),l.broadcastPreviewOpen(y),{url:y,pushed:l.getConnectedFollowers().length,previewToken:b}},revokePreview:async({previewToken:e})=>{let t=o()?.currentLeaderSync;if(!t)throw Error(`serve --stop: no active leader tray; cannot revoke preview`);let{getLeaderTrayRuntimeStatus:n}=await r(async()=>{let{getLeaderTrayRuntimeStatus:e}=await import(`./tray-leader-CftlXLF8.js`).then(e=>e.a);return{getLeaderTrayRuntimeStatus:e}},__vite__mapDeps([38,1,12,14,4,15,13,16,17,27,28,39])),i=n().session;if(!i)throw Error(`serve --stop: leader tray has no active session`);let a=new URL(i.controllerUrl).pathname.split(`/`).pop()??``,{revokePreviewViaWorker:s}=await r(async()=>{let{revokePreviewViaWorker:e}=await import(`./preview-mint-client-Dbqjxupb.js`);return{revokePreviewViaWorker:e}},[]),c=await s({workerBaseUrl:i.workerBaseUrl,trayId:i.trayId,controllerToken:a,previewToken:e});return t.dropMintedPreview(e),c},listPreviews:async()=>{let{getLeaderTrayRuntimeStatus:e}=await r(async()=>{let{getLeaderTrayRuntimeStatus:e}=await import(`./tray-leader-CftlXLF8.js`).then(e=>e.a);return{getLeaderTrayRuntimeStatus:e}},__vite__mapDeps([38,1,12,14,4,15,13,16,17,27,28,39])),t=e().session;if(!t)throw Error(`serve: leader tray has no active session`);let n=new URL(t.controllerUrl).pathname.split(`/`).pop()??``,{listPreviewsViaWorker:i}=await r(async()=>{let{listPreviewsViaWorker:e}=await import(`./preview-mint-client-Dbqjxupb.js`);return{listPreviewsViaWorker:e}},[]);return await i({workerBaseUrl:t.workerBaseUrl,trayId:t.trayId,controllerToken:n})},getPreviewLifecycleRecords:e=>P(N(o,`--logs`),e),truncatePreviewLifecycleRecords:e=>F(N(o,`--truncate`),e),listRemoteTargets:()=>n.listAllTargets(),remoteCdp:i,getPermissionsSurface:()=>f()})});c.addEventListener(`beforeunload`,()=>{h(),p.dispose(),i.disposeAll(),a?.close()},{once:!0})}async function L(t){let{log:i}=t;await new Promise(e=>setTimeout(e,5e3));try{let t=await fetch(h(`/api/hosted-bootstrap`),{signal:AbortSignal.timeout(1e4),headers:g()});if(!t.ok)return;let a=await t.json(),o=a.accounts??(a.adobeImsToken?[{providerId:`adobe`,kind:`oauth`,accessToken:a.adobeImsToken}]:[]);a.model?localStorage.setItem(`selected-model`,a.model):localStorage.getItem(`selected-model`)||localStorage.setItem(`selected-model`,`adobe:claude-opus-4-6`),a.effortLevel?localStorage.setItem(`slicc_locked_effort_level`,a.effortLevel):localStorage.removeItem(`slicc_locked_effort_level`);let[{applyHostedAccounts:s,prewarmHostedModels:c},l]=await Promise.all([r(()=>import(`./hosted-config-apply-uAym2aS5.js`),__vite__mapDeps([41,12])),r(()=>import(`./provider-settings-B4rEHMW6.js`).then(e=>e.t),__vite__mapDeps([26,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,0,24,25,27,28,29,30,31,32]))]);await c(o,{getRefreshModels:e=>l.getProviderConfig(e).refreshModels});let u=JSON.parse(localStorage.getItem(`slicc_cloud_managed`)??`[]`);await s(o,{saveOAuthAccount:n,addAccount:l.addAccount,removeAccount:e,currentProviderIds:()=>l.getAccounts().map(e=>e.providerId),previouslyManaged:()=>u}),localStorage.setItem(`slicc_cloud_managed`,JSON.stringify(o.map(e=>e.providerId))),i.info(`hosted-leader: cone config applied`,{count:o.length})}catch(e){i.warn(`hosted-leader: bootstrap fetch failed; provider needs manual login`,{error:e instanceof Error?e.message:String(e)})}}var R=0;async function z(e,t){let n=new re({client:e,sid:`ssh-exec-${++R}-${Date.now()}`,onEvent:e=>{e.type===`terminal-output`&&t.onChunk(e.stream,e.data)}}),r=()=>n.signal(`SIGINT`);try{return await n.open({cwd:t.cwd,env:t.env}),t.signal.addEventListener(`abort`,r,{once:!0}),t.signal.aborted?{exitCode:130}:{exitCode:(await n.exec(t.command)).exitCode}}catch(e){return{exitCode:1,error:e instanceof Error?e.message:String(e)}}finally{t.signal.removeEventListener(`abort`,r),n.close(),n.dispose()}}function B(e,t){if(!e||!t||!e.startsWith(`/`)||t===`/`||/%2[eE]/.test(e)||e.split(`/`).some(e=>e===`.`||e===`..`))return!1;let n=t.endsWith(`/`)?t.slice(0,-1):t;return e===n||e.startsWith(n+`/`)}var he=64*1024;async function ge(e,t,n){let{reqId:r,servedRoot:i,asText:a}=e,s=e.vfsPath;if(!B(s,i)){t.send({type:`preview.response`,reqId:r,ok:!1,status:403});return}try{if((await n.stat(s)).type===`directory`&&(s=s.replace(/\/?$/,`/`)+`index.html`,!B(s,i))){t.send({type:`preview.response`,reqId:r,ok:!1,status:403});return}}catch{}let c,l;try{a?(c=await n.readFile(s,{encoding:`utf-8`}),l=`utf-8`):(c=o(await n.readFile(s,{encoding:`binary`})),l=`base64`)}catch(e){e?.code===`ENOENT`?t.send({type:`preview.response`,reqId:r,ok:!1,status:404}):t.send({type:`preview.response`,reqId:r,ok:!1,status:500,reason:String(e?.message??e)});return}let u=ve(s),d=_e(c,he);for(let e=0;e<d.length;e++)t.send({type:`preview.response`,reqId:r,ok:!0,mime:u,chunkIndex:e,totalChunks:d.length,content:d[e],encoding:l})}function _e(e,t){if(e.length<=t)return[e];let n=[];for(let r=0;r<e.length;r+=t)n.push(e.slice(r,r+t));return n}function ve(e){return/\.html?$/i.test(e)?`text/html`:/\.css$/i.test(e)?`text/css`:/\.m?js$/i.test(e)?`application/javascript`:/\.json$/i.test(e)?`application/json`:/\.svg$/i.test(e)?`image/svg+xml`:/\.png$/i.test(e)?`image/png`:/\.jpe?g$/i.test(e)?`image/jpeg`:/\.gif$/i.test(e)?`image/gif`:/\.webp$/i.test(e)?`image/webp`:/\.ico$/i.test(e)?`image/x-icon`:/\.woff2$/i.test(e)?`font/woff2`:/\.woff$/i.test(e)?`font/woff`:/\.ttf$/i.test(e)?`font/ttf`:/\.mp4$/i.test(e)?`video/mp4`:/\.webm$/i.test(e)?`video/webm`:/\.mp3$/i.test(e)?`audio/mpeg`:/\.pdf$/i.test(e)?`application/pdf`:/\.xml$/i.test(e)?`application/xml`:/\.wasm$/i.test(e)?`application/wasm`:`application/octet-stream`}var V=32*1024,H=`[content too large to sync — view on leader]`;function ye(e){switch(e.type){case`tool_result`:return{...e,result:H};case`tool_use_start`:return{...e,toolInput:{note:H}};case`tool_ui`:return{...e,html:`<p>${H}</p>`};case`content_delta`:return{...e,text:H};case`terminal_output`:return{...e,text:H};case`screenshot`:return{type:`error`,error:`Screenshot ${H}`};default:return null}}var be=class{context;constructor(e){this.context=e}broadcastEvent(e){if(this.context.followers.followers.size===0)return;let t=this.context.options.getScoopJid(),n=this.context.followers.broadcastToAllFollowers({type:`agent_event`,event:e,scoopJid:t});if(n.length===0)return;let r=ye(e);if(r)for(let e of n)this.context.followers.followers.get(e)?.sync.send({type:`agent_event`,event:r,scoopJid:t})}broadcastUserMessage(e,t,n){if(this.context.followers.followers.size===0)return;let r=n?.length?i(n):n;this.broadcast({type:`user_message_echo`,text:e,messageId:t,scoopJid:this.context.options.getScoopJid(),attachments:r})}broadcastStatus(e){this.context.followers.followers.size!==0&&this.broadcast({type:`status`,scoopStatus:e})}async sendSnapshotToFollower(e,t){let n=this.context.followers.followers.get(e);if(!n)return;let{options:r}=this.context,i=t??n.selectedScoopJid??r.getScoopJid(),a;if(r.getMessagesForScoop&&i!==r.getScoopJid())try{a=await Promise.resolve(r.getMessagesForScoop(i))}catch(e){this.context.log.warn(`getMessagesForScoop failed, falling back to active scoop`,{targetJid:i,error:e instanceof Error?e.message:String(e)}),a=r.getMessages()}else a=r.getMessages();n.selectedScoopJid=i,f(n.sync,a,i),this.context.log.debug(`Snapshot sent to follower`,{bootstrapId:e,messageCount:a.length,scoopJid:i})}broadcastSnapshot(){if(this.context.followers.followers.size!==0)for(let e of this.context.followers.followers.keys())this.sendSnapshotToFollower(e)}sendScoopsListToFollower(e){let t=this.context.followers.followers.get(e);if(!t)return;let n=this.context.options.getScoops;if(n)try{t.sync.send({type:`scoops.list`,scoops:n(),activeScoopJid:this.context.options.getScoopJid()})}catch(t){this.context.log.warn(`Failed to send scoops.list`,{bootstrapId:e,error:t instanceof Error?t.message:String(t)})}}sendSprinklesListToFollower(e){let t=this.context.followers.followers.get(e);if(!t)return;let n=this.context.options.getSprinkles;if(n)try{t.sync.send({type:`sprinkles.list`,sprinkles:n()})}catch(t){this.context.log.warn(`Failed to send sprinkles.list`,{bootstrapId:e,error:t instanceof Error?t.message:String(t)})}}broadcastScoopsList(){if(this.context.followers.followers.size===0)return;let e=this.context.options.getScoops;if(!e)return;let t;try{t=e()}catch(e){this.context.log.warn(`Failed to compute scoops list`,{error:e instanceof Error?e.message:String(e)});return}this.broadcast({type:`scoops.list`,scoops:t,activeScoopJid:this.context.options.getScoopJid()})}broadcastSprinklesList(){if(this.context.followers.followers.size===0)return;let e=this.context.options.getSprinkles;if(!e)return;let t;try{t=e()}catch(e){this.context.log.warn(`Failed to compute sprinkles list`,{error:e instanceof Error?e.message:String(e)});return}this.broadcast({type:`sprinkles.list`,sprinkles:t})}broadcastSprinkleUpdate(e,t){this.context.followers.followers.size!==0&&this.broadcast({type:`sprinkle.update`,sprinkleName:e,data:t})}broadcastTheme(e){this.context.followers.followers.size!==0&&this.broadcast({type:`theme.apply`,themeJson:e})}broadcastSprinkleReloaded(e){this.context.followers.followers.size!==0&&this.broadcast({type:`sprinkle.reloaded`,sprinkleName:e})}broadcastPreviewOpen(e){this.context.followers.followers.size!==0&&this.broadcast({type:`preview.open`,requestId:`prv-${crypto.randomUUID()}`,url:e})}async handleSprinkleFetch(e,t,n){let r=this.context.followers.followers.get(e);if(!r)return;let i=this.context.options.readSprinkleContent;if(!i){r.sync.send({type:`sprinkle.content`,requestId:t,sprinkleName:n,content:``,error:`Leader has no sprinkle content reader`});return}let a=null;try{a=await Promise.resolve(i(n))}catch(e){r.sync.send({type:`sprinkle.content`,requestId:t,sprinkleName:n,content:``,error:e instanceof Error?e.message:String(e)});return}if(a==null){r.sync.send({type:`sprinkle.content`,requestId:t,sprinkleName:n,content:``,error:`Sprinkle not found: ${n}`});return}if(a.length<=65536){r.sync.send({type:`sprinkle.content`,requestId:t,sprinkleName:n,content:a});return}let o=Math.ceil(a.length/V);for(let e=0;e<o;e++)r.sync.send({type:`sprinkle.content`,requestId:t,sprinkleName:n,content:a.slice(e*V,(e+1)*V),chunkIndex:e,totalChunks:o})}broadcast(e){this.context.followers.broadcastToAllFollowers(e)}},xe=class{context;options;pendingCDPRoutes=new Map;cdpChunkBuffers=new Map;remoteTransports=new Map;constructor(e,t){this.context=e,this.options=t,e.followers.onFollowerRemoved({removeRuntime:(e,t)=>this.cleanupRemoteTransports(t)})}handleCDPRequest(e,t){let{requestId:n,targetRuntimeId:r,localTargetId:i,method:a,params:o,sessionId:s}=t;if(r===`leader`){this.executeLocalCDP(n,i,a,o,s,e);return}this.forwardCDPRequest(n,r,i,a,o,s,e)}async executeLocalCDP(e,t,n,r,i,a){let o=this.context.followers.followers.get(a);if(!o)return;let s=this.context.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);l(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.context.followers.runtimeToBootstrap.get(t),c=s?this.context.followers.followers.get(s):void 0,l=this.context.followers.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}=e,n=this.pendingCDPRoutes.get(t);if(!n)return;let r=p(this.cdpChunkBuffers,e);if(!r)return;if(this.pendingCDPRoutes.delete(t),n.requesterBootstrapId===`__leader__`){for(let e of this.remoteTransports.values())e.handleResponse(t,r.result,r.error);return}let i=this.context.followers.followers.get(n.requesterBootstrapId);i&&l(i.sync,t,r.result,r.error)}handleCDPEvent(e,t,n,r){let i=this.context.followers.runtimeIdForBootstrap(e);if(!i)return;let a=`${i}:`,o=r?{...n,sessionId:r}:n;for(let[e,n]of this.remoteTransports)e.startsWith(a)&&n.handleEvent(t,o)}createRemoteTransport(e,t){if(e===`preview`){let e=t.indexOf(`:`);if(e===-1)throw Error(`Invalid preview localTargetId format: expected "<token>:<connId>", got "${t}"`);let n=t.slice(e+1),r=this.options.getBridgeTransport(n);if(!r)throw Error(`Preview bridge connection "${n}" not found`);return r}let n=`${e}:${t}`,r=new ne({sendCDPRequest:(r,i,a,o)=>{let s=this.context.followers.runtimeToBootstrap.get(e),c=s?this.context.followers.followers.get(s):void 0;if(!c){this.remoteTransports.get(n)?.handleResponse(r,void 0,`Target runtime "${e}" not connected`);return}this.pendingCDPRoutes.set(r,{requesterBootstrapId:`__leader__`,requestId:r}),c.sync.send({type:`cdp.request`,requestId:r,localTargetId:t,method:i,params:a,sessionId:o})}});return this.remoteTransports.set(n,r),r}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),this.context.log.debug(`Cleaned up stale remote transport`,{key:e}));try{this.context.options.onRemoteTransportsCleaned?.(e)}catch(t){this.context.log.warn(`onRemoteTransportsCleaned handler threw`,{runtimeId:e,error:t instanceof Error?t.message:String(t)})}}cleanupOrphanedRemoteTransports(e){for(let t of[...this.remoteTransports.keys()]){let n=t.substring(0,t.indexOf(`:`));n!==`leader`&&!this.context.followers.runtimeToBootstrap.has(n)&&n!==e&&(this.remoteTransports.get(t)?.disconnect(),this.remoteTransports.delete(t),this.context.log.debug(`Cleaned up orphaned remote transport on advertise`,{key:t}))}}},Se=class{context;constructor(e){this.context=e}routeCherryHostEvent(e,t){if(!u(t))return;let n=this.context.options.onCherryHostEvent;if(!n){this.context.log.debug(`cherry.host_event received but no onCherryHostEvent wired`,{bootstrapId:e,name:t.name});return}let r=this.context.followers.runtimeIdForBootstrap(e);try{n(r,t.name,t.detail)}catch(n){this.context.log.warn(`Failed to route cherry.host_event to cone`,{bootstrapId:e,name:t.name,error:n instanceof Error?n.message:String(n)})}}emitCherrySliccEvent(e,t,n){let r=e.indexOf(`:`),i=r>=0?e.slice(0,r):e,a=this.context.followers.runtimeToBootstrap.get(i),o=a?this.context.followers.followers.get(a):void 0;return o?o.sync.send({type:`cherry.slicc_event`,targetId:e,name:t,detail:n}):(this.context.log.warn(`emitCherrySliccEvent: owning follower not connected`,{targetId:e,name:t}),!1)}};a(`lick-manager`);var Ce=new Set([`navigate`,`discovery`]);function we(e){return e?e.includes(`ios`)?`ios`:e.includes(`standalone`)?`standalone`:e.includes(`extension`)?`extension`:e.includes(`electron`)?`electron`:`unknown`:`unknown`}function U(e,t){switch(e){case`extension`:return`extension follower`;case`standalone`:return`standalone follower`;case`electron`:return`Electron follower`;case`ios`:return`iOS follower`;default:return t?`follower (${t})`:`follower`}}var Te=6e4,Ee=class{options;followers=new Map;runtimeToBootstrap=new Map;removalHooks=new Set;followerBroadcastErrorLogAt=new Map;constructor(e){this.options=e}addFollower(e,t,n){this.removeFollower(e);let r=d(t),i=r.onMessage(t=>this.options.onMessage(e,t)),a=new ue({sendPing:()=>r.send({type:`ping`}),isTransportOpen:()=>r.isOpen,onStalled:()=>{this.options.log.warn(`Follower stopped answering pings; channel still open, keeping it`,{bootstrapId:e})},onRecovered:()=>{this.options.log.info(`Follower is answering pings again`,{bootstrapId:e})},onDead:()=>{this.options.log.warn(`Follower keepalive dead, removing follower`,{bootstrapId:e}),this.removeFollower(e),this.options.onFollowerDead?.(e)}});a.start();let o={bootstrapId:e,sync:r,unsubscribe:i,keepalive:a,runtime:n?.runtime,connectedAt:n?.connectedAt,lastActivity:Date.now(),floatType:we(n?.runtime)};return this.followers.set(e,o),this.options.log.info(`Follower added to sync`,{bootstrapId:e,followerCount:this.followers.size}),this.notifyFollowerCountChanged(),o}removeFollower(e){let t=this.followers.get(e);if(!t)return;t.keepalive.stop(),t.unsubscribe(),t.sync.close(),this.followers.delete(e);for(let t of this.removalHooks)t.beforeRegistryCleanup?.(e);this.followerBroadcastErrorLogAt.delete(e);let n=this.runtimeIdForBootstrap(e);if(n){for(let t of this.removalHooks)t.removeRuntime?.(e,n);this.runtimeToBootstrap.delete(n)}for(let t of this.removalHooks)t.afterRegistryCleanup?.(e,n);this.options.log.info(`Follower removed from sync`,{bootstrapId:e,followerCount:this.followers.size}),this.notifyFollowerCountChanged()}onFollowerRemoved(e){return this.removalHooks.add(e),()=>this.removalHooks.delete(e)}notifyFollowerCountChanged(){this.options.onFollowerCountChanged?.(this.followers.size)}setRuntimeId(e,t){this.runtimeToBootstrap.set(e,t)}resolveFollowerByRuntimeId(e){let t=this.runtimeToBootstrap.get(e);if(t){let e=this.followers.get(t);if(e)return{bootstrapId:t,follower:e}}let n=[e];e.startsWith(`follower-`)&&n.push(e.slice(9));for(let e of n){let t=this.followers.get(e);if(t)return{bootstrapId:e,follower:t}}return null}runtimeIdForBootstrap(e){for(let[t,n]of this.runtimeToBootstrap)if(n===e)return t}getFollowerMotds(){let e=new Map;for(let[t,n]of this.followers)n.peerMotd&&e.set(t,n.peerMotd);return e}getExecCapableBootstrapIds(){let e=new Set;for(let[t,n]of this.followers)n.peerCapabilities?.exec&&e.add(t);return e}getBrowserCapableBootstrapIds(){return new Set(this.runtimeToBootstrap.values())}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}})}broadcastToAllFollowers(e){let t=performance.now(),n=[];for(let[r,i]of this.followers){let a=!1,o;try{a=i.sync.send(e)}catch(e){o=e}if(a){this.followerBroadcastErrorLogAt.delete(r);continue}n.push(r),t-(this.followerBroadcastErrorLogAt.get(r)??-1/0)>Te&&(this.followerBroadcastErrorLogAt.set(r,t),this.options.log.error(`Broadcast send to follower failed`,{bootstrapId:r,messageType:e.type,...o?{error:o instanceof Error?o.message:String(o)}:{}}))}return n}},De=class{context;collaborators;constructor(e,t){this.context=e,this.collaborators=t}dispatch(e,t){this.noteLegacyPeer(e,t);let{broadcast:n,cdpRouter:r,remoteExec:i,fsRouter:a,tabRouter:o}=this.collaborators,{teleportPool:s,transcriptExport:c,cherryRouter:l}=this.collaborators;switch(t.type){case`user_message`:this.handleFollowerUserMessage(e,t);break;case`abort`:this.context.log.info(`Follower abort received`,{bootstrapId:e}),this.context.options.onFollowerAbort();break;case`new_session`:this.handleFollowerNewSession(e,t.action);break;case`request_snapshot`:this.context.log.info(`Follower snapshot request received`,{bootstrapId:e,scoopJid:t.scoopJid}),n.sendSnapshotToFollower(e,t.scoopJid);break;case`scoops.select`:this.handleScoopSelection(e,t.scoopJid);break;case`sprinkles.refresh`:this.context.log.info(`Follower requested sprinkles refresh`,{bootstrapId:e}),n.sendSprinklesListToFollower(e);break;case`sprinkle.fetch`:n.handleSprinkleFetch(e,t.requestId,t.sprinkleName);break;case`sprinkle.lick`:this.handleFollowerSprinkleLick(e,t);break;case`lick`:this.handleFollowerLick(e,t);break;case`targets.advertise`:s.handleFollowerTargetsAdvertise(e,t);break;case`cdp.request`:r.handleCDPRequest(e,t);break;case`cdp.response`:r.handleCDPResponse(t);break;case`cdp.event`:r.handleCDPEvent(e,t.method,t.params,t.sessionId);break;case`tab.open`:this.routeTabOpen(e,t);break;case`tab.opened`:o.handleTabOpenResponse(t.requestId,t.targetId);break;case`tab.open.error`:o.handleTabOpenError(t.requestId,t.error);break;case`fs.request`:this.routeFsRequest(e,t);break;case`fs.response`:a.handleFsResponse(t.requestId,t.response);break;case`exec.request`:case`exec.chunk`:case`exec.response`:case`exec.signal`:i.handleFollowerExecMessage(e,t);break;case`transcript.export.request`:c.handleTranscriptExportRequest(e,t.requestId,t.selector);break;case`transcript.export.cancel`:c.handleTranscriptExportCancel(e,t.requestId);break;case`transcript.export.ack`:c.handleTranscriptExportAck(e,t.requestId,t.index);break;case`transcript.export.approve.response`:c.handleTranscriptExportApprovalResponse(e,t.requestId,t.approved);break;case`cherry.host_event`:l.routeCherryHostEvent(e,t);break;case`ping`:this.handlePing(e);break;case`pong`:this.handlePong(e);break;case`hello`:this.handleFollowerHello(e,t);break;default:{let n=m(t);this.context.log.warn(`Unknown follower message type — skewed follower?`,{bootstrapId:e,type:n.type})}}}noteLegacyPeer(e,t){if(t.type===`hello`)return;let n=this.context.followers.followers.get(e);!n||n.peerProtocolVersion!==void 0||n.legacyPeerLogged||(n.legacyPeerLogged=!0,this.context.log.info(`Follower sent no hello — legacy peer (pre-versioning build)`,{bootstrapId:e}))}handleFollowerUserMessage(e,t){this.context.log.info(`Follower user message received`,{bootstrapId:e,messageId:t.messageId});let n=t.attachments?.length?i(t.attachments):t.attachments;t.steer?this.context.options.onFollowerMessage(t.text,t.messageId,n,{steer:!0}):this.context.options.onFollowerMessage(t.text,t.messageId,n)}handleFollowerNewSession(e,t){this.context.log.info(`Follower new-session received`,{bootstrapId:e,action:t});try{this.context.options.onFollowerNewSession?.(t,e)}catch(e){this.context.log.warn(`onFollowerNewSession handler threw`,{error:e instanceof Error?e.message:String(e)})}}handleScoopSelection(e,t){this.context.log.info(`Follower selected scoop`,{bootstrapId:e,scoopJid:t});let n=this.context.followers.followers.get(e);n&&(n.selectedScoopJid=t,this.collaborators.broadcast.sendSnapshotToFollower(e,t))}handleFollowerSprinkleLick(e,t){this.context.log.info(`Follower sprinkle lick received`,{bootstrapId:e,sprinkleName:t.sprinkleName});let n=this.context.followers.followers.get(e),r=U(n?.floatType??`unknown`,n?.runtime);try{this.context.options.onSprinkleLick?.(t.sprinkleName,t.body,t.targetScoop,r)}catch(e){this.context.log.warn(`onSprinkleLick handler threw`,{error:e instanceof Error?e.message:String(e)})}}handleFollowerLick(e,t){let n=t.event;if(!n||!Ce.has(n.type)){this.context.log.warn(`Rejecting malformed or non-forwardable lick from follower`,{bootstrapId:e,type:n?.type});return}let r=this.context.followers.followers.get(e),{targetScoop:i,...a}=n,o={...a,originFollowerId:e,originLabel:U(r?.floatType??`unknown`,r?.runtime)};try{this.context.options.onForwardedLick?.(o,e)}catch(e){this.context.log.warn(`onForwardedLick handler threw`,{error:e instanceof Error?e.message:String(e)})}}routeTabOpen(e,t){let{requestId:n,targetRuntimeId:r,url:i}=t;r===`leader`?this.collaborators.tabRouter.executeLocalTabOpen(n,i,e):this.collaborators.tabRouter.forwardTabOpen(n,r,i,e)}routeFsRequest(e,t){let{requestId:n,targetRuntimeId:r,request:i}=t;r===`leader`?this.collaborators.fsRouter.executeLocalFs(n,i,e):this.collaborators.fsRouter.forwardFsRequest(n,r,i,e)}handlePing(e){let t=this.context.followers.followers.get(e);t&&(t.keepalive.receivePing(),t.lastActivity=Date.now(),t.sync.send({type:`pong`}))}handlePong(e){let t=this.context.followers.followers.get(e);t&&(t.keepalive.receivePong(),t.lastActivity=Date.now())}handleFollowerHello(e,t){let n=this.context.followers.followers.get(e);n&&(n.peerProtocolVersion=t.protocolVersion,n.peerCapabilities=t.capabilities,n.peerMotd=t.motd,this.context.followers.notifyFollowerCountChanged()),t.protocolVersion>4?this.context.log.warn(`Follower speaks a newer tray sync protocol — update this build`,{bootstrapId:e,followerVersion:t.protocolVersion,ourVersion:4}):this.context.log.info(`Follower hello`,{bootstrapId:e,protocolVersion:t.protocolVersion})}},Oe=class{context;pendingFsRoutes=new Map;fsResolvers=new Map;constructor(e){this.context=e,e.followers.onFollowerRemoved({afterRegistryCleanup:e=>this.rejectPendingForFollower(e)})}async executeLocalFs(e,t,n){let r=this.context.followers.followers.get(n);if(!r)return;let i=this.context.options.vfs;if(!i){r.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:`Leader has no VFS`}});return}let a=await T(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.context.followers.runtimeToBootstrap.get(t),a=i?this.context.followers.followers.get(i):void 0,o=this.context.followers.followers.get(r);if(!i||!a){o?.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:`Target runtime "${t}" not connected`}});return}this.pendingFsRoutes.set(e,{requesterBootstrapId:r,targetBootstrapId:i,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){this.resolveUnroutedLeaderResponse(e,t);return}n.requesterBootstrapId!==`__leader__`&&this.context.followers.followers.get(n.requesterBootstrapId)?.sync.send({type:`fs.response`,requestId:e,response:t});let r=this.addResponseChunk(n,t);if(r&&(this.pendingFsRoutes.delete(e),n.requesterBootstrapId===`__leader__`)){let t=this.fsResolvers.get(e);t&&(this.fsResolvers.delete(e),t.resolve(r))}}sendFsRequest(e,t){if(e===`leader`){let e=this.context.options.vfs;return e?T(e,t):Promise.resolve([{ok:!1,error:`Leader has no VFS`}])}let n=this.context.followers.runtimeToBootstrap.get(e),r=n?this.context.followers.followers.get(n):void 0;if(!n||!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,a)=>{this.fsResolvers.set(i,{resolve:e,reject:a,responses:[]}),this.pendingFsRoutes.set(i,{requesterBootstrapId:`__leader__`,targetBootstrapId:n,requestId:i,chunks:[],totalChunks:1}),r.sync.send({type:`fs.request`,requestId:i,request:t})})}addResponseChunk(e,t){return e.chunks.push(t),e.totalChunks=t.ok&&t.totalChunks||1,e.chunks.length<e.totalChunks?null:e.chunks}resolveUnroutedLeaderResponse(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))}rejectPendingForFollower(e){for(let[t,n]of this.pendingFsRoutes){if(n.targetBootstrapId!==e&&n.requesterBootstrapId!==e)continue;this.pendingFsRoutes.delete(t);let r=this.fsResolvers.get(t);r&&(this.fsResolvers.delete(t),r.reject(Error(`follower disconnected before the fs request completed`)))}}},ke=3e4,Ae={target:`preview-target`,session:`preview-session`,frame:`preview-frame`,loader:`preview-loader`},je=class extends w{connId;sendToWorker;nextId=1;pending=new Map;constructor(e){super({targetUrl:e.targetUrl,targetOrigin:e.targetOrigin,title:e.title,ids:e.ids??Ae}),this.connId=e.connId,this.sendToWorker=e.send}async connect(e){this._state=`connected`}onCloseTarget(){this.sendToWorker({type:`bridge.close`,connId:this.connId})}disconnect(){for(let[e,t]of this.pending)clearTimeout(t.timer),t.reject(Error(`PreviewBridgeCdpTransport disconnected`));this.pending.clear(),this._state=`disconnected`}async forward(e,t,n,r=ke){let i=this.nextId++;return new Promise((a,o)=>{let s=setTimeout(()=>{this.pending.delete(i),o(Error(`PreviewBridge CDP timed out after ${r}ms: ${e}`))},r);this.pending.set(i,{resolve:e=>{clearTimeout(s),a(e)},reject:e=>{clearTimeout(s),o(e)},timer:s}),this.sendToWorker({type:`bridge.cdp.request`,connId:this.connId,id:i,method:e,params:t,sessionId:n})})}deliverResponse(e,t){let n=this.pending.get(e);n&&(this.pending.delete(e),clearTimeout(n.timer),t.error?n.reject(Error(`PreviewBridge CDP error: ${t.error.message} (${t.error.code})`)):n.resolve(t.result??{}))}},Me=class{context;mintMap=new Map;bridgeConns=new Map;lifecycleRecords=[];lifecycleRecordStart=0;lifecycleRecordCount=0;constructor(e){this.context=e}registerMintedPreview(e,t){let n=this.mintMap.get(e)?.announced??!1;this.mintMap.set(e,{...t,announced:n})}restorePreviewState(e){let t=this.mintMap.get(e.previewToken);if(t){t.quiet=e.quiet,t.announced=e.announced;return}this.mintMap.set(e.previewToken,{url:``,title:`Preview`,quiet:e.quiet,announced:e.announced})}dropMintedPreview(e){this.mintMap.delete(e),this.clearPreviewLifecycleRecords(e)}onBridgeConnected(e){let{connId:t,previewToken:n,origin:r,userAgent:i,connectedAt:a}=e,o=e.replay===!0,s=o?this.restoreReplayedPreview(n,r):this.getOrCreatePreview(n,r);if(s.url||=r,this.bridgeConns.has(t)){if(o)return;this.recordLifecycle({timestamp:new Date().toISOString(),lifecycle:`connected`,connId:t,previewToken:n,origin:r,userAgent:i,connectedAt:a,announced:!1});return}let{url:c,title:l,quiet:u}=s,d=new je({connId:t,targetUrl:c,targetOrigin:r,title:l,send:e=>this.context.sendControl(e)});if(d.connect(),this.bridgeConns.set(t,{previewToken:n,origin:r,userAgent:i,connectedAt:a,url:c,title:l,quiet:u,transport:d}),this.context.log.info(`Preview bridge connected`,{connId:t,previewToken:n,origin:r,userAgent:i}),o)return;let f=new Date().toISOString(),p=!s.announced,m=p&&!u&&!!this.context.options.onPreviewLick;p&&(s.announced=!0,this.context.sendControl({type:`preview.state.update`,previewToken:n,announced:!0})),this.recordLifecycle({timestamp:f,lifecycle:`connected`,connId:t,previewToken:n,origin:r,userAgent:i,connectedAt:a,announced:m}),m&&this.emitPreviewConnectedLick(e,f)}onBridgeDisconnected(e){let{connId:t,reason:n}=e,r=this.bridgeConns.get(t);if(!r){this.recordLifecycle({timestamp:new Date().toISOString(),lifecycle:`disconnected`,connId:t,reason:n,announced:!1});return}let{previewToken:i,origin:a,userAgent:o,connectedAt:s}=r;r.transport.disconnect(),this.bridgeConns.delete(t),this.context.log.info(`Preview bridge disconnected`,{connId:t,reason:n}),this.recordLifecycle({timestamp:new Date().toISOString(),lifecycle:`disconnected`,connId:t,previewToken:i,origin:a,userAgent:o,connectedAt:s,reason:n,announced:!1})}onBridgeCdpResponse(e){let{connId:t,id:n,result:r,error:i}=e,a=this.bridgeConns.get(t);if(!a){this.context.log.warn(`Received bridge.cdp.response for unknown connId`,{connId:t,id:n});return}a.transport.deliverResponse(n,{result:r,error:i})}getBridgeTransport(e){return this.bridgeConns.get(e)?.transport}getTargetEntries(){return[...this.bridgeConns].map(([e,t])=>({targetId:`preview:${t.previewToken}:${e}`,localTargetId:e,runtimeId:`preview`,title:t.title,url:t.url,isLocal:!1,kind:`preview`}))}stop(){for(let e of this.bridgeConns.values())e.transport.disconnect();this.bridgeConns.clear(),this.mintMap.clear(),this.resetLifecycleRecords()}getPreviewLifecycleRecords(e){return this.snapshotLifecycleRecords().filter(t=>e===void 0||t.previewToken===e).map(e=>({...e}))}clearPreviewLifecycleRecords(e){let t=this.snapshotLifecycleRecords(),n=t.filter(t=>e!==void 0&&t.previewToken!==e),r=t.length-n.length;this.resetLifecycleRecords();for(let e of n)this.recordLifecycle(e);return r}rearmPreviewAnnouncements(e){let t=0;for(let[n,r]of this.mintMap)e!==void 0&&n!==e||(r.announced=!1,this.context.sendControl({type:`preview.state.update`,previewToken:n,announced:!1}),t+=1);return t}getOrCreatePreview(e,t){let n=this.mintMap.get(e);if(n)return n;let r={url:t,title:`Preview`,quiet:!1,announced:!1};return this.mintMap.set(e,r),r}restoreReplayedPreview(e,t){let n=this.mintMap.get(e);if(n)return n.announced||=!0,n;let r={url:t,title:`Preview`,quiet:!0,announced:!0};return this.mintMap.set(e,r),r}emitPreviewConnectedLick(e,t){let n={type:`preview`,previewLifecycle:`connected`,previewConnId:e.connId,previewToken:e.previewToken,previewOrigin:e.origin,previewUserAgent:e.userAgent,previewConnectedAt:e.connectedAt,timestamp:t,body:{}};try{this.context.options.onPreviewLick?.(n)}catch(e){this.context.log.warn(`onPreviewLick handler threw`,{error:e instanceof Error?e.message:String(e)})}}recordLifecycle(e){if(this.lifecycleRecordCount<500){let t=(this.lifecycleRecordStart+this.lifecycleRecordCount)%500;this.lifecycleRecords[t]=e,this.lifecycleRecordCount+=1;return}this.lifecycleRecords[this.lifecycleRecordStart]=e,this.lifecycleRecordStart=(this.lifecycleRecordStart+1)%500}snapshotLifecycleRecords(){return Array.from({length:this.lifecycleRecordCount},(e,t)=>{let n=(this.lifecycleRecordStart+t)%500;return this.lifecycleRecords[n]})}resetLifecycleRecords(){this.lifecycleRecords=[],this.lifecycleRecordStart=0,this.lifecycleRecordCount=0}},Ne=16*1024*1024,Pe=class{context;pendingRemoteExecs=new Map;localExecAborters=new Map;constructor(e){this.context=e,e.followers.onFollowerRemoved({beforeRegistryCleanup:e=>this.handleFollowerRemoved(e)})}async execOnRemote(e,t,n={}){let r=this.context.followers.resolveFollowerByRuntimeId(e);if(!r)throw Error(`No connected follower for '${e}'`);let{bootstrapId:i,follower:a}=r;if(!a.peerCapabilities?.exec)throw Error(`Follower '${e}' is not an exec target — only a 'slicc … follow' CLI accepts commands`);let o=`lexec-${crypto.randomUUID()}`;return new Promise((r,s)=>{let c={bootstrapId:i,stdout:``,stderr:``,stdoutDecoder:new TextDecoder(`utf-8`),stderrDecoder:new TextDecoder(`utf-8`),bytes:0,truncated:!1,onChunk:n.onChunk,resolve:r,reject:s};if(n.timeoutMs&&n.timeoutMs>0&&(c.timer=setTimeout(()=>{this.pendingRemoteExecs.delete(o)&&(this.sendExecSignal(i,o,`SIGKILL`),s(Error(`exec on '${e}' timed out after ${n.timeoutMs}ms`)))},n.timeoutMs)),this.pendingRemoteExecs.set(o,c),n.signal){let e=()=>this.sendExecSignal(i,o,`SIGINT`);n.signal.aborted?e():n.signal.addEventListener(`abort`,e,{once:!0})}a.sync.send({type:`exec.request`,requestId:o,command:t,cwd:n.cwd,env:n.env})||(this.pendingRemoteExecs.delete(o),c.timer&&clearTimeout(c.timer),s(Error(`Failed to send exec.request to follower '${e}'`)))})}handleFollowerExecMessage(e,t){switch(t.type){case`exec.request`:this.handleFollowerExecRequest(e,t);break;case`exec.chunk`:this.handleRemoteExecChunk(e,t);break;case`exec.response`:this.handleRemoteExecResponse(e,t);break;case`exec.signal`:this.handleFollowerExecSignal(e,t);break}}sendExecSignal(e,t,n){this.context.followers.followers.get(e)?.sync.send({type:`exec.signal`,requestId:t,signal:n})}handleRemoteExecChunk(e,t){let n=this.pendingRemoteExecs.get(t.requestId);if(!n||n.bootstrapId!==e)return;let r;try{r=s(t.data)}catch{return}if(n.truncated)return;n.bytes+=r.length,n.bytes>Ne&&(n.truncated=!0);let i=(t.stream===`stdout`?n.stdoutDecoder:n.stderrDecoder).decode(r,{stream:!0});t.stream===`stdout`?n.stdout+=i:n.stderr+=i,n.onChunk?.(t.stream,i)}handleRemoteExecResponse(e,t){let n=this.pendingRemoteExecs.get(t.requestId);!n||n.bootstrapId!==e||(this.pendingRemoteExecs.delete(t.requestId),n.timer&&clearTimeout(n.timer),n.stdout+=n.stdoutDecoder.decode(),n.stderr+=n.stderrDecoder.decode(),n.resolve({stdout:n.truncated?`${n.stdout}\n[output truncated at cap]`:n.stdout,stderr:n.stderr,exitCode:t.exitCode,error:t.error}))}async handleFollowerExecRequest(e,t){let{requestId:n,command:r,cwd:i,env:a}=t,s=this.context.options.execInShell;if(!s){this.context.followers.followers.get(e)?.sync.send({type:`exec.response`,requestId:n,exitCode:127,error:`exec is not supported on this leader`});return}let c=new AbortController,l=`${e}:${n}`;this.localExecAborters.set(l,{bootstrapId:e,controller:c});try{let t=await s(r,{cwd:i,env:a,signal:c.signal,onChunk:(t,r)=>{this.context.followers.followers.get(e)?.sync.send({type:`exec.chunk`,requestId:n,stream:t,data:o(new TextEncoder().encode(r))})}});this.context.followers.followers.get(e)?.sync.send({type:`exec.response`,requestId:n,exitCode:t.exitCode,error:t.error})}catch(t){this.context.followers.followers.get(e)?.sync.send({type:`exec.response`,requestId:n,exitCode:1,error:t instanceof Error?t.message:String(t)})}finally{this.localExecAborters.delete(l)}}handleFollowerExecSignal(e,t){this.localExecAborters.get(`${e}:${t.requestId}`)?.controller.abort()}handleFollowerRemoved(e){for(let[t,n]of this.pendingRemoteExecs)n.bootstrapId===e&&(this.pendingRemoteExecs.delete(t),n.timer&&clearTimeout(n.timer),n.reject(Error(`follower disconnected before the command completed`)));for(let[t,n]of this.localExecAborters)n.bootstrapId===e&&(n.controller.abort(),this.localExecAborters.delete(t))}},Fe=class{context;options;pendingTabOpenRoutes=new Map;tabOpenResolvers=new Map;constructor(e,t){this.context=e,this.options=t,e.followers.onFollowerRemoved({afterRegistryCleanup:e=>this.rejectPendingForFollower(e)})}canRuntimeOpenTab(e){let t=this.options.getTargetEntries().filter(t=>t.runtimeId===e);return t.length===0||t.some(e=>!this.options.isCherryTarget(e))}openRemoteTab(e,t){let n=this.context.followers.runtimeToBootstrap.get(e),r=n?this.context.followers.followers.get(n):void 0;if(!n||!r)return Promise.reject(Error(`Target runtime "${e}" not connected`));if(!this.canRuntimeOpenTab(e))return Promise.reject(Error(`Target runtime "${e}" is a cherry host that cannot open tabs`));let i=`tab-open-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((e,a)=>{this.tabOpenResolvers.set(i,{resolve:e,reject:a}),this.pendingTabOpenRoutes.set(i,{requesterBootstrapId:`__leader__`,targetBootstrapId:n,requestId:i}),r.sync.send({type:`tab.open`,requestId:i,url:t})})}async executeLocalTabOpen(e,t,n){let r=this.context.followers.followers.get(n);if(!r)return;let i=this.context.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.context.followers.runtimeToBootstrap.get(t),a=i?this.context.followers.followers.get(i):void 0,o=this.context.followers.followers.get(r);if(!i||!a){o?.sync.send({type:`tab.open.error`,requestId:e,error:`Target runtime "${t}" not connected`});return}if(!this.canRuntimeOpenTab(t)){o?.sync.send({type:`tab.open.error`,requestId:e,error:`Target runtime "${t}" is a cherry host that cannot open tabs`});return}this.pendingTabOpenRoutes.set(e,{requesterBootstrapId:r,targetBootstrapId:i,requestId:e}),a.sync.send({type:`tab.open`,requestId:e,url:n})}handleTabOpenResponse(e,t){let n=this.pendingTabOpenRoutes.get(e);if(n){if(this.pendingTabOpenRoutes.delete(e),n.requesterBootstrapId===`__leader__`){let n=this.tabOpenResolvers.get(e);n&&(this.tabOpenResolvers.delete(e),n.resolve(t));return}this.context.followers.followers.get(n.requesterBootstrapId)?.sync.send({type:`tab.opened`,requestId:e,targetId:t})}}handleTabOpenError(e,t){let n=this.pendingTabOpenRoutes.get(e);if(n){if(this.pendingTabOpenRoutes.delete(e),n.requesterBootstrapId===`__leader__`){let n=this.tabOpenResolvers.get(e);n&&(this.tabOpenResolvers.delete(e),n.reject(Error(t)));return}this.context.followers.followers.get(n.requesterBootstrapId)?.sync.send({type:`tab.open.error`,requestId:e,error:t})}}rejectPendingForFollower(e){for(let[t,n]of this.pendingTabOpenRoutes){if(n.targetBootstrapId!==e&&n.requesterBootstrapId!==e)continue;this.pendingTabOpenRoutes.delete(t);let r=this.tabOpenResolvers.get(t);r&&(this.tabOpenResolvers.delete(t),r.reject(Error(`follower disconnected before the tab opened`)))}}},Ie=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,kind:r.kind??`browser`,capabilities:r.capabilities});return e}hasChanged(){return this.dirty}getRuntimeIds(){return[...this.runtimes.keys()]}};function W(e){return e.kind===`cherry`}function Le(e,t){return e.filter(e=>e.kind===`preview`?!1:!W(e)||!t.requireNetwork||e.capabilities?.network===!0)}var Re=class{context;options;registry=new Ie;constructor(e,t){this.context=e,this.options=t,e.followers.onFollowerRemoved({removeRuntime:(e,t)=>this.registry.removeRuntime(t),afterRegistryCleanup:()=>{this.registry.hasChanged()&&this.broadcastTargetRegistry()}})}setLocalTargets(e){this.registry.setTargets(`leader`,e),this.registry.hasChanged()&&this.broadcastTargetRegistry()}broadcastTargetRegistry(){this.context.followers.followers.size!==0&&this.context.followers.broadcastToAllFollowers({type:`targets.registry`,targets:this.getFollowerBroadcastEntries()})}sendTargetRegistryToFollower(e){let t=this.getFollowerBroadcastEntries();t.length!==0&&this.context.followers.followers.get(e)?.sync.send({type:`targets.registry`,targets:t})}getTargets(){return this.getConnectedEntries()}getRegistryEntries(){return this.registry.getEntries()}getFollowerBroadcastEntries(){return this.getConnectedEntries().filter(e=>e.kind!==`preview`)}getConnectedEntries(){return[...this.registry.getEntries().filter(e=>{if(e.runtimeId===`leader`)return!0;let t=this.context.followers.runtimeToBootstrap.get(e.runtimeId);return t?this.context.followers.followers.has(t):!1}),...this.options.getPreviewTargetEntries()]}canRuntimeServeTeleport(e,t){if(t.runtime===`slicc-cherry`)return!1;let n=this.registry.getEntries().filter(t=>t.runtimeId===e);return n.length===0||Le(n,{requireNetwork:!0}).length>0}getBestFollowerForTeleport(){let e=[];for(let[t,n]of this.context.followers.runtimeToBootstrap){let r=this.context.followers.followers.get(n);!r||!this.canRuntimeServeTeleport(t,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]}handleFollowerTargetsAdvertise(e,t){this.context.log.info(`Follower targets advertised`,{bootstrapId:e,runtimeId:t.runtimeId,targetCount:t.targets.length}),this.options.cleanupOrphanedRemoteTransports(t.runtimeId),this.context.followers.setRuntimeId(t.runtimeId,e),this.registry.setTargets(t.runtimeId,t.targets);let n=this.context.followers.followers.get(e);if(n&&n.runtime===`slicc-cherry`){let e=t.targets.find(e=>e.kind===`cherry`);if(e)try{n.hostOrigin=new URL(e.url).origin}catch{}}this.broadcastTargetRegistry()}},G=32*1024,ze=1024*1024,Be=3e4,Ve=12e4,He=3;function Ue(e){let t=8192,n=``;for(let r=0;r<e.length;r+=t)n+=String.fromCharCode(...e.subarray(r,r+t));return btoa(n)}async function We(e,t,n){if(typeof e.bufferedAmount==`number`)for(;!n.aborted&&e.bufferedAmount>t;)await new Promise(e=>setTimeout(e,25))}var Ge=class e{context;activeExports=new Map;ackWaiters=new Map;approvalWaiters=new Map;constructor(e){this.context=e,e.followers.onFollowerRemoved({afterRegistryCleanup:e=>this.handleFollowerRemoved(e)})}static exportKey(e,t){return`${e}:${t}`}static ackKey(e,t,n){return`${e}:${t}:${n}`}clearAckWaiters(e,t){let n=`${e}:${t}:`;for(let[e,t]of this.ackWaiters)e.startsWith(n)&&(t.reject(Error(`export aborted`)),this.ackWaiters.delete(e))}handleFollowerRemoved(e){for(let[t,n]of this.activeExports){if(n.bootstrapId!==e)continue;n.abort.abort();let r=t.slice(e.length+1);this.clearAckWaiters(e,r),this.activeExports.delete(t)}for(let t of[...this.approvalWaiters.keys()])t.startsWith(`${e}:`)&&this.settleApproval(t,!1)}async handleTranscriptExportRequest(t,n,r){let i=e.exportKey(t,n);if(this.activeExports.has(i)){this.context.log.warn(`Duplicate transcript export request from same follower, ignoring`,{bootstrapId:t,requestId:n});return}let a=this.context.followers.followers.get(t);if(!a)return;let{requestTranscriptExportApproval:o,createTranscriptExport:s,headlessLeader:c}=this.context.options;if(!o&&!c||!s){a.sync.send({type:`transcript.export.denied`,requestId:n});return}if([...this.activeExports.values()].some(e=>e.bootstrapId===t)){this.context.log.warn(`Follower already has an in-flight export; denying duplicate`,{bootstrapId:t,requestId:n}),a.sync.send({type:`transcript.export.denied`,requestId:n});return}let l=new AbortController;this.activeExports.set(i,{bootstrapId:t,abort:l});let u=U(a.floatType,a.runtime);a.sync.send({type:`transcript.export.pending`,requestId:n});let d=!1;try{c?d=await this.requestDelegatedApproval(t,n,r):o&&(d=await o({requestId:n,followerLabel:u,hostOrigin:a.hostOrigin,selector:r}))}catch(e){this.context.log.warn(`transcript export approval threw`,{requestId:n,error:e instanceof Error?e.message:String(e)}),d=!1}let f=this.context.followers.followers.get(t);if(!this.activeExports.has(i)||!f){this.activeExports.delete(i);return}if(!d){f.sync.send({type:`transcript.export.denied`,requestId:n}),this.activeExports.delete(i);return}this.streamTranscriptExport(t,n,r,l)}handleTranscriptExportCancel(t,n){let r=e.exportKey(t,n),i=this.activeExports.get(r);i&&(this.context.log.info(`Transcript export cancelled by follower`,{requestId:n,bootstrapId:t}),i.abort.abort(),this.activeExports.delete(r),this.clearAckWaiters(t,n),this.settleApproval(r,!1))}requestDelegatedApproval(t,n,r){let i=this.context.followers.followers.get(t);if(!i)return Promise.resolve(!1);let a=e.exportKey(t,n);return new Promise(e=>{let o=setTimeout(()=>{this.context.log.warn(`Delegated transcript export approval timed out`,{bootstrapId:t,requestId:n}),this.settleApproval(a,!1)},Ve);this.approvalWaiters.set(a,t=>{clearTimeout(o),e(t)}),i.sync.send({type:`transcript.export.approve.request`,requestId:n,selector:r})||(this.context.log.warn(`Failed to send delegated approval prompt — denying`,{bootstrapId:t,requestId:n}),this.settleApproval(a,!1))})}settleApproval(e,t){let n=this.approvalWaiters.get(e);n&&(this.approvalWaiters.delete(e),n(t))}handleTranscriptExportApprovalResponse(t,n,r){this.settleApproval(e.exportKey(t,n),r===!0)}handleTranscriptExportAck(t,n,r){let i=e.ackKey(t,n,r),a=this.ackWaiters.get(i);a&&(this.ackWaiters.delete(i),a.resolve())}async streamTranscriptExport(t,n,i,a){let o=e.exportKey(t,n),{createTranscriptExport:s}=this.context.options;if(!this.context.followers.followers.get(t)||!s){this.activeExports.delete(o);return}let l=e=>{let r=this.context.followers.followers.get(t);r&&r.sync.send({type:`transcript.export.error`,requestId:n,code:e}),this.activeExports.delete(o)},u;try{u=await s(i,a.signal)}catch(e){if(a.signal.aborted){this.activeExports.delete(o);return}this.context.log.warn(`createTranscriptExport failed`,{requestId:n,error:e instanceof Error?e.message:String(e)}),l(e instanceof c?e.code:`session-not-found`);return}if(a.signal.aborted||!this.activeExports.has(o)){this.activeExports.delete(o);return}let d=this.context.followers.followers.get(t)?.sync;if(!d){this.activeExports.delete(o);return}d.send({type:`transcript.export.start`,requestId:n,filename:u.filename});let{sha256:f}=await r(async()=>{let{sha256:e}=await import(`./sha256-DmK25X5D.js`).then(e=>e.n);return{sha256:e}},__vite__mapDeps([42,1])),p=f.create(),m=(this.context.followers.followers.get(t)?.peerProtocolVersion??0)>=He,{streamError:h,chunkCount:g,byteLength:_}=await this.sendExportChunks({bootstrapId:t,requestId:n,chunks:u.chunks,hasher:p,abort:a,awaitAck:m,onSlice:(e,r)=>{let i=this.context.followers.followers.get(t);return i?(i.sync.send({type:`transcript.export.chunk`,requestId:n,index:e,data:r}),!0):!1}});if(h){l(`transfer-corrupt`);return}if(!this.activeExports.has(o))return;if(a.signal.aborted){l(`transfer-aborted`);return}let v;try{v=await u.completion}catch{if(a.signal.aborted){this.activeExports.delete(o);return}l(`transfer-aborted`);return}if(a.signal.aborted||!this.activeExports.has(o)){this.activeExports.delete(o);return}if(v.byteLength!==_){this.context.log.warn(`Transcript export byte count mismatch between service and leader stream`,{requestId:n,serviceByteLength:v.byteLength,leaderByteCount:_}),l(`transfer-corrupt`);return}let y=p.hex();if(v.sha256!==y){this.context.log.warn(`Transcript export SHA-256 mismatch between service and leader stream`,{requestId:n}),l(`transfer-corrupt`);return}let b=this.context.followers.followers.get(t);b&&b.sync.send({type:`transcript.export.complete`,requestId:n,chunks:g,byteLength:_,sha256:y}),this.activeExports.delete(o)}async sendExportChunks(t){let{bootstrapId:n,requestId:r,chunks:i,hasher:a,abort:o,onSlice:s,awaitAck:c}=t,l=e.exportKey(n,r),u=this.context.followers.followers.get(n)?.sync;if(!u)return{streamError:!0,chunkCount:0,byteLength:0};let d=0,f=0;try{for await(let e of i){if(o.signal.aborted||!this.activeExports.has(l))return{streamError:!1,chunkCount:d,byteLength:f};a.update(e),f+=e.byteLength;let t=await this.sendExportSlices({bootstrapId:n,requestId:r,b64:Ue(e),sync:u,key:l,abort:o,onSlice:s,awaitAck:c,startIdx:d});if(d=t.nextIdx,t.done!==`continue`)return{streamError:t.done===`error`,chunkCount:d,byteLength:f}}}catch(e){return o.signal.aborted?{streamError:!1,chunkCount:d,byteLength:f}:(this.context.log.warn(`Error streaming transcript export chunks`,{requestId:r,error:e instanceof Error?e.message:String(e)}),{streamError:!0,chunkCount:d,byteLength:f})}return{streamError:!1,chunkCount:d,byteLength:f}}async sendExportSlices(e){let{bootstrapId:t,requestId:n,b64:r,sync:i,key:a,abort:o,onSlice:s,awaitAck:c}=e,l=e.startIdx;for(let e=0;e<r.length;e+=G){if(o.signal.aborted||!this.activeExports.has(a)||(await We(i,ze,o.signal),o.signal.aborted||!this.activeExports.has(a)))return{nextIdx:l,done:`abort`};let u=r.slice(e,e+G);if(!s(l,u))return{nextIdx:l,done:`error`};if(c&&(!await this.waitForAck(t,n,l,o)||o.signal.aborted||!this.activeExports.has(a)))return{nextIdx:l+1,done:`abort`};l++}return{nextIdx:l,done:`continue`}}waitForAck(t,n,r,i){let a=i.signal;return new Promise(o=>{if(a.aborted){o(!1);return}let s=e.ackKey(t,n,r),c,l=()=>{c!==void 0&&(clearTimeout(c),c=void 0)},u=()=>{this.ackWaiters.delete(s),l()},d=()=>{u(),o(!1)};a.addEventListener(`abort`,d,{once:!0}),c=setTimeout(()=>{c=void 0,i.abort(),this.clearAckWaiters(t,n)},Be),this.ackWaiters.set(s,{resolve:()=>{a.removeEventListener(`abort`,d),u(),o(!0)},reject:()=>{a.removeEventListener(`abort`,d),u(),o(!1)}})})}},K=a(`tray-leader-sync`),Ke=class{options;followerRegistry;broadcast;cdpRouter;remoteExec;fsRouter;tabRouter;previewBridge;cherryRouter;teleportPool;transcriptExport;followerDispatch;get followers(){return this.followerRegistry.followers}constructor(e){this.options=e,this.followerRegistry=new Ee({log:K,onMessage:(e,t)=>this.followerDispatch.dispatch(e,t),onFollowerDead:e=>this.options.onFollowerDead?.(e),onFollowerCountChanged:e=>this.options.onFollowerCountChanged?.(e)});let t={options:e,followers:this.followerRegistry,log:K,sendControl:e.sendControl};this.broadcast=new be(t),this.previewBridge=new Me(t),this.cdpRouter=new xe(t,{getBridgeTransport:e=>this.previewBridge.getBridgeTransport(e)}),this.remoteExec=new Pe(t),this.teleportPool=new Re(t,{cleanupOrphanedRemoteTransports:e=>this.cdpRouter.cleanupOrphanedRemoteTransports(e),getPreviewTargetEntries:()=>this.previewBridge.getTargetEntries()}),this.transcriptExport=new Ge(t),this.fsRouter=new Oe(t),this.tabRouter=new Fe(t,{getTargetEntries:()=>this.teleportPool.getRegistryEntries(),isCherryTarget:W}),this.cherryRouter=new Se(t),this.followerDispatch=new De(t,{broadcast:this.broadcast,cdpRouter:this.cdpRouter,remoteExec:this.remoteExec,fsRouter:this.fsRouter,tabRouter:this.tabRouter,teleportPool:this.teleportPool,transcriptExport:this.transcriptExport,cherryRouter:this.cherryRouter}),Object.defineProperties(this,{activeExports:{get:()=>this.transcriptExport.activeExports},bridgeConns:{get:()=>this.previewBridge.bridgeConns},mintMap:{get:()=>this.previewBridge.mintMap}})}addFollower(e,t,n){let{sync:r}=this.followerRegistry.addFollower(e,t,n);r.send({type:`hello`,protocolVersion:4}),this.broadcast.sendSnapshotToFollower(e),this.broadcast.sendScoopsListToFollower(e),this.broadcast.sendSprinklesListToFollower(e),this.teleportPool.sendTargetRegistryToFollower(e)}removeFollower(e){this.followerRegistry.removeFollower(e)}broadcastEvent(e){this.broadcast.broadcastEvent(e)}broadcastUserMessage(e,t,n){this.broadcast.broadcastUserMessage(e,t,n)}broadcastStatus(e){this.broadcast.broadcastStatus(e)}broadcastSnapshot(){this.broadcast.broadcastSnapshot()}broadcastScoopsList(){this.broadcast.broadcastScoopsList()}broadcastSprinklesList(){this.broadcast.broadcastSprinklesList()}broadcastSprinkleUpdate(e,t){this.broadcast.broadcastSprinkleUpdate(e,t)}broadcastTheme(e){this.broadcast.broadcastTheme(e)}broadcastSprinkleReloaded(e){this.broadcast.broadcastSprinkleReloaded(e)}broadcastPreviewOpen(e){this.broadcast.broadcastPreviewOpen(e)}async execOnRemote(e,t,n={}){return this.remoteExec.execOnRemote(e,t,n)}getExecCapableBootstrapIds(){return this.followerRegistry.getExecCapableBootstrapIds()}getBrowserCapableBootstrapIds(){return this.followerRegistry.getBrowserCapableBootstrapIds()}getFollowerMotds(){return this.followerRegistry.getFollowerMotds()}setLocalTargets(e){this.teleportPool.setLocalTargets(e)}broadcastTargetRegistry(){this.teleportPool.broadcastTargetRegistry()}getTargets(){return this.teleportPool.getTargets()}createRemoteTransport(e,t){return this.cdpRouter.createRemoteTransport(e,t)}removeRemoteTransport(e,t){this.cdpRouter.removeRemoteTransport(e,t)}getConnectedFollowers(){return this.followerRegistry.getConnectedFollowers()}getBestFollowerForTeleport(){return this.teleportPool.getBestFollowerForTeleport()}get hasFollowers(){return this.followers.size>0}stop(){for(let e of[...this.followers.keys()])this.removeFollower(e);this.previewBridge.stop()}emitCherrySliccEvent(e,t,n){return this.cherryRouter.emitCherrySliccEvent(e,t,n)}openRemoteTab(e,t){return this.tabRouter.openRemoteTab(e,t)}sendFsRequest(e,t){return this.fsRouter.sendFsRequest(e,t)}registerMintedPreview(e,t){this.previewBridge.registerMintedPreview(e,t)}dropMintedPreview(e){this.previewBridge.dropMintedPreview(e)}restorePreviewState(e){this.previewBridge.restorePreviewState(e)}getPreviewLifecycleRecords(e){return this.previewBridge.getPreviewLifecycleRecords(e)}clearPreviewLifecycleRecords(e){return this.previewBridge.clearPreviewLifecycleRecords(e)}rearmPreviewAnnouncements(e){return this.previewBridge.rearmPreviewAnnouncements(e)}onBridgeConnected(e){this.previewBridge.onBridgeConnected(e)}onBridgeDisconnected(e){this.previewBridge.onBridgeDisconnected(e)}onBridgeCdpResponse(e){this.previewBridge.onBridgeCdpResponse(e)}getBridgeTransport(e){return this.previewBridge.getBridgeTransport(e)}},q=a(`page-leader-tray`);function qe(e,t){return new Ke({sendControl:e=>t().sendControlMessage(e),getMessages:e.getMessages,getMessagesForScoop:e.getMessagesForScoop,getScoopJid:e.getScoopJid,getScoops:e.getScoops,getSprinkles:e.getSprinkles,readSprinkleContent:e.readSprinkleContent,onSprinkleLick:e.onSprinkleLick,onForwardedLick:e.onForwardedLick,onFollowerMessage:e.onFollowerMessage,onFollowerAbort:e.onFollowerAbort,onFollowerNewSession:e.onFollowerNewSession,onFollowerCountChanged:e.onFollowerCountChanged,onRemoteTransportsCleaned:e.onRemoteTransportsCleaned,execInShell:e.execInShell,onCherryHostEvent:e.onCherryHostEvent,onPreviewLick:e.onPreviewLick,requestTranscriptExportApproval:e.requestTranscriptExportApproval,createTranscriptExport:e.createTranscriptExport,headlessLeader:e.kind===`hosted`,browserAPI:e.browserAPI,browserTransport:e.browserTransport,vfs:e.vfs})}function Je(e,t){return new le({sendControlMessage:t=>e().sendControlMessage(t),onPeerConnected:(e,n)=>{q.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})},onPeerDisconnected:(e,t)=>{q.info(`Tray follower disconnected`,{bootstrapId:e,reason:t})}})}function Ye(e,t,n,r,i,a){let o=t=>{e.browserTransport?.sendLeaderJoinUrl?.(t)};return new ae({workerBaseUrl:e.workerBaseUrl,runtime:e.runtime??`slicc-standalone`,...e.kind?{kind:e.kind}:{},onLeaderReady:t=>{e.onLeaderReady?.(t),o(t.joinUrl)},fetchImpl:r,...e._storeOverride?{store:e._storeOverride}:{},...e._webSocketFactory?{webSocketFactory:e._webSocketFactory}:{},onControlMessage:r=>{if(r.type===`webhook.event`){e.sendWebhookEvent(r.webhookId,r.headers,r.body);return}if(r.type===`preview.request`){let t=e.vfs;if(!t){a().sendControlMessage({type:`preview.response`,reqId:r.reqId,ok:!1,status:500,reason:`leader has no VFS bound`});return}ge(r,{send:e=>a().sendControlMessage(e)},t).catch(e=>{q.error(`preview.request handling failed`,{error:e instanceof Error?e.message:String(e)})});return}if(r.type===`preview.revoked`){q.info(`Preview revoked by worker`,{previewToken:r.previewToken}),n.dropMintedPreview(r.previewToken);return}if(r.type===`preview.state`){n.restorePreviewState(r);return}if(r.type===`bridge.connected`){n.onBridgeConnected(r);return}if(r.type===`bridge.disconnected`){n.onBridgeDisconnected(r);return}if(r.type===`bridge.cdp.response`){n.onBridgeCdpResponse(r);return}t.handleControlMessage(r).catch(e=>{q.error(`Tray leader bootstrap handling failed`,{error:e instanceof Error?e.message:String(e)})})},onReconnecting:(e,t)=>{q.info(`Leader tray reconnecting`,{attempt:e,lastError:t})},onReconnected:e=>{q.info(`Leader tray reconnected`,{trayId:e.trayId}),i(e),o(e.joinUrl)},onReconnectGaveUp:(e,t)=>{q.error(`Leader tray reconnect gave up`,{lastError:e,attempts:t}),o(null)}})}function Xe(e,t){let n=new fe(q,{failureMessage:`Leader CDP target refresh failed (best-effort, throttled)`,recoveryMessage:`Leader CDP target refresh recovered (stable for debounce window)`});return async()=>{let r;try{r=await e.browserAPI.listPages()}catch(e){n.reportFailure(e);return}n.reportSuccess();try{let e=r.map(e=>({targetId:e.targetId,title:e.title,url:e.url}));t.setLocalTargets(e)}catch(e){q.error(`Leader target broadcast failed (sync.setLocalTargets threw)`,{error:e instanceof Error?e.message:String(e)})}}}function Ze(e,t){return setInterval(()=>{try{e.broadcastScoopsList(),e.broadcastSprinklesList()}catch(e){q.error(`Failed to broadcast follower lists`,{error:e instanceof Error?e.message:String(e)})}},t)}function Qe(e){return t=>{let n=e._historyOverride??Y();if(n)try{let e=_(n.href,t.workerBaseUrl,t.trayId);e!==n.href&&n.replaceState(null,``,e)}catch(e){q.debug(`URL bar update skipped`,{error:e instanceof Error?e.message:String(e)})}}}function J(e){let t=e._refreshIntervalMs??5e3,n=e._fetchImpl??((e,t)=>fetch(e,t)),r,i=Qe(e),a=qe(e,()=>r);e.browserAPI.setTrayTargetProvider(a);let o=Je(()=>r,a);r=Ye(e,o,a,n,i,()=>r);let s=e.onAgentEvent(e=>a.broadcastEvent(e)),c=[],l=Xe(e,a);c.push(setInterval(l,t)),l(),c.push(Ze(a,t));let u=r.start();u.then(i).catch(e=>{q.error(`Leader tray start failed`,{error:e instanceof Error?e.message:String(e)})});let d=!1;return{ready:u,stop(){d=!0,s();for(let e of c)clearInterval(e);a.stop(),o.stop(),r.stop()},async reset(){a.stop(),o.stop(),r.stop(),await r.clearSession();let e=await r.start();return i(e),C()},leader:r,peers:o,sync:a,get currentLeaderSync(){return d?null:a}}}function Y(){return typeof window>`u`||!window.history||!window.location?null:{get href(){return window.location.href},replaceState(e,t,n){window.history.replaceState(e,t,n)}}}function $e(e){let t=new Map,n=(e,t)=>`${e}:${t}`,r=(r,i)=>{let a=n(r,i),o=t.get(a);if(!o){let n=e.getSync();if(!n)throw Error(`remote-cdp: leader tray not started`);o={runtimeId:r,localTargetId:i,transport:n.createRemoteTransport(r,i),forwarders:new Map},t.set(a,o)}return o},i=n=>{let r=t.get(n);if(!r)return;for(let[e,t]of r.forwarders)r.transport.off(e,t.listener);r.forwarders.clear();let i=e.getSync();i?.removeRemoteTransport?i.removeRemoteTransport(r.runtimeId,r.localTargetId):r.transport.disconnect(),t.delete(n)};return{async send({runtimeId:e,localTargetId:t,method:n,params:i,sessionId:a,timeout:o}){return r(e,t).transport.send(n,i,a,o)},async subscribe({runtimeId:t,localTargetId:n,event:i}){let a=r(t,n),o=a.forwarders.get(i);if(o)return o.count+=1,{ok:!0};let s=r=>e.postEvent({runtimeId:t,localTargetId:n,method:i,params:r});return a.transport.on(i,s),a.forwarders.set(i,{listener:s,count:1}),{ok:!0}},async unsubscribe({runtimeId:e,localTargetId:r,event:i}){let a=t.get(n(e,r)),o=a?.forwarders.get(i);return!a||!o?{ok:!0}:(--o.count,o.count<=0&&(a.transport.off(i,o.listener),a.forwarders.delete(i)),{ok:!0})},async detach({runtimeId:e,localTargetId:t}){return i(n(e,t)),{ok:!0}},async openTab({runtimeId:t,url:n}){let r=e.getSync();if(!r?.openRemoteTab)throw Error(`remote-cdp: openRemoteTab not available`);return{targetId:await r.openRemoteTab(t,n)}},cleanupRuntime(e){let n=`${e}:`;for(let e of[...t.keys()])e.startsWith(n)&&i(e)},disposeAll(){for(let e of[...t.keys()])i(e)}}}var X=a(`tray-leader-lock`);function et(e){return`slicc-tray-leader:${e}`}function Z(){let e=!1,t=null;return{release:()=>{e||(e=!0,t?.())},heldPromise:new Promise(e=>{t=e})}}async function Q(e,t){if(!t)return{status:`granted`,release:()=>{}};let n=et(e),r,i=new Promise(e=>{r=e}),a=Z();return t.request(n,{mode:`exclusive`,ifAvailable:!0},e=>e===null?(r(!1),Promise.resolve()):(r(!0),a.heldPromise)),await i?{status:`granted`,release:a.release}:{status:`deferred`,waitForPromotion:()=>new Promise(e=>{let r=Z();t.request(n,{mode:`exclusive`},()=>(e({release:r.release}),r.heldPromise))})}}async function tt(e){let t=await Q(e.workerBaseUrl,e.lockManager);if(t.status===`granted`){if(!e.shouldLead()){t.release();return}e.onGranted(t.release);return}X.error(`Another tab is already leading on this tray worker — deferring leader start until the other tab releases the lock.`);let{release:n}=await t.waitForPromotion();if(!e.shouldLead()){n();return}X.error(`Late promotion: this tab is now the tray leader.`),e.onGranted(n)}function nt(){return typeof navigator<`u`&&navigator.locks&&typeof navigator.locks.request==`function`?navigator.locks:null}function $(e,t){let{browser:n,client:r,getController:i}=e;return{joinUrl:t,onSnapshot:e=>i()?.loadMessages(e),onUserMessage:(e,t,n,r)=>i()?.addUserMessage(e,r),onStatus:e=>i()?.setProcessing(e===`processing`),setChatAgent:e=>i()?.setAgent(e),browserAPI:n,onForwardingToggle:e=>r.sendSetFollowerForwarding(e),addSprinkle:(t,n,r)=>e.addSprinkle(t,n,r),removeSprinkle:t=>e.removeSprinkle(t),onScoopsList:(t,n)=>{e.refs.switcher.scoops=t.map(e=>({key:e.jid,type:e.isCone?`cone`:`scoop`,color:ce(e),label:e.isCone?`sliccy`:e.name,eyes:`open`})),e.refs.switcher.setAttribute(`active`,n)}}}function rt(e,t,n){let{client:i,refs:a}=e;return o=>({workerBaseUrl:o,getMessages:()=>e.getController()?.getMessages()??[],getMessagesForScoop:e=>i.getMessagesForScoop(e),getScoopJid:()=>e.getSelectedJid(),getScoops:()=>i.getScoops().map(e=>({jid:e.jid,name:e.name,folder:e.folder,isCone:e.isCone,assistantLabel:e.assistantLabel,trigger:e.trigger})),getSprinkles:()=>{let t=new Set(e.sprinkleManager.opened());return e.sprinkleManager.available().map(e=>({name:e.name,title:e.title,path:e.path,open:t.has(e.name),autoOpen:e.autoOpen,icon:e.icon}))},readSprinkleContent:async t=>{let n=e.sprinkleManager.available().find(e=>e.name===t);if(!n)return null;try{let t=await(await e.openFs()).readFile(n.path,{encoding:`utf-8`});return typeof t==`string`?t:new TextDecoder(`utf-8`).decode(t)}catch{return null}},onSprinkleLick:(e,t,n,r)=>i.sendSprinkleLick(e,t,n,r),onFollowerMessage:(n,r,i,a)=>{e.getController()?.addUserMessage(n,i),e.agentHandle.sendMessage(n,r,i,a),t.leader?.sync.broadcastUserMessage(n,r,i)},onFollowerAbort:()=>e.agentHandle.stop(),onFollowerNewSession:t=>{e.window.dispatchEvent(new CustomEvent(oe,{detail:{action:t}}))},onFollowerCountChanged:t=>{a.floatbar.setAttribute(`label`,t>0?`tray · ${t} follower${t===1?``:`s`}`:e.baseFloatLabel??`standalone · live`),A(k())},onRemoteTransportsCleaned:e=>n.cleanupRuntime(e),onForwardedLick:e=>i.sendForwardedLick(e),onCherryHostEvent:(e,t,n)=>i.sendCherryHostEvent(e,t,n),onPreviewLick:e=>i.sendPreviewLick(e),requestTranscriptExportApproval:e=>r(async()=>{let{openTranscriptExportApproval:e}=await import(`./wc-transcript-export-C4O9AKQ6.js`);return{openTranscriptExportApproval:e}},__vite__mapDeps([43,4,44,13,42,1])).then(({openTranscriptExportApproval:t})=>t(e)),createTranscriptExport:async(e,t)=>{let{runTranscriptExportForFollower:n}=await r(async()=>{let{runTranscriptExportForFollower:e}=await import(`./wc-transcript-export-C4O9AKQ6.js`);return{runTranscriptExportForFollower:e}},__vite__mapDeps([43,4,44,13,42,1]));return n(e,t,i)},sendWebhookEvent:(e,t,n)=>i.sendWebhookEvent(e,t,n),onAgentEvent:t=>e.agentHandle.onEvent(t),execInShell:(e,t)=>z(i,{command:e,...t}),browserAPI:e.browser,browserTransport:e.realCdpTransport,vfs:{async stat(t){return(await e.openFs()).stat(t)},async readFile(t,n){return(await e.openFs()).readFile(t,n)}}})}function it(e,t){return{wireLeaderHooks:t=>{O(()=>{let e=t.sync.getExecCapableBootstrapIds(),n=t.sync.getBrowserCapableBootstrapIds(),r=t.sync.getFollowerMotds();return t.peers.getPeers().map(t=>({runtimeId:de(t.bootstrapId),runtime:t.runtime,connectedAt:t.connectedAt??void 0,exec:e.has(t.bootstrapId),cdp:n.has(t.bootstrapId),motd:r.get(t.bootstrapId)}))}),e.sprinkleManager.setSendToSprinkleHook((e,n)=>t.sync.broadcastSprinkleUpdate(e,n)),e.sprinkleManager.setReloadHook(e=>t.sync.broadcastSprinkleReloaded(e)),e.getController()?.setOnLocalUserMessage((e,n,r)=>t.sync.broadcastUserMessage(e,n,r)),e.getController()?.setOnLocalProcessingChange(e=>t.sync.broadcastStatus(e?`processing`:`ready`)),r(async()=>{let{setThemeChangeListener:e,getActiveThemeId:t}=await import(`./theme-engine-jfuTMXZM.js`).then(e=>e.p);return{setThemeChangeListener:e,getActiveThemeId:t}},__vite__mapDeps([45,1,12])).then(({setThemeChangeListener:e,getActiveThemeId:n})=>{let r;e(e=>{n()!==`__preview`&&(clearTimeout(r),r=setTimeout(()=>t.sync.broadcastTheme(e),150))})})},clearLeaderHooks:()=>{O(null),A([]),e.getController()?.setOnLocalUserMessage(void 0),e.getController()?.setOnLocalProcessingChange(void 0),e.sprinkleManager.setSendToSprinkleHook(void 0),e.sprinkleManager.setReloadHook(void 0),t.disposeAll(),r(async()=>{let{setThemeChangeListener:e}=await import(`./theme-engine-jfuTMXZM.js`).then(e=>e.p);return{setThemeChangeListener:e}},__vite__mapDeps([45,1,12])).then(({setThemeChangeListener:e})=>{e(null)})}}}function at(e){return{runtime:`slicc-hosted-leader`,kind:`hosted`,onLeaderReady:t=>{fetch(h(`/api/cloud-status`),{method:`POST`,headers:g({"content-type":`application/json`}),body:JSON.stringify({joinUrl:t.joinUrl,trayId:t.trayId,controllerUrl:t.controllerUrl,webhookUrl:t.webhookUrl,runtime:t.runtime,sliccVersion:`6.7.2`}),signal:AbortSignal.timeout(1e4)}).catch(t=>{e.log.error(`failed to POST /api/cloud-status`,{error:String(t)})})}}}function ot(e,t,n,r,i){let{window:a,log:o}=e;if(e.runtimeMode===`hosted-leader`){a.localStorage.removeItem(b);let i=a.localStorage.getItem(y);if(!i){o.error(`hosted-leader: tray worker base URL not seeded`);return}t.leader=J({...n(i),...at(e)}),r(t.leader),L({log:o});return}let s=a.localStorage.getItem(b),c=a.localStorage.getItem(y);s?t.follower=E($(e,s)):c&&st(c,e,t,n,r,i)}function st(e,t,n,r,i,a){tt({workerBaseUrl:e,lockManager:a,shouldLead:()=>!n.leader&&!n.follower&&t.window.localStorage.getItem(`slicc.trayWorkerBaseUrl`)===e,onGranted:t=>{n.lockRelease=t,n.leader=J(r(e)),i(n.leader)}})}function ct(e,t,n,r){let{window:i,log:a}=e;i.addEventListener(`slicc:tray-join`,r=>{let i=r.detail?.joinUrl;if(!i)return;let o=t.leader,s=t.lockRelease;t.leader=null,t.lockRelease=null,n();let c=t.follower;t.follower=null;try{o?.stop()}catch(e){a.error(`leader stop threw during tray-join switch`,e)}s?.();try{c?.stop()}catch(e){a.error(`previous follower stop threw during tray-join switch`,e)}try{t.follower=E($(e,i))}catch(e){a.error(`tray-join failed`,e)}}),i.addEventListener(`slicc:tray-leave`,e=>{let t=e;r({workerBaseUrl:t.detail?.workerBaseUrl??null,requestId:t.detail?.requestId}).catch(e=>a.error(`tray-leave failed`,e))}),i.addEventListener(`beforeunload`,()=>{t.leader?.stop(),t.follower?.stop(),t.lockRelease?.(),t.lockRelease=null},{once:!0})}async function lt(e){let{loadSprinkleStyles:t}=await r(async()=>{let{loadSprinkleStyles:e}=await import(`./legacy-styles-DcRu2WCJ.js`);return{loadSprinkleStyles:e}},__vite__mapDeps([46,4]));await t();let{client:n,instanceId:i,window:a,log:o}=e,s={leader:null,follower:null,lockRelease:null},c=nt(),l=typeof BroadcastChannel==`function`?new BroadcastChannel(x(i)):null,u=$e({getSync:()=>s.leader?.sync??null,postEvent:e=>{let t={type:`panel-rpc-push`,op:`remote-cdp-event`,payload:e};l?.postMessage(t)}});n.setForwardLickHandler(e=>{let t=s.follower?.currentSync;t?t.forwardLick(e):o.warn(`forward-lick dropped: no active follower sync`)});let d=rt(e,s,u),{wireLeaderHooks:f,clearLeaderHooks:p}=it(e,u);a.addEventListener(se,()=>{s.leader?.sync.broadcastSnapshot()});let m=async e=>{let{performTrayLeave:t}=await r(async()=>{let{performTrayLeave:e}=await import(`./tray-leave-runtime-DaD_0DSt.js`);return{performTrayLeave:e}},__vite__mapDeps([47,27,13,14,1,4,15,16,17,28])),n=()=>{s.leader||(s.lockRelease?.(),s.lockRelease=null)},i=t({workerBaseUrl:e.workerBaseUrl,requestId:e.requestId},{getLeader:()=>s.leader,setLeader:e=>{s.leader=e},getFollower:()=>s.follower,setFollower:e=>{s.follower=e},startLeader:e=>(s.lockRelease?.(),s.lockRelease=null,Q(e,c).then(e=>{if(e.status===`granted`){if(!s.leader){e.release();return}s.lockRelease=e.release}}),J(d(e))),clearLeaderHooks:p,wireLeaderHooks:f,storage:a.localStorage,log:o});try{let e=await i;return n(),e}catch(e){throw n(),e}};return await I({instanceId:i,browser:e.browser,remoteCdpBridge:u,remoteCdpPushChannel:l,getLeader:()=>s.leader,performTrayLeaveLocally:m,window:a}),ot(e,s,d,f,c),pe(e.refs.floatbar),ie(e=>{a.localStorage.setItem(`slicc.leaderTrayStatus`,JSON.stringify(e))}),a.localStorage.setItem(`slicc.leaderTrayStatus`,JSON.stringify(C())),te(e=>{a.localStorage.setItem(S,JSON.stringify(e))}),a.localStorage.setItem(S,JSON.stringify(ee())),A(k(),a.localStorage),ct(e,s,p,m),{getLeader:()=>s.leader,getFollower:()=>s.follower,performTrayLeaveLocally:m}}export{lt as wireWcTray};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as e,z as t}from"./account-store-
|
|
1
|
+
import{d as e,z as t}from"./account-store-CJEiowvN.js";import{n}from"./event-stream-qbAZIAKV.js";import{d as r,p as i}from"./bedrock-camp-DS0ilb3O.js";import{c as a,i as o,r as s,s as c}from"./legacy-api-aliases-YuuBU-he.js";import"./provider-settings-a1nHhD_8.js";import{n as l,r as u,t as d}from"./pkce-hGf_TEnP.js";import{XaiErrorCode as f,XaiOAuthError as p}from"./xai-grok-errors-ByEMMSoz.js";const m=`xai-grok`,h=`https://auth.x.ai`,g=`${h}/oauth2/authorize`,_=`${h}/oauth2/token`,v=`b1a00492-073a-47ea-816f-4c329264a828`,y=`http://127.0.0.1:56121/callback`,b=`https://api.x.ai/v1`,x=`grok-4.5`,S=`${m}-openai`;function C(){return r(`xai`)}function w(e){return{id:e.id,name:e.name,api:`openai`,reasoning:e.reasoning,input:e.input,context_window:e.contextWindow,max_tokens:e.maxTokens,compat:e.compat,thinkingLevelMap:e.thinkingLevelMap}}function T(e){let t=C(),n=t.find(t=>t.id===e.id);if(!n&&(console.warn(`xAI model "${e.id}" is no longer in the pi-ai catalog; falling back to default "${x}"`),n=t.find(e=>e.id===x),!n))throw Error(`xAI default model "${x}" is not registered by pi-ai`);if(n.api!==`openai-responses`&&n.api!==`openai-completions`)throw Error(`Unsupported pi-ai API "${n.api}" for xAI model "${e.id}"`);return{...e,...n,baseUrl:b}}async function E(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:y,client_id:v,code_verifier:t}),r=await fetch(_,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new p(`xAI token exchange failed: ${r.status} ${await r.text()}`,f.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new p(`xAI token exchange did not return access_token.`,f.TOKEN_EXCHANGE_INVALID);return i}async function D(e){try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:v}),n=await fetch(_,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});return n.ok?await n.json():(console.error(`[xai-grok] refresh failed:`,n.status,await n.text()),null)}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function O(){return e().find(e=>e.providerId===m)}async function k(){let e=O();if(!e?.accessToken)throw new p("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",f.AUTH_MISSING,!0);let n=e.tokenExpiresAt??0;if(n&&Date.now()+6e4<n)return e.accessToken;if(e.refreshToken){let n=await D(e.refreshToken);if(n?.access_token)return await t({providerId:m,accessToken:n.access_token,refreshToken:n.refresh_token??e.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??e.scopes}),n.access_token}return e.accessToken}function A(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:S,provider:m,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function j(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}const M=(e,t,r={})=>{let i=n();return(async()=>{try{let n=await k(),a=r.sessionId,c=T(e),l={...r,apiKey:n,headers:j(r.headers,a)},u=c.api===`openai-responses`?o(c,t,l):s(c,t,l);for await(let e of u)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(A(e,t)),i.end()}})(),i},N=(e,t,r)=>{let i=n();return(async()=>{try{let n=await k(),o=r?.sessionId,s=T(e),l={...r,apiKey:n,headers:j(r?.headers,o)},u=s.api===`openai-responses`?a(s,t,l):c(s,t,l);for await(let e of u)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(A(e,t)),i.end()}})(),i},P={id:m,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok 4.5.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:x,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`],getModelIds:()=>C().map(w),onOAuthLoginIntercepted:async(e,n,r)=>{let i=l(),a=await d(i),o=u(),s=u(),c=new URL(g);c.searchParams.set(`response_type`,`code`),c.searchParams.set(`client_id`,v),c.searchParams.set(`redirect_uri`,y),c.searchParams.set(`scope`,r?.scopes??`openid profile email offline_access grok-cli:access api:access`),c.searchParams.set(`code_challenge`,a),c.searchParams.set(`code_challenge_method`,`S256`),c.searchParams.set(`state`,o),c.searchParams.set(`nonce`,s),c.searchParams.set(`plan`,`generic`),c.searchParams.set(`referrer`,`slicc`);let h=await e({authorizeUrl:c.toString(),redirectUriPattern:`http://127.0.0.1:56121/*`,onCapture:`close`});if(!h)throw new p(`xAI OAuth login was cancelled or timed out`,f.CALLBACK_TIMEOUT);let _=new URL(h),x=_.searchParams.get(`code`),S=_.searchParams.get(`state`);if(!x)throw new p(`xAI OAuth redirect did not include a code`,f.CODE_MISSING);if(S!==o)throw new p(`xAI OAuth state mismatch — possible CSRF, aborting`,f.STATE_MISMATCH);let C=await E(x,i);await t({providerId:m,accessToken:C.access_token,refreshToken:C.refresh_token,tokenExpiresAt:Date.now()+(C.expires_in??21600)*1e3,baseUrl:b,scopes:C.scope}),n()},onOAuthLogout:async()=>{await t({providerId:m,accessToken:``})},onSilentRenew:async()=>{let e=O();if(!e?.refreshToken)return null;let n=await D(e.refreshToken);return n?.access_token?(await t({providerId:m,accessToken:n.access_token,refreshToken:n.refresh_token??e.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??e.scopes}),n.access_token):null}};function F(){i({api:S,stream:M,streamSimple:N})}export{f as XaiErrorCode,p as XaiOAuthError,P as config,F as register};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as e,z as t}from"./account-store-
|
|
1
|
+
import{d as e,z as t}from"./account-store-CysBUUQJ.js";import{n}from"./event-stream-qbAZIAKV.js";import{a as r,r as i}from"./compat-CkpNnFQS.js";import{c as a,i as o,r as s,s as c}from"./legacy-api-aliases-BWm3gxUe.js";import"./provider-settings-B4rEHMW6.js";import{n as l,r as u,t as d}from"./pkce-hGf_TEnP.js";import{XaiErrorCode as f,XaiOAuthError as p}from"./xai-grok-errors-bnlIBeu-.js";var m=`xai-grok`,h=`https://auth.x.ai`,g=`${h}/oauth2/authorize`,_=`${h}/oauth2/token`,v=`b1a00492-073a-47ea-816f-4c329264a828`,y=`openid profile email offline_access grok-cli:access api:access`,b=`http://127.0.0.1:56121/callback`,x=`http://127.0.0.1:56121/*`,S=`https://api.x.ai/v1`,C=`grok-4.5`,w=`${m}-openai`;function T(){return i(`xai`)}function E(e){return{id:e.id,name:e.name,api:`openai`,reasoning:e.reasoning,input:e.input,context_window:e.contextWindow,max_tokens:e.maxTokens,compat:e.compat,thinkingLevelMap:e.thinkingLevelMap}}function D(e){let t=T(),n=t.find(t=>t.id===e.id);if(!n&&(console.warn(`xAI model "${e.id}" is no longer in the pi-ai catalog; falling back to default "${C}"`),n=t.find(e=>e.id===C),!n))throw Error(`xAI default model "${C}" is not registered by pi-ai`);if(n.api!==`openai-responses`&&n.api!==`openai-completions`)throw Error(`Unsupported pi-ai API "${n.api}" for xAI model "${e.id}"`);return{...e,...n,baseUrl:S}}async function O(e,t){let n=new URLSearchParams({grant_type:`authorization_code`,code:e,redirect_uri:b,client_id:v,code_verifier:t}),r=await fetch(_,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:n});if(!r.ok)throw new p(`xAI token exchange failed: ${r.status} ${await r.text()}`,f.TOKEN_EXCHANGE_FAILED);let i=await r.json();if(!i.access_token)throw new p(`xAI token exchange did not return access_token.`,f.TOKEN_EXCHANGE_INVALID);return i}async function k(e){try{let t=new URLSearchParams({grant_type:`refresh_token`,refresh_token:e,client_id:v}),n=await fetch(_,{method:`POST`,headers:{"Content-Type":`application/x-www-form-urlencoded`},body:t});return n.ok?await n.json():(console.error(`[xai-grok] refresh failed:`,n.status,await n.text()),null)}catch(e){return console.error(`[xai-grok] refresh error:`,e instanceof Error?e.message:String(e)),null}}function A(){return e().find(e=>e.providerId===m)}async function j(){let e=A();if(!e?.accessToken)throw new p("Not signed in to xAI Grok — run /login or `oauth-token xai-grok`",f.AUTH_MISSING,!0);let n=e.tokenExpiresAt??0;if(n&&Date.now()+6e4<n)return e.accessToken;if(e.refreshToken){let n=await k(e.refreshToken);if(n?.access_token)return await t({providerId:m,accessToken:n.access_token,refreshToken:n.refresh_token??e.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??e.scopes}),n.access_token}return e.accessToken}function M(e,t){return{type:`error`,reason:`error`,error:{role:`assistant`,content:[],api:w,provider:m,model:e.id,usage:{input:0,output:0,cacheRead:0,cacheWrite:0,totalTokens:0,cost:{input:0,output:0,cacheRead:0,cacheWrite:0,total:0}},stopReason:`error`,errorMessage:t instanceof Error?t.message:String(t),timestamp:Date.now()}}}function N(e,t){return t?{...e??{},"x-grok-conv-id":t}:e}var P=(e,t,r={})=>{let i=n();return(async()=>{try{let n=await j(),a=r.sessionId,c=D(e),l={...r,apiKey:n,headers:N(r.headers,a)},u=c.api===`openai-responses`?o(c,t,l):s(c,t,l);for await(let e of u)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(M(e,t)),i.end()}})(),i},F=(e,t,r)=>{let i=n();return(async()=>{try{let n=await j(),o=r?.sessionId,s=D(e),l={...r,apiKey:n,headers:N(r?.headers,o)},u=s.api===`openai-responses`?a(s,t,l):c(s,t,l);for await(let e of u)i.push(e);i.end()}catch(t){console.error(`[xai-grok] Stream error:`,t instanceof Error?t.message:String(t)),i.push(M(e,t)),i.end()}})(),i},I={id:m,name:`xAI Grok (SuperGrok OAuth)`,description:`Grok via xAI OAuth — uses your SuperGrok subscription, no API key needed. Default model is Grok 4.5.`,requiresApiKey:!1,requiresBaseUrl:!1,isOAuth:!0,defaultModelId:C,oauthTokenDomains:[`api.x.ai`,`*.x.ai`,`auth.x.ai`,`accounts.x.ai`],getModelIds:()=>T().map(E),onOAuthLoginIntercepted:async(e,n,r)=>{let i=l(),a=await d(i),o=u(),s=u(),c=new URL(g);c.searchParams.set(`response_type`,`code`),c.searchParams.set(`client_id`,v),c.searchParams.set(`redirect_uri`,b),c.searchParams.set(`scope`,r?.scopes??y),c.searchParams.set(`code_challenge`,a),c.searchParams.set(`code_challenge_method`,`S256`),c.searchParams.set(`state`,o),c.searchParams.set(`nonce`,s),c.searchParams.set(`plan`,`generic`),c.searchParams.set(`referrer`,`slicc`);let h=await e({authorizeUrl:c.toString(),redirectUriPattern:x,onCapture:`close`});if(!h)throw new p(`xAI OAuth login was cancelled or timed out`,f.CALLBACK_TIMEOUT);let _=new URL(h),C=_.searchParams.get(`code`),w=_.searchParams.get(`state`);if(!C)throw new p(`xAI OAuth redirect did not include a code`,f.CODE_MISSING);if(w!==o)throw new p(`xAI OAuth state mismatch — possible CSRF, aborting`,f.STATE_MISMATCH);let T=await O(C,i);await t({providerId:m,accessToken:T.access_token,refreshToken:T.refresh_token,tokenExpiresAt:Date.now()+(T.expires_in??21600)*1e3,baseUrl:S,scopes:T.scope}),n()},onOAuthLogout:async()=>{await t({providerId:m,accessToken:``})},onSilentRenew:async()=>{let e=A();if(!e?.refreshToken)return null;let n=await k(e.refreshToken);return n?.access_token?(await t({providerId:m,accessToken:n.access_token,refreshToken:n.refresh_token??e.refreshToken,tokenExpiresAt:Date.now()+(n.expires_in??21600)*1e3,scopes:n.scope??e.scopes}),n.access_token):null}};function L(){r({api:w,stream:P,streamSimple:F})}export{f as XaiErrorCode,p as XaiOAuthError,I as config,L as register};
|
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/main-
|
|
8
|
+
<script type="module" crossorigin src="/assets/main-BATAIZJP.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-Dezn_h7o.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-aKtaBQYM.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-Czpn1I53.js">
|
|
@@ -27,24 +27,24 @@
|
|
|
27
27
|
<link rel="modulepreload" crossorigin href="/assets/secrets-bridge-client-CUeSRcdV.js">
|
|
28
28
|
<link rel="modulepreload" crossorigin href="/assets/tool-ui-DfXu6quJ.js">
|
|
29
29
|
<link rel="modulepreload" crossorigin href="/assets/tool-result-images-DwRGZUe_.js">
|
|
30
|
-
<link rel="modulepreload" crossorigin href="/assets/providers-
|
|
30
|
+
<link rel="modulepreload" crossorigin href="/assets/providers-CLGnrQ6p.js">
|
|
31
31
|
<link rel="modulepreload" crossorigin href="/assets/panel-rpc-DmJSNs0I.js">
|
|
32
32
|
<link rel="modulepreload" crossorigin href="/assets/transform-messages-wECJwtH0.js">
|
|
33
33
|
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-CJY4i7di.js">
|
|
34
|
-
<link rel="modulepreload" crossorigin href="/assets/account-store-
|
|
34
|
+
<link rel="modulepreload" crossorigin href="/assets/account-store-CysBUUQJ.js">
|
|
35
35
|
<link rel="modulepreload" crossorigin href="/assets/electron-overlay-route-CjT6k9Df.js">
|
|
36
36
|
<link rel="modulepreload" crossorigin href="/assets/bridge-launch-params-BUV5qlt9.js">
|
|
37
37
|
<link rel="modulepreload" crossorigin href="/assets/feature-flags-C6YBr0Cv.js">
|
|
38
38
|
<link rel="modulepreload" crossorigin href="/assets/messages-BD4p8GuF.js">
|
|
39
39
|
<link rel="modulepreload" crossorigin href="/assets/tray-runtime-config-DRqOLcXQ.js">
|
|
40
40
|
<link rel="modulepreload" crossorigin href="/assets/runtime-mode-BP9WrRNO.js">
|
|
41
|
-
<link rel="modulepreload" crossorigin href="/assets/setup-sudo-
|
|
42
|
-
<link rel="modulepreload" crossorigin href="/assets/setup-standalone-prelude-
|
|
41
|
+
<link rel="modulepreload" crossorigin href="/assets/setup-sudo-vqSc8pzk.js">
|
|
42
|
+
<link rel="modulepreload" crossorigin href="/assets/setup-standalone-prelude-y8NGd_3h.js">
|
|
43
43
|
<link rel="modulepreload" crossorigin href="/assets/telemetry-DqIqVG5n.js">
|
|
44
44
|
<link rel="modulepreload" crossorigin href="/assets/tray-follower-status-5SqDRLX8.js">
|
|
45
45
|
<link rel="modulepreload" crossorigin href="/assets/clipboard-DuHpK59o.js">
|
|
46
46
|
<link rel="modulepreload" crossorigin href="/assets/tray-join-url-BIvzbiFR.js">
|
|
47
|
-
<link rel="modulepreload" crossorigin href="/assets/provider-settings-
|
|
47
|
+
<link rel="modulepreload" crossorigin href="/assets/provider-settings-B4rEHMW6.js">
|
|
48
48
|
</head>
|
|
49
49
|
<body>
|
|
50
50
|
<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/main-
|
|
8
|
+
<script type="module" crossorigin src="/assets/main-BATAIZJP.js"></script>
|
|
9
9
|
<link rel="modulepreload" crossorigin href="/assets/modulepreload-polyfill-Dezn_h7o.js">
|
|
10
10
|
<link rel="modulepreload" crossorigin href="/assets/rolldown-runtime-aKtaBQYM.js">
|
|
11
11
|
<link rel="modulepreload" crossorigin href="/assets/preload-helper-Czpn1I53.js">
|
|
@@ -27,24 +27,24 @@
|
|
|
27
27
|
<link rel="modulepreload" crossorigin href="/assets/secrets-bridge-client-CUeSRcdV.js">
|
|
28
28
|
<link rel="modulepreload" crossorigin href="/assets/tool-ui-DfXu6quJ.js">
|
|
29
29
|
<link rel="modulepreload" crossorigin href="/assets/tool-result-images-DwRGZUe_.js">
|
|
30
|
-
<link rel="modulepreload" crossorigin href="/assets/providers-
|
|
30
|
+
<link rel="modulepreload" crossorigin href="/assets/providers-CLGnrQ6p.js">
|
|
31
31
|
<link rel="modulepreload" crossorigin href="/assets/panel-rpc-DmJSNs0I.js">
|
|
32
32
|
<link rel="modulepreload" crossorigin href="/assets/transform-messages-wECJwtH0.js">
|
|
33
33
|
<link rel="modulepreload" crossorigin href="/assets/bedrock-camp-CJY4i7di.js">
|
|
34
|
-
<link rel="modulepreload" crossorigin href="/assets/account-store-
|
|
34
|
+
<link rel="modulepreload" crossorigin href="/assets/account-store-CysBUUQJ.js">
|
|
35
35
|
<link rel="modulepreload" crossorigin href="/assets/electron-overlay-route-CjT6k9Df.js">
|
|
36
36
|
<link rel="modulepreload" crossorigin href="/assets/bridge-launch-params-BUV5qlt9.js">
|
|
37
37
|
<link rel="modulepreload" crossorigin href="/assets/feature-flags-C6YBr0Cv.js">
|
|
38
38
|
<link rel="modulepreload" crossorigin href="/assets/messages-BD4p8GuF.js">
|
|
39
39
|
<link rel="modulepreload" crossorigin href="/assets/tray-runtime-config-DRqOLcXQ.js">
|
|
40
40
|
<link rel="modulepreload" crossorigin href="/assets/runtime-mode-BP9WrRNO.js">
|
|
41
|
-
<link rel="modulepreload" crossorigin href="/assets/setup-sudo-
|
|
42
|
-
<link rel="modulepreload" crossorigin href="/assets/setup-standalone-prelude-
|
|
41
|
+
<link rel="modulepreload" crossorigin href="/assets/setup-sudo-vqSc8pzk.js">
|
|
42
|
+
<link rel="modulepreload" crossorigin href="/assets/setup-standalone-prelude-y8NGd_3h.js">
|
|
43
43
|
<link rel="modulepreload" crossorigin href="/assets/telemetry-DqIqVG5n.js">
|
|
44
44
|
<link rel="modulepreload" crossorigin href="/assets/tray-follower-status-5SqDRLX8.js">
|
|
45
45
|
<link rel="modulepreload" crossorigin href="/assets/clipboard-DuHpK59o.js">
|
|
46
46
|
<link rel="modulepreload" crossorigin href="/assets/tray-join-url-BIvzbiFR.js">
|
|
47
|
-
<link rel="modulepreload" crossorigin href="/assets/provider-settings-
|
|
47
|
+
<link rel="modulepreload" crossorigin href="/assets/provider-settings-B4rEHMW6.js">
|
|
48
48
|
</head>
|
|
49
49
|
<body>
|
|
50
50
|
<div id="app"></div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "sliccy",
|
|
3
|
-
"version": "6.7.
|
|
3
|
+
"version": "6.7.2",
|
|
4
4
|
"description": "Browser-based coding agent with thin CLI server",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"type": "module",
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
"packages/chrome-extension",
|
|
35
35
|
"packages/cloudflare-worker",
|
|
36
36
|
"packages/swift-launcher",
|
|
37
|
+
"packages/swift-traysession",
|
|
37
38
|
"packages/swift-server",
|
|
38
39
|
"packages/swift-optel"
|
|
39
40
|
],
|
|
@@ -45,7 +46,7 @@
|
|
|
45
46
|
"dev:extension:fresh": "CDP_PORT=9333 bash packages/dev-tools/tools/dev-extension-fresh.sh",
|
|
46
47
|
"dev:electron:node:fresh": "PORT=5730 CDP_PORT=9225 bash packages/dev-tools/tools/dev-electron-node-fresh.sh",
|
|
47
48
|
"dev:electron:swift:fresh": "PORT=5740 CDP_PORT=9226 bash packages/dev-tools/tools/dev-electron-swift-fresh.sh",
|
|
48
|
-
"build": "npm run build -w @slicc/shared-ts && npm run build -w @slicc/cloud-core && npm run build -w @ai-ecoverse/spoon && npm run build -w @slicc/webcomponents && npm run build -w @slicc/webapp && npm run build -w @ai-ecoverse/cherry && npm run build -w @slicc/node-server && npm run build -w @slicc/chrome-extension && npm run build -w @slicc/cloudflare-worker && npm run build -w @slicc/swift-server && npm run build -w @slicc/swift-optel && npm run build -w @slicc/swift-launcher",
|
|
49
|
+
"build": "npm run build -w @slicc/shared-ts && npm run build -w @slicc/cloud-core && npm run build -w @ai-ecoverse/spoon && npm run build -w @slicc/webcomponents && npm run build -w @slicc/webapp && npm run build -w @ai-ecoverse/cherry && npm run build -w @slicc/node-server && npm run build -w @slicc/chrome-extension && npm run build -w @slicc/cloudflare-worker && npm run build -w @slicc/swift-server && npm run build -w @slicc/swift-optel && npm run build -w @slicc/swift-traysession && npm run build -w @slicc/swift-launcher",
|
|
49
50
|
"start": "node dist/node-server/index.js",
|
|
50
51
|
"start:electron": "node dist/node-server/index.js --electron",
|
|
51
52
|
"preflight": "node packages/dev-tools/tools/preflight-deps.mjs",
|
|
@@ -79,15 +80,15 @@
|
|
|
79
80
|
"lint:patches": "node packages/dev-tools/patch-reconcile/check-patches.mjs",
|
|
80
81
|
"lint:duplication": "jscpd --config jscpd.json --no-tips",
|
|
81
82
|
"lint:duplication:report": "jscpd --config jscpd.json --no-tips --threshold 100 --reporters console,html,json --output dist/jscpd",
|
|
82
|
-
"lint:swift": "npm run lint -w @slicc/swift-server && npm run lint -w @slicc/swift-optel && npm run lint -w @slicc/swift-launcher && cd packages/ios-app && swiftlint lint",
|
|
83
|
-
"lint:swift:format": "npm run lint:format -w @slicc/swift-server && npm run lint:format -w @slicc/swift-optel && npm run lint:format -w @slicc/swift-launcher && cd packages/ios-app && swift format lint --strict --parallel --recursive SliccFollower",
|
|
84
|
-
"format:swift": "npm run format -w @slicc/swift-server && npm run format -w @slicc/swift-optel && npm run format -w @slicc/swift-launcher && cd packages/ios-app && swift format --in-place --parallel --recursive SliccFollower",
|
|
83
|
+
"lint:swift": "npm run lint -w @slicc/swift-server && npm run lint -w @slicc/swift-optel && npm run lint -w @slicc/swift-traysession && npm run lint -w @slicc/swift-launcher && cd packages/ios-app && swiftlint lint",
|
|
84
|
+
"lint:swift:format": "npm run lint:format -w @slicc/swift-server && npm run lint:format -w @slicc/swift-optel && npm run lint:format -w @slicc/swift-traysession && npm run lint:format -w @slicc/swift-launcher && cd packages/ios-app && swift format lint --strict --parallel --recursive SliccFollower",
|
|
85
|
+
"format:swift": "npm run format -w @slicc/swift-server && npm run format -w @slicc/swift-optel && npm run format -w @slicc/swift-traysession && npm run format -w @slicc/swift-launcher && cd packages/ios-app && swift format --in-place --parallel --recursive SliccFollower",
|
|
85
86
|
"deadcode": "knip --include files,dependencies,devDependencies,unlisted,binaries,unresolved,duplicates",
|
|
86
87
|
"deadcode:full": "knip",
|
|
87
88
|
"deadcode:files": "knip --include files",
|
|
88
89
|
"deadcode:production": "knip --production --strict",
|
|
89
90
|
"deadcode:production-files": "knip --production --include files",
|
|
90
|
-
"deadcode:swift": "npm run deadcode -w @slicc/swift-server && npm run deadcode -w @slicc/swift-optel && npm run deadcode -w @slicc/swift-launcher",
|
|
91
|
+
"deadcode:swift": "npm run deadcode -w @slicc/swift-server && npm run deadcode -w @slicc/swift-optel && npm run deadcode -w @slicc/swift-traysession && npm run deadcode -w @slicc/swift-launcher",
|
|
91
92
|
"package:release": "node dist/node-server/release-package.js",
|
|
92
93
|
"publish:chrome": "node dist/node-server/publish-chrome-web-store.js",
|
|
93
94
|
"publish:worker": "bash packages/cloudflare-worker/scripts/publish-worker.sh",
|