shadow-claw 1.34.5 → 1.35.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 (193) hide show
  1. package/.well-known/mcp/server-card.json +1 -1
  2. package/.well-known/mcp.json +1 -1
  3. package/README.md +5 -1
  4. package/dist/cli/chunk-BCLxzLO92.js +5 -0
  5. package/dist/cli/chunk-BHNCi3ui2.js +1 -0
  6. package/dist/cli/chunk-BMPhLSn8.js +1 -0
  7. package/dist/cli/chunk-BMW6QB5-2.js +27 -0
  8. package/dist/cli/chunk-BQCWtrzh.js +1 -0
  9. package/dist/cli/chunk-BQCWtrzh2.js +1 -0
  10. package/dist/cli/chunk-BdJUjMuz.js +1 -0
  11. package/dist/cli/chunk-C47WdxKx2.js +1 -0
  12. package/dist/cli/{chunk-D9dku_3t.js → chunk-CAqvQuGr.js} +1 -1
  13. package/dist/cli/{chunk-DoVxObGa2.js → chunk-CHzhUS1N2.js} +1 -1
  14. package/dist/cli/chunk-CUMlq7Jw2.js +263 -0
  15. package/dist/cli/chunk-CXi9LU9e2.js +110 -0
  16. package/dist/cli/chunk-ChefnX-r.js +110 -0
  17. package/dist/cli/{chunk-zvi71-77.js → chunk-D3JxbzjI2.js} +15 -15
  18. package/dist/cli/chunk-D7VYMl092.js +1 -0
  19. package/dist/cli/chunk-DNIduiJ82.js +91 -0
  20. package/dist/cli/{chunk-C4UfzPK4.js → chunk-DTbrldk_.js} +1 -1
  21. package/dist/cli/chunk-DZ8YBXax.js +969 -0
  22. package/dist/cli/chunk-DduRvw8B2.js +1 -0
  23. package/dist/cli/chunk-DnYxGjdu2.js +1 -0
  24. package/dist/cli/chunk-Ea7nXmgb2.js +1 -0
  25. package/dist/cli/{chunk-BRiGkTIi.js → chunk-EohNY8vW.js} +1 -1
  26. package/dist/cli/chunk-LIIpZlwP2.js +1 -0
  27. package/dist/cli/chunk-LIJZHJml2.js +1 -0
  28. package/dist/cli/chunk-MHBh2BgF2.js +91 -0
  29. package/dist/cli/{chunk-BQ7lHA7c.js → chunk-SKgLGyTY.js} +1 -1
  30. package/dist/cli/chunk-kcJSXcbq2.js +1 -0
  31. package/dist/cli/cli.js +12 -11
  32. package/dist/headless-agent.js +191 -187
  33. package/dist/lib/components/index.js +21 -21
  34. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  35. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  36. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  37. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  38. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  39. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  40. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  41. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  42. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  43. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  44. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  45. package/dist/lib/components/shadow-claw-channels.js +1 -1
  46. package/dist/lib/components/shadow-claw-chat.js +1 -1
  47. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  48. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  49. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  50. package/dist/lib/components/shadow-claw-files.js +1 -1
  51. package/dist/lib/components/shadow-claw-git.js +1 -1
  52. package/dist/lib/components/shadow-claw-llm.js +1 -1
  53. package/dist/lib/components/shadow-claw-networking.js +1 -1
  54. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  55. package/dist/lib/components/shadow-claw-pages.js +1 -1
  56. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  57. package/dist/lib/components/shadow-claw-settings.js +1 -1
  58. package/dist/lib/components/shadow-claw-storage.js +1 -1
  59. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  60. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  61. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  62. package/dist/lib/components/shadow-claw-tools.js +1 -1
  63. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  64. package/dist/lib/components/shadow-claw.js +1 -1
  65. package/dist/lib/{configurePeerJs-DSRcNp3v.js → configurePeerJs-CdPzmpyI.js} +2 -2
  66. package/dist/lib/{configurePeerJs-DSRcNp3v.js.map → configurePeerJs-CdPzmpyI.js.map} +1 -1
  67. package/dist/lib/index.js +21 -21
  68. package/dist/lib/{initControlPlane-CWfE_Oan.js → initControlPlane-BLymRW34.js} +7 -7
  69. package/dist/lib/{initControlPlane-CWfE_Oan.js.map → initControlPlane-BLymRW34.js.map} +1 -1
  70. package/dist/lib/{orchestrator-BEUug1TW.js → orchestrator-DZkhJj7f.js} +13 -2
  71. package/dist/lib/{orchestrator-BEUug1TW.js.map → orchestrator-DZkhJj7f.js.map} +1 -1
  72. package/dist/lib/{orchestrator-CGUzfGbE.js → orchestrator-ZsQTRknI.js} +5 -5
  73. package/dist/lib/{orchestrator-CGUzfGbE.js.map → orchestrator-ZsQTRknI.js.map} +1 -1
  74. package/dist/lib/{peerjs-BSD88rT3.js → peerjs-CJYfnR5V.js} +3 -3
  75. package/dist/lib/{peerjs-BSD88rT3.js.map → peerjs-CJYfnR5V.js.map} +1 -1
  76. package/dist/lib/{push-client-CC3qifgc.js → push-client-C9hIPqLZ.js} +2 -2
  77. package/dist/lib/{push-client-CC3qifgc.js.map → push-client-C9hIPqLZ.js.map} +1 -1
  78. package/dist/lib/{shadow-claw-BWS-UVnE.js → shadow-claw-8qL2-QoK.js} +4 -4
  79. package/dist/lib/{shadow-claw-BWS-UVnE.js.map → shadow-claw-8qL2-QoK.js.map} +1 -1
  80. package/dist/lib/{shadow-claw-channel-config-DwMn3nFJ.js → shadow-claw-channel-config-CvnbqGBy.js} +3 -3
  81. package/dist/lib/{shadow-claw-channel-config-DwMn3nFJ.js.map → shadow-claw-channel-config-CvnbqGBy.js.map} +1 -1
  82. package/dist/lib/{shadow-claw-channels-BdE4cUlx.js → shadow-claw-channels-CkCvjWn1.js} +2 -2
  83. package/dist/lib/{shadow-claw-channels-BdE4cUlx.js.map → shadow-claw-channels-CkCvjWn1.js.map} +1 -1
  84. package/dist/lib/{shadow-claw-chat-DqaMoE9C.js → shadow-claw-chat-B1YEHKN3.js} +3 -3
  85. package/dist/lib/{shadow-claw-chat-DqaMoE9C.js.map → shadow-claw-chat-B1YEHKN3.js.map} +1 -1
  86. package/dist/lib/{shadow-claw-control-plane-D3DUDO29.js → shadow-claw-control-plane-jjo789IE.js} +6 -6
  87. package/dist/lib/{shadow-claw-control-plane-D3DUDO29.js.map → shadow-claw-control-plane-jjo789IE.js.map} +1 -1
  88. package/dist/lib/{shadow-claw-conversations-XT-OXogj.js → shadow-claw-conversations-MMT7wYH3.js} +2 -2
  89. package/dist/lib/{shadow-claw-conversations-XT-OXogj.js.map → shadow-claw-conversations-MMT7wYH3.js.map} +1 -1
  90. package/dist/lib/{shadow-claw-file-viewer-DJqxyd97.js → shadow-claw-file-viewer-qSkD1RQK.js} +2 -2
  91. package/dist/lib/{shadow-claw-file-viewer-DJqxyd97.js.map → shadow-claw-file-viewer-qSkD1RQK.js.map} +1 -1
  92. package/dist/lib/{shadow-claw-files-CUEJlA1o.js → shadow-claw-files-Cg8ycQ_N.js} +2 -2
  93. package/dist/lib/{shadow-claw-files-CUEJlA1o.js.map → shadow-claw-files-Cg8ycQ_N.js.map} +1 -1
  94. package/dist/lib/{shadow-claw-git-D_iVcb86.js → shadow-claw-git-gaClz-ZC.js} +3 -3
  95. package/dist/lib/{shadow-claw-git-D_iVcb86.js.map → shadow-claw-git-gaClz-ZC.js.map} +1 -1
  96. package/dist/lib/{shadow-claw-llm-C2msAsyU.js → shadow-claw-llm-DyOz0qzT.js} +2 -2
  97. package/dist/lib/{shadow-claw-llm-C2msAsyU.js.map → shadow-claw-llm-DyOz0qzT.js.map} +1 -1
  98. package/dist/lib/{shadow-claw-networking-D2NvodC-.js → shadow-claw-networking-B2xx0UUR.js} +2 -2
  99. package/dist/lib/{shadow-claw-networking-D2NvodC-.js.map → shadow-claw-networking-B2xx0UUR.js.map} +1 -1
  100. package/dist/lib/{shadow-claw-notifications-BcvVn_vu.js → shadow-claw-notifications-BjKfZy0k.js} +2 -2
  101. package/dist/lib/{shadow-claw-notifications-BcvVn_vu.js.map → shadow-claw-notifications-BjKfZy0k.js.map} +1 -1
  102. package/dist/lib/{shadow-claw-pages-CTMXRhEX.js → shadow-claw-pages-CJ2tsMtL.js} +2 -2
  103. package/dist/lib/{shadow-claw-pages-CTMXRhEX.js.map → shadow-claw-pages-CJ2tsMtL.js.map} +1 -1
  104. package/dist/lib/{shadow-claw-peerjs-C2YvypqM.js → shadow-claw-peerjs-CazCkXQ1.js} +3 -3
  105. package/dist/lib/{shadow-claw-peerjs-C2YvypqM.js.map → shadow-claw-peerjs-CazCkXQ1.js.map} +1 -1
  106. package/dist/lib/{shadow-claw-settings-B0hiDwEt.js → shadow-claw-settings-qro6pO9I.js} +2 -2
  107. package/dist/lib/{shadow-claw-settings-B0hiDwEt.js.map → shadow-claw-settings-qro6pO9I.js.map} +1 -1
  108. package/dist/lib/{shadow-claw-storage-Dt4yg4Q4.js → shadow-claw-storage-ewDdvCGa.js} +2 -2
  109. package/dist/lib/{shadow-claw-storage-Dt4yg4Q4.js.map → shadow-claw-storage-ewDdvCGa.js.map} +1 -1
  110. package/dist/lib/{shadow-claw-task-server-B2gbZaz4.js → shadow-claw-task-server-DpqQcNIs.js} +2 -2
  111. package/dist/lib/{shadow-claw-task-server-B2gbZaz4.js.map → shadow-claw-task-server-DpqQcNIs.js.map} +1 -1
  112. package/dist/lib/{shadow-claw-tasks-Bxq-niuM.js → shadow-claw-tasks-B2fMF4qE.js} +2 -2
  113. package/dist/lib/{shadow-claw-tasks-Bxq-niuM.js.map → shadow-claw-tasks-B2fMF4qE.js.map} +1 -1
  114. package/dist/lib/{shadow-claw-terminal-BfbW3xtg.js → shadow-claw-terminal-B25kQJC3.js} +2 -2
  115. package/dist/lib/{shadow-claw-terminal-BfbW3xtg.js.map → shadow-claw-terminal-B25kQJC3.js.map} +1 -1
  116. package/dist/lib/{shadow-claw-tools-BNSAaK0Y.js → shadow-claw-tools-B0y8JzoA.js} +10 -3
  117. package/dist/lib/{shadow-claw-tools-BNSAaK0Y.js.map → shadow-claw-tools-B0y8JzoA.js.map} +1 -1
  118. package/dist/lib/{shadow-claw-webvm-Dc2KmEXq.js → shadow-claw-webvm-CoCedIza.js} +2 -2
  119. package/dist/lib/{shadow-claw-webvm-Dc2KmEXq.js.map → shadow-claw-webvm-CoCedIza.js.map} +1 -1
  120. package/dist/lib/{syncWebMcpRegistration-BIL83P0Q.js → syncWebMcpRegistration-JKLALq4e.js} +2 -2
  121. package/dist/lib/{syncWebMcpRegistration-BIL83P0Q.js.map → syncWebMcpRegistration-JKLALq4e.js.map} +1 -1
  122. package/dist/lib/worker/utils/sandboxedEval.d.ts +8 -0
  123. package/dist/public/.well-known/mcp/server-card.json +1 -1
  124. package/dist/public/.well-known/mcp.json +1 -1
  125. package/dist/public/AGENTS.md +1 -1
  126. package/dist/public/README.md +5 -1
  127. package/dist/public/agent.worker.js +1 -1
  128. package/dist/public/components/shadow-claw-tools/shadow-claw-tools.html +1 -1
  129. package/dist/public/{configurePeerJs-B925t9C7.js → configurePeerJs-BrHeJGw1.js} +1 -1
  130. package/dist/public/docs/decisions/headless-cli-agent-participant.md +1 -1
  131. package/dist/public/docs/example/article/index.html +1 -1
  132. package/dist/public/docs/publishing/index.html +1 -1
  133. package/dist/public/docs/skill-creator/index.html +1 -1
  134. package/dist/public/docs/subsystems/cli.md +33 -23
  135. package/dist/public/docs/subsystems/skills.md +17 -0
  136. package/dist/public/docs/subsystems/tools.md +1 -1
  137. package/dist/public/e2e/README.md +2 -2
  138. package/dist/public/{e2e-bridge-CE1xleGn.js → e2e-bridge-D_lyH__p.js} +1 -1
  139. package/dist/public/{executeTool-DtTrsZHV.js → executeTool-b6DnRhcv.js} +2 -1
  140. package/dist/public/{file-viewer-LEEStSq-.js → file-viewer-CKrQoxZi.js} +1 -1
  141. package/dist/public/index.html +1 -1
  142. package/dist/public/index.js +1 -1
  143. package/dist/public/{initControlPlane-e2JgxXEb.js → initControlPlane-Dn-XFuxg.js} +1 -1
  144. package/dist/public/llms.txt +2 -0
  145. package/dist/public/main/index.html +1 -1
  146. package/dist/public/main/memory/index.html +1 -1
  147. package/dist/public/{orchestrator-Baif6kmu.js → orchestrator-0BnBtxHO.js} +3 -2
  148. package/dist/public/{orchestrator-TndREZPL.js → orchestrator-C3GKZriH.js} +1 -1
  149. package/dist/public/{peerjs-DE6WF3h2.js → peerjs-CgfLEp2N.js} +1 -1
  150. package/dist/public/{push-client-B_IkTpNm.js → push-client-D6DLiY1s.js} +1 -1
  151. package/dist/public/service-worker.js +1 -1
  152. package/dist/public/{shadow-claw-channels-BCGz36Zl.js → shadow-claw-channels-DSijinZ9.js} +1 -1
  153. package/dist/public/{shadow-claw-chat-H9U9jbqD.js → shadow-claw-chat-BeHlAjnA.js} +1 -1
  154. package/dist/public/{shadow-claw-control-plane-CeKh64s2.js → shadow-claw-control-plane-BfF_AZSg.js} +2 -2
  155. package/dist/public/{shadow-claw-conversations-C26t1HXN.js → shadow-claw-conversations-Bb_2bVLJ.js} +1 -1
  156. package/dist/public/{shadow-claw-DBeXILmk.js → shadow-claw-f71DlRdV.js} +2 -2
  157. package/dist/public/{shadow-claw-file-viewer-DWUoTjkr.js → shadow-claw-file-viewer-B67000Mm.js} +1 -1
  158. package/dist/public/{shadow-claw-files-BQ8DSX-z.js → shadow-claw-files-DeZZYt01.js} +1 -1
  159. package/dist/public/{shadow-claw-git-CIXyISw-.js → shadow-claw-git-Ccy25LuW.js} +2 -2
  160. package/dist/public/{shadow-claw-llm-D_GpOSZE.js → shadow-claw-llm-XjYcTlXT.js} +1 -1
  161. package/dist/public/{shadow-claw-networking-BYp5K3B7.js → shadow-claw-networking-efXQtydQ.js} +1 -1
  162. package/dist/public/{shadow-claw-notifications-ZiXmPweY.js → shadow-claw-notifications-Cq2ZSeJa.js} +1 -1
  163. package/dist/public/{shadow-claw-pages-BHXwf3BD.js → shadow-claw-pages-BVFNSSb1.js} +1 -1
  164. package/dist/public/{shadow-claw-settings-BfvDvt9c.js → shadow-claw-settings-B3sHxPh9.js} +2 -2
  165. package/dist/public/{shadow-claw-storage-Bvn85DII.js → shadow-claw-storage-DNdlzCgC.js} +1 -1
  166. package/dist/public/{shadow-claw-task-server-DZL_d8FC.js → shadow-claw-task-server-BJq0rpju.js} +1 -1
  167. package/dist/public/{shadow-claw-tasks-Cy8jzd8q.js → shadow-claw-tasks-CkF1uMeZ.js} +1 -1
  168. package/dist/public/{shadow-claw-terminal-BgEXr82T.js → shadow-claw-terminal-CnHhcpA-.js} +1 -1
  169. package/dist/public/{shadow-claw-tools-BjnssRSi.js → shadow-claw-tools-iw0fljud.js} +8 -1
  170. package/dist/public/{shadow-claw-webvm-tZ1VDoVA.js → shadow-claw-webvm-Bliu4V__.js} +1 -1
  171. package/dist/public/{syncWebMcpRegistration-CLMvJ4kV.js → syncWebMcpRegistration-D91usEMu.js} +1 -1
  172. package/package.json +1 -1
  173. package/src/cli/cli.ts +26 -2
  174. package/src/cli/commands/agent.test.ts +421 -0
  175. package/src/cli/commands/agent.ts +270 -20
  176. package/src/components/shadow-claw-tools/shadow-claw-tools.html +7 -0
  177. package/src/worker/headless-agent.ts +14 -0
  178. package/src/worker/headless-types.ts +39 -0
  179. package/src/worker/utils/native-eval-executor.test.ts +36 -0
  180. package/src/worker/utils/native-eval-executor.ts +58 -0
  181. package/src/worker/utils/sandboxedEval.ts +36 -0
  182. package/dist/cli/chunk-1BmpU7jO2.js +0 -1
  183. package/dist/cli/chunk-54Euq8Ji2.js +0 -1
  184. package/dist/cli/chunk-BTitwCgT2.js +0 -88
  185. package/dist/cli/chunk-Bjh76Dai.js +0 -1081
  186. package/dist/cli/chunk-C2HeZQ6K.js +0 -1
  187. package/dist/cli/chunk-CxdpafWg.js +0 -1
  188. package/dist/cli/chunk-DEy72ZNV2.js +0 -88
  189. package/dist/cli/chunk-Da1BZyqf.js +0 -1
  190. package/dist/cli/chunk-FHsJD-Sf2.js +0 -27
  191. package/dist/cli/chunk-aWgoVB7x2.js +0 -1
  192. package/dist/cli/chunk-hOceZVB92.js +0 -371
  193. package/dist/cli/chunk-pwNc6VtC2.js +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"initControlPlane-CWfE_Oan.js","names":["process"],"sources":["../../src/core/control-plane-client.ts","../../src/core/utils/initControlPlane.ts"],"sourcesContent":["/**\n * ShadowClaw — Browser Control Plane Client\n *\n * Supports dual transport:\n * 1. \"sse\" (default): HTTP Server-Sent Events (GET /api/control/events) for\n * server-to-client commands + HTTP POST (/api/control/messages) for client-to-server.\n * Highly proxy-, CDN-, and firewall-compatible.\n * 2. \"websocket\": Full-duplex WebSocket connection to `/ws/control`.\n */\n\nimport type {\n ControlMessage,\n ClientRegisterPayload,\n HeartbeatPayload,\n CommandExecutePayload,\n CommandResultPayload,\n ControlPlaneTransport,\n} from \"../server/control-plane-types.js\";\nimport { ulid } from \"../utils/ulid.js\";\n\nexport type CommandHandler = (args: any) => Promise<any> | any;\n\nexport interface ControlPlaneClientOptions {\n transport?: ControlPlaneTransport;\n url?: string;\n httpUrl?: string;\n token?: string;\n clientId: string;\n deviceLabel?: string;\n capabilities?: string[];\n version?: string;\n peerId?: string;\n heartbeatIntervalMs?: number;\n reconnectDelayMs?: number;\n maxReconnectDelayMs?: number;\n handlers?: Record<string, CommandHandler>;\n WebSocketClass?: any;\n EventSourceClass?: any;\n fetchFn?: typeof fetch;\n}\n\nexport class ControlPlaneClient {\n private _transport: ControlPlaneTransport;\n private _url: string;\n private _httpUrl: string;\n private _token?: string;\n private _clientId: string;\n private _peerId?: string;\n private _deviceLabel: string;\n private _capabilities: string[];\n private _version: string;\n private _heartbeatIntervalMs: number;\n private _reconnectDelayMs: number;\n private _maxReconnectDelayMs: number;\n private _handlers: Map<string, CommandHandler>;\n private _WebSocketClass: any;\n private _EventSourceClass: any;\n private _fetchFn: typeof fetch;\n\n private _ws: WebSocket | null = null;\n private _es: any = null;\n private _heartbeatTimer: any = null;\n private _reconnectTimer: any = null;\n private _currentReconnectDelay: number;\n private _isDestroyed: boolean = false;\n private _state: \"disconnected\" | \"connecting\" | \"connected\" = \"disconnected\";\n\n constructor(options: ControlPlaneClientOptions) {\n this._transport = options.transport || \"sse\";\n this._clientId = options.clientId;\n this._peerId = options.peerId;\n this._deviceLabel = options.deviceLabel || \"ShadowClaw Browser Client\";\n this._capabilities = options.capabilities || [\"webmcp\", \"opfs\", \"push\"];\n this._version = options.version || \"1.27.1\";\n this._token = options.token;\n this._heartbeatIntervalMs = options.heartbeatIntervalMs || 10000;\n this._reconnectDelayMs = options.reconnectDelayMs || 1000;\n this._maxReconnectDelayMs = options.maxReconnectDelayMs || 30000;\n this._currentReconnectDelay = this._reconnectDelayMs;\n this._handlers = new Map();\n\n this._WebSocketClass =\n options.WebSocketClass ||\n (typeof WebSocket !== \"undefined\" ? WebSocket : null);\n this._EventSourceClass =\n options.EventSourceClass ||\n (typeof EventSource !== \"undefined\" ? EventSource : null);\n this._fetchFn =\n options.fetchFn ||\n (typeof fetch !== \"undefined\"\n ? fetch.bind(globalThis)\n : ((() => Promise.reject(new Error(\"fetch not available\"))) as any));\n\n if (options.handlers) {\n for (const [action, handler] of Object.entries(options.handlers)) {\n this.registerHandler(action, handler);\n }\n }\n\n const loc = typeof location !== \"undefined\" ? location : null;\n const origin = loc\n ? `${loc.protocol}//${loc.host}`\n : \"http://127.0.0.1:8888\";\n const wsOrigin = loc\n ? `${loc.protocol === \"https:\" ? \"wss:\" : \"ws:\"}//${loc.host}`\n : \"ws://127.0.0.1:8888\";\n\n this._url = options.url || `${wsOrigin}/ws/control`;\n this._httpUrl = options.httpUrl || origin;\n }\n\n public get transport(): ControlPlaneTransport {\n return this._transport;\n }\n\n public get version(): string {\n return this._version;\n }\n\n public registerHandler(action: string, handler: CommandHandler): void {\n this._handlers.set(action, handler);\n }\n\n public unregisterHandler(action: string): void {\n this._handlers.delete(action);\n }\n\n public getState(): \"disconnected\" | \"connecting\" | \"connected\" {\n return this._state;\n }\n\n public ensureConnected(force: boolean = false): void {\n this._isDestroyed = false;\n if (this._reconnectTimer) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n this._currentReconnectDelay = this._reconnectDelayMs;\n\n if (this._transport === \"websocket\") {\n const isWsOpen =\n this._ws &&\n (this._ws.readyState === 1 ||\n this._ws.readyState === (this._WebSocketClass as any)?.OPEN);\n if (force || !isWsOpen || this._state !== \"connected\") {\n this._cleanupConnection();\n this.connect();\n }\n } else {\n // SSE transport\n const isEsOpen =\n this._es &&\n (this._es.readyState === 1 ||\n this._es.readyState === (this._EventSourceClass as any)?.OPEN);\n if (force || !isEsOpen || this._state !== \"connected\") {\n this._cleanupConnection();\n this.connect();\n }\n }\n }\n\n public connect(): void {\n if (\n this._isDestroyed ||\n this._state === \"connected\" ||\n this._state === \"connecting\"\n ) {\n return;\n }\n\n if (this._transport === \"websocket\") {\n this._connectWebSocket();\n } else {\n this._connectSse();\n }\n }\n\n private _connectWebSocket(): void {\n if (!this._WebSocketClass) {\n console.warn(\n \"[ControlPlaneClient] WebSocket not supported in this environment\",\n );\n return;\n }\n\n this._state = \"connecting\";\n const wsUrl = new URL(this._url, \"ws://127.0.0.1:8888\");\n if (this._token) {\n wsUrl.searchParams.set(\"token\", this._token);\n }\n\n try {\n const ws = new this._WebSocketClass(wsUrl.toString());\n this._ws = ws;\n\n ws.onopen = () => {\n this._state = \"connected\";\n this._currentReconnectDelay = this._reconnectDelayMs;\n this._sendRegister();\n this._startHeartbeat();\n };\n\n ws.onmessage = (event: MessageEvent) => {\n this._handleMessage(event.data);\n };\n\n ws.onclose = () => {\n this._cleanupConnection();\n if (!this._isDestroyed) {\n this._scheduleReconnect();\n }\n };\n\n ws.onerror = (err: any) => {\n console.warn(\"[ControlPlaneClient] WebSocket error:\", err);\n };\n } catch (err) {\n console.warn(\n \"[ControlPlaneClient] Failed to establish WebSocket connection:\",\n err,\n );\n this._cleanupConnection();\n this._scheduleReconnect();\n }\n }\n\n private _connectSse(): void {\n if (!this._EventSourceClass) {\n if (typeof process === \"undefined\" || !process.env?.JEST_WORKER_ID) {\n console.warn(\n \"[ControlPlaneClient] EventSource not supported in this environment\",\n );\n }\n return;\n }\n\n this._state = \"connecting\";\n const sseUrl = new URL(\"/api/control/events\", this._httpUrl);\n sseUrl.searchParams.set(\"clientId\", this._clientId);\n if (this._token) {\n sseUrl.searchParams.set(\"token\", this._token);\n }\n\n try {\n const es = new this._EventSourceClass(sseUrl.toString());\n this._es = es;\n\n es.onopen = () => {\n this._state = \"connected\";\n this._currentReconnectDelay = this._reconnectDelayMs;\n this._sendRegister();\n this._startHeartbeat();\n };\n\n if (typeof es.addEventListener === \"function\") {\n es.addEventListener(\"command:execute\", (event: MessageEvent) => {\n this._handleMessage(event.data);\n });\n }\n\n es.onmessage = (event: MessageEvent) => {\n this._handleMessage(event.data);\n };\n\n es.onerror = (err: any) => {\n console.warn(\"[ControlPlaneClient] SSE connection error:\", err);\n this._cleanupConnection();\n if (!this._isDestroyed) {\n this._scheduleReconnect();\n }\n };\n } catch (err) {\n console.warn(\n \"[ControlPlaneClient] Failed to establish SSE connection:\",\n err,\n );\n this._cleanupConnection();\n this._scheduleReconnect();\n }\n }\n\n public disconnect(): void {\n this._isDestroyed = true;\n try {\n this._sendUnregister();\n } catch (_) {}\n this._cleanupConnection();\n if (this._reconnectTimer) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n }\n\n private _cleanupConnection(): void {\n this._state = \"disconnected\";\n this._stopHeartbeat();\n if (this._ws) {\n try {\n this._ws.close();\n } catch (_) {}\n this._ws = null;\n }\n if (this._es) {\n try {\n this._es.close();\n } catch (_) {}\n this._es = null;\n }\n }\n\n private _scheduleReconnect(): void {\n if (this._reconnectTimer || this._isDestroyed) {\n return;\n }\n\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\n if (!this._isDestroyed) {\n this.connect();\n }\n }, this._currentReconnectDelay);\n\n this._currentReconnectDelay = Math.min(\n this._currentReconnectDelay * 1.5,\n this._maxReconnectDelayMs,\n );\n }\n\n private _startHeartbeat(): void {\n this._stopHeartbeat();\n this._heartbeatTimer = setInterval(() => {\n this._sendHeartbeat();\n }, this._heartbeatIntervalMs);\n }\n\n private _stopHeartbeat(): void {\n if (this._heartbeatTimer) {\n clearInterval(this._heartbeatTimer);\n this._heartbeatTimer = null;\n }\n }\n\n private _sendRegister(): void {\n const payload: ClientRegisterPayload = {\n clientId: this._clientId,\n deviceLabel: this._deviceLabel,\n capabilities: this._capabilities,\n version: this._version,\n transport: this._transport,\n peerId: this._peerId,\n };\n this._sendMessage({\n id: ulid(),\n type: \"client:register\",\n payload,\n });\n }\n\n private _sendHeartbeat(): void {\n const payload: HeartbeatPayload = {\n clientId: this._clientId,\n timestamp: Date.now(),\n };\n this._sendMessage({\n id: ulid(),\n type: \"client:heartbeat\",\n payload,\n });\n }\n\n private _sendUnregister(): void {\n if (!this._clientId) return;\n const payload = {\n clientId: this._clientId,\n };\n this._sendMessage({\n id: ulid(),\n type: \"client:unregister\",\n payload,\n });\n }\n\n private _sendMessage(msg: ControlMessage): void {\n if (this._transport === \"websocket\") {\n if (\n this._ws &&\n (this._ws.readyState === 1 ||\n this._ws.readyState === (this._WebSocketClass as any)?.OPEN)\n ) {\n this._ws.send(JSON.stringify(msg));\n }\n return;\n }\n\n // SSE Mode: send messages to server via HTTP POST /api/control/messages\n const messagesUrl = new URL(\"/api/control/messages\", this._httpUrl);\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (this._token) {\n headers[\"x-control-token\"] = this._token;\n headers[\"Authorization\"] = `Bearer ${this._token}`;\n }\n\n const fetchOptions: any = {\n method: \"POST\",\n headers,\n body: JSON.stringify(msg),\n };\n\n const host = messagesUrl.hostname.toLowerCase();\n const isLoopback =\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host === \"[::1]\";\n const isPrivate = /^(10\\.|172\\.(1[6-9]|2\\d|3[01])\\.|192\\.168\\.)/.test(host);\n\n if (isLoopback) {\n fetchOptions.targetAddressSpace = \"loopback\";\n } else if (isPrivate) {\n fetchOptions.targetAddressSpace = \"private\";\n }\n\n this._fetchFn(messagesUrl.toString(), fetchOptions).catch((err) => {\n console.warn(\n \"[ControlPlaneClient] Failed to send message via HTTP POST:\",\n err,\n );\n });\n }\n\n private async _handleMessage(dataStr: string): Promise<void> {\n if (!dataStr || typeof dataStr !== \"string\") {\n return;\n }\n\n let msg: ControlMessage;\n try {\n msg = JSON.parse(dataStr);\n } catch {\n return;\n }\n\n if (msg.type === \"command:execute\") {\n const payload = msg.payload as CommandExecutePayload;\n const { commandId, action, args } = payload;\n\n const handler = this._handlers.get(action);\n if (!handler) {\n this._sendMessage({\n id: ulid(),\n type: \"command:result\",\n replyTo: msg.id,\n payload: {\n commandId,\n success: false,\n error: `Unknown action: ${action}`,\n } as CommandResultPayload,\n });\n return;\n }\n\n try {\n const result = await handler(args);\n this._sendMessage({\n id: ulid(),\n type: \"command:result\",\n replyTo: msg.id,\n payload: {\n commandId,\n success: true,\n data: result,\n } as CommandResultPayload,\n });\n } catch (err: any) {\n this._sendMessage({\n id: ulid(),\n type: \"command:result\",\n replyTo: msg.id,\n payload: {\n commandId,\n success: false,\n error: err.message || String(err),\n } as CommandResultPayload,\n });\n }\n }\n }\n}\n","/**\n * ShadowClaw — Control Plane Browser Initialization Helper\n */\n\nimport { ControlPlaneClient } from \"../control-plane-client.js\";\nimport { getDeploymentNamespace } from \"../app-routes.js\";\nimport { getDb } from \"../../db/db.js\";\nimport { getAllTasks } from \"../../db/getAllTasks.js\";\nimport { ulid } from \"../../utils/ulid.js\";\nimport {\n CONFIG_KEYS,\n DEFAULT_CONTROL_PLANE_ENABLED,\n DEFAULT_CONTROL_PLANE_TRANSPORT,\n} from \"../../config/config.js\";\nimport type { ControlPlaneTransport } from \"../../server/control-plane-types.js\";\n\nexport function getOrCreateControlPlaneClientId(): string {\n if (typeof localStorage !== \"undefined\") {\n try {\n const stored = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID);\n if (stored && stored.trim()) {\n return stored.trim();\n }\n } catch (_) {}\n }\n\n const namespace = getDeploymentNamespace();\n const generated = namespace\n ? `${namespace}-${ulid().toLowerCase()}`\n : `client-${ulid().toLowerCase()}`;\n\n if (typeof localStorage !== \"undefined\") {\n try {\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID, generated);\n } catch (_) {}\n }\n\n return generated;\n}\n\nexport function isControlPlaneEnabledSync(): boolean {\n if (typeof localStorage !== \"undefined\") {\n try {\n const val = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_ENABLED);\n if (val !== null) {\n return val === \"true\" || val === \"1\";\n }\n } catch (_) {}\n }\n return DEFAULT_CONTROL_PLANE_ENABLED;\n}\n\nexport async function isControlPlaneEnabled(db?: any): Promise<boolean> {\n if (typeof localStorage !== \"undefined\") {\n try {\n const val = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_ENABLED);\n if (val !== null) {\n return val === \"true\" || val === \"1\";\n }\n } catch (_) {}\n }\n\n if (db) {\n try {\n const { getConfig } = await import(\"../../db/getConfig.js\");\n const val = await getConfig(db, CONFIG_KEYS.CONTROL_PLANE_ENABLED);\n if (val !== null && val !== undefined) {\n return val === \"true\" || val === \"1\";\n }\n } catch (_) {}\n }\n\n return DEFAULT_CONTROL_PLANE_ENABLED;\n}\n\nexport function shouldConnectControlPlane(loc?: {\n protocol?: string;\n hostname?: string;\n}): boolean {\n if (typeof EventSource === \"undefined\" && typeof WebSocket === \"undefined\") {\n return false;\n }\n\n const currentLoc = loc || (typeof location !== \"undefined\" ? location : null);\n if (!currentLoc) {\n return false;\n }\n\n if (currentLoc.protocol === \"file:\") {\n return false;\n }\n\n if (\n typeof document !== \"undefined\" &&\n document.querySelector('meta[name=\"shadowclaw-static-only\"]')\n ) {\n return false;\n }\n\n return true;\n}\n\nexport function getControlPlaneServerUrl(loc?: {\n protocol?: string;\n host?: string;\n hostname?: string;\n}): { httpUrl: string; wsUrl: string } {\n let customUrl = \"\";\n if (typeof localStorage !== \"undefined\") {\n try {\n customUrl = (\n localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_URL) || \"\"\n ).trim();\n } catch (_) {}\n }\n\n const currentLoc = loc || (typeof location !== \"undefined\" ? location : null);\n const isStaticHost =\n currentLoc &&\n (currentLoc.protocol === \"file:\" ||\n (currentLoc.hostname &&\n (currentLoc.hostname.endsWith(\".github.io\") ||\n currentLoc.hostname.endsWith(\".pages.dev\"))));\n\n let baseHttp = customUrl;\n if (!baseHttp) {\n if (isStaticHost) {\n baseHttp = \"http://127.0.0.1:8888\";\n } else if (currentLoc && currentLoc.host) {\n baseHttp = `${currentLoc.protocol}//${currentLoc.host}`;\n } else {\n baseHttp = \"http://127.0.0.1:8888\";\n }\n }\n\n baseHttp = baseHttp.replace(/\\/+$/, \"\");\n\n const baseWs = baseHttp.replace(/^https?:/, (proto) =>\n proto === \"https:\" ? \"wss:\" : \"ws:\",\n );\n\n return {\n httpUrl: baseHttp,\n wsUrl: `${baseWs}/ws/control`,\n };\n}\n\nexport function detectCapabilities(): string[] {\n const caps: string[] = [];\n\n if (typeof navigator !== \"undefined\") {\n if (\n navigator.storage &&\n typeof navigator.storage.getDirectory === \"function\"\n ) {\n caps.push(\"opfs\");\n }\n\n if (\n \"serviceWorker\" in navigator &&\n typeof window !== \"undefined\" &&\n \"PushManager\" in window\n ) {\n caps.push(\"push\");\n }\n\n if (\n (typeof document !== \"undefined\" && (document as any).modelContext) ||\n ((navigator as any) && (navigator as any).modelContext)\n ) {\n caps.push(\"webmcp\");\n }\n }\n\n if (typeof RTCPeerConnection !== \"undefined\") {\n caps.push(\"peerjs\");\n }\n\n return caps;\n}\n\nexport function detectDeviceLabel(): string {\n if (typeof navigator === \"undefined\") {\n return \"ShadowClaw Node\";\n }\n\n const ua = navigator.userAgent;\n let device = \"Desktop\";\n if (/iPad/i.test(ua)) device = \"iPad\";\n else if (/iPhone/i.test(ua)) device = \"iPhone\";\n else if (/Android/i.test(ua)) device = \"Android\";\n else if (/Macintosh/i.test(ua)) device = \"Mac\";\n else if (/Windows/i.test(ua)) device = \"Windows\";\n else if (/Linux/i.test(ua)) device = \"Linux\";\n\n let browser = \"Browser\";\n if (/Chrome/i.test(ua) && !/Edg/i.test(ua)) browser = \"Chrome\";\n else if (/Safari/i.test(ua) && !/Chrome/i.test(ua)) browser = \"Safari\";\n else if (/Firefox/i.test(ua)) browser = \"Firefox\";\n else if (/Edg/i.test(ua)) browser = \"Edge\";\n\n return `${device} ${browser}`;\n}\n\nexport function detectClientVersion(): string {\n let version = \"\";\n let revision = \"\";\n\n if (typeof document !== \"undefined\") {\n version =\n document\n .querySelector('meta[name=\"version\"]')\n ?.getAttribute(\"content\")\n ?.trim() || \"\";\n revision =\n document\n .querySelector('meta[name=\"revision\"]')\n ?.getAttribute(\"content\")\n ?.trim() || \"\";\n }\n\n const shortRevision = revision.length > 7 ? revision.slice(0, 7) : revision;\n\n if (version && shortRevision) {\n return `${version} (${shortRevision})`;\n }\n if (version) {\n return version;\n }\n if (shortRevision) {\n return shortRevision;\n }\n return \"1.27.1\";\n}\n\nexport interface InitControlPlaneOptions {\n orchestrator?: any;\n clientId?: string;\n transport?: ControlPlaneTransport;\n autoConnect?: boolean;\n version?: string;\n}\n\nlet activeClient: ControlPlaneClient | null = null;\n\nexport async function executeClientControlCommand(\n action: string,\n args: any = {},\n options: InitControlPlaneOptions = {},\n): Promise<any> {\n const clientId = getOrCreateControlPlaneClientId();\n const deviceLabel = detectDeviceLabel();\n const capabilities = detectCapabilities();\n\n switch (action) {\n case \"send-message\": {\n if (!args.text) {\n throw new Error(\"Missing text parameter\");\n }\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const orch = options.orchestrator || orchestratorStore.orchestrator;\n const targetGroupId =\n args.groupId || orchestratorStore.activeGroupId || \"br:main\";\n\n if (orch?.browserChat?.submit) {\n orch.browserChat.submit(args.text, targetGroupId);\n return { queued: true, groupId: targetGroupId };\n }\n if (orch?.submitMessage) {\n orch.submitMessage(args.text, targetGroupId);\n return { queued: true, groupId: targetGroupId };\n }\n if (orchestratorStore.sendMessage) {\n orchestratorStore.sendMessage(args.text);\n return { queued: true, groupId: targetGroupId };\n }\n return { queued: false, error: \"Orchestrator not ready\" };\n }\n\n case \"list-tasks\": {\n const db = await getDb();\n let tasks = await getAllTasks(db);\n if (args?.groupId) {\n tasks = tasks.filter((t) => t.groupId === args.groupId);\n }\n return { tasks };\n }\n\n case \"read-state\": {\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const orch = options.orchestrator || orchestratorStore.orchestrator;\n return {\n clientId,\n deviceLabel,\n capabilities,\n version: options.version || detectClientVersion(),\n activeGroupId:\n options.orchestrator?.activeGroupId ||\n orchestratorStore.activeGroupId ||\n orch?.activeGroupId ||\n \"br:main\",\n state:\n options.orchestrator?.state ||\n orchestratorStore.state ||\n orch?.state ||\n \"idle\",\n };\n }\n\n case \"list-tools\": {\n try {\n const { getWebMcpTools } =\n await import(\"../../subsystems/mcp/webmcp.js\");\n const webMcpTools = await getWebMcpTools();\n if (webMcpTools && webMcpTools.length > 0) {\n return {\n tools: webMcpTools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n annotations: t.annotations,\n })),\n };\n }\n } catch (_) {}\n\n // Fallback: filter by conversation group toolTags if active\n try {\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const orch =\n options.orchestrator ||\n orchestratorStore.orchestrator ||\n (typeof document !== \"undefined\"\n ? (document.querySelector(\"shadow-claw\") as any)?.orchestrator\n : null);\n const activeGroupId =\n args.groupId ||\n orch?.activeGroupId ||\n orchestratorStore.activeGroupId ||\n \"br:main\";\n const group = orchestratorStore.groups.find(\n (g) => g.groupId === activeGroupId,\n );\n\n if (group?.toolTags && group.toolTags.length > 0) {\n const { TOOL_DEFINITIONS } =\n await import(\"../../subsystems/tools/index.js\");\n const { parseWebMcpInputSchema } =\n await import(\"../../subsystems/mcp/webmcp.js\");\n const activeTools = TOOL_DEFINITIONS.filter((t) =>\n group.toolTags!.includes(t.name),\n );\n return {\n tools: activeTools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: parseWebMcpInputSchema(t.input_schema),\n })),\n };\n }\n } catch (_) {}\n\n // Default fallback: list built-in TOOL_DEFINITIONS\n const { TOOL_DEFINITIONS } =\n await import(\"../../subsystems/tools/index.js\");\n const { parseWebMcpInputSchema } =\n await import(\"../../subsystems/mcp/webmcp.js\");\n return {\n tools: TOOL_DEFINITIONS.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: parseWebMcpInputSchema(t.input_schema),\n })),\n };\n }\n\n case \"invoke-tool\": {\n if (!args.toolName) {\n throw new Error(\"Missing toolName parameter\");\n }\n\n // 1. Validate tool against active conversation group and toolsStore\n try {\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const { toolsStore } = await import(\"../../stores/tools.js\");\n const orch =\n options.orchestrator ||\n orchestratorStore.orchestrator ||\n (typeof document !== \"undefined\"\n ? (document.querySelector(\"shadow-claw\") as any)?.orchestrator\n : null);\n const activeGroupId =\n args.groupId ||\n orch?.activeGroupId ||\n orchestratorStore.activeGroupId ||\n \"br:main\";\n const group = orchestratorStore.groups.find(\n (g) => g.groupId === activeGroupId,\n );\n\n if (group?.toolTags && group.toolTags.length > 0) {\n if (!group.toolTags.includes(args.toolName)) {\n throw new Error(\n `Tool '${args.toolName}' is not enabled in the active conversation (${activeGroupId}).`,\n );\n }\n } else if (\n toolsStore?.allTools &&\n toolsStore.allTools.some((t: any) => t.name === args.toolName) &&\n toolsStore?.enabledToolNames &&\n toolsStore.enabledToolNames.size > 0\n ) {\n const isBuiltIn = toolsStore.enabledToolNames.has(args.toolName);\n const isDeclarative = toolsStore.isDeclarativeToolEnabled(\n args.toolName,\n );\n if (!isBuiltIn && !isDeclarative) {\n throw new Error(\n `Tool '${args.toolName}' is not enabled on this client.`,\n );\n }\n }\n } catch (err: any) {\n if (err.message && err.message.includes(\"is not enabled\")) {\n throw err;\n }\n }\n\n const ctx =\n (typeof document !== \"undefined\" && (document as any).modelContext) ||\n (typeof navigator !== \"undefined\" && (navigator as any).modelContext);\n\n if (ctx) {\n let matchedTool: any;\n if (typeof ctx.getTools === \"function\") {\n try {\n const tools = await ctx.getTools();\n if (Array.isArray(tools) && tools.length > 0) {\n matchedTool = tools.find((t: any) => t.name === args.toolName);\n if (!matchedTool) {\n throw new Error(\n `Tool '${args.toolName}' is not enabled or registered on this client.`,\n );\n }\n } else {\n matchedTool = Array.isArray(tools)\n ? tools.find((t: any) => t.name === args.toolName)\n : undefined;\n }\n if (matchedTool && typeof matchedTool.execute === \"function\") {\n const res = await matchedTool.execute(\n typeof args.input === \"string\"\n ? JSON.parse(args.input)\n : args.input || {},\n );\n return { result: res };\n }\n } catch (err: any) {\n if (err.message && err.message.includes(\"is not enabled\")) {\n throw err;\n }\n }\n }\n\n const { executeWebMcpTool } =\n await import(\"../../subsystems/mcp/webmcp.js\");\n\n if (typeof ctx.executeTool === \"function\") {\n // 1. Pass the actual ModelContextTool object from getTools() if available (required by native Chromium)\n if (matchedTool) {\n try {\n const res = await executeWebMcpTool(ctx, matchedTool, args.input);\n return { result: res };\n } catch (_) {}\n }\n\n // 2. Pass { name: toolName } object (accepted by polyfill / mocks)\n try {\n const res = await executeWebMcpTool(\n ctx,\n { name: args.toolName },\n args.input,\n );\n return { result: res };\n } catch (_) {}\n\n // 3. Pass toolName string directly (accepted by some preview shims)\n try {\n const res = await executeWebMcpTool(ctx, args.toolName, args.input);\n return { result: res };\n } catch (_) {}\n }\n\n const inputStr =\n typeof args.input === \"string\"\n ? args.input\n : JSON.stringify(args.input || {});\n\n // 4. Check navigator.modelContextTesting if present\n if (\n typeof navigator !== \"undefined\" &&\n (navigator as any).modelContextTesting &&\n typeof (navigator as any).modelContextTesting.executeTool ===\n \"function\"\n ) {\n try {\n const res = await (\n navigator as any\n ).modelContextTesting.executeTool(args.toolName, inputStr);\n return { result: res };\n } catch (_) {}\n }\n\n // 5. Check callTool (MCP-B / extension runtime)\n if (typeof ctx.callTool === \"function\") {\n try {\n const res = await ctx.callTool({\n name: args.toolName,\n arguments:\n typeof args.input === \"string\"\n ? JSON.parse(args.input)\n : args.input || {},\n });\n return { result: res };\n } catch (_) {}\n }\n\n // 6. Check invoke\n if (typeof ctx.invoke === \"function\") {\n try {\n const res = await ctx.invoke(\n args.toolName,\n typeof args.input === \"string\"\n ? JSON.parse(args.input)\n : args.input || {},\n );\n return { result: res };\n } catch (_) {}\n }\n }\n\n // Worker fallback if agent worker is active\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const orch =\n options.orchestrator ||\n orchestratorStore.orchestrator ||\n (typeof document !== \"undefined\"\n ? (document.querySelector(\"shadow-claw\") as any)?.orchestrator\n : null);\n const worker: any = orch?.agentWorker;\n if (worker && typeof worker.postMessage === \"function\") {\n const callId =\n Date.now().toString(36) + Math.random().toString(36).slice(2);\n const isInteractive = args.toolName === \"ask_user\";\n const fallbackTimeoutMs =\n args.timeoutMs || (isInteractive ? 300000 : 60000);\n const result = await new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n worker.removeEventListener(\"message\", handler);\n reject(new Error(\"Timeout waiting for tool execution\"));\n }, fallbackTimeoutMs);\n\n const handler = (event: MessageEvent) => {\n const data = event.data;\n if (\n data &&\n data.type === \"execute-tool-result\" &&\n data.callId === callId\n ) {\n clearTimeout(timeout);\n worker.removeEventListener(\"message\", handler);\n if (data.error) {\n reject(new Error(data.error));\n } else {\n resolve(data.result);\n }\n }\n };\n\n worker.addEventListener(\"message\", handler);\n worker.postMessage({\n type: \"execute-tool\",\n callId,\n payload: {\n name: args.toolName,\n input:\n typeof args.input === \"string\"\n ? JSON.parse(args.input)\n : args.input || {},\n groupId: args.groupId || orch?.activeGroupId || \"br:main\",\n },\n });\n });\n return { result };\n }\n\n throw new Error(\n `Tool ${args.toolName} could not be executed (no context or worker available)`,\n );\n }\n\n case \"trigger-backup\": {\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const targetGroupId =\n args.groupId ||\n options.orchestrator?.activeGroupId ||\n orchestratorStore.activeGroupId ||\n \"br:main\";\n const db = await getDb();\n const { getGroupDir } = await import(\"../../storage/getGroupDir.js\");\n const groupDir = await getGroupDir(db, targetGroupId);\n\n async function collectFiles(\n dir: FileSystemDirectoryHandle,\n prefix = \"\",\n ): Promise<string[]> {\n const result: string[] = [];\n for await (const [name, handle] of (dir as any).entries()) {\n const relPath = prefix ? `${prefix}/${name}` : name;\n if (handle.kind === \"directory\") {\n const sub = await collectFiles(handle, relPath);\n result.push(...sub);\n } else {\n result.push(relPath);\n }\n }\n return result;\n }\n\n async function readFile(relPath: string): Promise<Uint8Array | null> {\n try {\n const parts = relPath.split(\"/\");\n let cur: FileSystemDirectoryHandle = groupDir;\n for (let i = 0; i < parts.length - 1; i++) {\n cur = await cur.getDirectoryHandle(parts[i]);\n }\n const fileHandle = await cur.getFileHandle(parts[parts.length - 1]);\n const file = await fileHandle.getFile();\n const buffer = await file.arrayBuffer();\n return new Uint8Array(buffer);\n } catch {\n return null;\n }\n }\n\n const { BackupController } = await import(\"../backup-controller.js\");\n\n const backupCtrl = new BackupController({\n clientId,\n token: args.token,\n serverBaseUrl: getControlPlaneServerUrl().httpUrl,\n fileEnumerator: () => collectFiles(groupDir),\n fileReader: (filePath) => readFile(filePath),\n });\n\n const result = await backupCtrl.initiate();\n return result;\n }\n\n default:\n throw new Error(`Unknown action '${action}'`);\n }\n}\n\nexport function createDefaultControlPlaneClient(\n options: InitControlPlaneOptions = {},\n): ControlPlaneClient {\n if (activeClient) {\n try {\n activeClient.disconnect();\n } catch (_) {}\n activeClient = null;\n }\n\n const clientId =\n (options.clientId && options.clientId.trim()) ||\n getOrCreateControlPlaneClientId();\n const capabilities = detectCapabilities();\n const deviceLabel = detectDeviceLabel();\n const version = options.version || detectClientVersion();\n\n let configuredTransport: ControlPlaneTransport | null = null;\n if (typeof localStorage !== \"undefined\") {\n try {\n const stored = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_TRANSPORT);\n if (stored === \"sse\" || stored === \"websocket\") {\n configuredTransport = stored;\n }\n } catch (_) {}\n }\n\n const transport =\n options.transport ||\n configuredTransport ||\n (DEFAULT_CONTROL_PLANE_TRANSPORT as ControlPlaneTransport);\n\n let peerId: string | undefined;\n if (typeof localStorage !== \"undefined\") {\n try {\n // CONFIG_KEYS.PEERJS_MY_PEER_ID is \"peerjs_my_peer_id\" — set by configurePeerJs via setConfig.\n // We also check the raw IndexedDB config key written by setConfig, which mirrors to localStorage\n // under the same key name in browser environments that support it.\n peerId = localStorage.getItem(CONFIG_KEYS.PEERJS_MY_PEER_ID) || undefined;\n } catch (_) {}\n }\n\n const { httpUrl, wsUrl } = getControlPlaneServerUrl();\n\n const client = new ControlPlaneClient({\n clientId,\n deviceLabel,\n capabilities,\n version,\n peerId,\n transport,\n httpUrl,\n url: wsUrl,\n handlers: {\n \"send-message\": (args: any) =>\n executeClientControlCommand(\"send-message\", args, options),\n \"list-tasks\": (args: any) =>\n executeClientControlCommand(\"list-tasks\", args, options),\n \"read-state\": (args: any) =>\n executeClientControlCommand(\"read-state\", args, options),\n \"invoke-tool\": (args: any) =>\n executeClientControlCommand(\"invoke-tool\", args, options),\n \"list-tools\": (args: any) =>\n executeClientControlCommand(\"list-tools\", args, options),\n \"trigger-backup\": (args: any) =>\n executeClientControlCommand(\"trigger-backup\", args, options),\n },\n });\n\n if (options.autoConnect !== false && shouldConnectControlPlane()) {\n client.connect();\n }\n\n activeClient = client;\n return client;\n}\n\nexport function getActiveControlPlaneClient(): ControlPlaneClient | null {\n return activeClient;\n}\n\nexport function stopControlPlaneClient(): void {\n if (activeClient) {\n try {\n activeClient.disconnect();\n } catch (_) {}\n activeClient = null;\n }\n}\n\nexport async function ensureControlPlaneConnected(\n options: InitControlPlaneOptions & { db?: any; force?: boolean } = {},\n): Promise<ControlPlaneClient | null> {\n let db = options.db;\n if (!db) {\n try {\n db = await getDb();\n } catch (_) {}\n }\n\n const enabled = await isControlPlaneEnabled(db);\n if (!enabled) {\n stopControlPlaneClient();\n return null;\n }\n\n if (!shouldConnectControlPlane()) {\n return null;\n }\n\n // Synchronize configuration from db to localStorage so synchronous lookups remain consistent\n if (typeof localStorage !== \"undefined\" && db) {\n try {\n const { getConfig } = await import(\"../../db/getConfig.js\");\n const [url, transport] = await Promise.all([\n getConfig(db, CONFIG_KEYS.CONTROL_PLANE_URL),\n getConfig(db, CONFIG_KEYS.CONTROL_PLANE_TRANSPORT),\n ]);\n if (url) {\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_URL, url);\n }\n if (transport) {\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_TRANSPORT, transport);\n }\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_ENABLED, \"true\");\n } catch (_) {}\n }\n\n const client = getActiveControlPlaneClient();\n if (client) {\n client.ensureConnected(options.force);\n return client;\n }\n\n return createDefaultControlPlaneClient(options);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"initControlPlane-BLymRW34.js","names":["process"],"sources":["../../src/core/control-plane-client.ts","../../src/core/utils/initControlPlane.ts"],"sourcesContent":["/**\n * ShadowClaw — Browser Control Plane Client\n *\n * Supports dual transport:\n * 1. \"sse\" (default): HTTP Server-Sent Events (GET /api/control/events) for\n * server-to-client commands + HTTP POST (/api/control/messages) for client-to-server.\n * Highly proxy-, CDN-, and firewall-compatible.\n * 2. \"websocket\": Full-duplex WebSocket connection to `/ws/control`.\n */\n\nimport type {\n ControlMessage,\n ClientRegisterPayload,\n HeartbeatPayload,\n CommandExecutePayload,\n CommandResultPayload,\n ControlPlaneTransport,\n} from \"../server/control-plane-types.js\";\nimport { ulid } from \"../utils/ulid.js\";\n\nexport type CommandHandler = (args: any) => Promise<any> | any;\n\nexport interface ControlPlaneClientOptions {\n transport?: ControlPlaneTransport;\n url?: string;\n httpUrl?: string;\n token?: string;\n clientId: string;\n deviceLabel?: string;\n capabilities?: string[];\n version?: string;\n peerId?: string;\n heartbeatIntervalMs?: number;\n reconnectDelayMs?: number;\n maxReconnectDelayMs?: number;\n handlers?: Record<string, CommandHandler>;\n WebSocketClass?: any;\n EventSourceClass?: any;\n fetchFn?: typeof fetch;\n}\n\nexport class ControlPlaneClient {\n private _transport: ControlPlaneTransport;\n private _url: string;\n private _httpUrl: string;\n private _token?: string;\n private _clientId: string;\n private _peerId?: string;\n private _deviceLabel: string;\n private _capabilities: string[];\n private _version: string;\n private _heartbeatIntervalMs: number;\n private _reconnectDelayMs: number;\n private _maxReconnectDelayMs: number;\n private _handlers: Map<string, CommandHandler>;\n private _WebSocketClass: any;\n private _EventSourceClass: any;\n private _fetchFn: typeof fetch;\n\n private _ws: WebSocket | null = null;\n private _es: any = null;\n private _heartbeatTimer: any = null;\n private _reconnectTimer: any = null;\n private _currentReconnectDelay: number;\n private _isDestroyed: boolean = false;\n private _state: \"disconnected\" | \"connecting\" | \"connected\" = \"disconnected\";\n\n constructor(options: ControlPlaneClientOptions) {\n this._transport = options.transport || \"sse\";\n this._clientId = options.clientId;\n this._peerId = options.peerId;\n this._deviceLabel = options.deviceLabel || \"ShadowClaw Browser Client\";\n this._capabilities = options.capabilities || [\"webmcp\", \"opfs\", \"push\"];\n this._version = options.version || \"1.27.1\";\n this._token = options.token;\n this._heartbeatIntervalMs = options.heartbeatIntervalMs || 10000;\n this._reconnectDelayMs = options.reconnectDelayMs || 1000;\n this._maxReconnectDelayMs = options.maxReconnectDelayMs || 30000;\n this._currentReconnectDelay = this._reconnectDelayMs;\n this._handlers = new Map();\n\n this._WebSocketClass =\n options.WebSocketClass ||\n (typeof WebSocket !== \"undefined\" ? WebSocket : null);\n this._EventSourceClass =\n options.EventSourceClass ||\n (typeof EventSource !== \"undefined\" ? EventSource : null);\n this._fetchFn =\n options.fetchFn ||\n (typeof fetch !== \"undefined\"\n ? fetch.bind(globalThis)\n : ((() => Promise.reject(new Error(\"fetch not available\"))) as any));\n\n if (options.handlers) {\n for (const [action, handler] of Object.entries(options.handlers)) {\n this.registerHandler(action, handler);\n }\n }\n\n const loc = typeof location !== \"undefined\" ? location : null;\n const origin = loc\n ? `${loc.protocol}//${loc.host}`\n : \"http://127.0.0.1:8888\";\n const wsOrigin = loc\n ? `${loc.protocol === \"https:\" ? \"wss:\" : \"ws:\"}//${loc.host}`\n : \"ws://127.0.0.1:8888\";\n\n this._url = options.url || `${wsOrigin}/ws/control`;\n this._httpUrl = options.httpUrl || origin;\n }\n\n public get transport(): ControlPlaneTransport {\n return this._transport;\n }\n\n public get version(): string {\n return this._version;\n }\n\n public registerHandler(action: string, handler: CommandHandler): void {\n this._handlers.set(action, handler);\n }\n\n public unregisterHandler(action: string): void {\n this._handlers.delete(action);\n }\n\n public getState(): \"disconnected\" | \"connecting\" | \"connected\" {\n return this._state;\n }\n\n public ensureConnected(force: boolean = false): void {\n this._isDestroyed = false;\n if (this._reconnectTimer) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n this._currentReconnectDelay = this._reconnectDelayMs;\n\n if (this._transport === \"websocket\") {\n const isWsOpen =\n this._ws &&\n (this._ws.readyState === 1 ||\n this._ws.readyState === (this._WebSocketClass as any)?.OPEN);\n if (force || !isWsOpen || this._state !== \"connected\") {\n this._cleanupConnection();\n this.connect();\n }\n } else {\n // SSE transport\n const isEsOpen =\n this._es &&\n (this._es.readyState === 1 ||\n this._es.readyState === (this._EventSourceClass as any)?.OPEN);\n if (force || !isEsOpen || this._state !== \"connected\") {\n this._cleanupConnection();\n this.connect();\n }\n }\n }\n\n public connect(): void {\n if (\n this._isDestroyed ||\n this._state === \"connected\" ||\n this._state === \"connecting\"\n ) {\n return;\n }\n\n if (this._transport === \"websocket\") {\n this._connectWebSocket();\n } else {\n this._connectSse();\n }\n }\n\n private _connectWebSocket(): void {\n if (!this._WebSocketClass) {\n console.warn(\n \"[ControlPlaneClient] WebSocket not supported in this environment\",\n );\n return;\n }\n\n this._state = \"connecting\";\n const wsUrl = new URL(this._url, \"ws://127.0.0.1:8888\");\n if (this._token) {\n wsUrl.searchParams.set(\"token\", this._token);\n }\n\n try {\n const ws = new this._WebSocketClass(wsUrl.toString());\n this._ws = ws;\n\n ws.onopen = () => {\n this._state = \"connected\";\n this._currentReconnectDelay = this._reconnectDelayMs;\n this._sendRegister();\n this._startHeartbeat();\n };\n\n ws.onmessage = (event: MessageEvent) => {\n this._handleMessage(event.data);\n };\n\n ws.onclose = () => {\n this._cleanupConnection();\n if (!this._isDestroyed) {\n this._scheduleReconnect();\n }\n };\n\n ws.onerror = (err: any) => {\n console.warn(\"[ControlPlaneClient] WebSocket error:\", err);\n };\n } catch (err) {\n console.warn(\n \"[ControlPlaneClient] Failed to establish WebSocket connection:\",\n err,\n );\n this._cleanupConnection();\n this._scheduleReconnect();\n }\n }\n\n private _connectSse(): void {\n if (!this._EventSourceClass) {\n if (typeof process === \"undefined\" || !process.env?.JEST_WORKER_ID) {\n console.warn(\n \"[ControlPlaneClient] EventSource not supported in this environment\",\n );\n }\n return;\n }\n\n this._state = \"connecting\";\n const sseUrl = new URL(\"/api/control/events\", this._httpUrl);\n sseUrl.searchParams.set(\"clientId\", this._clientId);\n if (this._token) {\n sseUrl.searchParams.set(\"token\", this._token);\n }\n\n try {\n const es = new this._EventSourceClass(sseUrl.toString());\n this._es = es;\n\n es.onopen = () => {\n this._state = \"connected\";\n this._currentReconnectDelay = this._reconnectDelayMs;\n this._sendRegister();\n this._startHeartbeat();\n };\n\n if (typeof es.addEventListener === \"function\") {\n es.addEventListener(\"command:execute\", (event: MessageEvent) => {\n this._handleMessage(event.data);\n });\n }\n\n es.onmessage = (event: MessageEvent) => {\n this._handleMessage(event.data);\n };\n\n es.onerror = (err: any) => {\n console.warn(\"[ControlPlaneClient] SSE connection error:\", err);\n this._cleanupConnection();\n if (!this._isDestroyed) {\n this._scheduleReconnect();\n }\n };\n } catch (err) {\n console.warn(\n \"[ControlPlaneClient] Failed to establish SSE connection:\",\n err,\n );\n this._cleanupConnection();\n this._scheduleReconnect();\n }\n }\n\n public disconnect(): void {\n this._isDestroyed = true;\n try {\n this._sendUnregister();\n } catch (_) {}\n this._cleanupConnection();\n if (this._reconnectTimer) {\n clearTimeout(this._reconnectTimer);\n this._reconnectTimer = null;\n }\n }\n\n private _cleanupConnection(): void {\n this._state = \"disconnected\";\n this._stopHeartbeat();\n if (this._ws) {\n try {\n this._ws.close();\n } catch (_) {}\n this._ws = null;\n }\n if (this._es) {\n try {\n this._es.close();\n } catch (_) {}\n this._es = null;\n }\n }\n\n private _scheduleReconnect(): void {\n if (this._reconnectTimer || this._isDestroyed) {\n return;\n }\n\n this._reconnectTimer = setTimeout(() => {\n this._reconnectTimer = null;\n if (!this._isDestroyed) {\n this.connect();\n }\n }, this._currentReconnectDelay);\n\n this._currentReconnectDelay = Math.min(\n this._currentReconnectDelay * 1.5,\n this._maxReconnectDelayMs,\n );\n }\n\n private _startHeartbeat(): void {\n this._stopHeartbeat();\n this._heartbeatTimer = setInterval(() => {\n this._sendHeartbeat();\n }, this._heartbeatIntervalMs);\n }\n\n private _stopHeartbeat(): void {\n if (this._heartbeatTimer) {\n clearInterval(this._heartbeatTimer);\n this._heartbeatTimer = null;\n }\n }\n\n private _sendRegister(): void {\n const payload: ClientRegisterPayload = {\n clientId: this._clientId,\n deviceLabel: this._deviceLabel,\n capabilities: this._capabilities,\n version: this._version,\n transport: this._transport,\n peerId: this._peerId,\n };\n this._sendMessage({\n id: ulid(),\n type: \"client:register\",\n payload,\n });\n }\n\n private _sendHeartbeat(): void {\n const payload: HeartbeatPayload = {\n clientId: this._clientId,\n timestamp: Date.now(),\n };\n this._sendMessage({\n id: ulid(),\n type: \"client:heartbeat\",\n payload,\n });\n }\n\n private _sendUnregister(): void {\n if (!this._clientId) return;\n const payload = {\n clientId: this._clientId,\n };\n this._sendMessage({\n id: ulid(),\n type: \"client:unregister\",\n payload,\n });\n }\n\n private _sendMessage(msg: ControlMessage): void {\n if (this._transport === \"websocket\") {\n if (\n this._ws &&\n (this._ws.readyState === 1 ||\n this._ws.readyState === (this._WebSocketClass as any)?.OPEN)\n ) {\n this._ws.send(JSON.stringify(msg));\n }\n return;\n }\n\n // SSE Mode: send messages to server via HTTP POST /api/control/messages\n const messagesUrl = new URL(\"/api/control/messages\", this._httpUrl);\n const headers: Record<string, string> = {\n \"Content-Type\": \"application/json\",\n };\n if (this._token) {\n headers[\"x-control-token\"] = this._token;\n headers[\"Authorization\"] = `Bearer ${this._token}`;\n }\n\n const fetchOptions: any = {\n method: \"POST\",\n headers,\n body: JSON.stringify(msg),\n };\n\n const host = messagesUrl.hostname.toLowerCase();\n const isLoopback =\n host === \"localhost\" ||\n host === \"127.0.0.1\" ||\n host === \"::1\" ||\n host === \"[::1]\";\n const isPrivate = /^(10\\.|172\\.(1[6-9]|2\\d|3[01])\\.|192\\.168\\.)/.test(host);\n\n if (isLoopback) {\n fetchOptions.targetAddressSpace = \"loopback\";\n } else if (isPrivate) {\n fetchOptions.targetAddressSpace = \"private\";\n }\n\n this._fetchFn(messagesUrl.toString(), fetchOptions).catch((err) => {\n console.warn(\n \"[ControlPlaneClient] Failed to send message via HTTP POST:\",\n err,\n );\n });\n }\n\n private async _handleMessage(dataStr: string): Promise<void> {\n if (!dataStr || typeof dataStr !== \"string\") {\n return;\n }\n\n let msg: ControlMessage;\n try {\n msg = JSON.parse(dataStr);\n } catch {\n return;\n }\n\n if (msg.type === \"command:execute\") {\n const payload = msg.payload as CommandExecutePayload;\n const { commandId, action, args } = payload;\n\n const handler = this._handlers.get(action);\n if (!handler) {\n this._sendMessage({\n id: ulid(),\n type: \"command:result\",\n replyTo: msg.id,\n payload: {\n commandId,\n success: false,\n error: `Unknown action: ${action}`,\n } as CommandResultPayload,\n });\n return;\n }\n\n try {\n const result = await handler(args);\n this._sendMessage({\n id: ulid(),\n type: \"command:result\",\n replyTo: msg.id,\n payload: {\n commandId,\n success: true,\n data: result,\n } as CommandResultPayload,\n });\n } catch (err: any) {\n this._sendMessage({\n id: ulid(),\n type: \"command:result\",\n replyTo: msg.id,\n payload: {\n commandId,\n success: false,\n error: err.message || String(err),\n } as CommandResultPayload,\n });\n }\n }\n }\n}\n","/**\n * ShadowClaw — Control Plane Browser Initialization Helper\n */\n\nimport { ControlPlaneClient } from \"../control-plane-client.js\";\nimport { getDeploymentNamespace } from \"../app-routes.js\";\nimport { getDb } from \"../../db/db.js\";\nimport { getAllTasks } from \"../../db/getAllTasks.js\";\nimport { ulid } from \"../../utils/ulid.js\";\nimport {\n CONFIG_KEYS,\n DEFAULT_CONTROL_PLANE_ENABLED,\n DEFAULT_CONTROL_PLANE_TRANSPORT,\n} from \"../../config/config.js\";\nimport type { ControlPlaneTransport } from \"../../server/control-plane-types.js\";\n\nexport function getOrCreateControlPlaneClientId(): string {\n if (typeof localStorage !== \"undefined\") {\n try {\n const stored = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID);\n if (stored && stored.trim()) {\n return stored.trim();\n }\n } catch (_) {}\n }\n\n const namespace = getDeploymentNamespace();\n const generated = namespace\n ? `${namespace}-${ulid().toLowerCase()}`\n : `client-${ulid().toLowerCase()}`;\n\n if (typeof localStorage !== \"undefined\") {\n try {\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_CLIENT_ID, generated);\n } catch (_) {}\n }\n\n return generated;\n}\n\nexport function isControlPlaneEnabledSync(): boolean {\n if (typeof localStorage !== \"undefined\") {\n try {\n const val = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_ENABLED);\n if (val !== null) {\n return val === \"true\" || val === \"1\";\n }\n } catch (_) {}\n }\n return DEFAULT_CONTROL_PLANE_ENABLED;\n}\n\nexport async function isControlPlaneEnabled(db?: any): Promise<boolean> {\n if (typeof localStorage !== \"undefined\") {\n try {\n const val = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_ENABLED);\n if (val !== null) {\n return val === \"true\" || val === \"1\";\n }\n } catch (_) {}\n }\n\n if (db) {\n try {\n const { getConfig } = await import(\"../../db/getConfig.js\");\n const val = await getConfig(db, CONFIG_KEYS.CONTROL_PLANE_ENABLED);\n if (val !== null && val !== undefined) {\n return val === \"true\" || val === \"1\";\n }\n } catch (_) {}\n }\n\n return DEFAULT_CONTROL_PLANE_ENABLED;\n}\n\nexport function shouldConnectControlPlane(loc?: {\n protocol?: string;\n hostname?: string;\n}): boolean {\n if (typeof EventSource === \"undefined\" && typeof WebSocket === \"undefined\") {\n return false;\n }\n\n const currentLoc = loc || (typeof location !== \"undefined\" ? location : null);\n if (!currentLoc) {\n return false;\n }\n\n if (currentLoc.protocol === \"file:\") {\n return false;\n }\n\n if (\n typeof document !== \"undefined\" &&\n document.querySelector('meta[name=\"shadowclaw-static-only\"]')\n ) {\n return false;\n }\n\n return true;\n}\n\nexport function getControlPlaneServerUrl(loc?: {\n protocol?: string;\n host?: string;\n hostname?: string;\n}): { httpUrl: string; wsUrl: string } {\n let customUrl = \"\";\n if (typeof localStorage !== \"undefined\") {\n try {\n customUrl = (\n localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_URL) || \"\"\n ).trim();\n } catch (_) {}\n }\n\n const currentLoc = loc || (typeof location !== \"undefined\" ? location : null);\n const isStaticHost =\n currentLoc &&\n (currentLoc.protocol === \"file:\" ||\n (currentLoc.hostname &&\n (currentLoc.hostname.endsWith(\".github.io\") ||\n currentLoc.hostname.endsWith(\".pages.dev\"))));\n\n let baseHttp = customUrl;\n if (!baseHttp) {\n if (isStaticHost) {\n baseHttp = \"http://127.0.0.1:8888\";\n } else if (currentLoc && currentLoc.host) {\n baseHttp = `${currentLoc.protocol}//${currentLoc.host}`;\n } else {\n baseHttp = \"http://127.0.0.1:8888\";\n }\n }\n\n baseHttp = baseHttp.replace(/\\/+$/, \"\");\n\n const baseWs = baseHttp.replace(/^https?:/, (proto) =>\n proto === \"https:\" ? \"wss:\" : \"ws:\",\n );\n\n return {\n httpUrl: baseHttp,\n wsUrl: `${baseWs}/ws/control`,\n };\n}\n\nexport function detectCapabilities(): string[] {\n const caps: string[] = [];\n\n if (typeof navigator !== \"undefined\") {\n if (\n navigator.storage &&\n typeof navigator.storage.getDirectory === \"function\"\n ) {\n caps.push(\"opfs\");\n }\n\n if (\n \"serviceWorker\" in navigator &&\n typeof window !== \"undefined\" &&\n \"PushManager\" in window\n ) {\n caps.push(\"push\");\n }\n\n if (\n (typeof document !== \"undefined\" && (document as any).modelContext) ||\n ((navigator as any) && (navigator as any).modelContext)\n ) {\n caps.push(\"webmcp\");\n }\n }\n\n if (typeof RTCPeerConnection !== \"undefined\") {\n caps.push(\"peerjs\");\n }\n\n return caps;\n}\n\nexport function detectDeviceLabel(): string {\n if (typeof navigator === \"undefined\") {\n return \"ShadowClaw Node\";\n }\n\n const ua = navigator.userAgent;\n let device = \"Desktop\";\n if (/iPad/i.test(ua)) device = \"iPad\";\n else if (/iPhone/i.test(ua)) device = \"iPhone\";\n else if (/Android/i.test(ua)) device = \"Android\";\n else if (/Macintosh/i.test(ua)) device = \"Mac\";\n else if (/Windows/i.test(ua)) device = \"Windows\";\n else if (/Linux/i.test(ua)) device = \"Linux\";\n\n let browser = \"Browser\";\n if (/Chrome/i.test(ua) && !/Edg/i.test(ua)) browser = \"Chrome\";\n else if (/Safari/i.test(ua) && !/Chrome/i.test(ua)) browser = \"Safari\";\n else if (/Firefox/i.test(ua)) browser = \"Firefox\";\n else if (/Edg/i.test(ua)) browser = \"Edge\";\n\n return `${device} ${browser}`;\n}\n\nexport function detectClientVersion(): string {\n let version = \"\";\n let revision = \"\";\n\n if (typeof document !== \"undefined\") {\n version =\n document\n .querySelector('meta[name=\"version\"]')\n ?.getAttribute(\"content\")\n ?.trim() || \"\";\n revision =\n document\n .querySelector('meta[name=\"revision\"]')\n ?.getAttribute(\"content\")\n ?.trim() || \"\";\n }\n\n const shortRevision = revision.length > 7 ? revision.slice(0, 7) : revision;\n\n if (version && shortRevision) {\n return `${version} (${shortRevision})`;\n }\n if (version) {\n return version;\n }\n if (shortRevision) {\n return shortRevision;\n }\n return \"1.27.1\";\n}\n\nexport interface InitControlPlaneOptions {\n orchestrator?: any;\n clientId?: string;\n transport?: ControlPlaneTransport;\n autoConnect?: boolean;\n version?: string;\n}\n\nlet activeClient: ControlPlaneClient | null = null;\n\nexport async function executeClientControlCommand(\n action: string,\n args: any = {},\n options: InitControlPlaneOptions = {},\n): Promise<any> {\n const clientId = getOrCreateControlPlaneClientId();\n const deviceLabel = detectDeviceLabel();\n const capabilities = detectCapabilities();\n\n switch (action) {\n case \"send-message\": {\n if (!args.text) {\n throw new Error(\"Missing text parameter\");\n }\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const orch = options.orchestrator || orchestratorStore.orchestrator;\n const targetGroupId =\n args.groupId || orchestratorStore.activeGroupId || \"br:main\";\n\n if (orch?.browserChat?.submit) {\n orch.browserChat.submit(args.text, targetGroupId);\n return { queued: true, groupId: targetGroupId };\n }\n if (orch?.submitMessage) {\n orch.submitMessage(args.text, targetGroupId);\n return { queued: true, groupId: targetGroupId };\n }\n if (orchestratorStore.sendMessage) {\n orchestratorStore.sendMessage(args.text);\n return { queued: true, groupId: targetGroupId };\n }\n return { queued: false, error: \"Orchestrator not ready\" };\n }\n\n case \"list-tasks\": {\n const db = await getDb();\n let tasks = await getAllTasks(db);\n if (args?.groupId) {\n tasks = tasks.filter((t) => t.groupId === args.groupId);\n }\n return { tasks };\n }\n\n case \"read-state\": {\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const orch = options.orchestrator || orchestratorStore.orchestrator;\n return {\n clientId,\n deviceLabel,\n capabilities,\n version: options.version || detectClientVersion(),\n activeGroupId:\n options.orchestrator?.activeGroupId ||\n orchestratorStore.activeGroupId ||\n orch?.activeGroupId ||\n \"br:main\",\n state:\n options.orchestrator?.state ||\n orchestratorStore.state ||\n orch?.state ||\n \"idle\",\n };\n }\n\n case \"list-tools\": {\n try {\n const { getWebMcpTools } =\n await import(\"../../subsystems/mcp/webmcp.js\");\n const webMcpTools = await getWebMcpTools();\n if (webMcpTools && webMcpTools.length > 0) {\n return {\n tools: webMcpTools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: t.inputSchema,\n annotations: t.annotations,\n })),\n };\n }\n } catch (_) {}\n\n // Fallback: filter by conversation group toolTags if active\n try {\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const orch =\n options.orchestrator ||\n orchestratorStore.orchestrator ||\n (typeof document !== \"undefined\"\n ? (document.querySelector(\"shadow-claw\") as any)?.orchestrator\n : null);\n const activeGroupId =\n args.groupId ||\n orch?.activeGroupId ||\n orchestratorStore.activeGroupId ||\n \"br:main\";\n const group = orchestratorStore.groups.find(\n (g) => g.groupId === activeGroupId,\n );\n\n if (group?.toolTags && group.toolTags.length > 0) {\n const { TOOL_DEFINITIONS } =\n await import(\"../../subsystems/tools/index.js\");\n const { parseWebMcpInputSchema } =\n await import(\"../../subsystems/mcp/webmcp.js\");\n const activeTools = TOOL_DEFINITIONS.filter((t) =>\n group.toolTags!.includes(t.name),\n );\n return {\n tools: activeTools.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: parseWebMcpInputSchema(t.input_schema),\n })),\n };\n }\n } catch (_) {}\n\n // Default fallback: list built-in TOOL_DEFINITIONS\n const { TOOL_DEFINITIONS } =\n await import(\"../../subsystems/tools/index.js\");\n const { parseWebMcpInputSchema } =\n await import(\"../../subsystems/mcp/webmcp.js\");\n return {\n tools: TOOL_DEFINITIONS.map((t) => ({\n name: t.name,\n description: t.description,\n inputSchema: parseWebMcpInputSchema(t.input_schema),\n })),\n };\n }\n\n case \"invoke-tool\": {\n if (!args.toolName) {\n throw new Error(\"Missing toolName parameter\");\n }\n\n // 1. Validate tool against active conversation group and toolsStore\n try {\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const { toolsStore } = await import(\"../../stores/tools.js\");\n const orch =\n options.orchestrator ||\n orchestratorStore.orchestrator ||\n (typeof document !== \"undefined\"\n ? (document.querySelector(\"shadow-claw\") as any)?.orchestrator\n : null);\n const activeGroupId =\n args.groupId ||\n orch?.activeGroupId ||\n orchestratorStore.activeGroupId ||\n \"br:main\";\n const group = orchestratorStore.groups.find(\n (g) => g.groupId === activeGroupId,\n );\n\n if (group?.toolTags && group.toolTags.length > 0) {\n if (!group.toolTags.includes(args.toolName)) {\n throw new Error(\n `Tool '${args.toolName}' is not enabled in the active conversation (${activeGroupId}).`,\n );\n }\n } else if (\n toolsStore?.allTools &&\n toolsStore.allTools.some((t: any) => t.name === args.toolName) &&\n toolsStore?.enabledToolNames &&\n toolsStore.enabledToolNames.size > 0\n ) {\n const isBuiltIn = toolsStore.enabledToolNames.has(args.toolName);\n const isDeclarative = toolsStore.isDeclarativeToolEnabled(\n args.toolName,\n );\n if (!isBuiltIn && !isDeclarative) {\n throw new Error(\n `Tool '${args.toolName}' is not enabled on this client.`,\n );\n }\n }\n } catch (err: any) {\n if (err.message && err.message.includes(\"is not enabled\")) {\n throw err;\n }\n }\n\n const ctx =\n (typeof document !== \"undefined\" && (document as any).modelContext) ||\n (typeof navigator !== \"undefined\" && (navigator as any).modelContext);\n\n if (ctx) {\n let matchedTool: any;\n if (typeof ctx.getTools === \"function\") {\n try {\n const tools = await ctx.getTools();\n if (Array.isArray(tools) && tools.length > 0) {\n matchedTool = tools.find((t: any) => t.name === args.toolName);\n if (!matchedTool) {\n throw new Error(\n `Tool '${args.toolName}' is not enabled or registered on this client.`,\n );\n }\n } else {\n matchedTool = Array.isArray(tools)\n ? tools.find((t: any) => t.name === args.toolName)\n : undefined;\n }\n if (matchedTool && typeof matchedTool.execute === \"function\") {\n const res = await matchedTool.execute(\n typeof args.input === \"string\"\n ? JSON.parse(args.input)\n : args.input || {},\n );\n return { result: res };\n }\n } catch (err: any) {\n if (err.message && err.message.includes(\"is not enabled\")) {\n throw err;\n }\n }\n }\n\n const { executeWebMcpTool } =\n await import(\"../../subsystems/mcp/webmcp.js\");\n\n if (typeof ctx.executeTool === \"function\") {\n // 1. Pass the actual ModelContextTool object from getTools() if available (required by native Chromium)\n if (matchedTool) {\n try {\n const res = await executeWebMcpTool(ctx, matchedTool, args.input);\n return { result: res };\n } catch (_) {}\n }\n\n // 2. Pass { name: toolName } object (accepted by polyfill / mocks)\n try {\n const res = await executeWebMcpTool(\n ctx,\n { name: args.toolName },\n args.input,\n );\n return { result: res };\n } catch (_) {}\n\n // 3. Pass toolName string directly (accepted by some preview shims)\n try {\n const res = await executeWebMcpTool(ctx, args.toolName, args.input);\n return { result: res };\n } catch (_) {}\n }\n\n const inputStr =\n typeof args.input === \"string\"\n ? args.input\n : JSON.stringify(args.input || {});\n\n // 4. Check navigator.modelContextTesting if present\n if (\n typeof navigator !== \"undefined\" &&\n (navigator as any).modelContextTesting &&\n typeof (navigator as any).modelContextTesting.executeTool ===\n \"function\"\n ) {\n try {\n const res = await (\n navigator as any\n ).modelContextTesting.executeTool(args.toolName, inputStr);\n return { result: res };\n } catch (_) {}\n }\n\n // 5. Check callTool (MCP-B / extension runtime)\n if (typeof ctx.callTool === \"function\") {\n try {\n const res = await ctx.callTool({\n name: args.toolName,\n arguments:\n typeof args.input === \"string\"\n ? JSON.parse(args.input)\n : args.input || {},\n });\n return { result: res };\n } catch (_) {}\n }\n\n // 6. Check invoke\n if (typeof ctx.invoke === \"function\") {\n try {\n const res = await ctx.invoke(\n args.toolName,\n typeof args.input === \"string\"\n ? JSON.parse(args.input)\n : args.input || {},\n );\n return { result: res };\n } catch (_) {}\n }\n }\n\n // Worker fallback if agent worker is active\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const orch =\n options.orchestrator ||\n orchestratorStore.orchestrator ||\n (typeof document !== \"undefined\"\n ? (document.querySelector(\"shadow-claw\") as any)?.orchestrator\n : null);\n const worker: any = orch?.agentWorker;\n if (worker && typeof worker.postMessage === \"function\") {\n const callId =\n Date.now().toString(36) + Math.random().toString(36).slice(2);\n const isInteractive = args.toolName === \"ask_user\";\n const fallbackTimeoutMs =\n args.timeoutMs || (isInteractive ? 300000 : 60000);\n const result = await new Promise((resolve, reject) => {\n const timeout = setTimeout(() => {\n worker.removeEventListener(\"message\", handler);\n reject(new Error(\"Timeout waiting for tool execution\"));\n }, fallbackTimeoutMs);\n\n const handler = (event: MessageEvent) => {\n const data = event.data;\n if (\n data &&\n data.type === \"execute-tool-result\" &&\n data.callId === callId\n ) {\n clearTimeout(timeout);\n worker.removeEventListener(\"message\", handler);\n if (data.error) {\n reject(new Error(data.error));\n } else {\n resolve(data.result);\n }\n }\n };\n\n worker.addEventListener(\"message\", handler);\n worker.postMessage({\n type: \"execute-tool\",\n callId,\n payload: {\n name: args.toolName,\n input:\n typeof args.input === \"string\"\n ? JSON.parse(args.input)\n : args.input || {},\n groupId: args.groupId || orch?.activeGroupId || \"br:main\",\n },\n });\n });\n return { result };\n }\n\n throw new Error(\n `Tool ${args.toolName} could not be executed (no context or worker available)`,\n );\n }\n\n case \"trigger-backup\": {\n const { orchestratorStore } =\n await import(\"../../stores/orchestrator.js\");\n const targetGroupId =\n args.groupId ||\n options.orchestrator?.activeGroupId ||\n orchestratorStore.activeGroupId ||\n \"br:main\";\n const db = await getDb();\n const { getGroupDir } = await import(\"../../storage/getGroupDir.js\");\n const groupDir = await getGroupDir(db, targetGroupId);\n\n async function collectFiles(\n dir: FileSystemDirectoryHandle,\n prefix = \"\",\n ): Promise<string[]> {\n const result: string[] = [];\n for await (const [name, handle] of (dir as any).entries()) {\n const relPath = prefix ? `${prefix}/${name}` : name;\n if (handle.kind === \"directory\") {\n const sub = await collectFiles(handle, relPath);\n result.push(...sub);\n } else {\n result.push(relPath);\n }\n }\n return result;\n }\n\n async function readFile(relPath: string): Promise<Uint8Array | null> {\n try {\n const parts = relPath.split(\"/\");\n let cur: FileSystemDirectoryHandle = groupDir;\n for (let i = 0; i < parts.length - 1; i++) {\n cur = await cur.getDirectoryHandle(parts[i]);\n }\n const fileHandle = await cur.getFileHandle(parts[parts.length - 1]);\n const file = await fileHandle.getFile();\n const buffer = await file.arrayBuffer();\n return new Uint8Array(buffer);\n } catch {\n return null;\n }\n }\n\n const { BackupController } = await import(\"../backup-controller.js\");\n\n const backupCtrl = new BackupController({\n clientId,\n token: args.token,\n serverBaseUrl: getControlPlaneServerUrl().httpUrl,\n fileEnumerator: () => collectFiles(groupDir),\n fileReader: (filePath) => readFile(filePath),\n });\n\n const result = await backupCtrl.initiate();\n return result;\n }\n\n default:\n throw new Error(`Unknown action '${action}'`);\n }\n}\n\nexport function createDefaultControlPlaneClient(\n options: InitControlPlaneOptions = {},\n): ControlPlaneClient {\n if (activeClient) {\n try {\n activeClient.disconnect();\n } catch (_) {}\n activeClient = null;\n }\n\n const clientId =\n (options.clientId && options.clientId.trim()) ||\n getOrCreateControlPlaneClientId();\n const capabilities = detectCapabilities();\n const deviceLabel = detectDeviceLabel();\n const version = options.version || detectClientVersion();\n\n let configuredTransport: ControlPlaneTransport | null = null;\n if (typeof localStorage !== \"undefined\") {\n try {\n const stored = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_TRANSPORT);\n if (stored === \"sse\" || stored === \"websocket\") {\n configuredTransport = stored;\n }\n } catch (_) {}\n }\n\n const transport =\n options.transport ||\n configuredTransport ||\n (DEFAULT_CONTROL_PLANE_TRANSPORT as ControlPlaneTransport);\n\n let peerId: string | undefined;\n if (typeof localStorage !== \"undefined\") {\n try {\n // CONFIG_KEYS.PEERJS_MY_PEER_ID is \"peerjs_my_peer_id\" — set by configurePeerJs via setConfig.\n // We also check the raw IndexedDB config key written by setConfig, which mirrors to localStorage\n // under the same key name in browser environments that support it.\n peerId = localStorage.getItem(CONFIG_KEYS.PEERJS_MY_PEER_ID) || undefined;\n } catch (_) {}\n }\n\n const { httpUrl, wsUrl } = getControlPlaneServerUrl();\n\n const client = new ControlPlaneClient({\n clientId,\n deviceLabel,\n capabilities,\n version,\n peerId,\n transport,\n httpUrl,\n url: wsUrl,\n handlers: {\n \"send-message\": (args: any) =>\n executeClientControlCommand(\"send-message\", args, options),\n \"list-tasks\": (args: any) =>\n executeClientControlCommand(\"list-tasks\", args, options),\n \"read-state\": (args: any) =>\n executeClientControlCommand(\"read-state\", args, options),\n \"invoke-tool\": (args: any) =>\n executeClientControlCommand(\"invoke-tool\", args, options),\n \"list-tools\": (args: any) =>\n executeClientControlCommand(\"list-tools\", args, options),\n \"trigger-backup\": (args: any) =>\n executeClientControlCommand(\"trigger-backup\", args, options),\n },\n });\n\n if (options.autoConnect !== false && shouldConnectControlPlane()) {\n client.connect();\n }\n\n activeClient = client;\n return client;\n}\n\nexport function getActiveControlPlaneClient(): ControlPlaneClient | null {\n return activeClient;\n}\n\nexport function stopControlPlaneClient(): void {\n if (activeClient) {\n try {\n activeClient.disconnect();\n } catch (_) {}\n activeClient = null;\n }\n}\n\nexport async function ensureControlPlaneConnected(\n options: InitControlPlaneOptions & { db?: any; force?: boolean } = {},\n): Promise<ControlPlaneClient | null> {\n let db = options.db;\n if (!db) {\n try {\n db = await getDb();\n } catch (_) {}\n }\n\n const enabled = await isControlPlaneEnabled(db);\n if (!enabled) {\n stopControlPlaneClient();\n return null;\n }\n\n if (!shouldConnectControlPlane()) {\n return null;\n }\n\n // Synchronize configuration from db to localStorage so synchronous lookups remain consistent\n if (typeof localStorage !== \"undefined\" && db) {\n try {\n const { getConfig } = await import(\"../../db/getConfig.js\");\n const [url, transport] = await Promise.all([\n getConfig(db, CONFIG_KEYS.CONTROL_PLANE_URL),\n getConfig(db, CONFIG_KEYS.CONTROL_PLANE_TRANSPORT),\n ]);\n if (url) {\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_URL, url);\n }\n if (transport) {\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_TRANSPORT, transport);\n }\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_ENABLED, \"true\");\n } catch (_) {}\n }\n\n const client = getActiveControlPlaneClient();\n if (client) {\n client.ensureConnected(options.force);\n return client;\n }\n\n return createDefaultControlPlaneClient(options);\n}\n"],"mappings":"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"}
