shadow-claw 1.28.0 → 1.29.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 (194) hide show
  1. package/.well-known/mcp/server-card.json +1 -1
  2. package/.well-known/mcp.json +1 -1
  3. package/README.md +96 -278
  4. package/bin/cli.mjs +4 -0
  5. package/bin/commands/mcp.mjs +409 -125
  6. package/bin/commands/mcp.test.mjs +151 -18
  7. package/bin/utils/control-client.mjs +338 -103
  8. package/bin/utils/control-client.test.mjs +14 -0
  9. package/dist/electron/main.cjs +179 -179
  10. package/dist/lib/components/index.js +21 -21
  11. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  12. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  13. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  14. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  15. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  16. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  17. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  18. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  19. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  20. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  21. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  22. package/dist/lib/components/shadow-claw-channels.js +1 -1
  23. package/dist/lib/components/shadow-claw-chat.js +1 -1
  24. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  25. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  26. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  27. package/dist/lib/components/shadow-claw-files.js +1 -1
  28. package/dist/lib/components/shadow-claw-git.js +1 -1
  29. package/dist/lib/components/shadow-claw-llm.js +1 -1
  30. package/dist/lib/components/shadow-claw-networking.js +1 -1
  31. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  32. package/dist/lib/components/shadow-claw-pages.js +1 -1
  33. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  34. package/dist/lib/components/shadow-claw-settings.js +1 -1
  35. package/dist/lib/components/shadow-claw-storage.js +1 -1
  36. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  37. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  38. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  39. package/dist/lib/components/shadow-claw-tools.js +1 -1
  40. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  41. package/dist/lib/components/shadow-claw.js +1 -1
  42. package/dist/lib/{configurePeerJs-D8Ph0-A9.js → configurePeerJs-DG4hliKp.js} +2 -2
  43. package/dist/lib/{configurePeerJs-D8Ph0-A9.js.map → configurePeerJs-DG4hliKp.js.map} +1 -1
  44. package/dist/lib/index.js +21 -21
  45. package/dist/lib/{initControlPlane-BIrWmpzc.js → initControlPlane-DnpAzphg.js} +8 -8
  46. package/dist/lib/{initControlPlane-BIrWmpzc.js.map → initControlPlane-DnpAzphg.js.map} +1 -1
  47. package/dist/lib/{markdown-DEUoM1c6.js → markdown-DgdSt2GD.js} +2 -2
  48. package/dist/lib/{markdown-DEUoM1c6.js.map → markdown-DgdSt2GD.js.map} +1 -1
  49. package/dist/lib/{orchestrator-CFCW-l1O.js → orchestrator-CjEau_RG.js} +5 -5
  50. package/dist/lib/{orchestrator-CFCW-l1O.js.map → orchestrator-CjEau_RG.js.map} +1 -1
  51. package/dist/lib/{orchestrator-BtVj9bBB.js → orchestrator-ClXbJ4Mb.js} +2 -2
  52. package/dist/lib/{orchestrator-BtVj9bBB.js.map → orchestrator-ClXbJ4Mb.js.map} +1 -1
  53. package/dist/lib/{peerjs-BoBkx9DJ.js → peerjs-BdfpltIe.js} +3 -3
  54. package/dist/lib/{peerjs-BoBkx9DJ.js.map → peerjs-BdfpltIe.js.map} +1 -1
  55. package/dist/lib/{push-client-D6hbzDNV.js → push-client-DjwKknNg.js} +9 -3
  56. package/dist/lib/push-client-DjwKknNg.js.map +1 -0
  57. package/dist/lib/{shadow-claw-Cuf2O5bZ.js → shadow-claw-DcPGKenn.js} +4 -4
  58. package/dist/lib/{shadow-claw-Cuf2O5bZ.js.map → shadow-claw-DcPGKenn.js.map} +1 -1
  59. package/dist/lib/{shadow-claw-channel-config-BDPKt6Bd.js → shadow-claw-channel-config-DEL-aZ7N.js} +3 -3
  60. package/dist/lib/{shadow-claw-channel-config-BDPKt6Bd.js.map → shadow-claw-channel-config-DEL-aZ7N.js.map} +1 -1
  61. package/dist/lib/{shadow-claw-channels-BsP5JABM.js → shadow-claw-channels-BgaJiPdE.js} +2 -2
  62. package/dist/lib/{shadow-claw-channels-BsP5JABM.js.map → shadow-claw-channels-BgaJiPdE.js.map} +1 -1
  63. package/dist/lib/{shadow-claw-chat-Cam2lX4k.js → shadow-claw-chat-mXPQZbwT.js} +4 -4
  64. package/dist/lib/{shadow-claw-chat-Cam2lX4k.js.map → shadow-claw-chat-mXPQZbwT.js.map} +1 -1
  65. package/dist/lib/{shadow-claw-control-plane-DB2qcCFs.js → shadow-claw-control-plane-DO6foOLV.js} +6 -6
  66. package/dist/lib/{shadow-claw-control-plane-DB2qcCFs.js.map → shadow-claw-control-plane-DO6foOLV.js.map} +1 -1
  67. package/dist/lib/{shadow-claw-conversations-C9Vf4XGx.js → shadow-claw-conversations-BLwHTwdW.js} +2 -2
  68. package/dist/lib/{shadow-claw-conversations-C9Vf4XGx.js.map → shadow-claw-conversations-BLwHTwdW.js.map} +1 -1
  69. package/dist/lib/{shadow-claw-file-viewer-B4HYiI0v.js → shadow-claw-file-viewer-BSbZvSl-.js} +3 -3
  70. package/dist/lib/{shadow-claw-file-viewer-B4HYiI0v.js.map → shadow-claw-file-viewer-BSbZvSl-.js.map} +1 -1
  71. package/dist/lib/{shadow-claw-files-DVROUESO.js → shadow-claw-files-BLVr9Pua.js} +2 -2
  72. package/dist/lib/{shadow-claw-files-DVROUESO.js.map → shadow-claw-files-BLVr9Pua.js.map} +1 -1
  73. package/dist/lib/{shadow-claw-git-BqrO7cHJ.js → shadow-claw-git-CHC1H86J.js} +3 -3
  74. package/dist/lib/{shadow-claw-git-BqrO7cHJ.js.map → shadow-claw-git-CHC1H86J.js.map} +1 -1
  75. package/dist/lib/{shadow-claw-llm-BexUQdYo.js → shadow-claw-llm-CKXfxd3D.js} +2 -2
  76. package/dist/lib/{shadow-claw-llm-BexUQdYo.js.map → shadow-claw-llm-CKXfxd3D.js.map} +1 -1
  77. package/dist/lib/{shadow-claw-networking-CfXRGpUD.js → shadow-claw-networking-dpYvfchh.js} +2 -2
  78. package/dist/lib/{shadow-claw-networking-CfXRGpUD.js.map → shadow-claw-networking-dpYvfchh.js.map} +1 -1
  79. package/dist/lib/{shadow-claw-notifications-C9KPMgx_.js → shadow-claw-notifications-_YeAVPga.js} +2 -2
  80. package/dist/lib/{shadow-claw-notifications-C9KPMgx_.js.map → shadow-claw-notifications-_YeAVPga.js.map} +1 -1
  81. package/dist/lib/{shadow-claw-pages-CGzGXmrI.js → shadow-claw-pages-DVzZriZ7.js} +3 -3
  82. package/dist/lib/{shadow-claw-pages-CGzGXmrI.js.map → shadow-claw-pages-DVzZriZ7.js.map} +1 -1
  83. package/dist/lib/{shadow-claw-peerjs-B0ZB7yhB.js → shadow-claw-peerjs-BvixjeBz.js} +3 -3
  84. package/dist/lib/{shadow-claw-peerjs-B0ZB7yhB.js.map → shadow-claw-peerjs-BvixjeBz.js.map} +1 -1
  85. package/dist/lib/{shadow-claw-settings-DBfMZdDS.js → shadow-claw-settings-DV9-gD4Q.js} +2 -2
  86. package/dist/lib/{shadow-claw-settings-DBfMZdDS.js.map → shadow-claw-settings-DV9-gD4Q.js.map} +1 -1
  87. package/dist/lib/{shadow-claw-storage-CM-w6mgG.js → shadow-claw-storage-Bv__kXG6.js} +2 -2
  88. package/dist/lib/{shadow-claw-storage-CM-w6mgG.js.map → shadow-claw-storage-Bv__kXG6.js.map} +1 -1
  89. package/dist/lib/{shadow-claw-task-server-DV4b1g2-.js → shadow-claw-task-server-DNOe8PWK.js} +2 -2
  90. package/dist/lib/{shadow-claw-task-server-DV4b1g2-.js.map → shadow-claw-task-server-DNOe8PWK.js.map} +1 -1
  91. package/dist/lib/{shadow-claw-tasks-K-foOHSE.js → shadow-claw-tasks-qmcDT4PU.js} +3 -3
  92. package/dist/lib/{shadow-claw-tasks-K-foOHSE.js.map → shadow-claw-tasks-qmcDT4PU.js.map} +1 -1
  93. package/dist/lib/{shadow-claw-terminal-CpAknKyA.js → shadow-claw-terminal-0QUWP8of.js} +2 -2
  94. package/dist/lib/{shadow-claw-terminal-CpAknKyA.js.map → shadow-claw-terminal-0QUWP8of.js.map} +1 -1
  95. package/dist/lib/{shadow-claw-tools-D98XZ0Ep.js → shadow-claw-tools-Bs_bmI6-.js} +3 -3
  96. package/dist/lib/{shadow-claw-tools-D98XZ0Ep.js.map → shadow-claw-tools-Bs_bmI6-.js.map} +1 -1
  97. package/dist/lib/{shadow-claw-webvm-DLOb8dMI.js → shadow-claw-webvm-DYaoL7QY.js} +2 -2
  98. package/dist/lib/{shadow-claw-webvm-DLOb8dMI.js.map → shadow-claw-webvm-DYaoL7QY.js.map} +1 -1
  99. package/dist/lib/{syncWebMcpRegistration-NspKefOI.js → syncWebMcpRegistration-BhbqI6R2.js} +2 -2
  100. package/dist/lib/{syncWebMcpRegistration-NspKefOI.js.map → syncWebMcpRegistration-BhbqI6R2.js.map} +1 -1
  101. package/dist/public/.well-known/mcp/server-card.json +1 -1
  102. package/dist/public/.well-known/mcp.json +1 -1
  103. package/dist/public/AGENTS.md +22 -3
  104. package/dist/public/README.md +96 -278
  105. package/dist/public/agent.worker.js +50 -50
  106. package/dist/public/{base-task-model-CYkpwnvU-DDfHUUIS.js → base-task-model-CYkpwnvU-DrXr4G1R.js} +1 -1
  107. package/dist/public/{configurePeerJs-BhBokQlC.js → configurePeerJs-B470pdeU.js} +1 -1
  108. package/dist/public/docs/README.md +31 -31
  109. package/dist/public/docs/architecture/context-management.md +7 -0
  110. package/dist/public/docs/architecture/storage.md +10 -1
  111. package/dist/public/docs/decisions/bundled-typescript-architecture.md +0 -1
  112. package/dist/public/docs/decisions/native-web-components-and-signals.md +0 -1
  113. package/dist/public/docs/example/article/index.html +1 -1
  114. package/dist/public/docs/guides/publishing-to-github-pages.md +334 -0
  115. package/dist/public/docs/guides/server-development-configuration.md +15 -0
  116. package/dist/public/docs/publishing/index.html +1 -1
  117. package/dist/public/docs/skill-creator/index.html +1 -1
  118. package/dist/public/docs/subsystems/cli.md +10 -2
  119. package/dist/public/docs/subsystems/control-plane.md +9 -8
  120. package/dist/public/docs/subsystems/crypto.md +9 -0
  121. package/dist/public/docs/subsystems/custom-element-security.md +2 -0
  122. package/dist/public/docs/subsystems/mcp-server.md +31 -16
  123. package/dist/public/docs/subsystems/notifications.md +8 -5
  124. package/dist/public/docs/subsystems/providers.md +9 -0
  125. package/dist/public/docs/subsystems/share-target.md +107 -0
  126. package/dist/public/docs/subsystems/webmcp.md +43 -0
  127. package/dist/public/e2e/README.md +4 -2
  128. package/dist/public/{e2e-bridge-DcBoeFvd.js → e2e-bridge-CSW0S5Yz.js} +1 -1
  129. package/dist/public/{file-viewer-CKtVC9Ix.js → file-viewer-Cs-riNvy.js} +1 -1
  130. package/dist/public/{firebase-OSDX3viP.js → firebase-cwAl_ABm.js} +1 -1
  131. package/dist/public/{git-CkhCJonj.js → git-GD09WATp.js} +25 -25
  132. package/dist/public/index.html +1 -1
  133. package/dist/public/index.js +1 -1
  134. package/dist/public/{initControlPlane-Bi8ouFEb.js → initControlPlane-BqCY0NQy.js} +1 -1
  135. package/dist/public/initControlPlane-C-IXaKYX.js +1 -0
  136. package/dist/public/{language-detector-BRKrlra0.js → language-detector-CIeEuQFk.js} +1 -1
  137. package/dist/public/llms.txt +4 -2
  138. package/dist/public/main/index.html +1 -1
  139. package/dist/public/main/memory/index.html +1 -1
  140. package/dist/public/{markdown-C-hCVJtc.js → markdown-Cw7vCtTg.js} +1 -1
  141. package/dist/public/{openai-Bpd71Oja.js → openai-BJIb2c5j.js} +3 -3
  142. package/dist/public/{orchestrator-8qNGfw8r.js → orchestrator-BWkHHO9Y.js} +1 -1
  143. package/dist/public/{orchestrator-BT3Ks5ip.js → orchestrator-DpkkeD6T.js} +1 -1
  144. package/dist/public/{peerjs-DfhwEiiq.js → peerjs-tf2EmWjB.js} +1 -1
  145. package/dist/public/{prompt-api-polyfill-Dl1kbJhR.js → prompt-api-polyfill-CXd75leW.js} +1 -1
  146. package/dist/public/{push-client-BVLrE9pK.js → push-client-CHjSbrWs.js} +1 -1
  147. package/dist/public/{rewriter-j6D9LDER.js → rewriter-BEHn9gll.js} +1 -1
  148. package/dist/public/service-worker.js +1 -1
  149. package/dist/public/{shadow-claw-DCjxNDCX.js → shadow-claw-BBPV_9X8.js} +2 -2
  150. package/dist/public/{shadow-claw-channels-CITDrqMl.js → shadow-claw-channels-BJvrKQjg.js} +1 -1
  151. package/dist/public/{shadow-claw-chat-BQrSgSKF.js → shadow-claw-chat-BG2EaRaw.js} +1 -1
  152. package/dist/public/{shadow-claw-control-plane-Cp001OY0.js → shadow-claw-control-plane-BBa7WbTg.js} +2 -2
  153. package/dist/public/{shadow-claw-conversations-EhX4RvIj.js → shadow-claw-conversations-CFaWFmkm.js} +1 -1
  154. package/dist/public/{shadow-claw-file-viewer-DiQXIjZD.js → shadow-claw-file-viewer-Z-GIKaE9.js} +1 -1
  155. package/dist/public/{shadow-claw-files-lkTnSJsn.js → shadow-claw-files-BBx4iMsk.js} +1 -1
  156. package/dist/public/{shadow-claw-git-BlcA_z8x.js → shadow-claw-git-vTOKatwd.js} +2 -2
  157. package/dist/public/{shadow-claw-llm-CW16X9Rg.js → shadow-claw-llm-Ce1Ax6-x.js} +1 -1
  158. package/dist/public/{shadow-claw-networking-ySsMBY_i.js → shadow-claw-networking-q4XIzdB5.js} +1 -1
  159. package/dist/public/{shadow-claw-notifications-CyV2zCQ8.js → shadow-claw-notifications-D2cz0gmm.js} +1 -1
  160. package/dist/public/{shadow-claw-pages-Cx7cF9ah.js → shadow-claw-pages-3335lmSC.js} +1 -1
  161. package/dist/public/{shadow-claw-settings-zm4PHHGi.js → shadow-claw-settings-4ptYuJwO.js} +2 -2
  162. package/dist/public/{shadow-claw-storage-dy9JAEGd.js → shadow-claw-storage-bIrPKFhF.js} +1 -1
  163. package/dist/public/{shadow-claw-task-server-Bleww48s.js → shadow-claw-task-server-5yqVBxy1.js} +1 -1
  164. package/dist/public/{shadow-claw-tasks-CTI5oaLN.js → shadow-claw-tasks-DcqYHPLZ.js} +1 -1
  165. package/dist/public/{shadow-claw-terminal-mZ3i4HaQ.js → shadow-claw-terminal-fARaDONr.js} +1 -1
  166. package/dist/public/{shadow-claw-tools-B_nuk8Zl.js → shadow-claw-tools-paEAhcJr.js} +1 -1
  167. package/dist/public/{shadow-claw-webvm-Vl_jH5YL.js → shadow-claw-webvm-CbzH_vyX.js} +1 -1
  168. package/dist/public/{summarizer-VJNr-7xG.js → summarizer-BT3AuFed.js} +1 -1
  169. package/dist/public/{syncWebMcpRegistration-n2vAMJ4w.js → syncWebMcpRegistration-CWSYaHex.js} +1 -1
  170. package/dist/public/{transformers-BhQMWQG5.js → transformers-1VTxqKjT.js} +1 -1
  171. package/dist/public/{translator-DEQXb7ZL.js → translator-B50RYlFt.js} +1 -1
  172. package/dist/public/{webllm-CHN5H-Sy.js → webllm-FmyJWWpt.js} +1 -1
  173. package/dist/public/{writer-CD9oN2pq.js → writer-Bhb4YYRE.js} +1 -1
  174. package/dist/server.js +205 -203
  175. package/package.json +1 -1
  176. package/src/components/settings/shadow-claw-llm/shadow-claw-llm.test.ts +2 -0
  177. package/src/core/orchestrator/utils/configurePeerJs.test.ts +2 -0
  178. package/src/server/client-registry.test.ts +9 -0
  179. package/src/server/client-registry.ts +14 -0
  180. package/src/server/mcp/mcp-integration.test.ts +68 -16
  181. package/src/server/mcp/tools/built-in-tools.ts +125 -34
  182. package/src/server/mcp/tools/client-tool-relay.ts +81 -44
  183. package/src/server/mcp/tools/mcp-tools.test.ts +103 -13
  184. package/src/server/mcp/types.ts +3 -0
  185. package/src/server/openapi/paths/push.ts +48 -0
  186. package/src/server/server.ts +30 -0
  187. package/src/subsystems/notifications/push-client.test.ts +17 -0
  188. package/src/subsystems/notifications/push-client.ts +22 -2
  189. package/src/subsystems/notifications/push-routes.test.ts +31 -0
  190. package/src/subsystems/notifications/push-routes.ts +10 -0
  191. package/src/subsystems/notifications/push-store.test.ts +49 -0
  192. package/src/subsystems/notifications/push-store.ts +45 -0
  193. package/src/worker/worker.test.ts +2 -0
  194. package/dist/lib/push-client-D6hbzDNV.js.map +0 -1
