shadow-claw 1.59.6 → 1.59.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (324) hide show
  1. package/.well-known/mcp/server-card.json +12 -4
  2. package/.well-known/mcp.json +12 -4
  3. package/dist/cli/build/build.js +1 -1
  4. package/dist/cli/{chunk-DM4xsTry.js → chunk-3vNYrs_L.js} +1 -1
  5. package/dist/cli/{chunk-Ctg5L55n.js → chunk-66BvqAV0.js} +1 -1
  6. package/dist/cli/{chunk-Bq38OubR.js → chunk-B0qusANw.js} +1 -1
  7. package/dist/cli/{chunk-yiVdvGCJ.js → chunk-B3TrWbca.js} +7 -7
  8. package/dist/cli/{chunk-C8DBACtx.js → chunk-B88Z8T_9.js} +1 -1
  9. package/dist/cli/chunk-BCjL0JXf.js +1 -0
  10. package/dist/cli/chunk-BNcu1oiT.js +1 -0
  11. package/dist/cli/{chunk-gvNsvav0.js → chunk-C5ypckWC.js} +7 -7
  12. package/dist/cli/{chunk-Dw8GndPD.js → chunk-CAAeGOdy.js} +1 -1
  13. package/dist/cli/chunk-CFxww5Yz.js +1 -0
  14. package/dist/cli/chunk-CGIgtL6R.js +1 -0
  15. package/dist/cli/{chunk-DJqHK-qS.js → chunk-CQaCgswD.js} +7 -7
  16. package/dist/cli/chunk-CZdCRqNe.js +7 -0
  17. package/dist/cli/chunk-CafdvLx-.js +1 -0
  18. package/dist/cli/{chunk-Bc_weULz.js → chunk-CncW6_WL.js} +1 -1
  19. package/dist/cli/chunk-DDvuLVfW.js +1 -0
  20. package/dist/cli/{chunk-Cq_kQohv.js → chunk-DMs7kREC.js} +1 -1
  21. package/dist/cli/{chunk-CX2itile.js → chunk-D_te8ufL.js} +1 -1
  22. package/dist/cli/{chunk-3wTukVof.js → chunk-DhOU6GYX.js} +1 -1
  23. package/dist/cli/chunk-Dhap1VwA.js +1 -0
  24. package/dist/cli/chunk-DwvavohW.js +1 -0
  25. package/dist/cli/{chunk-DLde6nuO.js → chunk-SRBRVorc.js} +1 -1
  26. package/dist/cli/{chunk-D3y7h9Xe.js → chunk-SxK79JmB.js} +1 -1
  27. package/dist/cli/chunk-_a0CkUNS.js +139 -0
  28. package/dist/cli/{chunk-C9o6lXP3.js → chunk-hVf839t7.js} +1 -1
  29. package/dist/cli/chunk-iB8OoMmW.js +7 -0
  30. package/dist/cli/cli.js +1 -1
  31. package/dist/headless-agent.js +1 -1
  32. package/dist/lib/{app-routes-DJdIjp2V.js → app-routes-BXiRvlNl.js} +7 -25
  33. package/dist/lib/{app-routes-DJdIjp2V.js.map → app-routes-BXiRvlNl.js.map} +1 -1
  34. package/dist/lib/{attachment-capabilities-Dbb-4ZP5.js → attachment-capabilities-BjkEPip8.js} +2 -2
  35. package/dist/lib/{attachment-capabilities-Dbb-4ZP5.js.map → attachment-capabilities-BjkEPip8.js.map} +1 -1
  36. package/dist/lib/{channel-Dlru5ofR.js → channel-mmdGzPkT.js} +3 -3
  37. package/dist/lib/{channel-Dlru5ofR.js.map → channel-mmdGzPkT.js.map} +1 -1
  38. package/dist/lib/{chat-template-BuuLY8l7.js → chat-template-DPEKGJhB.js} +2 -2
  39. package/dist/lib/{chat-template-BuuLY8l7.js.map → chat-template-DPEKGJhB.js.map} +1 -1
  40. package/dist/lib/{compact-context-BtR55YPU.js → compact-context-CY9BBlUQ.js} +19 -19
  41. package/dist/lib/{compact-context-BtR55YPU.js.map → compact-context-CY9BBlUQ.js.map} +1 -1
  42. package/dist/lib/components/common/shadow-claw-provider-model-picker.js +1 -1
  43. package/dist/lib/components/index.js +27 -27
  44. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  45. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  46. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  47. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  48. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  49. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  50. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  51. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  52. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  53. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  54. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  55. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  56. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  57. package/dist/lib/components/shadow-claw-a2ui.js +1 -1
  58. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  59. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  60. package/dist/lib/components/shadow-claw-channels.js +1 -1
  61. package/dist/lib/components/shadow-claw-chat.js +1 -1
  62. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  63. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  64. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  65. package/dist/lib/components/shadow-claw-files.js +1 -1
  66. package/dist/lib/components/shadow-claw-git.js +1 -1
  67. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  68. package/dist/lib/components/shadow-claw-llm.js +1 -1
  69. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  70. package/dist/lib/components/shadow-claw-networking.js +1 -1
  71. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  72. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  73. package/dist/lib/components/shadow-claw-pages.js +1 -1
  74. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  75. package/dist/lib/components/shadow-claw-provider-model-picker.js +1 -1
  76. package/dist/lib/components/shadow-claw-settings.js +1 -1
  77. package/dist/lib/components/shadow-claw-storage.js +1 -1
  78. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  79. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  80. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  81. package/dist/lib/components/shadow-claw-tools.js +1 -1
  82. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  83. package/dist/lib/components/shadow-claw.js +1 -1
  84. package/dist/lib/{config-DxNI3TlW.js → config-BrHR97zt.js} +2 -2
  85. package/dist/lib/{config-DxNI3TlW.js.map → config-BrHR97zt.js.map} +1 -1
  86. package/dist/lib/{configure-peer-js-ChDhOZU4.js → configure-peer-js-ccNvax2N.js} +3 -3
  87. package/dist/lib/{configure-peer-js-ChDhOZU4.js.map → configure-peer-js-ccNvax2N.js.map} +1 -1
  88. package/dist/lib/{connections-DC4NZkJE.js → connections-C1FWsBsE.js} +2 -2
  89. package/dist/lib/{connections-DC4NZkJE.js.map → connections-C1FWsBsE.js.map} +1 -1
  90. package/dist/lib/{credentials-5vpz0XPk.js → credentials-CZbngHXW.js} +2 -2
  91. package/dist/lib/{credentials-5vpz0XPk.js.map → credentials-CZbngHXW.js.map} +1 -1
  92. package/dist/lib/{discover-skills-CD0sKvAI.js → discover-skills-OwlQ2sXA.js} +13 -13
  93. package/dist/lib/{discover-skills-CD0sKvAI.js.map → discover-skills-OwlQ2sXA.js.map} +1 -1
  94. package/dist/lib/{download-group-file-Dk3qaxhJ.js → download-group-file-D0wgg10Q.js} +2 -2
  95. package/dist/lib/{download-group-file-Dk3qaxhJ.js.map → download-group-file-D0wgg10Q.js.map} +1 -1
  96. package/dist/lib/{file-viewer-B4pRW-_G.js → file-viewer-DOfvX6yy.js} +5 -5
  97. package/dist/lib/{file-viewer-B4pRW-_G.js.map → file-viewer-DOfvX6yy.js.map} +1 -1
  98. package/dist/lib/{get-or-create-subscriber-id-HCcgDEPz.js → get-or-create-subscriber-id-wyzaML7Z.js} +2 -2
  99. package/dist/lib/{get-or-create-subscriber-id-HCcgDEPz.js.map → get-or-create-subscriber-id-wyzaML7Z.js.map} +1 -1
  100. package/dist/lib/{git-B3Q1euc5.js → git-D2J_j9X9.js} +5 -5
  101. package/dist/lib/{git-B3Q1euc5.js.map → git-D2J_j9X9.js.map} +1 -1
  102. package/dist/lib/{iframe-bridge-scripts-D8iuFhUk.js → iframe-bridge-scripts-Dx825LLG.js} +2 -2
  103. package/dist/lib/{iframe-bridge-scripts-D8iuFhUk.js.map → iframe-bridge-scripts-Dx825LLG.js.map} +1 -1
  104. package/dist/lib/index.js +28 -28
  105. package/dist/lib/{init-chat-split-resize-B0ODULx9.js → init-chat-split-resize-Cc0bd2z9.js} +2 -2
  106. package/dist/lib/{init-chat-split-resize-B0ODULx9.js.map → init-chat-split-resize-Cc0bd2z9.js.map} +1 -1
  107. package/dist/lib/{init-control-plane-C1FRRmjC.js → init-control-plane-B7blDVIE.js} +15 -15
  108. package/dist/lib/{init-control-plane-C1FRRmjC.js.map → init-control-plane-B7blDVIE.js.map} +1 -1
  109. package/dist/lib/{invoke-agent-CzN7sVh-.js → invoke-agent-SxvudiDT.js} +11 -11
  110. package/dist/lib/{invoke-agent-CzN7sVh-.js.map → invoke-agent-SxvudiDT.js.map} +1 -1
  111. package/dist/lib/{markdown-mbNo7cV3.js → markdown--6vTAPEH.js} +2 -2
  112. package/dist/lib/{markdown-mbNo7cV3.js.map → markdown--6vTAPEH.js.map} +1 -1
  113. package/dist/lib/{mcp-reconnect-3T7yWGEY.js → mcp-reconnect-BeqQvNWO.js} +3 -3
  114. package/dist/lib/{mcp-reconnect-3T7yWGEY.js.map → mcp-reconnect-BeqQvNWO.js.map} +1 -1
  115. package/dist/lib/{model-ranking-DGNSWYwN.js → model-ranking-BhsJV7vb.js} +2 -2
  116. package/dist/lib/{model-ranking-DGNSWYwN.js.map → model-ranking-BhsJV7vb.js.map} +1 -1
  117. package/dist/lib/{move-group-entry-NMTJ59M9.js → move-group-entry-DDpjxa10.js} +5 -5
  118. package/dist/lib/{move-group-entry-NMTJ59M9.js.map → move-group-entry-DDpjxa10.js.map} +1 -1
  119. package/dist/lib/{orchestrator-B8FV1V7x.js → orchestrator-C7fkh7T7.js} +24 -24
  120. package/dist/lib/{orchestrator-B8FV1V7x.js.map → orchestrator-C7fkh7T7.js.map} +1 -1
  121. package/dist/lib/{orchestrator-i_QJ-o22.js → orchestrator-CCARkxQC.js} +11 -11
  122. package/dist/lib/orchestrator-CCARkxQC.js.map +1 -0
  123. package/dist/lib/{parse-path-DPCn-HwI.js → parse-path-BOHQP_IQ.js} +3 -3
  124. package/dist/lib/{parse-path-DPCn-HwI.js.map → parse-path-BOHQP_IQ.js.map} +1 -1
  125. package/dist/lib/{peerjs-z5zeioPV.js → peerjs-Bfw_FWLB.js} +8 -8
  126. package/dist/lib/{peerjs-z5zeioPV.js.map → peerjs-Bfw_FWLB.js.map} +1 -1
  127. package/dist/lib/{process-peer-query-param-CJp7w7AU.js → process-peer-query-param-BxYiZNdf.js} +5 -5
  128. package/dist/lib/{process-peer-query-param-CJp7w7AU.js.map → process-peer-query-param-BxYiZNdf.js.map} +1 -1
  129. package/dist/lib/{process-pending-shared-payloads-B6_TlBFA.js → process-pending-shared-payloads-DPIbwRb3.js} +4 -4
  130. package/dist/lib/{process-pending-shared-payloads-B6_TlBFA.js.map → process-pending-shared-payloads-DPIbwRb3.js.map} +1 -1
  131. package/dist/lib/{process-room-query-param-C3FFGGn6.js → process-room-query-param-B2_d50nE.js} +4 -4
  132. package/dist/lib/{process-room-query-param-C3FFGGn6.js.map → process-room-query-param-B2_d50nE.js.map} +1 -1
  133. package/dist/lib/{provider-DcQZypu5.js → provider-BC9KPI14.js} +3 -3
  134. package/dist/lib/{provider-DcQZypu5.js.map → provider-BC9KPI14.js.map} +1 -1
  135. package/dist/lib/{push-client-Cx5rMs6J.js → push-client-rrjTdc-U.js} +5 -5
  136. package/dist/lib/{push-client-Cx5rMs6J.js.map → push-client-rrjTdc-U.js.map} +1 -1
  137. package/dist/lib/{read-group-file-bytes-CXOG_YyM.js → read-group-file-bytes-UQIk1eJG.js} +2 -2
  138. package/dist/lib/{read-group-file-bytes-CXOG_YyM.js.map → read-group-file-bytes-UQIk1eJG.js.map} +1 -1
  139. package/dist/lib/{rooms-CwlkYLDU.js → rooms-bwGoYb1q.js} +2 -2
  140. package/dist/lib/{rooms-CwlkYLDU.js.map → rooms-bwGoYb1q.js.map} +1 -1
  141. package/dist/lib/{shadow-claw-DoQ7fgl5.js → shadow-claw-CypGVlVO.js} +17 -20
  142. package/dist/lib/shadow-claw-CypGVlVO.js.map +1 -0
  143. package/dist/lib/{shadow-claw-a2ui-Br6qJMs1.js → shadow-claw-a2ui-lG0vQbW8.js} +2 -2
  144. package/dist/lib/{shadow-claw-a2ui-Br6qJMs1.js.map → shadow-claw-a2ui-lG0vQbW8.js.map} +1 -1
  145. package/dist/lib/{shadow-claw-accounts-BTDILfWw.js → shadow-claw-accounts-CkqyCxwp.js} +3 -3
  146. package/dist/lib/{shadow-claw-accounts-BTDILfWw.js.map → shadow-claw-accounts-CkqyCxwp.js.map} +1 -1
  147. package/dist/lib/{shadow-claw-channel-config-IKiL34tI.js → shadow-claw-channel-config-DJpDovkF.js} +4 -4
  148. package/dist/lib/{shadow-claw-channel-config-IKiL34tI.js.map → shadow-claw-channel-config-DJpDovkF.js.map} +1 -1
  149. package/dist/lib/{shadow-claw-channels-JgEzuHWK.js → shadow-claw-channels-DJLwRovH.js} +3 -3
  150. package/dist/lib/{shadow-claw-channels-JgEzuHWK.js.map → shadow-claw-channels-DJLwRovH.js.map} +1 -1
  151. package/dist/lib/{shadow-claw-chat-SGUDT31r.js → shadow-claw-chat-B92cPaft.js} +15 -15
  152. package/dist/lib/{shadow-claw-chat-SGUDT31r.js.map → shadow-claw-chat-B92cPaft.js.map} +1 -1
  153. package/dist/lib/{shadow-claw-control-plane-CRWFZ3vD.js → shadow-claw-control-plane-fvn-qyHj.js} +7 -7
  154. package/dist/lib/{shadow-claw-control-plane-CRWFZ3vD.js.map → shadow-claw-control-plane-fvn-qyHj.js.map} +1 -1
  155. package/dist/lib/{shadow-claw-conversations-D23GJ7qo.js → shadow-claw-conversations-CsVyDOny.js} +7 -7
  156. package/dist/lib/{shadow-claw-conversations-D23GJ7qo.js.map → shadow-claw-conversations-CsVyDOny.js.map} +1 -1
  157. package/dist/lib/{shadow-claw-file-viewer-C1V8WTiU.js → shadow-claw-file-viewer-DFfyP7s5.js} +10 -10
  158. package/dist/lib/{shadow-claw-file-viewer-C1V8WTiU.js.map → shadow-claw-file-viewer-DFfyP7s5.js.map} +1 -1
  159. package/dist/lib/{shadow-claw-files-DN7irmE1.js → shadow-claw-files-cT6HL7ye.js} +11 -11
  160. package/dist/lib/{shadow-claw-files-DN7irmE1.js.map → shadow-claw-files-cT6HL7ye.js.map} +1 -1
  161. package/dist/lib/{shadow-claw-git-D-1oIh65.js → shadow-claw-git-Cv9mQgTx.js} +6 -6
  162. package/dist/lib/{shadow-claw-git-D-1oIh65.js.map → shadow-claw-git-Cv9mQgTx.js.map} +1 -1
  163. package/dist/lib/{shadow-claw-integrations-CZjnm7cM.js → shadow-claw-integrations-RZZ-m-Id.js} +4 -4
  164. package/dist/lib/{shadow-claw-integrations-CZjnm7cM.js.map → shadow-claw-integrations-RZZ-m-Id.js.map} +1 -1
  165. package/dist/lib/{shadow-claw-llm-4Gefh5FN.js → shadow-claw-llm-CKOYzPDp.js} +9 -9
  166. package/dist/lib/{shadow-claw-llm-4Gefh5FN.js.map → shadow-claw-llm-CKOYzPDp.js.map} +1 -1
  167. package/dist/lib/{shadow-claw-mcp-remote-B9ssb3YV.js → shadow-claw-mcp-remote-BKFROurv.js} +4 -4
  168. package/dist/lib/{shadow-claw-mcp-remote-B9ssb3YV.js.map → shadow-claw-mcp-remote-BKFROurv.js.map} +1 -1
  169. package/dist/lib/{shadow-claw-networking-BN5BB4hb.js → shadow-claw-networking-DYfiUQaH.js} +2 -2
  170. package/dist/lib/{shadow-claw-networking-BN5BB4hb.js.map → shadow-claw-networking-DYfiUQaH.js.map} +1 -1
  171. package/dist/lib/{shadow-claw-notifications-71KARtkY.js → shadow-claw-notifications-JJlzriuX.js} +3 -3
  172. package/dist/lib/{shadow-claw-notifications-71KARtkY.js.map → shadow-claw-notifications-JJlzriuX.js.map} +1 -1
  173. package/dist/lib/{shadow-claw-page-header-DMGO-TSe.js → shadow-claw-page-header-C_Qr3xZM.js} +2 -2
  174. package/dist/lib/{shadow-claw-page-header-DMGO-TSe.js.map → shadow-claw-page-header-C_Qr3xZM.js.map} +1 -1
  175. package/dist/lib/{shadow-claw-pages-BiRM6qiA.js → shadow-claw-pages-BCo3ihZI.js} +11 -11
  176. package/dist/lib/{shadow-claw-pages-BiRM6qiA.js.map → shadow-claw-pages-BCo3ihZI.js.map} +1 -1
  177. package/dist/lib/{shadow-claw-peerjs-BZu7jNSe.js → shadow-claw-peerjs-CFNjfrY5.js} +6 -6
  178. package/dist/lib/{shadow-claw-peerjs-BZu7jNSe.js.map → shadow-claw-peerjs-CFNjfrY5.js.map} +1 -1
  179. package/dist/lib/{shadow-claw-provider-model-picker-BXYXEobD.js → shadow-claw-provider-model-picker-B-Ct4yW-.js} +2 -2
  180. package/dist/lib/{shadow-claw-provider-model-picker-BXYXEobD.js.map → shadow-claw-provider-model-picker-B-Ct4yW-.js.map} +1 -1
  181. package/dist/lib/{shadow-claw-settings-CcT5EK08.js → shadow-claw-settings-BMwne0bh.js} +7 -7
  182. package/dist/lib/{shadow-claw-settings-CcT5EK08.js.map → shadow-claw-settings-BMwne0bh.js.map} +1 -1
  183. package/dist/lib/{shadow-claw-storage-eTOpbvpi.js → shadow-claw-storage-DUY8B9m-.js} +5 -5
  184. package/dist/lib/{shadow-claw-storage-eTOpbvpi.js.map → shadow-claw-storage-DUY8B9m-.js.map} +1 -1
  185. package/dist/lib/{shadow-claw-task-server-DFImTUbw.js → shadow-claw-task-server-yWeoA3eL.js} +2 -2
  186. package/dist/lib/{shadow-claw-task-server-DFImTUbw.js.map → shadow-claw-task-server-yWeoA3eL.js.map} +1 -1
  187. package/dist/lib/{shadow-claw-tasks-BjaxsmUx.js → shadow-claw-tasks-Bg0uM15I.js} +9 -9
  188. package/dist/lib/{shadow-claw-tasks-BjaxsmUx.js.map → shadow-claw-tasks-Bg0uM15I.js.map} +1 -1
  189. package/dist/lib/{shadow-claw-terminal-C-4wreFe.js → shadow-claw-terminal-fyJPppY_.js} +2 -2
  190. package/dist/lib/{shadow-claw-terminal-C-4wreFe.js.map → shadow-claw-terminal-fyJPppY_.js.map} +1 -1
  191. package/dist/lib/{shadow-claw-tools-COdrGZJk.js → shadow-claw-tools-D0T8m3go.js} +7 -7
  192. package/dist/lib/{shadow-claw-tools-COdrGZJk.js.map → shadow-claw-tools-D0T8m3go.js.map} +1 -1
  193. package/dist/lib/{shadow-claw-webvm-sxqVjO0L.js → shadow-claw-webvm-CQvzJwKI.js} +3 -3
  194. package/dist/lib/{shadow-claw-webvm-sxqVjO0L.js.map → shadow-claw-webvm-CQvzJwKI.js.map} +1 -1
  195. package/dist/lib/{sync-web-mcp-registration-D4hdUwtv.js → sync-web-mcp-registration-BFtG_4kx.js} +6 -6
  196. package/dist/lib/{sync-web-mcp-registration-D4hdUwtv.js.map → sync-web-mcp-registration-BFtG_4kx.js.map} +1 -1
  197. package/dist/lib/{system-prompt-DT_KeYaL.js → system-prompt-bhGRLoL2.js} +7 -7
  198. package/dist/lib/{system-prompt-DT_KeYaL.js.map → system-prompt-bhGRLoL2.js.map} +1 -1
  199. package/dist/lib/{tools-Beuyh8y1.js → tools-B8OJ4sMF.js} +4 -4
  200. package/dist/lib/{tools-Beuyh8y1.js.map → tools-B8OJ4sMF.js.map} +1 -1
  201. package/dist/lib/{transformers-DydnReu4.js → transformers-BMURofG6.js} +2 -2
  202. package/dist/lib/{transformers-DydnReu4.js.map → transformers-BMURofG6.js.map} +1 -1
  203. package/dist/lib/{trusted-types-CfwZl_rr.js → trusted-types-HwsGS5Nj.js} +19 -17
  204. package/dist/lib/{trusted-types-CfwZl_rr.js.map → trusted-types-HwsGS5Nj.js.map} +1 -1
  205. package/dist/lib/{upload-group-file-BbBzjTcN.js → upload-group-file-CJpoNjEb.js} +3 -3
  206. package/dist/lib/{upload-group-file-BbBzjTcN.js.map → upload-group-file-CJpoNjEb.js.map} +1 -1
  207. package/dist/lib/utils/index.js +1 -1
  208. package/dist/lib/utils/namespaced-storage.js +1 -1
  209. package/dist/lib/utils/runtime-assets.js +1 -1
  210. package/dist/lib/utils/utils.js +1 -1
  211. package/dist/lib/{webmcp-DCfAFiIO.js → webmcp-BoMTvgmX.js} +3 -3
  212. package/dist/lib/{webmcp-DCfAFiIO.js.map → webmcp-BoMTvgmX.js.map} +1 -1
  213. package/dist/lib/{write-group-file-bytes-Ccn-VFUU.js → write-group-file-bytes-CNT7DqOZ.js} +3 -3
  214. package/dist/lib/{write-group-file-bytes-Ccn-VFUU.js.map → write-group-file-bytes-CNT7DqOZ.js.map} +1 -1
  215. package/dist/public/.well-known/mcp/server-card.json +12 -4
  216. package/dist/public/.well-known/mcp.json +12 -4
  217. package/dist/public/agent.worker.js +1 -1
  218. package/dist/public/attachment-capabilities-AdwXt3--.js +1 -0
  219. package/dist/public/{channel-BylT3rJC.js → channel-Dk7wl-Av.js} +1 -1
  220. package/dist/public/{chat-template-DPHJy7tr.js → chat-template-BwAnTFKf.js} +1 -1
  221. package/dist/public/{compact-context-BINQh64w.js → compact-context-fOTqwKF6.js} +2 -2
  222. package/dist/public/config-C16fFWtP.js +1 -0
  223. package/dist/public/{configure-peer-js-DChhcOfe.js → configure-peer-js-BOV0tR6G.js} +1 -1
  224. package/dist/public/{connections-CHaw0VqP.js → connections-Dxwj8yK_.js} +1 -1
  225. package/dist/public/{create-model-cache-fetch-DQebkoPL.js → create-model-cache-fetch-DSAFjOwc.js} +1 -1
  226. package/dist/public/{credentials-CgVqS119.js → credentials-CJUQ5Ep2.js} +1 -1
  227. package/dist/public/{custom-element-security-kiDhPfb8.js → custom-element-security-B2daIE5r.js} +2 -2
  228. package/dist/public/{discover-skills-Cvmx5I9V.js → discover-skills-D1sNTy2r.js} +6 -6
  229. package/dist/public/docs/example/article/index.html +28 -29
  230. package/dist/public/docs/example/article.html +28 -29
  231. package/dist/public/docs/publishing/index.html +28 -29
  232. package/dist/public/docs/publishing.html +28 -29
  233. package/dist/public/docs/skill-creator/index.html +28 -29
  234. package/dist/public/docs/skill-creator.html +28 -29
  235. package/dist/public/{download-group-file-BapoRgfU.js → download-group-file-BkMH-JKi.js} +1 -1
  236. package/dist/public/{e2e-bridge-C0g8vZKr.js → e2e-bridge-Cz95DLlb.js} +1 -1
  237. package/dist/public/get-group-dir-D--BiEyk.js +1 -0
  238. package/dist/public/{get-or-create-subscriber-id-GvRZYXwA.js → get-or-create-subscriber-id-jVHnQfbr.js} +1 -1
  239. package/dist/public/{git-CaAAZfVd.js → git-BmMlwIMP.js} +2 -2
  240. package/dist/public/{iframe-bridge-scripts-BnqtKhE4.js → iframe-bridge-scripts-Cibg0m6A.js} +1 -1
  241. package/dist/public/index.html +28 -29
  242. package/dist/public/index.js +1 -1
  243. package/dist/public/{init-chat-split-resize-Btonoy8u.js → init-chat-split-resize-C8AqCCiK.js} +1 -1
  244. package/dist/public/init-control-plane-Cb31yLTY.js +1 -0
  245. package/dist/public/{invoke-agent-B3Osw6K7.js → invoke-agent-CN7mSV0Z.js} +1 -1
  246. package/dist/public/main/index.html +28 -29
  247. package/dist/public/main/memory/index.html +28 -29
  248. package/dist/public/main/memory.html +28 -29
  249. package/dist/public/main.html +28 -29
  250. package/dist/public/{markdown-CPbU4r1U.js → markdown-CDSb5Hrl.js} +1 -1
  251. package/dist/public/{mcp-reconnect-CzROVsXG.js → mcp-reconnect-iPZPihwX.js} +1 -1
  252. package/dist/public/{memory-storage-BkoMlxOr.js → memory-storage-2m7KZ-aP.js} +1 -1
  253. package/dist/public/{model-ranking-CK0iBo3Z.js → model-ranking-BgOSaNIy.js} +1 -1
  254. package/dist/public/{move-group-entry-CTxoq7lw.js → move-group-entry-CXneuNVa.js} +1 -1
  255. package/dist/public/orchestrator-DBO4NZqd.js +63 -0
  256. package/dist/public/{orchestrator-BrDjQbGf.js → orchestrator-Dyylc8IU.js} +2 -2
  257. package/dist/public/{peerjs-CgF4Iz5W.js → peerjs-l0jiBoh6.js} +1 -1
  258. package/dist/public/{process-peer-query-param-BL2k0Hu-.js → process-peer-query-param-s-aSP1Rq.js} +1 -1
  259. package/dist/public/{process-pending-shared-payloads-C1AgGvn8.js → process-pending-shared-payloads-BN3GigPT.js} +1 -1
  260. package/dist/public/{process-room-query-param-DM0QCq3_.js → process-room-query-param-B2Qe0F0M.js} +1 -1
  261. package/dist/public/provider-YPZmsuHR.js +1 -0
  262. package/dist/public/{push-client-DJEOz7bi.js → push-client-B2LC8Qp9.js} +1 -1
  263. package/dist/public/{rooms-C6LXIJl4.js → rooms-ChCEOvkw.js} +1 -1
  264. package/dist/public/service-worker.js +1 -1
  265. package/dist/public/shadow-claw-Br8mWDUx.js +1176 -0
  266. package/dist/public/{shadow-claw-accounts--4hd_oCz.js → shadow-claw-accounts-Dm6G7KMP.js} +1 -1
  267. package/dist/public/{shadow-claw-card-IbNlZAdK.js → shadow-claw-card-CggS8uSa.js} +1 -1
  268. package/dist/public/{shadow-claw-channels-Vq_pPGa2.js → shadow-claw-channels-088vhuWO.js} +1 -1
  269. package/dist/public/{shadow-claw-chat-D7_GS25e.js → shadow-claw-chat-BRwRlq-n.js} +3 -3
  270. package/dist/public/{shadow-claw-control-plane-WTMEV8_p.js → shadow-claw-control-plane-rhKACK85.js} +2 -2
  271. package/dist/public/{shadow-claw-conversations-CLQgU1IT.js → shadow-claw-conversations-CF_yUfKl.js} +1 -1
  272. package/dist/public/{shadow-claw-empty-state-D4CrFGsN.js → shadow-claw-empty-state-CkpOSXCS.js} +1 -1
  273. package/dist/public/{shadow-claw-file-viewer-BhqiqLWQ.js → shadow-claw-file-viewer-DWCejuY3.js} +4 -4
  274. package/dist/public/{shadow-claw-files-senDiG9l.js → shadow-claw-files-L6_ioyzh.js} +2 -2
  275. package/dist/public/{shadow-claw-git-DOOCqY23.js → shadow-claw-git-DsdkwLqQ.js} +2 -2
  276. package/dist/public/{shadow-claw-integrations-Bsvc3Agq.js → shadow-claw-integrations-CSbRTOm3.js} +1 -1
  277. package/dist/public/{shadow-claw-llm-actYICAk.js → shadow-claw-llm-BitaeAVc.js} +2 -2
  278. package/dist/public/{shadow-claw-mcp-remote-BYUgrK3v.js → shadow-claw-mcp-remote-gSbV5riy.js} +1 -1
  279. package/dist/public/{shadow-claw-networking-Dk3p5Ny_.js → shadow-claw-networking-Dn_y6Cl9.js} +1 -1
  280. package/dist/public/{shadow-claw-notifications-CzPAlay8.js → shadow-claw-notifications-Cj4Lqx8U.js} +1 -1
  281. package/dist/public/{shadow-claw-page-header-CjJpVkyL.js → shadow-claw-page-header-DR4OZFt2.js} +1 -1
  282. package/dist/public/{shadow-claw-page-header-action-button-2DH5O1TD.js → shadow-claw-page-header-action-button-BnCV_2Kb.js} +1 -1
  283. package/dist/public/{shadow-claw-pages-3r5I-wI8.js → shadow-claw-pages-mpDOtNYj.js} +6 -6
  284. package/dist/public/{shadow-claw-pdf-viewer-BiCEwsoY.js → shadow-claw-pdf-viewer-DZ_84qJH.js} +1 -1
  285. package/dist/public/{shadow-claw-settings-DgB9RSZN.js → shadow-claw-settings-CfFTYTEy.js} +2 -2
  286. package/dist/public/{shadow-claw-storage-JB_43nd8.js → shadow-claw-storage-DLmiT4bG.js} +1 -1
  287. package/dist/public/{shadow-claw-task-server-oi5UIxdA.js → shadow-claw-task-server-BoMBCsiS.js} +1 -1
  288. package/dist/public/{shadow-claw-tasks-CnyiOt81.js → shadow-claw-tasks-ChEp1j7x.js} +3 -3
  289. package/dist/public/{shadow-claw-terminal-BC3RynHt.js → shadow-claw-terminal-BaoVbOda.js} +1 -1
  290. package/dist/public/{shadow-claw-toast-YjG--2Za.js → shadow-claw-toast-e8oz7z6Z.js} +1 -1
  291. package/dist/public/{shadow-claw-tools-Bbwk4vlT.js → shadow-claw-tools-BYjUBiJz.js} +1 -1
  292. package/dist/public/{shadow-claw-webvm-HZqzl2H5.js → shadow-claw-webvm-xGb13TME.js} +1 -1
  293. package/dist/public/{sync-web-mcp-registration-BaH2nAP0.js → sync-web-mcp-registration-CQluj-Kz.js} +1 -1
  294. package/dist/public/{system-prompt-Dck3N8T0.js → system-prompt-CTJn0tK-.js} +1 -1
  295. package/dist/public/{tools-DHA1dK2I.js → tools-D-52Zmfc.js} +1 -1
  296. package/dist/public/{transformers-C-DuTM2K.js → transformers-CQ9ss9rD.js} +1 -1
  297. package/dist/public/{upload-group-file-Cejr3zo1.js → upload-group-file-A8kB7lvO.js} +1 -1
  298. package/dist/public/{webmcp-CMRtu57-.js → webmcp-DIUZjVF5.js} +1 -1
  299. package/dist/public/{write-group-file-CmJuVQNO.js → write-group-file-R67DjJ-q.js} +1 -1
  300. package/dist/public/{write-group-file-bytes-Cejr3zo1.js → write-group-file-bytes-A8kB7lvO.js} +1 -1
  301. package/dist/public/{zip-reader-CuQ13eLe.js → zip-reader-DN7FB-Q0.js} +1 -1
  302. package/dist/server.js +1 -1
  303. package/package.json +1 -1
  304. package/dist/cli/chunk-BFziiMKt.js +0 -7
  305. package/dist/cli/chunk-BM3llsxb.js +0 -1
  306. package/dist/cli/chunk-Bj5qFsDi.js +0 -7
  307. package/dist/cli/chunk-Bj95zm-y.js +0 -1
  308. package/dist/cli/chunk-BpyP-esT.js +0 -1
  309. package/dist/cli/chunk-CX696s3_.js +0 -1
  310. package/dist/cli/chunk-DRxCrCAA.js +0 -139
  311. package/dist/cli/chunk-DjbCHa0h.js +0 -1
  312. package/dist/cli/chunk-DsQhAF31.js +0 -1
  313. package/dist/cli/chunk-VM-dECyG.js +0 -1
  314. package/dist/cli/chunk-heu2xRw1.js +0 -1
  315. package/dist/lib/orchestrator-i_QJ-o22.js.map +0 -1
  316. package/dist/lib/shadow-claw-DoQ7fgl5.js.map +0 -1
  317. package/dist/public/app-routes-V_-URXc5.js +0 -1
  318. package/dist/public/attachment-capabilities-B6ibLwQB.js +0 -1
  319. package/dist/public/config-C-YdSFZB.js +0 -1
  320. package/dist/public/get-group-dir-DL44kvqW.js +0 -1
  321. package/dist/public/init-control-plane-BoJijVtf.js +0 -1
  322. package/dist/public/orchestrator-CaUpEVkQ.js +0 -63
  323. package/dist/public/provider-DNIL4-Hw.js +0 -1
  324. package/dist/public/shadow-claw-DdgeYPg5.js +0 -1176
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-claw-terminal-C-4wreFe.js","names":["shadowClawTerminalStyles","shadowClawTerminalTemplate"],"sources":["../../src/components/shadow-claw-terminal/utils/extract-last-prompt-line.ts","../../src/components/shadow-claw-terminal/utils/is-near-bottom.ts","../../src/components/shadow-claw-terminal/utils/consume-escape-sequence.ts","../../src/components/shadow-claw-terminal/utils/strip-internal-vm-noise.ts","../../src/components/shadow-claw-terminal/utils/normalize-terminal-text.ts","../../src/components/shadow-claw-terminal/shadow-claw-terminal.ts"],"sourcesContent":["export function extractLastPromptLine(text: string): string {\n if (!text) {\n return \"\";\n }\n\n const lines = text.split(\"\\n\");\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index] || \"\";\n if (/[#$](?:\\s|$)/.test(line)) {\n return line;\n }\n }\n\n return \"\";\n}\n","import { AUTO_SCROLL_BOTTOM_THRESHOLD_PX } from \"../shadow-claw-terminal.js\";\n\nexport function isNearBottom(screen: HTMLElement): boolean {\n const distanceToBottom =\n screen.scrollHeight - (screen.scrollTop + screen.clientHeight);\n\n return distanceToBottom <= AUTO_SCROLL_BOTTOM_THRESHOLD_PX;\n}\n","export function consumeEscapeSequence(text: string, startIndex: number) {\n const nextChar = text[startIndex + 1];\n\n if (nextChar === undefined) {\n return { action: \"ignore\", nextIndex: startIndex + 1, incomplete: true };\n }\n\n if (nextChar === \"[\") {\n let cursor = startIndex + 2;\n\n while (cursor < text.length) {\n const code = text.charCodeAt(cursor);\n\n if (code >= 0x40 && code <= 0x7e) {\n const finalChar = text[cursor];\n\n if (finalChar === \"J\") {\n return { action: \"clear-screen\", nextIndex: cursor + 1 };\n }\n\n if (finalChar === \"K\") {\n return { action: \"clear-line\", nextIndex: cursor + 1 };\n }\n\n return { action: \"ignore\", nextIndex: cursor + 1 };\n }\n\n cursor += 1;\n }\n\n return { action: \"ignore\", nextIndex: text.length, incomplete: true };\n }\n\n if (nextChar === \"]\") {\n let cursor = startIndex + 2;\n\n while (cursor < text.length) {\n const char = text[cursor];\n\n if (char === \"\\u0007\") {\n return { action: \"ignore\", nextIndex: cursor + 1 };\n }\n\n if (char === \"\\u001b\" && text[cursor + 1] === \"\\\\\") {\n return { action: \"ignore\", nextIndex: cursor + 2 };\n }\n\n cursor += 1;\n }\n\n return { action: \"ignore\", nextIndex: text.length, incomplete: true };\n }\n\n return {\n action: \"ignore\",\n nextIndex: Math.min(startIndex + 2, text.length),\n };\n}\n","/**\n * Remove internal WebVM control markers and setup command echoes from the\n * visible terminal output. These are implementation details, not user output.\n */\nexport function stripInternalVMNoise(text: string) {\n const withoutInternalCommandEcho = text.replace(\n /(?:^|\\n)[^\\n]*mkdir -p \\/home\\/user 2>&1; echo \"?__BCDONE_\\d+__\\$\\?\"?[^\\n]*(?:\\n|$)/g,\n \"\\n\",\n );\n\n const withoutMarkers = withoutInternalCommandEcho.replace(\n /(?:^|\\n)\\s*__BCDONE_\\d+__(?:\\d+|\\$\\?)?\\s*(?:\\n|$)/g,\n \"\\n\",\n );\n\n return withoutMarkers.replace(/^\\n+(?=\\S)/, \"\");\n}\n","import { consumeEscapeSequence } from \"./consume-escape-sequence.js\";\nimport { stripInternalVMNoise } from \"./strip-internal-vm-noise.js\";\n\n/**\n * Apply minimal terminal control character handling to the visible buffer.\n *\n * Returns the updated text and any trailing incomplete escape sequence to be\n * prepended to the next chunk (cross-chunk boundary handling).\n */\nexport function normalizeTerminalText(\n current: string,\n chunk: string,\n pendingEscape = \"\",\n options: { respectEraseSequences?: boolean },\n) {\n const respectEraseSequences = options?.respectEraseSequences ?? true;\n const input = pendingEscape + chunk;\n let next = current;\n\n for (let index = 0; index < input.length; index++) {\n const char = input[index];\n\n if (char === \"\\u001b\") {\n const escape = consumeEscapeSequence(input, index);\n\n if (escape.incomplete) {\n return { text: next, pending: input.slice(index) };\n }\n\n if (escape.action === \"clear-screen\" && respectEraseSequences) {\n next = \"\";\n }\n\n if (escape.action === \"clear-line\" && respectEraseSequences) {\n const lastLineBreak = next.lastIndexOf(\"\\n\");\n next = lastLineBreak === -1 ? \"\" : next.slice(0, lastLineBreak + 1);\n }\n\n index = escape.nextIndex - 1;\n\n continue;\n }\n\n if (char === \"\\r\") {\n const nextChar = input[index + 1];\n\n if (nextChar === \"\\n\") {\n // CRLF: skip the CR, let the LF be processed normally.\n\n continue;\n }\n\n if (nextChar !== undefined) {\n // Lone CR within the same chunk: cursor back to column 0,\n // overwriting the current line (e.g. shell prompt redraw).\n const lastLineBreak = next.lastIndexOf(\"\\n\");\n next = lastLineBreak === -1 ? \"\" : next.slice(0, lastLineBreak + 1);\n\n continue;\n }\n\n // CR at end of chunk — we can't tell yet whether it's CR or CRLF.\n // Defer it so the next chunk can resolve the ambiguity.\n\n return { text: next, pending: \"\\r\" };\n }\n\n if (char === \"\\b\" || char === \"\\u007f\") {\n next = next.slice(0, -1);\n\n continue;\n }\n\n if ((char < \" \" && char !== \"\\n\" && char !== \"\\t\") || char === \"\\u0007\") {\n continue;\n }\n\n next += char;\n }\n\n // Drop internal command protocol noise used by VM command execution.\n next = stripInternalVMNoise(next);\n\n return { text: next, pending: \"\" };\n}\n","import {\n closeTerminalSession,\n openTerminalSession,\n sendTerminalInput,\n} from \"../../core/orchestrator/utils/operations/vm.js\";\n\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport { VMStatusPayload } from \"../../subsystems/worker/types.js\";\n\nimport { extractLastPromptLine } from \"./utils/extract-last-prompt-line.js\";\nimport { isNearBottom } from \"./utils/is-near-bottom.js\";\nimport { normalizeTerminalText } from \"./utils/normalize-terminal-text.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawTerminalStyles from \"./shadow-claw-terminal.css\" with { type: \"css\" };\nimport shadowClawTerminalTemplate from \"./shadow-claw-terminal.html\" with { type: \"html\" };\n\nconst MAX_OUTPUT_LENGTH = 80_000;\n\nexport const AUTO_SCROLL_BOTTOM_THRESHOLD_PX = 12;\nexport class ShadowClawTerminal extends ShadowClawElement {\n static styles = shadowClawTerminalStyles;\n static template = shadowClawTerminalTemplate;\n\n autoScrollEnabled: boolean;\n bootRequested: boolean;\n connectedToWorkerTerminal: boolean;\n isApplyingAutoScroll: boolean;\n orchestrator: any | null;\n outputBuffer: string;\n pendingAutoScrollFrame: number | null;\n pendingEscape: string;\n screenResizeObserver: ResizeObserver | null;\n session: any | null;\n terminalAttachRequested: boolean;\n vmStatus: any;\n\n constructor() {\n super();\n\n this.session = null;\n this.outputBuffer = \"\";\n this.pendingEscape = \"\";\n this.bootRequested = false;\n this.orchestrator = orchestratorStore.orchestrator;\n this.vmStatus = {\n ready: false,\n booting: false,\n bootAttempted: false,\n error: null,\n };\n\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n this.autoScrollEnabled = true;\n this.isApplyingAutoScroll = false;\n this.pendingAutoScrollFrame = null;\n this.screenResizeObserver = null;\n }\n\n async connectedCallback() {\n await this.render();\n this.renderOutput();\n\n this.bindEventListeners();\n this.bindResizeObserver();\n\n this.connectOrchestrator();\n this.startTerminal();\n }\n\n disconnectedCallback() {\n if (this.pendingAutoScrollFrame !== null) {\n cancelAnimationFrame(this.pendingAutoScrollFrame);\n this.pendingAutoScrollFrame = null;\n }\n\n this.screenResizeObserver?.disconnect();\n this.screenResizeObserver = null;\n\n super.disconnectedCallback();\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n if (this.orchestrator) {\n closeTerminalSession(this.orchestrator, orchestratorStore.activeGroupId);\n }\n }\n\n appendOutput(chunk) {\n const result = normalizeTerminalText(\n this.outputBuffer,\n chunk,\n this.pendingEscape,\n {\n // During boot we prefer a stable transcript over VT100 erase semantics.\n // Some boot paths clear the screen repeatedly, which otherwise leaves the\n // visible panel blank even though boot text was received.\n respectEraseSequences: this.vmStatus.ready,\n },\n );\n this.outputBuffer = result.text;\n this.pendingEscape = result.pending;\n\n if (this.outputBuffer.length > MAX_OUTPUT_LENGTH) {\n this.outputBuffer = this.outputBuffer.slice(-MAX_OUTPUT_LENGTH);\n }\n\n this.renderOutput();\n }\n\n attachSession() {\n if (this.connectedToWorkerTerminal || this.terminalAttachRequested) {\n return;\n }\n\n // Fresh boot attach should start with a clean terminal viewport.\n if (!this.vmStatus.ready) {\n this.clearOutput();\n }\n\n if (!this.orchestrator) {\n console.warn(\n \"[ShadowClawTerminal] Cannot attach session: orchestrator not initialized.\",\n );\n\n return;\n }\n\n this.terminalAttachRequested = true;\n openTerminalSession(this.orchestrator, orchestratorStore.activeGroupId);\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-role=\"composer\"]')\n ?.addEventListener(\"submit\", (event) => {\n event.preventDefault();\n this.runCommand();\n });\n\n root\n .querySelector('[data-action=\"clear\"]')\n ?.addEventListener(\"click\", () => this.clearOutput());\n\n root\n .querySelector('[data-action=\"interrupt\"]')\n ?.addEventListener(\"click\", () => this.interrupt());\n\n root\n .querySelector('[data-role=\"screen\"]')\n ?.addEventListener(\"click\", () => {\n const input = this.getInput();\n input?.focus();\n });\n\n root\n .querySelector('[data-role=\"screen\"]')\n ?.addEventListener(\"scroll\", () => this.handleScreenScroll());\n }\n\n bindResizeObserver() {\n if (typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const screen = this.getScreen();\n if (!screen) {\n return;\n }\n\n this.screenResizeObserver = new ResizeObserver(() => {\n if (this.autoScrollEnabled) {\n this.scheduleAutoScroll();\n }\n });\n\n this.screenResizeObserver.observe(screen);\n }\n\n clearOutput() {\n const preservedPrompt =\n this.vmStatus.ready && this.connectedToWorkerTerminal\n ? extractLastPromptLine(this.outputBuffer)\n : \"\";\n\n this.outputBuffer = \"\";\n this.pendingEscape = \"\";\n this.autoScrollEnabled = true;\n\n if (preservedPrompt) {\n this.outputBuffer = preservedPrompt;\n }\n\n this.renderOutput();\n }\n\n connectOrchestrator() {\n if (!this.orchestrator) {\n return;\n }\n\n const statusListener = (status: VMStatusPayload) => {\n this.vmStatus = status;\n this.updateStatus(status);\n\n if (\n !status.error &&\n !this.connectedToWorkerTerminal &&\n !this.terminalAttachRequested\n ) {\n this.attachSession();\n }\n };\n\n const outputListener = ({ chunk }: { chunk: string }) => {\n this.appendOutput(chunk);\n };\n\n const openedListener = () => {\n this.connectedToWorkerTerminal = true;\n this.terminalAttachRequested = false;\n this.updateStatus(this.vmStatus);\n\n this.getInput()?.focus();\n };\n\n const closedListener = () => {\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n\n this.updateStatus(this.vmStatus);\n };\n\n const errorListener = ({ error }: { error: string }) => {\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n this.vmStatus = {\n ...this.vmStatus,\n error: typeof error === \"string\" ? error : \"WebVM terminal error\",\n };\n\n this.updateStatus(this.vmStatus);\n };\n\n this.orchestrator.events.on(\"vm-status\", statusListener);\n this.orchestrator.events.on(\"vm-terminal-output\", outputListener);\n this.orchestrator.events.on(\"vm-terminal-opened\", openedListener);\n this.orchestrator.events.on(\"vm-terminal-closed\", closedListener);\n this.orchestrator.events.on(\"vm-terminal-error\", errorListener);\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-status\", statusListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-output\", outputListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-opened\", openedListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-closed\", closedListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-error\", errorListener),\n );\n\n this.vmStatus = this.orchestrator.vmStatus || this.vmStatus;\n this.updateStatus(this.vmStatus);\n }\n\n getInput() {\n const input = this.shadowRoot?.querySelector('[data-role=\"input\"]');\n\n return input instanceof HTMLInputElement ? input : null;\n }\n\n getScreen() {\n const screen = this.shadowRoot?.querySelector('[data-role=\"screen\"]');\n\n return screen instanceof HTMLElement ? screen : null;\n }\n\n handleScreenScroll() {\n if (this.isApplyingAutoScroll) {\n return;\n }\n\n const screen = this.getScreen();\n if (!screen) {\n return;\n }\n\n this.autoScrollEnabled = isNearBottom(screen);\n }\n\n interrupt() {\n if (this.orchestrator) {\n sendTerminalInput(this.orchestrator, \"\\u0003\");\n }\n }\n\n renderOutput() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const output = root.querySelector('[data-role=\"output\"]');\n const screen = root.querySelector('[data-role=\"screen\"]');\n\n if (!(output instanceof HTMLElement) || !(screen instanceof HTMLElement)) {\n return;\n }\n\n output.textContent = this.outputBuffer;\n\n if (this.autoScrollEnabled) {\n this.scheduleAutoScroll();\n }\n }\n\n runCommand() {\n const input = this.getInput();\n if (!input || !this.connectedToWorkerTerminal) {\n return;\n }\n\n const command = input.value;\n\n if (!command.trim()) {\n return;\n }\n\n if (this.orchestrator) {\n sendTerminalInput(this.orchestrator, `${command}\\n`);\n }\n input.value = \"\";\n }\n\n scheduleAutoScroll() {\n if (this.pendingAutoScrollFrame !== null) {\n cancelAnimationFrame(this.pendingAutoScrollFrame);\n }\n\n this.pendingAutoScrollFrame = requestAnimationFrame(() => {\n this.pendingAutoScrollFrame = null;\n this.scrollScreenToBottom();\n });\n }\n\n scrollScreenToBottom() {\n const screen = this.getScreen();\n if (!screen) {\n return;\n }\n\n this.isApplyingAutoScroll = true;\n screen.scrollTop = screen.scrollHeight;\n this.isApplyingAutoScroll = false;\n this.autoScrollEnabled = isNearBottom(screen);\n }\n\n updateStatus(status: VMStatusPayload) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const statusEl = root.querySelector('[data-role=\"status\"]');\n const input = this.getInput();\n const runButton = root.querySelector('[data-action=\"run\"]');\n const interruptButton = root.querySelector('[data-action=\"interrupt\"]');\n\n if (\n !(statusEl instanceof HTMLElement) ||\n !(runButton instanceof HTMLButtonElement) ||\n !(interruptButton instanceof HTMLButtonElement)\n ) {\n return;\n }\n\n if (status.ready) {\n statusEl.dataset.state = \"ready\";\n statusEl.textContent = this.connectedToWorkerTerminal\n ? \"Connected to Alpine WebVM\"\n : \"WebVM ready. Connecting terminal...\";\n } else if (status.error) {\n statusEl.dataset.state = \"error\";\n statusEl.textContent = `WebVM unavailable: ${status.error}`;\n } else {\n statusEl.dataset.state = \"booting\";\n statusEl.textContent = status.booting\n ? \"Booting WebVM...\"\n : \"Waiting for WebVM...\";\n }\n\n if (input instanceof HTMLInputElement) {\n input.disabled = !(status.ready && this.connectedToWorkerTerminal);\n input.placeholder =\n status.ready && this.connectedToWorkerTerminal\n ? \"Type a shell command\"\n : status.ready\n ? \"Connecting to WebVM terminal...\"\n : status.error\n ? \"WebVM unavailable\"\n : \"Booting WebVM...\";\n }\n\n runButton.disabled = !(status.ready && this.connectedToWorkerTerminal);\n interruptButton.disabled = !(\n status.ready && this.connectedToWorkerTerminal\n );\n }\n\n async startTerminal() {\n const status = this.vmStatus;\n\n if (!this.orchestrator) {\n this.updateStatus({\n ready: false,\n booting: false,\n bootAttempted: false,\n error: \"Terminal bridge is unavailable.\",\n });\n\n return;\n }\n\n if (status.ready) {\n this.attachSession();\n\n return;\n }\n\n if (status.error) {\n this.updateStatus(status);\n\n return;\n }\n\n if (!this.bootRequested) {\n this.bootRequested = true;\n this.attachSession();\n }\n\n if (!this.isConnected || !this.connectedToWorkerTerminal) {\n this.updateStatus(this.vmStatus);\n\n return;\n }\n\n this.attachSession();\n }\n}\n\ncustomElements.define(\"shadow-claw-terminal\", ShadowClawTerminal);\n"],"mappings":"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"}
1
+ {"version":3,"file":"shadow-claw-terminal-fyJPppY_.js","names":["shadowClawTerminalStyles","shadowClawTerminalTemplate"],"sources":["../../src/components/shadow-claw-terminal/utils/extract-last-prompt-line.ts","../../src/components/shadow-claw-terminal/utils/is-near-bottom.ts","../../src/components/shadow-claw-terminal/utils/consume-escape-sequence.ts","../../src/components/shadow-claw-terminal/utils/strip-internal-vm-noise.ts","../../src/components/shadow-claw-terminal/utils/normalize-terminal-text.ts","../../src/components/shadow-claw-terminal/shadow-claw-terminal.ts"],"sourcesContent":["export function extractLastPromptLine(text: string): string {\n if (!text) {\n return \"\";\n }\n\n const lines = text.split(\"\\n\");\n for (let index = lines.length - 1; index >= 0; index -= 1) {\n const line = lines[index] || \"\";\n if (/[#$](?:\\s|$)/.test(line)) {\n return line;\n }\n }\n\n return \"\";\n}\n","import { AUTO_SCROLL_BOTTOM_THRESHOLD_PX } from \"../shadow-claw-terminal.js\";\n\nexport function isNearBottom(screen: HTMLElement): boolean {\n const distanceToBottom =\n screen.scrollHeight - (screen.scrollTop + screen.clientHeight);\n\n return distanceToBottom <= AUTO_SCROLL_BOTTOM_THRESHOLD_PX;\n}\n","export function consumeEscapeSequence(text: string, startIndex: number) {\n const nextChar = text[startIndex + 1];\n\n if (nextChar === undefined) {\n return { action: \"ignore\", nextIndex: startIndex + 1, incomplete: true };\n }\n\n if (nextChar === \"[\") {\n let cursor = startIndex + 2;\n\n while (cursor < text.length) {\n const code = text.charCodeAt(cursor);\n\n if (code >= 0x40 && code <= 0x7e) {\n const finalChar = text[cursor];\n\n if (finalChar === \"J\") {\n return { action: \"clear-screen\", nextIndex: cursor + 1 };\n }\n\n if (finalChar === \"K\") {\n return { action: \"clear-line\", nextIndex: cursor + 1 };\n }\n\n return { action: \"ignore\", nextIndex: cursor + 1 };\n }\n\n cursor += 1;\n }\n\n return { action: \"ignore\", nextIndex: text.length, incomplete: true };\n }\n\n if (nextChar === \"]\") {\n let cursor = startIndex + 2;\n\n while (cursor < text.length) {\n const char = text[cursor];\n\n if (char === \"\\u0007\") {\n return { action: \"ignore\", nextIndex: cursor + 1 };\n }\n\n if (char === \"\\u001b\" && text[cursor + 1] === \"\\\\\") {\n return { action: \"ignore\", nextIndex: cursor + 2 };\n }\n\n cursor += 1;\n }\n\n return { action: \"ignore\", nextIndex: text.length, incomplete: true };\n }\n\n return {\n action: \"ignore\",\n nextIndex: Math.min(startIndex + 2, text.length),\n };\n}\n","/**\n * Remove internal WebVM control markers and setup command echoes from the\n * visible terminal output. These are implementation details, not user output.\n */\nexport function stripInternalVMNoise(text: string) {\n const withoutInternalCommandEcho = text.replace(\n /(?:^|\\n)[^\\n]*mkdir -p \\/home\\/user 2>&1; echo \"?__BCDONE_\\d+__\\$\\?\"?[^\\n]*(?:\\n|$)/g,\n \"\\n\",\n );\n\n const withoutMarkers = withoutInternalCommandEcho.replace(\n /(?:^|\\n)\\s*__BCDONE_\\d+__(?:\\d+|\\$\\?)?\\s*(?:\\n|$)/g,\n \"\\n\",\n );\n\n return withoutMarkers.replace(/^\\n+(?=\\S)/, \"\");\n}\n","import { consumeEscapeSequence } from \"./consume-escape-sequence.js\";\nimport { stripInternalVMNoise } from \"./strip-internal-vm-noise.js\";\n\n/**\n * Apply minimal terminal control character handling to the visible buffer.\n *\n * Returns the updated text and any trailing incomplete escape sequence to be\n * prepended to the next chunk (cross-chunk boundary handling).\n */\nexport function normalizeTerminalText(\n current: string,\n chunk: string,\n pendingEscape = \"\",\n options: { respectEraseSequences?: boolean },\n) {\n const respectEraseSequences = options?.respectEraseSequences ?? true;\n const input = pendingEscape + chunk;\n let next = current;\n\n for (let index = 0; index < input.length; index++) {\n const char = input[index];\n\n if (char === \"\\u001b\") {\n const escape = consumeEscapeSequence(input, index);\n\n if (escape.incomplete) {\n return { text: next, pending: input.slice(index) };\n }\n\n if (escape.action === \"clear-screen\" && respectEraseSequences) {\n next = \"\";\n }\n\n if (escape.action === \"clear-line\" && respectEraseSequences) {\n const lastLineBreak = next.lastIndexOf(\"\\n\");\n next = lastLineBreak === -1 ? \"\" : next.slice(0, lastLineBreak + 1);\n }\n\n index = escape.nextIndex - 1;\n\n continue;\n }\n\n if (char === \"\\r\") {\n const nextChar = input[index + 1];\n\n if (nextChar === \"\\n\") {\n // CRLF: skip the CR, let the LF be processed normally.\n\n continue;\n }\n\n if (nextChar !== undefined) {\n // Lone CR within the same chunk: cursor back to column 0,\n // overwriting the current line (e.g. shell prompt redraw).\n const lastLineBreak = next.lastIndexOf(\"\\n\");\n next = lastLineBreak === -1 ? \"\" : next.slice(0, lastLineBreak + 1);\n\n continue;\n }\n\n // CR at end of chunk — we can't tell yet whether it's CR or CRLF.\n // Defer it so the next chunk can resolve the ambiguity.\n\n return { text: next, pending: \"\\r\" };\n }\n\n if (char === \"\\b\" || char === \"\\u007f\") {\n next = next.slice(0, -1);\n\n continue;\n }\n\n if ((char < \" \" && char !== \"\\n\" && char !== \"\\t\") || char === \"\\u0007\") {\n continue;\n }\n\n next += char;\n }\n\n // Drop internal command protocol noise used by VM command execution.\n next = stripInternalVMNoise(next);\n\n return { text: next, pending: \"\" };\n}\n","import {\n closeTerminalSession,\n openTerminalSession,\n sendTerminalInput,\n} from \"../../core/orchestrator/utils/operations/vm.js\";\n\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport { VMStatusPayload } from \"../../subsystems/worker/types.js\";\n\nimport { extractLastPromptLine } from \"./utils/extract-last-prompt-line.js\";\nimport { isNearBottom } from \"./utils/is-near-bottom.js\";\nimport { normalizeTerminalText } from \"./utils/normalize-terminal-text.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawTerminalStyles from \"./shadow-claw-terminal.css\" with { type: \"css\" };\nimport shadowClawTerminalTemplate from \"./shadow-claw-terminal.html\" with { type: \"html\" };\n\nconst MAX_OUTPUT_LENGTH = 80_000;\n\nexport const AUTO_SCROLL_BOTTOM_THRESHOLD_PX = 12;\nexport class ShadowClawTerminal extends ShadowClawElement {\n static styles = shadowClawTerminalStyles;\n static template = shadowClawTerminalTemplate;\n\n autoScrollEnabled: boolean;\n bootRequested: boolean;\n connectedToWorkerTerminal: boolean;\n isApplyingAutoScroll: boolean;\n orchestrator: any | null;\n outputBuffer: string;\n pendingAutoScrollFrame: number | null;\n pendingEscape: string;\n screenResizeObserver: ResizeObserver | null;\n session: any | null;\n terminalAttachRequested: boolean;\n vmStatus: any;\n\n constructor() {\n super();\n\n this.session = null;\n this.outputBuffer = \"\";\n this.pendingEscape = \"\";\n this.bootRequested = false;\n this.orchestrator = orchestratorStore.orchestrator;\n this.vmStatus = {\n ready: false,\n booting: false,\n bootAttempted: false,\n error: null,\n };\n\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n this.autoScrollEnabled = true;\n this.isApplyingAutoScroll = false;\n this.pendingAutoScrollFrame = null;\n this.screenResizeObserver = null;\n }\n\n async connectedCallback() {\n await this.render();\n this.renderOutput();\n\n this.bindEventListeners();\n this.bindResizeObserver();\n\n this.connectOrchestrator();\n this.startTerminal();\n }\n\n disconnectedCallback() {\n if (this.pendingAutoScrollFrame !== null) {\n cancelAnimationFrame(this.pendingAutoScrollFrame);\n this.pendingAutoScrollFrame = null;\n }\n\n this.screenResizeObserver?.disconnect();\n this.screenResizeObserver = null;\n\n super.disconnectedCallback();\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n if (this.orchestrator) {\n closeTerminalSession(this.orchestrator, orchestratorStore.activeGroupId);\n }\n }\n\n appendOutput(chunk) {\n const result = normalizeTerminalText(\n this.outputBuffer,\n chunk,\n this.pendingEscape,\n {\n // During boot we prefer a stable transcript over VT100 erase semantics.\n // Some boot paths clear the screen repeatedly, which otherwise leaves the\n // visible panel blank even though boot text was received.\n respectEraseSequences: this.vmStatus.ready,\n },\n );\n this.outputBuffer = result.text;\n this.pendingEscape = result.pending;\n\n if (this.outputBuffer.length > MAX_OUTPUT_LENGTH) {\n this.outputBuffer = this.outputBuffer.slice(-MAX_OUTPUT_LENGTH);\n }\n\n this.renderOutput();\n }\n\n attachSession() {\n if (this.connectedToWorkerTerminal || this.terminalAttachRequested) {\n return;\n }\n\n // Fresh boot attach should start with a clean terminal viewport.\n if (!this.vmStatus.ready) {\n this.clearOutput();\n }\n\n if (!this.orchestrator) {\n console.warn(\n \"[ShadowClawTerminal] Cannot attach session: orchestrator not initialized.\",\n );\n\n return;\n }\n\n this.terminalAttachRequested = true;\n openTerminalSession(this.orchestrator, orchestratorStore.activeGroupId);\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-role=\"composer\"]')\n ?.addEventListener(\"submit\", (event) => {\n event.preventDefault();\n this.runCommand();\n });\n\n root\n .querySelector('[data-action=\"clear\"]')\n ?.addEventListener(\"click\", () => this.clearOutput());\n\n root\n .querySelector('[data-action=\"interrupt\"]')\n ?.addEventListener(\"click\", () => this.interrupt());\n\n root\n .querySelector('[data-role=\"screen\"]')\n ?.addEventListener(\"click\", () => {\n const input = this.getInput();\n input?.focus();\n });\n\n root\n .querySelector('[data-role=\"screen\"]')\n ?.addEventListener(\"scroll\", () => this.handleScreenScroll());\n }\n\n bindResizeObserver() {\n if (typeof ResizeObserver === \"undefined\") {\n return;\n }\n\n const screen = this.getScreen();\n if (!screen) {\n return;\n }\n\n this.screenResizeObserver = new ResizeObserver(() => {\n if (this.autoScrollEnabled) {\n this.scheduleAutoScroll();\n }\n });\n\n this.screenResizeObserver.observe(screen);\n }\n\n clearOutput() {\n const preservedPrompt =\n this.vmStatus.ready && this.connectedToWorkerTerminal\n ? extractLastPromptLine(this.outputBuffer)\n : \"\";\n\n this.outputBuffer = \"\";\n this.pendingEscape = \"\";\n this.autoScrollEnabled = true;\n\n if (preservedPrompt) {\n this.outputBuffer = preservedPrompt;\n }\n\n this.renderOutput();\n }\n\n connectOrchestrator() {\n if (!this.orchestrator) {\n return;\n }\n\n const statusListener = (status: VMStatusPayload) => {\n this.vmStatus = status;\n this.updateStatus(status);\n\n if (\n !status.error &&\n !this.connectedToWorkerTerminal &&\n !this.terminalAttachRequested\n ) {\n this.attachSession();\n }\n };\n\n const outputListener = ({ chunk }: { chunk: string }) => {\n this.appendOutput(chunk);\n };\n\n const openedListener = () => {\n this.connectedToWorkerTerminal = true;\n this.terminalAttachRequested = false;\n this.updateStatus(this.vmStatus);\n\n this.getInput()?.focus();\n };\n\n const closedListener = () => {\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n\n this.updateStatus(this.vmStatus);\n };\n\n const errorListener = ({ error }: { error: string }) => {\n this.connectedToWorkerTerminal = false;\n this.terminalAttachRequested = false;\n this.vmStatus = {\n ...this.vmStatus,\n error: typeof error === \"string\" ? error : \"WebVM terminal error\",\n };\n\n this.updateStatus(this.vmStatus);\n };\n\n this.orchestrator.events.on(\"vm-status\", statusListener);\n this.orchestrator.events.on(\"vm-terminal-output\", outputListener);\n this.orchestrator.events.on(\"vm-terminal-opened\", openedListener);\n this.orchestrator.events.on(\"vm-terminal-closed\", closedListener);\n this.orchestrator.events.on(\"vm-terminal-error\", errorListener);\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-status\", statusListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-output\", outputListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-opened\", openedListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-closed\", closedListener),\n );\n\n this.addCleanup(() =>\n this.orchestrator?.events?.off?.(\"vm-terminal-error\", errorListener),\n );\n\n this.vmStatus = this.orchestrator.vmStatus || this.vmStatus;\n this.updateStatus(this.vmStatus);\n }\n\n getInput() {\n const input = this.shadowRoot?.querySelector('[data-role=\"input\"]');\n\n return input instanceof HTMLInputElement ? input : null;\n }\n\n getScreen() {\n const screen = this.shadowRoot?.querySelector('[data-role=\"screen\"]');\n\n return screen instanceof HTMLElement ? screen : null;\n }\n\n handleScreenScroll() {\n if (this.isApplyingAutoScroll) {\n return;\n }\n\n const screen = this.getScreen();\n if (!screen) {\n return;\n }\n\n this.autoScrollEnabled = isNearBottom(screen);\n }\n\n interrupt() {\n if (this.orchestrator) {\n sendTerminalInput(this.orchestrator, \"\\u0003\");\n }\n }\n\n renderOutput() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const output = root.querySelector('[data-role=\"output\"]');\n const screen = root.querySelector('[data-role=\"screen\"]');\n\n if (!(output instanceof HTMLElement) || !(screen instanceof HTMLElement)) {\n return;\n }\n\n output.textContent = this.outputBuffer;\n\n if (this.autoScrollEnabled) {\n this.scheduleAutoScroll();\n }\n }\n\n runCommand() {\n const input = this.getInput();\n if (!input || !this.connectedToWorkerTerminal) {\n return;\n }\n\n const command = input.value;\n\n if (!command.trim()) {\n return;\n }\n\n if (this.orchestrator) {\n sendTerminalInput(this.orchestrator, `${command}\\n`);\n }\n input.value = \"\";\n }\n\n scheduleAutoScroll() {\n if (this.pendingAutoScrollFrame !== null) {\n cancelAnimationFrame(this.pendingAutoScrollFrame);\n }\n\n this.pendingAutoScrollFrame = requestAnimationFrame(() => {\n this.pendingAutoScrollFrame = null;\n this.scrollScreenToBottom();\n });\n }\n\n scrollScreenToBottom() {\n const screen = this.getScreen();\n if (!screen) {\n return;\n }\n\n this.isApplyingAutoScroll = true;\n screen.scrollTop = screen.scrollHeight;\n this.isApplyingAutoScroll = false;\n this.autoScrollEnabled = isNearBottom(screen);\n }\n\n updateStatus(status: VMStatusPayload) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const statusEl = root.querySelector('[data-role=\"status\"]');\n const input = this.getInput();\n const runButton = root.querySelector('[data-action=\"run\"]');\n const interruptButton = root.querySelector('[data-action=\"interrupt\"]');\n\n if (\n !(statusEl instanceof HTMLElement) ||\n !(runButton instanceof HTMLButtonElement) ||\n !(interruptButton instanceof HTMLButtonElement)\n ) {\n return;\n }\n\n if (status.ready) {\n statusEl.dataset.state = \"ready\";\n statusEl.textContent = this.connectedToWorkerTerminal\n ? \"Connected to Alpine WebVM\"\n : \"WebVM ready. Connecting terminal...\";\n } else if (status.error) {\n statusEl.dataset.state = \"error\";\n statusEl.textContent = `WebVM unavailable: ${status.error}`;\n } else {\n statusEl.dataset.state = \"booting\";\n statusEl.textContent = status.booting\n ? \"Booting WebVM...\"\n : \"Waiting for WebVM...\";\n }\n\n if (input instanceof HTMLInputElement) {\n input.disabled = !(status.ready && this.connectedToWorkerTerminal);\n input.placeholder =\n status.ready && this.connectedToWorkerTerminal\n ? \"Type a shell command\"\n : status.ready\n ? \"Connecting to WebVM terminal...\"\n : status.error\n ? \"WebVM unavailable\"\n : \"Booting WebVM...\";\n }\n\n runButton.disabled = !(status.ready && this.connectedToWorkerTerminal);\n interruptButton.disabled = !(\n status.ready && this.connectedToWorkerTerminal\n );\n }\n\n async startTerminal() {\n const status = this.vmStatus;\n\n if (!this.orchestrator) {\n this.updateStatus({\n ready: false,\n booting: false,\n bootAttempted: false,\n error: \"Terminal bridge is unavailable.\",\n });\n\n return;\n }\n\n if (status.ready) {\n this.attachSession();\n\n return;\n }\n\n if (status.error) {\n this.updateStatus(status);\n\n return;\n }\n\n if (!this.bootRequested) {\n this.bootRequested = true;\n this.attachSession();\n }\n\n if (!this.isConnected || !this.connectedToWorkerTerminal) {\n this.updateStatus(this.vmStatus);\n\n return;\n }\n\n this.attachSession();\n }\n}\n\ncustomElements.define(\"shadow-claw-terminal\", ShadowClawTerminal);\n"],"mappings":";;;;AAAA,SAAgB,sBAAsB,MAAsB;CAC1D,IAAI,CAAC,MACH,OAAO;CAGT,MAAM,QAAQ,KAAK,MAAM,IAAI;CAC7B,KAAK,IAAI,QAAQ,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG;EACzD,MAAM,OAAO,MAAM,UAAU;EAC7B,IAAI,eAAe,KAAK,IAAI,GAC1B,OAAO;CAEX;CAEA,OAAO;AACT;;;;ACZA,SAAgB,aAAa,QAA8B;CAIzD,OAFE,OAAO,gBAAgB,OAAO,YAAY,OAAO;AAGrD;;;;ACPA,SAAgB,sBAAsB,MAAc,YAAoB;CACtE,MAAM,WAAW,KAAK,aAAa;CAEnC,IAAI,aAAa,QACf,OAAO;EAAE,QAAQ;EAAU,WAAW,aAAa;EAAG,YAAY;CAAK;CAGzE,IAAI,aAAa,KAAK;EACpB,IAAI,SAAS,aAAa;EAE1B,OAAO,SAAS,KAAK,QAAQ;GAC3B,MAAM,OAAO,KAAK,WAAW,MAAM;GAEnC,IAAI,QAAQ,MAAQ,QAAQ,KAAM;IAChC,MAAM,YAAY,KAAK;IAEvB,IAAI,cAAc,KAChB,OAAO;KAAE,QAAQ;KAAgB,WAAW,SAAS;IAAE;IAGzD,IAAI,cAAc,KAChB,OAAO;KAAE,QAAQ;KAAc,WAAW,SAAS;IAAE;IAGvD,OAAO;KAAE,QAAQ;KAAU,WAAW,SAAS;IAAE;GACnD;GAEA,UAAU;EACZ;EAEA,OAAO;GAAE,QAAQ;GAAU,WAAW,KAAK;GAAQ,YAAY;EAAK;CACtE;CAEA,IAAI,aAAa,KAAK;EACpB,IAAI,SAAS,aAAa;EAE1B,OAAO,SAAS,KAAK,QAAQ;GAC3B,MAAM,OAAO,KAAK;GAElB,IAAI,SAAS,QACX,OAAO;IAAE,QAAQ;IAAU,WAAW,SAAS;GAAE;GAGnD,IAAI,SAAS,UAAY,KAAK,SAAS,OAAO,MAC5C,OAAO;IAAE,QAAQ;IAAU,WAAW,SAAS;GAAE;GAGnD,UAAU;EACZ;EAEA,OAAO;GAAE,QAAQ;GAAU,WAAW,KAAK;GAAQ,YAAY;EAAK;CACtE;CAEA,OAAO;EACL,QAAQ;EACR,WAAW,KAAK,IAAI,aAAa,GAAG,KAAK,MAAM;CACjD;AACF;;;;;;;;ACrDA,SAAgB,qBAAqB,MAAc;CAWjD,OAVmC,KAAK,QACtC,wFACA,IAG8C,CAAC,CAAC,QAChD,sDACA,IAGkB,CAAC,CAAC,QAAQ,cAAc,EAAE;AAChD;;;;;;;;;;ACPA,SAAgB,sBACd,SACA,OACA,gBAAgB,IAChB,SACA;CACA,MAAM,wBAAwB,SAAS,yBAAyB;CAChE,MAAM,QAAQ,gBAAgB;CAC9B,IAAI,OAAO;CAEX,KAAK,IAAI,QAAQ,GAAG,QAAQ,MAAM,QAAQ,SAAS;EACjD,MAAM,OAAO,MAAM;EAEnB,IAAI,SAAS,QAAU;GACrB,MAAM,SAAS,sBAAsB,OAAO,KAAK;GAEjD,IAAI,OAAO,YACT,OAAO;IAAE,MAAM;IAAM,SAAS,MAAM,MAAM,KAAK;GAAE;GAGnD,IAAI,OAAO,WAAW,kBAAkB,uBACtC,OAAO;GAGT,IAAI,OAAO,WAAW,gBAAgB,uBAAuB;IAC3D,MAAM,gBAAgB,KAAK,YAAY,IAAI;IAC3C,OAAO,kBAAkB,KAAK,KAAK,KAAK,MAAM,GAAG,gBAAgB,CAAC;GACpE;GAEA,QAAQ,OAAO,YAAY;GAE3B;EACF;EAEA,IAAI,SAAS,MAAM;GACjB,MAAM,WAAW,MAAM,QAAQ;GAE/B,IAAI,aAAa,MAGf;GAGF,IAAI,aAAa,QAAW;IAG1B,MAAM,gBAAgB,KAAK,YAAY,IAAI;IAC3C,OAAO,kBAAkB,KAAK,KAAK,KAAK,MAAM,GAAG,gBAAgB,CAAC;IAElE;GACF;GAKA,OAAO;IAAE,MAAM;IAAM,SAAS;GAAK;EACrC;EAEA,IAAI,SAAS,QAAQ,SAAS,KAAU;GACtC,OAAO,KAAK,MAAM,GAAG,EAAE;GAEvB;EACF;EAEA,IAAK,OAAO,OAAO,SAAS,QAAQ,SAAS,OAAS,SAAS,QAC7D;EAGF,QAAQ;CACV;CAGA,OAAO,qBAAqB,IAAI;CAEhC,OAAO;EAAE,MAAM;EAAM,SAAS;CAAG;AACnC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnEA,MAAM,oBAAoB;AAE1B,MAAa,kCAAkC;AAC/C,IAAa,qBAAb,cAAwC,kBAAkB;CACxD,OAAO,SAASA;CAChB,OAAO,WAAWC;CAElB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAEA,cAAc;EACZ,MAAM;EAEN,KAAK,UAAU;EACf,KAAK,eAAe;EACpB,KAAK,gBAAgB;EACrB,KAAK,gBAAgB;EACrB,KAAK,eAAe,kBAAkB;EACtC,KAAK,WAAW;GACd,OAAO;GACP,SAAS;GACT,eAAe;GACf,OAAO;EACT;EAEA,KAAK,4BAA4B;EACjC,KAAK,0BAA0B;EAC/B,KAAK,oBAAoB;EACzB,KAAK,uBAAuB;EAC5B,KAAK,yBAAyB;EAC9B,KAAK,uBAAuB;CAC9B;CAEA,MAAM,oBAAoB;EACxB,MAAM,KAAK,OAAO;EAClB,KAAK,aAAa;EAElB,KAAK,mBAAmB;EACxB,KAAK,mBAAmB;EAExB,KAAK,oBAAoB;EACzB,KAAK,cAAc;CACrB;CAEA,uBAAuB;EACrB,IAAI,KAAK,2BAA2B,MAAM;GACxC,qBAAqB,KAAK,sBAAsB;GAChD,KAAK,yBAAyB;EAChC;EAEA,KAAK,sBAAsB,WAAW;EACtC,KAAK,uBAAuB;EAE5B,MAAM,qBAAqB;EAC3B,KAAK,4BAA4B;EACjC,KAAK,0BAA0B;EAC/B,IAAI,KAAK,cACP,qBAAqB,KAAK,cAAc,kBAAkB,aAAa;CAE3E;CAEA,aAAa,OAAO;EAClB,MAAM,SAAS,sBACb,KAAK,cACL,OACA,KAAK,eACL,EAIE,uBAAuB,KAAK,SAAS,MACvC,CACF;EACA,KAAK,eAAe,OAAO;EAC3B,KAAK,gBAAgB,OAAO;EAE5B,IAAI,KAAK,aAAa,SAAS,mBAC7B,KAAK,eAAe,KAAK,aAAa,MAAM,IAAkB;EAGhE,KAAK,aAAa;CACpB;CAEA,gBAAgB;EACd,IAAI,KAAK,6BAA6B,KAAK,yBACzC;EAIF,IAAI,CAAC,KAAK,SAAS,OACjB,KAAK,YAAY;EAGnB,IAAI,CAAC,KAAK,cAAc;GACtB,QAAQ,KACN,2EACF;GAEA;EACF;EAEA,KAAK,0BAA0B;EAC/B,oBAAoB,KAAK,cAAc,kBAAkB,aAAa;CACxE;CAEA,qBAAqB;EACnB,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,KACG,cAAc,0BAAwB,CAAC,EACtC,iBAAiB,WAAW,UAAU;GACtC,MAAM,eAAe;GACrB,KAAK,WAAW;EAClB,CAAC;EAEH,KACG,cAAc,yBAAuB,CAAC,EACrC,iBAAiB,eAAe,KAAK,YAAY,CAAC;EAEtD,KACG,cAAc,6BAA2B,CAAC,EACzC,iBAAiB,eAAe,KAAK,UAAU,CAAC;EAEpD,KACG,cAAc,wBAAsB,CAAC,EACpC,iBAAiB,eAAe;GAEhC,AADc,KAAK,SACf,CAAC,EAAE,MAAM;EACf,CAAC;EAEH,KACG,cAAc,wBAAsB,CAAC,EACpC,iBAAiB,gBAAgB,KAAK,mBAAmB,CAAC;CAChE;CAEA,qBAAqB;EACnB,IAAI,OAAO,mBAAmB,aAC5B;EAGF,MAAM,SAAS,KAAK,UAAU;EAC9B,IAAI,CAAC,QACH;EAGF,KAAK,uBAAuB,IAAI,qBAAqB;GACnD,IAAI,KAAK,mBACP,KAAK,mBAAmB;EAE5B,CAAC;EAED,KAAK,qBAAqB,QAAQ,MAAM;CAC1C;CAEA,cAAc;EACZ,MAAM,kBACJ,KAAK,SAAS,SAAS,KAAK,4BACxB,sBAAsB,KAAK,YAAY,IACvC;EAEN,KAAK,eAAe;EACpB,KAAK,gBAAgB;EACrB,KAAK,oBAAoB;EAEzB,IAAI,iBACF,KAAK,eAAe;EAGtB,KAAK,aAAa;CACpB;CAEA,sBAAsB;EACpB,IAAI,CAAC,KAAK,cACR;EAGF,MAAM,kBAAkB,WAA4B;GAClD,KAAK,WAAW;GAChB,KAAK,aAAa,MAAM;GAExB,IACE,CAAC,OAAO,SACR,CAAC,KAAK,6BACN,CAAC,KAAK,yBAEN,KAAK,cAAc;EAEvB;EAEA,MAAM,kBAAkB,EAAE,YAA+B;GACvD,KAAK,aAAa,KAAK;EACzB;EAEA,MAAM,uBAAuB;GAC3B,KAAK,4BAA4B;GACjC,KAAK,0BAA0B;GAC/B,KAAK,aAAa,KAAK,QAAQ;GAE/B,KAAK,SAAS,CAAC,EAAE,MAAM;EACzB;EAEA,MAAM,uBAAuB;GAC3B,KAAK,4BAA4B;GACjC,KAAK,0BAA0B;GAE/B,KAAK,aAAa,KAAK,QAAQ;EACjC;EAEA,MAAM,iBAAiB,EAAE,YAA+B;GACtD,KAAK,4BAA4B;GACjC,KAAK,0BAA0B;GAC/B,KAAK,WAAW;IACd,GAAG,KAAK;IACR,OAAO,OAAO,UAAU,WAAW,QAAQ;GAC7C;GAEA,KAAK,aAAa,KAAK,QAAQ;EACjC;EAEA,KAAK,aAAa,OAAO,GAAG,aAAa,cAAc;EACvD,KAAK,aAAa,OAAO,GAAG,sBAAsB,cAAc;EAChE,KAAK,aAAa,OAAO,GAAG,sBAAsB,cAAc;EAChE,KAAK,aAAa,OAAO,GAAG,sBAAsB,cAAc;EAChE,KAAK,aAAa,OAAO,GAAG,qBAAqB,aAAa;EAE9D,KAAK,iBACH,KAAK,cAAc,QAAQ,MAAM,aAAa,cAAc,CAC9D;EAEA,KAAK,iBACH,KAAK,cAAc,QAAQ,MAAM,sBAAsB,cAAc,CACvE;EAEA,KAAK,iBACH,KAAK,cAAc,QAAQ,MAAM,sBAAsB,cAAc,CACvE;EAEA,KAAK,iBACH,KAAK,cAAc,QAAQ,MAAM,sBAAsB,cAAc,CACvE;EAEA,KAAK,iBACH,KAAK,cAAc,QAAQ,MAAM,qBAAqB,aAAa,CACrE;EAEA,KAAK,WAAW,KAAK,aAAa,YAAY,KAAK;EACnD,KAAK,aAAa,KAAK,QAAQ;CACjC;CAEA,WAAW;EACT,MAAM,QAAQ,KAAK,YAAY,cAAc,uBAAqB;EAElE,OAAO,iBAAiB,mBAAmB,QAAQ;CACrD;CAEA,YAAY;EACV,MAAM,SAAS,KAAK,YAAY,cAAc,wBAAsB;EAEpE,OAAO,kBAAkB,cAAc,SAAS;CAClD;CAEA,qBAAqB;EACnB,IAAI,KAAK,sBACP;EAGF,MAAM,SAAS,KAAK,UAAU;EAC9B,IAAI,CAAC,QACH;EAGF,KAAK,oBAAoB,aAAa,MAAM;CAC9C;CAEA,YAAY;EACV,IAAI,KAAK,cACP,kBAAkB,KAAK,cAAc,GAAQ;CAEjD;CAEA,eAAe;EACb,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,SAAS,KAAK,cAAc,wBAAsB;EACxD,MAAM,SAAS,KAAK,cAAc,wBAAsB;EAExD,IAAI,EAAE,kBAAkB,gBAAgB,EAAE,kBAAkB,cAC1D;EAGF,OAAO,cAAc,KAAK;EAE1B,IAAI,KAAK,mBACP,KAAK,mBAAmB;CAE5B;CAEA,aAAa;EACX,MAAM,QAAQ,KAAK,SAAS;EAC5B,IAAI,CAAC,SAAS,CAAC,KAAK,2BAClB;EAGF,MAAM,UAAU,MAAM;EAEtB,IAAI,CAAC,QAAQ,KAAK,GAChB;EAGF,IAAI,KAAK,cACP,kBAAkB,KAAK,cAAc,GAAG,QAAQ,GAAG;EAErD,MAAM,QAAQ;CAChB;CAEA,qBAAqB;EACnB,IAAI,KAAK,2BAA2B,MAClC,qBAAqB,KAAK,sBAAsB;EAGlD,KAAK,yBAAyB,4BAA4B;GACxD,KAAK,yBAAyB;GAC9B,KAAK,qBAAqB;EAC5B,CAAC;CACH;CAEA,uBAAuB;EACrB,MAAM,SAAS,KAAK,UAAU;EAC9B,IAAI,CAAC,QACH;EAGF,KAAK,uBAAuB;EAC5B,OAAO,YAAY,OAAO;EAC1B,KAAK,uBAAuB;EAC5B,KAAK,oBAAoB,aAAa,MAAM;CAC9C;CAEA,aAAa,QAAyB;EACpC,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,WAAW,KAAK,cAAc,wBAAsB;EAC1D,MAAM,QAAQ,KAAK,SAAS;EAC5B,MAAM,YAAY,KAAK,cAAc,uBAAqB;EAC1D,MAAM,kBAAkB,KAAK,cAAc,6BAA2B;EAEtE,IACE,EAAE,oBAAoB,gBACtB,EAAE,qBAAqB,sBACvB,EAAE,2BAA2B,oBAE7B;EAGF,IAAI,OAAO,OAAO;GAChB,SAAS,QAAQ,QAAQ;GACzB,SAAS,cAAc,KAAK,4BACxB,8BACA;EACN,OAAO,IAAI,OAAO,OAAO;GACvB,SAAS,QAAQ,QAAQ;GACzB,SAAS,cAAc,sBAAsB,OAAO;EACtD,OAAO;GACL,SAAS,QAAQ,QAAQ;GACzB,SAAS,cAAc,OAAO,UAC1B,qBACA;EACN;EAEA,IAAI,iBAAiB,kBAAkB;GACrC,MAAM,WAAW,EAAE,OAAO,SAAS,KAAK;GACxC,MAAM,cACJ,OAAO,SAAS,KAAK,4BACjB,yBACA,OAAO,QACL,oCACA,OAAO,QACL,sBACA;EACZ;EAEA,UAAU,WAAW,EAAE,OAAO,SAAS,KAAK;EAC5C,gBAAgB,WAAW,EACzB,OAAO,SAAS,KAAK;CAEzB;CAEA,MAAM,gBAAgB;EACpB,MAAM,SAAS,KAAK;EAEpB,IAAI,CAAC,KAAK,cAAc;GACtB,KAAK,aAAa;IAChB,OAAO;IACP,SAAS;IACT,eAAe;IACf,OAAO;GACT,CAAC;GAED;EACF;EAEA,IAAI,OAAO,OAAO;GAChB,KAAK,cAAc;GAEnB;EACF;EAEA,IAAI,OAAO,OAAO;GAChB,KAAK,aAAa,MAAM;GAExB;EACF;EAEA,IAAI,CAAC,KAAK,eAAe;GACvB,KAAK,gBAAgB;GACrB,KAAK,cAAc;EACrB;EAEA,IAAI,CAAC,KAAK,eAAe,CAAC,KAAK,2BAA2B;GACxD,KAAK,aAAa,KAAK,QAAQ;GAE/B;EACF;EAEA,KAAK,cAAc;CACrB;AACF;AAEA,eAAe,OAAO,wBAAwB,kBAAkB"}
@@ -1,17 +1,17 @@
1
1
  import ShadowClawElement from "./components/shadow-claw-element.js";
