shadow-claw 1.51.0 → 1.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/.well-known/mcp/server-card.json +1 -1
  2. package/.well-known/mcp.json +1 -1
  3. package/README.md +1 -1
  4. package/dist/cli/{chunk-Dtse8rAn.js → chunk-5ryVpyup.js} +1 -1
  5. package/dist/cli/chunk-Aq3057Xo.js +1 -0
  6. package/dist/cli/{chunk-4CZJpLqA.js → chunk-BV9JBYpl.js} +2 -2
  7. package/dist/cli/{chunk-mbFAP9Ev.js → chunk-BZI3bWDA.js} +1 -1
  8. package/dist/cli/chunk-BaUCHRPD.js +1 -0
  9. package/dist/cli/{chunk-vzUrhBN5.js → chunk-BdbEt6gM.js} +1 -1
  10. package/dist/cli/{chunk-BU8UG4L_.js → chunk-BiWLawPV.js} +1 -1
  11. package/dist/cli/chunk-BkLnHJeo.js +1 -0
  12. package/dist/cli/{chunk-BqfPWIBf.js → chunk-BzWY1sKE.js} +1 -1
  13. package/dist/cli/{chunk-DajM7Kro.js → chunk-C79eIU-4.js} +1 -1
  14. package/dist/cli/{chunk-CI9r1AM5.js → chunk-CDw214Zi.js} +1 -1
  15. package/dist/cli/chunk-CNqc7LLn.js +1 -0
  16. package/dist/cli/{chunk-CEhU-Ah-.js → chunk-CWW7dqIv.js} +1 -1
  17. package/dist/cli/{chunk-BT_C3OlA.js → chunk-CcSTYHtR.js} +1 -1
  18. package/dist/cli/chunk-ClOfk6Ga.js +1 -0
  19. package/dist/cli/chunk-ComXUwW0.js +1 -0
  20. package/dist/cli/{chunk-lL1BhHVe.js → chunk-CooeO4UQ.js} +1 -1
  21. package/dist/cli/{chunk-khr7--yI.js → chunk-CtfWY4G6.js} +1 -1
  22. package/dist/cli/{chunk-C4iW1XuQ.js → chunk-DFgSiYMW.js} +1 -1
  23. package/dist/cli/chunk-DGBnjngK.js +1 -0
  24. package/dist/cli/{chunk-D7bFIUK3.js → chunk-DGu1OhJs.js} +1 -1
  25. package/dist/cli/{chunk-CzfOerQR.js → chunk-DIjCY0Wf.js} +1 -1
  26. package/dist/cli/{chunk-D-iqEY5G.js → chunk-DJ_LeQtz.js} +1 -1
  27. package/dist/cli/{chunk-BmEsDkRK.js → chunk-DQRu-9wO.js} +1 -1
  28. package/dist/cli/{chunk-DojiYody.js → chunk-DToVgO9a.js} +1 -1
  29. package/dist/cli/{chunk-De5a_Rlp.js → chunk-DVbNkQRL.js} +1 -1
  30. package/dist/cli/{chunk-c8MIYB2y.js → chunk-Ddtzaj43.js} +1 -1
  31. package/dist/cli/{chunk-aJ6fufe-.js → chunk-DiqS56rD.js} +1 -1
  32. package/dist/cli/{chunk-CeUEmZNt.js → chunk-DnRcu9b4.js} +1 -1
  33. package/dist/cli/chunk-DtgZDsJA.js +1 -0
  34. package/dist/cli/{chunk-DVMcK7g6.js → chunk-Du4qvxo_.js} +2 -2
  35. package/dist/cli/{chunk-CegcvNc9.js → chunk-Dz5_hgvL.js} +8 -8
  36. package/dist/cli/{chunk-Cd4Dv5Eq.js → chunk-I3mxEelq.js} +1 -1
  37. package/dist/cli/{chunk-Do3VICh1.js → chunk-IU2SH_ti.js} +1 -1
  38. package/dist/cli/{chunk-BQveaAaD.js → chunk-NC8XsSSA.js} +1 -1
  39. package/dist/cli/{chunk-D702W_Ry.js → chunk-Q4BZ9QN9.js} +1 -1
  40. package/dist/cli/chunk-WTlDd4Ou.js +1 -0
  41. package/dist/cli/chunk-XGzq5joC.js +1 -0
  42. package/dist/cli/{chunk-ar7eAlxK.js → chunk-aJfaGe2s.js} +8 -8
  43. package/dist/cli/chunk-bPVrFlmk.js +1 -0
  44. package/dist/cli/chunk-jXJHKxdR.js +1 -0
  45. package/dist/cli/{chunk-C3dTAmV_.js → chunk-rstVU7U0.js} +1 -1
  46. package/dist/cli/{chunk-DGfTzQui.js → chunk-t72uObQ7.js} +1 -1
  47. package/dist/cli/{chunk-DDgfljzN.js → chunk-vq8xlroY.js} +1 -1
  48. package/dist/cli/cli.js +1 -1
  49. package/dist/headless-agent.js +1 -1
  50. package/dist/lib/components/common/shadow-claw-provider-model-picker.js +1 -1
  51. package/dist/lib/components/index.js +27 -27
  52. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  53. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  54. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  55. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  56. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  57. package/dist/lib/components/settings/shadow-claw-llm/model-ranking.d.ts +12 -0
  58. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  59. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  60. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  61. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  62. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  63. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  64. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  65. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  66. package/dist/lib/components/shadow-claw-a2ui.js +1 -1
  67. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  68. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  69. package/dist/lib/components/shadow-claw-channels.js +1 -1
  70. package/dist/lib/components/shadow-claw-chat/shadow-claw-chat.d.ts +1 -0
  71. package/dist/lib/components/shadow-claw-chat.js +1 -1
  72. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  73. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  74. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  75. package/dist/lib/components/shadow-claw-files.js +1 -1
  76. package/dist/lib/components/shadow-claw-git.js +1 -1
  77. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  78. package/dist/lib/components/shadow-claw-llm.js +1 -1
  79. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  80. package/dist/lib/components/shadow-claw-networking.js +1 -1
  81. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  82. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  83. package/dist/lib/components/shadow-claw-pages.js +1 -1
  84. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  85. package/dist/lib/components/shadow-claw-provider-model-picker.js +1 -1
  86. package/dist/lib/components/shadow-claw-settings.js +1 -1
  87. package/dist/lib/components/shadow-claw-storage.js +1 -1
  88. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  89. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  90. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  91. package/dist/lib/components/shadow-claw-tools.js +1 -1
  92. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  93. package/dist/lib/components/shadow-claw.js +1 -1
  94. package/dist/lib/config/config.d.ts +2 -1
  95. package/dist/lib/{config-DxDaVDTn.js → config-DFLs7eoC.js} +3 -2
  96. package/dist/lib/config-DFLs7eoC.js.map +1 -0
  97. package/dist/lib/{configurePeerJs-ScwZiGbF.js → configurePeerJs-DJ0H6e6s.js} +3 -3
  98. package/dist/lib/{configurePeerJs-ScwZiGbF.js.map → configurePeerJs-DJ0H6e6s.js.map} +1 -1
  99. package/dist/lib/{connections-D82zele0.js → connections-DT3nPylw.js} +2 -2
  100. package/dist/lib/{connections-D82zele0.js.map → connections-DT3nPylw.js.map} +1 -1
  101. package/dist/lib/{downloadGroupFile-D7-5y6NI.js → downloadGroupFile-DMnAiPj4.js} +2 -2
  102. package/dist/lib/{downloadGroupFile-D7-5y6NI.js.map → downloadGroupFile-DMnAiPj4.js.map} +1 -1
  103. package/dist/lib/{file-viewer-BMvvndPQ.js → file-viewer-OHmGC_l7.js} +5 -5
  104. package/dist/lib/{file-viewer-BMvvndPQ.js.map → file-viewer-OHmGC_l7.js.map} +1 -1
  105. package/dist/lib/{getGroupDir-BidwYPfP.js → getGroupDir-mTV2Iz2b.js} +3 -3
  106. package/dist/lib/{getGroupDir-BidwYPfP.js.map → getGroupDir-mTV2Iz2b.js.map} +1 -1
  107. package/dist/lib/{git-CXmWufWS.js → git-CGdKghMC.js} +3 -3
  108. package/dist/lib/{git-CXmWufWS.js.map → git-CGdKghMC.js.map} +1 -1
  109. package/dist/lib/index.js +28 -28
  110. package/dist/lib/{initChatSplitResize-tvUZ-wsp.js → initChatSplitResize-B8zHHQdm.js} +2 -2
  111. package/dist/lib/{initChatSplitResize-tvUZ-wsp.js.map → initChatSplitResize-B8zHHQdm.js.map} +1 -1
  112. package/dist/lib/{initControlPlane-Dnjkb-6J.js → initControlPlane-BczrlTf3.js} +14 -14
  113. package/dist/lib/{initControlPlane-Dnjkb-6J.js.map → initControlPlane-BczrlTf3.js.map} +1 -1
  114. package/dist/lib/{markdown-WCXar9C8.js → markdown-D-7Cjyye.js} +3 -3
  115. package/dist/lib/{markdown-WCXar9C8.js.map → markdown-D-7Cjyye.js.map} +1 -1
  116. package/dist/lib/{mcp-reconnect-WTOQONHZ.js → mcp-reconnect-Czf7QCCv.js} +2 -2
  117. package/dist/lib/{mcp-reconnect-WTOQONHZ.js.map → mcp-reconnect-Czf7QCCv.js.map} +1 -1
  118. package/dist/lib/{memoryStorage-Bo2Wpfmg.js → memoryStorage-CXyKsKMo.js} +2 -2
  119. package/dist/lib/{memoryStorage-Bo2Wpfmg.js.map → memoryStorage-CXyKsKMo.js.map} +1 -1
  120. package/dist/lib/model-ranking-Bo8CpGH1.js +116 -0
  121. package/dist/lib/model-ranking-Bo8CpGH1.js.map +1 -0
  122. package/dist/lib/{orchestrator-Crw4btGn.js → orchestrator-BK138MkV.js} +10 -10
  123. package/dist/lib/{orchestrator-Crw4btGn.js.map → orchestrator-BK138MkV.js.map} +1 -1
  124. package/dist/lib/{orchestrator-Dro541iH.js → orchestrator-BtbxiPQB.js} +17 -16
  125. package/dist/lib/{orchestrator-Dro541iH.js.map → orchestrator-BtbxiPQB.js.map} +1 -1
  126. package/dist/lib/{peerjs-D741bHrf.js → peerjs-QJr03K9F.js} +7 -7
  127. package/dist/lib/{peerjs-D741bHrf.js.map → peerjs-QJr03K9F.js.map} +1 -1
  128. package/dist/lib/{prompt-api-D9XdrCep.js → prompt-api-vf351sf2.js} +2 -19
  129. package/dist/lib/{prompt-api-D9XdrCep.js.map → prompt-api-vf351sf2.js.map} +1 -1
  130. package/dist/lib/{push-client-DKFUY_Ti.js → push-client-BOHgqHbk.js} +4 -4
  131. package/dist/lib/{push-client-DKFUY_Ti.js.map → push-client-BOHgqHbk.js.map} +1 -1
  132. package/dist/lib/{readGroupFileBytes-C8Xqlb8l.js → readGroupFileBytes-CRA6dmgT.js} +2 -2
  133. package/dist/lib/{readGroupFileBytes-C8Xqlb8l.js.map → readGroupFileBytes-CRA6dmgT.js.map} +1 -1
  134. package/dist/lib/{shadow-claw-a2ui-CPydWVdW.js → shadow-claw-a2ui-DbZa4Gxp.js} +2 -2
  135. package/dist/lib/{shadow-claw-a2ui-CPydWVdW.js.map → shadow-claw-a2ui-DbZa4Gxp.js.map} +1 -1
  136. package/dist/lib/{shadow-claw-accounts-CUypXc3I.js → shadow-claw-accounts-B6OW2NVD.js} +3 -3
  137. package/dist/lib/{shadow-claw-accounts-CUypXc3I.js.map → shadow-claw-accounts-B6OW2NVD.js.map} +1 -1
  138. package/dist/lib/{shadow-claw-channel-config-D_Vb2ous.js → shadow-claw-channel-config-F_EJ-uK2.js} +3 -3
  139. package/dist/lib/{shadow-claw-channel-config-D_Vb2ous.js.map → shadow-claw-channel-config-F_EJ-uK2.js.map} +1 -1
  140. package/dist/lib/{shadow-claw-channels-hgjjzvRr.js → shadow-claw-channels-XYylMpjg.js} +3 -3
  141. package/dist/lib/{shadow-claw-channels-hgjjzvRr.js.map → shadow-claw-channels-XYylMpjg.js.map} +1 -1
  142. package/dist/lib/{shadow-claw-chat-D69IiLXd.js → shadow-claw-chat-dbK_DGO_.js} +124 -38
  143. package/dist/lib/shadow-claw-chat-dbK_DGO_.js.map +1 -0
  144. package/dist/lib/{shadow-claw-control-plane-zBYlFvzQ.js → shadow-claw-control-plane-BJKkmahQ.js} +7 -7
  145. package/dist/lib/{shadow-claw-control-plane-zBYlFvzQ.js.map → shadow-claw-control-plane-BJKkmahQ.js.map} +1 -1
  146. package/dist/lib/{shadow-claw-conversations-1GW8_e8o.js → shadow-claw-conversations-BKSsMYTc.js} +6 -6
  147. package/dist/lib/{shadow-claw-conversations-1GW8_e8o.js.map → shadow-claw-conversations-BKSsMYTc.js.map} +1 -1
  148. package/dist/lib/{shadow-claw-D3z3tFyE.js → shadow-claw-eBB2dbpd.js} +11 -11
  149. package/dist/lib/{shadow-claw-D3z3tFyE.js.map → shadow-claw-eBB2dbpd.js.map} +1 -1
  150. package/dist/lib/{shadow-claw-file-viewer-DI4r7Th9.js → shadow-claw-file-viewer-BqChtTvM.js} +8 -8
  151. package/dist/lib/{shadow-claw-file-viewer-DI4r7Th9.js.map → shadow-claw-file-viewer-BqChtTvM.js.map} +1 -1
  152. package/dist/lib/{shadow-claw-files-BM7qW3TW.js → shadow-claw-files-Bu7VCQw6.js} +9 -9
  153. package/dist/lib/{shadow-claw-files-BM7qW3TW.js.map → shadow-claw-files-Bu7VCQw6.js.map} +1 -1
  154. package/dist/lib/{shadow-claw-git-BBTiTYIn.js → shadow-claw-git-CdPPN6Qb.js} +6 -6
  155. package/dist/lib/{shadow-claw-git-BBTiTYIn.js.map → shadow-claw-git-CdPPN6Qb.js.map} +1 -1
  156. package/dist/lib/{shadow-claw-integrations-DTY3E545.js → shadow-claw-integrations-DehqBSRe.js} +4 -4
  157. package/dist/lib/{shadow-claw-integrations-DTY3E545.js.map → shadow-claw-integrations-DehqBSRe.js.map} +1 -1
  158. package/dist/lib/{shadow-claw-llm-AJwzkOGo.js → shadow-claw-llm-COZkufA8.js} +13 -11
  159. package/dist/lib/shadow-claw-llm-COZkufA8.js.map +1 -0
  160. package/dist/lib/{shadow-claw-mcp-remote-n7YXKxmv.js → shadow-claw-mcp-remote-axF50-le.js} +4 -4
  161. package/dist/lib/{shadow-claw-mcp-remote-n7YXKxmv.js.map → shadow-claw-mcp-remote-axF50-le.js.map} +1 -1
  162. package/dist/lib/{shadow-claw-networking-B3leDgZ4.js → shadow-claw-networking-BT_Rxj36.js} +2 -2
  163. package/dist/lib/{shadow-claw-networking-B3leDgZ4.js.map → shadow-claw-networking-BT_Rxj36.js.map} +1 -1
  164. package/dist/lib/{shadow-claw-notifications-Bm2aHQ0U.js → shadow-claw-notifications-ClqAXDDN.js} +3 -3
  165. package/dist/lib/{shadow-claw-notifications-Bm2aHQ0U.js.map → shadow-claw-notifications-ClqAXDDN.js.map} +1 -1
  166. package/dist/lib/{shadow-claw-page-header-BBqSWlhP.js → shadow-claw-page-header-bigC_h6U.js} +2 -2
  167. package/dist/lib/{shadow-claw-page-header-BBqSWlhP.js.map → shadow-claw-page-header-bigC_h6U.js.map} +1 -1
  168. package/dist/lib/{shadow-claw-pages-BFOcluFY.js → shadow-claw-pages-kA2qa-4B.js} +9 -9
  169. package/dist/lib/{shadow-claw-pages-BFOcluFY.js.map → shadow-claw-pages-kA2qa-4B.js.map} +1 -1
  170. package/dist/lib/{shadow-claw-peerjs-BvD_MH_l.js → shadow-claw-peerjs-CvcH2DkA.js} +3 -3
  171. package/dist/lib/{shadow-claw-peerjs-BvD_MH_l.js.map → shadow-claw-peerjs-CvcH2DkA.js.map} +1 -1
  172. package/dist/lib/{shadow-claw-provider-model-picker-CsA-507a.js → shadow-claw-provider-model-picker-fcVQdDtQ.js} +2 -2
  173. package/dist/lib/{shadow-claw-provider-model-picker-CsA-507a.js.map → shadow-claw-provider-model-picker-fcVQdDtQ.js.map} +1 -1
  174. package/dist/lib/{shadow-claw-settings-CZgGMz0a.js → shadow-claw-settings-CkO6JjA4.js} +6 -6
  175. package/dist/lib/{shadow-claw-settings-CZgGMz0a.js.map → shadow-claw-settings-CkO6JjA4.js.map} +1 -1
  176. package/dist/lib/{shadow-claw-storage-BTUpEKO0.js → shadow-claw-storage-10w-y8vL.js} +5 -5
  177. package/dist/lib/{shadow-claw-storage-BTUpEKO0.js.map → shadow-claw-storage-10w-y8vL.js.map} +1 -1
  178. package/dist/lib/{shadow-claw-task-server-B1X2AYyZ.js → shadow-claw-task-server-U98sZxPu.js} +2 -2
  179. package/dist/lib/{shadow-claw-task-server-B1X2AYyZ.js.map → shadow-claw-task-server-U98sZxPu.js.map} +1 -1
  180. package/dist/lib/{shadow-claw-tasks-BYtaRUAd.js → shadow-claw-tasks-DrSVUOsP.js} +8 -8
  181. package/dist/lib/{shadow-claw-tasks-BYtaRUAd.js.map → shadow-claw-tasks-DrSVUOsP.js.map} +1 -1
  182. package/dist/lib/{shadow-claw-terminal-LGuXKu77.js → shadow-claw-terminal-B7HYLuce.js} +2 -2
  183. package/dist/lib/{shadow-claw-terminal-LGuXKu77.js.map → shadow-claw-terminal-B7HYLuce.js.map} +1 -1
  184. package/dist/lib/{shadow-claw-tools-C_S-xXVG.js → shadow-claw-tools-BKrXzZfF.js} +7 -7
  185. package/dist/lib/{shadow-claw-tools-C_S-xXVG.js.map → shadow-claw-tools-BKrXzZfF.js.map} +1 -1
  186. package/dist/lib/{shadow-claw-webvm-Cab1n1bu.js → shadow-claw-webvm-Duwa5oiW.js} +3 -3
  187. package/dist/lib/{shadow-claw-webvm-Cab1n1bu.js.map → shadow-claw-webvm-Duwa5oiW.js.map} +1 -1
  188. package/dist/lib/{syncWebMcpRegistration-Dy5NS_4G.js → syncWebMcpRegistration-BOx-0F6_.js} +5 -5
  189. package/dist/lib/{syncWebMcpRegistration-Dy5NS_4G.js.map → syncWebMcpRegistration-BOx-0F6_.js.map} +1 -1
  190. package/dist/lib/{tools-B7gC1eb_.js → tools-BEuBatUs.js} +4 -4
  191. package/dist/lib/{tools-B7gC1eb_.js.map → tools-BEuBatUs.js.map} +1 -1
  192. package/dist/lib/utils/index.js +1 -1
  193. package/dist/lib/utils/utils.js +1 -1
  194. package/dist/lib/{utils-D_ylqOY-.js → utils-D8AxCH6m.js} +2 -2
  195. package/dist/lib/{utils-D_ylqOY-.js.map → utils-D8AxCH6m.js.map} +1 -1
  196. package/dist/lib/{webmcp-CkYINKJj.js → webmcp-BjfVWX1K.js} +2 -2
  197. package/dist/lib/{webmcp-CkYINKJj.js.map → webmcp-BjfVWX1K.js.map} +1 -1
  198. package/dist/public/.well-known/mcp/server-card.json +1 -1
  199. package/dist/public/.well-known/mcp.json +1 -1
  200. package/dist/public/README.md +1 -1
  201. package/dist/public/agent.worker.js +1 -1
  202. package/dist/public/components/shadow-claw-chat/shadow-claw-chat.html +1 -1
  203. package/dist/public/config-071HSho8.js +1 -0
  204. package/dist/public/{configurePeerJs-DQQ6YL-5.js → configurePeerJs-DL-LurJY.js} +1 -1
  205. package/dist/public/{connections-CRNk2FxF.js → connections-Bb0rBpV-.js} +1 -1
  206. package/dist/public/{custom-element-security-3_FKCXcg.js → custom-element-security-Td4vrRc_.js} +1 -1
  207. package/dist/public/docs/example/article/index.html +1 -1
  208. package/dist/public/docs/example/article.html +1 -1
  209. package/dist/public/docs/publishing/index.html +1 -1
  210. package/dist/public/docs/publishing.html +1 -1
  211. package/dist/public/docs/skill-creator/index.html +1 -1
  212. package/dist/public/docs/skill-creator.html +1 -1
  213. package/dist/public/docs/subsystems/providers.md +1 -1
  214. package/dist/public/{downloadGroupFile-wkdhVgrZ.js → downloadGroupFile-Unq8_7D9.js} +1 -1
  215. package/dist/public/{e2e-bridge-DnFHPuwg.js → e2e-bridge-Dbc9fCDq.js} +1 -1
  216. package/dist/public/{file-viewer-C92v4Ggd.js → file-viewer-QkCuknFn.js} +1 -1
  217. package/dist/public/{getGroupDir-BGGIJL4Y.js → getGroupDir-Bj5XCflQ.js} +1 -1
  218. package/dist/public/{git-BH6qyToB.js → git-Bhz4YHc8.js} +2 -2
  219. package/dist/public/index.html +1 -1
  220. package/dist/public/index.js +1 -1
  221. package/dist/public/{initChatSplitResize--RH5kzVF.js → initChatSplitResize-KNL9Oh7s.js} +1 -1
  222. package/dist/public/{initControlPlane-yPJ3ajkj.js → initControlPlane-D2fVhRFC.js} +1 -1
  223. package/dist/public/main/index.html +1 -1
  224. package/dist/public/main/memory/index.html +1 -1
  225. package/dist/public/main/memory.html +1 -1
  226. package/dist/public/main.html +1 -1
  227. package/dist/public/{markdown-CA0v11cd.js → markdown-By6gdUvF.js} +1 -1
  228. package/dist/public/{mcp-reconnect-uyNSigzu.js → mcp-reconnect-CDRJPuoN.js} +1 -1
  229. package/dist/public/{memoryStorage-DjPNAT5t.js → memoryStorage-C-ao9y-j.js} +1 -1
  230. package/dist/public/model-ranking-DUdrFOcC.js +1 -0
  231. package/dist/public/{orchestrator-DTzgyL23.js → orchestrator-B7MpomoG.js} +2 -2
  232. package/dist/public/{orchestrator-Cmr69pMC.js → orchestrator-C8aIHbDy.js} +2 -2
  233. package/dist/public/{peerjs-Br38mUFC.js → peerjs-DwGjY5VX.js} +1 -1
  234. package/dist/public/prompt-api-BWe_j3Wg.js +1 -0
  235. package/dist/public/{push-client-CB8haOGC.js → push-client-o8g5_EOe.js} +1 -1
  236. package/dist/public/service-worker.js +1 -1
  237. package/dist/public/{shadow-claw-RuFQ2Ej5.js → shadow-claw-Ba2ZFE9m.js} +2 -2
  238. package/dist/public/{shadow-claw-accounts-BMsEItB6.js → shadow-claw-accounts-BbNPiiaV.js} +1 -1
  239. package/dist/public/{shadow-claw-channels-Q_AXuEaI.js → shadow-claw-channels-CHGtPkfY.js} +1 -1
  240. package/dist/public/{shadow-claw-chat-DZQ3OaH7.js → shadow-claw-chat-3TmjJA6-.js} +90 -23
  241. package/dist/public/{shadow-claw-control-plane-CyXA8tB8.js → shadow-claw-control-plane-BAFT06LL.js} +2 -2
  242. package/dist/public/{shadow-claw-conversations-BLKtlvHe.js → shadow-claw-conversations-DsQ_kxWm.js} +1 -1
  243. package/dist/public/{shadow-claw-file-viewer-CVLDfpZe.js → shadow-claw-file-viewer-hBxTknL2.js} +1 -1
  244. package/dist/public/{shadow-claw-files-DB6VVjir.js → shadow-claw-files-Daw6IIrJ.js} +1 -1
  245. package/dist/public/{shadow-claw-git-D57bTSMF.js → shadow-claw-git-CxGwyxim.js} +2 -2
  246. package/dist/public/{shadow-claw-integrations-BOwhUY-4.js → shadow-claw-integrations-DnIr6xp-.js} +1 -1
  247. package/dist/public/{shadow-claw-llm-CYenm-mm.js → shadow-claw-llm-Bc6tZ8kk.js} +3 -3
  248. package/dist/public/{shadow-claw-mcp-remote-CJ-Ckl0j.js → shadow-claw-mcp-remote-nGPpFpI-.js} +1 -1
  249. package/dist/public/{shadow-claw-networking-Cut76YQL.js → shadow-claw-networking-B6YgtiA7.js} +1 -1
  250. package/dist/public/{shadow-claw-notifications-C3kYCrIa.js → shadow-claw-notifications-BSxifptS.js} +1 -1
  251. package/dist/public/{shadow-claw-page-header-Dd7QafUk.js → shadow-claw-page-header-LzVgEn46.js} +1 -1
  252. package/dist/public/{shadow-claw-pages-BWtVtwTG.js → shadow-claw-pages-Cy6T0G9y.js} +1 -1
  253. package/dist/public/{shadow-claw-settings-Bj7jnngO.js → shadow-claw-settings-DGkwt1ge.js} +2 -2
  254. package/dist/public/{shadow-claw-storage-CMSzQs1-.js → shadow-claw-storage-DX_4T7KR.js} +1 -1
  255. package/dist/public/{shadow-claw-task-server-CFclo7UX.js → shadow-claw-task-server-DTsbEs5z.js} +1 -1
  256. package/dist/public/{shadow-claw-tasks-ClDdeB6Z.js → shadow-claw-tasks-rr6fMxAM.js} +1 -1
  257. package/dist/public/{shadow-claw-terminal-3ysWZJix.js → shadow-claw-terminal-C7DhrrX6.js} +1 -1
  258. package/dist/public/{shadow-claw-tools-DQVwpTcZ.js → shadow-claw-tools-DcQroojH.js} +1 -1
  259. package/dist/public/{shadow-claw-webvm-Cnxz04Fk.js → shadow-claw-webvm-bZj44Did.js} +1 -1
  260. package/dist/public/{syncWebMcpRegistration-QwnLMAK3.js → syncWebMcpRegistration-XJjIlDNO.js} +1 -1
  261. package/dist/public/{tools-DvQ_ngXn.js → tools-BpZh7hgB.js} +1 -1
  262. package/dist/public/{webmcp-CJymew4t.js → webmcp-CkfDZfZ0.js} +1 -1
  263. package/dist/server.js +1 -1
  264. package/package.json +1 -1
  265. package/src/components/settings/shadow-claw-llm/model-ranking.test.ts +121 -7
  266. package/src/components/settings/shadow-claw-llm/model-ranking.ts +97 -0
  267. package/src/components/settings/shadow-claw-llm/shadow-claw-llm.test.ts +35 -0
  268. package/src/components/settings/shadow-claw-llm/shadow-claw-llm.ts +15 -5
  269. package/src/components/shadow-claw-chat/shadow-claw-chat.html +81 -14
  270. package/src/components/shadow-claw-chat/shadow-claw-chat.test.ts +73 -0
  271. package/src/components/shadow-claw-chat/shadow-claw-chat.trusted-types.test.ts +3 -0
  272. package/src/components/shadow-claw-chat/shadow-claw-chat.ts +79 -32
  273. package/src/config/config.test.ts +4 -4
  274. package/src/config/config.ts +2 -1
  275. package/src/core/orchestrator/orchestrator.test.ts +2 -1
  276. package/src/core/orchestrator/utils/initTasks.ts +5 -4
  277. package/dist/cli/chunk-B3S061IE.js +0 -1
  278. package/dist/cli/chunk-BUJdF9o3.js +0 -1
  279. package/dist/cli/chunk-BX0R2gIY.js +0 -1
  280. package/dist/cli/chunk-BoiPfhwJ.js +0 -1
  281. package/dist/cli/chunk-BtJYj7vB.js +0 -1
  282. package/dist/cli/chunk-BwXrZVeU.js +0 -1
  283. package/dist/cli/chunk-CaWh9Pru.js +0 -1
  284. package/dist/cli/chunk-Ck4ePI8z.js +0 -1
  285. package/dist/cli/chunk-Ctg-SXcP.js +0 -1
  286. package/dist/cli/chunk-DTKv1-tk.js +0 -1
  287. package/dist/cli/chunk-DdYpd9Nu.js +0 -1
  288. package/dist/cli/chunk-DflhmBY2.js +0 -1
  289. package/dist/lib/config-DxDaVDTn.js.map +0 -1
  290. package/dist/lib/model-ranking-CDXs7hkK.js +0 -57
  291. package/dist/lib/model-ranking-CDXs7hkK.js.map +0 -1
  292. package/dist/lib/shadow-claw-chat-D69IiLXd.js.map +0 -1
  293. package/dist/lib/shadow-claw-llm-AJwzkOGo.js.map +0 -1
  294. package/dist/public/config-Dqn5OMfC.js +0 -1
  295. package/dist/public/model-ranking-DLIC9IDU.js +0 -1
  296. package/dist/public/prompt-api-B-8N-MRY.js +0 -11