@@ -1,9 +1,9 @@
1
1
  import ShadowClawElement from "./components/shadow-claw-element.js";
2
2
  import { n as getDb } from "./txPromise-CuGh-TGK.js";
3
- import { _t as setChannelEnabled, ht as getTelegramConfig, lt as configureIMessage, pt as getIMessageConfig, t as orchestratorStore, ut as configureTelegram } from "./orchestrator-BtVj9bBB.js";
3
+ import { _t as setChannelEnabled, ht as getTelegramConfig, lt as configureIMessage, pt as getIMessageConfig, t as orchestratorStore, ut as configureTelegram } from "./orchestrator-ClXbJ4Mb.js";
4
4
  import { a as showSuccess, r as showError, s as showWarning } from "./toast-DZ6r7_YI.js";
5
5
  import { t as effect } from "./effect-DL6j9HJp.js";
6
- import "./shadow-claw-peerjs-B0ZB7yhB.js";
6
+ import "./shadow-claw-peerjs-BvixjeBz.js";
7
7
 
8
8
  //#region src/components/settings/shadow-claw-channel-config/shadow-claw-channel-config.css
9
9
  const sheet = new CSSStyleSheet();
@@ -464,4 +464,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
464
464
 
465
465
  //#endregion
466
466
  export { ShadowClawChannelConfig as t };
