shadow-claw 1.31.0 → 1.32.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 (145) hide show
  1. package/.well-known/mcp/server-card.json +1 -1
  2. package/.well-known/mcp.json +1 -1
  3. package/dist/lib/components/index.js +21 -21
  4. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  5. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  6. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  7. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  8. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  9. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  10. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  11. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  12. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  13. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  14. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  15. package/dist/lib/components/shadow-claw-channels.js +1 -1
  16. package/dist/lib/components/shadow-claw-chat.js +1 -1
  17. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  18. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  19. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  20. package/dist/lib/components/shadow-claw-files.js +1 -1
  21. package/dist/lib/components/shadow-claw-git.js +1 -1
  22. package/dist/lib/components/shadow-claw-llm.js +1 -1
  23. package/dist/lib/components/shadow-claw-networking.js +1 -1
  24. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  25. package/dist/lib/components/shadow-claw-pages.js +1 -1
  26. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  27. package/dist/lib/components/shadow-claw-settings.js +1 -1
  28. package/dist/lib/components/shadow-claw-storage.js +1 -1
  29. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  30. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  31. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  32. package/dist/lib/components/shadow-claw-tools.js +1 -1
  33. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  34. package/dist/lib/components/shadow-claw.js +1 -1
  35. package/dist/lib/{configurePeerJs-u7CYSquX.js → configurePeerJs-DD3G3Pms.js} +2 -2
  36. package/dist/lib/{configurePeerJs-u7CYSquX.js.map → configurePeerJs-DD3G3Pms.js.map} +1 -1
  37. package/dist/lib/{git-DAP_EV6R.js → git-Brr7JIbs.js} +25 -8
  38. package/dist/lib/{git-DAP_EV6R.js.map → git-Brr7JIbs.js.map} +1 -1
  39. package/dist/lib/index.js +21 -21
  40. package/dist/lib/{initControlPlane-DCK_SHeR.js → initControlPlane-3TUdhRBM.js} +7 -7
  41. package/dist/lib/{initControlPlane-DCK_SHeR.js.map → initControlPlane-3TUdhRBM.js.map} +1 -1
  42. package/dist/lib/{orchestrator-XygttQw2.js → orchestrator-DLnCmeTZ.js} +5 -5
  43. package/dist/lib/{orchestrator-XygttQw2.js.map → orchestrator-DLnCmeTZ.js.map} +1 -1
  44. package/dist/lib/{orchestrator-DNamnY-k.js → orchestrator-DW5l2bbW.js} +22 -4
  45. package/dist/lib/{orchestrator-DNamnY-k.js.map → orchestrator-DW5l2bbW.js.map} +1 -1
  46. package/dist/lib/{peerjs-BgkPSHKa.js → peerjs-BXlMuIQn.js} +3 -3
  47. package/dist/lib/{peerjs-BgkPSHKa.js.map → peerjs-BXlMuIQn.js.map} +1 -1
  48. package/dist/lib/{push-client-C09NQEk5.js → push-client-B419nn-i.js} +2 -2
  49. package/dist/lib/{push-client-C09NQEk5.js.map → push-client-B419nn-i.js.map} +1 -1
  50. package/dist/lib/{shadow-claw-vzcggiax.js → shadow-claw-DmMO4vVG.js} +4 -4
  51. package/dist/lib/{shadow-claw-vzcggiax.js.map → shadow-claw-DmMO4vVG.js.map} +1 -1
  52. package/dist/lib/{shadow-claw-channel-config-Cl3JvxIJ.js → shadow-claw-channel-config-BhxHf6wZ.js} +3 -3
  53. package/dist/lib/{shadow-claw-channel-config-Cl3JvxIJ.js.map → shadow-claw-channel-config-BhxHf6wZ.js.map} +1 -1
  54. package/dist/lib/{shadow-claw-channels-kv21lr_O.js → shadow-claw-channels-B5vzE9Z2.js} +2 -2
  55. package/dist/lib/{shadow-claw-channels-kv21lr_O.js.map → shadow-claw-channels-B5vzE9Z2.js.map} +1 -1
  56. package/dist/lib/{shadow-claw-chat-Cj1fHQIl.js → shadow-claw-chat-BsYnJ4-G.js} +3 -3
  57. package/dist/lib/{shadow-claw-chat-Cj1fHQIl.js.map → shadow-claw-chat-BsYnJ4-G.js.map} +1 -1
  58. package/dist/lib/{shadow-claw-control-plane-DySeKB36.js → shadow-claw-control-plane-DqcgQsun.js} +6 -6
  59. package/dist/lib/{shadow-claw-control-plane-DySeKB36.js.map → shadow-claw-control-plane-DqcgQsun.js.map} +1 -1
  60. package/dist/lib/{shadow-claw-conversations-DghueOOD.js → shadow-claw-conversations-B9Pn58g3.js} +2 -2
  61. package/dist/lib/{shadow-claw-conversations-DghueOOD.js.map → shadow-claw-conversations-B9Pn58g3.js.map} +1 -1
  62. package/dist/lib/{shadow-claw-file-viewer-C_ITv8T6.js → shadow-claw-file-viewer-DL6c4oPK.js} +2 -2
  63. package/dist/lib/{shadow-claw-file-viewer-C_ITv8T6.js.map → shadow-claw-file-viewer-DL6c4oPK.js.map} +1 -1
  64. package/dist/lib/{shadow-claw-files-CWBaYt9p.js → shadow-claw-files-C_ksPb8W.js} +2 -2
  65. package/dist/lib/{shadow-claw-files-CWBaYt9p.js.map → shadow-claw-files-C_ksPb8W.js.map} +1 -1
  66. package/dist/lib/{shadow-claw-git-XfPBpfXd.js → shadow-claw-git-jwsY7L1N.js} +3 -3
  67. package/dist/lib/{shadow-claw-git-XfPBpfXd.js.map → shadow-claw-git-jwsY7L1N.js.map} +1 -1
  68. package/dist/lib/{shadow-claw-llm-Gzx4ufL_.js → shadow-claw-llm-CEPJh1Jh.js} +2 -2
  69. package/dist/lib/{shadow-claw-llm-Gzx4ufL_.js.map → shadow-claw-llm-CEPJh1Jh.js.map} +1 -1
  70. package/dist/lib/{shadow-claw-networking-CYEbc5TR.js → shadow-claw-networking-Bi4yvc73.js} +2 -2
  71. package/dist/lib/{shadow-claw-networking-CYEbc5TR.js.map → shadow-claw-networking-Bi4yvc73.js.map} +1 -1
  72. package/dist/lib/{shadow-claw-notifications-DHvkTrgv.js → shadow-claw-notifications-C-JgGqQx.js} +2 -2
  73. package/dist/lib/{shadow-claw-notifications-DHvkTrgv.js.map → shadow-claw-notifications-C-JgGqQx.js.map} +1 -1
  74. package/dist/lib/{shadow-claw-pages-Bj3w3V6Y.js → shadow-claw-pages-OEOClgA8.js} +2 -2
  75. package/dist/lib/{shadow-claw-pages-Bj3w3V6Y.js.map → shadow-claw-pages-OEOClgA8.js.map} +1 -1
  76. package/dist/lib/{shadow-claw-peerjs-B3sx2xLA.js → shadow-claw-peerjs-DmC2CV-9.js} +3 -3
  77. package/dist/lib/{shadow-claw-peerjs-B3sx2xLA.js.map → shadow-claw-peerjs-DmC2CV-9.js.map} +1 -1
  78. package/dist/lib/{shadow-claw-settings-DK-0kp3A.js → shadow-claw-settings-xAtFog0T.js} +2 -2
  79. package/dist/lib/{shadow-claw-settings-DK-0kp3A.js.map → shadow-claw-settings-xAtFog0T.js.map} +1 -1
  80. package/dist/lib/{shadow-claw-storage-p9nVMQPF.js → shadow-claw-storage-B4UHl-po.js} +2 -2
  81. package/dist/lib/{shadow-claw-storage-p9nVMQPF.js.map → shadow-claw-storage-B4UHl-po.js.map} +1 -1
  82. package/dist/lib/{shadow-claw-task-server-BNKCWG2M.js → shadow-claw-task-server-B0eWzg57.js} +2 -2
  83. package/dist/lib/{shadow-claw-task-server-BNKCWG2M.js.map → shadow-claw-task-server-B0eWzg57.js.map} +1 -1
  84. package/dist/lib/{shadow-claw-tasks-Dbq9rUku.js → shadow-claw-tasks-HHU_8Gyg.js} +2 -2
  85. package/dist/lib/{shadow-claw-tasks-Dbq9rUku.js.map → shadow-claw-tasks-HHU_8Gyg.js.map} +1 -1
  86. package/dist/lib/{shadow-claw-terminal-Wk2qRWJ9.js → shadow-claw-terminal-CdC2G6Zz.js} +2 -2
  87. package/dist/lib/{shadow-claw-terminal-Wk2qRWJ9.js.map → shadow-claw-terminal-CdC2G6Zz.js.map} +1 -1
  88. package/dist/lib/{shadow-claw-tools-C9TEf2k7.js → shadow-claw-tools-2AICxVXA.js} +3 -3
  89. package/dist/lib/{shadow-claw-tools-C9TEf2k7.js.map → shadow-claw-tools-2AICxVXA.js.map} +1 -1
  90. package/dist/lib/{shadow-claw-webvm-VoKerWW8.js → shadow-claw-webvm-Cy-Ia2vs.js} +2 -2
  91. package/dist/lib/{shadow-claw-webvm-VoKerWW8.js.map → shadow-claw-webvm-Cy-Ia2vs.js.map} +1 -1
  92. package/dist/lib/subsystems/git/git.d.ts +8 -1
  93. package/dist/lib/subsystems/git/types.d.ts +7 -1
  94. package/dist/lib/{syncWebMcpRegistration-DEs4JjI_.js → syncWebMcpRegistration-CaAPPg2V.js} +2 -2
  95. package/dist/lib/{syncWebMcpRegistration-DEs4JjI_.js.map → syncWebMcpRegistration-CaAPPg2V.js.map} +1 -1
  96. package/dist/public/.well-known/mcp/server-card.json +1 -1
  97. package/dist/public/.well-known/mcp.json +1 -1
  98. package/dist/public/agent.worker.js +2 -2
  99. package/dist/public/{configurePeerJs-B68egTBd.js → configurePeerJs--JGpJVti.js} +1 -1
  100. package/dist/public/docs/example/article/index.html +1 -1
  101. package/dist/public/docs/publishing/index.html +1 -1
  102. package/dist/public/docs/skill-creator/index.html +1 -1
  103. package/dist/public/{e2e-bridge-DQ4Mb_eC.js → e2e-bridge-CbYqdMp-.js} +1 -1
  104. package/dist/public/{file-viewer-BqNHyqzy.js → file-viewer-vHJ5Zsgk.js} +1 -1
  105. package/dist/public/git-8F7wvoUB.js +100 -0
  106. package/dist/public/git-DgFF7xTW.js +100 -0
  107. package/dist/public/index.html +1 -1
  108. package/dist/public/index.js +1 -1
  109. package/dist/public/{initControlPlane-DG_LcLDy.js → initControlPlane-C5v0FtJE.js} +1 -1
  110. package/dist/public/main/index.html +1 -1
  111. package/dist/public/main/memory/index.html +1 -1
  112. package/dist/public/{orchestrator-DAJkyJmV.js → orchestrator-BeJfwtvz.js} +3 -3
  113. package/dist/public/{orchestrator-BXwxW4N2.js → orchestrator-DNr2HDI2.js} +1 -1
  114. package/dist/public/{peerjs-BaDbzfgl.js → peerjs-mG30TAJ_.js} +1 -1
  115. package/dist/public/{push-client-B1CCaldJ.js → push-client-C2zMT3Sf.js} +1 -1
  116. package/dist/public/service-worker.js +1 -1
  117. package/dist/public/{shadow-claw-CpBmveOh.js → shadow-claw-Ble6l0Iw.js} +2 -2
  118. package/dist/public/{shadow-claw-channels-7Oew09u0.js → shadow-claw-channels-D_xfBoWp.js} +1 -1
  119. package/dist/public/{shadow-claw-chat-CskwjDzZ.js → shadow-claw-chat-D_Lbi5oH.js} +1 -1
  120. package/dist/public/{shadow-claw-control-plane-BqjEyhx7.js → shadow-claw-control-plane-CrnA5lM0.js} +2 -2
  121. package/dist/public/{shadow-claw-conversations-ClGgBPVY.js → shadow-claw-conversations-BN-hFmN1.js} +1 -1
  122. package/dist/public/{shadow-claw-file-viewer-rDepUwFJ.js → shadow-claw-file-viewer-BKEpzpbx.js} +1 -1
  123. package/dist/public/{shadow-claw-files-C0r05PYf.js → shadow-claw-files-DDZMk5AA.js} +1 -1
  124. package/dist/public/{shadow-claw-git-CXrECHKy.js → shadow-claw-git-CqOO97Re.js} +2 -2
  125. package/dist/public/{shadow-claw-llm-jeGVNciG.js → shadow-claw-llm-DoGxEHQL.js} +1 -1
  126. package/dist/public/{shadow-claw-networking--q6MgEAT.js → shadow-claw-networking-DJeCdb7e.js} +1 -1
  127. package/dist/public/{shadow-claw-notifications-CrFUF0fl.js → shadow-claw-notifications-hSKJeMXb.js} +1 -1
  128. package/dist/public/{shadow-claw-pages-_n1wVXAV.js → shadow-claw-pages-DTS98Zbi.js} +1 -1
  129. package/dist/public/{shadow-claw-settings-5yIfa3ie.js → shadow-claw-settings-5w0ce8SP.js} +2 -2
  130. package/dist/public/{shadow-claw-storage-PLX9EFGn.js → shadow-claw-storage-DqlVt27X.js} +1 -1
  131. package/dist/public/{shadow-claw-task-server-BMps7aSr.js → shadow-claw-task-server-ByZwKI6S.js} +1 -1
  132. package/dist/public/{shadow-claw-tasks-CHO1xvsu.js → shadow-claw-tasks-Dc4G4zBu.js} +1 -1
  133. package/dist/public/{shadow-claw-terminal-BJnSXRsb.js → shadow-claw-terminal-DvusP7wg.js} +1 -1
  134. package/dist/public/{shadow-claw-tools-BHfxRckC.js → shadow-claw-tools-BEsid8q-.js} +1 -1
  135. package/dist/public/{shadow-claw-webvm-CyI23mQT.js → shadow-claw-webvm-BWlIeK78.js} +1 -1
  136. package/dist/public/{syncWebMcpRegistration-R0tha3kP.js → syncWebMcpRegistration-CqVCB6m8.js} +1 -1
  137. package/package.json +1 -1
  138. package/src/storage/staticMainSite.ts +16 -2
  139. package/src/stores/orchestrator.test.ts +33 -0
  140. package/src/stores/orchestrator.ts +36 -0
  141. package/src/subsystems/git/git.test.ts +99 -0
  142. package/src/subsystems/git/git.ts +92 -12
  143. package/src/subsystems/git/types.ts +7 -0
  144. package/dist/public/git-BDaM5VT5.js +0 -100
  145. package/dist/public/git-D4n46G9B.js +0 -100