@@ -1,5 +1,5 @@
1
1
  import ShadowClawElement from "./components/shadow-claw-element.js";
2
- import { n as isLikelyInstructionModelId } from "./model-ranking-CDXs7hkK.js";
2
+ import { r as isLikelyInstructionModelId } from "./model-ranking-Bo8CpGH1.js";
3
3
 
4
4
  //#region src/components/common/shadow-claw-provider-model-picker/shadow-claw-provider-model-picker.css
5
5
  const sheet = new CSSStyleSheet();
@@ -361,4 +361,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
361
361
 
362
362
  //#endregion
363
363
  export { ShadowClawProviderModelPicker as t };
364
- //# sourceMappingURL=shadow-claw-provider-model-picker-CsA-507a.js.map
364
+ //# sourceMappingURL=shadow-claw-provider-model-picker-fcVQdDtQ.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-claw-provider-model-picker-CsA-507a.js","names":["shadowClawProviderModelPickerStyles","shadowClawProviderModelPickerTemplate"],"sources":["../../src/components/common/shadow-claw-provider-model-picker/shadow-claw-provider-model-picker.ts"],"sourcesContent":["import ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawProviderModelPickerStyles from \"./shadow-claw-provider-model-picker.css\" with { type: \"css\" };\nimport shadowClawProviderModelPickerTemplate from \"./shadow-claw-provider-model-picker.html\" with { type: \"html\" };\nimport { isLikelyInstructionModelId } from \"../../settings/shadow-claw-llm/model-ranking.js\";\n\nimport type { LLMProvider } from \"../../../subsystems/providers/types.js\";\n\nconst elementName = \"shadow-claw-provider-model-picker\";\n\nexport interface ProviderModelPickerLabels {\n providerLabel: string;\n defaultProviderLabel: string;\n modelLabel: string;\n defaultModelLabel: string;\n customModelPlaceholder: string;\n}\n\nexport interface ProviderModelPickerValue {\n modelId: string | null;\n providerId: string | null;\n}\n\nexport type ProviderModelItem =\n | string\n | {\n context_length?: number;\n context_window?: number;\n displayName?: string;\n id?: string;\n name?: string;\n pricing?: {\n completion?: number | string;\n input?: number | string;\n output?: number | string;\n prompt?: number | string;\n };\n providers?: Array<{\n context_length?: number;\n pricing?: {\n completion?: number | string;\n input?: number | string;\n output?: number | string;\n prompt?: number | string;\n };\n provider?: string;\n supports_tools?: boolean;\n }>;\n supported_parameters?: string[];\n supportsTools?: boolean;\n supports_tools?: boolean;\n };\n\nexport type ProviderModelLoader = (\n provider: LLMProvider,\n) => Promise<ProviderModelItem[]>;\n\nconst DEFAULT_LABELS: ProviderModelPickerLabels = {\n providerLabel: \"Pinned Provider\",\n defaultProviderLabel: \"Default\",\n modelLabel: \"Pinned Model\",\n defaultModelLabel: \"Default Model\",\n customModelPlaceholder: \"Custom model id\",\n};\n\nexport class ShadowClawProviderModelPicker extends ShadowClawElement {\n static styles = shadowClawProviderModelPickerStyles;\n static template = shadowClawProviderModelPickerTemplate;\n\n private customModelSelected = false;\n private labels: ProviderModelPickerLabels = { ...DEFAULT_LABELS };\n private loadedProviderIds = new Set<string>();\n private loadingProviderId: string | null = null;\n private modelLoadEpoch = 0;\n private modelLoader: ProviderModelLoader | null = null;\n private providerModels = new Map<string, ProviderModelItem[]>();\n private providers: LLMProvider[] = [];\n private value: ProviderModelPickerValue = {\n providerId: null,\n modelId: null,\n };\n\n async connectedCallback() {\n this.bindEvents();\n await this.render();\n }\n\n getValue(): ProviderModelPickerValue {\n return {\n providerId: this.value.providerId,\n modelId: this.value.modelId,\n };\n }\n\n invalidateProviderModels(providerId?: string | null): void {\n if (providerId) {\n this.providerModels.delete(providerId);\n this.loadedProviderIds.delete(providerId);\n if (this.loadingProviderId === providerId) {\n this.loadingProviderId = null;\n this.modelLoadEpoch += 1;\n }\n } else {\n this.providerModels.clear();\n this.loadedProviderIds.clear();\n this.loadingProviderId = null;\n this.modelLoadEpoch += 1;\n }\n\n this.render();\n }\n\n setLabels(labels: Partial<ProviderModelPickerLabels>): void {\n this.labels = {\n ...this.labels,\n ...labels,\n };\n this.render();\n }\n\n setModelLoader(loader: ProviderModelLoader | null): void {\n this.modelLoader = loader;\n this.providerModels.clear();\n this.loadedProviderIds.clear();\n this.loadingProviderId = null;\n this.modelLoadEpoch += 1;\n this.render();\n }\n\n setProviders(providers: LLMProvider[]): void {\n this.providers = Array.isArray(providers) ? [...providers] : [];\n const validIds = new Set(this.providers.map((provider) => provider.id));\n for (const providerId of this.providerModels.keys()) {\n if (!validIds.has(providerId)) {\n this.providerModels.delete(providerId);\n this.loadedProviderIds.delete(providerId);\n }\n }\n\n this.render();\n }\n\n setValue(value: ProviderModelPickerValue): void {\n this.value = {\n providerId: value.providerId || null,\n modelId: value.modelId || null,\n };\n this.customModelSelected = !!value.modelId;\n this.render();\n }\n\n async render(): Promise<void> {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const providerLabel = root.querySelector(\n '[data-role=\"provider-label\"]',\n ) as HTMLLabelElement | null;\n const providerSelect = root.querySelector(\n '[data-role=\"provider-select\"]',\n ) as HTMLSelectElement | null;\n const modelContainer = root.querySelector(\n '[data-role=\"model-container\"]',\n ) as HTMLElement | null;\n const modelLabel = root.querySelector(\n '[data-role=\"model-label\"]',\n ) as HTMLLabelElement | null;\n const modelSelect = root.querySelector(\n '[data-role=\"model-select\"]',\n ) as HTMLSelectElement | null;\n const customModelInput = root.querySelector(\n '[data-role=\"custom-model-input\"]',\n ) as HTMLInputElement | null;\n\n if (\n !providerLabel ||\n !providerSelect ||\n !modelContainer ||\n !modelLabel ||\n !modelSelect ||\n !customModelInput\n ) {\n return;\n }\n\n providerLabel.textContent = this.labels.providerLabel;\n modelLabel.textContent = this.labels.modelLabel;\n customModelInput.placeholder = this.labels.customModelPlaceholder;\n\n providerSelect.replaceChildren();\n const defaultProviderOption = document.createElement(\"option\");\n defaultProviderOption.value = \"\";\n defaultProviderOption.textContent = this.labels.defaultProviderLabel;\n providerSelect.appendChild(defaultProviderOption);\n\n for (const provider of this.providers) {\n const option = document.createElement(\"option\");\n option.value = provider.id;\n option.textContent = provider.name;\n providerSelect.appendChild(option);\n }\n\n providerSelect.value = this.value.providerId || \"\";\n\n modelSelect.replaceChildren();\n const defaultModelOption = document.createElement(\"option\");\n defaultModelOption.value = \"\";\n defaultModelOption.textContent = this.labels.defaultModelLabel;\n modelSelect.appendChild(defaultModelOption);\n\n const selectedProvider = this.value.providerId\n ? this.providers.find((p) => p.id === this.value.providerId)\n : undefined;\n\n const providerModels = this.getProviderModels(selectedProvider);\n const providerModelIds = providerModels\n .map((model) => this.getModelId(model))\n .filter((modelId): modelId is string => !!modelId);\n\n if (selectedProvider?.modelsUrl) {\n void this.ensureProviderModelsLoaded(selectedProvider);\n }\n\n if (\n selectedProvider?.modelsUrl &&\n this.loadingProviderId === selectedProvider.id &&\n providerModels.length === 0\n ) {\n const loadingOption = document.createElement(\"option\");\n loadingOption.value = \"\";\n loadingOption.textContent = \"Loading models...\";\n modelSelect.appendChild(loadingOption);\n }\n\n for (const modelId of providerModels) {\n const option = document.createElement(\"option\");\n const normalizedModelId = this.getModelId(modelId);\n if (!normalizedModelId) {\n continue;\n }\n\n option.value = normalizedModelId;\n option.textContent = this.getModelLabel(\n modelId,\n selectedProvider?.id || \"\",\n );\n modelSelect.appendChild(option);\n }\n\n const customOption = document.createElement(\"option\");\n customOption.value = \"__custom__\";\n customOption.textContent = \"Custom Model...\";\n modelSelect.appendChild(customOption);\n\n if (!this.value.providerId) {\n modelContainer.style.display = \"none\";\n customModelInput.style.display = \"none\";\n customModelInput.value = \"\";\n modelSelect.value = \"\";\n\n return;\n }\n\n modelContainer.style.display = \"flex\";\n\n if (!this.value.modelId && !this.customModelSelected) {\n modelSelect.value = \"\";\n customModelInput.style.display = \"none\";\n customModelInput.value = \"\";\n\n return;\n }\n\n if (\n this.value.modelId &&\n providerModelIds.includes(this.value.modelId) &&\n !this.customModelSelected\n ) {\n modelSelect.value = this.value.modelId;\n customModelInput.style.display = \"none\";\n customModelInput.value = \"\";\n\n return;\n }\n\n modelSelect.value = \"__custom__\";\n customModelInput.style.display = \"block\";\n customModelInput.value = this.value.modelId || \"\";\n }\n\n private bindEvents(): void {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const providerSelect = root.querySelector(\n '[data-role=\"provider-select\"]',\n ) as HTMLSelectElement | null;\n const modelSelect = root.querySelector(\n '[data-role=\"model-select\"]',\n ) as HTMLSelectElement | null;\n const customModelInput = root.querySelector(\n '[data-role=\"custom-model-input\"]',\n ) as HTMLInputElement | null;\n\n providerSelect?.addEventListener(\"change\", () => {\n this.value = {\n providerId: providerSelect.value || null,\n modelId: null,\n };\n this.customModelSelected = false;\n this.render();\n this.emitChange();\n });\n\n modelSelect?.addEventListener(\"change\", () => {\n if (modelSelect.value === \"__custom__\") {\n this.customModelSelected = true;\n this.value.modelId =\n customModelInput?.value.trim() || this.value.modelId || null;\n } else {\n this.customModelSelected = false;\n this.value.modelId = modelSelect.value || null;\n }\n\n this.render();\n this.emitChange();\n });\n\n customModelInput?.addEventListener(\"input\", () => {\n if (modelSelect?.value === \"__custom__\") {\n this.value.modelId = customModelInput.value.trim() || null;\n this.customModelSelected = true;\n this.emitChange();\n }\n });\n }\n\n private emitChange(): void {\n this.dispatchEvent(\n new CustomEvent(\"provider-model-change\", {\n detail: {\n providerId: this.value.providerId,\n modelId: this.value.modelId,\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private getContextLength(model: ProviderModelItem): number {\n if (typeof model === \"string\") {\n return 0;\n }\n\n if (typeof model.context_length === \"number\") {\n return model.context_length;\n }\n\n if (typeof model.context_window === \"number\") {\n return model.context_window;\n }\n\n if (Array.isArray(model.providers)) {\n return Math.max(\n ...model.providers.map((provider) => provider.context_length || 0),\n 0,\n );\n }\n\n return 0;\n }\n\n private getModelId(model: ProviderModelItem): string | null {\n if (typeof model === \"string\") {\n return model;\n }\n\n if (typeof model.id === \"string\" && model.id.trim()) {\n return model.id.trim();\n }\n\n if (typeof model.name === \"string\" && model.name.trim()) {\n return model.name.trim();\n }\n\n return null;\n }\n\n private getModelLabel(model: ProviderModelItem, providerId: string): string {\n const modelId = this.getModelId(model) || \"\";\n const displayName =\n typeof model === \"string\"\n ? modelId\n : typeof model.displayName === \"string\" && model.displayName.trim()\n ? model.displayName.trim()\n : typeof model.name === \"string\" && model.name.trim()\n ? model.name.trim()\n : modelId;\n const label =\n displayName === modelId ? modelId : `${displayName} - ${modelId}`;\n const contextLength = this.getContextLength(model);\n const contextSuffix =\n contextLength >= 1000000\n ? ` (${(contextLength / 1000000).toFixed(1)}M)`\n : contextLength >= 1000\n ? ` (${Math.round(contextLength / 1024)}k)`\n : contextLength > 0\n ? ` (${contextLength})`\n : \"\";\n\n return `${label}${contextSuffix}${this.getToolsBadge(model, providerId)}`;\n }\n\n private getProviderModels(provider?: LLMProvider): ProviderModelItem[] {\n if (!provider) {\n return [];\n }\n\n if (Array.isArray(provider.models) && provider.models.length > 0) {\n return provider.models as ProviderModelItem[];\n }\n\n return this.providerModels.get(provider.id) || [];\n }\n\n private getToolsBadge(model: ProviderModelItem, providerId: string): string {\n const localOnlyProviderIds = new Set([\n \"transformers_js_local\",\n \"transformers_js_browser\",\n \"ollama\",\n \"llamafile\",\n \"prompt_api\",\n \"litert_lm\",\n ]);\n\n const modelId = this.getModelId(model) || \"\";\n if (localOnlyProviderIds.has(providerId)) {\n return isLikelyInstructionModelId(modelId) ? \" 🛠️\" : \" ❔🛠️\";\n }\n\n if (typeof model === \"string\") {\n return \" ❔🛠️\";\n }\n\n if (model.supports_tools === true || model.supportsTools === true) {\n return \" 🛠️\";\n }\n\n if (model.supports_tools === false || model.supportsTools === false) {\n return \" 🚫🛠️\";\n }\n\n if (Array.isArray(model.providers)) {\n if (\n model.providers.some((provider) => provider.supports_tools === true)\n ) {\n return \" 🛠️\";\n }\n\n if (\n model.providers.some((provider) => provider.supports_tools === false)\n ) {\n return \" 🚫🛠️\";\n }\n }\n\n if (Array.isArray(model.supported_parameters)) {\n return model.supported_parameters.includes(\"tools\") ? \" 🛠️\" : \" 🚫🛠️\";\n }\n\n return \" ❔🛠️\";\n }\n\n private async ensureProviderModelsLoaded(\n provider: LLMProvider,\n ): Promise<void> {\n if (\n !provider.modelsUrl ||\n !this.modelLoader ||\n this.loadedProviderIds.has(provider.id) ||\n this.loadingProviderId === provider.id\n ) {\n return;\n }\n\n const loadEpoch = ++this.modelLoadEpoch;\n this.loadingProviderId = provider.id;\n\n try {\n const models = await this.modelLoader(provider);\n if (loadEpoch !== this.modelLoadEpoch) {\n return;\n }\n\n this.providerModels.set(provider.id, Array.isArray(models) ? models : []);\n this.loadedProviderIds.add(provider.id);\n } catch {\n if (loadEpoch !== this.modelLoadEpoch) {\n return;\n }\n\n this.providerModels.set(provider.id, []);\n this.loadedProviderIds.add(provider.id);\n } finally {\n if (\n loadEpoch === this.modelLoadEpoch &&\n this.loadingProviderId === provider.id\n ) {\n this.loadingProviderId = null;\n }\n\n await this.render();\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawProviderModelPicker);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shadow-claw-provider-model-picker-fcVQdDtQ.js","names":["shadowClawProviderModelPickerStyles","shadowClawProviderModelPickerTemplate"],"sources":["../../src/components/common/shadow-claw-provider-model-picker/shadow-claw-provider-model-picker.ts"],"sourcesContent":["import ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawProviderModelPickerStyles from \"./shadow-claw-provider-model-picker.css\" with { type: \"css\" };\nimport shadowClawProviderModelPickerTemplate from \"./shadow-claw-provider-model-picker.html\" with { type: \"html\" };\nimport { isLikelyInstructionModelId } from \"../../settings/shadow-claw-llm/model-ranking.js\";\n\nimport type { LLMProvider } from \"../../../subsystems/providers/types.js\";\n\nconst elementName = \"shadow-claw-provider-model-picker\";\n\nexport interface ProviderModelPickerLabels {\n providerLabel: string;\n defaultProviderLabel: string;\n modelLabel: string;\n defaultModelLabel: string;\n customModelPlaceholder: string;\n}\n\nexport interface ProviderModelPickerValue {\n modelId: string | null;\n providerId: string | null;\n}\n\nexport type ProviderModelItem =\n | string\n | {\n context_length?: number;\n context_window?: number;\n displayName?: string;\n id?: string;\n name?: string;\n pricing?: {\n completion?: number | string;\n input?: number | string;\n output?: number | string;\n prompt?: number | string;\n };\n providers?: Array<{\n context_length?: number;\n pricing?: {\n completion?: number | string;\n input?: number | string;\n output?: number | string;\n prompt?: number | string;\n };\n provider?: string;\n supports_tools?: boolean;\n }>;\n supported_parameters?: string[];\n supportsTools?: boolean;\n supports_tools?: boolean;\n };\n\nexport type ProviderModelLoader = (\n provider: LLMProvider,\n) => Promise<ProviderModelItem[]>;\n\nconst DEFAULT_LABELS: ProviderModelPickerLabels = {\n providerLabel: \"Pinned Provider\",\n defaultProviderLabel: \"Default\",\n modelLabel: \"Pinned Model\",\n defaultModelLabel: \"Default Model\",\n customModelPlaceholder: \"Custom model id\",\n};\n\nexport class ShadowClawProviderModelPicker extends ShadowClawElement {\n static styles = shadowClawProviderModelPickerStyles;\n static template = shadowClawProviderModelPickerTemplate;\n\n private customModelSelected = false;\n private labels: ProviderModelPickerLabels = { ...DEFAULT_LABELS };\n private loadedProviderIds = new Set<string>();\n private loadingProviderId: string | null = null;\n private modelLoadEpoch = 0;\n private modelLoader: ProviderModelLoader | null = null;\n private providerModels = new Map<string, ProviderModelItem[]>();\n private providers: LLMProvider[] = [];\n private value: ProviderModelPickerValue = {\n providerId: null,\n modelId: null,\n };\n\n async connectedCallback() {\n this.bindEvents();\n await this.render();\n }\n\n getValue(): ProviderModelPickerValue {\n return {\n providerId: this.value.providerId,\n modelId: this.value.modelId,\n };\n }\n\n invalidateProviderModels(providerId?: string | null): void {\n if (providerId) {\n this.providerModels.delete(providerId);\n this.loadedProviderIds.delete(providerId);\n if (this.loadingProviderId === providerId) {\n this.loadingProviderId = null;\n this.modelLoadEpoch += 1;\n }\n } else {\n this.providerModels.clear();\n this.loadedProviderIds.clear();\n this.loadingProviderId = null;\n this.modelLoadEpoch += 1;\n }\n\n this.render();\n }\n\n setLabels(labels: Partial<ProviderModelPickerLabels>): void {\n this.labels = {\n ...this.labels,\n ...labels,\n };\n this.render();\n }\n\n setModelLoader(loader: ProviderModelLoader | null): void {\n this.modelLoader = loader;\n this.providerModels.clear();\n this.loadedProviderIds.clear();\n this.loadingProviderId = null;\n this.modelLoadEpoch += 1;\n this.render();\n }\n\n setProviders(providers: LLMProvider[]): void {\n this.providers = Array.isArray(providers) ? [...providers] : [];\n const validIds = new Set(this.providers.map((provider) => provider.id));\n for (const providerId of this.providerModels.keys()) {\n if (!validIds.has(providerId)) {\n this.providerModels.delete(providerId);\n this.loadedProviderIds.delete(providerId);\n }\n }\n\n this.render();\n }\n\n setValue(value: ProviderModelPickerValue): void {\n this.value = {\n providerId: value.providerId || null,\n modelId: value.modelId || null,\n };\n this.customModelSelected = !!value.modelId;\n this.render();\n }\n\n async render(): Promise<void> {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const providerLabel = root.querySelector(\n '[data-role=\"provider-label\"]',\n ) as HTMLLabelElement | null;\n const providerSelect = root.querySelector(\n '[data-role=\"provider-select\"]',\n ) as HTMLSelectElement | null;\n const modelContainer = root.querySelector(\n '[data-role=\"model-container\"]',\n ) as HTMLElement | null;\n const modelLabel = root.querySelector(\n '[data-role=\"model-label\"]',\n ) as HTMLLabelElement | null;\n const modelSelect = root.querySelector(\n '[data-role=\"model-select\"]',\n ) as HTMLSelectElement | null;\n const customModelInput = root.querySelector(\n '[data-role=\"custom-model-input\"]',\n ) as HTMLInputElement | null;\n\n if (\n !providerLabel ||\n !providerSelect ||\n !modelContainer ||\n !modelLabel ||\n !modelSelect ||\n !customModelInput\n ) {\n return;\n }\n\n providerLabel.textContent = this.labels.providerLabel;\n modelLabel.textContent = this.labels.modelLabel;\n customModelInput.placeholder = this.labels.customModelPlaceholder;\n\n providerSelect.replaceChildren();\n const defaultProviderOption = document.createElement(\"option\");\n defaultProviderOption.value = \"\";\n defaultProviderOption.textContent = this.labels.defaultProviderLabel;\n providerSelect.appendChild(defaultProviderOption);\n\n for (const provider of this.providers) {\n const option = document.createElement(\"option\");\n option.value = provider.id;\n option.textContent = provider.name;\n providerSelect.appendChild(option);\n }\n\n providerSelect.value = this.value.providerId || \"\";\n\n modelSelect.replaceChildren();\n const defaultModelOption = document.createElement(\"option\");\n defaultModelOption.value = \"\";\n defaultModelOption.textContent = this.labels.defaultModelLabel;\n modelSelect.appendChild(defaultModelOption);\n\n const selectedProvider = this.value.providerId\n ? this.providers.find((p) => p.id === this.value.providerId)\n : undefined;\n\n const providerModels = this.getProviderModels(selectedProvider);\n const providerModelIds = providerModels\n .map((model) => this.getModelId(model))\n .filter((modelId): modelId is string => !!modelId);\n\n if (selectedProvider?.modelsUrl) {\n void this.ensureProviderModelsLoaded(selectedProvider);\n }\n\n if (\n selectedProvider?.modelsUrl &&\n this.loadingProviderId === selectedProvider.id &&\n providerModels.length === 0\n ) {\n const loadingOption = document.createElement(\"option\");\n loadingOption.value = \"\";\n loadingOption.textContent = \"Loading models...\";\n modelSelect.appendChild(loadingOption);\n }\n\n for (const modelId of providerModels) {\n const option = document.createElement(\"option\");\n const normalizedModelId = this.getModelId(modelId);\n if (!normalizedModelId) {\n continue;\n }\n\n option.value = normalizedModelId;\n option.textContent = this.getModelLabel(\n modelId,\n selectedProvider?.id || \"\",\n );\n modelSelect.appendChild(option);\n }\n\n const customOption = document.createElement(\"option\");\n customOption.value = \"__custom__\";\n customOption.textContent = \"Custom Model...\";\n modelSelect.appendChild(customOption);\n\n if (!this.value.providerId) {\n modelContainer.style.display = \"none\";\n customModelInput.style.display = \"none\";\n customModelInput.value = \"\";\n modelSelect.value = \"\";\n\n return;\n }\n\n modelContainer.style.display = \"flex\";\n\n if (!this.value.modelId && !this.customModelSelected) {\n modelSelect.value = \"\";\n customModelInput.style.display = \"none\";\n customModelInput.value = \"\";\n\n return;\n }\n\n if (\n this.value.modelId &&\n providerModelIds.includes(this.value.modelId) &&\n !this.customModelSelected\n ) {\n modelSelect.value = this.value.modelId;\n customModelInput.style.display = \"none\";\n customModelInput.value = \"\";\n\n return;\n }\n\n modelSelect.value = \"__custom__\";\n customModelInput.style.display = \"block\";\n customModelInput.value = this.value.modelId || \"\";\n }\n\n private bindEvents(): void {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const providerSelect = root.querySelector(\n '[data-role=\"provider-select\"]',\n ) as HTMLSelectElement | null;\n const modelSelect = root.querySelector(\n '[data-role=\"model-select\"]',\n ) as HTMLSelectElement | null;\n const customModelInput = root.querySelector(\n '[data-role=\"custom-model-input\"]',\n ) as HTMLInputElement | null;\n\n providerSelect?.addEventListener(\"change\", () => {\n this.value = {\n providerId: providerSelect.value || null,\n modelId: null,\n };\n this.customModelSelected = false;\n this.render();\n this.emitChange();\n });\n\n modelSelect?.addEventListener(\"change\", () => {\n if (modelSelect.value === \"__custom__\") {\n this.customModelSelected = true;\n this.value.modelId =\n customModelInput?.value.trim() || this.value.modelId || null;\n } else {\n this.customModelSelected = false;\n this.value.modelId = modelSelect.value || null;\n }\n\n this.render();\n this.emitChange();\n });\n\n customModelInput?.addEventListener(\"input\", () => {\n if (modelSelect?.value === \"__custom__\") {\n this.value.modelId = customModelInput.value.trim() || null;\n this.customModelSelected = true;\n this.emitChange();\n }\n });\n }\n\n private emitChange(): void {\n this.dispatchEvent(\n new CustomEvent(\"provider-model-change\", {\n detail: {\n providerId: this.value.providerId,\n modelId: this.value.modelId,\n },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n private getContextLength(model: ProviderModelItem): number {\n if (typeof model === \"string\") {\n return 0;\n }\n\n if (typeof model.context_length === \"number\") {\n return model.context_length;\n }\n\n if (typeof model.context_window === \"number\") {\n return model.context_window;\n }\n\n if (Array.isArray(model.providers)) {\n return Math.max(\n ...model.providers.map((provider) => provider.context_length || 0),\n 0,\n );\n }\n\n return 0;\n }\n\n private getModelId(model: ProviderModelItem): string | null {\n if (typeof model === \"string\") {\n return model;\n }\n\n if (typeof model.id === \"string\" && model.id.trim()) {\n return model.id.trim();\n }\n\n if (typeof model.name === \"string\" && model.name.trim()) {\n return model.name.trim();\n }\n\n return null;\n }\n\n private getModelLabel(model: ProviderModelItem, providerId: string): string {\n const modelId = this.getModelId(model) || \"\";\n const displayName =\n typeof model === \"string\"\n ? modelId\n : typeof model.displayName === \"string\" && model.displayName.trim()\n ? model.displayName.trim()\n : typeof model.name === \"string\" && model.name.trim()\n ? model.name.trim()\n : modelId;\n const label =\n displayName === modelId ? modelId : `${displayName} - ${modelId}`;\n const contextLength = this.getContextLength(model);\n const contextSuffix =\n contextLength >= 1000000\n ? ` (${(contextLength / 1000000).toFixed(1)}M)`\n : contextLength >= 1000\n ? ` (${Math.round(contextLength / 1024)}k)`\n : contextLength > 0\n ? ` (${contextLength})`\n : \"\";\n\n return `${label}${contextSuffix}${this.getToolsBadge(model, providerId)}`;\n }\n\n private getProviderModels(provider?: LLMProvider): ProviderModelItem[] {\n if (!provider) {\n return [];\n }\n\n if (Array.isArray(provider.models) && provider.models.length > 0) {\n return provider.models as ProviderModelItem[];\n }\n\n return this.providerModels.get(provider.id) || [];\n }\n\n private getToolsBadge(model: ProviderModelItem, providerId: string): string {\n const localOnlyProviderIds = new Set([\n \"transformers_js_local\",\n \"transformers_js_browser\",\n \"ollama\",\n \"llamafile\",\n \"prompt_api\",\n \"litert_lm\",\n ]);\n\n const modelId = this.getModelId(model) || \"\";\n if (localOnlyProviderIds.has(providerId)) {\n return isLikelyInstructionModelId(modelId) ? \" 🛠️\" : \" ❔🛠️\";\n }\n\n if (typeof model === \"string\") {\n return \" ❔🛠️\";\n }\n\n if (model.supports_tools === true || model.supportsTools === true) {\n return \" 🛠️\";\n }\n\n if (model.supports_tools === false || model.supportsTools === false) {\n return \" 🚫🛠️\";\n }\n\n if (Array.isArray(model.providers)) {\n if (\n model.providers.some((provider) => provider.supports_tools === true)\n ) {\n return \" 🛠️\";\n }\n\n if (\n model.providers.some((provider) => provider.supports_tools === false)\n ) {\n return \" 🚫🛠️\";\n }\n }\n\n if (Array.isArray(model.supported_parameters)) {\n return model.supported_parameters.includes(\"tools\") ? \" 🛠️\" : \" 🚫🛠️\";\n }\n\n return \" ❔🛠️\";\n }\n\n private async ensureProviderModelsLoaded(\n provider: LLMProvider,\n ): Promise<void> {\n if (\n !provider.modelsUrl ||\n !this.modelLoader ||\n this.loadedProviderIds.has(provider.id) ||\n this.loadingProviderId === provider.id\n ) {\n return;\n }\n\n const loadEpoch = ++this.modelLoadEpoch;\n this.loadingProviderId = provider.id;\n\n try {\n const models = await this.modelLoader(provider);\n if (loadEpoch !== this.modelLoadEpoch) {\n return;\n }\n\n this.providerModels.set(provider.id, Array.isArray(models) ? models : []);\n this.loadedProviderIds.add(provider.id);\n } catch {\n if (loadEpoch !== this.modelLoadEpoch) {\n return;\n }\n\n this.providerModels.set(provider.id, []);\n this.loadedProviderIds.add(provider.id);\n } finally {\n if (\n loadEpoch === this.modelLoadEpoch &&\n this.loadingProviderId === provider.id\n ) {\n this.loadingProviderId = null;\n }\n\n await this.render();\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawProviderModelPicker);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAOA,MAAM,cAAc;AAiDpB,MAAM,iBAA4C;CAChD,eAAe;CACf,sBAAsB;CACtB,YAAY;CACZ,mBAAmB;CACnB,wBAAwB;AAC1B;AAEA,IAAa,gCAAb,cAAmD,kBAAkB;CACnE,OAAO,SAASA;CAChB,OAAO,WAAWC;CAElB,AAAQ,sBAAsB;CAC9B,AAAQ,SAAoC,EAAE,GAAG,eAAe;CAChE,AAAQ,oCAAoB,IAAI,IAAY;CAC5C,AAAQ,oBAAmC;CAC3C,AAAQ,iBAAiB;CACzB,AAAQ,cAA0C;CAClD,AAAQ,iCAAiB,IAAI,IAAiC;CAC9D,AAAQ,YAA2B,CAAC;CACpC,AAAQ,QAAkC;EACxC,YAAY;EACZ,SAAS;CACX;CAEA,MAAM,oBAAoB;EACxB,KAAK,WAAW;EAChB,MAAM,KAAK,OAAO;CACpB;CAEA,WAAqC;EACnC,OAAO;GACL,YAAY,KAAK,MAAM;GACvB,SAAS,KAAK,MAAM;EACtB;CACF;CAEA,yBAAyB,YAAkC;EACzD,IAAI,YAAY;GACd,KAAK,eAAe,OAAO,UAAU;GACrC,KAAK,kBAAkB,OAAO,UAAU;GACxC,IAAI,KAAK,sBAAsB,YAAY;IACzC,KAAK,oBAAoB;IACzB,KAAK,kBAAkB;GACzB;EACF,OAAO;GACL,KAAK,eAAe,MAAM;GAC1B,KAAK,kBAAkB,MAAM;GAC7B,KAAK,oBAAoB;GACzB,KAAK,kBAAkB;EACzB;EAEA,KAAK,OAAO;CACd;CAEA,UAAU,QAAkD;EAC1D,KAAK,SAAS;GACZ,GAAG,KAAK;GACR,GAAG;EACL;EACA,KAAK,OAAO;CACd;CAEA,eAAe,QAA0C;EACvD,KAAK,cAAc;EACnB,KAAK,eAAe,MAAM;EAC1B,KAAK,kBAAkB,MAAM;EAC7B,KAAK,oBAAoB;EACzB,KAAK,kBAAkB;EACvB,KAAK,OAAO;CACd;CAEA,aAAa,WAAgC;EAC3C,KAAK,YAAY,MAAM,QAAQ,SAAS,IAAI,CAAC,GAAG,SAAS,IAAI,CAAC;EAC9D,MAAM,WAAW,IAAI,IAAI,KAAK,UAAU,KAAK,aAAa,SAAS,EAAE,CAAC;EACtE,KAAK,MAAM,cAAc,KAAK,eAAe,KAAK,GAChD,IAAI,CAAC,SAAS,IAAI,UAAU,GAAG;GAC7B,KAAK,eAAe,OAAO,UAAU;GACrC,KAAK,kBAAkB,OAAO,UAAU;EAC1C;EAGF,KAAK,OAAO;CACd;CAEA,SAAS,OAAuC;EAC9C,KAAK,QAAQ;GACX,YAAY,MAAM,cAAc;GAChC,SAAS,MAAM,WAAW;EAC5B;EACA,KAAK,sBAAsB,CAAC,CAAC,MAAM;EACnC,KAAK,OAAO;CACd;CAEA,MAAM,SAAwB;EAC5B,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,gBAAgB,KAAK,cACzB,gCACF;EACA,MAAM,iBAAiB,KAAK,cAC1B,iCACF;EACA,MAAM,iBAAiB,KAAK,cAC1B,iCACF;EACA,MAAM,aAAa,KAAK,cACtB,6BACF;EACA,MAAM,cAAc,KAAK,cACvB,8BACF;EACA,MAAM,mBAAmB,KAAK,cAC5B,oCACF;EAEA,IACE,CAAC,iBACD,CAAC,kBACD,CAAC,kBACD,CAAC,cACD,CAAC,eACD,CAAC,kBAED;EAGF,cAAc,cAAc,KAAK,OAAO;EACxC,WAAW,cAAc,KAAK,OAAO;EACrC,iBAAiB,cAAc,KAAK,OAAO;EAE3C,eAAe,gBAAgB;EAC/B,MAAM,wBAAwB,SAAS,cAAc,QAAQ;EAC7D,sBAAsB,QAAQ;EAC9B,sBAAsB,cAAc,KAAK,OAAO;EAChD,eAAe,YAAY,qBAAqB;EAEhD,KAAK,MAAM,YAAY,KAAK,WAAW;GACrC,MAAM,SAAS,SAAS,cAAc,QAAQ;GAC9C,OAAO,QAAQ,SAAS;GACxB,OAAO,cAAc,SAAS;GAC9B,eAAe,YAAY,MAAM;EACnC;EAEA,eAAe,QAAQ,KAAK,MAAM,cAAc;EAEhD,YAAY,gBAAgB;EAC5B,MAAM,qBAAqB,SAAS,cAAc,QAAQ;EAC1D,mBAAmB,QAAQ;EAC3B,mBAAmB,cAAc,KAAK,OAAO;EAC7C,YAAY,YAAY,kBAAkB;EAE1C,MAAM,mBAAmB,KAAK,MAAM,aAChC,KAAK,UAAU,MAAM,MAAM,EAAE,OAAO,KAAK,MAAM,UAAU,IACzD;EAEJ,MAAM,iBAAiB,KAAK,kBAAkB,gBAAgB;EAC9D,MAAM,mBAAmB,eACtB,KAAK,UAAU,KAAK,WAAW,KAAK,CAAC,CAAC,CACtC,QAAQ,YAA+B,CAAC,CAAC,OAAO;EAEnD,IAAI,kBAAkB,WACpB,AAAK,KAAK,2BAA2B,gBAAgB;EAGvD,IACE,kBAAkB,aAClB,KAAK,sBAAsB,iBAAiB,MAC5C,eAAe,WAAW,GAC1B;GACA,MAAM,gBAAgB,SAAS,cAAc,QAAQ;GACrD,cAAc,QAAQ;GACtB,cAAc,cAAc;GAC5B,YAAY,YAAY,aAAa;EACvC;EAEA,KAAK,MAAM,WAAW,gBAAgB;GACpC,MAAM,SAAS,SAAS,cAAc,QAAQ;GAC9C,MAAM,oBAAoB,KAAK,WAAW,OAAO;GACjD,IAAI,CAAC,mBACH;GAGF,OAAO,QAAQ;GACf,OAAO,cAAc,KAAK,cACxB,SACA,kBAAkB,MAAM,EAC1B;GACA,YAAY,YAAY,MAAM;EAChC;EAEA,MAAM,eAAe,SAAS,cAAc,QAAQ;EACpD,aAAa,QAAQ;EACrB,aAAa,cAAc;EAC3B,YAAY,YAAY,YAAY;EAEpC,IAAI,CAAC,KAAK,MAAM,YAAY;GAC1B,eAAe,MAAM,UAAU;GAC/B,iBAAiB,MAAM,UAAU;GACjC,iBAAiB,QAAQ;GACzB,YAAY,QAAQ;GAEpB;EACF;EAEA,eAAe,MAAM,UAAU;EAE/B,IAAI,CAAC,KAAK,MAAM,WAAW,CAAC,KAAK,qBAAqB;GACpD,YAAY,QAAQ;GACpB,iBAAiB,MAAM,UAAU;GACjC,iBAAiB,QAAQ;GAEzB;EACF;EAEA,IACE,KAAK,MAAM,WACX,iBAAiB,SAAS,KAAK,MAAM,OAAO,KAC5C,CAAC,KAAK,qBACN;GACA,YAAY,QAAQ,KAAK,MAAM;GAC/B,iBAAiB,MAAM,UAAU;GACjC,iBAAiB,QAAQ;GAEzB;EACF;EAEA,YAAY,QAAQ;EACpB,iBAAiB,MAAM,UAAU;EACjC,iBAAiB,QAAQ,KAAK,MAAM,WAAW;CACjD;CAEA,AAAQ,aAAmB;EACzB,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,iBAAiB,KAAK,cAC1B,iCACF;EACA,MAAM,cAAc,KAAK,cACvB,8BACF;EACA,MAAM,mBAAmB,KAAK,cAC5B,oCACF;EAEA,gBAAgB,iBAAiB,gBAAgB;GAC/C,KAAK,QAAQ;IACX,YAAY,eAAe,SAAS;IACpC,SAAS;GACX;GACA,KAAK,sBAAsB;GAC3B,KAAK,OAAO;GACZ,KAAK,WAAW;EAClB,CAAC;EAED,aAAa,iBAAiB,gBAAgB;GAC5C,IAAI,YAAY,UAAU,cAAc;IACtC,KAAK,sBAAsB;IAC3B,KAAK,MAAM,UACT,kBAAkB,MAAM,KAAK,KAAK,KAAK,MAAM,WAAW;GAC5D,OAAO;IACL,KAAK,sBAAsB;IAC3B,KAAK,MAAM,UAAU,YAAY,SAAS;GAC5C;GAEA,KAAK,OAAO;GACZ,KAAK,WAAW;EAClB,CAAC;EAED,kBAAkB,iBAAiB,eAAe;GAChD,IAAI,aAAa,UAAU,cAAc;IACvC,KAAK,MAAM,UAAU,iBAAiB,MAAM,KAAK,KAAK;IACtD,KAAK,sBAAsB;IAC3B,KAAK,WAAW;GAClB;EACF,CAAC;CACH;CAEA,AAAQ,aAAmB;EACzB,KAAK,cACH,IAAI,YAAY,yBAAyB;GACvC,QAAQ;IACN,YAAY,KAAK,MAAM;IACvB,SAAS,KAAK,MAAM;GACtB;GACA,SAAS;GACT,UAAU;EACZ,CAAC,CACH;CACF;CAEA,AAAQ,iBAAiB,OAAkC;EACzD,IAAI,OAAO,UAAU,UACnB,OAAO;EAGT,IAAI,OAAO,MAAM,mBAAmB,UAClC,OAAO,MAAM;EAGf,IAAI,OAAO,MAAM,mBAAmB,UAClC,OAAO,MAAM;EAGf,IAAI,MAAM,QAAQ,MAAM,SAAS,GAC/B,OAAO,KAAK,IACV,GAAG,MAAM,UAAU,KAAK,aAAa,SAAS,kBAAkB,CAAC,GACjE,CACF;EAGF,OAAO;CACT;CAEA,AAAQ,WAAW,OAAyC;EAC1D,IAAI,OAAO,UAAU,UACnB,OAAO;EAGT,IAAI,OAAO,MAAM,OAAO,YAAY,MAAM,GAAG,KAAK,GAChD,OAAO,MAAM,GAAG,KAAK;EAGvB,IAAI,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,KAAK,GACpD,OAAO,MAAM,KAAK,KAAK;EAGzB,OAAO;CACT;CAEA,AAAQ,cAAc,OAA0B,YAA4B;EAC1E,MAAM,UAAU,KAAK,WAAW,KAAK,KAAK;EAC1C,MAAM,cACJ,OAAO,UAAU,WACb,UACA,OAAO,MAAM,gBAAgB,YAAY,MAAM,YAAY,KAAK,IAC9D,MAAM,YAAY,KAAK,IACvB,OAAO,MAAM,SAAS,YAAY,MAAM,KAAK,KAAK,IAChD,MAAM,KAAK,KAAK,IAChB;EACV,MAAM,QACJ,gBAAgB,UAAU,UAAU,GAAG,YAAY,KAAK;EAC1D,MAAM,gBAAgB,KAAK,iBAAiB,KAAK;EAUjD,OAAO,GAAG,QARR,iBAAiB,MACb,MAAM,gBAAgB,IAAO,CAAE,QAAQ,CAAC,EAAE,MAC1C,iBAAiB,MACf,KAAK,KAAK,MAAM,gBAAgB,IAAI,EAAE,MACtC,gBAAgB,IACd,KAAK,cAAc,KACnB,KAEwB,KAAK,cAAc,OAAO,UAAU;CACxE;CAEA,AAAQ,kBAAkB,UAA6C;EACrE,IAAI,CAAC,UACH,OAAO,CAAC;EAGV,IAAI,MAAM,QAAQ,SAAS,MAAM,KAAK,SAAS,OAAO,SAAS,GAC7D,OAAO,SAAS;EAGlB,OAAO,KAAK,eAAe,IAAI,SAAS,EAAE,KAAK,CAAC;CAClD;CAEA,AAAQ,cAAc,OAA0B,YAA4B;EAC1E,MAAM,uCAAuB,IAAI,IAAI;GACnC;GACA;GACA;GACA;GACA;GACA;EACF,CAAC;EAED,MAAM,UAAU,KAAK,WAAW,KAAK,KAAK;EAC1C,IAAI,qBAAqB,IAAI,UAAU,GACrC,OAAO,2BAA2B,OAAO,IAAI,SAAS;EAGxD,IAAI,OAAO,UAAU,UACnB,OAAO;EAGT,IAAI,MAAM,mBAAmB,QAAQ,MAAM,kBAAkB,MAC3D,OAAO;EAGT,IAAI,MAAM,mBAAmB,SAAS,MAAM,kBAAkB,OAC5D,OAAO;EAGT,IAAI,MAAM,QAAQ,MAAM,SAAS,GAAG;GAClC,IACE,MAAM,UAAU,MAAM,aAAa,SAAS,mBAAmB,IAAI,GAEnE,OAAO;GAGT,IACE,MAAM,UAAU,MAAM,aAAa,SAAS,mBAAmB,KAAK,GAEpE,OAAO;EAEX;EAEA,IAAI,MAAM,QAAQ,MAAM,oBAAoB,GAC1C,OAAO,MAAM,qBAAqB,SAAS,OAAO,IAAI,SAAS;EAGjE,OAAO;CACT;CAEA,MAAc,2BACZ,UACe;EACf,IACE,CAAC,SAAS,aACV,CAAC,KAAK,eACN,KAAK,kBAAkB,IAAI,SAAS,EAAE,KACtC,KAAK,sBAAsB,SAAS,IAEpC;EAGF,MAAM,YAAY,EAAE,KAAK;EACzB,KAAK,oBAAoB,SAAS;EAElC,IAAI;GACF,MAAM,SAAS,MAAM,KAAK,YAAY,QAAQ;GAC9C,IAAI,cAAc,KAAK,gBACrB;GAGF,KAAK,eAAe,IAAI,SAAS,IAAI,MAAM,QAAQ,MAAM,IAAI,SAAS,CAAC,CAAC;GACxE,KAAK,kBAAkB,IAAI,SAAS,EAAE;EACxC,QAAQ;GACN,IAAI,cAAc,KAAK,gBACrB;GAGF,KAAK,eAAe,IAAI,SAAS,IAAI,CAAC,CAAC;GACvC,KAAK,kBAAkB,IAAI,SAAS,EAAE;EACxC,UAAU;GACR,IACE,cAAc,KAAK,kBACnB,KAAK,sBAAsB,SAAS,IAEpC,KAAK,oBAAoB;GAG3B,MAAM,KAAK,OAAO;EACpB;CACF;AACF;AAEA,IAAI,CAAC,eAAe,IAAI,WAAW,GACjC,eAAe,OAAO,aAAa,6BAA6B"}
@@ -1,17 +1,17 @@
1
1
  import ShadowClawElement from "./components/shadow-claw-element.js";
