shadow-claw 1.59.6 → 1.59.7

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 (324) hide show
  1. package/.well-known/mcp/server-card.json +12 -4
  2. package/.well-known/mcp.json +12 -4
  3. package/dist/cli/build/build.js +1 -1
  4. package/dist/cli/{chunk-DM4xsTry.js → chunk-3vNYrs_L.js} +1 -1
  5. package/dist/cli/{chunk-Ctg5L55n.js → chunk-66BvqAV0.js} +1 -1
  6. package/dist/cli/{chunk-Bq38OubR.js → chunk-B0qusANw.js} +1 -1
  7. package/dist/cli/{chunk-yiVdvGCJ.js → chunk-B3TrWbca.js} +7 -7
  8. package/dist/cli/{chunk-C8DBACtx.js → chunk-B88Z8T_9.js} +1 -1
  9. package/dist/cli/chunk-BCjL0JXf.js +1 -0
  10. package/dist/cli/chunk-BNcu1oiT.js +1 -0
  11. package/dist/cli/{chunk-gvNsvav0.js → chunk-C5ypckWC.js} +7 -7
  12. package/dist/cli/{chunk-Dw8GndPD.js → chunk-CAAeGOdy.js} +1 -1
  13. package/dist/cli/chunk-CFxww5Yz.js +1 -0
  14. package/dist/cli/chunk-CGIgtL6R.js +1 -0
  15. package/dist/cli/{chunk-DJqHK-qS.js → chunk-CQaCgswD.js} +7 -7
  16. package/dist/cli/chunk-CZdCRqNe.js +7 -0
  17. package/dist/cli/chunk-CafdvLx-.js +1 -0
  18. package/dist/cli/{chunk-Bc_weULz.js → chunk-CncW6_WL.js} +1 -1
  19. package/dist/cli/chunk-DDvuLVfW.js +1 -0
  20. package/dist/cli/{chunk-Cq_kQohv.js → chunk-DMs7kREC.js} +1 -1
  21. package/dist/cli/{chunk-CX2itile.js → chunk-D_te8ufL.js} +1 -1
  22. package/dist/cli/{chunk-3wTukVof.js → chunk-DhOU6GYX.js} +1 -1
  23. package/dist/cli/chunk-Dhap1VwA.js +1 -0
  24. package/dist/cli/chunk-DwvavohW.js +1 -0
  25. package/dist/cli/{chunk-DLde6nuO.js → chunk-SRBRVorc.js} +1 -1
  26. package/dist/cli/{chunk-D3y7h9Xe.js → chunk-SxK79JmB.js} +1 -1
  27. package/dist/cli/chunk-_a0CkUNS.js +139 -0
  28. package/dist/cli/{chunk-C9o6lXP3.js → chunk-hVf839t7.js} +1 -1
  29. package/dist/cli/chunk-iB8OoMmW.js +7 -0
  30. package/dist/cli/cli.js +1 -1
  31. package/dist/headless-agent.js +1 -1
  32. package/dist/lib/{app-routes-DJdIjp2V.js → app-routes-BXiRvlNl.js} +7 -25
  33. package/dist/lib/{app-routes-DJdIjp2V.js.map → app-routes-BXiRvlNl.js.map} +1 -1
  34. package/dist/lib/{attachment-capabilities-Dbb-4ZP5.js → attachment-capabilities-BjkEPip8.js} +2 -2
  35. package/dist/lib/{attachment-capabilities-Dbb-4ZP5.js.map → attachment-capabilities-BjkEPip8.js.map} +1 -1
  36. package/dist/lib/{channel-Dlru5ofR.js → channel-mmdGzPkT.js} +3 -3
  37. package/dist/lib/{channel-Dlru5ofR.js.map → channel-mmdGzPkT.js.map} +1 -1
  38. package/dist/lib/{chat-template-BuuLY8l7.js → chat-template-DPEKGJhB.js} +2 -2
  39. package/dist/lib/{chat-template-BuuLY8l7.js.map → chat-template-DPEKGJhB.js.map} +1 -1
  40. package/dist/lib/{compact-context-BtR55YPU.js → compact-context-CY9BBlUQ.js} +19 -19
  41. package/dist/lib/{compact-context-BtR55YPU.js.map → compact-context-CY9BBlUQ.js.map} +1 -1
  42. package/dist/lib/components/common/shadow-claw-provider-model-picker.js +1 -1
  43. package/dist/lib/components/index.js +27 -27
  44. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  45. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  46. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  47. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  48. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  49. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  50. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  51. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  52. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  53. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  54. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  55. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  56. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  57. package/dist/lib/components/shadow-claw-a2ui.js +1 -1
  58. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  59. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  60. package/dist/lib/components/shadow-claw-channels.js +1 -1
  61. package/dist/lib/components/shadow-claw-chat.js +1 -1
  62. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  63. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  64. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  65. package/dist/lib/components/shadow-claw-files.js +1 -1
  66. package/dist/lib/components/shadow-claw-git.js +1 -1
  67. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  68. package/dist/lib/components/shadow-claw-llm.js +1 -1
  69. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  70. package/dist/lib/components/shadow-claw-networking.js +1 -1
  71. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  72. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  73. package/dist/lib/components/shadow-claw-pages.js +1 -1
  74. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  75. package/dist/lib/components/shadow-claw-provider-model-picker.js +1 -1
  76. package/dist/lib/components/shadow-claw-settings.js +1 -1
  77. package/dist/lib/components/shadow-claw-storage.js +1 -1
  78. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  79. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  80. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  81. package/dist/lib/components/shadow-claw-tools.js +1 -1
  82. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  83. package/dist/lib/components/shadow-claw.js +1 -1
  84. package/dist/lib/{config-DxNI3TlW.js → config-BrHR97zt.js} +2 -2
  85. package/dist/lib/{config-DxNI3TlW.js.map → config-BrHR97zt.js.map} +1 -1
  86. package/dist/lib/{configure-peer-js-ChDhOZU4.js → configure-peer-js-ccNvax2N.js} +3 -3
  87. package/dist/lib/{configure-peer-js-ChDhOZU4.js.map → configure-peer-js-ccNvax2N.js.map} +1 -1
  88. package/dist/lib/{connections-DC4NZkJE.js → connections-C1FWsBsE.js} +2 -2
  89. package/dist/lib/{connections-DC4NZkJE.js.map → connections-C1FWsBsE.js.map} +1 -1
  90. package/dist/lib/{credentials-5vpz0XPk.js → credentials-CZbngHXW.js} +2 -2
  91. package/dist/lib/{credentials-5vpz0XPk.js.map → credentials-CZbngHXW.js.map} +1 -1
  92. package/dist/lib/{discover-skills-CD0sKvAI.js → discover-skills-OwlQ2sXA.js} +13 -13
  93. package/dist/lib/{discover-skills-CD0sKvAI.js.map → discover-skills-OwlQ2sXA.js.map} +1 -1
  94. package/dist/lib/{download-group-file-Dk3qaxhJ.js → download-group-file-D0wgg10Q.js} +2 -2
  95. package/dist/lib/{download-group-file-Dk3qaxhJ.js.map → download-group-file-D0wgg10Q.js.map} +1 -1
  96. package/dist/lib/{file-viewer-B4pRW-_G.js → file-viewer-DOfvX6yy.js} +5 -5
  97. package/dist/lib/{file-viewer-B4pRW-_G.js.map → file-viewer-DOfvX6yy.js.map} +1 -1
  98. package/dist/lib/{get-or-create-subscriber-id-HCcgDEPz.js → get-or-create-subscriber-id-wyzaML7Z.js} +2 -2
  99. package/dist/lib/{get-or-create-subscriber-id-HCcgDEPz.js.map → get-or-create-subscriber-id-wyzaML7Z.js.map} +1 -1
  100. package/dist/lib/{git-B3Q1euc5.js → git-D2J_j9X9.js} +5 -5
  101. package/dist/lib/{git-B3Q1euc5.js.map → git-D2J_j9X9.js.map} +1 -1
  102. package/dist/lib/{iframe-bridge-scripts-D8iuFhUk.js → iframe-bridge-scripts-Dx825LLG.js} +2 -2
  103. package/dist/lib/{iframe-bridge-scripts-D8iuFhUk.js.map → iframe-bridge-scripts-Dx825LLG.js.map} +1 -1
  104. package/dist/lib/index.js +28 -28
  105. package/dist/lib/{init-chat-split-resize-B0ODULx9.js → init-chat-split-resize-Cc0bd2z9.js} +2 -2
  106. package/dist/lib/{init-chat-split-resize-B0ODULx9.js.map → init-chat-split-resize-Cc0bd2z9.js.map} +1 -1
  107. package/dist/lib/{init-control-plane-C1FRRmjC.js → init-control-plane-B7blDVIE.js} +15 -15
  108. package/dist/lib/{init-control-plane-C1FRRmjC.js.map → init-control-plane-B7blDVIE.js.map} +1 -1
  109. package/dist/lib/{invoke-agent-CzN7sVh-.js → invoke-agent-SxvudiDT.js} +11 -11
  110. package/dist/lib/{invoke-agent-CzN7sVh-.js.map → invoke-agent-SxvudiDT.js.map} +1 -1
  111. package/dist/lib/{markdown-mbNo7cV3.js → markdown--6vTAPEH.js} +2 -2
  112. package/dist/lib/{markdown-mbNo7cV3.js.map → markdown--6vTAPEH.js.map} +1 -1
  113. package/dist/lib/{mcp-reconnect-3T7yWGEY.js → mcp-reconnect-BeqQvNWO.js} +3 -3
  114. package/dist/lib/{mcp-reconnect-3T7yWGEY.js.map → mcp-reconnect-BeqQvNWO.js.map} +1 -1
  115. package/dist/lib/{model-ranking-DGNSWYwN.js → model-ranking-BhsJV7vb.js} +2 -2
  116. package/dist/lib/{model-ranking-DGNSWYwN.js.map → model-ranking-BhsJV7vb.js.map} +1 -1
  117. package/dist/lib/{move-group-entry-NMTJ59M9.js → move-group-entry-DDpjxa10.js} +5 -5
  118. package/dist/lib/{move-group-entry-NMTJ59M9.js.map → move-group-entry-DDpjxa10.js.map} +1 -1
  119. package/dist/lib/{orchestrator-B8FV1V7x.js → orchestrator-C7fkh7T7.js} +24 -24
  120. package/dist/lib/{orchestrator-B8FV1V7x.js.map → orchestrator-C7fkh7T7.js.map} +1 -1
  121. package/dist/lib/{orchestrator-i_QJ-o22.js → orchestrator-CCARkxQC.js} +11 -11
  122. package/dist/lib/orchestrator-CCARkxQC.js.map +1 -0
  123. package/dist/lib/{parse-path-DPCn-HwI.js → parse-path-BOHQP_IQ.js} +3 -3
  124. package/dist/lib/{parse-path-DPCn-HwI.js.map → parse-path-BOHQP_IQ.js.map} +1 -1
  125. package/dist/lib/{peerjs-z5zeioPV.js → peerjs-Bfw_FWLB.js} +8 -8
  126. package/dist/lib/{peerjs-z5zeioPV.js.map → peerjs-Bfw_FWLB.js.map} +1 -1
  127. package/dist/lib/{process-peer-query-param-CJp7w7AU.js → process-peer-query-param-BxYiZNdf.js} +5 -5
  128. package/dist/lib/{process-peer-query-param-CJp7w7AU.js.map → process-peer-query-param-BxYiZNdf.js.map} +1 -1
  129. package/dist/lib/{process-pending-shared-payloads-B6_TlBFA.js → process-pending-shared-payloads-DPIbwRb3.js} +4 -4
  130. package/dist/lib/{process-pending-shared-payloads-B6_TlBFA.js.map → process-pending-shared-payloads-DPIbwRb3.js.map} +1 -1
  131. package/dist/lib/{process-room-query-param-C3FFGGn6.js → process-room-query-param-B2_d50nE.js} +4 -4
  132. package/dist/lib/{process-room-query-param-C3FFGGn6.js.map → process-room-query-param-B2_d50nE.js.map} +1 -1
  133. package/dist/lib/{provider-DcQZypu5.js → provider-BC9KPI14.js} +3 -3
  134. package/dist/lib/{provider-DcQZypu5.js.map → provider-BC9KPI14.js.map} +1 -1
  135. package/dist/lib/{push-client-Cx5rMs6J.js → push-client-rrjTdc-U.js} +5 -5
  136. package/dist/lib/{push-client-Cx5rMs6J.js.map → push-client-rrjTdc-U.js.map} +1 -1
  137. package/dist/lib/{read-group-file-bytes-CXOG_YyM.js → read-group-file-bytes-UQIk1eJG.js} +2 -2
  138. package/dist/lib/{read-group-file-bytes-CXOG_YyM.js.map → read-group-file-bytes-UQIk1eJG.js.map} +1 -1
  139. package/dist/lib/{rooms-CwlkYLDU.js → rooms-bwGoYb1q.js} +2 -2
  140. package/dist/lib/{rooms-CwlkYLDU.js.map → rooms-bwGoYb1q.js.map} +1 -1
  141. package/dist/lib/{shadow-claw-DoQ7fgl5.js → shadow-claw-CypGVlVO.js} +17 -20
  142. package/dist/lib/shadow-claw-CypGVlVO.js.map +1 -0
  143. package/dist/lib/{shadow-claw-a2ui-Br6qJMs1.js → shadow-claw-a2ui-lG0vQbW8.js} +2 -2
  144. package/dist/lib/{shadow-claw-a2ui-Br6qJMs1.js.map → shadow-claw-a2ui-lG0vQbW8.js.map} +1 -1
  145. package/dist/lib/{shadow-claw-accounts-BTDILfWw.js → shadow-claw-accounts-CkqyCxwp.js} +3 -3
  146. package/dist/lib/{shadow-claw-accounts-BTDILfWw.js.map → shadow-claw-accounts-CkqyCxwp.js.map} +1 -1
  147. package/dist/lib/{shadow-claw-channel-config-IKiL34tI.js → shadow-claw-channel-config-DJpDovkF.js} +4 -4
  148. package/dist/lib/{shadow-claw-channel-config-IKiL34tI.js.map → shadow-claw-channel-config-DJpDovkF.js.map} +1 -1
  149. package/dist/lib/{shadow-claw-channels-JgEzuHWK.js → shadow-claw-channels-DJLwRovH.js} +3 -3
  150. package/dist/lib/{shadow-claw-channels-JgEzuHWK.js.map → shadow-claw-channels-DJLwRovH.js.map} +1 -1
  151. package/dist/lib/{shadow-claw-chat-SGUDT31r.js → shadow-claw-chat-B92cPaft.js} +15 -15
  152. package/dist/lib/{shadow-claw-chat-SGUDT31r.js.map → shadow-claw-chat-B92cPaft.js.map} +1 -1
  153. package/dist/lib/{shadow-claw-control-plane-CRWFZ3vD.js → shadow-claw-control-plane-fvn-qyHj.js} +7 -7
  154. package/dist/lib/{shadow-claw-control-plane-CRWFZ3vD.js.map → shadow-claw-control-plane-fvn-qyHj.js.map} +1 -1
  155. package/dist/lib/{shadow-claw-conversations-D23GJ7qo.js → shadow-claw-conversations-CsVyDOny.js} +7 -7
  156. package/dist/lib/{shadow-claw-conversations-D23GJ7qo.js.map → shadow-claw-conversations-CsVyDOny.js.map} +1 -1
  157. package/dist/lib/{shadow-claw-file-viewer-C1V8WTiU.js → shadow-claw-file-viewer-DFfyP7s5.js} +10 -10
  158. package/dist/lib/{shadow-claw-file-viewer-C1V8WTiU.js.map → shadow-claw-file-viewer-DFfyP7s5.js.map} +1 -1
  159. package/dist/lib/{shadow-claw-files-DN7irmE1.js → shadow-claw-files-cT6HL7ye.js} +11 -11
  160. package/dist/lib/{shadow-claw-files-DN7irmE1.js.map → shadow-claw-files-cT6HL7ye.js.map} +1 -1
  161. package/dist/lib/{shadow-claw-git-D-1oIh65.js → shadow-claw-git-Cv9mQgTx.js} +6 -6
  162. package/dist/lib/{shadow-claw-git-D-1oIh65.js.map → shadow-claw-git-Cv9mQgTx.js.map} +1 -1
  163. package/dist/lib/{shadow-claw-integrations-CZjnm7cM.js → shadow-claw-integrations-RZZ-m-Id.js} +4 -4
  164. package/dist/lib/{shadow-claw-integrations-CZjnm7cM.js.map → shadow-claw-integrations-RZZ-m-Id.js.map} +1 -1
  165. package/dist/lib/{shadow-claw-llm-4Gefh5FN.js → shadow-claw-llm-CKOYzPDp.js} +9 -9
  166. package/dist/lib/{shadow-claw-llm-4Gefh5FN.js.map → shadow-claw-llm-CKOYzPDp.js.map} +1 -1
  167. package/dist/lib/{shadow-claw-mcp-remote-B9ssb3YV.js → shadow-claw-mcp-remote-BKFROurv.js} +4 -4
  168. package/dist/lib/{shadow-claw-mcp-remote-B9ssb3YV.js.map → shadow-claw-mcp-remote-BKFROurv.js.map} +1 -1
  169. package/dist/lib/{shadow-claw-networking-BN5BB4hb.js → shadow-claw-networking-DYfiUQaH.js} +2 -2
  170. package/dist/lib/{shadow-claw-networking-BN5BB4hb.js.map → shadow-claw-networking-DYfiUQaH.js.map} +1 -1
  171. package/dist/lib/{shadow-claw-notifications-71KARtkY.js → shadow-claw-notifications-JJlzriuX.js} +3 -3
  172. package/dist/lib/{shadow-claw-notifications-71KARtkY.js.map → shadow-claw-notifications-JJlzriuX.js.map} +1 -1
  173. package/dist/lib/{shadow-claw-page-header-DMGO-TSe.js → shadow-claw-page-header-C_Qr3xZM.js} +2 -2
  174. package/dist/lib/{shadow-claw-page-header-DMGO-TSe.js.map → shadow-claw-page-header-C_Qr3xZM.js.map} +1 -1
  175. package/dist/lib/{shadow-claw-pages-BiRM6qiA.js → shadow-claw-pages-BCo3ihZI.js} +11 -11
  176. package/dist/lib/{shadow-claw-pages-BiRM6qiA.js.map → shadow-claw-pages-BCo3ihZI.js.map} +1 -1
  177. package/dist/lib/{shadow-claw-peerjs-BZu7jNSe.js → shadow-claw-peerjs-CFNjfrY5.js} +6 -6
  178. package/dist/lib/{shadow-claw-peerjs-BZu7jNSe.js.map → shadow-claw-peerjs-CFNjfrY5.js.map} +1 -1
  179. package/dist/lib/{shadow-claw-provider-model-picker-BXYXEobD.js → shadow-claw-provider-model-picker-B-Ct4yW-.js} +2 -2
  180. package/dist/lib/{shadow-claw-provider-model-picker-BXYXEobD.js.map → shadow-claw-provider-model-picker-B-Ct4yW-.js.map} +1 -1
  181. package/dist/lib/{shadow-claw-settings-CcT5EK08.js → shadow-claw-settings-BMwne0bh.js} +7 -7
  182. package/dist/lib/{shadow-claw-settings-CcT5EK08.js.map → shadow-claw-settings-BMwne0bh.js.map} +1 -1
  183. package/dist/lib/{shadow-claw-storage-eTOpbvpi.js → shadow-claw-storage-DUY8B9m-.js} +5 -5
  184. package/dist/lib/{shadow-claw-storage-eTOpbvpi.js.map → shadow-claw-storage-DUY8B9m-.js.map} +1 -1
  185. package/dist/lib/{shadow-claw-task-server-DFImTUbw.js → shadow-claw-task-server-yWeoA3eL.js} +2 -2
  186. package/dist/lib/{shadow-claw-task-server-DFImTUbw.js.map → shadow-claw-task-server-yWeoA3eL.js.map} +1 -1
  187. package/dist/lib/{shadow-claw-tasks-BjaxsmUx.js → shadow-claw-tasks-Bg0uM15I.js} +9 -9
  188. package/dist/lib/{shadow-claw-tasks-BjaxsmUx.js.map → shadow-claw-tasks-Bg0uM15I.js.map} +1 -1
  189. package/dist/lib/{shadow-claw-terminal-C-4wreFe.js → shadow-claw-terminal-fyJPppY_.js} +2 -2
  190. package/dist/lib/{shadow-claw-terminal-C-4wreFe.js.map → shadow-claw-terminal-fyJPppY_.js.map} +1 -1
  191. package/dist/lib/{shadow-claw-tools-COdrGZJk.js → shadow-claw-tools-D0T8m3go.js} +7 -7
  192. package/dist/lib/{shadow-claw-tools-COdrGZJk.js.map → shadow-claw-tools-D0T8m3go.js.map} +1 -1
  193. package/dist/lib/{shadow-claw-webvm-sxqVjO0L.js → shadow-claw-webvm-CQvzJwKI.js} +3 -3
  194. package/dist/lib/{shadow-claw-webvm-sxqVjO0L.js.map → shadow-claw-webvm-CQvzJwKI.js.map} +1 -1
  195. package/dist/lib/{sync-web-mcp-registration-D4hdUwtv.js → sync-web-mcp-registration-BFtG_4kx.js} +6 -6
  196. package/dist/lib/{sync-web-mcp-registration-D4hdUwtv.js.map → sync-web-mcp-registration-BFtG_4kx.js.map} +1 -1
  197. package/dist/lib/{system-prompt-DT_KeYaL.js → system-prompt-bhGRLoL2.js} +7 -7
  198. package/dist/lib/{system-prompt-DT_KeYaL.js.map → system-prompt-bhGRLoL2.js.map} +1 -1
  199. package/dist/lib/{tools-Beuyh8y1.js → tools-B8OJ4sMF.js} +4 -4
  200. package/dist/lib/{tools-Beuyh8y1.js.map → tools-B8OJ4sMF.js.map} +1 -1
  201. package/dist/lib/{transformers-DydnReu4.js → transformers-BMURofG6.js} +2 -2
  202. package/dist/lib/{transformers-DydnReu4.js.map → transformers-BMURofG6.js.map} +1 -1
  203. package/dist/lib/{trusted-types-CfwZl_rr.js → trusted-types-HwsGS5Nj.js} +19 -17
  204. package/dist/lib/{trusted-types-CfwZl_rr.js.map → trusted-types-HwsGS5Nj.js.map} +1 -1
  205. package/dist/lib/{upload-group-file-BbBzjTcN.js → upload-group-file-CJpoNjEb.js} +3 -3
  206. package/dist/lib/{upload-group-file-BbBzjTcN.js.map → upload-group-file-CJpoNjEb.js.map} +1 -1
  207. package/dist/lib/utils/index.js +1 -1
  208. package/dist/lib/utils/namespaced-storage.js +1 -1
  209. package/dist/lib/utils/runtime-assets.js +1 -1
  210. package/dist/lib/utils/utils.js +1 -1
  211. package/dist/lib/{webmcp-DCfAFiIO.js → webmcp-BoMTvgmX.js} +3 -3
  212. package/dist/lib/{webmcp-DCfAFiIO.js.map → webmcp-BoMTvgmX.js.map} +1 -1
  213. package/dist/lib/{write-group-file-bytes-Ccn-VFUU.js → write-group-file-bytes-CNT7DqOZ.js} +3 -3
  214. package/dist/lib/{write-group-file-bytes-Ccn-VFUU.js.map → write-group-file-bytes-CNT7DqOZ.js.map} +1 -1
  215. package/dist/public/.well-known/mcp/server-card.json +12 -4
  216. package/dist/public/.well-known/mcp.json +12 -4
  217. package/dist/public/agent.worker.js +1 -1
  218. package/dist/public/attachment-capabilities-AdwXt3--.js +1 -0
  219. package/dist/public/{channel-BylT3rJC.js → channel-Dk7wl-Av.js} +1 -1
  220. package/dist/public/{chat-template-DPHJy7tr.js → chat-template-BwAnTFKf.js} +1 -1
  221. package/dist/public/{compact-context-BINQh64w.js → compact-context-fOTqwKF6.js} +2 -2
  222. package/dist/public/config-C16fFWtP.js +1 -0
  223. package/dist/public/{configure-peer-js-DChhcOfe.js → configure-peer-js-BOV0tR6G.js} +1 -1
  224. package/dist/public/{connections-CHaw0VqP.js → connections-Dxwj8yK_.js} +1 -1
  225. package/dist/public/{create-model-cache-fetch-DQebkoPL.js → create-model-cache-fetch-DSAFjOwc.js} +1 -1
  226. package/dist/public/{credentials-CgVqS119.js → credentials-CJUQ5Ep2.js} +1 -1
  227. package/dist/public/{custom-element-security-kiDhPfb8.js → custom-element-security-B2daIE5r.js} +2 -2
  228. package/dist/public/{discover-skills-Cvmx5I9V.js → discover-skills-D1sNTy2r.js} +6 -6
  229. package/dist/public/docs/example/article/index.html +28 -29
  230. package/dist/public/docs/example/article.html +28 -29
  231. package/dist/public/docs/publishing/index.html +28 -29
  232. package/dist/public/docs/publishing.html +28 -29
  233. package/dist/public/docs/skill-creator/index.html +28 -29
  234. package/dist/public/docs/skill-creator.html +28 -29
  235. package/dist/public/{download-group-file-BapoRgfU.js → download-group-file-BkMH-JKi.js} +1 -1
  236. package/dist/public/{e2e-bridge-C0g8vZKr.js → e2e-bridge-Cz95DLlb.js} +1 -1
  237. package/dist/public/get-group-dir-D--BiEyk.js +1 -0
  238. package/dist/public/{get-or-create-subscriber-id-GvRZYXwA.js → get-or-create-subscriber-id-jVHnQfbr.js} +1 -1
  239. package/dist/public/{git-CaAAZfVd.js → git-BmMlwIMP.js} +2 -2
  240. package/dist/public/{iframe-bridge-scripts-BnqtKhE4.js → iframe-bridge-scripts-Cibg0m6A.js} +1 -1
  241. package/dist/public/index.html +28 -29
  242. package/dist/public/index.js +1 -1
  243. package/dist/public/{init-chat-split-resize-Btonoy8u.js → init-chat-split-resize-C8AqCCiK.js} +1 -1
  244. package/dist/public/init-control-plane-Cb31yLTY.js +1 -0
  245. package/dist/public/{invoke-agent-B3Osw6K7.js → invoke-agent-CN7mSV0Z.js} +1 -1
  246. package/dist/public/main/index.html +28 -29
  247. package/dist/public/main/memory/index.html +28 -29
  248. package/dist/public/main/memory.html +28 -29
  249. package/dist/public/main.html +28 -29
  250. package/dist/public/{markdown-CPbU4r1U.js → markdown-CDSb5Hrl.js} +1 -1
  251. package/dist/public/{mcp-reconnect-CzROVsXG.js → mcp-reconnect-iPZPihwX.js} +1 -1
  252. package/dist/public/{memory-storage-BkoMlxOr.js → memory-storage-2m7KZ-aP.js} +1 -1
  253. package/dist/public/{model-ranking-CK0iBo3Z.js → model-ranking-BgOSaNIy.js} +1 -1
  254. package/dist/public/{move-group-entry-CTxoq7lw.js → move-group-entry-CXneuNVa.js} +1 -1
  255. package/dist/public/orchestrator-DBO4NZqd.js +63 -0
  256. package/dist/public/{orchestrator-BrDjQbGf.js → orchestrator-Dyylc8IU.js} +2 -2
  257. package/dist/public/{peerjs-CgF4Iz5W.js → peerjs-l0jiBoh6.js} +1 -1
  258. package/dist/public/{process-peer-query-param-BL2k0Hu-.js → process-peer-query-param-s-aSP1Rq.js} +1 -1
  259. package/dist/public/{process-pending-shared-payloads-C1AgGvn8.js → process-pending-shared-payloads-BN3GigPT.js} +1 -1
  260. package/dist/public/{process-room-query-param-DM0QCq3_.js → process-room-query-param-B2Qe0F0M.js} +1 -1
  261. package/dist/public/provider-YPZmsuHR.js +1 -0
  262. package/dist/public/{push-client-DJEOz7bi.js → push-client-B2LC8Qp9.js} +1 -1
  263. package/dist/public/{rooms-C6LXIJl4.js → rooms-ChCEOvkw.js} +1 -1
  264. package/dist/public/service-worker.js +1 -1
  265. package/dist/public/shadow-claw-Br8mWDUx.js +1176 -0
  266. package/dist/public/{shadow-claw-accounts--4hd_oCz.js → shadow-claw-accounts-Dm6G7KMP.js} +1 -1
  267. package/dist/public/{shadow-claw-card-IbNlZAdK.js → shadow-claw-card-CggS8uSa.js} +1 -1
  268. package/dist/public/{shadow-claw-channels-Vq_pPGa2.js → shadow-claw-channels-088vhuWO.js} +1 -1
  269. package/dist/public/{shadow-claw-chat-D7_GS25e.js → shadow-claw-chat-BRwRlq-n.js} +3 -3
  270. package/dist/public/{shadow-claw-control-plane-WTMEV8_p.js → shadow-claw-control-plane-rhKACK85.js} +2 -2
  271. package/dist/public/{shadow-claw-conversations-CLQgU1IT.js → shadow-claw-conversations-CF_yUfKl.js} +1 -1
  272. package/dist/public/{shadow-claw-empty-state-D4CrFGsN.js → shadow-claw-empty-state-CkpOSXCS.js} +1 -1
  273. package/dist/public/{shadow-claw-file-viewer-BhqiqLWQ.js → shadow-claw-file-viewer-DWCejuY3.js} +4 -4
  274. package/dist/public/{shadow-claw-files-senDiG9l.js → shadow-claw-files-L6_ioyzh.js} +2 -2
  275. package/dist/public/{shadow-claw-git-DOOCqY23.js → shadow-claw-git-DsdkwLqQ.js} +2 -2
  276. package/dist/public/{shadow-claw-integrations-Bsvc3Agq.js → shadow-claw-integrations-CSbRTOm3.js} +1 -1
  277. package/dist/public/{shadow-claw-llm-actYICAk.js → shadow-claw-llm-BitaeAVc.js} +2 -2
  278. package/dist/public/{shadow-claw-mcp-remote-BYUgrK3v.js → shadow-claw-mcp-remote-gSbV5riy.js} +1 -1
  279. package/dist/public/{shadow-claw-networking-Dk3p5Ny_.js → shadow-claw-networking-Dn_y6Cl9.js} +1 -1
  280. package/dist/public/{shadow-claw-notifications-CzPAlay8.js → shadow-claw-notifications-Cj4Lqx8U.js} +1 -1
  281. package/dist/public/{shadow-claw-page-header-CjJpVkyL.js → shadow-claw-page-header-DR4OZFt2.js} +1 -1
  282. package/dist/public/{shadow-claw-page-header-action-button-2DH5O1TD.js → shadow-claw-page-header-action-button-BnCV_2Kb.js} +1 -1
  283. package/dist/public/{shadow-claw-pages-3r5I-wI8.js → shadow-claw-pages-mpDOtNYj.js} +6 -6
  284. package/dist/public/{shadow-claw-pdf-viewer-BiCEwsoY.js → shadow-claw-pdf-viewer-DZ_84qJH.js} +1 -1
  285. package/dist/public/{shadow-claw-settings-DgB9RSZN.js → shadow-claw-settings-CfFTYTEy.js} +2 -2
  286. package/dist/public/{shadow-claw-storage-JB_43nd8.js → shadow-claw-storage-DLmiT4bG.js} +1 -1
  287. package/dist/public/{shadow-claw-task-server-oi5UIxdA.js → shadow-claw-task-server-BoMBCsiS.js} +1 -1
  288. package/dist/public/{shadow-claw-tasks-CnyiOt81.js → shadow-claw-tasks-ChEp1j7x.js} +3 -3
  289. package/dist/public/{shadow-claw-terminal-BC3RynHt.js → shadow-claw-terminal-BaoVbOda.js} +1 -1
  290. package/dist/public/{shadow-claw-toast-YjG--2Za.js → shadow-claw-toast-e8oz7z6Z.js} +1 -1
  291. package/dist/public/{shadow-claw-tools-Bbwk4vlT.js → shadow-claw-tools-BYjUBiJz.js} +1 -1
  292. package/dist/public/{shadow-claw-webvm-HZqzl2H5.js → shadow-claw-webvm-xGb13TME.js} +1 -1
  293. package/dist/public/{sync-web-mcp-registration-BaH2nAP0.js → sync-web-mcp-registration-CQluj-Kz.js} +1 -1
  294. package/dist/public/{system-prompt-Dck3N8T0.js → system-prompt-CTJn0tK-.js} +1 -1
  295. package/dist/public/{tools-DHA1dK2I.js → tools-D-52Zmfc.js} +1 -1
  296. package/dist/public/{transformers-C-DuTM2K.js → transformers-CQ9ss9rD.js} +1 -1
  297. package/dist/public/{upload-group-file-Cejr3zo1.js → upload-group-file-A8kB7lvO.js} +1 -1
  298. package/dist/public/{webmcp-CMRtu57-.js → webmcp-DIUZjVF5.js} +1 -1
  299. package/dist/public/{write-group-file-CmJuVQNO.js → write-group-file-R67DjJ-q.js} +1 -1
  300. package/dist/public/{write-group-file-bytes-Cejr3zo1.js → write-group-file-bytes-A8kB7lvO.js} +1 -1
  301. package/dist/public/{zip-reader-CuQ13eLe.js → zip-reader-DN7FB-Q0.js} +1 -1
  302. package/dist/server.js +1 -1
  303. package/package.json +1 -1
  304. package/dist/cli/chunk-BFziiMKt.js +0 -7
  305. package/dist/cli/chunk-BM3llsxb.js +0 -1
  306. package/dist/cli/chunk-Bj5qFsDi.js +0 -7
  307. package/dist/cli/chunk-Bj95zm-y.js +0 -1
  308. package/dist/cli/chunk-BpyP-esT.js +0 -1
  309. package/dist/cli/chunk-CX696s3_.js +0 -1
  310. package/dist/cli/chunk-DRxCrCAA.js +0 -139
  311. package/dist/cli/chunk-DjbCHa0h.js +0 -1
  312. package/dist/cli/chunk-DsQhAF31.js +0 -1
  313. package/dist/cli/chunk-VM-dECyG.js +0 -1
  314. package/dist/cli/chunk-heu2xRw1.js +0 -1
  315. package/dist/lib/orchestrator-i_QJ-o22.js.map +0 -1
  316. package/dist/lib/shadow-claw-DoQ7fgl5.js.map +0 -1
  317. package/dist/public/app-routes-V_-URXc5.js +0 -1
  318. package/dist/public/attachment-capabilities-B6ibLwQB.js +0 -1
  319. package/dist/public/config-C-YdSFZB.js +0 -1
  320. package/dist/public/get-group-dir-DL44kvqW.js +0 -1
  321. package/dist/public/init-control-plane-BoJijVtf.js +0 -1
  322. package/dist/public/orchestrator-CaUpEVkQ.js +0 -63
  323. package/dist/public/provider-DNIL4-Hw.js +0 -1
  324. package/dist/public/shadow-claw-DdgeYPg5.js +0 -1176
