shadow-claw 1.40.1 → 1.41.1

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 (325) hide show
  1. package/.well-known/mcp/server-card.json +1 -1
  2. package/.well-known/mcp.json +1 -1
  3. package/README.md +2 -1
  4. package/dist/cli/build/build.js +1 -1
  5. package/dist/cli/{chunk-Bfz2NYgD.js → chunk-0IeC97mU.js} +7 -7
  6. package/dist/cli/chunk-3oLxlxPn.js +1 -0
  7. package/dist/cli/chunk-63s8NnIS.js +93 -0
  8. package/dist/cli/{chunk-BXg4-9Rq2.js → chunk-8CrZyP1b2.js} +1 -1
  9. package/dist/cli/{chunk-BP5Hg6CM.js → chunk-B--ueArB.js} +1 -1
  10. package/dist/cli/chunk-BATVgkFY.js +17 -0
  11. package/dist/cli/chunk-BIh7rXlJ2.js +1 -0
  12. package/dist/cli/{chunk-Drr0VSGA2.js → chunk-BKnTOLLS2.js} +1 -1
  13. package/dist/cli/{chunk-C5PuRV08.js → chunk-BLMC1Bxv.js} +1 -1
  14. package/dist/cli/{chunk-B2tNSlFy2.js → chunk-BOigzz2U2.js} +1 -1
  15. package/dist/cli/{chunk-DOf3DZdR.js → chunk-BOzn335y.js} +1 -1
  16. package/dist/cli/chunk-BjOeVLb42.js +1 -0
  17. package/dist/cli/{chunk-DqTx0rRp2.js → chunk-Bjqh5_SU2.js} +1 -1
  18. package/dist/cli/chunk-BqWBd_jF2.js +1 -0
  19. package/dist/cli/{chunk-DIbSoQmd2.js → chunk-C6FFByBU2.js} +2 -2
  20. package/dist/cli/{chunk-Drq18VZe.js → chunk-C9-aL3rF.js} +1 -1
  21. package/dist/cli/{chunk-BUhqHeEA2.js → chunk-C9czddEh2.js} +2 -2
  22. package/dist/cli/chunk-CCx8WOwz2.js +1 -0
  23. package/dist/cli/{chunk-BkMSjVJb.js → chunk-CK6ejMig.js} +1 -1
  24. package/dist/cli/chunk-CUUERioR2.js +1 -0
  25. package/dist/cli/chunk-CXAobnJd.js +1 -0
  26. package/dist/cli/chunk-CY1X0pOF2.js +1 -0
  27. package/dist/cli/chunk-CZvvgLVv.js +1 -0
  28. package/dist/cli/chunk-CbcwbfJB.js +1 -0
  29. package/dist/cli/{chunk-quilB3TV2.js → chunk-Ci9OJGcd2.js} +1 -1
  30. package/dist/cli/chunk-Cj9wl0qx.js +1 -0
  31. package/dist/cli/{chunk-3gRhOmGo2.js → chunk-CjJsVrKI2.js} +1 -1
  32. package/dist/cli/{chunk-CmEfzm-_.js → chunk-ClPZ4Rea.js} +1 -1
  33. package/dist/cli/chunk-Cmdxoq9q.js +13 -0
  34. package/dist/cli/{chunk-WMPAfIvV2.js → chunk-DHJCGRuG2.js} +1 -1
  35. package/dist/cli/{chunk-C7Y2xIk4.js → chunk-DKVkYTV9.js} +1 -1
  36. package/dist/cli/chunk-DR2XtWRo.js +1 -0
  37. package/dist/cli/{chunk-BiVJVh_S.js → chunk-DUlIqkaX.js} +7 -7
  38. package/dist/cli/{chunk-CkpueGaZ2.js → chunk-DjWle8FF2.js} +1 -1
  39. package/dist/cli/{chunk-CSvHmNOk.js → chunk-DmRXVLfy.js} +1 -1
  40. package/dist/cli/{chunk-BT1xXZn72.js → chunk-HlSiTC-u2.js} +1 -1
  41. package/dist/cli/{chunk-da0bsiOn.js → chunk-P4JSeFBI.js} +1 -1
  42. package/dist/cli/chunk-UcNbHaRQ.js +1 -0
  43. package/dist/cli/{chunk-BXFHFbEd.js → chunk-UweLmfQS.js} +1 -1
  44. package/dist/cli/{chunk-CGiXWHTi2.js → chunk-gwpxl-0W2.js} +1 -1
  45. package/dist/cli/{chunk-NH8koEis2.js → chunk-nmDhxXH_2.js} +1 -1
  46. package/dist/cli/chunk-p0n_c-I2.js +1 -0
  47. package/dist/cli/{chunk-D7xP72La.js → chunk-q7r4FosZ.js} +1 -1
  48. package/dist/cli/cli.js +1 -1
  49. package/dist/cli/prerender/dsd-shell/prerender-dsd-shell.js +1 -1
  50. package/dist/electron/main.cjs +1 -1
  51. package/dist/headless-agent.js +1 -1
  52. package/dist/lib/{app-routes-BAEMLu9g.js → app-routes-CKkiX12g.js} +7 -2
  53. package/dist/lib/app-routes-CKkiX12g.js.map +1 -0
  54. package/dist/lib/components/index.js +26 -26
  55. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  56. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  57. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  58. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  59. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  60. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  61. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  62. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  63. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  64. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  65. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  66. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  67. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  68. package/dist/lib/components/shadow-claw/utils/syncSlottedSidebarActiveLinks.d.ts +10 -0
  69. package/dist/lib/components/shadow-claw-a2ui.js +1 -1
  70. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  71. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  72. package/dist/lib/components/shadow-claw-channels.js +1 -1
  73. package/dist/lib/components/shadow-claw-chat.js +1 -1
  74. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  75. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  76. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  77. package/dist/lib/components/shadow-claw-files.js +1 -1
  78. package/dist/lib/components/shadow-claw-git.js +1 -1
  79. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  80. package/dist/lib/components/shadow-claw-llm.js +1 -1
  81. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  82. package/dist/lib/components/shadow-claw-networking.js +1 -1
  83. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  84. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  85. package/dist/lib/components/shadow-claw-pages.js +1 -1
  86. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  87. package/dist/lib/components/shadow-claw-settings.js +1 -1
  88. package/dist/lib/components/shadow-claw-storage.js +1 -1
  89. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  90. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  91. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  92. package/dist/lib/components/shadow-claw-tools.js +1 -1
  93. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  94. package/dist/lib/components/shadow-claw.js +1 -1
  95. package/dist/lib/{config-CPHDmyTx.js → config-DZkF9LiO.js} +2 -2
  96. package/dist/lib/{config-CPHDmyTx.js.map → config-DZkF9LiO.js.map} +1 -1
  97. package/dist/lib/{configurePeerJs-BsJoycQd.js → configurePeerJs-B3IE9BY2.js} +3 -3
  98. package/dist/lib/{configurePeerJs-BsJoycQd.js.map → configurePeerJs-B3IE9BY2.js.map} +1 -1
  99. package/dist/lib/{connections-BdIru7bF.js → connections-CalJGWvZ.js} +2 -2
  100. package/dist/lib/{connections-BdIru7bF.js.map → connections-CalJGWvZ.js.map} +1 -1
  101. package/dist/lib/{downloadGroupFile-Dn0KsMlV.js → downloadGroupFile-DDE1fIhJ.js} +2 -2
  102. package/dist/lib/{downloadGroupFile-Dn0KsMlV.js.map → downloadGroupFile-DDE1fIhJ.js.map} +1 -1
  103. package/dist/lib/{file-viewer-BYrXXu-X.js → file-viewer-Bll2EoGc.js} +5 -5
  104. package/dist/lib/{file-viewer-BYrXXu-X.js.map → file-viewer-Bll2EoGc.js.map} +1 -1
  105. package/dist/lib/{getGroupDir-DF-RZO8X.js → getGroupDir-MHv7Lvmp.js} +4 -4
  106. package/dist/lib/{getGroupDir-DF-RZO8X.js.map → getGroupDir-MHv7Lvmp.js.map} +1 -1
  107. package/dist/lib/{git-s_0cgKm1.js → git-Bv_M3dgw.js} +3 -3
  108. package/dist/lib/{git-s_0cgKm1.js.map → git-Bv_M3dgw.js.map} +1 -1
  109. package/dist/lib/{iframe-sanitizer-DFdda1jJ.js → iframe-sanitizer-C7ZGDjEI.js} +2 -2
  110. package/dist/lib/{iframe-sanitizer-DFdda1jJ.js.map → iframe-sanitizer-C7ZGDjEI.js.map} +1 -1
  111. package/dist/lib/{iframe-storage-proxy-qrhZmQyO.js → iframe-storage-proxy-CR8ZYHPd.js} +2 -2
  112. package/dist/lib/{iframe-storage-proxy-qrhZmQyO.js.map → iframe-storage-proxy-CR8ZYHPd.js.map} +1 -1
  113. package/dist/lib/index.js +27 -27
  114. package/dist/lib/{initChatSplitResize-DuNlwCuI.js → initChatSplitResize-DiKTI-wk.js} +2 -2
  115. package/dist/lib/{initChatSplitResize-DuNlwCuI.js.map → initChatSplitResize-DiKTI-wk.js.map} +1 -1
  116. package/dist/lib/{initControlPlane-D4UZ4EhV.js → initControlPlane-CzjtQ4aM.js} +15 -15
  117. package/dist/lib/{initControlPlane-D4UZ4EhV.js.map → initControlPlane-CzjtQ4aM.js.map} +1 -1
  118. package/dist/lib/{markdown-CRRwbN9h.js → markdown-k8wA9LKy.js} +4 -4
  119. package/dist/lib/{markdown-CRRwbN9h.js.map → markdown-k8wA9LKy.js.map} +1 -1
  120. package/dist/lib/{mcp-reconnect-COdZ-cea.js → mcp-reconnect-CGIdfZnS.js} +2 -2
  121. package/dist/lib/{mcp-reconnect-COdZ-cea.js.map → mcp-reconnect-CGIdfZnS.js.map} +1 -1
  122. package/dist/lib/{memoryStorage-BsMe2FOQ.js → memoryStorage-DL-Bo3dh.js} +2 -2
  123. package/dist/lib/{memoryStorage-BsMe2FOQ.js.map → memoryStorage-DL-Bo3dh.js.map} +1 -1
  124. package/dist/lib/{orchestrator-D9f5fDCb.js → orchestrator-DKHCoikY.js} +11 -11
  125. package/dist/lib/{orchestrator-D9f5fDCb.js.map → orchestrator-DKHCoikY.js.map} +1 -1
  126. package/dist/lib/{orchestrator-CMN43L0F.js → orchestrator-Dn1ZOz9B.js} +12 -12
  127. package/dist/lib/{orchestrator-CMN43L0F.js.map → orchestrator-Dn1ZOz9B.js.map} +1 -1
  128. package/dist/lib/{peerjs-6u8KtenE.js → peerjs-BK41iBvP.js} +7 -7
  129. package/dist/lib/{peerjs-6u8KtenE.js.map → peerjs-BK41iBvP.js.map} +1 -1
  130. package/dist/lib/{push-client-DCnB2-OU.js → push-client-DKgVFD2Z.js} +3 -3
  131. package/dist/lib/{push-client-DCnB2-OU.js.map → push-client-DKgVFD2Z.js.map} +1 -1
  132. package/dist/lib/{readGroupFileBytes-nKNJ6sbl.js → readGroupFileBytes-CgU_UfGv.js} +2 -2
  133. package/dist/lib/{readGroupFileBytes-nKNJ6sbl.js.map → readGroupFileBytes-CgU_UfGv.js.map} +1 -1
  134. package/dist/lib/{shadow-claw-4x3LqlII.js → shadow-claw-CtCj5Rn_.js} +121 -16
  135. package/dist/lib/shadow-claw-CtCj5Rn_.js.map +1 -0
  136. package/dist/lib/{shadow-claw-a2ui-Dipe8nY2.js → shadow-claw-a2ui-CvK5w940.js} +2 -2
  137. package/dist/lib/{shadow-claw-a2ui-Dipe8nY2.js.map → shadow-claw-a2ui-CvK5w940.js.map} +1 -1
  138. package/dist/lib/{shadow-claw-accounts-BgCkz3Zv.js → shadow-claw-accounts-Br3XdHro.js} +3 -3
  139. package/dist/lib/{shadow-claw-accounts-BgCkz3Zv.js.map → shadow-claw-accounts-Br3XdHro.js.map} +1 -1
  140. package/dist/lib/{shadow-claw-channel-config-CIm_Bxd2.js → shadow-claw-channel-config-Da2dN19M.js} +3 -3
  141. package/dist/lib/{shadow-claw-channel-config-CIm_Bxd2.js.map → shadow-claw-channel-config-Da2dN19M.js.map} +1 -1
  142. package/dist/lib/{shadow-claw-channels-CaceK52s.js → shadow-claw-channels-BofYHgz8.js} +3 -3
  143. package/dist/lib/{shadow-claw-channels-CaceK52s.js.map → shadow-claw-channels-BofYHgz8.js.map} +1 -1
  144. package/dist/lib/{shadow-claw-chat-BD18-mAR.js → shadow-claw-chat-Dw32DPV2.js} +12 -12
  145. package/dist/lib/{shadow-claw-chat-BD18-mAR.js.map → shadow-claw-chat-Dw32DPV2.js.map} +1 -1
  146. package/dist/lib/{shadow-claw-control-plane-U6LsfRPm.js → shadow-claw-control-plane-CwFotFDh.js} +7 -7
  147. package/dist/lib/{shadow-claw-control-plane-U6LsfRPm.js.map → shadow-claw-control-plane-CwFotFDh.js.map} +1 -1
  148. package/dist/lib/{shadow-claw-conversations-CDsza_oB.js → shadow-claw-conversations-0UXge23k.js} +5 -5
  149. package/dist/lib/{shadow-claw-conversations-CDsza_oB.js.map → shadow-claw-conversations-0UXge23k.js.map} +1 -1
  150. package/dist/lib/{shadow-claw-file-viewer-CuDhkVcL.js → shadow-claw-file-viewer-CAsn9NxH.js} +10 -10
  151. package/dist/lib/{shadow-claw-file-viewer-CuDhkVcL.js.map → shadow-claw-file-viewer-CAsn9NxH.js.map} +1 -1
  152. package/dist/lib/{shadow-claw-files-BI0P3m8a.js → shadow-claw-files-xGGhsHNH.js} +9 -9
  153. package/dist/lib/{shadow-claw-files-BI0P3m8a.js.map → shadow-claw-files-xGGhsHNH.js.map} +1 -1
  154. package/dist/lib/{shadow-claw-git-xRApLEMN.js → shadow-claw-git-B606hcMU.js} +6 -6
  155. package/dist/lib/{shadow-claw-git-xRApLEMN.js.map → shadow-claw-git-B606hcMU.js.map} +1 -1
  156. package/dist/lib/{shadow-claw-integrations-B2e1Nfg1.js → shadow-claw-integrations-Bwq5cba1.js} +4 -4
  157. package/dist/lib/{shadow-claw-integrations-B2e1Nfg1.js.map → shadow-claw-integrations-Bwq5cba1.js.map} +1 -1
  158. package/dist/lib/{shadow-claw-llm-Bc2mWuGb.js → shadow-claw-llm-BgpcMBIy.js} +6 -6
  159. package/dist/lib/{shadow-claw-llm-Bc2mWuGb.js.map → shadow-claw-llm-BgpcMBIy.js.map} +1 -1
  160. package/dist/lib/{shadow-claw-mcp-remote-D_Bh3aeC.js → shadow-claw-mcp-remote-DvQCA-Bk.js} +4 -4
  161. package/dist/lib/{shadow-claw-mcp-remote-D_Bh3aeC.js.map → shadow-claw-mcp-remote-DvQCA-Bk.js.map} +1 -1
  162. package/dist/lib/{shadow-claw-networking-F5W3n5ci.js → shadow-claw-networking-Cxvf9c7E.js} +2 -2
  163. package/dist/lib/{shadow-claw-networking-F5W3n5ci.js.map → shadow-claw-networking-Cxvf9c7E.js.map} +1 -1
  164. package/dist/lib/{shadow-claw-notifications-lvMt9WJ1.js → shadow-claw-notifications-CGVcFYBy.js} +3 -3
  165. package/dist/lib/{shadow-claw-notifications-lvMt9WJ1.js.map → shadow-claw-notifications-CGVcFYBy.js.map} +1 -1
  166. package/dist/lib/{shadow-claw-page-header-6gq6EMqX.js → shadow-claw-page-header-DAYz3I_o.js} +2 -2
  167. package/dist/lib/{shadow-claw-page-header-6gq6EMqX.js.map → shadow-claw-page-header-DAYz3I_o.js.map} +1 -1
  168. package/dist/lib/{shadow-claw-pages-Bo8_z2S-.js → shadow-claw-pages-BLeEZb9k.js} +24 -12
  169. package/dist/lib/shadow-claw-pages-BLeEZb9k.js.map +1 -0
  170. package/dist/lib/{shadow-claw-peerjs-DRTLCVDQ.js → shadow-claw-peerjs-BcFnbK74.js} +3 -3
  171. package/dist/lib/{shadow-claw-peerjs-DRTLCVDQ.js.map → shadow-claw-peerjs-BcFnbK74.js.map} +1 -1
  172. package/dist/lib/{shadow-claw-settings-D00B4p4L.js → shadow-claw-settings-B7o0Z4hu.js} +9 -9
  173. package/dist/lib/{shadow-claw-settings-D00B4p4L.js.map → shadow-claw-settings-B7o0Z4hu.js.map} +1 -1
  174. package/dist/lib/{shadow-claw-storage-DgMe7-Zo.js → shadow-claw-storage-afMVqB7E.js} +5 -5
  175. package/dist/lib/{shadow-claw-storage-DgMe7-Zo.js.map → shadow-claw-storage-afMVqB7E.js.map} +1 -1
  176. package/dist/lib/{shadow-claw-task-server-D103YOuI.js → shadow-claw-task-server-B9-MQjl6.js} +2 -2
  177. package/dist/lib/{shadow-claw-task-server-D103YOuI.js.map → shadow-claw-task-server-B9-MQjl6.js.map} +1 -1
  178. package/dist/lib/{shadow-claw-tasks-6OhALkq1.js → shadow-claw-tasks-Dc4BC-t-.js} +8 -8
  179. package/dist/lib/{shadow-claw-tasks-6OhALkq1.js.map → shadow-claw-tasks-Dc4BC-t-.js.map} +1 -1
  180. package/dist/lib/{shadow-claw-terminal-BGtxA1qD.js → shadow-claw-terminal-BINcTdsk.js} +2 -2
  181. package/dist/lib/{shadow-claw-terminal-BGtxA1qD.js.map → shadow-claw-terminal-BINcTdsk.js.map} +1 -1
  182. package/dist/lib/{shadow-claw-tools-OeIwAnnd.js → shadow-claw-tools-BjFgXNLR.js} +7 -7
  183. package/dist/lib/{shadow-claw-tools-OeIwAnnd.js.map → shadow-claw-tools-BjFgXNLR.js.map} +1 -1
  184. package/dist/lib/{shadow-claw-webvm-gVFZ197u.js → shadow-claw-webvm-Xe3ByMDw.js} +3 -3
  185. package/dist/lib/{shadow-claw-webvm-gVFZ197u.js.map → shadow-claw-webvm-Xe3ByMDw.js.map} +1 -1
  186. package/dist/lib/subsystems/mcp/webmcp.d.ts +64 -0
  187. package/dist/lib/{syncWebMcpRegistration-Bbph0XZl.js → syncWebMcpRegistration-D7alChz0.js} +21 -6
  188. package/dist/lib/syncWebMcpRegistration-D7alChz0.js.map +1 -0
  189. package/dist/lib/{tools-D0OlSzMD.js → tools-Cmhpk3X8.js} +4 -4
  190. package/dist/lib/{tools-D0OlSzMD.js.map → tools-Cmhpk3X8.js.map} +1 -1
  191. package/dist/lib/utils/index.js +1 -1
  192. package/dist/lib/utils/namespacedStorage.js +1 -1
  193. package/dist/lib/utils/utils.js +1 -1
  194. package/dist/lib/{utils-DYdrO2KI.js → utils-CzgKe_XZ.js} +4 -4
  195. package/dist/lib/{utils-DYdrO2KI.js.map → utils-CzgKe_XZ.js.map} +1 -1
  196. package/dist/lib/{webmcp-D2bocsgh.js → webmcp-oEP9YpR2.js} +119 -3
  197. package/dist/lib/{webmcp-D2bocsgh.js.map → webmcp-oEP9YpR2.js.map} +1 -1
  198. package/dist/public/.well-known/mcp/server-card.json +1 -1
  199. package/dist/public/.well-known/mcp.json +1 -1
  200. package/dist/public/AGENTS.md +8 -2
  201. package/dist/public/README.md +2 -1
  202. package/dist/public/agent.worker.js +1 -1
  203. package/dist/public/app-routes-C6-H2zPH.js +1 -0
  204. package/dist/public/components/shadow-claw/shadow-claw.css +1 -1
  205. package/dist/public/components/shadow-claw/shadow-claw.html +1 -1
  206. package/dist/public/components/shadow-claw-pages/shadow-claw-pages.css +1 -1
  207. package/dist/public/{config-D4lVqMs8.js → config-Dewnqegf.js} +1 -1
  208. package/dist/public/{configurePeerJs-DDOAVSaH.js → configurePeerJs-CaPU2sN5.js} +1 -1
  209. package/dist/public/{connections-CiukjGiH.js → connections-CwE7jE9l.js} +1 -1
  210. package/dist/public/{custom-element-security-piU2U-Ec.js → custom-element-security-DLgHMf5R.js} +1 -1
  211. package/dist/public/docs/README.md +1 -0
  212. package/dist/public/docs/example/article/index.html +4 -4
  213. package/dist/public/docs/guides/publishing-to-github-pages.md +95 -6
  214. package/dist/public/docs/publishing/index.html +4 -4
  215. package/dist/public/docs/skill-creator/index.html +4 -4
  216. package/dist/public/docs/subsystems/pages.md +10 -3
  217. package/dist/public/docs/subsystems/theming.md +242 -0
  218. package/dist/public/docs/subsystems/webmcp.md +89 -1
  219. package/dist/public/{downloadGroupFile-BiZQYY-O.js → downloadGroupFile-ChWHuap_.js} +1 -1
  220. package/dist/public/e2e/README.md +3 -2
  221. package/dist/public/{e2e-bridge-CybB810Q.js → e2e-bridge-BkaldjV2.js} +1 -1
  222. package/dist/public/{file-viewer-DLUBvOVD.js → file-viewer-Df4qUJCn.js} +1 -1
  223. package/dist/public/{getGroupDir-CLz5c8cg.js → getGroupDir-CeSr4fzS.js} +1 -1
  224. package/dist/public/{git-Ba8AeviI.js → git-Bscc1tK-.js} +2 -2
  225. package/dist/public/{iframe-sanitizer-CKOO7cxp.js → iframe-sanitizer-BVdkQsor.js} +1 -1
  226. package/dist/public/{iframe-storage-proxy-BvRiccH0.js → iframe-storage-proxy-Cg8aFw7o.js} +1 -1
  227. package/dist/public/index.css +1 -1
  228. package/dist/public/index.html +4 -4
  229. package/dist/public/index.js +1 -1
  230. package/dist/public/{initChatSplitResize-osJXM2gu.js → initChatSplitResize-C3Rp1LeZ.js} +1 -1
  231. package/dist/public/{initControlPlane-CNggzsRw.js → initControlPlane-C1pnzG16.js} +1 -1
  232. package/dist/public/llms.txt +2 -2
  233. package/dist/public/main/index.html +4 -4
  234. package/dist/public/main/memory/index.html +4 -4
  235. package/dist/public/{markdown-CZA-Ye2Q.js → markdown-D3A902nT.js} +1 -1
  236. package/dist/public/{mcp-reconnect-BK1bYBdC.js → mcp-reconnect-BJWxQBm_.js} +1 -1
  237. package/dist/public/{memoryStorage-Bew1X8Uy.js → memoryStorage-ykv-Ri-y.js} +1 -1
  238. package/dist/public/{orchestrator-D6tel2Zp.js → orchestrator-BVnC4Vtt.js} +2 -2
  239. package/dist/public/{orchestrator-Dc_Q73La.js → orchestrator-CQcc7OFA.js} +2 -2
  240. package/dist/public/{peerjs-CYs1F7sq.js → peerjs-CYC2cI1Y.js} +1 -1
  241. package/dist/public/{push-client-_HUyJlFJ.js → push-client-BJrnOULM.js} +1 -1
  242. package/dist/public/service-worker/fetch-proxy.js +1 -1
  243. package/dist/public/service-worker.js +1 -1
  244. package/dist/public/{shadow-claw-Dabb2AEp.js → shadow-claw-WwfOu-tu.js} +33 -3
  245. package/dist/public/{shadow-claw-accounts-BqGrm47Z.js → shadow-claw-accounts-BFZxrPsH.js} +1 -1
  246. package/dist/public/{shadow-claw-channels-Ci2UPaaA.js → shadow-claw-channels-C0w0c1EF.js} +1 -1
  247. package/dist/public/{shadow-claw-chat-BxR6cBYQ.js → shadow-claw-chat-DIJ0A-QN.js} +1 -1
  248. package/dist/public/{shadow-claw-control-plane-C1A-CZ9H.js → shadow-claw-control-plane-DZoxUd-1.js} +2 -2
  249. package/dist/public/{shadow-claw-conversations-DcwG05-H.js → shadow-claw-conversations-DMyG_5zj.js} +1 -1
  250. package/dist/public/{shadow-claw-file-viewer-CDs1QGXk.js → shadow-claw-file-viewer-DYgZjZb9.js} +1 -1
  251. package/dist/public/{shadow-claw-files-B774Xz1d.js → shadow-claw-files-DIOUdKJr.js} +1 -1
  252. package/dist/public/{shadow-claw-git-CTIPP0vs.js → shadow-claw-git-if5S0QJr.js} +2 -2
  253. package/dist/public/{shadow-claw-integrations-CjtkA6l0.js → shadow-claw-integrations-BQt4hcWe.js} +1 -1
  254. package/dist/public/{shadow-claw-llm-DfmITHde.js → shadow-claw-llm-9uf1KFA0.js} +2 -2
  255. package/dist/public/{shadow-claw-mcp-remote-BPuV22So.js → shadow-claw-mcp-remote-COpNIzJd.js} +1 -1
  256. package/dist/public/{shadow-claw-networking-DEMMygy0.js → shadow-claw-networking-AOVRUn6B.js} +1 -1
  257. package/dist/public/{shadow-claw-notifications-B9Xhcj1P.js → shadow-claw-notifications-CKB-W1TA.js} +1 -1
  258. package/dist/public/{shadow-claw-page-header-CAXokjQy.js → shadow-claw-page-header-D4LmUigA.js} +1 -1
  259. package/dist/public/{shadow-claw-pages-BRQw8bTm.js → shadow-claw-pages-BpHRY4vH.js} +12 -3
  260. package/dist/public/{shadow-claw-settings-BGrDNyqh.js → shadow-claw-settings-CE-aUo_J.js} +3 -3
  261. package/dist/public/{shadow-claw-storage-DK3pf11w.js → shadow-claw-storage-CFKC-Y3V.js} +1 -1
  262. package/dist/public/{shadow-claw-task-server-CMp5Vjza.js → shadow-claw-task-server-B_ZjqK4B.js} +1 -1
  263. package/dist/public/{shadow-claw-tasks-BO8aXM2B.js → shadow-claw-tasks-CGsEv48K.js} +1 -1
  264. package/dist/public/{shadow-claw-terminal-BSeTuyDa.js → shadow-claw-terminal-DcaS7cPH.js} +1 -1
  265. package/dist/public/{shadow-claw-tools-Bj6DLZ-2.js → shadow-claw-tools-Cnu9hKy0.js} +1 -1
  266. package/dist/public/{shadow-claw-webvm-M7d5RH8H.js → shadow-claw-webvm-BB8SFvJ8.js} +1 -1
  267. package/dist/public/syncWebMcpRegistration-D2Zx4oA1.js +1 -0
  268. package/dist/public/theme-init.js +1 -1
  269. package/dist/public/{tools-nysPKnGT.js → tools-sOLCHTj8.js} +1 -1
  270. package/dist/public/{webmcp-Bo3KTgRb.js → webmcp-YFt6vM1_.js} +1 -1
  271. package/dist/server.js +188 -188
  272. package/package.json +1 -1
  273. package/src/cli/build/build.ts +18 -11
  274. package/src/cli/prerender/dsd-shell/prerender-dsd-shell.test.ts +4 -1
  275. package/src/cli/prerender/dsd-shell/prerender-dsd-shell.ts +13 -1
  276. package/src/cli/prerender/pretty-paths/prerender-pretty-paths.ts +22 -0
  277. package/src/cli/prerender/utils/insert-before-closing-head.test.ts +34 -1
  278. package/src/cli/prerender/utils/insert-before-closing-head.ts +20 -6
  279. package/src/cli/site-config/apply.test.ts +90 -0
  280. package/src/cli/site-config/apply.ts +189 -22
  281. package/src/components/shadow-claw/shadow-claw.css +26 -0
  282. package/src/components/shadow-claw/shadow-claw.html +4 -0
  283. package/src/components/shadow-claw/utils/applyRoute.ts +3 -0
  284. package/src/components/shadow-claw/utils/bindEventListeners.test.ts +6 -0
  285. package/src/components/shadow-claw/utils/bindEventListeners.ts +30 -1
  286. package/src/components/shadow-claw/utils/getRoute.test.ts +52 -0
  287. package/src/components/shadow-claw/utils/getRoute.ts +18 -0
  288. package/src/components/shadow-claw/utils/navigateToRoute.test.ts +21 -0
  289. package/src/components/shadow-claw/utils/navigateToRoute.ts +10 -0
  290. package/src/components/shadow-claw/utils/sidebarVisibility.ts +12 -4
  291. package/src/components/shadow-claw/utils/syncSlottedSidebarActiveLinks.test.ts +93 -0
  292. package/src/components/shadow-claw/utils/syncSlottedSidebarActiveLinks.ts +100 -0
  293. package/src/components/shadow-claw-pages/shadow-claw-pages.css +10 -1
  294. package/src/components/shadow-claw-pages/utils/removePreviewIframe.ts +3 -0
  295. package/src/core/orchestrator/utils/syncWebMcpRegistration.test.ts +52 -0
  296. package/src/core/orchestrator/utils/syncWebMcpRegistration.ts +28 -1
  297. package/src/server/middleware/static-files.test.ts +36 -0
  298. package/src/server/middleware/static-files.ts +14 -6
  299. package/src/storage/staticRouting.test.ts +36 -0
  300. package/src/storage/staticRouting.ts +31 -3
  301. package/src/subsystems/mcp/webmcp.test.ts +255 -0
  302. package/src/subsystems/mcp/webmcp.ts +253 -0
  303. package/dist/cli/chunk-00GAzVPl2.js +0 -1
  304. package/dist/cli/chunk-2hnFoNNC.js +0 -1
  305. package/dist/cli/chunk-BKQL4nzF2.js +0 -1
  306. package/dist/cli/chunk-BQ4K3fqj2.js +0 -1
  307. package/dist/cli/chunk-BVCGo6uf2.js +0 -1
  308. package/dist/cli/chunk-Bc9nRNyN.js +0 -11
  309. package/dist/cli/chunk-BcTH_-FL.js +0 -1
  310. package/dist/cli/chunk-BmD_sPRt.js +0 -1
  311. package/dist/cli/chunk-BsxNqqer.js +0 -1
  312. package/dist/cli/chunk-CCcF5T-c.js +0 -1
  313. package/dist/cli/chunk-CFhvwUeL.js +0 -91
  314. package/dist/cli/chunk-CwWtvULn.js +0 -1
  315. package/dist/cli/chunk-DID5VvOG.js +0 -17
  316. package/dist/cli/chunk-Drf-hXIR2.js +0 -1
  317. package/dist/cli/chunk-Dt5HNYVi.js +0 -1
  318. package/dist/cli/chunk-DwZQi9Ax.js +0 -1
  319. package/dist/cli/chunk-m9ZX7TyF2.js +0 -1
  320. package/dist/lib/app-routes-BAEMLu9g.js.map +0 -1
  321. package/dist/lib/shadow-claw-4x3LqlII.js.map +0 -1
  322. package/dist/lib/shadow-claw-pages-Bo8_z2S-.js.map +0 -1
  323. package/dist/lib/syncWebMcpRegistration-Bbph0XZl.js.map +0 -1
  324. package/dist/public/app-routes-BMQ4HFaM.js +0 -1
  325. package/dist/public/syncWebMcpRegistration-4bT0YUyZ.js +0 -1