2
2
  import { n as isSqliteDatabase, r as getDb } from "./txPromise-DdeRXi7G.js";
3
- import { r as CONFIG_KEYS, t as ASSISTANT_NAME } from "./config-DxDaVDTn.js";
3
+ import { r as CONFIG_KEYS, t as ASSISTANT_NAME } from "./config-DFLs7eoC.js";
4
4
  import { t as getConfig } from "./getConfig-SElp6VJW.js";
5
- import { s as writeFileHandle } from "./tools-B7gC1eb_.js";
6
- import { J as setAssistantName, t as orchestratorStore } from "./orchestrator-Crw4btGn.js";
5
+ import { s as writeFileHandle } from "./tools-BEuBatUs.js";
6
+ import { J as setAssistantName, t as orchestratorStore } from "./orchestrator-BK138MkV.js";
7
7
  import { t as setConfig } from "./setConfig-8FMUTIJ1.js";
8
- import { E as DEFAULT_ALLOWED_IFRAME_HOST_PATTERNS, i as formatDateForFilename, k as setAllowedIframeHostPatterns } from "./utils-D_ylqOY-.js";
8
+ import { E as DEFAULT_ALLOWED_IFRAME_HOST_PATTERNS, i as formatDateForFilename, k as setAllowedIframeHostPatterns } from "./utils-D8AxCH6m.js";
9
9
  import { n as decryptValue, r as encryptValue } from "./crypto-Bikgpqfe.js";