@@ -23,7 +23,7 @@ import { a as require_define_data_property, c as require_hasown, d as require_ty
23
23
  import { n as require_inflate, o as require_zstream, r as require_deflate, t as require_constants } from "./constants-DsXVuJVP.js";
24
24
  import { a as upsertEmailConnection, i as listEmailConnections, n as deleteEmailConnection, o as getEmailPluginManifest, r as getEmailConnection, s as listEmailPluginManifests, t as bindEmailCredentialRef } from "./connections-BdIru7bF.js";
25
25
  import { t as getAllTasks } from "./getAllTasks-DEko4xIn.js";
26
- import { r as getPushUrl } from "./push-client-CC3qifgc.js";
26
+ import { r as getPushUrl } from "./push-client-C9hIPqLZ.js";
27
27
  import { o as showToast, r as showError } from "./toast-DZ6r7_YI.js";
28
28
  import { getNamespacedItem, setNamespacedItem } from "./utils/namespacedStorage.js";
29
29
  import { applyJsonPatch } from "./utils/jsonPatch.js";
@@ -77779,10 +77779,20 @@ function getBlockedGlobals(allowFullInternetAccess) {
77779
77779
  if (allowFullInternetAccess) return BASE_BLOCKED_GLOBALS;
77780
77780
  return [...BASE_BLOCKED_GLOBALS, "fetch"];
77781
77781
  }
77782
+ let _headlessEvalExecutor = null;
77782
77783
  /**
77783
77784
  * Execute user-supplied JavaScript in a sandboxed, timeout-enforced context.
77784
77785
  */
77785
77786
  async function sandboxedEval(code, timeoutMs = JS_EXEC_TIMEOUT_MS, allowFullInternetAccess = false, data) {
77787
+ if (typeof Worker === "undefined") {
77788
+ if (_headlessEvalExecutor) return _headlessEvalExecutor(code, timeoutMs, allowFullInternetAccess, data);
77789
+ const globalExecutor = globalThis.__headlessEvalExecutor;
77790
+ if (typeof globalExecutor === "function") return globalExecutor(code, timeoutMs, allowFullInternetAccess, data);
77791
+ return {
77792
+ ok: false,
77793
+ error: "Web Workers are not supported in this environment."
77794
+ };
77795
+ }
77786
77796
  const workerSource = buildWorkerSource(code, allowFullInternetAccess, data);
77787
77797
  const blob = new Blob([workerSource], { type: "application/javascript" });
77788
77798
  const blobUrl = URL.createObjectURL(blob);
@@ -77930,6 +77940,7 @@ const restoreGlobals = applyGlobalShadows();
77930
77940
  const Function = undefined;
77931
77941
  ${allowFullInternetAccess ? "" : "const fetch = undefined;"}
77932
77942
  const $PIPE_DATA = ${JSON.stringify(data ?? "")};
77943
+ const data = $PIPE_DATA;
77933
77944
 
77934
77945
  ${code}
77935
77946
  })();
