shadow-claw 1.27.0 → 1.28.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 (240) hide show
  1. package/.well-known/ai-catalog.json +11 -0
  2. package/.well-known/mcp/index.html +19 -0
  3. package/.well-known/mcp/server-card.json +52 -0
  4. package/.well-known/mcp/servers.json +15 -0
  5. package/.well-known/mcp.json +52 -0
  6. package/.well-known/oauth-protected-resource +10 -0
  7. package/.well-known/oauth-protected-resource.json +10 -0
  8. package/bin/assert-version-bump.mjs +61 -3
  9. package/bin/assert-version-bump.test.mjs +77 -1
  10. package/bin/build/build.mjs +116 -49
  11. package/bin/build/build.test.mjs +103 -0
  12. package/bin/cli.mjs +299 -237
  13. package/bin/cli.test.mjs +27 -0
  14. package/bin/commands/mcp.mjs +132 -2
  15. package/bin/commands/mcp.test.mjs +166 -0
  16. package/bin/commands/skills-index.mjs +139 -20
  17. package/bin/commands/skills-index.test.mjs +82 -0
  18. package/bin/utils/control-client.mjs +17 -0
  19. package/bin/utils/control-client.test.mjs +46 -0
  20. package/bin/version.mjs +208 -0
  21. package/bin/version.test.mjs +138 -0
  22. package/dist/electron/main.cjs +195 -185
  23. package/dist/lib/components/index.js +21 -21
  24. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  25. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  26. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  27. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  28. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  29. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  30. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  31. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  32. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  33. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  34. package/dist/lib/components/shadow-claw/shadow-claw.d.ts +1 -0
  35. package/dist/lib/components/shadow-claw/utils/setupAppLifecycle.d.ts +23 -0
  36. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  37. package/dist/lib/components/shadow-claw-channels.js +1 -1
  38. package/dist/lib/components/shadow-claw-chat.js +1 -1
  39. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  40. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  41. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  42. package/dist/lib/components/shadow-claw-files.js +1 -1
  43. package/dist/lib/components/shadow-claw-git.js +1 -1
  44. package/dist/lib/components/shadow-claw-llm.js +1 -1
  45. package/dist/lib/components/shadow-claw-networking.js +1 -1
  46. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  47. package/dist/lib/components/shadow-claw-pages.js +1 -1
  48. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  49. package/dist/lib/components/shadow-claw-settings.js +1 -1
  50. package/dist/lib/components/shadow-claw-storage.js +1 -1
  51. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  52. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  53. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  54. package/dist/lib/components/shadow-claw-tools.js +1 -1
  55. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  56. package/dist/lib/components/shadow-claw.js +1 -1
  57. package/dist/lib/{configurePeerJs-oODzltaC.js → configurePeerJs-D8Ph0-A9.js} +2 -2
  58. package/dist/lib/{configurePeerJs-oODzltaC.js.map → configurePeerJs-D8Ph0-A9.js.map} +1 -1
  59. package/dist/lib/core/control-plane-client.d.ts +2 -0
  60. package/dist/lib/core/orchestrator/orchestrator.d.ts +10 -0
  61. package/dist/lib/core/orchestrator/utils/operations/channel.d.ts +2 -2
  62. package/dist/lib/core/utils/initControlPlane.d.ts +6 -0
  63. package/dist/lib/index.js +21 -21
  64. package/dist/lib/{initControlPlane-C2zURVIS.js → initControlPlane-BIrWmpzc.js} +76 -9
  65. package/dist/lib/initControlPlane-BIrWmpzc.js.map +1 -0
  66. package/dist/lib/{markdown-C6EHl9zs.js → markdown-DEUoM1c6.js} +2 -2
  67. package/dist/lib/{markdown-C6EHl9zs.js.map → markdown-DEUoM1c6.js.map} +1 -1
  68. package/dist/lib/{orchestrator-KRjx0eba.js → orchestrator-BtVj9bBB.js} +11 -10
  69. package/dist/lib/{orchestrator-KRjx0eba.js.map → orchestrator-BtVj9bBB.js.map} +1 -1
  70. package/dist/lib/{orchestrator-CACLa_Ro.js → orchestrator-CFCW-l1O.js} +52 -4
  71. package/dist/lib/orchestrator-CFCW-l1O.js.map +1 -0
  72. package/dist/lib/{peerjs-DFWOBcXf.js → peerjs-BoBkx9DJ.js} +23 -3
  73. package/dist/lib/peerjs-BoBkx9DJ.js.map +1 -0
  74. package/dist/lib/{push-client-_tiWQsCT.js → push-client-D6hbzDNV.js} +10 -4
  75. package/dist/lib/push-client-D6hbzDNV.js.map +1 -0
  76. package/dist/lib/{shadow-claw-6UHdiy4a.js → shadow-claw-Cuf2O5bZ.js} +71 -4
  77. package/dist/lib/shadow-claw-Cuf2O5bZ.js.map +1 -0
  78. package/dist/lib/{shadow-claw-channel-config-DmfwJc6G.js → shadow-claw-channel-config-BDPKt6Bd.js} +3 -3
  79. package/dist/lib/{shadow-claw-channel-config-DmfwJc6G.js.map → shadow-claw-channel-config-BDPKt6Bd.js.map} +1 -1
  80. package/dist/lib/{shadow-claw-channels-1N6Jl-By.js → shadow-claw-channels-BsP5JABM.js} +2 -2
  81. package/dist/lib/{shadow-claw-channels-1N6Jl-By.js.map → shadow-claw-channels-BsP5JABM.js.map} +1 -1
  82. package/dist/lib/{shadow-claw-chat-BMoqQJRK.js → shadow-claw-chat-Cam2lX4k.js} +4 -4
  83. package/dist/lib/{shadow-claw-chat-BMoqQJRK.js.map → shadow-claw-chat-Cam2lX4k.js.map} +1 -1
  84. package/dist/lib/{shadow-claw-control-plane-UG0o7pCz.js → shadow-claw-control-plane-DB2qcCFs.js} +20 -10
  85. package/dist/lib/shadow-claw-control-plane-DB2qcCFs.js.map +1 -0
  86. package/dist/lib/{shadow-claw-conversations-BwXep3iu.js → shadow-claw-conversations-C9Vf4XGx.js} +2 -2
  87. package/dist/lib/{shadow-claw-conversations-BwXep3iu.js.map → shadow-claw-conversations-C9Vf4XGx.js.map} +1 -1
  88. package/dist/lib/{shadow-claw-file-viewer-DUxzVxDT.js → shadow-claw-file-viewer-B4HYiI0v.js} +3 -3
  89. package/dist/lib/{shadow-claw-file-viewer-DUxzVxDT.js.map → shadow-claw-file-viewer-B4HYiI0v.js.map} +1 -1
  90. package/dist/lib/{shadow-claw-files-DIREEnT2.js → shadow-claw-files-DVROUESO.js} +2 -2
  91. package/dist/lib/{shadow-claw-files-DIREEnT2.js.map → shadow-claw-files-DVROUESO.js.map} +1 -1
  92. package/dist/lib/{shadow-claw-git-Bg1SWgsF.js → shadow-claw-git-BqrO7cHJ.js} +3 -3
  93. package/dist/lib/{shadow-claw-git-Bg1SWgsF.js.map → shadow-claw-git-BqrO7cHJ.js.map} +1 -1
  94. package/dist/lib/{shadow-claw-llm-CazBrVpM.js → shadow-claw-llm-BexUQdYo.js} +2 -2
  95. package/dist/lib/{shadow-claw-llm-CazBrVpM.js.map → shadow-claw-llm-BexUQdYo.js.map} +1 -1
  96. package/dist/lib/{shadow-claw-networking-Df85tCbO.js → shadow-claw-networking-CfXRGpUD.js} +2 -2
  97. package/dist/lib/{shadow-claw-networking-Df85tCbO.js.map → shadow-claw-networking-CfXRGpUD.js.map} +1 -1
  98. package/dist/lib/{shadow-claw-notifications-v62FryTc.js → shadow-claw-notifications-C9KPMgx_.js} +2 -2
  99. package/dist/lib/{shadow-claw-notifications-v62FryTc.js.map → shadow-claw-notifications-C9KPMgx_.js.map} +1 -1
  100. package/dist/lib/{shadow-claw-pages-BgPyIEZO.js → shadow-claw-pages-CGzGXmrI.js} +3 -3
  101. package/dist/lib/{shadow-claw-pages-BgPyIEZO.js.map → shadow-claw-pages-CGzGXmrI.js.map} +1 -1
  102. package/dist/lib/{shadow-claw-peerjs-xkBXILed.js → shadow-claw-peerjs-B0ZB7yhB.js} +3 -3
  103. package/dist/lib/{shadow-claw-peerjs-xkBXILed.js.map → shadow-claw-peerjs-B0ZB7yhB.js.map} +1 -1
  104. package/dist/lib/{shadow-claw-settings-CN89xRVU.js → shadow-claw-settings-DBfMZdDS.js} +2 -2
  105. package/dist/lib/{shadow-claw-settings-CN89xRVU.js.map → shadow-claw-settings-DBfMZdDS.js.map} +1 -1
  106. package/dist/lib/{shadow-claw-storage-VnhcObCe.js → shadow-claw-storage-CM-w6mgG.js} +2 -2
  107. package/dist/lib/{shadow-claw-storage-VnhcObCe.js.map → shadow-claw-storage-CM-w6mgG.js.map} +1 -1
  108. package/dist/lib/{shadow-claw-task-server-jgEC2hHB.js → shadow-claw-task-server-DV4b1g2-.js} +4 -2
  109. package/dist/lib/{shadow-claw-task-server-jgEC2hHB.js.map → shadow-claw-task-server-DV4b1g2-.js.map} +1 -1
  110. package/dist/lib/{shadow-claw-tasks-i_evIufy.js → shadow-claw-tasks-K-foOHSE.js} +3 -3
  111. package/dist/lib/{shadow-claw-tasks-i_evIufy.js.map → shadow-claw-tasks-K-foOHSE.js.map} +1 -1
  112. package/dist/lib/{shadow-claw-terminal-CwScROlu.js → shadow-claw-terminal-CpAknKyA.js} +2 -2
  113. package/dist/lib/{shadow-claw-terminal-CwScROlu.js.map → shadow-claw-terminal-CpAknKyA.js.map} +1 -1
  114. package/dist/lib/{shadow-claw-tools-DD3fyXP4.js → shadow-claw-tools-D98XZ0Ep.js} +3 -3
  115. package/dist/lib/{shadow-claw-tools-DD3fyXP4.js.map → shadow-claw-tools-D98XZ0Ep.js.map} +1 -1
  116. package/dist/lib/{shadow-claw-webvm-DbJq4I3-.js → shadow-claw-webvm-DLOb8dMI.js} +2 -2
  117. package/dist/lib/{shadow-claw-webvm-DbJq4I3-.js.map → shadow-claw-webvm-DLOb8dMI.js.map} +1 -1
  118. package/dist/lib/subsystems/channels/imessage.d.ts +1 -0
  119. package/dist/lib/subsystems/channels/peerjs.d.ts +1 -0
  120. package/dist/lib/subsystems/channels/telegram.d.ts +1 -0
  121. package/dist/lib/subsystems/channels/types.d.ts +2 -0
  122. package/dist/lib/subsystems/notifications/push-client.d.ts +1 -1
  123. package/dist/lib/{syncWebMcpRegistration-DNLnQ-jz.js → syncWebMcpRegistration-NspKefOI.js} +2 -2
  124. package/dist/lib/{syncWebMcpRegistration-DNLnQ-jz.js.map → syncWebMcpRegistration-NspKefOI.js.map} +1 -1
  125. package/dist/public/.well-known/ai-catalog.json +11 -0
  126. package/dist/public/.well-known/mcp/index.html +19 -0
  127. package/dist/public/.well-known/mcp/server-card.json +52 -0
  128. package/dist/public/.well-known/mcp/servers.json +15 -0
  129. package/dist/public/.well-known/mcp.json +52 -0
  130. package/dist/public/.well-known/oauth-protected-resource +10 -0
  131. package/dist/public/.well-known/oauth-protected-resource.json +10 -0
  132. package/dist/public/404.html +28 -1
  133. package/dist/public/AGENTS.md +1 -1
  134. package/dist/public/agent.worker.js +1 -1
  135. package/dist/public/{configurePeerJs-BqgeBjP7.js → configurePeerJs-BhBokQlC.js} +1 -1
  136. package/dist/public/docs/example/article/index.html +3 -3
  137. package/dist/public/docs/publishing/index.html +3 -3
  138. package/dist/public/docs/skill-creator/index.html +3 -3
  139. package/dist/public/docs/subsystems/cli.md +11 -8
  140. package/dist/public/docs/subsystems/mcp-server.md +1 -0
  141. package/dist/public/docs/subsystems/notifications.md +10 -0
  142. package/dist/public/{e2e-bridge-Ceqr5kGc.js → e2e-bridge-DcBoeFvd.js} +1 -1
  143. package/dist/public/{file-viewer-C-6Jc_tb.js → file-viewer-CKtVC9Ix.js} +1 -1
  144. package/dist/public/index.css +1 -1
  145. package/dist/public/index.html +3 -3
  146. package/dist/public/index.js +1 -1
  147. package/dist/public/initControlPlane-Bi8ouFEb.js +1 -0
  148. package/dist/public/llms.txt +36 -1
  149. package/dist/public/main/index.html +3 -3
  150. package/dist/public/main/memory/index.html +3 -3
  151. package/dist/public/{markdown-C3M4OW_A.js → markdown-C-hCVJtc.js} +1 -1
  152. package/dist/public/orchestrator-8qNGfw8r.js +15 -0
  153. package/dist/public/{orchestrator-DHjdLtqa.js → orchestrator-BT3Ks5ip.js} +2 -2
  154. package/dist/public/peerjs-DfhwEiiq.js +1 -0
  155. package/dist/public/push-client-BVLrE9pK.js +1 -0
  156. package/dist/public/service-worker/fetch-proxy.js +1 -1
  157. package/dist/public/service-worker.js +1 -1
  158. package/dist/public/{shadow-claw-EAt2ml5Y.js → shadow-claw-DCjxNDCX.js} +3 -3
  159. package/dist/public/{shadow-claw-channels-XsfuWFF8.js → shadow-claw-channels-CITDrqMl.js} +1 -1
  160. package/dist/public/{shadow-claw-chat-CbSaOZ4q.js → shadow-claw-chat-BQrSgSKF.js} +1 -1
  161. package/dist/public/{shadow-claw-control-plane-DHvN3Ukg.js → shadow-claw-control-plane-Cp001OY0.js} +2 -2
  162. package/dist/public/{shadow-claw-conversations-BWs5VVfs.js → shadow-claw-conversations-EhX4RvIj.js} +1 -1
  163. package/dist/public/{shadow-claw-file-viewer-BWsoW5QS.js → shadow-claw-file-viewer-DiQXIjZD.js} +1 -1
  164. package/dist/public/{shadow-claw-files-CG7MqWiV.js → shadow-claw-files-lkTnSJsn.js} +1 -1
  165. package/dist/public/{shadow-claw-git-DBRPZNav.js → shadow-claw-git-BlcA_z8x.js} +2 -2
  166. package/dist/public/{shadow-claw-llm-DMvLgKXo.js → shadow-claw-llm-CW16X9Rg.js} +1 -1
  167. package/dist/public/{shadow-claw-networking-Dd8Rw31D.js → shadow-claw-networking-ySsMBY_i.js} +1 -1
  168. package/dist/public/{shadow-claw-notifications-Dbevj-lq.js → shadow-claw-notifications-CyV2zCQ8.js} +1 -1
  169. package/dist/public/{shadow-claw-pages-3_lQAv0t.js → shadow-claw-pages-Cx7cF9ah.js} +1 -1
  170. package/dist/public/{shadow-claw-settings-t8TIlgrM.js → shadow-claw-settings-zm4PHHGi.js} +2 -2
  171. package/dist/public/{shadow-claw-storage-CfEXoSIE.js → shadow-claw-storage-dy9JAEGd.js} +1 -1
  172. package/dist/public/{shadow-claw-task-server-DxQSsgRZ.js → shadow-claw-task-server-Bleww48s.js} +2 -2
  173. package/dist/public/{shadow-claw-tasks-DNpicQwz.js → shadow-claw-tasks-CTI5oaLN.js} +1 -1
  174. package/dist/public/{shadow-claw-terminal-DpY6zU_r.js → shadow-claw-terminal-mZ3i4HaQ.js} +1 -1
  175. package/dist/public/{shadow-claw-tools-WSwWohnk.js → shadow-claw-tools-B_nuk8Zl.js} +1 -1
  176. package/dist/public/{shadow-claw-webvm-CP6oFjg5.js → shadow-claw-webvm-Vl_jH5YL.js} +1 -1
  177. package/dist/public/{syncWebMcpRegistration-DOn9gLnD.js → syncWebMcpRegistration-n2vAMJ4w.js} +1 -1
  178. package/dist/server.js +197 -187
  179. package/package.json +2 -1
  180. package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.test.ts +6 -0
  181. package/src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.ts +19 -9
  182. package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.test.ts +14 -0
  183. package/src/components/settings/shadow-claw-task-server/shadow-claw-task-server.ts +12 -0
  184. package/src/components/shadow-claw/shadow-claw.ts +6 -0
  185. package/src/components/shadow-claw/utils/bindEventListeners.test.ts +57 -0
  186. package/src/components/shadow-claw/utils/bindEventListeners.ts +14 -0
  187. package/src/components/shadow-claw/utils/setupAppLifecycle.test.ts +201 -0
  188. package/src/components/shadow-claw/utils/setupAppLifecycle.ts +101 -0
  189. package/src/core/control-plane-client.test.ts +82 -1
  190. package/src/core/control-plane-client.ts +35 -1
  191. package/src/core/orchestrator/orchestrator.test.ts +49 -0
  192. package/src/core/orchestrator/orchestrator.ts +43 -0
  193. package/src/core/orchestrator/utils/operations/channel.test.ts +17 -0
  194. package/src/core/orchestrator/utils/operations/channel.ts +11 -5
  195. package/src/core/orchestrator/utils/operations/task.test.ts +26 -0
  196. package/src/core/orchestrator/utils/operations/task.ts +8 -1
  197. package/src/core/utils/initControlPlane.test.ts +138 -0
  198. package/src/core/utils/initControlPlane.ts +82 -0
  199. package/src/core/utils/initializeApp.test.ts +27 -1
  200. package/src/core/utils/initializeApp.ts +6 -13
  201. package/src/server/mcp/mcp-server.test.ts +6 -0
  202. package/src/server/mcp/mcp-server.ts +2 -1
  203. package/src/server/mcp/tools/built-in-tools.ts +88 -1
  204. package/src/server/mcp/tools/client-tool-relay.ts +6 -0
  205. package/src/server/mcp/tools/mcp-tools.test.ts +128 -0
  206. package/src/server/openapi/openapi-coverage.test.ts +2 -1
  207. package/src/server/openapi/openapi-spec.ts +2 -1
  208. package/src/server/openapi/paths/mcp.ts +104 -0
  209. package/src/server/openapi/paths/push.ts +3 -0
  210. package/src/server/routes/mcp.test.ts +92 -0
  211. package/src/server/routes/mcp.ts +138 -2
  212. package/src/server/utils/packageVersion.test.ts +10 -0
  213. package/src/server/utils/packageVersion.ts +32 -0
  214. package/src/service-worker/fetch-proxy-rules.test.ts +73 -0
  215. package/src/service-worker/fetch-proxy-rules.ts +44 -0
  216. package/src/service-worker/fetch-proxy.ts +1 -1
  217. package/src/subsystems/channels/imessage.test.ts +36 -0
  218. package/src/subsystems/channels/imessage.ts +11 -0
  219. package/src/subsystems/channels/peerjs.test.ts +56 -0
  220. package/src/subsystems/channels/peerjs.ts +29 -0
  221. package/src/subsystems/channels/telegram.test.ts +38 -0
  222. package/src/subsystems/channels/telegram.ts +13 -0
  223. package/src/subsystems/channels/types.ts +2 -0
  224. package/src/subsystems/notifications/push-client.test.ts +70 -0
  225. package/src/subsystems/notifications/push-client.ts +28 -3
  226. package/src/subsystems/notifications/push-routes.test.ts +82 -0
  227. package/src/subsystems/notifications/push-routes.ts +70 -16
  228. package/src/subsystems/notifications/push-store.test.ts +59 -0
  229. package/src/subsystems/notifications/push-store.ts +113 -19
  230. package/src/testing/jest-setup.ts +15 -0
  231. package/dist/lib/initControlPlane-C2zURVIS.js.map +0 -1
  232. package/dist/lib/orchestrator-CACLa_Ro.js.map +0 -1
  233. package/dist/lib/peerjs-DFWOBcXf.js.map +0 -1
  234. package/dist/lib/push-client-_tiWQsCT.js.map +0 -1
  235. package/dist/lib/shadow-claw-6UHdiy4a.js.map +0 -1
  236. package/dist/lib/shadow-claw-control-plane-UG0o7pCz.js.map +0 -1
  237. package/dist/public/initControlPlane-BN9cWyO0.js +0 -1
  238. package/dist/public/orchestrator-CMbCTjBf.js +0 -15
  239. package/dist/public/peerjs-DUCKH-m9.js +0 -1
  240. package/dist/public/push-client-D0lkwrK0.js +0 -1