10
10
  import { isTruthyConfigValue } from "./utils/parseBooleanConfig.js";
11
11
  import { a as showSuccess, i as showInfo, r as showError, s as showWarning } from "./toast-Ck7OIKDf.js";
12
12
  import { getNamespacedItem, setNamespacedItem } from "./utils/namespacedStorage.js";
13
13
  import "./components/shadow-claw-dialog.js";
14
- import "./shadow-claw-page-header-BBqSWlhP.js";
14
+ import "./shadow-claw-page-header-bigC_h6U.js";
15
15
  import { getPrerenderSkeletonDefault } from "./utils/prerenderSkeletonDefault.js";
16
16
 
17
17
  //#region src/config/settings-backup.ts
@@ -1721,4 +1721,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
1721
1721
 
1722
1722
  //#endregion
1723
1723
  export { ShadowClawSettings as t };
1724
- //# sourceMappingURL=shadow-claw-settings-CZgGMz0a.js.map
1724
+ //# sourceMappingURL=shadow-claw-settings-CkO6JjA4.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-claw-settings-CZgGMz0a.js","names":["shadowClawSettingsStyles","shadowClawSettingsTemplate"],"sources":["../../src/config/settings-backup.ts","../../src/components/shadow-claw-settings/shadow-claw-settings.ts"],"sourcesContent":["import { CONFIG_KEYS } from \"./config.js\";\nimport { decryptValue, encryptValue } from \"../security/crypto.js\";\nimport { writeFileHandle } from \"../storage/writeFileHandle.js\";\n\nexport type ConfigEntryRecord = { key: string; value: unknown };\nexport type PasswordPathSegment = string | number;\n\nexport interface PlaintextPasswordEntry {\n key: string;\n path: PasswordPathSegment[];\n value: string;\n}\n\nexport interface SettingsBackupPayload {\n kind: \"shadowclaw-settings-backup\";\n version: 1;\n exportedAt: number;\n includePlaintextPasswords: boolean;\n configEntries: ConfigEntryRecord[];\n plaintextPasswords?: PlaintextPasswordEntry[];\n}\n\nfunction cloneConfigValue(value: unknown): unknown {\n try {\n return JSON.parse(JSON.stringify(value));\n } catch {\n return null;\n }\n}\n\nasync function collectAndStripPasswordData(\n entries: ConfigEntryRecord[],\n includePlaintextPasswords: boolean,\n): Promise<{\n configEntries: ConfigEntryRecord[];\n plaintextPasswords: PlaintextPasswordEntry[];\n}> {\n const nextEntries: ConfigEntryRecord[] = [];\n const plaintextPasswords: PlaintextPasswordEntry[] = [];\n\n for (const entry of entries) {\n const key = entry.key;\n\n if (key === CONFIG_KEYS.STORAGE_HANDLE) {\n continue;\n }\n\n if (\n key === CONFIG_KEYS.GIT_PASSWORD ||\n key === CONFIG_KEYS.API_KEY ||\n key.startsWith(\"api_key:\") ||\n key === CONFIG_KEYS.IMESSAGE_API_KEY ||\n key === CONFIG_KEYS.TELEGRAM_BOT_TOKEN\n ) {\n if (includePlaintextPasswords && typeof entry.value === \"string\") {\n const decrypted = await decryptValue(entry.value);\n if (decrypted) {\n plaintextPasswords.push({ key, path: [], value: decrypted });\n }\n }\n\n continue;\n }\n\n const value = cloneConfigValue(entry.value);\n\n if (key === CONFIG_KEYS.GIT_ACCOUNTS && Array.isArray(value)) {\n for (let i = 0; i < value.length; i += 1) {\n const account = value[i] as Record<string, unknown>;\n if (!account || typeof account !== \"object\") {\n continue;\n }\n\n const encryptedPassword = account.password;\n if (typeof encryptedPassword === \"string\" && encryptedPassword) {\n if (includePlaintextPasswords) {\n const decrypted = await decryptValue(encryptedPassword);\n if (decrypted) {\n plaintextPasswords.push({\n key,\n path: [i, \"password\"],\n value: decrypted,\n });\n }\n }\n\n delete account.password;\n }\n }\n }\n\n if (key === CONFIG_KEYS.INTEGRATION_CONNECTIONS && Array.isArray(value)) {\n for (let i = 0; i < value.length; i += 1) {\n const record = value[i] as Record<string, unknown>;\n const credentialRef = record?.credentialRef as\n Record<string, unknown> | undefined;\n\n const encryptedSecret = credentialRef?.encryptedSecret;\n if (typeof encryptedSecret === \"string\" && encryptedSecret) {\n if (includePlaintextPasswords) {\n const decrypted = await decryptValue(encryptedSecret);\n if (decrypted) {\n plaintextPasswords.push({\n key,\n path: [i, \"credentialRef\", \"encryptedSecret\"],\n value: decrypted,\n });\n }\n }\n\n delete credentialRef.encryptedSecret;\n }\n }\n }\n\n if (key === CONFIG_KEYS.REMOTE_MCP_CONNECTIONS && Array.isArray(value)) {\n for (let i = 0; i < value.length; i += 1) {\n const record = value[i] as Record<string, unknown>;\n const credentialRef = record?.credentialRef as\n Record<string, unknown> | undefined;\n\n const encryptedValue = credentialRef?.encryptedValue;\n if (typeof encryptedValue === \"string\" && encryptedValue) {\n if (includePlaintextPasswords) {\n const decrypted = await decryptValue(encryptedValue);\n if (decrypted) {\n plaintextPasswords.push({\n key,\n path: [i, \"credentialRef\", \"encryptedValue\"],\n value: decrypted,\n });\n }\n }\n\n delete credentialRef.encryptedValue;\n }\n }\n }\n\n nextEntries.push({ key, value });\n }\n\n return { configEntries: nextEntries, plaintextPasswords };\n}\n\nfunction applyPathValue(\n rootValue: unknown,\n path: PasswordPathSegment[],\n nextValue: string,\n): unknown {\n if (path.length === 0) {\n return nextValue;\n }\n\n let current = rootValue as Record<string, unknown> | unknown[] | null;\n\n for (let i = 0; i < path.length - 1; i += 1) {\n const segment = path[i];\n if (typeof segment === \"number\") {\n if (!Array.isArray(current) || !current[segment]) {\n return rootValue;\n }\n\n current = current[segment] as Record<string, unknown>;\n } else {\n if (!current || typeof current !== \"object\") {\n return rootValue;\n }\n\n const next = (current as Record<string, unknown>)[segment];\n if (!next || typeof next !== \"object\") {\n return rootValue;\n }\n\n current = next as Record<string, unknown>;\n }\n }\n\n const leaf = path[path.length - 1];\n if (typeof leaf === \"number\") {\n if (!Array.isArray(current)) {\n return rootValue;\n }\n\n current[leaf] = nextValue;\n } else {\n if (!current || typeof current !== \"object\") {\n return rootValue;\n }\n\n (current as Record<string, unknown>)[leaf] = nextValue;\n }\n\n return rootValue;\n}\n\nasync function buildSettingsBackupPayload(\n entries: ConfigEntryRecord[],\n includePlaintextPasswords: boolean,\n): Promise<SettingsBackupPayload> {\n const transformed = await collectAndStripPasswordData(\n entries,\n includePlaintextPasswords,\n );\n\n return {\n kind: \"shadowclaw-settings-backup\",\n version: 1,\n exportedAt: Date.now(),\n includePlaintextPasswords,\n configEntries: transformed.configEntries,\n plaintextPasswords: includePlaintextPasswords\n ? transformed.plaintextPasswords\n : undefined,\n };\n}\n\nexport async function createSettingsBackupBlob(\n entries: ConfigEntryRecord[],\n includePlaintextPasswords: boolean,\n): Promise<Blob> {\n const payload = await buildSettingsBackupPayload(\n entries,\n includePlaintextPasswords,\n );\n\n return new Blob([JSON.stringify(payload, null, 2)], {\n type: \"application/json\",\n });\n}\n\nexport async function writeSettingsBackupToFileHandle(\n fileHandle: FileSystemFileHandle,\n entries: ConfigEntryRecord[],\n includePlaintextPasswords: boolean,\n): Promise<void> {\n const payload = await buildSettingsBackupPayload(\n entries,\n includePlaintextPasswords,\n );\n\n await writeFileHandle(fileHandle, JSON.stringify(payload, null, 2));\n}\n\nexport async function reapplyPlaintextPasswords(\n configEntries: ConfigEntryRecord[],\n plaintextPasswords: PlaintextPasswordEntry[],\n): Promise<ConfigEntryRecord[]> {\n if (!plaintextPasswords.length) {\n return configEntries;\n }\n\n const nextEntries = configEntries.map((entry) => ({\n key: entry.key,\n value: cloneConfigValue(entry.value),\n }));\n\n for (const secret of plaintextPasswords) {\n const encrypted = await encryptValue(secret.value);\n if (!encrypted) {\n continue;\n }\n\n const existingEntry = nextEntries.find((entry) => entry.key === secret.key);\n if (existingEntry) {\n existingEntry.value = applyPathValue(\n existingEntry.value,\n secret.path,\n encrypted,\n );\n } else if (secret.path.length === 0) {\n nextEntries.push({ key: secret.key, value: encrypted });\n }\n }\n\n return nextEntries;\n}\n\nexport function parseSettingsBackupPayload(raw: string): SettingsBackupPayload {\n const parsed = JSON.parse(raw) as Partial<SettingsBackupPayload>;\n\n if (\n parsed?.kind !== \"shadowclaw-settings-backup\" ||\n parsed.version !== 1 ||\n !Array.isArray(parsed.configEntries)\n ) {\n throw new Error(\"Invalid settings backup file\");\n }\n\n const plaintextPasswords = Array.isArray(parsed.plaintextPasswords)\n ? parsed.plaintextPasswords.filter((entry) => {\n return (\n entry &&\n typeof entry.key === \"string\" &&\n Array.isArray(entry.path) &&\n typeof entry.value === \"string\"\n );\n })\n : [];\n\n return {\n kind: \"shadowclaw-settings-backup\",\n version: 1,\n exportedAt:\n typeof parsed.exportedAt === \"number\" ? parsed.exportedAt : Date.now(),\n includePlaintextPasswords: !!parsed.includePlaintextPasswords,\n configEntries: parsed.configEntries\n .filter((entry) => entry && typeof entry.key === \"string\")\n .map((entry) => ({ key: entry.key, value: entry.value })),\n plaintextPasswords,\n };\n}\n","import { ASSISTANT_NAME, CONFIG_KEYS } from \"../../config/config.js\";\nimport {\n getNamespacedItem,\n setNamespacedItem,\n} from \"../../utils/namespacedStorage.js\";\n\nimport {\n createSettingsBackupBlob,\n parseSettingsBackupPayload,\n reapplyPlaintextPasswords,\n writeSettingsBackupToFileHandle,\n} from \"../../config/settings-backup.js\";\n\nimport { setAssistantName } from \"../../core/orchestrator/utils/operations/provider.js\";\nimport { getDb } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/getConfig.js\";\nimport { setConfig } from \"../../db/setConfig.js\";\nimport {\n DEFAULT_ALLOWED_IFRAME_HOST_PATTERNS,\n setAllowedIframeHostPatterns,\n} from \"../../security/iframe-sanitizer.js\";\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport {\n showError,\n showInfo,\n showSuccess,\n showWarning,\n} from \"../../ui/toast.js\";\nimport { formatDateForFilename } from \"../../utils/utils.js\";\nimport { isTruthyConfigValue } from \"../../utils/parseBooleanConfig.js\";\nimport { getPrerenderSkeletonDefault } from \"../../utils/prerenderSkeletonDefault.js\";\n\nimport type { ConfigEntryRecord } from \"../../config/settings-backup.js\";\nimport type { Orchestrator } from \"../../core/orchestrator/orchestrator.js\";\nimport { isSqliteDatabase } from \"../../db/sqlite/types.js\";\nimport type { ShadowClawDatabase } from \"../../db/types.js\";\n\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\nimport \"../shadow-claw-page-header/shadow-claw-page-header.js\";\n\nconst settingsTabLoaders: Record<string, (() => Promise<unknown>)[]> = {\n ai: [() => import(\"../settings/shadow-claw-llm/shadow-claw-llm.js\")],\n environment: [\n () =>\n import(\"../settings/shadow-claw-networking/shadow-claw-networking.js\"),\n () => import(\"../settings/shadow-claw-webvm/shadow-claw-webvm.js\"),\n () => import(\"../settings/shadow-claw-storage/shadow-claw-storage.js\"),\n ],\n integrations: [\n () => import(\"../settings/shadow-claw-git/shadow-claw-git.js\"),\n () => import(\"../settings/shadow-claw-accounts/shadow-claw-accounts.js\"),\n () =>\n import(\"../settings/shadow-claw-mcp-remote/shadow-claw-mcp-remote.js\"),\n () =>\n import(\"../settings/shadow-claw-control-plane/shadow-claw-control-plane.js\"),\n () =>\n import(\"../settings/shadow-claw-integrations/shadow-claw-integrations.js\"),\n () =>\n import(\"../settings/shadow-claw-task-server/shadow-claw-task-server.js\"),\n () =>\n import(\"../settings/shadow-claw-notifications/shadow-claw-notifications.js\"),\n ],\n};\n\nconst loadedSettingsTabs = new Set<string>();\n\nasync function ensureSettingsTabLoaded(tabId: string): Promise<void> {\n if (loadedSettingsTabs.has(tabId)) {\n return;\n }\n const loaders = settingsTabLoaders[tabId];\n if (loaders) {\n loadedSettingsTabs.add(tabId);\n await Promise.all(loaders.map((loader) => loader()));\n }\n}\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawSettingsStyles from \"./shadow-claw-settings.css\" with { type: \"css\" };\nimport shadowClawSettingsTemplate from \"./shadow-claw-settings.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-settings\";\n\n/**\n * Parent settings component that composes the dedicated sub-components:\n *\n * - <shadow-claw-llm> — Provider, model, API key, and runtime controls\n * - <shadow-claw-networking> — CORS proxy toggle and proxy URL\n * - <shadow-claw-webvm> — VM boot mode, timeout, host, relay\n * - <shadow-claw-git> — PAT, author config\n * - <shadow-claw-storage>— OPFS, persistent, directory\n *\n * - Channels button — navigates to the channels config page\n * - Tools button — navigates to the tools config page\n * - Deployed revision footer\n */\nexport class ShadowClawSettings extends ShadowClawElement {\n static styles = shadowClawSettingsStyles;\n static template = shadowClawSettingsTemplate;\n\n activeTab = \"ai\";\n db: ShadowClawDatabase | null = null;\n orchestrator: Orchestrator | null = null;\n pendingRestoreFile: File | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n\n await this.render();\n }\n\n activateTab(tabId: string | undefined) {\n if (!tabId || this.activeTab === tabId) {\n return;\n }\n\n this.activeTab = tabId;\n this.applyTabState();\n }\n\n applyTabState() {\n ensureSettingsTabLoaded(this.activeTab).catch(console.error);\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const tabButtons =\n root.querySelectorAll<HTMLButtonElement>(\"[data-tab-target]\");\n tabButtons.forEach((tabButton) => {\n const isActive = tabButton.dataset.tabTarget === this.activeTab;\n tabButton.classList.toggle(\"active\", isActive);\n tabButton.setAttribute(\"aria-selected\", String(isActive));\n tabButton.tabIndex = isActive ? 0 : -1;\n });\n\n const tabPanels = root.querySelectorAll<HTMLElement>(\"[data-tab-panel]\");\n tabPanels.forEach((tabPanel) => {\n const isActive = tabPanel.dataset.tabPanel === this.activeTab;\n tabPanel.hidden = !isActive;\n });\n }\n\n bindSettingsActions() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"backup-settings\"]')\n ?.addEventListener(\"click\", () => this.openBackupDialog());\n\n const restoreInput = root.querySelector(\n \".settings__restore-input\",\n ) as HTMLInputElement | null;\n\n root\n .querySelector('[data-action=\"restore-settings\"]')\n ?.addEventListener(\"click\", () => {\n if (restoreInput instanceof HTMLInputElement) {\n restoreInput.value = \"\";\n restoreInput.click();\n }\n });\n\n restoreInput?.addEventListener(\"change\", (event) => {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) {\n return;\n }\n\n const file = target.files?.[0] || null;\n if (!file) {\n return;\n }\n\n this.pendingRestoreFile = file;\n this.openRestoreDialog(file.name);\n });\n\n root\n .querySelector('[data-action=\"clear-settings\"]')\n ?.addEventListener(\"click\", () => this.openClearDialog());\n\n root\n .querySelector('[data-action=\"cancel-backup-settings\"]')\n ?.addEventListener(\"click\", () =>\n this.closeDialog(\".settings__backup-dialog\"),\n );\n\n root\n .querySelector('[data-action=\"confirm-backup-settings\"]')\n ?.addEventListener(\"click\", () => {\n void this.confirmBackup();\n });\n\n root\n .querySelector('[data-action=\"cancel-restore-settings\"]')\n ?.addEventListener(\"click\", () => {\n this.pendingRestoreFile = null;\n this.closeDialog(\".settings__restore-dialog\");\n });\n\n root\n .querySelector('[data-action=\"confirm-restore-settings\"]')\n ?.addEventListener(\"click\", () => {\n void this.confirmRestore();\n });\n\n root\n .querySelector('[data-action=\"cancel-clear-settings\"]')\n ?.addEventListener(\"click\", () =>\n this.closeDialog(\".settings__clear-dialog\"),\n );\n\n root\n .querySelector('[data-action=\"confirm-clear-settings\"]')\n ?.addEventListener(\"click\", () => {\n void this.confirmClear();\n });\n\n root\n .querySelector('[data-action=\"save-assistant-name\"]')\n ?.addEventListener(\"click\", () => this.saveAssistantName());\n\n root\n .querySelector('[data-setting=\"activity-log-disk-logging-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onActivityLogDiskLoggingToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-setting=\"sidebar-hide-pages-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onSidebarHidePagesToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-setting=\"sidebar-hide-chat-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onSidebarHideChatToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-setting=\"sidebar-hide-tasks-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onSidebarHideTasksToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-setting=\"sidebar-hide-files-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onSidebarHideFilesToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-setting=\"chat-split-view-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onChatSplitViewToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-setting=\"pages-auto-refresh-input\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n const val = parseInt(target.value, 10);\n void this.onPagesAutoRefreshInputChange(isNaN(val) ? 0 : val);\n }\n });\n\n root\n .querySelector('[data-setting=\"override-prerender-skeleton-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onOverridePrerenderSkeletonToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-action=\"save-dom-allowed-iframe-hosts\"]')\n ?.addEventListener(\"click\", () => {\n void this.saveDomAllowedIframeHosts();\n });\n }\n\n closeDialog(selector: string) {\n this.getDialog(selector)?.close();\n }\n\n getDialog(selector: string): HTMLDialogElement | null {\n const root = this.shadowRoot;\n if (!root) {\n return null;\n }\n\n const dialog = root.querySelector(selector);\n if (!(dialog instanceof HTMLDialogElement)) {\n return null;\n }\n\n return dialog;\n }\n\n handleTabKeydown(event: KeyboardEvent, currentButton: HTMLButtonElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const tabButtons = Array.from(\n root.querySelectorAll<HTMLButtonElement>(\"[data-tab-target]\"),\n );\n\n const currentIndex = tabButtons.indexOf(currentButton);\n if (currentIndex < 0) {\n return;\n }\n\n let nextIndex = -1;\n\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowDown\":\n nextIndex = (currentIndex + 1) % tabButtons.length;\n\n break;\n case \"ArrowLeft\":\n case \"ArrowUp\":\n nextIndex = (currentIndex - 1 + tabButtons.length) % tabButtons.length;\n\n break;\n case \"Home\":\n nextIndex = 0;\n\n break;\n case \"End\":\n nextIndex = tabButtons.length - 1;\n\n break;\n default:\n return;\n }\n\n event.preventDefault();\n const nextButton = tabButtons[nextIndex];\n nextButton.focus();\n this.activateTab(nextButton.dataset.tabTarget);\n }\n\n openBackupDialog() {\n const root = this.shadowRoot;\n const includePlaintextToggle = root?.querySelector(\n '[data-setting=\"include-plaintext-passwords\"]',\n );\n\n if (includePlaintextToggle instanceof HTMLInputElement) {\n includePlaintextToggle.checked = false;\n }\n\n this.showDialog(\".settings__backup-dialog\");\n }\n\n openClearDialog() {\n this.showDialog(\".settings__clear-dialog\");\n }\n\n openRestoreDialog(fileName: string) {\n const root = this.shadowRoot;\n const info = root?.querySelector('[data-info=\"restore-filename\"]');\n if (info instanceof HTMLElement) {\n info.textContent = `Selected file: ${fileName}`;\n }\n\n this.showDialog(\".settings__restore-dialog\");\n }\n\n showDialog(selector: string) {\n const dialog = this.getDialog(selector);\n if (!dialog) {\n return;\n }\n\n if (typeof dialog.showModal === \"function\") {\n dialog.showModal();\n\n return;\n }\n\n dialog.setAttribute(\"open\", \"\");\n }\n\n async confirmBackup() {\n if (!this.db) {\n showError(\"Settings database is unavailable\", 5000);\n\n return;\n }\n\n const root = this.shadowRoot;\n const includePlaintextToggle = root?.querySelector(\n '[data-setting=\"include-plaintext-passwords\"]',\n );\n\n const includePlaintextPasswords =\n includePlaintextToggle instanceof HTMLInputElement\n ? includePlaintextToggle.checked\n : false;\n\n try {\n if (includePlaintextPasswords) {\n const fileHandle = await this.promptForPlaintextBackupHandle();\n if (!fileHandle) {\n return;\n }\n\n const entries = await this.getAllConfigEntries();\n\n await writeSettingsBackupToFileHandle(\n fileHandle,\n entries,\n includePlaintextPasswords,\n );\n\n this.closeDialog(\".settings__backup-dialog\");\n showSuccess(\"Settings backup saved\", 3000);\n\n return;\n }\n\n const entries = await this.getAllConfigEntries();\n const blob = await createSettingsBackupBlob(\n entries,\n includePlaintextPasswords,\n );\n\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = `shadowclaw-settings-backup-${Date.now()}.json`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n\n this.closeDialog(\".settings__backup-dialog\");\n showSuccess(\"Settings backup downloaded\", 3000);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n showError(`Failed to backup settings: ${message}`, 6000);\n }\n }\n\n async confirmClear() {\n if (!this.db) {\n showError(\"Settings database is unavailable\", 5000);\n\n return;\n }\n\n try {\n await this.replaceConfigEntries([]);\n this.closeDialog(\".settings__clear-dialog\");\n showInfo(\"Settings cleared. Reloading app...\", 3200);\n\n setTimeout(() => {\n window.location.reload();\n }, 250);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n showError(`Failed to clear settings: ${message}`, 6000);\n }\n }\n\n async confirmRestore() {\n if (!this.db) {\n showError(\"Settings database is unavailable\", 5000);\n\n return;\n }\n\n const file = this.pendingRestoreFile;\n if (!file) {\n showError(\"No backup file selected\", 4000);\n\n return;\n }\n\n try {\n const text = await file.text();\n const backup = parseSettingsBackupPayload(text);\n const mergedEntries = await reapplyPlaintextPasswords(\n backup.configEntries,\n backup.plaintextPasswords || [],\n );\n\n await this.replaceConfigEntries(mergedEntries);\n this.pendingRestoreFile = null;\n this.closeDialog(\".settings__restore-dialog\");\n\n showSuccess(\"Settings restored. Reloading app...\", 3200);\n setTimeout(() => {\n window.location.reload();\n }, 250);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n showError(`Failed to restore settings: ${message}`, 6000);\n }\n }\n\n async getAllConfigEntries(): Promise<ConfigEntryRecord[]> {\n if (!this.db) {\n throw new Error(\"Database is unavailable\");\n }\n\n if (isSqliteDatabase(this.db)) {\n const raw = this.db.db;\n const rows = (raw\n .prepare(\"SELECT key, value FROM config ORDER BY key\")\n .all() ?? []) as any[];\n return rows\n .filter((row) => row && typeof row.key === \"string\")\n .map((row) => ({ key: row.key, value: row.value }));\n }\n\n const idb = this.db as IDBDatabase;\n return await new Promise((resolve, reject) => {\n try {\n const tx = idb.transaction(\"config\", \"readonly\");\n if (!tx) {\n reject(new Error(\"Failed to open read transaction\"));\n\n return;\n }\n\n const store = tx.objectStore(\"config\");\n const request = store.getAll();\n\n request.onsuccess = () => {\n const rows = Array.isArray(request.result) ? request.result : [];\n resolve(\n rows\n .filter((row) => row && typeof row.key === \"string\")\n .map((row) => ({ key: row.key, value: row.value })),\n );\n };\n\n request.onerror = () => {\n reject(request.error || new Error(\"Failed to read settings config\"));\n };\n } catch (error) {\n reject(error);\n }\n });\n }\n\n async onActivityLogDiskLoggingToggle(enabled: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.ACTIVITY_LOG_DISK_LOGGING_ENABLED,\n enabled ? \"true\" : \"false\",\n );\n\n showSuccess(\n enabled\n ? \"Activity log disk logging enabled\"\n : \"Activity log disk logging disabled\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\n \"Error saving activity log disk logging setting: \" + errorMsg,\n 6000,\n );\n }\n }\n\n async onChatSplitViewToggle(enabled: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.CHAT_SPLIT_VIEW_ENABLED,\n enabled ? \"true\" : \"false\",\n );\n\n this.dispatchEvent(\n new CustomEvent(\"chat-split-view-change\", {\n detail: { enabled },\n bubbles: true,\n composed: true,\n }),\n );\n\n showSuccess(\n enabled\n ? \"Horizontal Chat split view enabled\"\n : \"Horizontal Chat split view disabled\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Chat split view setting: \" + errorMsg, 6000);\n }\n }\n\n async onOverridePrerenderSkeletonToggle(enabled: boolean) {\n try {\n setNamespacedItem(\n \"shadow-claw-override-prerender-skeleton\",\n enabled ? \"true\" : \"false\",\n );\n } catch (e) {\n console.warn(\"Unable to save setting to localStorage:\", e);\n }\n\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.OVERRIDE_PRERENDER_SKELETON,\n enabled ? \"true\" : \"false\",\n );\n\n showSuccess(\n enabled\n ? \"Pre-rendered content override enabled\"\n : \"Pre-rendered content override disabled\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\n \"Error saving pre-rendered content override setting: \" + errorMsg,\n 6000,\n );\n }\n }\n\n async onPagesAutoRefreshInputChange(valSec: number) {\n if (!this.db) {\n return;\n }\n\n const sec = Math.max(0, Math.min(valSec, 86400));\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.PAGES_AUTO_REFRESH_INTERVAL,\n String(sec),\n );\n\n window.dispatchEvent(\n new CustomEvent(\"shadow-claw-pages-auto-refresh-change\", {\n detail: { interval: sec },\n }),\n );\n\n showSuccess(\n sec > 0\n ? `Pages auto refresh set to ${sec}s`\n : \"Pages auto refresh disabled\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Pages auto refresh interval: \" + errorMsg, 6000);\n }\n }\n\n async onSidebarHideChatToggle(hidden: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_CHAT_HIDDEN,\n hidden ? \"true\" : \"false\",\n );\n\n this.dispatchEvent(\n new CustomEvent(\"sidebar-chat-visibility-change\", {\n detail: { hidden },\n bubbles: true,\n composed: true,\n }),\n );\n\n showSuccess(\n hidden ? \"Chat hidden in sidebar\" : \"Chat shown in sidebar\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving sidebar Chat visibility: \" + errorMsg, 6000);\n }\n }\n\n async onSidebarHideFilesToggle(hidden: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_FILES_HIDDEN,\n hidden ? \"true\" : \"false\",\n );\n\n this.dispatchEvent(\n new CustomEvent(\"sidebar-files-visibility-change\", {\n detail: { hidden },\n bubbles: true,\n composed: true,\n }),\n );\n\n showSuccess(\n hidden ? \"Files hidden in sidebar\" : \"Files shown in sidebar\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving sidebar Files visibility: \" + errorMsg, 6000);\n }\n }\n\n async onSidebarHidePagesToggle(hidden: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_PAGES_HIDDEN,\n hidden ? \"true\" : \"false\",\n );\n\n this.dispatchEvent(\n new CustomEvent(\"sidebar-pages-visibility-change\", {\n detail: { hidden },\n bubbles: true,\n composed: true,\n }),\n );\n\n showSuccess(\n hidden ? \"Pages hidden in sidebar\" : \"Pages shown in sidebar\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving sidebar Pages visibility: \" + errorMsg, 6000);\n }\n }\n\n async onSidebarHideTasksToggle(hidden: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_TASKS_HIDDEN,\n hidden ? \"true\" : \"false\",\n );\n\n this.dispatchEvent(\n new CustomEvent(\"sidebar-tasks-visibility-change\", {\n detail: { hidden },\n bubbles: true,\n composed: true,\n }),\n );\n\n showSuccess(\n hidden ? \"Tasks hidden in sidebar\" : \"Tasks shown in sidebar\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving sidebar Tasks visibility: \" + errorMsg, 6000);\n }\n }\n\n async populateAssistantSettings() {\n const root = this.shadowRoot;\n if (!root || !this.db) {\n return;\n }\n\n const nameInput = root.querySelector(\n '[data-setting=\"assistant-name-input\"]',\n ) as HTMLInputElement | null;\n if (nameInput) {\n const storedAssistantName = await getConfig(\n this.db,\n CONFIG_KEYS.ASSISTANT_NAME,\n );\n const orchestratorName =\n this.orchestrator?.assistantName ||\n orchestratorStore.orchestrator?.assistantName;\n\n nameInput.value =\n (typeof storedAssistantName === \"string\" && storedAssistantName) ||\n orchestratorName ||\n ASSISTANT_NAME;\n }\n\n const rawActivityLogDiskLoggingEnabled = (await getConfig(\n this.db,\n CONFIG_KEYS.ACTIVITY_LOG_DISK_LOGGING_ENABLED,\n )) as unknown;\n const activityLogDiskLoggingEnabled =\n rawActivityLogDiskLoggingEnabled === true ||\n rawActivityLogDiskLoggingEnabled === \"true\" ||\n rawActivityLogDiskLoggingEnabled === 1 ||\n rawActivityLogDiskLoggingEnabled === \"1\";\n\n const activityLogToggle = root.querySelector(\n '[data-setting=\"activity-log-disk-logging-toggle\"]',\n ) as HTMLInputElement | null;\n if (activityLogToggle) {\n activityLogToggle.checked = activityLogDiskLoggingEnabled;\n }\n\n const rawSidebarPagesHidden = (await getConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_PAGES_HIDDEN,\n )) as unknown;\n const sidebarPagesHidden =\n rawSidebarPagesHidden === true ||\n rawSidebarPagesHidden === \"true\" ||\n rawSidebarPagesHidden === 1 ||\n rawSidebarPagesHidden === \"1\";\n\n const sidebarHidePagesToggle = root.querySelector(\n '[data-setting=\"sidebar-hide-pages-toggle\"]',\n ) as HTMLInputElement | null;\n if (sidebarHidePagesToggle) {\n sidebarHidePagesToggle.checked = sidebarPagesHidden;\n }\n\n const rawSidebarChatHidden = (await getConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_CHAT_HIDDEN,\n )) as unknown;\n const sidebarChatHidden =\n rawSidebarChatHidden === true ||\n rawSidebarChatHidden === \"true\" ||\n rawSidebarChatHidden === 1 ||\n rawSidebarChatHidden === \"1\";\n\n const sidebarHideChatToggle = root.querySelector(\n '[data-setting=\"sidebar-hide-chat-toggle\"]',\n ) as HTMLInputElement | null;\n if (sidebarHideChatToggle) {\n sidebarHideChatToggle.checked = sidebarChatHidden;\n }\n\n const rawSidebarTasksHidden = (await getConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_TASKS_HIDDEN,\n )) as unknown;\n const sidebarTasksHidden =\n rawSidebarTasksHidden === true ||\n rawSidebarTasksHidden === \"true\" ||\n rawSidebarTasksHidden === 1 ||\n rawSidebarTasksHidden === \"1\";\n\n const sidebarHideTasksToggle = root.querySelector(\n '[data-setting=\"sidebar-hide-tasks-toggle\"]',\n ) as HTMLInputElement | null;\n if (sidebarHideTasksToggle) {\n sidebarHideTasksToggle.checked = sidebarTasksHidden;\n }\n\n const rawSidebarFilesHidden = (await getConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_FILES_HIDDEN,\n )) as unknown;\n const sidebarFilesHidden =\n rawSidebarFilesHidden === true ||\n rawSidebarFilesHidden === \"true\" ||\n rawSidebarFilesHidden === 1 ||\n rawSidebarFilesHidden === \"1\";\n\n const sidebarHideFilesToggle = root.querySelector(\n '[data-setting=\"sidebar-hide-files-toggle\"]',\n ) as HTMLInputElement | null;\n if (sidebarHideFilesToggle) {\n sidebarHideFilesToggle.checked = sidebarFilesHidden;\n }\n\n const rawChatSplitViewEnabled = (await getConfig(\n this.db,\n CONFIG_KEYS.CHAT_SPLIT_VIEW_ENABLED,\n )) as unknown;\n const chatSplitViewEnabled = isTruthyConfigValue(\n rawChatSplitViewEnabled,\n false,\n );\n\n const chatSplitViewToggle = root.querySelector(\n '[data-setting=\"chat-split-view-toggle\"]',\n ) as HTMLInputElement | null;\n if (chatSplitViewToggle) {\n chatSplitViewToggle.checked = chatSplitViewEnabled;\n }\n\n const pagesAutoRefreshInput = root.querySelector(\n '[data-setting=\"pages-auto-refresh-input\"]',\n ) as HTMLInputElement | null;\n if (pagesAutoRefreshInput) {\n const storedInterval = await getConfig(\n this.db,\n CONFIG_KEYS.PAGES_AUTO_REFRESH_INTERVAL,\n );\n if (\n typeof storedInterval === \"string\" ||\n typeof storedInterval === \"number\"\n ) {\n const parsed = parseInt(String(storedInterval), 10);\n pagesAutoRefreshInput.value =\n !isNaN(parsed) && parsed >= 0 ? String(parsed) : \"0\";\n } else {\n pagesAutoRefreshInput.value = \"0\";\n }\n }\n\n const rawOverridePrerenderSkeleton = (await getConfig(\n this.db,\n CONFIG_KEYS.OVERRIDE_PRERENDER_SKELETON,\n )) as unknown;\n let storedLocalStorage: string | null = null;\n try {\n storedLocalStorage = getNamespacedItem(\n \"shadow-claw-override-prerender-skeleton\",\n );\n } catch {\n // Ignore\n }\n\n const defaultOverride = getPrerenderSkeletonDefault();\n\n let overridePrerenderSkeleton = defaultOverride;\n if (\n rawOverridePrerenderSkeleton !== null &&\n rawOverridePrerenderSkeleton !== undefined\n ) {\n overridePrerenderSkeleton = isTruthyConfigValue(\n rawOverridePrerenderSkeleton,\n );\n\n // Keep the synchronous early-boot flag in step with the stored choice;\n // an unset value must never be persisted or it would pin the default.\n try {\n setNamespacedItem(\n \"shadow-claw-override-prerender-skeleton\",\n overridePrerenderSkeleton ? \"true\" : \"false\",\n );\n } catch {\n // Ignore localStorage quota / access errors\n }\n } else if (storedLocalStorage !== null) {\n overridePrerenderSkeleton = storedLocalStorage === \"true\";\n }\n\n const overridePrerenderSkeletonToggle = root.querySelector(\n '[data-setting=\"override-prerender-skeleton-toggle\"]',\n ) as HTMLInputElement | null;\n if (overridePrerenderSkeletonToggle) {\n overridePrerenderSkeletonToggle.checked = overridePrerenderSkeleton;\n }\n\n const domHostsTextarea = root.querySelector(\n '[data-setting=\"dom-allowed-iframe-hosts\"]',\n ) as HTMLTextAreaElement | null;\n if (domHostsTextarea) {\n const storedDomHosts = await getConfig(\n this.db,\n CONFIG_KEYS.ALLOWED_IFRAME_HOST_PATTERNS,\n );\n\n if (\n typeof storedDomHosts === \"string\" &&\n storedDomHosts.trim().length > 0\n ) {\n domHostsTextarea.value = storedDomHosts;\n setAllowedIframeHostPatterns(storedDomHosts);\n } else {\n domHostsTextarea.value =\n DEFAULT_ALLOWED_IFRAME_HOST_PATTERNS.join(\"\\n\");\n }\n }\n\n const markdownFrontmatterPagesToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-pages-toggle\"]',\n ) as HTMLInputElement | null;\n if (markdownFrontmatterPagesToggle) {\n markdownFrontmatterPagesToggle.checked = isTruthyConfigValue(\n await getConfig(this.db, CONFIG_KEYS.MARKDOWN_FRONTMATTER_PAGES),\n true,\n );\n }\n\n const markdownFrontmatterFileViewerToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-file-viewer-toggle\"]',\n ) as HTMLInputElement | null;\n if (markdownFrontmatterFileViewerToggle) {\n markdownFrontmatterFileViewerToggle.checked = isTruthyConfigValue(\n await getConfig(this.db, CONFIG_KEYS.MARKDOWN_FRONTMATTER_FILE_VIEWER),\n true,\n );\n }\n\n const markdownFrontmatterChatToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-chat-toggle\"]',\n ) as HTMLInputElement | null;\n if (markdownFrontmatterChatToggle) {\n markdownFrontmatterChatToggle.checked = isTruthyConfigValue(\n await getConfig(this.db, CONFIG_KEYS.MARKDOWN_FRONTMATTER_CHAT),\n true,\n );\n }\n\n const markdownFrontmatterTasksToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-tasks-toggle\"]',\n ) as HTMLInputElement | null;\n if (markdownFrontmatterTasksToggle) {\n markdownFrontmatterTasksToggle.checked = isTruthyConfigValue(\n await getConfig(this.db, CONFIG_KEYS.MARKDOWN_FRONTMATTER_TASKS),\n true,\n );\n }\n }\n\n async promptForPlaintextBackupHandle(): Promise<FileSystemFileHandle | null> {\n const pickerMaybe = Reflect.get(globalThis, \"showSaveFilePicker\");\n const picker =\n typeof pickerMaybe === \"function\" ? pickerMaybe.bind(globalThis) : null;\n\n if (!picker) {\n throw new Error(\n \"Plaintext settings backup requires the File System Access API.\",\n );\n }\n\n try {\n return await picker({\n id: \"shadowclaw-settings-backup\",\n suggestedName: `shadowclaw-settings-backup-${formatDateForFilename()}.json`,\n types: [\n {\n description: \"JSON Files\",\n accept: {\n \"application/json\": [\".json\"],\n },\n },\n ],\n });\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n return null;\n }\n\n throw error;\n }\n }\n\n async render() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const showChannelsConfigButton = root.querySelector(\n '[data-action=\"show-channels-config\"]',\n );\n showChannelsConfigButton?.addEventListener(\"click\", () => {\n this.dispatchEvent(\n new CustomEvent(\"navigate\", {\n detail: { page: \"channels\" },\n bubbles: true,\n composed: true,\n }),\n );\n });\n\n const showToolsConfigButton = root.querySelector(\n '[data-action=\"show-tools-config\"]',\n );\n showToolsConfigButton?.addEventListener(\"click\", () => {\n this.dispatchEvent(\n new CustomEvent(\"navigate\", {\n detail: { page: \"tools\" },\n bubbles: true,\n composed: true,\n }),\n );\n });\n\n const tabButtons =\n root.querySelectorAll<HTMLButtonElement>(\"[data-tab-target]\");\n tabButtons.forEach((tabButton) => {\n tabButton.addEventListener(\"click\", () => {\n this.activateTab(tabButton.dataset.tabTarget);\n });\n\n tabButton.addEventListener(\"keydown\", (event) => {\n this.handleTabKeydown(event, tabButton);\n });\n });\n this.applyTabState();\n\n this.bindSettingsActions();\n\n const revisionEl = root.querySelector('[data-info=\"deployed-revision\"]');\n if (revisionEl) {\n const revision =\n document\n .querySelector('meta[name=\"revision\"]')\n ?.getAttribute(\"content\")\n ?.trim() || \"\";\n revisionEl.textContent = `Deployed revision: ${revision || \"unknown\"}`;\n }\n\n await this.populateAssistantSettings();\n }\n\n async replaceConfigEntries(entries: ConfigEntryRecord[]): Promise<void> {\n if (!this.db) {\n throw new Error(\"Database is unavailable\");\n }\n\n if (isSqliteDatabase(this.db)) {\n const raw = this.db.db;\n raw.prepare(\"DELETE FROM config\").run();\n const insertStmt = raw.prepare(\n \"INSERT OR REPLACE INTO config (key, value) VALUES (?, ?)\",\n );\n for (const entry of entries) {\n insertStmt.run(\n entry.key,\n typeof entry.value === \"string\"\n ? entry.value\n : JSON.stringify(entry.value),\n );\n }\n return;\n }\n\n const idb = this.db as IDBDatabase;\n await new Promise<void>((resolve, reject) => {\n try {\n const tx = idb.transaction(\"config\", \"readwrite\");\n if (!tx) {\n reject(new Error(\"Failed to open write transaction\"));\n\n return;\n }\n\n const store = tx.objectStore(\"config\");\n store.clear();\n for (const entry of entries) {\n store.put({ key: entry.key, value: entry.value });\n }\n\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(tx.error || new Error(\"Failed to update config\"));\n tx.onabort = () =>\n reject(tx.error || new Error(\"Config update aborted\"));\n } catch (error) {\n reject(error);\n }\n });\n }\n\n async saveAssistantName() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const nameInput = root.querySelector(\n '[data-setting=\"assistant-name-input\"]',\n ) as HTMLInputElement | null;\n if (!nameInput) {\n return;\n }\n\n const name = nameInput.value.trim();\n if (!name) {\n showWarning(\"Please enter a name\", 3000);\n\n return;\n }\n\n setNamespacedItem(\"assistantName\", name);\n\n try {\n const orchestrator = this.orchestrator || orchestratorStore.orchestrator;\n if (orchestrator) {\n this.orchestrator = orchestrator;\n await setAssistantName(orchestrator, this.db, name);\n } else {\n await setConfig(this.db, CONFIG_KEYS.ASSISTANT_NAME, name);\n }\n } catch (e) {\n console.warn(\"Could not update orchestrator:\", e);\n }\n\n showSuccess(\"Assistant name saved\", 3000);\n }\n\n async saveDomAllowedIframeHosts() {\n const root = this.shadowRoot;\n if (!root || !this.db) {\n return;\n }\n\n const textarea = root.querySelector(\n '[data-setting=\"dom-allowed-iframe-hosts\"]',\n ) as HTMLTextAreaElement | null;\n if (!textarea) {\n return;\n }\n\n const rawText = textarea.value;\n const lines = rawText\n .split(\"\\n\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n const markdownFrontmatterPagesToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-pages-toggle\"]',\n ) as HTMLInputElement | null;\n const markdownFrontmatterFileViewerToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-file-viewer-toggle\"]',\n ) as HTMLInputElement | null;\n const markdownFrontmatterChatToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-chat-toggle\"]',\n ) as HTMLInputElement | null;\n const markdownFrontmatterTasksToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-tasks-toggle\"]',\n ) as HTMLInputElement | null;\n\n try {\n const valueToSave = lines.join(\"\\n\");\n await setConfig(\n this.db,\n CONFIG_KEYS.ALLOWED_IFRAME_HOST_PATTERNS,\n valueToSave,\n );\n\n await setConfig(\n this.db,\n CONFIG_KEYS.MARKDOWN_FRONTMATTER_PAGES,\n String(markdownFrontmatterPagesToggle?.checked ?? true),\n );\n\n await setConfig(\n this.db,\n CONFIG_KEYS.MARKDOWN_FRONTMATTER_FILE_VIEWER,\n String(markdownFrontmatterFileViewerToggle?.checked ?? true),\n );\n\n await setConfig(\n this.db,\n CONFIG_KEYS.MARKDOWN_FRONTMATTER_CHAT,\n String(markdownFrontmatterChatToggle?.checked ?? true),\n );\n\n await setConfig(\n this.db,\n CONFIG_KEYS.MARKDOWN_FRONTMATTER_TASKS,\n String(markdownFrontmatterTasksToggle?.checked ?? true),\n );\n\n setAllowedIframeHostPatterns(lines);\n\n showSuccess(\"DOM iframe embed settings saved\", 2500);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving DOM iframe embed settings: \" + errorMsg, 6000);\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawSettings);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shadow-claw-settings-CkO6JjA4.js","names":["shadowClawSettingsStyles","shadowClawSettingsTemplate"],"sources":["../../src/config/settings-backup.ts","../../src/components/shadow-claw-settings/shadow-claw-settings.ts"],"sourcesContent":["import { CONFIG_KEYS } from \"./config.js\";\nimport { decryptValue, encryptValue } from \"../security/crypto.js\";\nimport { writeFileHandle } from \"../storage/writeFileHandle.js\";\n\nexport type ConfigEntryRecord = { key: string; value: unknown };\nexport type PasswordPathSegment = string | number;\n\nexport interface PlaintextPasswordEntry {\n key: string;\n path: PasswordPathSegment[];\n value: string;\n}\n\nexport interface SettingsBackupPayload {\n kind: \"shadowclaw-settings-backup\";\n version: 1;\n exportedAt: number;\n includePlaintextPasswords: boolean;\n configEntries: ConfigEntryRecord[];\n plaintextPasswords?: PlaintextPasswordEntry[];\n}\n\nfunction cloneConfigValue(value: unknown): unknown {\n try {\n return JSON.parse(JSON.stringify(value));\n } catch {\n return null;\n }\n}\n\nasync function collectAndStripPasswordData(\n entries: ConfigEntryRecord[],\n includePlaintextPasswords: boolean,\n): Promise<{\n configEntries: ConfigEntryRecord[];\n plaintextPasswords: PlaintextPasswordEntry[];\n}> {\n const nextEntries: ConfigEntryRecord[] = [];\n const plaintextPasswords: PlaintextPasswordEntry[] = [];\n\n for (const entry of entries) {\n const key = entry.key;\n\n if (key === CONFIG_KEYS.STORAGE_HANDLE) {\n continue;\n }\n\n if (\n key === CONFIG_KEYS.GIT_PASSWORD ||\n key === CONFIG_KEYS.API_KEY ||\n key.startsWith(\"api_key:\") ||\n key === CONFIG_KEYS.IMESSAGE_API_KEY ||\n key === CONFIG_KEYS.TELEGRAM_BOT_TOKEN\n ) {\n if (includePlaintextPasswords && typeof entry.value === \"string\") {\n const decrypted = await decryptValue(entry.value);\n if (decrypted) {\n plaintextPasswords.push({ key, path: [], value: decrypted });\n }\n }\n\n continue;\n }\n\n const value = cloneConfigValue(entry.value);\n\n if (key === CONFIG_KEYS.GIT_ACCOUNTS && Array.isArray(value)) {\n for (let i = 0; i < value.length; i += 1) {\n const account = value[i] as Record<string, unknown>;\n if (!account || typeof account !== \"object\") {\n continue;\n }\n\n const encryptedPassword = account.password;\n if (typeof encryptedPassword === \"string\" && encryptedPassword) {\n if (includePlaintextPasswords) {\n const decrypted = await decryptValue(encryptedPassword);\n if (decrypted) {\n plaintextPasswords.push({\n key,\n path: [i, \"password\"],\n value: decrypted,\n });\n }\n }\n\n delete account.password;\n }\n }\n }\n\n if (key === CONFIG_KEYS.INTEGRATION_CONNECTIONS && Array.isArray(value)) {\n for (let i = 0; i < value.length; i += 1) {\n const record = value[i] as Record<string, unknown>;\n const credentialRef = record?.credentialRef as\n Record<string, unknown> | undefined;\n\n const encryptedSecret = credentialRef?.encryptedSecret;\n if (typeof encryptedSecret === \"string\" && encryptedSecret) {\n if (includePlaintextPasswords) {\n const decrypted = await decryptValue(encryptedSecret);\n if (decrypted) {\n plaintextPasswords.push({\n key,\n path: [i, \"credentialRef\", \"encryptedSecret\"],\n value: decrypted,\n });\n }\n }\n\n delete credentialRef.encryptedSecret;\n }\n }\n }\n\n if (key === CONFIG_KEYS.REMOTE_MCP_CONNECTIONS && Array.isArray(value)) {\n for (let i = 0; i < value.length; i += 1) {\n const record = value[i] as Record<string, unknown>;\n const credentialRef = record?.credentialRef as\n Record<string, unknown> | undefined;\n\n const encryptedValue = credentialRef?.encryptedValue;\n if (typeof encryptedValue === \"string\" && encryptedValue) {\n if (includePlaintextPasswords) {\n const decrypted = await decryptValue(encryptedValue);\n if (decrypted) {\n plaintextPasswords.push({\n key,\n path: [i, \"credentialRef\", \"encryptedValue\"],\n value: decrypted,\n });\n }\n }\n\n delete credentialRef.encryptedValue;\n }\n }\n }\n\n nextEntries.push({ key, value });\n }\n\n return { configEntries: nextEntries, plaintextPasswords };\n}\n\nfunction applyPathValue(\n rootValue: unknown,\n path: PasswordPathSegment[],\n nextValue: string,\n): unknown {\n if (path.length === 0) {\n return nextValue;\n }\n\n let current = rootValue as Record<string, unknown> | unknown[] | null;\n\n for (let i = 0; i < path.length - 1; i += 1) {\n const segment = path[i];\n if (typeof segment === \"number\") {\n if (!Array.isArray(current) || !current[segment]) {\n return rootValue;\n }\n\n current = current[segment] as Record<string, unknown>;\n } else {\n if (!current || typeof current !== \"object\") {\n return rootValue;\n }\n\n const next = (current as Record<string, unknown>)[segment];\n if (!next || typeof next !== \"object\") {\n return rootValue;\n }\n\n current = next as Record<string, unknown>;\n }\n }\n\n const leaf = path[path.length - 1];\n if (typeof leaf === \"number\") {\n if (!Array.isArray(current)) {\n return rootValue;\n }\n\n current[leaf] = nextValue;\n } else {\n if (!current || typeof current !== \"object\") {\n return rootValue;\n }\n\n (current as Record<string, unknown>)[leaf] = nextValue;\n }\n\n return rootValue;\n}\n\nasync function buildSettingsBackupPayload(\n entries: ConfigEntryRecord[],\n includePlaintextPasswords: boolean,\n): Promise<SettingsBackupPayload> {\n const transformed = await collectAndStripPasswordData(\n entries,\n includePlaintextPasswords,\n );\n\n return {\n kind: \"shadowclaw-settings-backup\",\n version: 1,\n exportedAt: Date.now(),\n includePlaintextPasswords,\n configEntries: transformed.configEntries,\n plaintextPasswords: includePlaintextPasswords\n ? transformed.plaintextPasswords\n : undefined,\n };\n}\n\nexport async function createSettingsBackupBlob(\n entries: ConfigEntryRecord[],\n includePlaintextPasswords: boolean,\n): Promise<Blob> {\n const payload = await buildSettingsBackupPayload(\n entries,\n includePlaintextPasswords,\n );\n\n return new Blob([JSON.stringify(payload, null, 2)], {\n type: \"application/json\",\n });\n}\n\nexport async function writeSettingsBackupToFileHandle(\n fileHandle: FileSystemFileHandle,\n entries: ConfigEntryRecord[],\n includePlaintextPasswords: boolean,\n): Promise<void> {\n const payload = await buildSettingsBackupPayload(\n entries,\n includePlaintextPasswords,\n );\n\n await writeFileHandle(fileHandle, JSON.stringify(payload, null, 2));\n}\n\nexport async function reapplyPlaintextPasswords(\n configEntries: ConfigEntryRecord[],\n plaintextPasswords: PlaintextPasswordEntry[],\n): Promise<ConfigEntryRecord[]> {\n if (!plaintextPasswords.length) {\n return configEntries;\n }\n\n const nextEntries = configEntries.map((entry) => ({\n key: entry.key,\n value: cloneConfigValue(entry.value),\n }));\n\n for (const secret of plaintextPasswords) {\n const encrypted = await encryptValue(secret.value);\n if (!encrypted) {\n continue;\n }\n\n const existingEntry = nextEntries.find((entry) => entry.key === secret.key);\n if (existingEntry) {\n existingEntry.value = applyPathValue(\n existingEntry.value,\n secret.path,\n encrypted,\n );\n } else if (secret.path.length === 0) {\n nextEntries.push({ key: secret.key, value: encrypted });\n }\n }\n\n return nextEntries;\n}\n\nexport function parseSettingsBackupPayload(raw: string): SettingsBackupPayload {\n const parsed = JSON.parse(raw) as Partial<SettingsBackupPayload>;\n\n if (\n parsed?.kind !== \"shadowclaw-settings-backup\" ||\n parsed.version !== 1 ||\n !Array.isArray(parsed.configEntries)\n ) {\n throw new Error(\"Invalid settings backup file\");\n }\n\n const plaintextPasswords = Array.isArray(parsed.plaintextPasswords)\n ? parsed.plaintextPasswords.filter((entry) => {\n return (\n entry &&\n typeof entry.key === \"string\" &&\n Array.isArray(entry.path) &&\n typeof entry.value === \"string\"\n );\n })\n : [];\n\n return {\n kind: \"shadowclaw-settings-backup\",\n version: 1,\n exportedAt:\n typeof parsed.exportedAt === \"number\" ? parsed.exportedAt : Date.now(),\n includePlaintextPasswords: !!parsed.includePlaintextPasswords,\n configEntries: parsed.configEntries\n .filter((entry) => entry && typeof entry.key === \"string\")\n .map((entry) => ({ key: entry.key, value: entry.value })),\n plaintextPasswords,\n };\n}\n","import { ASSISTANT_NAME, CONFIG_KEYS } from \"../../config/config.js\";\nimport {\n getNamespacedItem,\n setNamespacedItem,\n} from \"../../utils/namespacedStorage.js\";\n\nimport {\n createSettingsBackupBlob,\n parseSettingsBackupPayload,\n reapplyPlaintextPasswords,\n writeSettingsBackupToFileHandle,\n} from \"../../config/settings-backup.js\";\n\nimport { setAssistantName } from \"../../core/orchestrator/utils/operations/provider.js\";\nimport { getDb } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/getConfig.js\";\nimport { setConfig } from \"../../db/setConfig.js\";\nimport {\n DEFAULT_ALLOWED_IFRAME_HOST_PATTERNS,\n setAllowedIframeHostPatterns,\n} from \"../../security/iframe-sanitizer.js\";\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport {\n showError,\n showInfo,\n showSuccess,\n showWarning,\n} from \"../../ui/toast.js\";\nimport { formatDateForFilename } from \"../../utils/utils.js\";\nimport { isTruthyConfigValue } from \"../../utils/parseBooleanConfig.js\";\nimport { getPrerenderSkeletonDefault } from \"../../utils/prerenderSkeletonDefault.js\";\n\nimport type { ConfigEntryRecord } from \"../../config/settings-backup.js\";\nimport type { Orchestrator } from \"../../core/orchestrator/orchestrator.js\";\nimport { isSqliteDatabase } from \"../../db/sqlite/types.js\";\nimport type { ShadowClawDatabase } from \"../../db/types.js\";\n\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\nimport \"../shadow-claw-page-header/shadow-claw-page-header.js\";\n\nconst settingsTabLoaders: Record<string, (() => Promise<unknown>)[]> = {\n ai: [() => import(\"../settings/shadow-claw-llm/shadow-claw-llm.js\")],\n environment: [\n () =>\n import(\"../settings/shadow-claw-networking/shadow-claw-networking.js\"),\n () => import(\"../settings/shadow-claw-webvm/shadow-claw-webvm.js\"),\n () => import(\"../settings/shadow-claw-storage/shadow-claw-storage.js\"),\n ],\n integrations: [\n () => import(\"../settings/shadow-claw-git/shadow-claw-git.js\"),\n () => import(\"../settings/shadow-claw-accounts/shadow-claw-accounts.js\"),\n () =>\n import(\"../settings/shadow-claw-mcp-remote/shadow-claw-mcp-remote.js\"),\n () =>\n import(\"../settings/shadow-claw-control-plane/shadow-claw-control-plane.js\"),\n () =>\n import(\"../settings/shadow-claw-integrations/shadow-claw-integrations.js\"),\n () =>\n import(\"../settings/shadow-claw-task-server/shadow-claw-task-server.js\"),\n () =>\n import(\"../settings/shadow-claw-notifications/shadow-claw-notifications.js\"),\n ],\n};\n\nconst loadedSettingsTabs = new Set<string>();\n\nasync function ensureSettingsTabLoaded(tabId: string): Promise<void> {\n if (loadedSettingsTabs.has(tabId)) {\n return;\n }\n const loaders = settingsTabLoaders[tabId];\n if (loaders) {\n loadedSettingsTabs.add(tabId);\n await Promise.all(loaders.map((loader) => loader()));\n }\n}\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawSettingsStyles from \"./shadow-claw-settings.css\" with { type: \"css\" };\nimport shadowClawSettingsTemplate from \"./shadow-claw-settings.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-settings\";\n\n/**\n * Parent settings component that composes the dedicated sub-components:\n *\n * - <shadow-claw-llm> — Provider, model, API key, and runtime controls\n * - <shadow-claw-networking> — CORS proxy toggle and proxy URL\n * - <shadow-claw-webvm> — VM boot mode, timeout, host, relay\n * - <shadow-claw-git> — PAT, author config\n * - <shadow-claw-storage>— OPFS, persistent, directory\n *\n * - Channels button — navigates to the channels config page\n * - Tools button — navigates to the tools config page\n * - Deployed revision footer\n */\nexport class ShadowClawSettings extends ShadowClawElement {\n static styles = shadowClawSettingsStyles;\n static template = shadowClawSettingsTemplate;\n\n activeTab = \"ai\";\n db: ShadowClawDatabase | null = null;\n orchestrator: Orchestrator | null = null;\n pendingRestoreFile: File | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n\n await this.render();\n }\n\n activateTab(tabId: string | undefined) {\n if (!tabId || this.activeTab === tabId) {\n return;\n }\n\n this.activeTab = tabId;\n this.applyTabState();\n }\n\n applyTabState() {\n ensureSettingsTabLoaded(this.activeTab).catch(console.error);\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const tabButtons =\n root.querySelectorAll<HTMLButtonElement>(\"[data-tab-target]\");\n tabButtons.forEach((tabButton) => {\n const isActive = tabButton.dataset.tabTarget === this.activeTab;\n tabButton.classList.toggle(\"active\", isActive);\n tabButton.setAttribute(\"aria-selected\", String(isActive));\n tabButton.tabIndex = isActive ? 0 : -1;\n });\n\n const tabPanels = root.querySelectorAll<HTMLElement>(\"[data-tab-panel]\");\n tabPanels.forEach((tabPanel) => {\n const isActive = tabPanel.dataset.tabPanel === this.activeTab;\n tabPanel.hidden = !isActive;\n });\n }\n\n bindSettingsActions() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"backup-settings\"]')\n ?.addEventListener(\"click\", () => this.openBackupDialog());\n\n const restoreInput = root.querySelector(\n \".settings__restore-input\",\n ) as HTMLInputElement | null;\n\n root\n .querySelector('[data-action=\"restore-settings\"]')\n ?.addEventListener(\"click\", () => {\n if (restoreInput instanceof HTMLInputElement) {\n restoreInput.value = \"\";\n restoreInput.click();\n }\n });\n\n restoreInput?.addEventListener(\"change\", (event) => {\n const target = event.target;\n if (!(target instanceof HTMLInputElement)) {\n return;\n }\n\n const file = target.files?.[0] || null;\n if (!file) {\n return;\n }\n\n this.pendingRestoreFile = file;\n this.openRestoreDialog(file.name);\n });\n\n root\n .querySelector('[data-action=\"clear-settings\"]')\n ?.addEventListener(\"click\", () => this.openClearDialog());\n\n root\n .querySelector('[data-action=\"cancel-backup-settings\"]')\n ?.addEventListener(\"click\", () =>\n this.closeDialog(\".settings__backup-dialog\"),\n );\n\n root\n .querySelector('[data-action=\"confirm-backup-settings\"]')\n ?.addEventListener(\"click\", () => {\n void this.confirmBackup();\n });\n\n root\n .querySelector('[data-action=\"cancel-restore-settings\"]')\n ?.addEventListener(\"click\", () => {\n this.pendingRestoreFile = null;\n this.closeDialog(\".settings__restore-dialog\");\n });\n\n root\n .querySelector('[data-action=\"confirm-restore-settings\"]')\n ?.addEventListener(\"click\", () => {\n void this.confirmRestore();\n });\n\n root\n .querySelector('[data-action=\"cancel-clear-settings\"]')\n ?.addEventListener(\"click\", () =>\n this.closeDialog(\".settings__clear-dialog\"),\n );\n\n root\n .querySelector('[data-action=\"confirm-clear-settings\"]')\n ?.addEventListener(\"click\", () => {\n void this.confirmClear();\n });\n\n root\n .querySelector('[data-action=\"save-assistant-name\"]')\n ?.addEventListener(\"click\", () => this.saveAssistantName());\n\n root\n .querySelector('[data-setting=\"activity-log-disk-logging-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onActivityLogDiskLoggingToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-setting=\"sidebar-hide-pages-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onSidebarHidePagesToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-setting=\"sidebar-hide-chat-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onSidebarHideChatToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-setting=\"sidebar-hide-tasks-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onSidebarHideTasksToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-setting=\"sidebar-hide-files-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onSidebarHideFilesToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-setting=\"chat-split-view-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onChatSplitViewToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-setting=\"pages-auto-refresh-input\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n const val = parseInt(target.value, 10);\n void this.onPagesAutoRefreshInputChange(isNaN(val) ? 0 : val);\n }\n });\n\n root\n .querySelector('[data-setting=\"override-prerender-skeleton-toggle\"]')\n ?.addEventListener(\"change\", (e: Event) => {\n const target = e.target as HTMLInputElement;\n if (target) {\n void this.onOverridePrerenderSkeletonToggle(target.checked);\n }\n });\n\n root\n .querySelector('[data-action=\"save-dom-allowed-iframe-hosts\"]')\n ?.addEventListener(\"click\", () => {\n void this.saveDomAllowedIframeHosts();\n });\n }\n\n closeDialog(selector: string) {\n this.getDialog(selector)?.close();\n }\n\n getDialog(selector: string): HTMLDialogElement | null {\n const root = this.shadowRoot;\n if (!root) {\n return null;\n }\n\n const dialog = root.querySelector(selector);\n if (!(dialog instanceof HTMLDialogElement)) {\n return null;\n }\n\n return dialog;\n }\n\n handleTabKeydown(event: KeyboardEvent, currentButton: HTMLButtonElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const tabButtons = Array.from(\n root.querySelectorAll<HTMLButtonElement>(\"[data-tab-target]\"),\n );\n\n const currentIndex = tabButtons.indexOf(currentButton);\n if (currentIndex < 0) {\n return;\n }\n\n let nextIndex = -1;\n\n switch (event.key) {\n case \"ArrowRight\":\n case \"ArrowDown\":\n nextIndex = (currentIndex + 1) % tabButtons.length;\n\n break;\n case \"ArrowLeft\":\n case \"ArrowUp\":\n nextIndex = (currentIndex - 1 + tabButtons.length) % tabButtons.length;\n\n break;\n case \"Home\":\n nextIndex = 0;\n\n break;\n case \"End\":\n nextIndex = tabButtons.length - 1;\n\n break;\n default:\n return;\n }\n\n event.preventDefault();\n const nextButton = tabButtons[nextIndex];\n nextButton.focus();\n this.activateTab(nextButton.dataset.tabTarget);\n }\n\n openBackupDialog() {\n const root = this.shadowRoot;\n const includePlaintextToggle = root?.querySelector(\n '[data-setting=\"include-plaintext-passwords\"]',\n );\n\n if (includePlaintextToggle instanceof HTMLInputElement) {\n includePlaintextToggle.checked = false;\n }\n\n this.showDialog(\".settings__backup-dialog\");\n }\n\n openClearDialog() {\n this.showDialog(\".settings__clear-dialog\");\n }\n\n openRestoreDialog(fileName: string) {\n const root = this.shadowRoot;\n const info = root?.querySelector('[data-info=\"restore-filename\"]');\n if (info instanceof HTMLElement) {\n info.textContent = `Selected file: ${fileName}`;\n }\n\n this.showDialog(\".settings__restore-dialog\");\n }\n\n showDialog(selector: string) {\n const dialog = this.getDialog(selector);\n if (!dialog) {\n return;\n }\n\n if (typeof dialog.showModal === \"function\") {\n dialog.showModal();\n\n return;\n }\n\n dialog.setAttribute(\"open\", \"\");\n }\n\n async confirmBackup() {\n if (!this.db) {\n showError(\"Settings database is unavailable\", 5000);\n\n return;\n }\n\n const root = this.shadowRoot;\n const includePlaintextToggle = root?.querySelector(\n '[data-setting=\"include-plaintext-passwords\"]',\n );\n\n const includePlaintextPasswords =\n includePlaintextToggle instanceof HTMLInputElement\n ? includePlaintextToggle.checked\n : false;\n\n try {\n if (includePlaintextPasswords) {\n const fileHandle = await this.promptForPlaintextBackupHandle();\n if (!fileHandle) {\n return;\n }\n\n const entries = await this.getAllConfigEntries();\n\n await writeSettingsBackupToFileHandle(\n fileHandle,\n entries,\n includePlaintextPasswords,\n );\n\n this.closeDialog(\".settings__backup-dialog\");\n showSuccess(\"Settings backup saved\", 3000);\n\n return;\n }\n\n const entries = await this.getAllConfigEntries();\n const blob = await createSettingsBackupBlob(\n entries,\n includePlaintextPasswords,\n );\n\n const url = URL.createObjectURL(blob);\n const link = document.createElement(\"a\");\n link.href = url;\n link.download = `shadowclaw-settings-backup-${Date.now()}.json`;\n document.body.appendChild(link);\n link.click();\n document.body.removeChild(link);\n URL.revokeObjectURL(url);\n\n this.closeDialog(\".settings__backup-dialog\");\n showSuccess(\"Settings backup downloaded\", 3000);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n showError(`Failed to backup settings: ${message}`, 6000);\n }\n }\n\n async confirmClear() {\n if (!this.db) {\n showError(\"Settings database is unavailable\", 5000);\n\n return;\n }\n\n try {\n await this.replaceConfigEntries([]);\n this.closeDialog(\".settings__clear-dialog\");\n showInfo(\"Settings cleared. Reloading app...\", 3200);\n\n setTimeout(() => {\n window.location.reload();\n }, 250);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n showError(`Failed to clear settings: ${message}`, 6000);\n }\n }\n\n async confirmRestore() {\n if (!this.db) {\n showError(\"Settings database is unavailable\", 5000);\n\n return;\n }\n\n const file = this.pendingRestoreFile;\n if (!file) {\n showError(\"No backup file selected\", 4000);\n\n return;\n }\n\n try {\n const text = await file.text();\n const backup = parseSettingsBackupPayload(text);\n const mergedEntries = await reapplyPlaintextPasswords(\n backup.configEntries,\n backup.plaintextPasswords || [],\n );\n\n await this.replaceConfigEntries(mergedEntries);\n this.pendingRestoreFile = null;\n this.closeDialog(\".settings__restore-dialog\");\n\n showSuccess(\"Settings restored. Reloading app...\", 3200);\n setTimeout(() => {\n window.location.reload();\n }, 250);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n showError(`Failed to restore settings: ${message}`, 6000);\n }\n }\n\n async getAllConfigEntries(): Promise<ConfigEntryRecord[]> {\n if (!this.db) {\n throw new Error(\"Database is unavailable\");\n }\n\n if (isSqliteDatabase(this.db)) {\n const raw = this.db.db;\n const rows = (raw\n .prepare(\"SELECT key, value FROM config ORDER BY key\")\n .all() ?? []) as any[];\n return rows\n .filter((row) => row && typeof row.key === \"string\")\n .map((row) => ({ key: row.key, value: row.value }));\n }\n\n const idb = this.db as IDBDatabase;\n return await new Promise((resolve, reject) => {\n try {\n const tx = idb.transaction(\"config\", \"readonly\");\n if (!tx) {\n reject(new Error(\"Failed to open read transaction\"));\n\n return;\n }\n\n const store = tx.objectStore(\"config\");\n const request = store.getAll();\n\n request.onsuccess = () => {\n const rows = Array.isArray(request.result) ? request.result : [];\n resolve(\n rows\n .filter((row) => row && typeof row.key === \"string\")\n .map((row) => ({ key: row.key, value: row.value })),\n );\n };\n\n request.onerror = () => {\n reject(request.error || new Error(\"Failed to read settings config\"));\n };\n } catch (error) {\n reject(error);\n }\n });\n }\n\n async onActivityLogDiskLoggingToggle(enabled: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.ACTIVITY_LOG_DISK_LOGGING_ENABLED,\n enabled ? \"true\" : \"false\",\n );\n\n showSuccess(\n enabled\n ? \"Activity log disk logging enabled\"\n : \"Activity log disk logging disabled\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\n \"Error saving activity log disk logging setting: \" + errorMsg,\n 6000,\n );\n }\n }\n\n async onChatSplitViewToggle(enabled: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.CHAT_SPLIT_VIEW_ENABLED,\n enabled ? \"true\" : \"false\",\n );\n\n this.dispatchEvent(\n new CustomEvent(\"chat-split-view-change\", {\n detail: { enabled },\n bubbles: true,\n composed: true,\n }),\n );\n\n showSuccess(\n enabled\n ? \"Horizontal Chat split view enabled\"\n : \"Horizontal Chat split view disabled\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Chat split view setting: \" + errorMsg, 6000);\n }\n }\n\n async onOverridePrerenderSkeletonToggle(enabled: boolean) {\n try {\n setNamespacedItem(\n \"shadow-claw-override-prerender-skeleton\",\n enabled ? \"true\" : \"false\",\n );\n } catch (e) {\n console.warn(\"Unable to save setting to localStorage:\", e);\n }\n\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.OVERRIDE_PRERENDER_SKELETON,\n enabled ? \"true\" : \"false\",\n );\n\n showSuccess(\n enabled\n ? \"Pre-rendered content override enabled\"\n : \"Pre-rendered content override disabled\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\n \"Error saving pre-rendered content override setting: \" + errorMsg,\n 6000,\n );\n }\n }\n\n async onPagesAutoRefreshInputChange(valSec: number) {\n if (!this.db) {\n return;\n }\n\n const sec = Math.max(0, Math.min(valSec, 86400));\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.PAGES_AUTO_REFRESH_INTERVAL,\n String(sec),\n );\n\n window.dispatchEvent(\n new CustomEvent(\"shadow-claw-pages-auto-refresh-change\", {\n detail: { interval: sec },\n }),\n );\n\n showSuccess(\n sec > 0\n ? `Pages auto refresh set to ${sec}s`\n : \"Pages auto refresh disabled\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Pages auto refresh interval: \" + errorMsg, 6000);\n }\n }\n\n async onSidebarHideChatToggle(hidden: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_CHAT_HIDDEN,\n hidden ? \"true\" : \"false\",\n );\n\n this.dispatchEvent(\n new CustomEvent(\"sidebar-chat-visibility-change\", {\n detail: { hidden },\n bubbles: true,\n composed: true,\n }),\n );\n\n showSuccess(\n hidden ? \"Chat hidden in sidebar\" : \"Chat shown in sidebar\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving sidebar Chat visibility: \" + errorMsg, 6000);\n }\n }\n\n async onSidebarHideFilesToggle(hidden: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_FILES_HIDDEN,\n hidden ? \"true\" : \"false\",\n );\n\n this.dispatchEvent(\n new CustomEvent(\"sidebar-files-visibility-change\", {\n detail: { hidden },\n bubbles: true,\n composed: true,\n }),\n );\n\n showSuccess(\n hidden ? \"Files hidden in sidebar\" : \"Files shown in sidebar\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving sidebar Files visibility: \" + errorMsg, 6000);\n }\n }\n\n async onSidebarHidePagesToggle(hidden: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_PAGES_HIDDEN,\n hidden ? \"true\" : \"false\",\n );\n\n this.dispatchEvent(\n new CustomEvent(\"sidebar-pages-visibility-change\", {\n detail: { hidden },\n bubbles: true,\n composed: true,\n }),\n );\n\n showSuccess(\n hidden ? \"Pages hidden in sidebar\" : \"Pages shown in sidebar\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving sidebar Pages visibility: \" + errorMsg, 6000);\n }\n }\n\n async onSidebarHideTasksToggle(hidden: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_TASKS_HIDDEN,\n hidden ? \"true\" : \"false\",\n );\n\n this.dispatchEvent(\n new CustomEvent(\"sidebar-tasks-visibility-change\", {\n detail: { hidden },\n bubbles: true,\n composed: true,\n }),\n );\n\n showSuccess(\n hidden ? \"Tasks hidden in sidebar\" : \"Tasks shown in sidebar\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving sidebar Tasks visibility: \" + errorMsg, 6000);\n }\n }\n\n async populateAssistantSettings() {\n const root = this.shadowRoot;\n if (!root || !this.db) {\n return;\n }\n\n const nameInput = root.querySelector(\n '[data-setting=\"assistant-name-input\"]',\n ) as HTMLInputElement | null;\n if (nameInput) {\n const storedAssistantName = await getConfig(\n this.db,\n CONFIG_KEYS.ASSISTANT_NAME,\n );\n const orchestratorName =\n this.orchestrator?.assistantName ||\n orchestratorStore.orchestrator?.assistantName;\n\n nameInput.value =\n (typeof storedAssistantName === \"string\" && storedAssistantName) ||\n orchestratorName ||\n ASSISTANT_NAME;\n }\n\n const rawActivityLogDiskLoggingEnabled = (await getConfig(\n this.db,\n CONFIG_KEYS.ACTIVITY_LOG_DISK_LOGGING_ENABLED,\n )) as unknown;\n const activityLogDiskLoggingEnabled =\n rawActivityLogDiskLoggingEnabled === true ||\n rawActivityLogDiskLoggingEnabled === \"true\" ||\n rawActivityLogDiskLoggingEnabled === 1 ||\n rawActivityLogDiskLoggingEnabled === \"1\";\n\n const activityLogToggle = root.querySelector(\n '[data-setting=\"activity-log-disk-logging-toggle\"]',\n ) as HTMLInputElement | null;\n if (activityLogToggle) {\n activityLogToggle.checked = activityLogDiskLoggingEnabled;\n }\n\n const rawSidebarPagesHidden = (await getConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_PAGES_HIDDEN,\n )) as unknown;\n const sidebarPagesHidden =\n rawSidebarPagesHidden === true ||\n rawSidebarPagesHidden === \"true\" ||\n rawSidebarPagesHidden === 1 ||\n rawSidebarPagesHidden === \"1\";\n\n const sidebarHidePagesToggle = root.querySelector(\n '[data-setting=\"sidebar-hide-pages-toggle\"]',\n ) as HTMLInputElement | null;\n if (sidebarHidePagesToggle) {\n sidebarHidePagesToggle.checked = sidebarPagesHidden;\n }\n\n const rawSidebarChatHidden = (await getConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_CHAT_HIDDEN,\n )) as unknown;\n const sidebarChatHidden =\n rawSidebarChatHidden === true ||\n rawSidebarChatHidden === \"true\" ||\n rawSidebarChatHidden === 1 ||\n rawSidebarChatHidden === \"1\";\n\n const sidebarHideChatToggle = root.querySelector(\n '[data-setting=\"sidebar-hide-chat-toggle\"]',\n ) as HTMLInputElement | null;\n if (sidebarHideChatToggle) {\n sidebarHideChatToggle.checked = sidebarChatHidden;\n }\n\n const rawSidebarTasksHidden = (await getConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_TASKS_HIDDEN,\n )) as unknown;\n const sidebarTasksHidden =\n rawSidebarTasksHidden === true ||\n rawSidebarTasksHidden === \"true\" ||\n rawSidebarTasksHidden === 1 ||\n rawSidebarTasksHidden === \"1\";\n\n const sidebarHideTasksToggle = root.querySelector(\n '[data-setting=\"sidebar-hide-tasks-toggle\"]',\n ) as HTMLInputElement | null;\n if (sidebarHideTasksToggle) {\n sidebarHideTasksToggle.checked = sidebarTasksHidden;\n }\n\n const rawSidebarFilesHidden = (await getConfig(\n this.db,\n CONFIG_KEYS.SIDEBAR_FILES_HIDDEN,\n )) as unknown;\n const sidebarFilesHidden =\n rawSidebarFilesHidden === true ||\n rawSidebarFilesHidden === \"true\" ||\n rawSidebarFilesHidden === 1 ||\n rawSidebarFilesHidden === \"1\";\n\n const sidebarHideFilesToggle = root.querySelector(\n '[data-setting=\"sidebar-hide-files-toggle\"]',\n ) as HTMLInputElement | null;\n if (sidebarHideFilesToggle) {\n sidebarHideFilesToggle.checked = sidebarFilesHidden;\n }\n\n const rawChatSplitViewEnabled = (await getConfig(\n this.db,\n CONFIG_KEYS.CHAT_SPLIT_VIEW_ENABLED,\n )) as unknown;\n const chatSplitViewEnabled = isTruthyConfigValue(\n rawChatSplitViewEnabled,\n false,\n );\n\n const chatSplitViewToggle = root.querySelector(\n '[data-setting=\"chat-split-view-toggle\"]',\n ) as HTMLInputElement | null;\n if (chatSplitViewToggle) {\n chatSplitViewToggle.checked = chatSplitViewEnabled;\n }\n\n const pagesAutoRefreshInput = root.querySelector(\n '[data-setting=\"pages-auto-refresh-input\"]',\n ) as HTMLInputElement | null;\n if (pagesAutoRefreshInput) {\n const storedInterval = await getConfig(\n this.db,\n CONFIG_KEYS.PAGES_AUTO_REFRESH_INTERVAL,\n );\n if (\n typeof storedInterval === \"string\" ||\n typeof storedInterval === \"number\"\n ) {\n const parsed = parseInt(String(storedInterval), 10);\n pagesAutoRefreshInput.value =\n !isNaN(parsed) && parsed >= 0 ? String(parsed) : \"0\";\n } else {\n pagesAutoRefreshInput.value = \"0\";\n }\n }\n\n const rawOverridePrerenderSkeleton = (await getConfig(\n this.db,\n CONFIG_KEYS.OVERRIDE_PRERENDER_SKELETON,\n )) as unknown;\n let storedLocalStorage: string | null = null;\n try {\n storedLocalStorage = getNamespacedItem(\n \"shadow-claw-override-prerender-skeleton\",\n );\n } catch {\n // Ignore\n }\n\n const defaultOverride = getPrerenderSkeletonDefault();\n\n let overridePrerenderSkeleton = defaultOverride;\n if (\n rawOverridePrerenderSkeleton !== null &&\n rawOverridePrerenderSkeleton !== undefined\n ) {\n overridePrerenderSkeleton = isTruthyConfigValue(\n rawOverridePrerenderSkeleton,\n );\n\n // Keep the synchronous early-boot flag in step with the stored choice;\n // an unset value must never be persisted or it would pin the default.\n try {\n setNamespacedItem(\n \"shadow-claw-override-prerender-skeleton\",\n overridePrerenderSkeleton ? \"true\" : \"false\",\n );\n } catch {\n // Ignore localStorage quota / access errors\n }\n } else if (storedLocalStorage !== null) {\n overridePrerenderSkeleton = storedLocalStorage === \"true\";\n }\n\n const overridePrerenderSkeletonToggle = root.querySelector(\n '[data-setting=\"override-prerender-skeleton-toggle\"]',\n ) as HTMLInputElement | null;\n if (overridePrerenderSkeletonToggle) {\n overridePrerenderSkeletonToggle.checked = overridePrerenderSkeleton;\n }\n\n const domHostsTextarea = root.querySelector(\n '[data-setting=\"dom-allowed-iframe-hosts\"]',\n ) as HTMLTextAreaElement | null;\n if (domHostsTextarea) {\n const storedDomHosts = await getConfig(\n this.db,\n CONFIG_KEYS.ALLOWED_IFRAME_HOST_PATTERNS,\n );\n\n if (\n typeof storedDomHosts === \"string\" &&\n storedDomHosts.trim().length > 0\n ) {\n domHostsTextarea.value = storedDomHosts;\n setAllowedIframeHostPatterns(storedDomHosts);\n } else {\n domHostsTextarea.value =\n DEFAULT_ALLOWED_IFRAME_HOST_PATTERNS.join(\"\\n\");\n }\n }\n\n const markdownFrontmatterPagesToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-pages-toggle\"]',\n ) as HTMLInputElement | null;\n if (markdownFrontmatterPagesToggle) {\n markdownFrontmatterPagesToggle.checked = isTruthyConfigValue(\n await getConfig(this.db, CONFIG_KEYS.MARKDOWN_FRONTMATTER_PAGES),\n true,\n );\n }\n\n const markdownFrontmatterFileViewerToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-file-viewer-toggle\"]',\n ) as HTMLInputElement | null;\n if (markdownFrontmatterFileViewerToggle) {\n markdownFrontmatterFileViewerToggle.checked = isTruthyConfigValue(\n await getConfig(this.db, CONFIG_KEYS.MARKDOWN_FRONTMATTER_FILE_VIEWER),\n true,\n );\n }\n\n const markdownFrontmatterChatToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-chat-toggle\"]',\n ) as HTMLInputElement | null;\n if (markdownFrontmatterChatToggle) {\n markdownFrontmatterChatToggle.checked = isTruthyConfigValue(\n await getConfig(this.db, CONFIG_KEYS.MARKDOWN_FRONTMATTER_CHAT),\n true,\n );\n }\n\n const markdownFrontmatterTasksToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-tasks-toggle\"]',\n ) as HTMLInputElement | null;\n if (markdownFrontmatterTasksToggle) {\n markdownFrontmatterTasksToggle.checked = isTruthyConfigValue(\n await getConfig(this.db, CONFIG_KEYS.MARKDOWN_FRONTMATTER_TASKS),\n true,\n );\n }\n }\n\n async promptForPlaintextBackupHandle(): Promise<FileSystemFileHandle | null> {\n const pickerMaybe = Reflect.get(globalThis, \"showSaveFilePicker\");\n const picker =\n typeof pickerMaybe === \"function\" ? pickerMaybe.bind(globalThis) : null;\n\n if (!picker) {\n throw new Error(\n \"Plaintext settings backup requires the File System Access API.\",\n );\n }\n\n try {\n return await picker({\n id: \"shadowclaw-settings-backup\",\n suggestedName: `shadowclaw-settings-backup-${formatDateForFilename()}.json`,\n types: [\n {\n description: \"JSON Files\",\n accept: {\n \"application/json\": [\".json\"],\n },\n },\n ],\n });\n } catch (error) {\n if (error instanceof Error && error.name === \"AbortError\") {\n return null;\n }\n\n throw error;\n }\n }\n\n async render() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const showChannelsConfigButton = root.querySelector(\n '[data-action=\"show-channels-config\"]',\n );\n showChannelsConfigButton?.addEventListener(\"click\", () => {\n this.dispatchEvent(\n new CustomEvent(\"navigate\", {\n detail: { page: \"channels\" },\n bubbles: true,\n composed: true,\n }),\n );\n });\n\n const showToolsConfigButton = root.querySelector(\n '[data-action=\"show-tools-config\"]',\n );\n showToolsConfigButton?.addEventListener(\"click\", () => {\n this.dispatchEvent(\n new CustomEvent(\"navigate\", {\n detail: { page: \"tools\" },\n bubbles: true,\n composed: true,\n }),\n );\n });\n\n const tabButtons =\n root.querySelectorAll<HTMLButtonElement>(\"[data-tab-target]\");\n tabButtons.forEach((tabButton) => {\n tabButton.addEventListener(\"click\", () => {\n this.activateTab(tabButton.dataset.tabTarget);\n });\n\n tabButton.addEventListener(\"keydown\", (event) => {\n this.handleTabKeydown(event, tabButton);\n });\n });\n this.applyTabState();\n\n this.bindSettingsActions();\n\n const revisionEl = root.querySelector('[data-info=\"deployed-revision\"]');\n if (revisionEl) {\n const revision =\n document\n .querySelector('meta[name=\"revision\"]')\n ?.getAttribute(\"content\")\n ?.trim() || \"\";\n revisionEl.textContent = `Deployed revision: ${revision || \"unknown\"}`;\n }\n\n await this.populateAssistantSettings();\n }\n\n async replaceConfigEntries(entries: ConfigEntryRecord[]): Promise<void> {\n if (!this.db) {\n throw new Error(\"Database is unavailable\");\n }\n\n if (isSqliteDatabase(this.db)) {\n const raw = this.db.db;\n raw.prepare(\"DELETE FROM config\").run();\n const insertStmt = raw.prepare(\n \"INSERT OR REPLACE INTO config (key, value) VALUES (?, ?)\",\n );\n for (const entry of entries) {\n insertStmt.run(\n entry.key,\n typeof entry.value === \"string\"\n ? entry.value\n : JSON.stringify(entry.value),\n );\n }\n return;\n }\n\n const idb = this.db as IDBDatabase;\n await new Promise<void>((resolve, reject) => {\n try {\n const tx = idb.transaction(\"config\", \"readwrite\");\n if (!tx) {\n reject(new Error(\"Failed to open write transaction\"));\n\n return;\n }\n\n const store = tx.objectStore(\"config\");\n store.clear();\n for (const entry of entries) {\n store.put({ key: entry.key, value: entry.value });\n }\n\n tx.oncomplete = () => resolve();\n tx.onerror = () =>\n reject(tx.error || new Error(\"Failed to update config\"));\n tx.onabort = () =>\n reject(tx.error || new Error(\"Config update aborted\"));\n } catch (error) {\n reject(error);\n }\n });\n }\n\n async saveAssistantName() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const nameInput = root.querySelector(\n '[data-setting=\"assistant-name-input\"]',\n ) as HTMLInputElement | null;\n if (!nameInput) {\n return;\n }\n\n const name = nameInput.value.trim();\n if (!name) {\n showWarning(\"Please enter a name\", 3000);\n\n return;\n }\n\n setNamespacedItem(\"assistantName\", name);\n\n try {\n const orchestrator = this.orchestrator || orchestratorStore.orchestrator;\n if (orchestrator) {\n this.orchestrator = orchestrator;\n await setAssistantName(orchestrator, this.db, name);\n } else {\n await setConfig(this.db, CONFIG_KEYS.ASSISTANT_NAME, name);\n }\n } catch (e) {\n console.warn(\"Could not update orchestrator:\", e);\n }\n\n showSuccess(\"Assistant name saved\", 3000);\n }\n\n async saveDomAllowedIframeHosts() {\n const root = this.shadowRoot;\n if (!root || !this.db) {\n return;\n }\n\n const textarea = root.querySelector(\n '[data-setting=\"dom-allowed-iframe-hosts\"]',\n ) as HTMLTextAreaElement | null;\n if (!textarea) {\n return;\n }\n\n const rawText = textarea.value;\n const lines = rawText\n .split(\"\\n\")\n .map((s) => s.trim())\n .filter((s) => s.length > 0);\n\n const markdownFrontmatterPagesToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-pages-toggle\"]',\n ) as HTMLInputElement | null;\n const markdownFrontmatterFileViewerToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-file-viewer-toggle\"]',\n ) as HTMLInputElement | null;\n const markdownFrontmatterChatToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-chat-toggle\"]',\n ) as HTMLInputElement | null;\n const markdownFrontmatterTasksToggle = root.querySelector(\n '[data-setting=\"markdown-frontmatter-tasks-toggle\"]',\n ) as HTMLInputElement | null;\n\n try {\n const valueToSave = lines.join(\"\\n\");\n await setConfig(\n this.db,\n CONFIG_KEYS.ALLOWED_IFRAME_HOST_PATTERNS,\n valueToSave,\n );\n\n await setConfig(\n this.db,\n CONFIG_KEYS.MARKDOWN_FRONTMATTER_PAGES,\n String(markdownFrontmatterPagesToggle?.checked ?? true),\n );\n\n await setConfig(\n this.db,\n CONFIG_KEYS.MARKDOWN_FRONTMATTER_FILE_VIEWER,\n String(markdownFrontmatterFileViewerToggle?.checked ?? true),\n );\n\n await setConfig(\n this.db,\n CONFIG_KEYS.MARKDOWN_FRONTMATTER_CHAT,\n String(markdownFrontmatterChatToggle?.checked ?? true),\n );\n\n await setConfig(\n this.db,\n CONFIG_KEYS.MARKDOWN_FRONTMATTER_TASKS,\n String(markdownFrontmatterTasksToggle?.checked ?? true),\n );\n\n setAllowedIframeHostPatterns(lines);\n\n showSuccess(\"DOM iframe embed settings saved\", 2500);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving DOM iframe embed settings: \" + errorMsg, 6000);\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawSettings);\n}\n"],"mappings":"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"}
@@ -1,11 +1,11 @@
1
1
  import ShadowClawElement from "./components/shadow-claw-element.js";