package/dist/lib/index.js CHANGED
@@ -4,42 +4,42 @@ import { a as formatTimestamp, c as toArrayBuffer, i as formatDateForFilename, n
4
4
  import { a as showSuccess, i as showInfo, l as toastStore, o as showToast, r as showError, s as showWarning } from "./toast-DZ6r7_YI.js";
5
5
  import { getNamespacedItem, getNamespacedStorageKey, removeNamespacedItem, setNamespacedItem } from "./utils/namespacedStorage.js";
6
6
  import { applyJsonPatch } from "./utils/jsonPatch.js";
7
- import { t as ShadowClaw } from "./shadow-claw-vzcggiax.js";
8
- import { t as ShadowClawChat } from "./shadow-claw-chat-Cj1fHQIl.js";
7
+ import { t as ShadowClaw } from "./shadow-claw-DmMO4vVG.js";
8
+ import { t as ShadowClawChat } from "./shadow-claw-chat-BsYnJ4-G.js";
9
9
  import { t as ShadowClawA2UI } from "./shadow-claw-a2ui-2I5nffIn.js";
10
10
  import { t as ShadowClawPageHeaderActionButton } from "./shadow-claw-page-header-action-button-BXXm5b5N.js";
11
11
  import { ShadowClawA2UIInterceptor } from "./components/shadow-claw-a2ui-interceptor.js";
12
12
  import { ShadowClawDialog } from "./components/shadow-claw-dialog.js";
13
13
  import { t as ShadowClawPageHeader } from "./shadow-claw-page-header-DrAcWCZ9.js";
14
- import { t as ShadowClawFiles } from "./shadow-claw-files-CWBaYt9p.js";
14
+ import { t as ShadowClawFiles } from "./shadow-claw-files-C_ksPb8W.js";
15
15
  import { t as ShadowClawEmptyState } from "./shadow-claw-empty-state-DPfDqaMA.js";
16
- import { t as ShadowClawFileViewer } from "./shadow-claw-file-viewer-C_ITv8T6.js";
16
+ import { t as ShadowClawFileViewer } from "./shadow-claw-file-viewer-DL6c4oPK.js";
17
17
  import { t as ShadowClawPdfViewer } from "./shadow-claw-pdf-viewer-D3leDhRq.js";
18
- import { t as ShadowClawTasks } from "./shadow-claw-tasks-Dbq9rUku.js";
19
- import { n as ShadowClawTerminal } from "./shadow-claw-terminal-Wk2qRWJ9.js";
20
- import { t as ShadowClawPages } from "./shadow-claw-pages-Bj3w3V6Y.js";
21
- import { t as ShadowClawSettings } from "./shadow-claw-settings-DK-0kp3A.js";
22
- import { t as ShadowClawPeerJs } from "./shadow-claw-peerjs-B3sx2xLA.js";
23
- import { t as ShadowClawChannelConfig } from "./shadow-claw-channel-config-Cl3JvxIJ.js";
24
- import { t as ShadowClawChannels } from "./shadow-claw-channels-kv21lr_O.js";
18
+ import { t as ShadowClawTasks } from "./shadow-claw-tasks-HHU_8Gyg.js";
19
+ import { n as ShadowClawTerminal } from "./shadow-claw-terminal-CdC2G6Zz.js";
20
+ import { t as ShadowClawPages } from "./shadow-claw-pages-OEOClgA8.js";
21
+ import { t as ShadowClawSettings } from "./shadow-claw-settings-xAtFog0T.js";
22
+ import { t as ShadowClawPeerJs } from "./shadow-claw-peerjs-DmC2CV-9.js";
23
+ import { t as ShadowClawChannelConfig } from "./shadow-claw-channel-config-BhxHf6wZ.js";
24
+ import { t as ShadowClawChannels } from "./shadow-claw-channels-B5vzE9Z2.js";
25
25
  import { t as ShadowClawProviderModelPicker } from "./shadow-claw-provider-model-picker-CsA-507a.js";
26
26
  import { t as ShadowClawProviderModuleSettings } from "./shadow-claw-provider-module-settings-3sCTnCSp.js";
27
- import { t as ShadowClawConversations } from "./shadow-claw-conversations-DghueOOD.js";
27
+ import { t as ShadowClawConversations } from "./shadow-claw-conversations-B9Pn58g3.js";
28
28
  import { t as ShadowClawToast } from "./shadow-claw-toast-C8oAkrMC.js";
29
- import { t as ShadowClawTools } from "./shadow-claw-tools-C9TEf2k7.js";
29
+ import { t as ShadowClawTools } from "./shadow-claw-tools-2AICxVXA.js";
30
30
  import { t as ShadowClawActions } from "./shadow-claw-actions-G99P9oxr.js";
31
31
  import { t as ShadowClawCard } from "./shadow-claw-card-D9azfSMu.js";
32
32
  import { t as ShadowClawAccounts } from "./shadow-claw-accounts-DMb0y4ca.js";
33
- import { t as ShadowClawControlPlane } from "./shadow-claw-control-plane-DySeKB36.js";
34
- import { t as ShadowClawGit } from "./shadow-claw-git-XfPBpfXd.js";
33
+ import { t as ShadowClawControlPlane } from "./shadow-claw-control-plane-DqcgQsun.js";
34
+ import { t as ShadowClawGit } from "./shadow-claw-git-jwsY7L1N.js";
35
35
  import { t as ShadowClawIntegrations } from "./shadow-claw-integrations-yT7j07TM.js";
36
- import { t as ShadowClawLlm } from "./shadow-claw-llm-Gzx4ufL_.js";
36
+ import { t as ShadowClawLlm } from "./shadow-claw-llm-CEPJh1Jh.js";
37
37
  import { t as ShadowClawMcpRemote } from "./shadow-claw-mcp-remote-DGDWjByQ.js";
38
- import { t as ShadowClawNetworking } from "./shadow-claw-networking-CYEbc5TR.js";
39
- import { t as ShadowClawNotifications } from "./shadow-claw-notifications-DHvkTrgv.js";
40
- import { t as ShadowClawStorage } from "./shadow-claw-storage-p9nVMQPF.js";
41
- import { t as ShadowClawTaskServer } from "./shadow-claw-task-server-BNKCWG2M.js";
42
- import { t as ShadowClawWebvm } from "./shadow-claw-webvm-VoKerWW8.js";
38
+ import { t as ShadowClawNetworking } from "./shadow-claw-networking-Bi4yvc73.js";
39
+ import { t as ShadowClawNotifications } from "./shadow-claw-notifications-C-JgGqQx.js";
40
+ import { t as ShadowClawStorage } from "./shadow-claw-storage-B4UHl-po.js";
41
+ import { t as ShadowClawTaskServer } from "./shadow-claw-task-server-B0eWzg57.js";
42
+ import { t as ShadowClawWebvm } from "./shadow-claw-webvm-Cy-Ia2vs.js";
43
43
  import "./components/index.js";
44
44
  import { base64ToBytes, bytesToBase64 } from "./utils/base64.js";
45
45
  import { t as utils_exports } from "./utils/index.js";
@@ -430,7 +430,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
430
430
  switch (action) {
431
431
  case "send-message": {
432
432
  if (!args.text) throw new Error("Missing text parameter");
433
- const { orchestratorStore } = await import("./orchestrator-DNamnY-k.js").then((n) => n.n);
433
+ const { orchestratorStore } = await import("./orchestrator-DW5l2bbW.js").then((n) => n.n);
434
434
  const orch = options.orchestrator || orchestratorStore.orchestrator;
435
435
  const targetGroupId = args.groupId || orchestratorStore.activeGroupId || "br:main";
436
436
  if (orch?.browserChat?.submit) {
@@ -465,7 +465,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
465
465
  return { tasks };
466
466
  }
467
467
  case "read-state": {
468
- const { orchestratorStore } = await import("./orchestrator-DNamnY-k.js").then((n) => n.n);
468
+ const { orchestratorStore } = await import("./orchestrator-DW5l2bbW.js").then((n) => n.n);
469
469
  const orch = options.orchestrator || orchestratorStore.orchestrator;
470
470
  return {
471
471
  clientId,
@@ -488,7 +488,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
488
488
  })) };
489
489
  } catch (_) {}