@@ -83730,4 +83741,4 @@ const orchestratorStore = new OrchestratorStore();
83730
83741
 
83731
83742
  //#endregion
83732
83743
  export { setPeerjsPeerAliases as $, detectProviderHelpType as $t, shouldStartLocalScheduler as A, copyGroupEntry as At, getApiKeyForHeaders as B, ensureMainGroupMemory as Bt, sendTerminalInput as C, isPromptApiSupported as Ct, compactContext as D, discoverSkills as Dt, setVMNetworkRelayURL as E, withRetry as Et, leaveRoom as F, upsertRoom as Ft, getProviderRuntimeHeaders as G, uploadGroupFile as Gt, getAvailableProviders as H, registerSubagentCollector as Ht, listRooms as I, writeGroupFileBytes as It, setBedrockSettings as J, listGroups as Jt, getReasoningConfig as K, createToolActivityMessage as Kt, applyLlamafileHeaders as L, createGroupDirectory as Lt, handleRoomInvite as M, getRoomMetadata as Mt, inviteToRoom as N, roomGroupId as Nt, handleWorkerMessage as O, moveGroupEntry as Ot, joinRoomViaLink as P, roomIdFromGroupId as Pt, setPeerjsMyAlias as Q, buildProviderHelpDialogOptions as Qt, applyMeshLlmHeaders as R, deleteGroupFile as Rt, openTerminalSession as S, invokeWithPromptApi as St, setVMBootMode as T, isRetryableHttpError as Tt, getBedrockSettings as U, setPostHandler as Ut, getApiKeyForRequest as V, post as Vt, getLlamafileSettings as W, unregisterSubagentCollector as Wt, setMeshLlmSettings as X, buildDynamicContext as Xt, setLlamafileSettings as Y, buildConversationMessages as Yt, setModel as Z, estimateTokens as Zt, setUseProxy as _, setChannelEnabled as _t, updateTaskLastRun as a, buildLlamafileHelpDialogOptions as at, answerUserPrompt as b, saveMessage as bt, setMaxIterations as c, clearPeerJsTypingState as ct, setRateLimitAutoAdapt as d, getChannelEnabled as dt, setProvider as et, setRateLimitCallsPerMinute as f, getChannelTypeForGroup as ft, setTaskServerUrl as g, loadChannelEnabled as gt, setTaskServerEnabled as h, getTelegramConfig as ht, deleteAllGroupFiles as i, LLAMAFILE_EXPECTED_DIR as it, createRoom as j, deleteRoom as jt, runTaskAsScheduled as k, deleteGroupDirectory as kt, setMaxTokens as l, configureIMessage as lt, setStreamingEnabled as m, getPeerJsConfig as mt, orchestrator_exports as n, stopTransformersProgressPolling as nt, clearGroupMessages as o, deliverResponse as ot, setReasoningEffort as p, getIMessageConfig as pt, setAssistantName as q, createLogMessage as qt, getStaticPageContent as r, buildTransformersJsHelpDialogOptions as rt, setContextCompressionEnabled as s, applyAllChannelRunningStates as st, orchestratorStore as t, startTransformersProgressPolling as tt, setProxyUrl as u, configureTelegram as ut, setVMBashTimeout as v, submitMessage as vt, setVMBootHost as w, executeTool as wt, closeTerminalSession as x, buildSystemPrompt as xt, syncProxyConfigToServiceWorker as y, normalizeStringList as yt, cancelLlamafileRequest as z, ensureMainGroupIndex as zt };
83733
- //# sourceMappingURL=orchestrator-BEUug1TW.js.map
83744
+ //# sourceMappingURL=orchestrator-DZkhJj7f.js.map