2
2
  import { o as getDb } from "./get-config-BWhs5HFF.js";
3
- import { A as getAvailableProviders, F as getProvider } from "./config-DxNI3TlW.js";
4
- import { t as toolsStore } from "./tools-Beuyh8y1.js";
5
- import { t as orchestratorStore } from "./orchestrator-i_QJ-o22.js";
3
+ import { A as getAvailableProviders, F as getProvider } from "./config-BrHR97zt.js";
4
+ import { t as toolsStore } from "./tools-B8OJ4sMF.js";
5
+ import { t as orchestratorStore } from "./orchestrator-CCARkxQC.js";
6
6
  import { ulid } from "./utils/ulid.js";
7
7
  import { a as showSuccess, i as showInfo, r as showError } from "./toast-Ck7OIKDf.js";
8
8
  import { t as TOOL_DEFINITIONS } from "./tools-tRG7Gu0x.js";
9
9
  import { t as effect } from "./effect-DL6j9HJp.js";
10
10
  import "./shadow-claw-page-header-action-button-BXXm5b5N.js";
11
11
  import "./components/shadow-claw-dialog.js";
12
- import "./shadow-claw-page-header-DMGO-TSe.js";
13
- import { t as getWebMcpMode } from "./webmcp-DCfAFiIO.js";
14
- import { n as setWebMcpToolsEnabled, t as setWebMcpMode } from "./sync-web-mcp-registration-D4hdUwtv.js";
12
+ import "./shadow-claw-page-header-C_Qr3xZM.js";
13
+ import { t as getWebMcpMode } from "./webmcp-BoMTvgmX.js";
14
+ import { n as setWebMcpToolsEnabled, t as setWebMcpMode } from "./sync-web-mcp-registration-BFtG_4kx.js";
15
15
 