467
- //# sourceMappingURL=shadow-claw-channel-config-BDPKt6Bd.js.map
467
+ //# sourceMappingURL=shadow-claw-channel-config-DEL-aZ7N.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-claw-channel-config-BDPKt6Bd.js","names":["shadowClawChannelConfigStyles","shadowClawChannelConfigTemplate"],"sources":["../../src/components/settings/shadow-claw-channel-config/shadow-claw-channel-config.ts"],"sourcesContent":["import { effect } from \"../../../core/effect.js\";\n\nimport {\n configureIMessage,\n configureTelegram,\n getIMessageConfig,\n getTelegramConfig,\n setChannelEnabled,\n} from \"../../../core/orchestrator/utils/operations/channel.js\";\n\nimport { getDb } from \"../../../db/db.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { showError, showSuccess, showWarning } from \"../../../ui/toast.js\";\n\nimport type { Orchestrator } from \"../../../core/orchestrator/orchestrator.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\nimport \"../shadow-claw-peerjs/shadow-claw-peerjs.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawChannelConfigStyles from \"./shadow-claw-channel-config.css\" with { type: \"css\" };\nimport shadowClawChannelConfigTemplate from \"./shadow-claw-channel-config.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-channel-config\";\n\nexport class ShadowClawChannelConfig extends ShadowClawElement {\n static styles = shadowClawChannelConfigStyles;\n static template = shadowClawChannelConfigTemplate;\n\n db: ShadowClawDatabase | null = null;\n orchestrator: Orchestrator | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n\n this.bindEventListeners();\n this.setupEffects();\n await this.render();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"save-telegram-config\"]')\n ?.addEventListener(\"click\", () => this.saveTelegramConfig());\n\n root\n .querySelector('[data-action=\"save-imessage-config\"]')\n ?.addEventListener(\"click\", () => this.saveIMessageConfig());\n\n root\n .querySelector('[data-action=\"verify-telegram-config\"]')\n ?.addEventListener(\"click\", () => this.verifyTelegramConfig());\n }\n\n getOrchestrator(): Orchestrator | null {\n const current = orchestratorStore.orchestrator;\n if (current) {\n this.orchestrator = current;\n }\n\n return this.orchestrator;\n }\n\n setLoadingState(root: ShadowRoot) {\n const telegramTokenStatus = root.querySelector(\n '[data-info=\"telegram-token-status\"]',\n );\n if (telegramTokenStatus) {\n telegramTokenStatus.textContent = \"Loading Telegram settings...\";\n }\n\n const telegramChatIdsStatus = root.querySelector(\n '[data-info=\"telegram-chat-ids-status\"]',\n );\n if (telegramChatIdsStatus) {\n telegramChatIdsStatus.textContent = \"Loading Telegram settings...\";\n }\n\n const imessageChatIdsStatus = root.querySelector(\n '[data-info=\"imessage-chat-ids-status\"]',\n );\n if (imessageChatIdsStatus) {\n imessageChatIdsStatus.textContent = \"Loading iMessage settings...\";\n }\n }\n\n setupEffects() {\n this.addCleanup(\n effect(() => {\n const ready = orchestratorStore.ready;\n if (!ready) {\n return;\n }\n\n void this.render();\n }),\n );\n }\n\n updateChannelFieldAvailability(\n root: ShadowRoot,\n telegramEnabled: boolean,\n imessageEnabled: boolean,\n ) {\n const telegramTokenInput = root.querySelector(\n '[data-setting=\"telegram-token-input\"]',\n ) as HTMLInputElement | null;\n const telegramChatIdsInput = root.querySelector(\n '[data-setting=\"telegram-chat-ids-input\"]',\n ) as HTMLInputElement | null;\n const telegramUseProxyToggle = root.querySelector(\n '[data-setting=\"telegram-use-proxy-toggle\"]',\n ) as HTMLInputElement | null;\n const verifyTelegramButton = root.querySelector(\n '[data-action=\"verify-telegram-config\"]',\n ) as HTMLButtonElement | null;\n\n if (telegramTokenInput) {\n telegramTokenInput.disabled = !telegramEnabled;\n }\n\n if (telegramChatIdsInput) {\n telegramChatIdsInput.disabled = !telegramEnabled;\n }\n\n if (telegramUseProxyToggle) {\n telegramUseProxyToggle.disabled = !telegramEnabled;\n }\n\n if (verifyTelegramButton) {\n verifyTelegramButton.disabled = !telegramEnabled;\n }\n\n const imessageServerUrlInput = root.querySelector(\n '[data-setting=\"imessage-server-url-input\"]',\n ) as HTMLInputElement | null;\n const imessageApiKeyInput = root.querySelector(\n '[data-setting=\"imessage-api-key-input\"]',\n ) as HTMLInputElement | null;\n const imessageChatIdsInput = root.querySelector(\n '[data-setting=\"imessage-chat-ids-input\"]',\n ) as HTMLInputElement | null;\n\n if (imessageServerUrlInput) {\n imessageServerUrlInput.disabled = !imessageEnabled;\n }\n\n if (imessageApiKeyInput) {\n imessageApiKeyInput.disabled = !imessageEnabled;\n }\n\n if (imessageChatIdsInput) {\n imessageChatIdsInput.disabled = !imessageEnabled;\n }\n\n root\n .querySelectorAll(\".form-group\")\n .forEach((group) => group.classList.remove(\"form-group--disabled\"));\n\n if (!telegramEnabled) {\n root\n .querySelector('[data-setting=\"telegram-token-input\"]')\n ?.closest(\".form-group\")\n ?.classList.add(\"form-group--disabled\");\n }\n\n if (!imessageEnabled) {\n root\n .querySelector('[data-setting=\"imessage-server-url-input\"]')\n ?.closest(\".form-group\")\n ?.classList.add(\"form-group--disabled\");\n }\n }\n\n async render() {\n const orchestrator = this.getOrchestrator();\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n if (!orchestrator) {\n this.setLoadingState(root);\n\n return;\n }\n\n const telegram = getTelegramConfig(orchestrator);\n const imessage = getIMessageConfig(orchestrator);\n\n const telegramTokenInput = root.querySelector(\n '[data-setting=\"telegram-token-input\"]',\n ) as HTMLInputElement | null;\n const telegramChatIdsInput = root.querySelector(\n '[data-setting=\"telegram-chat-ids-input\"]',\n ) as HTMLInputElement | null;\n const telegramUseProxyToggle = root.querySelector(\n '[data-setting=\"telegram-use-proxy-toggle\"]',\n ) as HTMLInputElement | null;\n const telegramEnabledToggle = root.querySelector(\n '[data-setting=\"telegram-enabled-toggle\"]',\n ) as HTMLInputElement | null;\n const imessageServerUrlInput = root.querySelector(\n '[data-setting=\"imessage-server-url-input\"]',\n ) as HTMLInputElement | null;\n const imessageApiKeyInput = root.querySelector(\n '[data-setting=\"imessage-api-key-input\"]',\n ) as HTMLInputElement | null;\n const imessageChatIdsInput = root.querySelector(\n '[data-setting=\"imessage-chat-ids-input\"]',\n ) as HTMLInputElement | null;\n const imessageEnabledToggle = root.querySelector(\n '[data-setting=\"imessage-enabled-toggle\"]',\n ) as HTMLInputElement | null;\n\n if (telegramEnabledToggle) {\n telegramEnabledToggle.checked = telegram.enabled;\n }\n\n const telegramChannelStatus = root.querySelector(\n '[data-info=\"telegram-channel-status\"]',\n );\n if (telegramChannelStatus) {\n telegramChannelStatus.textContent = telegram.enabled\n ? \"Telegram channel is enabled.\"\n : \"Telegram channel is disabled. Saved settings are retained.\";\n }\n\n if (telegramTokenInput) {\n telegramTokenInput.value = telegram.botToken;\n }\n\n const telegramTokenStatus = root.querySelector(\n '[data-info=\"telegram-token-status\"]',\n );\n if (telegramTokenStatus) {\n telegramTokenStatus.textContent = telegram.botToken\n ? \"Telegram token saved.\"\n : \"No Telegram token saved.\";\n }\n\n if (telegramChatIdsInput) {\n telegramChatIdsInput.value = telegram.chatIds.join(\", \");\n }\n\n const telegramChatIdsStatus = root.querySelector(\n '[data-info=\"telegram-chat-ids-status\"]',\n );\n if (telegramChatIdsStatus) {\n telegramChatIdsStatus.textContent = telegram.chatIds.length\n ? `Allowed Telegram chat IDs saved: ${telegram.chatIds.join(\", \")}`\n : \"No Telegram chat IDs saved.\";\n }\n\n if (telegramUseProxyToggle) {\n telegramUseProxyToggle.checked = !!telegram.useProxy;\n }\n\n const telegramProxyStatus = root.querySelector(\n '[data-info=\"telegram-proxy-status\"]',\n );\n if (telegramProxyStatus) {\n telegramProxyStatus.textContent = telegram.useProxy\n ? \"Telegram API calls are proxied through this server.\"\n : \"Telegram API calls go directly to Telegram.\";\n }\n\n if (imessageServerUrlInput) {\n imessageServerUrlInput.value = imessage.serverUrl;\n }\n\n if (imessageApiKeyInput) {\n imessageApiKeyInput.value = imessage.apiKey;\n }\n\n if (imessageChatIdsInput) {\n imessageChatIdsInput.value = imessage.chatIds.join(\", \");\n }\n\n if (imessageEnabledToggle) {\n imessageEnabledToggle.checked = imessage.enabled;\n }\n\n const imessageChannelStatus = root.querySelector(\n '[data-info=\"imessage-channel-status\"]',\n );\n if (imessageChannelStatus) {\n imessageChannelStatus.textContent = imessage.enabled\n ? \"iMessage channel is enabled.\"\n : \"iMessage channel is disabled. Saved settings are retained.\";\n }\n\n const imessageChatIdsStatus = root.querySelector(\n '[data-info=\"imessage-chat-ids-status\"]',\n );\n if (imessageChatIdsStatus) {\n imessageChatIdsStatus.textContent = imessage.chatIds.length\n ? `Allowed iMessage chat IDs saved: ${imessage.chatIds.join(\", \")}`\n : \"No iMessage chat IDs saved.\";\n }\n\n this.updateChannelFieldAvailability(\n root,\n telegram.enabled,\n imessage.enabled,\n );\n }\n\n async saveIMessageConfig() {\n const orchestrator = this.getOrchestrator();\n if (!orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const serverUrlInput = root.querySelector(\n '[data-setting=\"imessage-server-url-input\"]',\n ) as HTMLInputElement | null;\n const apiKeyInput = root.querySelector(\n '[data-setting=\"imessage-api-key-input\"]',\n ) as HTMLInputElement | null;\n const chatIdsInput = root.querySelector(\n '[data-setting=\"imessage-chat-ids-input\"]',\n ) as HTMLInputElement | null;\n const enabledToggle = root.querySelector(\n '[data-setting=\"imessage-enabled-toggle\"]',\n ) as HTMLInputElement | null;\n\n try {\n await configureIMessage(\n orchestrator,\n this.db,\n serverUrlInput?.value || \"\",\n apiKeyInput?.value || \"\",\n parseCommaSeparatedList(chatIdsInput?.value || \"\"),\n );\n await setChannelEnabled(\n orchestrator,\n this.db,\n \"imessage\",\n !!enabledToggle?.checked,\n );\n await this.render();\n showSuccess(\"iMessage channel settings saved\", 3000);\n } catch (error) {\n showError(\n `Error saving iMessage settings: ${error instanceof Error ? error.message : String(error)}`,\n 6000,\n );\n }\n }\n\n async saveTelegramConfig() {\n const orchestrator = this.getOrchestrator();\n if (!orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const tokenInput = root.querySelector(\n '[data-setting=\"telegram-token-input\"]',\n ) as HTMLInputElement | null;\n const chatIdsInput = root.querySelector(\n '[data-setting=\"telegram-chat-ids-input\"]',\n ) as HTMLInputElement | null;\n const useProxyToggle = root.querySelector(\n '[data-setting=\"telegram-use-proxy-toggle\"]',\n ) as HTMLInputElement | null;\n const enabledToggle = root.querySelector(\n '[data-setting=\"telegram-enabled-toggle\"]',\n ) as HTMLInputElement | null;\n\n try {\n await configureTelegram(\n orchestrator,\n this.db,\n tokenInput?.value || \"\",\n parseCommaSeparatedList(chatIdsInput?.value || \"\"),\n !!useProxyToggle?.checked,\n );\n await setChannelEnabled(\n orchestrator,\n this.db,\n \"telegram\",\n !!enabledToggle?.checked,\n );\n await this.render();\n showSuccess(\"Telegram channel settings saved\", 3000);\n } catch (error) {\n showError(\n `Error saving Telegram settings: ${error instanceof Error ? error.message : String(error)}`,\n 6000,\n );\n }\n }\n\n async verifyTelegramConfig() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const tokenInput = root.querySelector(\n '[data-setting=\"telegram-token-input\"]',\n ) as HTMLInputElement | null;\n const token = tokenInput?.value?.trim() || \"\";\n const telegramUseProxyToggle = root.querySelector(\n '[data-setting=\"telegram-use-proxy-toggle\"]',\n ) as HTMLInputElement | null;\n const apiBase = telegramUseProxyToggle?.checked\n ? \"/telegram/bot\"\n : \"https://api.telegram.org/bot\";\n\n if (!token) {\n showError(\"Telegram bot token is empty. Save the token first.\", 5000);\n\n return;\n }\n\n try {\n const meRes = await fetch(`${apiBase}${token}/getMe`);\n const meJson = (await meRes.json()) as {\n ok?: boolean;\n description?: string;\n result?: { username?: string };\n };\n\n if (!meRes.ok || !meJson.ok) {\n throw new Error(meJson.description || `HTTP ${meRes.status}`);\n }\n\n const webhookRes = await fetch(`${apiBase}${token}/getWebhookInfo`);\n const webhookJson = (await webhookRes.json()) as {\n ok?: boolean;\n description?: string;\n result?: { url?: string };\n };\n\n if (!webhookRes.ok || !webhookJson.ok) {\n throw new Error(webhookJson.description || `HTTP ${webhookRes.status}`);\n }\n\n const webhookUrl = webhookJson.result?.url?.trim() || \"\";\n if (webhookUrl) {\n showWarning(\n `Telegram bot is valid (${meJson.result?.username || \"unknown\"}), but a webhook is enabled. Clear it with deleteWebhook before relying on getUpdates polling.`,\n 7000,\n );\n\n return;\n }\n\n showSuccess(\n `Telegram setup looks good for @${meJson.result?.username || \"unknown\"}. Token works and no webhook is active.`,\n 5000,\n );\n } catch (error) {\n showError(\n `Telegram verification failed: ${error instanceof Error ? error.message : String(error)}`,\n 7000,\n );\n }\n }\n}\n\nfunction parseCommaSeparatedList(value: string): string[] {\n return Array.from(\n new Set(\n value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean),\n ),\n );\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawChannelConfig);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shadow-claw-channel-config-DEL-aZ7N.js","names":["shadowClawChannelConfigStyles","shadowClawChannelConfigTemplate"],"sources":["../../src/components/settings/shadow-claw-channel-config/shadow-claw-channel-config.ts"],"sourcesContent":["import { effect } from \"../../../core/effect.js\";\n\nimport {\n configureIMessage,\n configureTelegram,\n getIMessageConfig,\n getTelegramConfig,\n setChannelEnabled,\n} from \"../../../core/orchestrator/utils/operations/channel.js\";\n\nimport { getDb } from \"../../../db/db.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { showError, showSuccess, showWarning } from \"../../../ui/toast.js\";\n\nimport type { Orchestrator } from \"../../../core/orchestrator/orchestrator.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\nimport \"../shadow-claw-peerjs/shadow-claw-peerjs.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawChannelConfigStyles from \"./shadow-claw-channel-config.css\" with { type: \"css\" };\nimport shadowClawChannelConfigTemplate from \"./shadow-claw-channel-config.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-channel-config\";\n\nexport class ShadowClawChannelConfig extends ShadowClawElement {\n static styles = shadowClawChannelConfigStyles;\n static template = shadowClawChannelConfigTemplate;\n\n db: ShadowClawDatabase | null = null;\n orchestrator: Orchestrator | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n\n this.bindEventListeners();\n this.setupEffects();\n await this.render();\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"save-telegram-config\"]')\n ?.addEventListener(\"click\", () => this.saveTelegramConfig());\n\n root\n .querySelector('[data-action=\"save-imessage-config\"]')\n ?.addEventListener(\"click\", () => this.saveIMessageConfig());\n\n root\n .querySelector('[data-action=\"verify-telegram-config\"]')\n ?.addEventListener(\"click\", () => this.verifyTelegramConfig());\n }\n\n getOrchestrator(): Orchestrator | null {\n const current = orchestratorStore.orchestrator;\n if (current) {\n this.orchestrator = current;\n }\n\n return this.orchestrator;\n }\n\n setLoadingState(root: ShadowRoot) {\n const telegramTokenStatus = root.querySelector(\n '[data-info=\"telegram-token-status\"]',\n );\n if (telegramTokenStatus) {\n telegramTokenStatus.textContent = \"Loading Telegram settings...\";\n }\n\n const telegramChatIdsStatus = root.querySelector(\n '[data-info=\"telegram-chat-ids-status\"]',\n );\n if (telegramChatIdsStatus) {\n telegramChatIdsStatus.textContent = \"Loading Telegram settings...\";\n }\n\n const imessageChatIdsStatus = root.querySelector(\n '[data-info=\"imessage-chat-ids-status\"]',\n );\n if (imessageChatIdsStatus) {\n imessageChatIdsStatus.textContent = \"Loading iMessage settings...\";\n }\n }\n\n setupEffects() {\n this.addCleanup(\n effect(() => {\n const ready = orchestratorStore.ready;\n if (!ready) {\n return;\n }\n\n void this.render();\n }),\n );\n }\n\n updateChannelFieldAvailability(\n root: ShadowRoot,\n telegramEnabled: boolean,\n imessageEnabled: boolean,\n ) {\n const telegramTokenInput = root.querySelector(\n '[data-setting=\"telegram-token-input\"]',\n ) as HTMLInputElement | null;\n const telegramChatIdsInput = root.querySelector(\n '[data-setting=\"telegram-chat-ids-input\"]',\n ) as HTMLInputElement | null;\n const telegramUseProxyToggle = root.querySelector(\n '[data-setting=\"telegram-use-proxy-toggle\"]',\n ) as HTMLInputElement | null;\n const verifyTelegramButton = root.querySelector(\n '[data-action=\"verify-telegram-config\"]',\n ) as HTMLButtonElement | null;\n\n if (telegramTokenInput) {\n telegramTokenInput.disabled = !telegramEnabled;\n }\n\n if (telegramChatIdsInput) {\n telegramChatIdsInput.disabled = !telegramEnabled;\n }\n\n if (telegramUseProxyToggle) {\n telegramUseProxyToggle.disabled = !telegramEnabled;\n }\n\n if (verifyTelegramButton) {\n verifyTelegramButton.disabled = !telegramEnabled;\n }\n\n const imessageServerUrlInput = root.querySelector(\n '[data-setting=\"imessage-server-url-input\"]',\n ) as HTMLInputElement | null;\n const imessageApiKeyInput = root.querySelector(\n '[data-setting=\"imessage-api-key-input\"]',\n ) as HTMLInputElement | null;\n const imessageChatIdsInput = root.querySelector(\n '[data-setting=\"imessage-chat-ids-input\"]',\n ) as HTMLInputElement | null;\n\n if (imessageServerUrlInput) {\n imessageServerUrlInput.disabled = !imessageEnabled;\n }\n\n if (imessageApiKeyInput) {\n imessageApiKeyInput.disabled = !imessageEnabled;\n }\n\n if (imessageChatIdsInput) {\n imessageChatIdsInput.disabled = !imessageEnabled;\n }\n\n root\n .querySelectorAll(\".form-group\")\n .forEach((group) => group.classList.remove(\"form-group--disabled\"));\n\n if (!telegramEnabled) {\n root\n .querySelector('[data-setting=\"telegram-token-input\"]')\n ?.closest(\".form-group\")\n ?.classList.add(\"form-group--disabled\");\n }\n\n if (!imessageEnabled) {\n root\n .querySelector('[data-setting=\"imessage-server-url-input\"]')\n ?.closest(\".form-group\")\n ?.classList.add(\"form-group--disabled\");\n }\n }\n\n async render() {\n const orchestrator = this.getOrchestrator();\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n if (!orchestrator) {\n this.setLoadingState(root);\n\n return;\n }\n\n const telegram = getTelegramConfig(orchestrator);\n const imessage = getIMessageConfig(orchestrator);\n\n const telegramTokenInput = root.querySelector(\n '[data-setting=\"telegram-token-input\"]',\n ) as HTMLInputElement | null;\n const telegramChatIdsInput = root.querySelector(\n '[data-setting=\"telegram-chat-ids-input\"]',\n ) as HTMLInputElement | null;\n const telegramUseProxyToggle = root.querySelector(\n '[data-setting=\"telegram-use-proxy-toggle\"]',\n ) as HTMLInputElement | null;\n const telegramEnabledToggle = root.querySelector(\n '[data-setting=\"telegram-enabled-toggle\"]',\n ) as HTMLInputElement | null;\n const imessageServerUrlInput = root.querySelector(\n '[data-setting=\"imessage-server-url-input\"]',\n ) as HTMLInputElement | null;\n const imessageApiKeyInput = root.querySelector(\n '[data-setting=\"imessage-api-key-input\"]',\n ) as HTMLInputElement | null;\n const imessageChatIdsInput = root.querySelector(\n '[data-setting=\"imessage-chat-ids-input\"]',\n ) as HTMLInputElement | null;\n const imessageEnabledToggle = root.querySelector(\n '[data-setting=\"imessage-enabled-toggle\"]',\n ) as HTMLInputElement | null;\n\n if (telegramEnabledToggle) {\n telegramEnabledToggle.checked = telegram.enabled;\n }\n\n const telegramChannelStatus = root.querySelector(\n '[data-info=\"telegram-channel-status\"]',\n );\n if (telegramChannelStatus) {\n telegramChannelStatus.textContent = telegram.enabled\n ? \"Telegram channel is enabled.\"\n : \"Telegram channel is disabled. Saved settings are retained.\";\n }\n\n if (telegramTokenInput) {\n telegramTokenInput.value = telegram.botToken;\n }\n\n const telegramTokenStatus = root.querySelector(\n '[data-info=\"telegram-token-status\"]',\n );\n if (telegramTokenStatus) {\n telegramTokenStatus.textContent = telegram.botToken\n ? \"Telegram token saved.\"\n : \"No Telegram token saved.\";\n }\n\n if (telegramChatIdsInput) {\n telegramChatIdsInput.value = telegram.chatIds.join(\", \");\n }\n\n const telegramChatIdsStatus = root.querySelector(\n '[data-info=\"telegram-chat-ids-status\"]',\n );\n if (telegramChatIdsStatus) {\n telegramChatIdsStatus.textContent = telegram.chatIds.length\n ? `Allowed Telegram chat IDs saved: ${telegram.chatIds.join(\", \")}`\n : \"No Telegram chat IDs saved.\";\n }\n\n if (telegramUseProxyToggle) {\n telegramUseProxyToggle.checked = !!telegram.useProxy;\n }\n\n const telegramProxyStatus = root.querySelector(\n '[data-info=\"telegram-proxy-status\"]',\n );\n if (telegramProxyStatus) {\n telegramProxyStatus.textContent = telegram.useProxy\n ? \"Telegram API calls are proxied through this server.\"\n : \"Telegram API calls go directly to Telegram.\";\n }\n\n if (imessageServerUrlInput) {\n imessageServerUrlInput.value = imessage.serverUrl;\n }\n\n if (imessageApiKeyInput) {\n imessageApiKeyInput.value = imessage.apiKey;\n }\n\n if (imessageChatIdsInput) {\n imessageChatIdsInput.value = imessage.chatIds.join(\", \");\n }\n\n if (imessageEnabledToggle) {\n imessageEnabledToggle.checked = imessage.enabled;\n }\n\n const imessageChannelStatus = root.querySelector(\n '[data-info=\"imessage-channel-status\"]',\n );\n if (imessageChannelStatus) {\n imessageChannelStatus.textContent = imessage.enabled\n ? \"iMessage channel is enabled.\"\n : \"iMessage channel is disabled. Saved settings are retained.\";\n }\n\n const imessageChatIdsStatus = root.querySelector(\n '[data-info=\"imessage-chat-ids-status\"]',\n );\n if (imessageChatIdsStatus) {\n imessageChatIdsStatus.textContent = imessage.chatIds.length\n ? `Allowed iMessage chat IDs saved: ${imessage.chatIds.join(\", \")}`\n : \"No iMessage chat IDs saved.\";\n }\n\n this.updateChannelFieldAvailability(\n root,\n telegram.enabled,\n imessage.enabled,\n );\n }\n\n async saveIMessageConfig() {\n const orchestrator = this.getOrchestrator();\n if (!orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const serverUrlInput = root.querySelector(\n '[data-setting=\"imessage-server-url-input\"]',\n ) as HTMLInputElement | null;\n const apiKeyInput = root.querySelector(\n '[data-setting=\"imessage-api-key-input\"]',\n ) as HTMLInputElement | null;\n const chatIdsInput = root.querySelector(\n '[data-setting=\"imessage-chat-ids-input\"]',\n ) as HTMLInputElement | null;\n const enabledToggle = root.querySelector(\n '[data-setting=\"imessage-enabled-toggle\"]',\n ) as HTMLInputElement | null;\n\n try {\n await configureIMessage(\n orchestrator,\n this.db,\n serverUrlInput?.value || \"\",\n apiKeyInput?.value || \"\",\n parseCommaSeparatedList(chatIdsInput?.value || \"\"),\n );\n await setChannelEnabled(\n orchestrator,\n this.db,\n \"imessage\",\n !!enabledToggle?.checked,\n );\n await this.render();\n showSuccess(\"iMessage channel settings saved\", 3000);\n } catch (error) {\n showError(\n `Error saving iMessage settings: ${error instanceof Error ? error.message : String(error)}`,\n 6000,\n );\n }\n }\n\n async saveTelegramConfig() {\n const orchestrator = this.getOrchestrator();\n if (!orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const tokenInput = root.querySelector(\n '[data-setting=\"telegram-token-input\"]',\n ) as HTMLInputElement | null;\n const chatIdsInput = root.querySelector(\n '[data-setting=\"telegram-chat-ids-input\"]',\n ) as HTMLInputElement | null;\n const useProxyToggle = root.querySelector(\n '[data-setting=\"telegram-use-proxy-toggle\"]',\n ) as HTMLInputElement | null;\n const enabledToggle = root.querySelector(\n '[data-setting=\"telegram-enabled-toggle\"]',\n ) as HTMLInputElement | null;\n\n try {\n await configureTelegram(\n orchestrator,\n this.db,\n tokenInput?.value || \"\",\n parseCommaSeparatedList(chatIdsInput?.value || \"\"),\n !!useProxyToggle?.checked,\n );\n await setChannelEnabled(\n orchestrator,\n this.db,\n \"telegram\",\n !!enabledToggle?.checked,\n );\n await this.render();\n showSuccess(\"Telegram channel settings saved\", 3000);\n } catch (error) {\n showError(\n `Error saving Telegram settings: ${error instanceof Error ? error.message : String(error)}`,\n 6000,\n );\n }\n }\n\n async verifyTelegramConfig() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const tokenInput = root.querySelector(\n '[data-setting=\"telegram-token-input\"]',\n ) as HTMLInputElement | null;\n const token = tokenInput?.value?.trim() || \"\";\n const telegramUseProxyToggle = root.querySelector(\n '[data-setting=\"telegram-use-proxy-toggle\"]',\n ) as HTMLInputElement | null;\n const apiBase = telegramUseProxyToggle?.checked\n ? \"/telegram/bot\"\n : \"https://api.telegram.org/bot\";\n\n if (!token) {\n showError(\"Telegram bot token is empty. Save the token first.\", 5000);\n\n return;\n }\n\n try {\n const meRes = await fetch(`${apiBase}${token}/getMe`);\n const meJson = (await meRes.json()) as {\n ok?: boolean;\n description?: string;\n result?: { username?: string };\n };\n\n if (!meRes.ok || !meJson.ok) {\n throw new Error(meJson.description || `HTTP ${meRes.status}`);\n }\n\n const webhookRes = await fetch(`${apiBase}${token}/getWebhookInfo`);\n const webhookJson = (await webhookRes.json()) as {\n ok?: boolean;\n description?: string;\n result?: { url?: string };\n };\n\n if (!webhookRes.ok || !webhookJson.ok) {\n throw new Error(webhookJson.description || `HTTP ${webhookRes.status}`);\n }\n\n const webhookUrl = webhookJson.result?.url?.trim() || \"\";\n if (webhookUrl) {\n showWarning(\n `Telegram bot is valid (${meJson.result?.username || \"unknown\"}), but a webhook is enabled. Clear it with deleteWebhook before relying on getUpdates polling.`,\n 7000,\n );\n\n return;\n }\n\n showSuccess(\n `Telegram setup looks good for @${meJson.result?.username || \"unknown\"}. Token works and no webhook is active.`,\n 5000,\n );\n } catch (error) {\n showError(\n `Telegram verification failed: ${error instanceof Error ? error.message : String(error)}`,\n 7000,\n );\n }\n }\n}\n\nfunction parseCommaSeparatedList(value: string): string[] {\n return Array.from(\n new Set(\n value\n .split(\",\")\n .map((entry) => entry.trim())\n .filter(Boolean),\n ),\n );\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawChannelConfig);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAuBA,MAAM,cAAc;AAEpB,IAAa,0BAAb,cAA6C,kBAAkB;CAC7D,OAAO,SAASA;CAChB,OAAO,WAAWC;CAElB,KAAgC;CAChC,eAAoC;CAEpC,cAAc;EACZ,MAAM;CACR;CAEA,MAAM,oBAAoB;EAExB,IAAI,CADS,KAAK,YAEhB,MAAM,IAAI,MAAM,sBAAsB;EAGxC,KAAK,KAAK,MAAM,MAAM;EACtB,KAAK,eAAe,kBAAkB;EAEtC,KAAK,mBAAmB;EACxB,KAAK,aAAa;EAClB,MAAM,KAAK,OAAO;CACpB;CAEA,uBAAuB;EACrB,MAAM,qBAAqB;CAC7B;CAEA,qBAAqB;EACnB,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,KACG,cAAc,wCAAsC,CAAC,EACpD,iBAAiB,eAAe,KAAK,mBAAmB,CAAC;EAE7D,KACG,cAAc,wCAAsC,CAAC,EACpD,iBAAiB,eAAe,KAAK,mBAAmB,CAAC;EAE7D,KACG,cAAc,0CAAwC,CAAC,EACtD,iBAAiB,eAAe,KAAK,qBAAqB,CAAC;CACjE;CAEA,kBAAuC;EACrC,MAAM,UAAU,kBAAkB;EAClC,IAAI,SACF,KAAK,eAAe;EAGtB,OAAO,KAAK;CACd;CAEA,gBAAgB,MAAkB;EAChC,MAAM,sBAAsB,KAAK,cAC/B,uCACF;EACA,IAAI,qBACF,oBAAoB,cAAc;EAGpC,MAAM,wBAAwB,KAAK,cACjC,0CACF;EACA,IAAI,uBACF,sBAAsB,cAAc;EAGtC,MAAM,wBAAwB,KAAK,cACjC,0CACF;EACA,IAAI,uBACF,sBAAsB,cAAc;CAExC;CAEA,eAAe;EACb,KAAK,WACH,aAAa;GAEX,IAAI,CADU,kBAAkB,OAE9B;GAGF,AAAK,KAAK,OAAO;EACnB,CAAC,CACH;CACF;CAEA,+BACE,MACA,iBACA,iBACA;EACA,MAAM,qBAAqB,KAAK,cAC9B,yCACF;EACA,MAAM,uBAAuB,KAAK,cAChC,4CACF;EACA,MAAM,yBAAyB,KAAK,cAClC,8CACF;EACA,MAAM,uBAAuB,KAAK,cAChC,0CACF;EAEA,IAAI,oBACF,mBAAmB,WAAW,CAAC;EAGjC,IAAI,sBACF,qBAAqB,WAAW,CAAC;EAGnC,IAAI,wBACF,uBAAuB,WAAW,CAAC;EAGrC,IAAI,sBACF,qBAAqB,WAAW,CAAC;EAGnC,MAAM,yBAAyB,KAAK,cAClC,8CACF;EACA,MAAM,sBAAsB,KAAK,cAC/B,2CACF;EACA,MAAM,uBAAuB,KAAK,cAChC,4CACF;EAEA,IAAI,wBACF,uBAAuB,WAAW,CAAC;EAGrC,IAAI,qBACF,oBAAoB,WAAW,CAAC;EAGlC,IAAI,sBACF,qBAAqB,WAAW,CAAC;EAGnC,KACG,iBAAiB,aAAa,CAAC,CAC/B,SAAS,UAAU,MAAM,UAAU,OAAO,sBAAsB,CAAC;EAEpE,IAAI,CAAC,iBACH,KACG,cAAc,yCAAuC,CAAC,EACrD,QAAQ,aAAa,CAAC,EACtB,UAAU,IAAI,sBAAsB;EAG1C,IAAI,CAAC,iBACH,KACG,cAAc,8CAA4C,CAAC,EAC1D,QAAQ,aAAa,CAAC,EACtB,UAAU,IAAI,sBAAsB;CAE5C;CAEA,MAAM,SAAS;EACb,MAAM,eAAe,KAAK,gBAAgB;EAC1C,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,IAAI,CAAC,cAAc;GACjB,KAAK,gBAAgB,IAAI;GAEzB;EACF;EAEA,MAAM,WAAW,kBAAkB,YAAY;EAC/C,MAAM,WAAW,kBAAkB,YAAY;EAE/C,MAAM,qBAAqB,KAAK,cAC9B,yCACF;EACA,MAAM,uBAAuB,KAAK,cAChC,4CACF;EACA,MAAM,yBAAyB,KAAK,cAClC,8CACF;EACA,MAAM,wBAAwB,KAAK,cACjC,4CACF;EACA,MAAM,yBAAyB,KAAK,cAClC,8CACF;EACA,MAAM,sBAAsB,KAAK,cAC/B,2CACF;EACA,MAAM,uBAAuB,KAAK,cAChC,4CACF;EACA,MAAM,wBAAwB,KAAK,cACjC,4CACF;EAEA,IAAI,uBACF,sBAAsB,UAAU,SAAS;EAG3C,MAAM,wBAAwB,KAAK,cACjC,yCACF;EACA,IAAI,uBACF,sBAAsB,cAAc,SAAS,UACzC,iCACA;EAGN,IAAI,oBACF,mBAAmB,QAAQ,SAAS;EAGtC,MAAM,sBAAsB,KAAK,cAC/B,uCACF;EACA,IAAI,qBACF,oBAAoB,cAAc,SAAS,WACvC,0BACA;EAGN,IAAI,sBACF,qBAAqB,QAAQ,SAAS,QAAQ,KAAK,IAAI;EAGzD,MAAM,wBAAwB,KAAK,cACjC,0CACF;EACA,IAAI,uBACF,sBAAsB,cAAc,SAAS,QAAQ,SACjD,oCAAoC,SAAS,QAAQ,KAAK,IAAI,MAC9D;EAGN,IAAI,wBACF,uBAAuB,UAAU,CAAC,CAAC,SAAS;EAG9C,MAAM,sBAAsB,KAAK,cAC/B,uCACF;EACA,IAAI,qBACF,oBAAoB,cAAc,SAAS,WACvC,wDACA;EAGN,IAAI,wBACF,uBAAuB,QAAQ,SAAS;EAG1C,IAAI,qBACF,oBAAoB,QAAQ,SAAS;EAGvC,IAAI,sBACF,qBAAqB,QAAQ,SAAS,QAAQ,KAAK,IAAI;EAGzD,IAAI,uBACF,sBAAsB,UAAU,SAAS;EAG3C,MAAM,wBAAwB,KAAK,cACjC,yCACF;EACA,IAAI,uBACF,sBAAsB,cAAc,SAAS,UACzC,iCACA;EAGN,MAAM,wBAAwB,KAAK,cACjC,0CACF;EACA,IAAI,uBACF,sBAAsB,cAAc,SAAS,QAAQ,SACjD,oCAAoC,SAAS,QAAQ,KAAK,IAAI,MAC9D;EAGN,KAAK,+BACH,MACA,SAAS,SACT,SAAS,OACX;CACF;CAEA,MAAM,qBAAqB;EACzB,MAAM,eAAe,KAAK,gBAAgB;EAC1C,IAAI,CAAC,gBAAgB,CAAC,KAAK,IACzB;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,iBAAiB,KAAK,cAC1B,8CACF;EACA,MAAM,cAAc,KAAK,cACvB,2CACF;EACA,MAAM,eAAe,KAAK,cACxB,4CACF;EACA,MAAM,gBAAgB,KAAK,cACzB,4CACF;EAEA,IAAI;GACF,MAAM,kBACJ,cACA,KAAK,IACL,gBAAgB,SAAS,IACzB,aAAa,SAAS,IACtB,wBAAwB,cAAc,SAAS,EAAE,CACnD;GACA,MAAM,kBACJ,cACA,KAAK,IACL,YACA,CAAC,CAAC,eAAe,OACnB;GACA,MAAM,KAAK,OAAO;GAClB,YAAY,mCAAmC,GAAI;EACrD,SAAS,OAAO;GACd,UACE,mCAAmC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,KACxF,GACF;EACF;CACF;CAEA,MAAM,qBAAqB;EACzB,MAAM,eAAe,KAAK,gBAAgB;EAC1C,IAAI,CAAC,gBAAgB,CAAC,KAAK,IACzB;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,aAAa,KAAK,cACtB,yCACF;EACA,MAAM,eAAe,KAAK,cACxB,4CACF;EACA,MAAM,iBAAiB,KAAK,cAC1B,8CACF;EACA,MAAM,gBAAgB,KAAK,cACzB,4CACF;EAEA,IAAI;GACF,MAAM,kBACJ,cACA,KAAK,IACL,YAAY,SAAS,IACrB,wBAAwB,cAAc,SAAS,EAAE,GACjD,CAAC,CAAC,gBAAgB,OACpB;GACA,MAAM,kBACJ,cACA,KAAK,IACL,YACA,CAAC,CAAC,eAAe,OACnB;GACA,MAAM,KAAK,OAAO;GAClB,YAAY,mCAAmC,GAAI;EACrD,SAAS,OAAO;GACd,UACE,mCAAmC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,KACxF,GACF;EACF;CACF;CAEA,MAAM,uBAAuB;EAC3B,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAMF,MAAM,QAHa,KAAK,cACtB,yCAEqB,CAAC,EAAE,OAAO,KAAK,KAAK;EAI3C,MAAM,UAHyB,KAAK,cAClC,8CAEmC,CAAC,EAAE,UACpC,kBACA;EAEJ,IAAI,CAAC,OAAO;GACV,UAAU,sDAAsD,GAAI;GAEpE;EACF;EAEA,IAAI;GACF,MAAM,QAAQ,MAAM,MAAM,GAAG,UAAU,MAAM,OAAO;GACpD,MAAM,SAAU,MAAM,MAAM,KAAK;GAMjC,IAAI,CAAC,MAAM,MAAM,CAAC,OAAO,IACvB,MAAM,IAAI,MAAM,OAAO,eAAe,QAAQ,MAAM,QAAQ;GAG9D,MAAM,aAAa,MAAM,MAAM,GAAG,UAAU,MAAM,gBAAgB;GAClE,MAAM,cAAe,MAAM,WAAW,KAAK;GAM3C,IAAI,CAAC,WAAW,MAAM,CAAC,YAAY,IACjC,MAAM,IAAI,MAAM,YAAY,eAAe,QAAQ,WAAW,QAAQ;GAIxE,IADmB,YAAY,QAAQ,KAAK,KAAK,KAAK,IACtC;IACd,YACE,0BAA0B,OAAO,QAAQ,YAAY,UAAU,iGAC/D,GACF;IAEA;GACF;GAEA,YACE,kCAAkC,OAAO,QAAQ,YAAY,UAAU,0CACvE,GACF;EACF,SAAS,OAAO;GACd,UACE,iCAAiC,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,KACtF,GACF;EACF;CACF;AACF;AAEA,SAAS,wBAAwB,OAAyB;CACxD,OAAO,MAAM,KACX,IAAI,IACF,MACG,MAAM,GAAG,CAAC,CACV,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,CAC5B,OAAO,OAAO,CACnB,CACF;AACF;AAEA,IAAI,CAAC,eAAe,IAAI,WAAW,GACjC,eAAe,OAAO,aAAa,uBAAuB"}
@@ -1,7 +1,7 @@
1
1
  import ShadowClawElement from "./components/shadow-claw-element.js";
