shadow-claw 1.51.0 → 1.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/.well-known/mcp/server-card.json +1 -1
  2. package/.well-known/mcp.json +1 -1
  3. package/README.md +1 -1
  4. package/dist/cli/{chunk-Dtse8rAn.js → chunk-5ryVpyup.js} +1 -1
  5. package/dist/cli/chunk-Aq3057Xo.js +1 -0
  6. package/dist/cli/{chunk-4CZJpLqA.js → chunk-BV9JBYpl.js} +2 -2
  7. package/dist/cli/{chunk-mbFAP9Ev.js → chunk-BZI3bWDA.js} +1 -1
  8. package/dist/cli/chunk-BaUCHRPD.js +1 -0
  9. package/dist/cli/{chunk-vzUrhBN5.js → chunk-BdbEt6gM.js} +1 -1
  10. package/dist/cli/{chunk-BU8UG4L_.js → chunk-BiWLawPV.js} +1 -1
  11. package/dist/cli/chunk-BkLnHJeo.js +1 -0
  12. package/dist/cli/{chunk-BqfPWIBf.js → chunk-BzWY1sKE.js} +1 -1
  13. package/dist/cli/{chunk-DajM7Kro.js → chunk-C79eIU-4.js} +1 -1
  14. package/dist/cli/{chunk-CI9r1AM5.js → chunk-CDw214Zi.js} +1 -1
  15. package/dist/cli/chunk-CNqc7LLn.js +1 -0
  16. package/dist/cli/{chunk-CEhU-Ah-.js → chunk-CWW7dqIv.js} +1 -1
  17. package/dist/cli/{chunk-BT_C3OlA.js → chunk-CcSTYHtR.js} +1 -1
  18. package/dist/cli/chunk-ClOfk6Ga.js +1 -0
  19. package/dist/cli/chunk-ComXUwW0.js +1 -0
  20. package/dist/cli/{chunk-lL1BhHVe.js → chunk-CooeO4UQ.js} +1 -1
  21. package/dist/cli/{chunk-khr7--yI.js → chunk-CtfWY4G6.js} +1 -1
  22. package/dist/cli/{chunk-C4iW1XuQ.js → chunk-DFgSiYMW.js} +1 -1
  23. package/dist/cli/chunk-DGBnjngK.js +1 -0
  24. package/dist/cli/{chunk-D7bFIUK3.js → chunk-DGu1OhJs.js} +1 -1
  25. package/dist/cli/{chunk-CzfOerQR.js → chunk-DIjCY0Wf.js} +1 -1
  26. package/dist/cli/{chunk-D-iqEY5G.js → chunk-DJ_LeQtz.js} +1 -1
  27. package/dist/cli/{chunk-BmEsDkRK.js → chunk-DQRu-9wO.js} +1 -1
  28. package/dist/cli/{chunk-DojiYody.js → chunk-DToVgO9a.js} +1 -1
  29. package/dist/cli/{chunk-De5a_Rlp.js → chunk-DVbNkQRL.js} +1 -1
  30. package/dist/cli/{chunk-c8MIYB2y.js → chunk-Ddtzaj43.js} +1 -1
  31. package/dist/cli/{chunk-aJ6fufe-.js → chunk-DiqS56rD.js} +1 -1
  32. package/dist/cli/{chunk-CeUEmZNt.js → chunk-DnRcu9b4.js} +1 -1
  33. package/dist/cli/chunk-DtgZDsJA.js +1 -0
  34. package/dist/cli/{chunk-DVMcK7g6.js → chunk-Du4qvxo_.js} +2 -2
  35. package/dist/cli/{chunk-CegcvNc9.js → chunk-Dz5_hgvL.js} +8 -8
  36. package/dist/cli/{chunk-Cd4Dv5Eq.js → chunk-I3mxEelq.js} +1 -1
  37. package/dist/cli/{chunk-Do3VICh1.js → chunk-IU2SH_ti.js} +1 -1
  38. package/dist/cli/{chunk-BQveaAaD.js → chunk-NC8XsSSA.js} +1 -1
  39. package/dist/cli/{chunk-D702W_Ry.js → chunk-Q4BZ9QN9.js} +1 -1
  40. package/dist/cli/chunk-WTlDd4Ou.js +1 -0
  41. package/dist/cli/chunk-XGzq5joC.js +1 -0
  42. package/dist/cli/{chunk-ar7eAlxK.js → chunk-aJfaGe2s.js} +8 -8
  43. package/dist/cli/chunk-bPVrFlmk.js +1 -0
  44. package/dist/cli/chunk-jXJHKxdR.js +1 -0
  45. package/dist/cli/{chunk-C3dTAmV_.js → chunk-rstVU7U0.js} +1 -1
  46. package/dist/cli/{chunk-DGfTzQui.js → chunk-t72uObQ7.js} +1 -1
  47. package/dist/cli/{chunk-DDgfljzN.js → chunk-vq8xlroY.js} +1 -1
  48. package/dist/cli/cli.js +1 -1
  49. package/dist/headless-agent.js +1 -1
  50. package/dist/lib/components/common/shadow-claw-provider-model-picker.js +1 -1
  51. package/dist/lib/components/index.js +27 -27
  52. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  53. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  54. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  55. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  56. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  57. package/dist/lib/components/settings/shadow-claw-llm/model-ranking.d.ts +12 -0
  58. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  59. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  60. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  61. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  62. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  63. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  64. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  65. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  66. package/dist/lib/components/shadow-claw-a2ui.js +1 -1
  67. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  68. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  69. package/dist/lib/components/shadow-claw-channels.js +1 -1
  70. package/dist/lib/components/shadow-claw-chat/shadow-claw-chat.d.ts +1 -0
  71. package/dist/lib/components/shadow-claw-chat.js +1 -1
  72. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  73. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  74. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  75. package/dist/lib/components/shadow-claw-files.js +1 -1
  76. package/dist/lib/components/shadow-claw-git.js +1 -1
  77. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  78. package/dist/lib/components/shadow-claw-llm.js +1 -1
  79. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  80. package/dist/lib/components/shadow-claw-networking.js +1 -1
  81. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  82. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  83. package/dist/lib/components/shadow-claw-pages.js +1 -1
  84. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  85. package/dist/lib/components/shadow-claw-provider-model-picker.js +1 -1
  86. package/dist/lib/components/shadow-claw-settings.js +1 -1
  87. package/dist/lib/components/shadow-claw-storage.js +1 -1
  88. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  89. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  90. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  91. package/dist/lib/components/shadow-claw-tools.js +1 -1
  92. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  93. package/dist/lib/components/shadow-claw.js +1 -1
  94. package/dist/lib/config/config.d.ts +2 -1
  95. package/dist/lib/{config-DxDaVDTn.js → config-DFLs7eoC.js} +3 -2
  96. package/dist/lib/config-DFLs7eoC.js.map +1 -0
  97. package/dist/lib/{configurePeerJs-ScwZiGbF.js → configurePeerJs-DJ0H6e6s.js} +3 -3
  98. package/dist/lib/{configurePeerJs-ScwZiGbF.js.map → configurePeerJs-DJ0H6e6s.js.map} +1 -1
  99. package/dist/lib/{connections-D82zele0.js → connections-DT3nPylw.js} +2 -2
  100. package/dist/lib/{connections-D82zele0.js.map → connections-DT3nPylw.js.map} +1 -1
  101. package/dist/lib/{downloadGroupFile-D7-5y6NI.js → downloadGroupFile-DMnAiPj4.js} +2 -2
  102. package/dist/lib/{downloadGroupFile-D7-5y6NI.js.map → downloadGroupFile-DMnAiPj4.js.map} +1 -1
  103. package/dist/lib/{file-viewer-BMvvndPQ.js → file-viewer-OHmGC_l7.js} +5 -5
  104. package/dist/lib/{file-viewer-BMvvndPQ.js.map → file-viewer-OHmGC_l7.js.map} +1 -1
  105. package/dist/lib/{getGroupDir-BidwYPfP.js → getGroupDir-mTV2Iz2b.js} +3 -3
  106. package/dist/lib/{getGroupDir-BidwYPfP.js.map → getGroupDir-mTV2Iz2b.js.map} +1 -1
  107. package/dist/lib/{git-CXmWufWS.js → git-CGdKghMC.js} +3 -3
  108. package/dist/lib/{git-CXmWufWS.js.map → git-CGdKghMC.js.map} +1 -1
  109. package/dist/lib/index.js +28 -28
  110. package/dist/lib/{initChatSplitResize-tvUZ-wsp.js → initChatSplitResize-B8zHHQdm.js} +2 -2
  111. package/dist/lib/{initChatSplitResize-tvUZ-wsp.js.map → initChatSplitResize-B8zHHQdm.js.map} +1 -1
  112. package/dist/lib/{initControlPlane-Dnjkb-6J.js → initControlPlane-BczrlTf3.js} +14 -14
  113. package/dist/lib/{initControlPlane-Dnjkb-6J.js.map → initControlPlane-BczrlTf3.js.map} +1 -1
  114. package/dist/lib/{markdown-WCXar9C8.js → markdown-D-7Cjyye.js} +3 -3
  115. package/dist/lib/{markdown-WCXar9C8.js.map → markdown-D-7Cjyye.js.map} +1 -1
  116. package/dist/lib/{mcp-reconnect-WTOQONHZ.js → mcp-reconnect-Czf7QCCv.js} +2 -2
  117. package/dist/lib/{mcp-reconnect-WTOQONHZ.js.map → mcp-reconnect-Czf7QCCv.js.map} +1 -1
  118. package/dist/lib/{memoryStorage-Bo2Wpfmg.js → memoryStorage-CXyKsKMo.js} +2 -2
  119. package/dist/lib/{memoryStorage-Bo2Wpfmg.js.map → memoryStorage-CXyKsKMo.js.map} +1 -1
  120. package/dist/lib/model-ranking-Bo8CpGH1.js +116 -0
  121. package/dist/lib/model-ranking-Bo8CpGH1.js.map +1 -0
  122. package/dist/lib/{orchestrator-Crw4btGn.js → orchestrator-BK138MkV.js} +10 -10
  123. package/dist/lib/{orchestrator-Crw4btGn.js.map → orchestrator-BK138MkV.js.map} +1 -1
  124. package/dist/lib/{orchestrator-Dro541iH.js → orchestrator-BtbxiPQB.js} +17 -16
  125. package/dist/lib/{orchestrator-Dro541iH.js.map → orchestrator-BtbxiPQB.js.map} +1 -1
  126. package/dist/lib/{peerjs-D741bHrf.js → peerjs-QJr03K9F.js} +7 -7
  127. package/dist/lib/{peerjs-D741bHrf.js.map → peerjs-QJr03K9F.js.map} +1 -1
  128. package/dist/lib/{prompt-api-D9XdrCep.js → prompt-api-vf351sf2.js} +2 -19
  129. package/dist/lib/{prompt-api-D9XdrCep.js.map → prompt-api-vf351sf2.js.map} +1 -1
  130. package/dist/lib/{push-client-DKFUY_Ti.js → push-client-BOHgqHbk.js} +4 -4
  131. package/dist/lib/{push-client-DKFUY_Ti.js.map → push-client-BOHgqHbk.js.map} +1 -1
  132. package/dist/lib/{readGroupFileBytes-C8Xqlb8l.js → readGroupFileBytes-CRA6dmgT.js} +2 -2
  133. package/dist/lib/{readGroupFileBytes-C8Xqlb8l.js.map → readGroupFileBytes-CRA6dmgT.js.map} +1 -1
  134. package/dist/lib/{shadow-claw-a2ui-CPydWVdW.js → shadow-claw-a2ui-DbZa4Gxp.js} +2 -2
  135. package/dist/lib/{shadow-claw-a2ui-CPydWVdW.js.map → shadow-claw-a2ui-DbZa4Gxp.js.map} +1 -1
  136. package/dist/lib/{shadow-claw-accounts-CUypXc3I.js → shadow-claw-accounts-B6OW2NVD.js} +3 -3
  137. package/dist/lib/{shadow-claw-accounts-CUypXc3I.js.map → shadow-claw-accounts-B6OW2NVD.js.map} +1 -1
  138. package/dist/lib/{shadow-claw-channel-config-D_Vb2ous.js → shadow-claw-channel-config-F_EJ-uK2.js} +3 -3
  139. package/dist/lib/{shadow-claw-channel-config-D_Vb2ous.js.map → shadow-claw-channel-config-F_EJ-uK2.js.map} +1 -1
  140. package/dist/lib/{shadow-claw-channels-hgjjzvRr.js → shadow-claw-channels-XYylMpjg.js} +3 -3
  141. package/dist/lib/{shadow-claw-channels-hgjjzvRr.js.map → shadow-claw-channels-XYylMpjg.js.map} +1 -1
  142. package/dist/lib/{shadow-claw-chat-D69IiLXd.js → shadow-claw-chat-dbK_DGO_.js} +124 -38
  143. package/dist/lib/shadow-claw-chat-dbK_DGO_.js.map +1 -0
  144. package/dist/lib/{shadow-claw-control-plane-zBYlFvzQ.js → shadow-claw-control-plane-BJKkmahQ.js} +7 -7
  145. package/dist/lib/{shadow-claw-control-plane-zBYlFvzQ.js.map → shadow-claw-control-plane-BJKkmahQ.js.map} +1 -1
  146. package/dist/lib/{shadow-claw-conversations-1GW8_e8o.js → shadow-claw-conversations-BKSsMYTc.js} +6 -6
  147. package/dist/lib/{shadow-claw-conversations-1GW8_e8o.js.map → shadow-claw-conversations-BKSsMYTc.js.map} +1 -1
  148. package/dist/lib/{shadow-claw-D3z3tFyE.js → shadow-claw-eBB2dbpd.js} +11 -11
  149. package/dist/lib/{shadow-claw-D3z3tFyE.js.map → shadow-claw-eBB2dbpd.js.map} +1 -1
  150. package/dist/lib/{shadow-claw-file-viewer-DI4r7Th9.js → shadow-claw-file-viewer-BqChtTvM.js} +8 -8
  151. package/dist/lib/{shadow-claw-file-viewer-DI4r7Th9.js.map → shadow-claw-file-viewer-BqChtTvM.js.map} +1 -1
  152. package/dist/lib/{shadow-claw-files-BM7qW3TW.js → shadow-claw-files-Bu7VCQw6.js} +9 -9
  153. package/dist/lib/{shadow-claw-files-BM7qW3TW.js.map → shadow-claw-files-Bu7VCQw6.js.map} +1 -1
  154. package/dist/lib/{shadow-claw-git-BBTiTYIn.js → shadow-claw-git-CdPPN6Qb.js} +6 -6
  155. package/dist/lib/{shadow-claw-git-BBTiTYIn.js.map → shadow-claw-git-CdPPN6Qb.js.map} +1 -1
  156. package/dist/lib/{shadow-claw-integrations-DTY3E545.js → shadow-claw-integrations-DehqBSRe.js} +4 -4
  157. package/dist/lib/{shadow-claw-integrations-DTY3E545.js.map → shadow-claw-integrations-DehqBSRe.js.map} +1 -1
  158. package/dist/lib/{shadow-claw-llm-AJwzkOGo.js → shadow-claw-llm-COZkufA8.js} +13 -11
  159. package/dist/lib/shadow-claw-llm-COZkufA8.js.map +1 -0
  160. package/dist/lib/{shadow-claw-mcp-remote-n7YXKxmv.js → shadow-claw-mcp-remote-axF50-le.js} +4 -4
  161. package/dist/lib/{shadow-claw-mcp-remote-n7YXKxmv.js.map → shadow-claw-mcp-remote-axF50-le.js.map} +1 -1
  162. package/dist/lib/{shadow-claw-networking-B3leDgZ4.js → shadow-claw-networking-BT_Rxj36.js} +2 -2
  163. package/dist/lib/{shadow-claw-networking-B3leDgZ4.js.map → shadow-claw-networking-BT_Rxj36.js.map} +1 -1
  164. package/dist/lib/{shadow-claw-notifications-Bm2aHQ0U.js → shadow-claw-notifications-ClqAXDDN.js} +3 -3
  165. package/dist/lib/{shadow-claw-notifications-Bm2aHQ0U.js.map → shadow-claw-notifications-ClqAXDDN.js.map} +1 -1
  166. package/dist/lib/{shadow-claw-page-header-BBqSWlhP.js → shadow-claw-page-header-bigC_h6U.js} +2 -2
  167. package/dist/lib/{shadow-claw-page-header-BBqSWlhP.js.map → shadow-claw-page-header-bigC_h6U.js.map} +1 -1
  168. package/dist/lib/{shadow-claw-pages-BFOcluFY.js → shadow-claw-pages-kA2qa-4B.js} +9 -9
  169. package/dist/lib/{shadow-claw-pages-BFOcluFY.js.map → shadow-claw-pages-kA2qa-4B.js.map} +1 -1
  170. package/dist/lib/{shadow-claw-peerjs-BvD_MH_l.js → shadow-claw-peerjs-CvcH2DkA.js} +3 -3
  171. package/dist/lib/{shadow-claw-peerjs-BvD_MH_l.js.map → shadow-claw-peerjs-CvcH2DkA.js.map} +1 -1
  172. package/dist/lib/{shadow-claw-provider-model-picker-CsA-507a.js → shadow-claw-provider-model-picker-fcVQdDtQ.js} +2 -2
  173. package/dist/lib/{shadow-claw-provider-model-picker-CsA-507a.js.map → shadow-claw-provider-model-picker-fcVQdDtQ.js.map} +1 -1
  174. package/dist/lib/{shadow-claw-settings-CZgGMz0a.js → shadow-claw-settings-CkO6JjA4.js} +6 -6
  175. package/dist/lib/{shadow-claw-settings-CZgGMz0a.js.map → shadow-claw-settings-CkO6JjA4.js.map} +1 -1
  176. package/dist/lib/{shadow-claw-storage-BTUpEKO0.js → shadow-claw-storage-10w-y8vL.js} +5 -5
  177. package/dist/lib/{shadow-claw-storage-BTUpEKO0.js.map → shadow-claw-storage-10w-y8vL.js.map} +1 -1
  178. package/dist/lib/{shadow-claw-task-server-B1X2AYyZ.js → shadow-claw-task-server-U98sZxPu.js} +2 -2
  179. package/dist/lib/{shadow-claw-task-server-B1X2AYyZ.js.map → shadow-claw-task-server-U98sZxPu.js.map} +1 -1
  180. package/dist/lib/{shadow-claw-tasks-BYtaRUAd.js → shadow-claw-tasks-DrSVUOsP.js} +8 -8
  181. package/dist/lib/{shadow-claw-tasks-BYtaRUAd.js.map → shadow-claw-tasks-DrSVUOsP.js.map} +1 -1
  182. package/dist/lib/{shadow-claw-terminal-LGuXKu77.js → shadow-claw-terminal-B7HYLuce.js} +2 -2
  183. package/dist/lib/{shadow-claw-terminal-LGuXKu77.js.map → shadow-claw-terminal-B7HYLuce.js.map} +1 -1
  184. package/dist/lib/{shadow-claw-tools-C_S-xXVG.js → shadow-claw-tools-BKrXzZfF.js} +7 -7
  185. package/dist/lib/{shadow-claw-tools-C_S-xXVG.js.map → shadow-claw-tools-BKrXzZfF.js.map} +1 -1
  186. package/dist/lib/{shadow-claw-webvm-Cab1n1bu.js → shadow-claw-webvm-Duwa5oiW.js} +3 -3
  187. package/dist/lib/{shadow-claw-webvm-Cab1n1bu.js.map → shadow-claw-webvm-Duwa5oiW.js.map} +1 -1
  188. package/dist/lib/{syncWebMcpRegistration-Dy5NS_4G.js → syncWebMcpRegistration-BOx-0F6_.js} +5 -5
  189. package/dist/lib/{syncWebMcpRegistration-Dy5NS_4G.js.map → syncWebMcpRegistration-BOx-0F6_.js.map} +1 -1
  190. package/dist/lib/{tools-B7gC1eb_.js → tools-BEuBatUs.js} +4 -4
  191. package/dist/lib/{tools-B7gC1eb_.js.map → tools-BEuBatUs.js.map} +1 -1
  192. package/dist/lib/utils/index.js +1 -1
  193. package/dist/lib/utils/utils.js +1 -1
  194. package/dist/lib/{utils-D_ylqOY-.js → utils-D8AxCH6m.js} +2 -2
  195. package/dist/lib/{utils-D_ylqOY-.js.map → utils-D8AxCH6m.js.map} +1 -1
  196. package/dist/lib/{webmcp-CkYINKJj.js → webmcp-BjfVWX1K.js} +2 -2
  197. package/dist/lib/{webmcp-CkYINKJj.js.map → webmcp-BjfVWX1K.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/README.md +1 -1
  201. package/dist/public/agent.worker.js +1 -1
  202. package/dist/public/components/shadow-claw-chat/shadow-claw-chat.html +1 -1
  203. package/dist/public/config-071HSho8.js +1 -0
  204. package/dist/public/{configurePeerJs-DQQ6YL-5.js → configurePeerJs-DL-LurJY.js} +1 -1
  205. package/dist/public/{connections-CRNk2FxF.js → connections-Bb0rBpV-.js} +1 -1
  206. package/dist/public/{custom-element-security-3_FKCXcg.js → custom-element-security-Td4vrRc_.js} +1 -1
  207. package/dist/public/docs/example/article/index.html +1 -1
  208. package/dist/public/docs/example/article.html +1 -1
  209. package/dist/public/docs/publishing/index.html +1 -1
  210. package/dist/public/docs/publishing.html +1 -1
  211. package/dist/public/docs/skill-creator/index.html +1 -1
  212. package/dist/public/docs/skill-creator.html +1 -1
  213. package/dist/public/docs/subsystems/providers.md +1 -1
  214. package/dist/public/{downloadGroupFile-wkdhVgrZ.js → downloadGroupFile-Unq8_7D9.js} +1 -1
  215. package/dist/public/{e2e-bridge-DnFHPuwg.js → e2e-bridge-Dbc9fCDq.js} +1 -1
  216. package/dist/public/{file-viewer-C92v4Ggd.js → file-viewer-QkCuknFn.js} +1 -1
  217. package/dist/public/{getGroupDir-BGGIJL4Y.js → getGroupDir-Bj5XCflQ.js} +1 -1
  218. package/dist/public/{git-BH6qyToB.js → git-Bhz4YHc8.js} +2 -2
  219. package/dist/public/index.html +1 -1
  220. package/dist/public/index.js +1 -1
  221. package/dist/public/{initChatSplitResize--RH5kzVF.js → initChatSplitResize-KNL9Oh7s.js} +1 -1
  222. package/dist/public/{initControlPlane-yPJ3ajkj.js → initControlPlane-D2fVhRFC.js} +1 -1
  223. package/dist/public/main/index.html +1 -1
  224. package/dist/public/main/memory/index.html +1 -1
  225. package/dist/public/main/memory.html +1 -1
  226. package/dist/public/main.html +1 -1
  227. package/dist/public/{markdown-CA0v11cd.js → markdown-By6gdUvF.js} +1 -1
  228. package/dist/public/{mcp-reconnect-uyNSigzu.js → mcp-reconnect-CDRJPuoN.js} +1 -1
  229. package/dist/public/{memoryStorage-DjPNAT5t.js → memoryStorage-C-ao9y-j.js} +1 -1
  230. package/dist/public/model-ranking-DUdrFOcC.js +1 -0
  231. package/dist/public/{orchestrator-DTzgyL23.js → orchestrator-B7MpomoG.js} +2 -2
  232. package/dist/public/{orchestrator-Cmr69pMC.js → orchestrator-C8aIHbDy.js} +2 -2
  233. package/dist/public/{peerjs-Br38mUFC.js → peerjs-DwGjY5VX.js} +1 -1
  234. package/dist/public/prompt-api-BWe_j3Wg.js +1 -0
  235. package/dist/public/{push-client-CB8haOGC.js → push-client-o8g5_EOe.js} +1 -1
  236. package/dist/public/service-worker.js +1 -1
  237. package/dist/public/{shadow-claw-RuFQ2Ej5.js → shadow-claw-Ba2ZFE9m.js} +2 -2
  238. package/dist/public/{shadow-claw-accounts-BMsEItB6.js → shadow-claw-accounts-BbNPiiaV.js} +1 -1
  239. package/dist/public/{shadow-claw-channels-Q_AXuEaI.js → shadow-claw-channels-CHGtPkfY.js} +1 -1
  240. package/dist/public/{shadow-claw-chat-DZQ3OaH7.js → shadow-claw-chat-3TmjJA6-.js} +90 -23
  241. package/dist/public/{shadow-claw-control-plane-CyXA8tB8.js → shadow-claw-control-plane-BAFT06LL.js} +2 -2
  242. package/dist/public/{shadow-claw-conversations-BLKtlvHe.js → shadow-claw-conversations-DsQ_kxWm.js} +1 -1
  243. package/dist/public/{shadow-claw-file-viewer-CVLDfpZe.js → shadow-claw-file-viewer-hBxTknL2.js} +1 -1
  244. package/dist/public/{shadow-claw-files-DB6VVjir.js → shadow-claw-files-Daw6IIrJ.js} +1 -1
  245. package/dist/public/{shadow-claw-git-D57bTSMF.js → shadow-claw-git-CxGwyxim.js} +2 -2
  246. package/dist/public/{shadow-claw-integrations-BOwhUY-4.js → shadow-claw-integrations-DnIr6xp-.js} +1 -1
  247. package/dist/public/{shadow-claw-llm-CYenm-mm.js → shadow-claw-llm-Bc6tZ8kk.js} +3 -3
  248. package/dist/public/{shadow-claw-mcp-remote-CJ-Ckl0j.js → shadow-claw-mcp-remote-nGPpFpI-.js} +1 -1
  249. package/dist/public/{shadow-claw-networking-Cut76YQL.js → shadow-claw-networking-B6YgtiA7.js} +1 -1
  250. package/dist/public/{shadow-claw-notifications-C3kYCrIa.js → shadow-claw-notifications-BSxifptS.js} +1 -1
  251. package/dist/public/{shadow-claw-page-header-Dd7QafUk.js → shadow-claw-page-header-LzVgEn46.js} +1 -1
  252. package/dist/public/{shadow-claw-pages-BWtVtwTG.js → shadow-claw-pages-Cy6T0G9y.js} +1 -1
  253. package/dist/public/{shadow-claw-settings-Bj7jnngO.js → shadow-claw-settings-DGkwt1ge.js} +2 -2
  254. package/dist/public/{shadow-claw-storage-CMSzQs1-.js → shadow-claw-storage-DX_4T7KR.js} +1 -1
  255. package/dist/public/{shadow-claw-task-server-CFclo7UX.js → shadow-claw-task-server-DTsbEs5z.js} +1 -1
  256. package/dist/public/{shadow-claw-tasks-ClDdeB6Z.js → shadow-claw-tasks-rr6fMxAM.js} +1 -1
  257. package/dist/public/{shadow-claw-terminal-3ysWZJix.js → shadow-claw-terminal-C7DhrrX6.js} +1 -1
  258. package/dist/public/{shadow-claw-tools-DQVwpTcZ.js → shadow-claw-tools-DcQroojH.js} +1 -1
  259. package/dist/public/{shadow-claw-webvm-Cnxz04Fk.js → shadow-claw-webvm-bZj44Did.js} +1 -1
  260. package/dist/public/{syncWebMcpRegistration-QwnLMAK3.js → syncWebMcpRegistration-XJjIlDNO.js} +1 -1
  261. package/dist/public/{tools-DvQ_ngXn.js → tools-BpZh7hgB.js} +1 -1
  262. package/dist/public/{webmcp-CJymew4t.js → webmcp-CkfDZfZ0.js} +1 -1
  263. package/dist/server.js +1 -1
  264. package/package.json +1 -1
  265. package/src/components/settings/shadow-claw-llm/model-ranking.test.ts +121 -7
  266. package/src/components/settings/shadow-claw-llm/model-ranking.ts +97 -0
  267. package/src/components/settings/shadow-claw-llm/shadow-claw-llm.test.ts +35 -0
  268. package/src/components/settings/shadow-claw-llm/shadow-claw-llm.ts +15 -5
  269. package/src/components/shadow-claw-chat/shadow-claw-chat.html +81 -14
  270. package/src/components/shadow-claw-chat/shadow-claw-chat.test.ts +73 -0
  271. package/src/components/shadow-claw-chat/shadow-claw-chat.trusted-types.test.ts +3 -0
  272. package/src/components/shadow-claw-chat/shadow-claw-chat.ts +79 -32
  273. package/src/config/config.test.ts +4 -4
  274. package/src/config/config.ts +2 -1
  275. package/src/core/orchestrator/orchestrator.test.ts +2 -1
  276. package/src/core/orchestrator/utils/initTasks.ts +5 -4
  277. package/dist/cli/chunk-B3S061IE.js +0 -1
  278. package/dist/cli/chunk-BUJdF9o3.js +0 -1
  279. package/dist/cli/chunk-BX0R2gIY.js +0 -1
  280. package/dist/cli/chunk-BoiPfhwJ.js +0 -1
  281. package/dist/cli/chunk-BtJYj7vB.js +0 -1
  282. package/dist/cli/chunk-BwXrZVeU.js +0 -1
  283. package/dist/cli/chunk-CaWh9Pru.js +0 -1
  284. package/dist/cli/chunk-Ck4ePI8z.js +0 -1
  285. package/dist/cli/chunk-Ctg-SXcP.js +0 -1
  286. package/dist/cli/chunk-DTKv1-tk.js +0 -1
  287. package/dist/cli/chunk-DdYpd9Nu.js +0 -1
  288. package/dist/cli/chunk-DflhmBY2.js +0 -1
  289. package/dist/lib/config-DxDaVDTn.js.map +0 -1
  290. package/dist/lib/model-ranking-CDXs7hkK.js +0 -57
  291. package/dist/lib/model-ranking-CDXs7hkK.js.map +0 -1
  292. package/dist/lib/shadow-claw-chat-D69IiLXd.js.map +0 -1
  293. package/dist/lib/shadow-claw-llm-AJwzkOGo.js.map +0 -1
  294. package/dist/public/config-Dqn5OMfC.js +0 -1
  295. package/dist/public/model-ranking-DLIC9IDU.js +0 -1
  296. package/dist/public/prompt-api-B-8N-MRY.js +0 -11
@@ -1,4 +1,4 @@
1
- import{i as e}from"./chunk-C4iW1XuQ.js";import{t}from"./chunk-DGfTzQui.js";import{t as n}from"./chunk-khr7--yI.js";import{i as r,n as i,r as a,t as o}from"./chunk-CzfOerQR.js";import s from"node:fs";import c from"node:path";import l from"node:process";import{access as u,constants as d,mkdir as f,mkdtemp as p,readFile as m,writeFile as h}from"node:fs/promises";import{tmpdir as g}from"node:os";import _ from"node:readline/promises";import v from"node:tty";function y(){let e=l.emitWarning;if(!e||e.__suppressed)return;let t=function(t,...n){if((typeof t!=`string`||n[0]!==`ExperimentalWarning`&&!t.includes(`ExperimentalWarning`)&&!t.includes(`SQLite`))&&!(t&&typeof t==`object`&&(t.name===`ExperimentalWarning`||typeof t.message==`string`&&t.message.includes(`SQLite`))))return e.call(l,t,...n)};t.__suppressed=!0,l.emitWarning=t}y();const b=[`shadow-claw.config.json`,`shadow-claw-config.json`,`shadowclaw.config.json`,`site-config.json`];async function x(e){try{return await u(e,d.F_OK),!0}catch{return!1}}async function S(e,t){let n=[];if(e&&n.push(c.resolve(e)),t){let e=c.resolve(t);n.includes(e)||n.push(e)}if(e&&c.basename(c.resolve(e))===`.cache`){let t=c.dirname(c.resolve(e));n.includes(t)||n.push(t)}for(let e of n)for(let t of b){let n=c.join(e,t);if(await x(n))try{let e=await m(n,`utf8`),t=JSON.parse(e);if(t&&typeof t==`object`)return{configPath:n,config:t}}catch{}}return null}function C(){return c.join(g(),`shadow-claw`)}function w(e){let t=c.resolve(e||l.cwd()),n=[c.join(t,`shadow-claw-config.json`),c.join(t,`shadow-claw.config.json`),c.join(t,`shadowclaw.config.json`),c.join(t,`pages`,`shadow-claw-config.json`),c.join(t,`pages`,`shadow-claw.config.json`),c.join(t,`site-config.json`),c.join(t,`pages`,`site-config.json`)];for(let e of n)if(s.existsSync(e))try{let n=s.readFileSync(e,`utf8`),r=JSON.parse(n);if(r&&typeof r.cacheDir==`string`&&r.cacheDir.trim())return c.resolve(t,r.cacheDir.trim());if(r&&r.server&&typeof r.server.cacheDir==`string`&&r.server.cacheDir.trim())return c.resolve(t,r.server.cacheDir.trim())}catch{}return null}function T(e,t=`.cache`){let n=c.resolve(e||l.cwd()),r=c.join(n,t),i=c.join(r,`database`),a=[r,c.join(r,`control-token.json`),c.join(r,`cli-peer-id`),i,c.join(i,`clients.db`),c.join(i,`agent.db`),c.join(i,`scheduled-tasks.db`),c.join(i,`push-subscriptions.db`),c.join(n,`database`,`clients.db`),c.join(n,`database`,`agent.db`)];for(let e of a)if(s.existsSync(e))return!0;return!1}async function E({contentRoot:e,stdin:t=l.stdin,stdout:n=l.stdout,onExit:r=e=>l.exit(e)}={}){let i=c.resolve(e||l.cwd()),a=c.join(i,`.cache`),o=C(),u=t,d=n,f=!1,p=null;if(t===l.stdin&&!l.stdin.isTTY&&!l.env.CI&&(l.stderr.isTTY||l.stdout.isTTY))try{let e=l.platform===`win32`?`CONIN$`:`/dev/tty`;p=s.openSync(e,`r`),u=new v.ReadStream(p),d=l.stderr.isTTY?l.stderr:l.stdout,f=!0}catch{try{let e=l.platform===`win32`?`CONIN$`:`/dev/tty`;u=s.createReadStream(e),d=l.stderr.isTTY?l.stderr:l.stdout,f=!0}catch{}}let m=_.createInterface({input:u,output:d}),h=!1,g=()=>{if(!h){h=!0,d.write(`
1
+ import{i as e}from"./chunk-DnRcu9b4.js";import{t}from"./chunk-t72uObQ7.js";import{t as n}from"./chunk-CtfWY4G6.js";import{i as r,n as i,r as a,t as o}from"./chunk-DIjCY0Wf.js";import s from"node:fs";import c from"node:path";import l from"node:process";import{access as u,constants as d,mkdir as f,mkdtemp as p,readFile as m,writeFile as h}from"node:fs/promises";import{tmpdir as g}from"node:os";import _ from"node:readline/promises";import v from"node:tty";function y(){let e=l.emitWarning;if(!e||e.__suppressed)return;let t=function(t,...n){if((typeof t!=`string`||n[0]!==`ExperimentalWarning`&&!t.includes(`ExperimentalWarning`)&&!t.includes(`SQLite`))&&!(t&&typeof t==`object`&&(t.name===`ExperimentalWarning`||typeof t.message==`string`&&t.message.includes(`SQLite`))))return e.call(l,t,...n)};t.__suppressed=!0,l.emitWarning=t}y();const b=[`shadow-claw.config.json`,`shadow-claw-config.json`,`shadowclaw.config.json`,`site-config.json`];async function x(e){try{return await u(e,d.F_OK),!0}catch{return!1}}async function S(e,t){let n=[];if(e&&n.push(c.resolve(e)),t){let e=c.resolve(t);n.includes(e)||n.push(e)}if(e&&c.basename(c.resolve(e))===`.cache`){let t=c.dirname(c.resolve(e));n.includes(t)||n.push(t)}for(let e of n)for(let t of b){let n=c.join(e,t);if(await x(n))try{let e=await m(n,`utf8`),t=JSON.parse(e);if(t&&typeof t==`object`)return{configPath:n,config:t}}catch{}}return null}function C(){return c.join(g(),`shadow-claw`)}function w(e){let t=c.resolve(e||l.cwd()),n=[c.join(t,`shadow-claw-config.json`),c.join(t,`shadow-claw.config.json`),c.join(t,`shadowclaw.config.json`),c.join(t,`pages`,`shadow-claw-config.json`),c.join(t,`pages`,`shadow-claw.config.json`),c.join(t,`site-config.json`),c.join(t,`pages`,`site-config.json`)];for(let e of n)if(s.existsSync(e))try{let n=s.readFileSync(e,`utf8`),r=JSON.parse(n);if(r&&typeof r.cacheDir==`string`&&r.cacheDir.trim())return c.resolve(t,r.cacheDir.trim());if(r&&r.server&&typeof r.server.cacheDir==`string`&&r.server.cacheDir.trim())return c.resolve(t,r.server.cacheDir.trim())}catch{}return null}function T(e,t=`.cache`){let n=c.resolve(e||l.cwd()),r=c.join(n,t),i=c.join(r,`database`),a=[r,c.join(r,`control-token.json`),c.join(r,`cli-peer-id`),i,c.join(i,`clients.db`),c.join(i,`agent.db`),c.join(i,`scheduled-tasks.db`),c.join(i,`push-subscriptions.db`),c.join(n,`database`,`clients.db`),c.join(n,`database`,`agent.db`)];for(let e of a)if(s.existsSync(e))return!0;return!1}async function E({contentRoot:e,stdin:t=l.stdin,stdout:n=l.stdout,onExit:r=e=>l.exit(e)}={}){let i=c.resolve(e||l.cwd()),a=c.join(i,`.cache`),o=C(),u=t,d=n,f=!1,p=null;if(t===l.stdin&&!l.stdin.isTTY&&!l.env.CI&&(l.stderr.isTTY||l.stdout.isTTY))try{let e=l.platform===`win32`?`CONIN$`:`/dev/tty`;p=s.openSync(e,`r`),u=new v.ReadStream(p),d=l.stderr.isTTY?l.stderr:l.stdout,f=!0}catch{try{let e=l.platform===`win32`?`CONIN$`:`/dev/tty`;u=s.createReadStream(e),d=l.stderr.isTTY?l.stderr:l.stdout,f=!0}catch{}}let m=_.createInterface({input:u,output:d}),h=!1,g=()=>{if(!h){h=!0,d.write(`
2
2
  Operation cancelled.
3
3
  `);try{m.close()}catch{}r(130)}};m.on(`SIGINT`,g),u&&typeof u.on==`function`&&u!==l.stdin&&u.on(`SIGINT`,g);let y=()=>g();l.on(`SIGINT`,y);let b=e=>{let t=typeof e==`string`?e:e.toString(`binary`);(t.includes(``)||t.includes(``))&&g()};u&&typeof u.on==`function`&&u.on(`data`,b);try{d.write(`
4
4
  ShadowClaw needs a directory to store cache and database files:
@@ -11,18 +11,18 @@ ShadowClaw needs a directory to store cache and database files:
11
11
  `),n.write(`Tip: You can pass --tmp, --cache-dir <dir>, set SHADOWCLAW_TMP=1, SHADOWCLAW_CACHE_DIR=<dir>, or configure "cacheDir" in shadow-claw.config.json to skip this prompt.
12
12
 
13
13
  `);let e=(await m.question(`Enter choice [1-3] or a directory path (default: 1): `)).trim();if(!e||e===`1`||e.toLowerCase()===`y`||e.toLowerCase()===`yes`)return n.write(`Using current directory cache: ${a}\n\n`),a;if(e===`2`||e.toLowerCase()===`tmp`||e.toLowerCase()===`temp`||e.toLowerCase()===`t`)return n.write(`Using temporary directory: ${o}\n\n`),o;if(e.toLowerCase()===`n`||e.toLowerCase()===`no`){let e=(await m.question(`Use temporary directory (${o}) instead? (Y/n): `)).trim();return e.toLowerCase()===`n`||e.toLowerCase()===`no`?(n.write(`Operation cancelled.
14
- `),r(0),o):(n.write(`Using temporary directory: ${o}\n\n`),o)}if(e===`3`||e.toLowerCase()===`c`||e.toLowerCase()===`custom`){let e=(await m.question(`Enter custom directory path: `)).trim();if(!e)return n.write(`Using current directory cache: ${a}\n\n`),a;let t=c.resolve(i,e);return n.write(`Using custom directory: ${t}\n\n`),t}let t=c.resolve(i,e);return d.write(`Using directory: ${t}\n\n`),t}finally{l.removeListener(`SIGINT`,y),u&&typeof u.removeListener==`function`&&(u!==l.stdin&&u.removeListener(`SIGINT`,g),u.removeListener(`data`,b));try{m.close()}catch{}if(f){if(u&&typeof u.destroy==`function`)try{u.destroy()}catch{}if(p!=null)try{s.closeSync(p)}catch{}}}}async function D(e={}){let t=c.resolve(e.contentRoot||l.cwd());if(e.tmp||e.temp||[`1`,`true`,`yes`].includes((l.env.SHADOWCLAW_TMP||l.env.SHADOWCLAW_TEMP||``).toLowerCase().trim())){let n=C();return{cacheDir:n,databaseDir:e.databaseDir?c.resolve(t,e.databaseDir):c.join(n,`database`)}}let n=(e.cacheDir||l.env.SHADOWCLAW_CACHE_DIR||``).trim();if(n){let r=c.resolve(t,n);return{cacheDir:r,databaseDir:e.databaseDir?c.resolve(t,e.databaseDir):c.join(r,`database`)}}let r=(e.databaseDir||l.env.SHADOWCLAW_DATABASE_DIR||``).trim();if(r){let e=c.resolve(t,r);return{cacheDir:c.basename(e)===`database`?c.dirname(e):c.resolve(e,`..`),databaseDir:e}}let i=w(t);if(i)return{cacheDir:i,databaseDir:c.join(i,`database`)};let a=T(t),o=c.join(t,`.cache`),s=c.join(o,`database`);if(a||e.yes||e.y||[`1`,`true`,`yes`].includes((l.env.SHADOWCLAW_YES||``).toLowerCase().trim()))return{cacheDir:o,databaseDir:s};let u=e.stdin?!!e.stdin.isTTY:!!l.stdin.isTTY,d=!e.stdin&&!l.stdin.isTTY&&!!(l.stderr.isTTY||l.stdout.isTTY),f=e.isTTY===void 0?u||d:!!e.isTTY,p=e.isCI===void 0?e.isTTY===void 0&&!(!l.env.CI||[`0`,`false`].includes(l.env.CI.toLowerCase())):!!e.isCI;if(!f||p||e.quiet)return{cacheDir:o,databaseDir:s};let m=await E({contentRoot:t,stdin:e.stdin,stdout:e.stdout,onExit:e.onExit});return{cacheDir:m,databaseDir:c.join(m,`database`)}}function O(e,t,n){if(!n||typeof e?.executeNativeAiTask!=`function`)return;let{id:r,groupId:i,taskType:a,input:o}=n;return e.executeNativeAiTask({taskType:a,input:o,groupId:i,db:t}).then(e=>{let t=globalThis.pendingNativeAiResolvers;t&&t[r]&&(t[r].resolve(e),delete t[r])}).catch(e=>{let t=globalThis.pendingNativeAiResolvers;t&&t[r]&&(t[r].reject(e),delete t[r])})}async function k(e={}){let t=e.core||await n();t.setHeadlessMode(!0);let r,i;if(e.workspace)r=c.resolve(e.workspace),i=e.databaseDir?c.resolve(e.databaseDir):e.cacheDir?c.resolve(e.cacheDir,`database`):c.resolve(r,`database`);else{let t=await D({contentRoot:l.cwd(),cacheDir:e.cacheDir,databaseDir:e.databaseDir,tmp:e.tmp||e.temp,yes:e.yes||e.y,quiet:e.quiet,isTTY:e.isTTY,stdin:e.stdin,stdout:e.stdout}),n=c.join(g(),`shadow-claw`);await f(n,{recursive:!0}),r=await p(c.join(n,`workspace-`)),i=t.databaseDir}await f(r,{recursive:!0}),await f(i,{recursive:!0});let a=c.join(i,`agent.db`),o=t.openSqliteDatabase(a);t.setDB(o),t.setStorageRootFromPath(r);let s=(await S(r))?.config||{},u=s.settings||{},d=e.internetAccess??e.allowInternet??u.internetAccess??u.vm_bash_full_internet_access??u.fullInternetAccess??s.internetAccess;if(d!==void 0&&typeof t.setConfig==`function`){let e=t.CONFIG_KEYS?.VM_BASH_FULL_INTERNET_ACCESS||`vm_bash_full_internet_access`;await t.setConfig(o,e,d?`true`:`false`)}let m={response:t=>{!e.quiet&&t.payload?.text&&console.log(t.payload.text)},error:t=>{!e.quiet&&t.payload?.error&&console.error(`Error: ${t.payload.error}`)},"tool-activity":t=>{!e.quiet&&e.verbose&&t.payload&&console.log(`[Tool] ${t.payload.tool} (${t.payload.status||`executing`})`)},"thinking-log":t=>{if(!e.quiet&&e.verbose&&t.payload){let e=t.payload.label||t.payload.level||`Log`;console.log(`[${e}] ${t.payload.message||``}`)}},"request-native-ai-task":e=>{O(t,o,e.payload)}};return t.setPostHandler(e=>{m[e.type]?.(e)}),{db:o,workspaceDir:r,dbPath:a,core:t}}function A(e={}){let{force:t=!1,stdin:n=l.stdin,timeoutMs:r}=e,i=n;return!t&&i?.isTTY?Promise.resolve(null):new Promise((e,t)=>{let n=[],a=!1,o;r!=null&&r>0&&(o=setTimeout(()=>{a=!0,typeof i?.destroy==`function`&&i.destroy(),e(null)},r)),typeof i?.setEncoding==`function`&&i.setEncoding(`utf8`),i.on(`data`,e=>{a||n.push(typeof e==`string`?e:e.toString(`utf8`))}),i.on(`end`,()=>{if(o&&clearTimeout(o),a)return;let t=n.join(``).trim();e(t.length>0?t:null)}),i.on(`error`,e=>{o&&clearTimeout(o),!a&&t(e)})})}function j(e,t){let n=t&&typeof t==`object`?Object.keys(t.properties||{}):[];for(let t of[`text`,`prompt`,`content`,`input`])if(n.includes(t))return{[t]:e};return{input:e}}function M(e){return(Array.isArray(e)?e:e?[e]:[]).map(e=>String(e)).filter(Boolean)}async function N(t){let n=[];for(let r of t){let t=c.resolve(r),i;try{i=await m(t)}catch(e){throw Error(`Error: Failed to read attachment file "${r}": ${e.message}`)}let a=c.basename(t),o=e(a,``);n.push({fileName:a,mimeType:o,size:i.length,source:{kind:`local-file`,file:new Blob([new Uint8Array(i)],{type:o})}})}return n}const P=/* @__PURE__ */ new Set([`ask_user`,`attach_file_to_chat`,`clear_chat`,`create_room`,`invite_to_room`,`leave_room`,`list_components`,`list_room_members`,`open_file`,`render_component`,`send_file`,`show_toast`,`send_notification`,`spawn_subagent`]),F=`server:main`;async function I(e={}){let t;if(e.workspace)t=c.resolve(e.workspace);else{let e=c.join(g(),`shadow-claw`);await f(e,{recursive:!0}),t=await p(c.join(e,`workspace-`))}let n=c.join(t,`.agents`,`skills`),r=c.join(t,`.agents`,`tools`),i=c.join(t,`database`);await f(t,{recursive:!0}),await f(n,{recursive:!0}),await f(r,{recursive:!0}),await f(i,{recursive:!0});let a=e.provider,o=e.model,s=e.stdin?!!e.stdin.isTTY:!!l.stdin.isTTY,u=!e.stdin&&!l.stdin.isTTY&&!!(l.stderr.isTTY||l.stdout.isTTY),d=e.isTTY===void 0?s||u:!!e.isTTY,m=e.isCI===void 0?e.isTTY===void 0&&!(!l.env.CI||[`0`,`false`].includes(l.env.CI.toLowerCase())):!!e.isCI,_=d&&!m&&!e.quiet&&!e.yes&&!e.y;if(!a&&!o&&_){let{promptForAgentModel:n}=await import(`./chunk-Dtse8rAn.js`),r=await n({workspaceDir:t,contentRoot:l.cwd(),cacheDir:e.cacheDir,stdin:e.stdin,stdout:e.stdout,quiet:e.quiet,isTTY:d});a=r.providerId,o=r.model}if(a||=`transformers_js_local`,!o){let{DEFAULT_LOCAL_MODEL:e}=await import(`./chunk-Dtse8rAn.js`);o=a===`transformers_js_local`?e:`openrouter/free`}if(!await S(t)){let e=c.join(t,`shadow-claw.config.json`);await h(e,JSON.stringify({$schema:`https://json-schema.org/draft/2020-12/schema`,site:{title:`ShadowClaw Agent Workspace`,description:`Headless CLI agent workspace`},settings:{defaultProvider:`openrouter`,defaultModel:`openrouter/free`},agent:{defaultProvider:a,defaultModel:o}},null,2)+`
15
- `,`utf8`)}if(e.download&&(a===`transformers_js_local`||a===`llamafile`)){let{downloadLocalModel:t}=await import(`./chunk-Dtse8rAn.js`);await t(o,{cacheDir:e.cacheDir,verbose:e.verbose,isTTY:e.isTTY})}return await k({workspace:t,quiet:!0}),{success:!0,workspace:t}}async function L(e={}){let{db:t,core:n}=await k(e),r=e.group||n.DEFAULT_SERVER_GROUP_ID||F,i=await n.discoverSkills(t,r);return{skills:i.skills,diagnostics:i.diagnostics}}async function R(e={}){let{db:t,core:n}=await k(e),r=e.group||n.DEFAULT_SERVER_GROUP_ID||F,i=null;if(e.toolsProfile||e.profile){let r=String(e.toolsProfile||e.profile).trim().toLowerCase(),a=n.DEFAULT_BUILTIN_PROFILE||null,o=[];if(typeof n.getConfig==`function`)try{let e=await n.getConfig(t,n.CONFIG_KEYS?.TOOL_PROFILES||`tool_profiles`);typeof e==`string`?o=JSON.parse(e):Array.isArray(e)&&(o=e)}catch{}let s=[a,...o].filter(Boolean).find(e=>e.id&&String(e.id).toLowerCase()===r||e.name&&String(e.name).toLowerCase()===r);s&&(i=new Set(s.enabledToolNames||[]))}let a=[...n.TOOL_DEFINITIONS||[]];if(typeof n.loadDeclarativeTools==`function`)try{let e=await n.loadDeclarativeTools(t,r);if(e&&Array.isArray(e.tools))for(let t of e.tools)a.some(e=>e.name===t.name)||a.push(t)}catch{}return{tools:a.map(e=>({name:e.name,description:e.description,headlessSafe:!P.has(e.name),...i?{enabled:i.has(e.name)}:{}}))}}async function z(e,t,n={}){let{db:r,workspaceDir:i,core:a}=await k(n),o=n.group||a.DEFAULT_SERVER_GROUP_ID||F,s=(a.TOOL_DEFINITIONS||[]).find(t=>t.name===e);if(!s&&typeof a.loadDeclarativeTools==`function`)try{s=(await a.loadDeclarativeTools(r,o)).tools.find(t=>t.name===e)}catch{}if(!s){let t=`Error: Tool "${e}" not found.`;return n.quiet||console.error(t),l.exitCode=1,{success:!1,error:t}}let u=!P.has(s.name),d=t??n.input;if(d===`-`&&(d=void 0),d==null&&n._stdinData!=null){let e=n._stdinData,t;try{t=JSON.parse(e)}catch{t=j(e,s.input_schema)}d=t}if(d!=null){let t={};if(typeof d==`string`)try{t=JSON.parse(d)}catch(e){let t=`Error: Failed to parse input JSON: ${e.message}`;return n.quiet||console.error(t),l.exitCode=1,{success:!1,error:t}}else typeof d==`object`&&(t=d);let f;try{let e=await H(r,a,i,{...n,interactive:!1});f={db:r,provider:e.providerId,model:e.model,apiKey:e.apiKey}}catch{}try{let i=await a.executeTool(r,e,t,o,{invokeContext:f}),d=typeof i==`string`?i:JSON.stringify(i,null,2);return n.output?(await h(c.resolve(n.output),d,`utf8`),n.quiet||l.stderr.write(`Output written to ${n.output}\n`)):n.quiet||l.stdout.write(d+`
14
+ `),r(0),o):(n.write(`Using temporary directory: ${o}\n\n`),o)}if(e===`3`||e.toLowerCase()===`c`||e.toLowerCase()===`custom`){let e=(await m.question(`Enter custom directory path: `)).trim();if(!e)return n.write(`Using current directory cache: ${a}\n\n`),a;let t=c.resolve(i,e);return n.write(`Using custom directory: ${t}\n\n`),t}let t=c.resolve(i,e);return d.write(`Using directory: ${t}\n\n`),t}finally{l.removeListener(`SIGINT`,y),u&&typeof u.removeListener==`function`&&(u!==l.stdin&&u.removeListener(`SIGINT`,g),u.removeListener(`data`,b));try{m.close()}catch{}if(f){if(u&&typeof u.destroy==`function`)try{u.destroy()}catch{}if(p!=null)try{s.closeSync(p)}catch{}}}}async function D(e={}){let t=c.resolve(e.contentRoot||l.cwd());if(e.tmp||e.temp||[`1`,`true`,`yes`].includes((l.env.SHADOWCLAW_TMP||l.env.SHADOWCLAW_TEMP||``).toLowerCase().trim())){let n=C();return{cacheDir:n,databaseDir:e.databaseDir?c.resolve(t,e.databaseDir):c.join(n,`database`)}}let n=(e.cacheDir||l.env.SHADOWCLAW_CACHE_DIR||``).trim();if(n){let r=c.resolve(t,n);return{cacheDir:r,databaseDir:e.databaseDir?c.resolve(t,e.databaseDir):c.join(r,`database`)}}let r=(e.databaseDir||l.env.SHADOWCLAW_DATABASE_DIR||``).trim();if(r){let e=c.resolve(t,r);return{cacheDir:c.basename(e)===`database`?c.dirname(e):c.resolve(e,`..`),databaseDir:e}}let i=w(t);if(i)return{cacheDir:i,databaseDir:c.join(i,`database`)};let a=T(t),o=c.join(t,`.cache`),s=c.join(o,`database`);if(a||e.yes||e.y||[`1`,`true`,`yes`].includes((l.env.SHADOWCLAW_YES||``).toLowerCase().trim()))return{cacheDir:o,databaseDir:s};let u=e.stdin?!!e.stdin.isTTY:!!l.stdin.isTTY,d=!e.stdin&&!l.stdin.isTTY&&!!(l.stderr.isTTY||l.stdout.isTTY),f=e.isTTY===void 0?u||d:!!e.isTTY,p=e.isCI===void 0?e.isTTY===void 0&&!(!l.env.CI||[`0`,`false`].includes(l.env.CI.toLowerCase())):!!e.isCI;if(!f||p||e.quiet)return{cacheDir:o,databaseDir:s};let m=await E({contentRoot:t,stdin:e.stdin,stdout:e.stdout,onExit:e.onExit});return{cacheDir:m,databaseDir:c.join(m,`database`)}}function O(e,t,n){if(!n||typeof e?.executeNativeAiTask!=`function`)return;let{id:r,groupId:i,taskType:a,input:o}=n;return e.executeNativeAiTask({taskType:a,input:o,groupId:i,db:t}).then(e=>{let t=globalThis.pendingNativeAiResolvers;t&&t[r]&&(t[r].resolve(e),delete t[r])}).catch(e=>{let t=globalThis.pendingNativeAiResolvers;t&&t[r]&&(t[r].reject(e),delete t[r])})}async function k(e={}){let t=e.core||await n();t.setHeadlessMode(!0);let r,i;if(e.workspace)r=c.resolve(e.workspace),i=e.databaseDir?c.resolve(e.databaseDir):e.cacheDir?c.resolve(e.cacheDir,`database`):c.resolve(r,`database`);else{let t=await D({contentRoot:l.cwd(),cacheDir:e.cacheDir,databaseDir:e.databaseDir,tmp:e.tmp||e.temp,yes:e.yes||e.y,quiet:e.quiet,isTTY:e.isTTY,stdin:e.stdin,stdout:e.stdout}),n=c.join(g(),`shadow-claw`);await f(n,{recursive:!0}),r=await p(c.join(n,`workspace-`)),i=t.databaseDir}await f(r,{recursive:!0}),await f(i,{recursive:!0});let a=c.join(i,`agent.db`),o=t.openSqliteDatabase(a);t.setDB(o),t.setStorageRootFromPath(r);let s=(await S(r))?.config||{},u=s.settings||{},d=e.internetAccess??e.allowInternet??u.internetAccess??u.vm_bash_full_internet_access??u.fullInternetAccess??s.internetAccess;if(d!==void 0&&typeof t.setConfig==`function`){let e=t.CONFIG_KEYS?.VM_BASH_FULL_INTERNET_ACCESS||`vm_bash_full_internet_access`;await t.setConfig(o,e,d?`true`:`false`)}let m={response:t=>{!e.quiet&&t.payload?.text&&console.log(t.payload.text)},error:t=>{!e.quiet&&t.payload?.error&&console.error(`Error: ${t.payload.error}`)},"tool-activity":t=>{!e.quiet&&e.verbose&&t.payload&&console.log(`[Tool] ${t.payload.tool} (${t.payload.status||`executing`})`)},"thinking-log":t=>{if(!e.quiet&&e.verbose&&t.payload){let e=t.payload.label||t.payload.level||`Log`;console.log(`[${e}] ${t.payload.message||``}`)}},"request-native-ai-task":e=>{O(t,o,e.payload)}};return t.setPostHandler(e=>{m[e.type]?.(e)}),{db:o,workspaceDir:r,dbPath:a,core:t}}function A(e={}){let{force:t=!1,stdin:n=l.stdin,timeoutMs:r}=e,i=n;return!t&&i?.isTTY?Promise.resolve(null):new Promise((e,t)=>{let n=[],a=!1,o;r!=null&&r>0&&(o=setTimeout(()=>{a=!0,typeof i?.destroy==`function`&&i.destroy(),e(null)},r)),typeof i?.setEncoding==`function`&&i.setEncoding(`utf8`),i.on(`data`,e=>{a||n.push(typeof e==`string`?e:e.toString(`utf8`))}),i.on(`end`,()=>{if(o&&clearTimeout(o),a)return;let t=n.join(``).trim();e(t.length>0?t:null)}),i.on(`error`,e=>{o&&clearTimeout(o),!a&&t(e)})})}function j(e,t){let n=t&&typeof t==`object`?Object.keys(t.properties||{}):[];for(let t of[`text`,`prompt`,`content`,`input`])if(n.includes(t))return{[t]:e};return{input:e}}function M(e){return(Array.isArray(e)?e:e?[e]:[]).map(e=>String(e)).filter(Boolean)}async function N(t){let n=[];for(let r of t){let t=c.resolve(r),i;try{i=await m(t)}catch(e){throw Error(`Error: Failed to read attachment file "${r}": ${e.message}`)}let a=c.basename(t),o=e(a,``);n.push({fileName:a,mimeType:o,size:i.length,source:{kind:`local-file`,file:new Blob([new Uint8Array(i)],{type:o})}})}return n}const P=/* @__PURE__ */ new Set([`ask_user`,`attach_file_to_chat`,`clear_chat`,`create_room`,`invite_to_room`,`leave_room`,`list_components`,`list_room_members`,`open_file`,`render_component`,`send_file`,`show_toast`,`send_notification`,`spawn_subagent`]),F=`server:main`;async function I(e={}){let t;if(e.workspace)t=c.resolve(e.workspace);else{let e=c.join(g(),`shadow-claw`);await f(e,{recursive:!0}),t=await p(c.join(e,`workspace-`))}let n=c.join(t,`.agents`,`skills`),r=c.join(t,`.agents`,`tools`),i=c.join(t,`database`);await f(t,{recursive:!0}),await f(n,{recursive:!0}),await f(r,{recursive:!0}),await f(i,{recursive:!0});let a=e.provider,o=e.model,s=e.stdin?!!e.stdin.isTTY:!!l.stdin.isTTY,u=!e.stdin&&!l.stdin.isTTY&&!!(l.stderr.isTTY||l.stdout.isTTY),d=e.isTTY===void 0?s||u:!!e.isTTY,m=e.isCI===void 0?e.isTTY===void 0&&!(!l.env.CI||[`0`,`false`].includes(l.env.CI.toLowerCase())):!!e.isCI,_=d&&!m&&!e.quiet&&!e.yes&&!e.y;if(!a&&!o&&_){let{promptForAgentModel:n}=await import(`./chunk-5ryVpyup.js`),r=await n({workspaceDir:t,contentRoot:l.cwd(),cacheDir:e.cacheDir,stdin:e.stdin,stdout:e.stdout,quiet:e.quiet,isTTY:d});a=r.providerId,o=r.model}if(a||=`transformers_js_local`,!o){let{DEFAULT_LOCAL_MODEL:e}=await import(`./chunk-5ryVpyup.js`);o=a===`transformers_js_local`?e:`openrouter/free`}if(!await S(t)){let e=c.join(t,`shadow-claw.config.json`);await h(e,JSON.stringify({$schema:`https://json-schema.org/draft/2020-12/schema`,site:{title:`ShadowClaw Agent Workspace`,description:`Headless CLI agent workspace`},settings:{defaultProvider:`openrouter`,defaultModel:`openrouter/free`},agent:{defaultProvider:a,defaultModel:o}},null,2)+`
15
+ `,`utf8`)}if(e.download&&(a===`transformers_js_local`||a===`llamafile`)){let{downloadLocalModel:t}=await import(`./chunk-5ryVpyup.js`);await t(o,{cacheDir:e.cacheDir,verbose:e.verbose,isTTY:e.isTTY})}return await k({workspace:t,quiet:!0}),{success:!0,workspace:t}}async function L(e={}){let{db:t,core:n}=await k(e),r=e.group||n.DEFAULT_SERVER_GROUP_ID||F,i=await n.discoverSkills(t,r);return{skills:i.skills,diagnostics:i.diagnostics}}async function R(e={}){let{db:t,core:n}=await k(e),r=e.group||n.DEFAULT_SERVER_GROUP_ID||F,i=null;if(e.toolsProfile||e.profile){let r=String(e.toolsProfile||e.profile).trim().toLowerCase(),a=n.DEFAULT_BUILTIN_PROFILE||null,o=[];if(typeof n.getConfig==`function`)try{let e=await n.getConfig(t,n.CONFIG_KEYS?.TOOL_PROFILES||`tool_profiles`);typeof e==`string`?o=JSON.parse(e):Array.isArray(e)&&(o=e)}catch{}let s=[a,...o].filter(Boolean).find(e=>e.id&&String(e.id).toLowerCase()===r||e.name&&String(e.name).toLowerCase()===r);s&&(i=new Set(s.enabledToolNames||[]))}let a=[...n.TOOL_DEFINITIONS||[]];if(typeof n.loadDeclarativeTools==`function`)try{let e=await n.loadDeclarativeTools(t,r);if(e&&Array.isArray(e.tools))for(let t of e.tools)a.some(e=>e.name===t.name)||a.push(t)}catch{}return{tools:a.map(e=>({name:e.name,description:e.description,headlessSafe:!P.has(e.name),...i?{enabled:i.has(e.name)}:{}}))}}async function z(e,t,n={}){let{db:r,workspaceDir:i,core:a}=await k(n),o=n.group||a.DEFAULT_SERVER_GROUP_ID||F,s=(a.TOOL_DEFINITIONS||[]).find(t=>t.name===e);if(!s&&typeof a.loadDeclarativeTools==`function`)try{s=(await a.loadDeclarativeTools(r,o)).tools.find(t=>t.name===e)}catch{}if(!s){let t=`Error: Tool "${e}" not found.`;return n.quiet||console.error(t),l.exitCode=1,{success:!1,error:t}}let u=!P.has(s.name),d=t??n.input;if(d===`-`&&(d=void 0),d==null&&n._stdinData!=null){let e=n._stdinData,t;try{t=JSON.parse(e)}catch{t=j(e,s.input_schema)}d=t}if(d!=null){let t={};if(typeof d==`string`)try{t=JSON.parse(d)}catch(e){let t=`Error: Failed to parse input JSON: ${e.message}`;return n.quiet||console.error(t),l.exitCode=1,{success:!1,error:t}}else typeof d==`object`&&(t=d);let f;try{let e=await H(r,a,i,{...n,interactive:!1});f={db:r,provider:e.providerId,model:e.model,apiKey:e.apiKey}}catch{}try{let i=await a.executeTool(r,e,t,o,{invokeContext:f}),d=typeof i==`string`?i:JSON.stringify(i,null,2);return n.output?(await h(c.resolve(n.output),d,`utf8`),n.quiet||l.stderr.write(`Output written to ${n.output}\n`)):n.quiet||l.stdout.write(d+`
16
16
  `),{success:!0,tool:s,headlessSafe:u,output:i}}catch(t){let r=t instanceof Error?t.message:String(t);return n.quiet||console.error(`Error executing tool "${e}": ${r}`),l.exitCode=1,{success:!1,error:r}}}if(!n.quiet){let e=u?`[headless-safe]`:`[browser-only]`;console.log(`Tool: ${s.name} ${e}\n`),console.log(`Description:\n ${s.description}\n`),s.input_schema&&(console.log(`Parameters (JSON Schema):`),console.log(JSON.stringify(s.input_schema,null,2)),console.log()),console.log(`Usage:`),console.log(` Direct CLI: npx shadow-claw agent tool ${s.name} '<json-input>'`),console.log(` Pipe input: echo '<text>' | npx shadow-claw agent tool ${s.name}`),console.log(` Agent Prompt: npx shadow-claw agent run "<instruction>"
17
- `)}return{success:!0,tool:s,headlessSafe:u}}async function B(e={}){let{db:t,core:n}=await k(e),r=e.group||n.DEFAULT_SERVER_GROUP_ID||F,{clearGroupMessages:i}=await import(`./chunk-CAxYfMhR.js`);return await i(t,r),e.quiet||console.log(`Cleared conversation history for group "${r}".`),{success:!0,groupId:r}}async function V(e,t={}){let{db:n,core:r}=await k(t),i=t.group||r.DEFAULT_SERVER_GROUP_ID||F,a=await r.loadSkill(n,i,e);if(!a)throw Error(`Skill "${e}" not found in workspace.`);if(a.execution?.type===`tools`&&Array.isArray(a.execution.tools)){let e=a.execution.tools.map(e=>({name:e.name||e.tool,input:e.input||e.arguments||{},suppressOutput:e.suppressOutput})),t=await r.executeToolChain(n,i,e,{isManual:!0});return{success:!0,skill:a,results:t.results,rawOutputs:t.rawOutputs}}return{success:!0,skill:a,message:`Skill "${e}" loaded (no declarative tools defined).`}}async function H(e,t,n,r={}){let i=r.contentRoot??l.cwd(),a=await S(n,i),o=a?.config||{},s=o.settings||{},c=o.agent||s.agent||{},u=r.provider||l.env.SHADOW_CLAW_PROVIDER||l.env.SHADOW_CLAW_DEFAULT_PROVIDER;if(!u&&typeof t.getConfig==`function`&&(u=await t.getConfig(e,t.CONFIG_KEYS?.PROVIDER||`provider`)),!u&&r.model){let{isLlamafile:e,isAgentfile:t}=await import(`./chunk-Dtse8rAn.js`);t(r.model)?u=`agentfile`:e(r.model)?u=`llamafile`:/onnx/i.test(r.model)&&(u=`transformers_js_local`)}u||=c.defaultProvider||c.provider||s.defaultProvider||s.provider||o.defaultProvider;let d=r.stdin?!!r.stdin.isTTY:!!l.stdin.isTTY,f=!r.stdin&&!l.stdin.isTTY&&!!(l.stderr.isTTY||l.stdout.isTTY),p=r.isTTY===void 0?d||f:!!r.isTTY,m=r.isCI===void 0?r.isTTY===void 0&&!(!l.env.CI||[`0`,`false`].includes(l.env.CI.toLowerCase())):!!r.isCI,h=p&&!m&&!r.quiet&&r.interactive!==!1;if(!u){if(h){let{promptForAgentModel:e}=await import(`./chunk-Dtse8rAn.js`),t=await e({workspaceDir:n,contentRoot:i,cacheDir:r.cacheDir,stdin:r.stdin,stdout:r.stdout,quiet:r.quiet,isTTY:p,service:r._transformersService});u=t.providerId,r.model=t.model}else u=`openrouter`}let g=typeof t.getProvider==`function`?t.getProvider(u):null;if(!g){let e=`Error: Unknown provider "${u}".`;throw Error(e)}let _;if(r.apiKey!==void 0)_=r.apiKey;else{if(_=l.env.SHADOW_CLAW_API_KEY,!_)switch(u){case`openrouter`:_=l.env.OPENROUTER_API_KEY;break;case`huggingface`:_=l.env.HUGGINGFACE_API_KEY||l.env.HF_TOKEN;break;case`gemini_proxy`:_=l.env.GEMINI_API_KEY}!_&&typeof t.getConfig==`function`&&(_=await t.getConfig(e,`api_key:${u}`)||await t.getConfig(e,`apiKey`))}let v=r.model||l.env.SHADOW_CLAW_MODEL||l.env.SHADOW_CLAW_DEFAULT_MODEL||(typeof t.getConfig==`function`?await t.getConfig(e,t.CONFIG_KEYS?.MODEL||`model`):null)||c.defaultModel||c.model||s.defaultModel||s.model||o.defaultModel||g?.defaultModel||(u===`transformers_js_local`?(await import(`./chunk-Dtse8rAn.js`)).DEFAULT_LOCAL_MODEL:`default`);if(u===`transformers_js_local`||u===`llamafile`||u===`agentfile`){let{isModelLocallyCached:e,downloadLocalModel:t}=await import(`./chunk-Dtse8rAn.js`),i=r.cacheDir||c.cacheDir||o.cacheDir||s.cacheDir;if(!(e(v,i)||n&&e(v,n))){let e=r.stdout||l.stderr;if(r.download||r.yes||r.y)r.quiet||e.write(`\nDownloading ${v} from Hugging Face...\n`),await t(v,{cacheDir:i||r.cacheDir,stream:e,isTTY:p,service:r._transformersService,progress:!r.quiet&&r.progress!==!1&&!r.noProgress,quiet:r.quiet,verbose:r.verbose});else if(h){let n=await import(`node:readline/promises`),a=await import(`node:tty`),o=await import(`node:fs`),s=r.stdin||l.stdin,c=e,u=!1,d=null;if(s===l.stdin&&!l.stdin.isTTY&&!l.env.CI&&(l.stderr.isTTY||l.stdout.isTTY))try{let e=l.platform===`win32`?`CONIN$`:`/dev/tty`;d=o.openSync(e,`r`),s=new a.ReadStream(d),c=l.stderr.isTTY?l.stderr:l.stdout,u=!0}catch{try{let e=l.platform===`win32`?`CONIN$`:`/dev/tty`;s=o.createReadStream(e),c=l.stderr.isTTY?l.stderr:l.stdout,u=!0}catch{}}let f=n.createInterface({input:s,output:c}),m=!1,h=()=>{if(!m){m=!0,c.write(`
17
+ `)}return{success:!0,tool:s,headlessSafe:u}}async function B(e={}){let{db:t,core:n}=await k(e),r=e.group||n.DEFAULT_SERVER_GROUP_ID||F,{clearGroupMessages:i}=await import(`./chunk-CAxYfMhR.js`);return await i(t,r),e.quiet||console.log(`Cleared conversation history for group "${r}".`),{success:!0,groupId:r}}async function V(e,t={}){let{db:n,core:r}=await k(t),i=t.group||r.DEFAULT_SERVER_GROUP_ID||F,a=await r.loadSkill(n,i,e);if(!a)throw Error(`Skill "${e}" not found in workspace.`);if(a.execution?.type===`tools`&&Array.isArray(a.execution.tools)){let e=a.execution.tools.map(e=>({name:e.name||e.tool,input:e.input||e.arguments||{},suppressOutput:e.suppressOutput})),t=await r.executeToolChain(n,i,e,{isManual:!0});return{success:!0,skill:a,results:t.results,rawOutputs:t.rawOutputs}}return{success:!0,skill:a,message:`Skill "${e}" loaded (no declarative tools defined).`}}async function H(e,t,n,r={}){let i=r.contentRoot??l.cwd(),a=await S(n,i),o=a?.config||{},s=o.settings||{},c=o.agent||s.agent||{},u=r.provider||l.env.SHADOW_CLAW_PROVIDER||l.env.SHADOW_CLAW_DEFAULT_PROVIDER;if(!u&&typeof t.getConfig==`function`&&(u=await t.getConfig(e,t.CONFIG_KEYS?.PROVIDER||`provider`)),!u&&r.model){let{isLlamafile:e,isAgentfile:t}=await import(`./chunk-5ryVpyup.js`);t(r.model)?u=`agentfile`:e(r.model)?u=`llamafile`:/onnx/i.test(r.model)&&(u=`transformers_js_local`)}u||=c.defaultProvider||c.provider||s.defaultProvider||s.provider||o.defaultProvider;let d=r.stdin?!!r.stdin.isTTY:!!l.stdin.isTTY,f=!r.stdin&&!l.stdin.isTTY&&!!(l.stderr.isTTY||l.stdout.isTTY),p=r.isTTY===void 0?d||f:!!r.isTTY,m=r.isCI===void 0?r.isTTY===void 0&&!(!l.env.CI||[`0`,`false`].includes(l.env.CI.toLowerCase())):!!r.isCI,h=p&&!m&&!r.quiet&&r.interactive!==!1;if(!u){if(h){let{promptForAgentModel:e}=await import(`./chunk-5ryVpyup.js`),t=await e({workspaceDir:n,contentRoot:i,cacheDir:r.cacheDir,stdin:r.stdin,stdout:r.stdout,quiet:r.quiet,isTTY:p,service:r._transformersService});u=t.providerId,r.model=t.model}else u=`openrouter`}let g=typeof t.getProvider==`function`?t.getProvider(u):null;if(!g){let e=`Error: Unknown provider "${u}".`;throw Error(e)}let _;if(r.apiKey!==void 0)_=r.apiKey;else{if(_=l.env.SHADOW_CLAW_API_KEY,!_)switch(u){case`openrouter`:_=l.env.OPENROUTER_API_KEY;break;case`huggingface`:_=l.env.HUGGINGFACE_API_KEY||l.env.HF_TOKEN;break;case`gemini_proxy`:_=l.env.GEMINI_API_KEY}!_&&typeof t.getConfig==`function`&&(_=await t.getConfig(e,`api_key:${u}`)||await t.getConfig(e,`apiKey`))}let v=r.model||l.env.SHADOW_CLAW_MODEL||l.env.SHADOW_CLAW_DEFAULT_MODEL||(typeof t.getConfig==`function`?await t.getConfig(e,t.CONFIG_KEYS?.MODEL||`model`):null)||c.defaultModel||c.model||s.defaultModel||s.model||o.defaultModel||g?.defaultModel||(u===`transformers_js_local`?(await import(`./chunk-5ryVpyup.js`)).DEFAULT_LOCAL_MODEL:`default`);if(u===`transformers_js_local`||u===`llamafile`||u===`agentfile`){let{isModelLocallyCached:e,downloadLocalModel:t}=await import(`./chunk-5ryVpyup.js`),i=r.cacheDir||c.cacheDir||o.cacheDir||s.cacheDir;if(!(e(v,i)||n&&e(v,n))){let e=r.stdout||l.stderr;if(r.download||r.yes||r.y)r.quiet||e.write(`\nDownloading ${v} from Hugging Face...\n`),await t(v,{cacheDir:i||r.cacheDir,stream:e,isTTY:p,service:r._transformersService,progress:!r.quiet&&r.progress!==!1&&!r.noProgress,quiet:r.quiet,verbose:r.verbose});else if(h){let n=await import(`node:readline/promises`),a=await import(`node:tty`),o=await import(`node:fs`),s=r.stdin||l.stdin,c=e,u=!1,d=null;if(s===l.stdin&&!l.stdin.isTTY&&!l.env.CI&&(l.stderr.isTTY||l.stdout.isTTY))try{let e=l.platform===`win32`?`CONIN$`:`/dev/tty`;d=o.openSync(e,`r`),s=new a.ReadStream(d),c=l.stderr.isTTY?l.stderr:l.stdout,u=!0}catch{try{let e=l.platform===`win32`?`CONIN$`:`/dev/tty`;s=o.createReadStream(e),c=l.stderr.isTTY?l.stderr:l.stdout,u=!0}catch{}}let f=n.createInterface({input:s,output:c}),m=!1,h=()=>{if(!m){m=!0,c.write(`
18
18
  Operation cancelled.
19
19
  `);try{f.close()}catch{}typeof r.onExit==`function`?r.onExit(130):l.exit(130)}};f.on(`SIGINT`,h),s&&typeof s.on==`function`&&s!==l.stdin&&s.on(`SIGINT`,h);let g=()=>h();l.on(`SIGINT`,g);let _=e=>{let t=typeof e==`string`?e:e.toString(`binary`);(t.includes(``)||t.includes(``))&&h()};s&&typeof s.on==`function`&&s.on(`data`,_);let y=``;try{y=(await f.question(`\nModel "${v}" is not yet downloaded to local disk.\nDownload model weights now? (Y/n) [default: Y]: `)).trim().toLowerCase()}finally{l.removeListener(`SIGINT`,g),s&&typeof s.removeListener==`function`&&(s!==l.stdin&&s.removeListener(`SIGINT`,h),s.removeListener(`data`,_));try{f.close()}catch{}if(u){if(s&&typeof s.destroy==`function`)try{s.destroy()}catch{}if(d!=null)try{o.closeSync(d)}catch{}}}if(y===``||y===`y`||y===`yes`)r.quiet||e.write(`\nDownloading ${v} from Hugging Face...\n`),await t(v,{cacheDir:i||r.cacheDir,stream:e,isTTY:p,service:r._transformersService,progress:!r.quiet&&r.progress!==!1&&!r.noProgress,quiet:r.quiet,verbose:r.verbose});else throw Error(`Model "${v}" is not downloaded. Download aborted.`)}else throw Error(`Model "${v}" is not downloaded. Run with --download or --yes to download model weights automatically.`)}}return{providerId:u,providerConfig:g,apiKey:_||``,model:v,workspaceConfigData:a,workspaceConfig:o,workspaceSettings:s,workspaceAgent:c}}async function ee(e,t,n,r,i,a,o){let s=[...t.TOOL_DEFINITIONS||[]];if(typeof t.loadDeclarativeTools==`function`)try{let r=await t.loadDeclarativeTools(e,n);if(r&&Array.isArray(r.tools))for(let e of r.tools)s.some(t=>t.name===e.name)||s.push(e)}catch{}let c=s.filter(e=>!P.has(e.name)),l=c,u=null;async function d(){let n=t.DEFAULT_BUILTIN_PROFILE||null,a=[];if(typeof t.getConfig==`function`)try{let n=await t.getConfig(e,t.CONFIG_KEYS?.TOOL_PROFILES||`tool_profiles`);typeof n==`string`?a=JSON.parse(n):Array.isArray(n)&&(a=n)}catch{}let o=r?.toolProfiles||i?.toolProfiles||r?.profiles||[];return[n,...a,...o].filter(Boolean)}if(o.noTools===!0||o.tools===!1||o.tools===`none`||o.tools===``)return l=[],{enabledTools:l,profileSystemPromptOverride:u};if(o.tools!==void 0&&o.tools!==null)return l=(Array.isArray(o.tools)?o.tools:String(o.tools).split(`,`)).map(e=>String(e).trim()).filter(Boolean).map(e=>c.find(t=>t.name===String(e))).filter(Boolean),{enabledTools:l,profileSystemPromptOverride:u};if(o.toolsProfile){let e=await d(),t=String(o.toolsProfile).trim().toLowerCase(),n=e.find(e=>e.id&&String(e.id).toLowerCase()===t||e.name&&String(e.name).toLowerCase()===t);if(!n)throw Error(`Error: Tool profile "${o.toolsProfile}" not found.`);let r=new Set(n.enabledToolNames||[]);if(l=c.filter(e=>r.has(e.name)),n.customTools&&Array.isArray(n.customTools))for(let e of n.customTools)!P.has(e.name)&&!l.some(t=>t.name===e.name)&&l.push(e);return n.systemPromptOverride&&(u=n.systemPromptOverride),{enabledTools:l,profileSystemPromptOverride:u}}let f=a?.tools??a?.enabledTools;if(f!=null)return f===!1||f===`none`||f===``?(l=[],{enabledTools:l,profileSystemPromptOverride:u}):(l=(Array.isArray(f)?f:String(f).split(`,`)).map(e=>String(e).trim()).filter(Boolean).map(e=>c.find(t=>t.name===e)).filter(Boolean),{enabledTools:l,profileSystemPromptOverride:u});let p=a?.toolsProfile||a?.defaultToolsProfile;if(p){let e=await d(),t=String(p).trim().toLowerCase(),n=e.find(e=>e.id&&String(e.id).toLowerCase()===t||e.name&&String(e.name).toLowerCase()===t);if(n){let e=new Set(n.enabledToolNames||[]);return l=c.filter(t=>e.has(t.name)),n.systemPromptOverride&&(u=n.systemPromptOverride),{enabledTools:l,profileSystemPromptOverride:u}}}return{enabledTools:l,profileSystemPromptOverride:u}}async function U(e,n={}){let{db:s,workspaceDir:u,core:d}=await k(n),f=n.group||d.DEFAULT_SERVER_GROUP_ID||F,p=n._stdinData??null;if(e===`-`?e=p||``:p&&(e=e?`${e}\n\n${p}`:p),!e){let e=`Error: Prompt required. Provide a prompt argument or pipe text to stdin.`;return n.quiet||console.error(e),l.exitCode=1,{success:!1,error:e}}let g=[],_=/* @__PURE__ */ new Map;try{let e=await N(M(n.file));for(let t of e)if(t.source?.kind===`local-file`){let e=await t.source.file.arrayBuffer();_.set(t.fileName,new Uint8Array(e))}g=await t(s,f,e);for(let e of g)e.path&&_.has(e.fileName)&&_.set(e.path,_.get(e.fileName))}catch(e){return n.quiet||console.error(e.message),l.exitCode=1,{success:!1,error:e.message}}let v,y,b,x,S,C,w,T;try{let e=await H(s,d,u,n);v=e.providerId,y=e.providerConfig,b=e.apiKey,x=e.model,S=e.workspaceConfigData,C=e.workspaceConfig,w=e.workspaceSettings,T=e.workspaceAgent}catch(e){return n.quiet||console.error(e.message),l.exitCode=1,{success:!1,error:e.message}}let E=n.internetAccess??n.allowInternet??w?.internetAccess??w?.vm_bash_full_internet_access??w?.fullInternetAccess??C?.internetAccess;if(E!==void 0&&typeof d.setConfig==`function`){let e=d.CONFIG_KEYS?.VM_BASH_FULL_INTERNET_ACCESS||`vm_bash_full_internet_access`;await d.setConfig(s,e,E?`true`:`false`)}if(y.requiresApiKey!==!1&&!b){let e=v===`huggingface`?`HUGGINGFACE_API_KEY`:`${v.toUpperCase()}_API_KEY`,t=`Error: Provider "${v}" requires an API key, but none was provided.\nPlease provide an API key via --api-key <key> or export ${e}="...".`;return n.quiet||console.error(t),l.exitCode=1,{success:!1,error:t}}let D=[];if(n.history!==!1&&typeof d.getRecentMessages==`function`)try{let e=await d.getRecentMessages(s,f,50);D=await Promise.all(e.map(async e=>{if(e?.role===`user`&&Array.isArray(e?.attachments)&&e.attachments.length>0){let t=await i(e.attachments,async e=>{if(e.path&&s)try{return await o(s,f,e.path)}catch{}return null});if(t.length>0){let n=typeof e.content==`string`?e.content:``;return{...e,content:n?[{type:`text`,text:n},...t]:t}}}return e}))}catch{}let A={id:`msg_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,groupId:f,role:`user`,sender:`user`,channel:`chat`,isFromMe:!1,isTrigger:!0,content:e,timestamp:Date.now(),...g.length>0?{attachments:g}:{}};if(typeof d.saveMessage==`function`)try{await d.saveMessage(s,A)}catch{}let j=A;if(g.length>0){let t=await i(g,async e=>{if(e.path&&_.has(e.path))return _.get(e.path);if(_.has(e.fileName))return _.get(e.fileName);if(e.path&&s)try{return await o(s,f,e.path)}catch{}return null});t.length>0&&(j={...A,content:e?[{type:`text`,text:e},...t]:t})}let P=y?.supportsStreaming===!0,I=n.stream!==!1&&n.streaming!==!1&&!n.noStream,L=P&&I,R=Number(n.maxTokens)||(typeof d.getModelMaxTokens==`function`?d.getModelMaxTokens(x):d.DEFAULT_MAX_TOKENS||8192);if(n.verbose&&!n.quiet){let e=y?.name||v,t=L?`streaming`:`standard`;l.stderr.write(`[Agent] Connecting to ${e} (${x}) [${t}]...\n`),l.stderr.write(`[Agent] Workspace: ${u}\n[Agent] Group: ${f}\n[Agent] Max tokens: ${R}\n`)}let z,B,V=!1,U=``,W=[];d.setPostHandler(async e=>{({"streaming-start":()=>{V=!0},"streaming-chunk":e=>{e.payload?.text&&(V=!0,U+=e.payload.text,z=(z||``)+e.payload.text,!n.quiet&&!n.output&&l.stdout.write(e.payload.text))},"streaming-done":()=>{},"streaming-end":()=>{V=!1,U=``},response:e=>{if(e.payload?.text){if(z=e.payload.text,n.output){let t=h(c.resolve(n.output),e.payload.text,`utf8`).then(()=>{n.quiet||l.stderr.write(`Output written to ${n.output}\n`)}).catch(()=>{});W.push(t)}else n.quiet||(V&&typeof U==`string`&&U.trim()===e.payload.text.trim()?e.payload.text.endsWith(`
20
20
  `)||l.stdout.write(`
21
21
  `):l.stdout.write(e.payload.text+`
22
- `))}},"intermediate-response":e=>{n.verbose&&!n.quiet&&e.payload?.text&&l.stderr.write(`[Thought] ${e.payload.text}\n`)},error:e=>{e.payload?.error&&(B=e.payload.error,n.quiet||console.error(`Error: ${e.payload.error}`))},"tool-activity":e=>{if(n.verbose&&!n.quiet&&e.payload){let t=e.payload.tool||`tool`,n=e.payload.status||`executing`;l.stderr.write(`[Tool] ${t} (${n})\n`)}},"thinking-log":e=>{if(n.verbose&&!n.quiet&&e.payload){let t=e.payload.label||e.payload.level||`Log`;l.stderr.write(`[${t}] ${e.payload.message||``}\n`)}},status:e=>{if(n.verbose&&!n.quiet&&e.payload){let t=e.payload.label?`[${e.payload.label}] `:``;l.stderr.write(`${t}${e.payload.message||``}\n`)}},log:e=>{if(n.verbose&&!n.quiet&&e.payload){let t=e.payload.label||e.payload.level||`Log`;l.stderr.write(`[${t}] ${e.payload.message||``}\n`)}},"token-usage":e=>{if(n.verbose&&!n.quiet&&e.payload?.usage){let t=e.payload.usage,n=t.prompt_tokens??t.input_tokens??0,r=t.completion_tokens??t.output_tokens??0,i=t.total_tokens??n+r;l.stderr.write(`[Tokens] Prompt: ${n}, Completion: ${r}, Total: ${i}\n`)}},"request-native-ai-task":e=>{O(d,s,e.payload)}})[e.type]?.(e)});let G;try{G=await ee(s,d,f,C,w,T,n)}catch(e){let t=e.message||String(e);return n.quiet||console.error(t),l.exitCode=1,{success:!1,error:t}}let{enabledTools:K,profileSystemPromptOverride:q}=G;if(K.length>0&&!n.quiet){let{getCuratedModelToolSupport:e}=await import(`./chunk-Dtse8rAn.js`);e(x)===!1&&l.stderr.write(`[Agent] Warning: Model "${x}" does not support tool calling; tools will be ignored. Use --tools none or choose a tool-capable model (e.g. onnx-community/gemma-4-E2B-it-ONNX).\n`)}if(g.length>0&&!n.quiet){let e=r(x);for(let t of g){let n=a(t.mimeType,t.fileName);n===`image`&&!e.images&&!e.routerByFeatures?l.stderr.write(`[Agent] Warning: Model "${x}" does not accept image input; "${t.fileName}" will be passed as a reference only.\n`):n===`audio`&&!e.audio&&!e.routerByFeatures?l.stderr.write(`[Agent] Warning: Model "${x}" does not accept audio input; "${t.fileName}" will be passed as a reference only.\n`):n===`video`&&!e.video&&!e.routerByFeatures?l.stderr.write(`[Agent] Warning: Model "${x}" does not accept video input; "${t.fileName}" will be passed as a reference only.\n`):n===`document`&&!e.documents&&!e.routerByFeatures&&l.stderr.write(`[Agent] Warning: Model "${x}" does not accept PDF/document input; "${t.fileName}" will be passed as a reference only.\n`)}}let J;if(n.systemPrompt===`none`||n.systemPrompt===``||n.systemPrompt===!1||n.noSystemPrompt===!0)J=``;else{if(J=n.systemPrompt,!J&&n.systemPromptFile)try{let e=c.resolve(n.systemPromptFile);J=await m(e,`utf8`)}catch(e){let t=`Error: Failed to read system prompt file "${n.systemPromptFile}": ${e.message}`;return n.quiet||console.error(t),l.exitCode=1,{success:!1,error:t}}if(J||=l.env.SHADOW_CLAW_SYSTEM_PROMPT||l.env.SHADOWCLAW_SYSTEM_PROMPT,!J&&q&&(J=q),!J&&T?.systemPromptFile)try{let e=S?.configPath?c.dirname(S.configPath):u,t=c.resolve(e,T.systemPromptFile);J=await m(t,`utf8`)}catch(e){n.verbose&&!n.quiet&&console.error(`Warning: Failed to read systemPromptFile from config: ${e.message}`)}if(J||=T?.systemPrompt||w?.systemPrompt||w?.systemPromptOverride,!J&&typeof d.getConfig==`function`)try{let e=await d.getConfig(s,d.CONFIG_KEYS?.SYSTEM_PROMPT_OVERRIDE||`system_prompt_override`);e&&typeof e==`string`&&(J=e)}catch{}J||=`You are ShadowClaw, a helpful AI assistant operating in a headless workspace. Answer concisely.`}let te={apiKey:b||``,assistantName:`ShadowClaw`,enabledTools:K,groupId:f,maxTokens:R,messages:[...D,j],model:x,provider:v,streaming:L,verbose:!!n.verbose,systemPrompt:J},Y=new AbortController;n.abortSignal&&(n.abortSignal.aborted?Y.abort():n.abortSignal.addEventListener(`abort`,()=>Y.abort(),{once:!0}));let X=e=>{typeof n.onExit==`function`?n.onExit(e):!l.env.JEST_WORKER_ID&&l.env.NODE_ENV!==`test`&&l.exit(e)},Z=!1,Q=null,$=()=>{if(Z)Q&&=(clearTimeout(Q),null),X(130);else{Z=!0,Y.abort();try{typeof d.cleanupAllLlamafileProcesses==`function`&&d.cleanupAllLlamafileProcesses()}catch{}Q=setTimeout(()=>{X(130)},1500),Q.unref?.()}};l.on(`SIGINT`,$);let ne=n.invokeHandler||d.handleInvoke;try{await ne(s,te,Y.signal)}catch(e){B=e instanceof Error?e.message:String(e),!Z&&!n.quiet&&console.error(`Error: ${B}`)}finally{l.removeListener(`SIGINT`,$),Q&&=(clearTimeout(Q),null)}if(Z)return n.quiet||l.stderr.write(`
22
+ `))}},"intermediate-response":e=>{n.verbose&&!n.quiet&&e.payload?.text&&l.stderr.write(`[Thought] ${e.payload.text}\n`)},error:e=>{e.payload?.error&&(B=e.payload.error,n.quiet||console.error(`Error: ${e.payload.error}`))},"tool-activity":e=>{if(n.verbose&&!n.quiet&&e.payload){let t=e.payload.tool||`tool`,n=e.payload.status||`executing`;l.stderr.write(`[Tool] ${t} (${n})\n`)}},"thinking-log":e=>{if(n.verbose&&!n.quiet&&e.payload){let t=e.payload.label||e.payload.level||`Log`;l.stderr.write(`[${t}] ${e.payload.message||``}\n`)}},status:e=>{if(n.verbose&&!n.quiet&&e.payload){let t=e.payload.label?`[${e.payload.label}] `:``;l.stderr.write(`${t}${e.payload.message||``}\n`)}},log:e=>{if(n.verbose&&!n.quiet&&e.payload){let t=e.payload.label||e.payload.level||`Log`;l.stderr.write(`[${t}] ${e.payload.message||``}\n`)}},"token-usage":e=>{if(n.verbose&&!n.quiet&&e.payload?.usage){let t=e.payload.usage,n=t.prompt_tokens??t.input_tokens??0,r=t.completion_tokens??t.output_tokens??0,i=t.total_tokens??n+r;l.stderr.write(`[Tokens] Prompt: ${n}, Completion: ${r}, Total: ${i}\n`)}},"request-native-ai-task":e=>{O(d,s,e.payload)}})[e.type]?.(e)});let G;try{G=await ee(s,d,f,C,w,T,n)}catch(e){let t=e.message||String(e);return n.quiet||console.error(t),l.exitCode=1,{success:!1,error:t}}let{enabledTools:K,profileSystemPromptOverride:q}=G;if(K.length>0&&!n.quiet){let{getCuratedModelToolSupport:e}=await import(`./chunk-5ryVpyup.js`);e(x)===!1&&l.stderr.write(`[Agent] Warning: Model "${x}" does not support tool calling; tools will be ignored. Use --tools none or choose a tool-capable model (e.g. onnx-community/gemma-4-E2B-it-ONNX).\n`)}if(g.length>0&&!n.quiet){let e=r(x);for(let t of g){let n=a(t.mimeType,t.fileName);n===`image`&&!e.images&&!e.routerByFeatures?l.stderr.write(`[Agent] Warning: Model "${x}" does not accept image input; "${t.fileName}" will be passed as a reference only.\n`):n===`audio`&&!e.audio&&!e.routerByFeatures?l.stderr.write(`[Agent] Warning: Model "${x}" does not accept audio input; "${t.fileName}" will be passed as a reference only.\n`):n===`video`&&!e.video&&!e.routerByFeatures?l.stderr.write(`[Agent] Warning: Model "${x}" does not accept video input; "${t.fileName}" will be passed as a reference only.\n`):n===`document`&&!e.documents&&!e.routerByFeatures&&l.stderr.write(`[Agent] Warning: Model "${x}" does not accept PDF/document input; "${t.fileName}" will be passed as a reference only.\n`)}}let J;if(n.systemPrompt===`none`||n.systemPrompt===``||n.systemPrompt===!1||n.noSystemPrompt===!0)J=``;else{if(J=n.systemPrompt,!J&&n.systemPromptFile)try{let e=c.resolve(n.systemPromptFile);J=await m(e,`utf8`)}catch(e){let t=`Error: Failed to read system prompt file "${n.systemPromptFile}": ${e.message}`;return n.quiet||console.error(t),l.exitCode=1,{success:!1,error:t}}if(J||=l.env.SHADOW_CLAW_SYSTEM_PROMPT||l.env.SHADOWCLAW_SYSTEM_PROMPT,!J&&q&&(J=q),!J&&T?.systemPromptFile)try{let e=S?.configPath?c.dirname(S.configPath):u,t=c.resolve(e,T.systemPromptFile);J=await m(t,`utf8`)}catch(e){n.verbose&&!n.quiet&&console.error(`Warning: Failed to read systemPromptFile from config: ${e.message}`)}if(J||=T?.systemPrompt||w?.systemPrompt||w?.systemPromptOverride,!J&&typeof d.getConfig==`function`)try{let e=await d.getConfig(s,d.CONFIG_KEYS?.SYSTEM_PROMPT_OVERRIDE||`system_prompt_override`);e&&typeof e==`string`&&(J=e)}catch{}J||=`You are ShadowClaw, a helpful AI assistant operating in a headless workspace. Answer concisely.`}let te={apiKey:b||``,assistantName:`ShadowClaw`,enabledTools:K,groupId:f,maxTokens:R,messages:[...D,j],model:x,provider:v,streaming:L,verbose:!!n.verbose,systemPrompt:J},Y=new AbortController;n.abortSignal&&(n.abortSignal.aborted?Y.abort():n.abortSignal.addEventListener(`abort`,()=>Y.abort(),{once:!0}));let X=e=>{typeof n.onExit==`function`?n.onExit(e):!l.env.JEST_WORKER_ID&&l.env.NODE_ENV!==`test`&&l.exit(e)},Z=!1,Q=null,$=()=>{if(Z)Q&&=(clearTimeout(Q),null),X(130);else{Z=!0,Y.abort();try{typeof d.cleanupAllLlamafileProcesses==`function`&&d.cleanupAllLlamafileProcesses()}catch{}Q=setTimeout(()=>{X(130)},1500),Q.unref?.()}};l.on(`SIGINT`,$);let ne=n.invokeHandler||d.handleInvoke;try{await ne(s,te,Y.signal)}catch(e){B=e instanceof Error?e.message:String(e),!Z&&!n.quiet&&console.error(`Error: ${B}`)}finally{l.removeListener(`SIGINT`,$),Q&&=(clearTimeout(Q),null)}if(Z)return n.quiet||l.stderr.write(`
23
23
  Operation cancelled.
24
24
  `),l.exitCode=130,typeof n.onExit==`function`&&n.onExit(130),{success:!1,error:`Operation cancelled.`};if(B&&V&&!n.quiet&&!n.output&&l.stdout.write(`
25
- `),B)return l.exitCode=1,{success:!1,error:B};if(z&&typeof d.saveMessage==`function`)try{await d.saveMessage(s,{id:`msg_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,groupId:f,role:`assistant`,content:z,timestamp:Date.now()})}catch{}if(n.output&&z&&W.length===0){let e=h(c.resolve(n.output),z,`utf8`).then(()=>{n.quiet||l.stderr.write(`Output written to ${n.output}\n`)}).catch(()=>{});W.push(e)}return await Promise.all(W),typeof d.setPostHandler==`function`&&d.setPostHandler(null),{success:!0,response:z,model:x,provider:v}}async function W(e=`list`,t,n={}){let{listLocalModels:r,listLlamafileModels:i,downloadLocalModel:a,fetchRemoteModels:o,DEFAULT_LOCAL_MODEL:s}=await import(`./chunk-Dtse8rAn.js`),u=n.workspace?c.resolve(n.workspace):l.cwd(),d=e||`list`;if(d===`list`||d===`remote`){let e=d===`remote`||!!(n.remote||n.all||n.huggingface),a=await S(u),c=a?.config?.agent?.defaultModel||a?.config?.settings?.defaultModel||s;if(e){n.quiet||l.stdout.write(`
25
+ `),B)return l.exitCode=1,{success:!1,error:B};if(z&&typeof d.saveMessage==`function`)try{await d.saveMessage(s,{id:`msg_${Date.now()}_${Math.random().toString(36).slice(2,8)}`,groupId:f,role:`assistant`,content:z,timestamp:Date.now()})}catch{}if(n.output&&z&&W.length===0){let e=h(c.resolve(n.output),z,`utf8`).then(()=>{n.quiet||l.stderr.write(`Output written to ${n.output}\n`)}).catch(()=>{});W.push(e)}return await Promise.all(W),typeof d.setPostHandler==`function`&&d.setPostHandler(null),{success:!0,response:z,model:x,provider:v}}async function W(e=`list`,t,n={}){let{listLocalModels:r,listLlamafileModels:i,downloadLocalModel:a,fetchRemoteModels:o,DEFAULT_LOCAL_MODEL:s}=await import(`./chunk-5ryVpyup.js`),u=n.workspace?c.resolve(n.workspace):l.cwd(),d=e||`list`;if(d===`list`||d===`remote`){let e=d===`remote`||!!(n.remote||n.all||n.huggingface),a=await S(u),c=a?.config?.agent?.defaultModel||a?.config?.settings?.defaultModel||s;if(e){n.quiet||l.stdout.write(`
26
26
  Fetching available ONNX models from Hugging Face (onnx-community)...
27
27
  `);let e=await o({cacheDir:n.cacheDir,query:n.query||(d===`remote`&&t?t:void 0)});if(!n.quiet){if(e.length===0)l.stdout.write(`No models found on Hugging Face or could not reach huggingface.co.
28
28
 
@@ -36,5 +36,5 @@ Curated Transformers.js Models (Local ONNX):
36
36
  `);for(let e of f){let t=e.id===c,n=e.cached?` [Cached]`:` [Not downloaded]`,r=t?` (Default)`:``;l.stdout.write(` • ${e.id}${r}${n}\n`),l.stdout.write(` Name: ${e.name}\n`),l.stdout.write(` Context: ${e.contextLength.toLocaleString()} tokens | Tools: ${e.supportsTools?`Yes`:`No`}\n`),l.stdout.write(` ${e.description}\n\n`)}l.stdout.write(`Curated Llamafile Models (Local Executable):
37
37
 
38
38
  `);for(let e of p){let t=e.fileName===c||e.id===c||c.endsWith(e.fileName),n=e.cached?` [Cached]`:` [Not downloaded]`,r=t?` (Default)`:``;l.stdout.write(` • ${e.fileName}${r}${n}\n`),l.stdout.write(` Name: ${e.name}\n`),l.stdout.write(` URL: ${e.url}\n`),l.stdout.write(` ${e.description}\n\n`)}l.stdout.write("Tip: Run `shadow-claw agent model list --remote` (or `shadow-claw agent model remote`) to browse all ONNX models from Hugging Face.\n\n")}return{success:!0,models:f,llamafileModels:p,defaultModel:c}}if(d===`download`){let e=t||n.model||s;n.verbose&&!n.quiet&&l.stderr.write(`Preparing to download model: ${e}\n`);let r=await a(e,{cacheDir:n.cacheDir,verbose:n.verbose,isTTY:n.isTTY,progress:n.progress!==!1&&!n.noProgress});return r.success||(l.exitCode=1),r}if(d===`set`){let e=t||n.model;if(!e){let e=`Error: Please specify a model ID to set as default.`;return n.quiet||console.error(e),l.exitCode=1,{success:!1,error:e}}let r=await S(u),i=r?.configPath||c.join(u,`shadow-claw.config.json`),a=r?.config||{},o={...a,agent:{...a.agent||{},defaultModel:e}};return await h(i,JSON.stringify(o,null,2)+`
39
- `,`utf8`),n.quiet||l.stdout.write(`Updated default CLI agent model to: ${e}\n`),{success:!0,model:e,configPath:i}}let f=`Unknown model action: "${d}". Available: list, download, set`;return n.quiet||console.error(f),l.exitCode=1,{success:!1,error:f}}async function G(e,t={}){let n=(e||``).trim();if(!n){let e=`Error: Discovery URL or site URL required. Usage: shadow-claw agent import <url> [options]`;return t.quiet||console.error(e),l.exitCode=1,{success:!1,error:e}}let{db:r,core:i}=await k(t),a=t.group||i.DEFAULT_SERVER_GROUP_ID||F,o=i.fetchDiscoveryManifest||(await import(`./chunk-DTKv1-tk.js`)).fetchDiscoveryManifest,s=i.importRemoteArtifacts||(await import(`./chunk-DflhmBY2.js`)).importRemoteArtifacts,c=t.fetchFn||globalThis.fetch;t.quiet||console.log(`Fetching discovery manifest from ${n}...`);let u;try{u=await o(n,c)}catch(e){let n=`Failed to fetch discovery manifest: ${e instanceof Error?e.message:String(e)}`;return t.quiet||console.error(`Error: ${n}`),l.exitCode=1,{success:!1,error:n}}let{manifest:d,siteUrl:f,manifestUrl:p}=u,m=d.tools||[],h=d.skills||[],g=d.scripts||[];t.quiet||console.log(`Discovered: ${d.name||`Remote Site`} (${h.length} skill${h.length===1?``:`s`}, ${m.length} tool${m.length===1?``:`s`}, ${g.length} script${g.length===1?``:`s`})`);let _=m.map(e=>e.name),v=h.map(e=>e.name),y=g.map(e=>e.name),b,x,S;if((t.tools||t.skills||t.scripts)&&!t.all){let e=e=>e?Array.isArray(e)?e.map(e=>String(e).trim()).filter(Boolean):String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[];b=e(t.tools),x=e(t.skills),S=e(t.scripts)}else b=_,x=v,S=y;let C=t.autoEnable!==!1,w=!!t.overwrite,T;try{T=await s(r,a,d,{toolNames:b,skillNames:x,scriptNames:S},{autoEnable:C,overwrite:w,fetchFn:c,siteSlug:t.siteSlug,targetSubdir:t.targetSubdir})}catch(e){let n=`Import failed: ${e instanceof Error?e.message:String(e)}`;return t.quiet||console.error(`Error: ${n}`),l.exitCode=1,{success:!1,error:n}}let E=T.tools.filter(e=>e.status===`imported`),D=T.skills.filter(e=>e.status===`imported`),O=T.scripts.filter(e=>e.status===`imported`),A=T.tools.filter(e=>e.status===`skipped`),j=T.skills.filter(e=>e.status===`skipped`),M=T.scripts.filter(e=>e.status===`skipped`),N=T.tools.filter(e=>e.status===`failed`),P=T.skills.filter(e=>e.status===`failed`),I=T.scripts.filter(e=>e.status===`failed`),L=E.length+D.length+O.length,R=A.length+j.length+M.length,z=N.length+P.length+I.length;if(!t.quiet){console.log(`
40
- Importing artifacts:`);for(let e of[...T.tools,...T.skills,...T.scripts]){let t=T.tools.includes(e)?`tool`:T.skills.includes(e)?`skill`:`script`;e.status===`imported`?console.log(` [${t}] ${e.name} -> ${e.path} (imported)`):e.status===`skipped`?console.log(` [${t}] ${e.name} -> ${e.path} (skipped, already exists - use --overwrite to replace)`):console.log(` [${t}] ${e.name} (failed: ${e.error||`unknown error`})`)}console.log(z>0?`\nCompleted with ${z} error${z===1?``:`s`}. Successfully imported ${L} items, ${R} skipped.`:`\nSuccessfully imported ${L} item${L===1?``:`s`} (${E.length} tool${E.length===1?``:`s`}, ${D.length} skill${D.length===1?``:`s`}, ${O.length} script${O.length===1?``:`s`}).`)}let B=z===0||L>0;return B||(l.exitCode=1),{success:B,manifest:d,siteUrl:f,manifestUrl:p,result:T,importedCount:L,skippedCount:R,failedCount:z}}async function K(e,t=[],n={}){let r=t,i=n;if(!Array.isArray(t)&&typeof t==`object`&&(i=t,r=[]),i._stdinData===void 0)try{i={...i,_stdinData:l.stdin.isTTY?null:await A({timeoutMs:500})}}catch{i={...i,_stdinData:null}}switch(e){case`init`:{let e=r[0]||i.workspace,t=await I({...i,workspace:e});return console.log(`Headless agent workspace initialized at: ${t.workspace}`),t}case`skills`:{let e=await L(i);if(e.skills.length===0)console.log(`No skills found in workspace (.agents/skills/).`);else{console.log(`Available skills (${e.skills.length}):\n`);for(let t of e.skills)console.log(` - ${t.name}: ${t.description||`No description`}`)}return e}case`tools`:{let e=r[0];if(e)return await z(e,r[1],i);let t=await R(i);console.log(`Available tools (${t.tools.length}):\n`);for(let e of t.tools){let t=e.headlessSafe?`[headless-safe]`:`[browser-only]`;console.log(` - ${e.name.padEnd(25)} ${t} ${e.description||``}`)}return t}case`tool`:{let e=r[0];if(!e){console.error(`Error: Tool name required. Usage: shadow-claw agent tool <name> [input-json]`),l.exitCode=1;return}return await z(e,r[1],i)}case`skill`:{let e=r[0];if(!e){console.error(`Error: Skill name required. Usage: shadow-claw agent skill <name>`),l.exitCode=1;return}return await V(e,i)}case`clear`:return await B(i);case`run`:return await U(r.join(` `)||`-`,i);case`models`:case`model`:{let e=r[0]||`list`,t=r[1];return await W(e,t,i)}case`import`:{let e=r[0];return e?await G(e,i):(console.error(`Error: Discovery URL or site URL required. Usage: shadow-claw agent import <url> [options]`),l.exitCode=1,{success:!1,error:`Discovery URL or site URL required. Usage: shadow-claw agent import <url> [options]`})}case`listen`:return await(i.listenFn||(async e=>{let{runWebRtcListenCommand:t}=await import(`./chunk-CaWh9Pru.js`);return t(e)}))({...i,agent:!0});default:console.log(`Usage: shadow-claw agent <init|model|skills|tools|tool|skill|import|run|clear|listen> [args...]`)}}export{I as a,V as c,R as d,k as f,G as i,L as l,S as m,B as n,W as o,D as p,K as r,U as s,H as t,z as u};
39
+ `,`utf8`),n.quiet||l.stdout.write(`Updated default CLI agent model to: ${e}\n`),{success:!0,model:e,configPath:i}}let f=`Unknown model action: "${d}". Available: list, download, set`;return n.quiet||console.error(f),l.exitCode=1,{success:!1,error:f}}async function G(e,t={}){let n=(e||``).trim();if(!n){let e=`Error: Discovery URL or site URL required. Usage: shadow-claw agent import <url> [options]`;return t.quiet||console.error(e),l.exitCode=1,{success:!1,error:e}}let{db:r,core:i}=await k(t),a=t.group||i.DEFAULT_SERVER_GROUP_ID||F,o=i.fetchDiscoveryManifest||(await import(`./chunk-Aq3057Xo.js`)).fetchDiscoveryManifest,s=i.importRemoteArtifacts||(await import(`./chunk-ClOfk6Ga.js`)).importRemoteArtifacts,c=t.fetchFn||globalThis.fetch;t.quiet||console.log(`Fetching discovery manifest from ${n}...`);let u;try{u=await o(n,c)}catch(e){let n=`Failed to fetch discovery manifest: ${e instanceof Error?e.message:String(e)}`;return t.quiet||console.error(`Error: ${n}`),l.exitCode=1,{success:!1,error:n}}let{manifest:d,siteUrl:f,manifestUrl:p}=u,m=d.tools||[],h=d.skills||[],g=d.scripts||[];t.quiet||console.log(`Discovered: ${d.name||`Remote Site`} (${h.length} skill${h.length===1?``:`s`}, ${m.length} tool${m.length===1?``:`s`}, ${g.length} script${g.length===1?``:`s`})`);let _=m.map(e=>e.name),v=h.map(e=>e.name),y=g.map(e=>e.name),b,x,S;if((t.tools||t.skills||t.scripts)&&!t.all){let e=e=>e?Array.isArray(e)?e.map(e=>String(e).trim()).filter(Boolean):String(e).split(`,`).map(e=>e.trim()).filter(Boolean):[];b=e(t.tools),x=e(t.skills),S=e(t.scripts)}else b=_,x=v,S=y;let C=t.autoEnable!==!1,w=!!t.overwrite,T;try{T=await s(r,a,d,{toolNames:b,skillNames:x,scriptNames:S},{autoEnable:C,overwrite:w,fetchFn:c,siteSlug:t.siteSlug,targetSubdir:t.targetSubdir})}catch(e){let n=`Import failed: ${e instanceof Error?e.message:String(e)}`;return t.quiet||console.error(`Error: ${n}`),l.exitCode=1,{success:!1,error:n}}let E=T.tools.filter(e=>e.status===`imported`),D=T.skills.filter(e=>e.status===`imported`),O=T.scripts.filter(e=>e.status===`imported`),A=T.tools.filter(e=>e.status===`skipped`),j=T.skills.filter(e=>e.status===`skipped`),M=T.scripts.filter(e=>e.status===`skipped`),N=T.tools.filter(e=>e.status===`failed`),P=T.skills.filter(e=>e.status===`failed`),I=T.scripts.filter(e=>e.status===`failed`),L=E.length+D.length+O.length,R=A.length+j.length+M.length,z=N.length+P.length+I.length;if(!t.quiet){console.log(`
40
+ Importing artifacts:`);for(let e of[...T.tools,...T.skills,...T.scripts]){let t=T.tools.includes(e)?`tool`:T.skills.includes(e)?`skill`:`script`;e.status===`imported`?console.log(` [${t}] ${e.name} -> ${e.path} (imported)`):e.status===`skipped`?console.log(` [${t}] ${e.name} -> ${e.path} (skipped, already exists - use --overwrite to replace)`):console.log(` [${t}] ${e.name} (failed: ${e.error||`unknown error`})`)}console.log(z>0?`\nCompleted with ${z} error${z===1?``:`s`}. Successfully imported ${L} items, ${R} skipped.`:`\nSuccessfully imported ${L} item${L===1?``:`s`} (${E.length} tool${E.length===1?``:`s`}, ${D.length} skill${D.length===1?``:`s`}, ${O.length} script${O.length===1?``:`s`}).`)}let B=z===0||L>0;return B||(l.exitCode=1),{success:B,manifest:d,siteUrl:f,manifestUrl:p,result:T,importedCount:L,skippedCount:R,failedCount:z}}async function K(e,t=[],n={}){let r=t,i=n;if(!Array.isArray(t)&&typeof t==`object`&&(i=t,r=[]),i._stdinData===void 0)try{i={...i,_stdinData:l.stdin.isTTY?null:await A({timeoutMs:500})}}catch{i={...i,_stdinData:null}}switch(e){case`init`:{let e=r[0]||i.workspace,t=await I({...i,workspace:e});return console.log(`Headless agent workspace initialized at: ${t.workspace}`),t}case`skills`:{let e=await L(i);if(e.skills.length===0)console.log(`No skills found in workspace (.agents/skills/).`);else{console.log(`Available skills (${e.skills.length}):\n`);for(let t of e.skills)console.log(` - ${t.name}: ${t.description||`No description`}`)}return e}case`tools`:{let e=r[0];if(e)return await z(e,r[1],i);let t=await R(i);console.log(`Available tools (${t.tools.length}):\n`);for(let e of t.tools){let t=e.headlessSafe?`[headless-safe]`:`[browser-only]`;console.log(` - ${e.name.padEnd(25)} ${t} ${e.description||``}`)}return t}case`tool`:{let e=r[0];if(!e){console.error(`Error: Tool name required. Usage: shadow-claw agent tool <name> [input-json]`),l.exitCode=1;return}return await z(e,r[1],i)}case`skill`:{let e=r[0];if(!e){console.error(`Error: Skill name required. Usage: shadow-claw agent skill <name>`),l.exitCode=1;return}return await V(e,i)}case`clear`:return await B(i);case`run`:return await U(r.join(` `)||`-`,i);case`models`:case`model`:{let e=r[0]||`list`,t=r[1];return await W(e,t,i)}case`import`:{let e=r[0];return e?await G(e,i):(console.error(`Error: Discovery URL or site URL required. Usage: shadow-claw agent import <url> [options]`),l.exitCode=1,{success:!1,error:`Discovery URL or site URL required. Usage: shadow-claw agent import <url> [options]`})}case`listen`:return await(i.listenFn||(async e=>{let{runWebRtcListenCommand:t}=await import(`./chunk-ComXUwW0.js`);return t(e)}))({...i,agent:!0});default:console.log(`Usage: shadow-claw agent <init|model|skills|tools|tool|skill|import|run|clear|listen> [args...]`)}}export{I as a,V as c,R as d,k as f,G as i,L as l,S as m,B as n,W as o,D as p,K as r,U as s,H as t,z as u};
@@ -0,0 +1 @@
1
+ export{t as fetchDiscoveryManifest}from"./chunk-Q4BZ9QN9.js";
@@ -0,0 +1 @@
1
+ export{r as orchestratorStore}from"./chunk-BV9JBYpl.js";
@@ -1,2 +1,2 @@
1
- import{r as e}from"./chunk-Cpdoq2Nw.js";import{T as t,h as n,r}from"./chunk-DajM7Kro.js";import"./chunk-D-kV2FND.js";import{t as i}from"./chunk-CcMGBEzH.js";import{a}from"./chunk-D7bFIUK3.js";import{t as o}from"./chunk-DojiYody.js";async function s(e,...t){let n=e;for(let e of t){let t=await n.getDirectoryHandle(e,{create:!0});if(typeof n.isSameEntry==`function`&&await n.isSameEntry(t))throw Error(`Directory navigation failed: "${e}" resolved to the same directory as its parent. The stored directory handle may be stale — try re-selecting the storage folder.`);n=t}return n}let c=null;async function l(e,t){try{return await e.entries().next(),`granted`}catch{return t}}function u(){let e=t();return e?`${n}-${e}`:n}async function d(){try{if(typeof navigator<`u`&&navigator.storage&&typeof navigator.storage.getDirectory==`function`){let e=await navigator.storage.getDirectory(),t=u();return await e.getDirectoryHandle(t,{create:!0})}}catch(e){console.warn(`OPFS is unavailable (e.g. Firefox Private Browsing). Using in-memory storage fallback:`,e)}return a()}function f(e){if(!e||typeof e!=`object`)return!1;let t=globalThis.FileSystemDirectoryHandle;return t!==void 0&&e instanceof t||typeof e.getDirectoryHandle==`function`&&typeof e.getFileHandle==`function`}async function p(e){if(c)return c;try{let t=await i(e,r.STORAGE_HANDLE);if(f(t)){let e=t;if(typeof e.queryPermission==`function`&&await e.queryPermission({mode:`readwrite`})!==`granted`&&typeof e.requestPermission==`function`)try{await e.requestPermission({mode:`readwrite`})}catch{}return e}}catch(e){console.warn(`Failed to retrieve local storage handle from DB:`,e)}return d()}function m(e){c=e}function h(){c=null}function g(e){return e instanceof DOMException&&e.name===`InvalidStateError`}async function _(e){if(c)try{let e=await c.queryPermission({mode:`readwrite`});return{type:`local`,permission:e===`granted`?`granted`:await l(c,e),name:c.name}}catch{console.warn(`Getting storage status failed for explicit storage root.`)}try{let t=await i(e,r.STORAGE_HANDLE);if(f(t)){let e=t,n=await e.queryPermission({mode:`readwrite`});return{type:`local`,permission:n===`granted`?`granted`:await l(e,n),name:e.name}}}catch(e){console.warn(`Failed to check storage status:`,e)}return{type:`opfs`,permission:`granted`,name:`OPFS`}}async function v(t,n){let r=await p(t);return e()?r:s(r,`groups`,n.replace(/:/g,`-`))}function y(e){let t=e.replace(/\\/g,`/`).replace(/^\/home\/user\//,`/`).replace(/^\/+/,``).split(`/`).filter(Boolean);if(t.length===0)throw Error(`Empty file path`);let n=t.pop();if(t.some(e=>e===`..`||e===`.`)||n===`..`||n===`.`){let t=/* @__PURE__ */ Error(`SecurityError: Path traversal is not allowed: "${e}"`);throw t.name=`SecurityError`,t}return{dirs:t,filename:n||``}}async function b(e,t){let n=e?.createWritable,r=Reflect.get(e,`createWriteable`),i=typeof n==`function`?n.bind(e):typeof r==`function`?r.bind(e):null;if(i){let e=await i();await e.write(S(t)),await e.close()}else if(typeof e.createSyncAccessHandle==`function`){let n=await e.createSyncAccessHandle();try{let e=await C(t);n.truncate(0),n.write(e,{at:0}),typeof n.flush==`function`&&n.flush()}finally{n.close()}}else throw Error(`Writable file streams are not supported by this browser/storage backend.`)}async function x(e,t){if(typeof globalThis.Worker!=`function`)throw Error(`Writable file streams are not supported by this browser/storage backend.`);let n=await C(t);return new Promise((t,r)=>{let i=``,a=null;try{let e=[`self.onmessage = async (e) => {`,` try {`,` const { pathSegments, bytes } = e.data;`,` let dir = await navigator.storage.getDirectory();`,` for (let i = 0; i < pathSegments.length - 1; i++) {`,` dir = await dir.getDirectoryHandle(pathSegments[i], { create: true });`,` }`,` const filename = pathSegments[pathSegments.length - 1];`,` const fh = await dir.getFileHandle(filename, { create: true });`,` const h = await fh.createSyncAccessHandle();`,` try {`,` h.truncate(0);`,` h.write(bytes, { at: 0 });`,` if (typeof h.flush === 'function') h.flush();`,` } finally { h.close(); }`,` self.postMessage({ ok: true });`,` } catch (err) {`,` self.postMessage({ error: err.message || String(err) });`,` }`,`};`].join(`
1
+ import{r as e}from"./chunk-Cpdoq2Nw.js";import{T as t,h as n,r}from"./chunk-C79eIU-4.js";import"./chunk-D-kV2FND.js";import{t as i}from"./chunk-CcMGBEzH.js";import{a}from"./chunk-DGu1OhJs.js";import{t as o}from"./chunk-DToVgO9a.js";async function s(e,...t){let n=e;for(let e of t){let t=await n.getDirectoryHandle(e,{create:!0});if(typeof n.isSameEntry==`function`&&await n.isSameEntry(t))throw Error(`Directory navigation failed: "${e}" resolved to the same directory as its parent. The stored directory handle may be stale — try re-selecting the storage folder.`);n=t}return n}let c=null;async function l(e,t){try{return await e.entries().next(),`granted`}catch{return t}}function u(){let e=t();return e?`${n}-${e}`:n}async function d(){try{if(typeof navigator<`u`&&navigator.storage&&typeof navigator.storage.getDirectory==`function`){let e=await navigator.storage.getDirectory(),t=u();return await e.getDirectoryHandle(t,{create:!0})}}catch(e){console.warn(`OPFS is unavailable (e.g. Firefox Private Browsing). Using in-memory storage fallback:`,e)}return a()}function f(e){if(!e||typeof e!=`object`)return!1;let t=globalThis.FileSystemDirectoryHandle;return t!==void 0&&e instanceof t||typeof e.getDirectoryHandle==`function`&&typeof e.getFileHandle==`function`}async function p(e){if(c)return c;try{let t=await i(e,r.STORAGE_HANDLE);if(f(t)){let e=t;if(typeof e.queryPermission==`function`&&await e.queryPermission({mode:`readwrite`})!==`granted`&&typeof e.requestPermission==`function`)try{await e.requestPermission({mode:`readwrite`})}catch{}return e}}catch(e){console.warn(`Failed to retrieve local storage handle from DB:`,e)}return d()}function m(e){c=e}function h(){c=null}function g(e){return e instanceof DOMException&&e.name===`InvalidStateError`}async function _(e){if(c)try{let e=await c.queryPermission({mode:`readwrite`});return{type:`local`,permission:e===`granted`?`granted`:await l(c,e),name:c.name}}catch{console.warn(`Getting storage status failed for explicit storage root.`)}try{let t=await i(e,r.STORAGE_HANDLE);if(f(t)){let e=t,n=await e.queryPermission({mode:`readwrite`});return{type:`local`,permission:n===`granted`?`granted`:await l(e,n),name:e.name}}}catch(e){console.warn(`Failed to check storage status:`,e)}return{type:`opfs`,permission:`granted`,name:`OPFS`}}async function v(t,n){let r=await p(t);return e()?r:s(r,`groups`,n.replace(/:/g,`-`))}function y(e){let t=e.replace(/\\/g,`/`).replace(/^\/home\/user\//,`/`).replace(/^\/+/,``).split(`/`).filter(Boolean);if(t.length===0)throw Error(`Empty file path`);let n=t.pop();if(t.some(e=>e===`..`||e===`.`)||n===`..`||n===`.`){let t=/* @__PURE__ */ Error(`SecurityError: Path traversal is not allowed: "${e}"`);throw t.name=`SecurityError`,t}return{dirs:t,filename:n||``}}async function b(e,t){let n=e?.createWritable,r=Reflect.get(e,`createWriteable`),i=typeof n==`function`?n.bind(e):typeof r==`function`?r.bind(e):null;if(i){let e=await i();await e.write(S(t)),await e.close()}else if(typeof e.createSyncAccessHandle==`function`){let n=await e.createSyncAccessHandle();try{let e=await C(t);n.truncate(0),n.write(e,{at:0}),typeof n.flush==`function`&&n.flush()}finally{n.close()}}else throw Error(`Writable file streams are not supported by this browser/storage backend.`)}async function x(e,t){if(typeof globalThis.Worker!=`function`)throw Error(`Writable file streams are not supported by this browser/storage backend.`);let n=await C(t);return new Promise((t,r)=>{let i=``,a=null;try{let e=[`self.onmessage = async (e) => {`,` try {`,` const { pathSegments, bytes } = e.data;`,` let dir = await navigator.storage.getDirectory();`,` for (let i = 0; i < pathSegments.length - 1; i++) {`,` dir = await dir.getDirectoryHandle(pathSegments[i], { create: true });`,` }`,` const filename = pathSegments[pathSegments.length - 1];`,` const fh = await dir.getFileHandle(filename, { create: true });`,` const h = await fh.createSyncAccessHandle();`,` try {`,` h.truncate(0);`,` h.write(bytes, { at: 0 });`,` if (typeof h.flush === 'function') h.flush();`,` } finally { h.close(); }`,` self.postMessage({ ok: true });`,` } catch (err) {`,` self.postMessage({ error: err.message || String(err) });`,` }`,`};`].join(`
2
2
  `);i=URL.createObjectURL(new Blob([e],{type:`text/javascript`})),a=new Worker(o(i))}catch{i&&URL.revokeObjectURL(i),r(/* @__PURE__ */ Error(`Writable file streams are not supported by this browser/storage backend.`));return}let s=()=>{a&&a.terminate(),URL.revokeObjectURL(i)};a.onmessage=e=>{s(),e.data?.error?r(Error(e.data.error)):t()},a.onerror=e=>{s(),r(Error(e.message||`Worker file write failed`))},a.postMessage({pathSegments:e,bytes:n},[n.buffer])})}function S(e){if(typeof e==`string`||e instanceof Blob)return e;if(e instanceof Uint8Array){let t=new Uint8Array(e.byteLength);return t.set(e),new Blob([t])}return new Blob([e])}async function C(e){return e instanceof Uint8Array?e:typeof e==`string`?new TextEncoder().encode(e):e instanceof Blob?new Uint8Array(await e.arrayBuffer()):e instanceof ArrayBuffer?new Uint8Array(e):/* @__PURE__ */ new Uint8Array}export{u as a,h as c,v as i,g as l,x as n,p as o,y as r,_ as s,b as t,m as u};
@@ -1 +1 @@
1
- import{c as e,i as t,s as n}from"./chunk-C4iW1XuQ.js";function r(e){return n(e,{replacement:`-`,fallback:`attachment`,stripLeadingDots:!0,collapseReplacement:!0,stripControlChars:!0})}function i(e,t=``,n=Date.now()){let i=r(e),a=t.trim().replace(/[^a-zA-Z0-9._-]+/g,`-`).replace(/^-+|-+$/g,``);return`attachments/${n}-${a?`${a}-`:``}${i}`}async function a(n,a,c=[]){let l=[];for(let u of c){let c=r(u.fileName||``),d=u.path||i(c,u.id),f=u.source,p=t(c,u.mimeType||``),m=u.size;if(f){let r=await o(f);p=t(c,u.mimeType||r.type),m=typeof m==`number`?m:r.size,await e(n,a,d,r)}l.push(s({...u,fileName:c,mimeType:p,size:m,path:d,previewDisposition:u.previewDisposition||(p===`image/png`?`inline`:`file`)}))}return l}async function o(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 s(e){let{source:t,...n}=e;return n}export{r as n,a as t};
1
+ import{c as e,i as t,s as n}from"./chunk-DnRcu9b4.js";function r(e){return n(e,{replacement:`-`,fallback:`attachment`,stripLeadingDots:!0,collapseReplacement:!0,stripControlChars:!0})}function i(e,t=``,n=Date.now()){let i=r(e),a=t.trim().replace(/[^a-zA-Z0-9._-]+/g,`-`).replace(/^-+|-+$/g,``);return`attachments/${n}-${a?`${a}-`:``}${i}`}async function a(n,a,c=[]){let l=[];for(let u of c){let c=r(u.fileName||``),d=u.path||i(c,u.id),f=u.source,p=t(c,u.mimeType||``),m=u.size;if(f){let r=await o(f);p=t(c,u.mimeType||r.type),m=typeof m==`number`?m:r.size,await e(n,a,d,r)}l.push(s({...u,fileName:c,mimeType:p,size:m,path:d,previewDisposition:u.previewDisposition||(p===`image/png`?`inline`:`file`)}))}return l}async function o(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 s(e){let{source:t,...n}=e;return n}export{r as n,a as t};
@@ -1,4 +1,4 @@
1
- import{t as e}from"./chunk-BChOKoxf.js";import{t}from"./chunk-gAdqVxWq.js";import{a as n,i as r,n as i,r as a,t as o}from"./chunk-Cpdoq2Nw.js";import{c as s,o as c,u as l}from"./chunk-C3dTAmV_.js";import{_ as u,b as d,g as f,l as p,r as m,s as h,y as g}from"./chunk-DajM7Kro.js";import{i as _,n as v,r as y}from"./chunk-D-kV2FND.js";import{n as b,t as x}from"./chunk-DjKQO7aV.js";import{t as S}from"./chunk-CcMGBEzH.js";import{t as C}from"./chunk-DojiYody.js";import{A as w,B as T,C as E,D,E as O,F as k,G as A,H as j,I as M,J as ee,K as N,L as te,M as ne,N as re,O as ie,P,R as F,S as ae,T as I,U as L,V as R,W as z,Y as oe,_ as B,a as se,b as ce,c as le,d as ue,f as de,g as fe,h as pe,i as me,j as he,k as ge,l as _e,m as ve,o as ye,p as V,q as be,s as xe,u as Se,v as Ce,w as we,x as Te,y as Ee,z as H}from"./chunk-DVMcK7g6.js";import{d as De,i as Oe,l as ke,n as Ae,r as je,t as Me}from"./chunk-BT_C3OlA.js";import{t as Ne}from"./chunk-CuwzD5GU.js";import{n as Pe,t as Fe}from"./chunk-D-iqEY5G.js";import{createRequire as Ie}from"node:module";import Le,{constants as Re,existsSync as ze}from"node:fs";import U from"node:path";import{fileURLToPath as Be}from"node:url";import{env as Ve}from"node:process";import{exec as He,spawn as Ue}from"node:child_process";import{access as We,mkdir as Ge,readFile as Ke,readdir as qe,rename as Je,rm as Ye,rmdir as Xe,stat as W,unlink as Ze,writeFile as G}from"node:fs/promises";import{EventEmitter as Qe}from"node:events";import{isIP as $e}from"node:net";import{runInNewContext as et}from"node:vm";import{DatabaseSync as tt}from"node:sqlite";var nt=class{kind=`file`;name;_path;constructor(e){this._path=e,this.name=U.basename(e)}async isSameEntry(e){return!e||typeof e!=`object`?!1:e.kind===this.kind&&e._path===this._path}async getFile(){let e=await Ke(this._path);return{size:e.length,type:`application/octet-stream`,async text(){return e.toString(`utf8`)},async arrayBuffer(){return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)}}}async createWritable(){let e=[],t=this._path,n=async t=>{if(typeof t==`string`)e.push(Buffer.from(t,`utf8`));else if(t instanceof Uint8Array)e.push(Buffer.from(t));else if(t instanceof ArrayBuffer)e.push(Buffer.from(t));else if(t instanceof Blob){if(typeof t.arrayBuffer==`function`){let n=await t.arrayBuffer();e.push(Buffer.from(n))}else if(typeof t.bytes==`function`){let n=await t.bytes();e.push(Buffer.from(n))}else if(typeof t.text==`function`){let n=await t.text();e.push(Buffer.from(n,`utf8`))}else if(t._buffer)e.push(Buffer.from(t._buffer));else if(typeof FileReader<`u`){let n=await new Promise((e,n)=>{let r=new FileReader;r.onload=()=>e(r.result),r.onerror=n,r.readAsArrayBuffer(t)});e.push(Buffer.from(n))}}else t&&typeof t==`object`&&`data`in t?await n(t.data):e.push(Buffer.from(new Uint8Array(t)))};return{write:n,async close(){let n=Buffer.concat(e);await G(t,n)}}}},rt=class e{kind=`directory`;name;_path;_rootPath;constructor(e,t){this._path=U.resolve(e),this._rootPath=t?U.resolve(t):this._path,this.name=U.basename(this._path)||this._path}_resolveChild(e){if(!e||e===`.`||e.includes(`\0`)){let t=/* @__PURE__ */ Error(`Invalid path name: "${e}"`);throw t.name=`TypeError`,t}let t=U.resolve(this._path,e),n=U.relative(this._path,t),r=U.relative(this._rootPath,t);if(n.startsWith(`..`)||U.isAbsolute(n)||r.startsWith(`..`)||U.isAbsolute(r)){let t=/* @__PURE__ */ Error(`SecurityError: Path traversal outside workspace root is not allowed: "${e}"`);throw t.name=`SecurityError`,t}return t}async getDirectoryHandle(t,n){let r=this._resolveChild(t);if(n?.create)await Ge(r,{recursive:!0});else if(!ze(r)){let e=/* @__PURE__ */ Error(`NotFoundError: ${r} does not exist`);throw e.name=`NotFoundError`,e}if(!(await W(r)).isDirectory()){let e=/* @__PURE__ */ Error(`TypeMismatchError: "${t}" is a file, not a directory`);throw e.name=`TypeMismatchError`,e}return new e(r,this._rootPath)}async getFileHandle(e,t){let n=this._resolveChild(e);if(t?.create)ze(n)||await G(n,``);else if(!ze(n)){let e=/* @__PURE__ */ Error(`NotFoundError: ${n} does not exist`);throw e.name=`NotFoundError`,e}if((await W(n)).isDirectory()){let t=/* @__PURE__ */ Error(`TypeMismatchError: "${e}" is a directory, not a file`);throw t.name=`TypeMismatchError`,t}return new nt(n)}async*entries(){let t;try{t=await qe(this._path)}catch{return}for(let n of t){let t=U.join(this._path,n);try{(await W(t)).isDirectory()?yield[n,new e(t,this._rootPath)]:yield[n,new nt(t)]}catch{}}}async isSameEntry(e){return!e||typeof e!=`object`?!1:e.kind===this.kind&&e._path===this._path}async removeEntry(e,t){let n=this._resolveChild(e);if(!ze(n)){let e=/* @__PURE__ */ Error(`NotFoundError: ${n} does not exist`);throw e.name=`NotFoundError`,e}if((await W(n)).isDirectory()){if(t?.recursive)await Ye(n,{recursive:!0});else try{await Xe(n)}catch(t){if(t.code===`ENOTEMPTY`){let t=/* @__PURE__ */ Error(`InvalidModificationError: directory is not empty: "${e}"`);throw t.name=`InvalidModificationError`,t}throw t}}else await Ze(n)}};let it=null;function at(){return it}function ot(e){it=U.resolve(e),l(new rt(e))}globalThis.__setStorageRootFromPath=ot,globalThis.__getStorageRootPath=at;const st=({command:e,stdin:t,timeoutSec:n})=>new Promise(r=>{let i=at?.()??globalThis.__getStorageRootPath?.()??process.cwd(),a=He(e,{timeout:n*1e3,maxBuffer:10485760,cwd:i},(e,t,n)=>{let i=t||``;n&&(i+=(i?`
1
+ import{t as e}from"./chunk-BChOKoxf.js";import{t}from"./chunk-gAdqVxWq.js";import{a as n,i as r,n as i,r as a,t as o}from"./chunk-Cpdoq2Nw.js";import{c as s,o as c,u as l}from"./chunk-rstVU7U0.js";import{_ as u,b as d,g as f,l as p,r as m,s as h,y as g}from"./chunk-C79eIU-4.js";import{i as _,n as v,r as y}from"./chunk-D-kV2FND.js";import{n as b,t as x}from"./chunk-DjKQO7aV.js";import{t as S}from"./chunk-CcMGBEzH.js";import{t as C}from"./chunk-DToVgO9a.js";import{A as w,B as T,C as E,D,E as O,F as k,G as A,H as j,I as M,J as ee,K as N,L as te,M as ne,N as re,O as ie,P,R as F,S as ae,T as I,U as L,V as R,W as z,Y as oe,_ as B,a as se,b as ce,c as le,d as ue,f as de,g as fe,h as pe,i as me,j as he,k as ge,l as _e,m as ve,o as ye,p as V,q as be,s as xe,u as Se,v as Ce,w as we,x as Te,y as Ee,z as H}from"./chunk-Du4qvxo_.js";import{d as De,i as Oe,l as ke,n as Ae,r as je,t as Me}from"./chunk-CcSTYHtR.js";import{t as Ne}from"./chunk-CuwzD5GU.js";import{n as Pe,t as Fe}from"./chunk-DJ_LeQtz.js";import{createRequire as Ie}from"node:module";import Le,{constants as Re,existsSync as ze}from"node:fs";import U from"node:path";import{fileURLToPath as Be}from"node:url";import{env as Ve}from"node:process";import{exec as He,spawn as Ue}from"node:child_process";import{access as We,mkdir as Ge,readFile as Ke,readdir as qe,rename as Je,rm as Ye,rmdir as Xe,stat as W,unlink as Ze,writeFile as G}from"node:fs/promises";import{EventEmitter as Qe}from"node:events";import{isIP as $e}from"node:net";import{runInNewContext as et}from"node:vm";import{DatabaseSync as tt}from"node:sqlite";var nt=class{kind=`file`;name;_path;constructor(e){this._path=e,this.name=U.basename(e)}async isSameEntry(e){return!e||typeof e!=`object`?!1:e.kind===this.kind&&e._path===this._path}async getFile(){let e=await Ke(this._path);return{size:e.length,type:`application/octet-stream`,async text(){return e.toString(`utf8`)},async arrayBuffer(){return e.buffer.slice(e.byteOffset,e.byteOffset+e.byteLength)}}}async createWritable(){let e=[],t=this._path,n=async t=>{if(typeof t==`string`)e.push(Buffer.from(t,`utf8`));else if(t instanceof Uint8Array)e.push(Buffer.from(t));else if(t instanceof ArrayBuffer)e.push(Buffer.from(t));else if(t instanceof Blob){if(typeof t.arrayBuffer==`function`){let n=await t.arrayBuffer();e.push(Buffer.from(n))}else if(typeof t.bytes==`function`){let n=await t.bytes();e.push(Buffer.from(n))}else if(typeof t.text==`function`){let n=await t.text();e.push(Buffer.from(n,`utf8`))}else if(t._buffer)e.push(Buffer.from(t._buffer));else if(typeof FileReader<`u`){let n=await new Promise((e,n)=>{let r=new FileReader;r.onload=()=>e(r.result),r.onerror=n,r.readAsArrayBuffer(t)});e.push(Buffer.from(n))}}else t&&typeof t==`object`&&`data`in t?await n(t.data):e.push(Buffer.from(new Uint8Array(t)))};return{write:n,async close(){let n=Buffer.concat(e);await G(t,n)}}}},rt=class e{kind=`directory`;name;_path;_rootPath;constructor(e,t){this._path=U.resolve(e),this._rootPath=t?U.resolve(t):this._path,this.name=U.basename(this._path)||this._path}_resolveChild(e){if(!e||e===`.`||e.includes(`\0`)){let t=/* @__PURE__ */ Error(`Invalid path name: "${e}"`);throw t.name=`TypeError`,t}let t=U.resolve(this._path,e),n=U.relative(this._path,t),r=U.relative(this._rootPath,t);if(n.startsWith(`..`)||U.isAbsolute(n)||r.startsWith(`..`)||U.isAbsolute(r)){let t=/* @__PURE__ */ Error(`SecurityError: Path traversal outside workspace root is not allowed: "${e}"`);throw t.name=`SecurityError`,t}return t}async getDirectoryHandle(t,n){let r=this._resolveChild(t);if(n?.create)await Ge(r,{recursive:!0});else if(!ze(r)){let e=/* @__PURE__ */ Error(`NotFoundError: ${r} does not exist`);throw e.name=`NotFoundError`,e}if(!(await W(r)).isDirectory()){let e=/* @__PURE__ */ Error(`TypeMismatchError: "${t}" is a file, not a directory`);throw e.name=`TypeMismatchError`,e}return new e(r,this._rootPath)}async getFileHandle(e,t){let n=this._resolveChild(e);if(t?.create)ze(n)||await G(n,``);else if(!ze(n)){let e=/* @__PURE__ */ Error(`NotFoundError: ${n} does not exist`);throw e.name=`NotFoundError`,e}if((await W(n)).isDirectory()){let t=/* @__PURE__ */ Error(`TypeMismatchError: "${e}" is a directory, not a file`);throw t.name=`TypeMismatchError`,t}return new nt(n)}async*entries(){let t;try{t=await qe(this._path)}catch{return}for(let n of t){let t=U.join(this._path,n);try{(await W(t)).isDirectory()?yield[n,new e(t,this._rootPath)]:yield[n,new nt(t)]}catch{}}}async isSameEntry(e){return!e||typeof e!=`object`?!1:e.kind===this.kind&&e._path===this._path}async removeEntry(e,t){let n=this._resolveChild(e);if(!ze(n)){let e=/* @__PURE__ */ Error(`NotFoundError: ${n} does not exist`);throw e.name=`NotFoundError`,e}if((await W(n)).isDirectory()){if(t?.recursive)await Ye(n,{recursive:!0});else try{await Xe(n)}catch(t){if(t.code===`ENOTEMPTY`){let t=/* @__PURE__ */ Error(`InvalidModificationError: directory is not empty: "${e}"`);throw t.name=`InvalidModificationError`,t}throw t}}else await Ze(n)}};let it=null;function at(){return it}function ot(e){it=U.resolve(e),l(new rt(e))}globalThis.__setStorageRootFromPath=ot,globalThis.__getStorageRootPath=at;const st=({command:e,stdin:t,timeoutSec:n})=>new Promise(r=>{let i=at?.()??globalThis.__getStorageRootPath?.()??process.cwd(),a=He(e,{timeout:n*1e3,maxBuffer:10485760,cwd:i},(e,t,n)=>{let i=t||``;n&&(i+=(i?`
2
2
  `:``)+n),e&&!i&&(i=e.message),r(i)});t&&a.stdin&&(a.stdin.write(t),a.stdin.end())});F(st),globalThis.__headlessBashExecutor=st;function ct(e,t,n){let r=t.input_tokens||0,i=t.output_tokens||0,a=t.cache_read_input_tokens||0,o=t.cache_creation_input_tokens||0;return{type:`token-usage`,payload:{groupId:e,inputTokens:r,outputTokens:i,cacheReadTokens:a,cacheCreationTokens:o,totalTokens:r+i+a+o,contextLimit:n}}}function K(e,t,n,r){H(z(e,t,n,r))}async function*lt(e,t){let n=e.getReader(),r=new TextDecoder,i=``;try{for(;!t?.aborted;){let{done:e,value:t}=await n.read();if(e)break;i+=r.decode(t,{stream:!0});let a=i.split(`
3
3
 
4
4
  `);i=a.pop()||``;for(let e of a){let t=e.split(`
package/dist/cli/cli.js CHANGED
@@ -1,4 +1,4 @@
1
- import{t as e}from"./chunk-uAI_Zi6n.js";import{f as t,p as n,r}from"./chunk-CegcvNc9.js";import{t as i}from"./chunk-DYq-orHK.js";import{c as a,i as o,o as s,s as c}from"./chunk-YrgA1KKk.js";import{t as l}from"./chunk-sC-eQ-Nh.js";import{t as u}from"./chunk-Cpdoq2Nw.js";import{n as d}from"./chunk-BQveaAaD.js";import{t as f}from"./chunk-BU8UG4L_.js";import{r as p}from"./chunk-BM1nUAbW.js";import m from"node:fs";import h from"node:path";import{fileURLToPath as g}from"node:url";import _ from"node:process";import{exec as v}from"node:child_process";import{mkdir as y,mkdtemp as b,readFile as x,stat as S,writeFile as C}from"node:fs/promises";import{Command as w}from"commander";import T from"process";import E from"node:http";import{tmpdir as D}from"node:os";import ee from"node:readline";async function O(e={}){let t=new l(e);try{let e=await t.listClients();if(!e||e.length===0){console.log(`No clients currently registered or connected.`);return}console.log(`Connected / registered clients (${e.length}):\n`),e.forEach((e,t)=>{let n=Math.max(0,Math.floor((Date.now()-e.lastSeen)/1e3)),r=n<60?`${n}s ago`:`${Math.floor(n/60)}m ago`;console.log(` ${t+1}. ${e.deviceLabel} (id: ${e.clientId})`),e.peerId&&console.log(` Peer ID: ${e.peerId}`),console.log(` Capabilities: ${e.capabilities.join(`, `)||`none`}`),console.log(` Version: ${e.version}`),console.log(` Last seen: ${r}\n`)})}catch(e){console.error(`Error fetching clients: ${e.message}`),T.exitCode=1}}async function te(e,t={}){if(!e||typeof e!=`string`||!e.trim()){console.error(`Error: Message cannot be empty.`),T.exitCode=1;return}let n=new l(t);try{let r=t.client;if(!r){let e=await n.listClients();if(!e||e.length===0){console.error(`Error: No clients are connected.`),T.exitCode=1;return}r=e[0].clientId,console.log(`Targeting client: ${e[0].deviceLabel||r} (${r})`)}let i=r||``,a=t.timeout?Number(t.timeout)*1e3:12e4,o;if(t.file?(console.log(`Sending message with file "${t.file}" to ${i}...`),o=await n.sendFile(i,t.file,{prompt:e.trim(),groupId:t.group,timeoutMs:a})):(console.log(`Sending message to ${i}...`),o=await n.sendCommand(i,`send-message`,{text:e.trim(),groupId:t.group},a)),o.success){if(console.log(`Message successfully dispatched.`),o.data?.reply||o.data?.text){let e=o.data.reply||o.data.text;console.log(``),console.log(`Response from ${i}:`),console.log(`----------------------------------------`),console.log(e),console.log(`----------------------------------------`)}else o.data&&(t.json,console.log(JSON.stringify(o.data,null,2)))}else console.error(`Error from client: ${o.error||`Unknown error`}`),T.exitCode=1}catch(e){console.error(`Error sending message: ${e.message}`),T.exitCode=1}}async function k(e,t={}){if(!e||typeof e!=`string`||!e.trim()){console.error(`Error: File path cannot be empty.`),T.exitCode=1;return}let n=h.resolve(e.trim());if(!m.existsSync(n)){console.error(`Error: File not found: ${e}`),T.exitCode=1;return}let r=m.statSync(n);if(r.isDirectory()){console.error(`Error: Cannot send directory: ${e}`),T.exitCode=1;return}let i=new l(t);try{let e=t.client;if(!e){let t=await i.listClients();if(!t||t.length===0){console.error(`Error: No clients are connected.`),T.exitCode=1;return}e=t[0].clientId,console.log(`Targeting client: ${t[0].deviceLabel||e} (${e})`)}let a=e||``,o=t.name||h.basename(n);console.log(`Sending "${o}" (${r.size} bytes) to ${a}...`);let s=t.timeout?Number(t.timeout)*1e3:12e4,c=await i.sendFile(a,n,{prompt:t.prompt,name:t.name,groupId:t.group,timeoutMs:s});if(c.success){if(console.log(`File "${o}" successfully transferred to ${a}.`),c.data?.path&&console.log(`Remote location: ${c.data.path}`),c.data?.reply||c.data?.text){let e=c.data.reply||c.data.text;console.log(``),console.log(`Response from ${a}:`),console.log(`----------------------------------------`),console.log(e),console.log(`----------------------------------------`)}else t.json&&c.data&&console.log(JSON.stringify(c.data,null,2))}else console.error(`Error from client: ${c.error||`Unknown error`}`),T.exitCode=1}catch(e){console.error(`Error sending file: ${e.message}`),T.exitCode=1}}async function A(e=`trigger`,t={}){let n=new l(t);try{if(e===`list`){let e=await n.listBackups(t.client);if(!e||e.length===0){console.log(`No backups found.`);return}console.log(`Available backups (${e.length}):\n`),e.forEach((e,t)=>{let n=new Date(e.timestamp).toISOString(),r=(e.totalBytes/1048576).toFixed(2);console.log(` ${t+1}. [${e.id}] Client: ${e.clientId}`),console.log(` Date: ${n}`),console.log(` Files: ${e.fileCount} (${r} MB)\n`)});return}if(e===`delete`){if(!t.backupId){console.error(`Error: --backup-id is required for delete action.`),T.exitCode=1;return}await n.deleteBackup(t.backupId,t.client),console.log(`Backup ${t.backupId} deleted.`);return}let r=t.client;if(!r){let e=await n.listClients();if(!e||e.length===0){console.error(`Error: No clients are connected to back up.`),T.exitCode=1;return}r=e[0].clientId}let i=r||``;console.log(`Requesting backup from client ${i}...`);let a=await n.sendCommand(i,`trigger-backup`,{groupId:t.group,token:n.token});a.success?(console.log(`Backup completed successfully.`),console.log(JSON.stringify(a.data,null,2))):(console.error(`Backup failed: ${a.error}`),T.exitCode=1)}catch(e){console.error(`Error executing backup command: ${e.message}`),T.exitCode=1}}async function j(e={}){let t=new l(e);try{let n=e.client;if(!n){let e=await t.listClients();if(!e||e.length===0){console.error(`Error: No clients connected.`),T.exitCode=1;return}n=e[0].clientId}let r=n||``;console.log(`Fetching tasks from client ${r}${e.group?` (group: ${e.group})`:``}...`);let i=await t.sendCommand(r,`list-tasks`,{groupId:e.group});if(i.success){let t=i.data?.tasks||[];if(t.length===0){console.log(e.group?`No tasks configured on client for group "${e.group}".`:`No tasks configured on client.`);return}console.log(`Tasks on ${n}${e.group?` (group: ${e.group})`:``} (${t.length}):\n`),t.forEach((e,t)=>{let n=e.enabled?`[enabled]`:`[disabled]`,r=e.name||e.prompt?.slice(0,30)||`Untitled task`;console.log(` ${t+1}. ${n} ${r} (${e.schedule||`manual`})`)})}else console.error(`Failed to list tasks: ${i.error}`),T.exitCode=1}catch(e){console.error(`Error executing tasks command: ${e.message}`),T.exitCode=1}}async function M(e=`get`,t={}){let n=t.cacheDir,r=o(n),i=!!(t.renew||e===`renew`||e===`generate`||e===`new`),l=t.set||(e===`set`&&t.id?t.id:null),u=``,d=!1;if(l)u=a(l,n),d=!0;else if(i)u=a(void 0,n),d=!0;else{let e=c(n);e?(u=e,d=!1):(u=s(void 0,n),d=!0)}return t.quiet?(console.log(u),{peerId:u,filePath:r,isRenewed:d}):t.json?(console.log(JSON.stringify({peerId:u,filePath:r,renewed:d},null,2)),{peerId:u,filePath:r,isRenewed:d}):(console.log(l?`WebRTC CLI Peer ID set to: ${u}`:d?`WebRTC CLI Peer ID created/renewed: ${u}`:`WebRTC CLI Peer ID: ${u}`),console.log(`Stored in: ${r}`),{peerId:u,filePath:r,isRenewed:d})}function N(e,t){return typeof e==`string`?t===`raw`?e.startsWith(`shadowclaw_client_`)?e.slice(18):e:e.startsWith(`shadowclaw_client_`)?e:`shadowclaw_client_${e}`:e}function P(e){return N(e,`raw`)}function F(e){return N(e,`exposed`)}const I=[{name:`shadowclaw_server_list_clients`,description:`List connected browser and Electron clients, including device type, ID, and active capabilities.`,inputSchema:{type:`object`,properties:{}}},{name:`shadowclaw_server_send_message`,description:`Send a message or prompt to a connected ShadowClaw client's active AI orchestrator queue.`,inputSchema:{type:`object`,properties:{text:{type:`string`,description:`The prompt or message text to dispatch.`},clientId:{type:`string`,description:`Target client ID. If omitted, targets the first available connected client.`},groupId:{type:`string`,description:`Target conversation group ID (e.g. 'br:main'). If omitted, targets the active group.`}},required:[`text`]}},{name:`shadowclaw_server_read_state`,description:`Read the current orchestrator state (idle, responding, etc.), active group ID, and capabilities from a connected client.`,inputSchema:{type:`object`,properties:{clientId:{type:`string`,description:`Target client ID (defaults to first available connected client).`}}}},{name:`shadowclaw_server_list_tasks`,description:`List scheduled background tasks configured on a connected client (optionally filtered by conversation group).`,inputSchema:{type:`object`,properties:{clientId:{type:`string`,description:`Target client ID (defaults to first available connected client).`},groupId:{type:`string`,description:`Optional conversation group ID filter.`}}}},{name:`shadowclaw_server_set_active_client`,description:`Set the active default connected client used when no clientId is explicitly provided in tool calls.`,inputSchema:{type:`object`,properties:{clientId:{type:`string`,description:`Target client ID (or index '0', '1', prefix, or device label) to make active.`}},required:[`clientId`]}},{name:`shadowclaw_server_manage_backup`,description:`Trigger or manage OPFS workspace file backups for a connected client (trigger, list, or delete).`,inputSchema:{type:`object`,properties:{action:{type:`string`,enum:[`trigger`,`list`,`delete`],description:`Backup action to perform (default: 'trigger').`,default:`trigger`},clientId:{type:`string`,description:`Target client ID.`},backupId:{type:`string`,description:`Backup snapshot ID (required for 'delete').`},groupId:{type:`string`,description:`Optional workspace conversation group ID.`}}}},{name:`shadowclaw_server_status`,description:`Query ShadowClaw Node server status, version, and active client count.`,inputSchema:{type:`object`,properties:{}}},{name:`shadowclaw_server_send_notification`,description:`Broadcast an OS-level push notification to subscribed devices via Web Push (VAPID), or send to a specific registered client. Works even when the client browser tab is closed, asleep, or running in the background.`,inputSchema:{type:`object`,properties:{title:{type:`string`,description:`Notification title (default: 'ShadowClaw').`},body:{type:`string`,description:`The notification body message text.`},clientId:{type:`string`,description:`Target client ID, prefix, or device label of a specific client that has registered in the past. If omitted, broadcasts to all subscribed devices.`}},required:[`body`]}}];function L(e,t){try{let n=typeof e.getConnectedClients==`function`?e.getConnectedClients():typeof e.listClients==`function`?e.listClients():[];if(Array.isArray(n)&&n.length>0){if(typeof t==`string`&&t.trim()){let e=t.trim(),r=n.find(t=>(t.clientId||t.id)===e);if(r)return r.clientId||r.id||``;let i=parseInt(e,10);if(!isNaN(i)&&i>=0&&i<n.length)return n[i].clientId||n[i].id||``;let a=n.find(t=>(t.clientId||t.id||``).startsWith(e)||(t.clientId||t.id||``).replace(/^client-/,``).startsWith(e));if(a)return a.clientId||a.id||``;let o=n.find(t=>t.deviceLabel?.toLowerCase().includes(e.toLowerCase()));return o?o.clientId||o.id||``:e}if(typeof e.getActiveClientId==`function`){let t=e.getActiveClientId();if(t)return t}return n[0].clientId||n[0].id||``}}catch{}return typeof t==`string`?t.trim():``}const ne=h.dirname(g(import.meta.url));function re(){try{let e=h.resolve(ne,`../../../package.json`);if(m.existsSync(e)){let t=JSON.parse(m.readFileSync(e,`utf8`));if(t.version)return t.version}}catch{}return`1.27.1`}const R=`shadowclaw_local_`,ie=I;function z(e,t=R){let n=e.inputSchema||e.input_schema,r=n&&typeof n==`object`?{...n,type:n.type||`object`,properties:n.properties||{}}:{type:`object`,properties:{}};return{name:t?`${t}${e.name}`:e.name,description:e.description||`CLI agent tool: ${e.name}`,inputSchema:r,annotations:e.annotations}}function B(e,t,n){let r=!1,i=[];return Array.isArray(e)?i=e.map(e=>e&&typeof e==`object`?e.type===`image`?{type:`image`,data:e.data||``,mimeType:e.media_type||e.mimeType||`image/png`}:e.type===`text`?{type:`text`,text:String(e.text??``)}:{type:`text`,text:JSON.stringify(e,null,2)}:{type:`text`,text:String(e??``)}):typeof e==`string`?((e.toLowerCase().startsWith(`error`)||e.toLowerCase().startsWith(`tool error`)||e.includes(`SecurityError`)||e.startsWith(`Tool "`)&&e.includes(`is not allowed`)||e.startsWith(`Tool "`)&&e.includes(`is not available`))&&(r=!0),i=[{type:`text`,text:e}]):e&&typeof e==`object`?((e.error||e.success===!1)&&(r=!0),i=[{type:`text`,text:JSON.stringify(e,null,2)}]):i=[{type:`text`,text:String(e??``)}],{jsonrpc:`2.0`,id:n,result:{resultType:`complete`,isError:r,content:i,_meta:{"io.modelcontextprotocol/serverInfo":t}}}}function V(e={}){let n=e.client||new l(e),r=e.relayClientTools!==!1,i=e.targetClientId||e.clientTarget,a=i||``,o={name:`shadow-claw`,version:e.version||re()},s={tools:{listChanged:!0},extensions:{"io.modelcontextprotocol/tasks":{}}};async function c(e){let t=e||a||i;try{let e=await n.listClients();return L({getConnectedClients:()=>e},t)}catch{}return L(n,t)}let d=/* @__PURE__ */ new Map,p=/* @__PURE__ */ new Map,m=e.localTools!==!1,g=e.toolPrefix??`local`,_=g===`none`||g===``?``:g===`shadowclaw`?`shadowclaw_`:R,v=/* @__PURE__ */ new Map,x=null;async function S(){return x||=(async()=>{if(e.core&&e.db){let t;if(e.workspaceDir||e.workspace)t=e.workspaceDir||e.workspace;else{let e=h.join(D(),`shadow-claw`);await y(e,{recursive:!0}),t=await b(h.join(e,`workspace-`))}return{db:e.db,workspaceDir:t,core:e.core}}let n=e.core||await f(),r=e.workspaceDir||e.workspace,i=null,a=null,o=null;if(r)i=h.resolve(r),a=e.cacheDir?h.resolve(e.cacheDir):h.join(i,`.cache`),o=e.databaseDir?h.resolve(e.databaseDir):h.join(a,`database`);else try{let t=h.join(D(),`shadow-claw`);await y(t,{recursive:!0}),i=await b(h.join(t,`workspace-`)),a=e.cacheDir?h.resolve(e.cacheDir):await b(h.join(t,`cache-`)),o=e.databaseDir?h.resolve(e.databaseDir):h.join(a,`database`),await y(a,{recursive:!0}),await y(o,{recursive:!0})}catch(e){return console.error(`[ShadowClaw MCP] Warning: No --workspace provided and failed to initialize temporary fallback workspace (${e.message}). Local workspace tools are disabled.`),null}try{let r=await t({...e,workspace:i,cacheDir:a,databaseDir:o,yes:!0,quiet:!0,isTTY:!1,core:n});return{db:r.db,workspaceDir:r.workspaceDir,core:r.core}}catch(e){return console.error(`[ShadowClaw MCP] Warning: Failed to bootstrap headless agent context (${e.message}). Local workspace tools are disabled.`),null}})(),x}async function C(){if(!m)return[];let t;try{t=await S()}catch(e){return console.error(`[ShadowClaw MCP] Failed to initialize local agent context: ${e.message}`),[]}if(!t)return[];let{db:n,core:r}=t,i=e.group||r.DEFAULT_SERVER_GROUP_ID||`server:main`,a=null;if(e.toolsProfile||e.profile){let t=String(e.toolsProfile||e.profile).trim().toLowerCase(),i=r.DEFAULT_BUILTIN_PROFILE||null,o=[];if(typeof r.getConfig==`function`)try{let e=await r.getConfig(n,r.CONFIG_KEYS?.TOOL_PROFILES||`tool_profiles`);typeof e==`string`?o=JSON.parse(e):Array.isArray(e)&&(o=e)}catch{}let s=[i,...o].filter(Boolean).find(e=>e.id&&String(e.id).toLowerCase()===t||e.name&&String(e.name).toLowerCase()===t);s&&(a=new Set(s.enabledToolNames||[]))}let o=null;if(e.tools&&typeof e.tools==`string`&&e.tools.trim()){let t=e.tools.split(`,`).map(e=>e.trim()).filter(Boolean);o=new Set(t)}let s=[...r.TOOL_DEFINITIONS||[]];if(typeof r.loadDeclarativeTools==`function`)try{let e=await r.loadDeclarativeTools(n,i);if(e&&Array.isArray(e.tools))for(let t of e.tools)s.some(e=>e.name===t.name)||s.push(t)}catch{}let c=r.BROWSER_ONLY_TOOLS||u;v.clear();let l=[];for(let e of s){if(!e||!e.name||c&&c.has(e.name)||o&&!o.has(e.name)||a&&!a.has(e.name))continue;let t=z(e,_);v.set(e.name,e),v.set(`shadowclaw_local_${e.name}`,e),v.set(`shadowclaw_${e.name}`,e),l.push(t)}return l}async function w(t,n,r){try{let i=await S();if(!i)return{jsonrpc:`2.0`,id:r,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Local workspace tools are not initialized.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};let a=e.group||i.core.DEFAULT_SERVER_GROUP_ID||`server:main`,s;try{let{resolveAgentProvider:t}=await import(`./chunk-BoiPfhwJ.js`),n=await t(i.db,i.core,i.workspaceDir,{...e,interactive:!1});s={db:i.db,provider:n.providerId,model:n.model,apiKey:n.apiKey}}catch{}return console.error(`[ShadowClaw MCP] Executing local tool '${t.name}' in workspace: ${i.workspaceDir}`),B(await i.core.executeTool(i.db,t.name,n,a,{invokeContext:s}),o,r)}catch(e){return{jsonrpc:`2.0`,id:r,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error executing local tool '${t.name}': ${e.message||String(e)}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}async function T(){if(!r)return[];let e=[];try{e=await n.listClients()}catch{}if(!Array.isArray(e)||e.length===0)return d.clear(),p.clear(),[];d.clear(),p.clear();for(let t of e){let e=t.clientId||t.id;if(e)try{let r=await n.sendCommand(e,`list-tools`,{});if(r&&r.success&&r.data?.tools&&Array.isArray(r.data.tools))for(let e of r.data.tools){let n=P(e.name);n===`send_notification`||n.startsWith(`shadowclaw_`)&&!n.startsWith(`shadowclaw_client_`)||(p.has(n)||(p.set(n,e),d.set(n,[])),d.get(n).push(t))}}catch{}}let t=await c(),i=[];for(let[n,r]of p.entries()){let a=d.get(n)||[],o=a.map(e=>e.clientId||e.id).filter(Boolean),s=a.find(e=>(e.clientId||e.id)===t)||a[0],c=s?.clientId||s?.id||``,l=s?.deviceLabel||`Client`,u=r.inputSchema&&typeof r.inputSchema==`object`?r.inputSchema:{type:`object`,properties:{}},f={...u.properties||{},clientId:{type:`string`,description:`Target ShadowClaw client ID (optional; defaults to ${c} [${l}]). Available on: ${a.map(e=>`${e.clientId||e.id} (${e.deviceLabel||`Client`})`).join(`, `)}`,enum:o}},p=e.length>1?a.length>1?` [Default: ${l} (${c.slice(0,14)}...)]`:` [Client: ${l} (${c.slice(0,14)}...)]`:``,m=F(n);i.push({name:m,description:(r.description||`Relayed tool '${n}' from connected client.`)+p,inputSchema:{...u,type:`object`,properties:f},annotations:r.annotations})}return i}async function E(e,t={}){let i=e.id===void 0||e.id===null,l=e.id??null;if(t[`mcp-method`]&&t[`mcp-method`]!==e.method)return{jsonrpc:`2.0`,id:l,error:{code:-32020,message:`Mcp-Method header '${t[`mcp-method`]}' does not match '${e.method}'`}};switch(e.method){case`server/discover`:return{jsonrpc:`2.0`,id:l,result:{protocolVersion:`2026-07-28`,supportedProtocolVersions:[`2026-07-28`,`2025-11-25`,`2024-11-05`],capabilities:s,serverInfo:o,_meta:{"io.modelcontextprotocol/serverInfo":o}}};case`initialize`:return{jsonrpc:`2.0`,id:l,result:{protocolVersion:e.params?.protocolVersion||`2024-11-05`,capabilities:s,serverInfo:o}};case`notifications/initialized`:return null;case`tools/list`:{let e=[];try{if(typeof n.listPushClients==`function`)e=await n.listPushClients();else if(typeof n.listPushSubscriptions==`function`){let t=await n.listPushSubscriptions();if(Array.isArray(t)){let n=/* @__PURE__ */ new Map;for(let e of t){let t=(e.client_id||``).trim()||(e.id?String(e.id):``);t&&!n.has(t)&&n.set(t,{clientId:t,deviceLabel:e.device_label||void 0})}e=Array.from(n.values())}}}catch{}let t=Array.isArray(e)?[...e].sort((e,t)=>(e.clientId||``).localeCompare(t.clientId||``)):[],r=t.map(e=>e.clientId).filter(Boolean),i=await T(),a=await C(),s=/* @__PURE__ */ new Map;for(let e of ie)s.set(e.name,e);for(let e of a)s.has(e.name)||s.set(e.name,e);for(let e of i)s.has(e.name)||s.set(e.name,e);if(r.length>0)for(let e of[`shadowclaw_server_send_notification`,`shadowclaw_send_notification`]){let n=s.get(e);n&&s.set(e,{...n,inputSchema:{...n.inputSchema,type:`object`,properties:{...n.inputSchema?.properties||{},clientId:{type:`string`,description:`Target client ID, prefix, or device label of a specific client registered for push notifications (optional; if omitted, broadcasts to all subscribed devices). Available on: ${t.map(e=>`${e.clientId} (${e.deviceLabel||`Client`})`).join(`, `)}`,enum:r}}}})}return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,ttlMs:5e3,cacheScope:`private`,tools:Array.from(s.values()).sort((e,t)=>e.name.localeCompare(t.name)),_meta:{"io.modelcontextprotocol/serverInfo":o}}}}case`tools/call`:{let t=e.params?.name,i=e.params?.arguments||{},s=e.params?.inputResponses;if(!t)return{jsonrpc:`2.0`,id:l,error:{code:-32602,message:`Missing required parameter 'name'`}};if(t===`shadowclaw_server_list_clients`||t===`shadowclaw_list_clients`)try{let e=await n.listClients();return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify({clients:e},null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error listing clients: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(t===`shadowclaw_server_set_active_client`||t===`shadowclaw_set_active_client`){let e=await c(i.clientId);return e?(a=e,console.error(`[ShadowClaw MCP] Active default client set to: ${a}`),{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:`Active default client set to: ${a}`}],_meta:{activeClientId:a,"io.modelcontextprotocol/serverInfo":o}}}):{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Client '${i.clientId}' not found among connected clients.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(t===`shadowclaw_server_send_message`||t===`shadowclaw_send_message`){let e=await c(i.clientId);if(!e)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: No connected client available.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};try{let t=await n.sendCommand(e,`send-message`,{text:i.text,groupId:i.groupId});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!t.success,content:[{type:`text`,text:JSON.stringify(t.data||t,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error sending message: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(t===`shadowclaw_server_read_state`||t===`shadowclaw_read_state`){let e=await c(i.clientId);try{let t=await n.sendCommand(e,`read-state`,{});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!t.success,content:[{type:`text`,text:JSON.stringify(t.data||t,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error reading state: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(t===`shadowclaw_server_list_tasks`||t===`shadowclaw_list_tasks`){let e=await c(i.clientId);try{let t=await n.sendCommand(e,`list-tasks`,{groupId:i.groupId});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!t.success,content:[{type:`text`,text:JSON.stringify(t.data||t,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error listing tasks: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(t===`shadowclaw_server_manage_backup`||t===`shadowclaw_manage_backup`){let e=i.action||`trigger`,t=await c(i.clientId);try{if(e===`list`){let e=await n.listBackups(t);return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify({backups:e},null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(e===`delete`){let e=await n.deleteBackup(i.backupId,t);return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify(e,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}let r=await n.sendCommand(t,`trigger-backup`,{groupId:i.groupId});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!r.success,content:[{type:`text`,text:JSON.stringify(r.data||r,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error managing backup: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(t===`shadowclaw_server_status`||t===`shadowclaw_status`)try{let e=await n.listClients();return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify({server:`ShadowClaw`,version:o.version,connectedClients:e.length,status:`healthy`},null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error querying server status: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(t===`shadowclaw_server_send_notification`||t===`shadowclaw_send_notification`||t===`send_notification`){let e=String(i.body||``).trim();if(!e)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Notification 'body' parameter cannot be empty.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};let t=String(i.title||`ShadowClaw`).trim(),r=typeof i.clientId==`string`&&i.clientId.trim()?i.clientId.trim():void 0;try{let i=await n.broadcastNotification({title:t,body:e,...r?{clientId:r}:{}}),a=i?.sent??0,s=i?.failed??0,c;return c=i?.notFound?`Warning: No push subscriptions found for client '${r}'. Ensure push notifications were registered by this client in ShadowClaw Settings.`:i?.noSubscribers?`Warning: Push notification broadcast completed, but no devices are currently subscribed to push notifications. Ensure push notifications are enabled in ShadowClaw Settings on the client first.`:r?`Push notification sent to client '${r}': ${a} recipient(s) delivered, ${s} failed.`:`Push notification broadcast sent: ${a} recipient(s) delivered, ${s} failed.`,{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!1,content:[{type:`text`,text:c}],_meta:{...i,...r?{targetClientId:r}:{},"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Failed to send push notification: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}let u=P(t);if((u===`ask_user`||t===`ask_user`)&&s&&s.response)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:String(s.response)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};m&&v.size===0&&await C();let f=t.startsWith(R),h=t.startsWith(`shadowclaw_client_`),_=v.get(t);if(!_&&f&&(_=v.get(t.slice(17))),!_&&t.startsWith(`shadowclaw_`)&&!h&&(_=v.get(t.slice(11))),f&&_){let e={...i};return delete e.clientId,await w(_,e,l)}r&&p.size===0&&await T();let y=(d.get(u)||d.get(t)||[]).map(e=>e.clientId||e.id).filter(Boolean),b=[];try{b=await n.listClients()}catch{}if(!h&&_&&(g===`none`&&!i.clientId||!r||!Array.isArray(b)||b.length===0)){let e={...i};return delete e.clientId,await w(_,e,l)}let x=``;if(i.clientId)x=await c(i.clientId);else{let e=await c();x=y.includes(e)?e:y.length>0?y[0]:e}if(!x)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: No connected client available.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};if(y.length>0&&!y.includes(x))return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Tool '${t}' is not enabled or available on client '${x}'. (Available on: ${y.join(`, `)})`}],_meta:{clientId:x,"io.modelcontextprotocol/serverInfo":o}}};try{console.error(`[ShadowClaw MCP] Executing '${u}' on client: ${x}`);let e={...i};delete e.clientId;let t=u===`ask_user`?await n.sendCommand(x,`invoke-tool`,{toolName:u,input:e},3e5):await n.sendCommand(x,`invoke-tool`,{toolName:u,input:e}),r=t.data?.result===void 0?t.data:t.data.result,a=typeof r==`string`?r:JSON.stringify(r,null,2),s=t.error||t.data&&t.data.error||`Unknown tool execution error`;return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!t.success,content:[{type:`text`,text:t.success?a||``:a&&a!==`null`&&a!==`{}`?`${a}\n${s}`:`Tool execution error: ${s}`}],_meta:{clientId:x,"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Tool error: ${e.message}`}],_meta:{clientId:x,"io.modelcontextprotocol/serverInfo":o}}}}}case`tasks/get`:return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,task:{taskId:e.params?.taskId||`task-1`,status:`completed`},_meta:{"io.modelcontextprotocol/serverInfo":o}}};default:return i?null:{jsonrpc:`2.0`,id:l,error:{code:-32601,message:`Method not found: '${e.method}'`}}}}return{handleMessage:E,getActiveClientId:()=>a,setActiveClientId:e=>{a=e},close:async()=>{if(x)try{let e=await x;typeof e?.core?.closeSqliteDatabase==`function`&&e.core.closeSqliteDatabase()}catch{}}}}async function H(e={}){if((e.mcpTransport||(e.http?`http`:`stdio`))===`http`){let t=parseInt(String(e.port||T.env.MCP_PORT||`8888`),10),n=e.host||`127.0.0.1`,r=V(e);E.createServer(async(e,t)=>{if(e.method!==`POST`||e.url?.split(`?`)[0]!==`/mcp`){t.writeHead(404,{"Content-Type":`application/json`}),t.end(JSON.stringify({error:`Not found`}));return}let n=``;e.on(`data`,e=>n+=e),e.on(`end`,async()=>{let i;try{i=JSON.parse(n)}catch{t.writeHead(400,{"Content-Type":`application/json`}),t.end(JSON.stringify({jsonrpc:`2.0`,id:null,error:{code:-32700,message:`Parse error`}}));return}try{let n={"mcp-protocol-version":e.headers[`mcp-protocol-version`],"mcp-method":e.headers[`mcp-method`],"mcp-name":e.headers[`mcp-name`]},a=await r.handleMessage(i,n);if(a===null){t.writeHead(202),t.end();return}t.writeHead(200,{"Content-Type":`application/json`,"MCP-Protocol-Version":`2026-07-28`}),t.end(JSON.stringify(a))}catch(e){t.writeHead(500,{"Content-Type":`application/json`}),t.end(JSON.stringify({jsonrpc:`2.0`,id:i?.id??null,error:{code:-32603,message:e?.message||`Internal error`}}))}})}).listen(t,n,()=>{console.error(`[ShadowClaw MCP] HTTP MCP server listening at http://${n}:${t}/mcp (2026-07-28)`)});return}console.log=(...e)=>console.error(...e),console.info=(...e)=>console.error(...e);let t=V(e),n=ee.createInterface({input:T.stdin,output:T.stdout,terminal:!1});n.on(`line`,async e=>{let n=e.trim();if(!n)return;let r;try{r=JSON.parse(n)}catch{T.stdout.write(JSON.stringify({jsonrpc:`2.0`,id:null,error:{code:-32700,message:`Parse error`}})+`
1
+ import{t as e}from"./chunk-uAI_Zi6n.js";import{f as t,p as n,r}from"./chunk-Dz5_hgvL.js";import{t as i}from"./chunk-DYq-orHK.js";import{c as a,i as o,o as s,s as c}from"./chunk-YrgA1KKk.js";import{t as l}from"./chunk-sC-eQ-Nh.js";import{t as u}from"./chunk-Cpdoq2Nw.js";import{n as d}from"./chunk-NC8XsSSA.js";import{t as f}from"./chunk-BiWLawPV.js";import{r as p}from"./chunk-BM1nUAbW.js";import m from"node:fs";import h from"node:path";import{fileURLToPath as g}from"node:url";import _ from"node:process";import{exec as v}from"node:child_process";import{mkdir as y,mkdtemp as b,readFile as x,stat as S,writeFile as C}from"node:fs/promises";import{Command as w}from"commander";import T from"process";import E from"node:http";import{tmpdir as D}from"node:os";import ee from"node:readline";async function O(e={}){let t=new l(e);try{let e=await t.listClients();if(!e||e.length===0){console.log(`No clients currently registered or connected.`);return}console.log(`Connected / registered clients (${e.length}):\n`),e.forEach((e,t)=>{let n=Math.max(0,Math.floor((Date.now()-e.lastSeen)/1e3)),r=n<60?`${n}s ago`:`${Math.floor(n/60)}m ago`;console.log(` ${t+1}. ${e.deviceLabel} (id: ${e.clientId})`),e.peerId&&console.log(` Peer ID: ${e.peerId}`),console.log(` Capabilities: ${e.capabilities.join(`, `)||`none`}`),console.log(` Version: ${e.version}`),console.log(` Last seen: ${r}\n`)})}catch(e){console.error(`Error fetching clients: ${e.message}`),T.exitCode=1}}async function te(e,t={}){if(!e||typeof e!=`string`||!e.trim()){console.error(`Error: Message cannot be empty.`),T.exitCode=1;return}let n=new l(t);try{let r=t.client;if(!r){let e=await n.listClients();if(!e||e.length===0){console.error(`Error: No clients are connected.`),T.exitCode=1;return}r=e[0].clientId,console.log(`Targeting client: ${e[0].deviceLabel||r} (${r})`)}let i=r||``,a=t.timeout?Number(t.timeout)*1e3:12e4,o;if(t.file?(console.log(`Sending message with file "${t.file}" to ${i}...`),o=await n.sendFile(i,t.file,{prompt:e.trim(),groupId:t.group,timeoutMs:a})):(console.log(`Sending message to ${i}...`),o=await n.sendCommand(i,`send-message`,{text:e.trim(),groupId:t.group},a)),o.success){if(console.log(`Message successfully dispatched.`),o.data?.reply||o.data?.text){let e=o.data.reply||o.data.text;console.log(``),console.log(`Response from ${i}:`),console.log(`----------------------------------------`),console.log(e),console.log(`----------------------------------------`)}else o.data&&(t.json,console.log(JSON.stringify(o.data,null,2)))}else console.error(`Error from client: ${o.error||`Unknown error`}`),T.exitCode=1}catch(e){console.error(`Error sending message: ${e.message}`),T.exitCode=1}}async function k(e,t={}){if(!e||typeof e!=`string`||!e.trim()){console.error(`Error: File path cannot be empty.`),T.exitCode=1;return}let n=h.resolve(e.trim());if(!m.existsSync(n)){console.error(`Error: File not found: ${e}`),T.exitCode=1;return}let r=m.statSync(n);if(r.isDirectory()){console.error(`Error: Cannot send directory: ${e}`),T.exitCode=1;return}let i=new l(t);try{let e=t.client;if(!e){let t=await i.listClients();if(!t||t.length===0){console.error(`Error: No clients are connected.`),T.exitCode=1;return}e=t[0].clientId,console.log(`Targeting client: ${t[0].deviceLabel||e} (${e})`)}let a=e||``,o=t.name||h.basename(n);console.log(`Sending "${o}" (${r.size} bytes) to ${a}...`);let s=t.timeout?Number(t.timeout)*1e3:12e4,c=await i.sendFile(a,n,{prompt:t.prompt,name:t.name,groupId:t.group,timeoutMs:s});if(c.success){if(console.log(`File "${o}" successfully transferred to ${a}.`),c.data?.path&&console.log(`Remote location: ${c.data.path}`),c.data?.reply||c.data?.text){let e=c.data.reply||c.data.text;console.log(``),console.log(`Response from ${a}:`),console.log(`----------------------------------------`),console.log(e),console.log(`----------------------------------------`)}else t.json&&c.data&&console.log(JSON.stringify(c.data,null,2))}else console.error(`Error from client: ${c.error||`Unknown error`}`),T.exitCode=1}catch(e){console.error(`Error sending file: ${e.message}`),T.exitCode=1}}async function A(e=`trigger`,t={}){let n=new l(t);try{if(e===`list`){let e=await n.listBackups(t.client);if(!e||e.length===0){console.log(`No backups found.`);return}console.log(`Available backups (${e.length}):\n`),e.forEach((e,t)=>{let n=new Date(e.timestamp).toISOString(),r=(e.totalBytes/1048576).toFixed(2);console.log(` ${t+1}. [${e.id}] Client: ${e.clientId}`),console.log(` Date: ${n}`),console.log(` Files: ${e.fileCount} (${r} MB)\n`)});return}if(e===`delete`){if(!t.backupId){console.error(`Error: --backup-id is required for delete action.`),T.exitCode=1;return}await n.deleteBackup(t.backupId,t.client),console.log(`Backup ${t.backupId} deleted.`);return}let r=t.client;if(!r){let e=await n.listClients();if(!e||e.length===0){console.error(`Error: No clients are connected to back up.`),T.exitCode=1;return}r=e[0].clientId}let i=r||``;console.log(`Requesting backup from client ${i}...`);let a=await n.sendCommand(i,`trigger-backup`,{groupId:t.group,token:n.token});a.success?(console.log(`Backup completed successfully.`),console.log(JSON.stringify(a.data,null,2))):(console.error(`Backup failed: ${a.error}`),T.exitCode=1)}catch(e){console.error(`Error executing backup command: ${e.message}`),T.exitCode=1}}async function j(e={}){let t=new l(e);try{let n=e.client;if(!n){let e=await t.listClients();if(!e||e.length===0){console.error(`Error: No clients connected.`),T.exitCode=1;return}n=e[0].clientId}let r=n||``;console.log(`Fetching tasks from client ${r}${e.group?` (group: ${e.group})`:``}...`);let i=await t.sendCommand(r,`list-tasks`,{groupId:e.group});if(i.success){let t=i.data?.tasks||[];if(t.length===0){console.log(e.group?`No tasks configured on client for group "${e.group}".`:`No tasks configured on client.`);return}console.log(`Tasks on ${n}${e.group?` (group: ${e.group})`:``} (${t.length}):\n`),t.forEach((e,t)=>{let n=e.enabled?`[enabled]`:`[disabled]`,r=e.name||e.prompt?.slice(0,30)||`Untitled task`;console.log(` ${t+1}. ${n} ${r} (${e.schedule||`manual`})`)})}else console.error(`Failed to list tasks: ${i.error}`),T.exitCode=1}catch(e){console.error(`Error executing tasks command: ${e.message}`),T.exitCode=1}}async function M(e=`get`,t={}){let n=t.cacheDir,r=o(n),i=!!(t.renew||e===`renew`||e===`generate`||e===`new`),l=t.set||(e===`set`&&t.id?t.id:null),u=``,d=!1;if(l)u=a(l,n),d=!0;else if(i)u=a(void 0,n),d=!0;else{let e=c(n);e?(u=e,d=!1):(u=s(void 0,n),d=!0)}return t.quiet?(console.log(u),{peerId:u,filePath:r,isRenewed:d}):t.json?(console.log(JSON.stringify({peerId:u,filePath:r,renewed:d},null,2)),{peerId:u,filePath:r,isRenewed:d}):(console.log(l?`WebRTC CLI Peer ID set to: ${u}`:d?`WebRTC CLI Peer ID created/renewed: ${u}`:`WebRTC CLI Peer ID: ${u}`),console.log(`Stored in: ${r}`),{peerId:u,filePath:r,isRenewed:d})}function N(e,t){return typeof e==`string`?t===`raw`?e.startsWith(`shadowclaw_client_`)?e.slice(18):e:e.startsWith(`shadowclaw_client_`)?e:`shadowclaw_client_${e}`:e}function P(e){return N(e,`raw`)}function F(e){return N(e,`exposed`)}const I=[{name:`shadowclaw_server_list_clients`,description:`List connected browser and Electron clients, including device type, ID, and active capabilities.`,inputSchema:{type:`object`,properties:{}}},{name:`shadowclaw_server_send_message`,description:`Send a message or prompt to a connected ShadowClaw client's active AI orchestrator queue.`,inputSchema:{type:`object`,properties:{text:{type:`string`,description:`The prompt or message text to dispatch.`},clientId:{type:`string`,description:`Target client ID. If omitted, targets the first available connected client.`},groupId:{type:`string`,description:`Target conversation group ID (e.g. 'br:main'). If omitted, targets the active group.`}},required:[`text`]}},{name:`shadowclaw_server_read_state`,description:`Read the current orchestrator state (idle, responding, etc.), active group ID, and capabilities from a connected client.`,inputSchema:{type:`object`,properties:{clientId:{type:`string`,description:`Target client ID (defaults to first available connected client).`}}}},{name:`shadowclaw_server_list_tasks`,description:`List scheduled background tasks configured on a connected client (optionally filtered by conversation group).`,inputSchema:{type:`object`,properties:{clientId:{type:`string`,description:`Target client ID (defaults to first available connected client).`},groupId:{type:`string`,description:`Optional conversation group ID filter.`}}}},{name:`shadowclaw_server_set_active_client`,description:`Set the active default connected client used when no clientId is explicitly provided in tool calls.`,inputSchema:{type:`object`,properties:{clientId:{type:`string`,description:`Target client ID (or index '0', '1', prefix, or device label) to make active.`}},required:[`clientId`]}},{name:`shadowclaw_server_manage_backup`,description:`Trigger or manage OPFS workspace file backups for a connected client (trigger, list, or delete).`,inputSchema:{type:`object`,properties:{action:{type:`string`,enum:[`trigger`,`list`,`delete`],description:`Backup action to perform (default: 'trigger').`,default:`trigger`},clientId:{type:`string`,description:`Target client ID.`},backupId:{type:`string`,description:`Backup snapshot ID (required for 'delete').`},groupId:{type:`string`,description:`Optional workspace conversation group ID.`}}}},{name:`shadowclaw_server_status`,description:`Query ShadowClaw Node server status, version, and active client count.`,inputSchema:{type:`object`,properties:{}}},{name:`shadowclaw_server_send_notification`,description:`Broadcast an OS-level push notification to subscribed devices via Web Push (VAPID), or send to a specific registered client. Works even when the client browser tab is closed, asleep, or running in the background.`,inputSchema:{type:`object`,properties:{title:{type:`string`,description:`Notification title (default: 'ShadowClaw').`},body:{type:`string`,description:`The notification body message text.`},clientId:{type:`string`,description:`Target client ID, prefix, or device label of a specific client that has registered in the past. If omitted, broadcasts to all subscribed devices.`}},required:[`body`]}}];function L(e,t){try{let n=typeof e.getConnectedClients==`function`?e.getConnectedClients():typeof e.listClients==`function`?e.listClients():[];if(Array.isArray(n)&&n.length>0){if(typeof t==`string`&&t.trim()){let e=t.trim(),r=n.find(t=>(t.clientId||t.id)===e);if(r)return r.clientId||r.id||``;let i=parseInt(e,10);if(!isNaN(i)&&i>=0&&i<n.length)return n[i].clientId||n[i].id||``;let a=n.find(t=>(t.clientId||t.id||``).startsWith(e)||(t.clientId||t.id||``).replace(/^client-/,``).startsWith(e));if(a)return a.clientId||a.id||``;let o=n.find(t=>t.deviceLabel?.toLowerCase().includes(e.toLowerCase()));return o?o.clientId||o.id||``:e}if(typeof e.getActiveClientId==`function`){let t=e.getActiveClientId();if(t)return t}return n[0].clientId||n[0].id||``}}catch{}return typeof t==`string`?t.trim():``}const ne=h.dirname(g(import.meta.url));function re(){try{let e=h.resolve(ne,`../../../package.json`);if(m.existsSync(e)){let t=JSON.parse(m.readFileSync(e,`utf8`));if(t.version)return t.version}}catch{}return`1.27.1`}const R=`shadowclaw_local_`,ie=I;function z(e,t=R){let n=e.inputSchema||e.input_schema,r=n&&typeof n==`object`?{...n,type:n.type||`object`,properties:n.properties||{}}:{type:`object`,properties:{}};return{name:t?`${t}${e.name}`:e.name,description:e.description||`CLI agent tool: ${e.name}`,inputSchema:r,annotations:e.annotations}}function B(e,t,n){let r=!1,i=[];return Array.isArray(e)?i=e.map(e=>e&&typeof e==`object`?e.type===`image`?{type:`image`,data:e.data||``,mimeType:e.media_type||e.mimeType||`image/png`}:e.type===`text`?{type:`text`,text:String(e.text??``)}:{type:`text`,text:JSON.stringify(e,null,2)}:{type:`text`,text:String(e??``)}):typeof e==`string`?((e.toLowerCase().startsWith(`error`)||e.toLowerCase().startsWith(`tool error`)||e.includes(`SecurityError`)||e.startsWith(`Tool "`)&&e.includes(`is not allowed`)||e.startsWith(`Tool "`)&&e.includes(`is not available`))&&(r=!0),i=[{type:`text`,text:e}]):e&&typeof e==`object`?((e.error||e.success===!1)&&(r=!0),i=[{type:`text`,text:JSON.stringify(e,null,2)}]):i=[{type:`text`,text:String(e??``)}],{jsonrpc:`2.0`,id:n,result:{resultType:`complete`,isError:r,content:i,_meta:{"io.modelcontextprotocol/serverInfo":t}}}}function V(e={}){let n=e.client||new l(e),r=e.relayClientTools!==!1,i=e.targetClientId||e.clientTarget,a=i||``,o={name:`shadow-claw`,version:e.version||re()},s={tools:{listChanged:!0},extensions:{"io.modelcontextprotocol/tasks":{}}};async function c(e){let t=e||a||i;try{let e=await n.listClients();return L({getConnectedClients:()=>e},t)}catch{}return L(n,t)}let d=/* @__PURE__ */ new Map,p=/* @__PURE__ */ new Map,m=e.localTools!==!1,g=e.toolPrefix??`local`,_=g===`none`||g===``?``:g===`shadowclaw`?`shadowclaw_`:R,v=/* @__PURE__ */ new Map,x=null;async function S(){return x||=(async()=>{if(e.core&&e.db){let t;if(e.workspaceDir||e.workspace)t=e.workspaceDir||e.workspace;else{let e=h.join(D(),`shadow-claw`);await y(e,{recursive:!0}),t=await b(h.join(e,`workspace-`))}return{db:e.db,workspaceDir:t,core:e.core}}let n=e.core||await f(),r=e.workspaceDir||e.workspace,i=null,a=null,o=null;if(r)i=h.resolve(r),a=e.cacheDir?h.resolve(e.cacheDir):h.join(i,`.cache`),o=e.databaseDir?h.resolve(e.databaseDir):h.join(a,`database`);else try{let t=h.join(D(),`shadow-claw`);await y(t,{recursive:!0}),i=await b(h.join(t,`workspace-`)),a=e.cacheDir?h.resolve(e.cacheDir):await b(h.join(t,`cache-`)),o=e.databaseDir?h.resolve(e.databaseDir):h.join(a,`database`),await y(a,{recursive:!0}),await y(o,{recursive:!0})}catch(e){return console.error(`[ShadowClaw MCP] Warning: No --workspace provided and failed to initialize temporary fallback workspace (${e.message}). Local workspace tools are disabled.`),null}try{let r=await t({...e,workspace:i,cacheDir:a,databaseDir:o,yes:!0,quiet:!0,isTTY:!1,core:n});return{db:r.db,workspaceDir:r.workspaceDir,core:r.core}}catch(e){return console.error(`[ShadowClaw MCP] Warning: Failed to bootstrap headless agent context (${e.message}). Local workspace tools are disabled.`),null}})(),x}async function C(){if(!m)return[];let t;try{t=await S()}catch(e){return console.error(`[ShadowClaw MCP] Failed to initialize local agent context: ${e.message}`),[]}if(!t)return[];let{db:n,core:r}=t,i=e.group||r.DEFAULT_SERVER_GROUP_ID||`server:main`,a=null;if(e.toolsProfile||e.profile){let t=String(e.toolsProfile||e.profile).trim().toLowerCase(),i=r.DEFAULT_BUILTIN_PROFILE||null,o=[];if(typeof r.getConfig==`function`)try{let e=await r.getConfig(n,r.CONFIG_KEYS?.TOOL_PROFILES||`tool_profiles`);typeof e==`string`?o=JSON.parse(e):Array.isArray(e)&&(o=e)}catch{}let s=[i,...o].filter(Boolean).find(e=>e.id&&String(e.id).toLowerCase()===t||e.name&&String(e.name).toLowerCase()===t);s&&(a=new Set(s.enabledToolNames||[]))}let o=null;if(e.tools&&typeof e.tools==`string`&&e.tools.trim()){let t=e.tools.split(`,`).map(e=>e.trim()).filter(Boolean);o=new Set(t)}let s=[...r.TOOL_DEFINITIONS||[]];if(typeof r.loadDeclarativeTools==`function`)try{let e=await r.loadDeclarativeTools(n,i);if(e&&Array.isArray(e.tools))for(let t of e.tools)s.some(e=>e.name===t.name)||s.push(t)}catch{}let c=r.BROWSER_ONLY_TOOLS||u;v.clear();let l=[];for(let e of s){if(!e||!e.name||c&&c.has(e.name)||o&&!o.has(e.name)||a&&!a.has(e.name))continue;let t=z(e,_);v.set(e.name,e),v.set(`shadowclaw_local_${e.name}`,e),v.set(`shadowclaw_${e.name}`,e),l.push(t)}return l}async function w(t,n,r){try{let i=await S();if(!i)return{jsonrpc:`2.0`,id:r,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Local workspace tools are not initialized.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};let a=e.group||i.core.DEFAULT_SERVER_GROUP_ID||`server:main`,s;try{let{resolveAgentProvider:t}=await import(`./chunk-DtgZDsJA.js`),n=await t(i.db,i.core,i.workspaceDir,{...e,interactive:!1});s={db:i.db,provider:n.providerId,model:n.model,apiKey:n.apiKey}}catch{}return console.error(`[ShadowClaw MCP] Executing local tool '${t.name}' in workspace: ${i.workspaceDir}`),B(await i.core.executeTool(i.db,t.name,n,a,{invokeContext:s}),o,r)}catch(e){return{jsonrpc:`2.0`,id:r,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error executing local tool '${t.name}': ${e.message||String(e)}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}async function T(){if(!r)return[];let e=[];try{e=await n.listClients()}catch{}if(!Array.isArray(e)||e.length===0)return d.clear(),p.clear(),[];d.clear(),p.clear();for(let t of e){let e=t.clientId||t.id;if(e)try{let r=await n.sendCommand(e,`list-tools`,{});if(r&&r.success&&r.data?.tools&&Array.isArray(r.data.tools))for(let e of r.data.tools){let n=P(e.name);n===`send_notification`||n.startsWith(`shadowclaw_`)&&!n.startsWith(`shadowclaw_client_`)||(p.has(n)||(p.set(n,e),d.set(n,[])),d.get(n).push(t))}}catch{}}let t=await c(),i=[];for(let[n,r]of p.entries()){let a=d.get(n)||[],o=a.map(e=>e.clientId||e.id).filter(Boolean),s=a.find(e=>(e.clientId||e.id)===t)||a[0],c=s?.clientId||s?.id||``,l=s?.deviceLabel||`Client`,u=r.inputSchema&&typeof r.inputSchema==`object`?r.inputSchema:{type:`object`,properties:{}},f={...u.properties||{},clientId:{type:`string`,description:`Target ShadowClaw client ID (optional; defaults to ${c} [${l}]). Available on: ${a.map(e=>`${e.clientId||e.id} (${e.deviceLabel||`Client`})`).join(`, `)}`,enum:o}},p=e.length>1?a.length>1?` [Default: ${l} (${c.slice(0,14)}...)]`:` [Client: ${l} (${c.slice(0,14)}...)]`:``,m=F(n);i.push({name:m,description:(r.description||`Relayed tool '${n}' from connected client.`)+p,inputSchema:{...u,type:`object`,properties:f},annotations:r.annotations})}return i}async function E(e,t={}){let i=e.id===void 0||e.id===null,l=e.id??null;if(t[`mcp-method`]&&t[`mcp-method`]!==e.method)return{jsonrpc:`2.0`,id:l,error:{code:-32020,message:`Mcp-Method header '${t[`mcp-method`]}' does not match '${e.method}'`}};switch(e.method){case`server/discover`:return{jsonrpc:`2.0`,id:l,result:{protocolVersion:`2026-07-28`,supportedProtocolVersions:[`2026-07-28`,`2025-11-25`,`2024-11-05`],capabilities:s,serverInfo:o,_meta:{"io.modelcontextprotocol/serverInfo":o}}};case`initialize`:return{jsonrpc:`2.0`,id:l,result:{protocolVersion:e.params?.protocolVersion||`2024-11-05`,capabilities:s,serverInfo:o}};case`notifications/initialized`:return null;case`tools/list`:{let e=[];try{if(typeof n.listPushClients==`function`)e=await n.listPushClients();else if(typeof n.listPushSubscriptions==`function`){let t=await n.listPushSubscriptions();if(Array.isArray(t)){let n=/* @__PURE__ */ new Map;for(let e of t){let t=(e.client_id||``).trim()||(e.id?String(e.id):``);t&&!n.has(t)&&n.set(t,{clientId:t,deviceLabel:e.device_label||void 0})}e=Array.from(n.values())}}}catch{}let t=Array.isArray(e)?[...e].sort((e,t)=>(e.clientId||``).localeCompare(t.clientId||``)):[],r=t.map(e=>e.clientId).filter(Boolean),i=await T(),a=await C(),s=/* @__PURE__ */ new Map;for(let e of ie)s.set(e.name,e);for(let e of a)s.has(e.name)||s.set(e.name,e);for(let e of i)s.has(e.name)||s.set(e.name,e);if(r.length>0)for(let e of[`shadowclaw_server_send_notification`,`shadowclaw_send_notification`]){let n=s.get(e);n&&s.set(e,{...n,inputSchema:{...n.inputSchema,type:`object`,properties:{...n.inputSchema?.properties||{},clientId:{type:`string`,description:`Target client ID, prefix, or device label of a specific client registered for push notifications (optional; if omitted, broadcasts to all subscribed devices). Available on: ${t.map(e=>`${e.clientId} (${e.deviceLabel||`Client`})`).join(`, `)}`,enum:r}}}})}return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,ttlMs:5e3,cacheScope:`private`,tools:Array.from(s.values()).sort((e,t)=>e.name.localeCompare(t.name)),_meta:{"io.modelcontextprotocol/serverInfo":o}}}}case`tools/call`:{let t=e.params?.name,i=e.params?.arguments||{},s=e.params?.inputResponses;if(!t)return{jsonrpc:`2.0`,id:l,error:{code:-32602,message:`Missing required parameter 'name'`}};if(t===`shadowclaw_server_list_clients`||t===`shadowclaw_list_clients`)try{let e=await n.listClients();return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify({clients:e},null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error listing clients: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(t===`shadowclaw_server_set_active_client`||t===`shadowclaw_set_active_client`){let e=await c(i.clientId);return e?(a=e,console.error(`[ShadowClaw MCP] Active default client set to: ${a}`),{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:`Active default client set to: ${a}`}],_meta:{activeClientId:a,"io.modelcontextprotocol/serverInfo":o}}}):{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Client '${i.clientId}' not found among connected clients.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(t===`shadowclaw_server_send_message`||t===`shadowclaw_send_message`){let e=await c(i.clientId);if(!e)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: No connected client available.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};try{let t=await n.sendCommand(e,`send-message`,{text:i.text,groupId:i.groupId});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!t.success,content:[{type:`text`,text:JSON.stringify(t.data||t,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error sending message: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(t===`shadowclaw_server_read_state`||t===`shadowclaw_read_state`){let e=await c(i.clientId);try{let t=await n.sendCommand(e,`read-state`,{});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!t.success,content:[{type:`text`,text:JSON.stringify(t.data||t,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error reading state: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(t===`shadowclaw_server_list_tasks`||t===`shadowclaw_list_tasks`){let e=await c(i.clientId);try{let t=await n.sendCommand(e,`list-tasks`,{groupId:i.groupId});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!t.success,content:[{type:`text`,text:JSON.stringify(t.data||t,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error listing tasks: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(t===`shadowclaw_server_manage_backup`||t===`shadowclaw_manage_backup`){let e=i.action||`trigger`,t=await c(i.clientId);try{if(e===`list`){let e=await n.listBackups(t);return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify({backups:e},null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(e===`delete`){let e=await n.deleteBackup(i.backupId,t);return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify(e,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}let r=await n.sendCommand(t,`trigger-backup`,{groupId:i.groupId});return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!r.success,content:[{type:`text`,text:JSON.stringify(r.data||r,null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error managing backup: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}if(t===`shadowclaw_server_status`||t===`shadowclaw_status`)try{let e=await n.listClients();return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:JSON.stringify({server:`ShadowClaw`,version:o.version,connectedClients:e.length,status:`healthy`},null,2)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error querying server status: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}if(t===`shadowclaw_server_send_notification`||t===`shadowclaw_send_notification`||t===`send_notification`){let e=String(i.body||``).trim();if(!e)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Notification 'body' parameter cannot be empty.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};let t=String(i.title||`ShadowClaw`).trim(),r=typeof i.clientId==`string`&&i.clientId.trim()?i.clientId.trim():void 0;try{let i=await n.broadcastNotification({title:t,body:e,...r?{clientId:r}:{}}),a=i?.sent??0,s=i?.failed??0,c;return c=i?.notFound?`Warning: No push subscriptions found for client '${r}'. Ensure push notifications were registered by this client in ShadowClaw Settings.`:i?.noSubscribers?`Warning: Push notification broadcast completed, but no devices are currently subscribed to push notifications. Ensure push notifications are enabled in ShadowClaw Settings on the client first.`:r?`Push notification sent to client '${r}': ${a} recipient(s) delivered, ${s} failed.`:`Push notification broadcast sent: ${a} recipient(s) delivered, ${s} failed.`,{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!1,content:[{type:`text`,text:c}],_meta:{...i,...r?{targetClientId:r}:{},"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Failed to send push notification: ${e.message}`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}}}}let u=P(t);if((u===`ask_user`||t===`ask_user`)&&s&&s.response)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,content:[{type:`text`,text:String(s.response)}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};m&&v.size===0&&await C();let f=t.startsWith(R),h=t.startsWith(`shadowclaw_client_`),_=v.get(t);if(!_&&f&&(_=v.get(t.slice(17))),!_&&t.startsWith(`shadowclaw_`)&&!h&&(_=v.get(t.slice(11))),f&&_){let e={...i};return delete e.clientId,await w(_,e,l)}r&&p.size===0&&await T();let y=(d.get(u)||d.get(t)||[]).map(e=>e.clientId||e.id).filter(Boolean),b=[];try{b=await n.listClients()}catch{}if(!h&&_&&(g===`none`&&!i.clientId||!r||!Array.isArray(b)||b.length===0)){let e={...i};return delete e.clientId,await w(_,e,l)}let x=``;if(i.clientId)x=await c(i.clientId);else{let e=await c();x=y.includes(e)?e:y.length>0?y[0]:e}if(!x)return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: No connected client available.`}],_meta:{"io.modelcontextprotocol/serverInfo":o}}};if(y.length>0&&!y.includes(x))return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Error: Tool '${t}' is not enabled or available on client '${x}'. (Available on: ${y.join(`, `)})`}],_meta:{clientId:x,"io.modelcontextprotocol/serverInfo":o}}};try{console.error(`[ShadowClaw MCP] Executing '${u}' on client: ${x}`);let e={...i};delete e.clientId;let t=u===`ask_user`?await n.sendCommand(x,`invoke-tool`,{toolName:u,input:e},3e5):await n.sendCommand(x,`invoke-tool`,{toolName:u,input:e}),r=t.data?.result===void 0?t.data:t.data.result,a=typeof r==`string`?r:JSON.stringify(r,null,2),s=t.error||t.data&&t.data.error||`Unknown tool execution error`;return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!t.success,content:[{type:`text`,text:t.success?a||``:a&&a!==`null`&&a!==`{}`?`${a}\n${s}`:`Tool execution error: ${s}`}],_meta:{clientId:x,"io.modelcontextprotocol/serverInfo":o}}}}catch(e){return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,isError:!0,content:[{type:`text`,text:`Tool error: ${e.message}`}],_meta:{clientId:x,"io.modelcontextprotocol/serverInfo":o}}}}}case`tasks/get`:return{jsonrpc:`2.0`,id:l,result:{resultType:`complete`,task:{taskId:e.params?.taskId||`task-1`,status:`completed`},_meta:{"io.modelcontextprotocol/serverInfo":o}}};default:return i?null:{jsonrpc:`2.0`,id:l,error:{code:-32601,message:`Method not found: '${e.method}'`}}}}return{handleMessage:E,getActiveClientId:()=>a,setActiveClientId:e=>{a=e},close:async()=>{if(x)try{let e=await x;typeof e?.core?.closeSqliteDatabase==`function`&&e.core.closeSqliteDatabase()}catch{}}}}async function H(e={}){if((e.mcpTransport||(e.http?`http`:`stdio`))===`http`){let t=parseInt(String(e.port||T.env.MCP_PORT||`8888`),10),n=e.host||`127.0.0.1`,r=V(e);E.createServer(async(e,t)=>{if(e.method!==`POST`||e.url?.split(`?`)[0]!==`/mcp`){t.writeHead(404,{"Content-Type":`application/json`}),t.end(JSON.stringify({error:`Not found`}));return}let n=``;e.on(`data`,e=>n+=e),e.on(`end`,async()=>{let i;try{i=JSON.parse(n)}catch{t.writeHead(400,{"Content-Type":`application/json`}),t.end(JSON.stringify({jsonrpc:`2.0`,id:null,error:{code:-32700,message:`Parse error`}}));return}try{let n={"mcp-protocol-version":e.headers[`mcp-protocol-version`],"mcp-method":e.headers[`mcp-method`],"mcp-name":e.headers[`mcp-name`]},a=await r.handleMessage(i,n);if(a===null){t.writeHead(202),t.end();return}t.writeHead(200,{"Content-Type":`application/json`,"MCP-Protocol-Version":`2026-07-28`}),t.end(JSON.stringify(a))}catch(e){t.writeHead(500,{"Content-Type":`application/json`}),t.end(JSON.stringify({jsonrpc:`2.0`,id:i?.id??null,error:{code:-32603,message:e?.message||`Internal error`}}))}})}).listen(t,n,()=>{console.error(`[ShadowClaw MCP] HTTP MCP server listening at http://${n}:${t}/mcp (2026-07-28)`)});return}console.log=(...e)=>console.error(...e),console.info=(...e)=>console.error(...e);let t=V(e),n=ee.createInterface({input:T.stdin,output:T.stdout,terminal:!1});n.on(`line`,async e=>{let n=e.trim();if(!n)return;let r;try{r=JSON.parse(n)}catch{T.stdout.write(JSON.stringify({jsonrpc:`2.0`,id:null,error:{code:-32700,message:`Parse error`}})+`
2
2
  `);return}try{let e=await t.handleMessage(r);e!==null&&T.stdout.write(JSON.stringify(e)+`
3
3
  `)}catch(e){let t={jsonrpc:`2.0`,id:r?.id??null,error:{code:-32603,message:e?.message||`Internal error`}};T.stdout.write(JSON.stringify(t)+`
4
4
  `)}}),n.on(`close`,async()=>{await t.close?.()}),console.error(`[ShadowClaw MCP] STDIO MCP server active (2026-07-28)`)}const U=e(import.meta.url),W=/* @__PURE__ */ new Set;function G(e){return typeof e==`function`?(W.add(e),()=>W.delete(e)):()=>!1}let K=!1;const q=(e,t)=>{K&&_.exit(t),K=!0;for(let t of W)try{t(e)}catch{}_.stderr.write(`\nProcess interrupted (${e}).\n`),_.exit(t)};_.on(`SIGINT`,()=>q(`SIGINT`,130)),_.on(`SIGTERM`,()=>q(`SIGTERM`,143)),_.on(`exit`,()=>{for(let e of W)try{e(`exit`)}catch{}});async function J(){try{let e=h.join(U,`package.json`),t=await x(e,`utf8`);return JSON.parse(t).version||`1.0.0`}catch{return`1.0.0`}}async function Y(e){try{return await S(e),!0}catch{return!1}}function X(e){return!!(e.a2a||[`1`,`true`,`yes`].includes((_.env.SHADOWCLAW_A2A||``).toLowerCase().trim()))}function Z(e){let t=_.platform===`darwin`?`open`:_.platform===`win32`?`start`:`xdg-open`;try{v(`${t} ${e}`)}catch{}}const ae=await J(),Q=new w;Q.name(`shadow-claw`).description(`Multi-runtime AI assistant and static site publisher`).version(ae,`-V, --version`,`Output the current version`),Q.commandsGroup(`Development:`),Q.command(`build`).description(`Build the static site bundle for production or staging`).optionsGroup(`Build Mode Options:`).option(`--prod, --production`,`Build in production mode with minification and optimizations`,!1).option(`--prerender-pages <mode>`,`Prerender page mode (all, auto, none)`,`auto`).option(`--copy-all-assets`,`Copy entire assets/ directory into output`,!1).optionsGroup(`Path & Routing Options:`).option(`--origin <url>`,`Canonical origin URL (e.g. https://user.github.io/repo/)`).option(`--base-path <path>`,`URL base path prefix (e.g. /repo/)`).option(`--out-dir <dir>`,`Output directory relative to content root`,`dist/public`).option(`--content-root <dir>`,`Content root directory`,_.cwd()).action(async e=>{try{let t=h.resolve(e.contentRoot||_.cwd()),n=!!(e.prod||e.production||_.env.NODE_ENV===`production`);console.log(`Building ShadowClaw site from ${t}...`),await i({contentRoot:t,toolchainRoot:U,outDir:e.outDir||`dist/public`,isProduction:n,pagesOrigin:e.origin||_.env.PAGES_ORIGIN,basePath:e.basePath||_.env.PAGES_BASE_PATH,prerenderPages:e.prerenderPages,copyAllAssets:e.copyAllAssets})}catch(e){console.error(`Build failed:`,e),_.exit(1)}});async function $(e,t){try{let r=h.resolve(t.contentRoot||_.cwd()),a=parseInt(e||t.port||_.env.PORT||`8888`,10),o=t.host||t.ip||_.env.SHADOWCLAW_DEV_IP||`127.0.0.1`,s=t.outDir||`dist/public`,c=h.resolve(r,s),l=await n({contentRoot:r,cacheDir:t.cacheDir,databaseDir:t.databaseDir,tmp:t.tmp||t.temp,yes:t.yes}),u=l.cacheDir,d=l.databaseDir;console.log(`Preparing ShadowClaw dev build for ${r}...`),await i({contentRoot:r,toolchainRoot:U,outDir:s,isProduction:!1,pagesOrigin:t.origin||_.env.PAGES_ORIGIN,basePath:t.basePath||_.env.PAGES_BASE_PATH,prerenderPages:t.prerenderPages||`auto`,copyAllAssets:t.copyAllAssets});let f=await Y(h.join(U,`dist/server.js`))?h.join(U,`dist/server.js`):h.join(U,`src/server/server.ts`);_.env.SHADOWCLAW_ROOT_PATH=c,_.env.SHADOWCLAW_CACHE_DIR=u,_.env.SHADOWCLAW_DATABASE_DIR=d,_.env.SHADOWCLAW_DEV_IP=o;let{startServer:p}=await import(f),m=new Set((t.corsAllowOrigin||_.env.SHADOWCLAW_CORS_ALLOWED_ORIGINS||`https://xt-ml.github.io`).split(`,`).map(e=>e.trim()).filter(Boolean)),g=!!(t.https||[`1`,`true`,`yes`].includes((_.env.SHADOWCLAW_HTTPS||``).toLowerCase().trim())),v=t.cert||(_.env.SHADOWCLAW_TLS_CERT||_.env.SHADOWCLAW_CERT||``).trim()||void 0,y=t.key||(_.env.SHADOWCLAW_TLS_KEY||_.env.SHADOWCLAW_KEY||``).trim()||void 0,b=h.resolve(r,t.sslDir||_.env.SHADOWCLAW_SSL_DIR||_.env.SHADOWCLAW_TLS_DIR||h.join(u,`tls`));await p({port:a,bindHost:o,corsMode:t.corsMode||`localhost`,allowedOrigins:m,verbose:!!t.verbose,peerjs:!!t.peerjs,a2aEnabled:X(t),rootPath:c,cacheDir:u,databaseDir:d,allowPrivateProxy:!!t.allowPrivateProxy,https:g,certPath:v,keyPath:y,sslDir:b});let x=`${g?`https`:`http`}://${o}:${a}`;t.open&&Z(x)}catch(e){console.error(`Dev server error:`,e),_.exit(1)}}Q.command(`dev [port]`).description(`Build and launch the development server`).optionsGroup(`Server & Network Options:`).option(`-p, --port <port>`,`Port to listen on (default: 8888)`).option(`--host <host>`,`Bind host/IP`,`127.0.0.1`).option(`--ip <host>`,`Bind host/IP (alias)`).option(`--open`,`Automatically open default browser`,!1).option(`-v, --verbose`,`Enable verbose request/proxy logging`,!1).optionsGroup(`Site & Build Options:`).option(`--content-root <dir>`,`Content root directory`,_.cwd()).option(`--out-dir <dir>`,`Output directory relative to content root`,`dist/public`).optionsGroup(`Security & Proxy Options:`).option(`--cors-mode <mode>`,`CORS policy: localhost | private | all`,`localhost`).option(`--allow-private-proxy`,`Allow proxy to reach private/loopback addresses`,!1).option(`--peerjs`,`Enable built-in PeerJS signaling server`,!1).option(`--a2a`,`Enable A2A v1.0 agent card, JSON-RPC, and SSE endpoints`,!1).optionsGroup(`TLS / HTTPS Options:`).option(`--https`,`Enable HTTPS dev server`,!1).option(`--cert <path>`,`Path to existing TLS certificate file`).option(`--key <path>`,`Path to existing TLS private key file`).option(`--ssl-dir <path>`,`Directory for TLS certificate generation/storage`).optionsGroup(`Storage & Database Options:`).option(`--database-dir <dir>`,`Directory where SQLite databases are stored`).option(`--cache-dir <dir>`,`Custom cache directory for databases, tokens, and logs`).option(`--tmp, --temp`,`Store cache and databases in system temporary directory`,!1).option(`-y, --yes`,`Skip interactive cache directory prompt and use default .cache`,!1).action($),Q.command(`run [port]`).description(`Alias for dev: build and launch the development server`).optionsGroup(`Server & Network Options:`).option(`-p, --port <port>`,`Port to listen on (default: 8888)`).option(`--host <host>`,`Bind host/IP`,`127.0.0.1`).option(`--ip <host>`,`Bind host/IP (alias)`).option(`--open`,`Automatically open default browser`,!1).option(`-v, --verbose`,`Enable verbose request/proxy logging`,!1).optionsGroup(`Site & Build Options:`).option(`--content-root <dir>`,`Content root directory`,_.cwd()).option(`--out-dir <dir>`,`Output directory relative to content root`,`dist/public`).optionsGroup(`Security & Proxy Options:`).option(`--cors-mode <mode>`,`CORS policy: localhost | private | all`,`localhost`).option(`--allow-private-proxy`,`Allow proxy to reach private/loopback addresses`,!1).option(`--peerjs`,`Enable built-in PeerJS signaling server`,!1).option(`--a2a`,`Enable A2A v1.0 agent card, JSON-RPC, and SSE endpoints`,!1).optionsGroup(`TLS / HTTPS Options:`).option(`--https`,`Enable HTTPS dev server`,!1).option(`--cert <path>`,`Path to existing TLS certificate file`).option(`--key <path>`,`Path to existing TLS private key file`).option(`--ssl-dir <path>`,`Directory for TLS certificate generation/storage`).optionsGroup(`Storage & Database Options:`).option(`--database-dir <dir>`,`Directory where SQLite databases are stored`).option(`--cache-dir <dir>`,`Custom cache directory for databases, tokens, and logs`).option(`--tmp, --temp`,`Store cache and databases in system temporary directory`,!1).option(`-y, --yes`,`Skip interactive cache directory prompt and use default .cache`,!1).action($),Q.commandsGroup(`Server:`),Q.command(`serve [port]`).description(`Serve static files and start backend services (optional: --peerjs, --a2a)`).optionsGroup(`Server & Network Options:`).option(`-p, --port <port>`,`Port to listen on (default: 8888)`).option(`--host <host>`,`Bind host/IP`,`127.0.0.1`).option(`--no-static`,`Disable static file and UI serving (services-only mode)`).option(`--open`,`Automatically open default browser`,!1).option(`-v, --verbose`,`Enable verbose request/proxy logging`,!1).optionsGroup(`Site Options:`).option(`--content-root <dir>`,`Content root directory`,_.cwd()).option(`--out-dir <dir>`,`Output directory relative to content root`,`dist/public`).optionsGroup(`Security & Proxy Options:`).option(`--cors-mode <mode>`,`CORS policy: localhost | private | all`,`localhost`).option(`--allow-private-proxy`,`Allow proxy to reach private/loopback addresses`,!1).option(`--peerjs`,`Enable built-in PeerJS signaling server`,!1).option(`--a2a`,`Enable A2A v1.0 agent card, JSON-RPC, and SSE endpoints`,!1).optionsGroup(`TLS / HTTPS Options:`).option(`--https`,`Enable HTTPS dev server`,!1).option(`--cert <path>`,`Path to existing TLS certificate file`).option(`--key <path>`,`Path to existing TLS private key file`).option(`--ssl-dir <path>`,`Directory for TLS certificate generation/storage`).optionsGroup(`Storage & Database Options:`).option(`--database-dir <dir>`,`Directory where SQLite databases are stored`).option(`--cache-dir <dir>`,`Custom cache directory for databases, tokens, and logs`).option(`--tmp, --temp`,`Store cache and databases in system temporary directory`,!1).option(`-y, --yes`,`Skip interactive cache directory prompt and use default .cache`,!1).action(async(e,t)=>{try{let r=h.resolve(t.contentRoot||_.cwd()),i=parseInt(e||t.port||_.env.PORT||`8888`,10),a=t.host||t.ip||_.env.SHADOWCLAW_DEV_IP||`127.0.0.1`,o=t.outDir||`dist/public`,s=h.resolve(r,o),c=await n({contentRoot:r,cacheDir:t.cacheDir,databaseDir:t.databaseDir,tmp:t.tmp||t.temp,yes:t.yes}),l=c.cacheDir,u=c.databaseDir,d=t.static!==!1;d&&!await Y(h.join(s,`index.html`))&&(console.error(`Error: No index.html found in ${s}. Run "shadow-claw build" first.`),_.exit(1));let f=await Y(h.join(U,`dist/server.js`))?h.join(U,`dist/server.js`):h.join(U,`src/server/server.ts`);_.env.SHADOWCLAW_ROOT_PATH=s,_.env.SHADOWCLAW_CACHE_DIR=l,_.env.SHADOWCLAW_DATABASE_DIR=u,_.env.SHADOWCLAW_DEV_IP=a;let{startServer:p}=await import(f),m=new Set((t.corsAllowOrigin||_.env.SHADOWCLAW_CORS_ALLOWED_ORIGINS||`https://xt-ml.github.io`).split(`,`).map(e=>e.trim()).filter(Boolean)),g=!!(t.https||[`1`,`true`,`yes`].includes((_.env.SHADOWCLAW_HTTPS||``).toLowerCase().trim())),v=t.cert||(_.env.SHADOWCLAW_TLS_CERT||_.env.SHADOWCLAW_CERT||``).trim()||void 0,y=t.key||(_.env.SHADOWCLAW_TLS_KEY||_.env.SHADOWCLAW_KEY||``).trim()||void 0,b=h.resolve(r,t.sslDir||_.env.SHADOWCLAW_SSL_DIR||_.env.SHADOWCLAW_TLS_DIR||h.join(l,`tls`));await p({port:i,bindHost:a,corsMode:t.corsMode||`localhost`,allowedOrigins:m,verbose:!!t.verbose,peerjs:!!t.peerjs,a2aEnabled:X(t),rootPath:s,cacheDir:l,databaseDir:u,allowPrivateProxy:!!t.allowPrivateProxy,https:g,certPath:v,keyPath:y,sslDir:b,serveStatic:d});let x=`${g?`https`:`http`}://${a}:${i}`;d&&t.open&&Z(x)}catch(e){console.error(`Serve error:`,e),_.exit(1)}});async function oe(e,t){try{let r=h.resolve(t.contentRoot||_.cwd()),i=parseInt(e||t.port||_.env.PORT||`8888`,10),a=t.host||t.ip||_.env.SHADOWCLAW_DEV_IP||`127.0.0.1`,o=await n({contentRoot:r,cacheDir:t.cacheDir,databaseDir:t.databaseDir,tmp:t.tmp||t.temp,yes:t.yes}),s=o.cacheDir,c=o.databaseDir,l=await Y(h.join(U,`dist/server.js`))?h.join(U,`dist/server.js`):h.join(U,`src/server/server.ts`);_.env.SHADOWCLAW_CACHE_DIR=s,_.env.SHADOWCLAW_DATABASE_DIR=c,_.env.SHADOWCLAW_DEV_IP=a,_.env.SHADOWCLAW_SERVE_STATIC=`false`;let{startServer:u}=await import(l),d=new Set((t.corsAllowOrigin||_.env.SHADOWCLAW_CORS_ALLOWED_ORIGINS||`https://xt-ml.github.io`).split(`,`).map(e=>e.trim()).filter(Boolean)),f=!!(t.https||[`1`,`true`,`yes`].includes((_.env.SHADOWCLAW_HTTPS||``).toLowerCase().trim())),p=t.cert||(_.env.SHADOWCLAW_TLS_CERT||_.env.SHADOWCLAW_CERT||``).trim()||void 0,m=t.key||(_.env.SHADOWCLAW_TLS_KEY||_.env.SHADOWCLAW_KEY||``).trim()||void 0,g=h.resolve(r,t.sslDir||_.env.SHADOWCLAW_SSL_DIR||_.env.SHADOWCLAW_TLS_DIR||h.join(s,`tls`));await u({port:i,bindHost:a,corsMode:t.corsMode||`localhost`,allowedOrigins:d,verbose:!!t.verbose,peerjs:!!t.peerjs,a2aEnabled:X(t),rootPath:``,cacheDir:s,databaseDir:c,controlToken:t.controlToken||_.env.SHADOWCLAW_CONTROL_TOKEN||void 0,allowPrivateProxy:!!t.allowPrivateProxy,https:f,certPath:p,keyPath:m,sslDir:g,serveStatic:!1})}catch(e){console.error(`Server error:`,e),_.exit(1)}}Q.command(`server [port]`).aliases([`services`,`api`]).description(`Start backend services (HTTP MCP, control plane, scheduler, and proxy) without serving static files (optional: --peerjs, --a2a; aliases: services, api)`).optionsGroup(`Server & Network Options:`).option(`-p, --port <port>`,`Port to listen on (default: 8888)`).option(`--host <host>`,`Bind host/IP`,`127.0.0.1`).option(`--ip <host>`,`Bind host/IP (alias)`).option(`-v, --verbose`,`Enable verbose request/proxy logging`,!1).optionsGroup(`Security & Proxy Options:`).option(`--cors-mode <mode>`,`CORS policy: localhost | private | all`,`localhost`).option(`--cors-allow-origin <origin>`,`Explicit allowed origins (comma-separated)`).option(`--control-token <token>`,`Secret token for control-plane authentication`).option(`--peerjs`,`Enable built-in PeerJS signaling server`,!1).option(`--a2a`,`Enable A2A v1.0 agent card, JSON-RPC, and SSE endpoints`,!1).option(`--allow-private-proxy`,`Allow proxy to reach private/loopback addresses`,!1).optionsGroup(`TLS / HTTPS Options:`).option(`--https`,`Enable HTTPS server`,!1).option(`--cert <path>`,`Path to existing TLS certificate file`).option(`--key <path>`,`Path to existing TLS private key file`).option(`--ssl-dir <path>`,`Directory for TLS certificate generation/storage`).optionsGroup(`Storage & Database Options:`).option(`--content-root <dir>`,`Content root directory`,_.cwd()).option(`--database-dir <dir>`,`Directory where SQLite databases are stored`).option(`--cache-dir <dir>`,`Custom cache directory for databases, tokens, and logs`).option(`--tmp, --temp`,`Store cache and databases in system temporary directory`,!1).option(`-y, --yes`,`Skip interactive cache directory prompt and use default .cache`,!1).action(oe),Q.command(`mcp`).description(`Start the standalone MCP server only (does not start backend services, PeerJS, or A2A)`).optionsGroup(`MCP Protocol Options:`).option(`--mcp-transport <transport>`,`MCP transport: stdio | http`,`stdio`).option(`--relay-client-tools`,`Discover and relay tools from connected browser clients`,!0).option(`--no-relay-client-tools`,`Disable relaying browser client tools`).optionsGroup(`Target Client Options:`).option(`--client <id>`,`Target client ID (defaults to first active client)`).optionsGroup(`Control Plane Connection Options:`).option(`--host <host>`,`Control plane host`).option(`--port <port>`,`Control plane port or HTTP MCP port`).option(`--token <token>`,`Control token`).option(`--https`,`Connect to server via HTTPS`,!1).option(`-k, --insecure`,`Allow self-signed TLS certificates`,!0).optionsGroup(`Transport & Peer Options:`).option(`--transport <transport>`,`Control plane client transport: http | webrtc`,`http`).option(`--peer-id <id>`,`Custom WebRTC CLI peer ID`).option(`--local-tools`,`Expose headless CLI agent tools (read_file, write_file, bash, git_*, etc.)`,!0).option(`--no-local-tools`,`Disable exposing headless CLI agent tools`).option(`--tool-prefix <prefix>`,`Tool prefix style for local tools: local | none | shadowclaw (default: local)`,`local`).optionsGroup(`Workspace & Local Agent Tools Options:`).option(`--workspace <dir>`,`Workspace directory for local tools (default: current working directory)`).option(`--database-dir <dir>`,`Directory where SQLite databases are stored`).option(`--group <groupId>`,`Conversation group ID for local tools (default: server:main)`).option(`--tools <tools>`,`Comma-separated list of local agent tools to expose (default: all headless-safe tools)`).option(`--tools-profile <name>`,`Tools profile to activate for local tools`).option(`--allow-internet, --internet-access`,`Allow full internet access for local Bash and JavaScript tools`).action(async e=>{await H(e)}),Q.commandsGroup(`Control Plane & Client Bridge:`),Q.command(`clients`).description(`List connected / registered browser and Electron clients`).optionsGroup(`Control Plane Connection Options:`).option(`--host <host>`,`Control plane host`).option(`--port <port>`,`Control plane port`).option(`--token <token>`,`Control token`).option(`--https`,`Connect to server via HTTPS`,!1).option(`-k, --insecure`,`Allow self-signed TLS certificates`,!0).optionsGroup(`Transport & Peer Options:`).option(`--transport <transport>`,`Transport to use: http | webrtc`,`http`).option(`--peer-id <id>`,`Custom WebRTC CLI peer ID`).option(`--renew-peer-id`,`Renew WebRTC CLI peer ID before connecting`,!1).option(`--cache-dir <dir>`,`Custom cache directory`).action(async e=>{await O(e)}),Q.command(`send <message>`).description(`Send a message/prompt to a connected client or peer agent`).optionsGroup(`Target Options:`).option(`--client <id>`,`Target client ID (defaults to first available)`).option(`--group <groupId>`,`Target conversation group ID`).option(`-f, --file <path>`,`Attach a local file to send with the message`).optionsGroup(`Control Plane Connection Options:`).option(`--host <host>`,`Control plane host`).option(`--port <port>`,`Control plane port`).option(`--token <token>`,`Control token`).option(`--https`,`Connect to server via HTTPS`,!1).option(`-k, --insecure`,`Allow self-signed TLS certificates`,!0).optionsGroup(`Transport & Peer Options:`).option(`--transport <transport>`,`Transport to use: http | webrtc`,`http`).option(`--peer-id <id>`,`Custom WebRTC CLI peer ID`).option(`--renew-peer-id`,`Renew WebRTC CLI peer ID before sending`,!1).option(`--cache-dir <dir>`,`Custom cache directory`).option(`--timeout <seconds>`,`Timeout in seconds to wait for response`,`120`).option(`--json`,`Output response payload as JSON`,!1).action(async(e,t)=>{await te(e,t)}),Q.command(`send-file <file>`).description(`Transfer a file to a connected peer or client over WebRTC or HTTP`).optionsGroup(`Target Options:`).option(`--client <id>`,`Target client ID (defaults to first available)`).option(`--prompt <prompt>`,`Accompanying prompt or instructions for the receiving agent`).option(`--name <fileName>`,`Override remote file name`).option(`--group <groupId>`,`Target conversation group ID`).optionsGroup(`Control Plane Connection Options:`).option(`--host <host>`,`Control plane host`).option(`--port <port>`,`Control plane port`).option(`--token <token>`,`Control token`).option(`--https`,`Connect to server via HTTPS`,!1).option(`-k, --insecure`,`Allow self-signed TLS certificates`,!0).optionsGroup(`Transport & Peer Options:`).option(`--transport <transport>`,`Transport to use: http | webrtc`,`webrtc`).option(`--peer-id <id>`,`Custom WebRTC CLI peer ID`).option(`--renew-peer-id`,`Renew WebRTC CLI peer ID before sending`,!1).option(`--cache-dir <dir>`,`Custom cache directory`).option(`--timeout <seconds>`,`Transfer and execution timeout in seconds`,`120`).option(`--json`,`Output response payload as JSON`,!1).action(async(e,t)=>{await k(e,t)}),Q.command(`tasks`).description(`List scheduled tasks on a connected client`).optionsGroup(`Target Options:`).option(`--client <id>`,`Target client ID`).option(`--group <groupId>`,`Filter tasks by conversation group ID`).optionsGroup(`Control Plane Connection Options:`).option(`--host <host>`,`Control plane host`).option(`--port <port>`,`Control plane port`).option(`--token <token>`,`Control token`).option(`--https`,`Connect to server via HTTPS`,!1).option(`-k, --insecure`,`Allow self-signed TLS certificates`,!0).optionsGroup(`Transport & Peer Options:`).option(`--transport <transport>`,`Transport to use: http | webrtc`,`http`).option(`--peer-id <id>`,`Custom WebRTC CLI peer ID`).option(`--renew-peer-id`,`Renew WebRTC CLI peer ID before connecting`,!1).option(`--cache-dir <dir>`,`Custom cache directory`).action(async e=>{await j(e)}),Q.command(`backup [action]`).description(`Trigger or manage client workspace backups (trigger | list | delete)`).optionsGroup(`Target Options:`).option(`--client <id>`,`Client ID`).option(`--backup-id <id>`,`Backup ID (for delete)`).option(`--group <groupId>`,`Specific workspace group ID`).optionsGroup(`Control Plane Connection Options:`).option(`--host <host>`,`Control plane host`).option(`--port <port>`,`Control plane port`).option(`--token <token>`,`Control token`).option(`--https`,`Connect to server via HTTPS`,!1).option(`-k, --insecure`,`Allow self-signed TLS certificates`,!0).optionsGroup(`Transport & Peer Options:`).option(`--transport <transport>`,`Transport to use: http | webrtc`,`http`).option(`--peer-id <id>`,`Custom WebRTC CLI peer ID`).option(`--renew-peer-id`,`Renew WebRTC CLI peer ID before connecting`,!1).option(`--cache-dir <dir>`,`Custom cache directory`).action(async(e,t)=>{await A(e||`trigger`,t)}),Q.commandsGroup(`WebRTC:`),Q.command(`webrtc [action] [customId]`).summary(`Manage WebRTC CLI configuration and peer identity (.cache/cli-peer-id)`).description(`Manage WebRTC CLI configuration and peer identity (.cache/cli-peer-id)