@@ -1,3 +1,3 @@
1
- import{u as e}from"./custom-element-security-kiDhPfb8.js";import{D as t,E as n,I as r,L as i,M as a,O as o,P as s,T as c,_ as l,g as u,j as d,l as f,o as p,r as m,s as h,t as g,v as _,w as v,z as y}from"./config-C-YdSFZB.js";import"./app-routes-V_-URXc5.js";import{n as b,r as x}from"./db-BUuJo1Gf.js";import{n as S}from"./tx-promise-DNVEN3Wa.js";import{t as C}from"./get-config-Bkvl__ZS.js";import{t as ee}from"./dist-CeFyqf9k.js";import{C as w,E as te,H as ne,Q as T,i as E,k as D,r as re,t as O,x as ie}from"./orchestrator-CaUpEVkQ.js";import{t as k}from"./set-config-DSiuMe0k.js";import{t as A}from"./ulid-BSJxYh6W.js";import{s as ae,t as j}from"./tools-DHA1dK2I.js";import{t as M}from"./get-or-create-subscriber-id-GvRZYXwA.js";import{r as oe}from"./get-group-dir-DL44kvqW.js";import{i as se,r as ce}from"./write-group-file-CmJuVQNO.js";import{t as N}from"./parse-boolean-config-BigJ9U46.js";import{S as P,a as le,b as F,i as ue,l as de,n as fe,r as pe,t as me}from"./provider-DNIL4-Hw.js";import{n as I,r as L}from"./crypto-4ETeplbS.js";import{t as he}from"./chat-template-DPHJy7tr.js";import{a as ge,i as _e,s as ve}from"./transformers-C-DuTM2K.js";import{a as ye}from"./push-client-DJEOz7bi.js";import{f as be,n as xe,t as Se,u as R}from"./channel-BylT3rJC.js";import{a as z,i as B,n as Ce,o as we,r as Te}from"./rooms-C6LXIJl4.js";import{i as Ee}from"./mime-ClqNyXPc.js";import{i as De,r as V,t as Oe}from"./peerjs-CgF4Iz5W.js";import{setWebMcpMode as ke,unregisterWebMcpTools as Ae}from"./webmcp-CMRtu57-.js";import{a as je,i as Me,p as Ne,r as Pe,t as Fe}from"./discover-skills-Cvmx5I9V.js";import{r as H}from"./sync-web-mcp-registration-BaH2nAP0.js";import{i as U,n as Ie,r as Le,t as Re}from"./system-prompt-Dck3N8T0.js";import{ensureControlPlaneConnected as ze}from"./init-control-plane-BoJijVtf.js";async function Be(e){if(e&&e.name!==`shadowclaw`){try{if(await C(e,m.DB_MIGRATED_FROM_LEGACY)===`true`)return}catch{}try{let t=await new Promise(e=>{let t=indexedDB.open(l);t.onsuccess=()=>{let n=t.result;!n.objectStoreNames||n.objectStoreNames.length===0?(n.close(),e(null)):e(n)},t.onerror=()=>e(null)});if(t){let n=Array.from(t.objectStoreNames).filter(t=>e.objectStoreNames.contains(t));for(let r of n)await new Promise(n=>{try{let i=t.transaction(r,`readonly`).objectStore(r).getAll();i.onsuccess=()=>{let t=i.result||[];if(t.length>0)try{let i=e.transaction(r,`readwrite`),a=i.objectStore(r);for(let e of t)a.put(e);i.oncomplete=()=>n(),i.onerror=()=>n(),i.onabort=()=>n()}catch{n()}else n()},i.onerror=()=>n()}catch{n()}});t.close()}}catch(e){console.warn(`Legacy IndexedDB migration warning:`,e)}finally{try{await k(e,m.DB_MIGRATED_FROM_LEGACY,`true`)}catch{}}}}async function W(e,t,n){for await(let[r,i]of e.entries())if(i.kind===`directory`)await W(i,await t.getDirectoryHandle(r,{create:!0}),[...n,r]);else if(i.kind===`file`){let e=await i.getFile(),a=await t.getFileHandle(r,{create:!0});try{await ce(a,e)}catch(t){if(!(t instanceof Error?t.message:String(t)).includes(`Writable file streams are not supported`))throw t;await se([...n,r],e)}}}async function Ve(e){if(!e)return;try{if(await C(e,m.OPFS_MIGRATED_FROM_LEGACY)===`true`)return}catch{}let t=oe();if(t!==`shadowclaw`&&typeof navigator<`u`&&navigator.storage&&typeof navigator.storage.getDirectory==`function`)try{let n=await navigator.storage.getDirectory(),r;try{r=await n.getDirectoryHandle(_)}catch{try{await k(e,m.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}return}let i=await n.getDirectoryHandle(t,{create:!0});await W(r,i,[t])}catch(e){console.warn(`Legacy OPFS migration warning:`,e)}finally{try{await k(e,m.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}}}function He(){return new Promise(async(e,t)=>{let n,r=d(),i=indexedDB.open(r,2);i.onupgradeneeded=()=>{let e=i.result;if(!e.objectStoreNames.contains(`messages`)){let t=e.createObjectStore(`messages`,{keyPath:`id`});t.createIndex(`by-group-time`,[`groupId`,`timestamp`]),t.createIndex(`by-group`,`groupId`)}if(e.objectStoreNames.contains(`sessions`)||e.createObjectStore(`sessions`,{keyPath:`groupId`}),!e.objectStoreNames.contains(`tasks`)){let t=e.createObjectStore(`tasks`,{keyPath:`id`});t.createIndex(`by-group`,`groupId`),t.createIndex(`by-enabled`,`enabled`)}e.objectStoreNames.contains(`config`)||e.createObjectStore(`config`,{keyPath:`key`}),e.objectStoreNames.contains(`pendingShares`)||e.createObjectStore(`pendingShares`,{keyPath:`id`}).createIndex(`by-createdAt`,`createdAt`)},i.onsuccess=async()=>{n=i.result,x(n);try{await Be(n),await Ve(n)}catch(e){console.warn(`Error running legacy migration:`,e)}e(n)},i.onerror=()=>{t(/* @__PURE__ */ Error(`Failed to open IndexedDB: ${i.error?.message}`))}})}var Ue=class{activeGroupId;displayCallback;messageCallback;type;typingCallback;constructor(){this.type=`browser`,this.messageCallback=null,this.typingCallback=null,this.displayCallback=null,this.activeGroupId=p}getActiveGroup(){return this.activeGroupId}onDisplay(e){this.displayCallback=e}onMessage(e){this.messageCallback=e}onTyping(e){this.typingCallback=e}setActiveGroup(e){this.activeGroupId=e}setTyping(e,t){this.typingCallback?.(e,t)}start(){}stop(){}submit(e,t,n=[],r,i,a){let o=t||this.activeGroupId,s={id:A(),groupId:o,sender:`You`,content:e,timestamp:Date.now(),channel:`browser`,attachments:n,a2uiAction:r,freshContext:i,subagent:a};this.messageCallback?.(s)}async send(e,t,n){this.displayCallback?.(e,t,!0)}},G=class{_entries;constructor(){this._entries=[]}find(e){return this.resolve(e)?.channel??null}get(e){return this._entries.find(t=>t.prefix===e)?.channel}getBadge(e){return this.resolve(e)?.badge??``}getChannelType(e){return this.resolve(e)?.channel.type??null}onMessage(e){for(let t of this._entries)t.channel.onMessage(e)}onTyping(e){for(let t of this._entries)t.channel.onTyping&&t.channel.onTyping(e)}prefixes(){return this._entries.map(e=>e.prefix)}register(e,t,n){let r=typeof n==`string`?{badge:n}:n??{};this._entries.push({prefix:e,channel:t,badge:r.badge??e.replace(/:$/,``),autoTrigger:r.autoTrigger??!1}),this._entries.sort((e,t)=>t.prefix.length-e.prefix.length)}resolve(e){for(let t of this._entries)if(e.startsWith(t.prefix))return t;return null}shouldAutoTrigger(e){return this.resolve(e)?.autoTrigger??!1}startAll(){for(let e of this._entries)e.channel.start()}stopAll(){for(let e of this._entries)e.channel.stop()}},We=class{abortController=null;apiKey=``;apiMode=`unknown`;cursor=null;fileReader=null;messageCallback=null;reconnectDelayMs=1e3;registeredChatIds=/* @__PURE__ */ new Set;running=!1;seenMessageIds=/* @__PURE__ */ new Map;serverUrl=``;type=`imessage`;configure(e,t,n){this.serverUrl=Ge(e),this.apiKey=t.trim(),this.registeredChatIds=new Set(n.map(e=>e.trim()).filter(Boolean)),this.cursor=null,this.apiMode=`unknown`}handleIncomingMessage(e){this.pruneSeenMessageIds();let t=String(e.chatId||e.conversationId||``).trim();if(!t||this.registeredChatIds.size>0&&!this.registeredChatIds.has(t))return;let n=`${e.text||e.body||``}`.trim();if(!n)return;let r=`${e.id||e.guid||`${t}:${e.timestamp||e.createdAt||n}`}`;if(this.seenMessageIds.has(r))return;this.seenMessageIds.set(r,Date.now());let i={id:r,groupId:`im:${t}`,sender:`${e.sender||e.handle||e.from||`iMessage`}`,content:n,timestamp:K(e.timestamp||e.createdAt),channel:`imessage`};this.messageCallback?.(i)}handlePollResponse(e){e.nextCursor!==void 0&&e.nextCursor!==null?this.cursor=String(e.nextCursor):e.cursor!==void 0&&e.cursor!==null&&(this.cursor=String(e.cursor));let t=Array.isArray(e.messages)?e.messages:[];for(let e of t)this.handleIncomingMessage(e)}isConfigured(){return this.serverUrl.length>0}onMessage(e){this.messageCallback=e}pruneSeenMessageIds(){let e=Date.now();for(let[t,n]of this.seenMessageIds.entries())e-n>6e4&&this.seenMessageIds.delete(t)}setTyping(e,t){if(!t)return;let n=e.replace(/^im:/,``);this.requestJson(`/messages/typing`,{method:`POST`,body:JSON.stringify({chatId:n,typing:!0})}).catch(()=>{})}start(){this.isConfigured()&&!this.running&&(this.running=!0,this.abortController=new AbortController,this.poll())}ensureConnected(){this.isConfigured()&&this.running&&(this.reconnectDelayMs=1e3,this.abortController?.abort(),this.abortController=new AbortController,this.poll())}stop(){this.running=!1,this.abortController?.abort(),this.abortController=null}async ensureApiMode(){if(this.apiMode!==`unknown`)return this.apiMode;try{await this.requestJson(`/v1/info`,{method:`GET`}),this.apiMode=`beeper-desktop`}catch{this.apiMode=`legacy`}return this.apiMode}async poll(){for(;this.running&&this.abortController&&!this.abortController.signal.aborted;)try{let e=new URLSearchParams({timeout:`25`});this.cursor&&e.set(`cursor`,this.cursor);let t=await this.requestJson(`/messages?${e.toString()}`,{method:`GET`},u+5e3,this.abortController.signal);this.reconnectDelayMs=1e3,this.handlePollResponse(t)}catch(e){if(e instanceof Error&&e.name===`AbortError`)break;console.error(`iMessage bridge poll error:`,e),await Ke(this.reconnectDelayMs),this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,3e4)}}async requestJson(e,t,n=u,r){let i=new AbortController,a=setTimeout(()=>i.abort(),n),o=()=>i.abort();r?.addEventListener(`abort`,o,{once:!0});try{let n=new Headers(t.headers);n.set(`Accept`,`application/json`),!n.has(`Content-Type`)&&t.body&&!(t.body instanceof FormData)&&n.set(`Content-Type`,`application/json`),this.apiKey&&(n.set(`Authorization`,`Bearer ${this.apiKey}`),n.set(`X-API-Key`,this.apiKey));let r=await fetch(`${this.serverUrl}${e}`,{...t,headers:n,signal:i.signal});if(!r.ok){let e=await r.text();throw Error(`iMessage bridge request failed: ${r.status} ${e}`)}return r.status===204?{messages:[]}:await r.json()}finally{clearTimeout(a),r?.removeEventListener(`abort`,o)}}async send(e,t,n){let r=e.replace(/^im:/,``),{remainingText:i,attachments:a}=qe(t);for(let t of a)if(!this.fileReader)await this.sendText(r,`[${t.alt}] (file: ${t.path})`);else try{let n=await this.fileReader(e,t.path);if(!n||n.size===0)throw Error(`Attachment file is empty or unavailable.`);await this.sendAttachment(r,n,t)}catch(e){console.warn(`iMessage attachment send failed for ${t.path}:`,e),await this.sendText(r,`[${t.alt}] (file: ${t.path})`)}let o=i.trim();o&&await this.sendText(r,o)}async sendAttachment(e,t,n){await this.ensureApiMode()===`beeper-desktop`?await this.sendAttachmentViaBeeperDesktop(e,t,n):await this.sendAttachmentViaLegacyBridge(e,t,n)}async sendAttachmentViaBeeperDesktop(e,t,n){let r=n.path.split(`/`).pop()||`attachment.bin`,i=new FormData;i.append(`file`,t,r),i.append(`fileName`,r),t.type&&i.append(`mimeType`,t.type);let a=`${(await this.requestJson(`/v1/assets/upload`,{method:`POST`,body:i})).uploadID||``}`.trim();if(!a)throw Error(`Beeper asset upload failed: missing uploadID`);await this.requestJson(`/v1/chats/${encodeURIComponent(e)}/messages`,{method:`POST`,body:JSON.stringify({text:n.alt||void 0,attachment:{uploadID:a,fileName:r,mimeType:t.type||void 0}})})}async sendAttachmentViaLegacyBridge(e,t,n){let r=n.path.split(`/`).pop()||`attachment.bin`,i=new FormData;i.append(`chatId`,e),n.alt&&i.append(`text`,n.alt),i.append(`file`,t,r),await this.requestJson(`/messages/send`,{method:`POST`,body:i})}async sendText(e,t){await this.ensureApiMode()===`beeper-desktop`?await this.requestJson(`/v1/chats/${encodeURIComponent(e)}/messages`,{method:`POST`,body:JSON.stringify({text:t})}):await this.requestJson(`/messages/send`,{method:`POST`,body:JSON.stringify({chatId:e,text:t})})}};function Ge(e){return e.trim().replace(/\/+$/,``)}function K(e){if(typeof e==`number`&&Number.isFinite(e))return e>0xe8d4a51000?e:e*1e3;if(typeof e==`string`){let t=Number(e);if(Number.isFinite(t))return K(t);let n=Date.parse(e);if(Number.isFinite(n))return n}return Date.now()}function Ke(e){return new Promise(t=>setTimeout(t,e))}function qe(e){let t=[],n=/!?\[([^\]]*)\]\(([^)]+)\)/g,r=null,i=e;for(;(r=n.exec(e))!==null;){let e=r[1]||``,n=Je((r[2]||``).trim());n&&(t.push({alt:e,path:n}),i=i.replace(r[0],``))}return{remainingText:i,attachments:t}}function Je(e){if(!e)return null;let t=e.trim();if(/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(t)||t.startsWith(`//`))return null;let n=t.replace(/\\/g,`/`).replace(/^\/+/,``).replace(/^\.\//,``);if(!n)return null;let r=n.split(`/`).filter(Boolean);return r.some(e=>e===`..`)?null:r.join(`/`)}var Ye=class{messageCallback=null;running=!1;type=`room`;typingCallback=null;_manager=null;_peerjs=null;deliverInbound(e){this.messageCallback?.(e)}onMessage(e){this.messageCallback=e}onTyping(e){this.typingCallback=e}setManager(e){this._manager=e}setPeerJs(e){this._peerjs=e}setTyping(e,t){}start(){this.running=!0}stop(){this.running=!1}async send(e,t,n){if(!this._manager)return;let r=z(e);if(n&&n.length>0&&this._peerjs){let t=this._manager.get(r);t&&await this._peerjs.sendAttachmentsToRoom(t,e,n)}this._manager.broadcast(r,t,n)}};const q=1e3;var Xe=class{abortController=null;fileReader=null;messageCallback=null;offset=0;pollRetryDelayMs=q;pollSessionId=0;registeredChatIds=/* @__PURE__ */ new Set;running=!1;token=``;type=`telegram`;useProxy=!1;buildFileUrl(e){let t=e.split(`/`).filter(Boolean).map(e=>encodeURIComponent(e)).join(`/`);return`${this.useProxy?`/telegram/file/bot`:`https://api.telegram.org/file/bot`}${this.token}/${t}`}buildMethodUrl(e){let n=e.replace(/^\/+/,``);return`${this.useProxy?t:c}${this.token}/${n}`}configure(e,t,n=!1){this.token=e.trim(),this.registeredChatIds=new Set(t.map(e=>e.trim()).filter(Boolean)),this.useProxy=!!n}isConfigured(){return this.token.length>0}nextPollRetryDelay(){let e=this.pollRetryDelayMs;return this.pollRetryDelayMs=Math.min(this.pollRetryDelayMs*2,6e4),e}onMessage(e){this.messageCallback=e}registerChatId(e){let t=e.trim();t&&this.registeredChatIds.add(t)}resetPollBackoff(){this.pollRetryDelayMs=q}setTyping(e,t){if(!t)return;let n=e.replace(/^tg:/,``);this.apiCall(`sendChatAction`,{chat_id:n,action:`typing`}).catch(()=>{})}start(){if(!this.token||this.running)return;this.running=!0,this.resetPollBackoff();let e=++this.pollSessionId,t=new AbortController;this.abortController=t,this.poll(e,t)}ensureConnected(){if(!this.token||!this.running)return;this.resetPollBackoff(),this.abortController?.abort();let e=++this.pollSessionId,t=new AbortController;this.abortController=t,this.poll(e,t)}stop(){this.running=!1,this.resetPollBackoff(),this.pollSessionId+=1,this.abortController?.abort(),this.abortController=null}async apiCall(e,t){let n=await fetch(this.buildMethodUrl(e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let t=await n.text();throw Error(`Telegram API ${e} failed: ${n.status} ${t}`)}return await n.json()}async extractAttachments(e){let t=[],n=Array.isArray(e.photo)?e.photo.at(-1):null;n?.file_id&&t.push({id:n.file_id,fileName:`photo-${e.message_id}.png`,mimeType:`image/png`,previewDisposition:`inline`}),e.document?.file_id&&t.push({id:e.document.file_id,fileName:e.document.file_name||`document-${e.message_id}`,mimeType:e.document.mime_type}),e.video?.file_id&&t.push({id:e.video.file_id,fileName:e.video.file_name||`video-${e.message_id}.mp4`,mimeType:e.video.mime_type||`video/mp4`}),e.audio?.file_id&&t.push({id:e.audio.file_id,fileName:e.audio.file_name||`audio-${e.message_id}.mp3`,mimeType:e.audio.mime_type||`audio/mpeg`}),e.voice?.file_id&&t.push({id:e.voice.file_id,fileName:`voice-${e.message_id}.ogg`,mimeType:e.voice.mime_type||`audio/ogg`}),e.animation?.file_id&&t.push({id:e.animation.file_id,fileName:e.animation.file_name||`animation-${e.message_id}.mp4`,mimeType:e.animation.mime_type||`video/mp4`}),e.sticker?.file_id&&t.push({id:e.sticker.file_id,fileName:`sticker-${e.message_id}.${$e(e.sticker)}`,mimeType:e.sticker.is_animated?`application/x-tgsticker`:e.sticker.is_video?`video/webm`:`image/webp`});let r=[];for(let e of t){let t=await this.fetchTelegramFileInfo(e.id);r.push({id:e.id,fileName:e.fileName,mimeType:e.mimeType,size:t.file_size,previewDisposition:e.previewDisposition,source:{kind:`remote-url`,url:this.buildFileUrl(t.file_path)}})}return r}async fetchTelegramFileInfo(e){let t=await this.apiCall(`getFile`,{file_id:e});if(!t.ok||!t.result?.file_path)throw Error(`Telegram getFile failed for attachment ${e}`);return t.result}async handleUpdate(e){let t=e.message;if(!t)return;let n=String(t.chat.id);if(t.text===`/chatid`){this.apiCall(`sendMessage`,{chat_id:n,text:`Chat ID: ${n}\nRegister this ID in ShadowClaw settings.`}).catch(console.error);return}if(t.text===`/ping`){this.apiCall(`sendMessage`,{chat_id:n,text:`Pong! ShadowClaw is running.`}).catch(console.error);return}if(!this.registeredChatIds.has(n))return;let r=await this.extractAttachments(t),i=`${t.text||t.caption||``}`.trim()||(t.photo?.length?`[Photo]`:null)||(t.voice?`[Voice message]`:null)||(t.video?`[Video]`:null)||(t.audio?`[Audio]`:null)||(t.animation?`[Animation]`:null)||(t.document?`[Document: ${t.document.file_name||`unnamed`}]`:null)||(t.sticker?`[Sticker: ${t.sticker.emoji||``}]`:null)||(t.location?`[Location: ${t.location.latitude}, ${t.location.longitude}]`:null)||(t.contact?`[Contact: ${t.contact.first_name}]`:null)||`[Unsupported message type]`,a=t.from?.first_name||t.from?.username||String(t.from?.id||`Unknown`),o={id:String(t.message_id),groupId:`tg:${n}`,sender:a,content:i,timestamp:t.date*1e3,channel:`telegram`,attachments:r};this.messageCallback?.(o)}async poll(e,t){for(;this.running&&this.pollSessionId===e&&!t.signal.aborted;)try{let e=await fetch(this.buildMethodUrl(`getUpdates?offset=${this.offset}&timeout=30`),{signal:t.signal});if(!e.ok){console.error(`Telegram poll error: HTTP ${e.status}`),await this.waitForRetry(this.nextPollRetryDelay());continue}let n=await e.json();if(!n.ok||!Array.isArray(n.result)){await this.waitForRetry(this.nextPollRetryDelay());continue}this.resetPollBackoff();for(let e of n.result)this.offset=e.update_id+1,await this.handleUpdate(e)}catch(e){if(e instanceof Error&&e.name===`AbortError`)break;console.error(`Telegram poll error:`,e),await this.waitForRetry(this.nextPollRetryDelay())}}async send(e,t,r){let i=e.replace(/^tg:/,``),{remainingText:a,attachments:o}=et(t);for(let t of o){if(this.fileReader)try{let n=await this.fileReader(e,t.path);if(n&&n.size>0){let e=t.path.toLowerCase();e.endsWith(`.png`)||e.endsWith(`.jpg`)||e.endsWith(`.jpeg`)||e.endsWith(`.gif`)||e.endsWith(`.webp`)?await this.sendPhoto(i,n,t.alt,t.path):await this.sendDocument(i,n,t.alt,t.path);continue}}catch(e){console.warn(`TelegramChannel: failed to read file ${t.path}:`,e)}await this.apiCall(`sendMessage`,{chat_id:i,text:`[${t.alt}] (file: ${t.path})`})}let s=a.trim();if(s){let e=Ze(s,n);for(let t of e)await this.apiCall(`sendMessage`,{chat_id:i,text:t})}}async sendDocument(e,t,n,r){let i=r.split(`/`).pop()||`document.file`,a=new FormData;a.append(`chat_id`,e),a.append(`document`,t,i),n&&a.append(`caption`,n);let o=await fetch(this.buildMethodUrl(`sendDocument`),{method:`POST`,body:a});if(!o.ok){let e=await o.text();throw Error(`Telegram sendDocument failed: ${o.status} ${e}`)}}async sendPhoto(e,t,n,r){let i=r.split(`/`).pop()||`image.png`,a=new FormData;a.append(`chat_id`,e),a.append(`photo`,t,i),n&&a.append(`caption`,n);let o=await fetch(this.buildMethodUrl(`sendPhoto`),{method:`POST`,body:a});if(!o.ok){let e=await o.text();throw Error(`Telegram sendPhoto failed: ${o.status} ${e}`)}}async waitForRetry(e){await Qe(e)}};function Ze(e,t){if(e.length<=t)return[e];let n=[],r=e;for(;r.length>0;){if(r.length<=t){n.push(r);break}let e=t,i=r.lastIndexOf(`
1
+ import{u as e}from"./custom-element-security-B2daIE5r.js";import{D as t,E as n,I as r,L as i,M as a,O as o,P as s,T as c,_ as l,et as u,g as d,j as f,l as p,o as m,r as h,s as g,t as _,v,w as y}from"./config-C16fFWtP.js";import{n as b,r as x}from"./db-BUuJo1Gf.js";import{n as S}from"./tx-promise-DNVEN3Wa.js";import{t as C}from"./get-config-Bkvl__ZS.js";import{t as ee}from"./dist-CeFyqf9k.js";import{C as w,E as te,H as ne,Q as T,i as E,k as D,r as re,t as O,x as ie}from"./orchestrator-DBO4NZqd.js";import{t as k}from"./set-config-DSiuMe0k.js";import{t as A}from"./ulid-BSJxYh6W.js";import{s as ae,t as j}from"./tools-D-52Zmfc.js";import{t as M}from"./get-or-create-subscriber-id-jVHnQfbr.js";import{r as oe}from"./get-group-dir-D--BiEyk.js";import{i as se,r as ce}from"./write-group-file-R67DjJ-q.js";import{t as N}from"./parse-boolean-config-BigJ9U46.js";import{S as P,a as le,b as F,i as ue,l as de,n as fe,r as pe,t as me}from"./provider-YPZmsuHR.js";import{n as I,r as L}from"./crypto-4ETeplbS.js";import{t as he}from"./chat-template-BwAnTFKf.js";import{a as ge,i as _e,s as ve}from"./transformers-CQ9ss9rD.js";import{a as ye}from"./push-client-B2LC8Qp9.js";import{f as be,n as xe,t as Se,u as R}from"./channel-Dk7wl-Av.js";import{a as z,i as B,n as Ce,o as we,r as Te}from"./rooms-ChCEOvkw.js";import{i as Ee}from"./mime-ClqNyXPc.js";import{i as De,r as V,t as Oe}from"./peerjs-l0jiBoh6.js";import{setWebMcpMode as ke,unregisterWebMcpTools as Ae}from"./webmcp-DIUZjVF5.js";import{a as je,i as Me,p as Ne,r as Pe,t as Fe}from"./discover-skills-D1sNTy2r.js";import{r as H}from"./sync-web-mcp-registration-CQluj-Kz.js";import{i as U,n as Ie,r as Le,t as Re}from"./system-prompt-CTJn0tK-.js";import{ensureControlPlaneConnected as ze}from"./init-control-plane-Cb31yLTY.js";async function Be(e){if(e&&e.name!==`shadowclaw`){try{if(await C(e,h.DB_MIGRATED_FROM_LEGACY)===`true`)return}catch{}try{let t=await new Promise(e=>{let t=indexedDB.open(l);t.onsuccess=()=>{let n=t.result;!n.objectStoreNames||n.objectStoreNames.length===0?(n.close(),e(null)):e(n)},t.onerror=()=>e(null)});if(t){let n=Array.from(t.objectStoreNames).filter(t=>e.objectStoreNames.contains(t));for(let r of n)await new Promise(n=>{try{let i=t.transaction(r,`readonly`).objectStore(r).getAll();i.onsuccess=()=>{let t=i.result||[];if(t.length>0)try{let i=e.transaction(r,`readwrite`),a=i.objectStore(r);for(let e of t)a.put(e);i.oncomplete=()=>n(),i.onerror=()=>n(),i.onabort=()=>n()}catch{n()}else n()},i.onerror=()=>n()}catch{n()}});t.close()}}catch(e){console.warn(`Legacy IndexedDB migration warning:`,e)}finally{try{await k(e,h.DB_MIGRATED_FROM_LEGACY,`true`)}catch{}}}}async function W(e,t,n){for await(let[r,i]of e.entries())if(i.kind===`directory`)await W(i,await t.getDirectoryHandle(r,{create:!0}),[...n,r]);else if(i.kind===`file`){let e=await i.getFile(),a=await t.getFileHandle(r,{create:!0});try{await ce(a,e)}catch(t){if(!(t instanceof Error?t.message:String(t)).includes(`Writable file streams are not supported`))throw t;await se([...n,r],e)}}}async function Ve(e){if(!e)return;try{if(await C(e,h.OPFS_MIGRATED_FROM_LEGACY)===`true`)return}catch{}let t=oe();if(t!==`shadowclaw`&&typeof navigator<`u`&&navigator.storage&&typeof navigator.storage.getDirectory==`function`)try{let n=await navigator.storage.getDirectory(),r;try{r=await n.getDirectoryHandle(v)}catch{try{await k(e,h.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}return}let i=await n.getDirectoryHandle(t,{create:!0});await W(r,i,[t])}catch(e){console.warn(`Legacy OPFS migration warning:`,e)}finally{try{await k(e,h.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}}}function He(){return new Promise(async(e,t)=>{let n,r=f(),i=indexedDB.open(r,2);i.onupgradeneeded=()=>{let e=i.result;if(!e.objectStoreNames.contains(`messages`)){let t=e.createObjectStore(`messages`,{keyPath:`id`});t.createIndex(`by-group-time`,[`groupId`,`timestamp`]),t.createIndex(`by-group`,`groupId`)}if(e.objectStoreNames.contains(`sessions`)||e.createObjectStore(`sessions`,{keyPath:`groupId`}),!e.objectStoreNames.contains(`tasks`)){let t=e.createObjectStore(`tasks`,{keyPath:`id`});t.createIndex(`by-group`,`groupId`),t.createIndex(`by-enabled`,`enabled`)}e.objectStoreNames.contains(`config`)||e.createObjectStore(`config`,{keyPath:`key`}),e.objectStoreNames.contains(`pendingShares`)||e.createObjectStore(`pendingShares`,{keyPath:`id`}).createIndex(`by-createdAt`,`createdAt`)},i.onsuccess=async()=>{n=i.result,x(n);try{await Be(n),await Ve(n)}catch(e){console.warn(`Error running legacy migration:`,e)}e(n)},i.onerror=()=>{t(/* @__PURE__ */ Error(`Failed to open IndexedDB: ${i.error?.message}`))}})}var Ue=class{activeGroupId;displayCallback;messageCallback;type;typingCallback;constructor(){this.type=`browser`,this.messageCallback=null,this.typingCallback=null,this.displayCallback=null,this.activeGroupId=m}getActiveGroup(){return this.activeGroupId}onDisplay(e){this.displayCallback=e}onMessage(e){this.messageCallback=e}onTyping(e){this.typingCallback=e}setActiveGroup(e){this.activeGroupId=e}setTyping(e,t){this.typingCallback?.(e,t)}start(){}stop(){}submit(e,t,n=[],r,i,a){let o=t||this.activeGroupId,s={id:A(),groupId:o,sender:`You`,content:e,timestamp:Date.now(),channel:`browser`,attachments:n,a2uiAction:r,freshContext:i,subagent:a};this.messageCallback?.(s)}async send(e,t,n){this.displayCallback?.(e,t,!0)}},G=class{_entries;constructor(){this._entries=[]}find(e){return this.resolve(e)?.channel??null}get(e){return this._entries.find(t=>t.prefix===e)?.channel}getBadge(e){return this.resolve(e)?.badge??``}getChannelType(e){return this.resolve(e)?.channel.type??null}onMessage(e){for(let t of this._entries)t.channel.onMessage(e)}onTyping(e){for(let t of this._entries)t.channel.onTyping&&t.channel.onTyping(e)}prefixes(){return this._entries.map(e=>e.prefix)}register(e,t,n){let r=typeof n==`string`?{badge:n}:n??{};this._entries.push({prefix:e,channel:t,badge:r.badge??e.replace(/:$/,``),autoTrigger:r.autoTrigger??!1}),this._entries.sort((e,t)=>t.prefix.length-e.prefix.length)}resolve(e){for(let t of this._entries)if(e.startsWith(t.prefix))return t;return null}shouldAutoTrigger(e){return this.resolve(e)?.autoTrigger??!1}startAll(){for(let e of this._entries)e.channel.start()}stopAll(){for(let e of this._entries)e.channel.stop()}},We=class{abortController=null;apiKey=``;apiMode=`unknown`;cursor=null;fileReader=null;messageCallback=null;reconnectDelayMs=1e3;registeredChatIds=/* @__PURE__ */ new Set;running=!1;seenMessageIds=/* @__PURE__ */ new Map;serverUrl=``;type=`imessage`;configure(e,t,n){this.serverUrl=Ge(e),this.apiKey=t.trim(),this.registeredChatIds=new Set(n.map(e=>e.trim()).filter(Boolean)),this.cursor=null,this.apiMode=`unknown`}handleIncomingMessage(e){this.pruneSeenMessageIds();let t=String(e.chatId||e.conversationId||``).trim();if(!t||this.registeredChatIds.size>0&&!this.registeredChatIds.has(t))return;let n=`${e.text||e.body||``}`.trim();if(!n)return;let r=`${e.id||e.guid||`${t}:${e.timestamp||e.createdAt||n}`}`;if(this.seenMessageIds.has(r))return;this.seenMessageIds.set(r,Date.now());let i={id:r,groupId:`im:${t}`,sender:`${e.sender||e.handle||e.from||`iMessage`}`,content:n,timestamp:K(e.timestamp||e.createdAt),channel:`imessage`};this.messageCallback?.(i)}handlePollResponse(e){e.nextCursor!==void 0&&e.nextCursor!==null?this.cursor=String(e.nextCursor):e.cursor!==void 0&&e.cursor!==null&&(this.cursor=String(e.cursor));let t=Array.isArray(e.messages)?e.messages:[];for(let e of t)this.handleIncomingMessage(e)}isConfigured(){return this.serverUrl.length>0}onMessage(e){this.messageCallback=e}pruneSeenMessageIds(){let e=Date.now();for(let[t,n]of this.seenMessageIds.entries())e-n>6e4&&this.seenMessageIds.delete(t)}setTyping(e,t){if(!t)return;let n=e.replace(/^im:/,``);this.requestJson(`/messages/typing`,{method:`POST`,body:JSON.stringify({chatId:n,typing:!0})}).catch(()=>{})}start(){this.isConfigured()&&!this.running&&(this.running=!0,this.abortController=new AbortController,this.poll())}ensureConnected(){this.isConfigured()&&this.running&&(this.reconnectDelayMs=1e3,this.abortController?.abort(),this.abortController=new AbortController,this.poll())}stop(){this.running=!1,this.abortController?.abort(),this.abortController=null}async ensureApiMode(){if(this.apiMode!==`unknown`)return this.apiMode;try{await this.requestJson(`/v1/info`,{method:`GET`}),this.apiMode=`beeper-desktop`}catch{this.apiMode=`legacy`}return this.apiMode}async poll(){for(;this.running&&this.abortController&&!this.abortController.signal.aborted;)try{let e=new URLSearchParams({timeout:`25`});this.cursor&&e.set(`cursor`,this.cursor);let t=await this.requestJson(`/messages?${e.toString()}`,{method:`GET`},d+5e3,this.abortController.signal);this.reconnectDelayMs=1e3,this.handlePollResponse(t)}catch(e){if(e instanceof Error&&e.name===`AbortError`)break;console.error(`iMessage bridge poll error:`,e),await Ke(this.reconnectDelayMs),this.reconnectDelayMs=Math.min(this.reconnectDelayMs*2,3e4)}}async requestJson(e,t,n=d,r){let i=new AbortController,a=setTimeout(()=>i.abort(),n),o=()=>i.abort();r?.addEventListener(`abort`,o,{once:!0});try{let n=new Headers(t.headers);n.set(`Accept`,`application/json`),!n.has(`Content-Type`)&&t.body&&!(t.body instanceof FormData)&&n.set(`Content-Type`,`application/json`),this.apiKey&&(n.set(`Authorization`,`Bearer ${this.apiKey}`),n.set(`X-API-Key`,this.apiKey));let r=await fetch(`${this.serverUrl}${e}`,{...t,headers:n,signal:i.signal});if(!r.ok){let e=await r.text();throw Error(`iMessage bridge request failed: ${r.status} ${e}`)}return r.status===204?{messages:[]}:await r.json()}finally{clearTimeout(a),r?.removeEventListener(`abort`,o)}}async send(e,t,n){let r=e.replace(/^im:/,``),{remainingText:i,attachments:a}=qe(t);for(let t of a)if(!this.fileReader)await this.sendText(r,`[${t.alt}] (file: ${t.path})`);else try{let n=await this.fileReader(e,t.path);if(!n||n.size===0)throw Error(`Attachment file is empty or unavailable.`);await this.sendAttachment(r,n,t)}catch(e){console.warn(`iMessage attachment send failed for ${t.path}:`,e),await this.sendText(r,`[${t.alt}] (file: ${t.path})`)}let o=i.trim();o&&await this.sendText(r,o)}async sendAttachment(e,t,n){await this.ensureApiMode()===`beeper-desktop`?await this.sendAttachmentViaBeeperDesktop(e,t,n):await this.sendAttachmentViaLegacyBridge(e,t,n)}async sendAttachmentViaBeeperDesktop(e,t,n){let r=n.path.split(`/`).pop()||`attachment.bin`,i=new FormData;i.append(`file`,t,r),i.append(`fileName`,r),t.type&&i.append(`mimeType`,t.type);let a=`${(await this.requestJson(`/v1/assets/upload`,{method:`POST`,body:i})).uploadID||``}`.trim();if(!a)throw Error(`Beeper asset upload failed: missing uploadID`);await this.requestJson(`/v1/chats/${encodeURIComponent(e)}/messages`,{method:`POST`,body:JSON.stringify({text:n.alt||void 0,attachment:{uploadID:a,fileName:r,mimeType:t.type||void 0}})})}async sendAttachmentViaLegacyBridge(e,t,n){let r=n.path.split(`/`).pop()||`attachment.bin`,i=new FormData;i.append(`chatId`,e),n.alt&&i.append(`text`,n.alt),i.append(`file`,t,r),await this.requestJson(`/messages/send`,{method:`POST`,body:i})}async sendText(e,t){await this.ensureApiMode()===`beeper-desktop`?await this.requestJson(`/v1/chats/${encodeURIComponent(e)}/messages`,{method:`POST`,body:JSON.stringify({text:t})}):await this.requestJson(`/messages/send`,{method:`POST`,body:JSON.stringify({chatId:e,text:t})})}};function Ge(e){return e.trim().replace(/\/+$/,``)}function K(e){if(typeof e==`number`&&Number.isFinite(e))return e>0xe8d4a51000?e:e*1e3;if(typeof e==`string`){let t=Number(e);if(Number.isFinite(t))return K(t);let n=Date.parse(e);if(Number.isFinite(n))return n}return Date.now()}function Ke(e){return new Promise(t=>setTimeout(t,e))}function qe(e){let t=[],n=/!?\[([^\]]*)\]\(([^)]+)\)/g,r=null,i=e;for(;(r=n.exec(e))!==null;){let e=r[1]||``,n=Je((r[2]||``).trim());n&&(t.push({alt:e,path:n}),i=i.replace(r[0],``))}return{remainingText:i,attachments:t}}function Je(e){if(!e)return null;let t=e.trim();if(/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(t)||t.startsWith(`//`))return null;let n=t.replace(/\\/g,`/`).replace(/^\/+/,``).replace(/^\.\//,``);if(!n)return null;let r=n.split(`/`).filter(Boolean);return r.some(e=>e===`..`)?null:r.join(`/`)}var Ye=class{messageCallback=null;running=!1;type=`room`;typingCallback=null;_manager=null;_peerjs=null;deliverInbound(e){this.messageCallback?.(e)}onMessage(e){this.messageCallback=e}onTyping(e){this.typingCallback=e}setManager(e){this._manager=e}setPeerJs(e){this._peerjs=e}setTyping(e,t){}start(){this.running=!0}stop(){this.running=!1}async send(e,t,n){if(!this._manager)return;let r=z(e);if(n&&n.length>0&&this._peerjs){let t=this._manager.get(r);t&&await this._peerjs.sendAttachmentsToRoom(t,e,n)}this._manager.broadcast(r,t,n)}};const q=1e3;var Xe=class{abortController=null;fileReader=null;messageCallback=null;offset=0;pollRetryDelayMs=q;pollSessionId=0;registeredChatIds=/* @__PURE__ */ new Set;running=!1;token=``;type=`telegram`;useProxy=!1;buildFileUrl(e){let t=e.split(`/`).filter(Boolean).map(e=>encodeURIComponent(e)).join(`/`);return`${this.useProxy?`/telegram/file/bot`:`https://api.telegram.org/file/bot`}${this.token}/${t}`}buildMethodUrl(e){let n=e.replace(/^\/+/,``);return`${this.useProxy?t:c}${this.token}/${n}`}configure(e,t,n=!1){this.token=e.trim(),this.registeredChatIds=new Set(t.map(e=>e.trim()).filter(Boolean)),this.useProxy=!!n}isConfigured(){return this.token.length>0}nextPollRetryDelay(){let e=this.pollRetryDelayMs;return this.pollRetryDelayMs=Math.min(this.pollRetryDelayMs*2,6e4),e}onMessage(e){this.messageCallback=e}registerChatId(e){let t=e.trim();t&&this.registeredChatIds.add(t)}resetPollBackoff(){this.pollRetryDelayMs=q}setTyping(e,t){if(!t)return;let n=e.replace(/^tg:/,``);this.apiCall(`sendChatAction`,{chat_id:n,action:`typing`}).catch(()=>{})}start(){if(!this.token||this.running)return;this.running=!0,this.resetPollBackoff();let e=++this.pollSessionId,t=new AbortController;this.abortController=t,this.poll(e,t)}ensureConnected(){if(!this.token||!this.running)return;this.resetPollBackoff(),this.abortController?.abort();let e=++this.pollSessionId,t=new AbortController;this.abortController=t,this.poll(e,t)}stop(){this.running=!1,this.resetPollBackoff(),this.pollSessionId+=1,this.abortController?.abort(),this.abortController=null}async apiCall(e,t){let n=await fetch(this.buildMethodUrl(e),{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify(t)});if(!n.ok){let t=await n.text();throw Error(`Telegram API ${e} failed: ${n.status} ${t}`)}return await n.json()}async extractAttachments(e){let t=[],n=Array.isArray(e.photo)?e.photo.at(-1):null;n?.file_id&&t.push({id:n.file_id,fileName:`photo-${e.message_id}.png`,mimeType:`image/png`,previewDisposition:`inline`}),e.document?.file_id&&t.push({id:e.document.file_id,fileName:e.document.file_name||`document-${e.message_id}`,mimeType:e.document.mime_type}),e.video?.file_id&&t.push({id:e.video.file_id,fileName:e.video.file_name||`video-${e.message_id}.mp4`,mimeType:e.video.mime_type||`video/mp4`}),e.audio?.file_id&&t.push({id:e.audio.file_id,fileName:e.audio.file_name||`audio-${e.message_id}.mp3`,mimeType:e.audio.mime_type||`audio/mpeg`}),e.voice?.file_id&&t.push({id:e.voice.file_id,fileName:`voice-${e.message_id}.ogg`,mimeType:e.voice.mime_type||`audio/ogg`}),e.animation?.file_id&&t.push({id:e.animation.file_id,fileName:e.animation.file_name||`animation-${e.message_id}.mp4`,mimeType:e.animation.mime_type||`video/mp4`}),e.sticker?.file_id&&t.push({id:e.sticker.file_id,fileName:`sticker-${e.message_id}.${$e(e.sticker)}`,mimeType:e.sticker.is_animated?`application/x-tgsticker`:e.sticker.is_video?`video/webm`:`image/webp`});let r=[];for(let e of t){let t=await this.fetchTelegramFileInfo(e.id);r.push({id:e.id,fileName:e.fileName,mimeType:e.mimeType,size:t.file_size,previewDisposition:e.previewDisposition,source:{kind:`remote-url`,url:this.buildFileUrl(t.file_path)}})}return r}async fetchTelegramFileInfo(e){let t=await this.apiCall(`getFile`,{file_id:e});if(!t.ok||!t.result?.file_path)throw Error(`Telegram getFile failed for attachment ${e}`);return t.result}async handleUpdate(e){let t=e.message;if(!t)return;let n=String(t.chat.id);if(t.text===`/chatid`){this.apiCall(`sendMessage`,{chat_id:n,text:`Chat ID: ${n}\nRegister this ID in ShadowClaw settings.`}).catch(console.error);return}if(t.text===`/ping`){this.apiCall(`sendMessage`,{chat_id:n,text:`Pong! ShadowClaw is running.`}).catch(console.error);return}if(!this.registeredChatIds.has(n))return;let r=await this.extractAttachments(t),i=`${t.text||t.caption||``}`.trim()||(t.photo?.length?`[Photo]`:null)||(t.voice?`[Voice message]`:null)||(t.video?`[Video]`:null)||(t.audio?`[Audio]`:null)||(t.animation?`[Animation]`:null)||(t.document?`[Document: ${t.document.file_name||`unnamed`}]`:null)||(t.sticker?`[Sticker: ${t.sticker.emoji||``}]`:null)||(t.location?`[Location: ${t.location.latitude}, ${t.location.longitude}]`:null)||(t.contact?`[Contact: ${t.contact.first_name}]`:null)||`[Unsupported message type]`,a=t.from?.first_name||t.from?.username||String(t.from?.id||`Unknown`),o={id:String(t.message_id),groupId:`tg:${n}`,sender:a,content:i,timestamp:t.date*1e3,channel:`telegram`,attachments:r};this.messageCallback?.(o)}async poll(e,t){for(;this.running&&this.pollSessionId===e&&!t.signal.aborted;)try{let e=await fetch(this.buildMethodUrl(`getUpdates?offset=${this.offset}&timeout=30`),{signal:t.signal});if(!e.ok){console.error(`Telegram poll error: HTTP ${e.status}`),await this.waitForRetry(this.nextPollRetryDelay());continue}let n=await e.json();if(!n.ok||!Array.isArray(n.result)){await this.waitForRetry(this.nextPollRetryDelay());continue}this.resetPollBackoff();for(let e of n.result)this.offset=e.update_id+1,await this.handleUpdate(e)}catch(e){if(e instanceof Error&&e.name===`AbortError`)break;console.error(`Telegram poll error:`,e),await this.waitForRetry(this.nextPollRetryDelay())}}async send(e,t,r){let i=e.replace(/^tg:/,``),{remainingText:a,attachments:o}=et(t);for(let t of o){if(this.fileReader)try{let n=await this.fileReader(e,t.path);if(n&&n.size>0){let e=t.path.toLowerCase();e.endsWith(`.png`)||e.endsWith(`.jpg`)||e.endsWith(`.jpeg`)||e.endsWith(`.gif`)||e.endsWith(`.webp`)?await this.sendPhoto(i,n,t.alt,t.path):await this.sendDocument(i,n,t.alt,t.path);continue}}catch(e){console.warn(`TelegramChannel: failed to read file ${t.path}:`,e)}await this.apiCall(`sendMessage`,{chat_id:i,text:`[${t.alt}] (file: ${t.path})`})}let s=a.trim();if(s){let e=Ze(s,n);for(let t of e)await this.apiCall(`sendMessage`,{chat_id:i,text:t})}}async sendDocument(e,t,n,r){let i=r.split(`/`).pop()||`document.file`,a=new FormData;a.append(`chat_id`,e),a.append(`document`,t,i),n&&a.append(`caption`,n);let o=await fetch(this.buildMethodUrl(`sendDocument`),{method:`POST`,body:a});if(!o.ok){let e=await o.text();throw Error(`Telegram sendDocument failed: ${o.status} ${e}`)}}async sendPhoto(e,t,n,r){let i=r.split(`/`).pop()||`image.png`,a=new FormData;a.append(`chat_id`,e),a.append(`photo`,t,i),n&&a.append(`caption`,n);let o=await fetch(this.buildMethodUrl(`sendPhoto`),{method:`POST`,body:a});if(!o.ok){let e=await o.text();throw Error(`Telegram sendPhoto failed: ${o.status} ${e}`)}}async waitForRetry(e){await Qe(e)}};function Ze(e,t){if(e.length<=t)return[e];let n=[],r=e;for(;r.length>0;){if(r.length<=t){n.push(r);break}let e=t,i=r.lastIndexOf(`
2
2
  `,t);i>t*.5&&(e=i),n.push(r.slice(0,e)),r=r.slice(e)}return n}function Qe(e){return new Promise(t=>setTimeout(t,e))}function $e(e){return e?.is_animated?`tgs`:e?.is_video?`webm`:`webp`}function et(e){let t=[],n=/!?\[([^\]]*)\]\(([^)]+)\)/g,r,i=e;for(;(r=n.exec(e))!==null;){let e=r[1],n=tt((r[2]||``).trim());n&&(t.push({alt:e,path:n}),i=i.replace(r[0],``))}return{remainingText:i,attachments:t}}function tt(e){if(!e)return null;let t=e.trim();if(/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(t)||t.startsWith(`//`))return null;let n=t.replace(/\\/g,`/`).replace(/^\/+/,``).replace(/^\.\//,``);if(!n)return null;let r=n.split(`/`).filter(Boolean);return r.some(e=>e===`..`)?null:r.join(`/`)}function J(e,t){let n=JSON.stringify(e.dataModel??{},null,2),r=t?`${t}`:`The user`;return`[A2UI ACTION]\nsurfaceId: "${e.surfaceId}"\nactionId: "${e.actionId}"\n`+(t?`firedBy: "${t}"\n`:``)+`dataModel:\n${n}\n\nInstructions: ${r} triggered the "${e.actionId}" action on surface "${e.surfaceId}". The dataModel above contains the current form values. Use the appropriate tool(s) to fulfill the action based on the actionId and dataModel values. After you have a result, call render_component with action "updateDataModel" on surfaceId "${e.surfaceId}" to update the surface (e.g. set path "/result" to the output value). Do NOT respond with plain text only — always update the surface via render_component.`}var nt=class{static formatMessagesXml(e){let t=e=>e.replace(/&/g,`&amp;`).replace(/</g,`&lt;`).replace(/>/g,`&gt;`).replace(/"/g,`&quot;`);return`<messages>\n${e.map(e=>`<message sender="${t(e.sender)}" time="${new Date(e.timestamp).toISOString()}">${t(e.content)}</message>`).join(`
3
- `)}\n</messages>`}static formatOutbound(e){return e.replace(/<internal>[\s\S]*?<\/internal>/g,``).trim()}registry;constructor(e){this.registry=e}findChannel(e){return this.registry.find(e)}setTyping(e,t){this.findChannel(e)?.setTyping(e,t)}async send(e,t,n){let r=this.findChannel(e);r?await r.send(e,t,n):console.warn(`No channel for groupId: ${e}`)}};function rt(e,t,n){if(!e.enabledChannelTypes.includes(n.channel))return null;let r=n.content.trim(),i=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),a=r;if(e.requireMention){let e=RegExp(`^@${i}\\b\\s*(?:-|:)?\\s*`,`i`);if(!e.test(a))return null;a=a.replace(e,``).trim()}let o=a.match(/^\/([a-zA-Z0-9_]+)(?:\s+([\s\S]+))?$/);if(!o)return null;let s=o[1];if(!e.allowedTools.includes(s))return null;let c=(o[2]||``).trim();if(!c)return{toolName:s,input:{}};let l=c.startsWith(`'`)&&c.endsWith(`'`)||c.startsWith(`"`)&&c.endsWith(`"`)?c.slice(1,-1).trim():c;try{let e=JSON.parse(l);return e&&typeof e==`object`?{toolName:s,input:e}:null}catch{return null}}function it(e,t){let n=e.trim().match(/^\/([a-z0-9](?:[a-z0-9]|-(?!-))*[a-z0-9]|[a-z0-9])(?:\s+([\s\S]+))?$/u);if(!n)return null;let r=t.find(e=>e.name===n[1]&&e.userInvocable!==!1);return r?{skill:r,arguments:(n[2]||``).trim()}:null}async function Y(e,t,n){if(n.a2uiEnvelopes&&n.a2uiEnvelopes.length>0)for(let t of n.a2uiEnvelopes)e.events.emit(`a2ui-surface`,{groupId:n.groupId,envelope:t});n.a2uiAction&&e.events.emit(`a2ui-action`,{groupId:n.groupId,action:n.a2uiAction});let r=!!n.content,i=(n.attachments?.length??0)>0;if(!r&&!i&&(n.a2uiEnvelopes?.length??0)>0)return;let a=rt(e.directToolCommandPolicy,e.assistantName,n),o=a?null:it(n.content,(await Fe(t,n.groupId)).skills),s=n.channel===`browser`,c=e.channelRegistry.shouldAutoTrigger(n.groupId),l=!1;(n.channel===`browser`||n.groupId.startsWith(`room:`))&&(l=e.triggerPattern.test(n.content.trim())),o&&(l=!0),s&&n.groupId.startsWith(`peer:`)&&e.peerCompletedContexts.delete(n.groupId);let u=!!a;if(!l&&e.peerjsMyPeerId){if(n.content.includes(`@${e.peerjsMyPeerId}`))l=!0;else if(e.peerjsMyAlias&&n.content.includes(`@${e.peerjsMyAlias}`))l=!0;else for(let[t,r]of Object.entries(e.peerjsPeerAliases))if(r===e.peerjsMyPeerId&&n.content.includes(`@${t}`)){l=!0;break}}n.content.trim().startsWith(`[SCHEDULED TASK]`)&&(l=!0),n.content.trim().startsWith(`[A2UI ACTION]`)&&(l=!0);let d=!1;d=u||l?!0:s?!(n.groupId.startsWith(`peer:`)||n.groupId.startsWith(`room:`)):c,d&&!s&&!o&&n.groupId.startsWith(`peer:`)&&e.peerCompletedContexts.has(n.groupId)&&(d=!1);let f=await De(t,n.groupId,n.attachments||[]),p={...n,attachments:f,isFromMe:!1,isTrigger:d};if(d&&!u&&!o?.skill.execution&&e.messageQueue.push(o?{...n,content:`[SKILL COMMAND] Activate the "${o.skill.name}" skill and follow its instructions.\n${o.arguments}`}:n),await w(t,p),e.events.emit(`message`,p),o?.skill.execution){if(await e.ensureWorkerReady?.(),!e.agentWorker)throw Error(`Worker is not initialized.`);let t=o.skill.execution.tools.map(e=>{let t=e.input&&typeof e.input==`object`?{...e.input}:{};return o.arguments&&Object.keys(t).length===0&&(t.rawInput=o.arguments),{...e,input:t}});e.agentWorker.postMessage({type:`execute-skill-tools`,payload:{groupId:n.groupId,skillName:o.skill.name,tools:t}})}else if(n.channel===`peerjs`&&xe(n.groupId),s&&(n.groupId.startsWith(`peer:`)||n.groupId.startsWith(`room:`))&&e.router?.send(n.groupId,n.content,f).catch(e=>{console.error(`Failed to route browser message to peer:`,e)}),a){if(await e.ensureWorkerReady?.(),!e.agentWorker)throw Error(`Worker is not initialized.`);e.agentWorker.postMessage({type:`execute-direct-tool`,payload:{groupId:n.groupId,name:a.toolName,input:a.input}})}else X(e,t)}async function X(e,t){if(e.processing||e.messageQueue.length===0)return;let n=e.messageQueue[0]?.groupId,i=e.providerConfig,a=e.provider;if(n)try{let e=(await te(t)).find(e=>e.groupId===n);if(e?.pinnedProvider){let t=r(e.pinnedProvider);t&&(i=t,a=e.pinnedProvider)}}catch{}let o=i?.requiresApiKey!==!1,s=!0;if(o&&(s=a===e.provider?!!await le(e):!!await e.getApiKeyForSpecificProvider(t,a)),o&&!s){let t=`API key not configured. Go to Settings to add your API key.`;e.events.emit(`provider-help`,{providerId:a,reason:t,helpType:_e(a,t,o)});let n=e.messageQueue.shift();e.events.emit(`error`,{groupId:n.groupId,error:t});return}e.processing=!0;let c=e.messageQueue.shift();try{let{invokeAgent:n}=await import(`./invoke-agent-B3Osw6K7.js`);await n(e,t,c.groupId,c.content,c.freshContext,c.subagent)}catch(e){console.error(`Failed to invoke agent:`,e)}finally{e.processing=!1,e.messageQueue.length>0&&X(e,t)}}var at=class{listeners;constructor(){this.listeners=/* @__PURE__ */ new Map}emit(e,t){this.listeners.get(e)?.forEach(e=>e(t))}off(e,t){this.listeners.get(e)?.delete(t)}on(e,t){this.listeners.has(e)||this.listeners.set(e,/* @__PURE__ */ new Set),this.listeners.get(e)?.add(t)}};function Z(e,t){return{jsonrpc:`2.0`,method:e,params:t}}var ot=class{static isRoomMethod(e){return e===V.JOIN||e===V.ROSTER||e===V.LEAVE||e===V.MESSAGE||e===V.INVITE||e===V.RELAY||e===V.A2UI||e===V.A2UI_ACTION}roomsSignal=new ee.State([]);_opts;_rooms=/* @__PURE__ */ new Map;_seen=/* @__PURE__ */ new Map;_surfaceOwners=/* @__PURE__ */ new Map;constructor(e){this._opts=e}broadcast(e,t,n){let r=this._rooms.get(e);if(!r)return null;let i=this._opts.getLocalMember(),a=A(),o={roomId:e,messageId:a,senderPeerId:i.peerId,senderAlias:i.alias,text:t,attachments:n?.map(e=>({fileName:e.fileName,mimeType:e.mimeType,path:e.path,size:e.size}))};return this._markSeen(e,a),this._deliverToMembers(r,Z(V.MESSAGE,o)),a}broadcastA2UI(e,t){let n=this._rooms.get(e);if(!n)return null;let r=this._myPeerId;this._surfaceOwners.set(t.surfaceId,r);let i=A(),a={roomId:e,broadcastId:i,ownerPeerId:r,senderPeerId:r,envelope:t};return this._markSeen(e,i),this._deliverToMembers(n,Z(V.A2UI,a)),i}broadcastA2UIAction(e,t){let n=this._rooms.get(e);if(!n)return null;let r=this._opts.getLocalMember(),i=this._surfaceOwners.get(t.surfaceId)??``,a=A(),o={roomId:e,broadcastId:a,ownerPeerId:i,senderPeerId:r.peerId,senderAlias:r.alias,action:t};return this._markSeen(e,a),this._deliverToMembers(n,Z(V.A2UI_ACTION,o)),a}createRoom(e){let t=this._opts.getLocalMember(),n={roomId:A(),name:e,hostPeerId:t.peerId,members:[t],createdAt:Date.now()};return this._save(n),n}get(e){return this._rooms.get(e)??null}getSurfaceOwner(e){return this._surfaceOwners.get(e)}handleNotification(e,t,n){switch(t){case V.JOIN:this._onJoin(e,n);break;case V.ROSTER:this._onRoster(n);break;case V.LEAVE:this._onLeave(e,n);break;case V.MESSAGE:this._onMessage(n);break;case V.INVITE:this._opts.onInvite?.(n);break;case V.RELAY:this._onRelay(n);break;case V.A2UI:this._onA2UI(n);break;case V.A2UI_ACTION:this._onA2UIAction(n)}}invite(e,t){let n=this._rooms.get(e);if(!n)return!1;let r=this._opts.getLocalMember(),i={roomId:e,roomName:n.name,hostPeerId:n.hostPeerId,fromPeerId:r.peerId,fromAlias:r.alias},a=this._opts.transport;return a.connectToPeer(t),a.sendToPeer(t,Z(V.INVITE,i))}isHost(e){let t=this._rooms.get(e);return!!t&&t.hostPeerId===this._myPeerId}joinRoom(e,t,n){let r=this._opts.getLocalMember(),i=this._rooms.get(e)??{roomId:e,name:n,hostPeerId:t,members:[{peerId:t,alias:t,kind:`agent`},r],createdAt:Date.now()};this._save(i);let a=this._opts.transport;a.connectToPeer(t);let o={roomId:e,member:r};return a.sendToPeer(t,Z(V.JOIN,o)),i}leaveRoom(e){let t=this._rooms.get(e);if(!t)return;let n=this._myPeerId;if(t.hostPeerId===n){let r={roomId:e,peerId:n,disbanded:!0};this._deliverToMembers(t,Z(V.LEAVE,r))}else{let r={roomId:e,peerId:n};this._opts.transport.sendToPeer(t.hostPeerId,Z(V.LEAVE,r))}this._rooms.delete(e),this._seen.delete(e),this._opts.removeRoom?.(e),this._publish()}list(){return Array.from(this._rooms.values())}loadRooms(e){this._rooms.clear();for(let t of e)this._rooms.set(t.roomId,t);this._publish()}_broadcastRoster(e){let t={roomId:e.roomId,name:e.name,hostPeerId:e.hostPeerId,members:e.members};this._deliverToMembers(e,Z(V.ROSTER,t))}_deliverToMembers(e,t){let n=this._myPeerId;for(let r of e.members)r.peerId!==n&&this._deliverToPeer(e,r.peerId,t)}_deliverToPeer(e,t,n){let r=this._opts.transport;if(r.isConnected(t)){r.sendToPeer(t,n);return}let i=this._myPeerId;if(e.hostPeerId!==i&&e.hostPeerId!==t&&r.isConnected(e.hostPeerId)){let i={roomId:e.roomId,targetPeerId:t,inner:n};r.sendToPeer(e.hostPeerId,Z(V.RELAY,i)),r.connectToPeer(t)}else r.connectToPeer(t),r.sendToPeer(t,n)}_hasSeen(e,t){return this._seen.get(e)?.has(t)??!1}_markSeen(e,t){let n=this._seen.get(e);if(n||(n=/* @__PURE__ */ new Set,this._seen.set(e,n)),n.add(t),n.size>500){let e=n.values().next().value;e!==void 0&&n.delete(e)}}get _myPeerId(){return this._opts.transport.myPeerId}_onA2UI(e){if(!e||typeof e.roomId!=`string`||typeof e.broadcastId!=`string`||!e.envelope||!this._rooms.get(e.roomId)||this._hasSeen(e.roomId,e.broadcastId))return;this._markSeen(e.roomId,e.broadcastId);let t=e.envelope.surfaceId;this._surfaceOwners.get(t)!==this._myPeerId&&this._surfaceOwners.set(t,e.ownerPeerId);let n={id:e.broadcastId,groupId:B(e.roomId),sender:e.senderPeerId,content:``,timestamp:Date.now(),channel:`room`,a2uiEnvelopes:[e.envelope]};this._opts.onMessage(n)}_onA2UIAction(e){if(!e||typeof e.roomId!=`string`||typeof e.broadcastId!=`string`||!e.action||!this._rooms.get(e.roomId)||this._hasSeen(e.roomId,e.broadcastId)||(this._markSeen(e.roomId,e.broadcastId),this._surfaceOwners.get(e.action.surfaceId)!==this._myPeerId))return;let t={id:e.broadcastId,groupId:B(e.roomId),sender:e.senderAlias||e.senderPeerId,content:J(e.action,e.senderAlias),timestamp:Date.now(),channel:`room`,a2uiAction:e.action};this._opts.onMessage(t)}_onJoin(e,t){if(!t||typeof t.roomId!=`string`)return;let n=this._rooms.get(t.roomId);if(!n||n.hostPeerId!==this._myPeerId)return;let r=t.member??{peerId:e,alias:e,kind:`human`};r.peerId=e;let i=n.members.findIndex(t=>t.peerId===e);i>=0?n.members[i]=r:n.members.push(r),this._save(n),this._broadcastRoster(n)}_onLeave(e,t){if(!t||typeof t.roomId!=`string`)return;let n=this._rooms.get(t.roomId);n&&(t.disbanded?(this._rooms.delete(t.roomId),this._seen.delete(t.roomId),this._opts.removeRoom?.(t.roomId),this._publish()):n.hostPeerId===this._myPeerId&&(n.members=n.members.filter(n=>n.peerId!==(t.peerId||e)),this._save(n),this._broadcastRoster(n)))}_onMessage(e){if(!e||typeof e.roomId!=`string`||typeof e.messageId!=`string`||!this._rooms.get(e.roomId)||this._hasSeen(e.roomId,e.messageId))return;this._markSeen(e.roomId,e.messageId);let t={id:e.messageId,groupId:B(e.roomId),sender:e.senderAlias||e.senderPeerId,content:e.text??``,timestamp:Date.now(),channel:`room`,attachments:e.attachments?.map(e=>({fileName:e.fileName,mimeType:e.mimeType,path:e.path,size:e.size}))};this._opts.onMessage(t)}_onRelay(e){e&&typeof e.targetPeerId==`string`&&e.inner&&this.isHost(e.roomId)&&this._opts.transport.sendToPeer(e.targetPeerId,e.inner)}_onRoster(e){if(!e||typeof e.roomId!=`string`)return;let t=this._rooms.get(e.roomId),n={roomId:e.roomId,name:e.name??t?.name??e.roomId,hostPeerId:e.hostPeerId,members:Array.isArray(e.members)?e.members:[],createdAt:t?.createdAt??Date.now()};this._save(n)}_publish(){this.roomsSignal.set(this.list())}_save(e){this._rooms.set(e.roomId,e),this._opts.persistRoom?.(e),this._publish()}};function st(e){return e&&S(e)?Promise.resolve().then(()=>(e.db.prepare(`SELECT * FROM tasks WHERE enabled = 1`).all()??[]).map(e=>({...e,enabled:!0,tools:e.tools?JSON.parse(e.tools):void 0}))):new Promise(async(t,n)=>{try{let r=e??await b();if(!r)return n(/* @__PURE__ */ Error(`failed to get transaction, cannot get enabled tasks.`));let i=r.transaction(`tasks`,`readonly`);if(!i)return n(/* @__PURE__ */ Error(`failed to get transaction`));let a=i.objectStore(`tasks`).index(`by-enabled`).getAll(1);a.onsuccess=()=>{t(a.result.map(e=>({...e,enabled:!0})))},a.onerror=()=>n(a.error)}catch(e){n(e)}})}function ct(e,t){if(typeof e!=`string`||!e.trim())return!1;let n=e.trim().split(/\s+/);if(n.length!==5)return!1;let[r,i,a,o,s]=n;return Q(r,t.getMinutes())&&Q(i,t.getHours())&&Q(a,t.getDate())&&Q(o,t.getMonth()+1)&&Q(s,t.getDay())}function Q(e,t){return e===`*`||e.split(`,`).some(e=>{if(e.includes(`/`)){let[n,r]=e.split(`/`),i=parseInt(r,10);if(isNaN(i)||i<=0)return!1;if(n===`*`)return t%i===0;if(n.includes(`-`)){let[e,r]=n.split(`-`).map(Number);return t>=e&&t<=r&&(t-e)%i===0}let a=parseInt(n,10);return t>=a&&(t-a)%i===0}if(e.includes(`-`)){let[n,r]=e.split(`-`).map(Number);return t>=n&&t<=r}return parseInt(e,10)===t})}var lt=class{interval=null;onTaskChange;runner;shouldDefer;constructor(e,t,n){this.runner=e,this.onTaskChange=t,this.shouldDefer=n}ranThisMinute(e,t){if(!e.lastRun)return!1;let n=new Date(e.lastRun);return n.getFullYear()===t.getFullYear()&&n.getMonth()===t.getMonth()&&n.getDate()===t.getDate()&&n.getHours()===t.getHours()&&n.getMinutes()===t.getMinutes()}start(){this.interval||(this.interval=setInterval(()=>this.tick(),v),this.tick())}stop(){this.interval&&=(clearInterval(this.interval),null)}async tick(){try{let e=await st(),t=/* @__PURE__ */ new Date;for(let n of e){let e=n.schedule||``;if(e!==``&&ct(e,t)&&!this.ranThisMinute(n,t)){if(this.shouldDefer&&await this.shouldDefer(n))continue;await ie(n.id,t.getTime()),this.onTaskChange?.(),this.runner(n).catch(e=>{console.error(`Task ${n.id} failed:`,e)})}}}catch(e){console.error(`Scheduler tick error:`,e)}}};async function ut(e,t){e.channelEnabledByType.telegram=await R(`telegram`,t),e.channelEnabledByType.imessage=await R(`imessage`,t);let n=await e.loadSecretConfig(t,m.TELEGRAM_BOT_TOKEN),r=E(await C(t,m.TELEGRAM_CHAT_IDS)),i=await C(t,m.TELEGRAM_USE_PROXY)===`true`;e.telegramBotToken=n,e.telegramChatIds=r,e.telegramUseProxy=i,e.telegram.configure(n,r,i);let a=async(e,n)=>{try{let r=await ge(t,e,n),i=new Uint8Array(r.byteLength);i.set(r);let a=n.split(`/`).pop()||n,o=Ee(a);return new Blob([i],{type:o})}catch(e){return console.warn(`Orchestrator: channel fileReader failed for ${n}:`,e),null}};e.telegram.fileReader=a,e.imessage.fileReader=a;let o=(await C(t,m.IMESSAGE_SERVER_URL)||``).trim().replace(/\/+$/,``),s=await e.loadSecretConfig(t,m.IMESSAGE_API_KEY),c=E(await C(t,m.IMESSAGE_CHAT_IDS));e.imessageServerUrl=o,e.imessageApiKey=s,e.imessageChatIds=c,e.imessage.configure(o,s,c),e.channelEnabledByType.peerjs=await R(`peerjs`,t);let l=(await C(t,m.PEERJS_MY_PEER_ID)||``).trim(),u=E(await C(t,m.PEERJS_TRUSTED_PEER_IDS)),d=(await C(t,m.PEERJS_SERVER_HOST)||``).trim(),f=await C(t,m.PEERJS_SERVER_PORT),p=f&&parseInt(f,10)||0,h=(await C(t,m.PEERJS_SERVER_PATH)||``).trim(),g=await C(t,m.PEERJS_SERVER_SECURE)!==`false`,_={},v=await C(t,m.PEERJS_PEER_ALIASES);if(v)try{_=JSON.parse(v)}catch(e){console.warn(`Failed to parse peerjs_peer_aliases`,e)}e.peerjsMyPeerId=l,e.peerjsMyAlias=(await C(t,m.PEERJS_MY_ALIAS)||``).trim(),e.peerjsTrustedPeerIds=u,e.peerjsPeerAliases=_,e.peerjsServerHost=d,e.peerjsServerPort=p,e.peerjsServerPath=h,e.peerjsServerSecure=g;let y=d?{host:d,port:p||void 0,path:h||void 0,secure:g}:{};e.peerjs.configure(l,u,y)}const $={allowedTools:[`clear_chat`,`show_toast`],enabledChannelTypes:[`telegram`],requireMention:!0};function dt(e){if(!e)return{allowedTools:[...$.allowedTools],enabledChannelTypes:[...$.enabledChannelTypes],requireMention:$.requireMention};try{let t=JSON.parse(e),n=Array.isArray(t.enabledChannelTypes)?t.enabledChannelTypes.filter(e=>typeof e==`string`&&e.trim().length>0):$.enabledChannelTypes;return{allowedTools:Array.isArray(t.allowedTools)?t.allowedTools.filter(e=>typeof e==`string`&&e.trim().length>0):$.allowedTools,enabledChannelTypes:n,requireMention:typeof t.requireMention==`boolean`?t.requireMention:$.requireMention}}catch{return{allowedTools:[...$.allowedTools],enabledChannelTypes:[...$.enabledChannelTypes],requireMention:$.requireMention}}}function ft(e,t){typeof navigator<`u`&&navigator.serviceWorker&&((async()=>{try{let e=await M(t);await ye(e)}catch{}})(),navigator.serviceWorker.addEventListener(`message`,n=>{if(n.data?.type===`request-proxy-config`){ne(e);return}if(n.data?.type!==`scheduled-task-trigger`)return;let{taskId:r,groupId:i,prompt:a,taskType:o,tools:s,subscriberId:c}=n.data;i&&(async()=>{if(c){let e=await M(t);if(e&&c!==e){console.warn(`Ignoring push-triggered task ${r}: subscriberId mismatch (${c} !== ${e})`);return}}e.schedulerTriggeredGroups.add(i);try{let t=O.tasks.find(e=>e.id===r);if(t){O.runTask(t);return}if(o===`tools`&&Array.isArray(s)&&s.length>0){O.runTask({id:r||`push-task-${Date.now()}`,groupId:i,createdAt:Date.now(),enabled:!0,prompt:a||``,type:`tools`,tools:s,lastRun:null});return}a&&be(e,a,i)}finally{e.schedulerTriggeredGroups.delete(i)}})().catch(e=>console.error(`Push-triggered task ${r} failed:`,e))}))}function pt(e){return new ot({transport:{get myPeerId(){return e.peerjs.myPeerId||e.peerjsMyPeerId},sendToPeer:(t,n)=>e.peerjs.sendRoomNotification(t,n),isConnected:t=>e.peerjs.isPeerConnected(t),connectToPeer:t=>e.peerjs.connectPeer(t)},getLocalMember:()=>({peerId:e.peerjs.myPeerId||e.peerjsMyPeerId,alias:e.peerjsMyAlias||e.peerjs.myPeerId||e.peerjsMyPeerId||e.assistantName,kind:`agent`,agentName:e.assistantName}),onMessage:t=>e.roomChannel.deliverInbound(t),onInvite:t=>ve(e,t),persistRoom:t=>{e.db&&we(e.db,t).catch(e=>console.error(`Failed to persist room:`,e))},removeRoom:t=>{e.db&&Ce(e.db,t).catch(e=>console.error(`Failed to delete room:`,e))}})}async function mt(e,t){e.initializeChannelRegistry(),e.channelRegistry.onMessage(n=>{Y(e,t,n).catch(e=>{console.error(`Failed to enqueue inbound message:`,e)})}),e.channelRegistry.onTyping((t,n)=>{e.events.emit(`typing`,{groupId:t,typing:n}),t.startsWith(`peer:`)&&O.setRemoteAgentTyping(t,n)}),e.peerjs.onTaskComplete(t=>{e.peerCompletedContexts.add(t)}),await ut(e,t),Se(e);try{let n=await Te(t);e.roomManager.loadRooms(n)}catch(e){console.error(`Failed to load rooms:`,e)}}async function ht(e,t){e.assistantName=await C(t,m.ASSISTANT_NAME)||`ShadowClaw`,e.triggerPattern=o(e.assistantName)}async function gt(e,t){let n=await C(t,m.VM_BOOT_MODE);e.vmBootMode=n===`disabled`||n===`auto`||n===`9p`||n===`ext2`?n:`disabled`,e.streamingEnabled=await C(t,m.STREAMING_ENABLED)!==`false`,e.webMcpToolsEnabled=await C(t,m.WEBMCP_TOOLS_ENABLED)!==`false`,e.vmBashFullInternetAccess=await C(t,m.VM_BASH_FULL_INTERNET_ACCESS)===`true`;let r=await C(t,m.WEBMCP_MODE);(r===`native`||r===`polyfill`)&&ke(r),e.contextCompressionEnabled=await C(t,m.CONTEXT_COMPRESSION_ENABLED)===`true`;let i=await C(t,m.REASONING_EFFORT);e.reasoningEffort=i?i.trim().toLowerCase():`none`,e.directToolCommandPolicy=dt(await C(t,m.DIRECT_TOOL_COMMAND_POLICY)),e.useProxy=await C(t,m.USE_PROXY)===`true`,e.proxyUrl=await C(t,m.PROXY_URL)||`/proxy`,e.gitProxyUrl=await C(t,m.GIT_PROXY_URL)||`/git-proxy`,e.taskServerEnabled=await C(t,m.TASK_SERVER_ENABLED)===`true`,e.taskServerUrl=await C(t,m.TASK_SERVER_URL)||(await import(`./config-C-YdSFZB.js`).then(e=>e.k)).DEFAULT_TASK_SERVER_URL}async function _t(e,t){let n=await C(t,m.LLAMAFILE_MODE);n===`cli`||n===`server`?e.llamafileMode=n:await k(t,m.LLAMAFILE_MODE,e.llamafileMode);let r=await C(t,m.LLAMAFILE_HOST);r&&(e.llamafileHost=r);let i=await C(t,m.LLAMAFILE_PORT);if(i){let t=parseInt(i,10);Number.isFinite(t)&&t>=1&&t<=65535&&(e.llamafilePort=t)}await C(t,m.LLAMAFILE_OFFLINE)===`false`&&(e.llamafileOffline=!1),me(e);let a=await C(t,m.MESH_LLM_HOST);a&&(e.meshLlmHost=a),fe(e)}async function vt(e,t){let[n,i,a,o,c,l,u,d,f]=await Promise.all([C(t,m.PROVIDER),C(t,m.BEDROCK_REGION_FALLBACK),C(t,m.BEDROCK_PROFILE_FALLBACK),C(t,m.BEDROCK_AUTH_MODE),C(t,m.MODEL),C(t,m.MAX_TOKENS),C(t,m.MAX_ITERATIONS),C(t,m.RATE_LIMIT_CALLS_PER_MINUTE),C(t,m.RATE_LIMIT_AUTO_ADAPT)]),p=n||e.provider,h=p?r(p):void 0;h&&(e.provider=p,e.providerConfig=h),await e.loadApiKeyForProvider(t,e.provider),e.bedrockRegionFallback=(i||``).trim(),e.bedrockProfileFallback=(a||``).trim(),e.bedrockAuthMode=(o||`provider_chain`).trim();let g=typeof document<`u`&&!!document.getElementById(`shadow-claw-static-routing`),_=e.providerConfig?.format===`transformers_js`,v=!!e.providerConfig?.modelsUrl,b=()=>{if(g||_||!v)return;let t=()=>{ue(e).then(t=>y.fetchModelInfo(e.providerConfig,t||void 0,de(e,e.provider)))};typeof globalThis.requestIdleCallback==`function`?globalThis.requestIdleCallback(t,{timeout:5e3}):setTimeout(t,2e3)};!g&&!_&&v&&(typeof window<`u`&&typeof document<`u`?document.readyState===`complete`?b():window.addEventListener(`load`,b,{once:!0}):b()),e.model=c||e.providerConfig.defaultModel;let x=e.model;e.provider===`prompt_api`&&!P()&&(e.model===`browser-built-in`||!e.model)&&(x=await C(t,m.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`,he(x).catch(()=>{}));let S=s(x);if(e.maxTokens=l===`8192`||e.provider===`prompt_api`&&!P()&&l===`4096`?S:Math.max(1,parseInt(l||String(S),10)),u&&(e.maxIterations=parseInt(u,10)||50),d){let t=parseInt(d,10);e.rateLimitCallsPerMinute=Number.isFinite(t)?Math.max(0,t):0}e.rateLimitAutoAdapt=f!==`false`}async function yt(t,n){t.agentWorker=e(new URL(`./agent.worker.js`,import.meta.url).href),t.agentWorker.onmessage=e=>Pe(t,n,e.data),t.agentWorker.onerror=e=>{console.error(`Agent worker error:`,e)};let r=await C(n,m.STORAGE_HANDLE);r&&t.agentWorker.postMessage({payload:{storageHandle:r},type:`set-storage`}),ne(t),t.scheduler=new lt(async e=>{await Me(t,e)},()=>{t.events.emit(`task-change`,{type:`executed`})},e=>je(e,t)),t.scheduler.start(),ft(t,n)}var bt=class{agentWorker=null;assistantName=g;bedrockAuthMode=`provider_chain`;bedrockProfileFallback=``;bedrockRegionFallback=``;browserChat=new Ue;channelEnabledByType={browser:!0,peerjs:!1,telegram:!1,imessage:!1};channelRegistry=new G;channelsInitialized=!1;contextCompressionEnabled=!1;db=null;directToolCommandPolicy={...$};ensureControlPlaneConnected=ze;events=new at;gitProxyUrl=`/git-proxy`;imessage=new We;imessageApiKey=``;imessageChatIds=[];imessageServerUrl=``;inFlightEffectiveProviderByGroup=/* @__PURE__ */ new Map;inFlightProviderRequestIds=/* @__PURE__ */ new Map;inFlightTriggerByGroup=/* @__PURE__ */ new Map;llamafileHost=`127.0.0.1`;llamafileMode=`cli`;llamafileOffline=!0;llamafilePort=8080;maxIterations=50;maxTokens=h;meshLlmHost=``;messageQueue=[];model=a().defaultModel;peerCompletedContexts=/* @__PURE__ */ new Set;peerjs=new Oe;peerjsMyAlias=``;peerjsMyPeerId=``;peerjsPeerAliases={};peerjsServerHost=``;peerjsServerPath=``;peerjsServerPort=0;peerjsServerSecure=!0;peerjsTrustedPeerIds=[];pendingScheduledTasks=/* @__PURE__ */ new Set;processing=!1;promptControllers=/* @__PURE__ */ new Map;provider=f;providerConfig=a();proxyUrl=`/proxy`;pushSubscriptionWarned=!1;rateLimitAutoAdapt=!0;rateLimitCallsPerMinute=0;reasoningEffort=`none`;roomChannel=new Ye;roomManager;router=null;scheduler=null;schedulerTriggeredGroups=/* @__PURE__ */ new Set;state=`idle`;streamingEnabled=!0;taskServerEnabled=!1;taskServerUrl=`/schedule`;telegram=new Xe;telegramBotToken=``;telegramChatIds=[];telegramUseProxy=!1;transformersProgressPollers=/* @__PURE__ */ new Map;triggerPattern=o(g);useProxy=!1;vmBashFullInternetAccess=!1;vmBootMode=`disabled`;vmStatus={ready:!1,booting:!1,bootAttempted:!1,error:null};webMcpEffectCleanup=null;webMcpRegistrationLock=Promise.resolve();webMcpToolsEnabled=!0;#e=null;#t=null;constructor(){this.roomManager=pt(this),this.initializeChannelRegistry()}clearProviderRequest(e){this.inFlightProviderRequestIds.delete(e)}createProviderRequestId(e){if(this.provider!==`llamafile`)return this.inFlightProviderRequestIds.delete(e),``;let t=`${e}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,10)}`;return this.inFlightProviderRequestIds.set(e,t),t}async ensureWorkerReady(){this.db&&!this.channelsInitialized&&(this.channelsInitialized=!0,await mt(this,this.db),this.browserChat.onDisplay(()=>{})),!this.agentWorker&&this.db&&await yt(this,this.db),this.db&&(j.load(this.db),H(this,this.db))}initializeChannelRegistry(){this.channelRegistry=new G,this.channelRegistry.register(`br:`,this.browserChat,{badge:`Browser`,autoTrigger:!0}),this.channelRegistry.register(`tg:`,this.telegram,{badge:`Telegram`,autoTrigger:!1}),this.channelRegistry.register(`im:`,this.imessage,{badge:`iMessage`,autoTrigger:!0}),this.channelRegistry.register(`peer:`,this.peerjs,{badge:`PeerJS`,autoTrigger:!1}),this.channelRegistry.register(`room:`,this.roomChannel,{badge:`Room`,autoTrigger:!1}),this.roomChannel.setManager(this.roomManager),this.roomChannel.setPeerJs(this.peerjs),this.peerjs.setRoomNotificationHandler((e,t,n)=>this.roomManager.handleNotification(e,t,n)),this.router=new nt(this.channelRegistry)}setState(e,t){this.state=e,this.events.emit(`state-change`,{state:e,groupId:t})}shutdown(){this.channelRegistry.stopAll(),this.scheduler?.stop();for(let e of this.transformersProgressPollers.keys())F(this,e);this.agentWorker?.terminate(),typeof this.webMcpEffectCleanup==`function`&&this.webMcpEffectCleanup(),Ae()}async ensureAllConnections(e={}){let t=e.force??!1;try{await this.ensureControlPlaneConnected({orchestrator:this,db:this.db||void 0,force:t})}catch(e){console.warn(`Error ensuring Control Plane connection:`,e)}try{Se(this,t)}catch(e){console.warn(`Error ensuring channel connections:`,e)}this.taskServerEnabled&&this.db&&(O.replayTaskSyncOutbox(this.db),O.loadTasks(this.db)),this.scheduler&&(this.scheduler.start(),this.scheduler.tick())}stopCurrentRequest(e=p){if(this.state!==`thinking`&&this.state!==`responding`)return;F(this,e);let t=this.inFlightProviderRequestIds.get(e)||``;this.clearProviderRequest(e),this.agentWorker?.postMessage({type:`cancel`,payload:{groupId:e}}),this.provider===`llamafile`&&t&&pe(t);let n=this.promptControllers.get(e);n&&(n.abort(),this.promptControllers.delete(e)),this.inFlightTriggerByGroup.delete(e),this.inFlightEffectiveProviderByGroup.delete(e),this.events.emit(`typing`,{groupId:e,typing:!1}),this.router?.setTyping(e,!1),this.setState(`idle`,e)}async getApiKey(){if(!this.#t)return null;let e=Date.now();if(this.#e&&this.#e.expiresAt>e)return this.#e.value;try{let t=await I(this.#t);return t===null?null:(this.#e={expiresAt:e+3e4,value:t},t)}catch(e){return console.error(`[Orchestrator] Failed to decrypt API key:`,e),null}}async getApiKeyForSpecificProvider(e,t){let n=await C(e,i(t));if(!n&&t===`openrouter`){let t=await C(e,m.API_KEY);t&&(n=t)}if(!n)return``;try{return await I(n)||``}catch(e){return console.error(`[Orchestrator] Failed to decrypt API key:`,e),``}}async handleCompactDone(e,t,n){await D(e,t);let r={channel:this.channelRegistry.getChannelType(t)??`browser`,content:`📝 **Context Compacted**\n\n${n}`,groupId:t,id:A(),isFromMe:!0,isTrigger:!1,sender:this.assistantName,timestamp:Date.now()};await w(e,r),this.events.emit(`context-compacted`,{groupId:t,summary:n}),this.events.emit(`typing`,{groupId:t,typing:!1}),this.setState(`idle`,t)}async init(){let e=await He();this.db=e,await T(),await Promise.all([ht(this,e),vt(this,e),_t(this,e),gt(this,e)]),await T();let t=typeof document<`u`&&!!document.getElementById(`shadow-claw-static-routing`),n=re(),r=n?.sidebar?.chatHidden,i=n?.sidebar?.tasksHidden,[a,o]=await Promise.all([C(e,m.SIDEBAR_CHAT_HIDDEN),C(e,m.SIDEBAR_TASKS_HIDDEN)]),s=a==null?!!r:N(a),c=o==null?!!i:N(o),l=s&&c;t?l||setTimeout(()=>{this.ensureWorkerReady()},15e3):l||await yt(this,e),l||(this.channelsInitialized=!0,mt(this,e).then(()=>{this.browserChat.onDisplay(()=>{})})),this.events.emit(`ready`,void 0);let u=typeof globalThis<`u`?globalThis.window:void 0;return t?l||setTimeout(()=>{j.load(e),H(this,e)},15e3):u&&typeof u.requestIdleCallback==`function`?l||u.requestIdleCallback(()=>{j.load(e),H(this,e)}):l||(await j.load(e),H(this,e)),e}async loadApiKeyForProvider(e,t){let n=await C(e,i(t));if(!n&&t===`openrouter`){let r=await C(e,m.API_KEY);r&&(n=r,await k(e,i(t),r))}this.#t=n||``,this.#e=null}async loadSecretConfig(e,t){let n=await C(e,t);if(!n)return``;try{return await I(n)||``}catch{let r=await L(n);return r&&await k(e,t,r),n}}async newSession(e,t=p){await D(e,t),this.events.emit(`session-reset`,{groupId:t})}async refreshContextUsage(e,t=p){let n=``;try{n=await ae(e,t,`MEMORY.md`)}catch{}let i=j.enabledTools,a=O.getPeerState(t)||void 0,o=Re(this.assistantName,n,i,j.systemPromptOverride,a,void 0,{groupId:t}),c=(await te(e)).find(e=>e.groupId===t),l=c?.pinnedModel??(c?.pinnedProvider?r(c.pinnedProvider)?.defaultModel??this.model:this.model),u=l;(c?.pinnedProvider??this.provider)===`prompt_api`&&(l===`browser-built-in`||!l)&&!P()&&(u=await C(this.db,m.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`);let d=typeof c?.pinnedMaxTokens==`number`&&Number.isFinite(c.pinnedMaxTokens)&&c.pinnedMaxTokens>0?Math.floor(c.pinnedMaxTokens):this.maxTokens,f=Math.max(1,Math.min(d,s(u))),h=Ne(u),g=U(o)+(i?.reduce((e,t)=>e+U(JSON.stringify(t)),0)??0),_=await Ie(t,200),v=Le(_,{contextLimit:h,systemPromptTokens:g,maxOutputTokens:f,skimTop:this.contextCompressionEnabled}),y=v.estimatedTokens+g;if(O.tokenUsage){let e=O.tokenUsage,t=(e.inputTokens||0)+(e.cacheReadTokens||0)+(e.outputTokens||0);y=Math.max(y,t)}this.events.emit(`context-usage`,{estimatedTokens:y,contextLimit:h,usagePercent:Math.min(100,Math.max(v.usagePercent,y/h*100)),truncatedCount:v.truncatedCount})}async restartCurrentRequest(e=p){if(this.state!==`thinking`&&this.state!==`responding`||!this.db)return!1;let t=this.inFlightTriggerByGroup.get(e);if(!t)return!1;this.stopCurrentRequest(e);let{invokeAgent:n}=await import(`./invoke-agent-B3Osw6K7.js`);return await n(this,this.db,e,t),!0}async routeRoomA2UIAction(e,t){let n=z(e),r=this.peerjs.myPeerId||this.peerjsMyPeerId,i=this.roomManager.getSurfaceOwner(t.surfaceId);if(!i||i===r){if(!this.db)return;await Y(this,this.db,{id:A(),groupId:e,sender:this.peerjsMyAlias||r||`you`,content:J(t),timestamp:Date.now(),channel:`room`,a2uiAction:t})}else this.roomManager.broadcastA2UIAction(n,t)}async saveSecretConfig(e,t,n){if(!n){await k(e,t,``);return}let r=await L(n);if(!r)throw Error(`Failed to encrypt secret config for ${t}`);await k(e,t,r)}async setApiKey(e,t){this.#t=await L(t),this.#e=null;let n=await L(t);if(!n)throw Error(`key failed to encrypt. config cannot set.`);await k(e,i(this.provider),n)}submitMessage(e,t=p){this.browserChat.submit(e,t)}};export{bt as Orchestrator};
3
+ `)}\n</messages>`}static formatOutbound(e){return e.replace(/<internal>[\s\S]*?<\/internal>/g,``).trim()}registry;constructor(e){this.registry=e}findChannel(e){return this.registry.find(e)}setTyping(e,t){this.findChannel(e)?.setTyping(e,t)}async send(e,t,n){let r=this.findChannel(e);r?await r.send(e,t,n):console.warn(`No channel for groupId: ${e}`)}};function rt(e,t,n){if(!e.enabledChannelTypes.includes(n.channel))return null;let r=n.content.trim(),i=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`),a=r;if(e.requireMention){let e=RegExp(`^@${i}\\b\\s*(?:-|:)?\\s*`,`i`);if(!e.test(a))return null;a=a.replace(e,``).trim()}let o=a.match(/^\/([a-zA-Z0-9_]+)(?:\s+([\s\S]+))?$/);if(!o)return null;let s=o[1];if(!e.allowedTools.includes(s))return null;let c=(o[2]||``).trim();if(!c)return{toolName:s,input:{}};let l=c.startsWith(`'`)&&c.endsWith(`'`)||c.startsWith(`"`)&&c.endsWith(`"`)?c.slice(1,-1).trim():c;try{let e=JSON.parse(l);return e&&typeof e==`object`?{toolName:s,input:e}:null}catch{return null}}function it(e,t){let n=e.trim().match(/^\/([a-z0-9](?:[a-z0-9]|-(?!-))*[a-z0-9]|[a-z0-9])(?:\s+([\s\S]+))?$/u);if(!n)return null;let r=t.find(e=>e.name===n[1]&&e.userInvocable!==!1);return r?{skill:r,arguments:(n[2]||``).trim()}:null}async function Y(e,t,n){if(n.a2uiEnvelopes&&n.a2uiEnvelopes.length>0)for(let t of n.a2uiEnvelopes)e.events.emit(`a2ui-surface`,{groupId:n.groupId,envelope:t});n.a2uiAction&&e.events.emit(`a2ui-action`,{groupId:n.groupId,action:n.a2uiAction});let r=!!n.content,i=(n.attachments?.length??0)>0;if(!r&&!i&&(n.a2uiEnvelopes?.length??0)>0)return;let a=rt(e.directToolCommandPolicy,e.assistantName,n),o=a?null:it(n.content,(await Fe(t,n.groupId)).skills),s=n.channel===`browser`,c=e.channelRegistry.shouldAutoTrigger(n.groupId),l=!1;(n.channel===`browser`||n.groupId.startsWith(`room:`))&&(l=e.triggerPattern.test(n.content.trim())),o&&(l=!0),s&&n.groupId.startsWith(`peer:`)&&e.peerCompletedContexts.delete(n.groupId);let u=!!a;if(!l&&e.peerjsMyPeerId){if(n.content.includes(`@${e.peerjsMyPeerId}`))l=!0;else if(e.peerjsMyAlias&&n.content.includes(`@${e.peerjsMyAlias}`))l=!0;else for(let[t,r]of Object.entries(e.peerjsPeerAliases))if(r===e.peerjsMyPeerId&&n.content.includes(`@${t}`)){l=!0;break}}n.content.trim().startsWith(`[SCHEDULED TASK]`)&&(l=!0),n.content.trim().startsWith(`[A2UI ACTION]`)&&(l=!0);let d=!1;d=u||l?!0:s?!(n.groupId.startsWith(`peer:`)||n.groupId.startsWith(`room:`)):c,d&&!s&&!o&&n.groupId.startsWith(`peer:`)&&e.peerCompletedContexts.has(n.groupId)&&(d=!1);let f=await De(t,n.groupId,n.attachments||[]),p={...n,attachments:f,isFromMe:!1,isTrigger:d};if(d&&!u&&!o?.skill.execution&&e.messageQueue.push(o?{...n,content:`[SKILL COMMAND] Activate the "${o.skill.name}" skill and follow its instructions.\n${o.arguments}`}:n),await w(t,p),e.events.emit(`message`,p),o?.skill.execution){if(await e.ensureWorkerReady?.(),!e.agentWorker)throw Error(`Worker is not initialized.`);let t=o.skill.execution.tools.map(e=>{let t=e.input&&typeof e.input==`object`?{...e.input}:{};return o.arguments&&Object.keys(t).length===0&&(t.rawInput=o.arguments),{...e,input:t}});e.agentWorker.postMessage({type:`execute-skill-tools`,payload:{groupId:n.groupId,skillName:o.skill.name,tools:t}})}else if(n.channel===`peerjs`&&xe(n.groupId),s&&(n.groupId.startsWith(`peer:`)||n.groupId.startsWith(`room:`))&&e.router?.send(n.groupId,n.content,f).catch(e=>{console.error(`Failed to route browser message to peer:`,e)}),a){if(await e.ensureWorkerReady?.(),!e.agentWorker)throw Error(`Worker is not initialized.`);e.agentWorker.postMessage({type:`execute-direct-tool`,payload:{groupId:n.groupId,name:a.toolName,input:a.input}})}else X(e,t)}async function X(e,t){if(e.processing||e.messageQueue.length===0)return;let n=e.messageQueue[0]?.groupId,i=e.providerConfig,a=e.provider;if(n)try{let e=(await te(t)).find(e=>e.groupId===n);if(e?.pinnedProvider){let t=r(e.pinnedProvider);t&&(i=t,a=e.pinnedProvider)}}catch{}let o=i?.requiresApiKey!==!1,s=!0;if(o&&(s=a===e.provider?!!await le(e):!!await e.getApiKeyForSpecificProvider(t,a)),o&&!s){let t=`API key not configured. Go to Settings to add your API key.`;e.events.emit(`provider-help`,{providerId:a,reason:t,helpType:_e(a,t,o)});let n=e.messageQueue.shift();e.events.emit(`error`,{groupId:n.groupId,error:t});return}e.processing=!0;let c=e.messageQueue.shift();try{let{invokeAgent:n}=await import(`./invoke-agent-CN7mSV0Z.js`);await n(e,t,c.groupId,c.content,c.freshContext,c.subagent)}catch(e){console.error(`Failed to invoke agent:`,e)}finally{e.processing=!1,e.messageQueue.length>0&&X(e,t)}}var at=class{listeners;constructor(){this.listeners=/* @__PURE__ */ new Map}emit(e,t){this.listeners.get(e)?.forEach(e=>e(t))}off(e,t){this.listeners.get(e)?.delete(t)}on(e,t){this.listeners.has(e)||this.listeners.set(e,/* @__PURE__ */ new Set),this.listeners.get(e)?.add(t)}};function Z(e,t){return{jsonrpc:`2.0`,method:e,params:t}}var ot=class{static isRoomMethod(e){return e===V.JOIN||e===V.ROSTER||e===V.LEAVE||e===V.MESSAGE||e===V.INVITE||e===V.RELAY||e===V.A2UI||e===V.A2UI_ACTION}roomsSignal=new ee.State([]);_opts;_rooms=/* @__PURE__ */ new Map;_seen=/* @__PURE__ */ new Map;_surfaceOwners=/* @__PURE__ */ new Map;constructor(e){this._opts=e}broadcast(e,t,n){let r=this._rooms.get(e);if(!r)return null;let i=this._opts.getLocalMember(),a=A(),o={roomId:e,messageId:a,senderPeerId:i.peerId,senderAlias:i.alias,text:t,attachments:n?.map(e=>({fileName:e.fileName,mimeType:e.mimeType,path:e.path,size:e.size}))};return this._markSeen(e,a),this._deliverToMembers(r,Z(V.MESSAGE,o)),a}broadcastA2UI(e,t){let n=this._rooms.get(e);if(!n)return null;let r=this._myPeerId;this._surfaceOwners.set(t.surfaceId,r);let i=A(),a={roomId:e,broadcastId:i,ownerPeerId:r,senderPeerId:r,envelope:t};return this._markSeen(e,i),this._deliverToMembers(n,Z(V.A2UI,a)),i}broadcastA2UIAction(e,t){let n=this._rooms.get(e);if(!n)return null;let r=this._opts.getLocalMember(),i=this._surfaceOwners.get(t.surfaceId)??``,a=A(),o={roomId:e,broadcastId:a,ownerPeerId:i,senderPeerId:r.peerId,senderAlias:r.alias,action:t};return this._markSeen(e,a),this._deliverToMembers(n,Z(V.A2UI_ACTION,o)),a}createRoom(e){let t=this._opts.getLocalMember(),n={roomId:A(),name:e,hostPeerId:t.peerId,members:[t],createdAt:Date.now()};return this._save(n),n}get(e){return this._rooms.get(e)??null}getSurfaceOwner(e){return this._surfaceOwners.get(e)}handleNotification(e,t,n){switch(t){case V.JOIN:this._onJoin(e,n);break;case V.ROSTER:this._onRoster(n);break;case V.LEAVE:this._onLeave(e,n);break;case V.MESSAGE:this._onMessage(n);break;case V.INVITE:this._opts.onInvite?.(n);break;case V.RELAY:this._onRelay(n);break;case V.A2UI:this._onA2UI(n);break;case V.A2UI_ACTION:this._onA2UIAction(n)}}invite(e,t){let n=this._rooms.get(e);if(!n)return!1;let r=this._opts.getLocalMember(),i={roomId:e,roomName:n.name,hostPeerId:n.hostPeerId,fromPeerId:r.peerId,fromAlias:r.alias},a=this._opts.transport;return a.connectToPeer(t),a.sendToPeer(t,Z(V.INVITE,i))}isHost(e){let t=this._rooms.get(e);return!!t&&t.hostPeerId===this._myPeerId}joinRoom(e,t,n){let r=this._opts.getLocalMember(),i=this._rooms.get(e)??{roomId:e,name:n,hostPeerId:t,members:[{peerId:t,alias:t,kind:`agent`},r],createdAt:Date.now()};this._save(i);let a=this._opts.transport;a.connectToPeer(t);let o={roomId:e,member:r};return a.sendToPeer(t,Z(V.JOIN,o)),i}leaveRoom(e){let t=this._rooms.get(e);if(!t)return;let n=this._myPeerId;if(t.hostPeerId===n){let r={roomId:e,peerId:n,disbanded:!0};this._deliverToMembers(t,Z(V.LEAVE,r))}else{let r={roomId:e,peerId:n};this._opts.transport.sendToPeer(t.hostPeerId,Z(V.LEAVE,r))}this._rooms.delete(e),this._seen.delete(e),this._opts.removeRoom?.(e),this._publish()}list(){return Array.from(this._rooms.values())}loadRooms(e){this._rooms.clear();for(let t of e)this._rooms.set(t.roomId,t);this._publish()}_broadcastRoster(e){let t={roomId:e.roomId,name:e.name,hostPeerId:e.hostPeerId,members:e.members};this._deliverToMembers(e,Z(V.ROSTER,t))}_deliverToMembers(e,t){let n=this._myPeerId;for(let r of e.members)r.peerId!==n&&this._deliverToPeer(e,r.peerId,t)}_deliverToPeer(e,t,n){let r=this._opts.transport;if(r.isConnected(t)){r.sendToPeer(t,n);return}let i=this._myPeerId;if(e.hostPeerId!==i&&e.hostPeerId!==t&&r.isConnected(e.hostPeerId)){let i={roomId:e.roomId,targetPeerId:t,inner:n};r.sendToPeer(e.hostPeerId,Z(V.RELAY,i)),r.connectToPeer(t)}else r.connectToPeer(t),r.sendToPeer(t,n)}_hasSeen(e,t){return this._seen.get(e)?.has(t)??!1}_markSeen(e,t){let n=this._seen.get(e);if(n||(n=/* @__PURE__ */ new Set,this._seen.set(e,n)),n.add(t),n.size>500){let e=n.values().next().value;e!==void 0&&n.delete(e)}}get _myPeerId(){return this._opts.transport.myPeerId}_onA2UI(e){if(!e||typeof e.roomId!=`string`||typeof e.broadcastId!=`string`||!e.envelope||!this._rooms.get(e.roomId)||this._hasSeen(e.roomId,e.broadcastId))return;this._markSeen(e.roomId,e.broadcastId);let t=e.envelope.surfaceId;this._surfaceOwners.get(t)!==this._myPeerId&&this._surfaceOwners.set(t,e.ownerPeerId);let n={id:e.broadcastId,groupId:B(e.roomId),sender:e.senderPeerId,content:``,timestamp:Date.now(),channel:`room`,a2uiEnvelopes:[e.envelope]};this._opts.onMessage(n)}_onA2UIAction(e){if(!e||typeof e.roomId!=`string`||typeof e.broadcastId!=`string`||!e.action||!this._rooms.get(e.roomId)||this._hasSeen(e.roomId,e.broadcastId)||(this._markSeen(e.roomId,e.broadcastId),this._surfaceOwners.get(e.action.surfaceId)!==this._myPeerId))return;let t={id:e.broadcastId,groupId:B(e.roomId),sender:e.senderAlias||e.senderPeerId,content:J(e.action,e.senderAlias),timestamp:Date.now(),channel:`room`,a2uiAction:e.action};this._opts.onMessage(t)}_onJoin(e,t){if(!t||typeof t.roomId!=`string`)return;let n=this._rooms.get(t.roomId);if(!n||n.hostPeerId!==this._myPeerId)return;let r=t.member??{peerId:e,alias:e,kind:`human`};r.peerId=e;let i=n.members.findIndex(t=>t.peerId===e);i>=0?n.members[i]=r:n.members.push(r),this._save(n),this._broadcastRoster(n)}_onLeave(e,t){if(!t||typeof t.roomId!=`string`)return;let n=this._rooms.get(t.roomId);n&&(t.disbanded?(this._rooms.delete(t.roomId),this._seen.delete(t.roomId),this._opts.removeRoom?.(t.roomId),this._publish()):n.hostPeerId===this._myPeerId&&(n.members=n.members.filter(n=>n.peerId!==(t.peerId||e)),this._save(n),this._broadcastRoster(n)))}_onMessage(e){if(!e||typeof e.roomId!=`string`||typeof e.messageId!=`string`||!this._rooms.get(e.roomId)||this._hasSeen(e.roomId,e.messageId))return;this._markSeen(e.roomId,e.messageId);let t={id:e.messageId,groupId:B(e.roomId),sender:e.senderAlias||e.senderPeerId,content:e.text??``,timestamp:Date.now(),channel:`room`,attachments:e.attachments?.map(e=>({fileName:e.fileName,mimeType:e.mimeType,path:e.path,size:e.size}))};this._opts.onMessage(t)}_onRelay(e){e&&typeof e.targetPeerId==`string`&&e.inner&&this.isHost(e.roomId)&&this._opts.transport.sendToPeer(e.targetPeerId,e.inner)}_onRoster(e){if(!e||typeof e.roomId!=`string`)return;let t=this._rooms.get(e.roomId),n={roomId:e.roomId,name:e.name??t?.name??e.roomId,hostPeerId:e.hostPeerId,members:Array.isArray(e.members)?e.members:[],createdAt:t?.createdAt??Date.now()};this._save(n)}_publish(){this.roomsSignal.set(this.list())}_save(e){this._rooms.set(e.roomId,e),this._opts.persistRoom?.(e),this._publish()}};function st(e){return e&&S(e)?Promise.resolve().then(()=>(e.db.prepare(`SELECT * FROM tasks WHERE enabled = 1`).all()??[]).map(e=>({...e,enabled:!0,tools:e.tools?JSON.parse(e.tools):void 0}))):new Promise(async(t,n)=>{try{let r=e??await b();if(!r)return n(/* @__PURE__ */ Error(`failed to get transaction, cannot get enabled tasks.`));let i=r.transaction(`tasks`,`readonly`);if(!i)return n(/* @__PURE__ */ Error(`failed to get transaction`));let a=i.objectStore(`tasks`).index(`by-enabled`).getAll(1);a.onsuccess=()=>{t(a.result.map(e=>({...e,enabled:!0})))},a.onerror=()=>n(a.error)}catch(e){n(e)}})}function ct(e,t){if(typeof e!=`string`||!e.trim())return!1;let n=e.trim().split(/\s+/);if(n.length!==5)return!1;let[r,i,a,o,s]=n;return Q(r,t.getMinutes())&&Q(i,t.getHours())&&Q(a,t.getDate())&&Q(o,t.getMonth()+1)&&Q(s,t.getDay())}function Q(e,t){return e===`*`||e.split(`,`).some(e=>{if(e.includes(`/`)){let[n,r]=e.split(`/`),i=parseInt(r,10);if(isNaN(i)||i<=0)return!1;if(n===`*`)return t%i===0;if(n.includes(`-`)){let[e,r]=n.split(`-`).map(Number);return t>=e&&t<=r&&(t-e)%i===0}let a=parseInt(n,10);return t>=a&&(t-a)%i===0}if(e.includes(`-`)){let[n,r]=e.split(`-`).map(Number);return t>=n&&t<=r}return parseInt(e,10)===t})}var lt=class{interval=null;onTaskChange;runner;shouldDefer;constructor(e,t,n){this.runner=e,this.onTaskChange=t,this.shouldDefer=n}ranThisMinute(e,t){if(!e.lastRun)return!1;let n=new Date(e.lastRun);return n.getFullYear()===t.getFullYear()&&n.getMonth()===t.getMonth()&&n.getDate()===t.getDate()&&n.getHours()===t.getHours()&&n.getMinutes()===t.getMinutes()}start(){this.interval||(this.interval=setInterval(()=>this.tick(),y),this.tick())}stop(){this.interval&&=(clearInterval(this.interval),null)}async tick(){try{let e=await st(),t=/* @__PURE__ */ new Date;for(let n of e){let e=n.schedule||``;if(e!==``&&ct(e,t)&&!this.ranThisMinute(n,t)){if(this.shouldDefer&&await this.shouldDefer(n))continue;await ie(n.id,t.getTime()),this.onTaskChange?.(),this.runner(n).catch(e=>{console.error(`Task ${n.id} failed:`,e)})}}}catch(e){console.error(`Scheduler tick error:`,e)}}};async function ut(e,t){e.channelEnabledByType.telegram=await R(`telegram`,t),e.channelEnabledByType.imessage=await R(`imessage`,t);let n=await e.loadSecretConfig(t,h.TELEGRAM_BOT_TOKEN),r=E(await C(t,h.TELEGRAM_CHAT_IDS)),i=await C(t,h.TELEGRAM_USE_PROXY)===`true`;e.telegramBotToken=n,e.telegramChatIds=r,e.telegramUseProxy=i,e.telegram.configure(n,r,i);let a=async(e,n)=>{try{let r=await ge(t,e,n),i=new Uint8Array(r.byteLength);i.set(r);let a=n.split(`/`).pop()||n,o=Ee(a);return new Blob([i],{type:o})}catch(e){return console.warn(`Orchestrator: channel fileReader failed for ${n}:`,e),null}};e.telegram.fileReader=a,e.imessage.fileReader=a;let o=(await C(t,h.IMESSAGE_SERVER_URL)||``).trim().replace(/\/+$/,``),s=await e.loadSecretConfig(t,h.IMESSAGE_API_KEY),c=E(await C(t,h.IMESSAGE_CHAT_IDS));e.imessageServerUrl=o,e.imessageApiKey=s,e.imessageChatIds=c,e.imessage.configure(o,s,c),e.channelEnabledByType.peerjs=await R(`peerjs`,t);let l=(await C(t,h.PEERJS_MY_PEER_ID)||``).trim(),u=E(await C(t,h.PEERJS_TRUSTED_PEER_IDS)),d=(await C(t,h.PEERJS_SERVER_HOST)||``).trim(),f=await C(t,h.PEERJS_SERVER_PORT),p=f&&parseInt(f,10)||0,m=(await C(t,h.PEERJS_SERVER_PATH)||``).trim(),g=await C(t,h.PEERJS_SERVER_SECURE)!==`false`,_={},v=await C(t,h.PEERJS_PEER_ALIASES);if(v)try{_=JSON.parse(v)}catch(e){console.warn(`Failed to parse peerjs_peer_aliases`,e)}e.peerjsMyPeerId=l,e.peerjsMyAlias=(await C(t,h.PEERJS_MY_ALIAS)||``).trim(),e.peerjsTrustedPeerIds=u,e.peerjsPeerAliases=_,e.peerjsServerHost=d,e.peerjsServerPort=p,e.peerjsServerPath=m,e.peerjsServerSecure=g;let y=d?{host:d,port:p||void 0,path:m||void 0,secure:g}:{};e.peerjs.configure(l,u,y)}const $={allowedTools:[`clear_chat`,`show_toast`],enabledChannelTypes:[`telegram`],requireMention:!0};function dt(e){if(!e)return{allowedTools:[...$.allowedTools],enabledChannelTypes:[...$.enabledChannelTypes],requireMention:$.requireMention};try{let t=JSON.parse(e),n=Array.isArray(t.enabledChannelTypes)?t.enabledChannelTypes.filter(e=>typeof e==`string`&&e.trim().length>0):$.enabledChannelTypes;return{allowedTools:Array.isArray(t.allowedTools)?t.allowedTools.filter(e=>typeof e==`string`&&e.trim().length>0):$.allowedTools,enabledChannelTypes:n,requireMention:typeof t.requireMention==`boolean`?t.requireMention:$.requireMention}}catch{return{allowedTools:[...$.allowedTools],enabledChannelTypes:[...$.enabledChannelTypes],requireMention:$.requireMention}}}function ft(e,t){typeof navigator<`u`&&navigator.serviceWorker&&((async()=>{try{let e=await M(t);await ye(e)}catch{}})(),navigator.serviceWorker.addEventListener(`message`,n=>{if(n.data?.type===`request-proxy-config`){ne(e);return}if(n.data?.type!==`scheduled-task-trigger`)return;let{taskId:r,groupId:i,prompt:a,taskType:o,tools:s,subscriberId:c}=n.data;i&&(async()=>{if(c){let e=await M(t);if(e&&c!==e){console.warn(`Ignoring push-triggered task ${r}: subscriberId mismatch (${c} !== ${e})`);return}}e.schedulerTriggeredGroups.add(i);try{let t=O.tasks.find(e=>e.id===r);if(t){O.runTask(t);return}if(o===`tools`&&Array.isArray(s)&&s.length>0){O.runTask({id:r||`push-task-${Date.now()}`,groupId:i,createdAt:Date.now(),enabled:!0,prompt:a||``,type:`tools`,tools:s,lastRun:null});return}a&&be(e,a,i)}finally{e.schedulerTriggeredGroups.delete(i)}})().catch(e=>console.error(`Push-triggered task ${r} failed:`,e))}))}function pt(e){return new ot({transport:{get myPeerId(){return e.peerjs.myPeerId||e.peerjsMyPeerId},sendToPeer:(t,n)=>e.peerjs.sendRoomNotification(t,n),isConnected:t=>e.peerjs.isPeerConnected(t),connectToPeer:t=>e.peerjs.connectPeer(t)},getLocalMember:()=>({peerId:e.peerjs.myPeerId||e.peerjsMyPeerId,alias:e.peerjsMyAlias||e.peerjs.myPeerId||e.peerjsMyPeerId||e.assistantName,kind:`agent`,agentName:e.assistantName}),onMessage:t=>e.roomChannel.deliverInbound(t),onInvite:t=>ve(e,t),persistRoom:t=>{e.db&&we(e.db,t).catch(e=>console.error(`Failed to persist room:`,e))},removeRoom:t=>{e.db&&Ce(e.db,t).catch(e=>console.error(`Failed to delete room:`,e))}})}async function mt(e,t){e.initializeChannelRegistry(),e.channelRegistry.onMessage(n=>{Y(e,t,n).catch(e=>{console.error(`Failed to enqueue inbound message:`,e)})}),e.channelRegistry.onTyping((t,n)=>{e.events.emit(`typing`,{groupId:t,typing:n}),t.startsWith(`peer:`)&&O.setRemoteAgentTyping(t,n)}),e.peerjs.onTaskComplete(t=>{e.peerCompletedContexts.add(t)}),await ut(e,t),Se(e);try{let n=await Te(t);e.roomManager.loadRooms(n)}catch(e){console.error(`Failed to load rooms:`,e)}}async function ht(e,t){e.assistantName=await C(t,h.ASSISTANT_NAME)||`ShadowClaw`,e.triggerPattern=o(e.assistantName)}async function gt(e,t){let n=await C(t,h.VM_BOOT_MODE);e.vmBootMode=n===`disabled`||n===`auto`||n===`9p`||n===`ext2`?n:`disabled`,e.streamingEnabled=await C(t,h.STREAMING_ENABLED)!==`false`,e.webMcpToolsEnabled=await C(t,h.WEBMCP_TOOLS_ENABLED)!==`false`,e.vmBashFullInternetAccess=await C(t,h.VM_BASH_FULL_INTERNET_ACCESS)===`true`;let r=await C(t,h.WEBMCP_MODE);(r===`native`||r===`polyfill`)&&ke(r),e.contextCompressionEnabled=await C(t,h.CONTEXT_COMPRESSION_ENABLED)===`true`;let i=await C(t,h.REASONING_EFFORT);e.reasoningEffort=i?i.trim().toLowerCase():`none`,e.directToolCommandPolicy=dt(await C(t,h.DIRECT_TOOL_COMMAND_POLICY)),e.useProxy=await C(t,h.USE_PROXY)===`true`,e.proxyUrl=await C(t,h.PROXY_URL)||`/proxy`,e.gitProxyUrl=await C(t,h.GIT_PROXY_URL)||`/git-proxy`,e.taskServerEnabled=await C(t,h.TASK_SERVER_ENABLED)===`true`,e.taskServerUrl=await C(t,h.TASK_SERVER_URL)||(await import(`./config-C16fFWtP.js`).then(e=>e.k)).DEFAULT_TASK_SERVER_URL}async function _t(e,t){let n=await C(t,h.LLAMAFILE_MODE);n===`cli`||n===`server`?e.llamafileMode=n:await k(t,h.LLAMAFILE_MODE,e.llamafileMode);let r=await C(t,h.LLAMAFILE_HOST);r&&(e.llamafileHost=r);let i=await C(t,h.LLAMAFILE_PORT);if(i){let t=parseInt(i,10);Number.isFinite(t)&&t>=1&&t<=65535&&(e.llamafilePort=t)}await C(t,h.LLAMAFILE_OFFLINE)===`false`&&(e.llamafileOffline=!1),me(e);let a=await C(t,h.MESH_LLM_HOST);a&&(e.meshLlmHost=a),fe(e)}async function vt(e,t){let[n,i,a,o,c,l,d,f,p]=await Promise.all([C(t,h.PROVIDER),C(t,h.BEDROCK_REGION_FALLBACK),C(t,h.BEDROCK_PROFILE_FALLBACK),C(t,h.BEDROCK_AUTH_MODE),C(t,h.MODEL),C(t,h.MAX_TOKENS),C(t,h.MAX_ITERATIONS),C(t,h.RATE_LIMIT_CALLS_PER_MINUTE),C(t,h.RATE_LIMIT_AUTO_ADAPT)]),m=n||e.provider,g=m?r(m):void 0;g&&(e.provider=m,e.providerConfig=g),await e.loadApiKeyForProvider(t,e.provider),e.bedrockRegionFallback=(i||``).trim(),e.bedrockProfileFallback=(a||``).trim(),e.bedrockAuthMode=(o||`provider_chain`).trim();let _=typeof document<`u`&&!!document.getElementById(`shadow-claw-static-routing`),v=e.providerConfig?.format===`transformers_js`,y=!!e.providerConfig?.modelsUrl,b=()=>{if(_||v||!y)return;let t=()=>{ue(e).then(t=>u.fetchModelInfo(e.providerConfig,t||void 0,de(e,e.provider)))};typeof globalThis.requestIdleCallback==`function`?globalThis.requestIdleCallback(t,{timeout:5e3}):setTimeout(t,2e3)};!_&&!v&&y&&(typeof window<`u`&&typeof document<`u`?document.readyState===`complete`?b():window.addEventListener(`load`,b,{once:!0}):b()),e.model=c||e.providerConfig.defaultModel;let x=e.model;e.provider===`prompt_api`&&!P()&&(e.model===`browser-built-in`||!e.model)&&(x=await C(t,h.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`,he(x).catch(()=>{}));let S=s(x);if(e.maxTokens=l===`8192`||e.provider===`prompt_api`&&!P()&&l===`4096`?S:Math.max(1,parseInt(l||String(S),10)),d&&(e.maxIterations=parseInt(d,10)||50),f){let t=parseInt(f,10);e.rateLimitCallsPerMinute=Number.isFinite(t)?Math.max(0,t):0}e.rateLimitAutoAdapt=p!==`false`}async function yt(t,n){t.agentWorker=e(new URL(`./agent.worker.js`,import.meta.url).href),t.agentWorker.onmessage=e=>Pe(t,n,e.data),t.agentWorker.onerror=e=>{console.error(`Agent worker error:`,e)};let r=await C(n,h.STORAGE_HANDLE);r&&t.agentWorker.postMessage({payload:{storageHandle:r},type:`set-storage`}),ne(t),t.scheduler=new lt(async e=>{await Me(t,e)},()=>{t.events.emit(`task-change`,{type:`executed`})},e=>je(e,t)),t.scheduler.start(),ft(t,n)}var bt=class{agentWorker=null;assistantName=_;bedrockAuthMode=`provider_chain`;bedrockProfileFallback=``;bedrockRegionFallback=``;browserChat=new Ue;channelEnabledByType={browser:!0,peerjs:!1,telegram:!1,imessage:!1};channelRegistry=new G;channelsInitialized=!1;contextCompressionEnabled=!1;db=null;directToolCommandPolicy={...$};ensureControlPlaneConnected=ze;events=new at;gitProxyUrl=`/git-proxy`;imessage=new We;imessageApiKey=``;imessageChatIds=[];imessageServerUrl=``;inFlightEffectiveProviderByGroup=/* @__PURE__ */ new Map;inFlightProviderRequestIds=/* @__PURE__ */ new Map;inFlightTriggerByGroup=/* @__PURE__ */ new Map;llamafileHost=`127.0.0.1`;llamafileMode=`cli`;llamafileOffline=!0;llamafilePort=8080;maxIterations=50;maxTokens=g;meshLlmHost=``;messageQueue=[];model=a().defaultModel;peerCompletedContexts=/* @__PURE__ */ new Set;peerjs=new Oe;peerjsMyAlias=``;peerjsMyPeerId=``;peerjsPeerAliases={};peerjsServerHost=``;peerjsServerPath=``;peerjsServerPort=0;peerjsServerSecure=!0;peerjsTrustedPeerIds=[];pendingScheduledTasks=/* @__PURE__ */ new Set;processing=!1;promptControllers=/* @__PURE__ */ new Map;provider=p;providerConfig=a();proxyUrl=`/proxy`;pushSubscriptionWarned=!1;rateLimitAutoAdapt=!0;rateLimitCallsPerMinute=0;reasoningEffort=`none`;roomChannel=new Ye;roomManager;router=null;scheduler=null;schedulerTriggeredGroups=/* @__PURE__ */ new Set;state=`idle`;streamingEnabled=!0;taskServerEnabled=!1;taskServerUrl=`/schedule`;telegram=new Xe;telegramBotToken=``;telegramChatIds=[];telegramUseProxy=!1;transformersProgressPollers=/* @__PURE__ */ new Map;triggerPattern=o(_);useProxy=!1;vmBashFullInternetAccess=!1;vmBootMode=`disabled`;vmStatus={ready:!1,booting:!1,bootAttempted:!1,error:null};webMcpEffectCleanup=null;webMcpRegistrationLock=Promise.resolve();webMcpToolsEnabled=!0;#e=null;#t=null;constructor(){this.roomManager=pt(this),this.initializeChannelRegistry()}clearProviderRequest(e){this.inFlightProviderRequestIds.delete(e)}createProviderRequestId(e){if(this.provider!==`llamafile`)return this.inFlightProviderRequestIds.delete(e),``;let t=`${e}:${Date.now().toString(36)}:${Math.random().toString(36).slice(2,10)}`;return this.inFlightProviderRequestIds.set(e,t),t}async ensureWorkerReady(){this.db&&!this.channelsInitialized&&(this.channelsInitialized=!0,await mt(this,this.db),this.browserChat.onDisplay(()=>{})),!this.agentWorker&&this.db&&await yt(this,this.db),this.db&&(j.load(this.db),H(this,this.db))}initializeChannelRegistry(){this.channelRegistry=new G,this.channelRegistry.register(`br:`,this.browserChat,{badge:`Browser`,autoTrigger:!0}),this.channelRegistry.register(`tg:`,this.telegram,{badge:`Telegram`,autoTrigger:!1}),this.channelRegistry.register(`im:`,this.imessage,{badge:`iMessage`,autoTrigger:!0}),this.channelRegistry.register(`peer:`,this.peerjs,{badge:`PeerJS`,autoTrigger:!1}),this.channelRegistry.register(`room:`,this.roomChannel,{badge:`Room`,autoTrigger:!1}),this.roomChannel.setManager(this.roomManager),this.roomChannel.setPeerJs(this.peerjs),this.peerjs.setRoomNotificationHandler((e,t,n)=>this.roomManager.handleNotification(e,t,n)),this.router=new nt(this.channelRegistry)}setState(e,t){this.state=e,this.events.emit(`state-change`,{state:e,groupId:t})}shutdown(){this.channelRegistry.stopAll(),this.scheduler?.stop();for(let e of this.transformersProgressPollers.keys())F(this,e);this.agentWorker?.terminate(),typeof this.webMcpEffectCleanup==`function`&&this.webMcpEffectCleanup(),Ae()}async ensureAllConnections(e={}){let t=e.force??!1;try{await this.ensureControlPlaneConnected({orchestrator:this,db:this.db||void 0,force:t})}catch(e){console.warn(`Error ensuring Control Plane connection:`,e)}try{Se(this,t)}catch(e){console.warn(`Error ensuring channel connections:`,e)}this.taskServerEnabled&&this.db&&(O.replayTaskSyncOutbox(this.db),O.loadTasks(this.db)),this.scheduler&&(this.scheduler.start(),this.scheduler.tick())}stopCurrentRequest(e=m){if(this.state!==`thinking`&&this.state!==`responding`)return;F(this,e);let t=this.inFlightProviderRequestIds.get(e)||``;this.clearProviderRequest(e),this.agentWorker?.postMessage({type:`cancel`,payload:{groupId:e}}),this.provider===`llamafile`&&t&&pe(t);let n=this.promptControllers.get(e);n&&(n.abort(),this.promptControllers.delete(e)),this.inFlightTriggerByGroup.delete(e),this.inFlightEffectiveProviderByGroup.delete(e),this.events.emit(`typing`,{groupId:e,typing:!1}),this.router?.setTyping(e,!1),this.setState(`idle`,e)}async getApiKey(){if(!this.#t)return null;let e=Date.now();if(this.#e&&this.#e.expiresAt>e)return this.#e.value;try{let t=await I(this.#t);return t===null?null:(this.#e={expiresAt:e+3e4,value:t},t)}catch(e){return console.error(`[Orchestrator] Failed to decrypt API key:`,e),null}}async getApiKeyForSpecificProvider(e,t){let n=await C(e,i(t));if(!n&&t===`openrouter`){let t=await C(e,h.API_KEY);t&&(n=t)}if(!n)return``;try{return await I(n)||``}catch(e){return console.error(`[Orchestrator] Failed to decrypt API key:`,e),``}}async handleCompactDone(e,t,n){await D(e,t);let r={channel:this.channelRegistry.getChannelType(t)??`browser`,content:`📝 **Context Compacted**\n\n${n}`,groupId:t,id:A(),isFromMe:!0,isTrigger:!1,sender:this.assistantName,timestamp:Date.now()};await w(e,r),this.events.emit(`context-compacted`,{groupId:t,summary:n}),this.events.emit(`typing`,{groupId:t,typing:!1}),this.setState(`idle`,t)}async init(){let e=await He();this.db=e,await T(),await Promise.all([ht(this,e),vt(this,e),_t(this,e),gt(this,e)]),await T();let t=typeof document<`u`&&!!document.getElementById(`shadow-claw-static-routing`),n=re(),r=n?.sidebar?.chatHidden,i=n?.sidebar?.tasksHidden,[a,o]=await Promise.all([C(e,h.SIDEBAR_CHAT_HIDDEN),C(e,h.SIDEBAR_TASKS_HIDDEN)]),s=a==null?!!r:N(a),c=o==null?!!i:N(o),l=s&&c;t?l||setTimeout(()=>{this.ensureWorkerReady()},15e3):l||await yt(this,e),l||(this.channelsInitialized=!0,mt(this,e).then(()=>{this.browserChat.onDisplay(()=>{})})),this.events.emit(`ready`,void 0);let u=typeof globalThis<`u`?globalThis.window:void 0;return t?l||setTimeout(()=>{j.load(e),H(this,e)},15e3):u&&typeof u.requestIdleCallback==`function`?l||u.requestIdleCallback(()=>{j.load(e),H(this,e)}):l||(await j.load(e),H(this,e)),e}async loadApiKeyForProvider(e,t){let n=await C(e,i(t));if(!n&&t===`openrouter`){let r=await C(e,h.API_KEY);r&&(n=r,await k(e,i(t),r))}this.#t=n||``,this.#e=null}async loadSecretConfig(e,t){let n=await C(e,t);if(!n)return``;try{return await I(n)||``}catch{let r=await L(n);return r&&await k(e,t,r),n}}async newSession(e,t=m){await D(e,t),this.events.emit(`session-reset`,{groupId:t})}async refreshContextUsage(e,t=m){let n=``;try{n=await ae(e,t,`MEMORY.md`)}catch{}let i=j.enabledTools,a=O.getPeerState(t)||void 0,o=Re(this.assistantName,n,i,j.systemPromptOverride,a,void 0,{groupId:t}),c=(await te(e)).find(e=>e.groupId===t),l=c?.pinnedModel??(c?.pinnedProvider?r(c.pinnedProvider)?.defaultModel??this.model:this.model),u=l;(c?.pinnedProvider??this.provider)===`prompt_api`&&(l===`browser-built-in`||!l)&&!P()&&(u=await C(this.db,h.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`);let d=typeof c?.pinnedMaxTokens==`number`&&Number.isFinite(c.pinnedMaxTokens)&&c.pinnedMaxTokens>0?Math.floor(c.pinnedMaxTokens):this.maxTokens,f=Math.max(1,Math.min(d,s(u))),p=Ne(u),g=U(o)+(i?.reduce((e,t)=>e+U(JSON.stringify(t)),0)??0),_=await Ie(t,200),v=Le(_,{contextLimit:p,systemPromptTokens:g,maxOutputTokens:f,skimTop:this.contextCompressionEnabled}),y=v.estimatedTokens+g;if(O.tokenUsage){let e=O.tokenUsage,t=(e.inputTokens||0)+(e.cacheReadTokens||0)+(e.outputTokens||0);y=Math.max(y,t)}this.events.emit(`context-usage`,{estimatedTokens:y,contextLimit:p,usagePercent:Math.min(100,Math.max(v.usagePercent,y/p*100)),truncatedCount:v.truncatedCount})}async restartCurrentRequest(e=m){if(this.state!==`thinking`&&this.state!==`responding`||!this.db)return!1;let t=this.inFlightTriggerByGroup.get(e);if(!t)return!1;this.stopCurrentRequest(e);let{invokeAgent:n}=await import(`./invoke-agent-CN7mSV0Z.js`);return await n(this,this.db,e,t),!0}async routeRoomA2UIAction(e,t){let n=z(e),r=this.peerjs.myPeerId||this.peerjsMyPeerId,i=this.roomManager.getSurfaceOwner(t.surfaceId);if(!i||i===r){if(!this.db)return;await Y(this,this.db,{id:A(),groupId:e,sender:this.peerjsMyAlias||r||`you`,content:J(t),timestamp:Date.now(),channel:`room`,a2uiAction:t})}else this.roomManager.broadcastA2UIAction(n,t)}async saveSecretConfig(e,t,n){if(!n){await k(e,t,``);return}let r=await L(n);if(!r)throw Error(`Failed to encrypt secret config for ${t}`);await k(e,t,r)}async setApiKey(e,t){this.#t=await L(t),this.#e=null;let n=await L(t);if(!n)throw Error(`key failed to encrypt. config cannot set.`);await k(e,i(this.provider),n)}submitMessage(e,t=m){this.browserChat.submit(e,t)}};export{bt as Orchestrator};
@@ -1 +1 @@
1
- import"./config-C-YdSFZB.js";import{n as e}from"./db-BUuJo1Gf.js";import{t}from"./dist-CeFyqf9k.js";import{t as n}from"./ulid-BSJxYh6W.js";import{o as r}from"./tools-DHA1dK2I.js";import{a as i}from"./transformers-C-DuTM2K.js";import{i as a}from"./mime-ClqNyXPc.js";import{t as o}from"./upload-group-file-Cejr3zo1.js";import{n as s}from"./filename-kBumOBho.js";import{t as c}from"./write-group-file-bytes-Cejr3zo1.js";function l(e){return s(e,{replacement:`-`,fallback:`attachment`,stripLeadingDots:!0,collapseReplacement:!0,stripControlChars:!0})}function u(e){return e.previewDisposition===`inline`||a(e.fileName,e.mimeType||``)===`image/png`}function d(e,t=``,n=Date.now()){let r=l(e),i=t.trim().replace(/[^a-zA-Z0-9._-]+/g,`-`).replace(/^-+|-+$/g,``);return`attachments/${n}-${i?`${i}-`:``}${r}`}async function f(e,t,n=[]){let r=[];for(let i of n){let n=l(i.fileName||``),s=i.path||d(n,i.id),c=i.source,u=a(n,i.mimeType||``),f=i.size;if(c){let r=await p(c);u=a(n,i.mimeType||r.type),f=typeof f==`number`?f:r.size,await o(e,t,s,r)}r.push(m({...i,fileName:n,mimeType:u,size:f,path:s,previewDisposition:i.previewDisposition||(u===`image/png`?`inline`:`file`)}))}return r}async function p(e){if(e.kind===`local-file`)return e.file;if(e.kind===`inline-text`)return new Blob([e.text],{type:e.mimeType||`text/plain`});let t=await fetch(e.url,{headers:e.headers});if(!t.ok)throw Error(`Attachment download failed: HTTP ${t.status} ${t.statusText}`);return await t.blob()}function m(e){let{source:t,...n}=e;return n}const h=/* @__PURE__ */ new Set([`TASK_STATE_COMPLETED`,`TASK_STATE_FAILED`,`TASK_STATE_CANCELED`,`TASK_STATE_REJECTED`]),g=/* @__PURE__ */ new Set([`TASK_STATE_INPUT_REQUIRED`,`TASK_STATE_AUTH_REQUIRED`]),_={SEND_MESSAGE:`SendMessage`,SEND_STREAMING_MESSAGE:`SendStreamingMessage`,GET_TASK:`GetTask`,CANCEL_TASK:`CancelTask`,GET_AGENT_CARD:`GetAgentCard`},v={EVENT:`agui/event`},y={STATUS_UPDATE:`tasks/statusUpdate`,ARTIFACT_UPDATE:`tasks/artifactUpdate`},b={JOIN:`room/join`,ROSTER:`room/roster`,LEAVE:`room/leave`,MESSAGE:`room/message`,INVITE:`room/invite`,RELAY:`room/relay`,A2UI:`room/a2ui`,A2UI_ACTION:`room/a2ui-action`},x={TASK_NOT_FOUND:-32001,TASK_NOT_CANCELABLE:-32002,PUSH_NOTIFICATION_NOT_SUPPORTED:-32003,UNSUPPORTED_OPERATION:-32004,CONTENT_TYPE_NOT_SUPPORTED:-32005,INVALID_AGENT_RESPONSE:-32006,PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603};function S(e){return typeof e==`object`&&!!e&&e.jsonrpc===`2.0`&&(e.id===null||typeof e.id==`string`||typeof e.id==`number`)&&typeof e.method==`string`}function C(e){return typeof e==`object`&&!!e&&e.jsonrpc===`2.0`&&(e.id===null||typeof e.id==`string`||typeof e.id==`number`)&&!(`method`in e)}function w(e){let t={url:`webrtc://${e.peerId}`,protocolBinding:`https://xt-ml.github.io/shadow-claw/bindings/webrtc-datachannel/v1`,protocolVersion:`1.0`},n={streaming:e.streaming??!0,pushNotifications:!1};return{name:e.name,description:e.description??`AI assistant agent (${e.name})`,version:e.version??`1.0.0`,supportedInterfaces:[t],capabilities:n,defaultInputModes:[`text/plain`,`application/json`],defaultOutputModes:[`text/plain`,`application/json`],skills:e.skills??[],iconUrl:e.iconUrl}}function T(){return{jsonrpc:`2.0`,id:n(),method:_.GET_AGENT_CARD}}function E(e,t){return{jsonrpc:`2.0`,id:e,result:t}}function D(e){if(e.error)return console.warn(`GetAgentCard returned error:`,e.error),null;let t=e.result;return!t||typeof t!=`object`||typeof t.name!=`string`||typeof t.version!=`string`?null:t}var O=class{_cards=/* @__PURE__ */ new Map;clear(){this._cards.clear()}delete(e){this._cards.delete(e)}entries(){return this._cards.entries()}get(e){return this._cards.get(e)}getDisplayName(e){return this._cards.get(e)?.name??e}has(e){return this._cards.has(e)}set(e,t){this._cards.set(e,t)}supportsStreaming(e){return this._cards.get(e)?.capabilities?.streaming??!1}};const k={maxTasks:100,maxHistoryPerTask:50},A=/* @__PURE__ */ new Map([[`TASK_STATE_SUBMITTED`,/* @__PURE__ */ new Set([`TASK_STATE_WORKING`,`TASK_STATE_REJECTED`,`TASK_STATE_CANCELED`,`TASK_STATE_FAILED`])],[`TASK_STATE_WORKING`,/* @__PURE__ */ new Set([`TASK_STATE_COMPLETED`,`TASK_STATE_FAILED`,`TASK_STATE_CANCELED`,`TASK_STATE_INPUT_REQUIRED`,`TASK_STATE_AUTH_REQUIRED`])],[`TASK_STATE_INPUT_REQUIRED`,/* @__PURE__ */ new Set([`TASK_STATE_WORKING`,`TASK_STATE_CANCELED`,`TASK_STATE_FAILED`])],[`TASK_STATE_AUTH_REQUIRED`,/* @__PURE__ */ new Set([`TASK_STATE_WORKING`,`TASK_STATE_CANCELED`,`TASK_STATE_FAILED`])]]);var j=class{_config;_contextActiveTask=/* @__PURE__ */ new Map;_listeners=/* @__PURE__ */ new Set;_taskOrder=[];_tasks=/* @__PURE__ */ new Map;constructor(e){this._config={...k,...e}}addArtifact(e,t,n=!1){let r=this._tasks.get(e);if(!r)return;if(r.artifacts||=[],n){let e=r.artifacts.find(e=>e.artifactId===t.artifactId);e?e.parts.push(...t.parts):r.artifacts.push(t)}else r.artifacts.push(t);let i={taskId:r.id,contextId:r.contextId??``,artifact:t,append:n,lastChunk:!1};this._emit({type:`artifactUpdate`,taskId:r.id,contextId:r.contextId??``,payload:i})}cancelTask(e){let t=this._tasks.get(e);return!t||h.has(t.status.state)?!1:(this._transitionState(t,`TASK_STATE_CANCELED`,{messageId:n(),role:`ROLE_AGENT`,parts:[{text:`Task canceled by peer request.`}]}),!0)}clear(){this._tasks.clear(),this._taskOrder=[],this._contextActiveTask.clear()}emitRunError(e,t,n){let r=this._tasks.get(e);if(!r)return;let i={type:`RUN_ERROR`,message:t,code:n,timestamp:Date.now()};this._emitAGUI(r,i)}emitRunFinished(e){let t=this._tasks.get(e);if(!t)return;let n={type:`RUN_FINISHED`,threadId:t.contextId??t.id,runId:t.id,timestamp:Date.now()};this._emitAGUI(t,n)}emitRunStarted(e){let t=this._tasks.get(e);if(!t)return;let n={type:`RUN_STARTED`,threadId:t.contextId??t.id,runId:t.id,timestamp:Date.now()};this._emitAGUI(t,n)}emitStateSnapshot(e,t){let n=this._tasks.get(e);if(!n)return;let r={type:`STATE_SNAPSHOT`,snapshot:t,timestamp:Date.now()};this._emitAGUI(n,r)}emitTextMessageContent(e,t,n){let r=this._tasks.get(e);if(!r)return;let i={type:`TEXT_MESSAGE_CONTENT`,messageId:t,delta:n,timestamp:Date.now()};this._emitAGUI(r,i)}emitTextMessageEnd(e,t){let n=this._tasks.get(e);if(!n)return;let r={type:`TEXT_MESSAGE_END`,messageId:t,timestamp:Date.now()};this._emitAGUI(n,r)}emitTextMessageStart(e,t,n=`assistant`){let r=this._tasks.get(e);if(!r)return;let i={type:`TEXT_MESSAGE_START`,messageId:t,role:n,timestamp:Date.now()};this._emitAGUI(r,i)}emitToolCallEnd(e,t){let n=this._tasks.get(e);if(!n)return;let r={type:`TOOL_CALL_END`,toolCallId:t,timestamp:Date.now()};this._emitAGUI(n,r)}emitToolCallStart(e,t,n,r){let i=this._tasks.get(e);if(!i)return;let a={type:`TOOL_CALL_START`,toolCallId:t,toolCallName:n,parentMessageId:r,timestamp:Date.now()};this._emitAGUI(i,a)}getActiveTaskForContext(e){let t=this._contextActiveTask.get(e);if(t)return this._tasks.get(t)}getActiveTasks(){return Array.from(this._tasks.values()).filter(e=>!h.has(e.status.state))}getAllTasks(){return Array.from(this._tasks.values())}getTask(e){return this._tasks.get(e)}handleSendMessage(e){let t=e.message,r=t.contextId??n(),i=t.taskId??this._contextActiveTask.get(r);return i&&this._tasks.has(i)?this._continueTask(i,t):this._createTask(r,t)}markCompleted(e,t){let n=this._tasks.get(e);n&&this._transitionState(n,`TASK_STATE_COMPLETED`,t)}markFailed(e,t){let r=this._tasks.get(e);r&&this._transitionState(r,`TASK_STATE_FAILED`,{messageId:n(),role:`ROLE_AGENT`,parts:[{text:t}]})}markInputRequired(e,t){let n=this._tasks.get(e);n&&this._transitionState(n,`TASK_STATE_INPUT_REQUIRED`,t)}markWorking(e){let t=this._tasks.get(e);t&&this._transitionState(t,`TASK_STATE_WORKING`)}off(e){this._listeners.delete(e)}on(e){this._listeners.add(e)}_addTask(e){for(this._tasks.set(e.id,e),this._taskOrder.push(e.id);this._taskOrder.length>this._config.maxTasks;){let e=this._taskOrder.shift(),t=this._tasks.get(e);if(t&&h.has(t.status.state))this._tasks.delete(e),t.contextId&&this._contextActiveTask.delete(t.contextId);else{this._taskOrder.unshift(e);break}}}_continueTask(e,t){let n=this._tasks.get(e);return g.has(n.status.state)&&this._transitionState(n,`TASK_STATE_WORKING`),n.history||=[],n.history.push(t),n.history.length>this._config.maxHistoryPerTask&&(n.history=n.history.slice(-this._config.maxHistoryPerTask)),this._touchTask(e),{task:n}}_createTask(e,t){let r=n(),i={id:r,contextId:e,status:{state:`TASK_STATE_SUBMITTED`,timestamp:(/* @__PURE__ */ new Date()).toISOString()},history:[t]};return this._addTask(i),this._contextActiveTask.set(e,r),this._emitStatusUpdate(i),{task:i}}_emit(e){for(let t of this._listeners)try{t(e)}catch(e){console.error(`PeerTaskManager: listener error`,e)}}_emitAGUI(e,t){this._emit({type:`aguiEvent`,taskId:e.id,contextId:e.contextId??``,payload:t})}_emitStatusUpdate(e){let t={taskId:e.id,contextId:e.contextId??``,status:e.status};this._emit({type:`statusUpdate`,taskId:e.id,contextId:e.contextId??``,payload:t})}_touchTask(e){let t=this._taskOrder.indexOf(e);t!==-1&&(this._taskOrder.splice(t,1),this._taskOrder.push(e))}_transitionState(e,t,n){let r=e.status.state,i=A.get(r);i&&!i.has(t)?console.warn(`PeerTaskManager: invalid transition ${r} → ${t} for task ${e.id}`):h.has(r)?console.warn(`PeerTaskManager: task ${e.id} is in terminal state ${r}, cannot transition`):(e.status={state:t,message:n,timestamp:(/* @__PURE__ */ new Date()).toISOString()},h.has(t)&&e.contextId&&this._contextActiveTask.get(e.contextId)===e.id&&this._contextActiveTask.delete(e.contextId),this._emitStatusUpdate(e))}};const M=new t.State(null);let N=null;function P(e){N!==null&&(clearTimeout(N),N=null),M.set(e)}function F(e=1500){N!==null&&clearTimeout(N),N=setTimeout(()=>{M.set(null),N=null},e)}const I=15360;var L=class a{static _RECONNECT_BASE_MS=1e3;static _RECONNECT_MAX_MS=6e4;connectedPeersSignal=new t.State([]);connections=/* @__PURE__ */ new Map;messageCallback=null;myPeerId=``;peerCards=new O;running=!1;serverConfig={};transferProgressSignal=M;trustedPeerIds=/* @__PURE__ */ new Set;type=`peerjs`;typingCallback=null;_inboundRemap=/* @__PURE__ */ new Map;_localCard=null;_onTaskCompleteCallback=null;peer=null;_inboundSavePromises=/* @__PURE__ */ new Map;_pendingInboundFile=null;_pendingRequests=/* @__PURE__ */ new Map;_reconnectAttempts=0;_reconnectTimer=null;_roomNotificationHandler=null;_taskManagers=/* @__PURE__ */ new Map;_inboundTransfers=/* @__PURE__ */ new Map;constructor(){typeof globalThis.addEventListener==`function`&&globalThis.addEventListener(`peerjs-dc-handle-chunk`,e=>{if(e?.detail?.chunkInfo){if(this._inboundTransfers.size>0)return;let{count:t,total:n}=e.detail.chunkInfo,r=t+1;P({count:r,total:n,direction:`receive`}),r>=n&&F(1500)}})}completeActiveTask(e){let t=e.replace(/^peer:/,``),n=this._taskManagers.get(t);if(!n)return!1;let r=n.getActiveTasks();if(r.length===0)return!1;let i=r[r.length-1];return n.markWorking(i.id),n.markCompleted(i.id),!0}configure(e,t,n={}){this.myPeerId=e.trim(),this.trustedPeerIds=new Set(t.map(e=>e.trim()).filter(Boolean)),this.serverConfig=n}connectPeer(e){this._getOrOpenConnection(e)}getTaskManager(e){let t=this._taskManagers.get(e);return t||(t=new j,this._taskManagers.set(e,t),t.on(t=>{this._forwardTaskEvent(e,t)})),t}isConfigured(){return this.myPeerId.length>0}isPeerConnected(e){let t=this.connections.get(e);return!!t&&!!t.open}onMessage(e){this.messageCallback=e}onTaskComplete(e){this._onTaskCompleteCallback=e}onTyping(e){this.typingCallback=e}sendRoomNotification(e,t){let n=this._getOrOpenConnection(e);if(!n)return!1;if(n.open)try{return n.send(t),!0}catch(t){return console.error(`PeerJsChannel: failed to send room notification to ${e}:`,t),!1}return this._waitForOpen(n).then(()=>{try{n.send(t)}catch(t){console.error(`PeerJsChannel: failed to flush room notification to ${e}:`,t)}}).catch(()=>{}),!0}setRoomNotificationHandler(e){this._roomNotificationHandler=e}async sendAttachmentsToRoom(t,r,a){let o=this.myPeerId,s=(a||[]).filter(e=>!!e.path);if(s.length!==0)try{let a=await e();for(let e of s){let s;try{s=await i(a,r,e.path)}catch(t){console.warn(`PeerJsChannel: failed to read file ${e.path} for room:`,t);continue}let c=e.path,l=e.mimeType||`application/octet-stream`,u=Math.max(1,Math.ceil(s.length/I));for(let i of t.members){if(i.peerId===o)continue;let t=this._getOrOpenConnection(i.peerId);if(t)try{await this._waitForOpen(t);let e=n();t.send({type:`__file_header`,id:e,name:c,mimeType:l,size:s.length,totalChunks:u,chunkSize:I,groupId:r});for(let n=0;n<u;n++){let r=n*I,i=Math.min(r+I,s.length),a=s.subarray(r,i),o=a.buffer.slice(a.byteOffset,a.byteOffset+a.byteLength);t.send({type:`__file_chunk`,id:e,name:c,index:n,totalChunks:u,data:o}),P({count:n+1,total:u,direction:`send`}),await this._waitForBufferDrain(t)}F(1500)}catch(t){console.warn(`PeerJsChannel: failed to stream file ${e.path} to room member ${i.peerId}:`,t)}}}}catch(e){console.error(`PeerJsChannel: failed to access DB for room file transfer`,e)}}setTyping(e,t){let n=e.replace(/^peer:/,``),r=this.connections.get(n);if(r)try{r.send({type:`typing`,typing:t})}catch{}}start(){this.isConfigured()&&!this.running&&(this.running=!0,this._localCard=w({peerId:this.myPeerId,name:this.myPeerId,description:`ShadowClaw AI assistant`,streaming:!0}),this._initPeer())}ensureConnected(e=!1){if(!this.running||!this.isConfigured())return;this._reconnectTimer!==null&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null),this._reconnectAttempts=0;let t=this.peer;if(!t||t.destroyed||e&&!t.open){if(t&&!t.destroyed)try{t.destroy()}catch{}this.peer=null,this._initPeer()}else if(t.disconnected)try{t.reconnect?.()}catch{this._initPeer()}}stop(){if(this.running=!1,this._reconnectTimer!==null&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null),this._reconnectAttempts=0,this.connections.forEach(e=>{try{e.close()}catch{}}),this.connections.clear(),this.peerCards.clear(),this._taskManagers.clear(),this._pendingRequests.forEach(({timer:e})=>clearTimeout(e)),this._pendingRequests.clear(),this._updateConnectedPeersSignal(),this.peer){try{this.peer.destroy()}catch{}this.peer=null}}async send(t,r,a){let o=t.replace(/^peer:/,``),s=this._getOrOpenConnection(o);if(!s)console.warn(`PeerJsChannel: no connection available for ${o}`);else try{await this._waitForOpen(s);let{attachments:o}=R(r),c=[...(a||[]).filter(e=>!!e.path),...o.map(e=>({path:e.path,mimeType:`application/octet-stream`}))],l=/* @__PURE__ */ new Map,u=[];try{let r=await e();for(let e of c)if(e.path)try{let a=await i(r,t,e.path),o=e.path;l.has(e.path)||l.set(e.path,o);let c=e.mimeType||`application/octet-stream`,d=n(),f=Math.max(1,Math.ceil(a.length/I));s.send({type:`__file_header`,id:d,name:o,mimeType:c,size:a.length,totalChunks:f,chunkSize:I,groupId:t});for(let e=0;e<f;e++){let t=e*I,n=Math.min(t+I,a.length),r=a.subarray(t,n),i=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);s.send({type:`__file_chunk`,id:d,name:o,index:e,totalChunks:f,data:i}),P({count:e+1,total:f,direction:`send`}),await this._waitForBufferDrain(s)}F(1500),u.push({kind:`file`,name:o,mimeType:c,size:a.length})}catch(t){console.warn(`PeerJsChannel: failed to process file ${e.path}:`,t)}}catch(e){console.error(`PeerJsChannel: failed to access DB`,e)}let d=r;for(let[e,t]of l){let n=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);d=d.replace(RegExp(`(!?\\[.*?\\])\\(${n}\\)`,`g`),`$1(${t})`)}let f=[...u,{kind:`text`,text:d}],p=n(),m={jsonrpc:`2.0`,id:p,method:_.SEND_MESSAGE,params:{message:{messageId:n(),role:`ROLE_AGENT`,parts:f}}};s.send(m),this._registerPendingRequest(p,e=>{})}catch(e){console.error(`PeerJsChannel: send failed for ${o}:`,e),window.dispatchEvent(new CustomEvent(`shadow-claw-peer-error`,{detail:{remotePeerId:o,error:e instanceof Error?e.message:String(e)}}))}}async sendA2UI(e,t){let r=e.replace(/^peer:/,``),i=this._getOrOpenConnection(r);if(!i)console.warn(`PeerJsChannel.sendA2UI: no connection available for ${r}`);else try{await this._waitForOpen(i);let e={jsonrpc:`2.0`,method:`message/send`,id:n(),params:{message:{role:`agent`,parts:[{kind:`a2ui`,envelope:t}]}}};i.send(e)}catch(e){console.error(`PeerJsChannel.sendA2UI: failed for ${r}:`,e)}}async sendA2UIAction(e,t){let r=e.replace(/^peer:/,``),i=this._getOrOpenConnection(r);if(!i)console.warn(`PeerJsChannel.sendA2UIAction: no connection available for ${r}`);else try{await this._waitForOpen(i);let e={jsonrpc:`2.0`,method:`message/send`,id:n(),params:{message:{role:`user`,parts:[{kind:`a2ui-action`,action:t}]}}};i.send(e)}catch(e){console.error(`PeerJsChannel.sendA2UIAction: failed for ${r}:`,e)}}_exchangeAgentCards(e,t){if(!this._localCard)return;let n=T();t.send(n),this._registerPendingRequest(n.id,t=>{let n=D(t);n&&(this.peerCards.set(e,n),console.log(`PeerJsChannel: received AgentCard from ${e}: "${n.name}"`))})}_forwardTaskEvent(e,t){let n=this.connections.get(e);if(!n)return;let r;switch(t.type){case`statusUpdate`:r=y.STATUS_UPDATE;break;case`artifactUpdate`:r=y.ARTIFACT_UPDATE;break;case`aguiEvent`:r=v.EVENT;break;default:return}let i={jsonrpc:`2.0`,method:r,params:t.payload};try{n.send(i)}catch(n){console.error(`PeerJsChannel: failed to forward ${t.type} to ${e}:`,n)}}_getOrOpenConnection(e){let t=this.connections.get(e);if(t)return t;if(!this.peer)return null;try{let t=this.peer.connect(e,{reliable:!0,serialization:`binary`});return t?(this._handleIncomingConnection(t),t):null}catch(t){return console.error(`PeerJsChannel: failed to connect to ${e}:`,t),null}}_handleA2ACancelTask(e,t){let n=t.params;if(!n?.taskId){this._sendJsonRpcError(e,t.id,{code:x.INVALID_PARAMS,message:`Missing taskId in CancelTask params`});return}let r=this._taskManagers.get(e);if(!r){this._sendJsonRpcError(e,t.id,{code:x.TASK_NOT_FOUND,message:`Task not found: ${n.taskId}`});return}if(!r.cancelTask(n.taskId)){this._sendJsonRpcError(e,t.id,{code:x.TASK_NOT_CANCELABLE,message:`Task not cancelable: ${n.taskId}`});return}let i=this.connections.get(e);if(i){let e=r.getTask(n.taskId),a={jsonrpc:`2.0`,id:t.id,result:{task:e}};i.send(a)}}_handleA2AGetTask(e,t){let n=t.params;if(!n?.taskId){this._sendJsonRpcError(e,t.id,{code:x.INVALID_PARAMS,message:`Missing taskId in GetTask params`});return}let r=this._taskManagers.get(e)?.getTask(n.taskId);if(!r){this._sendJsonRpcError(e,t.id,{code:x.TASK_NOT_FOUND,message:`Task not found: ${n.taskId}`});return}let i=this.connections.get(e);if(i){let e={jsonrpc:`2.0`,id:t.id,result:{task:r}};i.send(e)}}_handleA2AJsonRpc(e,t){if(C(t)){let e=String(t.id??``),n=this._pendingRequests.get(e);n&&(clearTimeout(n.timer),this._pendingRequests.delete(e),n.resolve(t));return}let n=t.method;if(n){if(n.startsWith(`room/`))this._roomNotificationHandler?.(e,n,t.params);else if(S(t)){let r={[_.GET_AGENT_CARD]:(e,t)=>this._handleGetAgentCard(e,t),[_.SEND_MESSAGE]:(e,t)=>this._handleA2ASendMessage(e,t),[_.CANCEL_TASK]:(e,t)=>this._handleA2ACancelTask(e,t),[_.GET_TASK]:(e,t)=>this._handleA2AGetTask(e,t)}[n];if(r){r(e,t);return}if(n===`message/send`){let n=t.params;n?.message?.parts&&Array.isArray(n.message.parts)&&this._processInboundA2AEnvelope(e,n.message.parts).catch(e=>console.error(`PeerJsChannel: failed to process inbound A2A envelope`,e))}else this._sendJsonRpcError(e,t.id,{code:x.METHOD_NOT_FOUND,message:`Method not found: ${n}`})}else({[v.EVENT]:(e,t)=>this._handleAGUIEventNotification(e,t),[y.STATUS_UPDATE]:(e,t)=>this._handleTaskStatusNotification(e,t),[y.ARTIFACT_UPDATE]:()=>{},"message/send":(e,t)=>{t?.message?.parts&&Array.isArray(t.message.parts)&&this._processInboundA2AEnvelope(e,t.message.parts).catch(e=>console.error(`PeerJsChannel: failed to process inbound A2A envelope`,e))}})[n]?.(e,t.params)}}_handleA2ASendMessage(e,t){let n=t.params;if(!n?.message){this._sendJsonRpcError(e,t.id,{code:x.INVALID_PARAMS,message:`Missing message in SendMessage params`});return}let r=this._taskManagers.get(e);r||(r=new j,this._taskManagers.set(e,r),r.on(t=>{this._forwardTaskEvent(e,t)}));let i=r.handleSendMessage(n),a=this.connections.get(e);if(a){let e={jsonrpc:`2.0`,id:t.id,result:i};a.send(e)}n.message.parts&&Array.isArray(n.message.parts)&&this._processInboundA2AEnvelope(e,n.message.parts,i.task?.id,i.task?.contextId).catch(e=>console.error(`PeerJsChannel: failed to process A2A SendMessage`,e))}_handleAGUIEventNotification(e,t){if(!t||typeof t!=`object`)return;let n=t;window.dispatchEvent(new CustomEvent(`shadow-claw-agui-event`,{detail:{remotePeerId:e,event:n}}))}_handleGetAgentCard(e,t){if(!this._localCard){this._sendJsonRpcError(e,t.id,{code:x.INTERNAL_ERROR,message:`Agent card not available`});return}let n=E(t.id,this._localCard),r=this.connections.get(e);r&&r.send(n)}_handleInboundData(e,t){if(t instanceof ArrayBuffer||t instanceof Uint8Array){if(this._pendingInboundFile){let n=this._pendingInboundFile.name,r=new Uint8Array(t),i=this._pendingInboundFile.targetGroupId||`peer:${e}`,a=this._saveInboundFile(i,n,r);this._inboundSavePromises.set(n,a),this._pendingInboundFile=null}return}if(!t||typeof t!=`object`)return;let r=t;if(r.type===`__file_header`){let t=r.id||r.name,n=r.totalChunks||1,i=this._inboundTransfers.get(t),a=typeof r.groupId==`string`&&r.groupId.startsWith(`room:`)?r.groupId:`peer:${e}`;this._inboundTransfers.set(t,{transferId:t,name:r.name,mimeType:r.mimeType||`application/octet-stream`,size:r.size||0,totalChunks:n,receivedChunks:i?.receivedChunks||/* @__PURE__ */ new Map,receivedBytes:i?.receivedBytes||0,targetGroupId:a}),this._pendingInboundFile={name:r.name,mimeType:r.mimeType,size:r.size,targetGroupId:a},P({count:0,total:n,direction:`receive`})}else if(r.type===`__file_chunk`){let t=r.id||r.name,n=this._inboundTransfers.get(t);if(!n){let e=r.totalChunks||1;n={transferId:t,name:r.name,mimeType:`application/octet-stream`,size:0,totalChunks:e,receivedChunks:/* @__PURE__ */ new Map,receivedBytes:0},this._inboundTransfers.set(t,n)}let i=typeof r.index==`number`?r.index:0,a=r.data instanceof ArrayBuffer?new Uint8Array(r.data):r.data instanceof Uint8Array?r.data:new Uint8Array(r.data||[]);if(n.receivedChunks.has(i)||(n.receivedChunks.set(i,a),n.receivedBytes+=a.byteLength),P({count:n.receivedChunks.size,total:n.totalChunks,direction:`receive`}),n.receivedChunks.size>=n.totalChunks){let r=new Uint8Array(n.size||n.receivedBytes),i=0;for(let e=0;e<n.totalChunks;e++){let t=n.receivedChunks.get(e);t&&(r.set(t,i),i+=t.byteLength)}let a=n.targetGroupId||`peer:${e}`,o=this._saveInboundFile(a,n.name,r);this._inboundSavePromises.set(n.name,o),this._inboundTransfers.delete(t),this._pendingInboundFile=null,F(1500)}}else if(r.type===`typing`)this.typingCallback?.(`peer:${e}`,!!r.typing);else if(r.type===`chat`){let t=typeof r.text==`string`?r.text.trim():``;t&&this.messageCallback?.({id:n(),groupId:`peer:${e}`,sender:e,content:t,timestamp:Date.now(),channel:`peerjs`})}else if(r.jsonrpc===`2.0`)this._handleA2AJsonRpc(e,r);else if(r.type===`command:execute`){let t=r.payload||{},i=t.action||``,a=t.args||{},o=t.commandId||``;import(`./init-control-plane-BoJijVtf.js`).then(({executeClientControlCommand:e})=>e(i,a)).then(t=>{let r=this.connections.get(e);if(r){let e=!!t?.error;r.send({id:n(),type:`command:result`,payload:{commandId:o,action:i,success:!e,data:t,...e?{error:t.error}:{}}})}}).catch(t=>{let r=this.connections.get(e);r&&r.send({id:n(),type:`command:result`,payload:{commandId:o,action:i,success:!1,error:t?.message||String(t)}})})}}_isTrustedPeer(e){if(this.trustedPeerIds.size===0||this.trustedPeerIds.has(e))return!0;for(let t of this.trustedPeerIds){let n=t.trim();if(n.endsWith(`*`)&&e.startsWith(n.slice(0,-1))||n===`cli`&&e.startsWith(`cli-`))return!0}return!1}_handleIncomingConnection(e){let t=e.peer;if(this._isTrustedPeer(t))this._attachChunkProgressTracker(e),this.connections.set(t,e),this._updateConnectedPeersSignal(),e.on(`open`,()=>{console.log(`PeerJsChannel: connection opened with ${t}`),this._exchangeAgentCards(t,e)}),e.on(`data`,e=>{this._handleInboundData(t,e)}),e.on(`close`,()=>{console.log(`PeerJsChannel: connection closed with ${t}`),this.connections.delete(t),this.peerCards.delete(t),this._taskManagers.delete(t),this._updateConnectedPeersSignal()}),e.on(`error`,e=>{console.error(`PeerJsChannel: connection error with ${t}:`,e),this.connections.delete(t),this._updateConnectedPeersSignal(),window.dispatchEvent(new CustomEvent(`shadow-claw-peer-error`,{detail:{remotePeerId:t,error:e.message}}))}),e.on(`iceStateChanged`,e=>{(e===`failed`||e===`disconnected`||e===`closed`)&&(console.warn(`PeerJsChannel: ICE state changed to ${e} for ${t}`),this.connections.delete(t),this._updateConnectedPeersSignal())});else{console.warn(`PeerJsChannel: rejecting connection from untrusted peer: ${t}`);try{e.close()}catch{}}}_attachChunkProgressTracker(e){let t=e;if(t._chunkProgressPatched)return;t._chunkProgressPatched=!0;let n=this,r=t._handleChunk;typeof r==`function`&&(t._handleChunk=function(e){if(e&&typeof e==`object`&&`__peerData`in e&&n._inboundTransfers.size===0){let t=e.__peerData,n=this._chunkedData?.[t]?.count??0,r=e.total;if(typeof globalThis.dispatchEvent==`function`&&typeof CustomEvent==`function`)globalThis.dispatchEvent(new CustomEvent(`peerjs-dc-handle-chunk`,{detail:{chunkInfo:{count:n,total:r}}}));else{let e=n+1;P({count:e,total:r,direction:`receive`}),e>=r&&F(1500)}}return r.call(this,e)})}_handleTaskStatusNotification(e,t){if(!t||typeof t!=`object`)return;let n=t;if(n.status?.state&&h.has(n.status.state)){let t=`peer:${e}`;this._onTaskCompleteCallback?.(t)}window.dispatchEvent(new CustomEvent(`shadow-claw-task-status`,{detail:{remotePeerId:e,...n}}))}async _initPeer(){let{Peer:e}=await import(`./bundler-UnYfEehP.js`),t={},n=this.serverConfig.host??`0.peerjs.com`,r=this.serverConfig.port??443,i=this.serverConfig.path??`/`,a=this.serverConfig.secure??!0;t.host=n,t.port=r,t.path=i,t.secure=a,t.debug=3,t.config={iceServers:this.serverConfig.iceServers??[{urls:`stun:stun.l.google.com:19302`},{urls:`stun:stun1.l.google.com:19302`}]},this.peer=new e(this.myPeerId,t),this.peer.on(`open`,e=>{console.log(`PeerJsChannel: connected to signaling server, peer ID: ${e}`),this._reconnectAttempts=0}),this.peer.on(`connection`,e=>{this._handleIncomingConnection(e)}),this.peer.on(`error`,e=>{console.error(`PeerJsChannel: peer error [${e.type}]:`,e.message),(e.type===`peer-unavailable`||e.type===`unavailable-id`)&&window.dispatchEvent(new CustomEvent(`shadow-claw-peer-error`,{detail:{error:e.message}})),e.type!==`peer-unavailable`&&e.type!==`network`&&e.type!==`disconnected`&&e.type===`unavailable-id`&&console.warn(`PeerJsChannel: peer ID is already in use. Stop the channel and reconfigure.`)}),this.peer.on(`disconnected`,()=>{this.running&&this._scheduleReconnect()}),this.peer.on(`close`,()=>{console.log(`PeerJsChannel: peer closed`)})}_registerPendingRequest(e,t){let n=String(e??``),r=setTimeout(()=>{this._pendingRequests.delete(n),console.warn(`PeerJsChannel: JSON-RPC request ${n} timed out (10s)`)},1e4);this._pendingRequests.set(n,{resolve:t,timer:r})}_scheduleReconnect(){if(this._reconnectTimer!==null)return;let e=Math.min(a._RECONNECT_BASE_MS*2**this._reconnectAttempts,a._RECONNECT_MAX_MS);this._reconnectAttempts++,console.log(`PeerJsChannel: disconnected from signaling server, reconnecting in ${(e/1e3).toFixed(1)}s (attempt ${this._reconnectAttempts})`),this._reconnectTimer=setTimeout(()=>{if(this._reconnectTimer=null,this.running)try{this.peer?.reconnect?.()}catch{this._scheduleReconnect()}},e)}_sendJsonRpcError(e,t,n){let r=this.connections.get(e);if(!r)return;let i={jsonrpc:`2.0`,id:t,error:n};try{r.send(i)}catch{}}async _waitForBufferDrain(e,t=65536){let n=e.dataChannel||e._dc;n&&typeof n.bufferedAmount==`number`&&(n.bufferedAmount<=t||await new Promise(e=>{let r=setInterval(()=>{(!n||n.bufferedAmount<=t)&&(clearInterval(r),e())},20);if(typeof n.addEventListener==`function`){let i=()=>{clearInterval(r),n.removeEventListener(`bufferedamountlow`,i),e()};try{n.bufferedAmountLowThreshold=t,n.addEventListener(`bufferedamountlow`,i,{once:!0})}catch{}}}))}async _saveInboundFile(t,n,i){try{let a=await e(),o=n,s=1;for(;await r(a,t,o);){let e=n.lastIndexOf(`.`);if(e>0&&e<n.length-1){let t=n.substring(0,e),r=n.substring(e);o=`${t} (${s})${r}`}else o=`${n} (${s})`;s++}o!==n&&this._inboundRemap.set(n,o),await c(a,t,o,i);try{let{orchestratorStore:e}=await import(`./orchestrator-CaUpEVkQ.js`).then(e=>e.n);e.activeGroupId===t&&await e.loadFiles(a)}catch{}}catch(e){console.error(`PeerJsChannel: failed to write inbound file bytes`,e)}}_updateConnectedPeersSignal(){this.connectedPeersSignal.set(Array.from(this.connections.keys()))}_waitForOpen(e){return e.open?Promise.resolve():new Promise((t,n)=>{let r=setTimeout(()=>{n(/* @__PURE__ */ Error(`Connection open timeout (5s)`))},5e3);e.on(`open`,()=>{clearTimeout(r),t()}),e.on(`error`,e=>{clearTimeout(r),n(e)})})}async _processInboundA2AEnvelope(e,t,r,i){let a=`peer:${e}`,o=``,s=[],c=[],l;for(let e of t)if(e.kind===`text`&&typeof e.text==`string`)o+=e.text;else if(e.kind===`file`){let t=e.name||`attachment`,n=this._inboundSavePromises.get(t);if(n)try{await n}catch{}finally{this._inboundSavePromises.delete(t)}if(this._inboundRemap.has(t)){let e=this._inboundRemap.get(t),n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);o=o.replace(RegExp(`(!?\\[.*?\\])\\(${n}\\)`,`g`),`$1(${e})`),this._inboundRemap.delete(t),t=e}let r=t.split(`/`).pop()||`attachment`;s.push({fileName:r,mimeType:e.mimeType,path:t,size:e.size||0})}else e.kind===`a2ui`&&e.envelope?c.push(e.envelope):e.kind===`a2ui-action`&&e.action&&(l=e.action);o=o.trim(),(o||s.length!==0||c.length!==0||l)&&this.messageCallback?.({id:n(),groupId:a,sender:e,content:o,timestamp:Date.now(),channel:`peerjs`,attachments:s.length>0?s:void 0,a2uiEnvelopes:c.length>0?c:void 0,a2uiAction:l,taskId:r,contextId:i})}};function R(e){let t=[],n=/!?\[([^\]]*)\]\(([^)]+)\)/g,r,i=e;for(;(r=n.exec(e))!==null;){let e=r[1],n=z((r[2]||``).trim());n&&t.push({alt:e,path:n})}return{remainingText:i,attachments:t}}function z(e){if(!e)return null;let t=e.trim();if(/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(t)||t.startsWith(`//`))return null;let n=t.replace(/\\/g,`/`).replace(/^\/+/,``).replace(/^\.\//,``);if(!n)return null;let r=n.split(`/`).filter(Boolean);return r.some(e=>e===`..`)?null:r.join(`/`)}export{u as a,f as i,M as n,b as r,L as t};
1
+ import"./config-C16fFWtP.js";import{n as e}from"./db-BUuJo1Gf.js";import{t}from"./dist-CeFyqf9k.js";import{t as n}from"./ulid-BSJxYh6W.js";import{o as r}from"./tools-D-52Zmfc.js";import{a as i}from"./transformers-CQ9ss9rD.js";import{i as a}from"./mime-ClqNyXPc.js";import{t as o}from"./upload-group-file-A8kB7lvO.js";import{n as s}from"./filename-kBumOBho.js";import{t as c}from"./write-group-file-bytes-A8kB7lvO.js";function l(e){return s(e,{replacement:`-`,fallback:`attachment`,stripLeadingDots:!0,collapseReplacement:!0,stripControlChars:!0})}function u(e){return e.previewDisposition===`inline`||a(e.fileName,e.mimeType||``)===`image/png`}function d(e,t=``,n=Date.now()){let r=l(e),i=t.trim().replace(/[^a-zA-Z0-9._-]+/g,`-`).replace(/^-+|-+$/g,``);return`attachments/${n}-${i?`${i}-`:``}${r}`}async function f(e,t,n=[]){let r=[];for(let i of n){let n=l(i.fileName||``),s=i.path||d(n,i.id),c=i.source,u=a(n,i.mimeType||``),f=i.size;if(c){let r=await p(c);u=a(n,i.mimeType||r.type),f=typeof f==`number`?f:r.size,await o(e,t,s,r)}r.push(m({...i,fileName:n,mimeType:u,size:f,path:s,previewDisposition:i.previewDisposition||(u===`image/png`?`inline`:`file`)}))}return r}async function p(e){if(e.kind===`local-file`)return e.file;if(e.kind===`inline-text`)return new Blob([e.text],{type:e.mimeType||`text/plain`});let t=await fetch(e.url,{headers:e.headers});if(!t.ok)throw Error(`Attachment download failed: HTTP ${t.status} ${t.statusText}`);return await t.blob()}function m(e){let{source:t,...n}=e;return n}const h=/* @__PURE__ */ new Set([`TASK_STATE_COMPLETED`,`TASK_STATE_FAILED`,`TASK_STATE_CANCELED`,`TASK_STATE_REJECTED`]),g=/* @__PURE__ */ new Set([`TASK_STATE_INPUT_REQUIRED`,`TASK_STATE_AUTH_REQUIRED`]),_={SEND_MESSAGE:`SendMessage`,SEND_STREAMING_MESSAGE:`SendStreamingMessage`,GET_TASK:`GetTask`,CANCEL_TASK:`CancelTask`,GET_AGENT_CARD:`GetAgentCard`},v={EVENT:`agui/event`},y={STATUS_UPDATE:`tasks/statusUpdate`,ARTIFACT_UPDATE:`tasks/artifactUpdate`},b={JOIN:`room/join`,ROSTER:`room/roster`,LEAVE:`room/leave`,MESSAGE:`room/message`,INVITE:`room/invite`,RELAY:`room/relay`,A2UI:`room/a2ui`,A2UI_ACTION:`room/a2ui-action`},x={TASK_NOT_FOUND:-32001,TASK_NOT_CANCELABLE:-32002,PUSH_NOTIFICATION_NOT_SUPPORTED:-32003,UNSUPPORTED_OPERATION:-32004,CONTENT_TYPE_NOT_SUPPORTED:-32005,INVALID_AGENT_RESPONSE:-32006,PARSE_ERROR:-32700,INVALID_REQUEST:-32600,METHOD_NOT_FOUND:-32601,INVALID_PARAMS:-32602,INTERNAL_ERROR:-32603};function S(e){return typeof e==`object`&&!!e&&e.jsonrpc===`2.0`&&(e.id===null||typeof e.id==`string`||typeof e.id==`number`)&&typeof e.method==`string`}function C(e){return typeof e==`object`&&!!e&&e.jsonrpc===`2.0`&&(e.id===null||typeof e.id==`string`||typeof e.id==`number`)&&!(`method`in e)}function w(e){let t={url:`webrtc://${e.peerId}`,protocolBinding:`https://xt-ml.github.io/shadow-claw/bindings/webrtc-datachannel/v1`,protocolVersion:`1.0`},n={streaming:e.streaming??!0,pushNotifications:!1};return{name:e.name,description:e.description??`AI assistant agent (${e.name})`,version:e.version??`1.0.0`,supportedInterfaces:[t],capabilities:n,defaultInputModes:[`text/plain`,`application/json`],defaultOutputModes:[`text/plain`,`application/json`],skills:e.skills??[],iconUrl:e.iconUrl}}function T(){return{jsonrpc:`2.0`,id:n(),method:_.GET_AGENT_CARD}}function E(e,t){return{jsonrpc:`2.0`,id:e,result:t}}function D(e){if(e.error)return console.warn(`GetAgentCard returned error:`,e.error),null;let t=e.result;return!t||typeof t!=`object`||typeof t.name!=`string`||typeof t.version!=`string`?null:t}var O=class{_cards=/* @__PURE__ */ new Map;clear(){this._cards.clear()}delete(e){this._cards.delete(e)}entries(){return this._cards.entries()}get(e){return this._cards.get(e)}getDisplayName(e){return this._cards.get(e)?.name??e}has(e){return this._cards.has(e)}set(e,t){this._cards.set(e,t)}supportsStreaming(e){return this._cards.get(e)?.capabilities?.streaming??!1}};const k={maxTasks:100,maxHistoryPerTask:50},A=/* @__PURE__ */ new Map([[`TASK_STATE_SUBMITTED`,/* @__PURE__ */ new Set([`TASK_STATE_WORKING`,`TASK_STATE_REJECTED`,`TASK_STATE_CANCELED`,`TASK_STATE_FAILED`])],[`TASK_STATE_WORKING`,/* @__PURE__ */ new Set([`TASK_STATE_COMPLETED`,`TASK_STATE_FAILED`,`TASK_STATE_CANCELED`,`TASK_STATE_INPUT_REQUIRED`,`TASK_STATE_AUTH_REQUIRED`])],[`TASK_STATE_INPUT_REQUIRED`,/* @__PURE__ */ new Set([`TASK_STATE_WORKING`,`TASK_STATE_CANCELED`,`TASK_STATE_FAILED`])],[`TASK_STATE_AUTH_REQUIRED`,/* @__PURE__ */ new Set([`TASK_STATE_WORKING`,`TASK_STATE_CANCELED`,`TASK_STATE_FAILED`])]]);var j=class{_config;_contextActiveTask=/* @__PURE__ */ new Map;_listeners=/* @__PURE__ */ new Set;_taskOrder=[];_tasks=/* @__PURE__ */ new Map;constructor(e){this._config={...k,...e}}addArtifact(e,t,n=!1){let r=this._tasks.get(e);if(!r)return;if(r.artifacts||=[],n){let e=r.artifacts.find(e=>e.artifactId===t.artifactId);e?e.parts.push(...t.parts):r.artifacts.push(t)}else r.artifacts.push(t);let i={taskId:r.id,contextId:r.contextId??``,artifact:t,append:n,lastChunk:!1};this._emit({type:`artifactUpdate`,taskId:r.id,contextId:r.contextId??``,payload:i})}cancelTask(e){let t=this._tasks.get(e);return!t||h.has(t.status.state)?!1:(this._transitionState(t,`TASK_STATE_CANCELED`,{messageId:n(),role:`ROLE_AGENT`,parts:[{text:`Task canceled by peer request.`}]}),!0)}clear(){this._tasks.clear(),this._taskOrder=[],this._contextActiveTask.clear()}emitRunError(e,t,n){let r=this._tasks.get(e);if(!r)return;let i={type:`RUN_ERROR`,message:t,code:n,timestamp:Date.now()};this._emitAGUI(r,i)}emitRunFinished(e){let t=this._tasks.get(e);if(!t)return;let n={type:`RUN_FINISHED`,threadId:t.contextId??t.id,runId:t.id,timestamp:Date.now()};this._emitAGUI(t,n)}emitRunStarted(e){let t=this._tasks.get(e);if(!t)return;let n={type:`RUN_STARTED`,threadId:t.contextId??t.id,runId:t.id,timestamp:Date.now()};this._emitAGUI(t,n)}emitStateSnapshot(e,t){let n=this._tasks.get(e);if(!n)return;let r={type:`STATE_SNAPSHOT`,snapshot:t,timestamp:Date.now()};this._emitAGUI(n,r)}emitTextMessageContent(e,t,n){let r=this._tasks.get(e);if(!r)return;let i={type:`TEXT_MESSAGE_CONTENT`,messageId:t,delta:n,timestamp:Date.now()};this._emitAGUI(r,i)}emitTextMessageEnd(e,t){let n=this._tasks.get(e);if(!n)return;let r={type:`TEXT_MESSAGE_END`,messageId:t,timestamp:Date.now()};this._emitAGUI(n,r)}emitTextMessageStart(e,t,n=`assistant`){let r=this._tasks.get(e);if(!r)return;let i={type:`TEXT_MESSAGE_START`,messageId:t,role:n,timestamp:Date.now()};this._emitAGUI(r,i)}emitToolCallEnd(e,t){let n=this._tasks.get(e);if(!n)return;let r={type:`TOOL_CALL_END`,toolCallId:t,timestamp:Date.now()};this._emitAGUI(n,r)}emitToolCallStart(e,t,n,r){let i=this._tasks.get(e);if(!i)return;let a={type:`TOOL_CALL_START`,toolCallId:t,toolCallName:n,parentMessageId:r,timestamp:Date.now()};this._emitAGUI(i,a)}getActiveTaskForContext(e){let t=this._contextActiveTask.get(e);if(t)return this._tasks.get(t)}getActiveTasks(){return Array.from(this._tasks.values()).filter(e=>!h.has(e.status.state))}getAllTasks(){return Array.from(this._tasks.values())}getTask(e){return this._tasks.get(e)}handleSendMessage(e){let t=e.message,r=t.contextId??n(),i=t.taskId??this._contextActiveTask.get(r);return i&&this._tasks.has(i)?this._continueTask(i,t):this._createTask(r,t)}markCompleted(e,t){let n=this._tasks.get(e);n&&this._transitionState(n,`TASK_STATE_COMPLETED`,t)}markFailed(e,t){let r=this._tasks.get(e);r&&this._transitionState(r,`TASK_STATE_FAILED`,{messageId:n(),role:`ROLE_AGENT`,parts:[{text:t}]})}markInputRequired(e,t){let n=this._tasks.get(e);n&&this._transitionState(n,`TASK_STATE_INPUT_REQUIRED`,t)}markWorking(e){let t=this._tasks.get(e);t&&this._transitionState(t,`TASK_STATE_WORKING`)}off(e){this._listeners.delete(e)}on(e){this._listeners.add(e)}_addTask(e){for(this._tasks.set(e.id,e),this._taskOrder.push(e.id);this._taskOrder.length>this._config.maxTasks;){let e=this._taskOrder.shift(),t=this._tasks.get(e);if(t&&h.has(t.status.state))this._tasks.delete(e),t.contextId&&this._contextActiveTask.delete(t.contextId);else{this._taskOrder.unshift(e);break}}}_continueTask(e,t){let n=this._tasks.get(e);return g.has(n.status.state)&&this._transitionState(n,`TASK_STATE_WORKING`),n.history||=[],n.history.push(t),n.history.length>this._config.maxHistoryPerTask&&(n.history=n.history.slice(-this._config.maxHistoryPerTask)),this._touchTask(e),{task:n}}_createTask(e,t){let r=n(),i={id:r,contextId:e,status:{state:`TASK_STATE_SUBMITTED`,timestamp:(/* @__PURE__ */ new Date()).toISOString()},history:[t]};return this._addTask(i),this._contextActiveTask.set(e,r),this._emitStatusUpdate(i),{task:i}}_emit(e){for(let t of this._listeners)try{t(e)}catch(e){console.error(`PeerTaskManager: listener error`,e)}}_emitAGUI(e,t){this._emit({type:`aguiEvent`,taskId:e.id,contextId:e.contextId??``,payload:t})}_emitStatusUpdate(e){let t={taskId:e.id,contextId:e.contextId??``,status:e.status};this._emit({type:`statusUpdate`,taskId:e.id,contextId:e.contextId??``,payload:t})}_touchTask(e){let t=this._taskOrder.indexOf(e);t!==-1&&(this._taskOrder.splice(t,1),this._taskOrder.push(e))}_transitionState(e,t,n){let r=e.status.state,i=A.get(r);i&&!i.has(t)?console.warn(`PeerTaskManager: invalid transition ${r} → ${t} for task ${e.id}`):h.has(r)?console.warn(`PeerTaskManager: task ${e.id} is in terminal state ${r}, cannot transition`):(e.status={state:t,message:n,timestamp:(/* @__PURE__ */ new Date()).toISOString()},h.has(t)&&e.contextId&&this._contextActiveTask.get(e.contextId)===e.id&&this._contextActiveTask.delete(e.contextId),this._emitStatusUpdate(e))}};const M=new t.State(null);let N=null;function P(e){N!==null&&(clearTimeout(N),N=null),M.set(e)}function F(e=1500){N!==null&&clearTimeout(N),N=setTimeout(()=>{M.set(null),N=null},e)}const I=15360;var L=class a{static _RECONNECT_BASE_MS=1e3;static _RECONNECT_MAX_MS=6e4;connectedPeersSignal=new t.State([]);connections=/* @__PURE__ */ new Map;messageCallback=null;myPeerId=``;peerCards=new O;running=!1;serverConfig={};transferProgressSignal=M;trustedPeerIds=/* @__PURE__ */ new Set;type=`peerjs`;typingCallback=null;_inboundRemap=/* @__PURE__ */ new Map;_localCard=null;_onTaskCompleteCallback=null;peer=null;_inboundSavePromises=/* @__PURE__ */ new Map;_pendingInboundFile=null;_pendingRequests=/* @__PURE__ */ new Map;_reconnectAttempts=0;_reconnectTimer=null;_roomNotificationHandler=null;_taskManagers=/* @__PURE__ */ new Map;_inboundTransfers=/* @__PURE__ */ new Map;constructor(){typeof globalThis.addEventListener==`function`&&globalThis.addEventListener(`peerjs-dc-handle-chunk`,e=>{if(e?.detail?.chunkInfo){if(this._inboundTransfers.size>0)return;let{count:t,total:n}=e.detail.chunkInfo,r=t+1;P({count:r,total:n,direction:`receive`}),r>=n&&F(1500)}})}completeActiveTask(e){let t=e.replace(/^peer:/,``),n=this._taskManagers.get(t);if(!n)return!1;let r=n.getActiveTasks();if(r.length===0)return!1;let i=r[r.length-1];return n.markWorking(i.id),n.markCompleted(i.id),!0}configure(e,t,n={}){this.myPeerId=e.trim(),this.trustedPeerIds=new Set(t.map(e=>e.trim()).filter(Boolean)),this.serverConfig=n}connectPeer(e){this._getOrOpenConnection(e)}getTaskManager(e){let t=this._taskManagers.get(e);return t||(t=new j,this._taskManagers.set(e,t),t.on(t=>{this._forwardTaskEvent(e,t)})),t}isConfigured(){return this.myPeerId.length>0}isPeerConnected(e){let t=this.connections.get(e);return!!t&&!!t.open}onMessage(e){this.messageCallback=e}onTaskComplete(e){this._onTaskCompleteCallback=e}onTyping(e){this.typingCallback=e}sendRoomNotification(e,t){let n=this._getOrOpenConnection(e);if(!n)return!1;if(n.open)try{return n.send(t),!0}catch(t){return console.error(`PeerJsChannel: failed to send room notification to ${e}:`,t),!1}return this._waitForOpen(n).then(()=>{try{n.send(t)}catch(t){console.error(`PeerJsChannel: failed to flush room notification to ${e}:`,t)}}).catch(()=>{}),!0}setRoomNotificationHandler(e){this._roomNotificationHandler=e}async sendAttachmentsToRoom(t,r,a){let o=this.myPeerId,s=(a||[]).filter(e=>!!e.path);if(s.length!==0)try{let a=await e();for(let e of s){let s;try{s=await i(a,r,e.path)}catch(t){console.warn(`PeerJsChannel: failed to read file ${e.path} for room:`,t);continue}let c=e.path,l=e.mimeType||`application/octet-stream`,u=Math.max(1,Math.ceil(s.length/I));for(let i of t.members){if(i.peerId===o)continue;let t=this._getOrOpenConnection(i.peerId);if(t)try{await this._waitForOpen(t);let e=n();t.send({type:`__file_header`,id:e,name:c,mimeType:l,size:s.length,totalChunks:u,chunkSize:I,groupId:r});for(let n=0;n<u;n++){let r=n*I,i=Math.min(r+I,s.length),a=s.subarray(r,i),o=a.buffer.slice(a.byteOffset,a.byteOffset+a.byteLength);t.send({type:`__file_chunk`,id:e,name:c,index:n,totalChunks:u,data:o}),P({count:n+1,total:u,direction:`send`}),await this._waitForBufferDrain(t)}F(1500)}catch(t){console.warn(`PeerJsChannel: failed to stream file ${e.path} to room member ${i.peerId}:`,t)}}}}catch(e){console.error(`PeerJsChannel: failed to access DB for room file transfer`,e)}}setTyping(e,t){let n=e.replace(/^peer:/,``),r=this.connections.get(n);if(r)try{r.send({type:`typing`,typing:t})}catch{}}start(){this.isConfigured()&&!this.running&&(this.running=!0,this._localCard=w({peerId:this.myPeerId,name:this.myPeerId,description:`ShadowClaw AI assistant`,streaming:!0}),this._initPeer())}ensureConnected(e=!1){if(!this.running||!this.isConfigured())return;this._reconnectTimer!==null&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null),this._reconnectAttempts=0;let t=this.peer;if(!t||t.destroyed||e&&!t.open){if(t&&!t.destroyed)try{t.destroy()}catch{}this.peer=null,this._initPeer()}else if(t.disconnected)try{t.reconnect?.()}catch{this._initPeer()}}stop(){if(this.running=!1,this._reconnectTimer!==null&&(clearTimeout(this._reconnectTimer),this._reconnectTimer=null),this._reconnectAttempts=0,this.connections.forEach(e=>{try{e.close()}catch{}}),this.connections.clear(),this.peerCards.clear(),this._taskManagers.clear(),this._pendingRequests.forEach(({timer:e})=>clearTimeout(e)),this._pendingRequests.clear(),this._updateConnectedPeersSignal(),this.peer){try{this.peer.destroy()}catch{}this.peer=null}}async send(t,r,a){let o=t.replace(/^peer:/,``),s=this._getOrOpenConnection(o);if(!s)console.warn(`PeerJsChannel: no connection available for ${o}`);else try{await this._waitForOpen(s);let{attachments:o}=R(r),c=[...(a||[]).filter(e=>!!e.path),...o.map(e=>({path:e.path,mimeType:`application/octet-stream`}))],l=/* @__PURE__ */ new Map,u=[];try{let r=await e();for(let e of c)if(e.path)try{let a=await i(r,t,e.path),o=e.path;l.has(e.path)||l.set(e.path,o);let c=e.mimeType||`application/octet-stream`,d=n(),f=Math.max(1,Math.ceil(a.length/I));s.send({type:`__file_header`,id:d,name:o,mimeType:c,size:a.length,totalChunks:f,chunkSize:I,groupId:t});for(let e=0;e<f;e++){let t=e*I,n=Math.min(t+I,a.length),r=a.subarray(t,n),i=r.buffer.slice(r.byteOffset,r.byteOffset+r.byteLength);s.send({type:`__file_chunk`,id:d,name:o,index:e,totalChunks:f,data:i}),P({count:e+1,total:f,direction:`send`}),await this._waitForBufferDrain(s)}F(1500),u.push({kind:`file`,name:o,mimeType:c,size:a.length})}catch(t){console.warn(`PeerJsChannel: failed to process file ${e.path}:`,t)}}catch(e){console.error(`PeerJsChannel: failed to access DB`,e)}let d=r;for(let[e,t]of l){let n=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);d=d.replace(RegExp(`(!?\\[.*?\\])\\(${n}\\)`,`g`),`$1(${t})`)}let f=[...u,{kind:`text`,text:d}],p=n(),m={jsonrpc:`2.0`,id:p,method:_.SEND_MESSAGE,params:{message:{messageId:n(),role:`ROLE_AGENT`,parts:f}}};s.send(m),this._registerPendingRequest(p,e=>{})}catch(e){console.error(`PeerJsChannel: send failed for ${o}:`,e),window.dispatchEvent(new CustomEvent(`shadow-claw-peer-error`,{detail:{remotePeerId:o,error:e instanceof Error?e.message:String(e)}}))}}async sendA2UI(e,t){let r=e.replace(/^peer:/,``),i=this._getOrOpenConnection(r);if(!i)console.warn(`PeerJsChannel.sendA2UI: no connection available for ${r}`);else try{await this._waitForOpen(i);let e={jsonrpc:`2.0`,method:`message/send`,id:n(),params:{message:{role:`agent`,parts:[{kind:`a2ui`,envelope:t}]}}};i.send(e)}catch(e){console.error(`PeerJsChannel.sendA2UI: failed for ${r}:`,e)}}async sendA2UIAction(e,t){let r=e.replace(/^peer:/,``),i=this._getOrOpenConnection(r);if(!i)console.warn(`PeerJsChannel.sendA2UIAction: no connection available for ${r}`);else try{await this._waitForOpen(i);let e={jsonrpc:`2.0`,method:`message/send`,id:n(),params:{message:{role:`user`,parts:[{kind:`a2ui-action`,action:t}]}}};i.send(e)}catch(e){console.error(`PeerJsChannel.sendA2UIAction: failed for ${r}:`,e)}}_exchangeAgentCards(e,t){if(!this._localCard)return;let n=T();t.send(n),this._registerPendingRequest(n.id,t=>{let n=D(t);n&&(this.peerCards.set(e,n),console.log(`PeerJsChannel: received AgentCard from ${e}: "${n.name}"`))})}_forwardTaskEvent(e,t){let n=this.connections.get(e);if(!n)return;let r;switch(t.type){case`statusUpdate`:r=y.STATUS_UPDATE;break;case`artifactUpdate`:r=y.ARTIFACT_UPDATE;break;case`aguiEvent`:r=v.EVENT;break;default:return}let i={jsonrpc:`2.0`,method:r,params:t.payload};try{n.send(i)}catch(n){console.error(`PeerJsChannel: failed to forward ${t.type} to ${e}:`,n)}}_getOrOpenConnection(e){let t=this.connections.get(e);if(t)return t;if(!this.peer)return null;try{let t=this.peer.connect(e,{reliable:!0,serialization:`binary`});return t?(this._handleIncomingConnection(t),t):null}catch(t){return console.error(`PeerJsChannel: failed to connect to ${e}:`,t),null}}_handleA2ACancelTask(e,t){let n=t.params;if(!n?.taskId){this._sendJsonRpcError(e,t.id,{code:x.INVALID_PARAMS,message:`Missing taskId in CancelTask params`});return}let r=this._taskManagers.get(e);if(!r){this._sendJsonRpcError(e,t.id,{code:x.TASK_NOT_FOUND,message:`Task not found: ${n.taskId}`});return}if(!r.cancelTask(n.taskId)){this._sendJsonRpcError(e,t.id,{code:x.TASK_NOT_CANCELABLE,message:`Task not cancelable: ${n.taskId}`});return}let i=this.connections.get(e);if(i){let e=r.getTask(n.taskId),a={jsonrpc:`2.0`,id:t.id,result:{task:e}};i.send(a)}}_handleA2AGetTask(e,t){let n=t.params;if(!n?.taskId){this._sendJsonRpcError(e,t.id,{code:x.INVALID_PARAMS,message:`Missing taskId in GetTask params`});return}let r=this._taskManagers.get(e)?.getTask(n.taskId);if(!r){this._sendJsonRpcError(e,t.id,{code:x.TASK_NOT_FOUND,message:`Task not found: ${n.taskId}`});return}let i=this.connections.get(e);if(i){let e={jsonrpc:`2.0`,id:t.id,result:{task:r}};i.send(e)}}_handleA2AJsonRpc(e,t){if(C(t)){let e=String(t.id??``),n=this._pendingRequests.get(e);n&&(clearTimeout(n.timer),this._pendingRequests.delete(e),n.resolve(t));return}let n=t.method;if(n){if(n.startsWith(`room/`))this._roomNotificationHandler?.(e,n,t.params);else if(S(t)){let r={[_.GET_AGENT_CARD]:(e,t)=>this._handleGetAgentCard(e,t),[_.SEND_MESSAGE]:(e,t)=>this._handleA2ASendMessage(e,t),[_.CANCEL_TASK]:(e,t)=>this._handleA2ACancelTask(e,t),[_.GET_TASK]:(e,t)=>this._handleA2AGetTask(e,t)}[n];if(r){r(e,t);return}if(n===`message/send`){let n=t.params;n?.message?.parts&&Array.isArray(n.message.parts)&&this._processInboundA2AEnvelope(e,n.message.parts).catch(e=>console.error(`PeerJsChannel: failed to process inbound A2A envelope`,e))}else this._sendJsonRpcError(e,t.id,{code:x.METHOD_NOT_FOUND,message:`Method not found: ${n}`})}else({[v.EVENT]:(e,t)=>this._handleAGUIEventNotification(e,t),[y.STATUS_UPDATE]:(e,t)=>this._handleTaskStatusNotification(e,t),[y.ARTIFACT_UPDATE]:()=>{},"message/send":(e,t)=>{t?.message?.parts&&Array.isArray(t.message.parts)&&this._processInboundA2AEnvelope(e,t.message.parts).catch(e=>console.error(`PeerJsChannel: failed to process inbound A2A envelope`,e))}})[n]?.(e,t.params)}}_handleA2ASendMessage(e,t){let n=t.params;if(!n?.message){this._sendJsonRpcError(e,t.id,{code:x.INVALID_PARAMS,message:`Missing message in SendMessage params`});return}let r=this._taskManagers.get(e);r||(r=new j,this._taskManagers.set(e,r),r.on(t=>{this._forwardTaskEvent(e,t)}));let i=r.handleSendMessage(n),a=this.connections.get(e);if(a){let e={jsonrpc:`2.0`,id:t.id,result:i};a.send(e)}n.message.parts&&Array.isArray(n.message.parts)&&this._processInboundA2AEnvelope(e,n.message.parts,i.task?.id,i.task?.contextId).catch(e=>console.error(`PeerJsChannel: failed to process A2A SendMessage`,e))}_handleAGUIEventNotification(e,t){if(!t||typeof t!=`object`)return;let n=t;window.dispatchEvent(new CustomEvent(`shadow-claw-agui-event`,{detail:{remotePeerId:e,event:n}}))}_handleGetAgentCard(e,t){if(!this._localCard){this._sendJsonRpcError(e,t.id,{code:x.INTERNAL_ERROR,message:`Agent card not available`});return}let n=E(t.id,this._localCard),r=this.connections.get(e);r&&r.send(n)}_handleInboundData(e,t){if(t instanceof ArrayBuffer||t instanceof Uint8Array){if(this._pendingInboundFile){let n=this._pendingInboundFile.name,r=new Uint8Array(t),i=this._pendingInboundFile.targetGroupId||`peer:${e}`,a=this._saveInboundFile(i,n,r);this._inboundSavePromises.set(n,a),this._pendingInboundFile=null}return}if(!t||typeof t!=`object`)return;let r=t;if(r.type===`__file_header`){let t=r.id||r.name,n=r.totalChunks||1,i=this._inboundTransfers.get(t),a=typeof r.groupId==`string`&&r.groupId.startsWith(`room:`)?r.groupId:`peer:${e}`;this._inboundTransfers.set(t,{transferId:t,name:r.name,mimeType:r.mimeType||`application/octet-stream`,size:r.size||0,totalChunks:n,receivedChunks:i?.receivedChunks||/* @__PURE__ */ new Map,receivedBytes:i?.receivedBytes||0,targetGroupId:a}),this._pendingInboundFile={name:r.name,mimeType:r.mimeType,size:r.size,targetGroupId:a},P({count:0,total:n,direction:`receive`})}else if(r.type===`__file_chunk`){let t=r.id||r.name,n=this._inboundTransfers.get(t);if(!n){let e=r.totalChunks||1;n={transferId:t,name:r.name,mimeType:`application/octet-stream`,size:0,totalChunks:e,receivedChunks:/* @__PURE__ */ new Map,receivedBytes:0},this._inboundTransfers.set(t,n)}let i=typeof r.index==`number`?r.index:0,a=r.data instanceof ArrayBuffer?new Uint8Array(r.data):r.data instanceof Uint8Array?r.data:new Uint8Array(r.data||[]);if(n.receivedChunks.has(i)||(n.receivedChunks.set(i,a),n.receivedBytes+=a.byteLength),P({count:n.receivedChunks.size,total:n.totalChunks,direction:`receive`}),n.receivedChunks.size>=n.totalChunks){let r=new Uint8Array(n.size||n.receivedBytes),i=0;for(let e=0;e<n.totalChunks;e++){let t=n.receivedChunks.get(e);t&&(r.set(t,i),i+=t.byteLength)}let a=n.targetGroupId||`peer:${e}`,o=this._saveInboundFile(a,n.name,r);this._inboundSavePromises.set(n.name,o),this._inboundTransfers.delete(t),this._pendingInboundFile=null,F(1500)}}else if(r.type===`typing`)this.typingCallback?.(`peer:${e}`,!!r.typing);else if(r.type===`chat`){let t=typeof r.text==`string`?r.text.trim():``;t&&this.messageCallback?.({id:n(),groupId:`peer:${e}`,sender:e,content:t,timestamp:Date.now(),channel:`peerjs`})}else if(r.jsonrpc===`2.0`)this._handleA2AJsonRpc(e,r);else if(r.type===`command:execute`){let t=r.payload||{},i=t.action||``,a=t.args||{},o=t.commandId||``;import(`./init-control-plane-Cb31yLTY.js`).then(({executeClientControlCommand:e})=>e(i,a)).then(t=>{let r=this.connections.get(e);if(r){let e=!!t?.error;r.send({id:n(),type:`command:result`,payload:{commandId:o,action:i,success:!e,data:t,...e?{error:t.error}:{}}})}}).catch(t=>{let r=this.connections.get(e);r&&r.send({id:n(),type:`command:result`,payload:{commandId:o,action:i,success:!1,error:t?.message||String(t)}})})}}_isTrustedPeer(e){if(this.trustedPeerIds.size===0||this.trustedPeerIds.has(e))return!0;for(let t of this.trustedPeerIds){let n=t.trim();if(n.endsWith(`*`)&&e.startsWith(n.slice(0,-1))||n===`cli`&&e.startsWith(`cli-`))return!0}return!1}_handleIncomingConnection(e){let t=e.peer;if(this._isTrustedPeer(t))this._attachChunkProgressTracker(e),this.connections.set(t,e),this._updateConnectedPeersSignal(),e.on(`open`,()=>{console.log(`PeerJsChannel: connection opened with ${t}`),this._exchangeAgentCards(t,e)}),e.on(`data`,e=>{this._handleInboundData(t,e)}),e.on(`close`,()=>{console.log(`PeerJsChannel: connection closed with ${t}`),this.connections.delete(t),this.peerCards.delete(t),this._taskManagers.delete(t),this._updateConnectedPeersSignal()}),e.on(`error`,e=>{console.error(`PeerJsChannel: connection error with ${t}:`,e),this.connections.delete(t),this._updateConnectedPeersSignal(),window.dispatchEvent(new CustomEvent(`shadow-claw-peer-error`,{detail:{remotePeerId:t,error:e.message}}))}),e.on(`iceStateChanged`,e=>{(e===`failed`||e===`disconnected`||e===`closed`)&&(console.warn(`PeerJsChannel: ICE state changed to ${e} for ${t}`),this.connections.delete(t),this._updateConnectedPeersSignal())});else{console.warn(`PeerJsChannel: rejecting connection from untrusted peer: ${t}`);try{e.close()}catch{}}}_attachChunkProgressTracker(e){let t=e;if(t._chunkProgressPatched)return;t._chunkProgressPatched=!0;let n=this,r=t._handleChunk;typeof r==`function`&&(t._handleChunk=function(e){if(e&&typeof e==`object`&&`__peerData`in e&&n._inboundTransfers.size===0){let t=e.__peerData,n=this._chunkedData?.[t]?.count??0,r=e.total;if(typeof globalThis.dispatchEvent==`function`&&typeof CustomEvent==`function`)globalThis.dispatchEvent(new CustomEvent(`peerjs-dc-handle-chunk`,{detail:{chunkInfo:{count:n,total:r}}}));else{let e=n+1;P({count:e,total:r,direction:`receive`}),e>=r&&F(1500)}}return r.call(this,e)})}_handleTaskStatusNotification(e,t){if(!t||typeof t!=`object`)return;let n=t;if(n.status?.state&&h.has(n.status.state)){let t=`peer:${e}`;this._onTaskCompleteCallback?.(t)}window.dispatchEvent(new CustomEvent(`shadow-claw-task-status`,{detail:{remotePeerId:e,...n}}))}async _initPeer(){let{Peer:e}=await import(`./bundler-UnYfEehP.js`),t={},n=this.serverConfig.host??`0.peerjs.com`,r=this.serverConfig.port??443,i=this.serverConfig.path??`/`,a=this.serverConfig.secure??!0;t.host=n,t.port=r,t.path=i,t.secure=a,t.debug=3,t.config={iceServers:this.serverConfig.iceServers??[{urls:`stun:stun.l.google.com:19302`},{urls:`stun:stun1.l.google.com:19302`}]},this.peer=new e(this.myPeerId,t),this.peer.on(`open`,e=>{console.log(`PeerJsChannel: connected to signaling server, peer ID: ${e}`),this._reconnectAttempts=0}),this.peer.on(`connection`,e=>{this._handleIncomingConnection(e)}),this.peer.on(`error`,e=>{console.error(`PeerJsChannel: peer error [${e.type}]:`,e.message),(e.type===`peer-unavailable`||e.type===`unavailable-id`)&&window.dispatchEvent(new CustomEvent(`shadow-claw-peer-error`,{detail:{error:e.message}})),e.type!==`peer-unavailable`&&e.type!==`network`&&e.type!==`disconnected`&&e.type===`unavailable-id`&&console.warn(`PeerJsChannel: peer ID is already in use. Stop the channel and reconfigure.`)}),this.peer.on(`disconnected`,()=>{this.running&&this._scheduleReconnect()}),this.peer.on(`close`,()=>{console.log(`PeerJsChannel: peer closed`)})}_registerPendingRequest(e,t){let n=String(e??``),r=setTimeout(()=>{this._pendingRequests.delete(n),console.warn(`PeerJsChannel: JSON-RPC request ${n} timed out (10s)`)},1e4);this._pendingRequests.set(n,{resolve:t,timer:r})}_scheduleReconnect(){if(this._reconnectTimer!==null)return;let e=Math.min(a._RECONNECT_BASE_MS*2**this._reconnectAttempts,a._RECONNECT_MAX_MS);this._reconnectAttempts++,console.log(`PeerJsChannel: disconnected from signaling server, reconnecting in ${(e/1e3).toFixed(1)}s (attempt ${this._reconnectAttempts})`),this._reconnectTimer=setTimeout(()=>{if(this._reconnectTimer=null,this.running)try{this.peer?.reconnect?.()}catch{this._scheduleReconnect()}},e)}_sendJsonRpcError(e,t,n){let r=this.connections.get(e);if(!r)return;let i={jsonrpc:`2.0`,id:t,error:n};try{r.send(i)}catch{}}async _waitForBufferDrain(e,t=65536){let n=e.dataChannel||e._dc;n&&typeof n.bufferedAmount==`number`&&(n.bufferedAmount<=t||await new Promise(e=>{let r=setInterval(()=>{(!n||n.bufferedAmount<=t)&&(clearInterval(r),e())},20);if(typeof n.addEventListener==`function`){let i=()=>{clearInterval(r),n.removeEventListener(`bufferedamountlow`,i),e()};try{n.bufferedAmountLowThreshold=t,n.addEventListener(`bufferedamountlow`,i,{once:!0})}catch{}}}))}async _saveInboundFile(t,n,i){try{let a=await e(),o=n,s=1;for(;await r(a,t,o);){let e=n.lastIndexOf(`.`);if(e>0&&e<n.length-1){let t=n.substring(0,e),r=n.substring(e);o=`${t} (${s})${r}`}else o=`${n} (${s})`;s++}o!==n&&this._inboundRemap.set(n,o),await c(a,t,o,i);try{let{orchestratorStore:e}=await import(`./orchestrator-DBO4NZqd.js`).then(e=>e.n);e.activeGroupId===t&&await e.loadFiles(a)}catch{}}catch(e){console.error(`PeerJsChannel: failed to write inbound file bytes`,e)}}_updateConnectedPeersSignal(){this.connectedPeersSignal.set(Array.from(this.connections.keys()))}_waitForOpen(e){return e.open?Promise.resolve():new Promise((t,n)=>{let r=setTimeout(()=>{n(/* @__PURE__ */ Error(`Connection open timeout (5s)`))},5e3);e.on(`open`,()=>{clearTimeout(r),t()}),e.on(`error`,e=>{clearTimeout(r),n(e)})})}async _processInboundA2AEnvelope(e,t,r,i){let a=`peer:${e}`,o=``,s=[],c=[],l;for(let e of t)if(e.kind===`text`&&typeof e.text==`string`)o+=e.text;else if(e.kind===`file`){let t=e.name||`attachment`,n=this._inboundSavePromises.get(t);if(n)try{await n}catch{}finally{this._inboundSavePromises.delete(t)}if(this._inboundRemap.has(t)){let e=this._inboundRemap.get(t),n=t.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);o=o.replace(RegExp(`(!?\\[.*?\\])\\(${n}\\)`,`g`),`$1(${e})`),this._inboundRemap.delete(t),t=e}let r=t.split(`/`).pop()||`attachment`;s.push({fileName:r,mimeType:e.mimeType,path:t,size:e.size||0})}else e.kind===`a2ui`&&e.envelope?c.push(e.envelope):e.kind===`a2ui-action`&&e.action&&(l=e.action);o=o.trim(),(o||s.length!==0||c.length!==0||l)&&this.messageCallback?.({id:n(),groupId:a,sender:e,content:o,timestamp:Date.now(),channel:`peerjs`,attachments:s.length>0?s:void 0,a2uiEnvelopes:c.length>0?c:void 0,a2uiAction:l,taskId:r,contextId:i})}};function R(e){let t=[],n=/!?\[([^\]]*)\]\(([^)]+)\)/g,r,i=e;for(;(r=n.exec(e))!==null;){let e=r[1],n=z((r[2]||``).trim());n&&t.push({alt:e,path:n})}return{remainingText:i,attachments:t}}function z(e){if(!e)return null;let t=e.trim();if(/^[a-zA-Z][a-zA-Z\d+.-]*:/.test(t)||t.startsWith(`//`))return null;let n=t.replace(/\\/g,`/`).replace(/^\/+/,``).replace(/^\.\//,``);if(!n)return null;let r=n.split(`/`).filter(Boolean);return r.some(e=>e===`..`)?null:r.join(`/`)}export{u as a,f as i,M as n,b as r,L as t};
@@ -1 +1 @@
1
- import{t as e}from"./orchestrator-CaUpEVkQ.js";import{t}from"./ulid-BSJxYh6W.js";import{a as n,r}from"./toast-CtIuHprH.js";import{c as i,d as a}from"./channel-BylT3rJC.js";import{t as o}from"./configure-peer-js-DChhcOfe.js";import{t as s}from"./shadow-claw-DdgeYPg5.js";async function c(c,l,u,d){if(!u)return;let f=new URL(window.location?.href||`http://localhost/`),p=f.searchParams.get(`peer`);if(!p)return;let m=p.trim();if(m)try{let r=i(d),p=r.myPeerId;p||=t().toLowerCase();let h=new Set(r.trustedPeerIds);h.add(m),await o(d,u,p,Array.from(h),r.serverHost,r.serverPort,r.serverPath,r.serverSecure),r.enabled||await a(d,u,`peerjs`,!0);let g=await e.ensurePeerConversation(u,m);await e.switchConversation(u,g),s(c,l,u,e,`chat`),f.searchParams.delete(`peer`);let _=`${f.pathname}${f.search}${f.hash}`;window.history.replaceState({},``,_||`/`),n(`Connected to Peer: ${m.substring(0,8)}`)}catch(e){let t=e instanceof Error?e.message:String(e);r(`Failed to process peer parameter: ${t}`,6e3)}}export{c as processPeerQueryParam};
1
+ import{t as e}from"./orchestrator-DBO4NZqd.js";import{t}from"./ulid-BSJxYh6W.js";import{a as n,r}from"./toast-CtIuHprH.js";import{c as i,d as a}from"./channel-Dk7wl-Av.js";import{t as o}from"./configure-peer-js-BOV0tR6G.js";import{t as s}from"./shadow-claw-Br8mWDUx.js";async function c(c,l,u,d){if(!u)return;let f=new URL(window.location?.href||`http://localhost/`),p=f.searchParams.get(`peer`);if(!p)return;let m=p.trim();if(m)try{let r=i(d),p=r.myPeerId;p||=t().toLowerCase();let h=new Set(r.trustedPeerIds);h.add(m),await o(d,u,p,Array.from(h),r.serverHost,r.serverPort,r.serverPath,r.serverSecure),r.enabled||await a(d,u,`peerjs`,!0);let g=await e.ensurePeerConversation(u,m);await e.switchConversation(u,g),s(c,l,u,e,`chat`),f.searchParams.delete(`peer`);let _=`${f.pathname}${f.search}${f.hash}`;window.history.replaceState({},``,_||`/`),n(`Connected to Peer: ${m.substring(0,8)}`)}catch(e){let t=e instanceof Error?e.message:String(e);r(`Failed to process peer parameter: ${t}`,6e3)}}export{c as processPeerQueryParam};
@@ -1,3 +1,3 @@
1
- import{t as e}from"./write-group-file-CmJuVQNO.js";import{a as t,r as n}from"./toast-CtIuHprH.js";import{t as r}from"./write-group-file-bytes-Cejr3zo1.js";import{t as i}from"./shadow-claw-DdgeYPg5.js";const a=`pendingShares`;function o(e){return{id:typeof e?.id==`string`?e.id:``,createdAt:typeof e?.createdAt==`number`?e.createdAt:0,title:typeof e?.title==`string`?e.title:``,text:typeof e?.text==`string`?e.text:``,url:typeof e?.url==`string`?e.url:``,fileName:typeof e?.fileName==`string`?e.fileName:``,fileType:typeof e?.fileType==`string`?e.fileType:``,fileBytes:e?.fileBytes instanceof ArrayBuffer?e.fileBytes:null}}async function s(e){return!e||typeof e.transaction!=`function`?[]:new Promise((t,n)=>{let r;try{r=e.transaction(a,`readwrite`)}catch(e){if(e instanceof DOMException&&e.name===`NotFoundError`){t([]);return}n(e);return}let i=r.objectStore(a),s=i.getAll();s.onerror=()=>{n(s.error||/* @__PURE__ */ Error(`Failed to read pending shares`))},s.onsuccess=()=>{let e=Array.isArray(s.result)?s.result.map(o).filter(e=>typeof e.id==`string`&&e.id.length>0).sort((e,t)=>e.createdAt-t.createdAt):[],r=i.clear();r.onerror=()=>{n(r.error||/* @__PURE__ */ Error(`Failed to clear pending shares`))},r.onsuccess=()=>{t(e)}},r.onabort=()=>{n(r.error||/* @__PURE__ */ Error(`Pending share transaction aborted`))}})}function c(e){let t=[`# Shared Content`,``];return e.title&&t.push(`Title: ${e.title}`),e.url&&t.push(`URL: ${e.url}`),e.text&&t.push(``,e.text),t.join(`
1
+ import{t as e}from"./write-group-file-R67DjJ-q.js";import{a as t,r as n}from"./toast-CtIuHprH.js";import{t as r}from"./write-group-file-bytes-A8kB7lvO.js";import{t as i}from"./shadow-claw-Br8mWDUx.js";const a=`pendingShares`;function o(e){return{id:typeof e?.id==`string`?e.id:``,createdAt:typeof e?.createdAt==`number`?e.createdAt:0,title:typeof e?.title==`string`?e.title:``,text:typeof e?.text==`string`?e.text:``,url:typeof e?.url==`string`?e.url:``,fileName:typeof e?.fileName==`string`?e.fileName:``,fileType:typeof e?.fileType==`string`?e.fileType:``,fileBytes:e?.fileBytes instanceof ArrayBuffer?e.fileBytes:null}}async function s(e){return!e||typeof e.transaction!=`function`?[]:new Promise((t,n)=>{let r;try{r=e.transaction(a,`readwrite`)}catch(e){if(e instanceof DOMException&&e.name===`NotFoundError`){t([]);return}n(e);return}let i=r.objectStore(a),s=i.getAll();s.onerror=()=>{n(s.error||/* @__PURE__ */ Error(`Failed to read pending shares`))},s.onsuccess=()=>{let e=Array.isArray(s.result)?s.result.map(o).filter(e=>typeof e.id==`string`&&e.id.length>0).sort((e,t)=>e.createdAt-t.createdAt):[],r=i.clear();r.onerror=()=>{n(r.error||/* @__PURE__ */ Error(`Failed to clear pending shares`))},r.onsuccess=()=>{t(e)}},r.onabort=()=>{n(r.error||/* @__PURE__ */ Error(`Pending share transaction aborted`))}})}function c(e){let t=[`# Shared Content`,``];return e.title&&t.push(`Title: ${e.title}`),e.url&&t.push(`URL: ${e.url}`),e.text&&t.push(``,e.text),t.join(`
2
2
  `).trim()+`
3
3
  `}async function l(e,t){let n=/* @__PURE__ */ new Date,r=`Shared Files ${`${String(n.getFullYear())}-${String(n.getMonth()+1).padStart(2,`0`)}-${String(n.getDate()).padStart(2,`0`)}`}`,i=t.groups.find(e=>e.name===r);return i?(await t.switchConversation(e,i.groupId),i.groupId):(await t.createConversation(e,r)).groupId}function u(e,t){return(e.replace(/\\/g,`/`).split(`/`).filter(Boolean).pop()||``).replace(/\s+/g,`-`).replace(/[^A-Za-z0-9._-]/g,`-`).replace(/-+/g,`-`).replace(/^-+|-+$/g,``)||`${t}.txt`}async function d(a,o,d,f,p,m,h){if(!m)return;let g=await s(m);if(g.length!==0)try{let n=await l(m,f),s=[];for(let t=0;t<g.length;t++){let i=g[t],a=`shared-${Date.now()}-${t+1}`;if(i.fileBytes instanceof ArrayBuffer){let e=u(i.fileName||(i.fileType===`application/pdf`?`${a}.pdf`:`${a}.bin`),a);await r(m,n,e,new Uint8Array(i.fileBytes)),s.push(e);continue}let o=u(i.fileName||`${a}.md`,a),l=c(i);await e(m,n,o,l),s.push(o)}await f.loadFiles(m),i(o,d,m,f,`files`),s.length>0&&await p.openFile(m,s[0],n),t(`Imported ${s.length} shared item${s.length===1?``:`s`}.`);let _=h;if(_.searchParams.has(`share-target`)){_.searchParams.delete(`share-target`);let e=`${_.pathname}${_.search}${_.hash}`;a.history.replaceState({},``,e||`/`)}}catch(e){let t=e instanceof Error?e.message:String(e);n(`Failed to import shared content: ${t}`,6e3)}}export{d as processPendingSharedPayloads};
@@ -1 +1 @@
1
- import{t as e}from"./ulid-BSJxYh6W.js";import{a as t,r as n}from"./toast-CtIuHprH.js";import{l as r}from"./transformers-C-DuTM2K.js";import{c as i,d as a}from"./channel-BylT3rJC.js";import{t as o}from"./configure-peer-js-DChhcOfe.js";import{t as s}from"./shadow-claw-DdgeYPg5.js";async function c(c,l,u,d,f,p){if(!d)return;let m=new URL(window.location?.href||`http://localhost/`),h=(m.searchParams.get(`room`)||``).trim(),g=(m.searchParams.get(`host`)||``).trim(),_=(m.searchParams.get(`name`)||``).trim()||`Room`;if(h&&g)try{let n=i(f),v=n.myPeerId;v||=e().toLowerCase();let y=new Set(n.trustedPeerIds);y.add(g),await o(f,d,v,Array.from(y),n.serverHost,n.serverPort,n.serverPath,n.serverSecure),n.enabled||await a(f,d,`peerjs`,!0),r(f,h,g,_),await p.switchConversation(d,`room:${h}`),s(l,u,d,p,`chat`),m.searchParams.delete(`room`),m.searchParams.delete(`host`),m.searchParams.delete(`name`);let b=`${m.pathname}${m.search}${m.hash}`;c.history.replaceState({},``,b||`/`),t(`Joined room "${_}"`)}catch(e){let t=e instanceof Error?e.message:String(e);n(`Failed to join room: ${t}`,6e3)}}export{c as processRoomQueryParam};
1
+ import{t as e}from"./ulid-BSJxYh6W.js";import{a as t,r as n}from"./toast-CtIuHprH.js";import{l as r}from"./transformers-CQ9ss9rD.js";import{c as i,d as a}from"./channel-Dk7wl-Av.js";import{t as o}from"./configure-peer-js-BOV0tR6G.js";import{t as s}from"./shadow-claw-Br8mWDUx.js";async function c(c,l,u,d,f,p){if(!d)return;let m=new URL(window.location?.href||`http://localhost/`),h=(m.searchParams.get(`room`)||``).trim(),g=(m.searchParams.get(`host`)||``).trim(),_=(m.searchParams.get(`name`)||``).trim()||`Room`;if(h&&g)try{let n=i(f),v=n.myPeerId;v||=e().toLowerCase();let y=new Set(n.trustedPeerIds);y.add(g),await o(f,d,v,Array.from(y),n.serverHost,n.serverPort,n.serverPath,n.serverSecure),n.enabled||await a(f,d,`peerjs`,!0),r(f,h,g,_),await p.switchConversation(d,`room:${h}`),s(l,u,d,p,`chat`),m.searchParams.delete(`room`),m.searchParams.delete(`host`),m.searchParams.delete(`name`);let b=`${m.pathname}${m.search}${m.hash}`;c.history.replaceState({},``,b||`/`),t(`Joined room "${_}"`)}catch(e){let t=e instanceof Error?e.message:String(e);n(`Failed to join room: ${t}`,6e3)}}export{c as processRoomQueryParam};
@@ -0,0 +1 @@
1
+ import{C as e,I as t,O as n,P as r,et as i,r as a,y as o}from"./config-C16fFWtP.js";import{t as s}from"./get-config-Bkvl__ZS.js";import{t as c}from"./set-config-DSiuMe0k.js";import{t as l}from"./tools-D-52Zmfc.js";function u(){let e=globalThis.LanguageModel;return!e||typeof e!=`function`||typeof e.availability!=`function`||typeof e.create!=`function`?null:e}function d(){return!!u()}async function f(e){return await e.getApiKey()||void 0}async function p(e){return await e.getApiKey()||``}function m(e){return{mode:e.llamafileMode,host:e.llamafileHost,port:e.llamafilePort,offline:e.llamafileOffline}}function h(e){return{authMode:e.bedrockAuthMode,profile:e.bedrockProfileFallback,region:e.bedrockRegionFallback}}function g(){return Object.entries(e).map(([e,t])=>({id:e,name:t.name,...!t.modelsUrl&&{models:Array.isArray(t.models)&&t.models.length>0?t.models:[t.defaultModel]},...t.modelsUrl&&{modelsUrl:t.modelsUrl},...t.headers&&{headers:t.headers},...t.apiKeyHeader&&{apiKeyHeader:t.apiKeyHeader},...t.apiKeyHeaderFormat&&{apiKeyHeaderFormat:t.apiKeyHeaderFormat},...typeof t.requiresApiKey==`boolean`&&{requiresApiKey:t.requiresApiKey}}))}function _(e){let t=typeof e.reasoningEffort==`string`?e.reasoningEffort.trim().toLowerCase():`none`;if(t&&t!==`none`)return{effort:t}}function v(e,t,n=``,r){if(t===`llamafile`){let t=r?.llamafile,i={"x-llamafile-mode":t?.mode===`server`||t?.mode===`cli`?t.mode:e.llamafileMode,"x-llamafile-host":t?.host||e.llamafileHost,"x-llamafile-port":String(t?.port||e.llamafilePort),"x-llamafile-offline":t?.offline??e.llamafileOffline?`true`:`false`};return n&&(i[`x-shadowclaw-request-id`]=n),i}if(t===`bedrock_proxy`){let t=r?.bedrock_proxy,n={};return(t?.region||e.bedrockRegionFallback)&&(n[`x-bedrock-region`]=t?.region||e.bedrockRegionFallback),(t?.profile||e.bedrockProfileFallback)&&(n[`x-bedrock-profile`]=t?.profile||e.bedrockProfileFallback),n[`x-bedrock-auth-mode`]=t?.authMode||e.bedrockAuthMode,n}return{}}function y(e){e.providerConfig?.id===`llamafile`&&(e.providerConfig={...e.providerConfig,headers:{...e.providerConfig.headers||{},"x-llamafile-mode":e.llamafileMode,"x-llamafile-host":e.llamafileHost,"x-llamafile-port":String(e.llamafilePort),"x-llamafile-offline":e.llamafileOffline?`true`:`false`}})}function b(e){e.providerConfig?.id===`mesh-llm`&&(e.providerConfig={...e.providerConfig,headers:{...e.providerConfig.headers||{},"x-mesh-llm-host":e.meshLlmHost}})}function x(e,n){if(n&&e.inFlightEffectiveProviderByGroup){let t=e.inFlightEffectiveProviderByGroup.get(n);if(t?.providerId===`transformers_js_local`){let e=t.providerConfig.baseUrl||``;if(e.includes(`/chat/completions`))return e.replace(`/chat/completions`,`/status`)}}let r=e.providerConfig;if(r&&(!r.id||r.id===`transformers_js_local`)){let e=r.baseUrl||``;if(e.includes(`/chat/completions`))return e.replace(`/chat/completions`,`/status`)}let i=t(`transformers_js_local`)?.baseUrl||``;return i.includes(`/chat/completions`)?i.replace(`/chat/completions`,`/status`):`http://localhost:8888/transformers-js-proxy/status`}async function S(e,t,r,i=c){e.assistantName=r,e.triggerPattern=n(r),await i(t,a.ASSISTANT_NAME,r)}async function C(e,t,n,r=c){let i=typeof n.region==`string`?n.region.trim():``,o=typeof n.profile==`string`?n.profile.trim():``,s=n.authMode===`sso`?`sso`:`provider_chain`;e.bedrockRegionFallback=i,e.bedrockProfileFallback=o,e.bedrockAuthMode=s,await r(t,a.BEDROCK_REGION_FALLBACK,i),await r(t,a.BEDROCK_PROFILE_FALLBACK,o),await r(t,a.BEDROCK_AUTH_MODE,s)}async function w(e,t,n,r=c){e.llamafileMode=n.mode,e.llamafileHost=n.host,e.llamafilePort=n.port,e.llamafileOffline=n.offline,await r(t,a.LLAMAFILE_MODE,n.mode),await r(t,a.LLAMAFILE_HOST,n.host),await r(t,a.LLAMAFILE_PORT,String(n.port)),await r(t,a.LLAMAFILE_OFFLINE,n.offline?`true`:`false`),y(e)}async function T(e,t,n,r=c){e.meshLlmHost=n.host,await r(t,a.MESH_LLM_HOST,n.host),b(e)}async function E(e,t,n,i=c){e.model=n;let o=n;e.provider===`prompt_api`&&!d()&&(n===`browser-built-in`||!n)&&(o=await s(t,a.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`),e.maxTokens=r(o),await i(t,a.MODEL,n),await k(e,t)}async function D(e,t,n,r=c){e.peerjsMyAlias=n.trim(),await r(t,a.PEERJS_MY_ALIAS,e.peerjsMyAlias)}async function O(e,t,n,r=c){e.peerjsPeerAliases={...n},await r(t,a.PEERJS_PEER_ALIASES,JSON.stringify(e.peerjsPeerAliases))}async function k(e,t){if(!l.activeProfileId&&l.enabledToolNames.size===0)return;let n=l.findProfilesForProvider(e.provider,e.model);if(n.length===0)return;let r=n.find(t=>t.providerId===e.provider&&t.model===e.model);if(r){await l.activateProfile(t,r.id);return}let i=n.find(t=>t.providerId===e.provider&&!t.model);i&&await l.activateProfile(t,i.id)}async function A(e,n,o,l,u=c){let f=t(o);if(!f)throw Error(`Unknown provider: ${o}`);e.provider=o,e.providerConfig=f,e.model=f.defaultModel,y(e),b(e),await l.loadApiKeyForProvider(n,o),await i.fetchModelInfo(f,await l.getApiKeyForHeaders()||void 0,v(e,o));let p=e.model;o===`prompt_api`&&!d()&&(e.model===`browser-built-in`||!e.model)&&(p=await s(n,a.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`),e.maxTokens=r(p),await u(n,a.PROVIDER,o),await u(n,a.MODEL,e.model),await k(e,n)}async function j(e,t,n,r){try{let i=x(e,n),a=await fetch(i,{headers:{Accept:`application/json`},method:`GET`});if(!a.ok)return;let o=await a.json(),s=Number(o?.progress),c=Number.isFinite(s)&&s>1?Math.max(0,Math.min(1,s/100)):Number.isFinite(s)?Math.max(0,Math.min(1,s)):null,l={groupId:n,message:typeof o?.message==`string`&&o.message?o.message:void 0,progress:c,status:o?.status===`done`||o?.status===`error`?o.status:`running`};t.emit(`model-download-progress`,l),(l.status===`done`||l.status===`error`)&&r(n)}catch{}}function M(e,t,n){N(e,n),t.emit(`model-download-progress`,{groupId:n,message:`Preparing local model download...`,progress:null,status:`running`}),j(e,t,n,t=>N(e,t));let r=setInterval(()=>{j(e,t,n,t=>N(e,t))},1e3);e.transformersProgressPollers.set(n,r)}function N(e,t){let n=e.transformersProgressPollers.get(t);typeof n==`number`&&(clearInterval(n),e.transformersProgressPollers.delete(t))}async function P(e){try{await fetch(o.replace(`/chat/completions`,`/cancel`),{body:JSON.stringify({requestId:e}),headers:{"Content-Type":`application/json`,"x-shadowclaw-request-id":e},keepalive:!0,method:`POST`})}catch{}}export{d as S,O as _,p as a,N as b,m as c,S as d,C as f,D as g,E as h,f as i,v as l,T as m,b as n,g as o,w as p,P as r,h as s,y as t,_ as u,A as v,u as x,M as y};
@@ -1 +1 @@
1
- import{r as e}from"./config-C-YdSFZB.js";import{n as t}from"./db-BUuJo1Gf.js";import{t as n}from"./get-config-Bkvl__ZS.js";import{t as r}from"./get-or-create-subscriber-id-GvRZYXwA.js";async function i(r){let i=await t(),a=await n(i,e.PUSH_PROXY_URL);if(!a&&typeof localStorage<`u`)try{a=localStorage.getItem(e.PUSH_PROXY_URL)||void 0}catch{}if(!a)return r;let o=r.startsWith(`/`)?r:`/${r}`;return`${a.endsWith(`/`)?a.slice(0,-1):a}${o}`}function a(e,t={}){let n={...t};try{let t=typeof location<`u`?location.origin:`http://127.0.0.1:8888`,r=new URL(e,t).hostname.toLowerCase();r===`localhost`||r===`127.0.0.1`||r===`::1`||r===`[::1]`?n.targetAddressSpace=`loopback`:(/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(r)||!r.includes(`.`)||r.endsWith(`.local`)||r.endsWith(`.lan`)||r.endsWith(`.home`)||r.endsWith(`.internal`))&&(n.targetAddressSpace=`private`)}catch{}return n}function o(e){let t=(e+`=`.repeat((4-e.length%4)%4)).replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t);return Uint8Array.from([...n].map(e=>e.charCodeAt(0)))}async function s(){let e=await i(`/push/vapid-public-key`);return(await(await fetch(e,a(e))).json()).publicKey}async function c(n,c,l){let u=await navigator.serviceWorker.ready,d=await s(),f=await u.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:o(d)}),p=n||typeof localStorage<`u`&&localStorage.getItem(e.CONTROL_PLANE_CLIENT_ID)||void 0,m=c,h=l;if(!p||!m)try{let e=await import(`./init-control-plane-BoJijVtf.js`);!p&&typeof e.getOrCreateControlPlaneClientId==`function`&&(p=e.getOrCreateControlPlaneClientId()),!m&&typeof e.detectDeviceLabel==`function`&&(m=e.detectDeviceLabel())}catch{}if(!h)try{let e=await Promise.race([t(),new Promise(e=>setTimeout(()=>e(null),500))]);e&&(h=await r(e))}catch{}let g=typeof f.toJSON==`function`?f.toJSON():JSON.parse(JSON.stringify(f)),_=await i(`/push/subscribe`);return await fetch(_,a(_,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...g,...p?{clientId:p}:{},...m?{deviceLabel:m}:{},...h?{subscriberId:h}:{}})})),f}async function l(n){if(typeof navigator<`u`&&navigator.serviceWorker)try{let o=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!o)return;let s,c,l=n;typeof localStorage<`u`&&(s=localStorage.getItem(e.CONTROL_PLANE_CLIENT_ID)||void 0);try{let e=await import(`./init-control-plane-BoJijVtf.js`);!s&&typeof e.getOrCreateControlPlaneClientId==`function`&&(s=e.getOrCreateControlPlaneClientId()),typeof e.detectDeviceLabel==`function`&&(c=e.detectDeviceLabel())}catch{}if(!l)try{let e=await Promise.race([t(),new Promise(e=>setTimeout(()=>e(null),500))]);e&&(l=await r(e))}catch{}let u=typeof o.toJSON==`function`?o.toJSON():JSON.parse(JSON.stringify(o)),d=await i(`/push/subscribe`);await fetch(d,a(d,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...u,...s?{clientId:s}:{},...c?{deviceLabel:c}:{},...l?{subscriberId:l}:{}})}))}catch{}}async function u(){let e=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!e)return;let{endpoint:t}=e;await e.unsubscribe();let n=await i(`/push/subscribe`);await fetch(n,a(n,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify({endpoint:t})}))}async function d(){return(await navigator.serviceWorker.ready).pushManager.getSubscription()}export{l as a,c as i,a as n,u as o,i as r,d as t};
1
+ import{r as e}from"./config-C16fFWtP.js";import{n as t}from"./db-BUuJo1Gf.js";import{t as n}from"./get-config-Bkvl__ZS.js";import{t as r}from"./get-or-create-subscriber-id-jVHnQfbr.js";async function i(r){let i=await t(),a=await n(i,e.PUSH_PROXY_URL);if(!a&&typeof localStorage<`u`)try{a=localStorage.getItem(e.PUSH_PROXY_URL)||void 0}catch{}if(!a)return r;let o=r.startsWith(`/`)?r:`/${r}`;return`${a.endsWith(`/`)?a.slice(0,-1):a}${o}`}function a(e,t={}){let n={...t};try{let t=typeof location<`u`?location.origin:`http://127.0.0.1:8888`,r=new URL(e,t).hostname.toLowerCase();r===`localhost`||r===`127.0.0.1`||r===`::1`||r===`[::1]`?n.targetAddressSpace=`loopback`:(/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(r)||!r.includes(`.`)||r.endsWith(`.local`)||r.endsWith(`.lan`)||r.endsWith(`.home`)||r.endsWith(`.internal`))&&(n.targetAddressSpace=`private`)}catch{}return n}function o(e){let t=(e+`=`.repeat((4-e.length%4)%4)).replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t);return Uint8Array.from([...n].map(e=>e.charCodeAt(0)))}async function s(){let e=await i(`/push/vapid-public-key`);return(await(await fetch(e,a(e))).json()).publicKey}async function c(n,c,l){let u=await navigator.serviceWorker.ready,d=await s(),f=await u.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:o(d)}),p=n||typeof localStorage<`u`&&localStorage.getItem(e.CONTROL_PLANE_CLIENT_ID)||void 0,m=c,h=l;if(!p||!m)try{let e=await import(`./init-control-plane-Cb31yLTY.js`);!p&&typeof e.getOrCreateControlPlaneClientId==`function`&&(p=e.getOrCreateControlPlaneClientId()),!m&&typeof e.detectDeviceLabel==`function`&&(m=e.detectDeviceLabel())}catch{}if(!h)try{let e=await Promise.race([t(),new Promise(e=>setTimeout(()=>e(null),500))]);e&&(h=await r(e))}catch{}let g=typeof f.toJSON==`function`?f.toJSON():JSON.parse(JSON.stringify(f)),_=await i(`/push/subscribe`);return await fetch(_,a(_,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...g,...p?{clientId:p}:{},...m?{deviceLabel:m}:{},...h?{subscriberId:h}:{}})})),f}async function l(n){if(typeof navigator<`u`&&navigator.serviceWorker)try{let o=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!o)return;let s,c,l=n;typeof localStorage<`u`&&(s=localStorage.getItem(e.CONTROL_PLANE_CLIENT_ID)||void 0);try{let e=await import(`./init-control-plane-Cb31yLTY.js`);!s&&typeof e.getOrCreateControlPlaneClientId==`function`&&(s=e.getOrCreateControlPlaneClientId()),typeof e.detectDeviceLabel==`function`&&(c=e.detectDeviceLabel())}catch{}if(!l)try{let e=await Promise.race([t(),new Promise(e=>setTimeout(()=>e(null),500))]);e&&(l=await r(e))}catch{}let u=typeof o.toJSON==`function`?o.toJSON():JSON.parse(JSON.stringify(o)),d=await i(`/push/subscribe`);await fetch(d,a(d,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...u,...s?{clientId:s}:{},...c?{deviceLabel:c}:{},...l?{subscriberId:l}:{}})}))}catch{}}async function u(){let e=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!e)return;let{endpoint:t}=e;await e.unsubscribe();let n=await i(`/push/subscribe`);await fetch(n,a(n,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify({endpoint:t})}))}async function d(){return(await navigator.serviceWorker.ready).pushManager.getSubscription()}export{l as a,c as i,a as n,u as o,i as r,d as t};
@@ -1 +1 @@
1
- import{t as e}from"./get-config-Bkvl__ZS.js";import{T as t,w as n}from"./orchestrator-CaUpEVkQ.js";import{t as r}from"./set-config-DSiuMe0k.js";const i=`room_metadata`,a=`room:`;function o(e){return`${a}${e}`}function s(e){return e.startsWith(`room:`)?e.slice(5):e}async function c(t){let n=await e(t,i);if(!n)return[];try{let e=JSON.parse(n);return Array.isArray(e)?e:[]}catch{return[]}}async function l(e,t){await r(e,i,JSON.stringify(t))}async function u(e,t){let n=await c(e),r=n.findIndex(e=>e.roomId===t.roomId);r>=0?n[r]=t:n.push(t),await l(e,n),await d(e,t)}async function d(e,r){let i=await t(e),s=o(r.roomId);i.some(e=>e.groupId===s)||await n(e,r.name,a,r.roomId)}async function f(e,t){await l(e,(await c(e)).filter(e=>e.roomId!==t))}export{s as a,o as i,f as n,u as o,c as r,a as t};
1
+ import{t as e}from"./get-config-Bkvl__ZS.js";import{T as t,w as n}from"./orchestrator-DBO4NZqd.js";import{t as r}from"./set-config-DSiuMe0k.js";const i=`room_metadata`,a=`room:`;function o(e){return`${a}${e}`}function s(e){return e.startsWith(`room:`)?e.slice(5):e}async function c(t){let n=await e(t,i);if(!n)return[];try{let e=JSON.parse(n);return Array.isArray(e)?e:[]}catch{return[]}}async function l(e,t){await r(e,i,JSON.stringify(t))}async function u(e,t){let n=await c(e),r=n.findIndex(e=>e.roomId===t.roomId);r>=0?n[r]=t:n.push(t),await l(e,n),await d(e,t)}async function d(e,r){let i=await t(e),s=o(r.roomId);i.some(e=>e.groupId===s)||await n(e,r.name,a,r.roomId)}async function f(e,t){await l(e,(await c(e)).filter(e=>e.roomId!==t))}export{s as a,o as i,f as n,u as o,c as r,a as t};
@@ -36,4 +36,4 @@ const shadowClawImportScripts = (...urls) => {
36
36
 
37
37
  shadowClawNativeImportScripts(...urls.map((url) => shadowClawServiceWorkerTrustedTypesPolicy.createScriptURL(url)));
38
38
  };
