sliccy 6.22.0 → 6.23.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (80) hide show
  1. package/dist/ui/assets/{account-store-CRyeHVEi.js → account-store-DPE7agWW.js} +1 -1
  2. package/dist/ui/assets/{account-store-Bd0ijUGr.js → account-store-sGF7S3Eh.js} +1 -1
  3. package/dist/ui/assets/{adobe-CYsfuYSF.js → adobe-boLWSSVl.js} +1 -1
  4. package/dist/ui/assets/{adobe-neMQbXTc.js → adobe-m3GGgXsh.js} +1 -1
  5. package/dist/ui/assets/{apply-layout-BqS4f4uO.js → apply-layout-m1arFhIp.js} +1 -1
  6. package/dist/ui/assets/{apps-B0Wf8ya3.js → apps-DVtS0H1H.js} +1 -1
  7. package/dist/ui/assets/{azure-openai-B4M9D39w.js → azure-openai-BqkTJOUB.js} +1 -1
  8. package/dist/ui/assets/{azure-openai-C0pmHQ9X.js → azure-openai-DDy_2P-w.js} +1 -1
  9. package/dist/ui/assets/{cdp-uBLa5oK-.js → cdp-C5fHo_WI.js} +4 -4
  10. package/dist/ui/assets/{cerebras-CTiZ0sYm.js → cerebras-BuqSgzbt.js} +1 -1
  11. package/dist/ui/assets/{cerebras--tTOH0OC.js → cerebras-KpI_ewue.js} +1 -1
  12. package/dist/ui/assets/{connect-surface-DvrQvvCL.js → connect-surface-W00QACfG.js} +1 -1
  13. package/dist/ui/assets/extension-bridge-transport-CR4Zp6Gm.js +1 -0
  14. package/dist/ui/assets/{fs-DTs92LAT.js → fs-Blry0k8Y.js} +1 -1
  15. package/dist/ui/assets/{fs-BCdA1a1d.js → fs-DsSZc_6S.js} +2 -2
  16. package/dist/ui/assets/{github-HygwBXlK.js → github--AqpybtQ.js} +2 -2
  17. package/dist/ui/assets/{github-B8qzxS-A.js → github-CZ6lA8ug.js} +1 -1
  18. package/dist/ui/assets/{github-copilot-CYUD5p8q.js → github-copilot-BBLAZsxU.js} +1 -1
  19. package/dist/ui/assets/{github-copilot-DC00bY6F.js → github-copilot-JvRukY6F.js} +1 -1
  20. package/dist/ui/assets/{kernel-worker-Dghl78B8.js → kernel-worker-CPUVK_FD.js} +606 -606
  21. package/dist/ui/assets/{local-llm-D72MrNfS.js → local-llm-DHkJxfVh.js} +1 -1
  22. package/dist/ui/assets/{local-llm-CrQ5m_8c.js → local-llm-E_CR6sRJ.js} +1 -1
  23. package/dist/ui/assets/main-cherry-C5R40KLy.js +1 -0
  24. package/dist/ui/assets/{main-DDsgMIbE.js → main-k356wt-C.js} +3 -3
  25. package/dist/ui/assets/{mount-Bi2RAG2A.js → mount-BKIyCzYM.js} +1 -1
  26. package/dist/ui/assets/{mount-C4Sx7Fjo.js → mount-CfsBwW5g.js} +2 -2
  27. package/dist/ui/assets/{mount-recovery-CJvKs09-.js → mount-recovery-DSWMwHuj.js} +1 -1
  28. package/dist/ui/assets/{new-session-BxUn-MwX.js → new-session-iUH74uIc.js} +2 -2
  29. package/dist/ui/assets/{oauth-bootstrap-DpMT85Bq.js → oauth-bootstrap-C09Tuntt.js} +2 -2
  30. package/dist/ui/assets/{openai-codex-BZdBW9ws.js → openai-codex-Bfamypxp.js} +1 -1
  31. package/dist/ui/assets/{openai-codex-B4dguhl0.js → openai-codex-BiMOVcPl.js} +1 -1
  32. package/dist/ui/assets/{openrouter-BRuYax9p.js → openrouter-CkB7uQeH.js} +1 -1
  33. package/dist/ui/assets/{openrouter-oauth-DLZAsH5t.js → openrouter-oauth-CkBhupHL.js} +1 -1
  34. package/dist/ui/assets/{openrouter-oauth-DKQZnJrz.js → openrouter-oauth-Dm1gI0YW.js} +1 -1
  35. package/dist/ui/assets/{openrouter-xsV1ulLq.js → openrouter-tSBY5OZi.js} +1 -1
  36. package/dist/ui/assets/{panel-rpc-handlers-Dp877dzv.js → panel-rpc-handlers-YxeD9z8y.js} +2 -2
  37. package/dist/ui/assets/pending-request-table-Dgn6qYdL.js +1 -0
  38. package/dist/ui/assets/{provider-Bn5Ao8TU.js → provider-B19QBhrm.js} +2 -2
  39. package/dist/ui/assets/{provider-C9zzZ6qE.js → provider-awKxbIf4.js} +1 -1
  40. package/dist/ui/assets/{provider-settings-BJn87vTR.js → provider-settings-BVGxfp0W.js} +1 -1
  41. package/dist/ui/assets/{provider-settings-Cm08l4Dh.js → provider-settings-yuamUFgY.js} +1 -1
  42. package/dist/ui/assets/provider-store-access-BENUiyML.js +1 -0
  43. package/dist/ui/assets/{provider-store-access-IAoxA_27.js → provider-store-access-DGTUKU0A.js} +2 -2
  44. package/dist/ui/assets/{providers-DGNJXZGp.js → providers-DsB2nd0r.js} +2 -2
  45. package/dist/ui/assets/{providers-BESIM-3i.js → providers-fG_p4kOd.js} +1 -1
  46. package/dist/ui/assets/{quick-llm-8skI_nfs.js → quick-llm-YlzuL-Jn.js} +1 -1
  47. package/dist/ui/assets/{redirect-uri-906_oLE4.js → redirect-uri-DY-JpZ7h.js} +1 -1
  48. package/dist/ui/assets/remote-cdp-transport-DjFEKevV.js +1 -0
  49. package/dist/ui/assets/{session-freezer-C2fhQ4ji.js → session-freezer-CsiatKyX.js} +2 -2
  50. package/dist/ui/assets/{setup-feature-flags-remote-B0wBHEZY.js → setup-feature-flags-remote-DY008heL.js} +1 -1
  51. package/dist/ui/assets/setup-standalone-prelude-ZrchvEym.js +2 -0
  52. package/dist/ui/assets/{setup-sudo-Bw-BnLie.js → setup-sudo-BMQGXQNx.js} +2 -2
  53. package/dist/ui/assets/{skills-DS0Gg7K0.js → skills-nr4o3ygf.js} +1 -1
  54. package/dist/ui/assets/{store-D9br9UAd.js → store-BF2dHUwE.js} +1 -1
  55. package/dist/ui/assets/{sudo-C6tHptEV.js → sudo-o1-nUTKG.js} +1 -1
  56. package/dist/ui/assets/synthetic-cdp-transport-Ds83IPjw.js +1 -0
  57. package/dist/ui/assets/{upgrade-detection-3d1X_jqz.js → upgrade-detection-DUojzYY3.js} +1 -1
  58. package/dist/ui/assets/{wc-extension-CVKM_3RY.js → wc-extension-CrfljiWU.js} +2 -2
  59. package/dist/ui/assets/{wc-follower-B0BsMI7g.js → wc-follower-DvfL9leN.js} +3 -3
  60. package/dist/ui/assets/{wc-live-Kilm0tRP.js → wc-live-B4sjuGmt.js} +3 -3
  61. package/dist/ui/assets/{wc-nav-DMIbJfg-.js → wc-nav-C7l8BkIJ.js} +2 -2
  62. package/dist/ui/assets/{wc-onboarding-B4sX82ad.js → wc-onboarding-DmgBqKh1.js} +2 -2
  63. package/dist/ui/assets/{wc-placeholder-Bfo1Pm9K.js → wc-placeholder-C6cHG_4i.js} +2 -2
  64. package/dist/ui/assets/{wc-settings-BCxqrCuC.js → wc-settings-Bfvi7kde.js} +2 -2
  65. package/dist/ui/assets/{wc-shell-CdlgW7ko.js → wc-shell-L9eSTAaX.js} +2 -2
  66. package/dist/ui/assets/{wc-sprinkles-VPYe1tdX.js → wc-sprinkles-zeBc1Ivl.js} +2 -2
  67. package/dist/ui/assets/{wc-tray-scoops-BlHt9xWh.js → wc-tray-scoops-CSYrh_aL.js} +1 -1
  68. package/dist/ui/assets/wc-tray-wARkPmN9.js +2 -0
  69. package/dist/ui/assets/{xai-grok-L4LMKO_i.js → xai-grok-DCRYGcDK.js} +1 -1
  70. package/dist/ui/assets/{xai-grok-CPKXvrVc.js → xai-grok-Ds1v84Rv.js} +1 -1
  71. package/dist/ui/index.html +6 -6
  72. package/dist/ui/packages/webapp/index.html +6 -6
  73. package/package.json +1 -1
  74. package/dist/ui/assets/extension-bridge-transport-CikuxrQ4.js +0 -1
  75. package/dist/ui/assets/main-cherry-TVUoY5cD.js +0 -1
  76. package/dist/ui/assets/provider-store-access-JRSxv2-2.js +0 -1
  77. package/dist/ui/assets/remote-cdp-transport-BS_0BClw.js +0 -1
  78. package/dist/ui/assets/setup-standalone-prelude-CvtmaQOp.js +0 -2
  79. package/dist/ui/assets/synthetic-cdp-transport-CtfKyiws.js +0 -1
  80. package/dist/ui/assets/wc-tray-BXvE5d55.js +0 -2
@@ -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-DDsgMIbE.js"></script>
8
+ <script type="module" crossorigin src="/assets/main-k356wt-C.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-DGNJXZGp.js">
30
+ <link rel="modulepreload" crossorigin href="/assets/providers-DsB2nd0r.js">
31
31
  <link rel="modulepreload" crossorigin href="/assets/panel-rpc-DmJSNs0I.js">
32
32
  <link rel="modulepreload" crossorigin href="/assets/transform-messages-DgR3h-Ck.js">
33
33
  <link rel="modulepreload" crossorigin href="/assets/bedrock-camp-CVX95quY.js">
34
- <link rel="modulepreload" crossorigin href="/assets/account-store-CRyeHVEi.js">
34
+ <link rel="modulepreload" crossorigin href="/assets/account-store-DPE7agWW.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-CAZ3YsY7.js">
38
38
  <link rel="modulepreload" crossorigin href="/assets/messages-BD4p8GuF.js">
39
39
  <link rel="modulepreload" crossorigin href="/assets/tray-runtime-config-BxjVzwAJ.js">
40
40
  <link rel="modulepreload" crossorigin href="/assets/runtime-mode-B91km6KC.js">
41
- <link rel="modulepreload" crossorigin href="/assets/setup-sudo-Bw-BnLie.js">
42
- <link rel="modulepreload" crossorigin href="/assets/setup-standalone-prelude-CvtmaQOp.js">
41
+ <link rel="modulepreload" crossorigin href="/assets/setup-sudo-BMQGXQNx.js">
42
+ <link rel="modulepreload" crossorigin href="/assets/setup-standalone-prelude-ZrchvEym.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-Cm08l4Dh.js">
47
+ <link rel="modulepreload" crossorigin href="/assets/provider-settings-yuamUFgY.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.22.0",
3
+ "version": "6.23.0",
4
4
  "description": "Browser-based coding agent with thin CLI server",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -1 +0,0 @@