2
2
  import "./shadow-claw-page-header-action-button-BXXm5b5N.js";
3
3
  import "./shadow-claw-page-header-Cti2fzf-.js";
4
- import "./shadow-claw-channel-config-BDPKt6Bd.js";
4
+ import "./shadow-claw-channel-config-DEL-aZ7N.js";
5
5
 
6
6
  //#region src/components/shadow-claw-channels/shadow-claw-channels.css
7
7
  const sheet = new CSSStyleSheet();
@@ -110,4 +110,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
110
110
 
111
111
  //#endregion
112
112
  export { ShadowClawChannels as t };
113
- //# sourceMappingURL=shadow-claw-channels-BsP5JABM.js.map
113
+ //# sourceMappingURL=shadow-claw-channels-BgaJiPdE.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-claw-channels-BsP5JABM.js","names":["shadowClawChannelsStyles","shadowClawChannelsTemplate"],"sources":["../../src/components/shadow-claw-channels/shadow-claw-channels.ts"],"sourcesContent":["import \"../common/shadow-claw-page-header-action-button/shadow-claw-page-header-action-button.js\";\nimport \"../settings/shadow-claw-channel-config/shadow-claw-channel-config.js\";\nimport \"../shadow-claw-page-header/shadow-claw-page-header.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawChannelsStyles from \"./shadow-claw-channels.css\" with { type: \"css\" };\nimport shadowClawChannelsTemplate from \"./shadow-claw-channels.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-channels\";\n\nexport class ShadowClawChannels extends ShadowClawElement {\n static styles = shadowClawChannelsStyles;\n static template = shadowClawChannelsTemplate;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n await this.render();\n }\n\n async render() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"back-to-settings\"]')\n ?.addEventListener(\"click\", () => {\n this.dispatchEvent(\n new CustomEvent(\"navigate-back\", {\n bubbles: true,\n composed: true,\n }),\n );\n });\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawChannels);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,MAAM,cAAc;AAEpB,IAAa,qBAAb,cAAwC,kBAAkB;CACxD,OAAO,SAASA;CAChB,OAAO,WAAWC;CAElB,cAAc;EACZ,MAAM;CACR;CAEA,MAAM,oBAAoB;EAExB,IAAI,CADS,KAAK,YAEhB,MAAM,IAAI,MAAM,sBAAsB;EAGxC,MAAM,KAAK,OAAO;CACpB;CAEA,MAAM,SAAS;EACb,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,KACG,cAAc,oCAAkC,CAAC,EAChD,iBAAiB,eAAe;GAChC,KAAK,cACH,IAAI,YAAY,iBAAiB;IAC/B,SAAS;IACT,UAAU;GACZ,CAAC,CACH;EACF,CAAC;CACL;AACF;AAEA,IAAI,CAAC,eAAe,IAAI,WAAW,GACjC,eAAe,OAAO,aAAa,kBAAkB"}
1
+ {"version":3,"file":"shadow-claw-channels-BgaJiPdE.js","names":["shadowClawChannelsStyles","shadowClawChannelsTemplate"],"sources":["../../src/components/shadow-claw-channels/shadow-claw-channels.ts"],"sourcesContent":["import \"../common/shadow-claw-page-header-action-button/shadow-claw-page-header-action-button.js\";\nimport \"../settings/shadow-claw-channel-config/shadow-claw-channel-config.js\";\nimport \"../shadow-claw-page-header/shadow-claw-page-header.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawChannelsStyles from \"./shadow-claw-channels.css\" with { type: \"css\" };\nimport shadowClawChannelsTemplate from \"./shadow-claw-channels.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-channels\";\n\nexport class ShadowClawChannels extends ShadowClawElement {\n static styles = shadowClawChannelsStyles;\n static template = shadowClawChannelsTemplate;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n await this.render();\n }\n\n async render() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"back-to-settings\"]')\n ?.addEventListener(\"click\", () => {\n this.dispatchEvent(\n new CustomEvent(\"navigate-back\", {\n bubbles: true,\n composed: true,\n }),\n );\n });\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawChannels);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAQA,MAAM,cAAc;AAEpB,IAAa,qBAAb,cAAwC,kBAAkB;CACxD,OAAO,SAASA;CAChB,OAAO,WAAWC;CAElB,cAAc;EACZ,MAAM;CACR;CAEA,MAAM,oBAAoB;EAExB,IAAI,CADS,KAAK,YAEhB,MAAM,IAAI,MAAM,sBAAsB;EAGxC,MAAM,KAAK,OAAO;CACpB;CAEA,MAAM,SAAS;EACb,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,KACG,cAAc,oCAAkC,CAAC,EAChD,iBAAiB,eAAe;GAChC,KAAK,cACH,IAAI,YAAY,iBAAiB;IAC/B,SAAS;IACT,UAAU;GACZ,CAAC,CACH;EACF,CAAC;CACL;AACF;AAEA,IAAI,CAAC,eAAe,IAAI,WAAW,GACjC,eAAe,OAAO,aAAa,kBAAkB"}
@@ -5,7 +5,7 @@ import { c as DEFAULT_PROMPT_API_FALLBACK_MODEL, l as DEFAULT_PROVIDER, r as CON
5
5
  import { t as getConfig } from "./getConfig-BxxXMyuM.js";
6
6
  import { t as readGroupFileBytes } from "./readGroupFileBytes-C8oOe8Iu.js";
7
7
  import { t as fileViewerStore } from "./file-viewer-C3YKnq_-.js";
8
- import { bt as saveMessage, dn as formatModelAttachmentCapabilitySummary, fn as getAttachmentCategory, o as clearGroupMessages, pn as getModelAttachmentCapabilities, t as orchestratorStore } from "./orchestrator-BtVj9bBB.js";
8
+ import { bt as saveMessage, dn as formatModelAttachmentCapabilitySummary, fn as getAttachmentCategory, o as clearGroupMessages, pn as getModelAttachmentCapabilities, t as orchestratorStore } from "./orchestrator-ClXbJ4Mb.js";
9
9
  import { t as setConfig } from "./setConfig-BFED5CXn.js";
10
10
  import { d as handleSpecialLinkNavigation, l as formatDateForFilename, n as setSanitizedHtml, u as formatTimestamp } from "./trusted-types-Dx0RZlrd.js";
11
11
  import { t as require_browser } from "./browser-FvTfy_Ym.js";
@@ -14,8 +14,8 @@ import { a as showSuccess, i as showInfo, r as showError, s as showWarning } fro
14
14
  import { getNamespacedItem } from "./utils/namespacedStorage.js";
15
15
  import { i as renderPromptApiStatusHtml, n as isNativePromptApiSupported, r as isPromptApiPotentiallySupported } from "./prompt-api-DJvb1BN7.js";
16
16
  import { t as effect } from "./effect-DL6j9HJp.js";
17
- import { t as renderMarkdown } from "./markdown-DEUoM1c6.js";
18
- import { i as inferAttachmentMimeType, n as transferProgressSignal, o as shouldInlineAttachmentInChat } from "./peerjs-BoBkx9DJ.js";
17
+ import { t as renderMarkdown } from "./markdown-DgdSt2GD.js";
18
+ import { i as inferAttachmentMimeType, n as transferProgressSignal, o as shouldInlineAttachmentInChat } from "./peerjs-BdfpltIe.js";
19
19
  import { t as downloadGroupFile } from "./downloadGroupFile-DmcBQU1n.js";
20
20
  import { n as chatUiStore } from "./shadow-claw-a2ui-CpZUTzlh.js";
21
21
  import { t as isTruthyConfigValue } from "./config-value-Cxggje2K.js";
@@ -6558,4 +6558,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
6558
6558
 
6559
6559
  //#endregion
6560
6560
  export { ShadowClawChat as t };
6561
- //# sourceMappingURL=shadow-claw-chat-Cam2lX4k.js.map
6561
+ //# sourceMappingURL=shadow-claw-chat-mXPQZbwT.js.map