sliccy 5.79.0 → 5.81.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 (65) hide show
  1. package/dist/ui/assets/{account-store-B-HsIWG6.js → account-store-CnsbdqGs.js} +1 -1
  2. package/dist/ui/assets/{account-store-De_E5WYX.js → account-store-xYSvTVDf.js} +1 -1
  3. package/dist/ui/assets/{adobe-BVqdA3QB.js → adobe-BMAAqjBy.js} +1 -1
  4. package/dist/ui/assets/{adobe-C4wE1xE8.js → adobe-DNxWyVGn.js} +1 -1
  5. package/dist/ui/assets/{apps-Dod62Alz.js → apps-NBeed6Ba.js} +1 -1
  6. package/dist/ui/assets/{azure-openai-DuIQLC0x.js → azure-openai-Ce8fr_I0.js} +1 -1
  7. package/dist/ui/assets/{azure-openai-CGCTRXfX.js → azure-openai-DOUb-32X.js} +1 -1
  8. package/dist/ui/assets/{cerebras-Wh2KHFFc.js → cerebras-BrRsvEp8.js} +1 -1
  9. package/dist/ui/assets/{cerebras-DkV6HBYv.js → cerebras-q7yoL9Vx.js} +1 -1
  10. package/dist/ui/assets/{connect-surface-BASwBcs9.js → connect-surface-Dmv8Gx1q.js} +1 -1
  11. package/dist/ui/assets/{fs-BB6EpN2h.js → fs-9Edvps3G.js} +1 -1
  12. package/dist/ui/assets/{fs-CAtqQBTz.js → fs-EsjNTaH2.js} +2 -2
  13. package/dist/ui/assets/{github-BDz4sb0Q.js → github-BcSJUL60.js} +2 -2
  14. package/dist/ui/assets/{github-BO60mmbu.js → github-DQoq6iX2.js} +1 -1
  15. package/dist/ui/assets/{github-copilot-CXnL_5ld.js → github-copilot-C1KCtETc.js} +1 -1
  16. package/dist/ui/assets/{github-copilot-CCkG2uqw.js → github-copilot-Cgio0dCX.js} +1 -1
  17. package/dist/ui/assets/{kernel-worker-m5sTxDnm.js → kernel-worker-D5D_WHJd.js} +591 -584
  18. package/dist/ui/assets/{local-llm-BEOOH3ay.js → local-llm-B0OzumsB.js} +1 -1
  19. package/dist/ui/assets/{local-llm-CUEzhD5r.js → local-llm-CGHf33Kw.js} +1 -1
  20. package/dist/ui/assets/{main-B851VCWS.js → main-zZ6eY8Da.js} +3 -3
  21. package/dist/ui/assets/{mount-C2Swdwxn.js → mount-CzMCUvO9.js} +2 -2
  22. package/dist/ui/assets/{mount-DtPTXwiy.js → mount-DoqzFEXd.js} +1 -1
  23. package/dist/ui/assets/{mount-recovery-DfXrWOuB.js → mount-recovery-DfnGC5I_.js} +1 -1
  24. package/dist/ui/assets/{new-session-g_Gndkmb.js → new-session-DyRo1Eco.js} +2 -2
  25. package/dist/ui/assets/{oauth-bootstrap-DqAw_wFL.js → oauth-bootstrap-0qrIoobl.js} +2 -2
  26. package/dist/ui/assets/{openai-codex-DSOflf4H.js → openai-codex-C9OyU8o1.js} +1 -1
  27. package/dist/ui/assets/{openai-codex-UgfFzR0T.js → openai-codex-C9UQImqi.js} +1 -1
  28. package/dist/ui/assets/{openrouter-Cs5iFrkx.js → openrouter-CHKHn-ev.js} +1 -1
  29. package/dist/ui/assets/{openrouter-KStAS5C5.js → openrouter-iDab93ad.js} +1 -1
  30. package/dist/ui/assets/{openrouter-oauth-BtQzN7w6.js → openrouter-oauth-CsR1cUVM.js} +1 -1
  31. package/dist/ui/assets/{openrouter-oauth-s29YqRzF.js → openrouter-oauth-DWf-w6qg.js} +1 -1
  32. package/dist/ui/assets/{panel-rpc-handlers-S9UtTtFX.js → panel-rpc-handlers-CFrx4Jlf.js} +2 -2
  33. package/dist/ui/assets/{provider-CZOwEf3r.js → provider-BPmBmwlg.js} +2 -2
  34. package/dist/ui/assets/{provider-DJkCUcKt.js → provider-rUMPurIq.js} +1 -1
  35. package/dist/ui/assets/{provider-settings-BJcwcogB.js → provider-settings-C1qOrG_P.js} +1 -1
  36. package/dist/ui/assets/{provider-settings-B59SptZo.js → provider-settings-CwC3s4dq.js} +1 -1
  37. package/dist/ui/assets/provider-store-access-B3IZTIJV.js +1 -0
  38. package/dist/ui/assets/{provider-store-access-DJ_bQlsx.js → provider-store-access-B5rTgp4f.js} +2 -2
  39. package/dist/ui/assets/{providers-CbFHKQBr.js → providers-BPbl6SNP.js} +2 -2
  40. package/dist/ui/assets/{providers-CFJkxqSk.js → providers-DVjwJG_9.js} +1 -1
  41. package/dist/ui/assets/{quick-llm-DLaA3PRg.js → quick-llm-C5hHS8bY.js} +1 -1
  42. package/dist/ui/assets/{session-freezer-Bi_69QRI.js → session-freezer-C0C2eaUY.js} +2 -2
  43. package/dist/ui/assets/{setup-standalone-prelude-DVXnNkGW.js → setup-standalone-prelude-CX-1Pjyi.js} +1 -1
  44. package/dist/ui/assets/{setup-sudo-D_3aXGVC.js → setup-sudo-Bi_zFnHj.js} +2 -2
  45. package/dist/ui/assets/{skills-CHaq5k6u.js → skills-TglFyJbX.js} +1 -1
  46. package/dist/ui/assets/{store-Bc_luARI.js → store-HG-MJkvn.js} +1 -1
  47. package/dist/ui/assets/{sudo-BP3jCSn8.js → sudo-E-zH05fN.js} +1 -1
  48. package/dist/ui/assets/{upgrade-detection-Bxc5rV7x.js → upgrade-detection-4Q-TH5DV.js} +1 -1
  49. package/dist/ui/assets/{wc-extension-BF6ruQw_.js → wc-extension-D4WIw7lS.js} +2 -2
  50. package/dist/ui/assets/{wc-follower-gPsL2yz7.js → wc-follower-DlLSncVW.js} +3 -3
  51. package/dist/ui/assets/{wc-live-Cc7R6vry.js → wc-live-Cr_lzQLV.js} +3 -3
  52. package/dist/ui/assets/{wc-nav-NdrUWhjQ.js → wc-nav-BcK44lTt.js} +2 -2
  53. package/dist/ui/assets/{wc-onboarding-Cb83BqCg.js → wc-onboarding-duye_WQQ.js} +2 -2
  54. package/dist/ui/assets/{wc-placeholder-BgYnpF-6.js → wc-placeholder-D-3-3ZU1.js} +2 -2
  55. package/dist/ui/assets/{wc-settings-DIfJ966U.js → wc-settings-BwrldiA6.js} +2 -2
  56. package/dist/ui/assets/{wc-shell-C06r_MAK.js → wc-shell-B8DYS8PU.js} +2 -2
  57. package/dist/ui/assets/{wc-sprinkles-ZxPUjgUG.js → wc-sprinkles-CanUjHHv.js} +2 -2
  58. package/dist/ui/assets/wc-tray-DhZqWqgp.js +2 -0
  59. package/dist/ui/assets/{xai-grok-D35xB6y8.js → xai-grok-0kE9sJMd.js} +1 -1
  60. package/dist/ui/assets/{xai-grok-BrAafhyP.js → xai-grok-DvaumQw1.js} +1 -1
  61. package/dist/ui/index.html +6 -6
  62. package/dist/ui/packages/webapp/index.html +6 -6
  63. package/package.json +19 -4
  64. package/dist/ui/assets/provider-store-access-EmIDuBaV.js +0 -1
  65. package/dist/ui/assets/wc-tray-BX8Vdbik.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-B851VCWS.js"></script>
8
+ <script type="module" crossorigin src="/assets/main-zZ6eY8Da.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">
@@ -26,23 +26,23 @@
26
26
  <link rel="modulepreload" crossorigin href="/assets/port-bridge-client-DdolH4cw.js">
27
27
  <link rel="modulepreload" crossorigin href="/assets/secrets-bridge-client-CLRo0NLf.js">
28
28
  <link rel="modulepreload" crossorigin href="/assets/tool-ui-DfXu6quJ.js">
29
- <link rel="modulepreload" crossorigin href="/assets/providers-CbFHKQBr.js">
29
+ <link rel="modulepreload" crossorigin href="/assets/providers-BPbl6SNP.js">
30
30
  <link rel="modulepreload" crossorigin href="/assets/panel-rpc-DmJSNs0I.js">
31
31
  <link rel="modulepreload" crossorigin href="/assets/transform-messages-wECJwtH0.js">
32
32
  <link rel="modulepreload" crossorigin href="/assets/bedrock-camp-CVignIdH.js">
33
- <link rel="modulepreload" crossorigin href="/assets/account-store-De_E5WYX.js">
33
+ <link rel="modulepreload" crossorigin href="/assets/account-store-xYSvTVDf.js">
34
34
  <link rel="modulepreload" crossorigin href="/assets/electron-overlay-route-CjT6k9Df.js">
35
35
  <link rel="modulepreload" crossorigin href="/assets/bridge-launch-params-QY3l_LbM.js">
36
36
  <link rel="modulepreload" crossorigin href="/assets/messages-BD4p8GuF.js">
37
37
  <link rel="modulepreload" crossorigin href="/assets/tray-runtime-config-9kTxza5l.js">
38
38
  <link rel="modulepreload" crossorigin href="/assets/runtime-mode-BweZnYql.js">
39
- <link rel="modulepreload" crossorigin href="/assets/setup-sudo-D_3aXGVC.js">
40
- <link rel="modulepreload" crossorigin href="/assets/setup-standalone-prelude-DVXnNkGW.js">
39
+ <link rel="modulepreload" crossorigin href="/assets/setup-sudo-Bi_zFnHj.js">
40
+ <link rel="modulepreload" crossorigin href="/assets/setup-standalone-prelude-CX-1Pjyi.js">
41
41
  <link rel="modulepreload" crossorigin href="/assets/telemetry-Dxrv_mDE.js">
42
42
  <link rel="modulepreload" crossorigin href="/assets/tray-follower-status-5SqDRLX8.js">
43
43
  <link rel="modulepreload" crossorigin href="/assets/clipboard-DuHpK59o.js">
44
44
  <link rel="modulepreload" crossorigin href="/assets/tray-join-url-BIvzbiFR.js">