16
16
  //#region src/components/shadow-claw-tools/shadow-claw-tools.css
17
17
  const sheet = new CSSStyleSheet();
@@ -2143,4 +2143,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
2143
2143
 
2144
2144
  //#endregion
2145
2145
  export { ShadowClawTools as t };
2146
- //# sourceMappingURL=shadow-claw-tools-COdrGZJk.js.map
2146
+ //# sourceMappingURL=shadow-claw-tools-D0T8m3go.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-claw-tools-COdrGZJk.js","names":["shadowClawToolsStyles","shadowClawToolsTemplate"],"sources":["../../src/components/shadow-claw-tools/shadow-claw-tools.ts"],"sourcesContent":["import { getAvailableProviders, getProvider } from \"../../config/config.js\";\nimport { effect } from \"../../core/effect.js\";\n\nimport { getDb, ShadowClawDatabase } from \"../../db/db.js\";\nimport { getWebMcpMode } from \"../../subsystems/mcp/webmcp.js\";\n\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport { toolsStore } from \"../../stores/tools.js\";\n\nimport { TOOL_DEFINITIONS } from \"../../subsystems/tools/tools.js\";\nimport { showError, showInfo, showSuccess } from \"../../ui/toast.js\";\nimport { ulid } from \"../../utils/ulid.js\";\n\nimport type { Orchestrator } from \"../../core/orchestrator/orchestrator.js\";\nimport type { RemoteManifest } from \"../../subsystems/tools/remote/types.js\";\nimport {\n setWebMcpMode,\n setWebMcpToolsEnabled,\n} from \"../../core/orchestrator/utils/sync-web-mcp-registration.js\";\n\nimport \"../common/shadow-claw-page-header-action-button/shadow-claw-page-header-action-button.js\";\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\nimport \"../shadow-claw-page-header/shadow-claw-page-header.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawToolsStyles from \"./shadow-claw-tools.css\" with { type: \"css\" };\nimport shadowClawToolsTemplate from \"./shadow-claw-tools.html\" with { type: \"html\" };\n\nconst BUILTIN_TOOL_NAMES = new Set(TOOL_DEFINITIONS.map((t) => t.name));\n\nconst elementName = \"shadow-claw-tools\";\nexport class ShadowClawTools extends ShadowClawElement {\n static styles = shadowClawToolsStyles;\n static template = shadowClawToolsTemplate;\n currentRemoteManifest: RemoteManifest | null = null;\n\n orchestrator: Orchestrator | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n\n await toolsStore.refreshDeclarativeTools(db);\n this.setupEffects(db);\n this.bindEventListeners(db);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n }\n\n bindEventListeners(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n // Back button\n root.querySelector(\".tools__back-btn\")?.addEventListener(\"click\", () => {\n this.dispatchEvent(\n new CustomEvent(\"navigate-back\", { bubbles: true, composed: true }),\n );\n });\n\n // Add tool button\n root.querySelector(\".tools__add-btn\")?.addEventListener(\"click\", () => {\n const dialog = root.querySelector(\"dialog\");\n if (dialog) {\n const form = root.querySelector(\n \".tools__dialog-form\",\n ) as HTMLFormElement | null;\n form?.reset();\n dialog.showModal();\n }\n });\n\n // Backup\n root.querySelector(\".tools__backup-btn\")?.addEventListener(\"click\", () => {\n this.handleBackup();\n });\n\n // Restore\n const restoreInput = root.querySelector(\".tools__hidden-restore\");\n root.querySelector(\".tools__restore-btn\")?.addEventListener(\"click\", () => {\n if (restoreInput instanceof HTMLInputElement) {\n restoreInput.click();\n }\n });\n restoreInput?.addEventListener(\"change\", (e) => {\n if (e.target instanceof HTMLInputElement) {\n this.handleRestore(db, e.target);\n }\n });\n\n // Select all / none\n root\n .querySelector(\".tools__select-all-btn\")\n ?.addEventListener(\"click\", () => {\n const allNames = toolsStore.allTools.map((t) => t.name);\n toolsStore.setAllEnabled(db, allNames);\n const declNames = toolsStore.declarativeTools.map((t) => t.name);\n toolsStore.setAllDeclarativeEnabled(db, declNames);\n showInfo(\"All tools enabled\");\n });\n\n root\n .querySelector(\".tools__select-none-btn\")\n ?.addEventListener(\"click\", () => {\n toolsStore.setAllEnabled(db, []);\n toolsStore.setAllDeclarativeEnabled(db, []);\n showInfo(\"All tools disabled\");\n });\n\n // WebMCP toggle listener\n const webMcpToggle = root.querySelector(\n \".tools__webmcp-toggle\",\n ) as HTMLInputElement | null;\n if (webMcpToggle) {\n webMcpToggle.addEventListener(\"change\", async () => {\n const orchestrator =\n this.orchestrator ?? orchestratorStore.orchestrator;\n if (!orchestrator) {\n webMcpToggle.checked = false;\n showError(\"Orchestrator is not ready\");\n\n return;\n }\n\n const next = webMcpToggle.checked;\n try {\n await setWebMcpToolsEnabled(orchestrator, db, next, { orchestrator });\n showInfo(\n next\n ? \"WebMCP tool registration enabled\"\n : \"WebMCP tool registration disabled\",\n );\n } catch (err) {\n webMcpToggle.checked = !next;\n showError(\n `Failed to update WebMCP setting: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n }\n\n // Shared full internet access toggle listener\n const internetAccessToggle = root.querySelector(\n \".tools__internet-access-toggle\",\n ) as HTMLInputElement | null;\n if (internetAccessToggle) {\n internetAccessToggle.addEventListener(\"change\", async () => {\n const next = internetAccessToggle.checked;\n try {\n await orchestratorStore.setVMBashFullInternetAccess(db, next);\n showInfo(\n next\n ? \"Full internet access enabled for Bash and JavaScript tools\"\n : \"Full internet access disabled for Bash and JavaScript tools\",\n );\n } catch (err) {\n internetAccessToggle.checked = !next;\n showError(\n `Failed to update internet access setting: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n }\n\n // Web Search toggle\n const webSearchUseProxyToggle = root.querySelector(\n \".tools__websearch-proxy-toggle\",\n ) as HTMLInputElement | null;\n webSearchUseProxyToggle?.addEventListener(\"change\", async () => {\n try {\n await toolsStore.setWebSearchUseProxy(\n db,\n webSearchUseProxyToggle.checked,\n );\n showInfo(\n webSearchUseProxyToggle.checked\n ? \"Web Search local proxy enabled\"\n : \"Web Search local proxy disabled\",\n );\n } catch (err) {\n webSearchUseProxyToggle.checked = !webSearchUseProxyToggle.checked;\n showError(\n `Failed to update Web Search proxy setting: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n\n // Search Files save button\n root\n .querySelector(\".tools__save-searchfiles-btn\")\n ?.addEventListener(\"click\", async () => {\n const maxFileBytesInput = root.querySelector(\n \".tools__searchfiles-max-file-bytes-input\",\n ) as HTMLInputElement | null;\n const maxFilesVisitedInput = root.querySelector(\n \".tools__searchfiles-max-files-visited-input\",\n ) as HTMLInputElement | null;\n const skipDirsInput = root.querySelector(\n \".tools__searchfiles-skip-dirs-input\",\n ) as HTMLInputElement | null;\n\n const maxFileBytes = parseInt(maxFileBytesInput?.value || \"\", 10);\n const maxFilesVisited = parseInt(maxFilesVisitedInput?.value || \"\", 10);\n const skipDirs = skipDirsInput?.value ?? \"\";\n\n try {\n if (!isNaN(maxFileBytes) && maxFileBytes > 0) {\n await toolsStore.setSearchFilesMaxFileBytes(db, maxFileBytes);\n }\n if (!isNaN(maxFilesVisited) && maxFilesVisited > 0) {\n await toolsStore.setSearchFilesMaxFilesVisited(db, maxFilesVisited);\n }\n await toolsStore.setSearchFilesSkipDirs(db, skipDirs);\n showSuccess(\"Search Files settings saved\");\n } catch (err) {\n showError(\n `Failed to save Search Files settings: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n\n // Web Search save button\n root\n .querySelector(\".tools__save-websearch-btn\")\n ?.addEventListener(\"click\", async () => {\n const proxyUrlInput = root.querySelector(\n \".tools__websearch-proxy-url-input\",\n ) as HTMLInputElement | null;\n const searchUrlInput = root.querySelector(\n \".tools__websearch-url-input\",\n ) as HTMLInputElement | null;\n\n const proxyUrl = proxyUrlInput?.value.trim() || \"/proxy\";\n const searchUrl =\n searchUrlInput?.value.trim() ||\n \"https://html.duckduckgo.com/html/?q={query}\";\n\n try {\n await toolsStore.setWebSearchProxyUrl(db, proxyUrl);\n await toolsStore.setWebSearchUrl(db, searchUrl);\n showSuccess(\"Web Search settings saved\");\n } catch (err) {\n showError(\n `Failed to save Web Search settings: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n\n // WebMCP mode selector\n const webMcpModeSelect = root.querySelector(\n \".tools__webmcp-mode\",\n ) as HTMLSelectElement | null;\n if (webMcpModeSelect) {\n webMcpModeSelect.addEventListener(\"change\", async () => {\n const orchestrator =\n this.orchestrator ?? orchestratorStore.orchestrator;\n if (!orchestrator) {\n return;\n }\n\n const mode = webMcpModeSelect.value as \"polyfill\" | \"native\";\n try {\n await setWebMcpMode(orchestrator, db, mode, { orchestrator });\n showInfo(`WebMCP mode set to ${mode}`);\n } catch (err) {\n showError(\n `Failed to update WebMCP mode: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n }\n\n // Save prompt\n root\n .querySelector(\".tools__save-prompt-btn\")\n ?.addEventListener(\"click\", () => {\n const textarea = root.querySelector(\".tools__prompt-area\");\n if (textarea instanceof HTMLTextAreaElement) {\n toolsStore.setSystemPromptOverride(db, textarea.value);\n showSuccess(\"System prompt override saved\");\n }\n });\n\n // Clear prompt\n root\n .querySelector(\".tools__clear-prompt-btn\")\n ?.addEventListener(\"click\", () => {\n const textarea = root.querySelector(\".tools__prompt-area\");\n if (textarea instanceof HTMLTextAreaElement) {\n textarea.value = \"\";\n toolsStore.setSystemPromptOverride(db, \"\");\n showSuccess(\"System prompt override cleared\");\n }\n });\n\n // Dialog controls — Add Tool\n const dialog = root.querySelector(\n \".tools__dialog\",\n ) as HTMLDialogElement | null;\n const closeBtn = dialog?.querySelector(\".tools__dialog-close\");\n const cancelBtn = dialog?.querySelector(\".tools__btn-cancel\");\n const form = root.querySelector(\n \".tools__dialog-form\",\n ) as HTMLFormElement | null;\n\n closeBtn?.addEventListener(\"click\", () => dialog?.close());\n cancelBtn?.addEventListener(\"click\", () => dialog?.close());\n\n dialog?.addEventListener(\"click\", (e) => {\n if (e.target === dialog) {\n dialog.close();\n }\n });\n\n form?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (form) {\n this.handleAddTool(db, form);\n }\n });\n\n // Dialog controls — Clone Tool\n const cloneDialog = root.querySelector(\n \".tools__clone-dialog\",\n ) as HTMLDialogElement | null;\n const cloneCloseBtn = root.querySelector(\".tools__clone-dialog-close\");\n const cloneCancelBtn = root.querySelector(\".tools__clone-cancel-btn\");\n const cloneForm = root.querySelector(\n \".tools__clone-dialog-form\",\n ) as HTMLFormElement | null;\n\n cloneCloseBtn?.addEventListener(\"click\", () => cloneDialog?.close());\n cloneCancelBtn?.addEventListener(\"click\", () => cloneDialog?.close());\n cloneDialog?.addEventListener(\"click\", (e) => {\n if (e.target === cloneDialog) {\n cloneDialog.close();\n }\n });\n\n cloneForm?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (cloneForm) {\n this.handleCloneTool(db, cloneForm);\n }\n });\n\n // Dialog controls — Profile\n const profileDialog = root.querySelector(\n \".tools__profile-dialog\",\n ) as HTMLDialogElement | null;\n const profileCloseBtn = root.querySelector(\".tools__profile-dialog-close\");\n const profileCancelBtn = root.querySelector(\".tools__profile-cancel-btn\");\n const profileForm = root.querySelector(\n \".tools__profile-dialog-form\",\n ) as HTMLFormElement | null;\n\n profileCloseBtn?.addEventListener(\"click\", () => profileDialog?.close());\n profileCancelBtn?.addEventListener(\"click\", () => profileDialog?.close());\n profileDialog?.addEventListener(\"click\", (e) => {\n if (e.target === profileDialog) {\n profileDialog.close();\n }\n });\n\n profileForm?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (profileForm) {\n this.handleSaveProfile(db, profileForm);\n }\n });\n\n // Profile select\n const profileSelect = root.querySelector(\".tools__profile-select\");\n profileSelect?.addEventListener(\"change\", (e) => {\n const select = e.target as HTMLSelectElement;\n const value = select.value;\n if (value) {\n toolsStore.activateProfile(db, value);\n showInfo(\"Profile activated\");\n } else {\n toolsStore.deactivateProfile(db);\n showInfo(\"Profile deactivated\");\n }\n });\n\n // Profile new button → open dialog\n root\n .querySelector(\".tools__profile-new-btn\")\n ?.addEventListener(\"click\", () => {\n if (profileDialog && profileForm) {\n profileForm.reset();\n // Populate provider dropdown\n const providerSelect = profileForm.querySelector(\n '[name=\"providerId\"]',\n );\n if (providerSelect) {\n providerSelect.replaceChildren();\n const defaultOption = document.createElement(\"option\");\n defaultOption.value = \"\";\n defaultOption.textContent = \"— Any provider —\";\n providerSelect.append(defaultOption);\n for (const pid of getAvailableProviders()) {\n const p = getProvider(pid);\n if (p) {\n const opt = document.createElement(\"option\");\n opt.value = pid;\n opt.textContent = p.name;\n providerSelect.appendChild(opt);\n }\n }\n }\n\n (profileDialog as HTMLDialogElement).showModal();\n }\n });\n\n // Profile save (overwrite active)\n root\n .querySelector(\".tools__profile-save-btn\")\n ?.addEventListener(\"click\", async () => {\n const activeId = toolsStore.activeProfileId;\n if (activeId) {\n await toolsStore.saveToActiveProfile(db);\n showSuccess(\"Profile saved\");\n } else {\n // No active profile — open new profile dialog\n root\n .querySelector(\".tools__profile-new-btn\")\n ?.dispatchEvent(new Event(\"click\"));\n }\n });\n\n // Profile delete\n root\n .querySelector(\".tools__profile-delete-btn\")\n ?.addEventListener(\"click\", async () => {\n const activeId = toolsStore.activeProfileId;\n if (!activeId) {\n showInfo(\"No profile selected\");\n\n return;\n }\n\n if (activeId.startsWith(\"__builtin_\")) {\n showInfo(\"Built-in profiles cannot be deleted\");\n\n return;\n }\n\n await toolsStore.deleteProfile(db, activeId);\n showSuccess(\"Profile deleted\");\n });\n\n // Dialog controls — Import\n const importDialog = root.querySelector(\n \".tools__import-dialog\",\n ) as HTMLDialogElement | null;\n const importCloseBtn = root.querySelector(\".tools__import-dialog-close\");\n const importCancelBtn = root.querySelector(\".tools__import-cancel-btn\");\n const importForm = root.querySelector(\n \".tools__import-dialog-form\",\n ) as HTMLFormElement | null;\n const importFetchBtn = root.querySelector(\".tools__import-fetch-btn\");\n\n root.querySelector(\".tools__import-btn\")?.addEventListener(\"click\", () => {\n if (importDialog && importForm) {\n importForm.reset();\n this.resetImportDialogState();\n importDialog.showModal();\n }\n });\n\n importCloseBtn?.addEventListener(\"click\", () => importDialog?.close());\n importCancelBtn?.addEventListener(\"click\", () => importDialog?.close());\n importDialog?.addEventListener(\"click\", (e) => {\n if (e.target === importDialog) {\n importDialog.close();\n }\n });\n\n root.querySelectorAll(\".tools__preset-btn\").forEach((btn) => {\n btn.addEventListener(\"click\", () => {\n const url = (btn as HTMLElement).dataset.url;\n const input = root.querySelector(\n \".tools__import-url-input\",\n ) as HTMLInputElement | null;\n if (input && url) {\n input.value = url;\n this.handleFetchSite(db, url);\n }\n });\n });\n\n importFetchBtn?.addEventListener(\"click\", () => {\n const input = root.querySelector(\n \".tools__import-url-input\",\n ) as HTMLInputElement | null;\n if (input && input.value.trim()) {\n this.handleFetchSite(db, input.value.trim());\n }\n });\n\n importForm?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (importForm) {\n this.handleImportSubmit(db, importForm);\n }\n });\n }\n\n handleBackup() {\n const json = toolsStore.exportBackup();\n const blob = new Blob([json], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `shadowclaw-tools-${Date.now()}.json`;\n a.click();\n URL.revokeObjectURL(url);\n showSuccess(\"Tools config exported\");\n }\n\n /**\n * Open the clone tool dialog for a given source tool.\n */\n openCloneDialog(sourceToolName: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const cloneDialog = root.querySelector(\n \".tools__clone-dialog\",\n ) as HTMLDialogElement | null;\n const cloneForm = root.querySelector(\n \".tools__clone-dialog-form\",\n ) as HTMLFormElement | null;\n if (!cloneDialog || !cloneForm) {\n return;\n }\n\n cloneForm.reset();\n const sourceInput = cloneForm.querySelector(\n '[name=\"source\"]',\n ) as HTMLInputElement | null;\n if (sourceInput) {\n sourceInput.value = sourceToolName;\n }\n\n cloneDialog.showModal();\n }\n\n renderImportCatalog(manifest: RemoteManifest) {\n const root = this.shadowRoot;\n if (!root) return;\n\n const catalog = root.querySelector(\".tools__import-catalog\");\n if (!catalog) return;\n catalog.replaceChildren();\n\n // 1. Render Tools\n const tools = manifest.tools || [];\n if (tools.length > 0) {\n const category = document.createElement(\"div\");\n category.className = \"tools__import-category\";\n\n const header = document.createElement(\"div\");\n header.className = \"tools__import-category-header\";\n header.textContent = `🛠️ Tools (${tools.length})`;\n category.appendChild(header);\n\n for (const tool of tools) {\n const item = document.createElement(\"div\");\n item.className = \"tools__import-item\";\n\n const itemHeader = document.createElement(\"div\");\n itemHeader.className = \"tools__import-item-header\";\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.name = \"importTool\";\n checkbox.value = tool.name;\n checkbox.checked = true;\n checkbox.id = `import_tool_${tool.name}`;\n itemHeader.appendChild(checkbox);\n\n const titleLabel = document.createElement(\"label\");\n titleLabel.htmlFor = checkbox.id;\n titleLabel.className = \"tools__import-item-title\";\n titleLabel.textContent = tool.name;\n itemHeader.appendChild(titleLabel);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge tools__item-badge--declarative\";\n badge.textContent = tool.executionType || \"declarative\";\n itemHeader.appendChild(badge);\n\n item.appendChild(itemHeader);\n\n if (tool.description) {\n const desc = document.createElement(\"div\");\n desc.className = \"tools__import-item-desc\";\n desc.textContent = tool.description;\n item.appendChild(desc);\n }\n\n category.appendChild(item);\n }\n\n catalog.appendChild(category);\n }\n\n // 2. Render Skills\n const skills = manifest.skills || [];\n if (skills.length > 0) {\n const category = document.createElement(\"div\");\n category.className = \"tools__import-category\";\n\n const header = document.createElement(\"div\");\n header.className = \"tools__import-category-header\";\n header.textContent = `🧠 Agent Skills (${skills.length})`;\n category.appendChild(header);\n\n for (const skill of skills) {\n const item = document.createElement(\"div\");\n item.className = \"tools__import-item\";\n\n const itemHeader = document.createElement(\"div\");\n itemHeader.className = \"tools__import-item-header\";\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.name = \"importSkill\";\n checkbox.value = skill.name;\n checkbox.checked = true;\n checkbox.id = `import_skill_${skill.name}`;\n itemHeader.appendChild(checkbox);\n\n const titleLabel = document.createElement(\"label\");\n titleLabel.htmlFor = checkbox.id;\n titleLabel.className = \"tools__import-item-title\";\n titleLabel.textContent = skill.name;\n itemHeader.appendChild(titleLabel);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge\";\n badge.textContent = \"skill\";\n itemHeader.appendChild(badge);\n\n item.appendChild(itemHeader);\n\n if (skill.description) {\n const desc = document.createElement(\"div\");\n desc.className = \"tools__import-item-desc\";\n desc.textContent = skill.description;\n item.appendChild(desc);\n }\n\n category.appendChild(item);\n }\n\n catalog.appendChild(category);\n }\n\n // 3. Render Scripts\n const scripts = manifest.scripts || [];\n if (scripts.length > 0) {\n const category = document.createElement(\"div\");\n category.className = \"tools__import-category\";\n\n const header = document.createElement(\"div\");\n header.className = \"tools__import-category-header\";\n header.textContent = `📜 Companion Scripts (${scripts.length})`;\n category.appendChild(header);\n\n for (const script of scripts) {\n const item = document.createElement(\"div\");\n item.className = \"tools__import-item\";\n\n const itemHeader = document.createElement(\"div\");\n itemHeader.className = \"tools__import-item-header\";\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.name = \"importScript\";\n checkbox.value = script.name;\n checkbox.checked = true;\n checkbox.id = `import_script_${script.name}`;\n itemHeader.appendChild(checkbox);\n\n const titleLabel = document.createElement(\"label\");\n titleLabel.htmlFor = checkbox.id;\n titleLabel.className = \"tools__import-item-title\";\n titleLabel.textContent = script.name;\n itemHeader.appendChild(titleLabel);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge\";\n badge.textContent = \"script\";\n itemHeader.appendChild(badge);\n\n item.appendChild(itemHeader);\n\n if (script.description) {\n const desc = document.createElement(\"div\");\n desc.className = \"tools__import-item-desc\";\n desc.textContent = script.description;\n item.appendChild(desc);\n }\n\n category.appendChild(item);\n }\n\n catalog.appendChild(category);\n }\n }\n\n resetImportDialogState() {\n this.currentRemoteManifest = null;\n const root = this.shadowRoot;\n if (!root) return;\n\n const statusEl = root.querySelector(\n \".tools__import-manifest-status\",\n ) as HTMLElement | null;\n if (statusEl) statusEl.hidden = true;\n\n const siteName = root.querySelector(\".tools__import-site-name\");\n if (siteName) siteName.textContent = \"\";\n\n const siteDesc = root.querySelector(\".tools__import-site-desc\");\n if (siteDesc) siteDesc.textContent = \"\";\n\n const catalog = root.querySelector(\".tools__import-catalog\");\n if (catalog) catalog.replaceChildren();\n\n const submitBtn = root.querySelector(\n \".tools__import-submit-btn\",\n ) as HTMLButtonElement | null;\n if (submitBtn) submitBtn.disabled = true;\n }\n\n setupEffects(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n // Reactive re-render on tool store changes\n this.addCleanup(\n effect(() => {\n toolsStore.enabledToolNames;\n toolsStore.customTools;\n toolsStore.declarativeTools;\n toolsStore.declarativeToolNamesEnabled;\n toolsStore.systemPromptOverride;\n toolsStore.profiles;\n toolsStore.activeProfileId;\n this.updateToolList(db);\n }),\n );\n\n // WebMCP opt-in toggle\n const webMcpToggle = root.querySelector(\n \".tools__webmcp-toggle\",\n ) as HTMLInputElement | null;\n const internetAccessToggle = root.querySelector(\n \".tools__internet-access-toggle\",\n ) as HTMLInputElement | null;\n const webMcpModeSelect = root.querySelector(\n \".tools__webmcp-mode\",\n ) as HTMLSelectElement | null;\n\n if (webMcpToggle) {\n // Sync checked state and mode when orchestrator becomes available\n this.addCleanup(\n effect(() => {\n if (orchestratorStore.ready) {\n this.orchestrator = orchestratorStore.orchestrator;\n webMcpToggle.checked =\n this.orchestrator?.webMcpToolsEnabled === true;\n if (webMcpModeSelect && this.orchestrator) {\n webMcpModeSelect.value = getWebMcpMode() || \"polyfill\";\n }\n }\n }),\n );\n }\n\n if (internetAccessToggle) {\n this.addCleanup(\n effect(() => {\n internetAccessToggle.checked =\n orchestratorStore.vmBashFullInternetAccess;\n }),\n );\n }\n\n // Web Search reactive effects\n const webSearchProxyToggle = root.querySelector(\n \".tools__websearch-proxy-toggle\",\n ) as HTMLInputElement | null;\n const webSearchProxyUrlInput = root.querySelector(\n \".tools__websearch-proxy-url-input\",\n ) as HTMLInputElement | null;\n const webSearchUrlInput = root.querySelector(\n \".tools__websearch-url-input\",\n ) as HTMLInputElement | null;\n\n if (webSearchProxyToggle) {\n this.addCleanup(\n effect(() => {\n webSearchProxyToggle.checked = toolsStore.webSearchUseProxy;\n }),\n );\n }\n\n if (webSearchProxyUrlInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== webSearchProxyUrlInput &&\n !webSearchProxyUrlInput.matches(\":focus\")\n ) {\n webSearchProxyUrlInput.value = toolsStore.webSearchProxyUrl;\n }\n }),\n );\n }\n\n if (webSearchUrlInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== webSearchUrlInput &&\n !webSearchUrlInput.matches(\":focus\")\n ) {\n webSearchUrlInput.value = toolsStore.webSearchUrl;\n }\n }),\n );\n }\n\n // Search Files reactive effects\n const searchFilesMaxFileBytesInput = root.querySelector(\n \".tools__searchfiles-max-file-bytes-input\",\n ) as HTMLInputElement | null;\n const searchFilesMaxFilesVisitedInput = root.querySelector(\n \".tools__searchfiles-max-files-visited-input\",\n ) as HTMLInputElement | null;\n const searchFilesSkipDirsInput = root.querySelector(\n \".tools__searchfiles-skip-dirs-input\",\n ) as HTMLInputElement | null;\n\n if (searchFilesMaxFileBytesInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== searchFilesMaxFileBytesInput &&\n !searchFilesMaxFileBytesInput.matches(\":focus\")\n ) {\n searchFilesMaxFileBytesInput.value = String(\n toolsStore.searchFilesMaxFileBytes,\n );\n }\n }),\n );\n }\n\n if (searchFilesMaxFilesVisitedInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== searchFilesMaxFilesVisitedInput &&\n !searchFilesMaxFilesVisitedInput.matches(\":focus\")\n ) {\n searchFilesMaxFilesVisitedInput.value = String(\n toolsStore.searchFilesMaxFilesVisited,\n );\n }\n }),\n );\n }\n\n if (searchFilesSkipDirsInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== searchFilesSkipDirsInput &&\n !searchFilesSkipDirsInput.matches(\":focus\")\n ) {\n searchFilesSkipDirsInput.value = toolsStore.searchFilesSkipDirs;\n }\n }),\n );\n }\n }\n\n /** Update the profile dropdown to reflect current state. */\n updateProfileSelector() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const select = root.querySelector(\".tools__profile-select\");\n if (!select) {\n return;\n }\n\n const profiles = toolsStore.profiles;\n const activeId = toolsStore.activeProfileId;\n\n // Preserve selection\n select.replaceChildren();\n const defaultOption = document.createElement(\"option\");\n defaultOption.value = \"\";\n defaultOption.textContent = \"— No profile (manual config) —\";\n select.append(defaultOption);\n for (const p of profiles) {\n const opt = document.createElement(\"option\");\n opt.value = p.id;\n const isBuiltin = p.id.startsWith(\"__builtin_\");\n const providerLabel = p.providerId\n ? getProvider(p.providerId)?.name || p.providerId\n : \"any\";\n const modelLabel = p.model || \"any\";\n opt.textContent = isBuiltin\n ? `⚡ ${p.name} (${providerLabel})`\n : `${p.name} (${providerLabel} / ${modelLabel})`;\n if (p.id === activeId) {\n opt.selected = true;\n }\n\n select.appendChild(opt);\n }\n\n // Disable delete button for built-in profiles\n const deleteBtn = root.querySelector(\n \".tools__profile-delete-btn\",\n ) as HTMLButtonElement | null;\n if (deleteBtn) {\n const isBuiltinActive = activeId?.startsWith(\"__builtin_\");\n deleteBtn.disabled = !!isBuiltinActive;\n deleteBtn.title = isBuiltinActive\n ? \"Built-in profiles cannot be deleted\"\n : \"\";\n }\n }\n\n updateToolList(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const list = root.querySelector(\".tools__list\");\n if (!list) {\n return;\n }\n\n const enabled = toolsStore.enabledToolNames;\n const allTools = toolsStore.allTools;\n const declarativeTools = toolsStore.declarativeTools;\n\n const existingCheckboxes = list.querySelectorAll<HTMLInputElement>(\n \".tools__item-checkbox[data-tool]\",\n );\n const existingToolNames = Array.from(existingCheckboxes).map(\n (cb) => cb.getAttribute(\"data-tool\") || \"\",\n );\n const targetToolNames = [\n ...allTools.map((t) => t.name),\n ...declarativeTools.map((t) => t.name),\n ];\n\n const isSameStructure =\n existingToolNames.length === targetToolNames.length &&\n existingToolNames.every((name, i) => name === targetToolNames[i]);\n\n if (isSameStructure) {\n for (const cb of existingCheckboxes) {\n const toolName = cb.getAttribute(\"data-tool\");\n if (!toolName) continue;\n const isDeclarative = declarativeTools.some((t) => t.name === toolName);\n const isChecked = isDeclarative\n ? toolsStore.isDeclarativeToolEnabled(toolName)\n : enabled.has(toolName);\n if (cb.checked !== isChecked) {\n cb.checked = isChecked;\n }\n }\n } else {\n list.replaceChildren();\n\n for (const tool of allTools) {\n const isCustom = !BUILTIN_TOOL_NAMES.has(tool.name);\n const isChecked = enabled.has(tool.name);\n const brief = tool.description.split(\". \")[0];\n\n const item = document.createElement(\"div\");\n item.className = \"tools__item\";\n item.setAttribute(\"role\", \"listitem\");\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.className = \"tools__item-checkbox\";\n checkbox.setAttribute(\"data-tool\", tool.name);\n checkbox.setAttribute(\"aria-label\", `Enable ${tool.name}`);\n checkbox.checked = isChecked;\n\n const info = document.createElement(\"div\");\n info.className = \"tools__item-info\";\n\n const name = document.createElement(\"div\");\n name.className = \"tools__item-name\";\n name.textContent = tool.name;\n\n const desc = document.createElement(\"div\");\n desc.className = \"tools__item-desc\";\n desc.setAttribute(\"title\", tool.description);\n desc.textContent = brief;\n info.append(name, desc);\n\n const cloneBtn = document.createElement(\"button\");\n cloneBtn.className = \"tools__item-clone\";\n cloneBtn.setAttribute(\"data-clone\", tool.name);\n cloneBtn.setAttribute(\"aria-label\", `Clone ${tool.name}`);\n cloneBtn.setAttribute(\"title\", \"Clone tool\");\n cloneBtn.textContent = \"📋\";\n\n item.append(checkbox, info);\n\n if (isCustom) {\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge\";\n badge.textContent = \"custom\";\n item.append(badge);\n }\n\n item.append(cloneBtn);\n\n let deleteBtn: HTMLButtonElement | null = null;\n if (isCustom) {\n deleteBtn = document.createElement(\"button\");\n deleteBtn.className = \"tools__item-delete\";\n deleteBtn.setAttribute(\"data-delete\", tool.name);\n deleteBtn.setAttribute(\"aria-label\", `Delete ${tool.name}`);\n deleteBtn.textContent = \"🗑️\";\n item.append(deleteBtn);\n }\n\n // Toggle\n checkbox?.addEventListener(\"change\", () => {\n toolsStore.setToolEnabled(db, tool.name, checkbox.checked);\n });\n\n // Clone\n cloneBtn?.addEventListener(\"click\", () => {\n this.openCloneDialog(tool.name);\n });\n\n // Delete custom tool\n deleteBtn?.addEventListener(\"click\", () => {\n toolsStore.removeCustomTool(db, tool.name);\n showInfo(`Removed custom tool: ${tool.name}`);\n });\n\n list.appendChild(item);\n }\n\n for (const tool of declarativeTools) {\n const isChecked = toolsStore.isDeclarativeToolEnabled(tool.name);\n const brief = tool.description.split(\". \")[0];\n\n const item = document.createElement(\"div\");\n item.className = \"tools__item\";\n item.setAttribute(\"role\", \"listitem\");\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.className = \"tools__item-checkbox\";\n checkbox.setAttribute(\"data-tool\", tool.name);\n checkbox.setAttribute(\"aria-label\", `Enable ${tool.name}`);\n checkbox.checked = isChecked;\n\n const info = document.createElement(\"div\");\n info.className = \"tools__item-info\";\n\n const name = document.createElement(\"div\");\n name.className = \"tools__item-name\";\n name.textContent = tool.name;\n\n const desc = document.createElement(\"div\");\n desc.className = \"tools__item-desc\";\n desc.setAttribute(\"title\", tool.description);\n desc.textContent = brief;\n info.append(name, desc);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge tools__item-badge--declarative\";\n badge.textContent = \"declarative\";\n item.append(checkbox, info, badge);\n\n checkbox.addEventListener(\"change\", () => {\n toolsStore.setDeclarativeToolEnabled(db, tool.name, checkbox.checked);\n });\n\n list.appendChild(item);\n }\n }\n\n // Update count\n const countEl = root.querySelector(\".tools__count\");\n if (countEl) {\n const enabledBuiltinCount = (toolsStore.enabledTools || []).length;\n const enabledDeclarativeCount = (toolsStore.enabledDeclarativeTools || [])\n .length;\n const totalEnabled = enabledBuiltinCount + enabledDeclarativeCount;\n const totalCount = allTools.length + declarativeTools.length;\n countEl.textContent = `${totalEnabled} of ${totalCount} enabled`;\n }\n\n // Update prompt textarea\n const textarea = root.querySelector(\".tools__prompt-area\");\n if (\n textarea instanceof HTMLTextAreaElement &&\n document.activeElement !== textarea &&\n !textarea.matches(\":focus\")\n ) {\n textarea.value = toolsStore.systemPromptOverride;\n }\n\n // Update profile selector\n this.updateProfileSelector();\n }\n\n async handleAddTool(db: ShadowClawDatabase, form: HTMLFormElement) {\n const data = new FormData(form);\n const name = String(data.get(\"name\") || \"\").trim();\n const description = String(data.get(\"description\") || \"\").trim();\n const schemaStr = String(data.get(\"input_schema\") || \"\").trim();\n\n if (!name || !description) {\n showError(\"Name and description are required\");\n\n return;\n }\n\n // Check uniqueness\n if (toolsStore.allTools.some((t) => t.name === name)) {\n showError(`A tool named \"${name}\" already exists`);\n\n return;\n }\n\n let input_schema = { type: \"object\", properties: {} };\n if (schemaStr) {\n try {\n input_schema = JSON.parse(schemaStr);\n } catch {\n showError(\"Invalid JSON in input schema\");\n\n return;\n }\n }\n\n await toolsStore.addCustomTool(db, { name, description, input_schema });\n showSuccess(`Added custom tool: ${name}`);\n\n const dialog = this.shadowRoot?.querySelector(\n \".tools__dialog\",\n ) as HTMLDialogElement | null;\n dialog?.close();\n }\n\n async handleCloneTool(db: ShadowClawDatabase, form: HTMLFormElement) {\n const data = new FormData(form);\n const sourceToolName = String(data.get(\"source\") || \"\").trim();\n const newName = String(data.get(\"name\") || \"\").trim();\n const newDesc = String(data.get(\"description\") || \"\").trim();\n\n if (!sourceToolName || !newName) {\n showError(\"Source and new tool name are required\");\n\n return;\n }\n\n const ok = await toolsStore.cloneTool(\n db,\n sourceToolName,\n newName,\n newDesc || undefined,\n );\n if (!ok) {\n showError(\n `Clone failed: source not found or name \"${newName}\" already exists.`,\n );\n\n return;\n }\n\n showSuccess(`Cloned \"${sourceToolName}\" → \"${newName}\"`);\n const cloneDialog = this.shadowRoot?.querySelector(\n \".tools__clone-dialog\",\n ) as HTMLDialogElement | null;\n cloneDialog?.close();\n }\n\n async handleFetchSite(_db: ShadowClawDatabase, url: string) {\n const root = this.shadowRoot;\n if (!root) return;\n\n const fetchBtn = root.querySelector(\n \".tools__import-fetch-btn\",\n ) as HTMLButtonElement | null;\n const origText = fetchBtn?.textContent || \"🔍 Fetch\";\n if (fetchBtn) {\n fetchBtn.disabled = true;\n fetchBtn.textContent = \"Fetching...\";\n }\n\n try {\n const resolved = await toolsStore.fetchRemoteDiscoveryManifest(url);\n this.currentRemoteManifest = resolved.manifest;\n\n const siteName = root.querySelector(\".tools__import-site-name\");\n if (siteName)\n siteName.textContent = resolved.manifest.name || \"Remote Site\";\n\n const siteDesc = root.querySelector(\".tools__import-site-desc\");\n if (siteDesc) {\n siteDesc.textContent =\n resolved.manifest.description || \"No description provided.\";\n }\n\n this.renderImportCatalog(resolved.manifest);\n\n const statusEl = root.querySelector(\n \".tools__import-manifest-status\",\n ) as HTMLElement | null;\n if (statusEl) statusEl.hidden = false;\n\n const submitBtn = root.querySelector(\n \".tools__import-submit-btn\",\n ) as HTMLButtonElement | null;\n if (submitBtn) submitBtn.disabled = false;\n\n showInfo(\n `Discovered ${(resolved.manifest.tools || []).length} tools, ${(resolved.manifest.skills || []).length} skills from ${resolved.manifest.name}`,\n );\n } catch (err) {\n this.resetImportDialogState();\n showError(\n `Failed to fetch site: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n if (fetchBtn) {\n fetchBtn.disabled = false;\n fetchBtn.textContent = origText;\n }\n }\n }\n\n async handleImportSubmit(db: ShadowClawDatabase, form: HTMLFormElement) {\n if (!this.currentRemoteManifest) {\n showError(\"No remote discovery manifest loaded.\");\n return;\n }\n\n const formData = new FormData(form);\n const toolNames = formData.getAll(\"importTool\").map(String);\n const skillNames = formData.getAll(\"importSkill\").map(String);\n const scriptNames = formData.getAll(\"importScript\").map(String);\n\n if (\n toolNames.length === 0 &&\n skillNames.length === 0 &&\n scriptNames.length === 0\n ) {\n showError(\"Please select at least one tool, skill, or script to import.\");\n return;\n }\n\n const autoEnable =\n (form.querySelector(\".tools__import-auto-enable\") as HTMLInputElement)\n ?.checked ?? true;\n const overwrite =\n (form.querySelector(\".tools__import-overwrite\") as HTMLInputElement)\n ?.checked ?? false;\n\n const submitBtn = form.querySelector(\n \".tools__import-submit-btn\",\n ) as HTMLButtonElement | null;\n if (submitBtn) {\n submitBtn.disabled = true;\n submitBtn.textContent = \"Importing...\";\n }\n\n try {\n const result = await toolsStore.importFromRemoteSite(\n db,\n this.currentRemoteManifest,\n { toolNames, skillNames, scriptNames },\n { autoEnable, overwrite },\n );\n\n const importedToolsCount = result.tools.filter(\n (t) => t.status === \"imported\",\n ).length;\n const importedSkillsCount = result.skills.filter(\n (s) => s.status === \"imported\",\n ).length;\n const importedScriptsCount = result.scripts.filter(\n (sc) => sc.status === \"imported\",\n ).length;\n\n const totalCount =\n importedToolsCount + importedSkillsCount + importedScriptsCount;\n\n showSuccess(\n `Successfully imported ${totalCount} items from ${this.currentRemoteManifest.name || \"site\"}!`,\n );\n\n const dialog = this.shadowRoot?.querySelector(\n \".tools__import-dialog\",\n ) as HTMLDialogElement | null;\n dialog?.close();\n } catch (err) {\n showError(\n `Import failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n if (submitBtn) {\n submitBtn.disabled = false;\n submitBtn.textContent = \"Import Selected\";\n }\n }\n }\n\n async handleRestore(db: ShadowClawDatabase, input: HTMLInputElement) {\n const file = input.files?.[0];\n if (!file) {\n return;\n }\n\n try {\n const text = await file.text();\n await toolsStore.importBackup(db, text);\n showSuccess(\"Tools config restored\");\n } catch (err) {\n showError(\n `Failed to restore: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n input.value = \"\";\n }\n\n async handleSaveProfile(db: ShadowClawDatabase, form: HTMLFormElement) {\n const data = new FormData(form);\n const name = String(data.get(\"name\") || \"\").trim();\n const providerId = String(data.get(\"providerId\") || \"\").trim();\n const model = String(data.get(\"model\") || \"\").trim();\n\n if (!name) {\n showError(\"Profile name is required\");\n\n return;\n }\n\n const profile = {\n id: ulid(),\n name,\n providerId: providerId || undefined,\n model: model || undefined,\n enabledToolNames: [...toolsStore.enabledToolNames],\n customTools: [...toolsStore.customTools],\n systemPromptOverride: toolsStore.systemPromptOverride,\n };\n\n await toolsStore.addProfile(db, profile);\n await toolsStore.activateProfile(db, profile.id);\n showSuccess(`Profile \"${name}\" created and activated`);\n\n const profileDialog = this.shadowRoot?.querySelector(\n \".tools__profile-dialog\",\n ) as HTMLDialogElement | null;\n profileDialog?.close();\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawTools);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
1
+ {"version":3,"file":"shadow-claw-tools-D0T8m3go.js","names":["shadowClawToolsStyles","shadowClawToolsTemplate"],"sources":["../../src/components/shadow-claw-tools/shadow-claw-tools.ts"],"sourcesContent":["import { getAvailableProviders, getProvider } from \"../../config/config.js\";\nimport { effect } from \"../../core/effect.js\";\n\nimport { getDb, ShadowClawDatabase } from \"../../db/db.js\";\nimport { getWebMcpMode } from \"../../subsystems/mcp/webmcp.js\";\n\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport { toolsStore } from \"../../stores/tools.js\";\n\nimport { TOOL_DEFINITIONS } from \"../../subsystems/tools/tools.js\";\nimport { showError, showInfo, showSuccess } from \"../../ui/toast.js\";\nimport { ulid } from \"../../utils/ulid.js\";\n\nimport type { Orchestrator } from \"../../core/orchestrator/orchestrator.js\";\nimport type { RemoteManifest } from \"../../subsystems/tools/remote/types.js\";\nimport {\n setWebMcpMode,\n setWebMcpToolsEnabled,\n} from \"../../core/orchestrator/utils/sync-web-mcp-registration.js\";\n\nimport \"../common/shadow-claw-page-header-action-button/shadow-claw-page-header-action-button.js\";\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\nimport \"../shadow-claw-page-header/shadow-claw-page-header.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawToolsStyles from \"./shadow-claw-tools.css\" with { type: \"css\" };\nimport shadowClawToolsTemplate from \"./shadow-claw-tools.html\" with { type: \"html\" };\n\nconst BUILTIN_TOOL_NAMES = new Set(TOOL_DEFINITIONS.map((t) => t.name));\n\nconst elementName = \"shadow-claw-tools\";\nexport class ShadowClawTools extends ShadowClawElement {\n static styles = shadowClawToolsStyles;\n static template = shadowClawToolsTemplate;\n currentRemoteManifest: RemoteManifest | null = null;\n\n orchestrator: Orchestrator | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n\n await toolsStore.refreshDeclarativeTools(db);\n this.setupEffects(db);\n this.bindEventListeners(db);\n }\n\n disconnectedCallback() {\n super.disconnectedCallback();\n }\n\n bindEventListeners(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n // Back button\n root.querySelector(\".tools__back-btn\")?.addEventListener(\"click\", () => {\n this.dispatchEvent(\n new CustomEvent(\"navigate-back\", { bubbles: true, composed: true }),\n );\n });\n\n // Add tool button\n root.querySelector(\".tools__add-btn\")?.addEventListener(\"click\", () => {\n const dialog = root.querySelector(\"dialog\");\n if (dialog) {\n const form = root.querySelector(\n \".tools__dialog-form\",\n ) as HTMLFormElement | null;\n form?.reset();\n dialog.showModal();\n }\n });\n\n // Backup\n root.querySelector(\".tools__backup-btn\")?.addEventListener(\"click\", () => {\n this.handleBackup();\n });\n\n // Restore\n const restoreInput = root.querySelector(\".tools__hidden-restore\");\n root.querySelector(\".tools__restore-btn\")?.addEventListener(\"click\", () => {\n if (restoreInput instanceof HTMLInputElement) {\n restoreInput.click();\n }\n });\n restoreInput?.addEventListener(\"change\", (e) => {\n if (e.target instanceof HTMLInputElement) {\n this.handleRestore(db, e.target);\n }\n });\n\n // Select all / none\n root\n .querySelector(\".tools__select-all-btn\")\n ?.addEventListener(\"click\", () => {\n const allNames = toolsStore.allTools.map((t) => t.name);\n toolsStore.setAllEnabled(db, allNames);\n const declNames = toolsStore.declarativeTools.map((t) => t.name);\n toolsStore.setAllDeclarativeEnabled(db, declNames);\n showInfo(\"All tools enabled\");\n });\n\n root\n .querySelector(\".tools__select-none-btn\")\n ?.addEventListener(\"click\", () => {\n toolsStore.setAllEnabled(db, []);\n toolsStore.setAllDeclarativeEnabled(db, []);\n showInfo(\"All tools disabled\");\n });\n\n // WebMCP toggle listener\n const webMcpToggle = root.querySelector(\n \".tools__webmcp-toggle\",\n ) as HTMLInputElement | null;\n if (webMcpToggle) {\n webMcpToggle.addEventListener(\"change\", async () => {\n const orchestrator =\n this.orchestrator ?? orchestratorStore.orchestrator;\n if (!orchestrator) {\n webMcpToggle.checked = false;\n showError(\"Orchestrator is not ready\");\n\n return;\n }\n\n const next = webMcpToggle.checked;\n try {\n await setWebMcpToolsEnabled(orchestrator, db, next, { orchestrator });\n showInfo(\n next\n ? \"WebMCP tool registration enabled\"\n : \"WebMCP tool registration disabled\",\n );\n } catch (err) {\n webMcpToggle.checked = !next;\n showError(\n `Failed to update WebMCP setting: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n }\n\n // Shared full internet access toggle listener\n const internetAccessToggle = root.querySelector(\n \".tools__internet-access-toggle\",\n ) as HTMLInputElement | null;\n if (internetAccessToggle) {\n internetAccessToggle.addEventListener(\"change\", async () => {\n const next = internetAccessToggle.checked;\n try {\n await orchestratorStore.setVMBashFullInternetAccess(db, next);\n showInfo(\n next\n ? \"Full internet access enabled for Bash and JavaScript tools\"\n : \"Full internet access disabled for Bash and JavaScript tools\",\n );\n } catch (err) {\n internetAccessToggle.checked = !next;\n showError(\n `Failed to update internet access setting: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n }\n\n // Web Search toggle\n const webSearchUseProxyToggle = root.querySelector(\n \".tools__websearch-proxy-toggle\",\n ) as HTMLInputElement | null;\n webSearchUseProxyToggle?.addEventListener(\"change\", async () => {\n try {\n await toolsStore.setWebSearchUseProxy(\n db,\n webSearchUseProxyToggle.checked,\n );\n showInfo(\n webSearchUseProxyToggle.checked\n ? \"Web Search local proxy enabled\"\n : \"Web Search local proxy disabled\",\n );\n } catch (err) {\n webSearchUseProxyToggle.checked = !webSearchUseProxyToggle.checked;\n showError(\n `Failed to update Web Search proxy setting: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n\n // Search Files save button\n root\n .querySelector(\".tools__save-searchfiles-btn\")\n ?.addEventListener(\"click\", async () => {\n const maxFileBytesInput = root.querySelector(\n \".tools__searchfiles-max-file-bytes-input\",\n ) as HTMLInputElement | null;\n const maxFilesVisitedInput = root.querySelector(\n \".tools__searchfiles-max-files-visited-input\",\n ) as HTMLInputElement | null;\n const skipDirsInput = root.querySelector(\n \".tools__searchfiles-skip-dirs-input\",\n ) as HTMLInputElement | null;\n\n const maxFileBytes = parseInt(maxFileBytesInput?.value || \"\", 10);\n const maxFilesVisited = parseInt(maxFilesVisitedInput?.value || \"\", 10);\n const skipDirs = skipDirsInput?.value ?? \"\";\n\n try {\n if (!isNaN(maxFileBytes) && maxFileBytes > 0) {\n await toolsStore.setSearchFilesMaxFileBytes(db, maxFileBytes);\n }\n if (!isNaN(maxFilesVisited) && maxFilesVisited > 0) {\n await toolsStore.setSearchFilesMaxFilesVisited(db, maxFilesVisited);\n }\n await toolsStore.setSearchFilesSkipDirs(db, skipDirs);\n showSuccess(\"Search Files settings saved\");\n } catch (err) {\n showError(\n `Failed to save Search Files settings: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n\n // Web Search save button\n root\n .querySelector(\".tools__save-websearch-btn\")\n ?.addEventListener(\"click\", async () => {\n const proxyUrlInput = root.querySelector(\n \".tools__websearch-proxy-url-input\",\n ) as HTMLInputElement | null;\n const searchUrlInput = root.querySelector(\n \".tools__websearch-url-input\",\n ) as HTMLInputElement | null;\n\n const proxyUrl = proxyUrlInput?.value.trim() || \"/proxy\";\n const searchUrl =\n searchUrlInput?.value.trim() ||\n \"https://html.duckduckgo.com/html/?q={query}\";\n\n try {\n await toolsStore.setWebSearchProxyUrl(db, proxyUrl);\n await toolsStore.setWebSearchUrl(db, searchUrl);\n showSuccess(\"Web Search settings saved\");\n } catch (err) {\n showError(\n `Failed to save Web Search settings: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n\n // WebMCP mode selector\n const webMcpModeSelect = root.querySelector(\n \".tools__webmcp-mode\",\n ) as HTMLSelectElement | null;\n if (webMcpModeSelect) {\n webMcpModeSelect.addEventListener(\"change\", async () => {\n const orchestrator =\n this.orchestrator ?? orchestratorStore.orchestrator;\n if (!orchestrator) {\n return;\n }\n\n const mode = webMcpModeSelect.value as \"polyfill\" | \"native\";\n try {\n await setWebMcpMode(orchestrator, db, mode, { orchestrator });\n showInfo(`WebMCP mode set to ${mode}`);\n } catch (err) {\n showError(\n `Failed to update WebMCP mode: ${\n err instanceof Error ? err.message : String(err)\n }`,\n );\n }\n });\n }\n\n // Save prompt\n root\n .querySelector(\".tools__save-prompt-btn\")\n ?.addEventListener(\"click\", () => {\n const textarea = root.querySelector(\".tools__prompt-area\");\n if (textarea instanceof HTMLTextAreaElement) {\n toolsStore.setSystemPromptOverride(db, textarea.value);\n showSuccess(\"System prompt override saved\");\n }\n });\n\n // Clear prompt\n root\n .querySelector(\".tools__clear-prompt-btn\")\n ?.addEventListener(\"click\", () => {\n const textarea = root.querySelector(\".tools__prompt-area\");\n if (textarea instanceof HTMLTextAreaElement) {\n textarea.value = \"\";\n toolsStore.setSystemPromptOverride(db, \"\");\n showSuccess(\"System prompt override cleared\");\n }\n });\n\n // Dialog controls — Add Tool\n const dialog = root.querySelector(\n \".tools__dialog\",\n ) as HTMLDialogElement | null;\n const closeBtn = dialog?.querySelector(\".tools__dialog-close\");\n const cancelBtn = dialog?.querySelector(\".tools__btn-cancel\");\n const form = root.querySelector(\n \".tools__dialog-form\",\n ) as HTMLFormElement | null;\n\n closeBtn?.addEventListener(\"click\", () => dialog?.close());\n cancelBtn?.addEventListener(\"click\", () => dialog?.close());\n\n dialog?.addEventListener(\"click\", (e) => {\n if (e.target === dialog) {\n dialog.close();\n }\n });\n\n form?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (form) {\n this.handleAddTool(db, form);\n }\n });\n\n // Dialog controls — Clone Tool\n const cloneDialog = root.querySelector(\n \".tools__clone-dialog\",\n ) as HTMLDialogElement | null;\n const cloneCloseBtn = root.querySelector(\".tools__clone-dialog-close\");\n const cloneCancelBtn = root.querySelector(\".tools__clone-cancel-btn\");\n const cloneForm = root.querySelector(\n \".tools__clone-dialog-form\",\n ) as HTMLFormElement | null;\n\n cloneCloseBtn?.addEventListener(\"click\", () => cloneDialog?.close());\n cloneCancelBtn?.addEventListener(\"click\", () => cloneDialog?.close());\n cloneDialog?.addEventListener(\"click\", (e) => {\n if (e.target === cloneDialog) {\n cloneDialog.close();\n }\n });\n\n cloneForm?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (cloneForm) {\n this.handleCloneTool(db, cloneForm);\n }\n });\n\n // Dialog controls — Profile\n const profileDialog = root.querySelector(\n \".tools__profile-dialog\",\n ) as HTMLDialogElement | null;\n const profileCloseBtn = root.querySelector(\".tools__profile-dialog-close\");\n const profileCancelBtn = root.querySelector(\".tools__profile-cancel-btn\");\n const profileForm = root.querySelector(\n \".tools__profile-dialog-form\",\n ) as HTMLFormElement | null;\n\n profileCloseBtn?.addEventListener(\"click\", () => profileDialog?.close());\n profileCancelBtn?.addEventListener(\"click\", () => profileDialog?.close());\n profileDialog?.addEventListener(\"click\", (e) => {\n if (e.target === profileDialog) {\n profileDialog.close();\n }\n });\n\n profileForm?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (profileForm) {\n this.handleSaveProfile(db, profileForm);\n }\n });\n\n // Profile select\n const profileSelect = root.querySelector(\".tools__profile-select\");\n profileSelect?.addEventListener(\"change\", (e) => {\n const select = e.target as HTMLSelectElement;\n const value = select.value;\n if (value) {\n toolsStore.activateProfile(db, value);\n showInfo(\"Profile activated\");\n } else {\n toolsStore.deactivateProfile(db);\n showInfo(\"Profile deactivated\");\n }\n });\n\n // Profile new button → open dialog\n root\n .querySelector(\".tools__profile-new-btn\")\n ?.addEventListener(\"click\", () => {\n if (profileDialog && profileForm) {\n profileForm.reset();\n // Populate provider dropdown\n const providerSelect = profileForm.querySelector(\n '[name=\"providerId\"]',\n );\n if (providerSelect) {\n providerSelect.replaceChildren();\n const defaultOption = document.createElement(\"option\");\n defaultOption.value = \"\";\n defaultOption.textContent = \"— Any provider —\";\n providerSelect.append(defaultOption);\n for (const pid of getAvailableProviders()) {\n const p = getProvider(pid);\n if (p) {\n const opt = document.createElement(\"option\");\n opt.value = pid;\n opt.textContent = p.name;\n providerSelect.appendChild(opt);\n }\n }\n }\n\n (profileDialog as HTMLDialogElement).showModal();\n }\n });\n\n // Profile save (overwrite active)\n root\n .querySelector(\".tools__profile-save-btn\")\n ?.addEventListener(\"click\", async () => {\n const activeId = toolsStore.activeProfileId;\n if (activeId) {\n await toolsStore.saveToActiveProfile(db);\n showSuccess(\"Profile saved\");\n } else {\n // No active profile — open new profile dialog\n root\n .querySelector(\".tools__profile-new-btn\")\n ?.dispatchEvent(new Event(\"click\"));\n }\n });\n\n // Profile delete\n root\n .querySelector(\".tools__profile-delete-btn\")\n ?.addEventListener(\"click\", async () => {\n const activeId = toolsStore.activeProfileId;\n if (!activeId) {\n showInfo(\"No profile selected\");\n\n return;\n }\n\n if (activeId.startsWith(\"__builtin_\")) {\n showInfo(\"Built-in profiles cannot be deleted\");\n\n return;\n }\n\n await toolsStore.deleteProfile(db, activeId);\n showSuccess(\"Profile deleted\");\n });\n\n // Dialog controls — Import\n const importDialog = root.querySelector(\n \".tools__import-dialog\",\n ) as HTMLDialogElement | null;\n const importCloseBtn = root.querySelector(\".tools__import-dialog-close\");\n const importCancelBtn = root.querySelector(\".tools__import-cancel-btn\");\n const importForm = root.querySelector(\n \".tools__import-dialog-form\",\n ) as HTMLFormElement | null;\n const importFetchBtn = root.querySelector(\".tools__import-fetch-btn\");\n\n root.querySelector(\".tools__import-btn\")?.addEventListener(\"click\", () => {\n if (importDialog && importForm) {\n importForm.reset();\n this.resetImportDialogState();\n importDialog.showModal();\n }\n });\n\n importCloseBtn?.addEventListener(\"click\", () => importDialog?.close());\n importCancelBtn?.addEventListener(\"click\", () => importDialog?.close());\n importDialog?.addEventListener(\"click\", (e) => {\n if (e.target === importDialog) {\n importDialog.close();\n }\n });\n\n root.querySelectorAll(\".tools__preset-btn\").forEach((btn) => {\n btn.addEventListener(\"click\", () => {\n const url = (btn as HTMLElement).dataset.url;\n const input = root.querySelector(\n \".tools__import-url-input\",\n ) as HTMLInputElement | null;\n if (input && url) {\n input.value = url;\n this.handleFetchSite(db, url);\n }\n });\n });\n\n importFetchBtn?.addEventListener(\"click\", () => {\n const input = root.querySelector(\n \".tools__import-url-input\",\n ) as HTMLInputElement | null;\n if (input && input.value.trim()) {\n this.handleFetchSite(db, input.value.trim());\n }\n });\n\n importForm?.addEventListener(\"submit\", (e) => {\n e.preventDefault();\n if (importForm) {\n this.handleImportSubmit(db, importForm);\n }\n });\n }\n\n handleBackup() {\n const json = toolsStore.exportBackup();\n const blob = new Blob([json], { type: \"application/json\" });\n const url = URL.createObjectURL(blob);\n const a = document.createElement(\"a\");\n a.href = url;\n a.download = `shadowclaw-tools-${Date.now()}.json`;\n a.click();\n URL.revokeObjectURL(url);\n showSuccess(\"Tools config exported\");\n }\n\n /**\n * Open the clone tool dialog for a given source tool.\n */\n openCloneDialog(sourceToolName: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const cloneDialog = root.querySelector(\n \".tools__clone-dialog\",\n ) as HTMLDialogElement | null;\n const cloneForm = root.querySelector(\n \".tools__clone-dialog-form\",\n ) as HTMLFormElement | null;\n if (!cloneDialog || !cloneForm) {\n return;\n }\n\n cloneForm.reset();\n const sourceInput = cloneForm.querySelector(\n '[name=\"source\"]',\n ) as HTMLInputElement | null;\n if (sourceInput) {\n sourceInput.value = sourceToolName;\n }\n\n cloneDialog.showModal();\n }\n\n renderImportCatalog(manifest: RemoteManifest) {\n const root = this.shadowRoot;\n if (!root) return;\n\n const catalog = root.querySelector(\".tools__import-catalog\");\n if (!catalog) return;\n catalog.replaceChildren();\n\n // 1. Render Tools\n const tools = manifest.tools || [];\n if (tools.length > 0) {\n const category = document.createElement(\"div\");\n category.className = \"tools__import-category\";\n\n const header = document.createElement(\"div\");\n header.className = \"tools__import-category-header\";\n header.textContent = `🛠️ Tools (${tools.length})`;\n category.appendChild(header);\n\n for (const tool of tools) {\n const item = document.createElement(\"div\");\n item.className = \"tools__import-item\";\n\n const itemHeader = document.createElement(\"div\");\n itemHeader.className = \"tools__import-item-header\";\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.name = \"importTool\";\n checkbox.value = tool.name;\n checkbox.checked = true;\n checkbox.id = `import_tool_${tool.name}`;\n itemHeader.appendChild(checkbox);\n\n const titleLabel = document.createElement(\"label\");\n titleLabel.htmlFor = checkbox.id;\n titleLabel.className = \"tools__import-item-title\";\n titleLabel.textContent = tool.name;\n itemHeader.appendChild(titleLabel);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge tools__item-badge--declarative\";\n badge.textContent = tool.executionType || \"declarative\";\n itemHeader.appendChild(badge);\n\n item.appendChild(itemHeader);\n\n if (tool.description) {\n const desc = document.createElement(\"div\");\n desc.className = \"tools__import-item-desc\";\n desc.textContent = tool.description;\n item.appendChild(desc);\n }\n\n category.appendChild(item);\n }\n\n catalog.appendChild(category);\n }\n\n // 2. Render Skills\n const skills = manifest.skills || [];\n if (skills.length > 0) {\n const category = document.createElement(\"div\");\n category.className = \"tools__import-category\";\n\n const header = document.createElement(\"div\");\n header.className = \"tools__import-category-header\";\n header.textContent = `🧠 Agent Skills (${skills.length})`;\n category.appendChild(header);\n\n for (const skill of skills) {\n const item = document.createElement(\"div\");\n item.className = \"tools__import-item\";\n\n const itemHeader = document.createElement(\"div\");\n itemHeader.className = \"tools__import-item-header\";\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.name = \"importSkill\";\n checkbox.value = skill.name;\n checkbox.checked = true;\n checkbox.id = `import_skill_${skill.name}`;\n itemHeader.appendChild(checkbox);\n\n const titleLabel = document.createElement(\"label\");\n titleLabel.htmlFor = checkbox.id;\n titleLabel.className = \"tools__import-item-title\";\n titleLabel.textContent = skill.name;\n itemHeader.appendChild(titleLabel);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge\";\n badge.textContent = \"skill\";\n itemHeader.appendChild(badge);\n\n item.appendChild(itemHeader);\n\n if (skill.description) {\n const desc = document.createElement(\"div\");\n desc.className = \"tools__import-item-desc\";\n desc.textContent = skill.description;\n item.appendChild(desc);\n }\n\n category.appendChild(item);\n }\n\n catalog.appendChild(category);\n }\n\n // 3. Render Scripts\n const scripts = manifest.scripts || [];\n if (scripts.length > 0) {\n const category = document.createElement(\"div\");\n category.className = \"tools__import-category\";\n\n const header = document.createElement(\"div\");\n header.className = \"tools__import-category-header\";\n header.textContent = `📜 Companion Scripts (${scripts.length})`;\n category.appendChild(header);\n\n for (const script of scripts) {\n const item = document.createElement(\"div\");\n item.className = \"tools__import-item\";\n\n const itemHeader = document.createElement(\"div\");\n itemHeader.className = \"tools__import-item-header\";\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.name = \"importScript\";\n checkbox.value = script.name;\n checkbox.checked = true;\n checkbox.id = `import_script_${script.name}`;\n itemHeader.appendChild(checkbox);\n\n const titleLabel = document.createElement(\"label\");\n titleLabel.htmlFor = checkbox.id;\n titleLabel.className = \"tools__import-item-title\";\n titleLabel.textContent = script.name;\n itemHeader.appendChild(titleLabel);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge\";\n badge.textContent = \"script\";\n itemHeader.appendChild(badge);\n\n item.appendChild(itemHeader);\n\n if (script.description) {\n const desc = document.createElement(\"div\");\n desc.className = \"tools__import-item-desc\";\n desc.textContent = script.description;\n item.appendChild(desc);\n }\n\n category.appendChild(item);\n }\n\n catalog.appendChild(category);\n }\n }\n\n resetImportDialogState() {\n this.currentRemoteManifest = null;\n const root = this.shadowRoot;\n if (!root) return;\n\n const statusEl = root.querySelector(\n \".tools__import-manifest-status\",\n ) as HTMLElement | null;\n if (statusEl) statusEl.hidden = true;\n\n const siteName = root.querySelector(\".tools__import-site-name\");\n if (siteName) siteName.textContent = \"\";\n\n const siteDesc = root.querySelector(\".tools__import-site-desc\");\n if (siteDesc) siteDesc.textContent = \"\";\n\n const catalog = root.querySelector(\".tools__import-catalog\");\n if (catalog) catalog.replaceChildren();\n\n const submitBtn = root.querySelector(\n \".tools__import-submit-btn\",\n ) as HTMLButtonElement | null;\n if (submitBtn) submitBtn.disabled = true;\n }\n\n setupEffects(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n // Reactive re-render on tool store changes\n this.addCleanup(\n effect(() => {\n toolsStore.enabledToolNames;\n toolsStore.customTools;\n toolsStore.declarativeTools;\n toolsStore.declarativeToolNamesEnabled;\n toolsStore.systemPromptOverride;\n toolsStore.profiles;\n toolsStore.activeProfileId;\n this.updateToolList(db);\n }),\n );\n\n // WebMCP opt-in toggle\n const webMcpToggle = root.querySelector(\n \".tools__webmcp-toggle\",\n ) as HTMLInputElement | null;\n const internetAccessToggle = root.querySelector(\n \".tools__internet-access-toggle\",\n ) as HTMLInputElement | null;\n const webMcpModeSelect = root.querySelector(\n \".tools__webmcp-mode\",\n ) as HTMLSelectElement | null;\n\n if (webMcpToggle) {\n // Sync checked state and mode when orchestrator becomes available\n this.addCleanup(\n effect(() => {\n if (orchestratorStore.ready) {\n this.orchestrator = orchestratorStore.orchestrator;\n webMcpToggle.checked =\n this.orchestrator?.webMcpToolsEnabled === true;\n if (webMcpModeSelect && this.orchestrator) {\n webMcpModeSelect.value = getWebMcpMode() || \"polyfill\";\n }\n }\n }),\n );\n }\n\n if (internetAccessToggle) {\n this.addCleanup(\n effect(() => {\n internetAccessToggle.checked =\n orchestratorStore.vmBashFullInternetAccess;\n }),\n );\n }\n\n // Web Search reactive effects\n const webSearchProxyToggle = root.querySelector(\n \".tools__websearch-proxy-toggle\",\n ) as HTMLInputElement | null;\n const webSearchProxyUrlInput = root.querySelector(\n \".tools__websearch-proxy-url-input\",\n ) as HTMLInputElement | null;\n const webSearchUrlInput = root.querySelector(\n \".tools__websearch-url-input\",\n ) as HTMLInputElement | null;\n\n if (webSearchProxyToggle) {\n this.addCleanup(\n effect(() => {\n webSearchProxyToggle.checked = toolsStore.webSearchUseProxy;\n }),\n );\n }\n\n if (webSearchProxyUrlInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== webSearchProxyUrlInput &&\n !webSearchProxyUrlInput.matches(\":focus\")\n ) {\n webSearchProxyUrlInput.value = toolsStore.webSearchProxyUrl;\n }\n }),\n );\n }\n\n if (webSearchUrlInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== webSearchUrlInput &&\n !webSearchUrlInput.matches(\":focus\")\n ) {\n webSearchUrlInput.value = toolsStore.webSearchUrl;\n }\n }),\n );\n }\n\n // Search Files reactive effects\n const searchFilesMaxFileBytesInput = root.querySelector(\n \".tools__searchfiles-max-file-bytes-input\",\n ) as HTMLInputElement | null;\n const searchFilesMaxFilesVisitedInput = root.querySelector(\n \".tools__searchfiles-max-files-visited-input\",\n ) as HTMLInputElement | null;\n const searchFilesSkipDirsInput = root.querySelector(\n \".tools__searchfiles-skip-dirs-input\",\n ) as HTMLInputElement | null;\n\n if (searchFilesMaxFileBytesInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== searchFilesMaxFileBytesInput &&\n !searchFilesMaxFileBytesInput.matches(\":focus\")\n ) {\n searchFilesMaxFileBytesInput.value = String(\n toolsStore.searchFilesMaxFileBytes,\n );\n }\n }),\n );\n }\n\n if (searchFilesMaxFilesVisitedInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== searchFilesMaxFilesVisitedInput &&\n !searchFilesMaxFilesVisitedInput.matches(\":focus\")\n ) {\n searchFilesMaxFilesVisitedInput.value = String(\n toolsStore.searchFilesMaxFilesVisited,\n );\n }\n }),\n );\n }\n\n if (searchFilesSkipDirsInput) {\n this.addCleanup(\n effect(() => {\n if (\n document.activeElement !== searchFilesSkipDirsInput &&\n !searchFilesSkipDirsInput.matches(\":focus\")\n ) {\n searchFilesSkipDirsInput.value = toolsStore.searchFilesSkipDirs;\n }\n }),\n );\n }\n }\n\n /** Update the profile dropdown to reflect current state. */\n updateProfileSelector() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const select = root.querySelector(\".tools__profile-select\");\n if (!select) {\n return;\n }\n\n const profiles = toolsStore.profiles;\n const activeId = toolsStore.activeProfileId;\n\n // Preserve selection\n select.replaceChildren();\n const defaultOption = document.createElement(\"option\");\n defaultOption.value = \"\";\n defaultOption.textContent = \"— No profile (manual config) —\";\n select.append(defaultOption);\n for (const p of profiles) {\n const opt = document.createElement(\"option\");\n opt.value = p.id;\n const isBuiltin = p.id.startsWith(\"__builtin_\");\n const providerLabel = p.providerId\n ? getProvider(p.providerId)?.name || p.providerId\n : \"any\";\n const modelLabel = p.model || \"any\";\n opt.textContent = isBuiltin\n ? `⚡ ${p.name} (${providerLabel})`\n : `${p.name} (${providerLabel} / ${modelLabel})`;\n if (p.id === activeId) {\n opt.selected = true;\n }\n\n select.appendChild(opt);\n }\n\n // Disable delete button for built-in profiles\n const deleteBtn = root.querySelector(\n \".tools__profile-delete-btn\",\n ) as HTMLButtonElement | null;\n if (deleteBtn) {\n const isBuiltinActive = activeId?.startsWith(\"__builtin_\");\n deleteBtn.disabled = !!isBuiltinActive;\n deleteBtn.title = isBuiltinActive\n ? \"Built-in profiles cannot be deleted\"\n : \"\";\n }\n }\n\n updateToolList(db: ShadowClawDatabase) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const list = root.querySelector(\".tools__list\");\n if (!list) {\n return;\n }\n\n const enabled = toolsStore.enabledToolNames;\n const allTools = toolsStore.allTools;\n const declarativeTools = toolsStore.declarativeTools;\n\n const existingCheckboxes = list.querySelectorAll<HTMLInputElement>(\n \".tools__item-checkbox[data-tool]\",\n );\n const existingToolNames = Array.from(existingCheckboxes).map(\n (cb) => cb.getAttribute(\"data-tool\") || \"\",\n );\n const targetToolNames = [\n ...allTools.map((t) => t.name),\n ...declarativeTools.map((t) => t.name),\n ];\n\n const isSameStructure =\n existingToolNames.length === targetToolNames.length &&\n existingToolNames.every((name, i) => name === targetToolNames[i]);\n\n if (isSameStructure) {\n for (const cb of existingCheckboxes) {\n const toolName = cb.getAttribute(\"data-tool\");\n if (!toolName) continue;\n const isDeclarative = declarativeTools.some((t) => t.name === toolName);\n const isChecked = isDeclarative\n ? toolsStore.isDeclarativeToolEnabled(toolName)\n : enabled.has(toolName);\n if (cb.checked !== isChecked) {\n cb.checked = isChecked;\n }\n }\n } else {\n list.replaceChildren();\n\n for (const tool of allTools) {\n const isCustom = !BUILTIN_TOOL_NAMES.has(tool.name);\n const isChecked = enabled.has(tool.name);\n const brief = tool.description.split(\". \")[0];\n\n const item = document.createElement(\"div\");\n item.className = \"tools__item\";\n item.setAttribute(\"role\", \"listitem\");\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.className = \"tools__item-checkbox\";\n checkbox.setAttribute(\"data-tool\", tool.name);\n checkbox.setAttribute(\"aria-label\", `Enable ${tool.name}`);\n checkbox.checked = isChecked;\n\n const info = document.createElement(\"div\");\n info.className = \"tools__item-info\";\n\n const name = document.createElement(\"div\");\n name.className = \"tools__item-name\";\n name.textContent = tool.name;\n\n const desc = document.createElement(\"div\");\n desc.className = \"tools__item-desc\";\n desc.setAttribute(\"title\", tool.description);\n desc.textContent = brief;\n info.append(name, desc);\n\n const cloneBtn = document.createElement(\"button\");\n cloneBtn.className = \"tools__item-clone\";\n cloneBtn.setAttribute(\"data-clone\", tool.name);\n cloneBtn.setAttribute(\"aria-label\", `Clone ${tool.name}`);\n cloneBtn.setAttribute(\"title\", \"Clone tool\");\n cloneBtn.textContent = \"📋\";\n\n item.append(checkbox, info);\n\n if (isCustom) {\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge\";\n badge.textContent = \"custom\";\n item.append(badge);\n }\n\n item.append(cloneBtn);\n\n let deleteBtn: HTMLButtonElement | null = null;\n if (isCustom) {\n deleteBtn = document.createElement(\"button\");\n deleteBtn.className = \"tools__item-delete\";\n deleteBtn.setAttribute(\"data-delete\", tool.name);\n deleteBtn.setAttribute(\"aria-label\", `Delete ${tool.name}`);\n deleteBtn.textContent = \"🗑️\";\n item.append(deleteBtn);\n }\n\n // Toggle\n checkbox?.addEventListener(\"change\", () => {\n toolsStore.setToolEnabled(db, tool.name, checkbox.checked);\n });\n\n // Clone\n cloneBtn?.addEventListener(\"click\", () => {\n this.openCloneDialog(tool.name);\n });\n\n // Delete custom tool\n deleteBtn?.addEventListener(\"click\", () => {\n toolsStore.removeCustomTool(db, tool.name);\n showInfo(`Removed custom tool: ${tool.name}`);\n });\n\n list.appendChild(item);\n }\n\n for (const tool of declarativeTools) {\n const isChecked = toolsStore.isDeclarativeToolEnabled(tool.name);\n const brief = tool.description.split(\". \")[0];\n\n const item = document.createElement(\"div\");\n item.className = \"tools__item\";\n item.setAttribute(\"role\", \"listitem\");\n\n const checkbox = document.createElement(\"input\");\n checkbox.type = \"checkbox\";\n checkbox.className = \"tools__item-checkbox\";\n checkbox.setAttribute(\"data-tool\", tool.name);\n checkbox.setAttribute(\"aria-label\", `Enable ${tool.name}`);\n checkbox.checked = isChecked;\n\n const info = document.createElement(\"div\");\n info.className = \"tools__item-info\";\n\n const name = document.createElement(\"div\");\n name.className = \"tools__item-name\";\n name.textContent = tool.name;\n\n const desc = document.createElement(\"div\");\n desc.className = \"tools__item-desc\";\n desc.setAttribute(\"title\", tool.description);\n desc.textContent = brief;\n info.append(name, desc);\n\n const badge = document.createElement(\"span\");\n badge.className = \"tools__item-badge tools__item-badge--declarative\";\n badge.textContent = \"declarative\";\n item.append(checkbox, info, badge);\n\n checkbox.addEventListener(\"change\", () => {\n toolsStore.setDeclarativeToolEnabled(db, tool.name, checkbox.checked);\n });\n\n list.appendChild(item);\n }\n }\n\n // Update count\n const countEl = root.querySelector(\".tools__count\");\n if (countEl) {\n const enabledBuiltinCount = (toolsStore.enabledTools || []).length;\n const enabledDeclarativeCount = (toolsStore.enabledDeclarativeTools || [])\n .length;\n const totalEnabled = enabledBuiltinCount + enabledDeclarativeCount;\n const totalCount = allTools.length + declarativeTools.length;\n countEl.textContent = `${totalEnabled} of ${totalCount} enabled`;\n }\n\n // Update prompt textarea\n const textarea = root.querySelector(\".tools__prompt-area\");\n if (\n textarea instanceof HTMLTextAreaElement &&\n document.activeElement !== textarea &&\n !textarea.matches(\":focus\")\n ) {\n textarea.value = toolsStore.systemPromptOverride;\n }\n\n // Update profile selector\n this.updateProfileSelector();\n }\n\n async handleAddTool(db: ShadowClawDatabase, form: HTMLFormElement) {\n const data = new FormData(form);\n const name = String(data.get(\"name\") || \"\").trim();\n const description = String(data.get(\"description\") || \"\").trim();\n const schemaStr = String(data.get(\"input_schema\") || \"\").trim();\n\n if (!name || !description) {\n showError(\"Name and description are required\");\n\n return;\n }\n\n // Check uniqueness\n if (toolsStore.allTools.some((t) => t.name === name)) {\n showError(`A tool named \"${name}\" already exists`);\n\n return;\n }\n\n let input_schema = { type: \"object\", properties: {} };\n if (schemaStr) {\n try {\n input_schema = JSON.parse(schemaStr);\n } catch {\n showError(\"Invalid JSON in input schema\");\n\n return;\n }\n }\n\n await toolsStore.addCustomTool(db, { name, description, input_schema });\n showSuccess(`Added custom tool: ${name}`);\n\n const dialog = this.shadowRoot?.querySelector(\n \".tools__dialog\",\n ) as HTMLDialogElement | null;\n dialog?.close();\n }\n\n async handleCloneTool(db: ShadowClawDatabase, form: HTMLFormElement) {\n const data = new FormData(form);\n const sourceToolName = String(data.get(\"source\") || \"\").trim();\n const newName = String(data.get(\"name\") || \"\").trim();\n const newDesc = String(data.get(\"description\") || \"\").trim();\n\n if (!sourceToolName || !newName) {\n showError(\"Source and new tool name are required\");\n\n return;\n }\n\n const ok = await toolsStore.cloneTool(\n db,\n sourceToolName,\n newName,\n newDesc || undefined,\n );\n if (!ok) {\n showError(\n `Clone failed: source not found or name \"${newName}\" already exists.`,\n );\n\n return;\n }\n\n showSuccess(`Cloned \"${sourceToolName}\" → \"${newName}\"`);\n const cloneDialog = this.shadowRoot?.querySelector(\n \".tools__clone-dialog\",\n ) as HTMLDialogElement | null;\n cloneDialog?.close();\n }\n\n async handleFetchSite(_db: ShadowClawDatabase, url: string) {\n const root = this.shadowRoot;\n if (!root) return;\n\n const fetchBtn = root.querySelector(\n \".tools__import-fetch-btn\",\n ) as HTMLButtonElement | null;\n const origText = fetchBtn?.textContent || \"🔍 Fetch\";\n if (fetchBtn) {\n fetchBtn.disabled = true;\n fetchBtn.textContent = \"Fetching...\";\n }\n\n try {\n const resolved = await toolsStore.fetchRemoteDiscoveryManifest(url);\n this.currentRemoteManifest = resolved.manifest;\n\n const siteName = root.querySelector(\".tools__import-site-name\");\n if (siteName)\n siteName.textContent = resolved.manifest.name || \"Remote Site\";\n\n const siteDesc = root.querySelector(\".tools__import-site-desc\");\n if (siteDesc) {\n siteDesc.textContent =\n resolved.manifest.description || \"No description provided.\";\n }\n\n this.renderImportCatalog(resolved.manifest);\n\n const statusEl = root.querySelector(\n \".tools__import-manifest-status\",\n ) as HTMLElement | null;\n if (statusEl) statusEl.hidden = false;\n\n const submitBtn = root.querySelector(\n \".tools__import-submit-btn\",\n ) as HTMLButtonElement | null;\n if (submitBtn) submitBtn.disabled = false;\n\n showInfo(\n `Discovered ${(resolved.manifest.tools || []).length} tools, ${(resolved.manifest.skills || []).length} skills from ${resolved.manifest.name}`,\n );\n } catch (err) {\n this.resetImportDialogState();\n showError(\n `Failed to fetch site: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n if (fetchBtn) {\n fetchBtn.disabled = false;\n fetchBtn.textContent = origText;\n }\n }\n }\n\n async handleImportSubmit(db: ShadowClawDatabase, form: HTMLFormElement) {\n if (!this.currentRemoteManifest) {\n showError(\"No remote discovery manifest loaded.\");\n return;\n }\n\n const formData = new FormData(form);\n const toolNames = formData.getAll(\"importTool\").map(String);\n const skillNames = formData.getAll(\"importSkill\").map(String);\n const scriptNames = formData.getAll(\"importScript\").map(String);\n\n if (\n toolNames.length === 0 &&\n skillNames.length === 0 &&\n scriptNames.length === 0\n ) {\n showError(\"Please select at least one tool, skill, or script to import.\");\n return;\n }\n\n const autoEnable =\n (form.querySelector(\".tools__import-auto-enable\") as HTMLInputElement)\n ?.checked ?? true;\n const overwrite =\n (form.querySelector(\".tools__import-overwrite\") as HTMLInputElement)\n ?.checked ?? false;\n\n const submitBtn = form.querySelector(\n \".tools__import-submit-btn\",\n ) as HTMLButtonElement | null;\n if (submitBtn) {\n submitBtn.disabled = true;\n submitBtn.textContent = \"Importing...\";\n }\n\n try {\n const result = await toolsStore.importFromRemoteSite(\n db,\n this.currentRemoteManifest,\n { toolNames, skillNames, scriptNames },\n { autoEnable, overwrite },\n );\n\n const importedToolsCount = result.tools.filter(\n (t) => t.status === \"imported\",\n ).length;\n const importedSkillsCount = result.skills.filter(\n (s) => s.status === \"imported\",\n ).length;\n const importedScriptsCount = result.scripts.filter(\n (sc) => sc.status === \"imported\",\n ).length;\n\n const totalCount =\n importedToolsCount + importedSkillsCount + importedScriptsCount;\n\n showSuccess(\n `Successfully imported ${totalCount} items from ${this.currentRemoteManifest.name || \"site\"}!`,\n );\n\n const dialog = this.shadowRoot?.querySelector(\n \".tools__import-dialog\",\n ) as HTMLDialogElement | null;\n dialog?.close();\n } catch (err) {\n showError(\n `Import failed: ${err instanceof Error ? err.message : String(err)}`,\n );\n } finally {\n if (submitBtn) {\n submitBtn.disabled = false;\n submitBtn.textContent = \"Import Selected\";\n }\n }\n }\n\n async handleRestore(db: ShadowClawDatabase, input: HTMLInputElement) {\n const file = input.files?.[0];\n if (!file) {\n return;\n }\n\n try {\n const text = await file.text();\n await toolsStore.importBackup(db, text);\n showSuccess(\"Tools config restored\");\n } catch (err) {\n showError(\n `Failed to restore: ${err instanceof Error ? err.message : String(err)}`,\n );\n }\n\n input.value = \"\";\n }\n\n async handleSaveProfile(db: ShadowClawDatabase, form: HTMLFormElement) {\n const data = new FormData(form);\n const name = String(data.get(\"name\") || \"\").trim();\n const providerId = String(data.get(\"providerId\") || \"\").trim();\n const model = String(data.get(\"model\") || \"\").trim();\n\n if (!name) {\n showError(\"Profile name is required\");\n\n return;\n }\n\n const profile = {\n id: ulid(),\n name,\n providerId: providerId || undefined,\n model: model || undefined,\n enabledToolNames: [...toolsStore.enabledToolNames],\n customTools: [...toolsStore.customTools],\n systemPromptOverride: toolsStore.systemPromptOverride,\n };\n\n await toolsStore.addProfile(db, profile);\n await toolsStore.activateProfile(db, profile.id);\n showSuccess(`Profile \"${name}\" created and activated`);\n\n const profileDialog = this.shadowRoot?.querySelector(\n \".tools__profile-dialog\",\n ) as HTMLDialogElement | null;\n profileDialog?.close();\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawTools);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;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"}
@@ -1,7 +1,7 @@
1
1
  import ShadowClawElement from "./components/shadow-claw-element.js";
2
2
  import { o as getDb, t as getConfig } from "./get-config-BWhs5HFF.js";
3
- import { f as DEFAULT_VM_BOOT_HOST, n as BASH_MAX_TIMEOUT_SEC, r as CONFIG_KEYS } from "./config-DxNI3TlW.js";
4
- import { B as setVMBootHost, H as setVMNetworkRelayURL, P as setVMBashTimeout, V as setVMBootMode, t as orchestratorStore } from "./orchestrator-i_QJ-o22.js";
3
+ import { f as DEFAULT_VM_BOOT_HOST, n as BASH_MAX_TIMEOUT_SEC, r as CONFIG_KEYS } from "./config-BrHR97zt.js";
4
+ import { B as setVMBootHost, H as setVMNetworkRelayURL, P as setVMBashTimeout, V as setVMBootMode, t as orchestratorStore } from "./orchestrator-CCARkxQC.js";
5
5
  import { a as showSuccess, r as showError, s as showWarning } from "./toast-Ck7OIKDf.js";
6
6
  import { t as effect } from "./effect-DL6j9HJp.js";
7
7
 
@@ -347,4 +347,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
347
347
 
348
348
  //#endregion
349
349
  export { ShadowClawWebvm as t };
350
- //# sourceMappingURL=shadow-claw-webvm-sxqVjO0L.js.map
350
+ //# sourceMappingURL=shadow-claw-webvm-CQvzJwKI.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-claw-webvm-sxqVjO0L.js","names":["shadowClawWebvmStyles","shadowClawWebvmTemplate"],"sources":["../../src/components/settings/shadow-claw-webvm/shadow-claw-webvm.ts"],"sourcesContent":["import {\n BASH_DEFAULT_TIMEOUT_SEC,\n BASH_MAX_TIMEOUT_SEC,\n CONFIG_KEYS,\n DEFAULT_VM_BOOT_HOST,\n} from \"../../../config/config.js\";\n\nimport { effect } from \"../../../core/effect.js\";\n\nimport {\n setVMBootHost,\n setVMBootMode,\n setVMNetworkRelayURL,\n} from \"../../../core/orchestrator/utils/operations/vm.js\";\n\nimport { setVMBashTimeout } from \"../../../core/orchestrator/utils/settings.js\";\nimport { getDb } from \"../../../db/db.js\";\nimport { getConfig } from \"../../../db/get-config.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { showError, showSuccess, showWarning } from \"../../../ui/toast.js\";\n\nimport type { Orchestrator } from \"../../../core/orchestrator/orchestrator.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawWebvmStyles from \"./shadow-claw-webvm.css\" with { type: \"css\" };\nimport shadowClawWebvmTemplate from \"./shadow-claw-webvm.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-webvm\";\n\n/**\n * Settings sub-component for WebVM configuration:\n * boot mode, bash timeout, boot host, network relay URL.\n */\nexport class ShadowClawWebvm extends ShadowClawElement {\n static styles = shadowClawWebvmStyles;\n static template = shadowClawWebvmTemplate;\n\n db: ShadowClawDatabase | null = null;\n orchestrator: Orchestrator | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.bindEventListeners();\n this.setupEffects();\n }\n\n /**\n * Bind all event listeners.\n */\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"save-vm-boot-mode\"]')\n ?.addEventListener(\"click\", () => this.saveVMBootMode());\n\n root\n .querySelector('[data-action=\"save-vm-bash-timeout\"]')\n ?.addEventListener(\"click\", () => this.saveVMBashTimeout());\n\n root\n .querySelector('[data-action=\"save-vm-boot-host\"]')\n ?.addEventListener(\"click\", () => this.saveVMBootHost());\n\n root\n .querySelector('[data-action=\"save-vm-network-relay-url\"]')\n ?.addEventListener(\"click\", () => this.saveVMNetworkRelayURL());\n }\n\n /**\n * Set up reactive effects.\n */\n setupEffects() {\n effect(() => {\n if (orchestratorStore.ready) {\n void (async () => {\n this.db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n await this.render();\n })();\n }\n });\n }\n\n /**\n * Load and populate all WebVM settings fields.\n */\n async render() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n try {\n // Boot mode\n const vmBootModeSelect = root.querySelector(\n '[data-setting=\"vm-boot-mode-select\"]',\n ) as HTMLSelectElement | null;\n const vmBootMode = await getConfig(this.db, CONFIG_KEYS.VM_BOOT_MODE);\n const normalizedVMBootMode =\n vmBootMode === \"disabled\" ||\n vmBootMode === \"9p\" ||\n vmBootMode === \"ext2\" ||\n vmBootMode === \"auto\"\n ? vmBootMode\n : \"disabled\";\n if (vmBootModeSelect) {\n vmBootModeSelect.value = normalizedVMBootMode;\n }\n\n // Bash timeout\n const vmBashTimeoutInput = root.querySelector(\n '[data-setting=\"vm-bash-timeout-input\"]',\n ) as HTMLInputElement | null;\n const vmBashTimeoutRaw = await getConfig(\n this.db,\n CONFIG_KEYS.VM_BASH_TIMEOUT_SEC,\n );\n const vmBashTimeoutParsed = Number(vmBashTimeoutRaw);\n const normalizedVMBashTimeout = Number.isFinite(vmBashTimeoutParsed)\n ? Math.min(\n Math.max(Math.floor(vmBashTimeoutParsed), 1),\n BASH_MAX_TIMEOUT_SEC,\n )\n : BASH_DEFAULT_TIMEOUT_SEC;\n if (vmBashTimeoutInput) {\n vmBashTimeoutInput.value = String(normalizedVMBashTimeout);\n }\n\n // Boot host\n const vmBootHostInput = root.querySelector(\n '[data-setting=\"vm-boot-host-input\"]',\n ) as HTMLInputElement | null;\n const vmBootHostRaw = await getConfig(this.db, CONFIG_KEYS.VM_BOOT_HOST);\n if (vmBootHostInput) {\n vmBootHostInput.value =\n typeof vmBootHostRaw === \"string\"\n ? vmBootHostRaw.trim()\n : DEFAULT_VM_BOOT_HOST;\n }\n\n // Network relay URL\n const vmNetworkRelayURLInput = root.querySelector(\n '[data-setting=\"vm-network-relay-url-input\"]',\n ) as HTMLInputElement | null;\n const vmNetworkRelayURLRaw = await getConfig(\n this.db,\n CONFIG_KEYS.VM_NETWORK_RELAY_URL,\n );\n if (vmNetworkRelayURLInput && typeof vmNetworkRelayURLRaw === \"string\") {\n vmNetworkRelayURLInput.value = vmNetworkRelayURLRaw.trim();\n }\n } catch (e) {\n console.warn(\"Could not load WebVM settings:\", e);\n }\n }\n\n /**\n * Save default bash timeout.\n */\n async saveVMBashTimeout() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"vm-bash-timeout-input\"]',\n ) as HTMLInputElement | null;\n const parsed = Number(input?.value);\n\n if (!Number.isFinite(parsed)) {\n showWarning(\"Please enter a valid timeout in seconds\", 3000);\n\n return;\n }\n\n const normalized = Math.min(\n Math.max(Math.floor(parsed), 1),\n BASH_MAX_TIMEOUT_SEC,\n );\n if (input) {\n input.value = String(normalized);\n }\n\n try {\n await setVMBashTimeout(this.orchestrator, this.db, normalized);\n showSuccess(\"WebVM bash timeout saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM bash timeout: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save boot host URL.\n */\n async saveVMBootHost() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"vm-boot-host-input\"]',\n ) as HTMLInputElement | null;\n const value = input?.value?.trim() || \"\";\n\n if (value) {\n try {\n const parsed = new URL(value);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"Boot host must use http:// or https://\");\n }\n } catch {\n showWarning(\"Please enter a valid HTTP(S) boot host URL\", 3500);\n\n return;\n }\n }\n\n try {\n await setVMBootHost(this.orchestrator, this.db, value);\n showSuccess(\"WebVM boot host saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM boot host: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save VM boot mode.\n */\n async saveVMBootMode() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const select = root.querySelector(\n '[data-setting=\"vm-boot-mode-select\"]',\n ) as HTMLSelectElement | null;\n const selected = select?.value || \"disabled\";\n const mode =\n selected === \"disabled\" ||\n selected === \"9p\" ||\n selected === \"ext2\" ||\n selected === \"auto\"\n ? selected\n : \"disabled\";\n\n try {\n await setVMBootMode(this.orchestrator, this.db, mode);\n showSuccess(\"WebVM boot mode saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM mode: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save network relay URL.\n */\n async saveVMNetworkRelayURL() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"vm-network-relay-url-input\"]',\n ) as HTMLInputElement | null;\n const value = input?.value?.trim() || \"\";\n\n if (value) {\n try {\n const parsed = new URL(value);\n if (parsed.protocol !== \"ws:\" && parsed.protocol !== \"wss:\") {\n throw new Error(\"Relay URL must use ws:// or wss://\");\n }\n } catch {\n showWarning(\"Please enter a valid ws:// or wss:// relay URL\", 3500);\n\n return;\n }\n }\n\n if (input) {\n input.value = value;\n }\n\n try {\n await setVMNetworkRelayURL(this.orchestrator, this.db, value);\n showSuccess(\"WebVM relay URL saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM relay URL: \" + errorMsg, 6000);\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawWebvm);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shadow-claw-webvm-CQvzJwKI.js","names":["shadowClawWebvmStyles","shadowClawWebvmTemplate"],"sources":["../../src/components/settings/shadow-claw-webvm/shadow-claw-webvm.ts"],"sourcesContent":["import {\n BASH_DEFAULT_TIMEOUT_SEC,\n BASH_MAX_TIMEOUT_SEC,\n CONFIG_KEYS,\n DEFAULT_VM_BOOT_HOST,\n} from \"../../../config/config.js\";\n\nimport { effect } from \"../../../core/effect.js\";\n\nimport {\n setVMBootHost,\n setVMBootMode,\n setVMNetworkRelayURL,\n} from \"../../../core/orchestrator/utils/operations/vm.js\";\n\nimport { setVMBashTimeout } from \"../../../core/orchestrator/utils/settings.js\";\nimport { getDb } from \"../../../db/db.js\";\nimport { getConfig } from \"../../../db/get-config.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { showError, showSuccess, showWarning } from \"../../../ui/toast.js\";\n\nimport type { Orchestrator } from \"../../../core/orchestrator/orchestrator.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawWebvmStyles from \"./shadow-claw-webvm.css\" with { type: \"css\" };\nimport shadowClawWebvmTemplate from \"./shadow-claw-webvm.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-webvm\";\n\n/**\n * Settings sub-component for WebVM configuration:\n * boot mode, bash timeout, boot host, network relay URL.\n */\nexport class ShadowClawWebvm extends ShadowClawElement {\n static styles = shadowClawWebvmStyles;\n static template = shadowClawWebvmTemplate;\n\n db: ShadowClawDatabase | null = null;\n orchestrator: Orchestrator | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.bindEventListeners();\n this.setupEffects();\n }\n\n /**\n * Bind all event listeners.\n */\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"save-vm-boot-mode\"]')\n ?.addEventListener(\"click\", () => this.saveVMBootMode());\n\n root\n .querySelector('[data-action=\"save-vm-bash-timeout\"]')\n ?.addEventListener(\"click\", () => this.saveVMBashTimeout());\n\n root\n .querySelector('[data-action=\"save-vm-boot-host\"]')\n ?.addEventListener(\"click\", () => this.saveVMBootHost());\n\n root\n .querySelector('[data-action=\"save-vm-network-relay-url\"]')\n ?.addEventListener(\"click\", () => this.saveVMNetworkRelayURL());\n }\n\n /**\n * Set up reactive effects.\n */\n setupEffects() {\n effect(() => {\n if (orchestratorStore.ready) {\n void (async () => {\n this.db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n await this.render();\n })();\n }\n });\n }\n\n /**\n * Load and populate all WebVM settings fields.\n */\n async render() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n try {\n // Boot mode\n const vmBootModeSelect = root.querySelector(\n '[data-setting=\"vm-boot-mode-select\"]',\n ) as HTMLSelectElement | null;\n const vmBootMode = await getConfig(this.db, CONFIG_KEYS.VM_BOOT_MODE);\n const normalizedVMBootMode =\n vmBootMode === \"disabled\" ||\n vmBootMode === \"9p\" ||\n vmBootMode === \"ext2\" ||\n vmBootMode === \"auto\"\n ? vmBootMode\n : \"disabled\";\n if (vmBootModeSelect) {\n vmBootModeSelect.value = normalizedVMBootMode;\n }\n\n // Bash timeout\n const vmBashTimeoutInput = root.querySelector(\n '[data-setting=\"vm-bash-timeout-input\"]',\n ) as HTMLInputElement | null;\n const vmBashTimeoutRaw = await getConfig(\n this.db,\n CONFIG_KEYS.VM_BASH_TIMEOUT_SEC,\n );\n const vmBashTimeoutParsed = Number(vmBashTimeoutRaw);\n const normalizedVMBashTimeout = Number.isFinite(vmBashTimeoutParsed)\n ? Math.min(\n Math.max(Math.floor(vmBashTimeoutParsed), 1),\n BASH_MAX_TIMEOUT_SEC,\n )\n : BASH_DEFAULT_TIMEOUT_SEC;\n if (vmBashTimeoutInput) {\n vmBashTimeoutInput.value = String(normalizedVMBashTimeout);\n }\n\n // Boot host\n const vmBootHostInput = root.querySelector(\n '[data-setting=\"vm-boot-host-input\"]',\n ) as HTMLInputElement | null;\n const vmBootHostRaw = await getConfig(this.db, CONFIG_KEYS.VM_BOOT_HOST);\n if (vmBootHostInput) {\n vmBootHostInput.value =\n typeof vmBootHostRaw === \"string\"\n ? vmBootHostRaw.trim()\n : DEFAULT_VM_BOOT_HOST;\n }\n\n // Network relay URL\n const vmNetworkRelayURLInput = root.querySelector(\n '[data-setting=\"vm-network-relay-url-input\"]',\n ) as HTMLInputElement | null;\n const vmNetworkRelayURLRaw = await getConfig(\n this.db,\n CONFIG_KEYS.VM_NETWORK_RELAY_URL,\n );\n if (vmNetworkRelayURLInput && typeof vmNetworkRelayURLRaw === \"string\") {\n vmNetworkRelayURLInput.value = vmNetworkRelayURLRaw.trim();\n }\n } catch (e) {\n console.warn(\"Could not load WebVM settings:\", e);\n }\n }\n\n /**\n * Save default bash timeout.\n */\n async saveVMBashTimeout() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"vm-bash-timeout-input\"]',\n ) as HTMLInputElement | null;\n const parsed = Number(input?.value);\n\n if (!Number.isFinite(parsed)) {\n showWarning(\"Please enter a valid timeout in seconds\", 3000);\n\n return;\n }\n\n const normalized = Math.min(\n Math.max(Math.floor(parsed), 1),\n BASH_MAX_TIMEOUT_SEC,\n );\n if (input) {\n input.value = String(normalized);\n }\n\n try {\n await setVMBashTimeout(this.orchestrator, this.db, normalized);\n showSuccess(\"WebVM bash timeout saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM bash timeout: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save boot host URL.\n */\n async saveVMBootHost() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"vm-boot-host-input\"]',\n ) as HTMLInputElement | null;\n const value = input?.value?.trim() || \"\";\n\n if (value) {\n try {\n const parsed = new URL(value);\n if (parsed.protocol !== \"http:\" && parsed.protocol !== \"https:\") {\n throw new Error(\"Boot host must use http:// or https://\");\n }\n } catch {\n showWarning(\"Please enter a valid HTTP(S) boot host URL\", 3500);\n\n return;\n }\n }\n\n try {\n await setVMBootHost(this.orchestrator, this.db, value);\n showSuccess(\"WebVM boot host saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM boot host: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save VM boot mode.\n */\n async saveVMBootMode() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const select = root.querySelector(\n '[data-setting=\"vm-boot-mode-select\"]',\n ) as HTMLSelectElement | null;\n const selected = select?.value || \"disabled\";\n const mode =\n selected === \"disabled\" ||\n selected === \"9p\" ||\n selected === \"ext2\" ||\n selected === \"auto\"\n ? selected\n : \"disabled\";\n\n try {\n await setVMBootMode(this.orchestrator, this.db, mode);\n showSuccess(\"WebVM boot mode saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM mode: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save network relay URL.\n */\n async saveVMNetworkRelayURL() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"vm-network-relay-url-input\"]',\n ) as HTMLInputElement | null;\n const value = input?.value?.trim() || \"\";\n\n if (value) {\n try {\n const parsed = new URL(value);\n if (parsed.protocol !== \"ws:\" && parsed.protocol !== \"wss:\") {\n throw new Error(\"Relay URL must use ws:// or wss://\");\n }\n } catch {\n showWarning(\"Please enter a valid ws:// or wss:// relay URL\", 3500);\n\n return;\n }\n }\n\n if (input) {\n input.value = value;\n }\n\n try {\n await setVMNetworkRelayURL(this.orchestrator, this.db, value);\n showSuccess(\"WebVM relay URL saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving WebVM relay URL: \" + errorMsg, 6000);\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawWebvm);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA4BA,MAAM,cAAc;;;;;AAMpB,IAAa,kBAAb,cAAqC,kBAAkB;CACrD,OAAO,SAASA;CAChB,OAAO,WAAWC;CAElB,KAAgC;CAChC,eAAoC;CAEpC,cAAc;EACZ,MAAM;CACR;CAEA,MAAM,oBAAoB;EAExB,IAAI,CADS,KAAK,YAEhB,MAAM,IAAI,MAAM,sBAAsB;EAGxC,KAAK,mBAAmB;EACxB,KAAK,aAAa;CACpB;;;;CAKA,qBAAqB;EACnB,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,KACG,cAAc,qCAAmC,CAAC,EACjD,iBAAiB,eAAe,KAAK,eAAe,CAAC;EAEzD,KACG,cAAc,wCAAsC,CAAC,EACpD,iBAAiB,eAAe,KAAK,kBAAkB,CAAC;EAE5D,KACG,cAAc,qCAAmC,CAAC,EACjD,iBAAiB,eAAe,KAAK,eAAe,CAAC;EAEzD,KACG,cAAc,6CAA2C,CAAC,EACzD,iBAAiB,eAAe,KAAK,sBAAsB,CAAC;CAClE;;;;CAKA,eAAe;EACb,aAAa;GACX,IAAI,kBAAkB,OACpB,CAAM,YAAY;IAChB,KAAK,KAAK,MAAM,MAAM;IACtB,KAAK,eAAe,kBAAkB;IACtC,MAAM,KAAK,OAAO;GACpB,EAAC,CAAE;EAEP,CAAC;CACH;;;;CAKA,MAAM,SAAS;EACb,IAAI,CAAC,KAAK,IACR;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,IAAI;GAEF,MAAM,mBAAmB,KAAK,cAC5B,wCACF;GACA,MAAM,aAAa,MAAM,UAAU,KAAK,IAAI,YAAY,YAAY;GACpE,MAAM,uBACJ,eAAe,cACf,eAAe,QACf,eAAe,UACf,eAAe,SACX,aACA;GACN,IAAI,kBACF,iBAAiB,QAAQ;GAI3B,MAAM,qBAAqB,KAAK,cAC9B,0CACF;GACA,MAAM,mBAAmB,MAAM,UAC7B,KAAK,IACL,YAAY,mBACd;GACA,MAAM,sBAAsB,OAAO,gBAAgB;GACnD,MAAM,0BAA0B,OAAO,SAAS,mBAAmB,IAC/D,KAAK,IACH,KAAK,IAAI,KAAK,MAAM,mBAAmB,GAAG,CAAC,GAC3C,oBACF;GAEJ,IAAI,oBACF,mBAAmB,QAAQ,OAAO,uBAAuB;GAI3D,MAAM,kBAAkB,KAAK,cAC3B,uCACF;GACA,MAAM,gBAAgB,MAAM,UAAU,KAAK,IAAI,YAAY,YAAY;GACvE,IAAI,iBACF,gBAAgB,QACd,OAAO,kBAAkB,WACrB,cAAc,KAAK,IACnB;GAIR,MAAM,yBAAyB,KAAK,cAClC,+CACF;GACA,MAAM,uBAAuB,MAAM,UACjC,KAAK,IACL,YAAY,oBACd;GACA,IAAI,0BAA0B,OAAO,yBAAyB,UAC5D,uBAAuB,QAAQ,qBAAqB,KAAK;EAE7D,SAAS,GAAG;GACV,QAAQ,KAAK,kCAAkC,CAAC;EAClD;CACF;;;;CAKA,MAAM,oBAAoB;EACxB,IAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,IAC9B;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,QAAQ,KAAK,cACjB,0CACF;EACA,MAAM,SAAS,OAAO,OAAO,KAAK;EAElC,IAAI,CAAC,OAAO,SAAS,MAAM,GAAG;GAC5B,YAAY,2CAA2C,GAAI;GAE3D;EACF;EAEA,MAAM,aAAa,KAAK,IACtB,KAAK,IAAI,KAAK,MAAM,MAAM,GAAG,CAAC,GAC9B,oBACF;EACA,IAAI,OACF,MAAM,QAAQ,OAAO,UAAU;EAGjC,IAAI;GACF,MAAM,iBAAiB,KAAK,cAAc,KAAK,IAAI,UAAU;GAC7D,YAAY,4BAA4B,GAAI;EAC9C,SAAS,KAAK;GACZ,MAAM,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;GAChE,UAAU,sCAAsC,UAAU,GAAI;EAChE;CACF;;;;CAKA,MAAM,iBAAiB;EACrB,IAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,IAC9B;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAMF,MAAM,QAHQ,KAAK,cACjB,uCAEgB,CAAC,EAAE,OAAO,KAAK,KAAK;EAEtC,IAAI,OACF,IAAI;GACF,MAAM,SAAS,IAAI,IAAI,KAAK;GAC5B,IAAI,OAAO,aAAa,WAAW,OAAO,aAAa,UACrD,MAAM,IAAI,MAAM,wCAAwC;EAE5D,QAAQ;GACN,YAAY,8CAA8C,IAAI;GAE9D;EACF;EAGF,IAAI;GACF,MAAM,cAAc,KAAK,cAAc,KAAK,IAAI,KAAK;GACrD,YAAY,yBAAyB,GAAI;EAC3C,SAAS,KAAK;GACZ,MAAM,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;GAChE,UAAU,mCAAmC,UAAU,GAAI;EAC7D;CACF;;;;CAKA,MAAM,iBAAiB;EACrB,IAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,IAC9B;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAMF,MAAM,WAHS,KAAK,cAClB,wCAEoB,CAAC,EAAE,SAAS;EAClC,MAAM,OACJ,aAAa,cACb,aAAa,QACb,aAAa,UACb,aAAa,SACT,WACA;EAEN,IAAI;GACF,MAAM,cAAc,KAAK,cAAc,KAAK,IAAI,IAAI;GACpD,YAAY,yBAAyB,GAAI;EAC3C,SAAS,KAAK;GACZ,MAAM,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;GAChE,UAAU,8BAA8B,UAAU,GAAI;EACxD;CACF;;;;CAKA,MAAM,wBAAwB;EAC5B,IAAI,CAAC,KAAK,gBAAgB,CAAC,KAAK,IAC9B;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,QAAQ,KAAK,cACjB,+CACF;EACA,MAAM,QAAQ,OAAO,OAAO,KAAK,KAAK;EAEtC,IAAI,OACF,IAAI;GACF,MAAM,SAAS,IAAI,IAAI,KAAK;GAC5B,IAAI,OAAO,aAAa,SAAS,OAAO,aAAa,QACnD,MAAM,IAAI,MAAM,oCAAoC;EAExD,QAAQ;GACN,YAAY,kDAAkD,IAAI;GAElE;EACF;EAGF,IAAI,OACF,MAAM,QAAQ;EAGhB,IAAI;GACF,MAAM,qBAAqB,KAAK,cAAc,KAAK,IAAI,KAAK;GAC5D,YAAY,yBAAyB,GAAI;EAC3C,SAAS,KAAK;GACZ,MAAM,WAAW,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;GAChE,UAAU,mCAAmC,UAAU,GAAI;EAC7D;CACF;AACF;AAEA,IAAI,CAAC,eAAe,IAAI,WAAW,GACjC,eAAe,OAAO,aAAa,eAAe"}