shadow-claw 1.59.6 → 1.60.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/.well-known/mcp/server-card.json +1 -1
  2. package/.well-known/mcp.json +1 -1
  3. package/README.md +6 -2
  4. package/dist/cli/build/build.js +1 -1
  5. package/dist/cli/chunk-3C5izdQW.js +1 -0
  6. package/dist/cli/chunk-B-75h9gX.js +1 -0
  7. package/dist/cli/{chunk-C9o6lXP3.js → chunk-B7Kn-otm.js} +1 -1
  8. package/dist/cli/{chunk-YX32FcN7.js → chunk-BBczgswQ.js} +1 -1
  9. package/dist/cli/{chunk-DcNxjqH6.js → chunk-BE-lYWcn.js} +1 -1
  10. package/dist/cli/{chunk-DJqHK-qS.js → chunk-BECr0WxI.js} +11 -11
  11. package/dist/cli/chunk-BEz1PD1_.js +1 -0
  12. package/dist/cli/chunk-BLzI1Fp2.js +1 -0
  13. package/dist/cli/{chunk-yiVdvGCJ.js → chunk-BVSC1MNQ.js} +11 -11
  14. package/dist/cli/{chunk-CX2itile.js → chunk-BdWcep6o.js} +1 -1
  15. package/dist/cli/{chunk-DLde6nuO.js → chunk-BfTpnSS4.js} +1 -1
  16. package/dist/cli/{chunk-D2_eAO83.js → chunk-BgvqTf7w.js} +1 -1
  17. package/dist/cli/chunk-BwsJfUT3.js +1 -0
  18. package/dist/cli/{chunk--PFY91kE.js → chunk-C9b4b7c_.js} +1 -1
  19. package/dist/cli/{chunk-D3y7h9Xe.js → chunk-CAw9XYFe.js} +1 -1
  20. package/dist/cli/chunk-CFCcbFs2.js +396 -0
  21. package/dist/cli/{chunk-Cnjb8Usu.js → chunk-CTarF4FC.js} +1 -1
  22. package/dist/cli/{chunk-DM4xsTry.js → chunk-Cbq5hpjb.js} +4 -4
  23. package/dist/cli/chunk-CjTjKy_v.js +310 -0
  24. package/dist/cli/chunk-Cjyu4cr_.js +36 -0
  25. package/dist/cli/{chunk-DUGZPka_.js → chunk-ClMKygjZ.js} +1 -1
  26. package/dist/cli/chunk-Cppnq1KF.js +1 -0
  27. package/dist/cli/{chunk-DvemF16v.js → chunk-D9QCNFMO.js} +1 -1
  28. package/dist/cli/chunk-DB21BMqt.js +7 -0
  29. package/dist/cli/{chunk-_Vo-o_e3.js → chunk-DHoIWvCc.js} +1 -1
  30. package/dist/cli/chunk-DZEN9T5y.js +1 -0
  31. package/dist/cli/{chunk-5rLO4DWS.js → chunk-Dl14OyYO.js} +9 -9
  32. package/dist/cli/chunk-Dl_vv0dI.js +1 -0
  33. package/dist/cli/chunk-Dpmfhlyl.js +1 -0
  34. package/dist/cli/{chunk-BrR1DOBS.js → chunk-Du7Xtucq.js} +1 -1
  35. package/dist/cli/{chunk-Bc_weULz.js → chunk-DxcDFUi_.js} +1 -1
  36. package/dist/cli/{chunk-Dt7-hzJU.js → chunk-DyyEWbV7.js} +1 -1
  37. package/dist/cli/chunk-N0x3mXU0.js +1 -0
  38. package/dist/cli/{chunk-CGoE4llV.js → chunk-V-w0Bata.js} +1 -1
  39. package/dist/cli/{chunk-C8DBACtx.js → chunk-ZxDxSSn-.js} +1 -1
  40. package/dist/cli/chunk-lPvFUkd5.js +7 -0
  41. package/dist/cli/{chunk-Ctg5L55n.js → chunk-n5s-sCdU.js} +1 -1
  42. package/dist/cli/{chunk-Dw8GndPD.js → chunk-nD9VPVMq.js} +1 -1
  43. package/dist/cli/{chunk-Cq_kQohv.js → chunk-rFuy8aS_.js} +1 -1
  44. package/dist/cli/{chunk-Bq38OubR.js → chunk-wjM6JXWa.js} +1 -1
  45. package/dist/cli/{chunk-3wTukVof.js → chunk-zcES9rut.js} +1 -1
  46. package/dist/cli/cli.js +3 -3
  47. package/dist/headless-agent.js +2 -2
  48. package/dist/lib/{app-routes-DJdIjp2V.js → app-routes-BXiRvlNl.js} +7 -25
  49. package/dist/lib/{app-routes-DJdIjp2V.js.map → app-routes-BXiRvlNl.js.map} +1 -1
  50. package/dist/lib/{attachment-capabilities-Dbb-4ZP5.js → attachment-capabilities-BjkEPip8.js} +2 -2
  51. package/dist/lib/{attachment-capabilities-Dbb-4ZP5.js.map → attachment-capabilities-BjkEPip8.js.map} +1 -1
  52. package/dist/lib/{channel-Dlru5ofR.js → channel-DB77spML.js} +3 -3
  53. package/dist/lib/{channel-Dlru5ofR.js.map → channel-DB77spML.js.map} +1 -1
  54. package/dist/lib/{chat-template-BuuLY8l7.js → chat-template-DPEKGJhB.js} +2 -2
  55. package/dist/lib/{chat-template-BuuLY8l7.js.map → chat-template-DPEKGJhB.js.map} +1 -1
  56. package/dist/lib/{compact-context-BtR55YPU.js → compact-context-Q9t9aL1e.js} +19 -19
  57. package/dist/lib/{compact-context-BtR55YPU.js.map → compact-context-Q9t9aL1e.js.map} +1 -1
  58. package/dist/lib/components/common/shadow-claw-provider-model-picker.js +1 -1
  59. package/dist/lib/components/index.js +27 -27
  60. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  61. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  62. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  63. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  64. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  65. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  66. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  67. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  68. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  69. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  70. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  71. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  72. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  73. package/dist/lib/components/shadow-claw-a2ui.js +1 -1
  74. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  75. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  76. package/dist/lib/components/shadow-claw-channels.js +1 -1
  77. package/dist/lib/components/shadow-claw-chat.js +1 -1
  78. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  79. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  80. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  81. package/dist/lib/components/shadow-claw-files.js +1 -1
  82. package/dist/lib/components/shadow-claw-git.js +1 -1
  83. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  84. package/dist/lib/components/shadow-claw-llm.js +1 -1
  85. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  86. package/dist/lib/components/shadow-claw-networking.js +1 -1
  87. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  88. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  89. package/dist/lib/components/shadow-claw-pages.js +1 -1
  90. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  91. package/dist/lib/components/shadow-claw-provider-model-picker.js +1 -1
  92. package/dist/lib/components/shadow-claw-settings.js +1 -1
  93. package/dist/lib/components/shadow-claw-storage.js +1 -1
  94. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  95. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  96. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  97. package/dist/lib/components/shadow-claw-tools.js +1 -1
  98. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  99. package/dist/lib/components/shadow-claw.js +1 -1
  100. package/dist/lib/{config-DxNI3TlW.js → config-BrHR97zt.js} +2 -2
  101. package/dist/lib/{config-DxNI3TlW.js.map → config-BrHR97zt.js.map} +1 -1
  102. package/dist/lib/{configure-peer-js-ChDhOZU4.js → configure-peer-js-CgFiwoxY.js} +3 -3
  103. package/dist/lib/{configure-peer-js-ChDhOZU4.js.map → configure-peer-js-CgFiwoxY.js.map} +1 -1
  104. package/dist/lib/{connections-DC4NZkJE.js → connections-C1FWsBsE.js} +2 -2
  105. package/dist/lib/{connections-DC4NZkJE.js.map → connections-C1FWsBsE.js.map} +1 -1
  106. package/dist/lib/content/build-attachment-content-blocks.d.ts +2 -0
  107. package/dist/lib/{credentials-5vpz0XPk.js → credentials-CZbngHXW.js} +2 -2
  108. package/dist/lib/{credentials-5vpz0XPk.js.map → credentials-CZbngHXW.js.map} +1 -1
  109. package/dist/lib/{discover-skills-CD0sKvAI.js → discover-skills-CXyaWHKi.js} +13 -13
  110. package/dist/lib/{discover-skills-CD0sKvAI.js.map → discover-skills-CXyaWHKi.js.map} +1 -1
  111. package/dist/lib/{download-group-file-Dk3qaxhJ.js → download-group-file-D0wgg10Q.js} +2 -2
  112. package/dist/lib/{download-group-file-Dk3qaxhJ.js.map → download-group-file-D0wgg10Q.js.map} +1 -1
  113. package/dist/lib/{file-viewer-B4pRW-_G.js → file-viewer-DOfvX6yy.js} +5 -5
  114. package/dist/lib/{file-viewer-B4pRW-_G.js.map → file-viewer-DOfvX6yy.js.map} +1 -1
  115. package/dist/lib/{get-or-create-subscriber-id-HCcgDEPz.js → get-or-create-subscriber-id-wyzaML7Z.js} +2 -2
  116. package/dist/lib/{get-or-create-subscriber-id-HCcgDEPz.js.map → get-or-create-subscriber-id-wyzaML7Z.js.map} +1 -1
  117. package/dist/lib/{git-B3Q1euc5.js → git-CogDRlEz.js} +5 -5
  118. package/dist/lib/{git-B3Q1euc5.js.map → git-CogDRlEz.js.map} +1 -1
  119. package/dist/lib/{iframe-bridge-scripts-D8iuFhUk.js → iframe-bridge-scripts-Dx825LLG.js} +2 -2
  120. package/dist/lib/{iframe-bridge-scripts-D8iuFhUk.js.map → iframe-bridge-scripts-Dx825LLG.js.map} +1 -1
  121. package/dist/lib/index.js +28 -28
  122. package/dist/lib/{init-chat-split-resize-B0ODULx9.js → init-chat-split-resize-Cc0bd2z9.js} +2 -2
  123. package/dist/lib/{init-chat-split-resize-B0ODULx9.js.map → init-chat-split-resize-Cc0bd2z9.js.map} +1 -1
  124. package/dist/lib/{init-control-plane-C1FRRmjC.js → init-control-plane-CEGdzgWX.js} +15 -15
  125. package/dist/lib/{init-control-plane-C1FRRmjC.js.map → init-control-plane-CEGdzgWX.js.map} +1 -1
  126. package/dist/lib/{invoke-agent-CzN7sVh-.js → invoke-agent-cac3gCsj.js} +11 -11
  127. package/dist/lib/{invoke-agent-CzN7sVh-.js.map → invoke-agent-cac3gCsj.js.map} +1 -1
  128. package/dist/lib/{markdown-mbNo7cV3.js → markdown--6vTAPEH.js} +2 -2
  129. package/dist/lib/{markdown-mbNo7cV3.js.map → markdown--6vTAPEH.js.map} +1 -1
  130. package/dist/lib/{mcp-reconnect-3T7yWGEY.js → mcp-reconnect-BeqQvNWO.js} +3 -3
  131. package/dist/lib/{mcp-reconnect-3T7yWGEY.js.map → mcp-reconnect-BeqQvNWO.js.map} +1 -1
  132. package/dist/lib/{model-ranking-DGNSWYwN.js → model-ranking-BhsJV7vb.js} +2 -2
  133. package/dist/lib/{model-ranking-DGNSWYwN.js.map → model-ranking-BhsJV7vb.js.map} +1 -1
  134. package/dist/lib/{move-group-entry-NMTJ59M9.js → move-group-entry-D8dptMg0.js} +5 -5
  135. package/dist/lib/{move-group-entry-NMTJ59M9.js.map → move-group-entry-D8dptMg0.js.map} +1 -1
  136. package/dist/lib/{orchestrator-B8FV1V7x.js → orchestrator-BBAwy9Nm.js} +24 -24
  137. package/dist/lib/{orchestrator-B8FV1V7x.js.map → orchestrator-BBAwy9Nm.js.map} +1 -1
  138. package/dist/lib/{orchestrator-i_QJ-o22.js → orchestrator-cRBe3lhq.js} +11 -11
  139. package/dist/lib/orchestrator-cRBe3lhq.js.map +1 -0
  140. package/dist/lib/{parse-path-DPCn-HwI.js → parse-path-BOHQP_IQ.js} +3 -3
  141. package/dist/lib/{parse-path-DPCn-HwI.js.map → parse-path-BOHQP_IQ.js.map} +1 -1
  142. package/dist/lib/{peerjs-z5zeioPV.js → peerjs-BLg8aGUj.js} +8 -8
  143. package/dist/lib/{peerjs-z5zeioPV.js.map → peerjs-BLg8aGUj.js.map} +1 -1
  144. package/dist/lib/{process-peer-query-param-CJp7w7AU.js → process-peer-query-param-BnsVnxzH.js} +5 -5
  145. package/dist/lib/{process-peer-query-param-CJp7w7AU.js.map → process-peer-query-param-BnsVnxzH.js.map} +1 -1
  146. package/dist/lib/{process-pending-shared-payloads-B6_TlBFA.js → process-pending-shared-payloads-DBZfZOOa.js} +4 -4
  147. package/dist/lib/{process-pending-shared-payloads-B6_TlBFA.js.map → process-pending-shared-payloads-DBZfZOOa.js.map} +1 -1
  148. package/dist/lib/{process-room-query-param-C3FFGGn6.js → process-room-query-param-B8EYg_-r.js} +4 -4
  149. package/dist/lib/{process-room-query-param-C3FFGGn6.js.map → process-room-query-param-B8EYg_-r.js.map} +1 -1
  150. package/dist/lib/{provider-DcQZypu5.js → provider-BC9KPI14.js} +3 -3
  151. package/dist/lib/{provider-DcQZypu5.js.map → provider-BC9KPI14.js.map} +1 -1
  152. package/dist/lib/{push-client-Cx5rMs6J.js → push-client-CAm6UMvE.js} +5 -5
  153. package/dist/lib/{push-client-Cx5rMs6J.js.map → push-client-CAm6UMvE.js.map} +1 -1
  154. package/dist/lib/{read-group-file-bytes-CXOG_YyM.js → read-group-file-bytes-UQIk1eJG.js} +2 -2
  155. package/dist/lib/{read-group-file-bytes-CXOG_YyM.js.map → read-group-file-bytes-UQIk1eJG.js.map} +1 -1
  156. package/dist/lib/{rooms-CwlkYLDU.js → rooms-Dzphx3rK.js} +2 -2
  157. package/dist/lib/{rooms-CwlkYLDU.js.map → rooms-Dzphx3rK.js.map} +1 -1
  158. package/dist/lib/{shadow-claw-DoQ7fgl5.js → shadow-claw-CGl8tXtG.js} +17 -20
  159. package/dist/lib/shadow-claw-CGl8tXtG.js.map +1 -0
  160. package/dist/lib/{shadow-claw-a2ui-Br6qJMs1.js → shadow-claw-a2ui-lG0vQbW8.js} +2 -2
  161. package/dist/lib/{shadow-claw-a2ui-Br6qJMs1.js.map → shadow-claw-a2ui-lG0vQbW8.js.map} +1 -1
  162. package/dist/lib/{shadow-claw-accounts-BTDILfWw.js → shadow-claw-accounts-CkqyCxwp.js} +3 -3
  163. package/dist/lib/{shadow-claw-accounts-BTDILfWw.js.map → shadow-claw-accounts-CkqyCxwp.js.map} +1 -1
  164. package/dist/lib/{shadow-claw-channel-config-IKiL34tI.js → shadow-claw-channel-config-BNIWCdsL.js} +4 -4
  165. package/dist/lib/{shadow-claw-channel-config-IKiL34tI.js.map → shadow-claw-channel-config-BNIWCdsL.js.map} +1 -1
  166. package/dist/lib/{shadow-claw-channels-JgEzuHWK.js → shadow-claw-channels-C2QSn4Ew.js} +3 -3
  167. package/dist/lib/{shadow-claw-channels-JgEzuHWK.js.map → shadow-claw-channels-C2QSn4Ew.js.map} +1 -1
  168. package/dist/lib/{shadow-claw-chat-SGUDT31r.js → shadow-claw-chat-Wx3y9y6c.js} +15 -15
  169. package/dist/lib/{shadow-claw-chat-SGUDT31r.js.map → shadow-claw-chat-Wx3y9y6c.js.map} +1 -1
  170. package/dist/lib/{shadow-claw-control-plane-CRWFZ3vD.js → shadow-claw-control-plane-D5E4cFGu.js} +7 -7
  171. package/dist/lib/{shadow-claw-control-plane-CRWFZ3vD.js.map → shadow-claw-control-plane-D5E4cFGu.js.map} +1 -1
  172. package/dist/lib/{shadow-claw-conversations-D23GJ7qo.js → shadow-claw-conversations-BtDv7GRW.js} +7 -7
  173. package/dist/lib/{shadow-claw-conversations-D23GJ7qo.js.map → shadow-claw-conversations-BtDv7GRW.js.map} +1 -1
  174. package/dist/lib/{shadow-claw-file-viewer-C1V8WTiU.js → shadow-claw-file-viewer-CG40kwWV.js} +10 -10
  175. package/dist/lib/{shadow-claw-file-viewer-C1V8WTiU.js.map → shadow-claw-file-viewer-CG40kwWV.js.map} +1 -1
  176. package/dist/lib/{shadow-claw-files-DN7irmE1.js → shadow-claw-files-BOUULrlX.js} +11 -11
  177. package/dist/lib/{shadow-claw-files-DN7irmE1.js.map → shadow-claw-files-BOUULrlX.js.map} +1 -1
  178. package/dist/lib/{shadow-claw-git-D-1oIh65.js → shadow-claw-git-BeHV73_9.js} +6 -6
  179. package/dist/lib/{shadow-claw-git-D-1oIh65.js.map → shadow-claw-git-BeHV73_9.js.map} +1 -1
  180. package/dist/lib/{shadow-claw-integrations-CZjnm7cM.js → shadow-claw-integrations-RZZ-m-Id.js} +4 -4
  181. package/dist/lib/{shadow-claw-integrations-CZjnm7cM.js.map → shadow-claw-integrations-RZZ-m-Id.js.map} +1 -1
  182. package/dist/lib/{shadow-claw-llm-4Gefh5FN.js → shadow-claw-llm-KONyWKZM.js} +9 -9
  183. package/dist/lib/{shadow-claw-llm-4Gefh5FN.js.map → shadow-claw-llm-KONyWKZM.js.map} +1 -1
  184. package/dist/lib/{shadow-claw-mcp-remote-B9ssb3YV.js → shadow-claw-mcp-remote-BKFROurv.js} +4 -4
  185. package/dist/lib/{shadow-claw-mcp-remote-B9ssb3YV.js.map → shadow-claw-mcp-remote-BKFROurv.js.map} +1 -1
  186. package/dist/lib/{shadow-claw-networking-BN5BB4hb.js → shadow-claw-networking-Diy3JJkc.js} +2 -2
  187. package/dist/lib/{shadow-claw-networking-BN5BB4hb.js.map → shadow-claw-networking-Diy3JJkc.js.map} +1 -1
  188. package/dist/lib/{shadow-claw-notifications-71KARtkY.js → shadow-claw-notifications-C-upPa-4.js} +3 -3
  189. package/dist/lib/{shadow-claw-notifications-71KARtkY.js.map → shadow-claw-notifications-C-upPa-4.js.map} +1 -1
  190. package/dist/lib/{shadow-claw-page-header-DMGO-TSe.js → shadow-claw-page-header-C_Qr3xZM.js} +2 -2
  191. package/dist/lib/{shadow-claw-page-header-DMGO-TSe.js.map → shadow-claw-page-header-C_Qr3xZM.js.map} +1 -1
  192. package/dist/lib/{shadow-claw-pages-BiRM6qiA.js → shadow-claw-pages-CfAjUKgd.js} +11 -11
  193. package/dist/lib/{shadow-claw-pages-BiRM6qiA.js.map → shadow-claw-pages-CfAjUKgd.js.map} +1 -1
  194. package/dist/lib/{shadow-claw-peerjs-BZu7jNSe.js → shadow-claw-peerjs-t4YibS9s.js} +6 -6
  195. package/dist/lib/{shadow-claw-peerjs-BZu7jNSe.js.map → shadow-claw-peerjs-t4YibS9s.js.map} +1 -1
  196. package/dist/lib/{shadow-claw-provider-model-picker-BXYXEobD.js → shadow-claw-provider-model-picker-B-Ct4yW-.js} +2 -2
  197. package/dist/lib/{shadow-claw-provider-model-picker-BXYXEobD.js.map → shadow-claw-provider-model-picker-B-Ct4yW-.js.map} +1 -1
  198. package/dist/lib/{shadow-claw-settings-CcT5EK08.js → shadow-claw-settings-Cg5V0e9g.js} +7 -7
  199. package/dist/lib/{shadow-claw-settings-CcT5EK08.js.map → shadow-claw-settings-Cg5V0e9g.js.map} +1 -1
  200. package/dist/lib/{shadow-claw-storage-eTOpbvpi.js → shadow-claw-storage-C7tCnsSG.js} +5 -5
  201. package/dist/lib/{shadow-claw-storage-eTOpbvpi.js.map → shadow-claw-storage-C7tCnsSG.js.map} +1 -1
  202. package/dist/lib/{shadow-claw-task-server-DFImTUbw.js → shadow-claw-task-server-BObsRdf8.js} +2 -2
  203. package/dist/lib/{shadow-claw-task-server-DFImTUbw.js.map → shadow-claw-task-server-BObsRdf8.js.map} +1 -1
  204. package/dist/lib/{shadow-claw-tasks-BjaxsmUx.js → shadow-claw-tasks-B2EEqrcY.js} +9 -9
  205. package/dist/lib/{shadow-claw-tasks-BjaxsmUx.js.map → shadow-claw-tasks-B2EEqrcY.js.map} +1 -1
  206. package/dist/lib/{shadow-claw-terminal-C-4wreFe.js → shadow-claw-terminal-DSHfO2b9.js} +2 -2
  207. package/dist/lib/{shadow-claw-terminal-C-4wreFe.js.map → shadow-claw-terminal-DSHfO2b9.js.map} +1 -1
  208. package/dist/lib/{shadow-claw-tools-COdrGZJk.js → shadow-claw-tools-DwPBADua.js} +7 -7
  209. package/dist/lib/{shadow-claw-tools-COdrGZJk.js.map → shadow-claw-tools-DwPBADua.js.map} +1 -1
  210. package/dist/lib/{shadow-claw-webvm-sxqVjO0L.js → shadow-claw-webvm-CY4qGaMB.js} +3 -3
  211. package/dist/lib/{shadow-claw-webvm-sxqVjO0L.js.map → shadow-claw-webvm-CY4qGaMB.js.map} +1 -1
  212. package/dist/lib/{sync-web-mcp-registration-D4hdUwtv.js → sync-web-mcp-registration-BiOZvW-R.js} +6 -6
  213. package/dist/lib/{sync-web-mcp-registration-D4hdUwtv.js.map → sync-web-mcp-registration-BiOZvW-R.js.map} +1 -1
  214. package/dist/lib/{system-prompt-DT_KeYaL.js → system-prompt-CxJ3Nx4c.js} +9 -8
  215. package/dist/lib/system-prompt-CxJ3Nx4c.js.map +1 -0
  216. package/dist/lib/{tools-Beuyh8y1.js → tools-B8OJ4sMF.js} +4 -4
  217. package/dist/lib/{tools-Beuyh8y1.js.map → tools-B8OJ4sMF.js.map} +1 -1
  218. package/dist/lib/{transformers-DydnReu4.js → transformers-BMURofG6.js} +2 -2
  219. package/dist/lib/{transformers-DydnReu4.js.map → transformers-BMURofG6.js.map} +1 -1
  220. package/dist/lib/{trusted-types-CfwZl_rr.js → trusted-types-HwsGS5Nj.js} +19 -17
  221. package/dist/lib/{trusted-types-CfwZl_rr.js.map → trusted-types-HwsGS5Nj.js.map} +1 -1
  222. package/dist/lib/{upload-group-file-BbBzjTcN.js → upload-group-file-CJpoNjEb.js} +3 -3
  223. package/dist/lib/{upload-group-file-BbBzjTcN.js.map → upload-group-file-CJpoNjEb.js.map} +1 -1
  224. package/dist/lib/utils/index.js +1 -1
  225. package/dist/lib/utils/namespaced-storage.js +1 -1
  226. package/dist/lib/utils/runtime-assets.js +1 -1
  227. package/dist/lib/utils/utils.js +1 -1
  228. package/dist/lib/{webmcp-DCfAFiIO.js → webmcp-BoMTvgmX.js} +3 -3
  229. package/dist/lib/{webmcp-DCfAFiIO.js.map → webmcp-BoMTvgmX.js.map} +1 -1
  230. package/dist/lib/{write-group-file-bytes-Ccn-VFUU.js → write-group-file-bytes-CNT7DqOZ.js} +3 -3
  231. package/dist/lib/{write-group-file-bytes-Ccn-VFUU.js.map → write-group-file-bytes-CNT7DqOZ.js.map} +1 -1
  232. package/dist/public/.well-known/mcp/server-card.json +1 -1
  233. package/dist/public/.well-known/mcp.json +1 -1
  234. package/dist/public/AGENTS.md +3 -1
  235. package/dist/public/README.md +6 -2
  236. package/dist/public/agent.worker.js +1 -1
  237. package/dist/public/attachment-capabilities-AdwXt3--.js +1 -0
  238. package/dist/public/{channel-BylT3rJC.js → channel-DIpDQekL.js} +1 -1
  239. package/dist/public/{chat-template-DPHJy7tr.js → chat-template-CXKs8lFR.js} +1 -1
  240. package/dist/public/compact-context-BQ2ZXoAc.js +5 -0
  241. package/dist/public/{compact-context-BINQh64w.js → compact-context-dHitmPsV.js} +2 -2
  242. package/dist/public/config-C16fFWtP.js +1 -0
  243. package/dist/public/{configure-peer-js-DChhcOfe.js → configure-peer-js-DV1rqvFX.js} +1 -1
  244. package/dist/public/{connections-CHaw0VqP.js → connections-Dxwj8yK_.js} +1 -1
  245. package/dist/public/{create-model-cache-fetch-DQebkoPL.js → create-model-cache-fetch-B0mSCEk6.js} +1 -1
  246. package/dist/public/{credentials-CgVqS119.js → credentials-CJUQ5Ep2.js} +1 -1
  247. package/dist/public/{custom-element-security-kiDhPfb8.js → custom-element-security-B2daIE5r.js} +2 -2
  248. package/dist/public/{discover-skills-Cvmx5I9V.js → discover-skills-BWJB8HUA.js} +6 -6
  249. package/dist/public/docs/architecture/overview.md +1 -1
  250. package/dist/public/docs/example/article/index.html +29 -30
  251. package/dist/public/docs/example/article.html +29 -30
  252. package/dist/public/docs/publishing/index.html +29 -30
  253. package/dist/public/docs/publishing.html +29 -30
  254. package/dist/public/docs/skill-creator/index.html +29 -30
  255. package/dist/public/docs/skill-creator.html +29 -30
  256. package/dist/public/docs/subsystems/attachment-capabilities.md +14 -1
  257. package/dist/public/docs/subsystems/cli.md +95 -51
  258. package/dist/public/docs/subsystems/pages.md +5 -0
  259. package/dist/public/{download-group-file-BapoRgfU.js → download-group-file-BkMH-JKi.js} +1 -1
  260. package/dist/public/e2e/README.md +1 -1
  261. package/dist/public/{e2e-bridge-C0g8vZKr.js → e2e-bridge-lP2qqiv3.js} +1 -1
  262. package/dist/public/get-group-dir-D--BiEyk.js +1 -0
  263. package/dist/public/{get-or-create-subscriber-id-GvRZYXwA.js → get-or-create-subscriber-id-jVHnQfbr.js} +1 -1
  264. package/dist/public/{git-CaAAZfVd.js → git-DjmQ16rm.js} +2 -2
  265. package/dist/public/{iframe-bridge-scripts-BnqtKhE4.js → iframe-bridge-scripts-CO0izGjW.js} +1 -1
  266. package/dist/public/index.html +29 -30
  267. package/dist/public/index.js +1 -1
  268. package/dist/public/{init-chat-split-resize-Btonoy8u.js → init-chat-split-resize-C8AqCCiK.js} +1 -1
  269. package/dist/public/init-control-plane-Ctz7FI8M.js +1 -0
  270. package/dist/public/{invoke-agent-B3Osw6K7.js → invoke-agent-C_geruwq.js} +1 -1
  271. package/dist/public/llms.txt +1 -1
  272. package/dist/public/main/index.html +29 -30
  273. package/dist/public/main/memory/index.html +29 -30
  274. package/dist/public/main/memory.html +29 -30
  275. package/dist/public/main.html +29 -30
  276. package/dist/public/{markdown-CPbU4r1U.js → markdown-CDSb5Hrl.js} +1 -1
  277. package/dist/public/{mcp-reconnect-CzROVsXG.js → mcp-reconnect-iPZPihwX.js} +1 -1
  278. package/dist/public/{memory-storage-BkoMlxOr.js → memory-storage-2m7KZ-aP.js} +1 -1
  279. package/dist/public/{model-ranking-CK0iBo3Z.js → model-ranking-BgOSaNIy.js} +1 -1
  280. package/dist/public/{move-group-entry-CTxoq7lw.js → move-group-entry-QQ9Hkk54.js} +1 -1
  281. package/dist/public/{orchestrator-BrDjQbGf.js → orchestrator-C1kaTltu.js} +2 -2
  282. package/dist/public/orchestrator-Li1UAsv7.js +63 -0
  283. package/dist/public/{peerjs-CgF4Iz5W.js → peerjs-DbBryE-9.js} +1 -1
  284. package/dist/public/{process-peer-query-param-BL2k0Hu-.js → process-peer-query-param-DQIgr3KL.js} +1 -1
  285. package/dist/public/{process-pending-shared-payloads-C1AgGvn8.js → process-pending-shared-payloads-Ctb-TFqB.js} +1 -1
  286. package/dist/public/{process-room-query-param-DM0QCq3_.js → process-room-query-param-F-XnIVoZ.js} +1 -1
  287. package/dist/public/provider-YPZmsuHR.js +1 -0
  288. package/dist/public/{push-client-DJEOz7bi.js → push-client-DRx9Eggz.js} +1 -1
  289. package/dist/public/{rooms-C6LXIJl4.js → rooms-BurBI7is.js} +1 -1
  290. package/dist/public/service-worker/init.js +1 -1
  291. package/dist/public/service-worker.js +1 -1
  292. package/dist/public/shadow-claw-Bg9AQ5x_.js +1176 -0
  293. package/dist/public/{shadow-claw-accounts--4hd_oCz.js → shadow-claw-accounts-B3mjYI0M.js} +1 -1
  294. package/dist/public/{shadow-claw-card-IbNlZAdK.js → shadow-claw-card-tcXRS1GF.js} +1 -1
  295. package/dist/public/{shadow-claw-channels-Vq_pPGa2.js → shadow-claw-channels-BiSfLvWv.js} +1 -1
  296. package/dist/public/{shadow-claw-chat-D7_GS25e.js → shadow-claw-chat-N5jMsXZZ.js} +3 -3
  297. package/dist/public/{shadow-claw-control-plane-WTMEV8_p.js → shadow-claw-control-plane-DFVe_Xdq.js} +2 -2
  298. package/dist/public/{shadow-claw-conversations-CLQgU1IT.js → shadow-claw-conversations-wAR06_ya.js} +1 -1
  299. package/dist/public/{shadow-claw-empty-state-D4CrFGsN.js → shadow-claw-empty-state-CnPm3NVM.js} +1 -1
  300. package/dist/public/{shadow-claw-file-viewer-BhqiqLWQ.js → shadow-claw-file-viewer-sZN_FCDW.js} +4 -4
  301. package/dist/public/{shadow-claw-files-senDiG9l.js → shadow-claw-files-CnvkCbd4.js} +2 -2
  302. package/dist/public/{shadow-claw-git-DOOCqY23.js → shadow-claw-git-BBHfClGk.js} +2 -2
  303. package/dist/public/{shadow-claw-integrations-Bsvc3Agq.js → shadow-claw-integrations-DvdBqzRJ.js} +1 -1
  304. package/dist/public/{shadow-claw-llm-actYICAk.js → shadow-claw-llm-YfohG519.js} +2 -2
  305. package/dist/public/{shadow-claw-mcp-remote-BYUgrK3v.js → shadow-claw-mcp-remote-BAVbf5pi.js} +1 -1
  306. package/dist/public/{shadow-claw-networking-Dk3p5Ny_.js → shadow-claw-networking-CZ4LWPW7.js} +1 -1
  307. package/dist/public/{shadow-claw-notifications-CzPAlay8.js → shadow-claw-notifications-BHwyREkG.js} +1 -1
  308. package/dist/public/{shadow-claw-page-header-CjJpVkyL.js → shadow-claw-page-header-De6Qf6eY.js} +1 -1
  309. package/dist/public/{shadow-claw-page-header-action-button-2DH5O1TD.js → shadow-claw-page-header-action-button-FSOhTc9z.js} +1 -1
  310. package/dist/public/{shadow-claw-pages-3r5I-wI8.js → shadow-claw-pages-D_oPyDca.js} +6 -6
  311. package/dist/public/{shadow-claw-pdf-viewer-BiCEwsoY.js → shadow-claw-pdf-viewer-CrU4wqRq.js} +1 -1
  312. package/dist/public/{shadow-claw-settings-DgB9RSZN.js → shadow-claw-settings-DkUhvxVr.js} +2 -2
  313. package/dist/public/{shadow-claw-storage-JB_43nd8.js → shadow-claw-storage-D0o56Tjw.js} +1 -1
  314. package/dist/public/{shadow-claw-task-server-oi5UIxdA.js → shadow-claw-task-server-4rkroO9K.js} +1 -1
  315. package/dist/public/{shadow-claw-tasks-CnyiOt81.js → shadow-claw-tasks-BdP7lmvu.js} +3 -3
  316. package/dist/public/{shadow-claw-terminal-BC3RynHt.js → shadow-claw-terminal-DVHX7Fsu.js} +1 -1
  317. package/dist/public/{shadow-claw-toast-YjG--2Za.js → shadow-claw-toast-B9Y9tSkW.js} +1 -1
  318. package/dist/public/{shadow-claw-tools-Bbwk4vlT.js → shadow-claw-tools-BwwY53Lr.js} +1 -1
  319. package/dist/public/{shadow-claw-webvm-HZqzl2H5.js → shadow-claw-webvm-CXGdkCNM.js} +1 -1
  320. package/dist/public/{sync-web-mcp-registration-BaH2nAP0.js → sync-web-mcp-registration-DVK_IhXZ.js} +1 -1
  321. package/dist/public/{system-prompt-Dck3N8T0.js → system-prompt-BmswoQwF.js} +2 -2
  322. package/dist/public/{tools-DHA1dK2I.js → tools-D-52Zmfc.js} +1 -1
  323. package/dist/public/{transformers-C-DuTM2K.js → transformers-CQ9ss9rD.js} +1 -1
  324. package/dist/public/{upload-group-file-Cejr3zo1.js → upload-group-file-A8kB7lvO.js} +1 -1
  325. package/dist/public/{webmcp-CMRtu57-.js → webmcp-DIUZjVF5.js} +1 -1
  326. package/dist/public/{workbox-92eae37e.js → workbox-e4022e15.js} +1 -1
  327. package/dist/public/{write-group-file-CmJuVQNO.js → write-group-file-R67DjJ-q.js} +1 -1
  328. package/dist/public/{write-group-file-bytes-Cejr3zo1.js → write-group-file-bytes-A8kB7lvO.js} +1 -1
  329. package/dist/public/{zip-reader-CuQ13eLe.js → zip-reader-JHoTbATw.js} +1 -1
  330. package/dist/server.js +6 -6
  331. package/package.json +1 -1
  332. package/dist/cli/chunk-2gZFafgY.js +0 -1
  333. package/dist/cli/chunk-BFziiMKt.js +0 -7
  334. package/dist/cli/chunk-BM3llsxb.js +0 -1
  335. package/dist/cli/chunk-BUNoeMKY.js +0 -36
  336. package/dist/cli/chunk-Bj5qFsDi.js +0 -7
  337. package/dist/cli/chunk-Bj95zm-y.js +0 -1
  338. package/dist/cli/chunk-BpyP-esT.js +0 -1
  339. package/dist/cli/chunk-CX696s3_.js +0 -1
  340. package/dist/cli/chunk-DRxCrCAA.js +0 -139
  341. package/dist/cli/chunk-DjbCHa0h.js +0 -1
  342. package/dist/cli/chunk-Ds5-K-9o.js +0 -1
  343. package/dist/cli/chunk-DsQhAF31.js +0 -1
  344. package/dist/cli/chunk-VM-dECyG.js +0 -1
  345. package/dist/cli/chunk-gvNsvav0.js +0 -225
  346. package/dist/cli/chunk-heu2xRw1.js +0 -1
  347. package/dist/lib/orchestrator-i_QJ-o22.js.map +0 -1
  348. package/dist/lib/shadow-claw-DoQ7fgl5.js.map +0 -1
  349. package/dist/lib/system-prompt-DT_KeYaL.js.map +0 -1
  350. package/dist/public/app-routes-V_-URXc5.js +0 -1
  351. package/dist/public/attachment-capabilities-B6ibLwQB.js +0 -1
  352. package/dist/public/compact-context-CX4H8V57.js +0 -5
  353. package/dist/public/config-C-YdSFZB.js +0 -1
  354. package/dist/public/get-group-dir-DL44kvqW.js +0 -1
  355. package/dist/public/init-control-plane-BoJijVtf.js +0 -1
  356. package/dist/public/orchestrator-CaUpEVkQ.js +0 -63
  357. package/dist/public/provider-DNIL4-Hw.js +0 -1
  358. package/dist/public/shadow-claw-DdgeYPg5.js +0 -1176