45
- <link rel="modulepreload" crossorigin href="/assets/provider-settings-BJcwcogB.js">
45
+ <link rel="modulepreload" crossorigin href="/assets/provider-settings-C1qOrG_P.js">
46
46
  </head>
47
47
  <body>
48
48
  <div id="app"></div>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "sliccy",
3
- "version": "5.79.0",
3
+ "version": "5.81.0",
4
4
  "description": "Browser-based coding agent with thin CLI server",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -21,7 +21,7 @@
21
21
  "url": "https://github.com/ai-ecoverse/slicc"
22
22
  },
23
23
  "engines": {
24
- "node": ">=22.13.0"
24
+ "node": ">=22.18.0"
25
25
  },
26
26
  "workspaces": [
27
27
  "packages/shared-ts",
@@ -64,18 +64,23 @@
64
64
  "test:coverage:webcomponents": "npm run test:coverage -w @slicc/webcomponents",
65
65
  "test:coverage:spoon": "npm run test:coverage -w @ai-ecoverse/spoon",
66
66
  "coverage:ratchet": "node packages/dev-tools/tools/coverage-ratchet.mjs",
67
+ "bundle-size": "npm run size -w @slicc/webapp && npm run size -w @slicc/chrome-extension",
67
68
  "test:server-integration": "vitest run --config packages/node-server/tests/integration/server/vitest.config.ts",
68
69
  "test:e2e": "npx playwright test --config packages/webapp/tests/e2e/playwright.config.ts",
69
70
  "start:extension": "npm run build -w @slicc/chrome-extension && npm run dev -- --profile=extension",
70
- "lint": "biome check --write . && prettier --write . && npm run lint:docs && npm run lint:skills && npm run lint:skill-router && npm run lint:no-innerhtml && npm run lint:no-ui-in-providers && npm run lint:patches && npm run lint:no-raw-chrome-runtime-id && npm run lint:hosted-origin",
71
- "lint:ci": "biome check . && prettier --check . && npm run lint:docs && npm run lint:skills -- --strict && npm run lint:skill-router && npm run lint:no-innerhtml && npm run lint:no-ui-in-providers && npm run lint:patches && npm run lint:no-raw-chrome-runtime-id && npm run lint:hosted-origin",
71
+ "lint": "biome check --write . && prettier --write . && npm run lint:docs && npm run lint:skills && npm run lint:skill-router && npm run lint:no-innerhtml && npm run lint:no-ui-in-providers && npm run lint:patches && npm run lint:no-raw-chrome-runtime-id && npm run lint:hosted-origin && npm run lint:duplication",
72
+ "lint:ci": "biome check . && prettier --check . && npm run lint:docs && npm run lint:skills -- --strict && npm run lint:skill-router && npm run lint:no-innerhtml && npm run lint:no-ui-in-providers && npm run lint:patches && npm run lint:no-raw-chrome-runtime-id && npm run lint:hosted-origin && npm run lint:duplication",
72
73
  "lint:docs": "node packages/dev-tools/tools/check-doc-sizes.mjs && node packages/dev-tools/tools/check-agents-symlinks.mjs && node packages/dev-tools/tools/check-doc-refs.mjs",
73
74
  "lint:skills": "node packages/dev-tools/tools/lint-skills.mjs",
74
75
  "lint:skill-router": "bash packages/dev-tools/tools/check-skill-router-sync.sh",
75
76
  "lint:no-innerhtml": "node packages/dev-tools/tools/check-no-innerhtml.mjs",
76
77
  "lint:no-ui-in-providers": "node packages/dev-tools/tools/check-no-ui-imports-in-providers.mjs",
77
78
  "lint:patches": "node packages/dev-tools/patch-reconcile/check-patches.mjs",
79
+ "lint:duplication": "jscpd --config jscpd.json --no-tips",
80
+ "lint:duplication:report": "jscpd --config jscpd.json --no-tips --threshold 100 --reporters console,html,json --output dist/jscpd",
78
81
  "lint:swift": "npm run lint -w @slicc/swift-server && npm run lint -w @slicc/swift-optel && npm run lint -w @slicc/swift-launcher && cd packages/ios-app && swiftlint lint",
82
+ "lint:swift:format": "npm run lint:format -w @slicc/swift-server && npm run lint:format -w @slicc/swift-optel && npm run lint:format -w @slicc/swift-launcher && cd packages/ios-app && swift format lint --strict --parallel --recursive SliccFollower",
83
+ "format:swift": "npm run format -w @slicc/swift-server && npm run format -w @slicc/swift-optel && npm run format -w @slicc/swift-launcher && cd packages/ios-app && swift format --in-place --parallel --recursive SliccFollower",
79
84
  "deadcode": "knip --include files,dependencies,devDependencies,unlisted,binaries,unresolved,duplicates",
80
85
  "deadcode:full": "knip",
81
86
  "deadcode:files": "knip --include files",
@@ -102,6 +107,7 @@
102
107
  "@playwright/test": "^1.58.2",
103
108
  "@semantic-release/exec": "7.1.0",
104
109
  "@semantic-release/git": "10.0.1",
110
+ "@size-limit/file": "13.0.1",
105
111
  "@tessl/cli": "0.92.0",
106
112
  "@types/node": "^24.0.0",
107
113
  "@vitest/browser": "4.1.10",
@@ -109,12 +115,14 @@
109
115
  "@vitest/coverage-v8": "^4.1.5",
110
116
  "esbuild": "0.28.1",
111
117
  "husky": "9.1.7",
118
+ "jscpd": "5.0.14",
112
119
  "knip": "^6.11.0",
113
120
  "lint-staged": "17.1.0",
114
121
  "patch-package": "8.0.1",
115
122
  "playwright": "^1.58.2",
116
123
  "prettier": "3.9.5",
117
124
  "semantic-release": "25.0.8",
125
+ "size-limit": "13.0.1",
118
126
  "tsx": "4.23.1",
119
127
  "typescript": "^7.0.0",
120
128
  "typescript-js": "npm:typescript@6.0.3",
@@ -127,6 +135,13 @@
127
135
  ],
128
136
  "**/*.{md,html,yaml,yml}": [
129
137
  "prettier --write"
138
+ ],
139
+ "**/*.swift": [
140
+ "node packages/dev-tools/tools/run-if-installed.mjs swiftlint --fix --quiet",
141
+ "node packages/dev-tools/tools/run-if-installed.mjs swiftlint lint --quiet"
142
+ ],
143
+ "**/*.go": [
144
+ "node packages/dev-tools/tools/run-if-installed.mjs gofmt -w"
130
145
  ]
131
146
  }
132
147
  }