@@ -1,4 +1,4 @@
1
- import{D as e,E as t,F as n,I as r,M as i,O as a,P as o,R 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}from"./config-D4lVqMs8.js";import{i as y,n as b,r as x}from"./txPromise-C2iYogHX.js";import{t as S}from"./getConfig-4saf0Tkq.js";import{m as C}from"./custom-element-security-piU2U-Ec.js";import{t as w}from"./dist-B9m1QM9v.js";import{At as T,C as E,Ct as D,Dt as ee,Et as te,Ft as O,G as k,Gt as A,H as j,Ht as M,I as ne,It as N,Jt as P,Kt as F,Lt as I,M as re,Mt as L,N as ie,Nt as R,Ot as z,P as ae,Pt as oe,Rt as se,Sn as B,St as V,Tt as ce,U as le,Ut as ue,V as de,W as fe,Wt as pe,X as me,Y as he,Yt as ge,an as _e,at as ve,bn as ye,bt as be,cn as H,dn as xe,dt as Se,fn as Ce,ft as we,gt as Te,in as Ee,j as De,jt as Oe,kt as ke,l as Ae,ln as je,on as Me,ot as Ne,pn as Pe,qt as Fe,rn as U,t as W,u as Ie,un as G,ut as Le,vn as Re,yn as ze}from"./orchestrator-D6tel2Zp.js";import{n as Be,r as Ve}from"./headless-BbtDA5cs.js";import{l as He,r as Ue}from"./getGroupDir-CLz5c8cg.js";import{c as We,f as Ge,s as Ke,t as K,u as qe}from"./tools-nysPKnGT.js";import{t as q}from"./setConfig-DdSThoKj.js";import{t as J}from"./ulid-BY7rQVLN.js";import{t as Je}from"./tools-Day-D-vL.js";import{i as Ye,r as Xe}from"./syncWebMcpRegistration-4bT0YUyZ.js";import"./tools-vzWYHFBC.js";import{n as Ze,r as Qe}from"./crypto-C8c5wMzN.js";import{i as $e,r as Y,t as et}from"./peerjs-CYs1F7sq.js";import{i as tt,r as nt}from"./webmcp-Bo3KTgRb.js";import{ensureControlPlaneConnected as rt}from"./initControlPlane-CNggzsRw.js";async function it(e){if(!(!e||e.name===`shadowclaw`)){try{if(await S(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;if(!n.objectStoreNames||n.objectStoreNames.length===0){n.close(),e(null);return}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 q(e,m.DB_MIGRATED_FROM_LEGACY,`true`)}catch{}}}}async function at(e,t,n){for await(let[r,i]of e.entries())if(i.kind===`directory`)await at(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 Ke(a,e)}catch(t){if(!(t instanceof Error?t.message:String(t)).includes(`Writable file streams are not supported`))throw t;await We([...n,r],e)}}}async function ot(e){if(!e)return;try{if(await S(e,m.OPFS_MIGRATED_FROM_LEGACY)===`true`)return}catch{}let t=Ue();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 q(e,m.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}return}let i=await n.getDirectoryHandle(t,{create:!0});await at(r,i,[t])}catch(e){console.warn(`Legacy OPFS migration warning:`,e)}finally{try{await q(e,m.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}}}function st(){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,y(n);try{await it(n),await ot(n)}catch(e){console.warn(`Error running legacy migration:`,e)}e(n)},i.onerror=()=>{t(Error(`Failed to open IndexedDB: ${i.error?.message}`))}})}var ct=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:J(),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)}},lt=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()}},ut=class{abortController=null;apiKey=``;apiMode=`unknown`;cursor=null;fileReader=null;messageCallback=null;reconnectDelayMs=1e3;registeredChatIds=new Set;running=!1;seenMessageIds=new Map;serverUrl=``;type=`imessage`;configure(e,t,n){this.serverUrl=dt(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:ft(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 pt(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}=mt(t);for(let t of a){if(!this.fileReader){await this.sendText(r,`[${t.alt}] (file: ${t.path})`);continue}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){if(await this.ensureApiMode()===`beeper-desktop`){await this.sendAttachmentViaBeeperDesktop(e,t,n);return}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){if(await this.ensureApiMode()===`beeper-desktop`){await this.requestJson(`/v1/chats/${encodeURIComponent(e)}/messages`,{method:`POST`,body:JSON.stringify({text:t})});return}await this.requestJson(`/messages/send`,{method:`POST`,body:JSON.stringify({chatId:e,text:t})})}};function dt(e){return e.trim().replace(/\/+$/,``)}function ft(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 ft(t);let n=Date.parse(e);if(Number.isFinite(n))return n}return Date.now()}function pt(e){return new Promise(t=>setTimeout(t,e))}function mt(e){let t=[],n=/!?\[([^\]]*)\]\(([^)]+)\)/g,r=null,i=e;for(;(r=n.exec(e))!==null;){let e=r[1]||``,n=ht((r[2]||``).trim());n&&(t.push({alt:e,path:n}),i=i.replace(r[0],``))}return{remainingText:i,attachments:t}}function ht(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 gt=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=P(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 _t=1e3;var vt=class{abortController=null;fileReader=null;messageCallback=null;offset=0;pollRetryDelayMs=_t;pollSessionId=0;registeredChatIds=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(t){let n=t.replace(/^\/+/,``);return`${this.useProxy?e: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=_t}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}.${xt(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,n,r){let i=e.replace(/^tg:/,``),{remainingText:a,attachments:o}=St(n);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=yt(s,t);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 bt(e)}};function yt(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{D as e,E as t,F as n,I as r,M as i,O as a,P as o,R 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}from"./config-Dewnqegf.js";import{i as y,n as b,r as x}from"./txPromise-C2iYogHX.js";import{t as S}from"./getConfig-4saf0Tkq.js";import{m as C}from"./custom-element-security-DLgHMf5R.js";import{t as w}from"./dist-B9m1QM9v.js";import{At as T,C as E,Ct as D,Dt as ee,Et as te,Ft as O,G as k,Gt as A,H as j,Ht as M,I as ne,It as N,Jt as P,Kt as F,Lt as I,M as re,Mt as L,N as ie,Nt as R,Ot as z,P as ae,Pt as oe,Rt as se,Sn as B,St as V,Tt as ce,U as le,Ut as ue,V as de,W as fe,Wt as pe,X as me,Y as he,Yt as ge,an as _e,at as ve,bn as ye,bt as be,cn as H,dn as xe,dt as Se,fn as Ce,ft as we,gt as Te,in as Ee,j as De,jt as Oe,kt as ke,l as Ae,ln as je,on as Me,ot as Ne,pn as Pe,qt as Fe,rn as U,t as W,u as Ie,un as G,ut as Le,vn as Re,yn as ze}from"./orchestrator-BVnC4Vtt.js";import{n as Be,r as Ve}from"./headless-BbtDA5cs.js";import{l as He,r as Ue}from"./getGroupDir-CeSr4fzS.js";import{c as We,f as Ge,s as Ke,t as K,u as qe}from"./tools-sOLCHTj8.js";import{t as q}from"./setConfig-DdSThoKj.js";import{t as J}from"./ulid-BY7rQVLN.js";import{t as Je}from"./tools-Day-D-vL.js";import{i as Ye,r as Xe}from"./syncWebMcpRegistration-D2Zx4oA1.js";import"./tools-vzWYHFBC.js";import{n as Ze,r as Qe}from"./crypto-C8c5wMzN.js";import{i as $e,r as Y,t as et}from"./peerjs-CYC2cI1Y.js";import{a as tt,o as nt}from"./webmcp-YFt6vM1_.js";import{ensureControlPlaneConnected as rt}from"./initControlPlane-C1pnzG16.js";async function it(e){if(!(!e||e.name===`shadowclaw`)){try{if(await S(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;if(!n.objectStoreNames||n.objectStoreNames.length===0){n.close(),e(null);return}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 q(e,m.DB_MIGRATED_FROM_LEGACY,`true`)}catch{}}}}async function at(e,t,n){for await(let[r,i]of e.entries())if(i.kind===`directory`)await at(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 Ke(a,e)}catch(t){if(!(t instanceof Error?t.message:String(t)).includes(`Writable file streams are not supported`))throw t;await We([...n,r],e)}}}async function ot(e){if(!e)return;try{if(await S(e,m.OPFS_MIGRATED_FROM_LEGACY)===`true`)return}catch{}let t=Ue();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 q(e,m.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}return}let i=await n.getDirectoryHandle(t,{create:!0});await at(r,i,[t])}catch(e){console.warn(`Legacy OPFS migration warning:`,e)}finally{try{await q(e,m.OPFS_MIGRATED_FROM_LEGACY,`true`)}catch{}}}function st(){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,y(n);try{await it(n),await ot(n)}catch(e){console.warn(`Error running legacy migration:`,e)}e(n)},i.onerror=()=>{t(Error(`Failed to open IndexedDB: ${i.error?.message}`))}})}var ct=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:J(),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)}},lt=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()}},ut=class{abortController=null;apiKey=``;apiMode=`unknown`;cursor=null;fileReader=null;messageCallback=null;reconnectDelayMs=1e3;registeredChatIds=new Set;running=!1;seenMessageIds=new Map;serverUrl=``;type=`imessage`;configure(e,t,n){this.serverUrl=dt(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:ft(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 pt(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}=mt(t);for(let t of a){if(!this.fileReader){await this.sendText(r,`[${t.alt}] (file: ${t.path})`);continue}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){if(await this.ensureApiMode()===`beeper-desktop`){await this.sendAttachmentViaBeeperDesktop(e,t,n);return}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){if(await this.ensureApiMode()===`beeper-desktop`){await this.requestJson(`/v1/chats/${encodeURIComponent(e)}/messages`,{method:`POST`,body:JSON.stringify({text:t})});return}await this.requestJson(`/messages/send`,{method:`POST`,body:JSON.stringify({chatId:e,text:t})})}};function dt(e){return e.trim().replace(/\/+$/,``)}function ft(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 ft(t);let n=Date.parse(e);if(Number.isFinite(n))return n}return Date.now()}function pt(e){return new Promise(t=>setTimeout(t,e))}function mt(e){let t=[],n=/!?\[([^\]]*)\]\(([^)]+)\)/g,r=null,i=e;for(;(r=n.exec(e))!==null;){let e=r[1]||``,n=ht((r[2]||``).trim());n&&(t.push({alt:e,path:n}),i=i.replace(r[0],``))}return{remainingText:i,attachments:t}}function ht(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 gt=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=P(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 _t=1e3;var vt=class{abortController=null;fileReader=null;messageCallback=null;offset=0;pollRetryDelayMs=_t;pollSessionId=0;registeredChatIds=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(t){let n=t.replace(/^\/+/,``);return`${this.useProxy?e: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=_t}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}.${xt(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,n,r){let i=e.replace(/^tg:/,``),{remainingText:a,attachments:o}=St(n);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=yt(s,t);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 bt(e)}};function yt(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 bt(e){return new Promise(t=>setTimeout(t,e))}function xt(e){return e?.is_animated?`tgs`:e?.is_video?`webm`:`webp`}function St(e){let t=[],n=/!?\[([^\]]*)\]\(([^)]+)\)/g,r,i=e;for(;(r=n.exec(e))!==null;){let e=r[1],n=Ct((r[2]||``).trim());n&&(t.push({alt:e,path:n}),i=i.replace(r[0],``))}return{remainingText:i,attachments:t}}function Ct(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 wt(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 Tt=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
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);if(!r){console.warn(`No channel for groupId: ${e}`);return}await r.send(e,t,n)}};const Et={"litert-community/gemma-4-E2B-it-litert-lm":`https://huggingface.co/litert-community/gemma-4-E2B-it-litert-lm/resolve/main/gemma-4-E2B-it-web.litertlm`,"litert-community/gemma-4-E4B-it-litert-lm":`https://huggingface.co/litert-community/gemma-4-E4B-it-litert-lm/resolve/main/gemma-4-E4B-it-web.litertlm`},Dt=Object.keys(Et);function Ot(){return typeof navigator<`u`&&`gpu`in navigator&&typeof WebAssembly<`u`&&`Suspending`in WebAssembly}let X=null,kt=null,At=null,jt=null;const Mt=pe;async function Nt(e,t,n){return ue(e,t,n,{cacheName:`shadow-claw-litertlm-models`,chunkSize:Mt})}async function Pt(e,t,n){if(kt===e&&X)return X;if(At&&jt===e)return At;jt=e,At=(async()=>{if(X){try{await X.delete?.()}catch{}X=null,kt=null}let r=Et[e];if(!r)throw Error(`LiteRT-LM: Model '${e} is not supported. Supported models: ${Dt.join(`, `)}`);let i=await import(`./dist-DUy1CvmT.js`).catch(()=>{throw Error(`LiteRT-LM: The @litert-lm/core package is not installed. Run: npm install @litert-lm/core`)}),a=i.Engine??i.default?.Engine;if(typeof a?.create!=`function`)throw Error(`LiteRT-LM: Could not locate Engine.create in @litert-lm/core. Ensure you have the latest version installed.`);let o=await Nt(r,t??(()=>{}),n),s=await a.create({model:o,mainExecutorSettings:{maxNumTokens:8192}});return X=s,kt=e,s})();try{return await At}finally{At=null,jt=null}}function Ft(e){if(!e)return null;let t=e.match(/<\|tool_call>call:([A-Za-z0-9_]+)(\{[\s\S]*?)(?:<tool_call\|>|$)/);if(!t)return null;let n=t[1],r=t[2];r=r.replace(/<\|"\|>/g,`"`);function i(e){return e.replace(/([{,]\s*)([A-Za-z_$][A-Za-z0-9_$]*)(\s*:)/g,`$1"$2"$3`)}let a={},o=[r,i(r)];for(let e of o)try{let t=JSON.parse(e);if(t&&typeof t==`object`&&!Array.isArray(t)){a=t;break}}catch{}if(Object.keys(a).length===0){let e=r.indexOf(`{`),t=r.lastIndexOf(`}`);if(e>=0&&t>e){let n=r.slice(e,t+1);for(let e of[n,i(n)])try{let t=JSON.parse(e);if(t&&typeof t==`object`&&!Array.isArray(t)){a=t;break}}catch{}}}return{name:n,input:a}}function It(e){let t=G(String(e||``),`litert_lm`).trim();if(!t)return null;let n=e=>{try{let t=JSON.parse(e);if(t&&typeof t==`object`&&(t.type===`tool_use`||t.type===`response`))return t.tools_calls&&!t.tool_calls&&(t.tool_calls=t.tools_calls),{...t,format:`json`}}catch{}return null},r=n(t);if(r)return r;let i=t.indexOf(`{`),a=t.lastIndexOf(`}`);if(i>=0&&a>i&&(r=n(t.slice(i,a+1)),r))return r;if(t.includes(`"tool_use"`)){let e=/"name"\s*:\s*"([^"]+)"/.exec(t);if(e){let n={},r=/"input"\s*:\s*(\{.*?\})\s*(?:]|\}|"|$)/s.exec(t);if(r)try{n=JSON.parse(r[1])}catch{}return{type:`tool_use`,format:`json`,tool_calls:[{id:`litert_${Date.now()}`,name:e[1],input:n}]}}}let o=Ft(t);return o?{type:`tool_use`,format:`model_specific`,tool_calls:[{id:`litert_${Date.now()}`,name:o.name,input:o.input}]}:null}function Lt(e,t,n){let r=[],i=e||``;if(n.length>0){let e=[``,`TOOL CALLING INSTRUCTIONS:`,`Return ONLY valid JSON (no markdown fences).`,`To call a tool: {"type":"tool_use","tool_calls":[{"name":"<tool>","input":{...}}]}`,`To reply: {"type":"response","response":"<your answer>"}`,`IMPORTANT: When you need to use a tool, output ONLY the JSON above — do NOT describe the call as text.`,``,`Available tools:`,n.map(e=>{let t=Object.keys(e.input_schema.properties||{}).join(`, `),n=e.description.split(`. `)[0];return`${e.name}(${t}): ${n}`}).join(`
4
4
  `)].join(`
@@ -12,4 +12,4 @@ import{D as e,E as t,F as n,I as r,M as i,O as a,P as o,R as s,T as c,_ as l,g a
12
12
  `);for(let e of t)if(!(!e||e.startsWith(`:`))&&e.startsWith(`data: `)){let t=e.slice(6).trim();if(t===`[DONE]`)continue;try{yield JSON.parse(t)}catch{}}}}}finally{n.releaseLock()}}const Gt=6e4,Kt=new Map;function qt(e){let t=Kt.get(e);if(t)return t;let n={recentCalls:[],nextAllowedAt:0,remoteLimit:null,remoteRemaining:null,remoteResetAt:null};return Kt.set(e,n),n}function Jt(){return Date.now()}function Yt(e){if(!e)return null;let t=Number(e.trim());return Number.isFinite(t)?t:null}function Xt(e){if(!e)return null;let t=e.trim(),n=Number(t);if(Number.isFinite(n))return n<=0?null:Math.round(n*1e3);let r=Date.parse(t);if(!Number.isFinite(r))return null;let i=r-Jt();return i>0?i:null}function Zt(e){let t=Yt(e);return t===null||t<=0?null:t>=0xe8d4a51000?Math.round(t):t>=1e9?Math.round(t*1e3):Jt()+Math.round(t*1e3)}async function Qt(e,t){e<=0||await new Promise((n,r)=>{let i=setTimeout(()=>{o(),n()},e),a=()=>{o(),r(new DOMException(`Aborted`,`AbortError`))},o=()=>{i&&=(clearTimeout(i),null),t?.removeEventListener(`abort`,a)};if(t?.aborted){a();return}t?.addEventListener(`abort`,a)})}function $t(e,t){if(!Number.isFinite(t)||t<=0)return 0;let n=Jt();if(e.recentCalls=e.recentCalls.filter(e=>n-e<Gt),e.recentCalls.length<t)return 0;let r=e.recentCalls[0]||n;return Math.max(0,Gt-(n-r))}function en(e){let t=Jt(),n=0;return e.nextAllowedAt>t&&(n=Math.max(n,e.nextAllowedAt-t)),e.remoteRemaining!==null&&e.remoteRemaining<=0&&e.remoteResetAt!==null&&e.remoteResetAt>t&&(n=Math.max(n,e.remoteResetAt-t)),n}async function tn(e,t,n,r){let i=qt(e);for(;;){let e=$t(i,n.callsPerMinute),a=n.autoAdapt?en(i):0,o=Math.max(e,a);if(o<=0){let e=Jt();if(n.callsPerMinute>0&&i.recentCalls.push(e),n.autoAdapt&&i.remoteRemaining!==null&&i.remoteRemaining>0&&i.remoteResetAt!==null&&i.remoteResetAt>e){let t=i.remoteResetAt-e,n=Math.max(1,i.remoteRemaining),r=Math.ceil(t/n);i.nextAllowedAt=Math.max(i.nextAllowedAt,e+r)}return}o>=1e3&&U({type:`thinking-log`,payload:{groupId:t,level:`info`,label:`Rate limiter`,message:`Waiting ${Math.ceil(o/1e3)}s before next provider call to avoid 429s.`,timestamp:Date.now()}}),await Qt(o,r)}}function nn(e,t,n){if(!n.autoAdapt||!t||typeof t.get!=`function`)return;let r=qt(e),i=Jt(),a=Yt(t.get(`x-ratelimit-limit`)),o=Yt(t.get(`x-ratelimit-remaining`)),s=Zt(t.get(`x-ratelimit-reset`));a!==null&&(r.remoteLimit=Math.max(0,Math.floor(a))),o!==null&&(r.remoteRemaining=Math.max(0,Math.floor(o))),s!==null&&(r.remoteResetAt=s);let c=Xt(t.get(`retry-after`));c!==null&&(r.nextAllowedAt=Math.max(r.nextAllowedAt,i+c)),r.remoteRemaining!==null&&r.remoteRemaining<=0&&r.remoteResetAt!==null&&r.remoteResetAt>i&&(r.nextAllowedAt=Math.max(r.nextAllowedAt,r.remoteResetAt))}var rn=class{callbacks;contentBlocks=[];format;stopReason=`end_turn`;usage={input_tokens:0,output_tokens:0};#e=new Map;#t=``;#n=``;#r=new Map;constructor(e,t={}){this.format=e,this.callbacks=t}finalize(){return this.format===`openai`||this.format===`mesh-llm`?this.#a():this.#i()}push(e){this.format===`openai`||this.format===`mesh-llm`?this.#s(e):this.#o(e)}#i(){let e=[];for(let[,t]of[...this.#e.entries()].sort((e,t)=>e[0]-t[0]))if(t.type===`text`){let n=this.#c(t.text||``);n&&e.push({type:`text`,text:n})}else if(t.type===`tool_use`){let n;try{n=t.partialJson?JSON.parse(t.partialJson):{}}catch{n={}}e.push({type:`tool_use`,id:t.id||`call_${Date.now()}_${Math.random()}`,name:t.name,input:n})}else t.type===`thinking`?typeof t.text==`string`&&t.text.length>0&&e.push({type:`thinking`,thinking:t.text,...typeof t.id==`string`?{signature:t.id}:{}}):t.type===`redacted_thinking`&&typeof t.text==`string`&&t.text.length>0&&e.push({type:`redacted_thinking`,data:t.text});return{content:e,stop_reason:this.stopReason,usage:{...this.usage}}}#a(){let e=[];if(this.#n){let t=this.#c(this.#n);t&&e.push({type:`text`,text:t})}if(this.#t&&e.unshift({type:`thinking`,thinking:this.#t}),this.#r.size>0){this.stopReason=`tool_use`;for(let[,t]of[...this.#r.entries()].sort((e,t)=>e[0]-t[0])){let n;try{n=t.args?JSON.parse(t.args):{}}catch{n={}}e.push({type:`tool_use`,id:t.id||`call_${Date.now()}_${Math.random()}`,name:t.name,input:n})}}return{content:e,stop_reason:this.stopReason,usage:{...this.usage}}}#o(e){switch(e.type){case`message_start`:e.message?.usage&&(this.usage.input_tokens=e.message.usage.input_tokens||0,this.usage.cache_read_input_tokens=e.message.usage.cache_read_input_tokens||0,this.usage.cache_creation_input_tokens=e.message.usage.cache_creation_input_tokens||0);break;case`content_block_start`:{let t=e.index??this.#e.size,n=e.content_block||{};this.#e.set(t,{type:n.type||`text`,id:n.type===`thinking`?n.signature:n.id,name:n.name,text:n.text||n.thinking||n.data||``,partialJson:n.type===`tool_use`?``:void 0}),n.type===`tool_use`&&n.name&&this.callbacks.onToolStart?.(n.name);break}case`content_block_delta`:{let t=e.index??0,n=this.#e.get(t);if(!n){let r=e.delta?.type===`input_json_delta`?`tool_use`:`text`;n={type:r,text:r===`text`?``:void 0,partialJson:r===`tool_use`?``:void 0},this.#e.set(t,n)}let r=e.delta;if(!r)break;if(r.type===`text_delta`&&typeof r.text==`string`){let e=this.#c(r.text);if(!e)break;n.text=(n.text||``)+e,this.callbacks.onText?.(e)}r.type===`thinking_delta`&&typeof r.thinking==`string`&&(n.type=`thinking`,n.text=(n.text||``)+r.thinking,this.callbacks.onThinking?.(r.thinking)),r.type===`signature_delta`&&typeof r.signature==`string`&&(n.type=`thinking`,n.id=r.signature),r.type===`redacted_thinking_delta`&&typeof r.data==`string`&&(n.type=`redacted_thinking`,n.text=(n.text||``)+r.data),r.type===`input_json_delta`&&typeof r.partial_json==`string`&&(n.partialJson=(n.partialJson||``)+r.partial_json);break}case`content_block_stop`:break;case`message_delta`:e.delta?.stop_reason&&(this.stopReason=e.delta.stop_reason),e.usage&&(this.usage.output_tokens=e.usage.output_tokens||0,this.callbacks.onUsage?.(this.usage));break;case`message_stop`:break;default:break}}#s(e){e.usage&&(this.usage.input_tokens=e.usage.prompt_tokens||0,this.usage.output_tokens=e.usage.completion_tokens||0,this.usage.cache_read_input_tokens=e.usage.prompt_tokens_details?.cached_tokens||0,this.callbacks.onUsage?.(this.usage));let t=e.choices?.[0];if(!t)return;let n=t.delta;if(n){if(typeof n.content==`string`){let e=this.#c(n.content);e&&(this.#n+=e,this.callbacks.onText?.(e))}if(typeof n.reasoning==`string`)this.#t+=n.reasoning,this.callbacks.onThinking?.(n.reasoning);else if(n.reasoning&&typeof n.reasoning==`object`){let e=n.reasoning;typeof e.content==`string`?(this.#t+=e.content,this.callbacks.onThinking?.(e.content)):typeof e.text==`string`&&(this.#t+=e.text,this.callbacks.onThinking?.(e.text))}if(Array.isArray(n.tool_calls))for(let e of n.tool_calls){let t=e.index??0;this.#r.has(t)||(this.#r.set(t,{id:e.id||``,name:e.function?.name||``,args:``}),e.function?.name&&this.callbacks.onToolStart?.(e.function.name));let n=this.#r.get(t);n&&(e.id&&(n.id=e.id),e.function?.name&&(n.name=e.function.name),e.function?.arguments&&(n.args+=e.function.arguments))}t.finish_reason&&(t.finish_reason===`tool_calls`?this.stopReason=`tool_use`:t.finish_reason===`stop`?this.stopReason=`end_turn`:this.stopReason=t.finish_reason)}}#c(e){return G(e,this.callbacks.source??this.format)}};const an=new Map;function on(e){return an.get(e)}function sn(e){an.delete(e)}function cn(e,t){let n=e.trim().match(/^\[tool_code\]([\s\S]*?)\[\/tool_code\]$/i);if(!n?.[1])return{toolBlocks:[],residualText:e};let r=n[1].trim(),i=r.match(/^print\s*\(\s*([a-zA-Z_][a-zA-Z0-9_]*)\s*\(\s*(.*?)\s*\)\s*\)$/s),a=r.match(/^([a-zA-Z_][a-zA-Z0-9_]*)\s*\(\s*(.*?)\s*\)$/s),o=i||a;if(!o?.[1])return{toolBlocks:[],residualText:e};let s=o[1];if(!t.has(s))return{toolBlocks:[],residualText:e};let c=(o[2]||``).trim(),l={};if(c){if(!c.startsWith(`{`)||!c.endsWith(`}`))return{toolBlocks:[],residualText:e};try{let t=JSON.parse(c);if(!t||typeof t!=`object`||Array.isArray(t))return{toolBlocks:[],residualText:e};l=t}catch{return{toolBlocks:[],residualText:e}}}return{toolBlocks:[{type:`tool_use`,id:`tool_code_${Date.now()}_${Math.random()}`,name:s,input:l}],residualText:``}}function ln(e,t){if(!e||e.stop_reason===`tool_use`||!Array.isArray(e.content))return e;let n=new Set((t||[]).map(e=>typeof e?.name==`string`?e.name:``).filter(Boolean));if(n.size===0)return e;let r=[],i=!1;for(let t of e.content){if(t?.type!==`text`||typeof t.text!=`string`){r.push(t);continue}let e=cn(t.text,n);if(e.toolBlocks.length>0){i=!0,e.residualText.trim()&&r.push({type:`text`,text:e.residualText}),r.push(...e.toolBlocks);continue}r.push(t)}return i?{...e,content:r,stop_reason:`tool_use`}:e}function un(e){let t=e.filter(e=>e?.type===`tool_result`).map(e=>typeof e.content==`string`?e.content.trim():Array.isArray(e.content)?e.content.filter(e=>e.type===`text`).map(e=>e.text).join(`
13
13
  `).trim():JSON.stringify(e.content).trim()).filter(Boolean);return t.length===0?``:t.join(`
14
14
 
15
- `).slice(0,1e4)}function dn(e){let t=e.trim();return t?`Tool result:\n${t}`:``}async function fn(e,t,r){let{apiKey:i,assistantName:a,contextCompression:o=!1,contextLimit:s,enabledTools:c,groupId:l,isScheduledTask:u=!1,maxIterations:d,maxTokens:f,memory:p,messages:m,model:h,provider:g,providerHeaders:_={},providerRuntimeOverrides:v,reasoning:y,rateLimitAutoAdapt:b=!0,rateLimitCallsPerMinute:x=0,storageHandle:S,streaming:C=!1,subagentModelSelectionMode:w,subagentMaxTokens:E,subagentPinnedModel:D,subagentPinnedProvider:ee,systemPrompt:k,workspaceGroupId:A}=t,j=!!t.subagentTask,M=j?l.startsWith(`subagent:`)?l:`subagent:${J()}`:l,ne=A||l;j&&Ee(M,[]);let N={autoAdapt:b!==!1,callsPerMinute:Number.isFinite(x)?Math.max(0,Math.floor(x)):0};S&&He(S);let P=n(g);if(!P){U({payload:{groupId:M,error:`Unknown provider: ${g}`},type:`error`});return}let F=P,I=C&&F.supportsStreaming===!0&&F.format!==`prompt_api`;U({type:`typing`,payload:{groupId:M}}),Z(M,`info`,`Starting`,`Provider: ${F.name} · Model: ${h} · Max tokens: ${f} · Streaming: ${I?`on`:`off`}${C&&!I?` (provider does not support streaming)`:``}`);try{let t=[...m],n=0,l=typeof d==`number`&&d>0?d:50,b=Array.isArray(c)?c:Je;Ve()&&(b=Be(b));let x=k,C=``,A={apiKey:i,assistantName:a??``,db:e,enabledTools:b,invokeSubagent:t=>hn(e,t,r),maxTokens:f,memory:p??``,model:h,provider:g,subagentModelSelectionMode:w,subagentMaxTokens:E,subagentPinnedProvider:ee,subagentPinnedModel:D,providerHeaders:_,providerRuntimeOverrides:v,storageHandle:S,streaming:!1,systemPrompt:x??``},j=[];for(;n<l;){n++;let c=on(M);c&&(b=c.enabledTools,x=te(a,p,b,c.systemPromptOverride,void 0,void 0,{groupId:M}));let l=s??O(h),d=ye(x),{messages:m,estimatedTokens:v}=ze(t,{contextLimit:l,maxOutputTokens:f,skimTop:o,systemPromptTokens:d}),S=v+d,w=Math.max(100,Math.min(f,l-S-500)),E=oe(F,m,b,{contextCompression:o,maxTokens:w,model:h,reasoning:y,system:x});Z(M,`api-call`,`API call #${n}`,`${m.length} messages in context`);let D={...R(F,i),..._},ee=F.baseUrl,k;Ve(),Ve(),k=I?await mn(g,F,ee,D,E,M,h,N,r):await pn(g,F,ee,D,E,M,N,r),k=ln(k,b),k.usage&&U(Ut(M,k.usage,O(h)));for(let e of k.content)e.type===`text`&&e.text&&Z(M,`text`,`Response text`,e.text.length>200?e.text.slice(0,200)+`…`:e.text);if(k.stop_reason===`tool_use`){let n=new Set(b.map(e=>typeof e?.name==`string`?e.name:``).filter(Boolean)),r=k.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).replace(/<internal>[\s\S]*?<\/internal>/g,``).trim();r&&U({payload:{groupId:M,text:r},type:`intermediate-response`}),I&&U({payload:{groupId:M},type:`streaming-end`});let i=[];for(let t of k.content)if(t.type===`tool_use`){let r=n.has(t.name),a=`${t.name}:${JSON.stringify(t.input)}`,o=j.filter(e=>e===a).length;if(j.push(a),!r){let e=`SYSTEM ERROR: Tool '${t.name}' is disabled or unavailable for this request. Do not call it again. Try a different approach or ask the user for help.`;Z(M,`warning`,`Tool blocked`,e),i.push({content:e,tool_use_id:t.id,type:`tool_result`});continue}let s=JSON.stringify(t.input),c=s.length>300?s.slice(0,300)+`…`:s;Z(M,`tool-call`,`Tool: ${t.name}`,c),U(H(M,t.name,`running`));let l;o>=3?(l=`SYSTEM ERROR: You have repeatedly called this tool with the exact same input (${o+1} times). This is a rigid loop. STOP calling this tool with these arguments. Try a different approach, fix the underlying issue, or ask the user for help.`,console.warn(`[Worker] Blocked repetitive tool call:`,a)):l=await T(e,t.name,t.input,ne,{allowedTools:b,isScheduledTask:u,invokeContext:A});let d=typeof l==`string`?l:JSON.stringify(l),f=d.length>500?d.slice(0,500)+`…`:d;Z(M,`tool-result`,`Result: ${t.name}`,f),U(H(M,t.name,`done`)),Array.isArray(l)?i.push({content:l,tool_use_id:t.id,type:`tool_result`}):i.push({content:typeof l==`string`?l.slice(0,1e5):JSON.stringify(l).slice(0,1e5),tool_use_id:t.id,type:`tool_result`})}C=un(i),t.push({role:`assistant`,content:k.content}),t.push({role:`user`,content:i}),U({type:`typing`,payload:{groupId:M}})}else{let e=k.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).replace(/<internal>[\s\S]*?<\/internal>/g,``).trim(),t=(e.toLowerCase()===`(no response)`?``:e)||(C?dn(C):`(no response)`);I&&U({payload:{groupId:M,text:t},type:`streaming-done`}),U({payload:{groupId:M,text:t},type:`response`});return}}U({payload:{text:`⚠️ Reached maximum tool-use iterations (${l}). Stopping to avoid excessive API usage.`,groupId:M},type:`response`})}catch(e){if(e instanceof Error&&e.name===`AbortError`)return;let t=e instanceof Error?e.message:String(e);I&&U({payload:{groupId:M,error:t},type:`streaming-error`}),U({type:`error`,payload:{groupId:M,error:t}})}finally{sn(M),j&&Me(M)}}async function pn(e,t,n,r,i,a,o,s){return L(async()=>{await tn(e,a,o,s);let c=await fetch(n,{body:JSON.stringify(i),headers:r,method:`POST`,signal:s});if(nn(e,c.headers,o),!c.ok){let e=await c.text(),n=Error(`${t.name} API error ${c.status}: ${e}`);throw n.status=c.status,n}return I(t,await c.json())},{baseDelayMs:2e3,jitterFactor:.5,maxDelayMs:3e4,maxRetries:3,onRetry:(e,t,n,r)=>{let i=r instanceof Error?r.message:String(r);Z(a,`warning`,`Retrying API call (${e}/${t})`,i),U({type:`show-toast`,payload:{message:`LLM API: Retrying (${e}/${t})… ${i.slice(0,120)}`,type:`warning`,duration:5e3}})},shouldRetry:e=>Oe(e),signal:s})}async function mn(e,t,n,r,i,a,o,s,c){let l={...i,stream:!0,...(t.format===`openai`||t.format===`mesh-llm`)&&{stream_options:{include_usage:!0}}};await tn(e,a,s,c);let u=await fetch(n,{body:JSON.stringify(l),headers:r,method:`POST`,signal:c});if(nn(e,u.headers,s),!u.ok){let e=await u.text(),n=Error(`${t.name} API error ${u.status}: ${e}`);throw n.status=u.status,n}if(!u.body)throw Error(`Streaming response has no body`);U({payload:{groupId:a},type:`streaming-start`});let d=0,f=``,p=0,m=``,h=(e=!1)=>{let t=Date.now();m&&(!e&&t-p<50||(Z(a,`info`,`Reasoning`,m.length>400?`${m.slice(0,400)}…`:m),m=``,p=t))},g=new rn(t.format,{source:t.id,onText:e=>{let t=Date.now();f+=e,t-d>=50&&(U({payload:{groupId:a,text:f},type:`streaming-chunk`}),f=``,d=t)},onToolStart:e=>{U(H(a,e,`running`))},onUsage:e=>{U(Ut(a,e,O(o)))},onThinking:e=>{m+=e,h(!1)}});for await(let e of Wt(u.body,c))g.push(e);f&&U({payload:{groupId:a,text:f},type:`streaming-chunk`}),h(!0);let _=g.finalize();return t.format===`mesh-llm`&&(_=N(_)),_}async function hn(e,t,n){let r=t.provider,i=async e=>{U(e)};if(r===`transformers_js_browser`){await Ht(e,t.groupId,t.systemPrompt,t.messages,t.maxTokens,i,n,t.enabledTools,t.model);return}if(r===`prompt_api`){if(!z())throw Error(`Prompt API provider is not supported in this environment.`);await ee(e,t.groupId,t.systemPrompt,t.messages,t.maxTokens,i,n,t.enabledTools);return}if(r===`litert_lm_browser`){if(!Ot())throw Error(`Litert LM Browser provider is not supported in this environment.`);await Rt(e,t.groupId,t.systemPrompt,t.messages,t.maxTokens,i,n,t.model,t.enabledTools);return}await fn(e,t,n)}async function gn(e,t,r,i,a=!1,s=!1){let c=s?`subagent:${J()}`:r;if(e.inFlightTriggerByGroup.set(c,i),e.setState(`thinking`,c),e.router?.setTyping(c,!0),e.events.emit(`typing`,{groupId:c,typing:!0}),i.startsWith(`[SCHEDULED TASK]`)){e.pendingScheduledTasks.add(r);let n={id:J(),groupId:r,sender:`Scheduler`,content:i,timestamp:Date.now(),channel:Te(e,r),isFromMe:!1,isTrigger:!0};await ce(t,n),e.events.emit(`message`,n)}let l=``;try{l=await Ge(t,r,`MEMORY.md`)}catch{}let u=(await xe(t)).find(e=>e.groupId===r),d=u?.pinnedProvider??e.provider,f=u?.pinnedModel??(u?.pinnedProvider?n(u.pinnedProvider)?.defaultModel??e.model:e.model),p=typeof u?.pinnedMaxTokens==`number`&&Number.isFinite(u.pinnedMaxTokens)&&u.pinnedMaxTokens>0?Math.floor(u.pinnedMaxTokens):e.maxTokens,h=f;d===`prompt_api`&&(f===`browser-built-in`||!f)&&!z()&&(h=await S(t,m.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`);let g=Math.max(1,Math.min(p,o(h))),_=n(d)??e.providerConfig;e.inFlightEffectiveProviderByGroup.set(c,{providerId:d,providerConfig:_,model:f});let v=Array.isArray(u?.toolTags)?K.allTools.filter(e=>u.toolTags.includes(e.name)):K.enabledTools,y=(await qe(t,c)).tools.filter(e=>!K.allTools.some(t=>t.name===e.name)),b=Array.isArray(u?.toolTags)?y.filter(e=>u.toolTags.includes(e.name)):y.filter(e=>K.isDeclarativeToolEnabled(e.name)),x=[...v,...b],C=await se(t,c),w=C.skills.length>0&&!x.some(e=>e.name===Ye.name)?[...x,Ye]:x,T=u?.subagentModelSelectionMode===`manual`?`manual`:`automatic`,E=u?.subagentMaxTokens,D=u?.subagentPinnedProvider,A=u?.subagentPinnedModel,j=u?.subagentFastProvider,ne=u?.subagentFastModel,N=u?.subagentSmartProvider,P=u?.subagentSmartModel,F=u?.subagentPowerfulProvider,I=u?.subagentPowerfulModel,L=u?.providerRuntimeOverrides,ie=W.getPeerState(r)||void 0,R=te(e.assistantName,l,w,K.systemPromptOverride,ie,C.skills,{groupId:r}),ae=O(h),oe=ye(R)+w.reduce((e,t)=>e+ye(JSON.stringify(t)),0),B=await Ce(r,200);a&&(B=B.length>0?[B[B.length-1]]:[{role:`user`,content:i}]);let V=ze(B,{contextLimit:ae,systemPromptTokens:oe,maxOutputTokens:g,skimTop:e.contextCompressionEnabled}),le=V.messages,ue=V.estimatedTokens+oe;if(W.tokenUsage){let e=W.tokenUsage,t=(e.inputTokens||0)+(e.cacheReadTokens||0)+(e.outputTokens||0);ue=Math.max(ue,t)}if(e.events.emit(`context-usage`,{estimatedTokens:ue,contextLimit:ae,usagePercent:Math.min(100,Math.max(V.usagePercent,ue/ae*100)),truncatedCount:V.truncatedCount}),V.usagePercent>80&&V.truncatedCount>0&&B.length>10&&(e.events.emit(`show-toast`,{message:`Context ${V.usagePercent.toFixed(0)}% full — auto-compacting older messages…`,type:`info`,duration:4e3}),queueMicrotask(()=>De(e,t,r))),d===`transformers_js_browser`){let n=new AbortController;e.promptControllers.set(c,n);let r={apiKey:``,assistantName:e.assistantName,db:t,enabledTools:w,invokeSubagent:async e=>{await hn(t,e,n.signal)},maxTokens:g,memory:l,model:f,provider:d,providerHeaders:he(e,d,``,L),providerRuntimeOverrides:L,streaming:!1,subagentModelSelectionMode:T,subagentMaxTokens:E,subagentPinnedProvider:D,subagentPinnedModel:A,subagentFastProvider:j,subagentFastModel:ne,subagentSmartProvider:N,subagentSmartModel:P,subagentPowerfulProvider:F,subagentPowerfulModel:I,systemPrompt:R};try{await Ht(t,c,R,le,g,async n=>{await re(e,t,n)},n.signal,w,f,r)}catch(n){if(n instanceof Error&&n.name===`AbortError`)return;await Le(e,t,c,`⚠️ Error: ${n instanceof Error?n.message:String(n)}`)}finally{e.promptControllers.delete(c)}return}if(d===`prompt_api`){if(z()||await M(),!z()){await Le(e,t,c,`⚠️ Error: Prompt API is not available in this browser. Switch provider or enable experimental browser flags.`);return}let n=new AbortController;e.promptControllers.set(c,n);let r={apiKey:``,assistantName:e.assistantName,db:t,enabledTools:w,invokeSubagent:async e=>{await hn(t,e,n.signal)},maxTokens:g,memory:l,model:f,provider:d,providerHeaders:he(e,d,``,L),providerRuntimeOverrides:L,streaming:!1,subagentModelSelectionMode:T,subagentMaxTokens:E,subagentPinnedProvider:D,subagentPinnedModel:A,subagentFastProvider:j,subagentFastModel:ne,subagentSmartProvider:N,subagentSmartModel:P,subagentPowerfulProvider:F,subagentPowerfulModel:I,systemPrompt:R};try{await ee(t,c,R,le,g,async n=>{await re(e,t,n)},n.signal,w,r)}catch(n){if(n instanceof Error&&n.name===`AbortError`)return;await Le(e,t,c,`⚠️ Error: ${n instanceof Error?n.message:String(n)}`)}finally{e.promptControllers.delete(c)}return}if(d===`litert_lm_browser`){if(!Ot()){await Le(e,t,c,`⚠️ LiteRT-LM requires WebGPU and WebAssembly.Suspending. These are not both available in this browser.`);return}let n=new AbortController;e.promptControllers.set(c,n);let r={apiKey:``,assistantName:e.assistantName,db:t,enabledTools:w,invokeSubagent:async e=>{await hn(t,e,n.signal)},maxTokens:g,memory:l,model:f,provider:d,providerHeaders:he(e,d,``,L),providerRuntimeOverrides:L,streaming:!1,subagentModelSelectionMode:T,subagentMaxTokens:E,subagentPinnedProvider:D,subagentPinnedModel:A,subagentFastProvider:j,subagentFastModel:ne,subagentSmartProvider:N,subagentSmartModel:P,subagentPowerfulProvider:F,subagentPowerfulModel:I,systemPrompt:R};try{await Rt(t,c,R,le,g,async n=>{await re(e,t,n)},n.signal,f,w,r)}catch(n){if(n instanceof Error&&n.name===`AbortError`)return;await Le(e,t,c,`⚠️ Error: ${n instanceof Error?n.message:String(n)}`)}finally{e.promptControllers.delete(c)}return}let de=e.streamingEnabled&&_.supportsStreaming===!0&&(_.format===`openai`||_.format===`anthropic`);d===`transformers_js_local`&&ve(e,e.events,c);let fe=e.createProviderRequestId(c);e.agentWorker?.postMessage({type:`invoke`,payload:{apiKey:d===e.provider?await k(e):await e.getApiKeyForSpecificProvider(t,d),assistantName:e.assistantName,contextCompression:e.contextCompressionEnabled,contextLimit:O(h),enabledTools:w,groupId:c,isScheduledTask:e.schedulerTriggeredGroups.has(r),maxIterations:e.maxIterations,maxTokens:g,memory:l,messages:le,model:f,provider:d,providerHeaders:he(e,d,fe,L),providerRuntimeOverrides:L,reasoning:me(e),rateLimitAutoAdapt:e.rateLimitAutoAdapt,rateLimitCallsPerMinute:e.rateLimitCallsPerMinute,storageHandle:await S(t,m.STORAGE_HANDLE),streaming:de,subagentModelSelectionMode:T,subagentMaxTokens:E,subagentPinnedProvider:D,subagentPinnedModel:A,subagentFastProvider:j,subagentFastModel:ne,subagentSmartProvider:N,subagentSmartModel:P,subagentPowerfulProvider:F,subagentPowerfulModel:I,systemPrompt:R,subagentTask:s}})}function _n(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 vn(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 yn(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=_n(e.directToolCommandPolicy,e.assistantName,n),o=a?null:vn(n.content,(await se(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 $e(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 ce(t,p),e.events.emit(`message`,p),o?.skill.execution&&e.agentWorker){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}});return}if(n.channel===`peerjs`&&we(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&&e.agentWorker){e.agentWorker.postMessage({type:`execute-direct-tool`,payload:{groupId:n.groupId,name:a.toolName,input:a.input}});return}bn(e,t)}async function bn(e,t){if(e.processing||e.messageQueue.length===0)return;let r=e.messageQueue[0]?.groupId,i=e.providerConfig,a=e.provider;if(r)try{let e=(await xe(t)).find(e=>e.groupId===r);if(e?.pinnedProvider){let t=n(e.pinnedProvider);t&&(i=t,a=e.pinnedProvider)}}catch{}let o=i?.requiresApiKey!==!1,s=!0;if(o&&(s=a===e.provider?!!await k(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:B(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{await gn(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&&bn(e,t)}}var xn=class{listeners;constructor(){this.listeners=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,new Set),this.listeners.get(e)?.add(t)}};function Q(e,t){return{jsonrpc:`2.0`,method:e,params:t}}var Sn=class{static isRoomMethod(e){return e===Y.JOIN||e===Y.ROSTER||e===Y.LEAVE||e===Y.MESSAGE||e===Y.INVITE||e===Y.RELAY||e===Y.A2UI||e===Y.A2UI_ACTION}roomsSignal=new w.State([]);_opts;_rooms=new Map;_seen=new Map;_surfaceOwners=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=J(),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,Q(Y.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=J(),a={roomId:e,broadcastId:i,ownerPeerId:r,senderPeerId:r,envelope:t};return this._markSeen(e,i),this._deliverToMembers(n,Q(Y.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=J(),o={roomId:e,broadcastId:a,ownerPeerId:i,senderPeerId:r.peerId,senderAlias:r.alias,action:t};return this._markSeen(e,a),this._deliverToMembers(n,Q(Y.A2UI_ACTION,o)),a}createRoom(e){let t=this._opts.getLocalMember(),n={roomId:J(),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 Y.JOIN:this._onJoin(e,n);break;case Y.ROSTER:this._onRoster(n);break;case Y.LEAVE:this._onLeave(e,n);break;case Y.MESSAGE:this._onMessage(n);break;case Y.INVITE:this._opts.onInvite?.(n);break;case Y.RELAY:this._onRelay(n);break;case Y.A2UI:this._onA2UI(n);break;case Y.A2UI_ACTION:this._onA2UIAction(n);break}}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,Q(Y.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,Q(Y.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,Q(Y.LEAVE,r))}else{let r={roomId:e,peerId:n};this._opts.transport.sendToPeer(t.hostPeerId,Q(Y.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,Q(Y.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,Q(Y.RELAY,i)),r.connectToPeer(t);return}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=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:Fe(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:Fe(e.roomId),sender:e.senderAlias||e.senderPeerId,content:wt(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);if(n){if(t.disbanded){this._rooms.delete(t.roomId),this._seen.delete(t.roomId),this._opts.removeRoom?.(t.roomId),this._publish();return}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:Fe(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 Cn(e){return e&&b(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 x();if(!r)return n(Error(`failed to get transaction, cannot get enabled tasks.`));let i=r.transaction(`tasks`,`readonly`);if(!i)return n(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 wn(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 Tn(r,t.getMinutes())&&Tn(i,t.getHours())&&Tn(a,t.getDate())&&Tn(o,t.getMonth()+1)&&Tn(s,t.getDay())}function Tn(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 En=class{interval=null;onTaskChange;runner;constructor(e,t){this.runner=e,this.onTaskChange=t}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 Cn(),t=new Date;for(let n of e){let e=n.schedule||``;e!==``&&wn(e,t)&&!this.ranThisMinute(n,t)&&(await Ae(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)}}};function Dn(e){if(!e)return[];try{let t=JSON.parse(e);if(Array.isArray(t))return D(t.map(e=>String(e)))}catch{}return D(e.split(`,`))}async function On(e,t){e.channelEnabledByType.telegram=await be(`telegram`,t),e.channelEnabledByType.imessage=await be(`imessage`,t);let n=await e.loadSecretConfig(t,m.TELEGRAM_BOT_TOKEN),r=Dn(await S(t,m.TELEGRAM_CHAT_IDS)),i=await S(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 Pe(t,e,n),i=new Uint8Array(r.byteLength);i.set(r);let a=Re(n.split(`/`).pop()||n);return new Blob([i],{type:a})}catch(e){return console.warn(`Orchestrator: channel fileReader failed for ${n}:`,e),null}};e.telegram.fileReader=a,e.imessage.fileReader=a;let o=(await S(t,m.IMESSAGE_SERVER_URL)||``).trim().replace(/\/+$/,``),s=await e.loadSecretConfig(t,m.IMESSAGE_API_KEY),c=Dn(await S(t,m.IMESSAGE_CHAT_IDS));e.imessageServerUrl=o,e.imessageApiKey=s,e.imessageChatIds=c,e.imessage.configure(o,s,c),e.channelEnabledByType.peerjs=await be(`peerjs`,t);let l=(await S(t,m.PEERJS_MY_PEER_ID)||``).trim(),u=Dn(await S(t,m.PEERJS_TRUSTED_PEER_IDS)),d=(await S(t,m.PEERJS_SERVER_HOST)||``).trim(),f=await S(t,m.PEERJS_SERVER_PORT),p=f&&parseInt(f,10)||0,h=(await S(t,m.PEERJS_SERVER_PATH)||``).trim(),g=await S(t,m.PEERJS_SERVER_SECURE)!==`false`,_={},v=await S(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 S(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 kn(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 An(e,t){typeof navigator>`u`||!navigator.serviceWorker||navigator.serviceWorker.addEventListener(`message`,t=>{if(t.data?.type===`request-proxy-config`){E(e);return}if(t.data?.type!==`scheduled-task-trigger`)return;let{taskId:n,groupId:r,prompt:i,taskType:a,tools:o}=t.data;r&&(e.schedulerTriggeredGroups.add(r),(async()=>{let t=W.tasks.find(e=>e.id===n);if(t){W.runTask(t);return}if(a===`tools`&&Array.isArray(o)&&o.length>0){W.runTask({id:n||`push-task-${Date.now()}`,groupId:r,createdAt:Date.now(),enabled:!0,prompt:i||``,type:`tools`,tools:o,lastRun:null});return}i&&V(e,i,r)})().catch(e=>console.error(`Push-triggered task ${n} failed:`,e)).finally(()=>{e.schedulerTriggeredGroups.delete(r)}))})}function jn(e){return new Sn({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=>ne(e,t),persistRoom:t=>{e.db&&ge(e.db,t).catch(e=>console.error(`Failed to persist room:`,e))},removeRoom:t=>{e.db&&A(e.db,t).catch(e=>console.error(`Failed to delete room:`,e))}})}async function Mn(e,t){e.initializeChannelRegistry(),e.channelRegistry.onMessage(n=>{yn(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:`)&&W.setRemoteAgentTyping(t,n)}),e.peerjs.onTaskComplete(t=>{e.peerCompletedContexts.add(t)}),await On(e,t),Se(e);try{let n=await F(t);e.roomManager.loadRooms(n)}catch(e){console.error(`Failed to load rooms:`,e)}}async function Nn(e,t){e.assistantName=await S(t,m.ASSISTANT_NAME)||`ShadowClaw`,e.triggerPattern=a(e.assistantName)}async function Pn(e,t){let n=await S(t,m.VM_BOOT_MODE);e.vmBootMode=n===`disabled`||n===`auto`||n===`9p`||n===`ext2`?n:`disabled`,e.streamingEnabled=await S(t,m.STREAMING_ENABLED)!==`false`,e.webMcpToolsEnabled=await S(t,m.WEBMCP_TOOLS_ENABLED)!==`false`,e.vmBashFullInternetAccess=await S(t,m.VM_BASH_FULL_INTERNET_ACCESS)===`true`;let r=await S(t,m.WEBMCP_MODE);(r===`native`||r===`polyfill`)&&nt(r),e.contextCompressionEnabled=await S(t,m.CONTEXT_COMPRESSION_ENABLED)===`true`;let i=await S(t,m.REASONING_EFFORT);e.reasoningEffort=i?i.trim().toLowerCase():`none`,e.directToolCommandPolicy=kn(await S(t,m.DIRECT_TOOL_COMMAND_POLICY)),e.useProxy=await S(t,m.USE_PROXY)===`true`,e.proxyUrl=await S(t,m.PROXY_URL)||`/proxy`,e.gitProxyUrl=await S(t,m.GIT_PROXY_URL)||`/git-proxy`,e.taskServerEnabled=await S(t,m.TASK_SERVER_ENABLED)===`true`,e.taskServerUrl=await S(t,m.TASK_SERVER_URL)||(await import(`./config-D4lVqMs8.js`).then(e=>e.k)).DEFAULT_TASK_SERVER_URL}async function Fn(e,t){let n=await S(t,m.LLAMAFILE_MODE);n===`cli`||n===`server`?e.llamafileMode=n:await q(t,m.LLAMAFILE_MODE,e.llamafileMode);let r=await S(t,m.LLAMAFILE_HOST);r&&(e.llamafileHost=r);let i=await S(t,m.LLAMAFILE_PORT);if(i){let t=parseInt(i,10);Number.isFinite(t)&&t>=1&&t<=65535&&(e.llamafilePort=t)}await S(t,m.LLAMAFILE_OFFLINE)===`false`&&(e.llamafileOffline=!1),de(e);let a=await S(t,m.MESH_LLM_HOST);a&&(e.meshLlmHost=a),j(e)}async function In(e,t){let[r,i,a,c,l,u,d,f,p]=await Promise.all([S(t,m.PROVIDER),S(t,m.BEDROCK_REGION_FALLBACK),S(t,m.BEDROCK_PROFILE_FALLBACK),S(t,m.BEDROCK_AUTH_MODE),S(t,m.MODEL),S(t,m.MAX_TOKENS),S(t,m.MAX_ITERATIONS),S(t,m.RATE_LIMIT_CALLS_PER_MINUTE),S(t,m.RATE_LIMIT_AUTO_ADAPT)]),h=r?n(r):void 0;r&&h&&(e.provider=r,e.providerConfig=h),await e.loadApiKeyForProvider(t,e.provider),e.bedrockRegionFallback=(i||``).trim(),e.bedrockProfileFallback=(a||``).trim(),e.bedrockAuthMode=(c||`provider_chain`).trim();let g=()=>{let t=()=>{fe(e).then(t=>s.fetchModelInfo(e.providerConfig,t||void 0,he(e,e.provider)))};typeof globalThis.requestIdleCallback==`function`?globalThis.requestIdleCallback(t,{timeout:5e3}):setTimeout(t,2e3)};typeof window<`u`&&typeof document<`u`?document.readyState===`complete`?g():window.addEventListener(`load`,g,{once:!0}):g(),l?e.model=l:e.model=e.providerConfig.defaultModel;let _=e.model;e.provider===`prompt_api`&&!z()&&(e.model===`browser-built-in`||!e.model)&&(_=await S(t,m.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`,ke(_).catch(()=>{}));let v=o(_);if(u===`8192`||e.provider===`prompt_api`&&!z()&&u===`4096`?e.maxTokens=v:e.maxTokens=Math.max(1,parseInt(u||String(v),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 Ln(e,t){e.agentWorker=new Worker(C(new URL(`./agent.worker.js`,import.meta.url).href),{type:`module`}),e.agentWorker.onmessage=n=>re(e,t,n.data),e.agentWorker.onerror=e=>{console.error(`Agent worker error:`,e)};let n=await S(t,m.STORAGE_HANDLE);n&&e.agentWorker.postMessage({payload:{storageHandle:n},type:`set-storage`}),E(e),e.scheduler=new En(async t=>{await ie(e,t)},()=>{e.events.emit(`task-change`,{type:`executed`})}),ae().then(t=>{t&&e.scheduler?.start()}),An(e,t)}var Rn=class{agentWorker=null;assistantName=g;bedrockAuthMode=`provider_chain`;bedrockProfileFallback=``;bedrockRegionFallback=``;browserChat=new ct;channelEnabledByType={browser:!0,peerjs:!1,telegram:!1,imessage:!1};channelRegistry=new lt;contextCompressionEnabled=!1;db=null;directToolCommandPolicy={...$};ensureControlPlaneConnected=rt;events=new xn;gitProxyUrl=`/git-proxy`;imessage=new ut;imessageApiKey=``;imessageChatIds=[];imessageServerUrl=``;inFlightEffectiveProviderByGroup=new Map;inFlightProviderRequestIds=new Map;inFlightTriggerByGroup=new Map;llamafileHost=`127.0.0.1`;llamafileMode=`cli`;llamafileOffline=!0;llamafilePort=8080;maxIterations=50;maxTokens=h;meshLlmHost=``;messageQueue=[];model=i().defaultModel;peerCompletedContexts=new Set;peerjs=new et;peerjsMyAlias=``;peerjsMyPeerId=``;peerjsPeerAliases={};peerjsServerHost=``;peerjsServerPath=``;peerjsServerPort=0;peerjsServerSecure=!0;peerjsTrustedPeerIds=[];pendingScheduledTasks=new Set;processing=!1;promptControllers=new Map;provider=f;providerConfig=i();proxyUrl=`/proxy`;pushSubscriptionWarned=!1;rateLimitAutoAdapt=!0;rateLimitCallsPerMinute=0;reasoningEffort=`none`;roomChannel=new gt;roomManager;router=null;scheduler=null;schedulerTriggeredGroups=new Set;state=`idle`;streamingEnabled=!0;taskServerEnabled=!1;taskServerUrl=`/schedule`;telegram=new vt;telegramBotToken=``;telegramChatIds=[];telegramUseProxy=!1;transformersProgressPollers=new Map;triggerPattern=a(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=jn(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}initializeChannelRegistry(){this.channelRegistry=new lt,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 Tt(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())Ne(this,e);this.agentWorker?.terminate(),typeof this.webMcpEffectCleanup==`function`&&this.webMcpEffectCleanup(),tt()}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&&(W.replayTaskSyncOutbox(this.db),W.loadTasks(this.db)),this.scheduler&&(this.scheduler.start(),this.scheduler.tick())}stopCurrentRequest(e=p){if(this.state!==`thinking`&&this.state!==`responding`)return;Ne(this,e);let t=this.inFlightProviderRequestIds.get(e)||``;this.clearProviderRequest(e),this.agentWorker?.postMessage({type:`cancel`,payload:{groupId:e}}),this.provider===`llamafile`&&t&&le(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 Ze(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 S(e,r(t));if(!n&&t===`openrouter`){let t=await S(e,m.API_KEY);t&&(n=t)}if(!n)return``;try{return await Ze(n)||``}catch(e){return console.error(`[Orchestrator] Failed to decrypt API key:`,e),``}}async handleCompactDone(e,t,n){await Ie(e,t),await ce(e,{channel:this.channelRegistry.getChannelType(t)??`browser`,content:`📝 **Context Compacted**\n\n${n}`,groupId:t,id:J(),isFromMe:!0,isTrigger:!1,sender:this.assistantName,timestamp:Date.now()}),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 st();return this.db=e,await Promise.all([Nn(this,e),In(this,e),Fn(this,e),Pn(this,e)]),await Ln(this,e),Mn(this,e).then(()=>{this.browserChat.onDisplay(()=>{})}),this.events.emit(`ready`,void 0),await K.load(e),Xe(this,e),e}async loadApiKeyForProvider(e,t){let n=await S(e,r(t));if(!n&&t===`openrouter`){let i=await S(e,m.API_KEY);i&&(n=i,await q(e,r(t),i))}n?this.#t=n:this.#t=``,this.#e=null}async loadSecretConfig(e,t){let n=await S(e,t);if(!n)return``;try{return await Ze(n)||``}catch{let r=await Qe(n);return r&&await q(e,t,r),n}}async newSession(e,t=p){await Ie(e,t),this.events.emit(`session-reset`,{groupId:t})}async refreshContextUsage(e,t=p){let r=``;try{r=await Ge(e,t,`MEMORY.md`)}catch{}let i=K.enabledTools,a=W.getPeerState(t)||void 0,s=te(this.assistantName,r,i,K.systemPromptOverride,a,void 0,{groupId:t}),c=(await xe(e)).find(e=>e.groupId===t),l=c?.pinnedModel??(c?.pinnedProvider?n(c.pinnedProvider)?.defaultModel??this.model:this.model),u=l;(c?.pinnedProvider??this.provider)===`prompt_api`&&(l===`browser-built-in`||!l)&&!z()&&(u=await S(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,o(u))),h=O(u),g=ye(s)+(i?.reduce((e,t)=>e+ye(JSON.stringify(t)),0)??0),_=ze(await Ce(t,200),{contextLimit:h,systemPromptTokens:g,maxOutputTokens:f,skimTop:this.contextCompressionEnabled}),v=_.estimatedTokens+g;if(W.tokenUsage){let e=W.tokenUsage,t=(e.inputTokens||0)+(e.cacheReadTokens||0)+(e.outputTokens||0);v=Math.max(v,t)}this.events.emit(`context-usage`,{estimatedTokens:v,contextLimit:h,usagePercent:Math.min(100,Math.max(_.usagePercent,v/h*100)),truncatedCount:_.truncatedCount})}async restartCurrentRequest(e=p){if(this.state!==`thinking`&&this.state!==`responding`||!this.db)return!1;let t=this.inFlightTriggerByGroup.get(e);return t?(this.stopCurrentRequest(e),await gn(this,this.db,e,t),!0):!1}async routeRoomA2UIAction(e,t){let n=P(e),r=this.peerjs.myPeerId||this.peerjsMyPeerId,i=this.roomManager.getSurfaceOwner(t.surfaceId);if(!i||i===r){if(!this.db)return;await yn(this,this.db,{id:J(),groupId:e,sender:this.peerjsMyAlias||r||`you`,content:wt(t),timestamp:Date.now(),channel:`room`,a2uiAction:t});return}this.roomManager.broadcastA2UIAction(n,t)}async saveSecretConfig(e,t,n){if(!n){await q(e,t,``);return}let r=await Qe(n);if(!r)throw Error(`Failed to encrypt secret config for ${t}`);await q(e,t,r)}async setApiKey(e,t){this.#t=await Qe(t),this.#e=null;let n=await Qe(t);if(!n)throw Error(`key failed to encrypt. config cannot set.`);await q(e,r(this.provider),n)}submitMessage(e,t=p){this.browserChat.submit(e,t)}};export{Rn as Orchestrator};
15
+ `).slice(0,1e4)}function dn(e){let t=e.trim();return t?`Tool result:\n${t}`:``}async function fn(e,t,r){let{apiKey:i,assistantName:a,contextCompression:o=!1,contextLimit:s,enabledTools:c,groupId:l,isScheduledTask:u=!1,maxIterations:d,maxTokens:f,memory:p,messages:m,model:h,provider:g,providerHeaders:_={},providerRuntimeOverrides:v,reasoning:y,rateLimitAutoAdapt:b=!0,rateLimitCallsPerMinute:x=0,storageHandle:S,streaming:C=!1,subagentModelSelectionMode:w,subagentMaxTokens:E,subagentPinnedModel:D,subagentPinnedProvider:ee,systemPrompt:k,workspaceGroupId:A}=t,j=!!t.subagentTask,M=j?l.startsWith(`subagent:`)?l:`subagent:${J()}`:l,ne=A||l;j&&Ee(M,[]);let N={autoAdapt:b!==!1,callsPerMinute:Number.isFinite(x)?Math.max(0,Math.floor(x)):0};S&&He(S);let P=n(g);if(!P){U({payload:{groupId:M,error:`Unknown provider: ${g}`},type:`error`});return}let F=P,I=C&&F.supportsStreaming===!0&&F.format!==`prompt_api`;U({type:`typing`,payload:{groupId:M}}),Z(M,`info`,`Starting`,`Provider: ${F.name} · Model: ${h} · Max tokens: ${f} · Streaming: ${I?`on`:`off`}${C&&!I?` (provider does not support streaming)`:``}`);try{let t=[...m],n=0,l=typeof d==`number`&&d>0?d:50,b=Array.isArray(c)?c:Je;Ve()&&(b=Be(b));let x=k,C=``,A={apiKey:i,assistantName:a??``,db:e,enabledTools:b,invokeSubagent:t=>hn(e,t,r),maxTokens:f,memory:p??``,model:h,provider:g,subagentModelSelectionMode:w,subagentMaxTokens:E,subagentPinnedProvider:ee,subagentPinnedModel:D,providerHeaders:_,providerRuntimeOverrides:v,storageHandle:S,streaming:!1,systemPrompt:x??``},j=[];for(;n<l;){n++;let c=on(M);c&&(b=c.enabledTools,x=te(a,p,b,c.systemPromptOverride,void 0,void 0,{groupId:M}));let l=s??O(h),d=ye(x),{messages:m,estimatedTokens:v}=ze(t,{contextLimit:l,maxOutputTokens:f,skimTop:o,systemPromptTokens:d}),S=v+d,w=Math.max(100,Math.min(f,l-S-500)),E=oe(F,m,b,{contextCompression:o,maxTokens:w,model:h,reasoning:y,system:x});Z(M,`api-call`,`API call #${n}`,`${m.length} messages in context`);let D={...R(F,i),..._},ee=F.baseUrl,k;Ve(),Ve(),k=I?await mn(g,F,ee,D,E,M,h,N,r):await pn(g,F,ee,D,E,M,N,r),k=ln(k,b),k.usage&&U(Ut(M,k.usage,O(h)));for(let e of k.content)e.type===`text`&&e.text&&Z(M,`text`,`Response text`,e.text.length>200?e.text.slice(0,200)+`…`:e.text);if(k.stop_reason===`tool_use`){let n=new Set(b.map(e=>typeof e?.name==`string`?e.name:``).filter(Boolean)),r=k.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).replace(/<internal>[\s\S]*?<\/internal>/g,``).trim();r&&U({payload:{groupId:M,text:r},type:`intermediate-response`}),I&&U({payload:{groupId:M},type:`streaming-end`});let i=[];for(let t of k.content)if(t.type===`tool_use`){let r=n.has(t.name),a=`${t.name}:${JSON.stringify(t.input)}`,o=j.filter(e=>e===a).length;if(j.push(a),!r){let e=`SYSTEM ERROR: Tool '${t.name}' is disabled or unavailable for this request. Do not call it again. Try a different approach or ask the user for help.`;Z(M,`warning`,`Tool blocked`,e),i.push({content:e,tool_use_id:t.id,type:`tool_result`});continue}let s=JSON.stringify(t.input),c=s.length>300?s.slice(0,300)+`…`:s;Z(M,`tool-call`,`Tool: ${t.name}`,c),U(H(M,t.name,`running`));let l;o>=3?(l=`SYSTEM ERROR: You have repeatedly called this tool with the exact same input (${o+1} times). This is a rigid loop. STOP calling this tool with these arguments. Try a different approach, fix the underlying issue, or ask the user for help.`,console.warn(`[Worker] Blocked repetitive tool call:`,a)):l=await T(e,t.name,t.input,ne,{allowedTools:b,isScheduledTask:u,invokeContext:A});let d=typeof l==`string`?l:JSON.stringify(l),f=d.length>500?d.slice(0,500)+`…`:d;Z(M,`tool-result`,`Result: ${t.name}`,f),U(H(M,t.name,`done`)),Array.isArray(l)?i.push({content:l,tool_use_id:t.id,type:`tool_result`}):i.push({content:typeof l==`string`?l.slice(0,1e5):JSON.stringify(l).slice(0,1e5),tool_use_id:t.id,type:`tool_result`})}C=un(i),t.push({role:`assistant`,content:k.content}),t.push({role:`user`,content:i}),U({type:`typing`,payload:{groupId:M}})}else{let e=k.content.filter(e=>e.type===`text`).map(e=>e.text).join(``).replace(/<internal>[\s\S]*?<\/internal>/g,``).trim(),t=(e.toLowerCase()===`(no response)`?``:e)||(C?dn(C):`(no response)`);I&&U({payload:{groupId:M,text:t},type:`streaming-done`}),U({payload:{groupId:M,text:t},type:`response`});return}}U({payload:{text:`⚠️ Reached maximum tool-use iterations (${l}). Stopping to avoid excessive API usage.`,groupId:M},type:`response`})}catch(e){if(e instanceof Error&&e.name===`AbortError`)return;let t=e instanceof Error?e.message:String(e);I&&U({payload:{groupId:M,error:t},type:`streaming-error`}),U({type:`error`,payload:{groupId:M,error:t}})}finally{sn(M),j&&Me(M)}}async function pn(e,t,n,r,i,a,o,s){return L(async()=>{await tn(e,a,o,s);let c=await fetch(n,{body:JSON.stringify(i),headers:r,method:`POST`,signal:s});if(nn(e,c.headers,o),!c.ok){let e=await c.text(),n=Error(`${t.name} API error ${c.status}: ${e}`);throw n.status=c.status,n}return I(t,await c.json())},{baseDelayMs:2e3,jitterFactor:.5,maxDelayMs:3e4,maxRetries:3,onRetry:(e,t,n,r)=>{let i=r instanceof Error?r.message:String(r);Z(a,`warning`,`Retrying API call (${e}/${t})`,i),U({type:`show-toast`,payload:{message:`LLM API: Retrying (${e}/${t})… ${i.slice(0,120)}`,type:`warning`,duration:5e3}})},shouldRetry:e=>Oe(e),signal:s})}async function mn(e,t,n,r,i,a,o,s,c){let l={...i,stream:!0,...(t.format===`openai`||t.format===`mesh-llm`)&&{stream_options:{include_usage:!0}}};await tn(e,a,s,c);let u=await fetch(n,{body:JSON.stringify(l),headers:r,method:`POST`,signal:c});if(nn(e,u.headers,s),!u.ok){let e=await u.text(),n=Error(`${t.name} API error ${u.status}: ${e}`);throw n.status=u.status,n}if(!u.body)throw Error(`Streaming response has no body`);U({payload:{groupId:a},type:`streaming-start`});let d=0,f=``,p=0,m=``,h=(e=!1)=>{let t=Date.now();m&&(!e&&t-p<50||(Z(a,`info`,`Reasoning`,m.length>400?`${m.slice(0,400)}…`:m),m=``,p=t))},g=new rn(t.format,{source:t.id,onText:e=>{let t=Date.now();f+=e,t-d>=50&&(U({payload:{groupId:a,text:f},type:`streaming-chunk`}),f=``,d=t)},onToolStart:e=>{U(H(a,e,`running`))},onUsage:e=>{U(Ut(a,e,O(o)))},onThinking:e=>{m+=e,h(!1)}});for await(let e of Wt(u.body,c))g.push(e);f&&U({payload:{groupId:a,text:f},type:`streaming-chunk`}),h(!0);let _=g.finalize();return t.format===`mesh-llm`&&(_=N(_)),_}async function hn(e,t,n){let r=t.provider,i=async e=>{U(e)};if(r===`transformers_js_browser`){await Ht(e,t.groupId,t.systemPrompt,t.messages,t.maxTokens,i,n,t.enabledTools,t.model);return}if(r===`prompt_api`){if(!z())throw Error(`Prompt API provider is not supported in this environment.`);await ee(e,t.groupId,t.systemPrompt,t.messages,t.maxTokens,i,n,t.enabledTools);return}if(r===`litert_lm_browser`){if(!Ot())throw Error(`Litert LM Browser provider is not supported in this environment.`);await Rt(e,t.groupId,t.systemPrompt,t.messages,t.maxTokens,i,n,t.model,t.enabledTools);return}await fn(e,t,n)}async function gn(e,t,r,i,a=!1,s=!1){let c=s?`subagent:${J()}`:r;if(e.inFlightTriggerByGroup.set(c,i),e.setState(`thinking`,c),e.router?.setTyping(c,!0),e.events.emit(`typing`,{groupId:c,typing:!0}),i.startsWith(`[SCHEDULED TASK]`)){e.pendingScheduledTasks.add(r);let n={id:J(),groupId:r,sender:`Scheduler`,content:i,timestamp:Date.now(),channel:Te(e,r),isFromMe:!1,isTrigger:!0};await ce(t,n),e.events.emit(`message`,n)}let l=``;try{l=await Ge(t,r,`MEMORY.md`)}catch{}let u=(await xe(t)).find(e=>e.groupId===r),d=u?.pinnedProvider??e.provider,f=u?.pinnedModel??(u?.pinnedProvider?n(u.pinnedProvider)?.defaultModel??e.model:e.model),p=typeof u?.pinnedMaxTokens==`number`&&Number.isFinite(u.pinnedMaxTokens)&&u.pinnedMaxTokens>0?Math.floor(u.pinnedMaxTokens):e.maxTokens,h=f;d===`prompt_api`&&(f===`browser-built-in`||!f)&&!z()&&(h=await S(t,m.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`);let g=Math.max(1,Math.min(p,o(h))),_=n(d)??e.providerConfig;e.inFlightEffectiveProviderByGroup.set(c,{providerId:d,providerConfig:_,model:f});let v=Array.isArray(u?.toolTags)?K.allTools.filter(e=>u.toolTags.includes(e.name)):K.enabledTools,y=(await qe(t,c)).tools.filter(e=>!K.allTools.some(t=>t.name===e.name)),b=Array.isArray(u?.toolTags)?y.filter(e=>u.toolTags.includes(e.name)):y.filter(e=>K.isDeclarativeToolEnabled(e.name)),x=[...v,...b],C=await se(t,c),w=C.skills.length>0&&!x.some(e=>e.name===Ye.name)?[...x,Ye]:x,T=u?.subagentModelSelectionMode===`manual`?`manual`:`automatic`,E=u?.subagentMaxTokens,D=u?.subagentPinnedProvider,A=u?.subagentPinnedModel,j=u?.subagentFastProvider,ne=u?.subagentFastModel,N=u?.subagentSmartProvider,P=u?.subagentSmartModel,F=u?.subagentPowerfulProvider,I=u?.subagentPowerfulModel,L=u?.providerRuntimeOverrides,ie=W.getPeerState(r)||void 0,R=te(e.assistantName,l,w,K.systemPromptOverride,ie,C.skills,{groupId:r}),ae=O(h),oe=ye(R)+w.reduce((e,t)=>e+ye(JSON.stringify(t)),0),B=await Ce(r,200);a&&(B=B.length>0?[B[B.length-1]]:[{role:`user`,content:i}]);let V=ze(B,{contextLimit:ae,systemPromptTokens:oe,maxOutputTokens:g,skimTop:e.contextCompressionEnabled}),le=V.messages,ue=V.estimatedTokens+oe;if(W.tokenUsage){let e=W.tokenUsage,t=(e.inputTokens||0)+(e.cacheReadTokens||0)+(e.outputTokens||0);ue=Math.max(ue,t)}if(e.events.emit(`context-usage`,{estimatedTokens:ue,contextLimit:ae,usagePercent:Math.min(100,Math.max(V.usagePercent,ue/ae*100)),truncatedCount:V.truncatedCount}),V.usagePercent>80&&V.truncatedCount>0&&B.length>10&&(e.events.emit(`show-toast`,{message:`Context ${V.usagePercent.toFixed(0)}% full — auto-compacting older messages…`,type:`info`,duration:4e3}),queueMicrotask(()=>De(e,t,r))),d===`transformers_js_browser`){let n=new AbortController;e.promptControllers.set(c,n);let r={apiKey:``,assistantName:e.assistantName,db:t,enabledTools:w,invokeSubagent:async e=>{await hn(t,e,n.signal)},maxTokens:g,memory:l,model:f,provider:d,providerHeaders:he(e,d,``,L),providerRuntimeOverrides:L,streaming:!1,subagentModelSelectionMode:T,subagentMaxTokens:E,subagentPinnedProvider:D,subagentPinnedModel:A,subagentFastProvider:j,subagentFastModel:ne,subagentSmartProvider:N,subagentSmartModel:P,subagentPowerfulProvider:F,subagentPowerfulModel:I,systemPrompt:R};try{await Ht(t,c,R,le,g,async n=>{await re(e,t,n)},n.signal,w,f,r)}catch(n){if(n instanceof Error&&n.name===`AbortError`)return;await Le(e,t,c,`⚠️ Error: ${n instanceof Error?n.message:String(n)}`)}finally{e.promptControllers.delete(c)}return}if(d===`prompt_api`){if(z()||await M(),!z()){await Le(e,t,c,`⚠️ Error: Prompt API is not available in this browser. Switch provider or enable experimental browser flags.`);return}let n=new AbortController;e.promptControllers.set(c,n);let r={apiKey:``,assistantName:e.assistantName,db:t,enabledTools:w,invokeSubagent:async e=>{await hn(t,e,n.signal)},maxTokens:g,memory:l,model:f,provider:d,providerHeaders:he(e,d,``,L),providerRuntimeOverrides:L,streaming:!1,subagentModelSelectionMode:T,subagentMaxTokens:E,subagentPinnedProvider:D,subagentPinnedModel:A,subagentFastProvider:j,subagentFastModel:ne,subagentSmartProvider:N,subagentSmartModel:P,subagentPowerfulProvider:F,subagentPowerfulModel:I,systemPrompt:R};try{await ee(t,c,R,le,g,async n=>{await re(e,t,n)},n.signal,w,r)}catch(n){if(n instanceof Error&&n.name===`AbortError`)return;await Le(e,t,c,`⚠️ Error: ${n instanceof Error?n.message:String(n)}`)}finally{e.promptControllers.delete(c)}return}if(d===`litert_lm_browser`){if(!Ot()){await Le(e,t,c,`⚠️ LiteRT-LM requires WebGPU and WebAssembly.Suspending. These are not both available in this browser.`);return}let n=new AbortController;e.promptControllers.set(c,n);let r={apiKey:``,assistantName:e.assistantName,db:t,enabledTools:w,invokeSubagent:async e=>{await hn(t,e,n.signal)},maxTokens:g,memory:l,model:f,provider:d,providerHeaders:he(e,d,``,L),providerRuntimeOverrides:L,streaming:!1,subagentModelSelectionMode:T,subagentMaxTokens:E,subagentPinnedProvider:D,subagentPinnedModel:A,subagentFastProvider:j,subagentFastModel:ne,subagentSmartProvider:N,subagentSmartModel:P,subagentPowerfulProvider:F,subagentPowerfulModel:I,systemPrompt:R};try{await Rt(t,c,R,le,g,async n=>{await re(e,t,n)},n.signal,f,w,r)}catch(n){if(n instanceof Error&&n.name===`AbortError`)return;await Le(e,t,c,`⚠️ Error: ${n instanceof Error?n.message:String(n)}`)}finally{e.promptControllers.delete(c)}return}let de=e.streamingEnabled&&_.supportsStreaming===!0&&(_.format===`openai`||_.format===`anthropic`);d===`transformers_js_local`&&ve(e,e.events,c);let fe=e.createProviderRequestId(c);e.agentWorker?.postMessage({type:`invoke`,payload:{apiKey:d===e.provider?await k(e):await e.getApiKeyForSpecificProvider(t,d),assistantName:e.assistantName,contextCompression:e.contextCompressionEnabled,contextLimit:O(h),enabledTools:w,groupId:c,isScheduledTask:e.schedulerTriggeredGroups.has(r),maxIterations:e.maxIterations,maxTokens:g,memory:l,messages:le,model:f,provider:d,providerHeaders:he(e,d,fe,L),providerRuntimeOverrides:L,reasoning:me(e),rateLimitAutoAdapt:e.rateLimitAutoAdapt,rateLimitCallsPerMinute:e.rateLimitCallsPerMinute,storageHandle:await S(t,m.STORAGE_HANDLE),streaming:de,subagentModelSelectionMode:T,subagentMaxTokens:E,subagentPinnedProvider:D,subagentPinnedModel:A,subagentFastProvider:j,subagentFastModel:ne,subagentSmartProvider:N,subagentSmartModel:P,subagentPowerfulProvider:F,subagentPowerfulModel:I,systemPrompt:R,subagentTask:s}})}function _n(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 vn(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 yn(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=_n(e.directToolCommandPolicy,e.assistantName,n),o=a?null:vn(n.content,(await se(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 $e(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 ce(t,p),e.events.emit(`message`,p),o?.skill.execution&&e.agentWorker){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}});return}if(n.channel===`peerjs`&&we(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&&e.agentWorker){e.agentWorker.postMessage({type:`execute-direct-tool`,payload:{groupId:n.groupId,name:a.toolName,input:a.input}});return}bn(e,t)}async function bn(e,t){if(e.processing||e.messageQueue.length===0)return;let r=e.messageQueue[0]?.groupId,i=e.providerConfig,a=e.provider;if(r)try{let e=(await xe(t)).find(e=>e.groupId===r);if(e?.pinnedProvider){let t=n(e.pinnedProvider);t&&(i=t,a=e.pinnedProvider)}}catch{}let o=i?.requiresApiKey!==!1,s=!0;if(o&&(s=a===e.provider?!!await k(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:B(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{await gn(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&&bn(e,t)}}var xn=class{listeners;constructor(){this.listeners=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,new Set),this.listeners.get(e)?.add(t)}};function Q(e,t){return{jsonrpc:`2.0`,method:e,params:t}}var Sn=class{static isRoomMethod(e){return e===Y.JOIN||e===Y.ROSTER||e===Y.LEAVE||e===Y.MESSAGE||e===Y.INVITE||e===Y.RELAY||e===Y.A2UI||e===Y.A2UI_ACTION}roomsSignal=new w.State([]);_opts;_rooms=new Map;_seen=new Map;_surfaceOwners=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=J(),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,Q(Y.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=J(),a={roomId:e,broadcastId:i,ownerPeerId:r,senderPeerId:r,envelope:t};return this._markSeen(e,i),this._deliverToMembers(n,Q(Y.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=J(),o={roomId:e,broadcastId:a,ownerPeerId:i,senderPeerId:r.peerId,senderAlias:r.alias,action:t};return this._markSeen(e,a),this._deliverToMembers(n,Q(Y.A2UI_ACTION,o)),a}createRoom(e){let t=this._opts.getLocalMember(),n={roomId:J(),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 Y.JOIN:this._onJoin(e,n);break;case Y.ROSTER:this._onRoster(n);break;case Y.LEAVE:this._onLeave(e,n);break;case Y.MESSAGE:this._onMessage(n);break;case Y.INVITE:this._opts.onInvite?.(n);break;case Y.RELAY:this._onRelay(n);break;case Y.A2UI:this._onA2UI(n);break;case Y.A2UI_ACTION:this._onA2UIAction(n);break}}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,Q(Y.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,Q(Y.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,Q(Y.LEAVE,r))}else{let r={roomId:e,peerId:n};this._opts.transport.sendToPeer(t.hostPeerId,Q(Y.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,Q(Y.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,Q(Y.RELAY,i)),r.connectToPeer(t);return}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=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:Fe(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:Fe(e.roomId),sender:e.senderAlias||e.senderPeerId,content:wt(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);if(n){if(t.disbanded){this._rooms.delete(t.roomId),this._seen.delete(t.roomId),this._opts.removeRoom?.(t.roomId),this._publish();return}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:Fe(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 Cn(e){return e&&b(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 x();if(!r)return n(Error(`failed to get transaction, cannot get enabled tasks.`));let i=r.transaction(`tasks`,`readonly`);if(!i)return n(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 wn(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 Tn(r,t.getMinutes())&&Tn(i,t.getHours())&&Tn(a,t.getDate())&&Tn(o,t.getMonth()+1)&&Tn(s,t.getDay())}function Tn(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 En=class{interval=null;onTaskChange;runner;constructor(e,t){this.runner=e,this.onTaskChange=t}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 Cn(),t=new Date;for(let n of e){let e=n.schedule||``;e!==``&&wn(e,t)&&!this.ranThisMinute(n,t)&&(await Ae(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)}}};function Dn(e){if(!e)return[];try{let t=JSON.parse(e);if(Array.isArray(t))return D(t.map(e=>String(e)))}catch{}return D(e.split(`,`))}async function On(e,t){e.channelEnabledByType.telegram=await be(`telegram`,t),e.channelEnabledByType.imessage=await be(`imessage`,t);let n=await e.loadSecretConfig(t,m.TELEGRAM_BOT_TOKEN),r=Dn(await S(t,m.TELEGRAM_CHAT_IDS)),i=await S(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 Pe(t,e,n),i=new Uint8Array(r.byteLength);i.set(r);let a=Re(n.split(`/`).pop()||n);return new Blob([i],{type:a})}catch(e){return console.warn(`Orchestrator: channel fileReader failed for ${n}:`,e),null}};e.telegram.fileReader=a,e.imessage.fileReader=a;let o=(await S(t,m.IMESSAGE_SERVER_URL)||``).trim().replace(/\/+$/,``),s=await e.loadSecretConfig(t,m.IMESSAGE_API_KEY),c=Dn(await S(t,m.IMESSAGE_CHAT_IDS));e.imessageServerUrl=o,e.imessageApiKey=s,e.imessageChatIds=c,e.imessage.configure(o,s,c),e.channelEnabledByType.peerjs=await be(`peerjs`,t);let l=(await S(t,m.PEERJS_MY_PEER_ID)||``).trim(),u=Dn(await S(t,m.PEERJS_TRUSTED_PEER_IDS)),d=(await S(t,m.PEERJS_SERVER_HOST)||``).trim(),f=await S(t,m.PEERJS_SERVER_PORT),p=f&&parseInt(f,10)||0,h=(await S(t,m.PEERJS_SERVER_PATH)||``).trim(),g=await S(t,m.PEERJS_SERVER_SECURE)!==`false`,_={},v=await S(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 S(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 kn(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 An(e,t){typeof navigator>`u`||!navigator.serviceWorker||navigator.serviceWorker.addEventListener(`message`,t=>{if(t.data?.type===`request-proxy-config`){E(e);return}if(t.data?.type!==`scheduled-task-trigger`)return;let{taskId:n,groupId:r,prompt:i,taskType:a,tools:o}=t.data;r&&(e.schedulerTriggeredGroups.add(r),(async()=>{let t=W.tasks.find(e=>e.id===n);if(t){W.runTask(t);return}if(a===`tools`&&Array.isArray(o)&&o.length>0){W.runTask({id:n||`push-task-${Date.now()}`,groupId:r,createdAt:Date.now(),enabled:!0,prompt:i||``,type:`tools`,tools:o,lastRun:null});return}i&&V(e,i,r)})().catch(e=>console.error(`Push-triggered task ${n} failed:`,e)).finally(()=>{e.schedulerTriggeredGroups.delete(r)}))})}function jn(e){return new Sn({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=>ne(e,t),persistRoom:t=>{e.db&&ge(e.db,t).catch(e=>console.error(`Failed to persist room:`,e))},removeRoom:t=>{e.db&&A(e.db,t).catch(e=>console.error(`Failed to delete room:`,e))}})}async function Mn(e,t){e.initializeChannelRegistry(),e.channelRegistry.onMessage(n=>{yn(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:`)&&W.setRemoteAgentTyping(t,n)}),e.peerjs.onTaskComplete(t=>{e.peerCompletedContexts.add(t)}),await On(e,t),Se(e);try{let n=await F(t);e.roomManager.loadRooms(n)}catch(e){console.error(`Failed to load rooms:`,e)}}async function Nn(e,t){e.assistantName=await S(t,m.ASSISTANT_NAME)||`ShadowClaw`,e.triggerPattern=a(e.assistantName)}async function Pn(e,t){let n=await S(t,m.VM_BOOT_MODE);e.vmBootMode=n===`disabled`||n===`auto`||n===`9p`||n===`ext2`?n:`disabled`,e.streamingEnabled=await S(t,m.STREAMING_ENABLED)!==`false`,e.webMcpToolsEnabled=await S(t,m.WEBMCP_TOOLS_ENABLED)!==`false`,e.vmBashFullInternetAccess=await S(t,m.VM_BASH_FULL_INTERNET_ACCESS)===`true`;let r=await S(t,m.WEBMCP_MODE);(r===`native`||r===`polyfill`)&&tt(r),e.contextCompressionEnabled=await S(t,m.CONTEXT_COMPRESSION_ENABLED)===`true`;let i=await S(t,m.REASONING_EFFORT);e.reasoningEffort=i?i.trim().toLowerCase():`none`,e.directToolCommandPolicy=kn(await S(t,m.DIRECT_TOOL_COMMAND_POLICY)),e.useProxy=await S(t,m.USE_PROXY)===`true`,e.proxyUrl=await S(t,m.PROXY_URL)||`/proxy`,e.gitProxyUrl=await S(t,m.GIT_PROXY_URL)||`/git-proxy`,e.taskServerEnabled=await S(t,m.TASK_SERVER_ENABLED)===`true`,e.taskServerUrl=await S(t,m.TASK_SERVER_URL)||(await import(`./config-Dewnqegf.js`).then(e=>e.k)).DEFAULT_TASK_SERVER_URL}async function Fn(e,t){let n=await S(t,m.LLAMAFILE_MODE);n===`cli`||n===`server`?e.llamafileMode=n:await q(t,m.LLAMAFILE_MODE,e.llamafileMode);let r=await S(t,m.LLAMAFILE_HOST);r&&(e.llamafileHost=r);let i=await S(t,m.LLAMAFILE_PORT);if(i){let t=parseInt(i,10);Number.isFinite(t)&&t>=1&&t<=65535&&(e.llamafilePort=t)}await S(t,m.LLAMAFILE_OFFLINE)===`false`&&(e.llamafileOffline=!1),de(e);let a=await S(t,m.MESH_LLM_HOST);a&&(e.meshLlmHost=a),j(e)}async function In(e,t){let[r,i,a,c,l,u,d,f,p]=await Promise.all([S(t,m.PROVIDER),S(t,m.BEDROCK_REGION_FALLBACK),S(t,m.BEDROCK_PROFILE_FALLBACK),S(t,m.BEDROCK_AUTH_MODE),S(t,m.MODEL),S(t,m.MAX_TOKENS),S(t,m.MAX_ITERATIONS),S(t,m.RATE_LIMIT_CALLS_PER_MINUTE),S(t,m.RATE_LIMIT_AUTO_ADAPT)]),h=r?n(r):void 0;r&&h&&(e.provider=r,e.providerConfig=h),await e.loadApiKeyForProvider(t,e.provider),e.bedrockRegionFallback=(i||``).trim(),e.bedrockProfileFallback=(a||``).trim(),e.bedrockAuthMode=(c||`provider_chain`).trim();let g=()=>{let t=()=>{fe(e).then(t=>s.fetchModelInfo(e.providerConfig,t||void 0,he(e,e.provider)))};typeof globalThis.requestIdleCallback==`function`?globalThis.requestIdleCallback(t,{timeout:5e3}):setTimeout(t,2e3)};typeof window<`u`&&typeof document<`u`?document.readyState===`complete`?g():window.addEventListener(`load`,g,{once:!0}):g(),l?e.model=l:e.model=e.providerConfig.defaultModel;let _=e.model;e.provider===`prompt_api`&&!z()&&(e.model===`browser-built-in`||!e.model)&&(_=await S(t,m.PROMPT_API_FALLBACK_MODEL)||`onnx-community/Qwen3-0.6B-ONNX`,ke(_).catch(()=>{}));let v=o(_);if(u===`8192`||e.provider===`prompt_api`&&!z()&&u===`4096`?e.maxTokens=v:e.maxTokens=Math.max(1,parseInt(u||String(v),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 Ln(e,t){e.agentWorker=new Worker(C(new URL(`./agent.worker.js`,import.meta.url).href),{type:`module`}),e.agentWorker.onmessage=n=>re(e,t,n.data),e.agentWorker.onerror=e=>{console.error(`Agent worker error:`,e)};let n=await S(t,m.STORAGE_HANDLE);n&&e.agentWorker.postMessage({payload:{storageHandle:n},type:`set-storage`}),E(e),e.scheduler=new En(async t=>{await ie(e,t)},()=>{e.events.emit(`task-change`,{type:`executed`})}),ae().then(t=>{t&&e.scheduler?.start()}),An(e,t)}var Rn=class{agentWorker=null;assistantName=g;bedrockAuthMode=`provider_chain`;bedrockProfileFallback=``;bedrockRegionFallback=``;browserChat=new ct;channelEnabledByType={browser:!0,peerjs:!1,telegram:!1,imessage:!1};channelRegistry=new lt;contextCompressionEnabled=!1;db=null;directToolCommandPolicy={...$};ensureControlPlaneConnected=rt;events=new xn;gitProxyUrl=`/git-proxy`;imessage=new ut;imessageApiKey=``;imessageChatIds=[];imessageServerUrl=``;inFlightEffectiveProviderByGroup=new Map;inFlightProviderRequestIds=new Map;inFlightTriggerByGroup=new Map;llamafileHost=`127.0.0.1`;llamafileMode=`cli`;llamafileOffline=!0;llamafilePort=8080;maxIterations=50;maxTokens=h;meshLlmHost=``;messageQueue=[];model=i().defaultModel;peerCompletedContexts=new Set;peerjs=new et;peerjsMyAlias=``;peerjsMyPeerId=``;peerjsPeerAliases={};peerjsServerHost=``;peerjsServerPath=``;peerjsServerPort=0;peerjsServerSecure=!0;peerjsTrustedPeerIds=[];pendingScheduledTasks=new Set;processing=!1;promptControllers=new Map;provider=f;providerConfig=i();proxyUrl=`/proxy`;pushSubscriptionWarned=!1;rateLimitAutoAdapt=!0;rateLimitCallsPerMinute=0;reasoningEffort=`none`;roomChannel=new gt;roomManager;router=null;scheduler=null;schedulerTriggeredGroups=new Set;state=`idle`;streamingEnabled=!0;taskServerEnabled=!1;taskServerUrl=`/schedule`;telegram=new vt;telegramBotToken=``;telegramChatIds=[];telegramUseProxy=!1;transformersProgressPollers=new Map;triggerPattern=a(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=jn(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}initializeChannelRegistry(){this.channelRegistry=new lt,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 Tt(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())Ne(this,e);this.agentWorker?.terminate(),typeof this.webMcpEffectCleanup==`function`&&this.webMcpEffectCleanup(),nt()}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&&(W.replayTaskSyncOutbox(this.db),W.loadTasks(this.db)),this.scheduler&&(this.scheduler.start(),this.scheduler.tick())}stopCurrentRequest(e=p){if(this.state!==`thinking`&&this.state!==`responding`)return;Ne(this,e);let t=this.inFlightProviderRequestIds.get(e)||``;this.clearProviderRequest(e),this.agentWorker?.postMessage({type:`cancel`,payload:{groupId:e}}),this.provider===`llamafile`&&t&&le(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 Ze(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 S(e,r(t));if(!n&&t===`openrouter`){let t=await S(e,m.API_KEY);t&&(n=t)}if(!n)return``;try{return await Ze(n)||``}catch(e){return console.error(`[Orchestrator] Failed to decrypt API key:`,e),``}}async handleCompactDone(e,t,n){await Ie(e,t),await ce(e,{channel:this.channelRegistry.getChannelType(t)??`browser`,content:`📝 **Context Compacted**\n\n${n}`,groupId:t,id:J(),isFromMe:!0,isTrigger:!1,sender:this.assistantName,timestamp:Date.now()}),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 st();return this.db=e,await Promise.all([Nn(this,e),In(this,e),Fn(this,e),Pn(this,e)]),await Ln(this,e),Mn(this,e).then(()=>{this.browserChat.onDisplay(()=>{})}),this.events.emit(`ready`,void 0),await K.load(e),Xe(this,e),e}async loadApiKeyForProvider(e,t){let n=await S(e,r(t));if(!n&&t===`openrouter`){let i=await S(e,m.API_KEY);i&&(n=i,await q(e,r(t),i))}n?this.#t=n:this.#t=``,this.#e=null}async loadSecretConfig(e,t){let n=await S(e,t);if(!n)return``;try{return await Ze(n)||``}catch{let r=await Qe(n);return r&&await q(e,t,r),n}}async newSession(e,t=p){await Ie(e,t),this.events.emit(`session-reset`,{groupId:t})}async refreshContextUsage(e,t=p){let r=``;try{r=await Ge(e,t,`MEMORY.md`)}catch{}let i=K.enabledTools,a=W.getPeerState(t)||void 0,s=te(this.assistantName,r,i,K.systemPromptOverride,a,void 0,{groupId:t}),c=(await xe(e)).find(e=>e.groupId===t),l=c?.pinnedModel??(c?.pinnedProvider?n(c.pinnedProvider)?.defaultModel??this.model:this.model),u=l;(c?.pinnedProvider??this.provider)===`prompt_api`&&(l===`browser-built-in`||!l)&&!z()&&(u=await S(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,o(u))),h=O(u),g=ye(s)+(i?.reduce((e,t)=>e+ye(JSON.stringify(t)),0)??0),_=ze(await Ce(t,200),{contextLimit:h,systemPromptTokens:g,maxOutputTokens:f,skimTop:this.contextCompressionEnabled}),v=_.estimatedTokens+g;if(W.tokenUsage){let e=W.tokenUsage,t=(e.inputTokens||0)+(e.cacheReadTokens||0)+(e.outputTokens||0);v=Math.max(v,t)}this.events.emit(`context-usage`,{estimatedTokens:v,contextLimit:h,usagePercent:Math.min(100,Math.max(_.usagePercent,v/h*100)),truncatedCount:_.truncatedCount})}async restartCurrentRequest(e=p){if(this.state!==`thinking`&&this.state!==`responding`||!this.db)return!1;let t=this.inFlightTriggerByGroup.get(e);return t?(this.stopCurrentRequest(e),await gn(this,this.db,e,t),!0):!1}async routeRoomA2UIAction(e,t){let n=P(e),r=this.peerjs.myPeerId||this.peerjsMyPeerId,i=this.roomManager.getSurfaceOwner(t.surfaceId);if(!i||i===r){if(!this.db)return;await yn(this,this.db,{id:J(),groupId:e,sender:this.peerjsMyAlias||r||`you`,content:wt(t),timestamp:Date.now(),channel:`room`,a2uiAction:t});return}this.roomManager.broadcastA2UIAction(n,t)}async saveSecretConfig(e,t,n){if(!n){await q(e,t,``);return}let r=await Qe(n);if(!r)throw Error(`Failed to encrypt secret config for ${t}`);await q(e,t,r)}async setApiKey(e,t){this.#t=await Qe(t),this.#e=null;let n=await Qe(t);if(!n)throw Error(`key failed to encrypt. config cannot set.`);await q(e,r(this.provider),n)}submitMessage(e,t=p){this.browserChat.submit(e,t)}};export{Rn as Orchestrator};
@@ -1 +1 @@
1
- import"./config-D4lVqMs8.js";import{r as e}from"./txPromise-C2iYogHX.js";import{t}from"./dist-B9m1QM9v.js";import{Xt as n,Zt as r,pn as i,sn as a,vn as o}from"./orchestrator-D6tel2Zp.js";import{a as s}from"./tools-nysPKnGT.js";import{t as c}from"./ulid-BY7rQVLN.js";function l(e){return n(e,{replacement:`-`,fallback:`attachment`,stripLeadingDots:!0,collapseReplacement:!0,stripControlChars:!0})}function u(e){return e.previewDisposition===`inline`||o(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=o(n,i.mimeType||``),f=i.size;if(c){let r=await p(c);u=o(n,i.mimeType||r.type),f=typeof f==`number`?f:r.size,await a(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=new Set([`TASK_STATE_COMPLETED`,`TASK_STATE_FAILED`,`TASK_STATE_CANCELED`,`TASK_STATE_REJECTED`]),g=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:c(),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=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=new Map([[`TASK_STATE_SUBMITTED`,new Set([`TASK_STATE_WORKING`,`TASK_STATE_REJECTED`,`TASK_STATE_CANCELED`,`TASK_STATE_FAILED`])],[`TASK_STATE_WORKING`,new Set([`TASK_STATE_COMPLETED`,`TASK_STATE_FAILED`,`TASK_STATE_CANCELED`,`TASK_STATE_INPUT_REQUIRED`,`TASK_STATE_AUTH_REQUIRED`])],[`TASK_STATE_INPUT_REQUIRED`,new Set([`TASK_STATE_WORKING`,`TASK_STATE_CANCELED`,`TASK_STATE_FAILED`])],[`TASK_STATE_AUTH_REQUIRED`,new Set([`TASK_STATE_WORKING`,`TASK_STATE_CANCELED`,`TASK_STATE_FAILED`])]]);var j=class{_config;_contextActiveTask=new Map;_listeners=new Set;_taskOrder=[];_tasks=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:c(),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,n=t.contextId??c(),r=t.taskId??this._contextActiveTask.get(n);return r&&this._tasks.has(r)?this._continueTask(r,t):this._createTask(n,t)}markCompleted(e,t){let n=this._tasks.get(e);n&&this._transitionState(n,`TASK_STATE_COMPLETED`,t)}markFailed(e,t){let n=this._tasks.get(e);n&&this._transitionState(n,`TASK_STATE_FAILED`,{messageId:c(),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 n=c(),r={id:n,contextId:e,status:{state:`TASK_STATE_SUBMITTED`,timestamp:new Date().toISOString()},history:[t]};return this._addTask(r),this._contextActiveTask.set(e,n),this._emitStatusUpdate(r),{task:r}}_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);if(i&&!i.has(t)){console.warn(`PeerTaskManager: invalid transition ${r} → ${t} for task ${e.id}`);return}if(h.has(r)){console.warn(`PeerTaskManager: task ${e.id} is in terminal state ${r}, cannot transition`);return}e.status={state:t,message:n,timestamp: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 n{static _RECONNECT_BASE_MS=1e3;static _RECONNECT_MAX_MS=6e4;connectedPeersSignal=new t.State([]);connections=new Map;messageCallback=null;myPeerId=``;peerCards=new O;running=!1;serverConfig={};transferProgressSignal=M;trustedPeerIds=new Set;type=`peerjs`;typingCallback=null;_inboundRemap=new Map;_localCard=null;_onTaskCompleteCallback=null;peer=null;_inboundSavePromises=new Map;_pendingInboundFile=null;_pendingRequests=new Map;_reconnectAttempts=0;_reconnectTimer=null;_roomNotificationHandler=null;_taskManagers=new Map;_inboundTransfers=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,n,r){let a=this.myPeerId,o=(r||[]).filter(e=>!!e.path);if(o.length!==0)try{let r=await e();for(let e of o){let o;try{o=await i(r,n,e.path)}catch(t){console.warn(`PeerJsChannel: failed to read file ${e.path} for room:`,t);continue}let s=e.path,l=e.mimeType||`application/octet-stream`,u=Math.max(1,Math.ceil(o.length/I));for(let r of t.members){if(r.peerId===a)continue;let t=this._getOrOpenConnection(r.peerId);if(t)try{await this._waitForOpen(t);let e=c();t.send({type:`__file_header`,id:e,name:s,mimeType:l,size:o.length,totalChunks:u,chunkSize:I,groupId:n});for(let n=0;n<u;n++){let r=n*I,i=Math.min(r+I,o.length),a=o.subarray(r,i),c=a.buffer.slice(a.byteOffset,a.byteOffset+a.byteLength);t.send({type:`__file_chunk`,id:e,name:s,index:n,totalChunks:u,data:c}),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 ${r.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,n,r){let a=t.replace(/^peer:/,``),o=this._getOrOpenConnection(a);if(!o){console.warn(`PeerJsChannel: no connection available for ${a}`);return}try{await this._waitForOpen(o);let{attachments:a}=R(n),s=[...(r||[]).filter(e=>!!e.path),...a.map(e=>({path:e.path,mimeType:`application/octet-stream`}))],l=new Map,u=[];try{let n=await e();for(let e of s)if(e.path)try{let r=await i(n,t,e.path),a=e.path;l.has(e.path)||l.set(e.path,a);let s=e.mimeType||`application/octet-stream`,d=c(),f=Math.max(1,Math.ceil(r.length/I));o.send({type:`__file_header`,id:d,name:a,mimeType:s,size:r.length,totalChunks:f,chunkSize:I,groupId:t});for(let e=0;e<f;e++){let t=e*I,n=Math.min(t+I,r.length),i=r.subarray(t,n),s=i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength);o.send({type:`__file_chunk`,id:d,name:a,index:e,totalChunks:f,data:s}),P({count:e+1,total:f,direction:`send`}),await this._waitForBufferDrain(o)}F(1500),u.push({kind:`file`,name:a,mimeType:s,size:r.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=n;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=c(),m={jsonrpc:`2.0`,id:p,method:_.SEND_MESSAGE,params:{message:{messageId:c(),role:`ROLE_AGENT`,parts:f}}};o.send(m),this._registerPendingRequest(p,e=>{})}catch(e){console.error(`PeerJsChannel: send failed for ${a}:`,e),window.dispatchEvent(new CustomEvent(`shadow-claw-peer-error`,{detail:{remotePeerId:a,error:e instanceof Error?e.message:String(e)}}))}}async sendA2UI(e,t){let n=e.replace(/^peer:/,``),r=this._getOrOpenConnection(n);if(!r){console.warn(`PeerJsChannel.sendA2UI: no connection available for ${n}`);return}try{await this._waitForOpen(r);let e={jsonrpc:`2.0`,method:`message/send`,id:c(),params:{message:{role:`agent`,parts:[{kind:`a2ui`,envelope:t}]}}};r.send(e)}catch(e){console.error(`PeerJsChannel.sendA2UI: failed for ${n}:`,e)}}async sendA2UIAction(e,t){let n=e.replace(/^peer:/,``),r=this._getOrOpenConnection(n);if(!r){console.warn(`PeerJsChannel.sendA2UIAction: no connection available for ${n}`);return}try{await this._waitForOpen(r);let e={jsonrpc:`2.0`,method:`message/send`,id:c(),params:{message:{role:`user`,parts:[{kind:`a2ui-action`,action:t}]}}};r.send(e)}catch(e){console.error(`PeerJsChannel.sendA2UIAction: failed for ${n}:`,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);return}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}`});return}({[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 n=t;if(n.type===`__file_header`){let t=n.id||n.name,r=n.totalChunks||1,i=this._inboundTransfers.get(t),a=typeof n.groupId==`string`&&n.groupId.startsWith(`room:`)?n.groupId:`peer:${e}`;this._inboundTransfers.set(t,{transferId:t,name:n.name,mimeType:n.mimeType||`application/octet-stream`,size:n.size||0,totalChunks:r,receivedChunks:i?.receivedChunks||new Map,receivedBytes:i?.receivedBytes||0,targetGroupId:a}),this._pendingInboundFile={name:n.name,mimeType:n.mimeType,size:n.size,targetGroupId:a},P({count:0,total:r,direction:`receive`});return}if(n.type===`__file_chunk`){let t=n.id||n.name,r=this._inboundTransfers.get(t);if(!r){let e=n.totalChunks||1;r={transferId:t,name:n.name,mimeType:`application/octet-stream`,size:0,totalChunks:e,receivedChunks:new Map,receivedBytes:0},this._inboundTransfers.set(t,r)}let i=typeof n.index==`number`?n.index:0,a=n.data instanceof ArrayBuffer?new Uint8Array(n.data):n.data instanceof Uint8Array?n.data:new Uint8Array(n.data||[]);if(r.receivedChunks.has(i)||(r.receivedChunks.set(i,a),r.receivedBytes+=a.byteLength),P({count:r.receivedChunks.size,total:r.totalChunks,direction:`receive`}),r.receivedChunks.size>=r.totalChunks){let n=new Uint8Array(r.size||r.receivedBytes),i=0;for(let e=0;e<r.totalChunks;e++){let t=r.receivedChunks.get(e);t&&(n.set(t,i),i+=t.byteLength)}let a=r.targetGroupId||`peer:${e}`,o=this._saveInboundFile(a,r.name,n);this._inboundSavePromises.set(r.name,o),this._inboundTransfers.delete(t),this._pendingInboundFile=null,F(1500)}return}if(n.type===`typing`){this.typingCallback?.(`peer:${e}`,!!n.typing);return}if(n.type===`chat`){let t=typeof n.text==`string`?n.text.trim():``;t&&this.messageCallback?.({id:c(),groupId:`peer:${e}`,sender:e,content:t,timestamp:Date.now(),channel:`peerjs`});return}if(n.jsonrpc===`2.0`){this._handleA2AJsonRpc(e,n);return}if(n.type===`command:execute`){let t=n.payload||{},r=t.action||``,i=t.args||{},a=t.commandId||``;import(`./initControlPlane-CNggzsRw.js`).then(({executeClientControlCommand:e})=>e(r,i)).then(t=>{let n=this.connections.get(e);if(n){let e=!!t?.error;n.send({id:c(),type:`command:result`,payload:{commandId:a,action:r,success:!e,data:t,...e?{error:t.error}:{}}})}}).catch(t=>{let n=this.connections.get(e);n&&n.send({id:c(),type:`command:result`,payload:{commandId:a,action:r,success:!1,error:t?.message||String(t)}})});return}}_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)){console.warn(`PeerJsChannel: rejecting connection from untrusted peer: ${t}`);try{e.close()}catch{}return}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())})}_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-0if-QelV.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(n._RECONNECT_BASE_MS*2**this._reconnectAttempts,n._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,c=1;for(;await s(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} (${c})${r}`}else o=`${n} (${c})`;c++}o!==n&&this._inboundRemap.set(n,o),await r(a,t,o,i);try{let{orchestratorStore:e}=await import(`./orchestrator-D6tel2Zp.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(Error(`Connection open timeout (5s)`))},5e3);e.on(`open`,()=>{clearTimeout(r),t()}),e.on(`error`,e=>{clearTimeout(r),n(e)})})}async _processInboundA2AEnvelope(e,t,n,r){let i=`peer:${e}`,a=``,o=[],s=[],l;for(let e of t)if(e.kind===`text`&&typeof e.text==`string`)a+=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,`\\$&`);a=a.replace(RegExp(`(!?\\[.*?\\])\\(${n}\\)`,`g`),`$1(${e})`),this._inboundRemap.delete(t),t=e}let r=t.split(`/`).pop()||`attachment`;o.push({fileName:r,mimeType:e.mimeType,path:t,size:e.size||0})}else e.kind===`a2ui`&&e.envelope?s.push(e.envelope):e.kind===`a2ui-action`&&e.action&&(l=e.action);a=a.trim(),!(!a&&o.length===0&&s.length===0&&!l)&&this.messageCallback?.({id:c(),groupId:i,sender:e,content:a,timestamp:Date.now(),channel:`peerjs`,attachments:o.length>0?o:void 0,a2uiEnvelopes:s.length>0?s:void 0,a2uiAction:l,taskId:n,contextId:r})}};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-Dewnqegf.js";import{r as e}from"./txPromise-C2iYogHX.js";import{t}from"./dist-B9m1QM9v.js";import{Xt as n,Zt as r,pn as i,sn as a,vn as o}from"./orchestrator-BVnC4Vtt.js";import{a as s}from"./tools-sOLCHTj8.js";import{t as c}from"./ulid-BY7rQVLN.js";function l(e){return n(e,{replacement:`-`,fallback:`attachment`,stripLeadingDots:!0,collapseReplacement:!0,stripControlChars:!0})}function u(e){return e.previewDisposition===`inline`||o(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=o(n,i.mimeType||``),f=i.size;if(c){let r=await p(c);u=o(n,i.mimeType||r.type),f=typeof f==`number`?f:r.size,await a(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=new Set([`TASK_STATE_COMPLETED`,`TASK_STATE_FAILED`,`TASK_STATE_CANCELED`,`TASK_STATE_REJECTED`]),g=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:c(),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=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=new Map([[`TASK_STATE_SUBMITTED`,new Set([`TASK_STATE_WORKING`,`TASK_STATE_REJECTED`,`TASK_STATE_CANCELED`,`TASK_STATE_FAILED`])],[`TASK_STATE_WORKING`,new Set([`TASK_STATE_COMPLETED`,`TASK_STATE_FAILED`,`TASK_STATE_CANCELED`,`TASK_STATE_INPUT_REQUIRED`,`TASK_STATE_AUTH_REQUIRED`])],[`TASK_STATE_INPUT_REQUIRED`,new Set([`TASK_STATE_WORKING`,`TASK_STATE_CANCELED`,`TASK_STATE_FAILED`])],[`TASK_STATE_AUTH_REQUIRED`,new Set([`TASK_STATE_WORKING`,`TASK_STATE_CANCELED`,`TASK_STATE_FAILED`])]]);var j=class{_config;_contextActiveTask=new Map;_listeners=new Set;_taskOrder=[];_tasks=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:c(),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,n=t.contextId??c(),r=t.taskId??this._contextActiveTask.get(n);return r&&this._tasks.has(r)?this._continueTask(r,t):this._createTask(n,t)}markCompleted(e,t){let n=this._tasks.get(e);n&&this._transitionState(n,`TASK_STATE_COMPLETED`,t)}markFailed(e,t){let n=this._tasks.get(e);n&&this._transitionState(n,`TASK_STATE_FAILED`,{messageId:c(),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 n=c(),r={id:n,contextId:e,status:{state:`TASK_STATE_SUBMITTED`,timestamp:new Date().toISOString()},history:[t]};return this._addTask(r),this._contextActiveTask.set(e,n),this._emitStatusUpdate(r),{task:r}}_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);if(i&&!i.has(t)){console.warn(`PeerTaskManager: invalid transition ${r} → ${t} for task ${e.id}`);return}if(h.has(r)){console.warn(`PeerTaskManager: task ${e.id} is in terminal state ${r}, cannot transition`);return}e.status={state:t,message:n,timestamp: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 n{static _RECONNECT_BASE_MS=1e3;static _RECONNECT_MAX_MS=6e4;connectedPeersSignal=new t.State([]);connections=new Map;messageCallback=null;myPeerId=``;peerCards=new O;running=!1;serverConfig={};transferProgressSignal=M;trustedPeerIds=new Set;type=`peerjs`;typingCallback=null;_inboundRemap=new Map;_localCard=null;_onTaskCompleteCallback=null;peer=null;_inboundSavePromises=new Map;_pendingInboundFile=null;_pendingRequests=new Map;_reconnectAttempts=0;_reconnectTimer=null;_roomNotificationHandler=null;_taskManagers=new Map;_inboundTransfers=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,n,r){let a=this.myPeerId,o=(r||[]).filter(e=>!!e.path);if(o.length!==0)try{let r=await e();for(let e of o){let o;try{o=await i(r,n,e.path)}catch(t){console.warn(`PeerJsChannel: failed to read file ${e.path} for room:`,t);continue}let s=e.path,l=e.mimeType||`application/octet-stream`,u=Math.max(1,Math.ceil(o.length/I));for(let r of t.members){if(r.peerId===a)continue;let t=this._getOrOpenConnection(r.peerId);if(t)try{await this._waitForOpen(t);let e=c();t.send({type:`__file_header`,id:e,name:s,mimeType:l,size:o.length,totalChunks:u,chunkSize:I,groupId:n});for(let n=0;n<u;n++){let r=n*I,i=Math.min(r+I,o.length),a=o.subarray(r,i),c=a.buffer.slice(a.byteOffset,a.byteOffset+a.byteLength);t.send({type:`__file_chunk`,id:e,name:s,index:n,totalChunks:u,data:c}),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 ${r.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,n,r){let a=t.replace(/^peer:/,``),o=this._getOrOpenConnection(a);if(!o){console.warn(`PeerJsChannel: no connection available for ${a}`);return}try{await this._waitForOpen(o);let{attachments:a}=R(n),s=[...(r||[]).filter(e=>!!e.path),...a.map(e=>({path:e.path,mimeType:`application/octet-stream`}))],l=new Map,u=[];try{let n=await e();for(let e of s)if(e.path)try{let r=await i(n,t,e.path),a=e.path;l.has(e.path)||l.set(e.path,a);let s=e.mimeType||`application/octet-stream`,d=c(),f=Math.max(1,Math.ceil(r.length/I));o.send({type:`__file_header`,id:d,name:a,mimeType:s,size:r.length,totalChunks:f,chunkSize:I,groupId:t});for(let e=0;e<f;e++){let t=e*I,n=Math.min(t+I,r.length),i=r.subarray(t,n),s=i.buffer.slice(i.byteOffset,i.byteOffset+i.byteLength);o.send({type:`__file_chunk`,id:d,name:a,index:e,totalChunks:f,data:s}),P({count:e+1,total:f,direction:`send`}),await this._waitForBufferDrain(o)}F(1500),u.push({kind:`file`,name:a,mimeType:s,size:r.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=n;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=c(),m={jsonrpc:`2.0`,id:p,method:_.SEND_MESSAGE,params:{message:{messageId:c(),role:`ROLE_AGENT`,parts:f}}};o.send(m),this._registerPendingRequest(p,e=>{})}catch(e){console.error(`PeerJsChannel: send failed for ${a}:`,e),window.dispatchEvent(new CustomEvent(`shadow-claw-peer-error`,{detail:{remotePeerId:a,error:e instanceof Error?e.message:String(e)}}))}}async sendA2UI(e,t){let n=e.replace(/^peer:/,``),r=this._getOrOpenConnection(n);if(!r){console.warn(`PeerJsChannel.sendA2UI: no connection available for ${n}`);return}try{await this._waitForOpen(r);let e={jsonrpc:`2.0`,method:`message/send`,id:c(),params:{message:{role:`agent`,parts:[{kind:`a2ui`,envelope:t}]}}};r.send(e)}catch(e){console.error(`PeerJsChannel.sendA2UI: failed for ${n}:`,e)}}async sendA2UIAction(e,t){let n=e.replace(/^peer:/,``),r=this._getOrOpenConnection(n);if(!r){console.warn(`PeerJsChannel.sendA2UIAction: no connection available for ${n}`);return}try{await this._waitForOpen(r);let e={jsonrpc:`2.0`,method:`message/send`,id:c(),params:{message:{role:`user`,parts:[{kind:`a2ui-action`,action:t}]}}};r.send(e)}catch(e){console.error(`PeerJsChannel.sendA2UIAction: failed for ${n}:`,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);return}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}`});return}({[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 n=t;if(n.type===`__file_header`){let t=n.id||n.name,r=n.totalChunks||1,i=this._inboundTransfers.get(t),a=typeof n.groupId==`string`&&n.groupId.startsWith(`room:`)?n.groupId:`peer:${e}`;this._inboundTransfers.set(t,{transferId:t,name:n.name,mimeType:n.mimeType||`application/octet-stream`,size:n.size||0,totalChunks:r,receivedChunks:i?.receivedChunks||new Map,receivedBytes:i?.receivedBytes||0,targetGroupId:a}),this._pendingInboundFile={name:n.name,mimeType:n.mimeType,size:n.size,targetGroupId:a},P({count:0,total:r,direction:`receive`});return}if(n.type===`__file_chunk`){let t=n.id||n.name,r=this._inboundTransfers.get(t);if(!r){let e=n.totalChunks||1;r={transferId:t,name:n.name,mimeType:`application/octet-stream`,size:0,totalChunks:e,receivedChunks:new Map,receivedBytes:0},this._inboundTransfers.set(t,r)}let i=typeof n.index==`number`?n.index:0,a=n.data instanceof ArrayBuffer?new Uint8Array(n.data):n.data instanceof Uint8Array?n.data:new Uint8Array(n.data||[]);if(r.receivedChunks.has(i)||(r.receivedChunks.set(i,a),r.receivedBytes+=a.byteLength),P({count:r.receivedChunks.size,total:r.totalChunks,direction:`receive`}),r.receivedChunks.size>=r.totalChunks){let n=new Uint8Array(r.size||r.receivedBytes),i=0;for(let e=0;e<r.totalChunks;e++){let t=r.receivedChunks.get(e);t&&(n.set(t,i),i+=t.byteLength)}let a=r.targetGroupId||`peer:${e}`,o=this._saveInboundFile(a,r.name,n);this._inboundSavePromises.set(r.name,o),this._inboundTransfers.delete(t),this._pendingInboundFile=null,F(1500)}return}if(n.type===`typing`){this.typingCallback?.(`peer:${e}`,!!n.typing);return}if(n.type===`chat`){let t=typeof n.text==`string`?n.text.trim():``;t&&this.messageCallback?.({id:c(),groupId:`peer:${e}`,sender:e,content:t,timestamp:Date.now(),channel:`peerjs`});return}if(n.jsonrpc===`2.0`){this._handleA2AJsonRpc(e,n);return}if(n.type===`command:execute`){let t=n.payload||{},r=t.action||``,i=t.args||{},a=t.commandId||``;import(`./initControlPlane-C1pnzG16.js`).then(({executeClientControlCommand:e})=>e(r,i)).then(t=>{let n=this.connections.get(e);if(n){let e=!!t?.error;n.send({id:c(),type:`command:result`,payload:{commandId:a,action:r,success:!e,data:t,...e?{error:t.error}:{}}})}}).catch(t=>{let n=this.connections.get(e);n&&n.send({id:c(),type:`command:result`,payload:{commandId:a,action:r,success:!1,error:t?.message||String(t)}})});return}}_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)){console.warn(`PeerJsChannel: rejecting connection from untrusted peer: ${t}`);try{e.close()}catch{}return}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())})}_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-0if-QelV.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(n._RECONNECT_BASE_MS*2**this._reconnectAttempts,n._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,c=1;for(;await s(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} (${c})${r}`}else o=`${n} (${c})`;c++}o!==n&&this._inboundRemap.set(n,o),await r(a,t,o,i);try{let{orchestratorStore:e}=await import(`./orchestrator-BVnC4Vtt.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(Error(`Connection open timeout (5s)`))},5e3);e.on(`open`,()=>{clearTimeout(r),t()}),e.on(`error`,e=>{clearTimeout(r),n(e)})})}async _processInboundA2AEnvelope(e,t,n,r){let i=`peer:${e}`,a=``,o=[],s=[],l;for(let e of t)if(e.kind===`text`&&typeof e.text==`string`)a+=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,`\\$&`);a=a.replace(RegExp(`(!?\\[.*?\\])\\(${n}\\)`,`g`),`$1(${e})`),this._inboundRemap.delete(t),t=e}let r=t.split(`/`).pop()||`attachment`;o.push({fileName:r,mimeType:e.mimeType,path:t,size:e.size||0})}else e.kind===`a2ui`&&e.envelope?s.push(e.envelope):e.kind===`a2ui-action`&&e.action&&(l=e.action);a=a.trim(),!(!a&&o.length===0&&s.length===0&&!l)&&this.messageCallback?.({id:c(),groupId:i,sender:e,content:a,timestamp:Date.now(),channel:`peerjs`,attachments:o.length>0?o:void 0,a2uiEnvelopes:s.length>0?s:void 0,a2uiAction:l,taskId:n,contextId:r})}};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{r as e}from"./config-D4lVqMs8.js";import{r as t}from"./txPromise-C2iYogHX.js";import{t as n}from"./getConfig-4saf0Tkq.js";async function r(r){let i=await n(await t(),e.PUSH_PROXY_URL);if(!i&&typeof localStorage<`u`)try{i=localStorage.getItem(e.PUSH_PROXY_URL)||void 0}catch{}if(!i)return r;let a=r.startsWith(`/`)?r:`/${r}`;return`${i.endsWith(`/`)?i.slice(0,-1):i}${a}`}function i(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 a(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 o(){let e=await r(`/push/vapid-public-key`);return(await(await fetch(e,i(e))).json()).publicKey}async function s(t,n){let s=await navigator.serviceWorker.ready,c=await o(),l=await s.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:a(c)}),u=t||typeof localStorage<`u`&&localStorage.getItem(e.CONTROL_PLANE_CLIENT_ID)||void 0,d=n;if(!u||!d)try{let e=await import(`./initControlPlane-CNggzsRw.js`);!u&&typeof e.getOrCreateControlPlaneClientId==`function`&&(u=e.getOrCreateControlPlaneClientId()),!d&&typeof e.detectDeviceLabel==`function`&&(d=e.detectDeviceLabel())}catch{}let f=typeof l.toJSON==`function`?l.toJSON():JSON.parse(JSON.stringify(l)),p=await r(`/push/subscribe`);return await fetch(p,i(p,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...f,...u?{clientId:u}:{},...d?{deviceLabel:d}:{}})})),l}async function c(){let e=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!e)return;let{endpoint:t}=e;await e.unsubscribe();let n=await r(`/push/subscribe`);await fetch(n,i(n,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify({endpoint:t})}))}async function l(){return(await navigator.serviceWorker.ready).pushManager.getSubscription()}export{c as a,s as i,i as n,r,l as t};
1
+ import{r as e}from"./config-Dewnqegf.js";import{r as t}from"./txPromise-C2iYogHX.js";import{t as n}from"./getConfig-4saf0Tkq.js";async function r(r){let i=await n(await t(),e.PUSH_PROXY_URL);if(!i&&typeof localStorage<`u`)try{i=localStorage.getItem(e.PUSH_PROXY_URL)||void 0}catch{}if(!i)return r;let a=r.startsWith(`/`)?r:`/${r}`;return`${i.endsWith(`/`)?i.slice(0,-1):i}${a}`}function i(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 a(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 o(){let e=await r(`/push/vapid-public-key`);return(await(await fetch(e,i(e))).json()).publicKey}async function s(t,n){let s=await navigator.serviceWorker.ready,c=await o(),l=await s.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:a(c)}),u=t||typeof localStorage<`u`&&localStorage.getItem(e.CONTROL_PLANE_CLIENT_ID)||void 0,d=n;if(!u||!d)try{let e=await import(`./initControlPlane-C1pnzG16.js`);!u&&typeof e.getOrCreateControlPlaneClientId==`function`&&(u=e.getOrCreateControlPlaneClientId()),!d&&typeof e.detectDeviceLabel==`function`&&(d=e.detectDeviceLabel())}catch{}let f=typeof l.toJSON==`function`?l.toJSON():JSON.parse(JSON.stringify(l)),p=await r(`/push/subscribe`);return await fetch(p,i(p,{method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({...f,...u?{clientId:u}:{},...d?{deviceLabel:d}:{}})})),l}async function c(){let e=await(await navigator.serviceWorker.ready).pushManager.getSubscription();if(!e)return;let{endpoint:t}=e;await e.unsubscribe();let n=await r(`/push/subscribe`);await fetch(n,i(n,{method:`DELETE`,headers:{"Content-Type":`application/json`},body:JSON.stringify({endpoint:t})}))}async function l(){return(await navigator.serviceWorker.ready).pushManager.getSubscription()}export{c as a,s as i,i as n,r,l as t};
@@ -1 +1 @@
1
- (function(){function e(e){return e.replace(/^\/+|\/+$/g,``)}function t(t){let n=e(t);return n.endsWith(`/index.html`)?n=n.slice(0,-11):n.endsWith(`index.html`)&&(n=n.slice(0,-10)),e(n)}function n(t){let n=e(t),r=n.split(`/`).filter(Boolean);if(r.length===0)return null;let i=r[0].toLowerCase();if(i===`pages`){if(r.length>=3){let e=r[1];return{page:`pages`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:r.slice(2).join(`/`)}}return{page:`pages`,groupId:`br:main`,path:r.slice(1).join(`/`)}}if(i===`files`){let e=r[1]||`main`;return{page:`files`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:r.slice(2).join(`/`)||void 0}}if(i===`chat`){let e=r[1]||`main`;return{page:`chat`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}if(i===`tasks`){let e=r[1]||`main`;return{page:`tasks`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}return i===`main`?{page:`pages`,groupId:`br:main`,path:r.slice(1).join(`/`)}:{page:`pages`,groupId:`br:main`,path:n}}function r(){if(typeof document<`u`){let e=document.getElementById(`shadow-claw-static-routing`);if(e&&e.textContent)try{let t=JSON.parse(e.textContent);if(t&&typeof t==`object`&&t.routes)return t}catch(e){console.warn(`Failed to parse embedded static routing manifest:`,e)}}return null}function i(e,i){let a=i||r();if(!a||!a.routes)return null;let o=t(e);if(!o)return null;for(let[e,r]of Object.entries(a.routes))if(!(!r||!r.prettyPath)&&t(r.prettyPath)===o)return n(e);return null}function a(e){try{return decodeURIComponent(e)}catch{return e}}let o=null,s=new Set([`chat`,`files`,`tasks`,`pages`,`settings`,`tools`,`channels`]);function c(){o=null}typeof globalThis<`u`&&(globalThis.__applyBasePathCacheReset=c);function l(){let e=typeof window<`u`?window:typeof self<`u`?self:globalThis;if(e&&e.__SHADOWCLAW_DEPLOY_ID__){let t=String(e.__SHADOWCLAW_DEPLOY_ID__).trim();if(t)return t.replace(/[^a-zA-Z0-9_-]/g,`-`)}let t=globalThis.process;if(t&&t.env&&t.env.SHADOWCLAW_DEPLOY_ID){let e=String(t.env.SHADOWCLAW_DEPLOY_ID).trim();if(e)return e.replace(/[^a-zA-Z0-9_-]/g,`-`)}let n=u();return!n||n===`/`?``:n.replace(/^\/+|\/+$/g,``).replace(/[^a-zA-Z0-9_-]/g,`-`)}function u(){if(o!==null)return o;if((typeof window>`u`||globalThis.WorkerGlobalScope!==void 0&&typeof self<`u`&&self instanceof globalThis.WorkerGlobalScope)&&typeof self<`u`&&self.location){let e=(self.location.pathname||`/`).split(`/`).filter(Boolean);if(e.length<=1)return o=`/`,o;let t=e[0].toLowerCase(),n=t===`service-worker.js`||t===`sw.js`||t===`manifest.json`||t===`sitemap.xml`||t===`favicon.ico`||t===`index.html`||t===`service-worker`||t===`assets`||t===`dist`||t===`public`;if(n&&e.length===2)return o=`/`,o;if(!n)return o=`/`+e[0]+`/`,o}let e=typeof window<`u`&&window.location?window.location:typeof self<`u`&&self.location?self.location:null;if(!e)return`/`;if(typeof document<`u`&&typeof document.querySelector==`function`){let t=document.querySelector(`base[href]`);if(t){let n=t.getAttribute(`href`);if(n)try{let t=new URL(n,e.origin).pathname;return t.endsWith(`/`)||(t+=`/`),o=t,o}catch{}}}let t=e.pathname||`/`;if(t===`/`)return o=`/`,o;let n=t.split(`/`).filter(Boolean),r=n.findIndex(e=>s.has(e.toLowerCase()));return r>=0?r===0?(o=`/`,o):(o=`/`+n.slice(0,r).join(`/`)+`/`,o):i(t)?(o=`/`,o):n.length===1&&!t.includes(`.`)?(o=`/`+n[0]+`/`,o):(o=`/`,o)}function d(e){return e.replace(/^\/+|\/+$/g,``)}function f(e){return e&&(e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e)}function p(e){if(!e)return;let t=d(e.replace(/\\/g,`/`));if(!t)return;let n=t.split(`/`).filter(Boolean).filter(e=>e!==`.`&&e!==`..`);if(n.length!==0)return n.join(`/`)}function m(e){let t=e,n=u();n!==`/`&&t.startsWith(n)&&(t=`/`+t.slice(n.length));let r=t.split(`/`).filter(Boolean).map(e=>a(e));if(r.length<3||r[0]!==`files`)return null;let i=f(r[1])||r[1],o=p(r.slice(2).join(`/`));return!i||!o?null:{groupId:i,path:o}}let h=[`cdnjs.cloudflare.com`,`esm.sh`,`unpkg.com`,`cdn.jsdelivr.net`,`esm.run`,`huggingface.co`,`hf.co`,`hf-mirror.com`],g=[`openrouter.ai`,`router.huggingface.co`,`api-inference.huggingface.co`,`api.telegram.org`],_=[`/api/control/`,`/api/backup/`,`/api/activity-log/`,`/api/health`,`/push/`,`/schedule/`,`/mcp`,`/ws/`,`/peerjs/`],v=[`.local`,`.lan`,`.home`,`.internal`];function y(e,t,n){if(e.origin===t)return!0;if(n)try{let r=new URL(n,t).origin;if(e.origin===r)return!0}catch{}let r=e.pathname;if(_.some(e=>r===e||r.startsWith(e)))return!0;let i=e.hostname.toLowerCase();return!!(h.includes(i)||i.endsWith(`.huggingface.co`)||i.endsWith(`.hf.co`)||i.endsWith(`.hf-mirror.com`)||i.endsWith(`.esm.sh`)||i.endsWith(`.jsdelivr.net`)||g.includes(i)||i.endsWith(`.openrouter.ai`)||i===`localhost`||i===`127.0.0.1`||i===`::1`||i===`[::1]`||/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(i)||!i.includes(`.`)||v.some(e=>i.endsWith(e)))}let b={apng:`image/apng`,avif:`image/avif`,bmp:`image/bmp`,gif:`image/gif`,heic:`image/heic`,heif:`image/heif`,ico:`image/x-icon`,jpeg:`image/jpeg`,jpg:`image/jpeg`,png:`image/png`,svg:`image/svg+xml`,tif:`image/tiff`,tiff:`image/tiff`,webp:`image/webp`,"3gp":`video/3gpp`,aac:`audio/aac`,avi:`video/x-msvideo`,bin:`application/octet-stream`,css:`text/css`,csv:`text/csv`,db:`application/vnd.sqlite3`,dll:`application/octet-stream`,dmg:`application/octet-stream`,dylib:`application/octet-stream`,exe:`application/vnd.microsoft.portable-executable`,flac:`audio/flac`,flv:`video/x-flv`,gz:`application/gzip`,htm:`text/html`,html:`text/html`,iso:`application/octet-stream`,js:`text/javascript`,json:`application/json`,m4a:`audio/mp4`,m4v:`video/mp4`,markdown:`text/markdown`,md:`text/markdown`,mjs:`text/javascript`,mkv:`video/x-matroska`,mov:`video/mp4`,mp3:`audio/mpeg`,mp4:`video/mp4`,oga:`audio/ogg`,ogg:`audio/ogg`,ogv:`video/ogg`,pdf:`application/pdf`,rar:`application/vnd.rar`,so:`application/octet-stream`,sqlite:`application/vnd.sqlite3`,sqlite3:`application/vnd.sqlite3`,tar:`application/x-tar`,ts:`text/typescript`,tsx:`text/typescript`,txt:`text/plain`,wasm:`application/wasm`,wav:`audio/wav`,weba:`audio/webm`,webm:`video/webm`,wmv:`video/x-ms-wmv`,xml:`application/xml`,yaml:`text/yaml`,yml:`text/yaml`,zip:`application/zip`};function x(e){return e&&(e.split(/[?#]/,1)[0].replace(/\\/g,`/`).split(`/`).pop()||``).toLowerCase().split(`.`).pop()||``}function S(e,t){let n=x(e);return b[n]??t}let C=!1,w=`/proxy`;function T(e){let t=S(e,`application/octet-stream`);return t.startsWith(`text/`)||t===`application/javascript`||t===`application/json`?`${t}; charset=utf-8`:t}function E(e){return!(e.method!==`GET`||e.mode===`navigate`||e.destination===`document`)}async function D(e,t){let n=navigator.storage;if(!n||typeof n.getDirectory!=`function`)return null;try{let r=await n.getDirectory(),i=l(),a=i?`shadowclaw-${i}`:`shadowclaw`,o=await(await r.getDirectoryHandle(a,{create:!0})).getDirectoryHandle(`groups`,{create:!0}),s=e.replace(/:/g,`-`),c=await o.getDirectoryHandle(s,{create:!1}),u=t.split(`/`).filter(Boolean);if(u.length===0)return null;let d=u.pop();if(!d)return null;let f=c;for(let e of u)f=await f.getDirectoryHandle(e,{create:!1});return await(await f.getFileHandle(d,{create:!1})).getFile()}catch{return null}}async function O(e){let t=m(new URL(e.url).pathname);if(!t||!E(e))return null;try{let e=await D(t.groupId,t.path);return e?new Response(e,{status:200,headers:{"Content-Type":e.type||T(t.path),"Content-Length":String(e.size),"Cache-Control":`no-store`,"Access-Control-Allow-Origin":`*`}}):null}catch{return null}}function k(e){return e.mode===`navigate`||e.destination===`document`}async function A(e){let t=await fetch(e);if(t.headers.get(`Origin-Agent-Cluster`))return t;let n={};return t.headers.forEach((e,t)=>{n[t]=e}),n[`Origin-Agent-Cluster`]=`?1`,new Response(t.body,{status:t.status,statusText:t.statusText,headers:n})}let j=!1,M=[];function N(){j=!0;for(let e of M)e();M=[]}self.clients.matchAll({type:`window`}).then(e=>{e.length===0?N():(e.forEach(e=>e.postMessage({type:`request-proxy-config`})),setTimeout(N,2e3))}),self.addEventListener(`message`,e=>{e.data?.type===`set-proxy-config`?(C=!!e.data.payload?.useProxy,w=e.data.payload?.proxyUrl||`/proxy`,console.log(`fetch proxy: config updated`,{useProxy:C,proxyUrl:w}),N()):e.data?.type===`set-use-proxy`&&(C=!!e.data.payload?.useProxy,N())}),self.addEventListener(`fetch`,e=>{let t=new URL(e.request.url);if(t.origin===location.origin){if(k(e.request)){e.respondWith(A(e.request));return}if(m(t.pathname)&&E(e.request)){e.respondWith((async()=>await O(e.request)||fetch(e.request).catch(e=>(console.error(`fetch proxy fallback error:`,e),new Response(`Network error`,{status:502}))))());return}}y(t,location.origin,w)||t.protocol.startsWith(`http`)&&e.respondWith((async()=>{if(j||await new Promise(e=>M.push(e)),!C)return fetch(e.request);try{let t={};e.request.headers.forEach((e,n)=>{t[n]=e});let n;if(e.request.method!==`GET`&&e.request.method!==`HEAD`)try{n=await e.request.clone().text()}catch(e){console.error(`fetch proxy: error reading body text:`,e)}let r=new URL(w,location.origin);r.pathname=(r.pathname.endsWith(`/`)?``:`/`)+`proxy/`+e.request.url;let i={method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({url:e.request.url,method:e.request.method,headers:t,body:n})},a=r.hostname.toLowerCase();return a===`localhost`||a===`127.0.0.1`||a===`::1`||a===`[::1]`?i.targetAddressSpace=`loopback`:/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(a)&&(i.targetAddressSpace=`private`),await fetch(r.href,i)}catch(t){return console.error(`fetch proxy error:`,t),fetch(e.request).catch(e=>(console.error(`fetch proxy fallback error:`,e),new Response(`Network error`,{status:502})))}})())})})();
1
+ (function(){function e(e){return e.replace(/^\/+|\/+$/g,``)}function t(t){let n=e(t);return n.endsWith(`/index.html`)?n=n.slice(0,-11):n.endsWith(`index.html`)&&(n=n.slice(0,-10)),e(n)}function n(t){let n=e(t),r=n.split(`/`).filter(Boolean);if(r.length===0)return null;let i=r[0].toLowerCase();if(i===`pages`){if(r.length>=3){let e=r[1];return{page:`pages`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:r.slice(2).join(`/`)}}return{page:`pages`,groupId:`br:main`,path:r.slice(1).join(`/`)}}if(i===`files`){let e=r[1]||`main`;return{page:`files`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e,path:r.slice(2).join(`/`)||void 0}}if(i===`chat`){let e=r[1]||`main`;return{page:`chat`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}if(i===`tasks`){let e=r[1]||`main`;return{page:`tasks`,groupId:e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e}}return i===`main`?{page:`pages`,groupId:`br:main`,path:r.slice(1).join(`/`)}:{page:`pages`,groupId:`br:main`,path:n}}function r(){if(typeof document<`u`){let e=document.getElementById(`shadow-claw-static-routing`);if(e&&e.textContent)try{let t=JSON.parse(e.textContent);if(t&&typeof t==`object`&&t.routes)return t}catch(e){console.warn(`Failed to parse embedded static routing manifest:`,e)}}return null}function i(e,i){let a=i||r();if(!a||!a.routes)return null;let o=t(e);for(let[e,r]of Object.entries(a.routes))if(!(!r||!r.prettyPath)&&t(r.prettyPath)===o)return n(e);return null}function a(e){try{return decodeURIComponent(e)}catch{return e}}let o=null,s=new Set([`chat`,`files`,`tasks`,`pages`,`settings`,`tools`,`channels`]);function c(){o=null}typeof globalThis<`u`&&(globalThis.__applyBasePathCacheReset=c);function l(){let e=typeof window<`u`?window:typeof self<`u`?self:globalThis;if(e&&e.__SHADOWCLAW_DEPLOY_ID__){let t=String(e.__SHADOWCLAW_DEPLOY_ID__).trim();if(t)return t.replace(/[^a-zA-Z0-9_-]/g,`-`)}let t=globalThis.process;if(t&&t.env&&t.env.SHADOWCLAW_DEPLOY_ID){let e=String(t.env.SHADOWCLAW_DEPLOY_ID).trim();if(e)return e.replace(/[^a-zA-Z0-9_-]/g,`-`)}let n=u();return!n||n===`/`?``:n.replace(/^\/+|\/+$/g,``).replace(/[^a-zA-Z0-9_-]/g,`-`)}function u(){if(o!==null)return o;if((typeof window>`u`||globalThis.WorkerGlobalScope!==void 0&&typeof self<`u`&&self instanceof globalThis.WorkerGlobalScope)&&typeof self<`u`&&self.location){let e=(self.location.pathname||`/`).split(`/`).filter(Boolean);if(e.length<=1)return o=`/`,o;let t=e[0].toLowerCase(),n=t===`service-worker.js`||t===`sw.js`||t===`manifest.json`||t===`sitemap.xml`||t===`favicon.ico`||t===`index.html`||t===`service-worker`||t===`assets`||t===`dist`||t===`public`;if(n&&e.length===2)return o=`/`,o;if(!n)return o=`/`+e[0]+`/`,o}let e=typeof window<`u`&&window.location?window.location:typeof self<`u`&&self.location?self.location:null;if(!e)return`/`;if(typeof document<`u`&&typeof document.querySelector==`function`){let t=document.querySelector(`base[href]`);if(t){let n=t.getAttribute(`href`);if(n)try{let t=new URL(n,e.origin).pathname;return t.endsWith(`/`)||(t+=`/`),o=t,o}catch{}}}let t=e.pathname||`/`;if(t===`/`)return o=`/`,o;let n=t.split(`/`).filter(Boolean),r=n.findIndex(e=>s.has(e.toLowerCase()));return r>=0?r===0?(o=`/`,o):(o=`/`+n.slice(0,r).join(`/`)+`/`,o):i(t)?(o=`/`,o):n.length===1&&!t.includes(`.`)?(o=`/`+n[0]+`/`,o):(o=`/`,o)}function d(e){return e.replace(/^\/+|\/+$/g,``)}function f(e){return e&&(e===`main`?`br:main`:e.startsWith(`br-`)?`br:${e.slice(3)}`:e)}function p(e){if(!e)return;let t=d(e.replace(/\\/g,`/`));if(!t)return;let n=t.split(`/`).filter(Boolean).filter(e=>e!==`.`&&e!==`..`);if(n.length!==0)return n.join(`/`)}function m(e){let t=e,n=u();n!==`/`&&t.startsWith(n)&&(t=`/`+t.slice(n.length));let r=t.split(`/`).filter(Boolean).map(e=>a(e));if(r.length<3||r[0]!==`files`)return null;let i=f(r[1])||r[1],o=p(r.slice(2).join(`/`));return!i||!o?null:{groupId:i,path:o}}let h=[`cdnjs.cloudflare.com`,`esm.sh`,`unpkg.com`,`cdn.jsdelivr.net`,`esm.run`,`huggingface.co`,`hf.co`,`hf-mirror.com`],g=[`openrouter.ai`,`router.huggingface.co`,`api-inference.huggingface.co`,`api.telegram.org`],_=[`/api/control/`,`/api/backup/`,`/api/activity-log/`,`/api/health`,`/push/`,`/schedule/`,`/mcp`,`/ws/`,`/peerjs/`],v=[`.local`,`.lan`,`.home`,`.internal`];function y(e,t,n){if(e.origin===t)return!0;if(n)try{let r=new URL(n,t).origin;if(e.origin===r)return!0}catch{}let r=e.pathname;if(_.some(e=>r===e||r.startsWith(e)))return!0;let i=e.hostname.toLowerCase();return!!(h.includes(i)||i.endsWith(`.huggingface.co`)||i.endsWith(`.hf.co`)||i.endsWith(`.hf-mirror.com`)||i.endsWith(`.esm.sh`)||i.endsWith(`.jsdelivr.net`)||g.includes(i)||i.endsWith(`.openrouter.ai`)||i===`localhost`||i===`127.0.0.1`||i===`::1`||i===`[::1]`||/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(i)||!i.includes(`.`)||v.some(e=>i.endsWith(e)))}let b={apng:`image/apng`,avif:`image/avif`,bmp:`image/bmp`,gif:`image/gif`,heic:`image/heic`,heif:`image/heif`,ico:`image/x-icon`,jpeg:`image/jpeg`,jpg:`image/jpeg`,png:`image/png`,svg:`image/svg+xml`,tif:`image/tiff`,tiff:`image/tiff`,webp:`image/webp`,"3gp":`video/3gpp`,aac:`audio/aac`,avi:`video/x-msvideo`,bin:`application/octet-stream`,css:`text/css`,csv:`text/csv`,db:`application/vnd.sqlite3`,dll:`application/octet-stream`,dmg:`application/octet-stream`,dylib:`application/octet-stream`,exe:`application/vnd.microsoft.portable-executable`,flac:`audio/flac`,flv:`video/x-flv`,gz:`application/gzip`,htm:`text/html`,html:`text/html`,iso:`application/octet-stream`,js:`text/javascript`,json:`application/json`,m4a:`audio/mp4`,m4v:`video/mp4`,markdown:`text/markdown`,md:`text/markdown`,mjs:`text/javascript`,mkv:`video/x-matroska`,mov:`video/mp4`,mp3:`audio/mpeg`,mp4:`video/mp4`,oga:`audio/ogg`,ogg:`audio/ogg`,ogv:`video/ogg`,pdf:`application/pdf`,rar:`application/vnd.rar`,so:`application/octet-stream`,sqlite:`application/vnd.sqlite3`,sqlite3:`application/vnd.sqlite3`,tar:`application/x-tar`,ts:`text/typescript`,tsx:`text/typescript`,txt:`text/plain`,wasm:`application/wasm`,wav:`audio/wav`,weba:`audio/webm`,webm:`video/webm`,wmv:`video/x-ms-wmv`,xml:`application/xml`,yaml:`text/yaml`,yml:`text/yaml`,zip:`application/zip`};function x(e){return e&&(e.split(/[?#]/,1)[0].replace(/\\/g,`/`).split(`/`).pop()||``).toLowerCase().split(`.`).pop()||``}function S(e,t){let n=x(e);return b[n]??t}let C=!1,w=`/proxy`;function T(e){let t=S(e,`application/octet-stream`);return t.startsWith(`text/`)||t===`application/javascript`||t===`application/json`?`${t}; charset=utf-8`:t}function E(e){return!(e.method!==`GET`||e.mode===`navigate`||e.destination===`document`)}async function D(e,t){let n=navigator.storage;if(!n||typeof n.getDirectory!=`function`)return null;try{let r=await n.getDirectory(),i=l(),a=i?`shadowclaw-${i}`:`shadowclaw`,o=await(await r.getDirectoryHandle(a,{create:!0})).getDirectoryHandle(`groups`,{create:!0}),s=e.replace(/:/g,`-`),c=await o.getDirectoryHandle(s,{create:!1}),u=t.split(`/`).filter(Boolean);if(u.length===0)return null;let d=u.pop();if(!d)return null;let f=c;for(let e of u)f=await f.getDirectoryHandle(e,{create:!1});return await(await f.getFileHandle(d,{create:!1})).getFile()}catch{return null}}async function O(e){let t=m(new URL(e.url).pathname);if(!t||!E(e))return null;try{let e=await D(t.groupId,t.path);return e?new Response(e,{status:200,headers:{"Content-Type":e.type||T(t.path),"Content-Length":String(e.size),"Cache-Control":`no-store`,"Access-Control-Allow-Origin":`*`}}):null}catch{return null}}function k(e){return e.mode===`navigate`||e.destination===`document`}async function A(e){let t=await fetch(e);if(t.headers.get(`Origin-Agent-Cluster`))return t;let n={};return t.headers.forEach((e,t)=>{n[t]=e}),n[`Origin-Agent-Cluster`]=`?1`,new Response(t.body,{status:t.status,statusText:t.statusText,headers:n})}let j=!1,M=[];function N(){j=!0;for(let e of M)e();M=[]}self.clients.matchAll({type:`window`}).then(e=>{e.length===0?N():(e.forEach(e=>e.postMessage({type:`request-proxy-config`})),setTimeout(N,2e3))}),self.addEventListener(`message`,e=>{e.data?.type===`set-proxy-config`?(C=!!e.data.payload?.useProxy,w=e.data.payload?.proxyUrl||`/proxy`,console.log(`fetch proxy: config updated`,{useProxy:C,proxyUrl:w}),N()):e.data?.type===`set-use-proxy`&&(C=!!e.data.payload?.useProxy,N())}),self.addEventListener(`fetch`,e=>{let t=new URL(e.request.url);if(t.origin===location.origin){if(k(e.request)){e.respondWith(A(e.request));return}if(m(t.pathname)&&E(e.request)){e.respondWith((async()=>await O(e.request)||fetch(e.request).catch(e=>(console.error(`fetch proxy fallback error:`,e),new Response(`Network error`,{status:502}))))());return}}y(t,location.origin,w)||t.protocol.startsWith(`http`)&&e.respondWith((async()=>{if(j||await new Promise(e=>M.push(e)),!C)return fetch(e.request);try{let t={};e.request.headers.forEach((e,n)=>{t[n]=e});let n;if(e.request.method!==`GET`&&e.request.method!==`HEAD`)try{n=await e.request.clone().text()}catch(e){console.error(`fetch proxy: error reading body text:`,e)}let r=new URL(w,location.origin);r.pathname=(r.pathname.endsWith(`/`)?``:`/`)+`proxy/`+e.request.url;let i={method:`POST`,headers:{"Content-Type":`application/json`},body:JSON.stringify({url:e.request.url,method:e.request.method,headers:t,body:n})},a=r.hostname.toLowerCase();return a===`localhost`||a===`127.0.0.1`||a===`::1`||a===`[::1]`?i.targetAddressSpace=`loopback`:/^(10\.|172\.(1[6-9]|2\d|3[01])\.|192\.168\.)/.test(a)&&(i.targetAddressSpace=`private`),await fetch(r.href,i)}catch(t){return console.error(`fetch proxy error:`,t),fetch(e.request).catch(e=>(console.error(`fetch proxy fallback error:`,e),new Response(`Network error`,{status:502})))}})())})})();