@@ -1 +1 @@
1
- {"version":3,"file":"tools-Beuyh8y1.js","names":["TOOL_NAME_PATTERN","matter"],"sources":["../../src/storage/read-group-file.ts","../../src/db/get-all-tasks.ts","../../src/storage/write-file-handle.ts","../../src/storage/group-file-exists.ts","../../src/storage/write-group-file.ts","../../src/subsystems/tools/builtin-profiles.ts","../../src/subsystems/tools/declarative.ts","../../src/subsystems/skills/parse-skill.ts","../../src/subsystems/tools/remote/discovery.ts","../../src/subsystems/tools/remote/import-artifacts.ts","../../src/stores/tools.ts"],"sourcesContent":["import { getGroupDir } from \"./get-group-dir.js\";\nimport { parsePath } from \"./parse-path.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Read a file from a group's workspace.\n */\nexport async function readGroupFile(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n): Promise<string> {\n const groupDir = await getGroupDir(db, groupId);\n const { dirs, filename } = parsePath(filePath);\n\n let dir = groupDir;\n for (const seg of dirs) {\n dir = await dir.getDirectoryHandle(seg);\n }\n\n // Re-acquire file handle and file object to force filesystem re-stat\n const fileHandle = await dir.getFileHandle(filename);\n\n try {\n const syncHandle = await (fileHandle as any).createSyncAccessHandle();\n const size = syncHandle.getSize();\n const buf = new Uint8Array(size);\n\n syncHandle.read(buf, { at: 0 });\n syncHandle.close();\n\n return new TextDecoder(\"utf-8\").decode(buf);\n } catch {\n // Not OPFS or not in a Worker — use File System Access API path\n const file = await fileHandle.getFile();\n\n return file.text();\n }\n}\n","import { txPromise } from \"./tx-promise.js\";\nimport type { ShadowClawDatabase, Task } from \"./types.js\";\n\n/**\n * Get all tasks\n */\nexport function getAllTasks(db: ShadowClawDatabase): Promise<Task[]> {\n return txPromise<any[]>(db, \"tasks\", \"readonly\", (store) =>\n store.getAll(),\n ).then((tasks) => tasks.map((t) => ({ ...t, enabled: !!t.enabled })));\n}\n","import { toTrustedScriptUrl } from \"../security/trusted-types.js\";\n\nexport type WriteContent = string | Blob | ArrayBuffer | Uint8Array;\n\n/**\n * Write data to a FileSystemFileHandle across browser implementations.\n */\nexport async function writeFileHandle(\n fileHandle: FileSystemFileHandle,\n content: WriteContent,\n): Promise<void> {\n const createWritable = fileHandle?.createWritable;\n const legacyCreateWriteable = Reflect.get(fileHandle, \"createWriteable\");\n const openWritable =\n typeof createWritable === \"function\"\n ? createWritable.bind(fileHandle)\n : typeof legacyCreateWriteable === \"function\"\n ? legacyCreateWriteable.bind(fileHandle)\n : null;\n\n if (openWritable) {\n const writable = await openWritable();\n await writable.write(toWritableChunk(content));\n await writable.close();\n\n return;\n }\n\n if (typeof (fileHandle as any).createSyncAccessHandle === \"function\") {\n const syncHandle = await (fileHandle as any).createSyncAccessHandle();\n\n try {\n const bytes = await toUint8Array(content);\n\n // Replace file content atomically when using sync handles.\n syncHandle.truncate(0);\n syncHandle.write(bytes, { at: 0 });\n if (typeof syncHandle.flush === \"function\") {\n syncHandle.flush();\n }\n } finally {\n syncHandle.close();\n }\n\n return;\n }\n\n throw new Error(\n \"Writable file streams are not supported by this browser/storage backend.\",\n );\n}\n\n/**\n * Write a file in the Origin Private File System (OPFS) by navigating to it\n * via path segments inside an inline Web Worker.\n */\nexport async function writeOpfsPathViaWorker(\n pathSegments: string[],\n content: WriteContent,\n): Promise<void> {\n if (typeof globalThis.Worker !== \"function\") {\n throw new Error(\n \"Writable file streams are not supported by this browser/storage backend.\",\n );\n }\n\n const bytes = await toUint8Array(content);\n\n return new Promise((resolve, reject) => {\n let blobUrl = \"\";\n let worker: Worker | null = null;\n\n try {\n // The worker navigates OPFS by path entirely on its own side —\n // no handle objects are transferred across the boundary.\n const src = [\n \"self.onmessage = async (e) => {\",\n \" try {\",\n \" const { pathSegments, bytes } = e.data;\",\n \" let dir = await navigator.storage.getDirectory();\",\n \" for (let i = 0; i < pathSegments.length - 1; i++) {\",\n \" dir = await dir.getDirectoryHandle(pathSegments[i], { create: true });\",\n \" }\",\n \" const filename = pathSegments[pathSegments.length - 1];\",\n \" const fh = await dir.getFileHandle(filename, { create: true });\",\n \" const h = await fh.createSyncAccessHandle();\",\n \" try {\",\n \" h.truncate(0);\",\n \" h.write(bytes, { at: 0 });\",\n \" if (typeof h.flush === 'function') h.flush();\",\n \" } finally { h.close(); }\",\n \" self.postMessage({ ok: true });\",\n \" } catch (err) {\",\n \" self.postMessage({ error: err.message || String(err) });\",\n \" }\",\n \"};\",\n ].join(\"\\n\");\n\n blobUrl = URL.createObjectURL(\n new Blob([src], { type: \"text/javascript\" }),\n );\n worker = new Worker(toTrustedScriptUrl(blobUrl) as string);\n } catch {\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n }\n\n reject(\n new Error(\n \"Writable file streams are not supported by this browser/storage backend.\",\n ),\n );\n\n return;\n }\n\n const cleanup = () => {\n if (worker) {\n worker.terminate();\n }\n\n URL.revokeObjectURL(blobUrl);\n };\n\n worker.onmessage = (e) => {\n cleanup();\n if (e.data?.error) {\n reject(new Error(e.data.error));\n } else {\n resolve();\n }\n };\n\n worker.onerror = (e) => {\n cleanup();\n reject(new Error(e.message || \"Worker file write failed\"));\n };\n\n worker.postMessage({ pathSegments, bytes }, [bytes.buffer]);\n });\n}\n\nfunction toWritableChunk(content: WriteContent): string | Blob {\n if (typeof content === \"string\" || content instanceof Blob) {\n return content;\n }\n\n if (content instanceof Uint8Array) {\n const copy = new Uint8Array(content.byteLength);\n copy.set(content);\n\n return new Blob([copy]);\n }\n\n return new Blob([content]);\n}\n\n/**\n * Convert input content to a Uint8Array.\n */\nasync function toUint8Array(content: WriteContent): Promise<Uint8Array> {\n if (content instanceof Uint8Array) {\n return content;\n }\n\n if (typeof content === \"string\") {\n return new TextEncoder().encode(content);\n }\n\n if (content instanceof Blob) {\n return new Uint8Array(await content.arrayBuffer());\n }\n\n if (content instanceof ArrayBuffer) {\n return new Uint8Array(content);\n }\n\n return new Uint8Array();\n}\n","import { readGroupFile } from \"./read-group-file.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Check if a file exists in a group's workspace.\n */\nexport async function groupFileExists(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n): Promise<boolean> {\n try {\n await readGroupFile(db, groupId, filePath);\n\n return true;\n } catch {\n return false;\n }\n}\n","import { getGroupDir } from \"./get-group-dir.js\";\nimport { parsePath } from \"./parse-path.js\";\nimport {\n getOpfsRootDirName,\n getStorageStatus,\n invalidateStorageRoot,\n isStaleHandleError,\n} from \"./storage.js\";\nimport {\n writeFileHandle,\n writeOpfsPathViaWorker,\n type WriteContent,\n} from \"./write-file-handle.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Write content to a file in a group's workspace.\n * Creates intermediate directories as needed.\n */\nexport async function writeGroupFile(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n content: WriteContent,\n): Promise<void> {\n const { dirs, filename } = parsePath(filePath);\n\n for (let attempt = 0; attempt < 2; attempt++) {\n try {\n const groupDir = await getGroupDir(db, groupId);\n let dir = groupDir;\n for (const seg of dirs) {\n dir = await dir.getDirectoryHandle(seg, { create: true });\n }\n\n const fileHandle = await dir.getFileHandle(filename, { create: true });\n\n try {\n await writeFileHandle(fileHandle, content);\n\n return;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const needsOpfsWorkerFallback =\n message.includes(\"Writable file streams are not supported\") &&\n (await getStorageStatus(db)).type === \"opfs\";\n\n if (!needsOpfsWorkerFallback) {\n throw err;\n }\n }\n\n const safeId = groupId.replace(/:/g, \"-\");\n await writeOpfsPathViaWorker(\n [getOpfsRootDirName(), \"groups\", safeId, ...dirs, filename],\n content,\n );\n\n return;\n } catch (err) {\n if (attempt === 0 && isStaleHandleError(err)) {\n invalidateStorageRoot();\n\n continue;\n }\n\n throw err;\n }\n }\n}\n","import { ToolProfile } from \"./types.js\";\n\n/**\n * Built-in profile optimized for Gemini Nano (Prompt API).\n * Minimizes context consumption so Nano has maximum tokens for generation.\n */\nexport const DEFAULT_BUILTIN_PROFILE: ToolProfile = {\n id: \"__builtin_default\",\n name: \"Default\",\n providerId: \"prompt_api\",\n enabledToolNames: [\n \"javascript\",\n \"list_files\",\n \"open_file\",\n \"read_file\",\n \"write_file\",\n ],\n customTools: [],\n systemPromptOverride:\n \"You are a helpful coding assistant.\\n\" +\n \"Content intended to be rendered as a `Page` (HTML or Markdown) SHOULD include frontmatter (title, created, updated, and slug).\\n\" +\n \"HTML content intended to be rendered as a `Page` SHOULD USE `<article><h2>${subTitle}</h2>...</article>` for its main body content.\",\n};\n","import { CONFIG_KEYS, DEFAULT_GROUP_ID } from \"../../config/config.js\";\nimport { isHeadlessMode } from \"../../config/headless.js\";\nimport { getConfig } from \"../../db/get-config.js\";\nimport { getGroupDir } from \"../../storage/get-group-dir.js\";\nimport { readGroupFile } from \"../../storage/read-group-file.js\";\n\nimport type { ShadowClawDatabase } from \"../../db/types.js\";\nimport type {\n DeclarativeToolDefinition,\n DeclarativeToolExecution,\n ToolDefinition,\n} from \"./types.js\";\n\nexport type { DeclarativeToolDefinition };\n\nconst TOOL_NAME_PATTERN = /^[a-z][a-z0-9_]{0,63}$/;\n\nexport function parseDeclarativeTool(\n path: string,\n value: unknown,\n): DeclarativeToolDefinition {\n if (!value || typeof value !== \"object\") {\n throw new Error(`Tool at ${path} must be a JSON object`);\n }\n\n const candidate = value as Record<string, unknown>;\n const name = typeof candidate.name === \"string\" ? candidate.name.trim() : \"\";\n const description =\n typeof candidate.description === \"string\"\n ? candidate.description.trim()\n : \"\";\n const inputSchema = candidate.input_schema ?? candidate.parameters;\n const execution = candidate.execution ?? candidate.evaluation;\n\n if (!TOOL_NAME_PATTERN.test(name)) {\n throw new Error(`Tool name is invalid: ${name || \"(missing)\"}`);\n }\n if (!description) {\n throw new Error(`Tool ${name} requires a description`);\n }\n if (!inputSchema || typeof inputSchema !== \"object\") {\n throw new Error(`Tool ${name} requires input_schema`);\n }\n if (!execution || typeof execution !== \"object\") {\n throw new Error(`Tool ${name} requires execution`);\n }\n\n const parsedExecution = execution as Record<string, unknown>;\n const type = parsedExecution.type;\n if (type !== \"bash\" && type !== \"javascript\" && type !== \"tool\") {\n throw new Error(\n `Tool ${name} execution type must be bash, javascript, or tool`,\n );\n }\n if (type === \"tool\") {\n if (\n typeof parsedExecution.name !== \"string\" ||\n !TOOL_NAME_PATTERN.test(parsedExecution.name)\n ) {\n throw new Error(`Tool ${name} execution requires a valid tool name`);\n }\n\n return {\n name,\n description,\n input_schema: inputSchema as ToolDefinition[\"input_schema\"],\n execution: {\n type,\n name: parsedExecution.name,\n ...(parsedExecution.input && typeof parsedExecution.input === \"object\"\n ? { input: parsedExecution.input as Record<string, unknown> }\n : {}),\n },\n path,\n };\n }\n const sourceKey = type === \"bash\" ? \"command\" : \"code\";\n const source = parsedExecution[sourceKey] ?? parsedExecution.expression;\n if (typeof source !== \"string\" || source.trim() === \"\") {\n throw new Error(`Tool ${name} execution requires ${sourceKey}`);\n }\n\n return {\n name,\n description,\n input_schema: inputSchema as ToolDefinition[\"input_schema\"],\n execution: {\n type,\n [sourceKey]: source,\n } as DeclarativeToolExecution,\n path,\n };\n}\n\nexport async function loadDeclarativeTools(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n): Promise<{ tools: DeclarativeToolDefinition[]; diagnostics: string[] }> {\n const tools: DeclarativeToolDefinition[] = [];\n const diagnostics: string[] = [];\n\n const groupIdsToScan =\n isHeadlessMode() || groupId === DEFAULT_GROUP_ID\n ? [groupId]\n : [groupId, DEFAULT_GROUP_ID];\n\n for (const targetGroupId of groupIdsToScan) {\n try {\n const root = await getGroupDir(db, targetGroupId);\n const paths: string[] = [];\n\n async function visit(\n directory: FileSystemDirectoryHandle,\n relativePath: string,\n ) {\n for await (const [name, handle] of (directory as any).entries()) {\n const childPath = `${relativePath}/${name}`;\n if (handle.kind === \"directory\") {\n await visit(handle, childPath);\n } else if (\n name.endsWith(\".json\") &&\n childPath.startsWith(\".agents/tools/\")\n ) {\n paths.push(childPath);\n }\n }\n }\n\n try {\n const agentsDir = await root.getDirectoryHandle(\".agents\");\n const toolsDir = await agentsDir.getDirectoryHandle(\"tools\");\n await visit(toolsDir, \".agents/tools\");\n } catch {\n continue;\n }\n\n const orderedPaths = paths.sort((a, b) => {\n const aIsFlat = !a.startsWith(\".agents/tools/main/\");\n const bIsFlat = !b.startsWith(\".agents/tools/main/\");\n if (aIsFlat !== bIsFlat) {\n return aIsFlat ? -1 : 1;\n }\n return a.localeCompare(b);\n });\n\n for (const path of orderedPaths) {\n try {\n const parsed = JSON.parse(\n await readGroupFile(db, targetGroupId, path),\n );\n const parsedTool = parseDeclarativeTool(path, parsed);\n if (!tools.some((t) => t.name === parsedTool.name)) {\n tools.push(parsedTool);\n }\n } catch (error) {\n diagnostics.push(\n error instanceof Error ? error.message : String(error),\n );\n }\n }\n } catch {\n // Continue to next group directory\n }\n }\n\n return { tools, diagnostics };\n}\n\nexport async function findDeclarativeTool(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n name: string,\n): Promise<DeclarativeToolDefinition | null> {\n try {\n const { tools } = await loadDeclarativeTools(db, groupId);\n const tool = tools.find((t) => t.name === name) || null;\n if (!tool) {\n return null;\n }\n\n const rawEnabled = await getConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n );\n if (Array.isArray(rawEnabled) && !rawEnabled.includes(name)) {\n return null;\n }\n\n return tool;\n } catch {\n return null;\n }\n}\n","import matter from \"gray-matter\";\n\nimport type { TaskToolCall } from \"../../db/types.js\";\nimport type { SkillExecution, SkillRecord } from \"./types.js\";\n\nconst NAME_PATTERN = /^[a-z0-9](?:[a-z0-9]|-(?!-))*[a-z0-9]$|^[a-z0-9]$/;\n\ninterface FrontmatterParseResult {\n data: Record<string, unknown>;\n content: string;\n}\n\nfunction parseFrontmatterResiliently(source: string): FrontmatterParseResult {\n try {\n const parsed = matter(source);\n return {\n data: parsed.data && typeof parsed.data === \"object\" ? parsed.data : {},\n content: parsed.content || \"\",\n };\n } catch {\n // Attempt 1: Sanitize unquoted scalar lines in the frontmatter block\n const fmMatch = source.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (fmMatch) {\n const rawFm = fmMatch[1];\n const rest = fmMatch[2] || \"\";\n const lines = rawFm.split(/\\r?\\n/);\n const sanitizedLines = lines.map((line) => {\n const fieldMatch = line.match(/^([a-zA-Z0-9_-]+):\\s*(.+)$/);\n if (fieldMatch) {\n const [, key, val] = fieldMatch;\n const trimmed = val.trim();\n // If value is not already quoted and not a YAML block indicator/collection opening or boolean/number\n if (\n trimmed &&\n trimmed !== \"true\" &&\n trimmed !== \"false\" &&\n trimmed !== \"null\" &&\n !trimmed.startsWith('\"') &&\n !trimmed.startsWith(\"'\") &&\n !trimmed.startsWith(\"[\") &&\n !trimmed.startsWith(\"{\") &&\n trimmed !== \">\" &&\n trimmed !== \"|\" &&\n trimmed !== \">-\" &&\n trimmed !== \"|-\" &&\n !/^-?\\d+(?:\\.\\d+)?$/.test(trimmed)\n ) {\n return `${key}: ${JSON.stringify(trimmed)}`;\n }\n }\n return line;\n });\n\n try {\n const sanitizedSource = `---\\n${sanitizedLines.join(\"\\n\")}\\n---\\n${rest}`;\n const parsed = matter(sanitizedSource);\n return {\n data:\n parsed.data && typeof parsed.data === \"object\" ? parsed.data : {},\n content: parsed.content || \"\",\n };\n } catch {\n // Continue to fallback\n }\n\n // Attempt 2: Line-by-line fallback extraction for essential frontmatter fields\n const fallbackData: Record<string, unknown> = {};\n const nameMatch = rawFm.match(/^name:\\s*[\"']?([^\"'\\r\\n]+)[\"']?/m);\n if (nameMatch) {\n fallbackData.name = nameMatch[1].trim();\n }\n\n const descMatch = rawFm.match(/^description:\\s*(.+)$/m);\n if (descMatch) {\n let desc = descMatch[1].trim();\n if (\n (desc.startsWith('\"') && desc.endsWith('\"')) ||\n (desc.startsWith(\"'\") && desc.endsWith(\"'\"))\n ) {\n desc = desc.slice(1, -1);\n }\n fallbackData.description = desc;\n }\n\n const userInvocableMatch = rawFm.match(\n /^user-invocable:\\s*(true|false)/im,\n );\n if (userInvocableMatch) {\n fallbackData[\"user-invocable\"] =\n userInvocableMatch[1].toLowerCase() === \"true\";\n }\n\n const disableModelMatch = rawFm.match(\n /^disable-model-invocation:\\s*(true|false)/im,\n );\n if (disableModelMatch) {\n fallbackData[\"disable-model-invocation\"] =\n disableModelMatch[1].toLowerCase() === \"true\";\n }\n\n const toolsMatch = rawFm.match(\n /^allowed-tools:\\s*[\"']?([^\"'\\r\\n]+)[\"']?/m,\n );\n if (toolsMatch) {\n fallbackData[\"allowed-tools\"] = toolsMatch[1].trim();\n }\n\n // Check for bullet list allowed-tools\n const toolListMatch = rawFm.match(\n /allowed-tools:\\s*\\n((?:\\s*-\\s*[^\\r\\n]+\\r?\\n?)+)/m,\n );\n if (toolListMatch) {\n const tools = toolListMatch[1]\n .split(/\\r?\\n/)\n .map((l) => l.replace(/^\\s*-\\s*/, \"\").trim())\n .filter(Boolean);\n if (tools.length > 0) {\n fallbackData[\"allowed-tools\"] = tools;\n }\n }\n\n return { data: fallbackData, content: rest };\n }\n\n return { data: {}, content: source };\n }\n}\n\nfunction extractAllowedTools(raw: unknown): string | undefined {\n if (typeof raw === \"string\") {\n const trimmed = raw.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n if (Array.isArray(raw)) {\n const tools = raw\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n return tools.length > 0 ? tools.join(\" \") : undefined;\n }\n return undefined;\n}\n\nexport function parseSkill(path: string, source: string): SkillRecord {\n const parsed = parseFrontmatterResiliently(source);\n const data = parsed.data;\n const name = typeof data.name === \"string\" ? data.name.trim() : \"\";\n const description =\n typeof data.description === \"string\" ? data.description.trim() : \"\";\n\n if (!name) {\n throw new Error(`Skill at ${path} requires a name`);\n }\n if (!description) {\n throw new Error(`Skill ${name} requires a description`);\n }\n if (name.length > 64 || !NAME_PATTERN.test(name)) {\n throw new Error(\n `Skill name must be 1-64 lowercase characters and hyphens: ${name}`,\n );\n }\n if (description.length > 1024) {\n throw new Error(\n `Skill ${name} description must be 1024 characters or fewer`,\n );\n }\n\n const basePath = path.replace(/\\/SKILL\\.md$/u, \"\");\n const rawMetadata =\n data.metadata && typeof data.metadata === \"object\"\n ? (data.metadata as Record<string, unknown>)\n : undefined;\n\n const allowedToolsRaw =\n extractAllowedTools(rawMetadata?.[\"allowed-tools\"]) ||\n extractAllowedTools(rawMetadata?.[\"allowedTools\"]) ||\n extractAllowedTools(data[\"allowed-tools\"]) ||\n extractAllowedTools(data[\"allowedTools\"]);\n\n const metadataEntries: [string, string][] = [];\n if (rawMetadata) {\n for (const [key, value] of Object.entries(rawMetadata)) {\n if (key === \"execution\" || value === null || value === undefined) {\n continue;\n }\n if (key === \"allowed-tools\" || key === \"allowedTools\") {\n if (allowedToolsRaw) {\n metadataEntries.push([key, allowedToolsRaw]);\n }\n } else if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n metadataEntries.push([key, String(value)]);\n } else if (Array.isArray(value)) {\n const stringItems = value\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter(Boolean);\n if (stringItems.length > 0) {\n metadataEntries.push([key, stringItems.join(\" \")]);\n }\n }\n }\n }\n\n const metadata =\n metadataEntries.length > 0\n ? Object.fromEntries(metadataEntries)\n : undefined;\n\n const execution = rawMetadata?.execution;\n\n let parsedExecution;\n if (execution !== undefined) {\n if (\n !execution ||\n typeof execution !== \"object\" ||\n (execution as Record<string, unknown>).type !== \"tools\" ||\n !Array.isArray((execution as Record<string, unknown>).tools)\n ) {\n throw new Error(`Skill ${name} has invalid tools execution`);\n }\n const rawExec = execution as Record<string, unknown>;\n const topSuppressToast =\n typeof rawExec.suppressToast === \"boolean\"\n ? rawExec.suppressToast\n : undefined;\n const topSuppressOutput =\n typeof rawExec.suppressOutput === \"boolean\"\n ? rawExec.suppressOutput\n : undefined;\n\n const rawTools = rawExec.tools as TaskToolCall[];\n const tools = rawTools.map((tool) => ({\n ...tool,\n ...(topSuppressToast !== undefined && tool.suppressToast === undefined\n ? { suppressToast: topSuppressToast }\n : {}),\n ...(topSuppressOutput !== undefined && tool.suppressOutput === undefined\n ? { suppressOutput: topSuppressOutput }\n : {}),\n }));\n\n parsedExecution = {\n type: \"tools\" as const,\n ...(topSuppressToast !== undefined\n ? { suppressToast: topSuppressToast }\n : {}),\n ...(topSuppressOutput !== undefined\n ? { suppressOutput: topSuppressOutput }\n : {}),\n tools,\n } satisfies SkillExecution;\n }\n\n return {\n name,\n description,\n ...(typeof data.license === \"string\" ? { license: data.license } : {}),\n ...(typeof data.compatibility === \"string\"\n ? { compatibility: data.compatibility }\n : {}),\n ...(metadata ? { metadata } : {}),\n ...(typeof allowedToolsRaw === \"string\"\n ? { allowedTools: allowedToolsRaw }\n : {}),\n ...(typeof data[\"user-invocable\"] === \"boolean\"\n ? { userInvocable: data[\"user-invocable\"] }\n : typeof data[\"user-invocable\"] === \"string\" &&\n (data[\"user-invocable\"].toLowerCase() === \"true\" ||\n data[\"user-invocable\"].toLowerCase() === \"false\")\n ? { userInvocable: data[\"user-invocable\"].toLowerCase() === \"true\" }\n : {}),\n ...(typeof data[\"disable-model-invocation\"] === \"boolean\"\n ? { disableModelInvocation: data[\"disable-model-invocation\"] }\n : typeof data[\"disable-model-invocation\"] === \"string\" &&\n (data[\"disable-model-invocation\"].toLowerCase() === \"true\" ||\n data[\"disable-model-invocation\"].toLowerCase() === \"false\")\n ? {\n disableModelInvocation:\n data[\"disable-model-invocation\"].toLowerCase() === \"true\",\n }\n : {}),\n ...(parsedExecution ? { execution: parsedExecution } : {}),\n body: parsed.content.trim(),\n path,\n basePath,\n };\n}\n","import { computeSha256 } from \"../../../utils/crypto.js\";\nimport { parseSkill } from \"../../skills/parse-skill.js\";\nimport type {\n RemoteManifest,\n RemoteSkillItem,\n ResolvedRemoteManifest,\n} from \"./types.js\";\n\nconst WELL_KNOWN_PATH = \".well-known/agent-skills/index.json\";\n\nexport interface GitHubRepoSource {\n owner: string;\n repo: string;\n ref: string;\n skillFilter?: string;\n subpath?: string;\n}\n\n/**\n * Parses a GitHub shorthand (`owner/repo`, `owner/repo@skill`) or GitHub repository/tree URL.\n */\nexport function parseGitHubRepoSource(input: string): GitHubRepoSource | null {\n const trimmed = input.trim().replace(/\\/+$/, \"\");\n if (!trimmed) return null;\n\n // Match https://github.com/owner/repo(/tree/ref/subpath)?(@skill)?\n const ghUrlMatch = trimmed.match(\n /^https?:\\/\\/github\\.com\\/([a-zA-Z0-9_.-]+)\\/([a-zA-Z0-9_.-]+?)(?:\\.git)?(?:\\/tree\\/([^/]+)(?:\\/(.+))?)?(?:@([a-zA-Z0-9_.-]+))?$/i,\n );\n if (ghUrlMatch) {\n return {\n owner: ghUrlMatch[1],\n repo: ghUrlMatch[2],\n ref: ghUrlMatch[3] || \"HEAD\",\n subpath: ghUrlMatch[4],\n skillFilter: ghUrlMatch[5],\n };\n }\n\n // Match shorthand owner/repo or owner/repo@skill (where owner has no dots or colons)\n if (!trimmed.includes(\"://\")) {\n const shorthandMatch = trimmed.match(\n /^([a-zA-Z0-9_-]+)\\/([a-zA-Z0-9_.-]+?)(?:@([a-zA-Z0-9_.-]+))?$/,\n );\n if (shorthandMatch && !shorthandMatch[1].includes(\".\")) {\n return {\n owner: shorthandMatch[1],\n repo: shorthandMatch[2],\n ref: \"HEAD\",\n skillFilter: shorthandMatch[3],\n };\n }\n }\n\n return null;\n}\n\n/**\n * Resolves an arbitrary site or discovery URL into a normalized base URL and manifest URL.\n */\nexport function resolveDiscoveryUrl(inputUrl: string): {\n baseUrl: string;\n siteUrl: string;\n manifestUrl: string;\n} {\n const trimmed = inputUrl.trim();\n if (!trimmed) {\n throw new Error(\"URL cannot be empty\");\n }\n\n let urlString = trimmed;\n if (!urlString.startsWith(\"http://\") && !urlString.startsWith(\"https://\")) {\n urlString = `https://${urlString}`;\n }\n\n // Remove trailing slashes\n urlString = urlString.replace(/\\/+$/, \"\");\n\n // Normalize GitHub blob URLs pointing to SKILL.md into raw.githubusercontent.com URLs\n const ghBlobMatch = urlString.match(\n /^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)\\/blob\\/([^/]+)\\/(.+\\/skill\\.md)$/i,\n );\n if (ghBlobMatch) {\n urlString = `https://raw.githubusercontent.com/${ghBlobMatch[1]}/${ghBlobMatch[2]}/${ghBlobMatch[3]}/${ghBlobMatch[4]}`;\n }\n\n if (/\\/skill\\.md$/i.test(urlString)) {\n const baseUrl = urlString.replace(/\\/skill\\.md$/i, \"\");\n return {\n baseUrl,\n siteUrl: baseUrl,\n manifestUrl: urlString,\n };\n }\n\n if (urlString.endsWith(WELL_KNOWN_PATH)) {\n const baseUrl = urlString\n .slice(0, -WELL_KNOWN_PATH.length)\n .replace(/\\/+$/, \"\");\n return {\n baseUrl,\n siteUrl: baseUrl,\n manifestUrl: urlString,\n };\n }\n\n return {\n baseUrl: urlString,\n siteUrl: urlString,\n manifestUrl: `${urlString}/${WELL_KNOWN_PATH}`,\n };\n}\n\n/**\n * Resolves an RFC 3986 relative URL found in an agent-skills manifest against the manifest URL.\n */\nexport function resolveManifestRelativeUrl(\n relativeUrl: string,\n manifestUrl: string,\n): string {\n if (!relativeUrl) {\n return \"\";\n }\n try {\n return new URL(relativeUrl, manifestUrl).href;\n } catch {\n return relativeUrl;\n }\n}\n\n/**\n * Resolves all relative URLs in an agent-skills manifest into fully-qualified absolute URLs.\n */\nexport function resolveManifestUrls(\n manifest: RemoteManifest,\n manifestUrl: string,\n): RemoteManifest {\n const cloned: RemoteManifest = JSON.parse(JSON.stringify(manifest));\n\n if (Array.isArray(cloned.tools)) {\n cloned.tools = cloned.tools.map((tool) => ({\n ...tool,\n url: resolveManifestRelativeUrl(tool.url, manifestUrl),\n }));\n }\n\n if (Array.isArray(cloned.scripts)) {\n cloned.scripts = cloned.scripts.map((script) => ({\n ...script,\n url: resolveManifestRelativeUrl(script.url, manifestUrl),\n }));\n }\n\n if (Array.isArray(cloned.skills)) {\n cloned.skills = cloned.skills.map((skill) => ({\n ...skill,\n url: resolveManifestRelativeUrl(skill.url, manifestUrl),\n tools: Array.isArray(skill.tools)\n ? skill.tools.map((st) => ({\n ...st,\n url: st.url\n ? resolveManifestRelativeUrl(st.url, manifestUrl)\n : undefined,\n }))\n : undefined,\n scripts: Array.isArray(skill.scripts)\n ? skill.scripts.map((ss) => ({\n ...ss,\n url: ss.url\n ? resolveManifestRelativeUrl(ss.url, manifestUrl)\n : undefined,\n }))\n : undefined,\n }));\n }\n\n return cloned;\n}\n\n/**\n * Verifies that the given content matches an expected SHA-256 digest (e.g. \"sha256:...\").\n */\nexport async function verifySha256Digest(\n content: string | Uint8Array,\n expectedDigest?: string,\n): Promise<boolean> {\n if (!expectedDigest || !expectedDigest.startsWith(\"sha256:\")) {\n return true;\n }\n\n const expectedHex = expectedDigest.slice(7).trim().toLowerCase();\n if (!expectedHex) {\n return true;\n }\n\n const rawBytes =\n typeof content === \"string\" ? new TextEncoder().encode(content) : content;\n const actualHex = (await computeSha256(rawBytes)).toLowerCase();\n return actualHex === expectedHex;\n}\n\nasync function buildSingleSkillManifest(\n skillUrl: string,\n baseUrl: string,\n rawText: string,\n files?: string[],\n): Promise<ResolvedRemoteManifest> {\n const parsed = parseSkill(skillUrl, rawText);\n const skillItem: RemoteSkillItem = {\n name: parsed.name,\n type: \"skill-md\",\n description: parsed.description,\n url: skillUrl,\n ...(files && files.length > 0 ? { files } : {}),\n };\n return {\n manifest: {\n name: parsed.name,\n description: parsed.description,\n skills: [skillItem],\n },\n siteUrl: baseUrl,\n manifestUrl: skillUrl,\n };\n}\n\nasync function fetchGitHubDiscoveryManifest(\n gh: GitHubRepoSource,\n customFetch: typeof fetch,\n): Promise<ResolvedRemoteManifest> {\n const rawBase = `https://raw.githubusercontent.com/${gh.owner}/${gh.repo}/${gh.ref}`;\n const siteUrl = `https://github.com/${gh.owner}/${gh.repo}`;\n\n // 1. Explicit tree subpath (e.g. https://github.com/owner/repo/tree/main/skills/my-skill)\n if (gh.subpath) {\n const cleanSubpath = gh.subpath\n .replace(/^\\/+|\\/+$/g, \"\")\n .replace(/\\/skill\\.md$/i, \"\");\n const skillUrl = `${rawBase}/${cleanSubpath}/SKILL.md`;\n const res = await customFetch(skillUrl);\n if (!res.ok) {\n throw new Error(\n `Failed to fetch discovery manifest: HTTP ${res.status} ${res.statusText || \"\"}`.trim(),\n );\n }\n return buildSingleSkillManifest(\n skillUrl,\n `${rawBase}/${cleanSubpath}`,\n await res.text(),\n );\n }\n\n // 2. Explicit skill filter (e.g. owner/repo@skill-name)\n if (gh.skillFilter) {\n const candidates = [\n `skills/${gh.skillFilter}/SKILL.md`,\n `.agents/skills/${gh.skillFilter}/SKILL.md`,\n `.agents/skills/main/${gh.skillFilter}/SKILL.md`,\n `${gh.skillFilter}/SKILL.md`,\n ];\n for (const relPath of candidates) {\n const candidateUrl = `${rawBase}/${relPath}`;\n const res = await customFetch(candidateUrl);\n if (res.ok) {\n return buildSingleSkillManifest(\n candidateUrl,\n candidateUrl.replace(/\\/skill\\.md$/i, \"\"),\n await res.text(),\n );\n }\n }\n throw new Error(\n `Failed to fetch skill \"${gh.skillFilter}\" from ${gh.owner}/${gh.repo}`,\n );\n }\n\n // 3. Full repository: try .well-known/agent-skills/index.json first\n const wellKnownUrl = `${rawBase}/${WELL_KNOWN_PATH}`;\n try {\n const wkRes = await customFetch(wellKnownUrl, {\n headers: { Accept: \"application/json\" },\n });\n if (wkRes.ok) {\n const rawManifest = (await wkRes.json()) as RemoteManifest;\n if (rawManifest && typeof rawManifest === \"object\") {\n return {\n manifest: resolveManifestUrls(rawManifest, wellKnownUrl),\n siteUrl: rawBase,\n manifestUrl: wellKnownUrl,\n };\n }\n }\n } catch {\n // Fall through to GitHub Trees API / root SKILL.md\n }\n\n // 4. Try GitHub Git Trees API to discover all SKILL.md files and companion files\n const treeApiUrl = `https://api.github.com/repos/${gh.owner}/${gh.repo}/git/trees/${gh.ref}?recursive=1`;\n try {\n const treeRes = await customFetch(treeApiUrl, {\n headers: { Accept: \"application/vnd.github+json\" },\n });\n if (treeRes.ok) {\n const treeData = (await treeRes.json()) as {\n tree?: Array<{ path?: string; type?: string }>;\n };\n const blobs = (treeData?.tree || [])\n .filter(\n (item) => item?.type === \"blob\" && typeof item.path === \"string\",\n )\n .map((item) => item.path as string);\n const skillMdPaths = blobs.filter(\n (p) => p === \"SKILL.md\" || p.endsWith(\"/SKILL.md\"),\n );\n\n if (skillMdPaths.length > 0) {\n const skills: RemoteSkillItem[] = [];\n for (const skillMdPath of skillMdPaths) {\n const skillDir =\n skillMdPath === \"SKILL.md\"\n ? \"\"\n : skillMdPath.slice(0, -\"/SKILL.md\".length);\n const prefix = skillDir ? `${skillDir}/` : \"\";\n const companionFiles = blobs\n .filter(\n (p) =>\n (skillDir ? p.startsWith(prefix) : !p.includes(\"/\")) &&\n p !== skillMdPath,\n )\n .map((p) => (skillDir ? p.slice(prefix.length) : p));\n\n const skillUrl = `${rawBase}/${skillMdPath}`;\n const mdRes = await customFetch(skillUrl);\n if (!mdRes.ok) continue;\n const mdText = await mdRes.text();\n try {\n const parsed = parseSkill(skillMdPath, mdText);\n skills.push({\n name: parsed.name,\n type: \"skill-md\",\n description: parsed.description,\n url: skillUrl,\n ...(companionFiles.length > 0\n ? { files: [\"SKILL.md\", ...companionFiles] }\n : {}),\n });\n } catch {\n // Skip invalid SKILL.md\n }\n }\n if (skills.length > 0) {\n return {\n manifest: {\n name: `${gh.owner}/${gh.repo}`,\n description: `Agent skills from ${gh.owner}/${gh.repo}`,\n skills,\n },\n siteUrl,\n manifestUrl: treeApiUrl,\n };\n }\n }\n }\n } catch {\n // Fall through to root SKILL.md\n }\n\n // 5. Fallback: root SKILL.md\n const rootSkillUrl = `${rawBase}/SKILL.md`;\n const rootRes = await customFetch(rootSkillUrl);\n if (rootRes.ok) {\n return buildSingleSkillManifest(\n rootSkillUrl,\n rawBase,\n await rootRes.text(),\n );\n }\n\n throw new Error(\n `Failed to fetch discovery manifest from GitHub repository ${gh.owner}/${gh.repo}`,\n );\n}\n\n/**\n * Fetches and parses a remote site's Agent Skills discovery manifest,\n * direct SKILL.md URL, or GitHub repository/shorthand.\n */\nexport async function fetchDiscoveryManifest(\n siteUrl: string,\n customFetch: typeof fetch = globalThis.fetch,\n): Promise<ResolvedRemoteManifest> {\n const ghSource = parseGitHubRepoSource(siteUrl);\n if (ghSource) {\n return fetchGitHubDiscoveryManifest(ghSource, customFetch);\n }\n\n const { baseUrl, manifestUrl } = resolveDiscoveryUrl(siteUrl);\n\n if (/\\/skill\\.md$/i.test(manifestUrl)) {\n const response = await customFetch(manifestUrl);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch discovery manifest: HTTP ${response.status} ${response.statusText}`.trim(),\n );\n }\n const rawText = await response.text();\n return buildSingleSkillManifest(manifestUrl, baseUrl, rawText);\n }\n\n const response = await customFetch(manifestUrl, {\n headers: {\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch discovery manifest: HTTP ${response.status} ${response.statusText}`.trim(),\n );\n }\n\n const rawManifest = (await response.json()) as RemoteManifest;\n if (!rawManifest || typeof rawManifest !== \"object\") {\n throw new Error(\"Invalid discovery manifest: expected a JSON object\");\n }\n\n const resolvedManifest = resolveManifestUrls(rawManifest, manifestUrl);\n\n return {\n manifest: resolvedManifest,\n siteUrl: baseUrl,\n manifestUrl,\n };\n}\n","import { CONFIG_KEYS, DEFAULT_GROUP_ID } from \"../../../config/config.js\";\nimport { getConfig } from \"../../../db/get-config.js\";\nimport { setConfig } from \"../../../db/set-config.js\";\nimport { writeGroupFile } from \"../../../storage/write-group-file.js\";\nimport { groupFileExists } from \"../../../storage/group-file-exists.js\";\nimport { parseDeclarativeTool } from \"../declarative.js\";\nimport { TOOL_DEFINITIONS } from \"../tools.js\";\nimport { parseSkill } from \"../../skills/parse-skill.js\";\nimport { verifySha256Digest } from \"./discovery.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type {\n ImportArtifactStatus,\n ImportOptions,\n ImportResult,\n RemoteManifest,\n RemoteScriptItem,\n RemoteSkillItem,\n RemoteToolItem,\n} from \"./types.js\";\n\nconst BUILTIN_TOOL_NAMES = new Set(TOOL_DEFINITIONS.map((t) => t.name));\nconst TOOL_NAME_PATTERN = /^[a-z][a-z0-9_]{0,63}$/;\n\nfunction getBaseDir(\n kind: \"tools\" | \"scripts\" | \"skills\",\n options?: ImportOptions,\n): string {\n if (options?.targetSubdir) {\n return `.agents/${kind}/${options.targetSubdir}`;\n }\n if (options?.siteSlug) {\n return `.agents/${kind}/imported/${options.siteSlug}`;\n }\n // Canonical flat layout; legacy `main/` is still read by discovery.\n return `.agents/${kind}`;\n}\n\n/**\n * Imports a declarative tool definition from a remote URL and saves it into OPFS.\n */\nexport async function importRemoteTool(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n toolItem: RemoteToolItem,\n options?: ImportOptions,\n): Promise<ImportArtifactStatus> {\n const name = (toolItem.name || \"\").trim();\n\n if (BUILTIN_TOOL_NAMES.has(name)) {\n return {\n name,\n path: \"\",\n status: \"failed\",\n error: `Cannot shadow built-in tool: ${name}`,\n };\n }\n\n if (!TOOL_NAME_PATTERN.test(name)) {\n return {\n name,\n path: \"\",\n status: \"failed\",\n error: `Invalid tool name: ${name}`,\n };\n }\n\n const targetPath = `${getBaseDir(\"tools\", options)}/${name}.json`;\n\n try {\n const exists = await groupFileExists(db, groupId, targetPath);\n if (exists && !options?.overwrite) {\n return {\n name,\n path: targetPath,\n status: \"skipped\",\n };\n }\n\n const fetcher = options?.fetchFn || globalThis.fetch;\n const response = await fetcher(toolItem.url);\n if (!response.ok) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: `HTTP ${response.status} ${response.statusText}`,\n };\n }\n\n const text = await response.text();\n\n if (toolItem.digest) {\n const isValid = await verifySha256Digest(text, toolItem.digest);\n if (!isValid) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: \"Integrity verification failed for tool definition\",\n };\n }\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: \"Downloaded tool definition is not valid JSON\",\n };\n }\n\n // Validate schema\n parseDeclarativeTool(targetPath, parsed);\n\n await writeGroupFile(\n db,\n groupId,\n targetPath,\n JSON.stringify(parsed, null, 2),\n );\n\n if (options?.autoEnable) {\n const current = (await getConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n )) as string[] | undefined;\n const set = new Set(Array.isArray(current) ? current : []);\n set.add(name);\n await setConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n Array.from(set),\n );\n }\n\n return {\n name,\n path: targetPath,\n status: \"imported\",\n };\n } catch (error) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Imports a companion script (.js/.mjs) from a remote URL and saves it into OPFS.\n */\nexport async function importRemoteScript(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n scriptItem: RemoteScriptItem,\n options?: ImportOptions,\n): Promise<ImportArtifactStatus> {\n const name = (scriptItem.name || \"\").trim();\n const filename =\n name.endsWith(\".js\") || name.endsWith(\".mjs\") ? name : `${name}.js`;\n const targetPath = `${getBaseDir(\"scripts\", options)}/${filename}`;\n\n try {\n const exists = await groupFileExists(db, groupId, targetPath);\n if (exists && !options?.overwrite) {\n return {\n name,\n path: targetPath,\n status: \"skipped\",\n };\n }\n\n const fetcher = options?.fetchFn || globalThis.fetch;\n const response = await fetcher(scriptItem.url);\n if (!response.ok) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: `HTTP ${response.status} ${response.statusText}`,\n };\n }\n\n const text = await response.text();\n\n if (scriptItem.digest) {\n const isValid = await verifySha256Digest(text, scriptItem.digest);\n if (!isValid) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: \"Integrity verification failed for script\",\n };\n }\n }\n\n await writeGroupFile(db, groupId, targetPath, text);\n\n return {\n name,\n path: targetPath,\n status: \"imported\",\n };\n } catch (error) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Imports an Agent Skill (SKILL.md) from a remote URL and saves it into OPFS.\n */\nexport async function importRemoteSkill(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n skillItem: RemoteSkillItem,\n options?: ImportOptions,\n): Promise<ImportArtifactStatus> {\n const name = (skillItem.name || \"\").trim();\n const skillBase = `${getBaseDir(\"skills\", options)}/${name}`;\n const targetPath = `${skillBase}/SKILL.md`;\n\n try {\n const exists = await groupFileExists(db, groupId, targetPath);\n if (exists && !options?.overwrite) {\n return {\n name,\n path: targetPath,\n status: \"skipped\",\n };\n }\n\n const fetcher = options?.fetchFn || globalThis.fetch;\n const response = await fetcher(skillItem.url);\n if (!response.ok) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: `HTTP ${response.status} ${response.statusText}`,\n };\n }\n\n const text = await response.text();\n\n if (skillItem.digest) {\n const isValid = await verifySha256Digest(text, skillItem.digest);\n if (!isValid) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: \"Integrity verification failed for skill\",\n };\n }\n }\n\n // Validate skill frontmatter\n parseSkill(targetPath, text);\n\n await writeGroupFile(db, groupId, targetPath, text);\n\n if (Array.isArray(skillItem.files) && skillItem.files.length > 0) {\n const baseUrl = skillItem.url.replace(/\\/skill\\.md$/i, \"/\");\n for (const relFile of skillItem.files) {\n if (typeof relFile !== \"string\") continue;\n const cleanRel = relFile.replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n if (\n !cleanRel ||\n cleanRel.toLowerCase() === \"skill.md\" ||\n cleanRel.split(\"/\").some((seg) => seg === \"..\" || seg === \".\")\n ) {\n continue;\n }\n try {\n const companionUrl = new URL(\n cleanRel,\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`,\n ).href;\n const companionRes = await fetcher(companionUrl);\n if (companionRes.ok) {\n const companionText = await companionRes.text();\n const companionTarget = `${skillBase}/${cleanRel}`;\n await writeGroupFile(db, groupId, companionTarget, companionText);\n }\n } catch {\n // Non-fatal companion file download error\n }\n }\n }\n\n return {\n name,\n path: targetPath,\n status: \"imported\",\n };\n } catch (error) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Imports a batch of selected tools, skills, and scripts from a remote site with dependency resolution.\n */\nexport async function importRemoteArtifacts(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n manifest: RemoteManifest,\n selection: {\n toolNames?: string[];\n skillNames?: string[];\n scriptNames?: string[];\n },\n options?: ImportOptions,\n): Promise<ImportResult> {\n const result: ImportResult = {\n tools: [],\n skills: [],\n scripts: [],\n diagnostics: [],\n };\n\n const selectedToolNames = new Set(selection.toolNames || []);\n const selectedSkillNames = new Set(selection.skillNames || []);\n const selectedScriptNames = new Set(selection.scriptNames || []);\n\n const manifestTools = manifest.tools || [];\n const manifestSkills = manifest.skills || [];\n const manifestScripts = manifest.scripts || [];\n\n // Resolve dependencies from selected skills\n for (const skillItem of manifestSkills) {\n if (selectedSkillNames.has(skillItem.name)) {\n if (Array.isArray(skillItem.tools)) {\n for (const t of skillItem.tools) {\n selectedToolNames.add(t.name);\n }\n }\n if (Array.isArray(skillItem.scripts)) {\n for (const s of skillItem.scripts) {\n selectedScriptNames.add(s.name);\n }\n }\n }\n }\n\n // Import Scripts\n for (const scriptItem of manifestScripts) {\n if (selectedScriptNames.has(scriptItem.name)) {\n const status = await importRemoteScript(db, groupId, scriptItem, options);\n result.scripts.push(status);\n if (status.status === \"failed\" && status.error) {\n result.diagnostics.push(`Script ${scriptItem.name}: ${status.error}`);\n }\n }\n }\n\n // Import Tools\n for (const toolItem of manifestTools) {\n if (selectedToolNames.has(toolItem.name)) {\n const status = await importRemoteTool(db, groupId, toolItem, options);\n result.tools.push(status);\n if (status.status === \"failed\" && status.error) {\n result.diagnostics.push(`Tool ${toolItem.name}: ${status.error}`);\n }\n }\n }\n\n // Import Skills\n for (const skillItem of manifestSkills) {\n if (selectedSkillNames.has(skillItem.name)) {\n const status = await importRemoteSkill(db, groupId, skillItem, options);\n result.skills.push(status);\n if (status.status === \"failed\" && status.error) {\n result.diagnostics.push(`Skill ${skillItem.name}: ${status.error}`);\n }\n }\n }\n\n return result;\n}\n","import { Signal } from \"signal-polyfill\";\n\nimport { CONFIG_KEYS } from \"../config/config.js\";\nimport { getConfig } from \"../db/get-config.js\";\nimport { setConfig } from \"../db/set-config.js\";\nimport { TOOL_DEFINITIONS } from \"../subsystems/tools/tools.js\";\nimport { DEFAULT_BUILTIN_PROFILE } from \"../subsystems/tools/builtin-profiles.js\";\nimport { loadDeclarativeTools } from \"../subsystems/tools/declarative.js\";\nimport { fetchDiscoveryManifest } from \"../subsystems/tools/remote/discovery.js\";\nimport { importRemoteArtifacts } from \"../subsystems/tools/remote/import-artifacts.js\";\nimport type { DeclarativeToolDefinition } from \"../subsystems/tools/declarative.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\nimport type { ToolDefinition, ToolProfile } from \"../subsystems/tools/tools.js\";\nimport type {\n ImportOptions,\n ImportResult,\n RemoteManifest,\n ResolvedRemoteManifest,\n} from \"../subsystems/tools/remote/types.js\";\n\nexport class ToolsStore {\n private _activeProfile: Signal.Computed<ToolProfile | null>;\n private _activeProfileId: Signal.State<string | null>;\n private _allTools: Signal.Computed<ToolDefinition[]>;\n private _customTools: Signal.State<ToolDefinition[]>;\n private _declarativeTools: Signal.State<DeclarativeToolDefinition[]>;\n private _declarativeToolNamesEnabled: Signal.State<Set<string> | null>;\n private _enabledDeclarativeTools: Signal.Computed<\n DeclarativeToolDefinition[]\n >;\n private _enabledToolNames: Signal.State<Set<string>>;\n private _enabledTools: Signal.Computed<ToolDefinition[]>;\n private _profiles: Signal.State<ToolProfile[]>;\n private _systemPromptOverride: Signal.State<string>;\n private _webSearchProxyUrl: Signal.State<string>;\n private _webSearchUrl: Signal.State<string>;\n private _webSearchUseProxy: Signal.State<boolean>;\n private _searchFilesMaxFileBytes: Signal.State<number>;\n private _searchFilesMaxFilesVisited: Signal.State<number>;\n private _searchFilesSkipDirs: Signal.State<string>;\n\n constructor() {\n this._enabledToolNames = new Signal.State(\n new Set(DEFAULT_BUILTIN_PROFILE.enabledToolNames),\n );\n this._customTools = new Signal.State([]);\n this._declarativeTools = new Signal.State([]);\n this._declarativeToolNamesEnabled = new Signal.State<Set<string> | null>(\n null,\n );\n this._systemPromptOverride = new Signal.State(\"\");\n this._profiles = new Signal.State([]);\n this._activeProfileId = new Signal.State(DEFAULT_BUILTIN_PROFILE.id);\n this._webSearchUseProxy = new Signal.State(false);\n this._webSearchProxyUrl = new Signal.State(\"/proxy\");\n this._webSearchUrl = new Signal.State(\n \"https://html.duckduckgo.com/html/?q={query}\",\n );\n this._searchFilesMaxFileBytes = new Signal.State(512 * 1024);\n this._searchFilesMaxFilesVisited = new Signal.State(1000);\n this._searchFilesSkipDirs = new Signal.State(\n \".git,node_modules,dist,dist-electron,.cache,.nx,.turbo,__pycache__,.venv,venv\",\n );\n\n // Derived signals using Signal.Computed for proper reactive propagation.\n this._allTools = new Signal.Computed(() => [\n ...TOOL_DEFINITIONS,\n ...this._customTools.get(),\n ]);\n\n this._enabledTools = new Signal.Computed(() => {\n const enabled = this._enabledToolNames.get();\n\n return this._allTools\n .get()\n .filter((t: ToolDefinition) => enabled.has(t.name));\n });\n\n this._enabledDeclarativeTools = new Signal.Computed(() => {\n const tools = this._declarativeTools.get();\n const enabledSet = this._declarativeToolNamesEnabled.get();\n if (!enabledSet || enabledSet.size === 0) {\n return [];\n }\n return tools.filter((t) => enabledSet.has(t.name));\n });\n\n this._activeProfile = new Signal.Computed(() => {\n const id = this._activeProfileId.get();\n if (!id) {\n return null;\n }\n\n if (DEFAULT_BUILTIN_PROFILE.id === id) {\n return DEFAULT_BUILTIN_PROFILE;\n }\n\n return this._profiles.get().find((p: ToolProfile) => p.id === id) || null;\n });\n }\n\n get activeProfile(): ToolProfile | null {\n return this._activeProfile.get();\n }\n\n get activeProfileId(): string | null {\n return this._activeProfileId.get();\n }\n\n get allTools(): ToolDefinition[] {\n return this._allTools.get();\n }\n\n get customTools(): ToolDefinition[] {\n return this._customTools.get();\n }\n\n get declarativeTools(): DeclarativeToolDefinition[] {\n return this._declarativeTools.get();\n }\n\n get declarativeToolNamesEnabled(): Set<string> | null {\n return this._declarativeToolNamesEnabled.get();\n }\n\n get enabledDeclarativeTools(): DeclarativeToolDefinition[] {\n return this._enabledDeclarativeTools.get();\n }\n\n get enabledToolNames(): Set<string> {\n return this._enabledToolNames.get();\n }\n\n get enabledTools(): ToolDefinition[] {\n return this._enabledTools.get();\n }\n\n isDeclarativeToolEnabled(name: string): boolean {\n const enabledSet = this._declarativeToolNamesEnabled.get();\n if (!enabledSet) {\n return false;\n }\n return enabledSet.has(name);\n }\n\n async refreshDeclarativeTools(\n db: ShadowClawDatabase,\n groupId?: string,\n ): Promise<DeclarativeToolDefinition[]> {\n try {\n const res = await loadDeclarativeTools(db, groupId || \"br:main\");\n const allBuiltInAndCustom = this.allTools;\n const declTools = (res?.tools || []).filter(\n (dt) => !allBuiltInAndCustom.some((bt) => bt.name === dt.name),\n );\n\n const current = this._declarativeTools.get();\n const isSame =\n current.length === declTools.length &&\n current.every(\n (t, i) =>\n t.name === declTools[i].name &&\n t.description === declTools[i].description &&\n JSON.stringify(t.execution) ===\n JSON.stringify(declTools[i].execution),\n );\n\n if (!isSame) {\n this._declarativeTools.set(declTools);\n }\n return declTools;\n } catch {\n if (this._declarativeTools.get().length > 0) {\n this._declarativeTools.set([]);\n }\n return [];\n }\n }\n\n async setDeclarativeToolEnabled(\n db: ShadowClawDatabase,\n toolName: string,\n enabled: boolean,\n ): Promise<void> {\n const currentEnabled = this._declarativeToolNamesEnabled.get();\n const nextSet = new Set(currentEnabled === null ? [] : currentEnabled);\n if (enabled) {\n nextSet.add(toolName);\n } else {\n nextSet.delete(toolName);\n }\n this._declarativeToolNamesEnabled.set(nextSet);\n await setConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n Array.from(nextSet),\n );\n }\n\n async setAllDeclarativeEnabled(\n db: ShadowClawDatabase,\n toolNames: string[],\n ): Promise<void> {\n const nextSet = new Set(toolNames);\n this._declarativeToolNamesEnabled.set(nextSet);\n await setConfig(db, CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED, toolNames);\n }\n\n /**\n * Fetches remote site discovery manifest.\n */\n async fetchRemoteDiscoveryManifest(\n siteUrl: string,\n ): Promise<ResolvedRemoteManifest> {\n return await fetchDiscoveryManifest(siteUrl);\n }\n\n /**\n * Imports tools, skills, and scripts from a remote site into OPFS and refreshes declarative tools.\n */\n async importFromRemoteSite(\n db: ShadowClawDatabase,\n manifest: RemoteManifest,\n selection: {\n toolNames?: string[];\n skillNames?: string[];\n scriptNames?: string[];\n },\n options?: ImportOptions,\n ): Promise<ImportResult> {\n const groupId = options?.groupId || \"br:main\";\n const result = await importRemoteArtifacts(\n db,\n groupId,\n manifest,\n selection,\n options,\n );\n await this.refreshDeclarativeTools(db, groupId);\n return result;\n }\n\n /**\n * Export tools config as JSON for backup.\n */\n exportBackup(): string {\n return JSON.stringify(\n {\n enabledTools: [...this._enabledToolNames.get()],\n customTools: this._customTools.get(),\n declarativeToolsEnabled: this._declarativeToolNamesEnabled.get()\n ? Array.from(this._declarativeToolNamesEnabled.get()!)\n : null,\n systemPromptOverride: this._systemPromptOverride.get(),\n profiles: this._profiles.get(),\n activeProfileId: this._activeProfileId.get(),\n webSearchUseProxy: this._webSearchUseProxy.get(),\n webSearchProxyUrl: this._webSearchProxyUrl.get(),\n webSearchUrl: this._webSearchUrl.get(),\n searchFilesMaxFileBytes: this._searchFilesMaxFileBytes.get(),\n searchFilesMaxFilesVisited: this._searchFilesMaxFilesVisited.get(),\n searchFilesSkipDirs: this._searchFilesSkipDirs.get(),\n },\n null,\n 2,\n );\n }\n\n findProfilesForProvider(providerId?: string, model?: string): ToolProfile[] {\n return this.profiles.filter((p) => {\n if (p.providerId && p.providerId !== providerId) {\n return false;\n }\n\n if (p.model && p.model !== model) {\n return false;\n }\n\n return true;\n });\n }\n\n get profiles(): ToolProfile[] {\n return [DEFAULT_BUILTIN_PROFILE, ...this._profiles.get()];\n }\n\n get systemPromptOverride(): string {\n return this._systemPromptOverride.get();\n }\n\n get webSearchProxyUrl(): string {\n return this._webSearchProxyUrl.get();\n }\n\n get webSearchUrl(): string {\n return this._webSearchUrl.get();\n }\n\n get webSearchUseProxy(): boolean {\n return this._webSearchUseProxy.get();\n }\n\n get searchFilesMaxFileBytes(): number {\n return this._searchFilesMaxFileBytes.get();\n }\n\n get searchFilesMaxFilesVisited(): number {\n return this._searchFilesMaxFilesVisited.get();\n }\n\n /** Comma-separated list of directory names to skip when walking the workspace. */\n get searchFilesSkipDirs(): string {\n return this._searchFilesSkipDirs.get();\n }\n\n /** Parsed Set of directory names to skip — derived from the comma-separated string. */\n get searchFilesSkipDirsSet(): Set<string> {\n return new Set(\n this._searchFilesSkipDirs\n .get()\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n );\n }\n\n async activateProfile(\n db: ShadowClawDatabase,\n profileId: string,\n ): Promise<void> {\n const profile = this.profiles.find((p) => p.id === profileId);\n if (!profile) {\n return;\n }\n\n this._activeProfileId.set(profileId);\n this._enabledToolNames.set(new Set(profile.enabledToolNames));\n this._customTools.set(profile.customTools);\n this._systemPromptOverride.set(profile.systemPromptOverride || \"\");\n\n await Promise.all([\n setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, profileId),\n setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, profile.enabledToolNames),\n setConfig(db, CONFIG_KEYS.CUSTOM_TOOLS, profile.customTools),\n setConfig(\n db,\n CONFIG_KEYS.SYSTEM_PROMPT_OVERRIDE,\n profile.systemPromptOverride || \"\",\n ),\n ]);\n }\n\n async addCustomTool(\n db: ShadowClawDatabase,\n tool: ToolDefinition,\n ): Promise<void> {\n const tools = [...this._customTools.get(), tool];\n this._customTools.set(tools);\n // Auto-enable new tool\n const enabled = new Set(this._enabledToolNames.get());\n enabled.add(tool.name);\n this._enabledToolNames.set(enabled);\n await Promise.all([\n setConfig(db, CONFIG_KEYS.CUSTOM_TOOLS, tools),\n setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, [...enabled]),\n ]);\n }\n\n // ── Profile Management ───────────────────────────────────────────\n\n async addProfile(\n db: ShadowClawDatabase,\n profile: ToolProfile,\n ): Promise<void> {\n const profiles = [...this._profiles.get(), profile];\n this._profiles.set(profiles);\n await setConfig(db, CONFIG_KEYS.TOOL_PROFILES, profiles);\n }\n\n async cloneTool(\n db: ShadowClawDatabase,\n sourceToolName: string,\n newToolName: string,\n newDescription?: string,\n ): Promise<boolean> {\n const source = this.allTools.find((t) => t.name === sourceToolName);\n if (!source) {\n return false;\n }\n\n if (this.allTools.some((t) => t.name === newToolName)) {\n return false;\n }\n\n const cloned: ToolDefinition = {\n name: newToolName,\n description: newDescription || source.description,\n input_schema: JSON.parse(JSON.stringify(source.input_schema)),\n };\n\n await this.addCustomTool(db, cloned);\n\n return true;\n }\n\n async deactivateProfile(db: ShadowClawDatabase): Promise<void> {\n this._activeProfileId.set(null);\n await setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, null);\n }\n\n async deleteProfile(\n db: ShadowClawDatabase,\n profileId: string,\n ): Promise<void> {\n if (profileId === DEFAULT_BUILTIN_PROFILE.id) {\n return;\n }\n\n const profiles = this._profiles.get().filter((p) => p.id !== profileId);\n this._profiles.set(profiles);\n if (this._activeProfileId.get() === profileId) {\n this._activeProfileId.set(null);\n await setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, null);\n }\n\n await setConfig(db, CONFIG_KEYS.TOOL_PROFILES, profiles);\n }\n\n async importBackup(db: ShadowClawDatabase, json: string): Promise<void> {\n const data = JSON.parse(json);\n if (Array.isArray(data.enabledTools)) {\n this._enabledToolNames.set(new Set(data.enabledTools));\n await setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, data.enabledTools);\n }\n\n if (Array.isArray(data.customTools)) {\n this._customTools.set(data.customTools);\n await setConfig(db, CONFIG_KEYS.CUSTOM_TOOLS, data.customTools);\n }\n\n if (typeof data.systemPromptOverride === \"string\") {\n this._systemPromptOverride.set(data.systemPromptOverride);\n await setConfig(\n db,\n CONFIG_KEYS.SYSTEM_PROMPT_OVERRIDE,\n data.systemPromptOverride,\n );\n }\n\n if (Array.isArray(data.profiles)) {\n this._profiles.set(data.profiles);\n await setConfig(db, CONFIG_KEYS.TOOL_PROFILES, data.profiles);\n }\n\n if (\n typeof data.activeProfileId === \"string\" ||\n data.activeProfileId === null\n ) {\n this._activeProfileId.set(data.activeProfileId);\n await setConfig(\n db,\n CONFIG_KEYS.ACTIVE_TOOL_PROFILE,\n data.activeProfileId,\n );\n }\n\n if (typeof data.webSearchUseProxy === \"boolean\") {\n this._webSearchUseProxy.set(data.webSearchUseProxy);\n await setConfig(\n db,\n CONFIG_KEYS.WEB_SEARCH_USE_PROXY,\n data.webSearchUseProxy ? \"true\" : \"false\",\n );\n }\n\n if (typeof data.webSearchProxyUrl === \"string\") {\n this._webSearchProxyUrl.set(data.webSearchProxyUrl);\n await setConfig(\n db,\n CONFIG_KEYS.WEB_SEARCH_PROXY_URL,\n data.webSearchProxyUrl,\n );\n }\n\n if (typeof data.webSearchUrl === \"string\") {\n this._webSearchUrl.set(data.webSearchUrl);\n await setConfig(db, CONFIG_KEYS.WEB_SEARCH_URL, data.webSearchUrl);\n }\n\n if (\n typeof data.searchFilesMaxFileBytes === \"number\" &&\n data.searchFilesMaxFileBytes > 0\n ) {\n this._searchFilesMaxFileBytes.set(data.searchFilesMaxFileBytes);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_MAX_FILE_BYTES,\n String(data.searchFilesMaxFileBytes),\n );\n }\n\n if (\n typeof data.searchFilesMaxFilesVisited === \"number\" &&\n data.searchFilesMaxFilesVisited > 0\n ) {\n this._searchFilesMaxFilesVisited.set(data.searchFilesMaxFilesVisited);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_MAX_FILES_VISITED,\n String(data.searchFilesMaxFilesVisited),\n );\n }\n\n if (typeof data.searchFilesSkipDirs === \"string\") {\n this._searchFilesSkipDirs.set(data.searchFilesSkipDirs);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_SKIP_DIRS,\n data.searchFilesSkipDirs,\n );\n }\n\n if (Array.isArray(data.declarativeToolsEnabled)) {\n this._declarativeToolNamesEnabled.set(\n new Set(data.declarativeToolsEnabled),\n );\n await setConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n data.declarativeToolsEnabled,\n );\n } else if (data.declarativeToolsEnabled === null) {\n this._declarativeToolNamesEnabled.set(null);\n await setConfig(db, CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED, null);\n }\n }\n\n /**\n * Load persisted tool config from IndexedDB.\n */\n async load(db: ShadowClawDatabase): Promise<void> {\n const [\n enabledRaw,\n customRaw,\n promptOverride,\n profilesRaw,\n activeProfileIdRaw,\n webSearchUseProxyRaw,\n webSearchProxyUrlRaw,\n webSearchUrlRaw,\n searchFilesMaxFileBytesRaw,\n searchFilesMaxFilesVisitedRaw,\n searchFilesSkipDirsRaw,\n declarativeEnabledRaw,\n ] = await Promise.all([\n getConfig(db, CONFIG_KEYS.ENABLED_TOOLS),\n getConfig(db, CONFIG_KEYS.CUSTOM_TOOLS),\n getConfig(db, CONFIG_KEYS.SYSTEM_PROMPT_OVERRIDE),\n getConfig(db, CONFIG_KEYS.TOOL_PROFILES),\n getConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE),\n getConfig(db, CONFIG_KEYS.WEB_SEARCH_USE_PROXY),\n getConfig(db, CONFIG_KEYS.WEB_SEARCH_PROXY_URL),\n getConfig(db, CONFIG_KEYS.WEB_SEARCH_URL),\n getConfig(db, CONFIG_KEYS.SEARCH_FILES_MAX_FILE_BYTES),\n getConfig(db, CONFIG_KEYS.SEARCH_FILES_MAX_FILES_VISITED),\n getConfig(db, CONFIG_KEYS.SEARCH_FILES_SKIP_DIRS),\n getConfig(db, CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED),\n ]);\n\n if (Array.isArray(enabledRaw)) {\n this._enabledToolNames.set(new Set(enabledRaw));\n }\n\n if (Array.isArray(customRaw)) {\n this._customTools.set(customRaw);\n }\n\n if (Array.isArray(declarativeEnabledRaw)) {\n this._declarativeToolNamesEnabled.set(new Set(declarativeEnabledRaw));\n }\n\n if (typeof promptOverride === \"string\") {\n this._systemPromptOverride.set(promptOverride);\n }\n\n if (Array.isArray(profilesRaw)) {\n this._profiles.set(profilesRaw);\n }\n\n if (typeof activeProfileIdRaw === \"string\") {\n this._activeProfileId.set(activeProfileIdRaw);\n }\n\n if (webSearchUseProxyRaw !== null && webSearchUseProxyRaw !== undefined) {\n const strVal = String(webSearchUseProxyRaw).toLowerCase();\n this._webSearchUseProxy.set(strVal === \"true\" || strVal === \"1\");\n }\n\n if (\n typeof webSearchProxyUrlRaw === \"string\" &&\n webSearchProxyUrlRaw.trim().length > 0\n ) {\n this._webSearchProxyUrl.set(webSearchProxyUrlRaw.trim());\n }\n\n if (\n typeof webSearchUrlRaw === \"string\" &&\n webSearchUrlRaw.trim().length > 0\n ) {\n this._webSearchUrl.set(webSearchUrlRaw.trim());\n }\n\n if (\n searchFilesMaxFileBytesRaw !== null &&\n searchFilesMaxFileBytesRaw !== undefined\n ) {\n const n = Number(searchFilesMaxFileBytesRaw);\n if (Number.isFinite(n) && n > 0) {\n this._searchFilesMaxFileBytes.set(n);\n }\n }\n\n if (\n searchFilesMaxFilesVisitedRaw !== null &&\n searchFilesMaxFilesVisitedRaw !== undefined\n ) {\n const n = Number(searchFilesMaxFilesVisitedRaw);\n if (Number.isFinite(n) && n > 0) {\n this._searchFilesMaxFilesVisited.set(n);\n }\n }\n\n if (\n typeof searchFilesSkipDirsRaw === \"string\" &&\n searchFilesSkipDirsRaw.trim().length > 0\n ) {\n this._searchFilesSkipDirs.set(searchFilesSkipDirsRaw.trim());\n }\n }\n\n async setWebSearchProxyUrl(\n db: ShadowClawDatabase,\n proxyUrl: string,\n ): Promise<void> {\n const trimmed = proxyUrl.trim() || \"/proxy\";\n this._webSearchProxyUrl.set(trimmed);\n await setConfig(db, CONFIG_KEYS.WEB_SEARCH_PROXY_URL, trimmed);\n }\n\n async setWebSearchUrl(db: ShadowClawDatabase, url: string): Promise<void> {\n const trimmed = url.trim() || \"https://html.duckduckgo.com/html/?q={query}\";\n this._webSearchUrl.set(trimmed);\n await setConfig(db, CONFIG_KEYS.WEB_SEARCH_URL, trimmed);\n }\n\n async setWebSearchUseProxy(\n db: ShadowClawDatabase,\n useProxy: boolean,\n ): Promise<void> {\n const enabled = !!useProxy;\n this._webSearchUseProxy.set(enabled);\n await setConfig(\n db,\n CONFIG_KEYS.WEB_SEARCH_USE_PROXY,\n enabled ? \"true\" : \"false\",\n );\n }\n\n async setSearchFilesMaxFileBytes(\n db: ShadowClawDatabase,\n bytes: number,\n ): Promise<void> {\n const clamped = Math.max(1, Math.round(bytes));\n this._searchFilesMaxFileBytes.set(clamped);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_MAX_FILE_BYTES,\n String(clamped),\n );\n }\n\n async setSearchFilesMaxFilesVisited(\n db: ShadowClawDatabase,\n count: number,\n ): Promise<void> {\n const clamped = Math.max(1, Math.round(count));\n this._searchFilesMaxFilesVisited.set(clamped);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_MAX_FILES_VISITED,\n String(clamped),\n );\n }\n\n async setSearchFilesSkipDirs(\n db: ShadowClawDatabase,\n dirs: string,\n ): Promise<void> {\n const trimmed = dirs.trim();\n this._searchFilesSkipDirs.set(trimmed);\n await setConfig(db, CONFIG_KEYS.SEARCH_FILES_SKIP_DIRS, trimmed);\n }\n\n async removeCustomTool(\n db: ShadowClawDatabase,\n toolName: string,\n ): Promise<void> {\n const tools = this._customTools.get().filter((t) => t.name !== toolName);\n this._customTools.set(tools);\n const enabled = new Set(this._enabledToolNames.get());\n enabled.delete(toolName);\n this._enabledToolNames.set(enabled);\n await Promise.all([\n setConfig(db, CONFIG_KEYS.CUSTOM_TOOLS, tools),\n setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, [...enabled]),\n ]);\n }\n\n async saveToActiveProfile(db: ShadowClawDatabase): Promise<void> {\n const id = this._activeProfileId.get();\n if (!id) {\n return;\n }\n\n const profile = this._profiles.get().find((p) => p.id === id);\n if (!profile) {\n return;\n }\n\n const updated = {\n ...profile,\n enabledToolNames: [...this._enabledToolNames.get()],\n customTools: [...this._customTools.get()],\n systemPromptOverride: this._systemPromptOverride.get(),\n };\n await this.updateProfile(db, updated);\n }\n\n async setAllEnabled(\n db: ShadowClawDatabase,\n toolNames: string[],\n ): Promise<void> {\n this._enabledToolNames.set(new Set(toolNames));\n\n const saves = [setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, toolNames)];\n if (this._activeProfileId.get()) {\n this._activeProfileId.set(null);\n saves.push(setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, null));\n }\n\n await Promise.all(saves);\n }\n\n async setSystemPromptOverride(\n db: ShadowClawDatabase,\n override: string,\n ): Promise<void> {\n this._systemPromptOverride.set(override);\n await setConfig(db, CONFIG_KEYS.SYSTEM_PROMPT_OVERRIDE, override);\n }\n\n async setToolEnabled(\n db: ShadowClawDatabase,\n toolName: string,\n enabled: boolean,\n ): Promise<void> {\n const current = new Set(this._enabledToolNames.get());\n if (enabled) {\n current.add(toolName);\n } else {\n current.delete(toolName);\n }\n\n this._enabledToolNames.set(current);\n\n const saves = [setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, [...current])];\n if (this._activeProfileId.get()) {\n this._activeProfileId.set(null);\n saves.push(setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, null));\n }\n\n await Promise.all(saves);\n }\n\n async updateProfile(\n db: ShadowClawDatabase,\n profile: ToolProfile,\n ): Promise<void> {\n const profiles = this._profiles\n .get()\n .map((p) => (p.id === profile.id ? profile : p));\n this._profiles.set(profiles);\n await setConfig(db, CONFIG_KEYS.TOOL_PROFILES, profiles);\n }\n}\n\nexport const toolsStore = new ToolsStore();\n"],"mappings":";;;;;;;;;;;;;;;AAOA,eAAsB,cACpB,IACA,SACA,UACiB;CACjB,MAAM,WAAW,MAAM,YAAY,IAAI,OAAO;CAC9C,MAAM,EAAE,MAAM,aAAa,UAAU,QAAQ;CAE7C,IAAI,MAAM;CACV,KAAK,MAAM,OAAO,MAChB,MAAM,MAAM,IAAI,mBAAmB,GAAG;CAIxC,MAAM,aAAa,MAAM,IAAI,cAAc,QAAQ;CAEnD,IAAI;EACF,MAAM,aAAa,MAAO,WAAmB,uBAAuB;EACpE,MAAM,OAAO,WAAW,QAAQ;EAChC,MAAM,MAAM,IAAI,WAAW,IAAI;EAE/B,WAAW,KAAK,KAAK,EAAE,IAAI,EAAE,CAAC;EAC9B,WAAW,MAAM;EAEjB,OAAO,IAAI,YAAY,OAAO,CAAC,CAAC,OAAO,GAAG;CAC5C,QAAQ;EAIN,QAAO,MAFY,WAAW,QAAQ,EAE3B,CAAC,KAAK;CACnB;AACF;;;;;;;AChCA,SAAgB,YAAY,IAAyC;CACnE,OAAO,UAAiB,IAAI,SAAS,aAAa,UAChD,MAAM,OAAO,CACf,CAAC,CAAC,MAAM,UAAU,MAAM,KAAK,OAAO;EAAE,GAAG;EAAG,SAAS,CAAC,CAAC,EAAE;CAAQ,EAAE,CAAC;AACtE;;;;;;;ACHA,eAAsB,gBACpB,YACA,SACe;CACf,MAAM,iBAAiB,YAAY;CACnC,MAAM,wBAAwB,QAAQ,IAAI,YAAY,iBAAiB;CACvE,MAAM,eACJ,OAAO,mBAAmB,aACtB,eAAe,KAAK,UAAU,IAC9B,OAAO,0BAA0B,aAC/B,sBAAsB,KAAK,UAAU,IACrC;CAER,IAAI,cAAc;EAChB,MAAM,WAAW,MAAM,aAAa;EACpC,MAAM,SAAS,MAAM,gBAAgB,OAAO,CAAC;EAC7C,MAAM,SAAS,MAAM;EAErB;CACF;CAEA,IAAI,OAAQ,WAAmB,2BAA2B,YAAY;EACpE,MAAM,aAAa,MAAO,WAAmB,uBAAuB;EAEpE,IAAI;GACF,MAAM,QAAQ,MAAM,aAAa,OAAO;GAGxC,WAAW,SAAS,CAAC;GACrB,WAAW,MAAM,OAAO,EAAE,IAAI,EAAE,CAAC;GACjC,IAAI,OAAO,WAAW,UAAU,YAC9B,WAAW,MAAM;EAErB,UAAU;GACR,WAAW,MAAM;EACnB;EAEA;CACF;CAEA,MAAM,IAAI,MACR,0EACF;AACF;;;;;AAMA,eAAsB,uBACpB,cACA,SACe;CACf,IAAI,OAAO,WAAW,WAAW,YAC/B,MAAM,IAAI,MACR,0EACF;CAGF,MAAM,QAAQ,MAAM,aAAa,OAAO;CAExC,OAAO,IAAI,SAAS,SAAS,WAAW;EACtC,IAAI,UAAU;EACd,IAAI,SAAwB;EAE5B,IAAI;GAGF,MAAM,MAAM;IACV;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;GACF,CAAC,CAAC,KAAK,IAAI;GAEX,UAAU,IAAI,gBACZ,IAAI,KAAK,CAAC,GAAG,GAAG,EAAE,MAAM,kBAAkB,CAAC,CAC7C;GACA,SAAS,IAAI,OAAO,mBAAmB,OAAO,CAAW;EAC3D,QAAQ;GACN,IAAI,SACF,IAAI,gBAAgB,OAAO;GAG7B,uBACE,IAAI,MACF,0EACF,CACF;GAEA;EACF;EAEA,MAAM,gBAAgB;GACpB,IAAI,QACF,OAAO,UAAU;GAGnB,IAAI,gBAAgB,OAAO;EAC7B;EAEA,OAAO,aAAa,MAAM;GACxB,QAAQ;GACR,IAAI,EAAE,MAAM,OACV,OAAO,IAAI,MAAM,EAAE,KAAK,KAAK,CAAC;QAE9B,QAAQ;EAEZ;EAEA,OAAO,WAAW,MAAM;GACtB,QAAQ;GACR,OAAO,IAAI,MAAM,EAAE,WAAW,0BAA0B,CAAC;EAC3D;EAEA,OAAO,YAAY;GAAE;GAAc;EAAM,GAAG,CAAC,MAAM,MAAM,CAAC;CAC5D,CAAC;AACH;AAEA,SAAS,gBAAgB,SAAsC;CAC7D,IAAI,OAAO,YAAY,YAAY,mBAAmB,MACpD,OAAO;CAGT,IAAI,mBAAmB,YAAY;EACjC,MAAM,OAAO,IAAI,WAAW,QAAQ,UAAU;EAC9C,KAAK,IAAI,OAAO;EAEhB,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC;CACxB;CAEA,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC;AAC3B;;;;AAKA,eAAe,aAAa,SAA4C;CACtE,IAAI,mBAAmB,YACrB,OAAO;CAGT,IAAI,OAAO,YAAY,UACrB,OAAO,IAAI,YAAY,CAAC,CAAC,OAAO,OAAO;CAGzC,IAAI,mBAAmB,MACrB,OAAO,IAAI,WAAW,MAAM,QAAQ,YAAY,CAAC;CAGnD,IAAI,mBAAmB,aACrB,OAAO,IAAI,WAAW,OAAO;CAG/B,uBAAO,IAAI,WAAW;AACxB;;;;;;;AC5KA,eAAsB,gBACpB,IACA,SACA,UACkB;CAClB,IAAI;EACF,MAAM,cAAc,IAAI,SAAS,QAAQ;EAEzC,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;;;;;;;;ACCA,eAAsB,eACpB,IACA,SACA,UACA,SACe;CACf,MAAM,EAAE,MAAM,aAAa,UAAU,QAAQ;CAE7C,KAAK,IAAI,UAAU,GAAG,UAAU,GAAG,WACjC,IAAI;EAEF,IAAI,MAAM,MADa,YAAY,IAAI,OAAO;EAE9C,KAAK,MAAM,OAAO,MAChB,MAAM,MAAM,IAAI,mBAAmB,KAAK,EAAE,QAAQ,KAAK,CAAC;EAG1D,MAAM,aAAa,MAAM,IAAI,cAAc,UAAU,EAAE,QAAQ,KAAK,CAAC;EAErE,IAAI;GACF,MAAM,gBAAgB,YAAY,OAAO;GAEzC;EACF,SAAS,KAAK;GAMZ,IAAI,GALY,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,EAEtD,CAAC,SAAS,yCAAyC,MACzD,MAAM,iBAAiB,EAAE,EAAC,CAAE,SAAS,SAGtC,MAAM;EAEV;EAEA,MAAM,SAAS,QAAQ,QAAQ,MAAM,GAAG;EACxC,MAAM,uBACJ;GAAC,mBAAmB;GAAG;GAAU;GAAQ,GAAG;GAAM;EAAQ,GAC1D,OACF;EAEA;CACF,SAAS,KAAK;EACZ,IAAI,YAAY,KAAK,mBAAmB,GAAG,GAAG;GAC5C,sBAAsB;GAEtB;EACF;EAEA,MAAM;CACR;AAEJ;;;;;;;;AC/DA,MAAa,0BAAuC;CAClD,IAAI;CACJ,MAAM;CACN,YAAY;CACZ,kBAAkB;EAChB;EACA;EACA;EACA;EACA;CACF;CACA,aAAa,CAAC;CACd,sBACE;AAGJ;;;;ACPA,MAAMA,sBAAoB;AAE1B,SAAgB,qBACd,MACA,OAC2B;CAC3B,IAAI,CAAC,SAAS,OAAO,UAAU,UAC7B,MAAM,IAAI,MAAM,WAAW,KAAK,uBAAuB;CAGzD,MAAM,YAAY;CAClB,MAAM,OAAO,OAAO,UAAU,SAAS,WAAW,UAAU,KAAK,KAAK,IAAI;CAC1E,MAAM,cACJ,OAAO,UAAU,gBAAgB,WAC7B,UAAU,YAAY,KAAK,IAC3B;CACN,MAAM,cAAc,UAAU,gBAAgB,UAAU;CACxD,MAAM,YAAY,UAAU,aAAa,UAAU;CAEnD,IAAI,CAACA,oBAAkB,KAAK,IAAI,GAC9B,MAAM,IAAI,MAAM,yBAAyB,QAAQ,aAAa;CAEhE,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,QAAQ,KAAK,wBAAwB;CAEvD,IAAI,CAAC,eAAe,OAAO,gBAAgB,UACzC,MAAM,IAAI,MAAM,QAAQ,KAAK,uBAAuB;CAEtD,IAAI,CAAC,aAAa,OAAO,cAAc,UACrC,MAAM,IAAI,MAAM,QAAQ,KAAK,oBAAoB;CAGnD,MAAM,kBAAkB;CACxB,MAAM,OAAO,gBAAgB;CAC7B,IAAI,SAAS,UAAU,SAAS,gBAAgB,SAAS,QACvD,MAAM,IAAI,MACR,QAAQ,KAAK,kDACf;CAEF,IAAI,SAAS,QAAQ;EACnB,IACE,OAAO,gBAAgB,SAAS,YAChC,CAACA,oBAAkB,KAAK,gBAAgB,IAAI,GAE5C,MAAM,IAAI,MAAM,QAAQ,KAAK,sCAAsC;EAGrE,OAAO;GACL;GACA;GACA,cAAc;GACd,WAAW;IACT;IACA,MAAM,gBAAgB;IACtB,GAAI,gBAAgB,SAAS,OAAO,gBAAgB,UAAU,WAC1D,EAAE,OAAO,gBAAgB,MAAiC,IAC1D,CAAC;GACP;GACA;EACF;CACF;CACA,MAAM,YAAY,SAAS,SAAS,YAAY;CAChD,MAAM,SAAS,gBAAgB,cAAc,gBAAgB;CAC7D,IAAI,OAAO,WAAW,YAAY,OAAO,KAAK,MAAM,IAClD,MAAM,IAAI,MAAM,QAAQ,KAAK,sBAAsB,WAAW;CAGhE,OAAO;EACL;EACA;EACA,cAAc;EACd,WAAW;GACT;IACC,YAAY;EACf;EACA;CACF;AACF;AAEA,eAAsB,qBACpB,IACA,UAAkB,kBACsD;CACxE,MAAM,QAAqC,CAAC;CAC5C,MAAM,cAAwB,CAAC;CAE/B,MAAM,iBACJ,eAAe,KAAK,wBAChB,CAAC,OAAO,IACR,CAAC,SAAS,gBAAgB;CAEhC,KAAK,MAAM,iBAAiB,gBAC1B,IAAI;EACF,MAAM,OAAO,MAAM,YAAY,IAAI,aAAa;EAChD,MAAM,QAAkB,CAAC;EAEzB,eAAe,MACb,WACA,cACA;GACA,WAAW,MAAM,CAAC,MAAM,WAAY,UAAkB,QAAQ,GAAG;IAC/D,MAAM,YAAY,GAAG,aAAa,GAAG;IACrC,IAAI,OAAO,SAAS,aAClB,MAAM,MAAM,QAAQ,SAAS;SACxB,IACL,KAAK,SAAS,OAAO,KACrB,UAAU,WAAW,gBAAgB,GAErC,MAAM,KAAK,SAAS;GAExB;EACF;EAEA,IAAI;GAGF,MAAM,MAAM,OADW,MADC,KAAK,mBAAmB,SAAS,EACzB,CAAC,mBAAmB,OAAO,GACrC,eAAe;EACvC,QAAQ;GACN;EACF;EAEA,MAAM,eAAe,MAAM,MAAM,GAAG,MAAM;GACxC,MAAM,UAAU,CAAC,EAAE,WAAW,qBAAqB;GAEnD,IAAI,YAAY,CADC,EAAE,WAAW,qBAAqB,GAEjD,OAAO,UAAU,KAAK;GAExB,OAAO,EAAE,cAAc,CAAC;EAC1B,CAAC;EAED,KAAK,MAAM,QAAQ,cACjB,IAAI;GAIF,MAAM,aAAa,qBAAqB,MAHzB,KAAK,MAClB,MAAM,cAAc,IAAI,eAAe,IAAI,CAEM,CAAC;GACpD,IAAI,CAAC,MAAM,MAAM,MAAM,EAAE,SAAS,WAAW,IAAI,GAC/C,MAAM,KAAK,UAAU;EAEzB,SAAS,OAAO;GACd,YAAY,KACV,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK,CACvD;EACF;CAEJ,QAAQ,CAER;CAGF,OAAO;EAAE;EAAO;CAAY;AAC9B;AAEA,eAAsB,oBACpB,IACA,UAAkB,kBAClB,MAC2C;CAC3C,IAAI;EACF,MAAM,EAAE,UAAU,MAAM,qBAAqB,IAAI,OAAO;EACxD,MAAM,OAAO,MAAM,MAAM,MAAM,EAAE,SAAS,IAAI,KAAK;EACnD,IAAI,CAAC,MACH,OAAO;EAGT,MAAM,aAAa,MAAM,UACvB,IACA,YAAY,yBACd;EACA,IAAI,MAAM,QAAQ,UAAU,KAAK,CAAC,WAAW,SAAS,IAAI,GACxD,OAAO;EAGT,OAAO;CACT,QAAQ;EACN,OAAO;CACT;AACF;;;;;AC3LA,MAAM,eAAe;AAOrB,SAAS,4BAA4B,QAAwC;CAC3E,IAAI;EACF,MAAM,aAASC,4BAAO,MAAM;EAC5B,OAAO;GACL,MAAM,OAAO,QAAQ,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO,CAAC;GACtE,SAAS,OAAO,WAAW;EAC7B;CACF,QAAQ;EAEN,MAAM,UAAU,OAAO,MAAM,6CAA6C;EAC1E,IAAI,SAAS;GACX,MAAM,QAAQ,QAAQ;GACtB,MAAM,OAAO,QAAQ,MAAM;GAE3B,MAAM,iBADQ,MAAM,MAAM,OACC,CAAC,CAAC,KAAK,SAAS;IACzC,MAAM,aAAa,KAAK,MAAM,4BAA4B;IAC1D,IAAI,YAAY;KACd,MAAM,GAAG,KAAK,OAAO;KACrB,MAAM,UAAU,IAAI,KAAK;KAEzB,IACE,WACA,YAAY,UACZ,YAAY,WACZ,YAAY,UACZ,CAAC,QAAQ,WAAW,IAAG,KACvB,CAAC,QAAQ,WAAW,GAAG,KACvB,CAAC,QAAQ,WAAW,GAAG,KACvB,CAAC,QAAQ,WAAW,GAAG,KACvB,YAAY,OACZ,YAAY,OACZ,YAAY,QACZ,YAAY,QACZ,CAAC,oBAAoB,KAAK,OAAO,GAEjC,OAAO,GAAG,IAAI,IAAI,KAAK,UAAU,OAAO;IAE5C;IACA,OAAO;GACT,CAAC;GAED,IAAI;IACF,MAAM,kBAAkB,QAAQ,eAAe,KAAK,IAAI,EAAE,SAAS;IACnE,MAAM,aAASA,4BAAO,eAAe;IACrC,OAAO;KACL,MACE,OAAO,QAAQ,OAAO,OAAO,SAAS,WAAW,OAAO,OAAO,CAAC;KAClE,SAAS,OAAO,WAAW;IAC7B;GACF,QAAQ,CAER;GAGA,MAAM,eAAwC,CAAC;GAC/C,MAAM,YAAY,MAAM,MAAM,kCAAkC;GAChE,IAAI,WACF,aAAa,OAAO,UAAU,EAAE,CAAC,KAAK;GAGxC,MAAM,YAAY,MAAM,MAAM,wBAAwB;GACtD,IAAI,WAAW;IACb,IAAI,OAAO,UAAU,EAAE,CAAC,KAAK;IAC7B,IACG,KAAK,WAAW,IAAG,KAAK,KAAK,SAAS,IAAG,KACzC,KAAK,WAAW,GAAG,KAAK,KAAK,SAAS,GAAG,GAE1C,OAAO,KAAK,MAAM,GAAG,EAAE;IAEzB,aAAa,cAAc;GAC7B;GAEA,MAAM,qBAAqB,MAAM,MAC/B,mCACF;GACA,IAAI,oBACF,aAAa,oBACX,mBAAmB,EAAE,CAAC,YAAY,MAAM;GAG5C,MAAM,oBAAoB,MAAM,MAC9B,6CACF;GACA,IAAI,mBACF,aAAa,8BACX,kBAAkB,EAAE,CAAC,YAAY,MAAM;GAG3C,MAAM,aAAa,MAAM,MACvB,2CACF;GACA,IAAI,YACF,aAAa,mBAAmB,WAAW,EAAE,CAAC,KAAK;GAIrD,MAAM,gBAAgB,MAAM,MAC1B,kDACF;GACA,IAAI,eAAe;IACjB,MAAM,QAAQ,cAAc,EAAE,CAC3B,MAAM,OAAO,CAAC,CACd,KAAK,MAAM,EAAE,QAAQ,YAAY,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAC5C,OAAO,OAAO;IACjB,IAAI,MAAM,SAAS,GACjB,aAAa,mBAAmB;GAEpC;GAEA,OAAO;IAAE,MAAM;IAAc,SAAS;GAAK;EAC7C;EAEA,OAAO;GAAE,MAAM,CAAC;GAAG,SAAS;EAAO;CACrC;AACF;AAEA,SAAS,oBAAoB,KAAkC;CAC7D,IAAI,OAAO,QAAQ,UAAU;EAC3B,MAAM,UAAU,IAAI,KAAK;EACzB,OAAO,QAAQ,SAAS,IAAI,UAAU;CACxC;CACA,IAAI,MAAM,QAAQ,GAAG,GAAG;EACtB,MAAM,QAAQ,IACX,QAAQ,SAAyB,OAAO,SAAS,QAAQ,CAAC,CAC1D,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAC1B,QAAQ,SAAS,KAAK,SAAS,CAAC;EACnC,OAAO,MAAM,SAAS,IAAI,MAAM,KAAK,GAAG,IAAI;CAC9C;AAEF;AAEA,SAAgB,WAAW,MAAc,QAA6B;CACpE,MAAM,SAAS,4BAA4B,MAAM;CACjD,MAAM,OAAO,OAAO;CACpB,MAAM,OAAO,OAAO,KAAK,SAAS,WAAW,KAAK,KAAK,KAAK,IAAI;CAChE,MAAM,cACJ,OAAO,KAAK,gBAAgB,WAAW,KAAK,YAAY,KAAK,IAAI;CAEnE,IAAI,CAAC,MACH,MAAM,IAAI,MAAM,YAAY,KAAK,iBAAiB;CAEpD,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,SAAS,KAAK,wBAAwB;CAExD,IAAI,KAAK,SAAS,MAAM,CAAC,aAAa,KAAK,IAAI,GAC7C,MAAM,IAAI,MACR,6DAA6D,MAC/D;CAEF,IAAI,YAAY,SAAS,MACvB,MAAM,IAAI,MACR,SAAS,KAAK,8CAChB;CAGF,MAAM,WAAW,KAAK,QAAQ,iBAAiB,EAAE;CACjD,MAAM,cACJ,KAAK,YAAY,OAAO,KAAK,aAAa,WACrC,KAAK,WACN;CAEN,MAAM,kBACJ,oBAAoB,cAAc,gBAAgB,KAClD,oBAAoB,cAAc,eAAe,KACjD,oBAAoB,KAAK,gBAAgB,KACzC,oBAAoB,KAAK,eAAe;CAE1C,MAAM,kBAAsC,CAAC;CAC7C,IAAI,aACF,KAAK,MAAM,CAAC,KAAK,UAAU,OAAO,QAAQ,WAAW,GAAG;EACtD,IAAI,QAAQ,eAAe,UAAU,QAAQ,UAAU,QACrD;EAEF,IAAI,QAAQ,mBAAmB,QAAQ,gBACrC;OAAI,iBACF,gBAAgB,KAAK,CAAC,KAAK,eAAe,CAAC;EAC7C,OACK,IACL,OAAO,UAAU,YACjB,OAAO,UAAU,YACjB,OAAO,UAAU,WAEjB,gBAAgB,KAAK,CAAC,KAAK,OAAO,KAAK,CAAC,CAAC;OACpC,IAAI,MAAM,QAAQ,KAAK,GAAG;GAC/B,MAAM,cAAc,MACjB,QAAQ,SAAyB,OAAO,SAAS,QAAQ,CAAC,CAC1D,KAAK,SAAS,KAAK,KAAK,CAAC,CAAC,CAC1B,OAAO,OAAO;GACjB,IAAI,YAAY,SAAS,GACvB,gBAAgB,KAAK,CAAC,KAAK,YAAY,KAAK,GAAG,CAAC,CAAC;EAErD;CACF;CAGF,MAAM,WACJ,gBAAgB,SAAS,IACrB,OAAO,YAAY,eAAe,IAClC;CAEN,MAAM,YAAY,aAAa;CAE/B,IAAI;CACJ,IAAI,cAAc,QAAW;EAC3B,IACE,CAAC,aACD,OAAO,cAAc,YACpB,UAAsC,SAAS,WAChD,CAAC,MAAM,QAAS,UAAsC,KAAK,GAE3D,MAAM,IAAI,MAAM,SAAS,KAAK,6BAA6B;EAE7D,MAAM,UAAU;EAChB,MAAM,mBACJ,OAAO,QAAQ,kBAAkB,YAC7B,QAAQ,gBACR;EACN,MAAM,oBACJ,OAAO,QAAQ,mBAAmB,YAC9B,QAAQ,iBACR;EAGN,MAAM,QADW,QAAQ,MACF,KAAK,UAAU;GACpC,GAAG;GACH,GAAI,qBAAqB,UAAa,KAAK,kBAAkB,SACzD,EAAE,eAAe,iBAAiB,IAClC,CAAC;GACL,GAAI,sBAAsB,UAAa,KAAK,mBAAmB,SAC3D,EAAE,gBAAgB,kBAAkB,IACpC,CAAC;EACP,EAAE;EAEF,kBAAkB;GAChB,MAAM;GACN,GAAI,qBAAqB,SACrB,EAAE,eAAe,iBAAiB,IAClC,CAAC;GACL,GAAI,sBAAsB,SACtB,EAAE,gBAAgB,kBAAkB,IACpC,CAAC;GACL;EACF;CACF;CAEA,OAAO;EACL;EACA;EACA,GAAI,OAAO,KAAK,YAAY,WAAW,EAAE,SAAS,KAAK,QAAQ,IAAI,CAAC;EACpE,GAAI,OAAO,KAAK,kBAAkB,WAC9B,EAAE,eAAe,KAAK,cAAc,IACpC,CAAC;EACL,GAAI,WAAW,EAAE,SAAS,IAAI,CAAC;EAC/B,GAAI,OAAO,oBAAoB,WAC3B,EAAE,cAAc,gBAAgB,IAChC,CAAC;EACL,GAAI,OAAO,KAAK,sBAAsB,YAClC,EAAE,eAAe,KAAK,kBAAkB,IACxC,OAAO,KAAK,sBAAsB,aAC/B,KAAK,iBAAiB,CAAC,YAAY,MAAM,UACxC,KAAK,iBAAiB,CAAC,YAAY,MAAM,WAC3C,EAAE,eAAe,KAAK,iBAAiB,CAAC,YAAY,MAAM,OAAO,IACjE,CAAC;EACP,GAAI,OAAO,KAAK,gCAAgC,YAC5C,EAAE,wBAAwB,KAAK,4BAA4B,IAC3D,OAAO,KAAK,gCAAgC,aACzC,KAAK,2BAA2B,CAAC,YAAY,MAAM,UAClD,KAAK,2BAA2B,CAAC,YAAY,MAAM,WACrD,EACE,wBACE,KAAK,2BAA2B,CAAC,YAAY,MAAM,OACvD,IACA,CAAC;EACP,GAAI,kBAAkB,EAAE,WAAW,gBAAgB,IAAI,CAAC;EACxD,MAAM,OAAO,QAAQ,KAAK;EAC1B;EACA;CACF;AACF;;;;AC1RA,MAAM,kBAAkB;;;;AAaxB,SAAgB,sBAAsB,OAAwC;CAC5E,MAAM,UAAU,MAAM,KAAK,CAAC,CAAC,QAAQ,QAAQ,EAAE;CAC/C,IAAI,CAAC,SAAS,OAAO;CAGrB,MAAM,aAAa,QAAQ,MACzB,kIACF;CACA,IAAI,YACF,OAAO;EACL,OAAO,WAAW;EAClB,MAAM,WAAW;EACjB,KAAK,WAAW,MAAM;EACtB,SAAS,WAAW;EACpB,aAAa,WAAW;CAC1B;CAIF,IAAI,CAAC,QAAQ,SAAS,KAAK,GAAG;EAC5B,MAAM,iBAAiB,QAAQ,MAC7B,+DACF;EACA,IAAI,kBAAkB,CAAC,eAAe,EAAE,CAAC,SAAS,GAAG,GACnD,OAAO;GACL,OAAO,eAAe;GACtB,MAAM,eAAe;GACrB,KAAK;GACL,aAAa,eAAe;EAC9B;CAEJ;CAEA,OAAO;AACT;;;;AAKA,SAAgB,oBAAoB,UAIlC;CACA,MAAM,UAAU,SAAS,KAAK;CAC9B,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,qBAAqB;CAGvC,IAAI,YAAY;CAChB,IAAI,CAAC,UAAU,WAAW,SAAS,KAAK,CAAC,UAAU,WAAW,UAAU,GACtE,YAAY,WAAW;CAIzB,YAAY,UAAU,QAAQ,QAAQ,EAAE;CAGxC,MAAM,cAAc,UAAU,MAC5B,6EACF;CACA,IAAI,aACF,YAAY,qCAAqC,YAAY,GAAG,GAAG,YAAY,GAAG,GAAG,YAAY,GAAG,GAAG,YAAY;CAGrH,IAAI,gBAAgB,KAAK,SAAS,GAAG;EACnC,MAAM,UAAU,UAAU,QAAQ,iBAAiB,EAAE;EACrD,OAAO;GACL;GACA,SAAS;GACT,aAAa;EACf;CACF;CAEA,IAAI,UAAU,SAAS,eAAe,GAAG;EACvC,MAAM,UAAU,UACb,MAAM,GAAG,GAAuB,CAAC,CACjC,QAAQ,QAAQ,EAAE;EACrB,OAAO;GACL;GACA,SAAS;GACT,aAAa;EACf;CACF;CAEA,OAAO;EACL,SAAS;EACT,SAAS;EACT,aAAa,GAAG,UAAU,GAAG;CAC/B;AACF;;;;AAKA,SAAgB,2BACd,aACA,aACQ;CACR,IAAI,CAAC,aACH,OAAO;CAET,IAAI;EACF,OAAO,IAAI,IAAI,aAAa,WAAW,CAAC,CAAC;CAC3C,QAAQ;EACN,OAAO;CACT;AACF;;;;AAKA,SAAgB,oBACd,UACA,aACgB;CAChB,MAAM,SAAyB,KAAK,MAAM,KAAK,UAAU,QAAQ,CAAC;CAElE,IAAI,MAAM,QAAQ,OAAO,KAAK,GAC5B,OAAO,QAAQ,OAAO,MAAM,KAAK,UAAU;EACzC,GAAG;EACH,KAAK,2BAA2B,KAAK,KAAK,WAAW;CACvD,EAAE;CAGJ,IAAI,MAAM,QAAQ,OAAO,OAAO,GAC9B,OAAO,UAAU,OAAO,QAAQ,KAAK,YAAY;EAC/C,GAAG;EACH,KAAK,2BAA2B,OAAO,KAAK,WAAW;CACzD,EAAE;CAGJ,IAAI,MAAM,QAAQ,OAAO,MAAM,GAC7B,OAAO,SAAS,OAAO,OAAO,KAAK,WAAW;EAC5C,GAAG;EACH,KAAK,2BAA2B,MAAM,KAAK,WAAW;EACtD,OAAO,MAAM,QAAQ,MAAM,KAAK,IAC5B,MAAM,MAAM,KAAK,QAAQ;GACvB,GAAG;GACH,KAAK,GAAG,MACJ,2BAA2B,GAAG,KAAK,WAAW,IAC9C;EACN,EAAE,IACF;EACJ,SAAS,MAAM,QAAQ,MAAM,OAAO,IAChC,MAAM,QAAQ,KAAK,QAAQ;GACzB,GAAG;GACH,KAAK,GAAG,MACJ,2BAA2B,GAAG,KAAK,WAAW,IAC9C;EACN,EAAE,IACF;CACN,EAAE;CAGJ,OAAO;AACT;;;;AAKA,eAAsB,mBACpB,SACA,gBACkB;CAClB,IAAI,CAAC,kBAAkB,CAAC,eAAe,WAAW,SAAS,GACzD,OAAO;CAGT,MAAM,cAAc,eAAe,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,YAAY;CAC/D,IAAI,CAAC,aACH,OAAO;CAGT,MAAM,WACJ,OAAO,YAAY,WAAW,IAAI,YAAY,CAAC,CAAC,OAAO,OAAO,IAAI;CAEpE,QADmB,MAAM,cAAc,QAAQ,EAAC,CAAE,YACnC,MAAM;AACvB;AAEA,eAAe,yBACb,UACA,SACA,SACA,OACiC;CACjC,MAAM,SAAS,WAAW,UAAU,OAAO;CAC3C,MAAM,YAA6B;EACjC,MAAM,OAAO;EACb,MAAM;EACN,aAAa,OAAO;EACpB,KAAK;EACL,GAAI,SAAS,MAAM,SAAS,IAAI,EAAE,MAAM,IAAI,CAAC;CAC/C;CACA,OAAO;EACL,UAAU;GACR,MAAM,OAAO;GACb,aAAa,OAAO;GACpB,QAAQ,CAAC,SAAS;EACpB;EACA,SAAS;EACT,aAAa;CACf;AACF;AAEA,eAAe,6BACb,IACA,aACiC;CACjC,MAAM,UAAU,qCAAqC,GAAG,MAAM,GAAG,GAAG,KAAK,GAAG,GAAG;CAC/E,MAAM,UAAU,sBAAsB,GAAG,MAAM,GAAG,GAAG;CAGrD,IAAI,GAAG,SAAS;EACd,MAAM,eAAe,GAAG,QACrB,QAAQ,cAAc,EAAE,CAAC,CACzB,QAAQ,iBAAiB,EAAE;EAC9B,MAAM,WAAW,GAAG,QAAQ,GAAG,aAAa;EAC5C,MAAM,MAAM,MAAM,YAAY,QAAQ;EACtC,IAAI,CAAC,IAAI,IACP,MAAM,IAAI,MACR,4CAA4C,IAAI,OAAO,GAAG,IAAI,cAAc,KAAK,KAAK,CACxF;EAEF,OAAO,yBACL,UACA,GAAG,QAAQ,GAAG,gBACd,MAAM,IAAI,KAAK,CACjB;CACF;CAGA,IAAI,GAAG,aAAa;EAClB,MAAM,aAAa;GACjB,UAAU,GAAG,YAAY;GACzB,kBAAkB,GAAG,YAAY;GACjC,uBAAuB,GAAG,YAAY;GACtC,GAAG,GAAG,YAAY;EACpB;EACA,KAAK,MAAM,WAAW,YAAY;GAChC,MAAM,eAAe,GAAG,QAAQ,GAAG;GACnC,MAAM,MAAM,MAAM,YAAY,YAAY;GAC1C,IAAI,IAAI,IACN,OAAO,yBACL,cACA,aAAa,QAAQ,iBAAiB,EAAE,GACxC,MAAM,IAAI,KAAK,CACjB;EAEJ;EACA,MAAM,IAAI,MACR,0BAA0B,GAAG,YAAY,SAAS,GAAG,MAAM,GAAG,GAAG,MACnE;CACF;CAGA,MAAM,eAAe,GAAG,QAAQ,GAAG;CACnC,IAAI;EACF,MAAM,QAAQ,MAAM,YAAY,cAAc,EAC5C,SAAS,EAAE,QAAQ,mBAAmB,EACxC,CAAC;EACD,IAAI,MAAM,IAAI;GACZ,MAAM,cAAe,MAAM,MAAM,KAAK;GACtC,IAAI,eAAe,OAAO,gBAAgB,UACxC,OAAO;IACL,UAAU,oBAAoB,aAAa,YAAY;IACvD,SAAS;IACT,aAAa;GACf;EAEJ;CACF,QAAQ,CAER;CAGA,MAAM,aAAa,gCAAgC,GAAG,MAAM,GAAG,GAAG,KAAK,aAAa,GAAG,IAAI;CAC3F,IAAI;EACF,MAAM,UAAU,MAAM,YAAY,YAAY,EAC5C,SAAS,EAAE,QAAQ,8BAA8B,EACnD,CAAC;EACD,IAAI,QAAQ,IAAI;GAId,MAAM,UAAS,MAHS,QAAQ,KAAK,EAGd,EAAE,QAAQ,CAAC,EAAC,CAChC,QACE,SAAS,MAAM,SAAS,UAAU,OAAO,KAAK,SAAS,QAC1D,CAAC,CACA,KAAK,SAAS,KAAK,IAAc;GACpC,MAAM,eAAe,MAAM,QACxB,MAAM,MAAM,cAAc,EAAE,SAAS,WAAW,CACnD;GAEA,IAAI,aAAa,SAAS,GAAG;IAC3B,MAAM,SAA4B,CAAC;IACnC,KAAK,MAAM,eAAe,cAAc;KACtC,MAAM,WACJ,gBAAgB,aACZ,KACA,YAAY,MAAM,GAAG,EAAmB;KAC9C,MAAM,SAAS,WAAW,GAAG,SAAS,KAAK;KAC3C,MAAM,iBAAiB,MACpB,QACE,OACE,WAAW,EAAE,WAAW,MAAM,IAAI,CAAC,EAAE,SAAS,GAAG,MAClD,MAAM,WACV,CAAC,CACA,KAAK,MAAO,WAAW,EAAE,MAAM,OAAO,MAAM,IAAI,CAAE;KAErD,MAAM,WAAW,GAAG,QAAQ,GAAG;KAC/B,MAAM,QAAQ,MAAM,YAAY,QAAQ;KACxC,IAAI,CAAC,MAAM,IAAI;KACf,MAAM,SAAS,MAAM,MAAM,KAAK;KAChC,IAAI;MACF,MAAM,SAAS,WAAW,aAAa,MAAM;MAC7C,OAAO,KAAK;OACV,MAAM,OAAO;OACb,MAAM;OACN,aAAa,OAAO;OACpB,KAAK;OACL,GAAI,eAAe,SAAS,IACxB,EAAE,OAAO,CAAC,YAAY,GAAG,cAAc,EAAE,IACzC,CAAC;MACP,CAAC;KACH,QAAQ,CAER;IACF;IACA,IAAI,OAAO,SAAS,GAClB,OAAO;KACL,UAAU;MACR,MAAM,GAAG,GAAG,MAAM,GAAG,GAAG;MACxB,aAAa,qBAAqB,GAAG,MAAM,GAAG,GAAG;MACjD;KACF;KACA;KACA,aAAa;IACf;GAEJ;EACF;CACF,QAAQ,CAER;CAGA,MAAM,eAAe,GAAG,QAAQ;CAChC,MAAM,UAAU,MAAM,YAAY,YAAY;CAC9C,IAAI,QAAQ,IACV,OAAO,yBACL,cACA,SACA,MAAM,QAAQ,KAAK,CACrB;CAGF,MAAM,IAAI,MACR,6DAA6D,GAAG,MAAM,GAAG,GAAG,MAC9E;AACF;;;;;AAMA,eAAsB,uBACpB,SACA,cAA4B,WAAW,OACN;CACjC,MAAM,WAAW,sBAAsB,OAAO;CAC9C,IAAI,UACF,OAAO,6BAA6B,UAAU,WAAW;CAG3D,MAAM,EAAE,SAAS,gBAAgB,oBAAoB,OAAO;CAE5D,IAAI,gBAAgB,KAAK,WAAW,GAAG;EACrC,MAAM,WAAW,MAAM,YAAY,WAAW;EAC9C,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MACR,4CAA4C,SAAS,OAAO,GAAG,SAAS,aAAa,KAAK,CAC5F;EAGF,OAAO,yBAAyB,aAAa,SAAS,MADhC,SAAS,KAAK,CACyB;CAC/D;CAEA,MAAM,WAAW,MAAM,YAAY,aAAa,EAC9C,SAAS,EACP,QAAQ,mBACV,EACF,CAAC;CAED,IAAI,CAAC,SAAS,IACZ,MAAM,IAAI,MACR,4CAA4C,SAAS,OAAO,GAAG,SAAS,aAAa,KAAK,CAC5F;CAGF,MAAM,cAAe,MAAM,SAAS,KAAK;CACzC,IAAI,CAAC,eAAe,OAAO,gBAAgB,UACzC,MAAM,IAAI,MAAM,oDAAoD;CAKtE,OAAO;EACL,UAHuB,oBAAoB,aAAa,WAG/B;EACzB,SAAS;EACT;CACF;AACF;;;;AC7ZA,MAAM,qBAAqB,IAAI,IAAI,iBAAiB,KAAK,MAAM,EAAE,IAAI,CAAC;AACtE,MAAM,oBAAoB;AAE1B,SAAS,WACP,MACA,SACQ;CACR,IAAI,SAAS,cACX,OAAO,WAAW,KAAK,GAAG,QAAQ;CAEpC,IAAI,SAAS,UACX,OAAO,WAAW,KAAK,YAAY,QAAQ;CAG7C,OAAO,WAAW;AACpB;;;;AAKA,eAAsB,iBACpB,IACA,UAAkB,kBAClB,UACA,SAC+B;CAC/B,MAAM,QAAQ,SAAS,QAAQ,GAAE,CAAE,KAAK;CAExC,IAAI,mBAAmB,IAAI,IAAI,GAC7B,OAAO;EACL;EACA,MAAM;EACN,QAAQ;EACR,OAAO,gCAAgC;CACzC;CAGF,IAAI,CAAC,kBAAkB,KAAK,IAAI,GAC9B,OAAO;EACL;EACA,MAAM;EACN,QAAQ;EACR,OAAO,sBAAsB;CAC/B;CAGF,MAAM,aAAa,GAAG,WAAW,SAAS,OAAO,EAAE,GAAG,KAAK;CAE3D,IAAI;EAEF,IAAI,MADiB,gBAAgB,IAAI,SAAS,UAAU,KAC9C,CAAC,SAAS,WACtB,OAAO;GACL;GACA,MAAM;GACN,QAAQ;EACV;EAIF,MAAM,WAAW,OADD,SAAS,WAAW,WAAW,MACjB,CAAC,SAAS,GAAG;EAC3C,IAAI,CAAC,SAAS,IACZ,OAAO;GACL;GACA,MAAM;GACN,QAAQ;GACR,OAAO,QAAQ,SAAS,OAAO,GAAG,SAAS;EAC7C;EAGF,MAAM,OAAO,MAAM,SAAS,KAAK;EAEjC,IAAI,SAAS,QAEX;OAAI,CAAC,MADiB,mBAAmB,MAAM,SAAS,MAAM,GAE5D,OAAO;IACL;IACA,MAAM;IACN,QAAQ;IACR,OAAO;GACT;EACF;EAGF,IAAI;EACJ,IAAI;GACF,SAAS,KAAK,MAAM,IAAI;EAC1B,QAAQ;GACN,OAAO;IACL;IACA,MAAM;IACN,QAAQ;IACR,OAAO;GACT;EACF;EAGA,qBAAqB,YAAY,MAAM;EAEvC,MAAM,eACJ,IACA,SACA,YACA,KAAK,UAAU,QAAQ,MAAM,CAAC,CAChC;EAEA,IAAI,SAAS,YAAY;GACvB,MAAM,UAAW,MAAM,UACrB,IACA,YAAY,yBACd;GACA,MAAM,MAAM,IAAI,IAAI,MAAM,QAAQ,OAAO,IAAI,UAAU,CAAC,CAAC;GACzD,IAAI,IAAI,IAAI;GACZ,MAAM,UACJ,IACA,YAAY,2BACZ,MAAM,KAAK,GAAG,CAChB;EACF;EAEA,OAAO;GACL;GACA,MAAM;GACN,QAAQ;EACV;CACF,SAAS,OAAO;EACd,OAAO;GACL;GACA,MAAM;GACN,QAAQ;GACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAC9D;CACF;AACF;;;;AAKA,eAAsB,mBACpB,IACA,UAAkB,kBAClB,YACA,SAC+B;CAC/B,MAAM,QAAQ,WAAW,QAAQ,GAAE,CAAE,KAAK;CAC1C,MAAM,WACJ,KAAK,SAAS,KAAK,KAAK,KAAK,SAAS,MAAM,IAAI,OAAO,GAAG,KAAK;CACjE,MAAM,aAAa,GAAG,WAAW,WAAW,OAAO,EAAE,GAAG;CAExD,IAAI;EAEF,IAAI,MADiB,gBAAgB,IAAI,SAAS,UAAU,KAC9C,CAAC,SAAS,WACtB,OAAO;GACL;GACA,MAAM;GACN,QAAQ;EACV;EAIF,MAAM,WAAW,OADD,SAAS,WAAW,WAAW,MACjB,CAAC,WAAW,GAAG;EAC7C,IAAI,CAAC,SAAS,IACZ,OAAO;GACL;GACA,MAAM;GACN,QAAQ;GACR,OAAO,QAAQ,SAAS,OAAO,GAAG,SAAS;EAC7C;EAGF,MAAM,OAAO,MAAM,SAAS,KAAK;EAEjC,IAAI,WAAW,QAEb;OAAI,CAAC,MADiB,mBAAmB,MAAM,WAAW,MAAM,GAE9D,OAAO;IACL;IACA,MAAM;IACN,QAAQ;IACR,OAAO;GACT;EACF;EAGF,MAAM,eAAe,IAAI,SAAS,YAAY,IAAI;EAElD,OAAO;GACL;GACA,MAAM;GACN,QAAQ;EACV;CACF,SAAS,OAAO;EACd,OAAO;GACL;GACA,MAAM;GACN,QAAQ;GACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAC9D;CACF;AACF;;;;AAKA,eAAsB,kBACpB,IACA,UAAkB,kBAClB,WACA,SAC+B;CAC/B,MAAM,QAAQ,UAAU,QAAQ,GAAE,CAAE,KAAK;CACzC,MAAM,YAAY,GAAG,WAAW,UAAU,OAAO,EAAE,GAAG;CACtD,MAAM,aAAa,GAAG,UAAU;CAEhC,IAAI;EAEF,IAAI,MADiB,gBAAgB,IAAI,SAAS,UAAU,KAC9C,CAAC,SAAS,WACtB,OAAO;GACL;GACA,MAAM;GACN,QAAQ;EACV;EAGF,MAAM,UAAU,SAAS,WAAW,WAAW;EAC/C,MAAM,WAAW,MAAM,QAAQ,UAAU,GAAG;EAC5C,IAAI,CAAC,SAAS,IACZ,OAAO;GACL;GACA,MAAM;GACN,QAAQ;GACR,OAAO,QAAQ,SAAS,OAAO,GAAG,SAAS;EAC7C;EAGF,MAAM,OAAO,MAAM,SAAS,KAAK;EAEjC,IAAI,UAAU,QAEZ;OAAI,CAAC,MADiB,mBAAmB,MAAM,UAAU,MAAM,GAE7D,OAAO;IACL;IACA,MAAM;IACN,QAAQ;IACR,OAAO;GACT;EACF;EAIF,WAAW,YAAY,IAAI;EAE3B,MAAM,eAAe,IAAI,SAAS,YAAY,IAAI;EAElD,IAAI,MAAM,QAAQ,UAAU,KAAK,KAAK,UAAU,MAAM,SAAS,GAAG;GAChE,MAAM,UAAU,UAAU,IAAI,QAAQ,iBAAiB,GAAG;GAC1D,KAAK,MAAM,WAAW,UAAU,OAAO;IACrC,IAAI,OAAO,YAAY,UAAU;IACjC,MAAM,WAAW,QAAQ,QAAQ,QAAQ,EAAE,CAAC,CAAC,QAAQ,OAAO,GAAG;IAC/D,IACE,CAAC,YACD,SAAS,YAAY,MAAM,cAC3B,SAAS,MAAM,GAAG,CAAC,CAAC,MAAM,QAAQ,QAAQ,QAAQ,QAAQ,GAAG,GAE7D;IAEF,IAAI;KACF,MAAM,eAAe,IAAI,IACvB,UACA,QAAQ,SAAS,GAAG,IAAI,UAAU,GAAG,QAAQ,EAC/C,CAAC,CAAC;KACF,MAAM,eAAe,MAAM,QAAQ,YAAY;KAC/C,IAAI,aAAa,IAAI;MACnB,MAAM,gBAAgB,MAAM,aAAa,KAAK;MAC9C,MAAM,kBAAkB,GAAG,UAAU,GAAG;MACxC,MAAM,eAAe,IAAI,SAAS,iBAAiB,aAAa;KAClE;IACF,QAAQ,CAER;GACF;EACF;EAEA,OAAO;GACL;GACA,MAAM;GACN,QAAQ;EACV;CACF,SAAS,OAAO;EACd,OAAO;GACL;GACA,MAAM;GACN,QAAQ;GACR,OAAO,iBAAiB,QAAQ,MAAM,UAAU,OAAO,KAAK;EAC9D;CACF;AACF;;;;AAKA,eAAsB,sBACpB,IACA,UAAkB,kBAClB,UACA,WAKA,SACuB;CACvB,MAAM,SAAuB;EAC3B,OAAO,CAAC;EACR,QAAQ,CAAC;EACT,SAAS,CAAC;EACV,aAAa,CAAC;CAChB;CAEA,MAAM,oBAAoB,IAAI,IAAI,UAAU,aAAa,CAAC,CAAC;CAC3D,MAAM,qBAAqB,IAAI,IAAI,UAAU,cAAc,CAAC,CAAC;CAC7D,MAAM,sBAAsB,IAAI,IAAI,UAAU,eAAe,CAAC,CAAC;CAE/D,MAAM,gBAAgB,SAAS,SAAS,CAAC;CACzC,MAAM,iBAAiB,SAAS,UAAU,CAAC;CAC3C,MAAM,kBAAkB,SAAS,WAAW,CAAC;CAG7C,KAAK,MAAM,aAAa,gBACtB,IAAI,mBAAmB,IAAI,UAAU,IAAI,GAAG;EAC1C,IAAI,MAAM,QAAQ,UAAU,KAAK,GAC/B,KAAK,MAAM,KAAK,UAAU,OACxB,kBAAkB,IAAI,EAAE,IAAI;EAGhC,IAAI,MAAM,QAAQ,UAAU,OAAO,GACjC,KAAK,MAAM,KAAK,UAAU,SACxB,oBAAoB,IAAI,EAAE,IAAI;CAGpC;CAIF,KAAK,MAAM,cAAc,iBACvB,IAAI,oBAAoB,IAAI,WAAW,IAAI,GAAG;EAC5C,MAAM,SAAS,MAAM,mBAAmB,IAAI,SAAS,YAAY,OAAO;EACxE,OAAO,QAAQ,KAAK,MAAM;EAC1B,IAAI,OAAO,WAAW,YAAY,OAAO,OACvC,OAAO,YAAY,KAAK,UAAU,WAAW,KAAK,IAAI,OAAO,OAAO;CAExE;CAIF,KAAK,MAAM,YAAY,eACrB,IAAI,kBAAkB,IAAI,SAAS,IAAI,GAAG;EACxC,MAAM,SAAS,MAAM,iBAAiB,IAAI,SAAS,UAAU,OAAO;EACpE,OAAO,MAAM,KAAK,MAAM;EACxB,IAAI,OAAO,WAAW,YAAY,OAAO,OACvC,OAAO,YAAY,KAAK,QAAQ,SAAS,KAAK,IAAI,OAAO,OAAO;CAEpE;CAIF,KAAK,MAAM,aAAa,gBACtB,IAAI,mBAAmB,IAAI,UAAU,IAAI,GAAG;EAC1C,MAAM,SAAS,MAAM,kBAAkB,IAAI,SAAS,WAAW,OAAO;EACtE,OAAO,OAAO,KAAK,MAAM;EACzB,IAAI,OAAO,WAAW,YAAY,OAAO,OACvC,OAAO,YAAY,KAAK,SAAS,UAAU,KAAK,IAAI,OAAO,OAAO;CAEtE;CAGF,OAAO;AACT;;;;ACxXA,IAAa,aAAb,MAAwB;CACtB,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAGR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CACR,AAAQ;CAER,cAAc;EACZ,KAAK,oBAAoB,IAAI,OAAO,MAClC,IAAI,IAAI,wBAAwB,gBAAgB,CAClD;EACA,KAAK,eAAe,IAAI,OAAO,MAAM,CAAC,CAAC;EACvC,KAAK,oBAAoB,IAAI,OAAO,MAAM,CAAC,CAAC;EAC5C,KAAK,+BAA+B,IAAI,OAAO,MAC7C,IACF;EACA,KAAK,wBAAwB,IAAI,OAAO,MAAM,EAAE;EAChD,KAAK,YAAY,IAAI,OAAO,MAAM,CAAC,CAAC;EACpC,KAAK,mBAAmB,IAAI,OAAO,MAAM,wBAAwB,EAAE;EACnE,KAAK,qBAAqB,IAAI,OAAO,MAAM,KAAK;EAChD,KAAK,qBAAqB,IAAI,OAAO,MAAM,QAAQ;EACnD,KAAK,gBAAgB,IAAI,OAAO,MAC9B,6CACF;EACA,KAAK,2BAA2B,IAAI,OAAO,MAAM,MAAU;EAC3D,KAAK,8BAA8B,IAAI,OAAO,MAAM,GAAI;EACxD,KAAK,uBAAuB,IAAI,OAAO,MACrC,+EACF;EAGA,KAAK,YAAY,IAAI,OAAO,eAAe,CACzC,GAAG,kBACH,GAAG,KAAK,aAAa,IAAI,CAC3B,CAAC;EAED,KAAK,gBAAgB,IAAI,OAAO,eAAe;GAC7C,MAAM,UAAU,KAAK,kBAAkB,IAAI;GAE3C,OAAO,KAAK,UACT,IAAI,CAAC,CACL,QAAQ,MAAsB,QAAQ,IAAI,EAAE,IAAI,CAAC;EACtD,CAAC;EAED,KAAK,2BAA2B,IAAI,OAAO,eAAe;GACxD,MAAM,QAAQ,KAAK,kBAAkB,IAAI;GACzC,MAAM,aAAa,KAAK,6BAA6B,IAAI;GACzD,IAAI,CAAC,cAAc,WAAW,SAAS,GACrC,OAAO,CAAC;GAEV,OAAO,MAAM,QAAQ,MAAM,WAAW,IAAI,EAAE,IAAI,CAAC;EACnD,CAAC;EAED,KAAK,iBAAiB,IAAI,OAAO,eAAe;GAC9C,MAAM,KAAK,KAAK,iBAAiB,IAAI;GACrC,IAAI,CAAC,IACH,OAAO;GAGT,IAAI,wBAAwB,OAAO,IACjC,OAAO;GAGT,OAAO,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,MAAmB,EAAE,OAAO,EAAE,KAAK;EACvE,CAAC;CACH;CAEA,IAAI,gBAAoC;EACtC,OAAO,KAAK,eAAe,IAAI;CACjC;CAEA,IAAI,kBAAiC;EACnC,OAAO,KAAK,iBAAiB,IAAI;CACnC;CAEA,IAAI,WAA6B;EAC/B,OAAO,KAAK,UAAU,IAAI;CAC5B;CAEA,IAAI,cAAgC;EAClC,OAAO,KAAK,aAAa,IAAI;CAC/B;CAEA,IAAI,mBAAgD;EAClD,OAAO,KAAK,kBAAkB,IAAI;CACpC;CAEA,IAAI,8BAAkD;EACpD,OAAO,KAAK,6BAA6B,IAAI;CAC/C;CAEA,IAAI,0BAAuD;EACzD,OAAO,KAAK,yBAAyB,IAAI;CAC3C;CAEA,IAAI,mBAAgC;EAClC,OAAO,KAAK,kBAAkB,IAAI;CACpC;CAEA,IAAI,eAAiC;EACnC,OAAO,KAAK,cAAc,IAAI;CAChC;CAEA,yBAAyB,MAAuB;EAC9C,MAAM,aAAa,KAAK,6BAA6B,IAAI;EACzD,IAAI,CAAC,YACH,OAAO;EAET,OAAO,WAAW,IAAI,IAAI;CAC5B;CAEA,MAAM,wBACJ,IACA,SACsC;EACtC,IAAI;GACF,MAAM,MAAM,MAAM,qBAAqB,IAAI,WAAW,SAAS;GAC/D,MAAM,sBAAsB,KAAK;GACjC,MAAM,aAAa,KAAK,SAAS,CAAC,EAAC,CAAE,QAClC,OAAO,CAAC,oBAAoB,MAAM,OAAO,GAAG,SAAS,GAAG,IAAI,CAC/D;GAEA,MAAM,UAAU,KAAK,kBAAkB,IAAI;GAW3C,IAAI,EATF,QAAQ,WAAW,UAAU,UAC7B,QAAQ,OACL,GAAG,MACF,EAAE,SAAS,UAAU,EAAE,CAAC,QACxB,EAAE,gBAAgB,UAAU,EAAE,CAAC,eAC/B,KAAK,UAAU,EAAE,SAAS,MACxB,KAAK,UAAU,UAAU,EAAE,CAAC,SAAS,CAC3C,IAGA,KAAK,kBAAkB,IAAI,SAAS;GAEtC,OAAO;EACT,QAAQ;GACN,IAAI,KAAK,kBAAkB,IAAI,CAAC,CAAC,SAAS,GACxC,KAAK,kBAAkB,IAAI,CAAC,CAAC;GAE/B,OAAO,CAAC;EACV;CACF;CAEA,MAAM,0BACJ,IACA,UACA,SACe;EACf,MAAM,iBAAiB,KAAK,6BAA6B,IAAI;EAC7D,MAAM,UAAU,IAAI,IAAI,mBAAmB,OAAO,CAAC,IAAI,cAAc;EACrE,IAAI,SACF,QAAQ,IAAI,QAAQ;OAEpB,QAAQ,OAAO,QAAQ;EAEzB,KAAK,6BAA6B,IAAI,OAAO;EAC7C,MAAM,UACJ,IACA,YAAY,2BACZ,MAAM,KAAK,OAAO,CACpB;CACF;CAEA,MAAM,yBACJ,IACA,WACe;EACf,MAAM,UAAU,IAAI,IAAI,SAAS;EACjC,KAAK,6BAA6B,IAAI,OAAO;EAC7C,MAAM,UAAU,IAAI,YAAY,2BAA2B,SAAS;CACtE;;;;CAKA,MAAM,6BACJ,SACiC;EACjC,OAAO,MAAM,uBAAuB,OAAO;CAC7C;;;;CAKA,MAAM,qBACJ,IACA,UACA,WAKA,SACuB;EACvB,MAAM,UAAU,SAAS,WAAW;EACpC,MAAM,SAAS,MAAM,sBACnB,IACA,SACA,UACA,WACA,OACF;EACA,MAAM,KAAK,wBAAwB,IAAI,OAAO;EAC9C,OAAO;CACT;;;;CAKA,eAAuB;EACrB,OAAO,KAAK,UACV;GACE,cAAc,CAAC,GAAG,KAAK,kBAAkB,IAAI,CAAC;GAC9C,aAAa,KAAK,aAAa,IAAI;GACnC,yBAAyB,KAAK,6BAA6B,IAAI,IAC3D,MAAM,KAAK,KAAK,6BAA6B,IAAI,CAAE,IACnD;GACJ,sBAAsB,KAAK,sBAAsB,IAAI;GACrD,UAAU,KAAK,UAAU,IAAI;GAC7B,iBAAiB,KAAK,iBAAiB,IAAI;GAC3C,mBAAmB,KAAK,mBAAmB,IAAI;GAC/C,mBAAmB,KAAK,mBAAmB,IAAI;GAC/C,cAAc,KAAK,cAAc,IAAI;GACrC,yBAAyB,KAAK,yBAAyB,IAAI;GAC3D,4BAA4B,KAAK,4BAA4B,IAAI;GACjE,qBAAqB,KAAK,qBAAqB,IAAI;EACrD,GACA,MACA,CACF;CACF;CAEA,wBAAwB,YAAqB,OAA+B;EAC1E,OAAO,KAAK,SAAS,QAAQ,MAAM;GACjC,IAAI,EAAE,cAAc,EAAE,eAAe,YACnC,OAAO;GAGT,IAAI,EAAE,SAAS,EAAE,UAAU,OACzB,OAAO;GAGT,OAAO;EACT,CAAC;CACH;CAEA,IAAI,WAA0B;EAC5B,OAAO,CAAC,yBAAyB,GAAG,KAAK,UAAU,IAAI,CAAC;CAC1D;CAEA,IAAI,uBAA+B;EACjC,OAAO,KAAK,sBAAsB,IAAI;CACxC;CAEA,IAAI,oBAA4B;EAC9B,OAAO,KAAK,mBAAmB,IAAI;CACrC;CAEA,IAAI,eAAuB;EACzB,OAAO,KAAK,cAAc,IAAI;CAChC;CAEA,IAAI,oBAA6B;EAC/B,OAAO,KAAK,mBAAmB,IAAI;CACrC;CAEA,IAAI,0BAAkC;EACpC,OAAO,KAAK,yBAAyB,IAAI;CAC3C;CAEA,IAAI,6BAAqC;EACvC,OAAO,KAAK,4BAA4B,IAAI;CAC9C;;CAGA,IAAI,sBAA8B;EAChC,OAAO,KAAK,qBAAqB,IAAI;CACvC;;CAGA,IAAI,yBAAsC;EACxC,OAAO,IAAI,IACT,KAAK,qBACF,IAAI,CAAC,CACL,MAAM,GAAG,CAAC,CACV,KAAK,MAAM,EAAE,KAAK,CAAC,CAAC,CACpB,OAAO,OAAO,CACnB;CACF;CAEA,MAAM,gBACJ,IACA,WACe;EACf,MAAM,UAAU,KAAK,SAAS,MAAM,MAAM,EAAE,OAAO,SAAS;EAC5D,IAAI,CAAC,SACH;EAGF,KAAK,iBAAiB,IAAI,SAAS;EACnC,KAAK,kBAAkB,IAAI,IAAI,IAAI,QAAQ,gBAAgB,CAAC;EAC5D,KAAK,aAAa,IAAI,QAAQ,WAAW;EACzC,KAAK,sBAAsB,IAAI,QAAQ,wBAAwB,EAAE;EAEjE,MAAM,QAAQ,IAAI;GAChB,UAAU,IAAI,YAAY,qBAAqB,SAAS;GACxD,UAAU,IAAI,YAAY,eAAe,QAAQ,gBAAgB;GACjE,UAAU,IAAI,YAAY,cAAc,QAAQ,WAAW;GAC3D,UACE,IACA,YAAY,wBACZ,QAAQ,wBAAwB,EAClC;EACF,CAAC;CACH;CAEA,MAAM,cACJ,IACA,MACe;EACf,MAAM,QAAQ,CAAC,GAAG,KAAK,aAAa,IAAI,GAAG,IAAI;EAC/C,KAAK,aAAa,IAAI,KAAK;EAE3B,MAAM,UAAU,IAAI,IAAI,KAAK,kBAAkB,IAAI,CAAC;EACpD,QAAQ,IAAI,KAAK,IAAI;EACrB,KAAK,kBAAkB,IAAI,OAAO;EAClC,MAAM,QAAQ,IAAI,CAChB,UAAU,IAAI,YAAY,cAAc,KAAK,GAC7C,UAAU,IAAI,YAAY,eAAe,CAAC,GAAG,OAAO,CAAC,CACvD,CAAC;CACH;CAIA,MAAM,WACJ,IACA,SACe;EACf,MAAM,WAAW,CAAC,GAAG,KAAK,UAAU,IAAI,GAAG,OAAO;EAClD,KAAK,UAAU,IAAI,QAAQ;EAC3B,MAAM,UAAU,IAAI,YAAY,eAAe,QAAQ;CACzD;CAEA,MAAM,UACJ,IACA,gBACA,aACA,gBACkB;EAClB,MAAM,SAAS,KAAK,SAAS,MAAM,MAAM,EAAE,SAAS,cAAc;EAClE,IAAI,CAAC,QACH,OAAO;EAGT,IAAI,KAAK,SAAS,MAAM,MAAM,EAAE,SAAS,WAAW,GAClD,OAAO;EAGT,MAAM,SAAyB;GAC7B,MAAM;GACN,aAAa,kBAAkB,OAAO;GACtC,cAAc,KAAK,MAAM,KAAK,UAAU,OAAO,YAAY,CAAC;EAC9D;EAEA,MAAM,KAAK,cAAc,IAAI,MAAM;EAEnC,OAAO;CACT;CAEA,MAAM,kBAAkB,IAAuC;EAC7D,KAAK,iBAAiB,IAAI,IAAI;EAC9B,MAAM,UAAU,IAAI,YAAY,qBAAqB,IAAI;CAC3D;CAEA,MAAM,cACJ,IACA,WACe;EACf,IAAI,cAAc,wBAAwB,IACxC;EAGF,MAAM,WAAW,KAAK,UAAU,IAAI,CAAC,CAAC,QAAQ,MAAM,EAAE,OAAO,SAAS;EACtE,KAAK,UAAU,IAAI,QAAQ;EAC3B,IAAI,KAAK,iBAAiB,IAAI,MAAM,WAAW;GAC7C,KAAK,iBAAiB,IAAI,IAAI;GAC9B,MAAM,UAAU,IAAI,YAAY,qBAAqB,IAAI;EAC3D;EAEA,MAAM,UAAU,IAAI,YAAY,eAAe,QAAQ;CACzD;CAEA,MAAM,aAAa,IAAwB,MAA6B;EACtE,MAAM,OAAO,KAAK,MAAM,IAAI;EAC5B,IAAI,MAAM,QAAQ,KAAK,YAAY,GAAG;GACpC,KAAK,kBAAkB,IAAI,IAAI,IAAI,KAAK,YAAY,CAAC;GACrD,MAAM,UAAU,IAAI,YAAY,eAAe,KAAK,YAAY;EAClE;EAEA,IAAI,MAAM,QAAQ,KAAK,WAAW,GAAG;GACnC,KAAK,aAAa,IAAI,KAAK,WAAW;GACtC,MAAM,UAAU,IAAI,YAAY,cAAc,KAAK,WAAW;EAChE;EAEA,IAAI,OAAO,KAAK,yBAAyB,UAAU;GACjD,KAAK,sBAAsB,IAAI,KAAK,oBAAoB;GACxD,MAAM,UACJ,IACA,YAAY,wBACZ,KAAK,oBACP;EACF;EAEA,IAAI,MAAM,QAAQ,KAAK,QAAQ,GAAG;GAChC,KAAK,UAAU,IAAI,KAAK,QAAQ;GAChC,MAAM,UAAU,IAAI,YAAY,eAAe,KAAK,QAAQ;EAC9D;EAEA,IACE,OAAO,KAAK,oBAAoB,YAChC,KAAK,oBAAoB,MACzB;GACA,KAAK,iBAAiB,IAAI,KAAK,eAAe;GAC9C,MAAM,UACJ,IACA,YAAY,qBACZ,KAAK,eACP;EACF;EAEA,IAAI,OAAO,KAAK,sBAAsB,WAAW;GAC/C,KAAK,mBAAmB,IAAI,KAAK,iBAAiB;GAClD,MAAM,UACJ,IACA,YAAY,sBACZ,KAAK,oBAAoB,SAAS,OACpC;EACF;EAEA,IAAI,OAAO,KAAK,sBAAsB,UAAU;GAC9C,KAAK,mBAAmB,IAAI,KAAK,iBAAiB;GAClD,MAAM,UACJ,IACA,YAAY,sBACZ,KAAK,iBACP;EACF;EAEA,IAAI,OAAO,KAAK,iBAAiB,UAAU;GACzC,KAAK,cAAc,IAAI,KAAK,YAAY;GACxC,MAAM,UAAU,IAAI,YAAY,gBAAgB,KAAK,YAAY;EACnE;EAEA,IACE,OAAO,KAAK,4BAA4B,YACxC,KAAK,0BAA0B,GAC/B;GACA,KAAK,yBAAyB,IAAI,KAAK,uBAAuB;GAC9D,MAAM,UACJ,IACA,YAAY,6BACZ,OAAO,KAAK,uBAAuB,CACrC;EACF;EAEA,IACE,OAAO,KAAK,+BAA+B,YAC3C,KAAK,6BAA6B,GAClC;GACA,KAAK,4BAA4B,IAAI,KAAK,0BAA0B;GACpE,MAAM,UACJ,IACA,YAAY,gCACZ,OAAO,KAAK,0BAA0B,CACxC;EACF;EAEA,IAAI,OAAO,KAAK,wBAAwB,UAAU;GAChD,KAAK,qBAAqB,IAAI,KAAK,mBAAmB;GACtD,MAAM,UACJ,IACA,YAAY,wBACZ,KAAK,mBACP;EACF;EAEA,IAAI,MAAM,QAAQ,KAAK,uBAAuB,GAAG;GAC/C,KAAK,6BAA6B,IAChC,IAAI,IAAI,KAAK,uBAAuB,CACtC;GACA,MAAM,UACJ,IACA,YAAY,2BACZ,KAAK,uBACP;EACF,OAAO,IAAI,KAAK,4BAA4B,MAAM;GAChD,KAAK,6BAA6B,IAAI,IAAI;GAC1C,MAAM,UAAU,IAAI,YAAY,2BAA2B,IAAI;EACjE;CACF;;;;CAKA,MAAM,KAAK,IAAuC;EAChD,MAAM,CACJ,YACA,WACA,gBACA,aACA,oBACA,sBACA,sBACA,iBACA,4BACA,+BACA,wBACA,yBACE,MAAM,QAAQ,IAAI;GACpB,UAAU,IAAI,YAAY,aAAa;GACvC,UAAU,IAAI,YAAY,YAAY;GACtC,UAAU,IAAI,YAAY,sBAAsB;GAChD,UAAU,IAAI,YAAY,aAAa;GACvC,UAAU,IAAI,YAAY,mBAAmB;GAC7C,UAAU,IAAI,YAAY,oBAAoB;GAC9C,UAAU,IAAI,YAAY,oBAAoB;GAC9C,UAAU,IAAI,YAAY,cAAc;GACxC,UAAU,IAAI,YAAY,2BAA2B;GACrD,UAAU,IAAI,YAAY,8BAA8B;GACxD,UAAU,IAAI,YAAY,sBAAsB;GAChD,UAAU,IAAI,YAAY,yBAAyB;EACrD,CAAC;EAED,IAAI,MAAM,QAAQ,UAAU,GAC1B,KAAK,kBAAkB,IAAI,IAAI,IAAI,UAAU,CAAC;EAGhD,IAAI,MAAM,QAAQ,SAAS,GACzB,KAAK,aAAa,IAAI,SAAS;EAGjC,IAAI,MAAM,QAAQ,qBAAqB,GACrC,KAAK,6BAA6B,IAAI,IAAI,IAAI,qBAAqB,CAAC;EAGtE,IAAI,OAAO,mBAAmB,UAC5B,KAAK,sBAAsB,IAAI,cAAc;EAG/C,IAAI,MAAM,QAAQ,WAAW,GAC3B,KAAK,UAAU,IAAI,WAAW;EAGhC,IAAI,OAAO,uBAAuB,UAChC,KAAK,iBAAiB,IAAI,kBAAkB;EAG9C,IAAI,yBAAyB,QAAQ,yBAAyB,QAAW;GACvE,MAAM,SAAS,OAAO,oBAAoB,CAAC,CAAC,YAAY;GACxD,KAAK,mBAAmB,IAAI,WAAW,UAAU,WAAW,GAAG;EACjE;EAEA,IACE,OAAO,yBAAyB,YAChC,qBAAqB,KAAK,CAAC,CAAC,SAAS,GAErC,KAAK,mBAAmB,IAAI,qBAAqB,KAAK,CAAC;EAGzD,IACE,OAAO,oBAAoB,YAC3B,gBAAgB,KAAK,CAAC,CAAC,SAAS,GAEhC,KAAK,cAAc,IAAI,gBAAgB,KAAK,CAAC;EAG/C,IACE,+BAA+B,QAC/B,+BAA+B,QAC/B;GACA,MAAM,IAAI,OAAO,0BAA0B;GAC3C,IAAI,OAAO,SAAS,CAAC,KAAK,IAAI,GAC5B,KAAK,yBAAyB,IAAI,CAAC;EAEvC;EAEA,IACE,kCAAkC,QAClC,kCAAkC,QAClC;GACA,MAAM,IAAI,OAAO,6BAA6B;GAC9C,IAAI,OAAO,SAAS,CAAC,KAAK,IAAI,GAC5B,KAAK,4BAA4B,IAAI,CAAC;EAE1C;EAEA,IACE,OAAO,2BAA2B,YAClC,uBAAuB,KAAK,CAAC,CAAC,SAAS,GAEvC,KAAK,qBAAqB,IAAI,uBAAuB,KAAK,CAAC;CAE/D;CAEA,MAAM,qBACJ,IACA,UACe;EACf,MAAM,UAAU,SAAS,KAAK,KAAK;EACnC,KAAK,mBAAmB,IAAI,OAAO;EACnC,MAAM,UAAU,IAAI,YAAY,sBAAsB,OAAO;CAC/D;CAEA,MAAM,gBAAgB,IAAwB,KAA4B;EACxE,MAAM,UAAU,IAAI,KAAK,KAAK;EAC9B,KAAK,cAAc,IAAI,OAAO;EAC9B,MAAM,UAAU,IAAI,YAAY,gBAAgB,OAAO;CACzD;CAEA,MAAM,qBACJ,IACA,UACe;EACf,MAAM,UAAU,CAAC,CAAC;EAClB,KAAK,mBAAmB,IAAI,OAAO;EACnC,MAAM,UACJ,IACA,YAAY,sBACZ,UAAU,SAAS,OACrB;CACF;CAEA,MAAM,2BACJ,IACA,OACe;EACf,MAAM,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;EAC7C,KAAK,yBAAyB,IAAI,OAAO;EACzC,MAAM,UACJ,IACA,YAAY,6BACZ,OAAO,OAAO,CAChB;CACF;CAEA,MAAM,8BACJ,IACA,OACe;EACf,MAAM,UAAU,KAAK,IAAI,GAAG,KAAK,MAAM,KAAK,CAAC;EAC7C,KAAK,4BAA4B,IAAI,OAAO;EAC5C,MAAM,UACJ,IACA,YAAY,gCACZ,OAAO,OAAO,CAChB;CACF;CAEA,MAAM,uBACJ,IACA,MACe;EACf,MAAM,UAAU,KAAK,KAAK;EAC1B,KAAK,qBAAqB,IAAI,OAAO;EACrC,MAAM,UAAU,IAAI,YAAY,wBAAwB,OAAO;CACjE;CAEA,MAAM,iBACJ,IACA,UACe;EACf,MAAM,QAAQ,KAAK,aAAa,IAAI,CAAC,CAAC,QAAQ,MAAM,EAAE,SAAS,QAAQ;EACvE,KAAK,aAAa,IAAI,KAAK;EAC3B,MAAM,UAAU,IAAI,IAAI,KAAK,kBAAkB,IAAI,CAAC;EACpD,QAAQ,OAAO,QAAQ;EACvB,KAAK,kBAAkB,IAAI,OAAO;EAClC,MAAM,QAAQ,IAAI,CAChB,UAAU,IAAI,YAAY,cAAc,KAAK,GAC7C,UAAU,IAAI,YAAY,eAAe,CAAC,GAAG,OAAO,CAAC,CACvD,CAAC;CACH;CAEA,MAAM,oBAAoB,IAAuC;EAC/D,MAAM,KAAK,KAAK,iBAAiB,IAAI;EACrC,IAAI,CAAC,IACH;EAGF,MAAM,UAAU,KAAK,UAAU,IAAI,CAAC,CAAC,MAAM,MAAM,EAAE,OAAO,EAAE;EAC5D,IAAI,CAAC,SACH;EAGF,MAAM,UAAU;GACd,GAAG;GACH,kBAAkB,CAAC,GAAG,KAAK,kBAAkB,IAAI,CAAC;GAClD,aAAa,CAAC,GAAG,KAAK,aAAa,IAAI,CAAC;GACxC,sBAAsB,KAAK,sBAAsB,IAAI;EACvD;EACA,MAAM,KAAK,cAAc,IAAI,OAAO;CACtC;CAEA,MAAM,cACJ,IACA,WACe;EACf,KAAK,kBAAkB,IAAI,IAAI,IAAI,SAAS,CAAC;EAE7C,MAAM,QAAQ,CAAC,UAAU,IAAI,YAAY,eAAe,SAAS,CAAC;EAClE,IAAI,KAAK,iBAAiB,IAAI,GAAG;GAC/B,KAAK,iBAAiB,IAAI,IAAI;GAC9B,MAAM,KAAK,UAAU,IAAI,YAAY,qBAAqB,IAAI,CAAC;EACjE;EAEA,MAAM,QAAQ,IAAI,KAAK;CACzB;CAEA,MAAM,wBACJ,IACA,UACe;EACf,KAAK,sBAAsB,IAAI,QAAQ;EACvC,MAAM,UAAU,IAAI,YAAY,wBAAwB,QAAQ;CAClE;CAEA,MAAM,eACJ,IACA,UACA,SACe;EACf,MAAM,UAAU,IAAI,IAAI,KAAK,kBAAkB,IAAI,CAAC;EACpD,IAAI,SACF,QAAQ,IAAI,QAAQ;OAEpB,QAAQ,OAAO,QAAQ;EAGzB,KAAK,kBAAkB,IAAI,OAAO;EAElC,MAAM,QAAQ,CAAC,UAAU,IAAI,YAAY,eAAe,CAAC,GAAG,OAAO,CAAC,CAAC;EACrE,IAAI,KAAK,iBAAiB,IAAI,GAAG;GAC/B,KAAK,iBAAiB,IAAI,IAAI;GAC9B,MAAM,KAAK,UAAU,IAAI,YAAY,qBAAqB,IAAI,CAAC;EACjE;EAEA,MAAM,QAAQ,IAAI,KAAK;CACzB;CAEA,MAAM,cACJ,IACA,SACe;EACf,MAAM,WAAW,KAAK,UACnB,IAAI,CAAC,CACL,KAAK,MAAO,EAAE,OAAO,QAAQ,KAAK,UAAU,CAAE;EACjD,KAAK,UAAU,IAAI,QAAQ;EAC3B,MAAM,UAAU,IAAI,YAAY,eAAe,QAAQ;CACzD;AACF;AAEA,MAAa,aAAa,IAAI,WAAW"}
1
+ {"version":3,"file":"tools-B8OJ4sMF.js","names":["TOOL_NAME_PATTERN","matter"],"sources":["../../src/storage/read-group-file.ts","../../src/db/get-all-tasks.ts","../../src/storage/write-file-handle.ts","../../src/storage/group-file-exists.ts","../../src/storage/write-group-file.ts","../../src/subsystems/tools/builtin-profiles.ts","../../src/subsystems/tools/declarative.ts","../../src/subsystems/skills/parse-skill.ts","../../src/subsystems/tools/remote/discovery.ts","../../src/subsystems/tools/remote/import-artifacts.ts","../../src/stores/tools.ts"],"sourcesContent":["import { getGroupDir } from \"./get-group-dir.js\";\nimport { parsePath } from \"./parse-path.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Read a file from a group's workspace.\n */\nexport async function readGroupFile(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n): Promise<string> {\n const groupDir = await getGroupDir(db, groupId);\n const { dirs, filename } = parsePath(filePath);\n\n let dir = groupDir;\n for (const seg of dirs) {\n dir = await dir.getDirectoryHandle(seg);\n }\n\n // Re-acquire file handle and file object to force filesystem re-stat\n const fileHandle = await dir.getFileHandle(filename);\n\n try {\n const syncHandle = await (fileHandle as any).createSyncAccessHandle();\n const size = syncHandle.getSize();\n const buf = new Uint8Array(size);\n\n syncHandle.read(buf, { at: 0 });\n syncHandle.close();\n\n return new TextDecoder(\"utf-8\").decode(buf);\n } catch {\n // Not OPFS or not in a Worker — use File System Access API path\n const file = await fileHandle.getFile();\n\n return file.text();\n }\n}\n","import { txPromise } from \"./tx-promise.js\";\nimport type { ShadowClawDatabase, Task } from \"./types.js\";\n\n/**\n * Get all tasks\n */\nexport function getAllTasks(db: ShadowClawDatabase): Promise<Task[]> {\n return txPromise<any[]>(db, \"tasks\", \"readonly\", (store) =>\n store.getAll(),\n ).then((tasks) => tasks.map((t) => ({ ...t, enabled: !!t.enabled })));\n}\n","import { toTrustedScriptUrl } from \"../security/trusted-types.js\";\n\nexport type WriteContent = string | Blob | ArrayBuffer | Uint8Array;\n\n/**\n * Write data to a FileSystemFileHandle across browser implementations.\n */\nexport async function writeFileHandle(\n fileHandle: FileSystemFileHandle,\n content: WriteContent,\n): Promise<void> {\n const createWritable = fileHandle?.createWritable;\n const legacyCreateWriteable = Reflect.get(fileHandle, \"createWriteable\");\n const openWritable =\n typeof createWritable === \"function\"\n ? createWritable.bind(fileHandle)\n : typeof legacyCreateWriteable === \"function\"\n ? legacyCreateWriteable.bind(fileHandle)\n : null;\n\n if (openWritable) {\n const writable = await openWritable();\n await writable.write(toWritableChunk(content));\n await writable.close();\n\n return;\n }\n\n if (typeof (fileHandle as any).createSyncAccessHandle === \"function\") {\n const syncHandle = await (fileHandle as any).createSyncAccessHandle();\n\n try {\n const bytes = await toUint8Array(content);\n\n // Replace file content atomically when using sync handles.\n syncHandle.truncate(0);\n syncHandle.write(bytes, { at: 0 });\n if (typeof syncHandle.flush === \"function\") {\n syncHandle.flush();\n }\n } finally {\n syncHandle.close();\n }\n\n return;\n }\n\n throw new Error(\n \"Writable file streams are not supported by this browser/storage backend.\",\n );\n}\n\n/**\n * Write a file in the Origin Private File System (OPFS) by navigating to it\n * via path segments inside an inline Web Worker.\n */\nexport async function writeOpfsPathViaWorker(\n pathSegments: string[],\n content: WriteContent,\n): Promise<void> {\n if (typeof globalThis.Worker !== \"function\") {\n throw new Error(\n \"Writable file streams are not supported by this browser/storage backend.\",\n );\n }\n\n const bytes = await toUint8Array(content);\n\n return new Promise((resolve, reject) => {\n let blobUrl = \"\";\n let worker: Worker | null = null;\n\n try {\n // The worker navigates OPFS by path entirely on its own side —\n // no handle objects are transferred across the boundary.\n const src = [\n \"self.onmessage = async (e) => {\",\n \" try {\",\n \" const { pathSegments, bytes } = e.data;\",\n \" let dir = await navigator.storage.getDirectory();\",\n \" for (let i = 0; i < pathSegments.length - 1; i++) {\",\n \" dir = await dir.getDirectoryHandle(pathSegments[i], { create: true });\",\n \" }\",\n \" const filename = pathSegments[pathSegments.length - 1];\",\n \" const fh = await dir.getFileHandle(filename, { create: true });\",\n \" const h = await fh.createSyncAccessHandle();\",\n \" try {\",\n \" h.truncate(0);\",\n \" h.write(bytes, { at: 0 });\",\n \" if (typeof h.flush === 'function') h.flush();\",\n \" } finally { h.close(); }\",\n \" self.postMessage({ ok: true });\",\n \" } catch (err) {\",\n \" self.postMessage({ error: err.message || String(err) });\",\n \" }\",\n \"};\",\n ].join(\"\\n\");\n\n blobUrl = URL.createObjectURL(\n new Blob([src], { type: \"text/javascript\" }),\n );\n worker = new Worker(toTrustedScriptUrl(blobUrl) as string);\n } catch {\n if (blobUrl) {\n URL.revokeObjectURL(blobUrl);\n }\n\n reject(\n new Error(\n \"Writable file streams are not supported by this browser/storage backend.\",\n ),\n );\n\n return;\n }\n\n const cleanup = () => {\n if (worker) {\n worker.terminate();\n }\n\n URL.revokeObjectURL(blobUrl);\n };\n\n worker.onmessage = (e) => {\n cleanup();\n if (e.data?.error) {\n reject(new Error(e.data.error));\n } else {\n resolve();\n }\n };\n\n worker.onerror = (e) => {\n cleanup();\n reject(new Error(e.message || \"Worker file write failed\"));\n };\n\n worker.postMessage({ pathSegments, bytes }, [bytes.buffer]);\n });\n}\n\nfunction toWritableChunk(content: WriteContent): string | Blob {\n if (typeof content === \"string\" || content instanceof Blob) {\n return content;\n }\n\n if (content instanceof Uint8Array) {\n const copy = new Uint8Array(content.byteLength);\n copy.set(content);\n\n return new Blob([copy]);\n }\n\n return new Blob([content]);\n}\n\n/**\n * Convert input content to a Uint8Array.\n */\nasync function toUint8Array(content: WriteContent): Promise<Uint8Array> {\n if (content instanceof Uint8Array) {\n return content;\n }\n\n if (typeof content === \"string\") {\n return new TextEncoder().encode(content);\n }\n\n if (content instanceof Blob) {\n return new Uint8Array(await content.arrayBuffer());\n }\n\n if (content instanceof ArrayBuffer) {\n return new Uint8Array(content);\n }\n\n return new Uint8Array();\n}\n","import { readGroupFile } from \"./read-group-file.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Check if a file exists in a group's workspace.\n */\nexport async function groupFileExists(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n): Promise<boolean> {\n try {\n await readGroupFile(db, groupId, filePath);\n\n return true;\n } catch {\n return false;\n }\n}\n","import { getGroupDir } from \"./get-group-dir.js\";\nimport { parsePath } from \"./parse-path.js\";\nimport {\n getOpfsRootDirName,\n getStorageStatus,\n invalidateStorageRoot,\n isStaleHandleError,\n} from \"./storage.js\";\nimport {\n writeFileHandle,\n writeOpfsPathViaWorker,\n type WriteContent,\n} from \"./write-file-handle.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\n\n/**\n * Write content to a file in a group's workspace.\n * Creates intermediate directories as needed.\n */\nexport async function writeGroupFile(\n db: ShadowClawDatabase,\n groupId: string,\n filePath: string,\n content: WriteContent,\n): Promise<void> {\n const { dirs, filename } = parsePath(filePath);\n\n for (let attempt = 0; attempt < 2; attempt++) {\n try {\n const groupDir = await getGroupDir(db, groupId);\n let dir = groupDir;\n for (const seg of dirs) {\n dir = await dir.getDirectoryHandle(seg, { create: true });\n }\n\n const fileHandle = await dir.getFileHandle(filename, { create: true });\n\n try {\n await writeFileHandle(fileHandle, content);\n\n return;\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n const needsOpfsWorkerFallback =\n message.includes(\"Writable file streams are not supported\") &&\n (await getStorageStatus(db)).type === \"opfs\";\n\n if (!needsOpfsWorkerFallback) {\n throw err;\n }\n }\n\n const safeId = groupId.replace(/:/g, \"-\");\n await writeOpfsPathViaWorker(\n [getOpfsRootDirName(), \"groups\", safeId, ...dirs, filename],\n content,\n );\n\n return;\n } catch (err) {\n if (attempt === 0 && isStaleHandleError(err)) {\n invalidateStorageRoot();\n\n continue;\n }\n\n throw err;\n }\n }\n}\n","import { ToolProfile } from \"./types.js\";\n\n/**\n * Built-in profile optimized for Gemini Nano (Prompt API).\n * Minimizes context consumption so Nano has maximum tokens for generation.\n */\nexport const DEFAULT_BUILTIN_PROFILE: ToolProfile = {\n id: \"__builtin_default\",\n name: \"Default\",\n providerId: \"prompt_api\",\n enabledToolNames: [\n \"javascript\",\n \"list_files\",\n \"open_file\",\n \"read_file\",\n \"write_file\",\n ],\n customTools: [],\n systemPromptOverride:\n \"You are a helpful coding assistant.\\n\" +\n \"Content intended to be rendered as a `Page` (HTML or Markdown) SHOULD include frontmatter (title, created, updated, and slug).\\n\" +\n \"HTML content intended to be rendered as a `Page` SHOULD USE `<article><h2>${subTitle}</h2>...</article>` for its main body content.\",\n};\n","import { CONFIG_KEYS, DEFAULT_GROUP_ID } from \"../../config/config.js\";\nimport { isHeadlessMode } from \"../../config/headless.js\";\nimport { getConfig } from \"../../db/get-config.js\";\nimport { getGroupDir } from \"../../storage/get-group-dir.js\";\nimport { readGroupFile } from \"../../storage/read-group-file.js\";\n\nimport type { ShadowClawDatabase } from \"../../db/types.js\";\nimport type {\n DeclarativeToolDefinition,\n DeclarativeToolExecution,\n ToolDefinition,\n} from \"./types.js\";\n\nexport type { DeclarativeToolDefinition };\n\nconst TOOL_NAME_PATTERN = /^[a-z][a-z0-9_]{0,63}$/;\n\nexport function parseDeclarativeTool(\n path: string,\n value: unknown,\n): DeclarativeToolDefinition {\n if (!value || typeof value !== \"object\") {\n throw new Error(`Tool at ${path} must be a JSON object`);\n }\n\n const candidate = value as Record<string, unknown>;\n const name = typeof candidate.name === \"string\" ? candidate.name.trim() : \"\";\n const description =\n typeof candidate.description === \"string\"\n ? candidate.description.trim()\n : \"\";\n const inputSchema = candidate.input_schema ?? candidate.parameters;\n const execution = candidate.execution ?? candidate.evaluation;\n\n if (!TOOL_NAME_PATTERN.test(name)) {\n throw new Error(`Tool name is invalid: ${name || \"(missing)\"}`);\n }\n if (!description) {\n throw new Error(`Tool ${name} requires a description`);\n }\n if (!inputSchema || typeof inputSchema !== \"object\") {\n throw new Error(`Tool ${name} requires input_schema`);\n }\n if (!execution || typeof execution !== \"object\") {\n throw new Error(`Tool ${name} requires execution`);\n }\n\n const parsedExecution = execution as Record<string, unknown>;\n const type = parsedExecution.type;\n if (type !== \"bash\" && type !== \"javascript\" && type !== \"tool\") {\n throw new Error(\n `Tool ${name} execution type must be bash, javascript, or tool`,\n );\n }\n if (type === \"tool\") {\n if (\n typeof parsedExecution.name !== \"string\" ||\n !TOOL_NAME_PATTERN.test(parsedExecution.name)\n ) {\n throw new Error(`Tool ${name} execution requires a valid tool name`);\n }\n\n return {\n name,\n description,\n input_schema: inputSchema as ToolDefinition[\"input_schema\"],\n execution: {\n type,\n name: parsedExecution.name,\n ...(parsedExecution.input && typeof parsedExecution.input === \"object\"\n ? { input: parsedExecution.input as Record<string, unknown> }\n : {}),\n },\n path,\n };\n }\n const sourceKey = type === \"bash\" ? \"command\" : \"code\";\n const source = parsedExecution[sourceKey] ?? parsedExecution.expression;\n if (typeof source !== \"string\" || source.trim() === \"\") {\n throw new Error(`Tool ${name} execution requires ${sourceKey}`);\n }\n\n return {\n name,\n description,\n input_schema: inputSchema as ToolDefinition[\"input_schema\"],\n execution: {\n type,\n [sourceKey]: source,\n } as DeclarativeToolExecution,\n path,\n };\n}\n\nexport async function loadDeclarativeTools(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n): Promise<{ tools: DeclarativeToolDefinition[]; diagnostics: string[] }> {\n const tools: DeclarativeToolDefinition[] = [];\n const diagnostics: string[] = [];\n\n const groupIdsToScan =\n isHeadlessMode() || groupId === DEFAULT_GROUP_ID\n ? [groupId]\n : [groupId, DEFAULT_GROUP_ID];\n\n for (const targetGroupId of groupIdsToScan) {\n try {\n const root = await getGroupDir(db, targetGroupId);\n const paths: string[] = [];\n\n async function visit(\n directory: FileSystemDirectoryHandle,\n relativePath: string,\n ) {\n for await (const [name, handle] of (directory as any).entries()) {\n const childPath = `${relativePath}/${name}`;\n if (handle.kind === \"directory\") {\n await visit(handle, childPath);\n } else if (\n name.endsWith(\".json\") &&\n childPath.startsWith(\".agents/tools/\")\n ) {\n paths.push(childPath);\n }\n }\n }\n\n try {\n const agentsDir = await root.getDirectoryHandle(\".agents\");\n const toolsDir = await agentsDir.getDirectoryHandle(\"tools\");\n await visit(toolsDir, \".agents/tools\");\n } catch {\n continue;\n }\n\n const orderedPaths = paths.sort((a, b) => {\n const aIsFlat = !a.startsWith(\".agents/tools/main/\");\n const bIsFlat = !b.startsWith(\".agents/tools/main/\");\n if (aIsFlat !== bIsFlat) {\n return aIsFlat ? -1 : 1;\n }\n return a.localeCompare(b);\n });\n\n for (const path of orderedPaths) {\n try {\n const parsed = JSON.parse(\n await readGroupFile(db, targetGroupId, path),\n );\n const parsedTool = parseDeclarativeTool(path, parsed);\n if (!tools.some((t) => t.name === parsedTool.name)) {\n tools.push(parsedTool);\n }\n } catch (error) {\n diagnostics.push(\n error instanceof Error ? error.message : String(error),\n );\n }\n }\n } catch {\n // Continue to next group directory\n }\n }\n\n return { tools, diagnostics };\n}\n\nexport async function findDeclarativeTool(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n name: string,\n): Promise<DeclarativeToolDefinition | null> {\n try {\n const { tools } = await loadDeclarativeTools(db, groupId);\n const tool = tools.find((t) => t.name === name) || null;\n if (!tool) {\n return null;\n }\n\n const rawEnabled = await getConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n );\n if (Array.isArray(rawEnabled) && !rawEnabled.includes(name)) {\n return null;\n }\n\n return tool;\n } catch {\n return null;\n }\n}\n","import matter from \"gray-matter\";\n\nimport type { TaskToolCall } from \"../../db/types.js\";\nimport type { SkillExecution, SkillRecord } from \"./types.js\";\n\nconst NAME_PATTERN = /^[a-z0-9](?:[a-z0-9]|-(?!-))*[a-z0-9]$|^[a-z0-9]$/;\n\ninterface FrontmatterParseResult {\n data: Record<string, unknown>;\n content: string;\n}\n\nfunction parseFrontmatterResiliently(source: string): FrontmatterParseResult {\n try {\n const parsed = matter(source);\n return {\n data: parsed.data && typeof parsed.data === \"object\" ? parsed.data : {},\n content: parsed.content || \"\",\n };\n } catch {\n // Attempt 1: Sanitize unquoted scalar lines in the frontmatter block\n const fmMatch = source.match(/^---\\r?\\n([\\s\\S]*?)\\r?\\n---\\r?\\n?([\\s\\S]*)$/);\n if (fmMatch) {\n const rawFm = fmMatch[1];\n const rest = fmMatch[2] || \"\";\n const lines = rawFm.split(/\\r?\\n/);\n const sanitizedLines = lines.map((line) => {\n const fieldMatch = line.match(/^([a-zA-Z0-9_-]+):\\s*(.+)$/);\n if (fieldMatch) {\n const [, key, val] = fieldMatch;\n const trimmed = val.trim();\n // If value is not already quoted and not a YAML block indicator/collection opening or boolean/number\n if (\n trimmed &&\n trimmed !== \"true\" &&\n trimmed !== \"false\" &&\n trimmed !== \"null\" &&\n !trimmed.startsWith('\"') &&\n !trimmed.startsWith(\"'\") &&\n !trimmed.startsWith(\"[\") &&\n !trimmed.startsWith(\"{\") &&\n trimmed !== \">\" &&\n trimmed !== \"|\" &&\n trimmed !== \">-\" &&\n trimmed !== \"|-\" &&\n !/^-?\\d+(?:\\.\\d+)?$/.test(trimmed)\n ) {\n return `${key}: ${JSON.stringify(trimmed)}`;\n }\n }\n return line;\n });\n\n try {\n const sanitizedSource = `---\\n${sanitizedLines.join(\"\\n\")}\\n---\\n${rest}`;\n const parsed = matter(sanitizedSource);\n return {\n data:\n parsed.data && typeof parsed.data === \"object\" ? parsed.data : {},\n content: parsed.content || \"\",\n };\n } catch {\n // Continue to fallback\n }\n\n // Attempt 2: Line-by-line fallback extraction for essential frontmatter fields\n const fallbackData: Record<string, unknown> = {};\n const nameMatch = rawFm.match(/^name:\\s*[\"']?([^\"'\\r\\n]+)[\"']?/m);\n if (nameMatch) {\n fallbackData.name = nameMatch[1].trim();\n }\n\n const descMatch = rawFm.match(/^description:\\s*(.+)$/m);\n if (descMatch) {\n let desc = descMatch[1].trim();\n if (\n (desc.startsWith('\"') && desc.endsWith('\"')) ||\n (desc.startsWith(\"'\") && desc.endsWith(\"'\"))\n ) {\n desc = desc.slice(1, -1);\n }\n fallbackData.description = desc;\n }\n\n const userInvocableMatch = rawFm.match(\n /^user-invocable:\\s*(true|false)/im,\n );\n if (userInvocableMatch) {\n fallbackData[\"user-invocable\"] =\n userInvocableMatch[1].toLowerCase() === \"true\";\n }\n\n const disableModelMatch = rawFm.match(\n /^disable-model-invocation:\\s*(true|false)/im,\n );\n if (disableModelMatch) {\n fallbackData[\"disable-model-invocation\"] =\n disableModelMatch[1].toLowerCase() === \"true\";\n }\n\n const toolsMatch = rawFm.match(\n /^allowed-tools:\\s*[\"']?([^\"'\\r\\n]+)[\"']?/m,\n );\n if (toolsMatch) {\n fallbackData[\"allowed-tools\"] = toolsMatch[1].trim();\n }\n\n // Check for bullet list allowed-tools\n const toolListMatch = rawFm.match(\n /allowed-tools:\\s*\\n((?:\\s*-\\s*[^\\r\\n]+\\r?\\n?)+)/m,\n );\n if (toolListMatch) {\n const tools = toolListMatch[1]\n .split(/\\r?\\n/)\n .map((l) => l.replace(/^\\s*-\\s*/, \"\").trim())\n .filter(Boolean);\n if (tools.length > 0) {\n fallbackData[\"allowed-tools\"] = tools;\n }\n }\n\n return { data: fallbackData, content: rest };\n }\n\n return { data: {}, content: source };\n }\n}\n\nfunction extractAllowedTools(raw: unknown): string | undefined {\n if (typeof raw === \"string\") {\n const trimmed = raw.trim();\n return trimmed.length > 0 ? trimmed : undefined;\n }\n if (Array.isArray(raw)) {\n const tools = raw\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter((item) => item.length > 0);\n return tools.length > 0 ? tools.join(\" \") : undefined;\n }\n return undefined;\n}\n\nexport function parseSkill(path: string, source: string): SkillRecord {\n const parsed = parseFrontmatterResiliently(source);\n const data = parsed.data;\n const name = typeof data.name === \"string\" ? data.name.trim() : \"\";\n const description =\n typeof data.description === \"string\" ? data.description.trim() : \"\";\n\n if (!name) {\n throw new Error(`Skill at ${path} requires a name`);\n }\n if (!description) {\n throw new Error(`Skill ${name} requires a description`);\n }\n if (name.length > 64 || !NAME_PATTERN.test(name)) {\n throw new Error(\n `Skill name must be 1-64 lowercase characters and hyphens: ${name}`,\n );\n }\n if (description.length > 1024) {\n throw new Error(\n `Skill ${name} description must be 1024 characters or fewer`,\n );\n }\n\n const basePath = path.replace(/\\/SKILL\\.md$/u, \"\");\n const rawMetadata =\n data.metadata && typeof data.metadata === \"object\"\n ? (data.metadata as Record<string, unknown>)\n : undefined;\n\n const allowedToolsRaw =\n extractAllowedTools(rawMetadata?.[\"allowed-tools\"]) ||\n extractAllowedTools(rawMetadata?.[\"allowedTools\"]) ||\n extractAllowedTools(data[\"allowed-tools\"]) ||\n extractAllowedTools(data[\"allowedTools\"]);\n\n const metadataEntries: [string, string][] = [];\n if (rawMetadata) {\n for (const [key, value] of Object.entries(rawMetadata)) {\n if (key === \"execution\" || value === null || value === undefined) {\n continue;\n }\n if (key === \"allowed-tools\" || key === \"allowedTools\") {\n if (allowedToolsRaw) {\n metadataEntries.push([key, allowedToolsRaw]);\n }\n } else if (\n typeof value === \"string\" ||\n typeof value === \"number\" ||\n typeof value === \"boolean\"\n ) {\n metadataEntries.push([key, String(value)]);\n } else if (Array.isArray(value)) {\n const stringItems = value\n .filter((item): item is string => typeof item === \"string\")\n .map((item) => item.trim())\n .filter(Boolean);\n if (stringItems.length > 0) {\n metadataEntries.push([key, stringItems.join(\" \")]);\n }\n }\n }\n }\n\n const metadata =\n metadataEntries.length > 0\n ? Object.fromEntries(metadataEntries)\n : undefined;\n\n const execution = rawMetadata?.execution;\n\n let parsedExecution;\n if (execution !== undefined) {\n if (\n !execution ||\n typeof execution !== \"object\" ||\n (execution as Record<string, unknown>).type !== \"tools\" ||\n !Array.isArray((execution as Record<string, unknown>).tools)\n ) {\n throw new Error(`Skill ${name} has invalid tools execution`);\n }\n const rawExec = execution as Record<string, unknown>;\n const topSuppressToast =\n typeof rawExec.suppressToast === \"boolean\"\n ? rawExec.suppressToast\n : undefined;\n const topSuppressOutput =\n typeof rawExec.suppressOutput === \"boolean\"\n ? rawExec.suppressOutput\n : undefined;\n\n const rawTools = rawExec.tools as TaskToolCall[];\n const tools = rawTools.map((tool) => ({\n ...tool,\n ...(topSuppressToast !== undefined && tool.suppressToast === undefined\n ? { suppressToast: topSuppressToast }\n : {}),\n ...(topSuppressOutput !== undefined && tool.suppressOutput === undefined\n ? { suppressOutput: topSuppressOutput }\n : {}),\n }));\n\n parsedExecution = {\n type: \"tools\" as const,\n ...(topSuppressToast !== undefined\n ? { suppressToast: topSuppressToast }\n : {}),\n ...(topSuppressOutput !== undefined\n ? { suppressOutput: topSuppressOutput }\n : {}),\n tools,\n } satisfies SkillExecution;\n }\n\n return {\n name,\n description,\n ...(typeof data.license === \"string\" ? { license: data.license } : {}),\n ...(typeof data.compatibility === \"string\"\n ? { compatibility: data.compatibility }\n : {}),\n ...(metadata ? { metadata } : {}),\n ...(typeof allowedToolsRaw === \"string\"\n ? { allowedTools: allowedToolsRaw }\n : {}),\n ...(typeof data[\"user-invocable\"] === \"boolean\"\n ? { userInvocable: data[\"user-invocable\"] }\n : typeof data[\"user-invocable\"] === \"string\" &&\n (data[\"user-invocable\"].toLowerCase() === \"true\" ||\n data[\"user-invocable\"].toLowerCase() === \"false\")\n ? { userInvocable: data[\"user-invocable\"].toLowerCase() === \"true\" }\n : {}),\n ...(typeof data[\"disable-model-invocation\"] === \"boolean\"\n ? { disableModelInvocation: data[\"disable-model-invocation\"] }\n : typeof data[\"disable-model-invocation\"] === \"string\" &&\n (data[\"disable-model-invocation\"].toLowerCase() === \"true\" ||\n data[\"disable-model-invocation\"].toLowerCase() === \"false\")\n ? {\n disableModelInvocation:\n data[\"disable-model-invocation\"].toLowerCase() === \"true\",\n }\n : {}),\n ...(parsedExecution ? { execution: parsedExecution } : {}),\n body: parsed.content.trim(),\n path,\n basePath,\n };\n}\n","import { computeSha256 } from \"../../../utils/crypto.js\";\nimport { parseSkill } from \"../../skills/parse-skill.js\";\nimport type {\n RemoteManifest,\n RemoteSkillItem,\n ResolvedRemoteManifest,\n} from \"./types.js\";\n\nconst WELL_KNOWN_PATH = \".well-known/agent-skills/index.json\";\n\nexport interface GitHubRepoSource {\n owner: string;\n repo: string;\n ref: string;\n skillFilter?: string;\n subpath?: string;\n}\n\n/**\n * Parses a GitHub shorthand (`owner/repo`, `owner/repo@skill`) or GitHub repository/tree URL.\n */\nexport function parseGitHubRepoSource(input: string): GitHubRepoSource | null {\n const trimmed = input.trim().replace(/\\/+$/, \"\");\n if (!trimmed) return null;\n\n // Match https://github.com/owner/repo(/tree/ref/subpath)?(@skill)?\n const ghUrlMatch = trimmed.match(\n /^https?:\\/\\/github\\.com\\/([a-zA-Z0-9_.-]+)\\/([a-zA-Z0-9_.-]+?)(?:\\.git)?(?:\\/tree\\/([^/]+)(?:\\/(.+))?)?(?:@([a-zA-Z0-9_.-]+))?$/i,\n );\n if (ghUrlMatch) {\n return {\n owner: ghUrlMatch[1],\n repo: ghUrlMatch[2],\n ref: ghUrlMatch[3] || \"HEAD\",\n subpath: ghUrlMatch[4],\n skillFilter: ghUrlMatch[5],\n };\n }\n\n // Match shorthand owner/repo or owner/repo@skill (where owner has no dots or colons)\n if (!trimmed.includes(\"://\")) {\n const shorthandMatch = trimmed.match(\n /^([a-zA-Z0-9_-]+)\\/([a-zA-Z0-9_.-]+?)(?:@([a-zA-Z0-9_.-]+))?$/,\n );\n if (shorthandMatch && !shorthandMatch[1].includes(\".\")) {\n return {\n owner: shorthandMatch[1],\n repo: shorthandMatch[2],\n ref: \"HEAD\",\n skillFilter: shorthandMatch[3],\n };\n }\n }\n\n return null;\n}\n\n/**\n * Resolves an arbitrary site or discovery URL into a normalized base URL and manifest URL.\n */\nexport function resolveDiscoveryUrl(inputUrl: string): {\n baseUrl: string;\n siteUrl: string;\n manifestUrl: string;\n} {\n const trimmed = inputUrl.trim();\n if (!trimmed) {\n throw new Error(\"URL cannot be empty\");\n }\n\n let urlString = trimmed;\n if (!urlString.startsWith(\"http://\") && !urlString.startsWith(\"https://\")) {\n urlString = `https://${urlString}`;\n }\n\n // Remove trailing slashes\n urlString = urlString.replace(/\\/+$/, \"\");\n\n // Normalize GitHub blob URLs pointing to SKILL.md into raw.githubusercontent.com URLs\n const ghBlobMatch = urlString.match(\n /^https?:\\/\\/github\\.com\\/([^/]+)\\/([^/]+)\\/blob\\/([^/]+)\\/(.+\\/skill\\.md)$/i,\n );\n if (ghBlobMatch) {\n urlString = `https://raw.githubusercontent.com/${ghBlobMatch[1]}/${ghBlobMatch[2]}/${ghBlobMatch[3]}/${ghBlobMatch[4]}`;\n }\n\n if (/\\/skill\\.md$/i.test(urlString)) {\n const baseUrl = urlString.replace(/\\/skill\\.md$/i, \"\");\n return {\n baseUrl,\n siteUrl: baseUrl,\n manifestUrl: urlString,\n };\n }\n\n if (urlString.endsWith(WELL_KNOWN_PATH)) {\n const baseUrl = urlString\n .slice(0, -WELL_KNOWN_PATH.length)\n .replace(/\\/+$/, \"\");\n return {\n baseUrl,\n siteUrl: baseUrl,\n manifestUrl: urlString,\n };\n }\n\n return {\n baseUrl: urlString,\n siteUrl: urlString,\n manifestUrl: `${urlString}/${WELL_KNOWN_PATH}`,\n };\n}\n\n/**\n * Resolves an RFC 3986 relative URL found in an agent-skills manifest against the manifest URL.\n */\nexport function resolveManifestRelativeUrl(\n relativeUrl: string,\n manifestUrl: string,\n): string {\n if (!relativeUrl) {\n return \"\";\n }\n try {\n return new URL(relativeUrl, manifestUrl).href;\n } catch {\n return relativeUrl;\n }\n}\n\n/**\n * Resolves all relative URLs in an agent-skills manifest into fully-qualified absolute URLs.\n */\nexport function resolveManifestUrls(\n manifest: RemoteManifest,\n manifestUrl: string,\n): RemoteManifest {\n const cloned: RemoteManifest = JSON.parse(JSON.stringify(manifest));\n\n if (Array.isArray(cloned.tools)) {\n cloned.tools = cloned.tools.map((tool) => ({\n ...tool,\n url: resolveManifestRelativeUrl(tool.url, manifestUrl),\n }));\n }\n\n if (Array.isArray(cloned.scripts)) {\n cloned.scripts = cloned.scripts.map((script) => ({\n ...script,\n url: resolveManifestRelativeUrl(script.url, manifestUrl),\n }));\n }\n\n if (Array.isArray(cloned.skills)) {\n cloned.skills = cloned.skills.map((skill) => ({\n ...skill,\n url: resolveManifestRelativeUrl(skill.url, manifestUrl),\n tools: Array.isArray(skill.tools)\n ? skill.tools.map((st) => ({\n ...st,\n url: st.url\n ? resolveManifestRelativeUrl(st.url, manifestUrl)\n : undefined,\n }))\n : undefined,\n scripts: Array.isArray(skill.scripts)\n ? skill.scripts.map((ss) => ({\n ...ss,\n url: ss.url\n ? resolveManifestRelativeUrl(ss.url, manifestUrl)\n : undefined,\n }))\n : undefined,\n }));\n }\n\n return cloned;\n}\n\n/**\n * Verifies that the given content matches an expected SHA-256 digest (e.g. \"sha256:...\").\n */\nexport async function verifySha256Digest(\n content: string | Uint8Array,\n expectedDigest?: string,\n): Promise<boolean> {\n if (!expectedDigest || !expectedDigest.startsWith(\"sha256:\")) {\n return true;\n }\n\n const expectedHex = expectedDigest.slice(7).trim().toLowerCase();\n if (!expectedHex) {\n return true;\n }\n\n const rawBytes =\n typeof content === \"string\" ? new TextEncoder().encode(content) : content;\n const actualHex = (await computeSha256(rawBytes)).toLowerCase();\n return actualHex === expectedHex;\n}\n\nasync function buildSingleSkillManifest(\n skillUrl: string,\n baseUrl: string,\n rawText: string,\n files?: string[],\n): Promise<ResolvedRemoteManifest> {\n const parsed = parseSkill(skillUrl, rawText);\n const skillItem: RemoteSkillItem = {\n name: parsed.name,\n type: \"skill-md\",\n description: parsed.description,\n url: skillUrl,\n ...(files && files.length > 0 ? { files } : {}),\n };\n return {\n manifest: {\n name: parsed.name,\n description: parsed.description,\n skills: [skillItem],\n },\n siteUrl: baseUrl,\n manifestUrl: skillUrl,\n };\n}\n\nasync function fetchGitHubDiscoveryManifest(\n gh: GitHubRepoSource,\n customFetch: typeof fetch,\n): Promise<ResolvedRemoteManifest> {\n const rawBase = `https://raw.githubusercontent.com/${gh.owner}/${gh.repo}/${gh.ref}`;\n const siteUrl = `https://github.com/${gh.owner}/${gh.repo}`;\n\n // 1. Explicit tree subpath (e.g. https://github.com/owner/repo/tree/main/skills/my-skill)\n if (gh.subpath) {\n const cleanSubpath = gh.subpath\n .replace(/^\\/+|\\/+$/g, \"\")\n .replace(/\\/skill\\.md$/i, \"\");\n const skillUrl = `${rawBase}/${cleanSubpath}/SKILL.md`;\n const res = await customFetch(skillUrl);\n if (!res.ok) {\n throw new Error(\n `Failed to fetch discovery manifest: HTTP ${res.status} ${res.statusText || \"\"}`.trim(),\n );\n }\n return buildSingleSkillManifest(\n skillUrl,\n `${rawBase}/${cleanSubpath}`,\n await res.text(),\n );\n }\n\n // 2. Explicit skill filter (e.g. owner/repo@skill-name)\n if (gh.skillFilter) {\n const candidates = [\n `skills/${gh.skillFilter}/SKILL.md`,\n `.agents/skills/${gh.skillFilter}/SKILL.md`,\n `.agents/skills/main/${gh.skillFilter}/SKILL.md`,\n `${gh.skillFilter}/SKILL.md`,\n ];\n for (const relPath of candidates) {\n const candidateUrl = `${rawBase}/${relPath}`;\n const res = await customFetch(candidateUrl);\n if (res.ok) {\n return buildSingleSkillManifest(\n candidateUrl,\n candidateUrl.replace(/\\/skill\\.md$/i, \"\"),\n await res.text(),\n );\n }\n }\n throw new Error(\n `Failed to fetch skill \"${gh.skillFilter}\" from ${gh.owner}/${gh.repo}`,\n );\n }\n\n // 3. Full repository: try .well-known/agent-skills/index.json first\n const wellKnownUrl = `${rawBase}/${WELL_KNOWN_PATH}`;\n try {\n const wkRes = await customFetch(wellKnownUrl, {\n headers: { Accept: \"application/json\" },\n });\n if (wkRes.ok) {\n const rawManifest = (await wkRes.json()) as RemoteManifest;\n if (rawManifest && typeof rawManifest === \"object\") {\n return {\n manifest: resolveManifestUrls(rawManifest, wellKnownUrl),\n siteUrl: rawBase,\n manifestUrl: wellKnownUrl,\n };\n }\n }\n } catch {\n // Fall through to GitHub Trees API / root SKILL.md\n }\n\n // 4. Try GitHub Git Trees API to discover all SKILL.md files and companion files\n const treeApiUrl = `https://api.github.com/repos/${gh.owner}/${gh.repo}/git/trees/${gh.ref}?recursive=1`;\n try {\n const treeRes = await customFetch(treeApiUrl, {\n headers: { Accept: \"application/vnd.github+json\" },\n });\n if (treeRes.ok) {\n const treeData = (await treeRes.json()) as {\n tree?: Array<{ path?: string; type?: string }>;\n };\n const blobs = (treeData?.tree || [])\n .filter(\n (item) => item?.type === \"blob\" && typeof item.path === \"string\",\n )\n .map((item) => item.path as string);\n const skillMdPaths = blobs.filter(\n (p) => p === \"SKILL.md\" || p.endsWith(\"/SKILL.md\"),\n );\n\n if (skillMdPaths.length > 0) {\n const skills: RemoteSkillItem[] = [];\n for (const skillMdPath of skillMdPaths) {\n const skillDir =\n skillMdPath === \"SKILL.md\"\n ? \"\"\n : skillMdPath.slice(0, -\"/SKILL.md\".length);\n const prefix = skillDir ? `${skillDir}/` : \"\";\n const companionFiles = blobs\n .filter(\n (p) =>\n (skillDir ? p.startsWith(prefix) : !p.includes(\"/\")) &&\n p !== skillMdPath,\n )\n .map((p) => (skillDir ? p.slice(prefix.length) : p));\n\n const skillUrl = `${rawBase}/${skillMdPath}`;\n const mdRes = await customFetch(skillUrl);\n if (!mdRes.ok) continue;\n const mdText = await mdRes.text();\n try {\n const parsed = parseSkill(skillMdPath, mdText);\n skills.push({\n name: parsed.name,\n type: \"skill-md\",\n description: parsed.description,\n url: skillUrl,\n ...(companionFiles.length > 0\n ? { files: [\"SKILL.md\", ...companionFiles] }\n : {}),\n });\n } catch {\n // Skip invalid SKILL.md\n }\n }\n if (skills.length > 0) {\n return {\n manifest: {\n name: `${gh.owner}/${gh.repo}`,\n description: `Agent skills from ${gh.owner}/${gh.repo}`,\n skills,\n },\n siteUrl,\n manifestUrl: treeApiUrl,\n };\n }\n }\n }\n } catch {\n // Fall through to root SKILL.md\n }\n\n // 5. Fallback: root SKILL.md\n const rootSkillUrl = `${rawBase}/SKILL.md`;\n const rootRes = await customFetch(rootSkillUrl);\n if (rootRes.ok) {\n return buildSingleSkillManifest(\n rootSkillUrl,\n rawBase,\n await rootRes.text(),\n );\n }\n\n throw new Error(\n `Failed to fetch discovery manifest from GitHub repository ${gh.owner}/${gh.repo}`,\n );\n}\n\n/**\n * Fetches and parses a remote site's Agent Skills discovery manifest,\n * direct SKILL.md URL, or GitHub repository/shorthand.\n */\nexport async function fetchDiscoveryManifest(\n siteUrl: string,\n customFetch: typeof fetch = globalThis.fetch,\n): Promise<ResolvedRemoteManifest> {\n const ghSource = parseGitHubRepoSource(siteUrl);\n if (ghSource) {\n return fetchGitHubDiscoveryManifest(ghSource, customFetch);\n }\n\n const { baseUrl, manifestUrl } = resolveDiscoveryUrl(siteUrl);\n\n if (/\\/skill\\.md$/i.test(manifestUrl)) {\n const response = await customFetch(manifestUrl);\n if (!response.ok) {\n throw new Error(\n `Failed to fetch discovery manifest: HTTP ${response.status} ${response.statusText}`.trim(),\n );\n }\n const rawText = await response.text();\n return buildSingleSkillManifest(manifestUrl, baseUrl, rawText);\n }\n\n const response = await customFetch(manifestUrl, {\n headers: {\n Accept: \"application/json\",\n },\n });\n\n if (!response.ok) {\n throw new Error(\n `Failed to fetch discovery manifest: HTTP ${response.status} ${response.statusText}`.trim(),\n );\n }\n\n const rawManifest = (await response.json()) as RemoteManifest;\n if (!rawManifest || typeof rawManifest !== \"object\") {\n throw new Error(\"Invalid discovery manifest: expected a JSON object\");\n }\n\n const resolvedManifest = resolveManifestUrls(rawManifest, manifestUrl);\n\n return {\n manifest: resolvedManifest,\n siteUrl: baseUrl,\n manifestUrl,\n };\n}\n","import { CONFIG_KEYS, DEFAULT_GROUP_ID } from \"../../../config/config.js\";\nimport { getConfig } from \"../../../db/get-config.js\";\nimport { setConfig } from \"../../../db/set-config.js\";\nimport { writeGroupFile } from \"../../../storage/write-group-file.js\";\nimport { groupFileExists } from \"../../../storage/group-file-exists.js\";\nimport { parseDeclarativeTool } from \"../declarative.js\";\nimport { TOOL_DEFINITIONS } from \"../tools.js\";\nimport { parseSkill } from \"../../skills/parse-skill.js\";\nimport { verifySha256Digest } from \"./discovery.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type {\n ImportArtifactStatus,\n ImportOptions,\n ImportResult,\n RemoteManifest,\n RemoteScriptItem,\n RemoteSkillItem,\n RemoteToolItem,\n} from \"./types.js\";\n\nconst BUILTIN_TOOL_NAMES = new Set(TOOL_DEFINITIONS.map((t) => t.name));\nconst TOOL_NAME_PATTERN = /^[a-z][a-z0-9_]{0,63}$/;\n\nfunction getBaseDir(\n kind: \"tools\" | \"scripts\" | \"skills\",\n options?: ImportOptions,\n): string {\n if (options?.targetSubdir) {\n return `.agents/${kind}/${options.targetSubdir}`;\n }\n if (options?.siteSlug) {\n return `.agents/${kind}/imported/${options.siteSlug}`;\n }\n // Canonical flat layout; legacy `main/` is still read by discovery.\n return `.agents/${kind}`;\n}\n\n/**\n * Imports a declarative tool definition from a remote URL and saves it into OPFS.\n */\nexport async function importRemoteTool(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n toolItem: RemoteToolItem,\n options?: ImportOptions,\n): Promise<ImportArtifactStatus> {\n const name = (toolItem.name || \"\").trim();\n\n if (BUILTIN_TOOL_NAMES.has(name)) {\n return {\n name,\n path: \"\",\n status: \"failed\",\n error: `Cannot shadow built-in tool: ${name}`,\n };\n }\n\n if (!TOOL_NAME_PATTERN.test(name)) {\n return {\n name,\n path: \"\",\n status: \"failed\",\n error: `Invalid tool name: ${name}`,\n };\n }\n\n const targetPath = `${getBaseDir(\"tools\", options)}/${name}.json`;\n\n try {\n const exists = await groupFileExists(db, groupId, targetPath);\n if (exists && !options?.overwrite) {\n return {\n name,\n path: targetPath,\n status: \"skipped\",\n };\n }\n\n const fetcher = options?.fetchFn || globalThis.fetch;\n const response = await fetcher(toolItem.url);\n if (!response.ok) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: `HTTP ${response.status} ${response.statusText}`,\n };\n }\n\n const text = await response.text();\n\n if (toolItem.digest) {\n const isValid = await verifySha256Digest(text, toolItem.digest);\n if (!isValid) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: \"Integrity verification failed for tool definition\",\n };\n }\n }\n\n let parsed: unknown;\n try {\n parsed = JSON.parse(text);\n } catch {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: \"Downloaded tool definition is not valid JSON\",\n };\n }\n\n // Validate schema\n parseDeclarativeTool(targetPath, parsed);\n\n await writeGroupFile(\n db,\n groupId,\n targetPath,\n JSON.stringify(parsed, null, 2),\n );\n\n if (options?.autoEnable) {\n const current = (await getConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n )) as string[] | undefined;\n const set = new Set(Array.isArray(current) ? current : []);\n set.add(name);\n await setConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n Array.from(set),\n );\n }\n\n return {\n name,\n path: targetPath,\n status: \"imported\",\n };\n } catch (error) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Imports a companion script (.js/.mjs) from a remote URL and saves it into OPFS.\n */\nexport async function importRemoteScript(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n scriptItem: RemoteScriptItem,\n options?: ImportOptions,\n): Promise<ImportArtifactStatus> {\n const name = (scriptItem.name || \"\").trim();\n const filename =\n name.endsWith(\".js\") || name.endsWith(\".mjs\") ? name : `${name}.js`;\n const targetPath = `${getBaseDir(\"scripts\", options)}/${filename}`;\n\n try {\n const exists = await groupFileExists(db, groupId, targetPath);\n if (exists && !options?.overwrite) {\n return {\n name,\n path: targetPath,\n status: \"skipped\",\n };\n }\n\n const fetcher = options?.fetchFn || globalThis.fetch;\n const response = await fetcher(scriptItem.url);\n if (!response.ok) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: `HTTP ${response.status} ${response.statusText}`,\n };\n }\n\n const text = await response.text();\n\n if (scriptItem.digest) {\n const isValid = await verifySha256Digest(text, scriptItem.digest);\n if (!isValid) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: \"Integrity verification failed for script\",\n };\n }\n }\n\n await writeGroupFile(db, groupId, targetPath, text);\n\n return {\n name,\n path: targetPath,\n status: \"imported\",\n };\n } catch (error) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Imports an Agent Skill (SKILL.md) from a remote URL and saves it into OPFS.\n */\nexport async function importRemoteSkill(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n skillItem: RemoteSkillItem,\n options?: ImportOptions,\n): Promise<ImportArtifactStatus> {\n const name = (skillItem.name || \"\").trim();\n const skillBase = `${getBaseDir(\"skills\", options)}/${name}`;\n const targetPath = `${skillBase}/SKILL.md`;\n\n try {\n const exists = await groupFileExists(db, groupId, targetPath);\n if (exists && !options?.overwrite) {\n return {\n name,\n path: targetPath,\n status: \"skipped\",\n };\n }\n\n const fetcher = options?.fetchFn || globalThis.fetch;\n const response = await fetcher(skillItem.url);\n if (!response.ok) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: `HTTP ${response.status} ${response.statusText}`,\n };\n }\n\n const text = await response.text();\n\n if (skillItem.digest) {\n const isValid = await verifySha256Digest(text, skillItem.digest);\n if (!isValid) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: \"Integrity verification failed for skill\",\n };\n }\n }\n\n // Validate skill frontmatter\n parseSkill(targetPath, text);\n\n await writeGroupFile(db, groupId, targetPath, text);\n\n if (Array.isArray(skillItem.files) && skillItem.files.length > 0) {\n const baseUrl = skillItem.url.replace(/\\/skill\\.md$/i, \"/\");\n for (const relFile of skillItem.files) {\n if (typeof relFile !== \"string\") continue;\n const cleanRel = relFile.replace(/^\\/+/, \"\").replace(/\\\\/g, \"/\");\n if (\n !cleanRel ||\n cleanRel.toLowerCase() === \"skill.md\" ||\n cleanRel.split(\"/\").some((seg) => seg === \"..\" || seg === \".\")\n ) {\n continue;\n }\n try {\n const companionUrl = new URL(\n cleanRel,\n baseUrl.endsWith(\"/\") ? baseUrl : `${baseUrl}/`,\n ).href;\n const companionRes = await fetcher(companionUrl);\n if (companionRes.ok) {\n const companionText = await companionRes.text();\n const companionTarget = `${skillBase}/${cleanRel}`;\n await writeGroupFile(db, groupId, companionTarget, companionText);\n }\n } catch {\n // Non-fatal companion file download error\n }\n }\n }\n\n return {\n name,\n path: targetPath,\n status: \"imported\",\n };\n } catch (error) {\n return {\n name,\n path: targetPath,\n status: \"failed\",\n error: error instanceof Error ? error.message : String(error),\n };\n }\n}\n\n/**\n * Imports a batch of selected tools, skills, and scripts from a remote site with dependency resolution.\n */\nexport async function importRemoteArtifacts(\n db: ShadowClawDatabase,\n groupId: string = DEFAULT_GROUP_ID,\n manifest: RemoteManifest,\n selection: {\n toolNames?: string[];\n skillNames?: string[];\n scriptNames?: string[];\n },\n options?: ImportOptions,\n): Promise<ImportResult> {\n const result: ImportResult = {\n tools: [],\n skills: [],\n scripts: [],\n diagnostics: [],\n };\n\n const selectedToolNames = new Set(selection.toolNames || []);\n const selectedSkillNames = new Set(selection.skillNames || []);\n const selectedScriptNames = new Set(selection.scriptNames || []);\n\n const manifestTools = manifest.tools || [];\n const manifestSkills = manifest.skills || [];\n const manifestScripts = manifest.scripts || [];\n\n // Resolve dependencies from selected skills\n for (const skillItem of manifestSkills) {\n if (selectedSkillNames.has(skillItem.name)) {\n if (Array.isArray(skillItem.tools)) {\n for (const t of skillItem.tools) {\n selectedToolNames.add(t.name);\n }\n }\n if (Array.isArray(skillItem.scripts)) {\n for (const s of skillItem.scripts) {\n selectedScriptNames.add(s.name);\n }\n }\n }\n }\n\n // Import Scripts\n for (const scriptItem of manifestScripts) {\n if (selectedScriptNames.has(scriptItem.name)) {\n const status = await importRemoteScript(db, groupId, scriptItem, options);\n result.scripts.push(status);\n if (status.status === \"failed\" && status.error) {\n result.diagnostics.push(`Script ${scriptItem.name}: ${status.error}`);\n }\n }\n }\n\n // Import Tools\n for (const toolItem of manifestTools) {\n if (selectedToolNames.has(toolItem.name)) {\n const status = await importRemoteTool(db, groupId, toolItem, options);\n result.tools.push(status);\n if (status.status === \"failed\" && status.error) {\n result.diagnostics.push(`Tool ${toolItem.name}: ${status.error}`);\n }\n }\n }\n\n // Import Skills\n for (const skillItem of manifestSkills) {\n if (selectedSkillNames.has(skillItem.name)) {\n const status = await importRemoteSkill(db, groupId, skillItem, options);\n result.skills.push(status);\n if (status.status === \"failed\" && status.error) {\n result.diagnostics.push(`Skill ${skillItem.name}: ${status.error}`);\n }\n }\n }\n\n return result;\n}\n","import { Signal } from \"signal-polyfill\";\n\nimport { CONFIG_KEYS } from \"../config/config.js\";\nimport { getConfig } from \"../db/get-config.js\";\nimport { setConfig } from \"../db/set-config.js\";\nimport { TOOL_DEFINITIONS } from \"../subsystems/tools/tools.js\";\nimport { DEFAULT_BUILTIN_PROFILE } from \"../subsystems/tools/builtin-profiles.js\";\nimport { loadDeclarativeTools } from \"../subsystems/tools/declarative.js\";\nimport { fetchDiscoveryManifest } from \"../subsystems/tools/remote/discovery.js\";\nimport { importRemoteArtifacts } from \"../subsystems/tools/remote/import-artifacts.js\";\nimport type { DeclarativeToolDefinition } from \"../subsystems/tools/declarative.js\";\nimport type { ShadowClawDatabase } from \"../db/types.js\";\nimport type { ToolDefinition, ToolProfile } from \"../subsystems/tools/tools.js\";\nimport type {\n ImportOptions,\n ImportResult,\n RemoteManifest,\n ResolvedRemoteManifest,\n} from \"../subsystems/tools/remote/types.js\";\n\nexport class ToolsStore {\n private _activeProfile: Signal.Computed<ToolProfile | null>;\n private _activeProfileId: Signal.State<string | null>;\n private _allTools: Signal.Computed<ToolDefinition[]>;\n private _customTools: Signal.State<ToolDefinition[]>;\n private _declarativeTools: Signal.State<DeclarativeToolDefinition[]>;\n private _declarativeToolNamesEnabled: Signal.State<Set<string> | null>;\n private _enabledDeclarativeTools: Signal.Computed<\n DeclarativeToolDefinition[]\n >;\n private _enabledToolNames: Signal.State<Set<string>>;\n private _enabledTools: Signal.Computed<ToolDefinition[]>;\n private _profiles: Signal.State<ToolProfile[]>;\n private _systemPromptOverride: Signal.State<string>;\n private _webSearchProxyUrl: Signal.State<string>;\n private _webSearchUrl: Signal.State<string>;\n private _webSearchUseProxy: Signal.State<boolean>;\n private _searchFilesMaxFileBytes: Signal.State<number>;\n private _searchFilesMaxFilesVisited: Signal.State<number>;\n private _searchFilesSkipDirs: Signal.State<string>;\n\n constructor() {\n this._enabledToolNames = new Signal.State(\n new Set(DEFAULT_BUILTIN_PROFILE.enabledToolNames),\n );\n this._customTools = new Signal.State([]);\n this._declarativeTools = new Signal.State([]);\n this._declarativeToolNamesEnabled = new Signal.State<Set<string> | null>(\n null,\n );\n this._systemPromptOverride = new Signal.State(\"\");\n this._profiles = new Signal.State([]);\n this._activeProfileId = new Signal.State(DEFAULT_BUILTIN_PROFILE.id);\n this._webSearchUseProxy = new Signal.State(false);\n this._webSearchProxyUrl = new Signal.State(\"/proxy\");\n this._webSearchUrl = new Signal.State(\n \"https://html.duckduckgo.com/html/?q={query}\",\n );\n this._searchFilesMaxFileBytes = new Signal.State(512 * 1024);\n this._searchFilesMaxFilesVisited = new Signal.State(1000);\n this._searchFilesSkipDirs = new Signal.State(\n \".git,node_modules,dist,dist-electron,.cache,.nx,.turbo,__pycache__,.venv,venv\",\n );\n\n // Derived signals using Signal.Computed for proper reactive propagation.\n this._allTools = new Signal.Computed(() => [\n ...TOOL_DEFINITIONS,\n ...this._customTools.get(),\n ]);\n\n this._enabledTools = new Signal.Computed(() => {\n const enabled = this._enabledToolNames.get();\n\n return this._allTools\n .get()\n .filter((t: ToolDefinition) => enabled.has(t.name));\n });\n\n this._enabledDeclarativeTools = new Signal.Computed(() => {\n const tools = this._declarativeTools.get();\n const enabledSet = this._declarativeToolNamesEnabled.get();\n if (!enabledSet || enabledSet.size === 0) {\n return [];\n }\n return tools.filter((t) => enabledSet.has(t.name));\n });\n\n this._activeProfile = new Signal.Computed(() => {\n const id = this._activeProfileId.get();\n if (!id) {\n return null;\n }\n\n if (DEFAULT_BUILTIN_PROFILE.id === id) {\n return DEFAULT_BUILTIN_PROFILE;\n }\n\n return this._profiles.get().find((p: ToolProfile) => p.id === id) || null;\n });\n }\n\n get activeProfile(): ToolProfile | null {\n return this._activeProfile.get();\n }\n\n get activeProfileId(): string | null {\n return this._activeProfileId.get();\n }\n\n get allTools(): ToolDefinition[] {\n return this._allTools.get();\n }\n\n get customTools(): ToolDefinition[] {\n return this._customTools.get();\n }\n\n get declarativeTools(): DeclarativeToolDefinition[] {\n return this._declarativeTools.get();\n }\n\n get declarativeToolNamesEnabled(): Set<string> | null {\n return this._declarativeToolNamesEnabled.get();\n }\n\n get enabledDeclarativeTools(): DeclarativeToolDefinition[] {\n return this._enabledDeclarativeTools.get();\n }\n\n get enabledToolNames(): Set<string> {\n return this._enabledToolNames.get();\n }\n\n get enabledTools(): ToolDefinition[] {\n return this._enabledTools.get();\n }\n\n isDeclarativeToolEnabled(name: string): boolean {\n const enabledSet = this._declarativeToolNamesEnabled.get();\n if (!enabledSet) {\n return false;\n }\n return enabledSet.has(name);\n }\n\n async refreshDeclarativeTools(\n db: ShadowClawDatabase,\n groupId?: string,\n ): Promise<DeclarativeToolDefinition[]> {\n try {\n const res = await loadDeclarativeTools(db, groupId || \"br:main\");\n const allBuiltInAndCustom = this.allTools;\n const declTools = (res?.tools || []).filter(\n (dt) => !allBuiltInAndCustom.some((bt) => bt.name === dt.name),\n );\n\n const current = this._declarativeTools.get();\n const isSame =\n current.length === declTools.length &&\n current.every(\n (t, i) =>\n t.name === declTools[i].name &&\n t.description === declTools[i].description &&\n JSON.stringify(t.execution) ===\n JSON.stringify(declTools[i].execution),\n );\n\n if (!isSame) {\n this._declarativeTools.set(declTools);\n }\n return declTools;\n } catch {\n if (this._declarativeTools.get().length > 0) {\n this._declarativeTools.set([]);\n }\n return [];\n }\n }\n\n async setDeclarativeToolEnabled(\n db: ShadowClawDatabase,\n toolName: string,\n enabled: boolean,\n ): Promise<void> {\n const currentEnabled = this._declarativeToolNamesEnabled.get();\n const nextSet = new Set(currentEnabled === null ? [] : currentEnabled);\n if (enabled) {\n nextSet.add(toolName);\n } else {\n nextSet.delete(toolName);\n }\n this._declarativeToolNamesEnabled.set(nextSet);\n await setConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n Array.from(nextSet),\n );\n }\n\n async setAllDeclarativeEnabled(\n db: ShadowClawDatabase,\n toolNames: string[],\n ): Promise<void> {\n const nextSet = new Set(toolNames);\n this._declarativeToolNamesEnabled.set(nextSet);\n await setConfig(db, CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED, toolNames);\n }\n\n /**\n * Fetches remote site discovery manifest.\n */\n async fetchRemoteDiscoveryManifest(\n siteUrl: string,\n ): Promise<ResolvedRemoteManifest> {\n return await fetchDiscoveryManifest(siteUrl);\n }\n\n /**\n * Imports tools, skills, and scripts from a remote site into OPFS and refreshes declarative tools.\n */\n async importFromRemoteSite(\n db: ShadowClawDatabase,\n manifest: RemoteManifest,\n selection: {\n toolNames?: string[];\n skillNames?: string[];\n scriptNames?: string[];\n },\n options?: ImportOptions,\n ): Promise<ImportResult> {\n const groupId = options?.groupId || \"br:main\";\n const result = await importRemoteArtifacts(\n db,\n groupId,\n manifest,\n selection,\n options,\n );\n await this.refreshDeclarativeTools(db, groupId);\n return result;\n }\n\n /**\n * Export tools config as JSON for backup.\n */\n exportBackup(): string {\n return JSON.stringify(\n {\n enabledTools: [...this._enabledToolNames.get()],\n customTools: this._customTools.get(),\n declarativeToolsEnabled: this._declarativeToolNamesEnabled.get()\n ? Array.from(this._declarativeToolNamesEnabled.get()!)\n : null,\n systemPromptOverride: this._systemPromptOverride.get(),\n profiles: this._profiles.get(),\n activeProfileId: this._activeProfileId.get(),\n webSearchUseProxy: this._webSearchUseProxy.get(),\n webSearchProxyUrl: this._webSearchProxyUrl.get(),\n webSearchUrl: this._webSearchUrl.get(),\n searchFilesMaxFileBytes: this._searchFilesMaxFileBytes.get(),\n searchFilesMaxFilesVisited: this._searchFilesMaxFilesVisited.get(),\n searchFilesSkipDirs: this._searchFilesSkipDirs.get(),\n },\n null,\n 2,\n );\n }\n\n findProfilesForProvider(providerId?: string, model?: string): ToolProfile[] {\n return this.profiles.filter((p) => {\n if (p.providerId && p.providerId !== providerId) {\n return false;\n }\n\n if (p.model && p.model !== model) {\n return false;\n }\n\n return true;\n });\n }\n\n get profiles(): ToolProfile[] {\n return [DEFAULT_BUILTIN_PROFILE, ...this._profiles.get()];\n }\n\n get systemPromptOverride(): string {\n return this._systemPromptOverride.get();\n }\n\n get webSearchProxyUrl(): string {\n return this._webSearchProxyUrl.get();\n }\n\n get webSearchUrl(): string {\n return this._webSearchUrl.get();\n }\n\n get webSearchUseProxy(): boolean {\n return this._webSearchUseProxy.get();\n }\n\n get searchFilesMaxFileBytes(): number {\n return this._searchFilesMaxFileBytes.get();\n }\n\n get searchFilesMaxFilesVisited(): number {\n return this._searchFilesMaxFilesVisited.get();\n }\n\n /** Comma-separated list of directory names to skip when walking the workspace. */\n get searchFilesSkipDirs(): string {\n return this._searchFilesSkipDirs.get();\n }\n\n /** Parsed Set of directory names to skip — derived from the comma-separated string. */\n get searchFilesSkipDirsSet(): Set<string> {\n return new Set(\n this._searchFilesSkipDirs\n .get()\n .split(\",\")\n .map((s) => s.trim())\n .filter(Boolean),\n );\n }\n\n async activateProfile(\n db: ShadowClawDatabase,\n profileId: string,\n ): Promise<void> {\n const profile = this.profiles.find((p) => p.id === profileId);\n if (!profile) {\n return;\n }\n\n this._activeProfileId.set(profileId);\n this._enabledToolNames.set(new Set(profile.enabledToolNames));\n this._customTools.set(profile.customTools);\n this._systemPromptOverride.set(profile.systemPromptOverride || \"\");\n\n await Promise.all([\n setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, profileId),\n setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, profile.enabledToolNames),\n setConfig(db, CONFIG_KEYS.CUSTOM_TOOLS, profile.customTools),\n setConfig(\n db,\n CONFIG_KEYS.SYSTEM_PROMPT_OVERRIDE,\n profile.systemPromptOverride || \"\",\n ),\n ]);\n }\n\n async addCustomTool(\n db: ShadowClawDatabase,\n tool: ToolDefinition,\n ): Promise<void> {\n const tools = [...this._customTools.get(), tool];\n this._customTools.set(tools);\n // Auto-enable new tool\n const enabled = new Set(this._enabledToolNames.get());\n enabled.add(tool.name);\n this._enabledToolNames.set(enabled);\n await Promise.all([\n setConfig(db, CONFIG_KEYS.CUSTOM_TOOLS, tools),\n setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, [...enabled]),\n ]);\n }\n\n // ── Profile Management ───────────────────────────────────────────\n\n async addProfile(\n db: ShadowClawDatabase,\n profile: ToolProfile,\n ): Promise<void> {\n const profiles = [...this._profiles.get(), profile];\n this._profiles.set(profiles);\n await setConfig(db, CONFIG_KEYS.TOOL_PROFILES, profiles);\n }\n\n async cloneTool(\n db: ShadowClawDatabase,\n sourceToolName: string,\n newToolName: string,\n newDescription?: string,\n ): Promise<boolean> {\n const source = this.allTools.find((t) => t.name === sourceToolName);\n if (!source) {\n return false;\n }\n\n if (this.allTools.some((t) => t.name === newToolName)) {\n return false;\n }\n\n const cloned: ToolDefinition = {\n name: newToolName,\n description: newDescription || source.description,\n input_schema: JSON.parse(JSON.stringify(source.input_schema)),\n };\n\n await this.addCustomTool(db, cloned);\n\n return true;\n }\n\n async deactivateProfile(db: ShadowClawDatabase): Promise<void> {\n this._activeProfileId.set(null);\n await setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, null);\n }\n\n async deleteProfile(\n db: ShadowClawDatabase,\n profileId: string,\n ): Promise<void> {\n if (profileId === DEFAULT_BUILTIN_PROFILE.id) {\n return;\n }\n\n const profiles = this._profiles.get().filter((p) => p.id !== profileId);\n this._profiles.set(profiles);\n if (this._activeProfileId.get() === profileId) {\n this._activeProfileId.set(null);\n await setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, null);\n }\n\n await setConfig(db, CONFIG_KEYS.TOOL_PROFILES, profiles);\n }\n\n async importBackup(db: ShadowClawDatabase, json: string): Promise<void> {\n const data = JSON.parse(json);\n if (Array.isArray(data.enabledTools)) {\n this._enabledToolNames.set(new Set(data.enabledTools));\n await setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, data.enabledTools);\n }\n\n if (Array.isArray(data.customTools)) {\n this._customTools.set(data.customTools);\n await setConfig(db, CONFIG_KEYS.CUSTOM_TOOLS, data.customTools);\n }\n\n if (typeof data.systemPromptOverride === \"string\") {\n this._systemPromptOverride.set(data.systemPromptOverride);\n await setConfig(\n db,\n CONFIG_KEYS.SYSTEM_PROMPT_OVERRIDE,\n data.systemPromptOverride,\n );\n }\n\n if (Array.isArray(data.profiles)) {\n this._profiles.set(data.profiles);\n await setConfig(db, CONFIG_KEYS.TOOL_PROFILES, data.profiles);\n }\n\n if (\n typeof data.activeProfileId === \"string\" ||\n data.activeProfileId === null\n ) {\n this._activeProfileId.set(data.activeProfileId);\n await setConfig(\n db,\n CONFIG_KEYS.ACTIVE_TOOL_PROFILE,\n data.activeProfileId,\n );\n }\n\n if (typeof data.webSearchUseProxy === \"boolean\") {\n this._webSearchUseProxy.set(data.webSearchUseProxy);\n await setConfig(\n db,\n CONFIG_KEYS.WEB_SEARCH_USE_PROXY,\n data.webSearchUseProxy ? \"true\" : \"false\",\n );\n }\n\n if (typeof data.webSearchProxyUrl === \"string\") {\n this._webSearchProxyUrl.set(data.webSearchProxyUrl);\n await setConfig(\n db,\n CONFIG_KEYS.WEB_SEARCH_PROXY_URL,\n data.webSearchProxyUrl,\n );\n }\n\n if (typeof data.webSearchUrl === \"string\") {\n this._webSearchUrl.set(data.webSearchUrl);\n await setConfig(db, CONFIG_KEYS.WEB_SEARCH_URL, data.webSearchUrl);\n }\n\n if (\n typeof data.searchFilesMaxFileBytes === \"number\" &&\n data.searchFilesMaxFileBytes > 0\n ) {\n this._searchFilesMaxFileBytes.set(data.searchFilesMaxFileBytes);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_MAX_FILE_BYTES,\n String(data.searchFilesMaxFileBytes),\n );\n }\n\n if (\n typeof data.searchFilesMaxFilesVisited === \"number\" &&\n data.searchFilesMaxFilesVisited > 0\n ) {\n this._searchFilesMaxFilesVisited.set(data.searchFilesMaxFilesVisited);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_MAX_FILES_VISITED,\n String(data.searchFilesMaxFilesVisited),\n );\n }\n\n if (typeof data.searchFilesSkipDirs === \"string\") {\n this._searchFilesSkipDirs.set(data.searchFilesSkipDirs);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_SKIP_DIRS,\n data.searchFilesSkipDirs,\n );\n }\n\n if (Array.isArray(data.declarativeToolsEnabled)) {\n this._declarativeToolNamesEnabled.set(\n new Set(data.declarativeToolsEnabled),\n );\n await setConfig(\n db,\n CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED,\n data.declarativeToolsEnabled,\n );\n } else if (data.declarativeToolsEnabled === null) {\n this._declarativeToolNamesEnabled.set(null);\n await setConfig(db, CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED, null);\n }\n }\n\n /**\n * Load persisted tool config from IndexedDB.\n */\n async load(db: ShadowClawDatabase): Promise<void> {\n const [\n enabledRaw,\n customRaw,\n promptOverride,\n profilesRaw,\n activeProfileIdRaw,\n webSearchUseProxyRaw,\n webSearchProxyUrlRaw,\n webSearchUrlRaw,\n searchFilesMaxFileBytesRaw,\n searchFilesMaxFilesVisitedRaw,\n searchFilesSkipDirsRaw,\n declarativeEnabledRaw,\n ] = await Promise.all([\n getConfig(db, CONFIG_KEYS.ENABLED_TOOLS),\n getConfig(db, CONFIG_KEYS.CUSTOM_TOOLS),\n getConfig(db, CONFIG_KEYS.SYSTEM_PROMPT_OVERRIDE),\n getConfig(db, CONFIG_KEYS.TOOL_PROFILES),\n getConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE),\n getConfig(db, CONFIG_KEYS.WEB_SEARCH_USE_PROXY),\n getConfig(db, CONFIG_KEYS.WEB_SEARCH_PROXY_URL),\n getConfig(db, CONFIG_KEYS.WEB_SEARCH_URL),\n getConfig(db, CONFIG_KEYS.SEARCH_FILES_MAX_FILE_BYTES),\n getConfig(db, CONFIG_KEYS.SEARCH_FILES_MAX_FILES_VISITED),\n getConfig(db, CONFIG_KEYS.SEARCH_FILES_SKIP_DIRS),\n getConfig(db, CONFIG_KEYS.DECLARATIVE_TOOLS_ENABLED),\n ]);\n\n if (Array.isArray(enabledRaw)) {\n this._enabledToolNames.set(new Set(enabledRaw));\n }\n\n if (Array.isArray(customRaw)) {\n this._customTools.set(customRaw);\n }\n\n if (Array.isArray(declarativeEnabledRaw)) {\n this._declarativeToolNamesEnabled.set(new Set(declarativeEnabledRaw));\n }\n\n if (typeof promptOverride === \"string\") {\n this._systemPromptOverride.set(promptOverride);\n }\n\n if (Array.isArray(profilesRaw)) {\n this._profiles.set(profilesRaw);\n }\n\n if (typeof activeProfileIdRaw === \"string\") {\n this._activeProfileId.set(activeProfileIdRaw);\n }\n\n if (webSearchUseProxyRaw !== null && webSearchUseProxyRaw !== undefined) {\n const strVal = String(webSearchUseProxyRaw).toLowerCase();\n this._webSearchUseProxy.set(strVal === \"true\" || strVal === \"1\");\n }\n\n if (\n typeof webSearchProxyUrlRaw === \"string\" &&\n webSearchProxyUrlRaw.trim().length > 0\n ) {\n this._webSearchProxyUrl.set(webSearchProxyUrlRaw.trim());\n }\n\n if (\n typeof webSearchUrlRaw === \"string\" &&\n webSearchUrlRaw.trim().length > 0\n ) {\n this._webSearchUrl.set(webSearchUrlRaw.trim());\n }\n\n if (\n searchFilesMaxFileBytesRaw !== null &&\n searchFilesMaxFileBytesRaw !== undefined\n ) {\n const n = Number(searchFilesMaxFileBytesRaw);\n if (Number.isFinite(n) && n > 0) {\n this._searchFilesMaxFileBytes.set(n);\n }\n }\n\n if (\n searchFilesMaxFilesVisitedRaw !== null &&\n searchFilesMaxFilesVisitedRaw !== undefined\n ) {\n const n = Number(searchFilesMaxFilesVisitedRaw);\n if (Number.isFinite(n) && n > 0) {\n this._searchFilesMaxFilesVisited.set(n);\n }\n }\n\n if (\n typeof searchFilesSkipDirsRaw === \"string\" &&\n searchFilesSkipDirsRaw.trim().length > 0\n ) {\n this._searchFilesSkipDirs.set(searchFilesSkipDirsRaw.trim());\n }\n }\n\n async setWebSearchProxyUrl(\n db: ShadowClawDatabase,\n proxyUrl: string,\n ): Promise<void> {\n const trimmed = proxyUrl.trim() || \"/proxy\";\n this._webSearchProxyUrl.set(trimmed);\n await setConfig(db, CONFIG_KEYS.WEB_SEARCH_PROXY_URL, trimmed);\n }\n\n async setWebSearchUrl(db: ShadowClawDatabase, url: string): Promise<void> {\n const trimmed = url.trim() || \"https://html.duckduckgo.com/html/?q={query}\";\n this._webSearchUrl.set(trimmed);\n await setConfig(db, CONFIG_KEYS.WEB_SEARCH_URL, trimmed);\n }\n\n async setWebSearchUseProxy(\n db: ShadowClawDatabase,\n useProxy: boolean,\n ): Promise<void> {\n const enabled = !!useProxy;\n this._webSearchUseProxy.set(enabled);\n await setConfig(\n db,\n CONFIG_KEYS.WEB_SEARCH_USE_PROXY,\n enabled ? \"true\" : \"false\",\n );\n }\n\n async setSearchFilesMaxFileBytes(\n db: ShadowClawDatabase,\n bytes: number,\n ): Promise<void> {\n const clamped = Math.max(1, Math.round(bytes));\n this._searchFilesMaxFileBytes.set(clamped);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_MAX_FILE_BYTES,\n String(clamped),\n );\n }\n\n async setSearchFilesMaxFilesVisited(\n db: ShadowClawDatabase,\n count: number,\n ): Promise<void> {\n const clamped = Math.max(1, Math.round(count));\n this._searchFilesMaxFilesVisited.set(clamped);\n await setConfig(\n db,\n CONFIG_KEYS.SEARCH_FILES_MAX_FILES_VISITED,\n String(clamped),\n );\n }\n\n async setSearchFilesSkipDirs(\n db: ShadowClawDatabase,\n dirs: string,\n ): Promise<void> {\n const trimmed = dirs.trim();\n this._searchFilesSkipDirs.set(trimmed);\n await setConfig(db, CONFIG_KEYS.SEARCH_FILES_SKIP_DIRS, trimmed);\n }\n\n async removeCustomTool(\n db: ShadowClawDatabase,\n toolName: string,\n ): Promise<void> {\n const tools = this._customTools.get().filter((t) => t.name !== toolName);\n this._customTools.set(tools);\n const enabled = new Set(this._enabledToolNames.get());\n enabled.delete(toolName);\n this._enabledToolNames.set(enabled);\n await Promise.all([\n setConfig(db, CONFIG_KEYS.CUSTOM_TOOLS, tools),\n setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, [...enabled]),\n ]);\n }\n\n async saveToActiveProfile(db: ShadowClawDatabase): Promise<void> {\n const id = this._activeProfileId.get();\n if (!id) {\n return;\n }\n\n const profile = this._profiles.get().find((p) => p.id === id);\n if (!profile) {\n return;\n }\n\n const updated = {\n ...profile,\n enabledToolNames: [...this._enabledToolNames.get()],\n customTools: [...this._customTools.get()],\n systemPromptOverride: this._systemPromptOverride.get(),\n };\n await this.updateProfile(db, updated);\n }\n\n async setAllEnabled(\n db: ShadowClawDatabase,\n toolNames: string[],\n ): Promise<void> {\n this._enabledToolNames.set(new Set(toolNames));\n\n const saves = [setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, toolNames)];\n if (this._activeProfileId.get()) {\n this._activeProfileId.set(null);\n saves.push(setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, null));\n }\n\n await Promise.all(saves);\n }\n\n async setSystemPromptOverride(\n db: ShadowClawDatabase,\n override: string,\n ): Promise<void> {\n this._systemPromptOverride.set(override);\n await setConfig(db, CONFIG_KEYS.SYSTEM_PROMPT_OVERRIDE, override);\n }\n\n async setToolEnabled(\n db: ShadowClawDatabase,\n toolName: string,\n enabled: boolean,\n ): Promise<void> {\n const current = new Set(this._enabledToolNames.get());\n if (enabled) {\n current.add(toolName);\n } else {\n current.delete(toolName);\n }\n\n this._enabledToolNames.set(current);\n\n const saves = [setConfig(db, CONFIG_KEYS.ENABLED_TOOLS, [...current])];\n if (this._activeProfileId.get()) {\n this._activeProfileId.set(null);\n saves.push(setConfig(db, CONFIG_KEYS.ACTIVE_TOOL_PROFILE, null));\n }\n\n await Promise.all(saves);\n }\n\n async updateProfile(\n db: ShadowClawDatabase,\n profile: ToolProfile,\n ): Promise<void> {\n const profiles = this._profiles\n .get()\n .map((p) => (p.id === profile.id ? profile : p));\n this._profiles.set(profiles);\n await setConfig(db, CONFIG_KEYS.TOOL_PROFILES, profiles);\n }\n}\n\nexport const toolsStore = new ToolsStore();\n"],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- import { F as getProvider } from "./config-DxNI3TlW.js";
1
+ import { F as getProvider } from "./config-BrHR97zt.js";
2
2
 
3
3
  //#region src/components/common/help/providers.ts
4
4
  const PROVIDER_HELP_LINKS = {
@@ -116,4 +116,4 @@ function buildTransformersJsHelpDialogOptions(reason) {
116
116
 
117
117
  //#endregion
118
118
  export { detectProviderHelpType as i, isTransformersJsResolutionError as n, buildProviderHelpDialogOptions as r, buildTransformersJsHelpDialogOptions as t };
119
- //# sourceMappingURL=transformers-DydnReu4.js.map
119
+ //# sourceMappingURL=transformers-BMURofG6.js.map