1
- import{t as e}from"./logger-DDBAeTLF.js";var t=class{_state=`disconnected`;nextCommandId=1;listeners=new Map;pendingCommands=new Map;unsubscribe=null;opts;label;constructor(e){this.opts=e,this.label=e.label??`CDP transport`}get state(){return this._state}async connect(e){if(this._state!==`disconnected`)throw Error(`Cannot connect: state is ${this._state}`);this.unsubscribe=this.opts.subscribeIncoming(e=>this.handleIncoming(e)),this._state=`connected`}disconnect(){this.unsubscribe?.(),this.unsubscribe=null;for(let[,e]of this.pendingCommands)clearTimeout(e.timer),e.reject(Error(`${this.label} disconnected`));this.pendingCommands.clear(),this.listeners.clear(),this._state=`disconnected`}async send(e,t,n,r=3e4){if(this._state!==`connected`)throw Error(`${this.label} is not connected`);let i=this.nextCommandId++,a=this.opts.buildCommandEnvelope(i,e,t,n);return new Promise((t,n)=>{let o=!1,s=setTimeout(()=>{o||(o=!0,this.pendingCommands.delete(i),n(Error(`CDP command timed out after ${r}ms: ${e}`)))},r);this.pendingCommands.set(i,{resolve:e=>{o||(o=!0,t(e))},reject:e=>{o||(o=!0,n(e))},timer:s}),this.opts.sendEnvelope(a).catch(e=>{o||(o=!0,this.pendingCommands.delete(i),clearTimeout(s),n(Error(`Failed to send CDP command: ${e instanceof Error?e.message:String(e)}`)))})})}on(e,t){let n=this.listeners.get(e),r=!n;n||(n=new Set,this.listeners.set(e,n)),n.add(t),r&&this.opts.onSubscribeEvent?.(e)}off(e,t){let n=this.listeners.get(e);n&&(n.delete(t),n.size===0&&(this.listeners.delete(e),this.opts.onUnsubscribeEvent?.(e)))}once(e,t=3e4){return new Promise((n,r)=>{let i=setTimeout(()=>{this.off(e,a),r(Error(`Timed out waiting for event: ${e}`))},t),a=t=>{clearTimeout(i),this.off(e,a),n(t)};this.on(e,a)})}handleIncoming(e){let t=this.opts.parseResponse(e);if(t){this.handleResponse(t);return}let n=this.opts.parseEvent(e);n&&this.handleEvent(n)}handleResponse(e){let t=this.pendingCommands.get(e.id);if(!t){this.opts.onUnknownResponseId?.(e.id);return}this.pendingCommands.delete(e.id),clearTimeout(t.timer),e.error?t.reject(Error(e.error)):t.resolve(e.result??{})}handleEvent(e){let t=this.listeners.get(e.method);if(t)for(let n of t)try{n(e.params??{})}catch(t){this.opts.onListenerError?.(e.method,t)}}},n=`slicc.cdp-bridge`,r=new Set([`handshake.hello`,`handshake.welcome`,`handshake.rejected`,`cdp.request`,`cdp.response`,`cdp.event`,`extension.lick`,`extension.discovery`,`leader.join-url`,`extension.open-settings`]);function i(e){if(typeof e!=`object`||!e)return!1;let t=e;return t.bridge===1&&typeof t.channelId==`string`&&typeof t.kind==`string`&&r.has(t.kind)}function a(e){if(typeof e!=`object`||!e)return!1;let t=e;return typeof t.bridge==`number`&&t.bridge!==1&&typeof t.channelId==`string`&&typeof t.kind==`string`}var o=e(`cdp:extension-bridge`),s=1e4;function c(e,t){let n=globalThis.chrome?.runtime;if(!n?.connect)throw Error(`chrome.runtime.connect is not available in this realm — the page must be in the extension externally_connectable allowlist`);return n.connect(e,t)}var l=class extends t{isExtensionBridge=!0;bridgeOpts;channelId;portHolder;resolveWelcome=null;rejectWelcome=null;welcomeTimer=null;intentionalDisconnect=!1;lastJoinUrl=null;constructor(e){let t=`bridge-${crypto.randomUUID()}`,n={port:null};super(u(t,n)),this.bridgeOpts=e,this.channelId=t,this.portHolder=n}async connect(e){this.intentionalDisconnect=!1;let t=(this.bridgeOpts.connect??c)(this.bridgeOpts.extensionId,{name:n});this.portHolder.port=t;let r=new Promise((e,t)=>{this.resolveWelcome=e,this.rejectWelcome=t});t.onMessage.addListener(e=>this.handleHandshake(e)),t.onDisconnect.addListener(()=>this.handlePortDisconnect(t)),t.postMessage({bridge:1,channelId:this.channelId,kind:`handshake.hello`});let i=e?.timeout??this.bridgeOpts.handshakeTimeoutMs??s;this.welcomeTimer=setTimeout(()=>{if(this.rejectWelcome){this.rejectWelcome(Error(`Extension bridge handshake timed out after ${i}ms`)),this.cleanupHandshake();try{t.disconnect()}catch{}this.portHolder.port=null}},i),await r,await super.connect(e),this.lastJoinUrl!==null&&this.sendLeaderJoinUrl(this.lastJoinUrl)}sendLeaderJoinUrl(e){this.lastJoinUrl=e;let t=this.portHolder.port;t&&t.postMessage({bridge:1,channelId:this.channelId,kind:`leader.join-url`,joinUrl:e})}disconnect(){this.intentionalDisconnect=!0,this.cleanupHandshake();let e=this.portHolder.port;if(e){try{e.disconnect()}catch{}this.portHolder.port=null}super.disconnect()}handlePortDisconnect(e){if(!(this.portHolder.port!==e&&this.portHolder.port!==null)){if(this.portHolder.port=null,this.rejectWelcome){this.rejectWelcome(Error(`Extension bridge port disconnected before welcome`)),this.cleanupHandshake();return}!this.intentionalDisconnect&&this.state===`connected`&&super.disconnect()}}testReceive(e){this.handleHandshake(e)}handleHandshake(e){if(a(e)){o.warn(`Extension bridge protocol version mismatch — update the older side`,{peerVersion:e.bridge,ourVersion:1}),e.channelId===this.channelId&&this.rejectWelcome&&(this.rejectWelcome(Error(`Extension bridge protocol version mismatch (peer v${e.bridge}, ours v1) — update the older side`)),this.cleanupHandshake());return}if(!i(e))return;let t=e;if(t.channelId===this.channelId){if(t.kind===`handshake.welcome`){this.resolveWelcome?.(),this.cleanupHandshake();return}if(t.kind===`handshake.rejected`){o.warn(`Extension bridge handshake rejected`,{reason:t.reason}),this.rejectWelcome?.(Error(`Extension bridge handshake rejected: ${t.reason}`)),this.cleanupHandshake();return}if(t.kind===`cdp.event`&&t.method===`Target.detachedFromTarget`){this.disconnect();return}t.kind===`extension.lick`&&this.bridgeOpts.onLick?.(t),t.kind===`extension.discovery`&&this.bridgeOpts.onDiscovery?.(t),t.kind===`extension.open-settings`&&this.bridgeOpts.onOpenSettings?.()}}cleanupHandshake(){this.welcomeTimer!==null&&(clearTimeout(this.welcomeTimer),this.welcomeTimer=null),this.resolveWelcome=null,this.rejectWelcome=null}};function u(e,t){return{label:`ExtensionBridgeTransport`,buildCommandEnvelope:(t,n,r,i)=>({bridge:1,channelId:e,kind:`cdp.request`,id:t,method:n,params:r,sessionId:i}),sendEnvelope:async e=>{let n=t.port;if(!n)throw Error(`Extension bridge port not connected`);n.postMessage(e)},subscribeIncoming:e=>{let n=t.port;if(!n)throw Error(`Extension bridge subscribeIncoming called without an open port`);return n.onMessage.addListener(t=>e(t)),()=>{}},parseResponse:t=>{if(!i(t))return null;let n=t;return n.channelId!==e||n.kind!==`cdp.response`?null:{id:n.id,result:n.result,error:n.error}},parseEvent:t=>{if(!i(t))return null;let n=t;if(n.channelId!==e||n.kind!==`cdp.event`)return null;let r=n.sessionId?{...n.params??{},sessionId:n.sessionId}:n.params;return{method:n.method,params:r}},onListenerError:(e,t)=>{o.warn(`Extension bridge listener error`,{event:e,error:t instanceof Error?t.message:String(t)})}}}export{l as ExtensionBridgeTransport};
@@ -1 +0,0 @@
1
- import{t as e}from"./logger-DDBAeTLF.js";import{i as t}from"./src-BStYtmHq.js";import{BrowserAPI as n}from"./cdp-uBLa5oK-.js";import{t as r}from"./synthetic-cdp-transport-CtfKyiws.js";var i=[2,1],a=new Set([`handshake.hello`,`handshake.welcome`,`handshake.version-mismatch`,`cdp.request`,`cdp.response`,`cdp.event`,`permission.request`,`permission.response`,`host.event`,`slicc.event`,`session.export.request`,`session.export.cancel`,`session.export.progress`,`session.export.response`,`session.export.error`]);function o(e,t=[2]){if(typeof e!=`object`||!e)return!1;let n=e;if(typeof n.cherry!=`number`||!t.includes(n.cherry)||typeof n.channelId!=`string`||typeof n.kind!=`string`||!a.has(n.kind))return!1;let r=n.kind;return!(r===`handshake.version-mismatch`&&typeof n.peerVersion!=`number`||(r===`session.export.request`||r===`session.export.cancel`||r===`session.export.progress`||r===`session.export.response`||r===`session.export.error`)&&(typeof n.requestId!=`string`||n.requestId===``||r===`session.export.progress`&&typeof n.phase!=`string`||r===`session.export.response`&&!(n.blob instanceof Blob)||r===`session.export.error`&&typeof n.code!=`string`))}function s(e,t){return!(!t.allowOrigins.includes(e.origin)||t.expectedSource!==null&&e.source!==t.expectedSource||!o(e.data,t.versions)||t.channelId!==null&&e.data.channelId!==t.channelId)}function c(e,t=[2]){if(typeof e!=`object`||!e)return!1;let n=e;return typeof n.cherry==`number`&&!t.includes(n.cherry)&&typeof n.channelId==`string`&&typeof n.kind==`string`}var l=e(`cherry-transport`),u=3e4,d=class extends r{opts;channelId=null;nextId=1;pending=new Map;connectResolve=null;connectReject=null;connectTimer=null;_joinUrl=null;_features={terminal:!0,files:!0,memory:!0,browser:!0,modelPicker:!0,history:!0,nav:!0,newSprinkle:!0,monitor:!0};_theme=null;_layout=null;_effortLevel=null;_flags=null;negotiatedVersion=2;boundHandler=e=>this.handleMessage(e);onHostEvent=null;onExportRequest=null;pendingHostExports=new Map;constructor(e){super({targetUrl:typeof location<`u`?location.href:`about:blank`,targetOrigin:e.targetOrigin,title:`Cherry Host Page`,ids:{target:`cherry-target`,session:`cherry-session`,frame:`cherry-frame`,loader:`cherry-loader`}}),this.opts=e}get hostOrigin(){return this.opts.targetOrigin}getCurrentUrl(){return typeof location<`u`?location.href:super.getCurrentUrl()}get joinUrl(){return this._joinUrl}get features(){return this._features}get theme(){return this._theme}get layout(){return this._layout}get effortLevel(){return this._effortLevel}get flags(){return this._flags}get negotiatedProtocolVersion(){return this.negotiatedVersion}async connect(e){if(this._state!==`disconnected`)throw Error(`Cannot connect: state is ${this._state}`);this._state=`connecting`,this.negotiatedVersion=2,this.channelId=`cherry-${crypto.randomUUID()}`,typeof window<`u`&&window.addEventListener(`message`,this.boundHandler);let t=e?.timeout??u;return new Promise((e,n)=>{this.connectResolve=e,this.connectReject=n,this.connectTimer=setTimeout(()=>{this.connectTimer=null,typeof window<`u`&&window.removeEventListener(`message`,this.boundHandler),this._state=`disconnected`,this.channelId=null,this.connectResolve=null,this.connectReject=null,n(Error(`Cherry handshake timed out after ${t}ms — no handshake.welcome from the embedding page (host SDK missing, not listening, or version-skewed; check the host page's console)`))},t);for(let e of i)this.post({cherry:e,channelId:this.channelId,kind:`handshake.hello`,capabilities:this.opts.capabilities??{navigate:!0,screenshot:!0,openUrl:!0}})})}failPendingConnect(e){if(this.connectReject===null)return;this.connectTimer!==null&&(clearTimeout(this.connectTimer),this.connectTimer=null),typeof window<`u`&&window.removeEventListener(`message`,this.boundHandler),this._state=`disconnected`,this.channelId=null;let t=this.connectReject;this.connectResolve=null,this.connectReject=null,t(e)}disconnect(){this.connectTimer!==null&&(clearTimeout(this.connectTimer),this.connectTimer=null),typeof window<`u`&&window.removeEventListener(`message`,this.boundHandler);for(let[,e]of this.pending)e.reject(Error(`Cherry transport disconnected`));this.pending.clear();for(let[,e]of this.pendingHostExports)e.abort();this.pendingHostExports.clear(),this._state=`disconnected`,this.channelId=null}async forward(e,t,n,r=u){let i=this.nextId++;return new Promise((n,a)=>{let o=setTimeout(()=>{this.pending.delete(i),a(Error(`Cherry CDP timed out after ${r}ms: ${e}`))},r);this.pending.set(i,{resolve:e=>{clearTimeout(o),n(e)},reject:e=>{clearTimeout(o),a(e)}}),this.post({cherry:this.negotiatedVersion,channelId:this.channelId,kind:`cdp.request`,id:i,method:e,params:t})})}testReceive(e){this.handleMessage(e)}emitSliccEventToHost(e,t){if(!this.channelId){l.warn(`Dropping slicc.event before handshake (no channelId yet)`,{name:e});return}this.post({cherry:this.negotiatedVersion,channelId:this.channelId,kind:`slicc.event`,name:e,detail:t})}post(e){this.opts.counterpart.postMessage(e,this.opts.targetOrigin)}handleMessage(e){let t=this._state===`connected`?[this.negotiatedVersion]:i;if(!s(e,{allowOrigins:this.opts.allowOrigins,expectedSource:this.opts.counterpart,channelId:this.channelId,versions:t})){this.diagnoseRejectedMessage(e,t);return}let n=e.data;if(this.negotiatedVersion<2&&n.kind.startsWith(`session.export.`)){l.warn(`Ignoring a v2-only envelope on a v1-negotiated cherry channel`,{kind:n.kind});return}switch(n.kind){case`handshake.welcome`:this.handleWelcome(n);return;case`cdp.response`:{let e=this.pending.get(n.id);if(!e)return;this.pending.delete(n.id),n.error?e.reject(Error(`Cherry CDP error: ${n.error.message} (${n.error.code})`)):e.resolve(n.result??{});return}case`cdp.event`:this.emit(n.method,{...n.params??{},sessionId:n.sessionId??this.syntheticIds.session});return;case`host.event`:this.onHostEvent?.(n.name,n.detail);return;case`session.export.request`:this.handleExportRequest(n);return;case`session.export.cancel`:{let e=this.pendingHostExports.get(n.requestId);e&&(e.abort(),this.pendingHostExports.delete(n.requestId));return}default:return}}diagnoseRejectedMessage(e,t){c(e.data,t)?(l.warn(`Cherry protocol version mismatch — update the older side`,{peerVersion:e.data.cherry,supportedVersions:[...i],origin:e.origin}),e.data.channelId===this.channelId&&this.opts.allowOrigins.includes(e.origin)&&e.source===this.opts.counterpart&&this.failPendingConnect(Error(`Cherry protocol version mismatch (peer v${e.data.cherry}, ours v2) — update the older side`))):o(e.data,i)&&l.warn(`Rejected a cherry envelope (origin/source/channel mismatch)`,{origin:e.origin,allowOrigins:this.opts.allowOrigins})}handleWelcome(e){this.connectTimer!==null&&(clearTimeout(this.connectTimer),this.connectTimer=null),this._state=`connected`,this.negotiatedVersion=e.cherry,this._joinUrl=e.joinUrl??null,this._theme=e.theme??null,this._layout=e.layout??null,this._effortLevel=e.effortLevel??null,this._flags=e.flags??null,this._features=e.features??{terminal:!0,files:!0,memory:!0,browser:!0,modelPicker:!0,history:!0,nav:!0,newSprinkle:!0,monitor:!0},l.info(`Cherry handshake complete`,{channelId:this.channelId,negotiatedVersion:this.negotiatedVersion}),this.connectResolve?.(),this.connectResolve=null,this.connectReject=null}handleExportRequest(e){let{requestId:n,sessionId:r}=e;if(!this.onExportRequest||!this.channelId){this.postExportError(n,`transfer-aborted`);return}let i=new AbortController;this.pendingHostExports.set(n,i);let a=this.channelId;this.onExportRequest(n,r,i.signal,e=>{this.pendingHostExports.has(n)&&this.post({cherry:this.negotiatedVersion,channelId:a,kind:`session.export.progress`,requestId:n,phase:e.phase,...e.processedBytes===void 0?{}:{processedBytes:e.processedBytes},...e.estimatedBytes===void 0?{}:{estimatedBytes:e.estimatedBytes}})}).then(e=>{this.pendingHostExports.delete(n),this.post({cherry:this.negotiatedVersion,channelId:a,kind:`session.export.response`,requestId:n,blob:e})}).catch(e=>{this.pendingHostExports.delete(n);let r=e?.code,i=typeof r==`string`&&t.has(r)?r:`transfer-corrupt`;this.postExportError(n,i)})}postExportError(e,t){this.channelId&&this.post({cherry:this.negotiatedVersion,channelId:this.channelId,kind:`session.export.error`,requestId:e,code:t})}},f=e(`cherry-boot`);function p(){let e=location.ancestorOrigins;if(e&&e.length>0){let t=e[0];if(t&&t!==`null`)return t}if(document.referrer)try{return new URL(document.referrer).origin}catch{}return location.origin}async function m(){let e=p(),t=[e],r=e,i=new d({counterpart:window.parent,allowOrigins:t,targetOrigin:r});await i.connect(),f.info(`Cherry transport connected`);let a=i.joinUrl;if(!a)throw Error(`cherry boot: no joinUrl from handshake`);return{transport:i,browser:new n(i),joinUrl:a}}export{m as setupCherryFollower};
@@ -1 +0,0 @@
1
- import{t as e}from"./store-D9br9UAd.js";export{e as readMcpAuthEntries};
@@ -1 +0,0 @@
1
- import{r as e}from"./tray-sync-protocol-D9BQVq93.js";var t=class{sender;timeoutMs;pending=new Map;eventListeners=new Map;chunkBuffers=new Map;_state=`connected`;requestCounter=0;constructor(e,t=3e4){this.sender=e,this.timeoutMs=t}get state(){return this._state}async connect(){}disconnect(){this._state=`disconnected`;for(let[,{reject:e,timer:t}]of this.pending)clearTimeout(t),e(Error(`Transport disconnected`));this.pending.clear()}async send(e,t,n,r){if(this._state===`disconnected`)throw Error(`Transport disconnected`);let i=`remote-${++this.requestCounter}-${Date.now()}`,a=r??this.timeoutMs;return new Promise((r,o)=>{let s=setTimeout(()=>{this.pending.delete(i),o(Error(`Remote CDP request timed out after ${a}ms: ${e}`))},a);this.pending.set(i,{resolve:r,reject:o,timer:s}),this.sender.sendCDPRequest(i,e,t,n)})}on(e,t){let n=this.eventListeners.get(e);n||(n=new Set,this.eventListeners.set(e,n)),n.add(t)}off(e,t){this.eventListeners.get(e)?.delete(t)}once(e,t){return new Promise((n,r)=>{let i=t??this.timeoutMs,a=setTimeout(()=>{this.off(e,o),r(Error(`Remote CDP event timed out: ${e}`))},i),o=t=>{clearTimeout(a),this.off(e,o),n(t)};this.on(e,o)})}handleResponse(t,n,r,i,a,o){let s=this.pending.get(t);if(!s)return;let c=e(this.chunkBuffers,{type:`cdp.response`,requestId:t,result:n,error:r,chunkData:i,chunkIndex:a,totalChunks:o});c&&(this.pending.delete(t),clearTimeout(s.timer),c.error?s.reject(Error(c.error)):s.resolve(c.result??{}))}handleEvent(e,t){let n=this.eventListeners.get(e);if(n)for(let e of n)e(t)}};export{t};
@@ -1,2 +0,0 @@
1
- const __vite__mapDeps=(i,m=__vite__mapDeps,d=(m.f||(m.f=["assets/extension-bridge-transport-CikuxrQ4.js","assets/logger-DDBAeTLF.js","assets/lick-ws-bridge-CCkYp7oZ.js","assets/runtime-mode-B91km6KC.js","assets/src-BStYtmHq.js","assets/electron-overlay-route-CjT6k9Df.js","assets/messages-BD4p8GuF.js","assets/tray-runtime-config-BxjVzwAJ.js","assets/proxied-fetch-A48etSCh.js","assets/rolldown-runtime-aKtaBQYM.js","assets/preload-helper-Czpn1I53.js","assets/base64-DpPqYZJF.js","assets/runtime-env-DH4NDw4t.js","assets/fetch-body-D2PwksUW.js","assets/tray-leader-Btq_ccHy.js","assets/db-ysOO0kLr.js","assets/cdp-uBLa5oK-.js","assets/navigation-watcher-murqPsVd.js","assets/handoff-link-Da4o0fy_.js","assets/remote-cdp-transport-BS_0BClw.js","assets/tray-sync-protocol-D9BQVq93.js","assets/main-cherry-TVUoY5cD.js","assets/synthetic-cdp-transport-CtfKyiws.js"])))=>i.map(i=>d[i]);
2
- import{t as e}from"./preload-helper-Czpn1I53.js";import{t}from"./logger-DDBAeTLF.js";import{c as n,l as r,s as i}from"./proxied-fetch-A48etSCh.js";import{t as a}from"./runtime-env-DH4NDw4t.js";import{t as o}from"./bridge-launch-params-BUV5qlt9.js";import"./messages-BD4p8GuF.js";import{d as s,s as c,t as l}from"./tray-runtime-config-BxjVzwAJ.js";import{n as u}from"./runtime-mode-B91km6KC.js";import{t as d}from"./setup-sudo-Bw-BnLie.js";t(`stale-asset`);var f=`slicc-stale-asset-reload`;function p(e,t){if(typeof BroadcastChannel!=`function`)return()=>{};let n=new BroadcastChannel(f),r=n=>{let r=n.data;r?.type!==`stale-asset-reload`||r.instanceId!==e||t(r.replayTurn===!0)};return n.addEventListener(`message`,r),()=>{n.removeEventListener(`message`,r),n.close()}}var m=`slicc:stale-asset-reloaded-at`,h=6e4,g=`slicc:stale-asset-replay`;function _(e=window.sessionStorage){try{e.setItem(g,`1`)}catch{}}function v(e=window.sessionStorage){try{return e.getItem(g)===`1`?(e.removeItem(g),!0):!1}catch{return!1}}function y(){return{reload:()=>window.location.reload(),storage:window.sessionStorage,now:()=>Date.now(),windowMs:h,storageKey:m}}function b(e,t,n){return e===null||t-e>=n}function x(e=y()){let t;try{t=e.storage.getItem(e.storageKey)}catch{return!1}let n=t===null?null:Number(t),r=n!==null&&Number.isFinite(n)?n:null,i=e.now();if(!b(r,i,e.windowMs))return!1;try{e.storage.setItem(e.storageKey,String(i))}catch{return!1}return e.reload(),!0}var S=null,C=null;function w(e){S||(C={...y(),...e},S=e=>{x(C)&&e.preventDefault()},window.addEventListener(`vite:preloadError`,S))}var T=null;function E(e){return T||(T=p(e,e=>{e&&_(),x(C??void 0)}),T)}var D=`slicc-cdp-superseded-banner`;function O(e){if(e.getElementById(D))return;let t=e.createElement(`div`);t.id=D,t.setAttribute(`role`,`alert`),t.textContent=`Another SLICC tab or window has taken control of this browser instance. Only one tab can drive the browser per instance — close the other tabs, then reload this page to resume.`,t.style.cssText=[`position:fixed`,`top:0`,`left:0`,`right:0`,`z-index:2147483647`,`padding:10px 16px`,`background:#b3261e`,`color:#fff`,`font:13px/1.4 system-ui,sans-serif`,`text-align:center`,`box-shadow:0 1px 4px rgba(0,0,0,0.3)`].join(`;`),e.body.appendChild(t)}function k(){return typeof crypto<`u`&&typeof crypto.randomUUID==`function`?crypto.randomUUID():`slicc-${Date.now().toString(36)}-${Math.random().toString(36).slice(2,10)}`}function A(e){let t;try{t=new URLSearchParams(e)}catch{return null}if(t.get(`slicc`)!==`leader`)return null;let n=t.get(`ext`);return n?{extensionId:n}:null}var j=[100,200,400,800,1600];async function M(e,t,n,r=j,i=e=>new Promise(t=>setTimeout(t,e))){let a=r.length+1,o=null;for(let s=0;s<a;s++)try{await e.connect(t),s>0&&n.info(`CDP bridge connect succeeded after retry`,{attempt:s+1});return}catch(e){o=e,s<r.length&&await i(r[s]??0)}n.warn(`Initial CDP connect failed after retries; worker-forwarded commands will retry on demand`,o instanceof Error?o.message:String(o))}async function N(t,n,r){let{ExtensionBridgeTransport:i}=await e(async()=>{let{ExtensionBridgeTransport:e}=await import(`./extension-bridge-transport-CikuxrQ4.js`);return{ExtensionBridgeTransport:e}},__vite__mapDeps([0,1])),{mapDiscoveryPayloadToLickEvent:a,mapNavigatePayloadToLickEvent:o}=await e(async()=>{let{mapDiscoveryPayloadToLickEvent:e,mapNavigatePayloadToLickEvent:t}=await import(`./lick-ws-bridge-CCkYp7oZ.js`);return{mapDiscoveryPayloadToLickEvent:e,mapNavigatePayloadToLickEvent:t}},__vite__mapDeps([2,1,3,4,5,6,7,8,9,10,11,12,13,14,15])),s=null,c=[],l=!1,u=e=>{s=e;for(let t of c)e.sendForwardedLick(t);c.length=0},d=e=>{if(e){if(s){s.sendForwardedLick(e);return}c.length>=50&&(c.shift(),l||(l=!0,r.warn(`extension-bridge lick buffer overflow (cap 50); dropping oldest pending licks until the kernel client attaches`))),c.push(e)}},f=new t(new i({extensionId:n,onLick:e=>{d(o(e))},onDiscovery:e=>{d(a(e))},onOpenSettings:()=>{globalThis.dispatchEvent(new CustomEvent(`slicc:open-settings-from-panel`))}}));return await M(f,void 0,r),{browser:f,attachLickForwardingClient:u}}async function P(t){let{runtimeMode:f,envBaseUrl:p,window:m,log:h}=t,g=f===`electron-overlay`;h.info(`setting up standalone page runtime (BrowserAPI + CDP)`,{runtimeMode:f});let{BrowserAPI:_}=await e(async()=>{let{BrowserAPI:e}=await import(`./cdp-uBLa5oK-.js`);return{BrowserAPI:e}},__vite__mapDeps([16,1,17,18,4,19,20,9]));await d({log:h});let v,y,b,x=null,S=null,C=null,w=null,T,E=f===`cherry`?null:A(m.location.search),D=!!E&&a(),j=f===`cherry`||D?null:o(m.location.search);j?.apiBaseUrl&&(x=j.apiBaseUrl,r(j.apiBaseUrl),S=j.token,i(j.token)),j?.lickWsUrl&&(C=j.lickWsUrl);let P=f===`cherry`||D||j!==null,F=await c(),I=u(f,F!==null)?l:null;if(await s({locationHref:m.location.href,storage:m.localStorage,envBaseUrl:p,defaultWorkerBaseUrl:I,runtimeConfigFetcher:async()=>F}),f===`cherry`){let{setupCherryFollower:t}=await e(async()=>{let{setupCherryFollower:e}=await import(`./main-cherry-TVUoY5cD.js`);return{setupCherryFollower:e}},__vite__mapDeps([21,1,4,16,17,18,19,20,9,22])),n=await t();v=n.browser,y=n.joinUrl,b=n.transport}else if(E&&a()){h.info(`Routing CDP through the extension bridge (leader tab)`);let e=await N(_,E.extensionId,h);v=e.browser,T=e.attachLickForwardingClient,w=E.extensionId,n(E.extensionId)}else{v=new _,j&&h.info(`Routing CDP through local standalone bridge`,{url:j.url,role:j.role??`(unset)`});let e=j?{url:j.url,protocols:j.subprotocol}:void 0;j?.role===`follower`?(h.info(`Skipping CDP connect for follower overlay tab`),v.primeConnectOptions(e)):(await M(v,e,h),v.setCdpSupersededHandler(()=>O(m.document)))}let L=v.getTransport();return globalThis.__slicc_browser=v,{browser:v,realCdpTransport:L,hasLocalCdpSurface:P,cherryJoinUrl:y,cherryTransport:b,instanceId:k(),isElectronOverlay:g,localApiBaseUrl:x,bridgeToken:S,localLickWsUrl:C,extensionDelegateId:w,attachLickForwardingClient:T}}export{E as a,x as i,P as n,w as o,v as r,A as t};
@@ -1 +0,0 @@
1
- var e={target:`cherry-target`,session:`cherry-session`,frame:`cherry-frame`,loader:`cherry-loader`},t=3e4,n=class{currentUrl;targetOrigin;title;syntheticIds;_state=`disconnected`;listeners=new Map;runtimeEnabled=!1;nextExecutionContextId=1;constructor(t){this.currentUrl=t.targetUrl,this.targetOrigin=t.targetOrigin,this.title=t.title,this.syntheticIds=t.ids??e}get state(){return this._state}getCurrentUrl(){return this.currentUrl}onCloseTarget(){}async send(e,n,r,i=t){if(this._state!==`connected`)throw Error(`Transport is not connected`);let a=this.handleSynthetic(e,n);if(a)return a;let o=await this.forward(e,n,r,i);return e===`Page.navigate`&&this.synthesizeNavigationLifecycle(o,n?.url),o}on(e,t){let n=this.listeners.get(e);n||(n=new Set,this.listeners.set(e,n)),n.add(t)}off(e,t){let n=this.listeners.get(e);n&&(n.delete(t),n.size===0&&this.listeners.delete(e))}once(e,n=t){return new Promise((t,r)=>{let i=setTimeout(()=>{this.off(e,a),r(Error(`Timed out waiting for event: ${e}`))},n),a=n=>{clearTimeout(i),this.off(e,a),t(n)};this.on(e,a)})}emit(e,t){let n=this.listeners.get(e);if(n)for(let e of n)try{e(t)}catch{}}handleSynthetic(e,t){switch(e){case`Target.getTargets`:return Promise.resolve({targetInfos:[{targetId:this.syntheticIds.target,type:`page`,title:this.title,url:this.getCurrentUrl(),attached:!0}]});case`Target.attachToTarget`:return this.runtimeEnabled=!1,Promise.resolve({sessionId:this.syntheticIds.session});case`Target.detachFromTarget`:return this.runtimeEnabled=!1,Promise.resolve({success:!0});case`Target.closeTarget`:return this.runtimeEnabled=!1,this.onCloseTarget(),Promise.resolve({success:!0});case`Page.enable`:case`DOM.enable`:case`Page.bringToFront`:return Promise.resolve({});case`Runtime.enable`:return this.runtimeEnabled||(this.runtimeEnabled=!0,this.emitMainWorldContextCreated()),Promise.resolve({});case`Runtime.disable`:return this.runtimeEnabled=!1,Promise.resolve({});case`Page.getFrameTree`:return Promise.resolve({frameTree:{frame:{id:this.syntheticIds.frame,loaderId:this.syntheticIds.loader,url:this.getCurrentUrl(),securityOrigin:this.targetOrigin,mimeType:`text/html`},childFrames:[]}});case`Page.createIsolatedWorld`:return Promise.resolve({executionContextId:1});default:return null}}synthesizeNavigationLifecycle(e,t){let n=e.frameId??this.syntheticIds.frame,r=t??this.getCurrentUrl();t&&(this.currentUrl=t),this.runtimeEnabled&&this.emit(`Runtime.executionContextsCleared`,{sessionId:this.syntheticIds.session}),this.emit(`Page.frameNavigated`,{frame:{id:n,loaderId:this.syntheticIds.loader,url:r,securityOrigin:this.targetOrigin,mimeType:`text/html`},sessionId:this.syntheticIds.session}),this.runtimeEnabled&&this.emitMainWorldContextCreated(),this.emit(`Page.loadEventFired`,{timestamp:Date.now()/1e3,sessionId:this.syntheticIds.session})}emitMainWorldContextCreated(){this.emit(`Runtime.executionContextCreated`,{context:{id:this.nextExecutionContextId++,origin:this.targetOrigin,name:``,auxData:{isDefault:!0,type:`default`,frameId:this.syntheticIds.frame}},sessionId:this.syntheticIds.session})}};export{n as t};
@@ -1,2 +0,0 @@
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-Dp877dzv.js","assets/account-store-CRyeHVEi.js","assets/preload-helper-Czpn1I53.js","assets/compat-BhgG-Qr-.js","assets/models-DmWu8BeM.js","assets/diagnostics-DN_idNHx.js","assets/provider-env-D37PhSJu.js","assets/__vite-browser-external-SwrSgYTf.js","assets/openrouter.models-C8HitxAG.js","assets/context-compaction-gzCxn8vG.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-DGNJXZGp.js","assets/bedrock-camp-CVX95quY.js","assets/transform-messages-DgR3h-Ck.js","assets/provider-settings-Cm08l4Dh.js","assets/tray-runtime-config-BxjVzwAJ.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-Btq_ccHy.js","assets/db-ysOO0kLr.js","assets/tray-sync-protocol-D9BQVq93.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-BMhxbTGC.js","assets/legacy-styles-DcRu2WCJ.js","assets/tray-leave-runtime-DyiGVnUI.js"])))=>i.map(i=>d[i]);
2
- import{C as e,F as t,P as n,W as r,d as i,f as a,z as o}from"./account-store-CRyeHVEi.js";import{t as s}from"./preload-helper-Czpn1I53.js";import{n as c}from"./attachments-CByeG2Ru.js";import{t as l}from"./logger-DDBAeTLF.js";import{n as u,t as d}from"./base64-DpPqYZJF.js";import{r as f}from"./src-BStYtmHq.js";import{a as p,l as m,n as h,o as g,r as _,u as v}from"./tray-sync-protocol-D9BQVq93.js";import{o as y,t as b}from"./proxied-fetch-A48etSCh.js";import{a as ee,i as x,p as te,r as S}from"./tray-runtime-config-BxjVzwAJ.js";import{r as ne}from"./panel-rpc-DmJSNs0I.js";import{n as re,o as ie,t as C}from"./tray-follower-status-5SqDRLX8.js";import"./provider-settings-Cm08l4Dh.js";import"./handoff-link-Da4o0fy_.js";import{t as ae}from"./remote-cdp-transport-BS_0BClw.js";import{n as w}from"./path-utils-DU6QhF_k.js";import{t as oe}from"./terminal-session-client-BZLoutc3.js";import{i as se,n as T,t as ce}from"./tray-leader-Btq_ccHy.js";import{t as le}from"./synthetic-cdp-transport-CtfKyiws.js";import{a as ue,d as E,f as D,l as de,o as fe,s as pe,t as me,u as O}from"./wc-follower-model-surface-DJRncbD2.js";import{a as he,c as ge,i as k,l as A,n as _e,o as ve,r as ye,s as j,t as M,u as N}from"./wc-tray-scoops-BlHt9xWh.js";var P=l(`tab-persistence-guard`),be=`slicc-tray-leader-active`,xe=class{options;active=!1;audioCtx=null;oscillator=null;lockController=null;beforeUnloadHandler=null;constructor(e={}){this.options=e}activate(){this.active||(this.active=!0,this.startSilentAudio(),this.acquireWebLock(),this.installBeforeUnload(),P.info(`Tab persistence guard activated`))}deactivate(){this.active&&(this.active=!1,this.stopSilentAudio(),this.releaseWebLock(),this.removeBeforeUnload(),P.info(`Tab persistence guard deactivated`))}isActive(){return this.active}startSilentAudio(){try{let e=(this.options.audioContextFactory??(()=>{let e=typeof globalThis<`u`?globalThis.AudioContext??globalThis.webkitAudioContext:void 0;return e?new e:null}))();if(!e){P.warn(`AudioContext unavailable — discard prevention via silent audio disabled`);return}e.resume?.().catch(()=>{});let t=e.createOscillator(),n=e.createGain();n.gain.value=0,t.connect(n),n.connect(e.destination),t.start(),this.audioCtx=e,this.oscillator=t}catch(e){P.warn(`Failed to start silent audio guard`,{error:e instanceof Error?e.message:String(e)})}}stopSilentAudio(){try{this.oscillator?.stop()}catch{}this.oscillator=null,this.audioCtx&&=(this.audioCtx.close?.().catch(()=>{}),null)}acquireWebLock(){try{let e=this.options.lockManager??(typeof navigator<`u`&&`locks`in navigator?navigator.locks:null);if(!e){P.warn(`navigator.locks unavailable — discard prevention via Web Lock disabled`);return}let t=new AbortController;this.lockController=t,e.request(be,{mode:`exclusive`,signal:t.signal},()=>new Promise(e=>{if(t.signal.aborted){e();return}let n=()=>{t.signal.removeEventListener(`abort`,n),e()};t.signal.addEventListener(`abort`,n,{once:!0})})).catch(e=>{e?.name!==`AbortError`&&P.warn(`Web Lock request rejected`,{error:e instanceof Error?e.message:String(e)})})}catch(e){P.warn(`Failed to acquire Web Lock`,{error:e instanceof Error?e.message:String(e)})}}releaseWebLock(){try{this.lockController?.abort()}catch{}this.lockController=null}installBeforeUnload(){try{let e=this.options.windowRef??(typeof window<`u`?window:null);if(!e)return;let t=()=>{};e.addEventListener(`beforeunload`,t),this.beforeUnloadHandler=t}catch{}}removeBeforeUnload(){try{let e=this.options.windowRef??(typeof window<`u`?window:null);e&&this.beforeUnloadHandler&&e.removeEventListener(`beforeunload`,this.beforeUnloadHandler)}catch{}this.beforeUnloadHandler=null}};function Se(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 Ce(){try{let e=i().filter(e=>!e.loggedOut),t=[`adobe`,`github`].map(t=>e.find(e=>e.providerId===t)).find(Boolean)??e[0],n=t?Se(t):null;if(!n)return`00000000`;let r=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(n));return Array.from(new Uint8Array(r,0,4),e=>e.toString(16).padStart(2,`0`)).join(``)}catch{return`00000000`}}function F(e,t){let n=e()?.currentLeaderSync;if(!n)throw Error(`serve ${t}: no active leader tray`);return n}function we(e,t){return{lifecycleRecords:[...e.getPreviewLifecycleRecords(t)]}}function Te(e,t){return{cleared:e.clearPreviewLifecycleRecords(t),rearmed:e.rearmPreviewAnnouncements(t)}}async function Ee(e){let{instanceId:t,browser:n,remoteCdpBridge:r,remoteCdpPushChannel:i,getLeader:a,performTrayLeaveLocally:o,window:c}=e,{installPanelRpcHandler:l,createPanelRpcEventEmitter:u}=await s(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 s(async()=>{let{createStandalonePanelRpcHandlers:e}=await import(`./panel-rpc-handlers-Dp877dzv.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 s(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=a();if(!e)throw Error(`no active tray session to reset`);return await e.reset()},leaveTray:async({workerBaseUrl:e,requestId:t})=>await o({workerBaseUrl:e,requestId:t}),joinTray:({joinUrl:e})=>(te(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)=>a()?.sync.emitCherrySliccEvent(e,t,n)??!1,execOnRemote:async({runtimeId:e,command:t,cwd:n,env:r,execToken:i,timeoutMs:o})=>{let s=a()?.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:o})}finally{m.delete(i)}},signalRemoteExec:({execToken:e})=>{m.get(e)?.abort()},mintPreview:async e=>{let t=a()?.currentLeaderSync;if(!t)throw Error(`serve: no active leader tray; cannot mint preview`);let{getLeaderTrayRuntimeStatus:n}=await s(async()=>{let{getLeaderTrayRuntimeStatus:e}=await import(`./tray-leader-Btq_ccHy.js`).then(e=>e.a);return{getLeaderTrayRuntimeStatus:e}},__vite__mapDeps([38,1,12,14,4,15,13,16,17,27,28,39])),r=n().session;if(!r)throw Error(`serve: leader tray has no active session`);let i=new URL(r.controllerUrl).pathname.split(`/`).pop()??``,{CHERRY_RUNTIME_TAG:o}=await s(async()=>{let{CHERRY_RUNTIME_TAG:e}=await import(`./tray-sync-protocol-D9BQVq93.js`).then(e=>e.s);return{CHERRY_RUNTIME_TAG:e}},__vite__mapDeps([40,1,12,13])),{mintPreviewViaWorker:c}=await s(async()=>{let{mintPreviewViaWorker:e}=await import(`./preview-mint-client-CF-bFBqv.js`);return{mintPreviewViaWorker:e}},[]),l=t.getConnectedFollowers().some(e=>e.runtime===o),u=!e.noBridge&&(e.bridge||l),d=!e.noBridge&&e.bridge,f=await Ce(),{url:p,previewToken:m}=await c({workerBaseUrl:r.workerBaseUrl,trayId:r.trayId,controllerToken:i,servedRoot:e.servedRoot,entryPath:e.entryPath,allowLive:u,bridge:d,maxTabs:e.maxTabs,webhookId:e.webhookId,userHash:f,quiet:e.quiet??!1,ttlMs:e.ttlMs,snapshotFiles:e.snapshotFiles}),h=e.entryPath?e.entryPath.split(`/`).pop()??`Preview`:`Preview`;return t.registerMintedPreview(m,{url:p,title:h,quiet:e.quiet??!1}),t.broadcastPreviewOpen(p),{url:p,pushed:t.getConnectedFollowers().length,previewToken:m}},revokePreview:async({previewToken:e})=>{let t=a()?.currentLeaderSync;if(!t)throw Error(`serve --stop: no active leader tray; cannot revoke preview`);let{getLeaderTrayRuntimeStatus:n}=await s(async()=>{let{getLeaderTrayRuntimeStatus:e}=await import(`./tray-leader-Btq_ccHy.js`).then(e=>e.a);return{getLeaderTrayRuntimeStatus:e}},__vite__mapDeps([38,1,12,14,4,15,13,16,17,27,28,39])),r=n().session;if(!r)throw Error(`serve --stop: leader tray has no active session`);let i=new URL(r.controllerUrl).pathname.split(`/`).pop()??``,{revokePreviewViaWorker:o}=await s(async()=>{let{revokePreviewViaWorker:e}=await import(`./preview-mint-client-CF-bFBqv.js`);return{revokePreviewViaWorker:e}},[]),c=await o({workerBaseUrl:r.workerBaseUrl,trayId:r.trayId,controllerToken:i,previewToken:e});return t.dropMintedPreview(e),c},listPreviews:async()=>{let{getLeaderTrayRuntimeStatus:e}=await s(async()=>{let{getLeaderTrayRuntimeStatus:e}=await import(`./tray-leader-Btq_ccHy.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:r}=await s(async()=>{let{listPreviewsViaWorker:e}=await import(`./preview-mint-client-CF-bFBqv.js`);return{listPreviewsViaWorker:e}},[]);return await r({workerBaseUrl:t.workerBaseUrl,trayId:t.trayId,controllerToken:n})},getPreviewLifecycleRecords:e=>we(F(a,`--logs`),e),truncatePreviewLifecycleRecords:e=>Te(F(a,`--truncate`),e),listRemoteTargets:()=>n.listAllTargets(),remoteCdp:r,getPermissionsSurface:()=>f()})});c.addEventListener(`beforeunload`,()=>{h(),p.dispose(),r.disposeAll(),i?.close()},{once:!0})}async function De(e){let{log:t}=e;await new Promise(e=>setTimeout(e,5e3));try{let e=await fetch(y(`/api/hosted-bootstrap`),{signal:AbortSignal.timeout(1e4),headers:b()});if(!e.ok)return;let r=await e.json(),i=r.accounts??(r.adobeImsToken?[{providerId:`adobe`,kind:`oauth`,accessToken:r.adobeImsToken}]:[]);r.model?localStorage.setItem(`selected-model`,r.model):localStorage.getItem(`selected-model`)||localStorage.setItem(`selected-model`,`adobe:claude-opus-4-6`),r.effortLevel?localStorage.setItem(`slicc_locked_effort_level`,r.effortLevel):localStorage.removeItem(`slicc_locked_effort_level`);let[{applyHostedAccounts:a,prewarmHostedModels:c},l]=await Promise.all([s(()=>import(`./hosted-config-apply-uAym2aS5.js`),__vite__mapDeps([41,12])),s(()=>import(`./provider-settings-Cm08l4Dh.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(i,{getRefreshModels:e=>l.getProviderConfig(e).refreshModels});let u=JSON.parse(localStorage.getItem(`slicc_cloud_managed`)??`[]`);await a(i,{saveOAuthAccount:o,addAccount:l.addAccount,removeAccount:n,currentProviderIds:()=>l.getAccounts().map(e=>e.providerId),previouslyManaged:()=>u}),localStorage.setItem(`slicc_cloud_managed`,JSON.stringify(i.map(e=>e.providerId))),t.info(`hosted-leader: cone config applied`,{count:i.length})}catch(e){t.warn(`hosted-leader: bootstrap fetch failed; provider needs manual login`,{error:e instanceof Error?e.message:String(e)})}}var Oe=0,ke=class{client;sessions=new Map;constructor(e){this.client=e}async run(e){let t=this.getOrCreate(e);if(t.running)return{exitCode:1,error:`another terminal command is already running`};t.running=!0,t.onChunk=e.onChunk;let n=()=>t.session.signal(`SIGINT`);try{return await t.opened,e.signal.addEventListener(`abort`,n,{once:!0}),e.signal.aborted?{exitCode:130}:{exitCode:(await t.session.exec(e.command,{cwd:e.cwd,env:e.env,discardCapturedOutput:!0})).exitCode}}catch(t){return this.close(e.sessionId),{exitCode:1,error:t instanceof Error?t.message:String(t)}}finally{e.signal.removeEventListener(`abort`,n),t.onChunk=void 0,t.running=!1}}close(e){let t=this.sessions.get(e);t&&(this.sessions.delete(e),t.session.close(),t.session.dispose())}getOrCreate(e){let t=this.sessions.get(e.sessionId);if(t)return t;let n=`follower-exec-${++Oe}-${Date.now()}`,r={};return r.session=new oe({client:this.client,sid:n,onEvent:e=>{e.type===`terminal-output`&&r.onChunk?.(e.stream,e.data)}}),r.opened=r.session.open({cwd:e.cwd,env:e.env}),r.running=!1,this.sessions.set(e.sessionId,r),r}};function I(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 Ae=64*1024;async function je(e,t,n){let{reqId:r,servedRoot:i,asText:a}=e,o=e.vfsPath;if(!I(o,i)){t.send({type:`preview.response`,reqId:r,ok:!1,status:403});return}try{if((await n.stat(o)).type===`directory`&&(o=o.replace(/\/?$/,`/`)+`index.html`,!I(o,i))){t.send({type:`preview.response`,reqId:r,ok:!1,status:403});return}}catch{}let s,c;try{a?(s=await n.readFile(o,{encoding:`utf-8`}),c=`utf-8`):(s=u(await n.readFile(o,{encoding:`binary`})),c=`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 l=Ne(o),d=Me(s,Ae);for(let e=0;e<d.length;e++)t.send({type:`preview.response`,reqId:r,ok:!0,mime:l,chunkIndex:e,totalChunks:d.length,content:d[e],encoding:c})}function Me(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 Ne(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 L=32*1024,R=`[content too large to sync — view on leader]`;function Pe(e){switch(e.type){case`tool_result`:return{...e,result:R};case`tool_use_start`:return{...e,toolInput:{note:R}};case`tool_ui`:return{...e,html:`<p>${R}</p>`};case`content_delta`:return{...e,text:R};case`terminal_output`:return{...e,text:R};case`screenshot`:return{type:`error`,error:`Screenshot ${R}`};default:return null}}var Fe=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=Pe(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?c(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,scoopJid:this.context.options.getScoopJid()})}async sendSnapshotToFollower(e,t){let n=this.context.followers.followers.get(e);if(!n)return;let{options:r}=this.context,i=r.getScoopJid(),a=t??n.selectedScoopJid??i;try{let e=r.getScoops?.();e&&!e.some(e=>e.jid===a)&&(a=i)}catch(e){this.context.log.warn(`getScoops failed while validating snapshot target`,{targetJid:a,error:e instanceof Error?e.message:String(e)})}let o;if(r.getMessagesForScoop&&a!==i)try{o=await Promise.resolve(r.getMessagesForScoop(a))}catch(e){this.context.log.warn(`getMessagesForScoop failed, falling back to active scoop`,{targetJid:a,error:e instanceof Error?e.message:String(e)}),a=i,o=r.getMessages()}else o=r.getMessages();n.selectedScoopJid=a,g(n.sync,o,a),this.context.log.debug(`Snapshot sent to follower`,{bootstrapId:e,messageCount:o.length,scoopJid:a})}broadcastSnapshot(){if(this.context.followers.followers.size!==0)for(let e of this.context.followers.followers.keys())this.sendSnapshotToFollower(e)}sendModelCatalogToFollower(e){let t=this.context.followers.followers.get(e);if(!t)return;let n=this.buildModelCatalog();n&&(t.sync.send({type:`models.list`,models:n}),this.sendModelStateToFollower(e))}broadcastModelCatalog(){if(this.context.followers.followers.size===0)return;let e=this.buildModelCatalog();if(e){for(let t of this.context.followers.followers.values())t.sync.send({type:`models.list`,models:e});this.broadcastModelState()}}broadcastModelState(){if(this.context.followers.followers.size!==0)for(let e of this.context.followers.followers.keys())this.sendModelStateToFollower(e)}sendModelStateToFollower(e){let t=this.context.followers.followers.get(e),n=this.context.options.getModelSelectionState;if(!t||!n)return;let r=t.selectedScoopJid??this.context.options.getScoopJid();try{t.sync.send({type:`model.state`,state:n(r)})}catch(t){this.context.log.warn(`Failed to compute model selection state`,{bootstrapId:e,scoopJid:r,error:t instanceof Error?t.message:String(t)})}}buildModelCatalog(){let e=this.context.options.getModelCatalog;if(!e)return null;try{return e().map(e=>({providerName:e.providerName,modelId:e.modelId,modelName:e.modelName,reasoning:e.reasoning===!0}))}catch(e){return this.context.log.warn(`Failed to compute model catalog`,{error:e instanceof Error?e.message:String(e)}),null}}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/L);for(let e=0;e<o;e++)r.sync.send({type:`sprinkle.content`,requestId:t,sprinkleName:n,content:a.slice(e*L,(e+1)*L),chunkIndex:e,totalChunks:o})}broadcast(e){this.context.followers.broadcastToAllFollowers(e)}},Ie=150,Le=class{context;options;pendingCDPRoutes=new Map;cdpChunkBuffers=new Map;remoteTransports=new Map;previewOriginalTarget=null;previewLastTargetId=null;previewGeneration=0;previewSequence=0;previewLatestSuccessfulSequence=0;previewRequestsInFlight=0;previewRestoreTimer=null;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 a=n===`Page.bringToFront`?await this.executeFollowerBringToFront(s,t,r,i):await s.send(n,r,i);p(o.sync,e,a)}catch(t){o.sync.send({type:`cdp.response`,requestId:e,error:t instanceof Error?t.message:String(t)})}}async executeFollowerBringToFront(e,t,n,r){let i=this.previewGeneration,a=++this.previewSequence;this.previewRequestsInFlight++,this.cancelPreviewRestore(),this.previewOriginalTarget??=this.findFocusedTargetId(e,t,r);try{await this.previewOriginalTarget;let o=await e.send(`Page.bringToFront`,n,r);return i===this.previewGeneration&&a>this.previewLatestSuccessfulSequence&&(this.previewLatestSuccessfulSequence=a,this.previewLastTargetId=t),o}finally{i===this.previewGeneration&&(this.previewRequestsInFlight--,this.previewRequestsInFlight===0&&this.previewLastTargetId===null?(this.previewOriginalTarget=null,this.previewLatestSuccessfulSequence=0):this.schedulePreviewRestore(e))}}resetPreviewFocus(){this.cancelPreviewRestore(),this.previewGeneration++,this.previewOriginalTarget=null,this.previewLastTargetId=null,this.previewLatestSuccessfulSequence=0,this.previewRequestsInFlight=0}cancelPreviewRestore(){this.previewRestoreTimer!==null&&(clearTimeout(this.previewRestoreTimer),this.previewRestoreTimer=null)}schedulePreviewRestore(e){this.previewRequestsInFlight!==0||this.previewLastTargetId===null||(this.cancelPreviewRestore(),this.previewRestoreTimer=setTimeout(()=>{this.previewRestoreTimer=null,this.restorePreviewFocus(e)},Ie))}async restorePreviewFocus(e){let t=this.previewLatestSuccessfulSequence,n=await this.previewOriginalTarget,r=this.previewLastTargetId;if(!n||!r||n===r){this.finishPreviewBurst(t);return}let i=await this.findFocusedTargetId(e);if(!this.previewRestoreIsCurrent(t)){this.schedulePreviewRestore(e);return}if(i!==r){this.finishPreviewBurst(t);return}try{await this.bringTargetToFront(e,n,t)}catch(e){this.context.log.debug(`Follower preview focus restore skipped`,{targetId:n,error:e instanceof Error?e.message:String(e)})}this.finishPreviewBurst(t)}previewRestoreIsCurrent(e){return e===this.previewLatestSuccessfulSequence&&this.previewRequestsInFlight===0}finishPreviewBurst(e){this.previewRestoreIsCurrent(e)&&(this.cancelPreviewRestore(),this.previewOriginalTarget=null,this.previewLastTargetId=null,this.previewLatestSuccessfulSequence=0)}async bringTargetToFront(e,t,n){let r=(await e.send(`Target.attachToTarget`,{targetId:t,flatten:!0})).sessionId;if(typeof r==`string`)try{if(!this.previewRestoreIsCurrent(n))return;await e.send(`Page.bringToFront`,{},r)}finally{try{await e.send(`Target.detachFromTarget`,{sessionId:r})}catch{}}}async findFocusedTargetId(e,t,n){let r;try{let t=await e.send(`Target.getTargets`);r=Array.isArray(t.targetInfos)?t.targetInfos:[]}catch{return null}let i=r.filter(e=>e.type===`page`&&typeof e.targetId==`string`),a=i.find(e=>e.active===!0);if(a)return a.targetId;for(let r of i){let i=r.targetId===t?n:void 0;if(await this.targetHasFocus(e,r.targetId,i))return r.targetId}return null}async targetHasFocus(e,t,n){let r=n,i=!1;try{if(!r){let n=await e.send(`Target.attachToTarget`,{targetId:t,flatten:!0});r=typeof n.sessionId==`string`?n.sessionId:void 0,i=!!r}return r?(await e.send(`Runtime.evaluate`,{expression:`document.hasFocus()`,returnByValue:!0},r)).result?.value===!0:!1}catch{return!1}finally{if(i&&r)try{await e.send(`Target.detachFromTarget`,{sessionId:r})}catch{}}}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=_(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&&p(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 ae({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}))}}},Re=class{context;constructor(e){this.context=e}routeCherryHostEvent(e,t){if(!m(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)}};l(`lick-manager`);var ze=new Set([`navigate`,`discovery`]);function z(e){return e?e.includes(`ios`)?`ios`:e.includes(`standalone`)?`standalone`:e.includes(`extension`)?`extension`:e.includes(`electron`)?`electron`:`unknown`:`unknown`}function B(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 Be=6e4,Ve=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=h(t),i=r.onMessage(t=>this.options.onMessage(e,t)),a=new N({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:z(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())}getFollowerDetails(){return[...this.followers.values()].map(e=>({bootstrapId:e.bootstrapId,runtime:e.runtime,connectedAt:e.connectedAt,lastActivity:e.lastActivity,floatType:e.floatType,hostOrigin:e.hostOrigin,selectedScoopJid:e.selectedScoopJid,health:e.keepalive.isStalled?`stalled`:`live`}))}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)>Be&&(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}},He=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`models.request`:n.sendModelCatalogToFollower(e);break;case`model.select`:this.handleModelSelection(e,t.modelId);break;case`thinking.set`:this.handleThinkingSelection(e,t.scoopJid,t.thinkingLevel,t.effortOverride);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=v(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?c(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))}handleModelSelection(e,t){try{if(this.context.options.onFollowerModelSelect?.(t)!==!0){this.context.log.warn(`Rejecting unknown or unresolvable follower model selection`,{bootstrapId:e,modelId:t});return}this.collaborators.broadcast.broadcastModelState()}catch(n){this.context.log.warn(`Rejecting follower model selection after apply failure`,{bootstrapId:e,modelId:t,error:n instanceof Error?n.message:String(n)})}}handleThinkingSelection(e,t,n,r){let i=this.context.followers.followers.get(e)?.selectedScoopJid;if(!i){this.context.log.warn(`Rejecting follower thinking selection without a selected scoop`,{bootstrapId:e,requestedScoopJid:t});return}t!==i&&this.context.log.warn(`Follower thinking selection targeted a stale scoop; using selected scoop`,{bootstrapId:e,requestedScoopJid:t,scoopJid:i});try{let t=this.context.options.onFollowerThinkingSet?.(i,n,r);t&&typeof t.then==`function`?t.then(t=>{if(t===!1){this.logThinkingApplyFailure(e,i,Error(`thinking update was not acknowledged`));return}this.collaborators.broadcast.broadcastModelState()}).catch(t=>this.logThinkingApplyFailure(e,i,t)):this.collaborators.broadcast.broadcastModelState()}catch(t){this.logThinkingApplyFailure(e,i,t)}}logThinkingApplyFailure(e,t,n){this.context.log.warn(`Follower thinking selection apply failed`,{bootstrapId:e,scoopJid:t,error:n instanceof Error?n.message:String(n)})}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=B(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||!ze.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:B(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>5?this.context.log.warn(`Follower speaks a newer tray sync protocol — update this build`,{bootstrapId:e,followerVersion:t.protocolVersion,ourVersion:5}):this.context.log.info(`Follower hello`,{bootstrapId:e,protocolVersion:t.protocolVersion})}};function Ue(e){if(typeof e.path!=`string`||!e.path.startsWith(`/`))return!1;let t=w(e.path);return t!==`/proc`&&!t.startsWith(`/proc/`)}function We(){return{ok:!1,error:`Follower filesystem access denied`,code:`EACCES`}}var Ge=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}if(!Ue(t)){r.sync.send({type:`fs.response`,requestId:e,response:We()});return}let a=await A(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?A(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,qe={target:`preview-target`,session:`preview-session`,frame:`preview-frame`,loader:`preview-loader`},Je=class extends le{connId;sendToWorker;nextId=1;pending=new Map;constructor(e){super({targetUrl:e.targetUrl,targetOrigin:e.targetOrigin,title:e.title,ids:e.ids??qe}),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??{}))}},Ye=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}},Xe=16*1024*1024,Ze=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=d(t.data)}catch{return}if(n.truncated)return;n.bytes+=r.length,n.bytes>Xe&&(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,o=this.context.options.execInShell;if(!o){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 s=new AbortController,c=`${e}:${n}`;this.localExecAborters.set(c,{bootstrapId:e,controller:s});try{let t=await o(r,{sessionId:e,cwd:i,env:a,signal:s.signal,onChunk:(t,r)=>{this.context.followers.followers.get(e)?.sync.send({type:`exec.chunk`,requestId:n,stream:t,data:u(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(c)}}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));this.context.options.closeExecShell?.(e)}},Qe=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`)))}}},$e=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 V(e){return e.kind===`cherry`}function et(e,t){return e.filter(e=>e.kind===`preview`?!1:!V(e)||!t.requireNetwork||e.capabilities?.network===!0)}var tt=class{context;options;registry=new $e;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||et(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()}},H=32*1024,nt=1024*1024,rt=3e4,it=12e4,at=3;function ot(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 st(e,t,n){if(typeof e.bufferedAmount==`number`)for(;!n.aborted&&e.bufferedAmount>t;)await new Promise(e=>setTimeout(e,25))}var ct=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=B(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)},it);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,r,i){let a=e.exportKey(t,n),{createTranscriptExport:o}=this.context.options;if(!this.context.followers.followers.get(t)||!o){this.activeExports.delete(a);return}let c=e=>{let r=this.context.followers.followers.get(t);r&&r.sync.send({type:`transcript.export.error`,requestId:n,code:e}),this.activeExports.delete(a)},l;try{l=await o(r,i.signal)}catch(e){if(i.signal.aborted){this.activeExports.delete(a);return}this.context.log.warn(`createTranscriptExport failed`,{requestId:n,error:e instanceof Error?e.message:String(e)}),c(e instanceof f?e.code:`session-not-found`);return}if(i.signal.aborted||!this.activeExports.has(a)){this.activeExports.delete(a);return}let u=this.context.followers.followers.get(t)?.sync;if(!u){this.activeExports.delete(a);return}u.send({type:`transcript.export.start`,requestId:n,filename:l.filename});let{sha256:d}=await s(async()=>{let{sha256:e}=await import(`./sha256-DmK25X5D.js`).then(e=>e.n);return{sha256:e}},__vite__mapDeps([42,1])),p=d.create(),m=(this.context.followers.followers.get(t)?.peerProtocolVersion??0)>=at,{streamError:h,chunkCount:g,byteLength:_}=await this.sendExportChunks({bootstrapId:t,requestId:n,chunks:l.chunks,hasher:p,abort:i,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){c(`transfer-corrupt`);return}if(!this.activeExports.has(a))return;if(i.signal.aborted){c(`transfer-aborted`);return}let v;try{v=await l.completion}catch{if(i.signal.aborted){this.activeExports.delete(a);return}c(`transfer-aborted`);return}if(i.signal.aborted||!this.activeExports.has(a)){this.activeExports.delete(a);return}if(v.byteLength!==_){this.context.log.warn(`Transcript export byte count mismatch between service and leader stream`,{requestId:n,serviceByteLength:v.byteLength,leaderByteCount:_}),c(`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}),c(`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(a)}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:ot(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+=H){if(o.signal.aborted||!this.activeExports.has(a)||(await st(i,nt,o.signal),o.signal.aborted||!this.activeExports.has(a)))return{nextIdx:l,done:`abort`};let u=r.slice(e,e+H);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)},rt),this.ackWaiters.set(s,{resolve:()=>{a.removeEventListener(`abort`,d),u(),o(!0)},reject:()=>{a.removeEventListener(`abort`,d),u(),o(!1)}})})}},U=l(`tray-leader-sync`),lt=class{options;lastThemeJson=null;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 Ve({log:U,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:U,sendControl:e.sendControl};this.broadcast=new Fe(t),this.previewBridge=new Ye(t),this.cdpRouter=new Le(t,{getBridgeTransport:e=>this.previewBridge.getBridgeTransport(e)}),this.remoteExec=new Ze(t),this.teleportPool=new tt(t,{cleanupOrphanedRemoteTransports:e=>this.cdpRouter.cleanupOrphanedRemoteTransports(e),getPreviewTargetEntries:()=>this.previewBridge.getTargetEntries()}),this.transcriptExport=new ct(t),this.fsRouter=new Ge(t),this.tabRouter=new Qe(t,{getTargetEntries:()=>this.teleportPool.getRegistryEntries(),isCherryTarget:V}),this.cherryRouter=new Re(t),this.followerDispatch=new He(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:5,capabilities:{exec:this.options.execInShell!==void 0}}),this.broadcast.sendSnapshotToFollower(e),this.broadcast.sendScoopsListToFollower(e),this.broadcast.sendModelCatalogToFollower(e),this.broadcast.sendSprinklesListToFollower(e),this.lastThemeJson!==null&&r.send({type:`theme.apply`,themeJson:this.lastThemeJson}),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()}broadcastModelCatalog(){this.broadcast.broadcastModelCatalog()}broadcastModelState(){this.broadcast.broadcastModelState()}broadcastSprinkleUpdate(e,t){this.broadcast.broadcastSprinkleUpdate(e,t)}broadcastTheme(e){this.lastThemeJson=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()}getFollowerDetails(){return this.followerRegistry.getFollowerDetails()}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(){this.cdpRouter.resetPreviewFocus();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)}},W=l(`page-leader-tray`);function G(e,t){let n=new Map(t.getFollowerDetails().map(e=>[e.bootstrapId,e])),r=[];for(let t of e.getPeers()){let e=n.get(t.bootstrapId);t.state===`connected`&&!e||(r.push({bootstrapId:t.bootstrapId,runtime:e?.runtime??t.runtime,connectedAt:e?.connectedAt??t.connectedAt??void 0,floatType:e?.floatType??z(t.runtime),hostOrigin:e?.hostOrigin,selectedScoopJid:e?.selectedScoopJid,health:e?.health,peerState:t.state}),n.delete(t.bootstrapId))}for(let e of n.values())r.push({...e,peerState:`connected`});return r}function ut(e,t,n){return new lt({sendControl:e=>t().sendControlMessage(e),getMessages:e.getMessages,getMessagesForScoop:e.getMessagesForScoop,getScoopJid:e.getScoopJid,getScoops:e.getScoops,getSprinkles:e.getSprinkles,getModelCatalog:e.getModelCatalog,getModelSelectionState:e.getModelSelectionState,onFollowerModelSelect:e.onFollowerModelSelect,onFollowerThinkingSet:e.onFollowerThinkingSet,readSprinkleContent:e.readSprinkleContent,onSprinkleLick:e.onSprinkleLick,onForwardedLick:e.onForwardedLick,onFollowerMessage:e.onFollowerMessage,onFollowerAbort:e.onFollowerAbort,onFollowerNewSession:e.onFollowerNewSession,onFollowerCountChanged:n,onRemoteTransportsCleaned:e.onRemoteTransportsCleaned,execInShell:e.execInShell,closeExecShell:e.closeExecShell,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 dt(e,t,n,r){return new ve({peerConnectionFactory:r,sendControlMessage:t=>e().sendControlMessage(t),onPeersChanged:n,onPeerConnected:(e,n)=>{W.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)=>{W.info(`Tray follower disconnected`,{bootstrapId:e,reason:t})},onPeerTransportClosed:e=>{t.removeFollower(e)}})}function ft(e,t,n,r,i,a){let o=t=>{e.browserTransport?.sendLeaderJoinUrl?.(t)};return new ce({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}je(r,{send:e=>a().sendControlMessage(e)},t).catch(e=>{W.error(`preview.request handling failed`,{error:e instanceof Error?e.message:String(e)})});return}if(r.type===`preview.revoked`){W.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=>{W.error(`Tray leader bootstrap handling failed`,{error:e instanceof Error?e.message:String(e)})})},onReconnecting:(e,t)=>{W.info(`Leader tray reconnecting`,{attempt:e,lastError:t})},onReconnected:e=>{W.info(`Leader tray reconnected`,{trayId:e.trayId}),i(e),o(e.joinUrl)},onReconnectGaveUp:(e,t)=>{W.error(`Leader tray reconnect gave up`,{lastError:e,attempts:t}),o(null)}})}function pt(e,t){let n=new j(W,{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){W.error(`Leader target broadcast failed (sync.setLocalTargets threw)`,{error:e instanceof Error?e.message:String(e)})}}}function mt(e,t){return setInterval(()=>{try{e.broadcastScoopsList(),e.broadcastSprinklesList()}catch(e){W.error(`Failed to broadcast follower lists`,{error:e instanceof Error?e.message:String(e)})}},t)}function ht(e){return t=>{let n=e._historyOverride??gt();if(n)try{let e=ee(n.href,t.workerBaseUrl,t.trayId);e!==n.href&&n.replaceState(null,``,e)}catch(e){W.debug(`URL bar update skipped`,{error:e instanceof Error?e.message:String(e)})}}}function K(e){let t=e._refreshIntervalMs??5e3,n=e._scoopBroadcastCoalesceMs??50,r=e._fetchImpl??((e,t)=>fetch(e,t)),i,a,o,s=ht(e),c=()=>{let t=G(a,o).filter(e=>e.peerState===`connected`).length;e.onFollowerCountChanged?.(t)};o=ut(e,()=>i,c),e.browserAPI.setTrayTargetProvider(o),a=dt(()=>i,o,c,e._peerConnectionFactory),i=ft(e,a,o,r,s,()=>i);let l=e.onAgentEvent(e=>o.broadcastEvent(e)),u=[],d=pt(e,o);u.push(setInterval(d,t)),d(),u.push(mt(o,t));let f=i.start();f.then(s).catch(e=>{W.error(`Leader tray start failed`,{error:e instanceof Error?e.message:String(e)})});let p=!1,m=null;return{ready:f,scheduleScoopsListBroadcast:()=>{p||m!==null||(m=setTimeout(()=>{m=null,p||o.broadcastScoopsList()},n))},stop(){p=!0,m!==null&&clearTimeout(m),m=null,l();for(let e of u)clearInterval(e);o.stop(),a.stop(),i.stop()},async reset(){o.stop(),a.stop(),i.stop(),await i.clearSession();let e=await i.start();return s(e),T()},leader:i,peers:a,sync:o,get currentLeaderSync(){return p?null:o}}}function gt(){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 _t(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 q=l(`tray-leader-lock`);function vt(e){return`slicc-tray-leader:${e}`}function J(){let e=!1,t=null;return{release:()=>{e||(e=!0,t?.())},heldPromise:new Promise(e=>{t=e})}}async function Y(e,t){if(!t)return{status:`granted`,release:()=>{}};let n=vt(e),r,i=new Promise(e=>{r=e}),a=J();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=J();t.request(n,{mode:`exclusive`},()=>(e({release:r.release}),r.heldPromise))})}}async function yt(e){let t=await Y(e.workerBaseUrl,e.lockManager);if(t.status===`granted`){if(!e.shouldLead()){t.release();return}e.onGranted(t.release);return}q.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}q.error(`Late promotion: this tab is now the tray leader.`),e.onGranted(n)}function bt(){return typeof navigator<`u`&&navigator.locks&&typeof navigator.locks.request==`function`?navigator.locks:null}function X(e){let t=e.sync.getExecCapableBootstrapIds(),n=e.sync.getBrowserCapableBootstrapIds(),r=e.sync.getFollowerMotds();return G(e.peers,e.sync).map(e=>({runtimeId:he(e.bootstrapId),runtime:e.runtime,connectedAt:e.connectedAt,floatType:e.floatType,hostOrigin:e.hostOrigin,selectedScoopJid:e.selectedScoopJid,health:e.health,peerState:e.peerState,exec:t.has(e.bootstrapId),cdp:n.has(e.bootstrapId),motd:r.get(e.bootstrapId)}))}function Z(){return a().flatMap(e=>e.models.map(t=>({providerName:e.providerName,modelId:`${e.providerId}:${t.id}`,modelName:t.name??t.id,reasoning:t.reasoning===!0})))}function xt(e){let n=t();return e.find(e=>e.modelId===`${n.provider}:${n.id}`)?.modelId??e.find(e=>e.modelId.endsWith(`:${n.id}`))?.modelId??`${n.provider}:${n.id}`}async function St(t){let n=i().map(t=>e(t.providerId).refreshModels).filter(e=>e!==void 0);if(n.length===0)return!1;let r=await Promise.allSettled(n.map(e=>e()));for(let e of r)e.status===`rejected`&&t.warn(`dynamic model catalog refresh failed`,e.reason);return!0}function Ct(e){e.window.addEventListener(`slicc:accounts-changed`,()=>{e.getSync()?.broadcastModelCatalog(),Tt(e.refreshDynamicCatalogs(),e.refreshTimeoutMs??5e3).then(t=>{t&&e.getSync()?.broadcastModelCatalog()}).catch(t=>e.log.warn(`dynamic model catalog refresh failed`,t))})}function wt(e){e.window.addEventListener(pe,()=>{e.getSync()?.broadcastModelState()}),e.window.addEventListener(`model-change`,t=>{t.detail?.source!==`follower`&&e.getSync()?.broadcastModelState()})}function Tt(e,t){return new Promise((n,r)=>{let i=setTimeout(()=>r(Error(`dynamic model catalog refresh timed out`)),t);e.then(e=>{clearTimeout(i),n(e)},e=>{clearTimeout(i),r(e)})})}function Q(e,t,n){let{browser:r,client:i,getController:a}=e,o=null,s=me({composerMeta:e.refs.composerMeta,getSync:n,getSelectedScoopJid:()=>o,interceptLocalHandlers:!0,getLockedEffortLevel:()=>e.window.localStorage.getItem(`slicc_locked_effort_level`)});return e.refs.switcher.addEventListener(`slicc-scoop-select`,t=>{let r=n();if(!r)return;t.stopImmediatePropagation();let i=t.detail?.key;i&&(o=i,e.refs.switcher.setAttribute(`active`,i),r.selectScoop(i))},{capture:!0}),{joinUrl:t,onSnapshot:(e,t)=>{o=t;let n=a();n?.loadMessages(e),n?.setProcessing(e.some(e=>e.isStreaming))},onUserMessage:(e,t,n,r)=>a()?.addUserMessage(e,r),onStatus:(e,t)=>{ge(t,o)&&a()?.setProcessing(e===`processing`)},setChatAgent:e=>a()?.setAgent(e),browserAPI:r,onForwardingToggle:e=>i.sendSetFollowerForwarding(e),getSelectedScoopJid:()=>o,onConnectionChange:e=>{e||s.reset()},addSprinkle:(t,n,r)=>e.addSprinkle(t,n,r),removeSprinkle:t=>e.removeSprinkle(t),onScoopsList:(t,n)=>{(!o||!t.some(e=>e.jid===o))&&(o=n),e.refs.switcher.scoops=M(t),e.refs.switcher.setAttribute(`active`,o)},onModelsList:s.onModelsList,onModelState:s.onModelState}}function $(e,t,n){let{client:i,refs:a}=e,o=(n=0)=>{let r=t.leader?X(t.leader):[],i=n;i>0?t.persistenceGuard.activate():t.persistenceGuard.deactivate(),a.floatbar.setAttribute(`label`,i>0?`tray · ${i} follower${i===1?``:`s`}`:e.baseFloatLabel??`standalone · live`),D(r)},c=new ke(i);return l=>({workerBaseUrl:l,getMessages:()=>e.getController()?.getMessages()??[],getMessagesForScoop:e=>i.getMessagesForScoop(e),getScoopJid:()=>e.getSelectedJid(),getScoops:()=>_e(i.getScoops(),a.switcher.scoops),getModelCatalog:Z,getModelSelectionState:e=>{let t=Z(),n=i.getScoop(e)?.config;return{activeModelId:xt(t),scoopJid:e,thinkingLevel:n?.thinkingLevel===`max`?`xhigh`:n?.thinkingLevel,effortOverride:n?.thinkingLevel===`max`?n.effortOverride??`max`:n?.effortOverride}},onFollowerModelSelect:e=>{let t=Z().find(t=>t.modelId===e);return t?(r(t.modelId),a.composerMeta.dispatchEvent(new CustomEvent(`model-change`,{bubbles:!0,composed:!0,detail:{id:t.modelId,model:t.modelName,provider:t.providerName,source:`follower`}})),a.composerMeta.setAttribute(`model`,t.modelName),!0):!1},onFollowerThinkingSet:(e,t,n)=>i.setScoopThinkingLevel(e,t,n),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(fe,{detail:{action:t}}))},onFollowerCountChanged:o,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=>s(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 s(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)=>c.run({command:e,...t}),closeExecShell:e=>c.close(e),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)},async readDir(t){return(await e.openFs()).readDir(t)},async writeFile(t,n,r){return(await e.openWriter()).writeFile(t,n,r)},async mkdir(t,n){return(await e.openWriter()).mkdir(t,n)},async rm(t,n){return(await e.openWriter()).rm(t,n)}}})}function Et(e,t){return{wireLeaderHooks:t=>{O(()=>X(t)),E(()=>t.reset()),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`)),s(async()=>{let{setThemeChangeListener:e,getActiveThemeId:t,getActiveThemeJson:n}=await import(`./theme-engine-BMhxbTGC.js`).then(e=>e.p);return{setThemeChangeListener:e,getActiveThemeId:t,getActiveThemeJson:n}},__vite__mapDeps([45,1,12])).then(({setThemeChangeListener:e,getActiveThemeId:n,getActiveThemeJson:r})=>{let i;e(e=>{n()!==`__preview`&&(clearTimeout(i),i=setTimeout(()=>t.sync.broadcastTheme(e),150))}),t.sync.broadcastTheme(r())}).catch(t=>e.log.error(`failed to install tray theme sync`,t))},clearLeaderHooks:()=>{O(null),D([]),E(null),e.getController()?.setOnLocalUserMessage(void 0),e.getController()?.setOnLocalProcessingChange(void 0),e.sprinkleManager.setSendToSprinkleHook(void 0),e.sprinkleManager.setReloadHook(void 0),t.disposeAll(),s(async()=>{let{setThemeChangeListener:e}=await import(`./theme-engine-BMhxbTGC.js`).then(e=>e.p);return{setThemeChangeListener:e}},__vite__mapDeps([45,1,12])).then(({setThemeChangeListener:e})=>{e(null)}).catch(t=>e.log.error(`failed to clear tray theme sync`,t))}}}function Dt(e){return{runtime:`slicc-hosted-leader`,kind:`hosted`,onLeaderReady:t=>{fetch(y(`/api/cloud-status`),{method:`POST`,headers:b({"content-type":`application/json`}),body:JSON.stringify({joinUrl:t.joinUrl,trayId:t.trayId,controllerUrl:t.controllerUrl,webhookUrl:t.webhookUrl,runtime:t.runtime,sliccVersion:`6.22.0`}),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(S);let i=a.localStorage.getItem(x);if(!i){o.error(`hosted-leader: tray worker base URL not seeded`);return}t.leader=K({...n(i),...Dt(e)}),r(t.leader),De({log:o});return}let s=a.localStorage.getItem(S),c=a.localStorage.getItem(x);s?t.follower=k(Q(e,s,()=>t.follower?.currentSync??null)):c&&kt(c,e,t,n,r,i)}function kt(e,t,n,r,i,a){yt({workerBaseUrl:e,lockManager:a,shouldLead:()=>!n.leader&&!n.follower&&t.window.localStorage.getItem(`slicc.trayWorkerBaseUrl`)===e,onGranted:t=>{n.lockRelease=t,n.leader=K(r(e)),i(n.leader)}})}function At(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,t.persistenceGuard.deactivate(),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=k(Q(e,i,()=>t.follower?.currentSync??null))}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.persistenceGuard.deactivate(),t.leader?.stop(),t.follower?.stop(),t.lockRelease?.(),t.lockRelease=null},{once:!0})}async function jt(e){let{loadSprinkleStyles:t}=await s(async()=>{let{loadSprinkleStyles:e}=await import(`./legacy-styles-DcRu2WCJ.js`);return{loadSprinkleStyles:e}},__vite__mapDeps([46,4]));await t();let{client:n,instanceId:r,window:i,log:a}=e,o={leader:null,follower:null,persistenceGuard:new xe,lockRelease:null},c=bt();Ct({window:i,getSync:()=>o.leader?.sync??null,refreshDynamicCatalogs:()=>St(a),log:a}),wt({window:i,getSync:()=>o.leader?.sync??null});let l=typeof BroadcastChannel==`function`?new BroadcastChannel(ne(r)):null,u=_t({getSync:()=>o.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=o.follower?.currentSync;t?t.forwardLick(e):a.warn(`forward-lick dropped: no active follower sync`)});let d=$(e,o,u),{wireLeaderHooks:f,clearLeaderHooks:p}=Et(e,u);i.addEventListener(ue,()=>{o.leader?.sync.broadcastSnapshot()});let m=async e=>{let{performTrayLeave:t}=await s(async()=>{let{performTrayLeave:e}=await import(`./tray-leave-runtime-DyiGVnUI.js`);return{performTrayLeave:e}},__vite__mapDeps([47,27,13,14,1,4,15,16,17,28])),n=()=>{o.leader||(o.lockRelease?.(),o.lockRelease=null)},r=t({workerBaseUrl:e.workerBaseUrl,requestId:e.requestId},{getLeader:()=>o.leader,setLeader:e=>{o.leader=e,e||o.persistenceGuard.deactivate()},getFollower:()=>o.follower,setFollower:e=>{o.follower=e},startLeader:e=>(o.lockRelease?.(),o.lockRelease=null,Y(e,c).then(e=>{if(e.status===`granted`){if(!o.leader){e.release();return}o.lockRelease=e.release}}),K(d(e))),clearLeaderHooks:p,wireLeaderHooks:f,storage:i.localStorage,log:a});try{let e=await r;return n(),e}catch(e){throw n(),e}};return await Ee({instanceId:r,browser:e.browser,remoteCdpBridge:u,remoteCdpPushChannel:l,getLeader:()=>o.leader,performTrayLeaveLocally:m,window:i}),Ot(e,o,d,f,c),ye(e.refs.floatbar),se(e=>{i.localStorage.setItem(`slicc.leaderTrayStatus`,JSON.stringify(e))}),i.localStorage.setItem(`slicc.leaderTrayStatus`,JSON.stringify(T())),ie(e=>{i.localStorage.setItem(C,JSON.stringify(e))}),i.localStorage.setItem(C,JSON.stringify(re())),D(de(),i.localStorage),At(e,o,p,m),{getLeader:()=>o.leader,getFollower:()=>o.follower,scheduleScoopsListBroadcast:()=>o.leader?.scheduleScoopsListBroadcast(),performTrayLeaveLocally:m}}export{jt as wireWcTray};