@@ -1 +0,0 @@
1
- import{t as e}from"./store-Bc_luARI.js";export{e as readMcpAuthEntries};
@@ -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-S9UtTtFX.js","assets/account-store-De_E5WYX.js","assets/preload-helper-Czpn1I53.js","assets/compat-aVSWLlYQ.js","assets/models-Bnh9VDA1.js","assets/event-stream-qbAZIAKV.js","assets/provider-env-D37PhSJu.js","assets/__vite-browser-external-SwrSgYTf.js","assets/openrouter.models-DS1_VkCm.js","assets/context-compaction-_UkD06XB.js","assets/logger-DDBAeTLF.js","assets/src-DoFhVmQT.js","assets/proxied-fetch-CfcFb0B0.js","assets/base64-DpPqYZJF.js","assets/runtime-env-DH4NDw4t.js","assets/fetch-body-D2PwksUW.js","assets/secret-topology-Baeul5rD.js","assets/secrets-bridge-client-CLRo0NLf.js","assets/port-bridge-client-DdolH4cw.js","assets/tool-ui-DfXu6quJ.js","assets/providers-CbFHKQBr.js","assets/bedrock-camp-CVignIdH.js","assets/transform-messages-wECJwtH0.js","assets/provider-settings-BJcwcogB.js","assets/tray-runtime-config-9kTxza5l.js","assets/messages-BD4p8GuF.js","assets/tray-follower-status-5SqDRLX8.js","assets/clipboard-DuHpK59o.js","assets/telemetry-Dxrv_mDE.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-BDMuV-1a.js","assets/db-ysOO0kLr.js","assets/tray-sync-protocol-D44N11jm.js","assets/hosted-config-apply-uAym2aS5.js","assets/sha256-DmK25X5D.js","assets/wc-transcript-export-B3p8LhYu.js","assets/export-spool-DCxGPg43.js","assets/theme-engine-jfuTMXZM.js","assets/legacy-styles-DcRu2WCJ.js","assets/tray-leave-runtime-DuZ41JQ-.js"])))=>i.map(i=>d[i]);
2
- import{P as e,R as t,d as n}from"./account-store-De_E5WYX.js";import{t as r}from"./preload-helper-Czpn1I53.js";import{n as i}from"./attachments-CByeG2Ru.js";import{t as a}from"./logger-DDBAeTLF.js";import{n as o,t as s}from"./base64-DpPqYZJF.js";import{r as c}from"./src-DoFhVmQT.js";import{a as l,l as u,n as d,o as f,r as p,u as m}from"./tray-sync-protocol-D44N11jm.js";import{o as h,t as g}from"./proxied-fetch-CfcFb0B0.js";import{d as _,i as v,n as y,r as b}from"./tray-runtime-config-9kTxza5l.js";import{r as x}from"./panel-rpc-DmJSNs0I.js";import{n as S,o as ee,t as C}from"./tray-follower-status-5SqDRLX8.js";import"./provider-settings-BJcwcogB.js";import"./handoff-link-Dmaaww5x.js";import{t as te}from"./remote-cdp-transport-CG3TFBoT.js";import"./browser-COVn7LPD.js";import{t as ne}from"./terminal-session-client-BylrXUky.js";import{i as re,n as w,t as ie}from"./tray-leader-BDMuV-1a.js";import{t as ae}from"./synthetic-cdp-transport-DLIt5SkY.js";import{n as oe,t as se}from"./leader-session-events-m7I5BMZy.js";import{t as T}from"./wc-scoop-color-CByZNEJo.js";import{a as E,i as D,n as ce,o as le,r as ue,t as O}from"./page-follower-tray-BrSvgCHw.js";a(`scoops.tray-leave`),a(`scoops.tray-join`);var k=null;function A(e){k=e}function j(){return k?.()??[]}var M=`slicc.leaderTrayFollowers`;function N(e,t=globalThis.localStorage){try{t?.setItem(M,JSON.stringify(e))}catch{}}function P(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 F(){try{let e=n().filter(e=>!e.loggedOut),t=[`adobe`,`github`].map(t=>e.find(e=>e.providerId===t)).find(Boolean)??e[0],r=t?P(t):null;if(!r)return`00000000`;let i=await crypto.subtle.digest(`SHA-256`,new TextEncoder().encode(r));return Array.from(new Uint8Array(i,0,4),e=>e.toString(16).padStart(2,`0`)).join(``)}catch{return`00000000`}}async function I(e){let{instanceId:t,browser:n,remoteCdpBridge:i,remoteCdpPushChannel:a,getLeader:o,performTrayLeaveLocally:s,window:c}=e,{installPanelRpcHandler:l,createPanelRpcEventEmitter:u}=await r(async()=>{let{installPanelRpcHandler:e,createPanelRpcEventEmitter:t}=await import(`./panel-rpc-DmJSNs0I.js`).then(e=>e.i);return{installPanelRpcHandler:e,createPanelRpcEventEmitter:t}},__vite__mapDeps([0,1])),{createStandalonePanelRpcHandlers:d}=await r(async()=>{let{createStandalonePanelRpcHandlers:e}=await import(`./panel-rpc-handlers-S9UtTtFX.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,0,23,24,25,26,27,28,29,30,31,32,33,34,35])),{getLeaderPermissionsSurface:f}=await r(async()=>{let{getLeaderPermissionsSurface:e}=await import(`./wc-permissions-registry-Blyunq37.js`).then(e=>e.r);return{getLeaderPermissionsSurface:e}},__vite__mapDeps([36,1])),p=u({instanceId:t}),m=new Map,h=l({instanceId:t,handlers:d({resetTray:async()=>{let e=o();if(!e)throw Error(`no active tray session to reset`);return await e.reset()},leaveTray:async({workerBaseUrl:e,requestId:t})=>await s({workerBaseUrl:e,requestId:t}),joinTray:({joinUrl:e})=>(_(c.localStorage,e),c.dispatchEvent(new CustomEvent(`slicc:tray-join`,{detail:{joinUrl:e}})),{joinUrl:e}),emitEvent:(e,t)=>p.emit(e,t),emitCherrySliccEvent:(e,t,n)=>o()?.sync.emitCherrySliccEvent(e,t,n)??!1,execOnRemote:async({runtimeId:e,command:t,cwd:n,env:r,execToken:i,timeoutMs:a})=>{let s=o()?.currentLeaderSync;if(!s)throw Error(`ssh: no active leader tray`);let c=new AbortController;m.set(i,c);try{return await s.execOnRemote(e,t,{cwd:n,env:r,signal:c.signal,timeoutMs:a})}finally{m.delete(i)}},signalRemoteExec:({execToken:e})=>{m.get(e)?.abort()},mintPreview:async({entryPath:e,servedRoot:t,bridge:n,noBridge:i,maxTabs:a,quiet:s,webhookId:c})=>{let l=o()?.currentLeaderSync;if(!l)throw Error(`serve: no active leader tray; cannot mint preview`);let{getLeaderTrayRuntimeStatus:u}=await r(async()=>{let{getLeaderTrayRuntimeStatus:e}=await import(`./tray-leader-BDMuV-1a.js`).then(e=>e.a);return{getLeaderTrayRuntimeStatus:e}},__vite__mapDeps([37,1,12,14,4,15,13,16,17,26,27,38])),d=u().session;if(!d)throw Error(`serve: leader tray has no active session`);let f=new URL(d.controllerUrl).pathname.split(`/`).pop()??``,{CHERRY_RUNTIME_TAG:p}=await r(async()=>{let{CHERRY_RUNTIME_TAG:e}=await import(`./tray-sync-protocol-D44N11jm.js`).then(e=>e.s);return{CHERRY_RUNTIME_TAG:e}},__vite__mapDeps([39,1,12,13])),{mintPreviewViaWorker:m}=await r(async()=>{let{mintPreviewViaWorker:e}=await import(`./preview-mint-client-CNzSnbyh.js`);return{mintPreviewViaWorker:e}},[]),h=l.getConnectedFollowers().some(e=>e.runtime===p),g=!i&&(n||h),_=!i&&n,v=await F(),{url:y,previewToken:b}=await m({workerBaseUrl:d.workerBaseUrl,trayId:d.trayId,controllerToken:f,servedRoot:t,entryPath:e,allowLive:g,bridge:_,maxTabs:a,webhookId:c,userHash:v}),x=e?e.split(`/`).pop()??`Preview`:`Preview`;return l.registerMintedPreview(b,{url:y,title:x,quiet:s??!1}),l.broadcastPreviewOpen(y),{url:y,pushed:l.getConnectedFollowers().length,previewToken:b}},revokePreview:async({previewToken:e})=>{let t=o()?.currentLeaderSync;if(!t)throw Error(`serve --stop: no active leader tray; cannot revoke preview`);let{getLeaderTrayRuntimeStatus:n}=await r(async()=>{let{getLeaderTrayRuntimeStatus:e}=await import(`./tray-leader-BDMuV-1a.js`).then(e=>e.a);return{getLeaderTrayRuntimeStatus:e}},__vite__mapDeps([37,1,12,14,4,15,13,16,17,26,27,38])),i=n().session;if(!i)throw Error(`serve --stop: leader tray has no active session`);let a=new URL(i.controllerUrl).pathname.split(`/`).pop()??``,{revokePreviewViaWorker:s}=await r(async()=>{let{revokePreviewViaWorker:e}=await import(`./preview-mint-client-CNzSnbyh.js`);return{revokePreviewViaWorker:e}},[]),c=await s({workerBaseUrl:i.workerBaseUrl,trayId:i.trayId,controllerToken:a,previewToken:e});return t.dropMintedPreview(e),c},listPreviews:async()=>{let{getLeaderTrayRuntimeStatus:e}=await r(async()=>{let{getLeaderTrayRuntimeStatus:e}=await import(`./tray-leader-BDMuV-1a.js`).then(e=>e.a);return{getLeaderTrayRuntimeStatus:e}},__vite__mapDeps([37,1,12,14,4,15,13,16,17,26,27,38])),t=e().session;if(!t)throw Error(`serve: leader tray has no active session`);let n=new URL(t.controllerUrl).pathname.split(`/`).pop()??``,{listPreviewsViaWorker:i}=await r(async()=>{let{listPreviewsViaWorker:e}=await import(`./preview-mint-client-CNzSnbyh.js`);return{listPreviewsViaWorker:e}},[]);return await i({workerBaseUrl:t.workerBaseUrl,trayId:t.trayId,controllerToken:n})},listRemoteTargets:()=>n.listAllTargets(),remoteCdp:i,getPermissionsSurface:()=>f()})});c.addEventListener(`beforeunload`,()=>{h(),p.dispose(),i.disposeAll(),a?.close()},{once:!0})}async function L(n){let{log:i}=n;await new Promise(e=>setTimeout(e,5e3));try{let n=await fetch(h(`/api/hosted-bootstrap`),{signal:AbortSignal.timeout(1e4),headers:g()});if(!n.ok)return;let a=await n.json(),o=a.accounts??(a.adobeImsToken?[{providerId:`adobe`,kind:`oauth`,accessToken:a.adobeImsToken}]:[]);a.model?localStorage.setItem(`selected-model`,a.model):localStorage.getItem(`selected-model`)||localStorage.setItem(`selected-model`,`adobe:claude-opus-4-6`),a.effortLevel?localStorage.setItem(`slicc_locked_effort_level`,a.effortLevel):localStorage.removeItem(`slicc_locked_effort_level`);let[{applyHostedAccounts:s,prewarmHostedModels:c},l]=await Promise.all([r(()=>import(`./hosted-config-apply-uAym2aS5.js`),__vite__mapDeps([40,12])),r(()=>import(`./provider-settings-BJcwcogB.js`).then(e=>e.t),__vite__mapDeps([25,1,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,0,23,24,26,27,28,29,30,31]))]);await c(o,{getRefreshModels:e=>l.getProviderConfig(e).refreshModels});let u=JSON.parse(localStorage.getItem(`slicc_cloud_managed`)??`[]`);await s(o,{saveOAuthAccount:t,addAccount:l.addAccount,removeAccount:e,currentProviderIds:()=>l.getAccounts().map(e=>e.providerId),previouslyManaged:()=>u}),localStorage.setItem(`slicc_cloud_managed`,JSON.stringify(o.map(e=>e.providerId))),i.info(`hosted-leader: cone config applied`,{count:o.length})}catch(e){i.warn(`hosted-leader: bootstrap fetch failed; provider needs manual login`,{error:e instanceof Error?e.message:String(e)})}}var R=0;async function z(e,t){let n=new ne({client:e,sid:`ssh-exec-${++R}-${Date.now()}`,onEvent:e=>{e.type===`terminal-output`&&t.onChunk(e.stream,e.data)}}),r=()=>n.signal(`SIGINT`);try{return await n.open({cwd:t.cwd,env:t.env}),t.signal.addEventListener(`abort`,r,{once:!0}),t.signal.aborted?{exitCode:130}:{exitCode:(await n.exec(t.command)).exitCode}}catch(e){return{exitCode:1,error:e instanceof Error?e.message:String(e)}}finally{t.signal.removeEventListener(`abort`,r),n.close(),n.dispose()}}function B(e,t){if(!e||!t||!e.startsWith(`/`)||t===`/`||/%2[eE]/.test(e)||e.split(`/`).some(e=>e===`.`||e===`..`))return!1;let n=t.endsWith(`/`)?t.slice(0,-1):t;return e===n||e.startsWith(n+`/`)}var V=64*1024;async function H(e,t,n){let{reqId:r,servedRoot:i,asText:a}=e,s=e.vfsPath;if(!B(s,i)){t.send({type:`preview.response`,reqId:r,ok:!1,status:403});return}try{if((await n.stat(s)).type===`directory`&&(s=s.replace(/\/?$/,`/`)+`index.html`,!B(s,i))){t.send({type:`preview.response`,reqId:r,ok:!1,status:403});return}}catch{}let c,l;try{a?(c=await n.readFile(s,{encoding:`utf-8`}),l=`utf-8`):(c=o(await n.readFile(s,{encoding:`binary`})),l=`base64`)}catch(e){e?.code===`ENOENT`?t.send({type:`preview.response`,reqId:r,ok:!1,status:404}):t.send({type:`preview.response`,reqId:r,ok:!1,status:500,reason:String(e?.message??e)});return}let u=de(s),d=U(c,V);for(let e=0;e<d.length;e++)t.send({type:`preview.response`,reqId:r,ok:!0,mime:u,chunkIndex:e,totalChunks:d.length,content:d[e],encoding:l})}function U(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 de(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 fe=3e4,pe={target:`preview-target`,session:`preview-session`,frame:`preview-frame`,loader:`preview-loader`},me=class extends ae{connId;sendToWorker;nextId=1;pending=new Map;constructor(e){super({targetUrl:e.targetUrl,targetOrigin:e.targetOrigin,title:e.title,ids:e.ids??pe}),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=fe){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??{}))}};a(`lick-manager`);var he=new Set([`navigate`,`discovery`]),ge=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()]}},W=a(`tray-leader-sync`);function _e(e){return e?e.includes(`ios`)?`ios`:e.includes(`standalone`)?`standalone`:e.includes(`extension`)?`extension`:e.includes(`electron`)?`electron`:`unknown`:`unknown`}function G(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`}}function K(e){return e.kind===`cherry`}function ve(e,t){return e.filter(e=>e.kind===`preview`?!1:!K(e)||!t.requireNetwork||e.capabilities?.network===!0)}function q(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 ye(e,t,n){if(typeof e.bufferedAmount==`number`)for(;!n.aborted&&e.bufferedAmount>t;)await new Promise(e=>setTimeout(e,25))}var be=class e{options;followers=new Map;registry=new ge;runtimeToBootstrap=new Map;pendingCDPRoutes=new Map;cdpChunkBuffers=new Map;remoteTransports=new Map;pendingTabOpenRoutes=new Map;tabOpenResolvers=new Map;pendingFsRoutes=new Map;fsResolvers=new Map;pendingRemoteExecs=new Map;localExecAborters=new Map;static MAX_REMOTE_EXEC_BYTES=16*1024*1024;mintMap=new Map;bridgeConns=new Map;previewLickLastEmitAt=new Map;static PREVIEW_LICK_THROTTLE_MS=2e3;activeExports=new Map;ackWaiters=new Map;approvalWaiters=new Map;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))}static EXPORT_CHUNK_B64_MAX=32*1024;static EXPORT_BACKPRESSURE_THRESHOLD=1024*1024;static ACK_TIMEOUT_MS=3e4;static APPROVAL_TIMEOUT_MS=12e4;static ACK_PROTOCOL_VERSION_MIN=3;constructor(e){this.options=e}addFollower(e,t,n){this.removeFollower(e);let r=d(t),i=r.onMessage(t=>{this.handleFollowerMessage(e,t)}),a=new E({sendPing:()=>r.send({type:`ping`}),isTransportOpen:()=>r.isOpen,onStalled:()=>{W.warn(`Follower stopped answering pings; channel still open, keeping it`,{bootstrapId:e})},onRecovered:()=>{W.info(`Follower is answering pings again`,{bootstrapId:e})},onDead:()=>{W.warn(`Follower keepalive dead, removing follower`,{bootstrapId:e}),this.removeFollower(e),this.options.onFollowerDead?.(e)}});a.start(),this.followers.set(e,{bootstrapId:e,sync:r,unsubscribe:i,keepalive:a,runtime:n?.runtime,connectedAt:n?.connectedAt,lastActivity:Date.now(),floatType:_e(n?.runtime)}),W.info(`Follower added to sync`,{bootstrapId:e,followerCount:this.followers.size}),this.options.onFollowerCountChanged?.(this.followers.size),r.send({type:`hello`,protocolVersion:4}),this.sendSnapshotToFollower(e),this.sendScoopsListToFollower(e),this.sendSprinklesListToFollower(e);let o=this.getFollowerBroadcastEntries();o.length>0&&r.send({type:`targets.registry`,targets:o})}removeFollower(e){let t=this.followers.get(e);if(t){t.keepalive.stop(),t.unsubscribe(),t.sync.close(),this.followers.delete(e);for(let[t,n]of this.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.followerBroadcastErrorLogAt.delete(e);for(let[t,n]of this.runtimeToBootstrap)if(n===e){this.cleanupRemoteTransports(t),this.registry.removeRuntime(t),this.runtimeToBootstrap.delete(t);break}this.registry.hasChanged()&&this.broadcastTargetRegistry();for(let[t,n]of this.activeExports)if(n.bootstrapId===e){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);W.info(`Follower removed from sync`,{bootstrapId:e,followerCount:this.followers.size}),this.options.onFollowerCountChanged?.(this.followers.size)}}followerBroadcastErrorLogAt=new Map;static BROADCAST_ERROR_THROTTLE_MS=6e4;broadcastToAllFollowers(t){let n=performance.now();for(let[r,i]of this.followers)try{i.sync.send(t),this.followerBroadcastErrorLogAt.delete(r)}catch(i){n-(this.followerBroadcastErrorLogAt.get(r)??-1/0)>e.BROADCAST_ERROR_THROTTLE_MS&&(this.followerBroadcastErrorLogAt.set(r,n),W.error(`Broadcast send to follower failed (channel may be stuck)`,{bootstrapId:r,messageType:t.type,error:i instanceof Error?i.message:String(i)}))}}broadcastEvent(e){if(this.followers.size===0)return;let t={type:`agent_event`,event:e,scoopJid:this.options.getScoopJid()};this.broadcastToAllFollowers(t)}broadcastUserMessage(e,t,n){if(this.followers.size===0)return;let r={type:`user_message_echo`,text:e,messageId:t,scoopJid:this.options.getScoopJid(),attachments:n?.length?i(n):n};this.broadcastToAllFollowers(r)}broadcastStatus(e){if(this.followers.size===0)return;let t={type:`status`,scoopStatus:e};this.broadcastToAllFollowers(t)}async sendSnapshotToFollower(e,t){let n=this.followers.get(e);if(!n)return;let r=t??n.selectedScoopJid??this.options.getScoopJid(),i;if(this.options.getMessagesForScoop&&r!==this.options.getScoopJid())try{i=await Promise.resolve(this.options.getMessagesForScoop(r))}catch(e){W.warn(`getMessagesForScoop failed, falling back to active scoop`,{targetJid:r,error:e instanceof Error?e.message:String(e)}),i=this.options.getMessages()}else i=this.options.getMessages();n.selectedScoopJid=r,f(n.sync,i,r),W.debug(`Snapshot sent to follower`,{bootstrapId:e,messageCount:i.length,scoopJid:r})}broadcastSnapshot(){if(this.followers.size!==0)for(let e of this.followers.keys())this.sendSnapshotToFollower(e)}sendScoopsListToFollower(e){let t=this.followers.get(e);if(!t)return;let n=this.options.getScoops;if(n)try{let e=n(),r=this.options.getScoopJid();t.sync.send({type:`scoops.list`,scoops:e,activeScoopJid:r})}catch(t){W.warn(`Failed to send scoops.list`,{bootstrapId:e,error:t instanceof Error?t.message:String(t)})}}sendSprinklesListToFollower(e){let t=this.followers.get(e);if(!t)return;let n=this.options.getSprinkles;if(n)try{let e=n();t.sync.send({type:`sprinkles.list`,sprinkles:e})}catch(t){W.warn(`Failed to send sprinkles.list`,{bootstrapId:e,error:t instanceof Error?t.message:String(t)})}}broadcastScoopsList(){if(this.followers.size===0)return;let e=this.options.getScoops;if(!e)return;let t;try{t=e()}catch(e){W.warn(`Failed to compute scoops list`,{error:e instanceof Error?e.message:String(e)});return}let n=this.options.getScoopJid(),r={type:`scoops.list`,scoops:t,activeScoopJid:n};this.broadcastToAllFollowers(r)}broadcastSprinklesList(){if(this.followers.size===0)return;let e=this.options.getSprinkles;if(!e)return;let t;try{t=e()}catch(e){W.warn(`Failed to compute sprinkles list`,{error:e instanceof Error?e.message:String(e)});return}let n={type:`sprinkles.list`,sprinkles:t};this.broadcastToAllFollowers(n)}broadcastSprinkleUpdate(e,t){if(this.followers.size===0)return;let n={type:`sprinkle.update`,sprinkleName:e,data:t};this.broadcastToAllFollowers(n)}broadcastTheme(e){this.followers.size!==0&&this.broadcastToAllFollowers({type:`theme.apply`,themeJson:e})}broadcastSprinkleReloaded(e){this.followers.size!==0&&this.broadcastToAllFollowers({type:`sprinkle.reloaded`,sprinkleName:e})}broadcastPreviewOpen(e){if(this.followers.size===0)return;let t=`prv-${crypto.randomUUID()}`;this.broadcastToAllFollowers({type:`preview.open`,requestId:t,url:e})}static SPRINKLE_CHUNK_SIZE=32*1024;static SPRINKLE_CHUNK_THRESHOLD=64*1024;async handleSprinkleFetch(t,n,r){let i=this.followers.get(t);if(!i)return;let a=this.options.readSprinkleContent;if(!a){i.sync.send({type:`sprinkle.content`,requestId:n,sprinkleName:r,content:``,error:`Leader has no sprinkle content reader`});return}let o=null;try{o=await Promise.resolve(a(r))}catch(e){i.sync.send({type:`sprinkle.content`,requestId:n,sprinkleName:r,content:``,error:e instanceof Error?e.message:String(e)});return}if(o==null){i.sync.send({type:`sprinkle.content`,requestId:n,sprinkleName:r,content:``,error:`Sprinkle not found: ${r}`});return}if(o.length<=e.SPRINKLE_CHUNK_THRESHOLD){i.sync.send({type:`sprinkle.content`,requestId:n,sprinkleName:r,content:o});return}let s=e.SPRINKLE_CHUNK_SIZE,c=Math.ceil(o.length/s);for(let e=0;e<c;e++){let t=o.slice(e*s,(e+1)*s);i.sync.send({type:`sprinkle.content`,requestId:n,sprinkleName:r,content:t,chunkIndex:e,totalChunks:c})}}handleFollowerUserMessage(e,t){W.info(`Follower user message received`,{bootstrapId:e,messageId:t.messageId});let n=t.attachments?.length?i(t.attachments):t.attachments;this.options.onFollowerMessage(t.text,t.messageId,n)}handleFollowerSprinkleLick(e,t){W.info(`Follower sprinkle lick received`,{bootstrapId:e,sprinkleName:t.sprinkleName});let n=this.followers.get(e),r=G(n?.floatType??`unknown`,n?.runtime);try{this.options.onSprinkleLick?.(t.sprinkleName,t.body,t.targetScoop,r)}catch(e){W.warn(`onSprinkleLick handler threw`,{error:e instanceof Error?e.message:String(e)})}}handleFollowerLick(e,t){let n=t.event;if(!n||!he.has(n.type)){W.warn(`Rejecting malformed or non-forwardable lick from follower`,{bootstrapId:e,type:n?.type});return}let r=this.followers.get(e),{targetScoop:i,...a}=n,o={...a,originFollowerId:e,originLabel:G(r?.floatType??`unknown`,r?.runtime)};try{this.options.onForwardedLick?.(o,e)}catch(e){W.warn(`onForwardedLick handler threw`,{error:e instanceof Error?e.message:String(e)})}}handleFollowerTargetsAdvertise(e,t){W.info(`Follower targets advertised`,{bootstrapId:e,runtimeId:t.runtimeId,targetCount:t.targets.length});for(let e of[...this.remoteTransports.keys()]){let n=e.substring(0,e.indexOf(`:`));n!==`leader`&&!this.runtimeToBootstrap.has(n)&&n!==t.runtimeId&&(this.remoteTransports.get(e)?.disconnect(),this.remoteTransports.delete(e),W.debug(`Cleaned up orphaned remote transport on advertise`,{key:e}))}this.runtimeToBootstrap.set(t.runtimeId,e),this.registry.setTargets(t.runtimeId,t.targets);let n=this.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()}async execOnRemote(e,t,n={}){let r=this.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}'`)))})}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())}getFollowerMotds(){let e=new Map;for(let[t,n]of this.followers)n.peerMotd&&e.set(t,n.peerMotd);return e}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}sendExecSignal(e,t,n){this.followers.get(e)?.sync.send({type:`exec.signal`,requestId:t,signal:n})}handleRemoteExecChunk(t,n){let r=this.pendingRemoteExecs.get(n.requestId);if(!r||r.bootstrapId!==t)return;let i;try{i=s(n.data)}catch{return}if(r.truncated)return;r.bytes+=i.length,r.bytes>e.MAX_REMOTE_EXEC_BYTES&&(r.truncated=!0);let a=(n.stream===`stdout`?r.stdoutDecoder:r.stderrDecoder).decode(i,{stream:!0});n.stream===`stdout`?r.stdout+=a:r.stderr+=a,r.onChunk?.(n.stream,a)}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}))}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}}async handleFollowerExecRequest(e,t){let{requestId:n,command:r,cwd:i,env:a}=t,s=this.options.execInShell;if(!s){this.followers.get(e)?.sync.send({type:`exec.response`,requestId:n,exitCode:127,error:`exec is not supported on this leader`});return}let c=new AbortController,l=`${e}:${n}`;this.localExecAborters.set(l,{bootstrapId:e,controller:c});try{let t=await s(r,{cwd:i,env:a,signal:c.signal,onChunk:(t,r)=>{this.followers.get(e)?.sync.send({type:`exec.chunk`,requestId:n,stream:t,data:o(new TextEncoder().encode(r))})}});this.followers.get(e)?.sync.send({type:`exec.response`,requestId:n,exitCode:t.exitCode,error:t.error})}catch(t){this.followers.get(e)?.sync.send({type:`exec.response`,requestId:n,exitCode:1,error:t instanceof Error?t.message:String(t)})}finally{this.localExecAborters.delete(l)}}handleFollowerExecSignal(e,t){this.localExecAborters.get(`${e}:${t.requestId}`)?.controller.abort()}handleFollowerMessage(e,t){if(t.type!==`hello`){let t=this.followers.get(e);t&&t.peerProtocolVersion===void 0&&!t.legacyPeerLogged&&(t.legacyPeerLogged=!0,W.info(`Follower sent no hello — legacy peer (pre-versioning build)`,{bootstrapId:e}))}switch(t.type){case`user_message`:this.handleFollowerUserMessage(e,t);break;case`abort`:W.info(`Follower abort received`,{bootstrapId:e}),this.options.onFollowerAbort();break;case`new_session`:W.info(`Follower new-session received`,{bootstrapId:e,action:t.action});try{this.options.onFollowerNewSession?.(t.action,e)}catch(e){W.warn(`onFollowerNewSession handler threw`,{error:e instanceof Error?e.message:String(e)})}break;case`request_snapshot`:W.info(`Follower snapshot request received`,{bootstrapId:e,scoopJid:t.scoopJid}),this.sendSnapshotToFollower(e,t.scoopJid);break;case`scoops.select`:{W.info(`Follower selected scoop`,{bootstrapId:e,scoopJid:t.scoopJid});let n=this.followers.get(e);n&&(n.selectedScoopJid=t.scoopJid,this.sendSnapshotToFollower(e,t.scoopJid));break}case`sprinkles.refresh`:W.info(`Follower requested sprinkles refresh`,{bootstrapId:e}),this.sendSprinklesListToFollower(e);break;case`sprinkle.fetch`:this.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`:this.handleFollowerTargetsAdvertise(e,t);break;case`cdp.request`:{let{requestId:n,targetRuntimeId:r,localTargetId:i,method:a,params:o,sessionId:s}=t;r===`leader`?this.executeLocalCDP(n,i,a,o,s,e):this.forwardCDPRequest(n,r,i,a,o,s,e);break}case`cdp.response`:this.handleCDPResponse(t);break;case`cdp.event`:this.handleCDPEvent(e,t.method,t.params,t.sessionId);break;case`tab.open`:{let{requestId:n,targetRuntimeId:r,url:i}=t;r===`leader`?this.executeLocalTabOpen(n,i,e):this.forwardTabOpen(n,r,i,e);break}case`tab.opened`:this.handleTabOpenResponse(t.requestId,t.targetId);break;case`tab.open.error`:this.handleTabOpenError(t.requestId,t.error);break;case`fs.request`:{let{requestId:n,targetRuntimeId:r,request:i}=t;r===`leader`?this.executeLocalFs(n,i,e):this.forwardFsRequest(n,r,i,e);break}case`fs.response`:this.handleFsResponse(t.requestId,t.response);break;case`exec.request`:case`exec.chunk`:case`exec.response`:case`exec.signal`:this.handleFollowerExecMessage(e,t);break;case`transcript.export.request`:this.handleTranscriptExportRequest(e,t.requestId,t.selector);break;case`transcript.export.cancel`:this.handleTranscriptExportCancel(e,t.requestId);break;case`transcript.export.ack`:this.handleTranscriptExportAck(e,t.requestId,t.index);break;case`transcript.export.approve.response`:this.handleTranscriptExportApprovalResponse(e,t.requestId,t.approved);break;case`cherry.host_event`:this.routeCherryHostEvent(e,t);break;case`ping`:{let t=this.followers.get(e);t&&(t.keepalive.receivePing(),t.lastActivity=Date.now(),t.sync.send({type:`pong`}));break}case`pong`:{let t=this.followers.get(e);t&&(t.keepalive.receivePong(),t.lastActivity=Date.now());break}case`hello`:this.handleFollowerHello(e,t);break;default:{let n=m(t);W.warn(`Unknown follower message type — skewed follower?`,{bootstrapId:e,type:n.type});break}}}handleFollowerHello(e,t){let n=this.followers.get(e);n&&(n.peerProtocolVersion=t.protocolVersion,n.peerCapabilities=t.capabilities,n.peerMotd=t.motd,this.options.onFollowerCountChanged?.(this.followers.size)),t.protocolVersion>4?W.warn(`Follower speaks a newer tray sync protocol — update this build`,{bootstrapId:e,followerVersion:t.protocolVersion,ourVersion:4}):W.info(`Follower hello`,{bootstrapId:e,protocolVersion:t.protocolVersion})}async handleTranscriptExportRequest(t,n,r){let i=e.exportKey(t,n);if(this.activeExports.has(i)){W.warn(`Duplicate transcript export request from same follower, ignoring`,{bootstrapId:t,requestId:n});return}let a=this.followers.get(t);if(!a)return;let{requestTranscriptExportApproval:o,createTranscriptExport:s,headlessLeader:c}=this.options;if(!o&&!c||!s){a.sync.send({type:`transcript.export.denied`,requestId:n});return}if([...this.activeExports.values()].some(e=>e.bootstrapId===t)){W.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=G(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){W.warn(`transcript export approval threw`,{requestId:n,error:e instanceof Error?e.message:String(e)}),d=!1}let f=this.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&&(W.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.followers.get(t);if(!i)return Promise.resolve(!1);let a=e.exportKey(t,n);return new Promise(o=>{let s=setTimeout(()=>{W.warn(`Delegated transcript export approval timed out`,{bootstrapId:t,requestId:n}),this.settleApproval(a,!1)},e.APPROVAL_TIMEOUT_MS);this.approvalWaiters.set(a,e=>{clearTimeout(s),o(e)}),i.sync.send({type:`transcript.export.approve.request`,requestId:n,selector:r})||(W.warn(`Failed to send delegated approval prompt — denying`,{bootstrapId:t,requestId:n}),this.settleApproval(a,!1))})}settleApproval(e,t){let n=this.approvalWaiters.get(e);n&&(this.approvalWaiters.delete(e),n(t))}handleTranscriptExportApprovalResponse(t,n,r){this.settleApproval(e.exportKey(t,n),r===!0)}handleTranscriptExportAck(t,n,r){let i=e.ackKey(t,n,r),a=this.ackWaiters.get(i);a&&(this.ackWaiters.delete(i),a.resolve())}async streamTranscriptExport(t,n,i,a){let o=e.exportKey(t,n),{createTranscriptExport:s}=this.options;if(!this.followers.get(t)||!s){this.activeExports.delete(o);return}let l=e=>{let r=this.followers.get(t);r&&r.sync.send({type:`transcript.export.error`,requestId:n,code:e}),this.activeExports.delete(o)},u;try{u=await s(i,a.signal)}catch(e){if(a.signal.aborted){this.activeExports.delete(o);return}W.warn(`createTranscriptExport failed`,{requestId:n,error:e instanceof Error?e.message:String(e)}),l(e instanceof c?e.code:`session-not-found`);return}if(a.signal.aborted||!this.activeExports.has(o)){this.activeExports.delete(o);return}let d=this.followers.get(t)?.sync;if(!d){this.activeExports.delete(o);return}d.send({type:`transcript.export.start`,requestId:n,filename:u.filename});let{sha256:f}=await r(async()=>{let{sha256:e}=await import(`./sha256-DmK25X5D.js`).then(e=>e.n);return{sha256:e}},__vite__mapDeps([41,1])),p=f.create(),m=(this.followers.get(t)?.peerProtocolVersion??0)>=e.ACK_PROTOCOL_VERSION_MIN,{streamError:h,chunkCount:g,byteLength:_}=await this.sendExportChunks({bootstrapId:t,requestId:n,chunks:u.chunks,hasher:p,abort:a,awaitAck:m,onSlice:(e,r)=>{let i=this.followers.get(t);return i?(i.sync.send({type:`transcript.export.chunk`,requestId:n,index:e,data:r}),!0):!1}});if(h){l(`transfer-corrupt`);return}if(!this.activeExports.has(o))return;if(a.signal.aborted){l(`transfer-aborted`);return}let v;try{v=await u.completion}catch{if(a.signal.aborted){this.activeExports.delete(o);return}l(`transfer-aborted`);return}if(a.signal.aborted||!this.activeExports.has(o)){this.activeExports.delete(o);return}if(v.byteLength!==_){W.warn(`Transcript export byte count mismatch between service and leader stream`,{requestId:n,serviceByteLength:v.byteLength,leaderByteCount:_}),l(`transfer-corrupt`);return}let y=p.hex();if(v.sha256!==y){W.warn(`Transcript export SHA-256 mismatch between service and leader stream`,{requestId:n}),l(`transfer-corrupt`);return}let b=this.followers.get(t);b&&b.sync.send({type:`transcript.export.complete`,requestId:n,chunks:g,byteLength:_,sha256:y}),this.activeExports.delete(o)}async sendExportChunks(t){let{bootstrapId:n,requestId:r,chunks:i,hasher:a,abort:o,onSlice:s,awaitAck:c}=t,l=e.exportKey(n,r),u=this.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=q(e),i=await this.sendExportSlices({bootstrapId:n,requestId:r,b64:t,sync:u,key:l,abort:o,onSlice:s,awaitAck:c,startIdx:d});if(d=i.nextIdx,i.done!==`continue`)return{streamError:i.done===`error`,chunkCount:d,byteLength:f}}}catch(e){return o.signal.aborted?{streamError:!1,chunkCount:d,byteLength:f}:(W.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(t){let{bootstrapId:n,requestId:r,b64:i,sync:a,key:o,abort:s,onSlice:c,awaitAck:l}=t,u=t.startIdx;for(let t=0;t<i.length;t+=e.EXPORT_CHUNK_B64_MAX){if(s.signal.aborted||!this.activeExports.has(o)||(await ye(a,e.EXPORT_BACKPRESSURE_THRESHOLD,s.signal),s.signal.aborted||!this.activeExports.has(o)))return{nextIdx:u,done:`abort`};let d=i.slice(t,t+e.EXPORT_CHUNK_B64_MAX);if(!c(u,d))return{nextIdx:u,done:`error`};if(l&&(!await this.waitForAck(n,r,u,s)||s.signal.aborted||!this.activeExports.has(o)))return{nextIdx:u+1,done:`abort`};u++}return{nextIdx:u,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)},e.ACK_TIMEOUT_MS),this.ackWaiters.set(s,{resolve:()=>{a.removeEventListener(`abort`,d),u(),o(!0)},reject:()=>{a.removeEventListener(`abort`,d),u(),o(!1)}})})}setLocalTargets(e){this.registry.setTargets(`leader`,e),this.registry.hasChanged()&&this.broadcastTargetRegistry()}broadcastTargetRegistry(){if(this.followers.size===0)return;let e={type:`targets.registry`,targets:this.getFollowerBroadcastEntries()};this.broadcastToAllFollowers(e)}getTargets(){return this.getConnectedEntries()}getFollowerBroadcastEntries(){return this.getConnectedEntries().filter(e=>e.kind!==`preview`)}getConnectedEntries(){let e=this.registry.getEntries().filter(e=>{if(e.runtimeId===`leader`)return!0;let t=this.runtimeToBootstrap.get(e.runtimeId);return t?this.followers.has(t):!1}),t=[];for(let[e,n]of this.bridgeConns)t.push({targetId:`preview:${n.previewToken}:${e}`,localTargetId:e,runtimeId:`preview`,title:n.title,url:n.url,isLocal:!1,kind:`preview`});return[...e,...t]}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.getBridgeTransport(n);if(!r)throw Error(`Preview bridge connection "${n}" not found`);return r}let n=new te({sendCDPRequest:(n,r,i,a)=>{let o=this.runtimeToBootstrap.get(e),s=o?this.followers.get(o):void 0;if(!s){this.remoteTransports.get(`${e}:${t}`)?.handleResponse(n,void 0,`Target runtime "${e}" not connected`);return}this.pendingCDPRoutes.set(n,{requesterBootstrapId:`__leader__`,requestId:n}),s.sync.send({type:`cdp.request`,requestId:n,localTargetId:t,method:r,params:i,sessionId:a})}});return this.remoteTransports.set(`${e}:${t}`,n),n}removeRemoteTransport(e,t){let n=`${e}:${t}`,r=this.remoteTransports.get(n);r&&(r.disconnect(),this.remoteTransports.delete(n))}cleanupRemoteTransports(e){let t=`${e}:`;for(let e of[...this.remoteTransports.keys()])e.startsWith(t)&&(this.remoteTransports.get(e)?.disconnect(),this.remoteTransports.delete(e),W.debug(`Cleaned up stale remote transport`,{key:e}));try{this.options.onRemoteTransportsCleaned?.(e)}catch(t){W.warn(`onRemoteTransportsCleaned handler threw`,{runtimeId:e,error:t instanceof Error?t.message:String(t)})}}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}})}canRuntimeServeTeleport(e,t){if(t.runtime===`slicc-cherry`)return!1;let n=this.registry.getEntries().filter(t=>t.runtimeId===e);return n.length===0||ve(n,{requireNetwork:!0}).length>0}getBestFollowerForTeleport(){let e=[];for(let[t,n]of this.runtimeToBootstrap){let r=this.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]}get hasFollowers(){return this.followers.size>0}stop(){for(let e of[...this.followers.keys()])this.removeFollower(e);for(let e of this.bridgeConns.values())e.transport.disconnect();this.bridgeConns.clear(),this.mintMap.clear(),this.previewLickLastEmitAt.clear()}async executeLocalCDP(e,t,n,r,i,a){let o=this.followers.get(a);if(!o)return;let s=this.options.browserTransport;if(!s){o.sync.send({type:`cdp.response`,requestId:e,error:`Leader has no browser transport`});return}try{let t=await s.send(n,r,i);l(o.sync,e,t)}catch(t){o.sync.send({type:`cdp.response`,requestId:e,error:t instanceof Error?t.message:String(t)})}}forwardCDPRequest(e,t,n,r,i,a,o){let s=this.runtimeToBootstrap.get(t),c=s?this.followers.get(s):void 0,l=this.followers.get(o);if(!c){l&&l.sync.send({type:`cdp.response`,requestId:e,error:`Target runtime "${t}" not connected`});return}this.pendingCDPRoutes.set(e,{requesterBootstrapId:o,requestId:e}),c.sync.send({type:`cdp.request`,requestId:e,localTargetId:n,method:r,params:i,sessionId:a})}handleCDPResponse(e){let{requestId:t}=e,n=this.pendingCDPRoutes.get(t);if(!n)return;let r=p(this.cdpChunkBuffers,e);if(!r)return;if(this.pendingCDPRoutes.delete(t),n.requesterBootstrapId===`__leader__`){for(let e of this.remoteTransports.values())e.handleResponse(t,r.result,r.error);return}let i=this.followers.get(n.requesterBootstrapId);i&&l(i.sync,t,r.result,r.error)}handleCDPEvent(e,t,n,r){let i;for(let[t,n]of this.runtimeToBootstrap)if(n===e){i=t;break}if(!i)return;let a=`${i}:`;for(let[e,r]of this.remoteTransports)e.startsWith(a)&&r.handleEvent(t,n)}runtimeIdForBootstrap(e){for(let[t,n]of this.runtimeToBootstrap)if(n===e)return t}routeCherryHostEvent(e,t){if(!u(t))return;let n=this.options.onCherryHostEvent;if(!n){W.debug(`cherry.host_event received but no onCherryHostEvent wired`,{bootstrapId:e,name:t.name});return}let r=this.runtimeIdForBootstrap(e);try{n(r,t.name,t.detail)}catch(n){W.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.runtimeToBootstrap.get(i),o=a?this.followers.get(a):void 0;return o?o.sync.send({type:`cherry.slicc_event`,targetId:e,name:t,detail:n}):(W.warn(`emitCherrySliccEvent: owning follower not connected`,{targetId:e,name:t}),!1)}canRuntimeOpenTab(e){let t=this.registry.getEntries().filter(t=>t.runtimeId===e);return t.length===0||t.some(e=>!K(e))}openRemoteTab(e,t){let n=this.runtimeToBootstrap.get(e),r=n?this.followers.get(n):void 0;if(!r)return Promise.reject(Error(`Target runtime "${e}" not connected`));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,n)=>{this.tabOpenResolvers.set(i,{resolve:e,reject:n}),this.pendingTabOpenRoutes.set(i,{requesterBootstrapId:`__leader__`,requestId:i}),r.sync.send({type:`tab.open`,requestId:i,url:t})})}async executeLocalTabOpen(e,t,n){let r=this.followers.get(n);if(!r)return;let i=this.options.browserTransport;if(!i){r.sync.send({type:`tab.open.error`,requestId:e,error:`Leader has no browser transport`});return}try{let n=(await i.send(`Target.createTarget`,{url:t,background:!0})).targetId;r.sync.send({type:`tab.opened`,requestId:e,targetId:`leader:${n}`})}catch(t){r.sync.send({type:`tab.open.error`,requestId:e,error:t instanceof Error?t.message:String(t)})}}forwardTabOpen(e,t,n,r){let i=this.runtimeToBootstrap.get(t),a=i?this.followers.get(i):void 0,o=this.followers.get(r);if(!a){o&&o.sync.send({type:`tab.open.error`,requestId:e,error:`Target runtime "${t}" not connected`});return}if(!this.canRuntimeOpenTab(t)){o&&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,requestId:e}),a.sync.send({type:`tab.open`,requestId:e,url:n})}handleTabOpenResponse(e,t){let n=this.pendingTabOpenRoutes.get(e);if(!n)return;if(this.pendingTabOpenRoutes.delete(e),n.requesterBootstrapId===`__leader__`){let n=this.tabOpenResolvers.get(e);n&&(this.tabOpenResolvers.delete(e),n.resolve(t));return}let r=this.followers.get(n.requesterBootstrapId);r&&r.sync.send({type:`tab.opened`,requestId:e,targetId:t})}handleTabOpenError(e,t){let n=this.pendingTabOpenRoutes.get(e);if(!n)return;if(this.pendingTabOpenRoutes.delete(e),n.requesterBootstrapId===`__leader__`){let n=this.tabOpenResolvers.get(e);n&&(this.tabOpenResolvers.delete(e),n.reject(Error(t)));return}let r=this.followers.get(n.requesterBootstrapId);r&&r.sync.send({type:`tab.open.error`,requestId:e,error:t})}async executeLocalFs(e,t,n){let r=this.followers.get(n);if(!r)return;let i=this.options.vfs;if(!i){r.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:`Leader has no VFS`}});return}let a=await D(i,t);for(let t of a)r.sync.send({type:`fs.response`,requestId:e,response:t})}forwardFsRequest(e,t,n,r){let i=this.runtimeToBootstrap.get(t),a=i?this.followers.get(i):void 0,o=this.followers.get(r);if(!a){o&&o.sync.send({type:`fs.response`,requestId:e,response:{ok:!1,error:`Target runtime "${t}" not connected`}});return}this.pendingFsRoutes.set(e,{requesterBootstrapId:r,requestId:e,chunks:[],totalChunks:1}),a.sync.send({type:`fs.request`,requestId:e,request:n})}handleFsResponse(e,t){let n=this.pendingFsRoutes.get(e);if(!n){let n=this.fsResolvers.get(e);if(n){n.responses.push(t);let r=t.ok&&t.totalChunks||1;n.responses.length>=r&&(this.fsResolvers.delete(e),n.resolve(n.responses))}return}if(n.requesterBootstrapId===`__leader__`){let n=this.fsResolvers.get(e);if(n){n.responses.push(t);let r=t.ok&&t.totalChunks||1;n.responses.length>=r&&(this.fsResolvers.delete(e),this.pendingFsRoutes.delete(e),n.resolve(n.responses))}return}let r=this.followers.get(n.requesterBootstrapId);r&&r.sync.send({type:`fs.response`,requestId:e,response:t}),n.chunks.push(t),n.totalChunks=t.ok&&t.totalChunks||1,n.chunks.length>=n.totalChunks&&this.pendingFsRoutes.delete(e)}sendFsRequest(e,t){if(e===`leader`){let e=this.options.vfs;return e?D(e,t):Promise.resolve([{ok:!1,error:`Leader has no VFS`}])}let n=this.runtimeToBootstrap.get(e),r=n?this.followers.get(n):void 0;if(!r)return Promise.resolve([{ok:!1,error:`Target runtime "${e}" not connected`}]);let i=`fs-${Date.now()}-${Math.random().toString(36).slice(2,8)}`;return new Promise((e,n)=>{this.fsResolvers.set(i,{resolve:e,reject:n,responses:[]}),this.pendingFsRoutes.set(i,{requesterBootstrapId:`__leader__`,requestId:i,chunks:[],totalChunks:1}),r.sync.send({type:`fs.request`,requestId:i,request:t})})}registerMintedPreview(e,t){this.mintMap.set(e,t)}dropMintedPreview(e){this.mintMap.delete(e),this.previewLickLastEmitAt.delete(`${e}:connected`),this.previewLickLastEmitAt.delete(`${e}:disconnected`)}onBridgeConnected(e){let{connId:t,previewToken:n,origin:r,userAgent:i,connectedAt:a}=e;if(this.bridgeConns.has(t))return;let o=this.mintMap.get(n),s=o?.url??r,c=o?.title??`Preview`,l=o?.quiet??!1,u=new me({connId:t,targetUrl:s,targetOrigin:r,title:c,send:e=>this.options.sendControl(e)});u.connect(),this.bridgeConns.set(t,{previewToken:n,origin:r,userAgent:i,connectedAt:a,url:s,title:c,quiet:l,transport:u}),W.info(`Preview bridge connected`,{connId:t,previewToken:n,origin:r,userAgent:i}),this.emitPreviewLifecycleLick(`connected`,{connId:t,previewToken:n,origin:r,userAgent:i,connectedAt:a,quiet:l})}onBridgeDisconnected(e){let{connId:t,reason:n}=e,r=this.bridgeConns.get(t);if(!r)return;let{previewToken:i,origin:a,userAgent:o,connectedAt:s,quiet:c}=r;r.transport.disconnect(),this.bridgeConns.delete(t),W.info(`Preview bridge disconnected`,{connId:t,reason:n}),this.emitPreviewLifecycleLick(`disconnected`,{connId:t,previewToken:i,origin:a,userAgent:o,connectedAt:s,quiet:c})}emitPreviewLifecycleLick(t,n){if(n.quiet||!this.options.onPreviewLick)return;let r=`${n.previewToken}:${t}`,i=Date.now();if(i-(this.previewLickLastEmitAt.get(r)??0)<e.PREVIEW_LICK_THROTTLE_MS)return;this.previewLickLastEmitAt.set(r,i);let a={type:`preview`,previewLifecycle:t,previewConnId:n.connId,previewToken:n.previewToken,previewOrigin:n.origin,previewUserAgent:n.userAgent,previewConnectedAt:n.connectedAt,timestamp:new Date().toISOString(),body:{}};try{this.options.onPreviewLick(a)}catch(e){W.warn(`onPreviewLick handler threw`,{error:e instanceof Error?e.message:String(e)})}}onBridgeCdpResponse(e){let{connId:t,id:n,result:r,error:i}=e,a=this.bridgeConns.get(t);if(!a){W.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}},J=a(`page-leader-tray`);function xe(e,t){return new be({sendControl:e=>t().sendControlMessage(e),getMessages:e.getMessages,getMessagesForScoop:e.getMessagesForScoop,getScoopJid:e.getScoopJid,getScoops:e.getScoops,getSprinkles:e.getSprinkles,readSprinkleContent:e.readSprinkleContent,onSprinkleLick:e.onSprinkleLick,onForwardedLick:e.onForwardedLick,onFollowerMessage:e.onFollowerMessage,onFollowerAbort:e.onFollowerAbort,onFollowerNewSession:e.onFollowerNewSession,onFollowerCountChanged:e.onFollowerCountChanged,onRemoteTransportsCleaned:e.onRemoteTransportsCleaned,execInShell:e.execInShell,onCherryHostEvent:e.onCherryHostEvent,onPreviewLick:e.onPreviewLick,requestTranscriptExportApproval:e.requestTranscriptExportApproval,createTranscriptExport:e.createTranscriptExport,headlessLeader:e.kind===`hosted`,browserAPI:e.browserAPI,browserTransport:e.browserTransport,vfs:e.vfs})}function Se(e,t){return new ue({sendControlMessage:t=>e().sendControlMessage(t),onPeerConnected:(e,n)=>{J.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)=>{J.info(`Tray follower disconnected`,{bootstrapId:e,reason:t})}})}function Ce(e,t,n,r,i,a){let o=t=>{e.browserTransport?.sendLeaderJoinUrl?.(t)};return new ie({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}H(r,{send:e=>a().sendControlMessage(e)},t).catch(e=>{J.error(`preview.request handling failed`,{error:e instanceof Error?e.message:String(e)})});return}if(r.type===`preview.revoked`){J.info(`Preview revoked by worker`,{previewToken:r.previewToken}),n.dropMintedPreview(r.previewToken);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=>{J.error(`Tray leader bootstrap handling failed`,{error:e instanceof Error?e.message:String(e)})})},onReconnecting:(e,t)=>{J.info(`Leader tray reconnecting`,{attempt:e,lastError:t})},onReconnected:e=>{J.info(`Leader tray reconnected`,{trayId:e.trayId}),i(e),o(e.joinUrl)},onReconnectGaveUp:(e,t)=>{J.error(`Leader tray reconnect gave up`,{lastError:e,attempts:t}),o(null)}})}function we(e,t){let n=new le(J,{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){J.error(`Leader target broadcast failed (sync.setLocalTargets threw)`,{error:e instanceof Error?e.message:String(e)})}}}function Te(e,t){return setInterval(()=>{try{e.broadcastScoopsList(),e.broadcastSprinklesList()}catch(e){J.error(`Failed to broadcast follower lists`,{error:e instanceof Error?e.message:String(e)})}},t)}function Ee(e){return t=>{let n=e._historyOverride??De();if(n)try{let e=v(n.href,t.workerBaseUrl,t.trayId);e!==n.href&&n.replaceState(null,``,e)}catch(e){J.debug(`URL bar update skipped`,{error:e instanceof Error?e.message:String(e)})}}}function Y(e){let t=e._refreshIntervalMs??5e3,n=e._fetchImpl??((e,t)=>fetch(e,t)),r,i=Ee(e),a=xe(e,()=>r);e.browserAPI.setTrayTargetProvider(a);let o=Se(()=>r,a);r=Ce(e,o,a,n,i,()=>r);let s=e.onAgentEvent(e=>a.broadcastEvent(e)),c=[],l=we(e,a);c.push(setInterval(l,t)),l(),c.push(Te(a,t));let u=r.start();u.then(i).catch(e=>{J.error(`Leader tray start failed`,{error:e instanceof Error?e.message:String(e)})});let d=!1;return{ready:u,stop(){d=!0,s();for(let e of c)clearInterval(e);a.stop(),o.stop(),r.stop()},async reset(){a.stop(),o.stop(),r.stop(),await r.clearSession();let e=await r.start();return i(e),w()},leader:r,peers:o,sync:a,get currentLeaderSync(){return d?null:a}}}function De(){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 Oe(e){let t=new Map,n=(e,t)=>`${e}:${t}`,r=(r,i)=>{let a=n(r,i),o=t.get(a);if(!o){let n=e.getSync();if(!n)throw Error(`remote-cdp: leader tray not started`);o={runtimeId:r,localTargetId:i,transport:n.createRemoteTransport(r,i),forwarders:new Map},t.set(a,o)}return o},i=n=>{let r=t.get(n);if(!r)return;for(let[e,t]of r.forwarders)r.transport.off(e,t.listener);r.forwarders.clear();let i=e.getSync();i?.removeRemoteTransport?i.removeRemoteTransport(r.runtimeId,r.localTargetId):r.transport.disconnect(),t.delete(n)};return{async send({runtimeId:e,localTargetId:t,method:n,params:i,sessionId:a,timeout:o}){return r(e,t).transport.send(n,i,a,o)},async subscribe({runtimeId:t,localTargetId:n,event:i}){let a=r(t,n),o=a.forwarders.get(i);if(o)return o.count+=1,{ok:!0};let s=r=>e.postEvent({runtimeId:t,localTargetId:n,method:i,params:r});return a.transport.on(i,s),a.forwarders.set(i,{listener:s,count:1}),{ok:!0}},async unsubscribe({runtimeId:e,localTargetId:r,event:i}){let a=t.get(n(e,r)),o=a?.forwarders.get(i);return!a||!o?{ok:!0}:(--o.count,o.count<=0&&(a.transport.off(i,o.listener),a.forwarders.delete(i)),{ok:!0})},async detach({runtimeId:e,localTargetId:t}){return i(n(e,t)),{ok:!0}},async openTab({runtimeId:t,url:n}){let r=e.getSync();if(!r?.openRemoteTab)throw Error(`remote-cdp: openRemoteTab not available`);return{targetId:await r.openRemoteTab(t,n)}},cleanupRuntime(e){let n=`${e}:`;for(let e of[...t.keys()])e.startsWith(n)&&i(e)},disposeAll(){for(let e of[...t.keys()])i(e)}}}var X=a(`tray-leader-lock`);function ke(e){return`slicc-tray-leader:${e}`}function Z(){let e=!1,t=null;return{release:()=>{e||(e=!0,t?.())},heldPromise:new Promise(e=>{t=e})}}async function Q(e,t){if(!t)return{status:`granted`,release:()=>{}};let n=ke(e),r,i=new Promise(e=>{r=e}),a=Z();return t.request(n,{mode:`exclusive`,ifAvailable:!0},e=>e===null?(r(!1),Promise.resolve()):(r(!0),a.heldPromise)),await i?{status:`granted`,release:a.release}:{status:`deferred`,waitForPromotion:()=>new Promise(e=>{let r=Z();t.request(n,{mode:`exclusive`},()=>(e({release:r.release}),r.heldPromise))})}}async function Ae(e){let t=await Q(e.workerBaseUrl,e.lockManager);if(t.status===`granted`){if(!e.shouldLead()){t.release();return}e.onGranted(t.release);return}X.error(`Another tab is already leading on this tray worker — deferring leader start until the other tab releases the lock.`);let{release:n}=await t.waitForPromotion();if(!e.shouldLead()){n();return}X.error(`Late promotion: this tab is now the tray leader.`),e.onGranted(n)}function je(){return typeof navigator<`u`&&navigator.locks&&typeof navigator.locks.request==`function`?navigator.locks:null}function $(e,t){let{browser:n,client:r,getController:i}=e;return{joinUrl:t,onSnapshot:e=>i()?.loadMessages(e),onUserMessage:(e,t,n,r)=>i()?.addUserMessage(e,r),onStatus:e=>i()?.setProcessing(e===`processing`),setChatAgent:e=>i()?.setAgent(e),browserAPI:n,onForwardingToggle:e=>r.sendSetFollowerForwarding(e),addSprinkle:(t,n,r)=>e.addSprinkle(t,n,r),removeSprinkle:t=>e.removeSprinkle(t),onScoopsList:(t,n)=>{e.refs.switcher.scoops=t.map(e=>({key:e.jid,type:e.isCone?`cone`:`scoop`,color:T(e),label:e.isCone?`sliccy`:e.name,eyes:`open`})),e.refs.switcher.setAttribute(`active`,n)}}}function Me(e,t,n){let{client:i,refs:a}=e;return o=>({workerBaseUrl:o,getMessages:()=>e.getController()?.getMessages()??[],getMessagesForScoop:e=>i.getMessagesForScoop(e),getScoopJid:()=>e.getSelectedJid(),getScoops:()=>i.getScoops().map(e=>({jid:e.jid,name:e.name,folder:e.folder,isCone:e.isCone,assistantLabel:e.assistantLabel,trigger:e.trigger})),getSprinkles:()=>{let t=new Set(e.sprinkleManager.opened());return e.sprinkleManager.available().map(e=>({name:e.name,title:e.title,path:e.path,open:t.has(e.name),autoOpen:e.autoOpen,icon:e.icon}))},readSprinkleContent:async t=>{let n=e.sprinkleManager.available().find(e=>e.name===t);if(!n)return null;try{let t=await(await e.openFs()).readFile(n.path,{encoding:`utf-8`});return typeof t==`string`?t:new TextDecoder(`utf-8`).decode(t)}catch{return null}},onSprinkleLick:(e,t,n,r)=>i.sendSprinkleLick(e,t,n,r),onFollowerMessage:(n,r,i)=>{e.getController()?.addUserMessage(n,i),e.agentHandle.sendMessage(n,r,i),t.leader?.sync.broadcastUserMessage(n,r,i)},onFollowerAbort:()=>e.agentHandle.stop(),onFollowerNewSession:t=>{e.window.dispatchEvent(new CustomEvent(oe,{detail:{action:t}}))},onFollowerCountChanged:t=>{a.floatbar.setAttribute(`label`,t>0?`tray · ${t} follower${t===1?``:`s`}`:e.baseFloatLabel??`standalone · live`),N(j())},onRemoteTransportsCleaned:e=>n.cleanupRuntime(e),onForwardedLick:e=>i.sendForwardedLick(e),onCherryHostEvent:(e,t,n)=>i.sendCherryHostEvent(e,t,n),onPreviewLick:e=>i.sendPreviewLick(e),requestTranscriptExportApproval:e=>r(async()=>{let{openTranscriptExportApproval:e}=await import(`./wc-transcript-export-B3p8LhYu.js`);return{openTranscriptExportApproval:e}},__vite__mapDeps([42,4,43,13,41,1])).then(({openTranscriptExportApproval:t})=>t(e)),createTranscriptExport:async(e,t)=>{let{runTranscriptExportForFollower:n}=await r(async()=>{let{runTranscriptExportForFollower:e}=await import(`./wc-transcript-export-B3p8LhYu.js`);return{runTranscriptExportForFollower:e}},__vite__mapDeps([42,4,43,13,41,1]));return n(e,t,i)},sendWebhookEvent:(e,t,n)=>i.sendWebhookEvent(e,t,n),onAgentEvent:t=>e.agentHandle.onEvent(t),execInShell:(e,t)=>z(i,{command:e,...t}),browserAPI:e.browser,browserTransport:e.realCdpTransport,vfs:{async stat(t){return(await e.openFs()).stat(t)},async readFile(t,n){return(await e.openFs()).readFile(t,n)}}})}function Ne(e,t){return{wireLeaderHooks:t=>{A(()=>{let e=t.sync.getExecCapableBootstrapIds(),n=t.sync.getBrowserCapableBootstrapIds(),r=t.sync.getFollowerMotds();return t.peers.getPeers().map(t=>({runtimeId:ce(t.bootstrapId),runtime:t.runtime,connectedAt:t.connectedAt??void 0,exec:e.has(t.bootstrapId),cdp:n.has(t.bootstrapId),motd:r.get(t.bootstrapId)}))}),e.sprinkleManager.setSendToSprinkleHook((e,n)=>t.sync.broadcastSprinkleUpdate(e,n)),e.sprinkleManager.setReloadHook(e=>t.sync.broadcastSprinkleReloaded(e)),e.getController()?.setOnLocalUserMessage((e,n,r)=>t.sync.broadcastUserMessage(e,n,r)),e.getController()?.setOnLocalProcessingChange(e=>t.sync.broadcastStatus(e?`processing`:`ready`)),r(async()=>{let{setThemeChangeListener:e,getActiveThemeId:t}=await import(`./theme-engine-jfuTMXZM.js`).then(e=>e.p);return{setThemeChangeListener:e,getActiveThemeId:t}},__vite__mapDeps([44,1,12])).then(({setThemeChangeListener:e,getActiveThemeId:n})=>{let r;e(e=>{n()!==`__preview`&&(clearTimeout(r),r=setTimeout(()=>t.sync.broadcastTheme(e),150))})})},clearLeaderHooks:()=>{A(null),N([]),e.getController()?.setOnLocalUserMessage(void 0),e.getController()?.setOnLocalProcessingChange(void 0),e.sprinkleManager.setSendToSprinkleHook(void 0),e.sprinkleManager.setReloadHook(void 0),t.disposeAll(),r(async()=>{let{setThemeChangeListener:e}=await import(`./theme-engine-jfuTMXZM.js`).then(e=>e.p);return{setThemeChangeListener:e}},__vite__mapDeps([44,1,12])).then(({setThemeChangeListener:e})=>{e(null)})}}}function Pe(e){return{runtime:`slicc-hosted-leader`,kind:`hosted`,onLeaderReady:t=>{fetch(h(`/api/cloud-status`),{method:`POST`,headers:g({"content-type":`application/json`}),body:JSON.stringify({joinUrl:t.joinUrl,trayId:t.trayId,controllerUrl:t.controllerUrl,webhookUrl:t.webhookUrl,runtime:t.runtime,sliccVersion:`5.79.0`}),signal:AbortSignal.timeout(1e4)}).catch(t=>{e.log.error(`failed to POST /api/cloud-status`,{error:String(t)})})}}}function Fe(e,t,n,r,i){let{window:a,log:o}=e;if(e.runtimeMode===`hosted-leader`){a.localStorage.removeItem(y);let i=a.localStorage.getItem(b);if(!i){o.error(`hosted-leader: tray worker base URL not seeded`);return}t.leader=Y({...n(i),...Pe(e)}),r(t.leader),L({log:o});return}let s=a.localStorage.getItem(y),c=a.localStorage.getItem(b);s?t.follower=O($(e,s)):c&&Ie(c,e,t,n,r,i)}function Ie(e,t,n,r,i,a){Ae({workerBaseUrl:e,lockManager:a,shouldLead:()=>!n.leader&&!n.follower&&t.window.localStorage.getItem(`slicc.trayWorkerBaseUrl`)===e,onGranted:t=>{n.lockRelease=t,n.leader=Y(r(e)),i(n.leader)}})}function Le(e,t,n,r){let{window:i,log:a}=e;i.addEventListener(`slicc:tray-join`,r=>{let i=r.detail?.joinUrl;if(!i)return;let o=t.leader,s=t.lockRelease;t.leader=null,t.lockRelease=null,n();let c=t.follower;t.follower=null;try{o?.stop()}catch(e){a.error(`leader stop threw during tray-join switch`,e)}s?.();try{c?.stop()}catch(e){a.error(`previous follower stop threw during tray-join switch`,e)}try{t.follower=O($(e,i))}catch(e){a.error(`tray-join failed`,e)}}),i.addEventListener(`slicc:tray-leave`,e=>{let t=e;r({workerBaseUrl:t.detail?.workerBaseUrl??null,requestId:t.detail?.requestId}).catch(e=>a.error(`tray-leave failed`,e))}),i.addEventListener(`beforeunload`,()=>{t.leader?.stop(),t.follower?.stop(),t.lockRelease?.(),t.lockRelease=null},{once:!0})}async function Re(e){let{loadSprinkleStyles:t}=await r(async()=>{let{loadSprinkleStyles:e}=await import(`./legacy-styles-DcRu2WCJ.js`);return{loadSprinkleStyles:e}},__vite__mapDeps([45,4]));await t();let{client:n,instanceId:i,window:a,log:o}=e,s={leader:null,follower:null,lockRelease:null},c=je(),l=typeof BroadcastChannel==`function`?new BroadcastChannel(x(i)):null,u=Oe({getSync:()=>s.leader?.sync??null,postEvent:e=>{let t={type:`panel-rpc-push`,op:`remote-cdp-event`,payload:e};l?.postMessage(t)}});n.setForwardLickHandler(e=>{let t=s.follower?.currentSync;t?t.forwardLick(e):o.warn(`forward-lick dropped: no active follower sync`)});let d=Me(e,s,u),{wireLeaderHooks:f,clearLeaderHooks:p}=Ne(e,u);a.addEventListener(se,()=>{s.leader?.sync.broadcastSnapshot()});let m=async e=>{let{performTrayLeave:t}=await r(async()=>{let{performTrayLeave:e}=await import(`./tray-leave-runtime-DuZ41JQ-.js`);return{performTrayLeave:e}},__vite__mapDeps([46,26,13,14,1,4,15,16,17,27])),n=()=>{s.leader||(s.lockRelease?.(),s.lockRelease=null)},i=t({workerBaseUrl:e.workerBaseUrl,requestId:e.requestId},{getLeader:()=>s.leader,setLeader:e=>{s.leader=e},getFollower:()=>s.follower,setFollower:e=>{s.follower=e},startLeader:e=>(s.lockRelease?.(),s.lockRelease=null,Q(e,c).then(e=>{if(e.status===`granted`){if(!s.leader){e.release();return}s.lockRelease=e.release}}),Y(d(e))),clearLeaderHooks:p,wireLeaderHooks:f,storage:a.localStorage,log:o});try{let e=await i;return n(),e}catch(e){throw n(),e}};return await I({instanceId:i,browser:e.browser,remoteCdpBridge:u,remoteCdpPushChannel:l,getLeader:()=>s.leader,performTrayLeaveLocally:m,window:a}),Fe(e,s,d,f,c),re(e=>{a.localStorage.setItem(`slicc.leaderTrayStatus`,JSON.stringify(e))}),a.localStorage.setItem(`slicc.leaderTrayStatus`,JSON.stringify(w())),ee(e=>{a.localStorage.setItem(C,JSON.stringify(e))}),a.localStorage.setItem(C,JSON.stringify(S())),N(j(),a.localStorage),Le(e,s,p,m),{getLeader:()=>s.leader,getFollower:()=>s.follower,performTrayLeaveLocally:m}}export{Re as wireWcTray};