2
2
  import { r as getDb } from "./txPromise-DdeRXi7G.js";
3
- import { c as resetStorageDirectory } from "./getGroupDir-BidwYPfP.js";
4
- import { r as CONFIG_KEYS } from "./config-DxDaVDTn.js";
3
+ import { c as resetStorageDirectory } from "./getGroupDir-mTV2Iz2b.js";
4
+ import { r as CONFIG_KEYS } from "./config-DFLs7eoC.js";
5
5
  import { t as getConfig } from "./getConfig-SElp6VJW.js";
6
- import { Jt as ensureMainGroupIndex, Yt as ensureMainGroupMemory, t as orchestratorStore } from "./orchestrator-Crw4btGn.js";
6
+ import { Jt as ensureMainGroupIndex, Yt as ensureMainGroupMemory, t as orchestratorStore } from "./orchestrator-BK138MkV.js";
7
7
  import { t as setConfig } from "./setConfig-8FMUTIJ1.js";
8
- import { S as setSanitizedHtml } from "./utils-D_ylqOY-.js";
8
+ import { S as setSanitizedHtml } from "./utils-D8AxCH6m.js";
9
9
  import { isTruthyConfigValue } from "./utils/parseBooleanConfig.js";
10
10
  import { a as showSuccess, r as showError, s as showWarning } from "./toast-Ck7OIKDf.js";
11
11
  import { t as effect } from "./effect-DL6j9HJp.js";
@@ -530,4 +530,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
530
530
 
531
531
  //#endregion
532
532
  export { ShadowClawStorage as t };
533
- //# sourceMappingURL=shadow-claw-storage-BTUpEKO0.js.map
533
+ //# sourceMappingURL=shadow-claw-storage-10w-y8vL.js.map