@@ -42,7 +42,7 @@ var ControlPlaneClient = class {
42
42
  "opfs",
43
43
  "push"
44
44
  ];
45
- this._version = options.version || "1.23.4";
45
+ this._version = options.version || "1.27.1";
46
46
  this._token = options.token;
47
47
  this._heartbeatIntervalMs = options.heartbeatIntervalMs || 1e4;
48
48
  this._reconnectDelayMs = options.reconnectDelayMs || 1e3;
@@ -62,6 +62,9 @@ var ControlPlaneClient = class {
62
62
  get transport() {
63
63
  return this._transport;
64
64
  }
65
+ get version() {
66
+ return this._version;
67
+ }
65
68
  registerHandler(action, handler) {
66
69
  this._handlers.set(action, handler);
67
70
  }
@@ -71,6 +74,27 @@ var ControlPlaneClient = class {
71
74
  getState() {
72
75
  return this._state;
73
76
  }
77
+ ensureConnected(force = false) {
78
+ this._isDestroyed = false;
79
+ if (this._reconnectTimer) {
80
+ clearTimeout(this._reconnectTimer);
81
+ this._reconnectTimer = null;
82
+ }
83
+ this._currentReconnectDelay = this._reconnectDelayMs;
84
+ if (this._transport === "websocket") {
85
+ const isWsOpen = this._ws && (this._ws.readyState === 1 || this._ws.readyState === this._WebSocketClass?.OPEN);
86
+ if (force || !isWsOpen || this._state !== "connected") {
87
+ this._cleanupConnection();
88
+ this.connect();
89
+ }
90
+ } else {
91
+ const isEsOpen = this._es && (this._es.readyState === 1 || this._es.readyState === this._EventSourceClass?.OPEN);
92
+ if (force || !isEsOpen || this._state !== "connected") {
93
+ this._cleanupConnection();
94
+ this.connect();
95
+ }
96
+ }
97
+ }
74
98
  connect() {
75
99
  if (this._isDestroyed || this._state === "connected" || this._state === "connecting") return;
76
100
  if (this._transport === "websocket") this._connectWebSocket();
@@ -385,6 +409,19 @@ function detectDeviceLabel() {
385
409
  else if (/Edg/i.test(ua)) browser = "Edge";
386
410
  return `${device} ${browser}`;
387
411
  }
412
+ function detectClientVersion() {
413
+ let version = "";
414
+ let revision = "";
415
+ if (typeof document !== "undefined") {
416
+ version = document.querySelector("meta[name=\"version\"]")?.getAttribute("content")?.trim() || "";
417
+ revision = document.querySelector("meta[name=\"revision\"]")?.getAttribute("content")?.trim() || "";
418
+ }
419
+ const shortRevision = revision.length > 7 ? revision.slice(0, 7) : revision;
420
+ if (version && shortRevision) return `${version} (${shortRevision})`;
421
+ if (version) return version;
422
+ if (shortRevision) return shortRevision;
423
+ return "1.27.1";
424
+ }
388
425
  let activeClient = null;
389
426
  async function executeClientControlCommand(action, args = {}, options = {}) {
390
427
  const clientId = getOrCreateControlPlaneClientId();
@@ -393,7 +430,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
393
430
  switch (action) {
394
431
  case "send-message": {
395
432
  if (!args.text) throw new Error("Missing text parameter");
396
- const { orchestratorStore } = await import("./orchestrator-KRjx0eba.js").then((n) => n.n);
433
+ const { orchestratorStore } = await import("./orchestrator-BtVj9bBB.js").then((n) => n.n);
397
434
  const orch = options.orchestrator || orchestratorStore.orchestrator;
398
435
  const targetGroupId = args.groupId || orchestratorStore.activeGroupId || "br:main";
399
436
  if (orch?.browserChat?.submit) {
@@ -428,12 +465,13 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
428
465
  return { tasks };
429
466
  }
430
467
  case "read-state": {
431
- const { orchestratorStore } = await import("./orchestrator-KRjx0eba.js").then((n) => n.n);
468
+ const { orchestratorStore } = await import("./orchestrator-BtVj9bBB.js").then((n) => n.n);
432
469
  const orch = options.orchestrator || orchestratorStore.orchestrator;
433
470
  return {
434
471
  clientId,
435
472
  deviceLabel,
436
473
  capabilities,
474
+ version: options.version || detectClientVersion(),
437
475
  activeGroupId: options.orchestrator?.activeGroupId || orchestratorStore.activeGroupId || orch?.activeGroupId || "br:main",
438
476
  state: options.orchestrator?.state || orchestratorStore.state || orch?.state || "idle"
439
477
  };
@@ -450,7 +488,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
450
488
  })) };
451
489
  } catch (_) {}
452
490
  try {
453
- const { orchestratorStore } = await import("./orchestrator-KRjx0eba.js").then((n) => n.n);
491
+ const { orchestratorStore } = await import("./orchestrator-BtVj9bBB.js").then((n) => n.n);
454
492
  const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
455
493
  const activeGroupId = args.groupId || orch?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
456
494
  const group = orchestratorStore.groups.find((g) => g.groupId === activeGroupId);
@@ -475,7 +513,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
475
513
  case "invoke-tool": {
476
514
  if (!args.toolName) throw new Error("Missing toolName parameter");
477
515
  try {
478
- const { orchestratorStore } = await import("./orchestrator-KRjx0eba.js").then((n) => n.n);
516
+ const { orchestratorStore } = await import("./orchestrator-BtVj9bBB.js").then((n) => n.n);
479
517
  const { toolsStore } = await import("./tools-DwwB9RBa.js").then((n) => n.n);
480
518
  const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
481
519
  const activeGroupId = args.groupId || orch?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
@@ -528,7 +566,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
528
566
  return { result: await ctx.invoke(args.toolName, typeof args.input === "string" ? JSON.parse(args.input) : args.input || {}) };
529
567
  } catch (_) {}
530
568
  }
531
- const { orchestratorStore } = await import("./orchestrator-KRjx0eba.js").then((n) => n.n);
569
+ const { orchestratorStore } = await import("./orchestrator-BtVj9bBB.js").then((n) => n.n);
532
570
  const orch = options.orchestrator || orchestratorStore.orchestrator || (typeof document !== "undefined" ? document.querySelector("shadow-claw")?.orchestrator : null);
533
571
  const worker = orch?.agentWorker;
534
572
  if (worker && typeof worker.postMessage === "function") {
@@ -564,7 +602,7 @@ async function executeClientControlCommand(action, args = {}, options = {}) {
564
602
  throw new Error(`Tool ${args.toolName} could not be executed (no context or worker available)`);
565
603
  }
566
604
  case "trigger-backup": {
567
- const { orchestratorStore } = await import("./orchestrator-KRjx0eba.js").then((n) => n.n);
605
+ const { orchestratorStore } = await import("./orchestrator-BtVj9bBB.js").then((n) => n.n);
568
606
  const targetGroupId = args.groupId || options.orchestrator?.activeGroupId || orchestratorStore.activeGroupId || "br:main";
569
607
  const db = await getDb();
570
608
  const { getGroupDir } = await import("./getGroupDir-m0f-ekgX.js").then((n) => n.n);
@@ -613,6 +651,7 @@ function createDefaultControlPlaneClient(options = {}) {
613
651
  const clientId = options.clientId && options.clientId.trim() || getOrCreateControlPlaneClientId();
614
652
  const capabilities = detectCapabilities();
615
653
  const deviceLabel = detectDeviceLabel();
654
+ const version = options.version || detectClientVersion();
616
655
  let configuredTransport = null;
617
656
  if (typeof localStorage !== "undefined") try {
618
657
  const stored = localStorage.getItem(CONFIG_KEYS.CONTROL_PLANE_TRANSPORT);
@@ -628,6 +667,7 @@ function createDefaultControlPlaneClient(options = {}) {
628
667
  clientId,
629
668
  deviceLabel,
630
669
  capabilities,
670
+ version,
631
671
  peerId,
632
672
  transport,
633
673
  httpUrl,
@@ -645,6 +685,9 @@ function createDefaultControlPlaneClient(options = {}) {
645
685
  activeClient = client;
646
686
  return client;
647
687
  }
688
+ function getActiveControlPlaneClient() {
689
+ return activeClient;
690
+ }
648
691
  function stopControlPlaneClient() {
649
692
  if (activeClient) {
650
693
  try {
@@ -653,7 +696,31 @@ function stopControlPlaneClient() {
653
696
  activeClient = null;
654
697
  }
655
698
  }
699
+ async function ensureControlPlaneConnected(options = {}) {
700
+ let db = options.db;
701
+ if (!db) try {
702
+ db = await getDb();
703
+ } catch (_) {}
704
+ if (!await isControlPlaneEnabled(db)) {
705
+ stopControlPlaneClient();
706
+ return null;
707
+ }
708
+ if (!shouldConnectControlPlane()) return null;
709
+ if (typeof localStorage !== "undefined" && db) try {
710
+ const { getConfig } = await import("./getConfig-BxxXMyuM.js").then((n) => n.n);
711
+ const [url, transport] = await Promise.all([getConfig(db, CONFIG_KEYS.CONTROL_PLANE_URL), getConfig(db, CONFIG_KEYS.CONTROL_PLANE_TRANSPORT)]);
712
+ if (url) localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_URL, url);
713
+ if (transport) localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_TRANSPORT, transport);
714
+ localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_ENABLED, "true");
715
+ } catch (_) {}
716
+ const client = getActiveControlPlaneClient();
717
+ if (client) {
718
+ client.ensureConnected(options.force);
719
+ return client;
720
+ }
721
+ return createDefaultControlPlaneClient(options);
722
+ }
656
723
 
657
724
  //#endregion
658
- export { createDefaultControlPlaneClient, executeClientControlCommand, isControlPlaneEnabled, shouldConnectControlPlane, stopControlPlaneClient };
659
- //# sourceMappingURL=initControlPlane-C2zURVIS.js.map
725
+ export { ensureControlPlaneConnected, executeClientControlCommand, isControlPlaneEnabled, shouldConnectControlPlane, stopControlPlaneClient };
726
+ //# sourceMappingURL=initControlPlane-BIrWmpzc.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"initControlPlane-BIrWmpzc.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,5 +1,5 @@
1
1
  import { i as __toESM, t as __commonJSMin } from "./rolldown-runtime-DZ8SGSJo.js";
2
- import { Nt as require_gray_matter } from "./orchestrator-KRjx0eba.js";
2
+ import { Nt as require_gray_matter } from "./orchestrator-BtVj9bBB.js";
3
3
  import { n as getDOMPurify, t as ensureIframeSanitizerHook } from "./iframe-sanitizer-CUqHuWQ-.js";
4
4
  import { b as isAllowedCustomElement } from "./trusted-types-Dx0RZlrd.js";
5
5
 
@@ -49748,4 +49748,4 @@ async function renderMarkdown(src, options) {
49748
49748
 
49749
49749
  //#endregion
49750
49750
  export { splitFrontmatter as n, es_default as r, renderMarkdown as t };
49751
- //# sourceMappingURL=markdown-C6EHl9zs.js.map
49751
+ //# sourceMappingURL=markdown-DEUoM1c6.js.map