39
- if(!self.define){let e,s={};const r=(r,i)=>(r=new URL(r+".js",i).href,s[r]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=r,e.onload=s,document.head.appendChild(e)}else e=r,shadowClawImportScripts(r),s()}).then(()=>{let e=s[r];if(!e)throw new Error(`Module ${r} didn’t register its module`);return e}));self.define=(i,c)=>{const n=e||("document"in self?document.currentScript.src:"")||location.href;if(s[n])return;let o={};const a=e=>r(e,n),t={module:{uri:n},exports:o,require:a};s[n]=Promise.all(i.map(e=>t[e]||a(e))).then(e=>(c(...e),o))}}define(["./workbox-92eae37e"],function(e){"use strict";shadowClawImportScripts("service-worker/fetch-proxy.js","service-worker/push-handler.js","service-worker/share-target.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"54511ed6eaecac0a8d6a43945ccd3cb5"},{url:"404.html",revision:"74bc1afc55391d3ff43b99e39de1c72f"},{url:"index.css",revision:"7fd4b888962af18e251009bc1fe8a6ac"},{url:"index.js",revision:"44293f79e2fd3a5646c7f9abbd58d8f2"},{url:"theme-init.js",revision:"7b5ff0abc56d80fc359785d019c5f9cb"},{url:"manifest.json",revision:"62f8d50f4e8fd710cb66c883f94b1c48"},{url:"favicon.ico",revision:"58fff7908409f246a6228529f384802e"},{url:"assets/icons/96.png",revision:"f91548690416c59ceb56cdb99809b955"},{url:"assets/icons/72.png",revision:"cba8470097972bdbc5d9a06fe67bfcf2"},{url:"assets/icons/512.png",revision:"ec2a8f28b812a0c2665a04cb3c535aab"},{url:"assets/icons/48.png",revision:"29eb2f38df4d5a6385399a04d7bdef00"},{url:"assets/icons/192.png",revision:"bf98264d7a62a47542e577245a292b77"},{url:"assets/icons/180.png",revision:"69128cf857af09292bb06fac0df9938b"},{url:"assets/icons/152.png",revision:"645ae818149dc508cc6146d620120db2"},{url:"assets/icons/128.png",revision:"84678d51d243c104d0c85a4e909fd0a6"},{url:"assets/icons/1024.png",revision:"ae17c81b3b93137df1702de6a9fcdab6"}],{}),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{allowlist:[/^\/$/,/^(?:\/[^/]+)*\/$/,/^(?:\/[^/]+)*\/(chat|files|pages|tasks|settings)(?:\/.*)?$/],denylist:[/\/assets\//,/\.(png|jpe?g|gif|webp|svg|ico|bmp|avif|mp4|webm|mp3|wav|ogg|pdf|zip|gz|tar|css|js|json|wasm)$/i]})),e.registerRoute(({url:e,sameOrigin:s})=>{if(e.pathname.startsWith("/assets/v86.9pfs/"))return!1;const r=e.hostname.toLowerCase();if("huggingface.co"===r||r.endsWith(".huggingface.co")||r.endsWith(".hf.co")||"hf.co"===r||"hf-mirror.com"===r||r.endsWith(".hf-mirror.com")||"cdnjs.cloudflare.com"===r||"esm.sh"===r||r.endsWith(".esm.sh")||"unpkg.com"===r||"cdn.jsdelivr.net"===r||r.endsWith(".jsdelivr.net")||"esm.run"===r||"openrouter.ai"===r||r.endsWith(".openrouter.ai")||"api.telegram.org"===r)return!1;if(e.pathname.startsWith("/api/control/"))return!1;const i=e.pathname.endsWith("/share/share-target.html"),c="/proxy"===e.pathname||e.pathname.startsWith("/git-proxy/")||i||e.pathname.startsWith("/push/")||e.pathname.startsWith("/schedule/")||e.pathname.startsWith("/telegram/");return(!("localhost"===r||"127.0.0.1"===r||"::1"===r||"[::1]"===r)||!c)&&("boolean"!=typeof s||s)},new e.NetworkFirst({cacheName:"shadow-claw-cache",plugins:[new e.ExpirationPlugin({maxAgeSeconds:31536e3})]}),"GET")});
39
+ if(!self.define){let e,s={};const r=(r,i)=>(r=new URL(r+".js",i).href,s[r]||new Promise(s=>{if("document"in self){const e=document.createElement("script");e.src=r,e.onload=s,document.head.appendChild(e)}else e=r,shadowClawImportScripts(r),s()}).then(()=>{let e=s[r];if(!e)throw new Error(`Module ${r} didn’t register its module`);return e}));self.define=(i,c)=>{const n=e||("document"in self?document.currentScript.src:"")||location.href;if(s[n])return;let o={};const a=e=>r(e,n),t={module:{uri:n},exports:o,require:a};s[n]=Promise.all(i.map(e=>t[e]||a(e))).then(e=>(c(...e),o))}}define(["./workbox-92eae37e"],function(e){"use strict";shadowClawImportScripts("service-worker/fetch-proxy.js","service-worker/push-handler.js","service-worker/share-target.js"),self.addEventListener("message",e=>{e.data&&"SKIP_WAITING"===e.data.type&&self.skipWaiting()}),e.clientsClaim(),e.precacheAndRoute([{url:"index.html",revision:"66d2721a1a80ff0f3b47779431856ea0"},{url:"404.html",revision:"74bc1afc55391d3ff43b99e39de1c72f"},{url:"index.css",revision:"7fd4b888962af18e251009bc1fe8a6ac"},{url:"index.js",revision:"5c9003f4ebe36f58dc9d5986981bfe1c"},{url:"theme-init.js",revision:"7b5ff0abc56d80fc359785d019c5f9cb"},{url:"manifest.json",revision:"62f8d50f4e8fd710cb66c883f94b1c48"},{url:"favicon.ico",revision:"58fff7908409f246a6228529f384802e"},{url:"assets/icons/96.png",revision:"f91548690416c59ceb56cdb99809b955"},{url:"assets/icons/72.png",revision:"cba8470097972bdbc5d9a06fe67bfcf2"},{url:"assets/icons/512.png",revision:"ec2a8f28b812a0c2665a04cb3c535aab"},{url:"assets/icons/48.png",revision:"29eb2f38df4d5a6385399a04d7bdef00"},{url:"assets/icons/192.png",revision:"bf98264d7a62a47542e577245a292b77"},{url:"assets/icons/180.png",revision:"69128cf857af09292bb06fac0df9938b"},{url:"assets/icons/152.png",revision:"645ae818149dc508cc6146d620120db2"},{url:"assets/icons/128.png",revision:"84678d51d243c104d0c85a4e909fd0a6"},{url:"assets/icons/1024.png",revision:"ae17c81b3b93137df1702de6a9fcdab6"}],{}),e.registerRoute(new e.NavigationRoute(e.createHandlerBoundToURL("index.html"),{allowlist:[/^\/$/,/^(?:\/[^/]+)*\/$/,/^(?:\/[^/]+)*\/(chat|files|pages|tasks|settings)(?:\/.*)?$/],denylist:[/\/assets\//,/\.(png|jpe?g|gif|webp|svg|ico|bmp|avif|mp4|webm|mp3|wav|ogg|pdf|zip|gz|tar|css|js|json|wasm)$/i]})),e.registerRoute(({url:e,sameOrigin:s})=>{if(e.pathname.startsWith("/assets/v86.9pfs/"))return!1;const r=e.hostname.toLowerCase();if("huggingface.co"===r||r.endsWith(".huggingface.co")||r.endsWith(".hf.co")||"hf.co"===r||"hf-mirror.com"===r||r.endsWith(".hf-mirror.com")||"cdnjs.cloudflare.com"===r||"esm.sh"===r||r.endsWith(".esm.sh")||"unpkg.com"===r||"cdn.jsdelivr.net"===r||r.endsWith(".jsdelivr.net")||"esm.run"===r||"openrouter.ai"===r||r.endsWith(".openrouter.ai")||"api.telegram.org"===r)return!1;if(e.pathname.startsWith("/api/control/"))return!1;const i=e.pathname.endsWith("/share/share-target.html"),c="/proxy"===e.pathname||e.pathname.startsWith("/git-proxy/")||i||e.pathname.startsWith("/push/")||e.pathname.startsWith("/schedule/")||e.pathname.startsWith("/telegram/");return(!("localhost"===r||"127.0.0.1"===r||"::1"===r||"[::1]"===r)||!c)&&("boolean"!=typeof s||s)},new e.NetworkFirst({cacheName:"shadow-claw-cache",plugins:[new e.ExpirationPlugin({maxAgeSeconds:31536e3})]}),"GET")});