490
490
  try {
491
- const { orchestratorStore } = await import("./orchestrator-DNamnY-k.js").then((n) => n.n);
491
+ const { orchestratorStore } = await import("./orchestrator-DW5l2bbW.js").then((n) => n.n);
492
492
  const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
493
493
  const activeGroupId = args.groupId || orch?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
494
494
  const group = orchestratorStore.groups.find((g) => g.groupId === activeGroupId);
@@ -513,7 +513,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
513
513
  case "invoke-tool": {
514
514
  if (!args.toolName) throw new Error("Missing toolName parameter");
515
515
  try {
516
- const { orchestratorStore } = await import("./orchestrator-DNamnY-k.js").then((n) => n.n);
516
+ const { orchestratorStore } = await import("./orchestrator-DW5l2bbW.js").then((n) => n.n);
517
517
  const { toolsStore } = await import("./tools-f1WPNDSS.js").then((n) => n.n);
518
518
  const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
519
519
  const activeGroupId = args.groupId || orch?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
@@ -566,7 +566,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
566
566
  return { result: await ctx.invoke(args.toolName, typeof args.input === "string" ? JSON.parse(args.input) : args.input || {}) };
567
567
  } catch (_) {}
568
568
  }
569
- const { orchestratorStore } = await import("./orchestrator-DNamnY-k.js").then((n) => n.n);
569
+ const { orchestratorStore } = await import("./orchestrator-DW5l2bbW.js").then((n) => n.n);
570
570
  const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
571
571
  const worker = orch?.agentWorker;
572
572
  if (worker && typeof worker.postMessage === "function") {
@@ -602,7 +602,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
602
602
  throw new Error(`Tool ${args.toolName} could not be executed (no context or worker available)`);
603
603
  }
604
604
  case "trigger-backup": {
605
- const { orchestratorStore } = await import("./orchestrator-DNamnY-k.js").then((n) => n.n);
605
+ const { orchestratorStore } = await import("./orchestrator-DW5l2bbW.js").then((n) => n.n);
606
606
  const targetGroupId = args.groupId || options.orchestrator?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
607
607
  const db = await getDb();
608
608
  const { getGroupDir } = await import("./getGroupDir-QrN2aTo8.js").then((n) => n.n);
@@ -723,4 +723,4 @@ async function ensureControlPlaneConnected(options = {}) {
723
723
 
724
724
  //#endregion
725
725
  export { detectDeviceLabel, ensureControlPlaneConnected, executeClientControlCommand, getOrCreateControlPlaneClientId, isControlPlaneEnabled, shouldConnectControlPlane, stopControlPlaneClient };
726
- //# sourceMappingURL=initControlPlane-DCK_SHeR.js.map
726
+ //# sourceMappingURL=initControlPlane-3TUdhRBM.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"initControlPlane-DCK_SHeR.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 inputStr =\n typeof args.input === \"string\"\n ? args.input\n : JSON.stringify(args.input || {});\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 ctx.executeTool(matchedTool, inputStr);\n return { result: res };\n } catch (_) {}\n }\n\n // 2. Pass { name: toolName } object (accepted by polyfill / mocks)\n try {\n const res = await ctx.executeTool(\n { name: args.toolName },\n inputStr,\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 ctx.executeTool(args.toolName, inputStr);\n return { result: res };\n } catch (_) {}\n }\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-3TUdhRBM.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 inputStr =\n typeof args.input === \"string\"\n ? args.input\n : JSON.stringify(args.input || {});\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 ctx.executeTool(matchedTool, inputStr);\n return { result: res };\n } catch (_) {}\n }\n\n // 2. Pass { name: toolName } object (accepted by polyfill / mocks)\n try {\n const res = await ctx.executeTool(\n { name: args.toolName },\n inputStr,\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 ctx.executeTool(args.toolName, inputStr);\n return { result: res };\n } catch (_) {}\n }\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":";;;;;;;;;;AAyCA,IAAa,qBAAb,MAAgC;CAC9B,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,AAAQ,MAAwB;CAChC,AAAQ,MAAW;CACnB,AAAQ,kBAAuB;CAC/B,AAAQ,kBAAuB;CAC/B,AAAQ;CACR,AAAQ,eAAwB;CAChC,AAAQ,SAAsD;CAE9D,YAAY,SAAoC;EAC9C,KAAK,aAAa,QAAQ,aAAa;EACvC,KAAK,YAAY,QAAQ;EACzB,KAAK,UAAU,QAAQ;EACvB,KAAK,eAAe,QAAQ,eAAe;EAC3C,KAAK,gBAAgB,QAAQ,gBAAgB;GAAC;GAAU;GAAQ;EAAM;EACtE,KAAK,WAAW,QAAQ,WAAW;EACnC,KAAK,SAAS,QAAQ;EACtB,KAAK,uBAAuB,QAAQ,uBAAuB;EAC3D,KAAK,oBAAoB,QAAQ,oBAAoB;EACrD,KAAK,uBAAuB,QAAQ,uBAAuB;EAC3D,KAAK,yBAAyB,KAAK;EACnC,KAAK,4BAAY,IAAI,IAAI;EAEzB,KAAK,kBACH,QAAQ,mBACP,OAAO,cAAc,cAAc,YAAY;EAClD,KAAK,oBACH,QAAQ,qBACP,OAAO,gBAAgB,cAAc,cAAc;EACtD,KAAK,WACH,QAAQ,YACP,OAAO,UAAU,cACd,MAAM,KAAK,UAAU,WACb,QAAQ,uBAAO,IAAI,MAAM,qBAAqB,CAAC;EAE7D,IAAI,QAAQ,UACV,KAAK,MAAM,CAAC,QAAQ,YAAY,OAAO,QAAQ,QAAQ,QAAQ,GAC7D,KAAK,gBAAgB,QAAQ,OAAO;EAIxC,MAAM,MAAM,OAAO,aAAa,cAAc,WAAW;EACzD,MAAM,SAAS,MACX,GAAG,IAAI,SAAS,IAAI,IAAI,SACxB;EACJ,MAAM,WAAW,MACb,GAAG,IAAI,aAAa,WAAW,SAAS,MAAM,IAAI,IAAI,SACtD;EAEJ,KAAK,OAAO,QAAQ,OAAO,GAAG,SAAS;EACvC,KAAK,WAAW,QAAQ,WAAW;CACrC;CAEA,IAAW,YAAmC;EAC5C,OAAO,KAAK;CACd;CAEA,IAAW,UAAkB;EAC3B,OAAO,KAAK;CACd;CAEA,AAAO,gBAAgB,QAAgB,SAA+B;EACpE,KAAK,UAAU,IAAI,QAAQ,OAAO;CACpC;CAEA,AAAO,kBAAkB,QAAsB;EAC7C,KAAK,UAAU,OAAO,MAAM;CAC9B;CAEA,AAAO,WAAwD;EAC7D,OAAO,KAAK;CACd;CAEA,AAAO,gBAAgB,QAAiB,OAAa;EACnD,KAAK,eAAe;EACpB,IAAI,KAAK,iBAAiB;GACxB,aAAa,KAAK,eAAe;GACjC,KAAK,kBAAkB;EACzB;EACA,KAAK,yBAAyB,KAAK;EAEnC,IAAI,KAAK,eAAe,aAAa;GACnC,MAAM,WACJ,KAAK,QACJ,KAAK,IAAI,eAAe,KACvB,KAAK,IAAI,eAAgB,KAAK,iBAAyB;GAC3D,IAAI,SAAS,CAAC,YAAY,KAAK,WAAW,aAAa;IACrD,KAAK,mBAAmB;IACxB,KAAK,QAAQ;GACf;EACF,OAAO;GAEL,MAAM,WACJ,KAAK,QACJ,KAAK,IAAI,eAAe,KACvB,KAAK,IAAI,eAAgB,KAAK,mBAA2B;GAC7D,IAAI,SAAS,CAAC,YAAY,KAAK,WAAW,aAAa;IACrD,KAAK,mBAAmB;IACxB,KAAK,QAAQ;GACf;EACF;CACF;CAEA,AAAO,UAAgB;EACrB,IACE,KAAK,gBACL,KAAK,WAAW,eAChB,KAAK,WAAW,cAEhB;EAGF,IAAI,KAAK,eAAe,aACtB,KAAK,kBAAkB;OAEvB,KAAK,YAAY;CAErB;CAEA,AAAQ,oBAA0B;EAChC,IAAI,CAAC,KAAK,iBAAiB;GACzB,QAAQ,KACN,kEACF;GACA;EACF;EAEA,KAAK,SAAS;EACd,MAAM,QAAQ,IAAI,IAAI,KAAK,MAAM,qBAAqB;EACtD,IAAI,KAAK,QACP,MAAM,aAAa,IAAI,SAAS,KAAK,MAAM;EAG7C,IAAI;GACF,MAAM,KAAK,IAAI,KAAK,gBAAgB,MAAM,SAAS,CAAC;GACpD,KAAK,MAAM;GAEX,GAAG,eAAe;IAChB,KAAK,SAAS;IACd,KAAK,yBAAyB,KAAK;IACnC,KAAK,cAAc;IACnB,KAAK,gBAAgB;GACvB;GAEA,GAAG,aAAa,UAAwB;IACtC,KAAK,eAAe,MAAM,IAAI;GAChC;GAEA,GAAG,gBAAgB;IACjB,KAAK,mBAAmB;IACxB,IAAI,CAAC,KAAK,cACR,KAAK,mBAAmB;GAE5B;GAEA,GAAG,WAAW,QAAa;IACzB,QAAQ,KAAK,yCAAyC,GAAG;GAC3D;EACF,SAAS,KAAK;GACZ,QAAQ,KACN,kEACA,GACF;GACA,KAAK,mBAAmB;GACxB,KAAK,mBAAmB;EAC1B;CACF;CAEA,AAAQ,cAAoB;EAC1B,IAAI,CAAC,KAAK,mBAAmB;GAC3B,IAAI,OAAOA,2BAAY,eAAe,CAACA,uBAAQ,KAAK,gBAClD,QAAQ,KACN,oEACF;GAEF;EACF;EAEA,KAAK,SAAS;EACd,MAAM,SAAS,IAAI,IAAI,uBAAuB,KAAK,QAAQ;EAC3D,OAAO,aAAa,IAAI,YAAY,KAAK,SAAS;EAClD,IAAI,KAAK,QACP,OAAO,aAAa,IAAI,SAAS,KAAK,MAAM;EAG9C,IAAI;GACF,MAAM,KAAK,IAAI,KAAK,kBAAkB,OAAO,SAAS,CAAC;GACvD,KAAK,MAAM;GAEX,GAAG,eAAe;IAChB,KAAK,SAAS;IACd,KAAK,yBAAyB,KAAK;IACnC,KAAK,cAAc;IACnB,KAAK,gBAAgB;GACvB;GAEA,IAAI,OAAO,GAAG,qBAAqB,YACjC,GAAG,iBAAiB,oBAAoB,UAAwB;IAC9D,KAAK,eAAe,MAAM,IAAI;GAChC,CAAC;GAGH,GAAG,aAAa,UAAwB;IACtC,KAAK,eAAe,MAAM,IAAI;GAChC;GAEA,GAAG,WAAW,QAAa;IACzB,QAAQ,KAAK,8CAA8C,GAAG;IAC9D,KAAK,mBAAmB;IACxB,IAAI,CAAC,KAAK,cACR,KAAK,mBAAmB;GAE5B;EACF,SAAS,KAAK;GACZ,QAAQ,KACN,4DACA,GACF;GACA,KAAK,mBAAmB;GACxB,KAAK,mBAAmB;EAC1B;CACF;CAEA,AAAO,aAAmB;EACxB,KAAK,eAAe;EACpB,IAAI;GACF,KAAK,gBAAgB;EACvB,SAAS,GAAG,CAAC;EACb,KAAK,mBAAmB;EACxB,IAAI,KAAK,iBAAiB;GACxB,aAAa,KAAK,eAAe;GACjC,KAAK,kBAAkB;EACzB;CACF;CAEA,AAAQ,qBAA2B;EACjC,KAAK,SAAS;EACd,KAAK,eAAe;EACpB,IAAI,KAAK,KAAK;GACZ,IAAI;IACF,KAAK,IAAI,MAAM;GACjB,SAAS,GAAG,CAAC;GACb,KAAK,MAAM;EACb;EACA,IAAI,KAAK,KAAK;GACZ,IAAI;IACF,KAAK,IAAI,MAAM;GACjB,SAAS,GAAG,CAAC;GACb,KAAK,MAAM;EACb;CACF;CAEA,AAAQ,qBAA2B;EACjC,IAAI,KAAK,mBAAmB,KAAK,cAC/B;EAGF,KAAK,kBAAkB,iBAAiB;GACtC,KAAK,kBAAkB;GACvB,IAAI,CAAC,KAAK,cACR,KAAK,QAAQ;EAEjB,GAAG,KAAK,sBAAsB;EAE9B,KAAK,yBAAyB,KAAK,IACjC,KAAK,yBAAyB,KAC9B,KAAK,oBACP;CACF;CAEA,AAAQ,kBAAwB;EAC9B,KAAK,eAAe;EACpB,KAAK,kBAAkB,kBAAkB;GACvC,KAAK,eAAe;EACtB,GAAG,KAAK,oBAAoB;CAC9B;CAEA,AAAQ,iBAAuB;EAC7B,IAAI,KAAK,iBAAiB;GACxB,cAAc,KAAK,eAAe;GAClC,KAAK,kBAAkB;EACzB;CACF;CAEA,AAAQ,gBAAsB;EAC5B,MAAM,UAAiC;GACrC,UAAU,KAAK;GACf,aAAa,KAAK;GAClB,cAAc,KAAK;GACnB,SAAS,KAAK;GACd,WAAW,KAAK;GAChB,QAAQ,KAAK;EACf;EACA,KAAK,aAAa;GAChB,IAAI,KAAK;GACT,MAAM;GACN;EACF,CAAC;CACH;CAEA,AAAQ,iBAAuB;EAC7B,MAAM,UAA4B;GAChC,UAAU,KAAK;GACf,WAAW,KAAK,IAAI;EACtB;EACA,KAAK,aAAa;GAChB,IAAI,KAAK;GACT,MAAM;GACN;EACF,CAAC;CACH;CAEA,AAAQ,kBAAwB;EAC9B,IAAI,CAAC,KAAK,WAAW;EACrB,MAAM,UAAU,EACd,UAAU,KAAK,UACjB;EACA,KAAK,aAAa;GAChB,IAAI,KAAK;GACT,MAAM;GACN;EACF,CAAC;CACH;CAEA,AAAQ,aAAa,KAA2B;EAC9C,IAAI,KAAK,eAAe,aAAa;GACnC,IACE,KAAK,QACJ,KAAK,IAAI,eAAe,KACvB,KAAK,IAAI,eAAgB,KAAK,iBAAyB,OAEzD,KAAK,IAAI,KAAK,KAAK,UAAU,GAAG,CAAC;GAEnC;EACF;EAGA,MAAM,cAAc,IAAI,IAAI,yBAAyB,KAAK,QAAQ;EAClE,MAAM,UAAkC,EACtC,gBAAgB,mBAClB;EACA,IAAI,KAAK,QAAQ;GACf,QAAQ,qBAAqB,KAAK;GAClC,QAAQ,mBAAmB,UAAU,KAAK;EAC5C;EAEA,MAAM,eAAoB;GACxB,QAAQ;GACR;GACA,MAAM,KAAK,UAAU,GAAG;EAC1B;EAEA,MAAM,OAAO,YAAY,SAAS,YAAY;EAC9C,MAAM,aACJ,SAAS,eACT,SAAS,eACT,SAAS,SACT,SAAS;EACX,MAAM,YAAY,+CAA+C,KAAK,IAAI;EAE1E,IAAI,YACF,aAAa,qBAAqB;OAC7B,IAAI,WACT,aAAa,qBAAqB;EAGpC,KAAK,SAAS,YAAY,SAAS,GAAG,YAAY,CAAC,CAAC,OAAO,QAAQ;GACjE,QAAQ,KACN,8DACA,GACF;EACF,CAAC;CACH;CAEA,MAAc,eAAe,SAAgC;EAC3D,IAAI,CAAC,WAAW,OAAO,YAAY,UACjC;EAGF,IAAI;EACJ,IAAI;GACF,MAAM,KAAK,MAAM,OAAO;EAC1B,QAAQ;GACN;EACF;EAEA,IAAI,IAAI,SAAS,mBAAmB;GAElC,MAAM,EAAE,WAAW,QAAQ,SADX,IAAI;GAGpB,MAAM,UAAU,KAAK,UAAU,IAAI,MAAM;GACzC,IAAI,CAAC,SAAS;IACZ,KAAK,aAAa;KAChB,IAAI,KAAK;KACT,MAAM;KACN,SAAS,IAAI;KACb,SAAS;MACP;MACA,SAAS;MACT,OAAO,mBAAmB;KAC5B;IACF,CAAC;IACD;GACF;GAEA,IAAI;IACF,MAAM,SAAS,MAAM,QAAQ,IAAI;IACjC,KAAK,aAAa;KAChB,IAAI,KAAK;KACT,MAAM;KACN,SAAS,IAAI;KACb,SAAS;MACP;MACA,SAAS;MACT,MAAM;KACR;IACF,CAAC;GACH,SAAS,KAAU;IACjB,KAAK,aAAa;KAChB,IAAI,KAAK;KACT,MAAM;KACN,SAAS,IAAI;KACb,SAAS;MACP;MACA,SAAS;MACT,OAAO,IAAI,WAAW,OAAO,GAAG;KAClC;IACF,CAAC;GACH;EACF;CACF;AACF;;;;;;;ACzdA,SAAgB,kCAA0C;CACxD,IAAI,OAAO,iBAAiB,aAC1B,IAAI;EACF,MAAM,SAAS,aAAa,QAAQ,YAAY,uBAAuB;EACvE,IAAI,UAAU,OAAO,KAAK,GACxB,OAAO,OAAO,KAAK;CAEvB,SAAS,GAAG,CAAC;CAGf,MAAM,YAAY,uBAAuB;CACzC,MAAM,YAAY,YACd,GAAG,UAAU,GAAG,KAAK,CAAC,CAAC,YAAY,MACnC,UAAU,KAAK,CAAC,CAAC,YAAY;CAEjC,IAAI,OAAO,iBAAiB,aAC1B,IAAI;EACF,aAAa,QAAQ,YAAY,yBAAyB,SAAS;CACrE,SAAS,GAAG,CAAC;CAGf,OAAO;AACT;AAcA,eAAsB,sBAAsB,IAA4B;CACtE,IAAI,OAAO,iBAAiB,aAC1B,IAAI;EACF,MAAM,MAAM,aAAa,QAAQ,YAAY,qBAAqB;EAClE,IAAI,QAAQ,MACV,OAAO,QAAQ,UAAU,QAAQ;CAErC,SAAS,GAAG,CAAC;CAGf,IAAI,IACF,IAAI;EACF,MAAM,EAAE,cAAc,MAAM,OAAO,0BAAwB;EAC3D,MAAM,MAAM,MAAM,UAAU,IAAI,YAAY,qBAAqB;EACjE,IAAI,QAAQ,QAAQ,QAAQ,QAC1B,OAAO,QAAQ,UAAU,QAAQ;CAErC,SAAS,GAAG,CAAC;CAGf;AACF;AAEA,SAAgB,0BAA0B,KAG9B;CACV,IAAI,OAAO,gBAAgB,eAAe,OAAO,cAAc,aAC7D,OAAO;CAGT,MAAM,aAAa,QAAQ,OAAO,aAAa,cAAc,WAAW;CACxE,IAAI,CAAC,YACH,OAAO;CAGT,IAAI,WAAW,aAAa,SAC1B,OAAO;CAGT,IACE,OAAO,aAAa,eACpB,SAAS,cAAc,uCAAqC,GAE5D,OAAO;CAGT,OAAO;AACT;AAEA,SAAgB,yBAAyB,KAIF;CACrC,IAAI,YAAY;CAChB,IAAI,OAAO,iBAAiB,aAC1B,IAAI;EACF,aACE,aAAa,QAAQ,YAAY,iBAAiB,KAAK,GAAE,CACzD,KAAK;CACT,SAAS,GAAG,CAAC;CAGf,MAAM,aAAa,QAAQ,OAAO,aAAa,cAAc,WAAW;CACxE,MAAM,eACJ,eACC,WAAW,aAAa,WACtB,WAAW,aACT,WAAW,SAAS,SAAS,YAAY,KACxC,WAAW,SAAS,SAAS,YAAY;CAEjD,IAAI,WAAW;CACf,IAAI,CAAC,UACH,IAAI,cACF,WAAW;MACN,IAAI,cAAc,WAAW,MAClC,WAAW,GAAG,WAAW,SAAS,IAAI,WAAW;MAEjD,WAAW;CAIf,WAAW,SAAS,QAAQ,QAAQ,EAAE;CAEtC,MAAM,SAAS,SAAS,QAAQ,aAAa,UAC3C,UAAU,WAAW,SAAS,KAChC;CAEA,OAAO;EACL,SAAS;EACT,OAAO,GAAG,OAAO;CACnB;AACF;AAEA,SAAgB,qBAA+B;CAC7C,MAAM,OAAiB,CAAC;CAExB,IAAI,OAAO,cAAc,aAAa;EACpC,IACE,UAAU,WACV,OAAO,UAAU,QAAQ,iBAAiB,YAE1C,KAAK,KAAK,MAAM;EAGlB,IACE,mBAAmB,aACnB,OAAO,WAAW,eAClB,iBAAiB,QAEjB,KAAK,KAAK,MAAM;EAGlB,IACG,OAAO,aAAa,eAAgB,SAAiB,gBACpD,aAAsB,UAAkB,cAE1C,KAAK,KAAK,QAAQ;CAEtB;CAEA,IAAI,OAAO,sBAAsB,aAC/B,KAAK,KAAK,QAAQ;CAGpB,OAAO;AACT;AAEA,SAAgB,oBAA4B;CAC1C,IAAI,OAAO,cAAc,aACvB,OAAO;CAGT,MAAM,KAAK,UAAU;CACrB,IAAI,SAAS;CACb,IAAI,QAAQ,KAAK,EAAE,GAAG,SAAS;MAC1B,IAAI,UAAU,KAAK,EAAE,GAAG,SAAS;MACjC,IAAI,WAAW,KAAK,EAAE,GAAG,SAAS;MAClC,IAAI,aAAa,KAAK,EAAE,GAAG,SAAS;MACpC,IAAI,WAAW,KAAK,EAAE,GAAG,SAAS;MAClC,IAAI,SAAS,KAAK,EAAE,GAAG,SAAS;CAErC,IAAI,UAAU;CACd,IAAI,UAAU,KAAK,EAAE,KAAK,CAAC,OAAO,KAAK,EAAE,GAAG,UAAU;MACjD,IAAI,UAAU,KAAK,EAAE,KAAK,CAAC,UAAU,KAAK,EAAE,GAAG,UAAU;MACzD,IAAI,WAAW,KAAK,EAAE,GAAG,UAAU;MACnC,IAAI,OAAO,KAAK,EAAE,GAAG,UAAU;CAEpC,OAAO,GAAG,OAAO,GAAG;AACtB;AAEA,SAAgB,sBAA8B;CAC5C,IAAI,UAAU;CACd,IAAI,WAAW;CAEf,IAAI,OAAO,aAAa,aAAa;EACnC,UACE,SACG,cAAc,wBAAsB,CAAC,EACpC,aAAa,SAAS,CAAC,EACvB,KAAK,KAAK;EAChB,WACE,SACG,cAAc,yBAAuB,CAAC,EACrC,aAAa,SAAS,CAAC,EACvB,KAAK,KAAK;CAClB;CAEA,MAAM,gBAAgB,SAAS,SAAS,IAAI,SAAS,MAAM,GAAG,CAAC,IAAI;CAEnE,IAAI,WAAW,eACb,OAAO,GAAG,QAAQ,IAAI,cAAc;CAEtC,IAAI,SACF,OAAO;CAET,IAAI,eACF,OAAO;CAET,OAAO;AACT;AAUA,IAAI,eAA0C;AAE9C,eAAsB,4BACpB,QACA,OAAY,CAAC,GACb,UAAmC,CAAC,GACtB;CACd,MAAM,WAAW,gCAAgC;CACjD,MAAM,cAAc,kBAAkB;CACtC,MAAM,eAAe,mBAAmB;CAExC,QAAQ,QAAR;EACE,KAAK,gBAAgB;GACnB,IAAI,CAAC,KAAK,MACR,MAAM,IAAI,MAAM,wBAAwB;GAE1C,MAAM,EAAE,sBACN,MAAM,OAAO,6BAA+B;GAC9C,MAAM,OAAO,QAAQ,gBAAgB,kBAAkB;GACvD,MAAM,gBACJ,KAAK,WAAW,kBAAkB,iBAAiB;GAErD,IAAI,MAAM,aAAa,QAAQ;IAC7B,KAAK,YAAY,OAAO,KAAK,MAAM,aAAa;IAChD,OAAO;KAAE,QAAQ;KAAM,SAAS;IAAc;GAChD;GACA,IAAI,MAAM,eAAe;IACvB,KAAK,cAAc,KAAK,MAAM,aAAa;IAC3C,OAAO;KAAE,QAAQ;KAAM,SAAS;IAAc;GAChD;GACA,IAAI,kBAAkB,aAAa;IACjC,kBAAkB,YAAY,KAAK,IAAI;IACvC,OAAO;KAAE,QAAQ;KAAM,SAAS;IAAc;GAChD;GACA,OAAO;IAAE,QAAQ;IAAO,OAAO;GAAyB;EAC1D;EAEA,KAAK,cAAc;GAEjB,IAAI,QAAQ,MAAM,YAAY,MADb,MAAM,CACS;GAChC,IAAI,MAAM,SACR,QAAQ,MAAM,QAAQ,MAAM,EAAE,YAAY,KAAK,OAAO;GAExD,OAAO,EAAE,MAAM;EACjB;EAEA,KAAK,cAAc;GACjB,MAAM,EAAE,sBACN,MAAM,OAAO,6BAA+B;GAC9C,MAAM,OAAO,QAAQ,gBAAgB,kBAAkB;GACvD,OAAO;IACL;IACA;IACA;IACA,SAAS,QAAQ,WAAW,oBAAoB;IAChD,eACE,QAAQ,cAAc,iBACtB,kBAAkB,iBAClB,MAAM,iBACN;IACF,OACE,QAAQ,cAAc,SACtB,kBAAkB,SAClB,MAAM,SACN;GACJ;EACF;EAEA,KAAK,cAAc;GACjB,IAAI;IACF,MAAM,EAAE,mBACN,MAAM,OAAO,uBAAiC;IAChD,MAAM,cAAc,MAAM,eAAe;IACzC,IAAI,eAAe,YAAY,SAAS,GACtC,OAAO,EACL,OAAO,YAAY,KAAK,OAAO;KAC7B,MAAM,EAAE;KACR,aAAa,EAAE;KACf,aAAa,EAAE;KACf,aAAa,EAAE;IACjB,EAAE,EACJ;GAEJ,SAAS,GAAG,CAAC;GAGb,IAAI;IACF,MAAM,EAAE,sBACN,MAAM,OAAO,6BAA+B;IAC9C,MAAM,OACJ,QAAQ,gBACR,kBAAkB,iBACjB,OAAO,aAAa,cAChB,SAAS,cAAc,aAAa,CAAC,EAAU,eAChD;IACN,MAAM,gBACJ,KAAK,WACL,MAAM,iBACN,kBAAkB,iBAClB;IACF,MAAM,QAAQ,kBAAkB,OAAO,MACpC,MAAM,EAAE,YAAY,aACvB;IAEA,IAAI,OAAO,YAAY,MAAM,SAAS,SAAS,GAAG;KAChD,MAAM,EAAE,qBACN,MAAM,OAAO,sBAAkC;KACjD,MAAM,EAAE,2BACN,MAAM,OAAO,uBAAiC;KAIhD,OAAO,EACL,OAJkB,iBAAiB,QAAQ,MAC3C,MAAM,SAAU,SAAS,EAAE,IAAI,CAGd,CAAC,CAAC,KAAK,OAAO;MAC7B,MAAM,EAAE;MACR,aAAa,EAAE;MACf,aAAa,uBAAuB,EAAE,YAAY;KACpD,EAAE,EACJ;IACF;GACF,SAAS,GAAG,CAAC;GAGb,MAAM,EAAE,qBACN,MAAM,OAAO,sBAAkC;GACjD,MAAM,EAAE,2BACN,MAAM,OAAO,uBAAiC;GAChD,OAAO,EACL,OAAO,iBAAiB,KAAK,OAAO;IAClC,MAAM,EAAE;IACR,aAAa,EAAE;IACf,aAAa,uBAAuB,EAAE,YAAY;GACpD,EAAE,EACJ;EACF;EAEA,KAAK,eAAe;GAClB,IAAI,CAAC,KAAK,UACR,MAAM,IAAI,MAAM,4BAA4B;GAI9C,IAAI;IACF,MAAM,EAAE,sBACN,MAAM,OAAO,6BAA+B;IAC9C,MAAM,EAAE,eAAe,MAAM,OAAO,sBAAwB;IAC5D,MAAM,OACJ,QAAQ,gBACR,kBAAkB,iBACjB,OAAO,aAAa,cAChB,SAAS,cAAc,aAAa,CAAC,EAAU,eAChD;IACN,MAAM,gBACJ,KAAK,WACL,MAAM,iBACN,kBAAkB,iBAClB;IACF,MAAM,QAAQ,kBAAkB,OAAO,MACpC,MAAM,EAAE,YAAY,aACvB;IAEA,IAAI,OAAO,YAAY,MAAM,SAAS,SAAS,GAC7C;SAAI,CAAC,MAAM,SAAS,SAAS,KAAK,QAAQ,GACxC,MAAM,IAAI,MACR,SAAS,KAAK,SAAS,+CAA+C,cAAc,GACtF;IACF,OACK,IACL,YAAY,YACZ,WAAW,SAAS,MAAM,MAAW,EAAE,SAAS,KAAK,QAAQ,KAC7D,YAAY,oBACZ,WAAW,iBAAiB,OAAO,GACnC;KACA,MAAM,YAAY,WAAW,iBAAiB,IAAI,KAAK,QAAQ;KAC/D,MAAM,gBAAgB,WAAW,yBAC/B,KAAK,QACP;KACA,IAAI,CAAC,aAAa,CAAC,eACjB,MAAM,IAAI,MACR,SAAS,KAAK,SAAS,iCACzB;IAEJ;GACF,SAAS,KAAU;IACjB,IAAI,IAAI,WAAW,IAAI,QAAQ,SAAS,gBAAgB,GACtD,MAAM;GAEV;GAEA,MAAM,MACH,OAAO,aAAa,eAAgB,SAAiB,gBACrD,OAAO,cAAc,eAAgB,UAAkB;GAE1D,IAAI,KAAK;IACP,IAAI;IACJ,IAAI,OAAO,IAAI,aAAa,YAC1B,IAAI;KACF,MAAM,QAAQ,MAAM,IAAI,SAAS;KACjC,IAAI,MAAM,QAAQ,KAAK,KAAK,MAAM,SAAS,GAAG;MAC5C,cAAc,MAAM,MAAM,MAAW,EAAE,SAAS,KAAK,QAAQ;MAC7D,IAAI,CAAC,aACH,MAAM,IAAI,MACR,SAAS,KAAK,SAAS,+CACzB;KAEJ,OACE,cAAc,MAAM,QAAQ,KAAK,IAC7B,MAAM,MAAM,MAAW,EAAE,SAAS,KAAK,QAAQ,IAC/C;KAEN,IAAI,eAAe,OAAO,YAAY,YAAY,YAMhD,OAAO,EAAE,QAAQ,MALC,YAAY,QAC5B,OAAO,KAAK,UAAU,WAClB,KAAK,MAAM,KAAK,KAAK,IACrB,KAAK,SAAS,CAAC,CACrB,EACqB;IAEzB,SAAS,KAAU;KACjB,IAAI,IAAI,WAAW,IAAI,QAAQ,SAAS,gBAAgB,GACtD,MAAM;IAEV;IAGF,MAAM,WACJ,OAAO,KAAK,UAAU,WAClB,KAAK,QACL,KAAK,UAAU,KAAK,SAAS,CAAC,CAAC;IAErC,IAAI,OAAO,IAAI,gBAAgB,YAAY;KAEzC,IAAI,aACF,IAAI;MAEF,OAAO,EAAE,QAAQ,MADC,IAAI,YAAY,aAAa,QAAQ,EAClC;KACvB,SAAS,GAAG,CAAC;KAIf,IAAI;MAKF,OAAO,EAAE,QAAQ,MAJC,IAAI,YACpB,EAAE,MAAM,KAAK,SAAS,GACtB,QACF,EACqB;KACvB,SAAS,GAAG,CAAC;KAGb,IAAI;MAEF,OAAO,EAAE,QAAQ,MADC,IAAI,YAAY,KAAK,UAAU,QAAQ,EACpC;KACvB,SAAS,GAAG,CAAC;IACf;IAGA,IACE,OAAO,cAAc,eACpB,UAAkB,uBACnB,OAAQ,UAAkB,oBAAoB,gBAC5C,YAEF,IAAI;KAIF,OAAO,EAAE,QAAQ,MAFf,UACA,oBAAoB,YAAY,KAAK,UAAU,QAAQ,EACpC;IACvB,SAAS,GAAG,CAAC;IAIf,IAAI,OAAO,IAAI,aAAa,YAC1B,IAAI;KAQF,OAAO,EAAE,QAAQ,MAPC,IAAI,SAAS;MAC7B,MAAM,KAAK;MACX,WACE,OAAO,KAAK,UAAU,WAClB,KAAK,MAAM,KAAK,KAAK,IACrB,KAAK,SAAS,CAAC;KACvB,CAAC,EACoB;IACvB,SAAS,GAAG,CAAC;IAIf,IAAI,OAAO,IAAI,WAAW,YACxB,IAAI;KAOF,OAAO,EAAE,QAAQ,MANC,IAAI,OACpB,KAAK,UACL,OAAO,KAAK,UAAU,WAClB,KAAK,MAAM,KAAK,KAAK,IACrB,KAAK,SAAS,CAAC,CACrB,EACqB;IACvB,SAAS,GAAG,CAAC;GAEjB;GAGA,MAAM,EAAE,sBACN,MAAM,OAAO,6BAA+B;GAC9C,MAAM,OACJ,QAAQ,gBACR,kBAAkB,iBACjB,OAAO,aAAa,cAChB,SAAS,cAAc,aAAa,CAAC,EAAU,eAChD;GACN,MAAM,SAAc,MAAM;GAC1B,IAAI,UAAU,OAAO,OAAO,gBAAgB,YAAY;IACtD,MAAM,SACJ,KAAK,IAAI,CAAC,CAAC,SAAS,EAAE,IAAI,KAAK,OAAO,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC;IAC9D,MAAM,gBAAgB,KAAK,aAAa;IACxC,MAAM,oBACJ,KAAK,cAAc,gBAAgB,MAAS;IAsC9C,OAAO,EAAE,cArCY,IAAI,SAAS,SAAS,WAAW;KACpD,MAAM,UAAU,iBAAiB;MAC/B,OAAO,oBAAoB,WAAW,OAAO;MAC7C,uBAAO,IAAI,MAAM,oCAAoC,CAAC;KACxD,GAAG,iBAAiB;KAEpB,MAAM,WAAW,UAAwB;MACvC,MAAM,OAAO,MAAM;MACnB,IACE,QACA,KAAK,SAAS,yBACd,KAAK,WAAW,QAChB;OACA,aAAa,OAAO;OACpB,OAAO,oBAAoB,WAAW,OAAO;OAC7C,IAAI,KAAK,OACP,OAAO,IAAI,MAAM,KAAK,KAAK,CAAC;YAE5B,QAAQ,KAAK,MAAM;MAEvB;KACF;KAEA,OAAO,iBAAiB,WAAW,OAAO;KAC1C,OAAO,YAAY;MACjB,MAAM;MACN;MACA,SAAS;OACP,MAAM,KAAK;OACX,OACE,OAAO,KAAK,UAAU,WAClB,KAAK,MAAM,KAAK,KAAK,IACrB,KAAK,SAAS,CAAC;OACrB,SAAS,KAAK,WAAW,MAAM,iBAAiB;MAClD;KACF,CAAC;IACH,CAAC,EACe;GAClB;GAEA,MAAM,IAAI,MACR,QAAQ,KAAK,SAAS,wDACxB;EACF;EAEA,KAAK,kBAAkB;GACrB,MAAM,EAAE,sBACN,MAAM,OAAO,6BAA+B;GAC9C,MAAM,gBACJ,KAAK,WACL,QAAQ,cAAc,iBACtB,kBAAkB,iBAClB;GACF,MAAM,KAAK,MAAM,MAAM;GACvB,MAAM,EAAE,gBAAgB,MAAM,OAAO,4BAA+B;GACpE,MAAM,WAAW,MAAM,YAAY,IAAI,aAAa;GAEpD,eAAe,aACb,KACA,SAAS,IACU;IACnB,MAAM,SAAmB,CAAC;IAC1B,WAAW,MAAM,CAAC,MAAM,WAAY,IAAY,QAAQ,GAAG;KACzD,MAAM,UAAU,SAAS,GAAG,OAAO,GAAG,SAAS;KAC/C,IAAI,OAAO,SAAS,aAAa;MAC/B,MAAM,MAAM,MAAM,aAAa,QAAQ,OAAO;MAC9C,OAAO,KAAK,GAAG,GAAG;KACpB,OACE,OAAO,KAAK,OAAO;IAEvB;IACA,OAAO;GACT;GAEA,eAAe,SAAS,SAA6C;IACnE,IAAI;KACF,MAAM,QAAQ,QAAQ,MAAM,GAAG;KAC/B,IAAI,MAAiC;KACrC,KAAK,IAAI,IAAI,GAAG,IAAI,MAAM,SAAS,GAAG,KACpC,MAAM,MAAM,IAAI,mBAAmB,MAAM,EAAE;KAI7C,MAAM,SAAS,OAAM,OADF,MADM,IAAI,cAAc,MAAM,MAAM,SAAS,EAAE,EACrC,CAAC,QAAQ,EACb,CAAC,YAAY;KACtC,OAAO,IAAI,WAAW,MAAM;IAC9B,QAAQ;KACN,OAAO;IACT;GACF;GAEA,MAAM,EAAE,qBAAqB,MAAM,OAAO;GAW1C,OAAO,MADc,IARE,iBAAiB;IACtC;IACA,OAAO,KAAK;IACZ,eAAe,yBAAyB,CAAC,CAAC;IAC1C,sBAAsB,aAAa,QAAQ;IAC3C,aAAa,aAAa,SAAS,QAAQ;GAC7C,CAE8B,CAAC,CAAC,SAAS;EAE3C;EAEA,SACE,MAAM,IAAI,MAAM,mBAAmB,OAAO,EAAE;CAChD;AACF;AAEA,SAAgB,gCACd,UAAmC,CAAC,GAChB;CACpB,IAAI,cAAc;EAChB,IAAI;GACF,aAAa,WAAW;EAC1B,SAAS,GAAG,CAAC;EACb,eAAe;CACjB;CAEA,MAAM,WACH,QAAQ,YAAY,QAAQ,SAAS,KAAK,KAC3C,gCAAgC;CAClC,MAAM,eAAe,mBAAmB;CACxC,MAAM,cAAc,kBAAkB;CACtC,MAAM,UAAU,QAAQ,WAAW,oBAAoB;CAEvD,IAAI,sBAAoD;CACxD,IAAI,OAAO,iBAAiB,aAC1B,IAAI;EACF,MAAM,SAAS,aAAa,QAAQ,YAAY,uBAAuB;EACvE,IAAI,WAAW,SAAS,WAAW,aACjC,sBAAsB;CAE1B,SAAS,GAAG,CAAC;CAGf,MAAM,YACJ,QAAQ,aACR;CAGF,IAAI;CACJ,IAAI,OAAO,iBAAiB,aAC1B,IAAI;EAIF,SAAS,aAAa,QAAQ,YAAY,iBAAiB,KAAK;CAClE,SAAS,GAAG,CAAC;CAGf,MAAM,EAAE,SAAS,UAAU,yBAAyB;CAEpD,MAAM,SAAS,IAAI,mBAAmB;EACpC;EACA;EACA;EACA;EACA;EACA;EACA;EACA,KAAK;EACL,UAAU;GACR,iBAAiB,SACf,4BAA4B,gBAAgB,MAAM,OAAO;GAC3D,eAAe,SACb,4BAA4B,cAAc,MAAM,OAAO;GACzD,eAAe,SACb,4BAA4B,cAAc,MAAM,OAAO;GACzD,gBAAgB,SACd,4BAA4B,eAAe,MAAM,OAAO;GAC1D,eAAe,SACb,4BAA4B,cAAc,MAAM,OAAO;GACzD,mBAAmB,SACjB,4BAA4B,kBAAkB,MAAM,OAAO;EAC/D;CACF,CAAC;CAED,IAAI,QAAQ,gBAAgB,SAAS,0BAA0B,GAC7D,OAAO,QAAQ;CAGjB,eAAe;CACf,OAAO;AACT;AAEA,SAAgB,8BAAyD;CACvE,OAAO;AACT;AAEA,SAAgB,yBAA+B;CAC7C,IAAI,cAAc;EAChB,IAAI;GACF,aAAa,WAAW;EAC1B,SAAS,GAAG,CAAC;EACb,eAAe;CACjB;AACF;AAEA,eAAsB,4BACpB,UAAmE,CAAC,GAChC;CACpC,IAAI,KAAK,QAAQ;CACjB,IAAI,CAAC,IACH,IAAI;EACF,KAAK,MAAM,MAAM;CACnB,SAAS,GAAG,CAAC;CAIf,IAAI,CAAC,MADiB,sBAAsB,EAAE,GAChC;EACZ,uBAAuB;EACvB,OAAO;CACT;CAEA,IAAI,CAAC,0BAA0B,GAC7B,OAAO;CAIT,IAAI,OAAO,iBAAiB,eAAe,IACzC,IAAI;EACF,MAAM,EAAE,cAAc,MAAM,OAAO,0BAAwB;EAC3D,MAAM,CAAC,KAAK,aAAa,MAAM,QAAQ,IAAI,CACzC,UAAU,IAAI,YAAY,iBAAiB,GAC3C,UAAU,IAAI,YAAY,uBAAuB,CACnD,CAAC;EACD,IAAI,KACF,aAAa,QAAQ,YAAY,mBAAmB,GAAG;EAEzD,IAAI,WACF,aAAa,QAAQ,YAAY,yBAAyB,SAAS;EAErE,aAAa,QAAQ,YAAY,uBAAuB,MAAM;CAChE,SAAS,GAAG,CAAC;CAGf,MAAM,SAAS,4BAA4B;CAC3C,IAAI,QAAQ;EACV,OAAO,gBAAgB,QAAQ,KAAK;EACpC,OAAO;CACT;CAEA,OAAO,gCAAgC,OAAO;AAChD"}
@@ -5,17 +5,17 @@ import { D as TELEGRAM_PROXY_BASE, E as TELEGRAM_MAX_LENGTH, F as getProvider, I
5
5
  import { t as getConfig } from "./getConfig-BxxXMyuM.js";
6
6
  import { c as writeOpfsPathViaWorker, f as readGroupFile, s as writeFileHandle, t as toolsStore, u as loadDeclarativeTools } from "./tools-f1WPNDSS.js";
7
7
  import { t as readGroupFileBytes } from "./readGroupFileBytes-CSA7u-nJ.js";
8
- import { $t as unregisterSubagentCollector, A as shouldStartLocalScheduler, At as isRetryableHttpError, B as getApiKeyForHeaders, Bt as deleteRoom, Ct as formatRequest, D as compactContext, Dt as invokeWithPromptApi, Et as parseResponse, G as getProviderRuntimeHeaders, Ht as roomGroupId, It as ensureBuiltinAiPolyfills, K as getReasoningConfig, L as applyLlamafileHeaders, Lt as fetchTokenizerConfig, M as handleRoomInvite, Mt as discoverSkills, O as handleWorkerMessage, Ot as isPromptApiSupported, Qt as setPostHandler, R as applyMeshLlmHeaders, Rt as loadModelStream, St as buildHeaders, Tt as normalizeMeshLlmResult, Ut as roomIdFromGroupId, V as getApiKeyForRequest, Vt as getRoomMetadata, Wt as upsertRoom, Xt as post, Zt as registerSubagentCollector, a as updateTaskLastRun, an as buildConversationMessages, bt as saveMessage, ct as clearPeerJsTypingState, fn as detectProviderHelpType, ft as getChannelTypeForGroup, gt as loadChannelEnabled, in as listGroups, jt as withRetry, k as runTaskAsScheduled, kt as executeTool, ln as buildDynamicContext, nn as createLogMessage, nt as stopTransformersProgressPolling, o as clearGroupMessages, ot as deliverResponse, rn as sanitizeModelOutput, st as applyAllChannelRunningStates, t as orchestratorStore, tn as createToolActivityMessage, tt as startTransformersProgressPolling, un as estimateTokens, vt as submitMessage, wt as getContextLimit, xt as buildSystemPrompt, y as syncProxyConfigToServiceWorker, yt as normalizeStringList, z as cancelLlamafileRequest, zt as DEFAULT_CHUNK_SIZE } from "./orchestrator-DNamnY-k.js";
8
+ import { $t as unregisterSubagentCollector, A as shouldStartLocalScheduler, At as isRetryableHttpError, B as getApiKeyForHeaders, Bt as deleteRoom, Ct as formatRequest, D as compactContext, Dt as invokeWithPromptApi, Et as parseResponse, G as getProviderRuntimeHeaders, Ht as roomGroupId, It as ensureBuiltinAiPolyfills, K as getReasoningConfig, L as applyLlamafileHeaders, Lt as fetchTokenizerConfig, M as handleRoomInvite, Mt as discoverSkills, O as handleWorkerMessage, Ot as isPromptApiSupported, Qt as setPostHandler, R as applyMeshLlmHeaders, Rt as loadModelStream, St as buildHeaders, Tt as normalizeMeshLlmResult, Ut as roomIdFromGroupId, V as getApiKeyForRequest, Vt as getRoomMetadata, Wt as upsertRoom, Xt as post, Zt as registerSubagentCollector, a as updateTaskLastRun, an as buildConversationMessages, bt as saveMessage, ct as clearPeerJsTypingState, fn as detectProviderHelpType, ft as getChannelTypeForGroup, gt as loadChannelEnabled, in as listGroups, jt as withRetry, k as runTaskAsScheduled, kt as executeTool, ln as buildDynamicContext, nn as createLogMessage, nt as stopTransformersProgressPolling, o as clearGroupMessages, ot as deliverResponse, rn as sanitizeModelOutput, st as applyAllChannelRunningStates, t as orchestratorStore, tn as createToolActivityMessage, tt as startTransformersProgressPolling, un as estimateTokens, vt as submitMessage, wt as getContextLimit, xt as buildSystemPrompt, y as syncProxyConfigToServiceWorker, yt as normalizeStringList, z as cancelLlamafileRequest, zt as DEFAULT_CHUNK_SIZE } from "./orchestrator-DW5l2bbW.js";
9
9
  import { t as setConfig } from "./setConfig-BFED5CXn.js";
10
10
  import { ulid } from "./utils/ulid.js";
11
11
  import { t as TOOL_DEFINITIONS } from "./tools-DKzPWc0q.js";
12
- import { i as activate_skill, r as syncWebMcpRegistration } from "./syncWebMcpRegistration-DEs4JjI_.js";
12
+ import { i as activate_skill, r as syncWebMcpRegistration } from "./syncWebMcpRegistration-CaAPPg2V.js";
13
13
  import "./tools-C3Kft940.js";
14
14
  import { x as toTrustedScriptUrl } from "./utils-B99XP70b.js";
15
15
  import { n as decryptValue, r as encryptValue } from "./crypto-BPECyFrG.js";
16
- import { a as persistMessageAttachments, i as inferAttachmentMimeType, r as ROOM_METHOD, t as PeerJsChannel } from "./peerjs-BgkPSHKa.js";
16
+ import { a as persistMessageAttachments, i as inferAttachmentMimeType, r as ROOM_METHOD, t as PeerJsChannel } from "./peerjs-BXlMuIQn.js";
17
17
  import { i as unregisterWebMcpTools, r as setWebMcpMode } from "./webmcp-BC8_WafM.js";
18
- import { ensureControlPlaneConnected } from "./initControlPlane-DCK_SHeR.js";
18
+ import { ensureControlPlaneConnected } from "./initControlPlane-3TUdhRBM.js";
19
19
 
20
20
  //#region src/db/migrateLegacyDatabase.ts
21
21
  /**
@@ -4522,4 +4522,4 @@ var Orchestrator = class {
4522
4522
 
4523
4523
  //#endregion
4524
4524
  export { Orchestrator };
4525
- //# sourceMappingURL=orchestrator-XygttQw2.js.map
4525
+ //# sourceMappingURL=orchestrator-DLnCmeTZ.js.map