shadow-claw 1.26.0 → 1.27.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 (230) hide show
  1. package/.agents/skills/main/skill-creator/SKILL.md +39 -0
  2. package/.agents/skills/main/skill-creator/references/declarative-pipelines.md +44 -0
  3. package/.agents/skills/main/skill-creator/references/declarative-tools.md +35 -0
  4. package/.agents/skills/main/skill-creator/references/frontmatter-spec.md +50 -0
  5. package/.well-known/agent-skills/index.json +14 -0
  6. package/README.md +5 -3
  7. package/bin/build/build.mjs +146 -15
  8. package/bin/build/build.test.mjs +57 -0
  9. package/bin/cli.mjs +26 -0
  10. package/bin/commands/mcp.mjs +277 -55
  11. package/bin/commands/mcp.test.mjs +275 -1
  12. package/bin/commands/skills-index.mjs +328 -0
  13. package/bin/commands/skills-index.test.mjs +161 -0
  14. package/bin/site-config/utils/custom-elements/get-approved-custom-element-scripts.test.mjs +2 -0
  15. package/bin/site-config/utils/custom-elements/sanitize-embedded-custom-element-scripts.test.mjs +10 -1
  16. package/dist/lib/components/index.js +25 -25
  17. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  18. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  19. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  20. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  21. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  22. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  23. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  24. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  25. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  26. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  27. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  28. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  29. package/dist/lib/components/shadow-claw-a2ui.js +1 -1
  30. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  31. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  32. package/dist/lib/components/shadow-claw-channels.js +1 -1
  33. package/dist/lib/components/shadow-claw-chat.js +1 -1
  34. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  35. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  36. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  37. package/dist/lib/components/shadow-claw-files.js +1 -1
  38. package/dist/lib/components/shadow-claw-git.js +1 -1
  39. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  40. package/dist/lib/components/shadow-claw-llm.js +1 -1
  41. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  42. package/dist/lib/components/shadow-claw-networking.js +1 -1
  43. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  44. package/dist/lib/components/shadow-claw-pages.js +1 -1
  45. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  46. package/dist/lib/components/shadow-claw-settings.js +1 -1
  47. package/dist/lib/components/shadow-claw-storage.js +1 -1
  48. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  49. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  50. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  51. package/dist/lib/components/shadow-claw-tools.js +1 -1
  52. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  53. package/dist/lib/components/shadow-claw.js +1 -1
  54. package/dist/lib/{configurePeerJs-CrlGan0m.js → configurePeerJs-oODzltaC.js} +2 -2
  55. package/dist/lib/{configurePeerJs-CrlGan0m.js.map → configurePeerJs-oODzltaC.js.map} +1 -1
  56. package/dist/lib/core/control-plane-client.d.ts +1 -0
  57. package/dist/lib/{downloadGroupFile-DboUjmp2.js → downloadGroupFile-DmcBQU1n.js} +2 -2
  58. package/dist/lib/{downloadGroupFile-DboUjmp2.js.map → downloadGroupFile-DmcBQU1n.js.map} +1 -1
  59. package/dist/lib/{file-viewer-BrK2Wxgh.js → file-viewer-C3YKnq_-.js} +4 -3
  60. package/dist/lib/{file-viewer-BrK2Wxgh.js.map → file-viewer-C3YKnq_-.js.map} +1 -1
  61. package/dist/lib/index.js +26 -26
  62. package/dist/lib/{initControlPlane-CsO4UR6_.js → initControlPlane-C2zURVIS.js} +86 -13
  63. package/dist/lib/initControlPlane-C2zURVIS.js.map +1 -0
  64. package/dist/lib/{markdown-eeSTFnMA.js → markdown-C6EHl9zs.js} +3 -3
  65. package/dist/lib/{markdown-eeSTFnMA.js.map → markdown-C6EHl9zs.js.map} +1 -1
  66. package/dist/lib/{orchestrator-CJvoC2Uu.js → orchestrator-CACLa_Ro.js} +7 -6
  67. package/dist/lib/{orchestrator-CJvoC2Uu.js.map → orchestrator-CACLa_Ro.js.map} +1 -1
  68. package/dist/lib/{orchestrator-DCfomsn9.js → orchestrator-KRjx0eba.js} +6 -534
  69. package/dist/lib/{orchestrator-DCfomsn9.js.map → orchestrator-KRjx0eba.js.map} +1 -1
  70. package/dist/lib/parsePath-DwC_YZjw.js +16 -0
  71. package/dist/lib/parsePath-DwC_YZjw.js.map +1 -0
  72. package/dist/lib/{peerjs-Dp02bXcG.js → peerjs-DFWOBcXf.js} +4 -4
  73. package/dist/lib/{peerjs-Dp02bXcG.js.map → peerjs-DFWOBcXf.js.map} +1 -1
  74. package/dist/lib/{readGroupFileBytes-Bve-e5e_.js → readGroupFileBytes-C8oOe8Iu.js} +3 -16
  75. package/dist/lib/readGroupFileBytes-C8oOe8Iu.js.map +1 -0
  76. package/dist/lib/security/custom-element-security.d.ts +8 -0
  77. package/dist/lib/server/control-plane-types.d.ts +1 -1
  78. package/dist/lib/{shadow-claw-D8xINM3c.js → shadow-claw-6UHdiy4a.js} +5 -5
  79. package/dist/lib/{shadow-claw-D8xINM3c.js.map → shadow-claw-6UHdiy4a.js.map} +1 -1
  80. package/dist/lib/{shadow-claw-a2ui-7rJqG4Ke.js → shadow-claw-a2ui-CpZUTzlh.js} +5 -4
  81. package/dist/lib/{shadow-claw-a2ui-7rJqG4Ke.js.map → shadow-claw-a2ui-CpZUTzlh.js.map} +1 -1
  82. package/dist/lib/{shadow-claw-accounts-CdruwN8A.js → shadow-claw-accounts-03oJ__XC.js} +2 -2
  83. package/dist/lib/{shadow-claw-accounts-CdruwN8A.js.map → shadow-claw-accounts-03oJ__XC.js.map} +1 -1
  84. package/dist/lib/{shadow-claw-channel-config-Bj0-Nk3t.js → shadow-claw-channel-config-DmfwJc6G.js} +3 -3
  85. package/dist/lib/{shadow-claw-channel-config-Bj0-Nk3t.js.map → shadow-claw-channel-config-DmfwJc6G.js.map} +1 -1
  86. package/dist/lib/{shadow-claw-channels-C_jI4KhP.js → shadow-claw-channels-1N6Jl-By.js} +3 -3
  87. package/dist/lib/{shadow-claw-channels-C_jI4KhP.js.map → shadow-claw-channels-1N6Jl-By.js.map} +1 -1
  88. package/dist/lib/{shadow-claw-chat-B16MspoP.js → shadow-claw-chat-BMoqQJRK.js} +10 -10
  89. package/dist/lib/{shadow-claw-chat-B16MspoP.js.map → shadow-claw-chat-BMoqQJRK.js.map} +1 -1
  90. package/dist/lib/{shadow-claw-control-plane-x8Ldid_h.js → shadow-claw-control-plane-UG0o7pCz.js} +6 -6
  91. package/dist/lib/{shadow-claw-control-plane-x8Ldid_h.js.map → shadow-claw-control-plane-UG0o7pCz.js.map} +1 -1
  92. package/dist/lib/{shadow-claw-conversations-Ct1kAYdB.js → shadow-claw-conversations-BwXep3iu.js} +4 -3
  93. package/dist/lib/{shadow-claw-conversations-Ct1kAYdB.js.map → shadow-claw-conversations-BwXep3iu.js.map} +1 -1
  94. package/dist/lib/{shadow-claw-file-viewer-BfDHHgpA.js → shadow-claw-file-viewer-DUxzVxDT.js} +14 -10
  95. package/dist/lib/shadow-claw-file-viewer-DUxzVxDT.js.map +1 -0
  96. package/dist/lib/{shadow-claw-files-EYhOPYIH.js → shadow-claw-files-DIREEnT2.js} +7 -7
  97. package/dist/lib/{shadow-claw-files-EYhOPYIH.js.map → shadow-claw-files-DIREEnT2.js.map} +1 -1
  98. package/dist/lib/{shadow-claw-git-tcSpT-P0.js → shadow-claw-git-Bg1SWgsF.js} +4 -4
  99. package/dist/lib/{shadow-claw-git-tcSpT-P0.js.map → shadow-claw-git-Bg1SWgsF.js.map} +1 -1
  100. package/dist/lib/{shadow-claw-integrations-NbcCx_ZI.js → shadow-claw-integrations-Ds-CLPhj.js} +2 -2
  101. package/dist/lib/{shadow-claw-integrations-NbcCx_ZI.js.map → shadow-claw-integrations-Ds-CLPhj.js.map} +1 -1
  102. package/dist/lib/{shadow-claw-llm-BazJdD5f.js → shadow-claw-llm-CazBrVpM.js} +3 -3
  103. package/dist/lib/{shadow-claw-llm-BazJdD5f.js.map → shadow-claw-llm-CazBrVpM.js.map} +1 -1
  104. package/dist/lib/{shadow-claw-mcp-remote-CYmhpg7a.js → shadow-claw-mcp-remote-CT5Q-54E.js} +2 -2
  105. package/dist/lib/{shadow-claw-mcp-remote-CYmhpg7a.js.map → shadow-claw-mcp-remote-CT5Q-54E.js.map} +1 -1
  106. package/dist/lib/{shadow-claw-networking-DImPxe0H.js → shadow-claw-networking-Df85tCbO.js} +2 -2
  107. package/dist/lib/{shadow-claw-networking-DImPxe0H.js.map → shadow-claw-networking-Df85tCbO.js.map} +1 -1
  108. package/dist/lib/{shadow-claw-page-header-CcHUfFUx.js → shadow-claw-page-header-Cti2fzf-.js} +2 -2
  109. package/dist/lib/{shadow-claw-page-header-CcHUfFUx.js.map → shadow-claw-page-header-Cti2fzf-.js.map} +1 -1
  110. package/dist/lib/{shadow-claw-pages-D54jF1Qq.js → shadow-claw-pages-BgPyIEZO.js} +15 -11
  111. package/dist/lib/shadow-claw-pages-BgPyIEZO.js.map +1 -0
  112. package/dist/lib/{shadow-claw-peerjs-B9-T8Nlx.js → shadow-claw-peerjs-xkBXILed.js} +3 -3
  113. package/dist/lib/{shadow-claw-peerjs-B9-T8Nlx.js.map → shadow-claw-peerjs-xkBXILed.js.map} +1 -1
  114. package/dist/lib/{shadow-claw-settings-Bt1VAe-1.js → shadow-claw-settings-CN89xRVU.js} +4 -4
  115. package/dist/lib/{shadow-claw-settings-Bt1VAe-1.js.map → shadow-claw-settings-CN89xRVU.js.map} +1 -1
  116. package/dist/lib/{shadow-claw-storage-CFOjGf1d.js → shadow-claw-storage-VnhcObCe.js} +3 -3
  117. package/dist/lib/{shadow-claw-storage-CFOjGf1d.js.map → shadow-claw-storage-VnhcObCe.js.map} +1 -1
  118. package/dist/lib/{shadow-claw-task-server-BiKa2GOm.js → shadow-claw-task-server-jgEC2hHB.js} +2 -2
  119. package/dist/lib/{shadow-claw-task-server-BiKa2GOm.js.map → shadow-claw-task-server-jgEC2hHB.js.map} +1 -1
  120. package/dist/lib/{shadow-claw-tasks-DDHd8W4d.js → shadow-claw-tasks-i_evIufy.js} +6 -6
  121. package/dist/lib/{shadow-claw-tasks-DDHd8W4d.js.map → shadow-claw-tasks-i_evIufy.js.map} +1 -1
  122. package/dist/lib/{shadow-claw-terminal-kB6_tWKz.js → shadow-claw-terminal-CwScROlu.js} +2 -2
  123. package/dist/lib/{shadow-claw-terminal-kB6_tWKz.js.map → shadow-claw-terminal-CwScROlu.js.map} +1 -1
  124. package/dist/lib/{shadow-claw-tools-DxXIm0ku.js → shadow-claw-tools-DD3fyXP4.js} +5 -4
  125. package/dist/lib/{shadow-claw-tools-DxXIm0ku.js.map → shadow-claw-tools-DD3fyXP4.js.map} +1 -1
  126. package/dist/lib/{shadow-claw-webvm-Dc8oo7ao.js → shadow-claw-webvm-DbJq4I3-.js} +2 -2
  127. package/dist/lib/{shadow-claw-webvm-Dc8oo7ao.js.map → shadow-claw-webvm-DbJq4I3-.js.map} +1 -1
  128. package/dist/lib/{syncWebMcpRegistration-jyRGbC9w.js → syncWebMcpRegistration-DNLnQ-jz.js} +3 -2
  129. package/dist/lib/{syncWebMcpRegistration-jyRGbC9w.js.map → syncWebMcpRegistration-DNLnQ-jz.js.map} +1 -1
  130. package/dist/lib/tools-DwwB9RBa.js +546 -0
  131. package/dist/lib/tools-DwwB9RBa.js.map +1 -0
  132. package/dist/lib/{trusted-types-CkLDpLiZ.js → trusted-types-Dx0RZlrd.js} +19 -8
  133. package/dist/lib/trusted-types-Dx0RZlrd.js.map +1 -0
  134. package/dist/lib/utils/index.js +1 -1
  135. package/dist/lib/utils/utils.js +1 -1
  136. package/dist/public/.well-known/agent-skills/index.json +14 -0
  137. package/dist/public/AGENTS.md +5 -3
  138. package/dist/public/README.md +5 -3
  139. package/dist/public/agent.worker.js +1 -1
  140. package/dist/public/{configurePeerJs-COcwE0E7.js → configurePeerJs-BqgeBjP7.js} +1 -1
  141. package/dist/public/custom-element-security-FU04Cq05.js +1 -0
  142. package/dist/public/dist-B9m1QM9v.js +58 -0
  143. package/dist/public/docs/README.md +31 -31
  144. package/dist/public/docs/example/article/index.html +1 -1
  145. package/dist/public/docs/publishing/index.html +1 -1
  146. package/dist/public/docs/skill-creator/index.html +1 -1
  147. package/dist/public/docs/subsystems/a2ui.md +11 -1
  148. package/dist/public/docs/subsystems/cli.md +29 -0
  149. package/dist/public/docs/subsystems/control-plane.md +8 -2
  150. package/dist/public/docs/subsystems/custom-element-security.md +19 -9
  151. package/dist/public/docs/subsystems/mcp-server.md +39 -15
  152. package/dist/public/docs/subsystems/skills.md +30 -0
  153. package/dist/public/docs/subsystems/webmcp.md +9 -0
  154. package/dist/public/downloadGroupFile-D8KRJGGL.js +1 -0
  155. package/dist/public/e2e/README.md +7 -4
  156. package/dist/public/{e2e-bridge-CHARpbpW.js → e2e-bridge-Ceqr5kGc.js} +1 -1
  157. package/dist/public/effect-BJCrpFdp.js +1 -0
  158. package/dist/public/file-viewer-C-6Jc_tb.js +1 -0
  159. package/dist/public/index.html +1 -1
  160. package/dist/public/index.js +1 -1
  161. package/dist/public/initControlPlane-BN9cWyO0.js +1 -0
  162. package/dist/public/main/index.html +1 -1
  163. package/dist/public/main/memory/index.html +1 -1
  164. package/dist/public/{markdown-1I3O6Mmd.js → markdown-C3M4OW_A.js} +1 -1
  165. package/dist/public/{orchestrator-Cl95w2vb.js → orchestrator-CMbCTjBf.js} +7 -7
  166. package/dist/public/{orchestrator-D-xlXG92.js → orchestrator-DHjdLtqa.js} +663 -663
  167. package/dist/public/peerjs-DUCKH-m9.js +1 -0
  168. package/dist/public/service-worker.js +1 -1
  169. package/dist/public/{shadow-claw-CaoKmIIB.js → shadow-claw-EAt2ml5Y.js} +3 -3
  170. package/dist/public/{shadow-claw-accounts-CJvYC4li.js → shadow-claw-accounts-xUOLBsQZ.js} +1 -1
  171. package/dist/public/{shadow-claw-channels-3K62sU5f.js → shadow-claw-channels-XsfuWFF8.js} +4 -4
  172. package/dist/public/{shadow-claw-chat-Cu2keU2I.js → shadow-claw-chat-CbSaOZ4q.js} +7 -7
  173. package/dist/public/{shadow-claw-control-plane-D1OwlQI_.js → shadow-claw-control-plane-DHvN3Ukg.js} +2 -2
  174. package/dist/public/{shadow-claw-conversations-DDtg3BEZ.js → shadow-claw-conversations-BWs5VVfs.js} +2 -2
  175. package/dist/public/{shadow-claw-file-viewer-BR__1z9S.js → shadow-claw-file-viewer-BWsoW5QS.js} +5 -4
  176. package/dist/public/{shadow-claw-files-BJSyZ-Bl.js → shadow-claw-files-CG7MqWiV.js} +8 -8
  177. package/dist/public/{shadow-claw-git-MAjhXRLc.js → shadow-claw-git-DBRPZNav.js} +6 -6
  178. package/dist/public/{shadow-claw-integrations-82UoFuDR.js → shadow-claw-integrations-BBVnO0Fc.js} +8 -8
  179. package/dist/public/{shadow-claw-llm-R8j0lwPP.js → shadow-claw-llm-DMvLgKXo.js} +2 -2
  180. package/dist/public/{shadow-claw-mcp-remote-BzZoz4LX.js → shadow-claw-mcp-remote-Bkx0gsmF.js} +2 -2
  181. package/dist/public/{shadow-claw-networking-DLEd9cNm.js → shadow-claw-networking-Dd8Rw31D.js} +2 -2
  182. package/dist/public/{shadow-claw-notifications-1vwR7TbT.js → shadow-claw-notifications-Dbevj-lq.js} +2 -2
  183. package/dist/public/{shadow-claw-page-header-DMKbkv3s.js → shadow-claw-page-header-BccSHItx.js} +1 -1
  184. package/dist/public/{shadow-claw-pages-CjyeIV__.js → shadow-claw-pages-3_lQAv0t.js} +4 -3
  185. package/dist/public/{shadow-claw-settings-BfbT4dBU.js → shadow-claw-settings-t8TIlgrM.js} +5 -5
  186. package/dist/public/{shadow-claw-storage-C-mWQQML.js → shadow-claw-storage-CfEXoSIE.js} +2 -2
  187. package/dist/public/{shadow-claw-task-server-D3lHp0Nc.js → shadow-claw-task-server-DxQSsgRZ.js} +2 -2
  188. package/dist/public/{shadow-claw-tasks-DVVWEm-c.js → shadow-claw-tasks-DNpicQwz.js} +14 -14
  189. package/dist/public/{shadow-claw-terminal-BwuTRp-O.js → shadow-claw-terminal-DpY6zU_r.js} +1 -1
  190. package/dist/public/{shadow-claw-toast-ClCwgzFG.js → shadow-claw-toast-BkrQIP-3.js} +1 -1
  191. package/dist/public/{shadow-claw-tools-zFLk2nbV.js → shadow-claw-tools-WSwWohnk.js} +2 -2
  192. package/dist/public/{shadow-claw-webvm-qR9X7fg7.js → shadow-claw-webvm-CP6oFjg5.js} +2 -2
  193. package/dist/public/syncWebMcpRegistration-DOn9gLnD.js +1 -0
  194. package/dist/public/toast-BXgUfbyh.js +1 -0
  195. package/dist/public/tools-DvckJZG2.js +1 -0
  196. package/dist/server.js +188 -188
  197. package/package.json +3 -1
  198. package/src/components/shadow-claw-a2ui/shadow-claw-a2ui.stories.ts +1380 -93
  199. package/src/components/shadow-claw-a2ui/shadow-claw-a2ui.ts +11 -6
  200. package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +8 -1
  201. package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +13 -5
  202. package/src/components/shadow-claw-pages/utils/buildHtmlPageSrcdoc.ts +13 -5
  203. package/src/core/control-plane-client.ts +15 -0
  204. package/src/core/utils/initControlPlane.test.ts +187 -0
  205. package/src/core/utils/initControlPlane.ts +194 -20
  206. package/src/security/custom-element-security.test.ts +51 -0
  207. package/src/security/custom-element-security.ts +33 -15
  208. package/src/server/control-plane-types.ts +1 -0
  209. package/src/server/control-plane.test.ts +69 -0
  210. package/src/server/control-plane.ts +45 -3
  211. package/src/server/mcp/tools/built-in-tools.ts +80 -5
  212. package/src/server/mcp/tools/client-tool-relay.ts +183 -26
  213. package/src/server/mcp/tools/mcp-tools.test.ts +140 -0
  214. package/src/server/middleware/static-files.test.ts +142 -0
  215. package/src/server/middleware/static-files.ts +66 -8
  216. package/src/testing/jest-setup.ts +1 -0
  217. package/src/worker/utils/handleMessage.ts +4 -1
  218. package/dist/lib/initControlPlane-CsO4UR6_.js.map +0 -1
  219. package/dist/lib/readGroupFileBytes-Bve-e5e_.js.map +0 -1
  220. package/dist/lib/shadow-claw-file-viewer-BfDHHgpA.js.map +0 -1
  221. package/dist/lib/shadow-claw-pages-D54jF1Qq.js.map +0 -1
  222. package/dist/lib/trusted-types-CkLDpLiZ.js.map +0 -1
  223. package/dist/public/custom-element-security-NCqQ5lmC.js +0 -1
  224. package/dist/public/downloadGroupFile-G0BZQgQg.js +0 -1
  225. package/dist/public/effect-rHYr4nfu.js +0 -1
  226. package/dist/public/file-viewer-8PdCURDD.js +0 -1
  227. package/dist/public/initControlPlane-CcGXax0A.js +0 -1
  228. package/dist/public/peerjs-BZdxWQFv.js +0 -1
  229. package/dist/public/syncWebMcpRegistration-DD42YsYV.js +0 -1
  230. package/dist/public/toast-HAq8XWFj.js +0 -58
@@ -2,7 +2,7 @@ import ShadowClawElement from "./components/shadow-claw-element.js";
2
2
  import { n as getDb } from "./txPromise-CuGh-TGK.js";
3
3
  import { r as CONFIG_KEYS } from "./config--CFrw3J3.js";
4
4
  import { t as getConfig } from "./getConfig-BxxXMyuM.js";
5
- import { t as orchestratorStore } from "./orchestrator-DCfomsn9.js";
5
+ import { t as orchestratorStore } from "./orchestrator-KRjx0eba.js";
6
6
  import { t as setConfig } from "./setConfig-BFED5CXn.js";
7
7
  import { a as showSuccess, r as showError } from "./toast-DZ6r7_YI.js";
8
8
  import { t as effect } from "./effect-DL6j9HJp.js";
@@ -326,7 +326,7 @@ var ShadowClawControlPlane = class extends ShadowClawElement {
326
326
  if (!root) return;
327
327
  const cpEnabledToggle = root.querySelector("[data-setting=\"control-plane-enabled-toggle\"]");
328
328
  if (cpEnabledToggle && this.db) try {
329
- const { isControlPlaneEnabled } = await import("./initControlPlane-CsO4UR6_.js");
329
+ const { isControlPlaneEnabled } = await import("./initControlPlane-C2zURVIS.js");
330
330
  cpEnabledToggle.checked = await isControlPlaneEnabled(this.db);
331
331
  } catch (_) {
332
332
  cpEnabledToggle.checked = false;
@@ -438,7 +438,7 @@ var ShadowClawControlPlane = class extends ShadowClawElement {
438
438
  if (typeof localStorage !== "undefined") try {
439
439
  localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_TRANSPORT, transport);
440
440
  } catch (_) {}
441
- const { isControlPlaneEnabled, createDefaultControlPlaneClient, shouldConnectControlPlane } = await import("./initControlPlane-CsO4UR6_.js");
441
+ const { isControlPlaneEnabled, createDefaultControlPlaneClient, shouldConnectControlPlane } = await import("./initControlPlane-C2zURVIS.js");
442
442
  if (await isControlPlaneEnabled(this.db) && shouldConnectControlPlane()) createDefaultControlPlaneClient({
443
443
  orchestrator: this.orchestrator || void 0,
444
444
  transport
@@ -462,7 +462,7 @@ var ShadowClawControlPlane = class extends ShadowClawElement {
462
462
  if (url) localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_URL, url);
463
463
  else localStorage.removeItem(CONFIG_KEYS.CONTROL_PLANE_URL);
464
464
  } catch (_) {}
465
- const { isControlPlaneEnabled, createDefaultControlPlaneClient, shouldConnectControlPlane } = await import("./initControlPlane-CsO4UR6_.js");
465
+ const { isControlPlaneEnabled, createDefaultControlPlaneClient, shouldConnectControlPlane } = await import("./initControlPlane-C2zURVIS.js");
466
466
  if (await isControlPlaneEnabled(this.db) && shouldConnectControlPlane()) createDefaultControlPlaneClient({ orchestrator: this.orchestrator || void 0 });
467
467
  showSuccess(url ? `Control Plane URL saved: ${url}` : "Control Plane URL reset to default", 3e3);
468
468
  } catch (err) {
@@ -480,7 +480,7 @@ var ShadowClawControlPlane = class extends ShadowClawElement {
480
480
  if (typeof localStorage !== "undefined") try {
481
481
  localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_ENABLED, enabled ? "true" : "false");
482
482
  } catch (_) {}
483
- const { createDefaultControlPlaneClient, stopControlPlaneClient, shouldConnectControlPlane } = await import("./initControlPlane-CsO4UR6_.js");
483
+ const { createDefaultControlPlaneClient, stopControlPlaneClient, shouldConnectControlPlane } = await import("./initControlPlane-C2zURVIS.js");
484
484
  if (enabled) {
485
485
  if (shouldConnectControlPlane()) createDefaultControlPlaneClient({ orchestrator: this.orchestrator || void 0 });
486
486
  showSuccess("Control plane client enabled and connected", 3e3);
@@ -497,4 +497,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
497
497
 
498
498
  //#endregion
499
499
  export { getControlPlaneTargetAddressSpace as n, ShadowClawControlPlane as t };
500
- //# sourceMappingURL=shadow-claw-control-plane-x8Ldid_h.js.map
500
+ //# sourceMappingURL=shadow-claw-control-plane-UG0o7pCz.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-claw-control-plane-x8Ldid_h.js","names":["shadowClawControlPlaneStyles","shadowClawControlPlaneTemplate"],"sources":["../../src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.ts"],"sourcesContent":["import { effect } from \"../../../core/effect.js\";\nimport { getDb } from \"../../../db/db.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\nimport { setConfig } from \"../../../db/setConfig.js\";\nimport {\n CONFIG_KEYS,\n DEFAULT_CONTROL_PLANE_ENABLED,\n DEFAULT_CONTROL_PLANE_TRANSPORT,\n} from \"../../../config/config.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { showError, showSuccess } from \"../../../ui/toast.js\";\n\nimport type { Orchestrator } from \"../../../core/orchestrator/orchestrator.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { AppDialogOptions } from \"../../../ui/types.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawControlPlaneStyles from \"./shadow-claw-control-plane.css\" with { type: \"css\" };\nimport shadowClawControlPlaneTemplate from \"./shadow-claw-control-plane.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-control-plane\";\n\n/**\n * Computes Chromium targetAddressSpace for Private Network Access (PNA).\n */\nexport function getControlPlaneTargetAddressSpace(\n urlStr: string,\n): \"loopback\" | \"private\" | undefined {\n try {\n const parsed = new URL(urlStr);\n const hostname = parsed.hostname.toLowerCase();\n const isLoopback =\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"[::1]\";\n if (isLoopback) {\n return \"loopback\";\n }\n const isPrivate = /^(10\\.|172\\.(1[6-9]|2\\d|3[01])\\.|192\\.168\\.)/.test(\n hostname,\n );\n if (isPrivate) {\n return \"private\";\n }\n } catch (_) {}\n return undefined;\n}\n\n/**\n * Settings sub-component for Control Plane Client URL, enabled toggle, and transport configuration.\n */\nexport class ShadowClawControlPlane extends ShadowClawElement {\n static styles = shadowClawControlPlaneStyles;\n static template = shadowClawControlPlaneTemplate;\n\n db: ShadowClawDatabase | null;\n orchestrator: Orchestrator | null;\n\n constructor() {\n super();\n\n this.db = null;\n this.orchestrator = null;\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 this.bindEventListeners();\n this.setupEffects();\n await this.render();\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"save-control-plane-transport\"]')\n ?.addEventListener(\"click\", () => {\n void this.saveControlPlaneTransport();\n });\n\n root\n .querySelector('[data-action=\"save-control-plane-url\"]')\n ?.addEventListener(\"click\", () => {\n void this.saveControlPlaneUrl();\n });\n\n root\n .querySelector('[data-action=\"test-control-plane-connection\"]')\n ?.addEventListener(\"click\", () => {\n void this.testControlPlaneConnection();\n });\n\n root\n .querySelector('[data-setting=\"control-plane-enabled-toggle\"]')\n ?.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLInputElement;\n void this.saveControlPlaneEnabled(target.checked);\n });\n }\n\n setupEffects() {\n effect(() => {\n if (orchestratorStore.ready) {\n this.orchestrator = orchestratorStore.orchestrator;\n this.render();\n }\n });\n }\n\n async render() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const cpEnabledToggle = root.querySelector(\n '[data-setting=\"control-plane-enabled-toggle\"]',\n ) as HTMLInputElement | null;\n if (cpEnabledToggle && this.db) {\n try {\n const { isControlPlaneEnabled } =\n await import(\"../../../core/utils/initControlPlane.js\");\n cpEnabledToggle.checked = await isControlPlaneEnabled(this.db);\n } catch (_) {\n cpEnabledToggle.checked = DEFAULT_CONTROL_PLANE_ENABLED;\n }\n }\n\n const cpUrlInput = root.querySelector(\n '[data-setting=\"control-plane-url-input\"]',\n ) as HTMLInputElement | null;\n if (cpUrlInput && this.db) {\n try {\n const stored = await getConfig(this.db, CONFIG_KEYS.CONTROL_PLANE_URL);\n cpUrlInput.value = stored || \"\";\n } catch (_) {\n cpUrlInput.value = \"\";\n }\n }\n\n const transportSelect = root.querySelector(\n '[data-setting=\"control-plane-transport-select\"]',\n ) as HTMLSelectElement | null;\n if (transportSelect && this.db) {\n try {\n const stored = await getConfig(\n this.db,\n CONFIG_KEYS.CONTROL_PLANE_TRANSPORT,\n );\n transportSelect.value = stored || DEFAULT_CONTROL_PLANE_TRANSPORT;\n } catch (_) {\n transportSelect.value = DEFAULT_CONTROL_PLANE_TRANSPORT;\n }\n }\n }\n\n async requestAppDialog(options: AppDialogOptions): Promise<boolean> {\n const el = document.querySelector(\"shadow-claw\") as any;\n if (el && typeof el.requestDialog === \"function\") {\n return await el.requestDialog(options);\n }\n\n return false;\n }\n\n /**\n * Performs a direct fetch probe to the Control Plane server.\n * Executed during user gestures (e.g. Test Connection / Save URL) to trigger\n * Chromium's Local Network Access (LNA) / Private Network Access (PNA) permission prompt if needed.\n */\n async probeControlPlane(\n urlStr: string,\n ): Promise<{ success: boolean; error?: string }> {\n let targetUrl: URL;\n try {\n targetUrl = new URL(urlStr);\n } catch {\n return { success: false, error: `Invalid URL format: \"${urlStr}\"` };\n }\n\n const targetAddressSpace = getControlPlaneTargetAddressSpace(urlStr);\n const fetchOptions: any = {\n method: \"GET\",\n cache: \"no-store\",\n mode: \"cors\",\n };\n if (targetAddressSpace) {\n fetchOptions.targetAddressSpace = targetAddressSpace;\n }\n\n try {\n const healthUrl = new URL(\"/api/control/health\", targetUrl).toString();\n let res = await fetch(healthUrl, fetchOptions);\n\n if (res.status === 404) {\n const fallbackUrl = new URL(\n \"/api/control/messages\",\n targetUrl,\n ).toString();\n res = await fetch(fallbackUrl, {\n ...fetchOptions,\n method: \"OPTIONS\",\n });\n }\n\n if (res.ok || res.status === 204 || res.status === 401) {\n return { success: true };\n }\n\n return {\n success: false,\n error: `Server responded with HTTP ${res.status} (${res.statusText || \"Error\"})`,\n };\n } catch (err: any) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n /**\n * Interactive handler to test connection and surface diagnostic modal if needed.\n */\n async testControlPlaneConnection(): Promise<boolean> {\n const root = this.shadowRoot;\n if (!root) {\n return false;\n }\n\n const input = root.querySelector(\n '[data-setting=\"control-plane-url-input\"]',\n ) as HTMLInputElement | null;\n const testBtn = root.querySelector(\n '[data-action=\"test-control-plane-connection\"]',\n ) as HTMLButtonElement | null;\n\n const rawUrl = input?.value.trim() || \"http://127.0.0.1:8888\";\n\n if (testBtn) {\n testBtn.disabled = true;\n testBtn.textContent = \"⏳ Testing...\";\n }\n\n try {\n const result = await this.probeControlPlane(rawUrl);\n\n if (result.success) {\n showSuccess(`Successfully reached Control Plane at ${rawUrl}`, 4000);\n return true;\n }\n\n const errorMsg = result.error || \"Unknown connection error\";\n showError(`Connection test failed: ${errorMsg}`, 6000);\n\n await this.requestAppDialog({\n title: \"Control Plane Connection Failed\",\n message: `Unable to connect to \"${rawUrl}\".\\n\\n• TLS / Certificate: If using HTTPS with a self-signed certificate, ensure the certificate is installed and trusted in Chrome (chrome://certificate-manager/localcerts/usercerts).\\n• Chrome Permissions: In Site Settings, ensure \"Local network access\" is allowed.\\n• Server Status: Verify the ShadowClaw dev server is running and listening on this host/port.`,\n confirmLabel: \"OK\",\n });\n\n return false;\n } finally {\n if (testBtn) {\n testBtn.disabled = false;\n testBtn.textContent = \"🔌 Test Connection\";\n }\n }\n }\n\n async saveControlPlaneTransport() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const select = root.querySelector(\n '[data-setting=\"control-plane-transport-select\"]',\n ) as HTMLSelectElement | null;\n if (!select) {\n return;\n }\n\n const transport = select.value === \"websocket\" ? \"websocket\" : \"sse\";\n\n try {\n await setConfig(this.db, CONFIG_KEYS.CONTROL_PLANE_TRANSPORT, transport);\n if (typeof localStorage !== \"undefined\") {\n try {\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_TRANSPORT, transport);\n } catch (_) {}\n }\n\n const {\n isControlPlaneEnabled,\n createDefaultControlPlaneClient,\n shouldConnectControlPlane,\n } = await import(\"../../../core/utils/initControlPlane.js\");\n\n if (\n (await isControlPlaneEnabled(this.db)) &&\n shouldConnectControlPlane()\n ) {\n createDefaultControlPlaneClient({\n orchestrator: this.orchestrator || undefined,\n transport,\n });\n }\n\n showSuccess(\n `Control Plane transport saved: ${transport.toUpperCase()}`,\n 3000,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Control Plane transport: \" + errorMsg, 6000);\n }\n }\n\n async saveControlPlaneUrl() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"control-plane-url-input\"]',\n ) as HTMLInputElement | null;\n if (!input) {\n return;\n }\n\n const url = input.value.trim();\n\n try {\n // Trigger probe within user gesture to elicit Chrome LNA prompt if needed\n if (url) {\n void this.probeControlPlane(url);\n }\n\n await setConfig(this.db, CONFIG_KEYS.CONTROL_PLANE_URL, url);\n if (typeof localStorage !== \"undefined\") {\n try {\n if (url) {\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_URL, url);\n } else {\n localStorage.removeItem(CONFIG_KEYS.CONTROL_PLANE_URL);\n }\n } catch (_) {}\n }\n\n const {\n isControlPlaneEnabled,\n createDefaultControlPlaneClient,\n shouldConnectControlPlane,\n } = await import(\"../../../core/utils/initControlPlane.js\");\n\n if (\n (await isControlPlaneEnabled(this.db)) &&\n shouldConnectControlPlane()\n ) {\n createDefaultControlPlaneClient({\n orchestrator: this.orchestrator || undefined,\n });\n }\n\n showSuccess(\n url\n ? `Control Plane URL saved: ${url}`\n : \"Control Plane URL reset to default\",\n 3000,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Control Plane URL: \" + errorMsg, 6000);\n }\n }\n\n async saveControlPlaneEnabled(enabled: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n if (enabled) {\n const storedUrl =\n (await getConfig(this.db, CONFIG_KEYS.CONTROL_PLANE_URL)) ||\n \"http://127.0.0.1:8888\";\n void this.probeControlPlane(storedUrl);\n }\n\n await setConfig(\n this.db,\n CONFIG_KEYS.CONTROL_PLANE_ENABLED,\n enabled ? \"true\" : \"false\",\n );\n if (typeof localStorage !== \"undefined\") {\n try {\n localStorage.setItem(\n CONFIG_KEYS.CONTROL_PLANE_ENABLED,\n enabled ? \"true\" : \"false\",\n );\n } catch (_) {}\n }\n\n const {\n createDefaultControlPlaneClient,\n stopControlPlaneClient,\n shouldConnectControlPlane,\n } = await import(\"../../../core/utils/initControlPlane.js\");\n\n if (enabled) {\n if (shouldConnectControlPlane()) {\n createDefaultControlPlaneClient({\n orchestrator: this.orchestrator || undefined,\n });\n }\n showSuccess(\"Control plane client enabled and connected\", 3000);\n } else {\n stopControlPlaneClient();\n showSuccess(\"Control plane client disabled\", 3000);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Control Plane setting: \" + errorMsg, 6000);\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawControlPlane);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shadow-claw-control-plane-UG0o7pCz.js","names":["shadowClawControlPlaneStyles","shadowClawControlPlaneTemplate"],"sources":["../../src/components/settings/shadow-claw-control-plane/shadow-claw-control-plane.ts"],"sourcesContent":["import { effect } from \"../../../core/effect.js\";\nimport { getDb } from \"../../../db/db.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\nimport { setConfig } from \"../../../db/setConfig.js\";\nimport {\n CONFIG_KEYS,\n DEFAULT_CONTROL_PLANE_ENABLED,\n DEFAULT_CONTROL_PLANE_TRANSPORT,\n} from \"../../../config/config.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { showError, showSuccess } from \"../../../ui/toast.js\";\n\nimport type { Orchestrator } from \"../../../core/orchestrator/orchestrator.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { AppDialogOptions } from \"../../../ui/types.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawControlPlaneStyles from \"./shadow-claw-control-plane.css\" with { type: \"css\" };\nimport shadowClawControlPlaneTemplate from \"./shadow-claw-control-plane.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-control-plane\";\n\n/**\n * Computes Chromium targetAddressSpace for Private Network Access (PNA).\n */\nexport function getControlPlaneTargetAddressSpace(\n urlStr: string,\n): \"loopback\" | \"private\" | undefined {\n try {\n const parsed = new URL(urlStr);\n const hostname = parsed.hostname.toLowerCase();\n const isLoopback =\n hostname === \"localhost\" ||\n hostname === \"127.0.0.1\" ||\n hostname === \"::1\" ||\n hostname === \"[::1]\";\n if (isLoopback) {\n return \"loopback\";\n }\n const isPrivate = /^(10\\.|172\\.(1[6-9]|2\\d|3[01])\\.|192\\.168\\.)/.test(\n hostname,\n );\n if (isPrivate) {\n return \"private\";\n }\n } catch (_) {}\n return undefined;\n}\n\n/**\n * Settings sub-component for Control Plane Client URL, enabled toggle, and transport configuration.\n */\nexport class ShadowClawControlPlane extends ShadowClawElement {\n static styles = shadowClawControlPlaneStyles;\n static template = shadowClawControlPlaneTemplate;\n\n db: ShadowClawDatabase | null;\n orchestrator: Orchestrator | null;\n\n constructor() {\n super();\n\n this.db = null;\n this.orchestrator = null;\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 this.bindEventListeners();\n this.setupEffects();\n await this.render();\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"save-control-plane-transport\"]')\n ?.addEventListener(\"click\", () => {\n void this.saveControlPlaneTransport();\n });\n\n root\n .querySelector('[data-action=\"save-control-plane-url\"]')\n ?.addEventListener(\"click\", () => {\n void this.saveControlPlaneUrl();\n });\n\n root\n .querySelector('[data-action=\"test-control-plane-connection\"]')\n ?.addEventListener(\"click\", () => {\n void this.testControlPlaneConnection();\n });\n\n root\n .querySelector('[data-setting=\"control-plane-enabled-toggle\"]')\n ?.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLInputElement;\n void this.saveControlPlaneEnabled(target.checked);\n });\n }\n\n setupEffects() {\n effect(() => {\n if (orchestratorStore.ready) {\n this.orchestrator = orchestratorStore.orchestrator;\n this.render();\n }\n });\n }\n\n async render() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const cpEnabledToggle = root.querySelector(\n '[data-setting=\"control-plane-enabled-toggle\"]',\n ) as HTMLInputElement | null;\n if (cpEnabledToggle && this.db) {\n try {\n const { isControlPlaneEnabled } =\n await import(\"../../../core/utils/initControlPlane.js\");\n cpEnabledToggle.checked = await isControlPlaneEnabled(this.db);\n } catch (_) {\n cpEnabledToggle.checked = DEFAULT_CONTROL_PLANE_ENABLED;\n }\n }\n\n const cpUrlInput = root.querySelector(\n '[data-setting=\"control-plane-url-input\"]',\n ) as HTMLInputElement | null;\n if (cpUrlInput && this.db) {\n try {\n const stored = await getConfig(this.db, CONFIG_KEYS.CONTROL_PLANE_URL);\n cpUrlInput.value = stored || \"\";\n } catch (_) {\n cpUrlInput.value = \"\";\n }\n }\n\n const transportSelect = root.querySelector(\n '[data-setting=\"control-plane-transport-select\"]',\n ) as HTMLSelectElement | null;\n if (transportSelect && this.db) {\n try {\n const stored = await getConfig(\n this.db,\n CONFIG_KEYS.CONTROL_PLANE_TRANSPORT,\n );\n transportSelect.value = stored || DEFAULT_CONTROL_PLANE_TRANSPORT;\n } catch (_) {\n transportSelect.value = DEFAULT_CONTROL_PLANE_TRANSPORT;\n }\n }\n }\n\n async requestAppDialog(options: AppDialogOptions): Promise<boolean> {\n const el = document.querySelector(\"shadow-claw\") as any;\n if (el && typeof el.requestDialog === \"function\") {\n return await el.requestDialog(options);\n }\n\n return false;\n }\n\n /**\n * Performs a direct fetch probe to the Control Plane server.\n * Executed during user gestures (e.g. Test Connection / Save URL) to trigger\n * Chromium's Local Network Access (LNA) / Private Network Access (PNA) permission prompt if needed.\n */\n async probeControlPlane(\n urlStr: string,\n ): Promise<{ success: boolean; error?: string }> {\n let targetUrl: URL;\n try {\n targetUrl = new URL(urlStr);\n } catch {\n return { success: false, error: `Invalid URL format: \"${urlStr}\"` };\n }\n\n const targetAddressSpace = getControlPlaneTargetAddressSpace(urlStr);\n const fetchOptions: any = {\n method: \"GET\",\n cache: \"no-store\",\n mode: \"cors\",\n };\n if (targetAddressSpace) {\n fetchOptions.targetAddressSpace = targetAddressSpace;\n }\n\n try {\n const healthUrl = new URL(\"/api/control/health\", targetUrl).toString();\n let res = await fetch(healthUrl, fetchOptions);\n\n if (res.status === 404) {\n const fallbackUrl = new URL(\n \"/api/control/messages\",\n targetUrl,\n ).toString();\n res = await fetch(fallbackUrl, {\n ...fetchOptions,\n method: \"OPTIONS\",\n });\n }\n\n if (res.ok || res.status === 204 || res.status === 401) {\n return { success: true };\n }\n\n return {\n success: false,\n error: `Server responded with HTTP ${res.status} (${res.statusText || \"Error\"})`,\n };\n } catch (err: any) {\n return {\n success: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n /**\n * Interactive handler to test connection and surface diagnostic modal if needed.\n */\n async testControlPlaneConnection(): Promise<boolean> {\n const root = this.shadowRoot;\n if (!root) {\n return false;\n }\n\n const input = root.querySelector(\n '[data-setting=\"control-plane-url-input\"]',\n ) as HTMLInputElement | null;\n const testBtn = root.querySelector(\n '[data-action=\"test-control-plane-connection\"]',\n ) as HTMLButtonElement | null;\n\n const rawUrl = input?.value.trim() || \"http://127.0.0.1:8888\";\n\n if (testBtn) {\n testBtn.disabled = true;\n testBtn.textContent = \"⏳ Testing...\";\n }\n\n try {\n const result = await this.probeControlPlane(rawUrl);\n\n if (result.success) {\n showSuccess(`Successfully reached Control Plane at ${rawUrl}`, 4000);\n return true;\n }\n\n const errorMsg = result.error || \"Unknown connection error\";\n showError(`Connection test failed: ${errorMsg}`, 6000);\n\n await this.requestAppDialog({\n title: \"Control Plane Connection Failed\",\n message: `Unable to connect to \"${rawUrl}\".\\n\\n• TLS / Certificate: If using HTTPS with a self-signed certificate, ensure the certificate is installed and trusted in Chrome (chrome://certificate-manager/localcerts/usercerts).\\n• Chrome Permissions: In Site Settings, ensure \"Local network access\" is allowed.\\n• Server Status: Verify the ShadowClaw dev server is running and listening on this host/port.`,\n confirmLabel: \"OK\",\n });\n\n return false;\n } finally {\n if (testBtn) {\n testBtn.disabled = false;\n testBtn.textContent = \"🔌 Test Connection\";\n }\n }\n }\n\n async saveControlPlaneTransport() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const select = root.querySelector(\n '[data-setting=\"control-plane-transport-select\"]',\n ) as HTMLSelectElement | null;\n if (!select) {\n return;\n }\n\n const transport = select.value === \"websocket\" ? \"websocket\" : \"sse\";\n\n try {\n await setConfig(this.db, CONFIG_KEYS.CONTROL_PLANE_TRANSPORT, transport);\n if (typeof localStorage !== \"undefined\") {\n try {\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_TRANSPORT, transport);\n } catch (_) {}\n }\n\n const {\n isControlPlaneEnabled,\n createDefaultControlPlaneClient,\n shouldConnectControlPlane,\n } = await import(\"../../../core/utils/initControlPlane.js\");\n\n if (\n (await isControlPlaneEnabled(this.db)) &&\n shouldConnectControlPlane()\n ) {\n createDefaultControlPlaneClient({\n orchestrator: this.orchestrator || undefined,\n transport,\n });\n }\n\n showSuccess(\n `Control Plane transport saved: ${transport.toUpperCase()}`,\n 3000,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Control Plane transport: \" + errorMsg, 6000);\n }\n }\n\n async saveControlPlaneUrl() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"control-plane-url-input\"]',\n ) as HTMLInputElement | null;\n if (!input) {\n return;\n }\n\n const url = input.value.trim();\n\n try {\n // Trigger probe within user gesture to elicit Chrome LNA prompt if needed\n if (url) {\n void this.probeControlPlane(url);\n }\n\n await setConfig(this.db, CONFIG_KEYS.CONTROL_PLANE_URL, url);\n if (typeof localStorage !== \"undefined\") {\n try {\n if (url) {\n localStorage.setItem(CONFIG_KEYS.CONTROL_PLANE_URL, url);\n } else {\n localStorage.removeItem(CONFIG_KEYS.CONTROL_PLANE_URL);\n }\n } catch (_) {}\n }\n\n const {\n isControlPlaneEnabled,\n createDefaultControlPlaneClient,\n shouldConnectControlPlane,\n } = await import(\"../../../core/utils/initControlPlane.js\");\n\n if (\n (await isControlPlaneEnabled(this.db)) &&\n shouldConnectControlPlane()\n ) {\n createDefaultControlPlaneClient({\n orchestrator: this.orchestrator || undefined,\n });\n }\n\n showSuccess(\n url\n ? `Control Plane URL saved: ${url}`\n : \"Control Plane URL reset to default\",\n 3000,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Control Plane URL: \" + errorMsg, 6000);\n }\n }\n\n async saveControlPlaneEnabled(enabled: boolean) {\n if (!this.db) {\n return;\n }\n\n try {\n if (enabled) {\n const storedUrl =\n (await getConfig(this.db, CONFIG_KEYS.CONTROL_PLANE_URL)) ||\n \"http://127.0.0.1:8888\";\n void this.probeControlPlane(storedUrl);\n }\n\n await setConfig(\n this.db,\n CONFIG_KEYS.CONTROL_PLANE_ENABLED,\n enabled ? \"true\" : \"false\",\n );\n if (typeof localStorage !== \"undefined\") {\n try {\n localStorage.setItem(\n CONFIG_KEYS.CONTROL_PLANE_ENABLED,\n enabled ? \"true\" : \"false\",\n );\n } catch (_) {}\n }\n\n const {\n createDefaultControlPlaneClient,\n stopControlPlaneClient,\n shouldConnectControlPlane,\n } = await import(\"../../../core/utils/initControlPlane.js\");\n\n if (enabled) {\n if (shouldConnectControlPlane()) {\n createDefaultControlPlaneClient({\n orchestrator: this.orchestrator || undefined,\n });\n }\n showSuccess(\"Control plane client enabled and connected\", 3000);\n } else {\n stopControlPlaneClient();\n showSuccess(\"Control plane client disabled\", 3000);\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Control Plane setting: \" + errorMsg, 6000);\n }\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawControlPlane);\n}\n"],"mappings":"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"}
@@ -2,11 +2,12 @@ import ShadowClawElement from "./components/shadow-claw-element.js";
2
2
  import { n as getDb } from "./txPromise-CuGh-TGK.js";
3
3
  import { r as CONFIG_KEYS } from "./config--CFrw3J3.js";
4
4
  import { t as getConfig } from "./getConfig-BxxXMyuM.js";
5
- import { G as getProviderRuntimeHeaders, H as getAvailableProviders, ln as toolsStore, t as orchestratorStore, un as loadDeclarativeTools } from "./orchestrator-DCfomsn9.js";
5
+ import { i as loadDeclarativeTools, t as toolsStore } from "./tools-DwwB9RBa.js";
6
+ import { G as getProviderRuntimeHeaders, H as getAvailableProviders, t as orchestratorStore } from "./orchestrator-KRjx0eba.js";
6
7
  import { t as setConfig } from "./setConfig-BFED5CXn.js";
7
8
  import { t as TOOL_DEFINITIONS } from "./tools-DBaMRiEu.js";
8
9
  import "./tools-D4Pp-nUw.js";
9
- import { n as setSanitizedHtml } from "./trusted-types-CkLDpLiZ.js";
10
+ import { n as setSanitizedHtml } from "./trusted-types-Dx0RZlrd.js";
10
11
  import { t as effect } from "./effect-DL6j9HJp.js";
11
12
  import "./components/shadow-claw-dialog.js";
12
13
  import "./shadow-claw-provider-model-picker-CsA-507a.js";
@@ -1862,4 +1863,4 @@ customElements.define("shadow-claw-conversations", ShadowClawConversations);
1862
1863
 
1863
1864
  //#endregion
1864
1865
  export { ShadowClawConversations as t };
1865
- //# sourceMappingURL=shadow-claw-conversations-Ct1kAYdB.js.map
1866
+ //# sourceMappingURL=shadow-claw-conversations-BwXep3iu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-claw-conversations-Ct1kAYdB.js","names":["shadowClawConversationsStyles","shadowClawConversationsTemplate"],"sources":["../../src/components/shadow-claw-conversations/shadow-claw-conversations.ts"],"sourcesContent":["import { CONFIG_KEYS } from \"../../config/config.js\";\nimport { effect } from \"../../core/effect.js\";\n\nimport {\n getAvailableProviders,\n getProviderRuntimeHeaders,\n} from \"../../core/orchestrator/utils/operations/provider.js\";\n\nimport { getDb, ShadowClawDatabase } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/getConfig.js\";\nimport { setConfig } from \"../../db/setConfig.js\";\nimport { setSanitizedHtml } from \"../../security/trusted-types.js\";\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport { toolsStore } from \"../../stores/tools.js\";\nimport { ChannelRegistry } from \"../../subsystems/channels/channel-registry.js\";\nimport { loadDeclarativeTools } from \"../../subsystems/tools/declarative.js\";\nimport { TOOL_DEFINITIONS } from \"../../subsystems/tools/tools.js\";\n\nimport type { LLMProvider } from \"../../subsystems/providers/types.js\";\n\nimport type {\n ProviderModelItem,\n ShadowClawProviderModelPicker,\n} from \"../common/shadow-claw-provider-model-picker/shadow-claw-provider-model-picker.js\";\n\nimport type {\n ProviderRuntimeOverrides,\n ShadowClawProviderModuleSettings,\n} from \"../common/shadow-claw-provider-module-settings/shadow-claw-provider-module-settings.js\";\n\nimport \"../common/shadow-claw-provider-model-picker/shadow-claw-provider-model-picker.js\";\nimport \"../common/shadow-claw-provider-module-settings/shadow-claw-provider-module-settings.js\";\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawConversationsStyles from \"./shadow-claw-conversations.css\" with { type: \"css\" };\nimport shadowClawConversationsTemplate from \"./shadow-claw-conversations.html\" with { type: \"html\" };\n\nexport class ShadowClawConversations extends ShadowClawElement {\n static styles = shadowClawConversationsStyles;\n static template = shadowClawConversationsTemplate;\n\n public channelRegistry: ChannelRegistry | null = null;\n public db: ShadowClawDatabase | null = null;\n private _autoScrollActive = false;\n private _autoScrollSpeed = 0;\n\n private _draggedGroupId: string | null = null;\n private _effectCleanup: (() => void) | null = null;\n private _keyboardGrabbedId: string | null = null;\n private _pendingCloneGroupId: string | null = null;\n private _pendingDeleteGroupId: string | null = null;\n private _pendingDetailsPinnedMaxTokens: number | null = null;\n private _pendingDetailsPinnedModel: string | null = null;\n private _pendingDetailsPinnedProvider: string | null = null;\n private _pendingDetailsProviderRuntimeOverrides: ProviderRuntimeOverrides =\n {};\n private _pendingDetailsSubagentMaxTokens: number | null = null;\n private _pendingDetailsSubagentMode: \"automatic\" | \"manual\" = \"automatic\";\n private _pendingDetailsSubagentModel: string | null = null;\n private _pendingDetailsSubagentProvider: string | null = null;\n private _pendingDetailsToolTags: string[] | null = null;\n private _pendingRenameGroupId: string | null = null;\n private _pendingRenameName: string | null = null;\n private _touchDraggedGroupId: string | null = null;\n private _touchId: number | null = null;\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\n // Restore persisted height\n const saved = await getConfig(this.db, CONFIG_KEYS.CONVERSATIONS_HEIGHT);\n if (saved && typeof saved === \"number\" && saved > 0) {\n this.style.flex = \"none\";\n this.style.height = `${saved}px`;\n }\n\n this.channelRegistry =\n orchestratorStore.orchestrator?.channelRegistry || null;\n\n (this.shadowRoot as ShadowRoot)\n .querySelector(\"[data-action='create']\")\n ?.addEventListener(\"click\", () => this.handleCreate());\n\n // Dialog event listeners\n this._setupDialogListeners();\n\n this._initResizeHandle();\n\n // Global dragover auto-scroll listener on shadowRoot\n root.addEventListener(\"dragover\", (e: any) => {\n if (this._draggedGroupId !== null) {\n this._updateAutoScrollSpeed(e.clientY);\n }\n });\n\n // Ensure we stop scrolling if the drag ends or leaves\n root.addEventListener(\"dragend\", () => {\n this._stopAutoScroll();\n });\n root.addEventListener(\"drop\", () => {\n this._stopAutoScroll();\n });\n\n this.render();\n\n // Re-render when store state changes\n this._effectCleanup = effect(() => {\n // Access signals to establish tracking\n orchestratorStore.groups;\n orchestratorStore.activeGroupId;\n orchestratorStore.unreadGroupIds;\n\n this.render();\n });\n }\n\n disconnectedCallback() {\n if (this._effectCleanup) {\n this._effectCleanup();\n this._effectCleanup = null;\n }\n }\n\n getChannelRegistry(): ChannelRegistry | null {\n const current = orchestratorStore.orchestrator?.channelRegistry || null;\n if (current) {\n this.channelRegistry = current;\n }\n\n return this.channelRegistry;\n }\n\n openCloneDialog(name: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__clone-dialog\",\n ) as HTMLDialogElement | null;\n const nameSpan = dialog?.querySelector(\".conversations__clone-name\");\n\n if (!dialog) {\n return;\n }\n\n if (nameSpan) {\n nameSpan.textContent = name;\n }\n\n dialog.showModal();\n }\n\n openCreateDialog() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__create-dialog\",\n ) as HTMLDialogElement | null;\n const input = root.querySelector(\n \".conversations__create-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n\n if (!dialog) {\n return;\n }\n\n dialog.showModal();\n\n if (input) {\n input.value = \"\";\n input.focus();\n }\n }\n\n openDeleteDialog(name: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__delete-dialog\",\n ) as HTMLDialogElement | null;\n const nameSpan = dialog?.querySelector(\".conversations__delete-name\");\n const cancelBtn = dialog?.querySelector(\n \".conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n if (!dialog) {\n return;\n }\n\n if (nameSpan) {\n nameSpan.textContent = name;\n }\n\n dialog.showModal();\n cancelBtn?.focus();\n }\n\n openDetailsDialog(currentName: string, groupId?: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__details-dialog\",\n ) as HTMLDialogElement | null;\n const input = root.querySelector(\n \".conversations__details-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n const groupIdInput = root.querySelector(\n \"#conversations-details-group-id\",\n ) as HTMLInputElement | null;\n const copyBtn = root.querySelector(\n \"#conversations-group-id-copy-btn\",\n ) as HTMLButtonElement | null;\n const toolsContainer = root.querySelector(\n \"#conversations-details-tools\",\n ) as HTMLElement | null;\n const toolInput = root.querySelector(\n \"#conversations-tool-input\",\n ) as HTMLInputElement | null;\n const toolAddBtn = root.querySelector(\n \"#conversations-add-tool-btn\",\n ) as HTMLButtonElement | null;\n const datalist = root.querySelector(\n \"#conversations-available-tools\",\n ) as HTMLDataListElement | null;\n const mainPicker = root.querySelector(\n \"#conversations-main-picker\",\n ) as ShadowClawProviderModelPicker | null;\n const mainProviderModuleSettings = root.querySelector(\n \"#conversations-main-provider-module-settings\",\n ) as ShadowClawProviderModuleSettings | null;\n const agentMaxTokensInput = root.querySelector(\n \"#conversations-agent-max-tokens\",\n ) as HTMLInputElement | null;\n const subagentSettingsContainer = root.querySelector(\n \"#conversations-subagent-settings-container\",\n ) as HTMLElement | null;\n const subagentModeSelect = root.querySelector(\n \"#conversations-subagent-mode\",\n ) as HTMLSelectElement | null;\n const subagentMaxTokensInput = root.querySelector(\n \"#conversations-subagent-max-tokens\",\n ) as HTMLInputElement | null;\n const subagentManualContainer = root.querySelector(\n \"#conversations-subagent-manual-container\",\n ) as HTMLElement | null;\n const subagentPicker = root.querySelector(\n \"#conversations-subagent-picker\",\n ) as ShadowClawProviderModelPicker | null;\n const subagentProviderModuleSettings = root.querySelector(\n \"#conversations-subagent-provider-module-settings\",\n ) as ShadowClawProviderModuleSettings | null;\n\n // Populate Group ID field\n if (groupIdInput) {\n groupIdInput.value = groupId?.replace(\":\", \"-\") || \"\";\n }\n\n // Wire up copy button\n if (copyBtn && groupIdInput) {\n // Clone to remove previous listeners\n const freshCopyBtn = copyBtn.cloneNode(true) as HTMLButtonElement;\n copyBtn.replaceWith(freshCopyBtn);\n\n freshCopyBtn.addEventListener(\"click\", async () => {\n const val = groupIdInput.value;\n if (!val) {\n return;\n }\n\n try {\n await navigator.clipboard.writeText(val);\n // Swap to a checkmark briefly\n const originalInner = freshCopyBtn.innerHTML;\n setSanitizedHtml(\n freshCopyBtn,\n `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\"/></svg>`,\n );\n freshCopyBtn.classList.add(\n \"conversations__group-id-copy-btn--copied\",\n );\n setTimeout(() => {\n setSanitizedHtml(freshCopyBtn, originalInner);\n freshCopyBtn.classList.remove(\n \"conversations__group-id-copy-btn--copied\",\n );\n }, 1500);\n } catch {\n // Fallback: select the text\n groupIdInput.select();\n }\n });\n }\n\n const participantsContainer = root.querySelector(\n \"#conversations-details-participants-container\",\n ) as HTMLElement | null;\n const participantsList = root.querySelector(\n \"#conversations-details-participants-list\",\n ) as HTMLElement | null;\n\n if (participantsContainer && participantsList) {\n if (groupId && groupId.startsWith(\"peer:\")) {\n participantsContainer.style.display = \"block\";\n participantsList.replaceChildren();\n\n const orchestrator = orchestratorStore.orchestrator;\n if (orchestrator) {\n const connectedPeers =\n orchestrator.peerjs?.connectedPeersSignal?.get() || [];\n const targetPeer = groupId.replace(\"peer:\", \"\");\n\n if (connectedPeers.includes(targetPeer)) {\n let alias = \"\";\n if (orchestrator.peerjsPeerAliases) {\n for (const [a, id] of Object.entries(\n orchestrator.peerjsPeerAliases,\n )) {\n if (id === targetPeer) {\n alias = a;\n\n break;\n }\n }\n }\n\n const displayName = alias\n ? `${alias} (${targetPeer.substring(0, 8)})`\n : targetPeer;\n\n const row = document.createElement(\"div\");\n row.className = \"conversations__group-id-row\";\n\n const input = document.createElement(\"input\");\n input.className =\n \"conversations__input conversations__group-id-input\";\n input.type = \"text\";\n input.readOnly = true;\n input.value = displayName;\n input.style.marginBottom = \"0\";\n\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"conversations__group-id-copy-btn\";\n btn.title = \"Copy Peer ID\";\n btn.setAttribute(\"aria-label\", \"Copy Peer ID to clipboard\");\n btn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M360-240q-33 0-56.5-23.5T280-320v-480q0-33 23.5-56.5T360-880h360q33 0 56.5 23.5T800-800v480q0 33-23.5 56.5T720-240H360Zm0-80h360v-480H360v480ZM200-80q-33 0-56.5-23.5T120-160v-560h80v560h440v80H200Zm160-240v-480 480Z\"/></svg>`;\n\n btn.addEventListener(\"click\", async () => {\n try {\n await navigator.clipboard.writeText(targetPeer);\n const originalInner = btn.innerHTML;\n btn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\"/></svg>`;\n btn.classList.add(\"conversations__group-id-copy-btn--copied\");\n setTimeout(() => {\n btn.innerHTML = originalInner;\n btn.classList.remove(\n \"conversations__group-id-copy-btn--copied\",\n );\n }, 1500);\n } catch {\n input.value = targetPeer;\n input.select();\n }\n });\n\n row.appendChild(input);\n row.appendChild(btn);\n participantsList.appendChild(row);\n } else {\n const noPeers = document.createElement(\"div\");\n noPeers.style.fontSize = \"0.875rem\";\n noPeers.style.color = \"var(--text-secondary)\";\n noPeers.textContent = \"Peer is not currently connected.\";\n participantsList.appendChild(noPeers);\n }\n }\n } else {\n participantsContainer.style.display = \"none\";\n }\n }\n\n if (!dialog) {\n return;\n }\n\n dialog.showModal();\n\n const candidateToolsMap = new Map<\n string,\n { name: string; description?: string }\n >();\n for (const tool of TOOL_DEFINITIONS) {\n candidateToolsMap.set(tool.name, tool);\n }\n for (const tool of toolsStore.allTools) {\n if (!candidateToolsMap.has(tool.name)) {\n candidateToolsMap.set(tool.name, tool);\n }\n }\n\n const updateDatalist = () => {\n if (!datalist) {\n return;\n }\n\n const pinned = new Set(this._pendingDetailsToolTags || []);\n datalist.replaceChildren();\n for (const tool of candidateToolsMap.values()) {\n if (pinned.has(tool.name)) {\n continue;\n }\n\n const option = document.createElement(\"option\");\n option.value = tool.name;\n datalist.appendChild(option);\n }\n };\n\n if (this.db && groupId) {\n loadDeclarativeTools(this.db, groupId)\n .then(({ tools: declTools }) => {\n let added = false;\n for (const tool of declTools) {\n if (!candidateToolsMap.has(tool.name)) {\n candidateToolsMap.set(tool.name, tool);\n added = true;\n }\n }\n if (added) {\n updateDatalist();\n }\n })\n .catch(() => {});\n }\n\n const renderChips = () => {\n if (!toolsContainer) {\n return;\n }\n\n toolsContainer.replaceChildren();\n\n const tags = this._pendingDetailsToolTags || [];\n for (const tagName of tags) {\n const tool = candidateToolsMap.get(tagName);\n const chip = document.createElement(\"span\");\n chip.className = \"conversations__tool-chip\";\n\n const nameSpan = document.createElement(\"span\");\n nameSpan.textContent = tagName;\n if (tool?.description) {\n nameSpan.title = tool.description;\n }\n\n chip.appendChild(nameSpan);\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"conversations__tool-chip-remove\";\n removeBtn.textContent = \"×\";\n removeBtn.setAttribute(\"aria-label\", `Remove tool ${tagName}`);\n\n removeBtn.addEventListener(\"click\", () => {\n if (!this._pendingDetailsToolTags) {\n return;\n }\n\n this._pendingDetailsToolTags = this._pendingDetailsToolTags.filter(\n (t) => t !== tagName,\n );\n renderChips();\n });\n\n chip.appendChild(removeBtn);\n toolsContainer.appendChild(chip);\n }\n\n updateDatalist();\n\n if (subagentSettingsContainer && subagentModeSelect) {\n const showSubagentSettings =\n this._isSpawnSubagentEnabledInCurrentScope();\n subagentSettingsContainer.style.display = showSubagentSettings\n ? \"flex\"\n : \"none\";\n if (!showSubagentSettings) {\n this._pendingDetailsSubagentMode = \"automatic\";\n }\n\n if (subagentManualContainer) {\n subagentManualContainer.style.display =\n this._pendingDetailsSubagentMode === \"manual\" &&\n showSubagentSettings\n ? \"flex\"\n : \"none\";\n }\n\n if (subagentMaxTokensInput) {\n subagentMaxTokensInput.value =\n typeof this._pendingDetailsSubagentMaxTokens === \"number\" &&\n Number.isFinite(this._pendingDetailsSubagentMaxTokens) &&\n this._pendingDetailsSubagentMaxTokens > 0\n ? String(Math.floor(this._pendingDetailsSubagentMaxTokens))\n : \"\";\n }\n }\n };\n\n if (toolAddBtn && toolInput) {\n toolAddBtn.onclick = () => {\n const val = toolInput.value.trim();\n if (!val) {\n return;\n }\n\n const isValidName = /^[a-z][a-z0-9_]{0,63}$/.test(val);\n const tool = candidateToolsMap.get(val);\n if (!tool && !isValidName) {\n toolInput.value = \"\";\n\n return;\n }\n\n if (!this._pendingDetailsToolTags) {\n this._pendingDetailsToolTags = [];\n }\n\n if (!this._pendingDetailsToolTags.includes(val)) {\n this._pendingDetailsToolTags.push(val);\n renderChips();\n }\n\n toolInput.value = \"\";\n };\n\n toolInput.onkeydown = (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n toolAddBtn.click();\n }\n };\n }\n\n renderChips();\n\n if (\n mainPicker &&\n mainProviderModuleSettings &&\n subagentModeSelect &&\n subagentSettingsContainer &&\n subagentManualContainer &&\n subagentPicker &&\n subagentProviderModuleSettings\n ) {\n const providers = (getAvailableProviders() as LLMProvider[]) || [];\n\n mainPicker.setLabels({\n providerLabel: \"Pinned Provider\",\n defaultProviderLabel: \"Default (Global)\",\n modelLabel: \"Pinned Model\",\n defaultModelLabel: \"Default Model\",\n customModelPlaceholder: \"Custom model id\",\n });\n\n mainPicker.setModelLoader((provider) =>\n this._loadProviderModels(provider),\n );\n mainPicker.setProviders(providers);\n mainPicker.setValue({\n providerId: this._pendingDetailsPinnedProvider,\n modelId: this._pendingDetailsPinnedModel,\n });\n\n mainProviderModuleSettings.setProvider(\n this._pendingDetailsPinnedProvider,\n );\n if (agentMaxTokensInput) {\n agentMaxTokensInput.value =\n typeof this._pendingDetailsPinnedMaxTokens === \"number\" &&\n Number.isFinite(this._pendingDetailsPinnedMaxTokens) &&\n this._pendingDetailsPinnedMaxTokens > 0\n ? String(Math.floor(this._pendingDetailsPinnedMaxTokens))\n : \"\";\n }\n mainProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n\n subagentPicker.setLabels({\n providerLabel: \"Pinned Subagent Provider\",\n defaultProviderLabel: \"Default (Parent Provider)\",\n modelLabel: \"Pinned Subagent Model\",\n defaultModelLabel: \"Default Model\",\n customModelPlaceholder: \"Custom subagent model id\",\n });\n\n subagentPicker.setModelLoader((provider) =>\n this._loadProviderModels(provider),\n );\n subagentPicker.setProviders(providers);\n subagentPicker.setValue({\n providerId: this._pendingDetailsSubagentProvider,\n modelId: this._pendingDetailsSubagentModel,\n });\n\n subagentProviderModuleSettings.setProvider(\n this._pendingDetailsSubagentProvider,\n );\n\n subagentProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n\n if (!mainPicker.hasAttribute(\"data-bound\")) {\n mainPicker.addEventListener(\"provider-model-change\", (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n this._pendingDetailsPinnedProvider = detail.providerId || null;\n this._pendingDetailsPinnedModel = detail.modelId || null;\n\n mainProviderModuleSettings.setProvider(\n this._pendingDetailsPinnedProvider,\n );\n mainProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n });\n\n mainPicker.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!agentMaxTokensInput?.hasAttribute(\"data-bound\")) {\n agentMaxTokensInput?.addEventListener(\"input\", () => {\n const value = Number(agentMaxTokensInput.value);\n if (Number.isFinite(value) && value > 0) {\n this._pendingDetailsPinnedMaxTokens = Math.floor(value);\n } else {\n this._pendingDetailsPinnedMaxTokens = null;\n }\n });\n\n agentMaxTokensInput?.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!mainProviderModuleSettings.hasAttribute(\"data-bound\")) {\n mainProviderModuleSettings.addEventListener(\n \"provider-module-settings-change\",\n (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n const providerId = detail.providerId as string | undefined;\n const overrides = detail.overrides as ProviderRuntimeOverrides;\n if (!providerId) {\n return;\n }\n\n const next = JSON.parse(\n JSON.stringify(\n this._pendingDetailsProviderRuntimeOverrides || {},\n ),\n ) as ProviderRuntimeOverrides;\n\n if (providerId === \"llamafile\") {\n next.llamafile = overrides.llamafile;\n } else if (providerId === \"bedrock_proxy\") {\n next.bedrock_proxy = overrides.bedrock_proxy;\n }\n\n this._pendingDetailsProviderRuntimeOverrides = next;\n mainPicker.invalidateProviderModels(providerId);\n subagentPicker.invalidateProviderModels(providerId);\n },\n );\n\n mainProviderModuleSettings.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!subagentPicker.hasAttribute(\"data-bound\")) {\n subagentPicker.addEventListener(\"provider-model-change\", (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n this._pendingDetailsSubagentProvider = detail.providerId || null;\n this._pendingDetailsSubagentModel = detail.modelId || null;\n subagentProviderModuleSettings.setProvider(\n this._pendingDetailsSubagentProvider,\n );\n\n subagentProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n });\n subagentPicker.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!subagentProviderModuleSettings.hasAttribute(\"data-bound\")) {\n subagentProviderModuleSettings.addEventListener(\n \"provider-module-settings-change\",\n (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n const providerId = detail.providerId as string | undefined;\n const overrides = detail.overrides as ProviderRuntimeOverrides;\n if (!providerId) {\n return;\n }\n\n const next = JSON.parse(\n JSON.stringify(\n this._pendingDetailsProviderRuntimeOverrides || {},\n ),\n ) as ProviderRuntimeOverrides;\n\n if (providerId === \"llamafile\") {\n next.llamafile = overrides.llamafile;\n } else if (providerId === \"bedrock_proxy\") {\n next.bedrock_proxy = overrides.bedrock_proxy;\n }\n\n this._pendingDetailsProviderRuntimeOverrides = next;\n mainPicker.invalidateProviderModels(providerId);\n subagentPicker.invalidateProviderModels(providerId);\n },\n );\n\n subagentProviderModuleSettings.setAttribute(\"data-bound\", \"true\");\n }\n\n subagentModeSelect.value = this._pendingDetailsSubagentMode;\n\n const showSubagentSettings = this._isSpawnSubagentEnabledInCurrentScope();\n subagentSettingsContainer.style.display = showSubagentSettings\n ? \"flex\"\n : \"none\";\n\n mainProviderModuleSettings.style.display = this\n ._pendingDetailsPinnedProvider\n ? \"flex\"\n : \"none\";\n\n subagentManualContainer.style.display =\n showSubagentSettings && this._pendingDetailsSubagentMode === \"manual\"\n ? \"flex\"\n : \"none\";\n\n subagentProviderModuleSettings.style.display =\n showSubagentSettings &&\n this._pendingDetailsSubagentMode === \"manual\" &&\n !!this._pendingDetailsSubagentProvider\n ? \"flex\"\n : \"none\";\n\n subagentModeSelect.onchange = () => {\n this._pendingDetailsSubagentMode =\n subagentModeSelect.value === \"manual\" ? \"manual\" : \"automatic\";\n\n subagentManualContainer.style.display =\n this._pendingDetailsSubagentMode === \"manual\" &&\n this._isSpawnSubagentEnabledInCurrentScope()\n ? \"flex\"\n : \"none\";\n\n subagentProviderModuleSettings.style.display =\n this._pendingDetailsSubagentMode === \"manual\" &&\n this._isSpawnSubagentEnabledInCurrentScope() &&\n !!this._pendingDetailsSubagentProvider\n ? \"flex\"\n : \"none\";\n };\n\n if (!subagentMaxTokensInput?.hasAttribute(\"data-bound\")) {\n subagentMaxTokensInput?.addEventListener(\"input\", () => {\n const value = Number(subagentMaxTokensInput.value);\n if (Number.isFinite(value) && value > 0) {\n this._pendingDetailsSubagentMaxTokens = Math.floor(value);\n } else {\n this._pendingDetailsSubagentMaxTokens = null;\n }\n });\n\n subagentMaxTokensInput?.setAttribute(\"data-bound\", \"true\");\n }\n }\n\n if (input) {\n input.value = currentName;\n input.select();\n input.focus();\n }\n }\n\n async handleClone(groupId: string) {\n if (!this.db) {\n return;\n }\n\n const groups = orchestratorStore.groups || [];\n const group = groups.find((g) => g.groupId === groupId);\n if (!group) {\n return;\n }\n\n this._pendingCloneGroupId = groupId;\n this.openCloneDialog(group.name);\n }\n\n async handleCreate() {\n if (!this.db) {\n return;\n }\n\n this.openCreateDialog();\n }\n\n async handleDelete(groupId: string, name: string) {\n if (!this.db) {\n return;\n }\n\n this._pendingDeleteGroupId = groupId;\n this.openDeleteDialog(name);\n }\n\n async handleDetails(groupId: string, currentName: string) {\n if (!this.db) {\n return;\n }\n\n this._pendingRenameGroupId = groupId;\n this._pendingRenameName = currentName;\n\n const groups = orchestratorStore.groups || [];\n const group = groups.find((g) => g.groupId === groupId);\n const currentTags = group?.toolTags || [];\n\n this._pendingDetailsToolTags = [...currentTags];\n this._pendingDetailsPinnedMaxTokens =\n typeof group?.pinnedMaxTokens === \"number\" &&\n Number.isFinite(group.pinnedMaxTokens) &&\n group.pinnedMaxTokens > 0\n ? Math.floor(group.pinnedMaxTokens)\n : null;\n this._pendingDetailsPinnedProvider = group?.pinnedProvider || null;\n this._pendingDetailsPinnedModel = group?.pinnedModel || null;\n this._pendingDetailsProviderRuntimeOverrides = JSON.parse(\n JSON.stringify(group?.providerRuntimeOverrides || {}),\n );\n this._pendingDetailsSubagentMode =\n group?.subagentModelSelectionMode === \"manual\" ? \"manual\" : \"automatic\";\n this._pendingDetailsSubagentMaxTokens =\n typeof group?.subagentMaxTokens === \"number\" &&\n Number.isFinite(group.subagentMaxTokens) &&\n group.subagentMaxTokens > 0\n ? Math.floor(group.subagentMaxTokens)\n : null;\n this._pendingDetailsSubagentProvider =\n group?.subagentPinnedProvider || null;\n this._pendingDetailsSubagentModel = group?.subagentPinnedModel || null;\n this.openDetailsDialog(currentName, groupId);\n }\n\n /**\n * Reorder: move draggedId to the position of targetId,\n * or apply a pre-computed order array.\n */\n async handleReorder(\n draggedId: string,\n targetId: string,\n precomputedIds?: string[],\n ) {\n if (!this.db) {\n return;\n }\n\n if (precomputedIds) {\n await orchestratorStore.reorderConversations(this.db, precomputedIds);\n\n return;\n }\n\n const groups = orchestratorStore.groups || [];\n const ids = groups.map((g) => g.groupId);\n const fromIdx = ids.indexOf(draggedId);\n const toIdx = ids.indexOf(targetId);\n\n if (fromIdx < 0 || toIdx < 0) {\n return;\n }\n\n ids.splice(fromIdx, 1);\n ids.splice(toIdx, 0, draggedId);\n\n await orchestratorStore.reorderConversations(this.db, ids);\n }\n\n async handleSwitch(groupId: string) {\n if (groupId === orchestratorStore.activeGroupId) {\n return;\n }\n\n // Derive the appropriate sidebar page from the current active page.\n // \"pages\" is excluded as a fallback because its route omits groupId\n // when no workspace path is present, so it can't represent a switch.\n const rawPage = orchestratorStore.activePage;\n const fallbackPage = orchestratorStore.sidebarDefaultPage;\n const page =\n rawPage === \"chat\" || rawPage === \"tasks\" || rawPage === \"files\"\n ? rawPage\n : fallbackPage === \"tasks\" || fallbackPage === \"files\"\n ? fallbackPage\n : \"chat\";\n\n // Dispatch a navigate event so the URL updates to /page/groupId and\n // the router calls applyRoute, which handles switchConversation.\n document.dispatchEvent(\n new CustomEvent(\"shadow-claw-navigate\", {\n detail: { page, groupId },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n async render() {\n const list = (this.shadowRoot as ShadowRoot).querySelector(\n \".conversation-list\",\n );\n\n if (!list) {\n return;\n }\n\n const groups = orchestratorStore.groups || [];\n const activeId = orchestratorStore.activeGroupId;\n const unreadIds = orchestratorStore.unreadGroupIds || new Set();\n const channelRegistry = this.getChannelRegistry();\n\n list.replaceChildren();\n\n for (let i = 0; i < groups.length; i++) {\n const group = groups[i];\n const isActive = group.groupId === activeId;\n const isUnread = !isActive && unreadIds.has(group.groupId);\n const li = document.createElement(\"li\");\n\n li.className = `conversation-item${isActive ? \" active\" : \"\"}${isUnread ? \" unread\" : \"\"}`;\n li.setAttribute(\"data-group-id\", group.groupId);\n li.setAttribute(\"role\", \"listitem\");\n li.setAttribute(\"tabindex\", \"0\");\n li.setAttribute(\"aria-describedby\", \"reorder-instructions\");\n li.setAttribute(\n \"aria-label\",\n `${group.name}, position ${i + 1} of ${groups.length}`,\n );\n\n if (this._keyboardGrabbedId === group.groupId) {\n li.classList.add(\"keyboard-grabbed\");\n\n li.setAttribute(\"aria-grabbed\", \"true\");\n }\n\n const badge = channelRegistry\n ? channelRegistry.getBadge(group.groupId)\n : \"\";\n\n const canDelete = groups.length > 1;\n\n const handle = document.createElement(\"span\");\n handle.className = \"drag-handle\";\n handle.setAttribute(\"draggable\", \"true\");\n handle.setAttribute(\"aria-hidden\", \"true\");\n handle.setAttribute(\"title\", \"Drag to reorder\");\n handle.textContent = \"⠿\";\n\n li.append(handle);\n\n if (badge) {\n const badgeEl = document.createElement(\"span\");\n badgeEl.className = \"channel-badge\";\n badgeEl.textContent = badge;\n li.append(badgeEl);\n }\n\n if (group.toolTags && group.toolTags.length > 0) {\n const toolBadgeEl = document.createElement(\"span\");\n toolBadgeEl.className = \"tool-badge\";\n toolBadgeEl.textContent = \"🔧\";\n toolBadgeEl.title = `Pinned Tools: ${group.toolTags.join(\", \")}`;\n li.append(toolBadgeEl);\n }\n\n const nameEl = document.createElement(\"span\");\n nameEl.className = \"conversation-name\";\n nameEl.textContent = group.name;\n\n const actionsEl = document.createElement(\"span\");\n actionsEl.className = \"conversation-actions\";\n\n const cloneBtn = document.createElement(\"button\");\n cloneBtn.setAttribute(\"data-action\", \"clone\");\n cloneBtn.setAttribute(\"title\", \"Clone\");\n cloneBtn.setAttribute(\"aria-label\", `Clone ${group.name}`);\n cloneBtn.textContent = \"📋\";\n\n const detailsBtn = document.createElement(\"button\");\n detailsBtn.setAttribute(\"data-action\", \"details\");\n detailsBtn.setAttribute(\"title\", \"Details\");\n detailsBtn.setAttribute(\"aria-label\", `Details for ${group.name}`);\n detailsBtn.textContent = \"⚙️\";\n\n actionsEl.append(cloneBtn, detailsBtn);\n\n if (canDelete) {\n const deleteBtn = document.createElement(\"button\");\n deleteBtn.setAttribute(\"data-action\", \"delete\");\n deleteBtn.setAttribute(\"title\", \"Delete\");\n deleteBtn.setAttribute(\"aria-label\", `Delete ${group.name}`);\n deleteBtn.textContent = \"🗑️\";\n actionsEl.append(deleteBtn);\n }\n\n const actionsToggleBtn = document.createElement(\"button\");\n actionsToggleBtn.className = \"conversation-actions-toggle\";\n actionsToggleBtn.setAttribute(\"title\", \"More actions\");\n actionsToggleBtn.setAttribute(\n \"aria-label\",\n `More actions for ${group.name}`,\n );\n actionsToggleBtn.textContent = \"⋮\";\n\n li.append(nameEl, actionsEl, actionsToggleBtn);\n\n li.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement;\n const action = target\n .closest(\"[data-action]\")\n ?.getAttribute(\"data-action\");\n\n if (action === \"clone\") {\n this.handleClone(group.groupId);\n } else if (action === \"details\") {\n this.handleDetails(group.groupId, group.name);\n } else if (action === \"delete\") {\n this.handleDelete(group.groupId, group.name);\n } else if (target.closest(\".conversation-actions-toggle\")) {\n li.classList.toggle(\"show-actions\");\n } else if (!target.closest(\".drag-handle\")) {\n this.handleSwitch(group.groupId);\n li.classList.remove(\"show-actions\");\n }\n });\n\n li.addEventListener(\"keydown\", (e) => {\n this._handleKeyboard(e, group.groupId, group.name);\n });\n\n handle.addEventListener(\"dragstart\", (e) => {\n this._draggedGroupId = group.groupId;\n\n li.classList.add(\"dragging\");\n\n (e as DragEvent).dataTransfer?.setData(\"text/plain\", group.groupId);\n });\n\n handle.addEventListener(\"dragend\", () => {\n li.classList.remove(\"dragging\");\n\n this._draggedGroupId = null;\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n });\n\n handle.addEventListener(\n \"touchstart\",\n (e) => {\n const touch = (e as TouchEvent).touches[0];\n if (!touch) {\n return;\n }\n\n this._touchId = touch.identifier;\n this._touchDraggedGroupId = group.groupId;\n\n li.classList.add(\"dragging\");\n\n e.preventDefault();\n },\n { passive: false },\n );\n\n li.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n\n if (this._draggedGroupId && this._draggedGroupId !== group.groupId) {\n li.classList.add(\"drag-over\");\n }\n });\n\n li.addEventListener(\"dragleave\", () => {\n li.classList.remove(\"drag-over\");\n });\n\n li.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n\n li.classList.remove(\"drag-over\");\n\n if (this._draggedGroupId && this._draggedGroupId !== group.groupId) {\n this.handleReorder(this._draggedGroupId, group.groupId);\n }\n });\n\n list.appendChild(li);\n }\n\n this._bindTouchListEvents(list);\n }\n\n _announce(message: string) {\n const region = this.shadowRoot?.querySelector(\"#live-region\");\n\n if (region) {\n region.textContent = \"\";\n\n // Force re-announcement by toggling content in the next frame\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n }\n }\n\n /**\n * Bind touch move/end on the list for cross-item dragging.\n */\n _bindTouchListEvents(list: Element) {\n // Remove old listeners by replacing with clone if needed; simpler: use a flag\n if ((list as any)._touchBound) {\n return;\n }\n\n (list as any)._touchBound = true;\n\n list.addEventListener(\n \"touchmove\",\n (e) => {\n if (this._touchDraggedGroupId === null) {\n return;\n }\n\n const touch = this._findTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n e.preventDefault();\n\n // Find which item is under the touch point\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (\n target &&\n target.getAttribute(\"data-group-id\") !== this._touchDraggedGroupId\n ) {\n target.classList.add(\"drag-over\");\n }\n\n this._updateAutoScrollSpeed(touch.clientY);\n },\n { passive: false },\n );\n\n list.addEventListener(\"touchend\", (e) => {\n if (this._touchDraggedGroupId === null) {\n return;\n }\n\n const touch = this._findChangedTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n const targetId = target?.getAttribute(\"data-group-id\");\n\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (targetId && targetId !== this._touchDraggedGroupId) {\n this.handleReorder(this._touchDraggedGroupId, targetId);\n }\n\n this._stopAutoScroll();\n this._touchDraggedGroupId = null;\n this._touchId = null;\n });\n\n list.addEventListener(\"touchcancel\", () => {\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n this._stopAutoScroll();\n this._touchDraggedGroupId = null;\n this._touchId = null;\n });\n }\n\n _findChangedTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.changedTouches.length; i++) {\n const t = e.changedTouches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _findTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.touches.length; i++) {\n const t = e.touches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _focusNext(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll('li[tabindex=\"0\"], button:not([disabled])'),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx !== -1 && idx < focusables.length - 1) {\n focusables[idx + 1].focus();\n }\n }\n\n _focusNextItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".conversation-item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".conversation-item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx !== -1 && idx < items.length - 1) {\n items[idx + 1].focus();\n }\n }\n\n _focusPrev(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll('li[tabindex=\"0\"], button:not([disabled])'),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx > 0) {\n focusables[idx - 1].focus();\n }\n }\n\n _focusPrevItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".conversation-item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".conversation-item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx > 0) {\n items[idx - 1].focus();\n }\n }\n\n /**\n * Handle keyboard-based navigation, selection, and reordering.\n * Enter/Space = select, Arrow Down/Right = focus next, Arrow Up/Left = focus prev.\n * M = grab/drop for reorder (when grabbed, Arrows move, Space/Enter drop).\n */\n _handleKeyboard(e: KeyboardEvent, groupId: string, name: string) {\n const groups = orchestratorStore.groups || [];\n const ids = groups.map((g) => g.groupId);\n const total = ids.length;\n\n if (this._keyboardGrabbedId === null) {\n // Navigation & Selection\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n this._focusNextItem(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n this._focusPrevItem(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n this._focusNext(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n this._focusPrev(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \" \" || e.key === \"Spacebar\" || e.key === \"Enter\") {\n // If we are on the LI itself, select it\n if ((e.target as HTMLElement).classList.contains(\"conversation-item\")) {\n e.preventDefault();\n this.handleSwitch(groupId);\n }\n\n // If on a button, the default button behavior handles it (click event)\n return;\n }\n\n // Grab for reorder\n if (e.key === \"m\" || e.key === \"M\") {\n e.preventDefault();\n this._keyboardGrabbedId = groupId;\n const pos = ids.indexOf(groupId) + 1;\n this._announce(\n `${name} grabbed. Current position ${pos} of ${total}. Use Arrow Up and Down to move, Space or Enter to drop.`,\n );\n this.render();\n }\n\n return;\n }\n\n // Currently grabbed\n if (e.key === \"Escape\") {\n e.preventDefault();\n this._announce(\n `Reorder cancelled. ${name} returned to original position.`,\n );\n this._keyboardGrabbedId = null;\n this.render();\n\n return;\n }\n\n if (e.key === \" \" || e.key === \"Spacebar\" || e.key === \"Enter\") {\n // Drop\n e.preventDefault();\n const pos = ids.indexOf(this._keyboardGrabbedId) + 1;\n const droppedName =\n groups.find((g) => g.groupId === this._keyboardGrabbedId)?.name || \"\";\n this._announce(\n `${droppedName} dropped at position ${pos} of ${total}. Reordering complete.`,\n );\n this._keyboardGrabbedId = null;\n this.render();\n\n return;\n }\n\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n const currentIdx = ids.indexOf(this._keyboardGrabbedId);\n const newIdx = e.key === \"ArrowUp\" ? currentIdx - 1 : currentIdx + 1;\n if (newIdx < 0 || newIdx >= total) {\n return;\n }\n\n // Swap\n ids.splice(currentIdx, 1);\n ids.splice(newIdx, 0, this._keyboardGrabbedId);\n this._announce(`Moved to position ${newIdx + 1} of ${total}.`);\n this.handleReorder(this._keyboardGrabbedId, ids[currentIdx], ids);\n }\n }\n\n _initResizeHandle() {\n const handle = (this.shadowRoot as ShadowRoot).querySelector(\n \".resize-handle\",\n );\n\n if (!handle) {\n return;\n }\n\n let activePointerId: number | null = null;\n\n const onPointerMove = (e: PointerEvent) => {\n if (e.pointerId !== activePointerId) {\n return;\n }\n\n const parentRect = this.parentElement?.getBoundingClientRect();\n if (!parentRect) {\n return;\n }\n\n const rect = this.getBoundingClientRect();\n const newHeight = rect.bottom - e.clientY;\n const minHeight = 80;\n const maxHeight = parentRect.height - 60;\n const clamped = Math.max(minHeight, Math.min(maxHeight, newHeight));\n\n this.style.flex = \"none\";\n this.style.height = `${clamped}px`;\n };\n\n const stopResize = () => {\n if (activePointerId === null) {\n return;\n }\n\n activePointerId = null;\n handle.classList.remove(\"active\");\n\n document.removeEventListener(\n \"pointermove\",\n onPointerMove as EventListener,\n );\n\n this._persistHeight();\n };\n\n const onPointerUp = (e: PointerEvent) => {\n if (e.pointerId !== activePointerId) {\n return;\n }\n\n stopResize();\n };\n\n handle.addEventListener(\"pointerdown\", (e: Event) => {\n const pointerEvent = e as PointerEvent;\n if (\n pointerEvent.pointerType === \"mouse\" &&\n pointerEvent.button !== 0 &&\n pointerEvent.button !== -1\n ) {\n return;\n }\n\n pointerEvent.preventDefault();\n\n activePointerId = pointerEvent.pointerId;\n handle.classList.add(\"active\");\n\n handle.setPointerCapture(pointerEvent.pointerId);\n document.addEventListener(\"pointermove\", onPointerMove as EventListener);\n });\n\n handle.addEventListener(\"pointerup\", onPointerUp as EventListener);\n handle.addEventListener(\"pointercancel\", stopResize);\n\n handle.addEventListener(\"dblclick\", () => {\n this.style.flex = \"\";\n this.style.height = \"\";\n\n this._persistHeight(0);\n });\n }\n\n private _isSpawnSubagentEnabledInCurrentScope(): boolean {\n if (\n Array.isArray(this._pendingDetailsToolTags) &&\n this._pendingDetailsToolTags.length > 0\n ) {\n return this._pendingDetailsToolTags.includes(\"spawn_subagent\");\n }\n\n return toolsStore.enabledToolNames.has(\"spawn_subagent\");\n }\n\n _itemAtPoint(x: number, y: number): Element | null {\n // elementFromPoint on shadowRoot for Shadow DOM\n const root = this.shadowRoot;\n if (!root) {\n return null;\n }\n\n const el = root.elementFromPoint(x, y);\n\n return el?.closest?.(\".conversation-item\") || null;\n }\n\n _setupDialogListeners() {\n const root = this.shadowRoot as ShadowRoot;\n\n // Create dialog\n const createDialog = root.querySelector(\n \".conversations__create-dialog\",\n ) as HTMLDialogElement | null;\n const createForm = root.querySelector(\n \".conversations__create-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const createCancel = root.querySelector(\n \".conversations__create-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n createCancel?.addEventListener(\"click\", () => {\n createDialog?.close();\n });\n\n createForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitCreateDialog();\n });\n\n // Details dialog\n const detailsDialog = root.querySelector(\n \".conversations__details-dialog\",\n ) as HTMLDialogElement | null;\n const detailsForm = root.querySelector(\n \".conversations__details-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const detailsCancel = root.querySelector(\n \".conversations__details-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n detailsCancel?.addEventListener(\"click\", () => {\n detailsDialog?.close();\n this._pendingRenameGroupId = null;\n this._pendingRenameName = null;\n this._pendingDetailsToolTags = null;\n this._pendingDetailsPinnedProvider = null;\n this._pendingDetailsPinnedModel = null;\n this._pendingDetailsProviderRuntimeOverrides = {};\n this._pendingDetailsSubagentMode = \"automatic\";\n this._pendingDetailsSubagentMaxTokens = null;\n this._pendingDetailsSubagentProvider = null;\n this._pendingDetailsSubagentModel = null;\n });\n\n detailsForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitDetailsDialog();\n });\n\n // Delete dialog\n const deleteDialog = root.querySelector(\n \".conversations__delete-dialog\",\n ) as HTMLDialogElement | null;\n const deleteForm = root.querySelector(\n \".conversations__delete-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const deleteCancel = root.querySelector(\n \".conversations__delete-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n deleteCancel?.addEventListener(\"click\", () => {\n deleteDialog?.close();\n this._pendingDeleteGroupId = null;\n });\n\n deleteForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitDeleteDialog();\n });\n\n // Clone dialog\n const cloneDialog = root.querySelector(\n \".conversations__clone-dialog\",\n ) as HTMLDialogElement | null;\n const cloneForm = root.querySelector(\n \".conversations__clone-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const cloneCancel = root.querySelector(\n \".conversations__clone-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n cloneCancel?.addEventListener(\"click\", () => {\n cloneDialog?.close();\n this._pendingCloneGroupId = null;\n });\n\n cloneForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitCloneDialog();\n });\n }\n\n _startAutoScroll() {\n if (this._autoScrollActive) {\n return;\n }\n this._autoScrollActive = true;\n\n const scrollLoop = () => {\n if (!this._autoScrollActive) {\n return;\n }\n\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".conversation-list\",\n ) as HTMLElement | null;\n if (content && this._autoScrollSpeed !== 0) {\n content.scrollTop += this._autoScrollSpeed;\n }\n\n requestAnimationFrame(scrollLoop);\n };\n\n requestAnimationFrame(scrollLoop);\n }\n\n _stopAutoScroll() {\n this._autoScrollActive = false;\n this._autoScrollSpeed = 0;\n }\n\n _updateAutoScrollSpeed(clientY: number) {\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".conversation-list\",\n ) as HTMLElement | null;\n if (!content) {\n this._autoScrollSpeed = 0;\n return;\n }\n\n const rect = content.getBoundingClientRect();\n const threshold = 50; // pixels from top/bottom to start scrolling\n\n const distTop = clientY - rect.top;\n const distBottom = rect.bottom - clientY;\n\n if (distTop >= 0 && distTop < threshold) {\n // Near the top: scroll up. Speed is faster the closer to the edge.\n this._autoScrollSpeed = -((threshold - distTop) / threshold) * 8;\n this._startAutoScroll();\n } else if (distBottom >= 0 && distBottom < threshold) {\n // Near the bottom: scroll down.\n this._autoScrollSpeed = ((threshold - distBottom) / threshold) * 8;\n this._startAutoScroll();\n } else {\n this._autoScrollSpeed = 0;\n }\n }\n\n private async _loadProviderModels(\n provider: LLMProvider,\n ): Promise<ProviderModelItem[]> {\n if (Array.isArray(provider.models) && provider.models.length > 0) {\n return provider.models as ProviderModelItem[];\n }\n\n if (!provider.modelsUrl) {\n return [];\n }\n\n const headers: Record<string, string> = {\n ...(provider.headers || {}),\n ...(orchestratorStore.orchestrator\n ? getProviderRuntimeHeaders(\n orchestratorStore.orchestrator,\n provider.id,\n \"\",\n this._pendingDetailsProviderRuntimeOverrides,\n )\n : {}),\n };\n\n if (this.db && provider.apiKeyHeader && orchestratorStore.orchestrator) {\n const apiKey =\n await orchestratorStore.orchestrator.getApiKeyForSpecificProvider(\n this.db,\n provider.id,\n );\n if (apiKey) {\n const format = provider.apiKeyHeaderFormat || \"{key}\";\n headers[provider.apiKeyHeader] = format.replace(\"{key}\", apiKey);\n }\n }\n\n const response = await fetch(provider.modelsUrl, { headers });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = await response.json();\n let items: ProviderModelItem[] = [];\n\n if (Array.isArray(data)) {\n items = data as ProviderModelItem[];\n } else if (data && typeof data === \"object\") {\n const dataObject = data as Record<string, unknown>;\n if (Array.isArray(dataObject.models)) {\n items = dataObject.models as ProviderModelItem[];\n } else if (Array.isArray(dataObject.data)) {\n items = dataObject.data as ProviderModelItem[];\n } else {\n for (const value of Object.values(dataObject)) {\n if (Array.isArray(value) && value.length > 0) {\n items = value as ProviderModelItem[];\n\n break;\n }\n }\n\n if (items.length === 0 && (dataObject.id || dataObject.name)) {\n items = [dataObject as ProviderModelItem];\n }\n }\n }\n\n if (Array.isArray(provider.models) && provider.models.length > 0) {\n const dynamicIds = new Set(\n items\n .map((item) =>\n typeof item === \"string\" ? item : item.id || item.name || \"\",\n )\n .filter(Boolean),\n );\n const staticItems = (provider.models as ProviderModelItem[]).filter(\n (item) => {\n const modelId =\n typeof item === \"string\" ? item : item.id || item.name || \"\";\n\n return modelId && !dynamicIds.has(modelId);\n },\n );\n items = [...staticItems, ...items];\n }\n\n return items;\n }\n\n /**\n * Persist the current height to IndexedDB.\n */\n async _persistHeight(height?: number) {\n if (!this.db) {\n return;\n }\n\n const val =\n height !== undefined ? height : this.getBoundingClientRect().height;\n\n await setConfig(this.db, CONFIG_KEYS.CONVERSATIONS_HEIGHT, val || 0);\n }\n\n async _submitCloneDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (!root || !this.db || !this._pendingCloneGroupId) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__clone-dialog\",\n ) as HTMLDialogElement | null;\n\n await orchestratorStore.cloneConversation(\n this.db,\n this._pendingCloneGroupId,\n );\n dialog?.close();\n this._pendingCloneGroupId = null;\n }\n\n async _submitCreateDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (!root || !this.db) {\n return;\n }\n\n const input = root.querySelector(\n \".conversations__create-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n const dialog = root.querySelector(\n \".conversations__create-dialog\",\n ) as HTMLDialogElement | null;\n\n const name = input?.value.trim();\n if (!name) {\n return;\n }\n\n await orchestratorStore.createConversation(this.db, name);\n dialog?.close();\n }\n\n async _submitDeleteDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (!root || !this.db || !this._pendingDeleteGroupId) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__delete-dialog\",\n ) as HTMLDialogElement | null;\n\n await orchestratorStore.deleteConversation(\n this.db,\n this._pendingDeleteGroupId,\n );\n dialog?.close();\n this._pendingDeleteGroupId = null;\n }\n\n async _submitDetailsDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (\n !root ||\n !this.db ||\n !this._pendingRenameGroupId ||\n !this._pendingRenameName\n ) {\n return;\n }\n\n const input = root.querySelector(\n \".conversations__details-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n const dialog = root.querySelector(\n \".conversations__details-dialog\",\n ) as HTMLDialogElement | null;\n\n const name = input?.value.trim();\n\n if (name && name !== this._pendingRenameName) {\n await orchestratorStore.renameConversation(\n this.db,\n this._pendingRenameGroupId,\n name,\n );\n }\n\n if (this._pendingDetailsToolTags) {\n await orchestratorStore.updateConversationToolTags(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsToolTags,\n );\n }\n\n await orchestratorStore.updateConversationPinnedProvider(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsPinnedProvider || undefined,\n this._pendingDetailsPinnedModel || undefined,\n this._pendingDetailsPinnedMaxTokens || undefined,\n );\n\n await orchestratorStore.updateConversationProviderRuntimeOverrides(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsProviderRuntimeOverrides,\n );\n\n await orchestratorStore.updateConversationSubagentSettings(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsSubagentMode,\n this._pendingDetailsSubagentProvider || undefined,\n this._pendingDetailsSubagentModel || undefined,\n this._pendingDetailsSubagentMaxTokens || undefined,\n );\n\n dialog?.close();\n this._pendingRenameGroupId = null;\n this._pendingRenameName = null;\n this._pendingDetailsToolTags = null;\n this._pendingDetailsPinnedMaxTokens = null;\n this._pendingDetailsPinnedProvider = null;\n this._pendingDetailsPinnedModel = null;\n this._pendingDetailsProviderRuntimeOverrides = {};\n this._pendingDetailsSubagentMode = \"automatic\";\n this._pendingDetailsSubagentMaxTokens = null;\n this._pendingDetailsSubagentProvider = null;\n this._pendingDetailsSubagentModel = null;\n }\n}\n\ncustomElements.define(\"shadow-claw-conversations\", ShadowClawConversations);\n"],"mappings":"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"}
1
+ {"version":3,"file":"shadow-claw-conversations-BwXep3iu.js","names":["shadowClawConversationsStyles","shadowClawConversationsTemplate"],"sources":["../../src/components/shadow-claw-conversations/shadow-claw-conversations.ts"],"sourcesContent":["import { CONFIG_KEYS } from \"../../config/config.js\";\nimport { effect } from \"../../core/effect.js\";\n\nimport {\n getAvailableProviders,\n getProviderRuntimeHeaders,\n} from \"../../core/orchestrator/utils/operations/provider.js\";\n\nimport { getDb, ShadowClawDatabase } from \"../../db/db.js\";\nimport { getConfig } from \"../../db/getConfig.js\";\nimport { setConfig } from \"../../db/setConfig.js\";\nimport { setSanitizedHtml } from \"../../security/trusted-types.js\";\nimport { orchestratorStore } from \"../../stores/orchestrator.js\";\nimport { toolsStore } from \"../../stores/tools.js\";\nimport { ChannelRegistry } from \"../../subsystems/channels/channel-registry.js\";\nimport { loadDeclarativeTools } from \"../../subsystems/tools/declarative.js\";\nimport { TOOL_DEFINITIONS } from \"../../subsystems/tools/tools.js\";\n\nimport type { LLMProvider } from \"../../subsystems/providers/types.js\";\n\nimport type {\n ProviderModelItem,\n ShadowClawProviderModelPicker,\n} from \"../common/shadow-claw-provider-model-picker/shadow-claw-provider-model-picker.js\";\n\nimport type {\n ProviderRuntimeOverrides,\n ShadowClawProviderModuleSettings,\n} from \"../common/shadow-claw-provider-module-settings/shadow-claw-provider-module-settings.js\";\n\nimport \"../common/shadow-claw-provider-model-picker/shadow-claw-provider-model-picker.js\";\nimport \"../common/shadow-claw-provider-module-settings/shadow-claw-provider-module-settings.js\";\nimport \"../shadow-claw-dialog/shadow-claw-dialog.js\";\n\nimport ShadowClawElement from \"../shadow-claw-element.js\";\nimport shadowClawConversationsStyles from \"./shadow-claw-conversations.css\" with { type: \"css\" };\nimport shadowClawConversationsTemplate from \"./shadow-claw-conversations.html\" with { type: \"html\" };\n\nexport class ShadowClawConversations extends ShadowClawElement {\n static styles = shadowClawConversationsStyles;\n static template = shadowClawConversationsTemplate;\n\n public channelRegistry: ChannelRegistry | null = null;\n public db: ShadowClawDatabase | null = null;\n private _autoScrollActive = false;\n private _autoScrollSpeed = 0;\n\n private _draggedGroupId: string | null = null;\n private _effectCleanup: (() => void) | null = null;\n private _keyboardGrabbedId: string | null = null;\n private _pendingCloneGroupId: string | null = null;\n private _pendingDeleteGroupId: string | null = null;\n private _pendingDetailsPinnedMaxTokens: number | null = null;\n private _pendingDetailsPinnedModel: string | null = null;\n private _pendingDetailsPinnedProvider: string | null = null;\n private _pendingDetailsProviderRuntimeOverrides: ProviderRuntimeOverrides =\n {};\n private _pendingDetailsSubagentMaxTokens: number | null = null;\n private _pendingDetailsSubagentMode: \"automatic\" | \"manual\" = \"automatic\";\n private _pendingDetailsSubagentModel: string | null = null;\n private _pendingDetailsSubagentProvider: string | null = null;\n private _pendingDetailsToolTags: string[] | null = null;\n private _pendingRenameGroupId: string | null = null;\n private _pendingRenameName: string | null = null;\n private _touchDraggedGroupId: string | null = null;\n private _touchId: number | null = null;\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\n // Restore persisted height\n const saved = await getConfig(this.db, CONFIG_KEYS.CONVERSATIONS_HEIGHT);\n if (saved && typeof saved === \"number\" && saved > 0) {\n this.style.flex = \"none\";\n this.style.height = `${saved}px`;\n }\n\n this.channelRegistry =\n orchestratorStore.orchestrator?.channelRegistry || null;\n\n (this.shadowRoot as ShadowRoot)\n .querySelector(\"[data-action='create']\")\n ?.addEventListener(\"click\", () => this.handleCreate());\n\n // Dialog event listeners\n this._setupDialogListeners();\n\n this._initResizeHandle();\n\n // Global dragover auto-scroll listener on shadowRoot\n root.addEventListener(\"dragover\", (e: any) => {\n if (this._draggedGroupId !== null) {\n this._updateAutoScrollSpeed(e.clientY);\n }\n });\n\n // Ensure we stop scrolling if the drag ends or leaves\n root.addEventListener(\"dragend\", () => {\n this._stopAutoScroll();\n });\n root.addEventListener(\"drop\", () => {\n this._stopAutoScroll();\n });\n\n this.render();\n\n // Re-render when store state changes\n this._effectCleanup = effect(() => {\n // Access signals to establish tracking\n orchestratorStore.groups;\n orchestratorStore.activeGroupId;\n orchestratorStore.unreadGroupIds;\n\n this.render();\n });\n }\n\n disconnectedCallback() {\n if (this._effectCleanup) {\n this._effectCleanup();\n this._effectCleanup = null;\n }\n }\n\n getChannelRegistry(): ChannelRegistry | null {\n const current = orchestratorStore.orchestrator?.channelRegistry || null;\n if (current) {\n this.channelRegistry = current;\n }\n\n return this.channelRegistry;\n }\n\n openCloneDialog(name: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__clone-dialog\",\n ) as HTMLDialogElement | null;\n const nameSpan = dialog?.querySelector(\".conversations__clone-name\");\n\n if (!dialog) {\n return;\n }\n\n if (nameSpan) {\n nameSpan.textContent = name;\n }\n\n dialog.showModal();\n }\n\n openCreateDialog() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__create-dialog\",\n ) as HTMLDialogElement | null;\n const input = root.querySelector(\n \".conversations__create-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n\n if (!dialog) {\n return;\n }\n\n dialog.showModal();\n\n if (input) {\n input.value = \"\";\n input.focus();\n }\n }\n\n openDeleteDialog(name: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__delete-dialog\",\n ) as HTMLDialogElement | null;\n const nameSpan = dialog?.querySelector(\".conversations__delete-name\");\n const cancelBtn = dialog?.querySelector(\n \".conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n if (!dialog) {\n return;\n }\n\n if (nameSpan) {\n nameSpan.textContent = name;\n }\n\n dialog.showModal();\n cancelBtn?.focus();\n }\n\n openDetailsDialog(currentName: string, groupId?: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__details-dialog\",\n ) as HTMLDialogElement | null;\n const input = root.querySelector(\n \".conversations__details-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n const groupIdInput = root.querySelector(\n \"#conversations-details-group-id\",\n ) as HTMLInputElement | null;\n const copyBtn = root.querySelector(\n \"#conversations-group-id-copy-btn\",\n ) as HTMLButtonElement | null;\n const toolsContainer = root.querySelector(\n \"#conversations-details-tools\",\n ) as HTMLElement | null;\n const toolInput = root.querySelector(\n \"#conversations-tool-input\",\n ) as HTMLInputElement | null;\n const toolAddBtn = root.querySelector(\n \"#conversations-add-tool-btn\",\n ) as HTMLButtonElement | null;\n const datalist = root.querySelector(\n \"#conversations-available-tools\",\n ) as HTMLDataListElement | null;\n const mainPicker = root.querySelector(\n \"#conversations-main-picker\",\n ) as ShadowClawProviderModelPicker | null;\n const mainProviderModuleSettings = root.querySelector(\n \"#conversations-main-provider-module-settings\",\n ) as ShadowClawProviderModuleSettings | null;\n const agentMaxTokensInput = root.querySelector(\n \"#conversations-agent-max-tokens\",\n ) as HTMLInputElement | null;\n const subagentSettingsContainer = root.querySelector(\n \"#conversations-subagent-settings-container\",\n ) as HTMLElement | null;\n const subagentModeSelect = root.querySelector(\n \"#conversations-subagent-mode\",\n ) as HTMLSelectElement | null;\n const subagentMaxTokensInput = root.querySelector(\n \"#conversations-subagent-max-tokens\",\n ) as HTMLInputElement | null;\n const subagentManualContainer = root.querySelector(\n \"#conversations-subagent-manual-container\",\n ) as HTMLElement | null;\n const subagentPicker = root.querySelector(\n \"#conversations-subagent-picker\",\n ) as ShadowClawProviderModelPicker | null;\n const subagentProviderModuleSettings = root.querySelector(\n \"#conversations-subagent-provider-module-settings\",\n ) as ShadowClawProviderModuleSettings | null;\n\n // Populate Group ID field\n if (groupIdInput) {\n groupIdInput.value = groupId?.replace(\":\", \"-\") || \"\";\n }\n\n // Wire up copy button\n if (copyBtn && groupIdInput) {\n // Clone to remove previous listeners\n const freshCopyBtn = copyBtn.cloneNode(true) as HTMLButtonElement;\n copyBtn.replaceWith(freshCopyBtn);\n\n freshCopyBtn.addEventListener(\"click\", async () => {\n const val = groupIdInput.value;\n if (!val) {\n return;\n }\n\n try {\n await navigator.clipboard.writeText(val);\n // Swap to a checkmark briefly\n const originalInner = freshCopyBtn.innerHTML;\n setSanitizedHtml(\n freshCopyBtn,\n `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\"/></svg>`,\n );\n freshCopyBtn.classList.add(\n \"conversations__group-id-copy-btn--copied\",\n );\n setTimeout(() => {\n setSanitizedHtml(freshCopyBtn, originalInner);\n freshCopyBtn.classList.remove(\n \"conversations__group-id-copy-btn--copied\",\n );\n }, 1500);\n } catch {\n // Fallback: select the text\n groupIdInput.select();\n }\n });\n }\n\n const participantsContainer = root.querySelector(\n \"#conversations-details-participants-container\",\n ) as HTMLElement | null;\n const participantsList = root.querySelector(\n \"#conversations-details-participants-list\",\n ) as HTMLElement | null;\n\n if (participantsContainer && participantsList) {\n if (groupId && groupId.startsWith(\"peer:\")) {\n participantsContainer.style.display = \"block\";\n participantsList.replaceChildren();\n\n const orchestrator = orchestratorStore.orchestrator;\n if (orchestrator) {\n const connectedPeers =\n orchestrator.peerjs?.connectedPeersSignal?.get() || [];\n const targetPeer = groupId.replace(\"peer:\", \"\");\n\n if (connectedPeers.includes(targetPeer)) {\n let alias = \"\";\n if (orchestrator.peerjsPeerAliases) {\n for (const [a, id] of Object.entries(\n orchestrator.peerjsPeerAliases,\n )) {\n if (id === targetPeer) {\n alias = a;\n\n break;\n }\n }\n }\n\n const displayName = alias\n ? `${alias} (${targetPeer.substring(0, 8)})`\n : targetPeer;\n\n const row = document.createElement(\"div\");\n row.className = \"conversations__group-id-row\";\n\n const input = document.createElement(\"input\");\n input.className =\n \"conversations__input conversations__group-id-input\";\n input.type = \"text\";\n input.readOnly = true;\n input.value = displayName;\n input.style.marginBottom = \"0\";\n\n const btn = document.createElement(\"button\");\n btn.type = \"button\";\n btn.className = \"conversations__group-id-copy-btn\";\n btn.title = \"Copy Peer ID\";\n btn.setAttribute(\"aria-label\", \"Copy Peer ID to clipboard\");\n btn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M360-240q-33 0-56.5-23.5T280-320v-480q0-33 23.5-56.5T360-880h360q33 0 56.5 23.5T800-800v480q0 33-23.5 56.5T720-240H360Zm0-80h360v-480H360v480ZM200-80q-33 0-56.5-23.5T120-160v-560h80v560h440v80H200Zm160-240v-480 480Z\"/></svg>`;\n\n btn.addEventListener(\"click\", async () => {\n try {\n await navigator.clipboard.writeText(targetPeer);\n const originalInner = btn.innerHTML;\n btn.innerHTML = `<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"1em\" width=\"1em\" viewBox=\"0 -960 960 960\" fill=\"currentColor\" aria-hidden=\"true\"><path d=\"M382-240 154-468l57-57 171 171 367-367 57 57-424 424Z\"/></svg>`;\n btn.classList.add(\"conversations__group-id-copy-btn--copied\");\n setTimeout(() => {\n btn.innerHTML = originalInner;\n btn.classList.remove(\n \"conversations__group-id-copy-btn--copied\",\n );\n }, 1500);\n } catch {\n input.value = targetPeer;\n input.select();\n }\n });\n\n row.appendChild(input);\n row.appendChild(btn);\n participantsList.appendChild(row);\n } else {\n const noPeers = document.createElement(\"div\");\n noPeers.style.fontSize = \"0.875rem\";\n noPeers.style.color = \"var(--text-secondary)\";\n noPeers.textContent = \"Peer is not currently connected.\";\n participantsList.appendChild(noPeers);\n }\n }\n } else {\n participantsContainer.style.display = \"none\";\n }\n }\n\n if (!dialog) {\n return;\n }\n\n dialog.showModal();\n\n const candidateToolsMap = new Map<\n string,\n { name: string; description?: string }\n >();\n for (const tool of TOOL_DEFINITIONS) {\n candidateToolsMap.set(tool.name, tool);\n }\n for (const tool of toolsStore.allTools) {\n if (!candidateToolsMap.has(tool.name)) {\n candidateToolsMap.set(tool.name, tool);\n }\n }\n\n const updateDatalist = () => {\n if (!datalist) {\n return;\n }\n\n const pinned = new Set(this._pendingDetailsToolTags || []);\n datalist.replaceChildren();\n for (const tool of candidateToolsMap.values()) {\n if (pinned.has(tool.name)) {\n continue;\n }\n\n const option = document.createElement(\"option\");\n option.value = tool.name;\n datalist.appendChild(option);\n }\n };\n\n if (this.db && groupId) {\n loadDeclarativeTools(this.db, groupId)\n .then(({ tools: declTools }) => {\n let added = false;\n for (const tool of declTools) {\n if (!candidateToolsMap.has(tool.name)) {\n candidateToolsMap.set(tool.name, tool);\n added = true;\n }\n }\n if (added) {\n updateDatalist();\n }\n })\n .catch(() => {});\n }\n\n const renderChips = () => {\n if (!toolsContainer) {\n return;\n }\n\n toolsContainer.replaceChildren();\n\n const tags = this._pendingDetailsToolTags || [];\n for (const tagName of tags) {\n const tool = candidateToolsMap.get(tagName);\n const chip = document.createElement(\"span\");\n chip.className = \"conversations__tool-chip\";\n\n const nameSpan = document.createElement(\"span\");\n nameSpan.textContent = tagName;\n if (tool?.description) {\n nameSpan.title = tool.description;\n }\n\n chip.appendChild(nameSpan);\n\n const removeBtn = document.createElement(\"button\");\n removeBtn.type = \"button\";\n removeBtn.className = \"conversations__tool-chip-remove\";\n removeBtn.textContent = \"×\";\n removeBtn.setAttribute(\"aria-label\", `Remove tool ${tagName}`);\n\n removeBtn.addEventListener(\"click\", () => {\n if (!this._pendingDetailsToolTags) {\n return;\n }\n\n this._pendingDetailsToolTags = this._pendingDetailsToolTags.filter(\n (t) => t !== tagName,\n );\n renderChips();\n });\n\n chip.appendChild(removeBtn);\n toolsContainer.appendChild(chip);\n }\n\n updateDatalist();\n\n if (subagentSettingsContainer && subagentModeSelect) {\n const showSubagentSettings =\n this._isSpawnSubagentEnabledInCurrentScope();\n subagentSettingsContainer.style.display = showSubagentSettings\n ? \"flex\"\n : \"none\";\n if (!showSubagentSettings) {\n this._pendingDetailsSubagentMode = \"automatic\";\n }\n\n if (subagentManualContainer) {\n subagentManualContainer.style.display =\n this._pendingDetailsSubagentMode === \"manual\" &&\n showSubagentSettings\n ? \"flex\"\n : \"none\";\n }\n\n if (subagentMaxTokensInput) {\n subagentMaxTokensInput.value =\n typeof this._pendingDetailsSubagentMaxTokens === \"number\" &&\n Number.isFinite(this._pendingDetailsSubagentMaxTokens) &&\n this._pendingDetailsSubagentMaxTokens > 0\n ? String(Math.floor(this._pendingDetailsSubagentMaxTokens))\n : \"\";\n }\n }\n };\n\n if (toolAddBtn && toolInput) {\n toolAddBtn.onclick = () => {\n const val = toolInput.value.trim();\n if (!val) {\n return;\n }\n\n const isValidName = /^[a-z][a-z0-9_]{0,63}$/.test(val);\n const tool = candidateToolsMap.get(val);\n if (!tool && !isValidName) {\n toolInput.value = \"\";\n\n return;\n }\n\n if (!this._pendingDetailsToolTags) {\n this._pendingDetailsToolTags = [];\n }\n\n if (!this._pendingDetailsToolTags.includes(val)) {\n this._pendingDetailsToolTags.push(val);\n renderChips();\n }\n\n toolInput.value = \"\";\n };\n\n toolInput.onkeydown = (e) => {\n if (e.key === \"Enter\") {\n e.preventDefault();\n toolAddBtn.click();\n }\n };\n }\n\n renderChips();\n\n if (\n mainPicker &&\n mainProviderModuleSettings &&\n subagentModeSelect &&\n subagentSettingsContainer &&\n subagentManualContainer &&\n subagentPicker &&\n subagentProviderModuleSettings\n ) {\n const providers = (getAvailableProviders() as LLMProvider[]) || [];\n\n mainPicker.setLabels({\n providerLabel: \"Pinned Provider\",\n defaultProviderLabel: \"Default (Global)\",\n modelLabel: \"Pinned Model\",\n defaultModelLabel: \"Default Model\",\n customModelPlaceholder: \"Custom model id\",\n });\n\n mainPicker.setModelLoader((provider) =>\n this._loadProviderModels(provider),\n );\n mainPicker.setProviders(providers);\n mainPicker.setValue({\n providerId: this._pendingDetailsPinnedProvider,\n modelId: this._pendingDetailsPinnedModel,\n });\n\n mainProviderModuleSettings.setProvider(\n this._pendingDetailsPinnedProvider,\n );\n if (agentMaxTokensInput) {\n agentMaxTokensInput.value =\n typeof this._pendingDetailsPinnedMaxTokens === \"number\" &&\n Number.isFinite(this._pendingDetailsPinnedMaxTokens) &&\n this._pendingDetailsPinnedMaxTokens > 0\n ? String(Math.floor(this._pendingDetailsPinnedMaxTokens))\n : \"\";\n }\n mainProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n\n subagentPicker.setLabels({\n providerLabel: \"Pinned Subagent Provider\",\n defaultProviderLabel: \"Default (Parent Provider)\",\n modelLabel: \"Pinned Subagent Model\",\n defaultModelLabel: \"Default Model\",\n customModelPlaceholder: \"Custom subagent model id\",\n });\n\n subagentPicker.setModelLoader((provider) =>\n this._loadProviderModels(provider),\n );\n subagentPicker.setProviders(providers);\n subagentPicker.setValue({\n providerId: this._pendingDetailsSubagentProvider,\n modelId: this._pendingDetailsSubagentModel,\n });\n\n subagentProviderModuleSettings.setProvider(\n this._pendingDetailsSubagentProvider,\n );\n\n subagentProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n\n if (!mainPicker.hasAttribute(\"data-bound\")) {\n mainPicker.addEventListener(\"provider-model-change\", (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n this._pendingDetailsPinnedProvider = detail.providerId || null;\n this._pendingDetailsPinnedModel = detail.modelId || null;\n\n mainProviderModuleSettings.setProvider(\n this._pendingDetailsPinnedProvider,\n );\n mainProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n });\n\n mainPicker.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!agentMaxTokensInput?.hasAttribute(\"data-bound\")) {\n agentMaxTokensInput?.addEventListener(\"input\", () => {\n const value = Number(agentMaxTokensInput.value);\n if (Number.isFinite(value) && value > 0) {\n this._pendingDetailsPinnedMaxTokens = Math.floor(value);\n } else {\n this._pendingDetailsPinnedMaxTokens = null;\n }\n });\n\n agentMaxTokensInput?.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!mainProviderModuleSettings.hasAttribute(\"data-bound\")) {\n mainProviderModuleSettings.addEventListener(\n \"provider-module-settings-change\",\n (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n const providerId = detail.providerId as string | undefined;\n const overrides = detail.overrides as ProviderRuntimeOverrides;\n if (!providerId) {\n return;\n }\n\n const next = JSON.parse(\n JSON.stringify(\n this._pendingDetailsProviderRuntimeOverrides || {},\n ),\n ) as ProviderRuntimeOverrides;\n\n if (providerId === \"llamafile\") {\n next.llamafile = overrides.llamafile;\n } else if (providerId === \"bedrock_proxy\") {\n next.bedrock_proxy = overrides.bedrock_proxy;\n }\n\n this._pendingDetailsProviderRuntimeOverrides = next;\n mainPicker.invalidateProviderModels(providerId);\n subagentPicker.invalidateProviderModels(providerId);\n },\n );\n\n mainProviderModuleSettings.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!subagentPicker.hasAttribute(\"data-bound\")) {\n subagentPicker.addEventListener(\"provider-model-change\", (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n this._pendingDetailsSubagentProvider = detail.providerId || null;\n this._pendingDetailsSubagentModel = detail.modelId || null;\n subagentProviderModuleSettings.setProvider(\n this._pendingDetailsSubagentProvider,\n );\n\n subagentProviderModuleSettings.setOverrides(\n this._pendingDetailsProviderRuntimeOverrides,\n );\n });\n subagentPicker.setAttribute(\"data-bound\", \"true\");\n }\n\n if (!subagentProviderModuleSettings.hasAttribute(\"data-bound\")) {\n subagentProviderModuleSettings.addEventListener(\n \"provider-module-settings-change\",\n (e: Event) => {\n const detail = (e as CustomEvent).detail || {};\n const providerId = detail.providerId as string | undefined;\n const overrides = detail.overrides as ProviderRuntimeOverrides;\n if (!providerId) {\n return;\n }\n\n const next = JSON.parse(\n JSON.stringify(\n this._pendingDetailsProviderRuntimeOverrides || {},\n ),\n ) as ProviderRuntimeOverrides;\n\n if (providerId === \"llamafile\") {\n next.llamafile = overrides.llamafile;\n } else if (providerId === \"bedrock_proxy\") {\n next.bedrock_proxy = overrides.bedrock_proxy;\n }\n\n this._pendingDetailsProviderRuntimeOverrides = next;\n mainPicker.invalidateProviderModels(providerId);\n subagentPicker.invalidateProviderModels(providerId);\n },\n );\n\n subagentProviderModuleSettings.setAttribute(\"data-bound\", \"true\");\n }\n\n subagentModeSelect.value = this._pendingDetailsSubagentMode;\n\n const showSubagentSettings = this._isSpawnSubagentEnabledInCurrentScope();\n subagentSettingsContainer.style.display = showSubagentSettings\n ? \"flex\"\n : \"none\";\n\n mainProviderModuleSettings.style.display = this\n ._pendingDetailsPinnedProvider\n ? \"flex\"\n : \"none\";\n\n subagentManualContainer.style.display =\n showSubagentSettings && this._pendingDetailsSubagentMode === \"manual\"\n ? \"flex\"\n : \"none\";\n\n subagentProviderModuleSettings.style.display =\n showSubagentSettings &&\n this._pendingDetailsSubagentMode === \"manual\" &&\n !!this._pendingDetailsSubagentProvider\n ? \"flex\"\n : \"none\";\n\n subagentModeSelect.onchange = () => {\n this._pendingDetailsSubagentMode =\n subagentModeSelect.value === \"manual\" ? \"manual\" : \"automatic\";\n\n subagentManualContainer.style.display =\n this._pendingDetailsSubagentMode === \"manual\" &&\n this._isSpawnSubagentEnabledInCurrentScope()\n ? \"flex\"\n : \"none\";\n\n subagentProviderModuleSettings.style.display =\n this._pendingDetailsSubagentMode === \"manual\" &&\n this._isSpawnSubagentEnabledInCurrentScope() &&\n !!this._pendingDetailsSubagentProvider\n ? \"flex\"\n : \"none\";\n };\n\n if (!subagentMaxTokensInput?.hasAttribute(\"data-bound\")) {\n subagentMaxTokensInput?.addEventListener(\"input\", () => {\n const value = Number(subagentMaxTokensInput.value);\n if (Number.isFinite(value) && value > 0) {\n this._pendingDetailsSubagentMaxTokens = Math.floor(value);\n } else {\n this._pendingDetailsSubagentMaxTokens = null;\n }\n });\n\n subagentMaxTokensInput?.setAttribute(\"data-bound\", \"true\");\n }\n }\n\n if (input) {\n input.value = currentName;\n input.select();\n input.focus();\n }\n }\n\n async handleClone(groupId: string) {\n if (!this.db) {\n return;\n }\n\n const groups = orchestratorStore.groups || [];\n const group = groups.find((g) => g.groupId === groupId);\n if (!group) {\n return;\n }\n\n this._pendingCloneGroupId = groupId;\n this.openCloneDialog(group.name);\n }\n\n async handleCreate() {\n if (!this.db) {\n return;\n }\n\n this.openCreateDialog();\n }\n\n async handleDelete(groupId: string, name: string) {\n if (!this.db) {\n return;\n }\n\n this._pendingDeleteGroupId = groupId;\n this.openDeleteDialog(name);\n }\n\n async handleDetails(groupId: string, currentName: string) {\n if (!this.db) {\n return;\n }\n\n this._pendingRenameGroupId = groupId;\n this._pendingRenameName = currentName;\n\n const groups = orchestratorStore.groups || [];\n const group = groups.find((g) => g.groupId === groupId);\n const currentTags = group?.toolTags || [];\n\n this._pendingDetailsToolTags = [...currentTags];\n this._pendingDetailsPinnedMaxTokens =\n typeof group?.pinnedMaxTokens === \"number\" &&\n Number.isFinite(group.pinnedMaxTokens) &&\n group.pinnedMaxTokens > 0\n ? Math.floor(group.pinnedMaxTokens)\n : null;\n this._pendingDetailsPinnedProvider = group?.pinnedProvider || null;\n this._pendingDetailsPinnedModel = group?.pinnedModel || null;\n this._pendingDetailsProviderRuntimeOverrides = JSON.parse(\n JSON.stringify(group?.providerRuntimeOverrides || {}),\n );\n this._pendingDetailsSubagentMode =\n group?.subagentModelSelectionMode === \"manual\" ? \"manual\" : \"automatic\";\n this._pendingDetailsSubagentMaxTokens =\n typeof group?.subagentMaxTokens === \"number\" &&\n Number.isFinite(group.subagentMaxTokens) &&\n group.subagentMaxTokens > 0\n ? Math.floor(group.subagentMaxTokens)\n : null;\n this._pendingDetailsSubagentProvider =\n group?.subagentPinnedProvider || null;\n this._pendingDetailsSubagentModel = group?.subagentPinnedModel || null;\n this.openDetailsDialog(currentName, groupId);\n }\n\n /**\n * Reorder: move draggedId to the position of targetId,\n * or apply a pre-computed order array.\n */\n async handleReorder(\n draggedId: string,\n targetId: string,\n precomputedIds?: string[],\n ) {\n if (!this.db) {\n return;\n }\n\n if (precomputedIds) {\n await orchestratorStore.reorderConversations(this.db, precomputedIds);\n\n return;\n }\n\n const groups = orchestratorStore.groups || [];\n const ids = groups.map((g) => g.groupId);\n const fromIdx = ids.indexOf(draggedId);\n const toIdx = ids.indexOf(targetId);\n\n if (fromIdx < 0 || toIdx < 0) {\n return;\n }\n\n ids.splice(fromIdx, 1);\n ids.splice(toIdx, 0, draggedId);\n\n await orchestratorStore.reorderConversations(this.db, ids);\n }\n\n async handleSwitch(groupId: string) {\n if (groupId === orchestratorStore.activeGroupId) {\n return;\n }\n\n // Derive the appropriate sidebar page from the current active page.\n // \"pages\" is excluded as a fallback because its route omits groupId\n // when no workspace path is present, so it can't represent a switch.\n const rawPage = orchestratorStore.activePage;\n const fallbackPage = orchestratorStore.sidebarDefaultPage;\n const page =\n rawPage === \"chat\" || rawPage === \"tasks\" || rawPage === \"files\"\n ? rawPage\n : fallbackPage === \"tasks\" || fallbackPage === \"files\"\n ? fallbackPage\n : \"chat\";\n\n // Dispatch a navigate event so the URL updates to /page/groupId and\n // the router calls applyRoute, which handles switchConversation.\n document.dispatchEvent(\n new CustomEvent(\"shadow-claw-navigate\", {\n detail: { page, groupId },\n bubbles: true,\n composed: true,\n }),\n );\n }\n\n async render() {\n const list = (this.shadowRoot as ShadowRoot).querySelector(\n \".conversation-list\",\n );\n\n if (!list) {\n return;\n }\n\n const groups = orchestratorStore.groups || [];\n const activeId = orchestratorStore.activeGroupId;\n const unreadIds = orchestratorStore.unreadGroupIds || new Set();\n const channelRegistry = this.getChannelRegistry();\n\n list.replaceChildren();\n\n for (let i = 0; i < groups.length; i++) {\n const group = groups[i];\n const isActive = group.groupId === activeId;\n const isUnread = !isActive && unreadIds.has(group.groupId);\n const li = document.createElement(\"li\");\n\n li.className = `conversation-item${isActive ? \" active\" : \"\"}${isUnread ? \" unread\" : \"\"}`;\n li.setAttribute(\"data-group-id\", group.groupId);\n li.setAttribute(\"role\", \"listitem\");\n li.setAttribute(\"tabindex\", \"0\");\n li.setAttribute(\"aria-describedby\", \"reorder-instructions\");\n li.setAttribute(\n \"aria-label\",\n `${group.name}, position ${i + 1} of ${groups.length}`,\n );\n\n if (this._keyboardGrabbedId === group.groupId) {\n li.classList.add(\"keyboard-grabbed\");\n\n li.setAttribute(\"aria-grabbed\", \"true\");\n }\n\n const badge = channelRegistry\n ? channelRegistry.getBadge(group.groupId)\n : \"\";\n\n const canDelete = groups.length > 1;\n\n const handle = document.createElement(\"span\");\n handle.className = \"drag-handle\";\n handle.setAttribute(\"draggable\", \"true\");\n handle.setAttribute(\"aria-hidden\", \"true\");\n handle.setAttribute(\"title\", \"Drag to reorder\");\n handle.textContent = \"⠿\";\n\n li.append(handle);\n\n if (badge) {\n const badgeEl = document.createElement(\"span\");\n badgeEl.className = \"channel-badge\";\n badgeEl.textContent = badge;\n li.append(badgeEl);\n }\n\n if (group.toolTags && group.toolTags.length > 0) {\n const toolBadgeEl = document.createElement(\"span\");\n toolBadgeEl.className = \"tool-badge\";\n toolBadgeEl.textContent = \"🔧\";\n toolBadgeEl.title = `Pinned Tools: ${group.toolTags.join(\", \")}`;\n li.append(toolBadgeEl);\n }\n\n const nameEl = document.createElement(\"span\");\n nameEl.className = \"conversation-name\";\n nameEl.textContent = group.name;\n\n const actionsEl = document.createElement(\"span\");\n actionsEl.className = \"conversation-actions\";\n\n const cloneBtn = document.createElement(\"button\");\n cloneBtn.setAttribute(\"data-action\", \"clone\");\n cloneBtn.setAttribute(\"title\", \"Clone\");\n cloneBtn.setAttribute(\"aria-label\", `Clone ${group.name}`);\n cloneBtn.textContent = \"📋\";\n\n const detailsBtn = document.createElement(\"button\");\n detailsBtn.setAttribute(\"data-action\", \"details\");\n detailsBtn.setAttribute(\"title\", \"Details\");\n detailsBtn.setAttribute(\"aria-label\", `Details for ${group.name}`);\n detailsBtn.textContent = \"⚙️\";\n\n actionsEl.append(cloneBtn, detailsBtn);\n\n if (canDelete) {\n const deleteBtn = document.createElement(\"button\");\n deleteBtn.setAttribute(\"data-action\", \"delete\");\n deleteBtn.setAttribute(\"title\", \"Delete\");\n deleteBtn.setAttribute(\"aria-label\", `Delete ${group.name}`);\n deleteBtn.textContent = \"🗑️\";\n actionsEl.append(deleteBtn);\n }\n\n const actionsToggleBtn = document.createElement(\"button\");\n actionsToggleBtn.className = \"conversation-actions-toggle\";\n actionsToggleBtn.setAttribute(\"title\", \"More actions\");\n actionsToggleBtn.setAttribute(\n \"aria-label\",\n `More actions for ${group.name}`,\n );\n actionsToggleBtn.textContent = \"⋮\";\n\n li.append(nameEl, actionsEl, actionsToggleBtn);\n\n li.addEventListener(\"click\", (e) => {\n const target = e.target as HTMLElement;\n const action = target\n .closest(\"[data-action]\")\n ?.getAttribute(\"data-action\");\n\n if (action === \"clone\") {\n this.handleClone(group.groupId);\n } else if (action === \"details\") {\n this.handleDetails(group.groupId, group.name);\n } else if (action === \"delete\") {\n this.handleDelete(group.groupId, group.name);\n } else if (target.closest(\".conversation-actions-toggle\")) {\n li.classList.toggle(\"show-actions\");\n } else if (!target.closest(\".drag-handle\")) {\n this.handleSwitch(group.groupId);\n li.classList.remove(\"show-actions\");\n }\n });\n\n li.addEventListener(\"keydown\", (e) => {\n this._handleKeyboard(e, group.groupId, group.name);\n });\n\n handle.addEventListener(\"dragstart\", (e) => {\n this._draggedGroupId = group.groupId;\n\n li.classList.add(\"dragging\");\n\n (e as DragEvent).dataTransfer?.setData(\"text/plain\", group.groupId);\n });\n\n handle.addEventListener(\"dragend\", () => {\n li.classList.remove(\"dragging\");\n\n this._draggedGroupId = null;\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n });\n\n handle.addEventListener(\n \"touchstart\",\n (e) => {\n const touch = (e as TouchEvent).touches[0];\n if (!touch) {\n return;\n }\n\n this._touchId = touch.identifier;\n this._touchDraggedGroupId = group.groupId;\n\n li.classList.add(\"dragging\");\n\n e.preventDefault();\n },\n { passive: false },\n );\n\n li.addEventListener(\"dragover\", (e) => {\n e.preventDefault();\n\n if (this._draggedGroupId && this._draggedGroupId !== group.groupId) {\n li.classList.add(\"drag-over\");\n }\n });\n\n li.addEventListener(\"dragleave\", () => {\n li.classList.remove(\"drag-over\");\n });\n\n li.addEventListener(\"drop\", (e) => {\n e.preventDefault();\n\n li.classList.remove(\"drag-over\");\n\n if (this._draggedGroupId && this._draggedGroupId !== group.groupId) {\n this.handleReorder(this._draggedGroupId, group.groupId);\n }\n });\n\n list.appendChild(li);\n }\n\n this._bindTouchListEvents(list);\n }\n\n _announce(message: string) {\n const region = this.shadowRoot?.querySelector(\"#live-region\");\n\n if (region) {\n region.textContent = \"\";\n\n // Force re-announcement by toggling content in the next frame\n requestAnimationFrame(() => {\n region.textContent = message;\n });\n }\n }\n\n /**\n * Bind touch move/end on the list for cross-item dragging.\n */\n _bindTouchListEvents(list: Element) {\n // Remove old listeners by replacing with clone if needed; simpler: use a flag\n if ((list as any)._touchBound) {\n return;\n }\n\n (list as any)._touchBound = true;\n\n list.addEventListener(\n \"touchmove\",\n (e) => {\n if (this._touchDraggedGroupId === null) {\n return;\n }\n\n const touch = this._findTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n e.preventDefault();\n\n // Find which item is under the touch point\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (\n target &&\n target.getAttribute(\"data-group-id\") !== this._touchDraggedGroupId\n ) {\n target.classList.add(\"drag-over\");\n }\n\n this._updateAutoScrollSpeed(touch.clientY);\n },\n { passive: false },\n );\n\n list.addEventListener(\"touchend\", (e) => {\n if (this._touchDraggedGroupId === null) {\n return;\n }\n\n const touch = this._findChangedTouch(e as TouchEvent);\n if (!touch) {\n return;\n }\n\n const target = this._itemAtPoint(touch.clientX, touch.clientY);\n const targetId = target?.getAttribute(\"data-group-id\");\n\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n\n if (targetId && targetId !== this._touchDraggedGroupId) {\n this.handleReorder(this._touchDraggedGroupId, targetId);\n }\n\n this._stopAutoScroll();\n this._touchDraggedGroupId = null;\n this._touchId = null;\n });\n\n list.addEventListener(\"touchcancel\", () => {\n list\n .querySelectorAll(\".dragging\")\n .forEach((el) => el.classList.remove(\"dragging\"));\n\n list\n .querySelectorAll(\".drag-over\")\n .forEach((el) => el.classList.remove(\"drag-over\"));\n this._stopAutoScroll();\n this._touchDraggedGroupId = null;\n this._touchId = null;\n });\n }\n\n _findChangedTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.changedTouches.length; i++) {\n const t = e.changedTouches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _findTouch(e: TouchEvent): Touch | undefined {\n for (let i = 0; i < e.touches.length; i++) {\n const t = e.touches[i];\n if (t.identifier === this._touchId) {\n return t;\n }\n }\n }\n\n _focusNext(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll('li[tabindex=\"0\"], button:not([disabled])'),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx !== -1 && idx < focusables.length - 1) {\n focusables[idx + 1].focus();\n }\n }\n\n _focusNextItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".conversation-item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".conversation-item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx !== -1 && idx < items.length - 1) {\n items[idx + 1].focus();\n }\n }\n\n _focusPrev(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const focusables = Array.from(\n root.querySelectorAll('li[tabindex=\"0\"], button:not([disabled])'),\n ) as HTMLElement[];\n const idx = focusables.indexOf(current);\n if (idx > 0) {\n focusables[idx - 1].focus();\n }\n }\n\n _focusPrevItem(current: HTMLElement) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const items = Array.from(\n root.querySelectorAll(\".conversation-item\"),\n ) as HTMLElement[];\n const currentItem = current.closest(\".conversation-item\") as HTMLElement;\n const idx = items.indexOf(currentItem);\n if (idx > 0) {\n items[idx - 1].focus();\n }\n }\n\n /**\n * Handle keyboard-based navigation, selection, and reordering.\n * Enter/Space = select, Arrow Down/Right = focus next, Arrow Up/Left = focus prev.\n * M = grab/drop for reorder (when grabbed, Arrows move, Space/Enter drop).\n */\n _handleKeyboard(e: KeyboardEvent, groupId: string, name: string) {\n const groups = orchestratorStore.groups || [];\n const ids = groups.map((g) => g.groupId);\n const total = ids.length;\n\n if (this._keyboardGrabbedId === null) {\n // Navigation & Selection\n if (e.key === \"ArrowDown\") {\n e.preventDefault();\n this._focusNextItem(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \"ArrowUp\") {\n e.preventDefault();\n this._focusPrevItem(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \"ArrowRight\") {\n e.preventDefault();\n this._focusNext(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \"ArrowLeft\") {\n e.preventDefault();\n this._focusPrev(e.target as HTMLElement);\n\n return;\n }\n\n if (e.key === \" \" || e.key === \"Spacebar\" || e.key === \"Enter\") {\n // If we are on the LI itself, select it\n if ((e.target as HTMLElement).classList.contains(\"conversation-item\")) {\n e.preventDefault();\n this.handleSwitch(groupId);\n }\n\n // If on a button, the default button behavior handles it (click event)\n return;\n }\n\n // Grab for reorder\n if (e.key === \"m\" || e.key === \"M\") {\n e.preventDefault();\n this._keyboardGrabbedId = groupId;\n const pos = ids.indexOf(groupId) + 1;\n this._announce(\n `${name} grabbed. Current position ${pos} of ${total}. Use Arrow Up and Down to move, Space or Enter to drop.`,\n );\n this.render();\n }\n\n return;\n }\n\n // Currently grabbed\n if (e.key === \"Escape\") {\n e.preventDefault();\n this._announce(\n `Reorder cancelled. ${name} returned to original position.`,\n );\n this._keyboardGrabbedId = null;\n this.render();\n\n return;\n }\n\n if (e.key === \" \" || e.key === \"Spacebar\" || e.key === \"Enter\") {\n // Drop\n e.preventDefault();\n const pos = ids.indexOf(this._keyboardGrabbedId) + 1;\n const droppedName =\n groups.find((g) => g.groupId === this._keyboardGrabbedId)?.name || \"\";\n this._announce(\n `${droppedName} dropped at position ${pos} of ${total}. Reordering complete.`,\n );\n this._keyboardGrabbedId = null;\n this.render();\n\n return;\n }\n\n if (e.key === \"ArrowUp\" || e.key === \"ArrowDown\") {\n e.preventDefault();\n const currentIdx = ids.indexOf(this._keyboardGrabbedId);\n const newIdx = e.key === \"ArrowUp\" ? currentIdx - 1 : currentIdx + 1;\n if (newIdx < 0 || newIdx >= total) {\n return;\n }\n\n // Swap\n ids.splice(currentIdx, 1);\n ids.splice(newIdx, 0, this._keyboardGrabbedId);\n this._announce(`Moved to position ${newIdx + 1} of ${total}.`);\n this.handleReorder(this._keyboardGrabbedId, ids[currentIdx], ids);\n }\n }\n\n _initResizeHandle() {\n const handle = (this.shadowRoot as ShadowRoot).querySelector(\n \".resize-handle\",\n );\n\n if (!handle) {\n return;\n }\n\n let activePointerId: number | null = null;\n\n const onPointerMove = (e: PointerEvent) => {\n if (e.pointerId !== activePointerId) {\n return;\n }\n\n const parentRect = this.parentElement?.getBoundingClientRect();\n if (!parentRect) {\n return;\n }\n\n const rect = this.getBoundingClientRect();\n const newHeight = rect.bottom - e.clientY;\n const minHeight = 80;\n const maxHeight = parentRect.height - 60;\n const clamped = Math.max(minHeight, Math.min(maxHeight, newHeight));\n\n this.style.flex = \"none\";\n this.style.height = `${clamped}px`;\n };\n\n const stopResize = () => {\n if (activePointerId === null) {\n return;\n }\n\n activePointerId = null;\n handle.classList.remove(\"active\");\n\n document.removeEventListener(\n \"pointermove\",\n onPointerMove as EventListener,\n );\n\n this._persistHeight();\n };\n\n const onPointerUp = (e: PointerEvent) => {\n if (e.pointerId !== activePointerId) {\n return;\n }\n\n stopResize();\n };\n\n handle.addEventListener(\"pointerdown\", (e: Event) => {\n const pointerEvent = e as PointerEvent;\n if (\n pointerEvent.pointerType === \"mouse\" &&\n pointerEvent.button !== 0 &&\n pointerEvent.button !== -1\n ) {\n return;\n }\n\n pointerEvent.preventDefault();\n\n activePointerId = pointerEvent.pointerId;\n handle.classList.add(\"active\");\n\n handle.setPointerCapture(pointerEvent.pointerId);\n document.addEventListener(\"pointermove\", onPointerMove as EventListener);\n });\n\n handle.addEventListener(\"pointerup\", onPointerUp as EventListener);\n handle.addEventListener(\"pointercancel\", stopResize);\n\n handle.addEventListener(\"dblclick\", () => {\n this.style.flex = \"\";\n this.style.height = \"\";\n\n this._persistHeight(0);\n });\n }\n\n private _isSpawnSubagentEnabledInCurrentScope(): boolean {\n if (\n Array.isArray(this._pendingDetailsToolTags) &&\n this._pendingDetailsToolTags.length > 0\n ) {\n return this._pendingDetailsToolTags.includes(\"spawn_subagent\");\n }\n\n return toolsStore.enabledToolNames.has(\"spawn_subagent\");\n }\n\n _itemAtPoint(x: number, y: number): Element | null {\n // elementFromPoint on shadowRoot for Shadow DOM\n const root = this.shadowRoot;\n if (!root) {\n return null;\n }\n\n const el = root.elementFromPoint(x, y);\n\n return el?.closest?.(\".conversation-item\") || null;\n }\n\n _setupDialogListeners() {\n const root = this.shadowRoot as ShadowRoot;\n\n // Create dialog\n const createDialog = root.querySelector(\n \".conversations__create-dialog\",\n ) as HTMLDialogElement | null;\n const createForm = root.querySelector(\n \".conversations__create-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const createCancel = root.querySelector(\n \".conversations__create-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n createCancel?.addEventListener(\"click\", () => {\n createDialog?.close();\n });\n\n createForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitCreateDialog();\n });\n\n // Details dialog\n const detailsDialog = root.querySelector(\n \".conversations__details-dialog\",\n ) as HTMLDialogElement | null;\n const detailsForm = root.querySelector(\n \".conversations__details-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const detailsCancel = root.querySelector(\n \".conversations__details-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n detailsCancel?.addEventListener(\"click\", () => {\n detailsDialog?.close();\n this._pendingRenameGroupId = null;\n this._pendingRenameName = null;\n this._pendingDetailsToolTags = null;\n this._pendingDetailsPinnedProvider = null;\n this._pendingDetailsPinnedModel = null;\n this._pendingDetailsProviderRuntimeOverrides = {};\n this._pendingDetailsSubagentMode = \"automatic\";\n this._pendingDetailsSubagentMaxTokens = null;\n this._pendingDetailsSubagentProvider = null;\n this._pendingDetailsSubagentModel = null;\n });\n\n detailsForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitDetailsDialog();\n });\n\n // Delete dialog\n const deleteDialog = root.querySelector(\n \".conversations__delete-dialog\",\n ) as HTMLDialogElement | null;\n const deleteForm = root.querySelector(\n \".conversations__delete-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const deleteCancel = root.querySelector(\n \".conversations__delete-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n deleteCancel?.addEventListener(\"click\", () => {\n deleteDialog?.close();\n this._pendingDeleteGroupId = null;\n });\n\n deleteForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitDeleteDialog();\n });\n\n // Clone dialog\n const cloneDialog = root.querySelector(\n \".conversations__clone-dialog\",\n ) as HTMLDialogElement | null;\n const cloneForm = root.querySelector(\n \".conversations__clone-dialog .conversations__form\",\n ) as HTMLFormElement | null;\n const cloneCancel = root.querySelector(\n \".conversations__clone-dialog .conversations__cancel\",\n ) as HTMLButtonElement | null;\n\n cloneCancel?.addEventListener(\"click\", () => {\n cloneDialog?.close();\n this._pendingCloneGroupId = null;\n });\n\n cloneForm?.addEventListener(\"submit\", async (e) => {\n e.preventDefault();\n await this._submitCloneDialog();\n });\n }\n\n _startAutoScroll() {\n if (this._autoScrollActive) {\n return;\n }\n this._autoScrollActive = true;\n\n const scrollLoop = () => {\n if (!this._autoScrollActive) {\n return;\n }\n\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".conversation-list\",\n ) as HTMLElement | null;\n if (content && this._autoScrollSpeed !== 0) {\n content.scrollTop += this._autoScrollSpeed;\n }\n\n requestAnimationFrame(scrollLoop);\n };\n\n requestAnimationFrame(scrollLoop);\n }\n\n _stopAutoScroll() {\n this._autoScrollActive = false;\n this._autoScrollSpeed = 0;\n }\n\n _updateAutoScrollSpeed(clientY: number) {\n const root = this.shadowRoot;\n const content = root?.querySelector(\n \".conversation-list\",\n ) as HTMLElement | null;\n if (!content) {\n this._autoScrollSpeed = 0;\n return;\n }\n\n const rect = content.getBoundingClientRect();\n const threshold = 50; // pixels from top/bottom to start scrolling\n\n const distTop = clientY - rect.top;\n const distBottom = rect.bottom - clientY;\n\n if (distTop >= 0 && distTop < threshold) {\n // Near the top: scroll up. Speed is faster the closer to the edge.\n this._autoScrollSpeed = -((threshold - distTop) / threshold) * 8;\n this._startAutoScroll();\n } else if (distBottom >= 0 && distBottom < threshold) {\n // Near the bottom: scroll down.\n this._autoScrollSpeed = ((threshold - distBottom) / threshold) * 8;\n this._startAutoScroll();\n } else {\n this._autoScrollSpeed = 0;\n }\n }\n\n private async _loadProviderModels(\n provider: LLMProvider,\n ): Promise<ProviderModelItem[]> {\n if (Array.isArray(provider.models) && provider.models.length > 0) {\n return provider.models as ProviderModelItem[];\n }\n\n if (!provider.modelsUrl) {\n return [];\n }\n\n const headers: Record<string, string> = {\n ...(provider.headers || {}),\n ...(orchestratorStore.orchestrator\n ? getProviderRuntimeHeaders(\n orchestratorStore.orchestrator,\n provider.id,\n \"\",\n this._pendingDetailsProviderRuntimeOverrides,\n )\n : {}),\n };\n\n if (this.db && provider.apiKeyHeader && orchestratorStore.orchestrator) {\n const apiKey =\n await orchestratorStore.orchestrator.getApiKeyForSpecificProvider(\n this.db,\n provider.id,\n );\n if (apiKey) {\n const format = provider.apiKeyHeaderFormat || \"{key}\";\n headers[provider.apiKeyHeader] = format.replace(\"{key}\", apiKey);\n }\n }\n\n const response = await fetch(provider.modelsUrl, { headers });\n if (!response.ok) {\n throw new Error(`HTTP ${response.status}`);\n }\n\n const data = await response.json();\n let items: ProviderModelItem[] = [];\n\n if (Array.isArray(data)) {\n items = data as ProviderModelItem[];\n } else if (data && typeof data === \"object\") {\n const dataObject = data as Record<string, unknown>;\n if (Array.isArray(dataObject.models)) {\n items = dataObject.models as ProviderModelItem[];\n } else if (Array.isArray(dataObject.data)) {\n items = dataObject.data as ProviderModelItem[];\n } else {\n for (const value of Object.values(dataObject)) {\n if (Array.isArray(value) && value.length > 0) {\n items = value as ProviderModelItem[];\n\n break;\n }\n }\n\n if (items.length === 0 && (dataObject.id || dataObject.name)) {\n items = [dataObject as ProviderModelItem];\n }\n }\n }\n\n if (Array.isArray(provider.models) && provider.models.length > 0) {\n const dynamicIds = new Set(\n items\n .map((item) =>\n typeof item === \"string\" ? item : item.id || item.name || \"\",\n )\n .filter(Boolean),\n );\n const staticItems = (provider.models as ProviderModelItem[]).filter(\n (item) => {\n const modelId =\n typeof item === \"string\" ? item : item.id || item.name || \"\";\n\n return modelId && !dynamicIds.has(modelId);\n },\n );\n items = [...staticItems, ...items];\n }\n\n return items;\n }\n\n /**\n * Persist the current height to IndexedDB.\n */\n async _persistHeight(height?: number) {\n if (!this.db) {\n return;\n }\n\n const val =\n height !== undefined ? height : this.getBoundingClientRect().height;\n\n await setConfig(this.db, CONFIG_KEYS.CONVERSATIONS_HEIGHT, val || 0);\n }\n\n async _submitCloneDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (!root || !this.db || !this._pendingCloneGroupId) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__clone-dialog\",\n ) as HTMLDialogElement | null;\n\n await orchestratorStore.cloneConversation(\n this.db,\n this._pendingCloneGroupId,\n );\n dialog?.close();\n this._pendingCloneGroupId = null;\n }\n\n async _submitCreateDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (!root || !this.db) {\n return;\n }\n\n const input = root.querySelector(\n \".conversations__create-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n const dialog = root.querySelector(\n \".conversations__create-dialog\",\n ) as HTMLDialogElement | null;\n\n const name = input?.value.trim();\n if (!name) {\n return;\n }\n\n await orchestratorStore.createConversation(this.db, name);\n dialog?.close();\n }\n\n async _submitDeleteDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (!root || !this.db || !this._pendingDeleteGroupId) {\n return;\n }\n\n const dialog = root.querySelector(\n \".conversations__delete-dialog\",\n ) as HTMLDialogElement | null;\n\n await orchestratorStore.deleteConversation(\n this.db,\n this._pendingDeleteGroupId,\n );\n dialog?.close();\n this._pendingDeleteGroupId = null;\n }\n\n async _submitDetailsDialog() {\n const root = this.shadowRoot as ShadowRoot;\n if (\n !root ||\n !this.db ||\n !this._pendingRenameGroupId ||\n !this._pendingRenameName\n ) {\n return;\n }\n\n const input = root.querySelector(\n \".conversations__details-dialog .conversations__input\",\n ) as HTMLInputElement | null;\n const dialog = root.querySelector(\n \".conversations__details-dialog\",\n ) as HTMLDialogElement | null;\n\n const name = input?.value.trim();\n\n if (name && name !== this._pendingRenameName) {\n await orchestratorStore.renameConversation(\n this.db,\n this._pendingRenameGroupId,\n name,\n );\n }\n\n if (this._pendingDetailsToolTags) {\n await orchestratorStore.updateConversationToolTags(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsToolTags,\n );\n }\n\n await orchestratorStore.updateConversationPinnedProvider(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsPinnedProvider || undefined,\n this._pendingDetailsPinnedModel || undefined,\n this._pendingDetailsPinnedMaxTokens || undefined,\n );\n\n await orchestratorStore.updateConversationProviderRuntimeOverrides(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsProviderRuntimeOverrides,\n );\n\n await orchestratorStore.updateConversationSubagentSettings(\n this.db,\n this._pendingRenameGroupId,\n this._pendingDetailsSubagentMode,\n this._pendingDetailsSubagentProvider || undefined,\n this._pendingDetailsSubagentModel || undefined,\n this._pendingDetailsSubagentMaxTokens || undefined,\n );\n\n dialog?.close();\n this._pendingRenameGroupId = null;\n this._pendingRenameName = null;\n this._pendingDetailsToolTags = null;\n this._pendingDetailsPinnedMaxTokens = null;\n this._pendingDetailsPinnedProvider = null;\n this._pendingDetailsPinnedModel = null;\n this._pendingDetailsProviderRuntimeOverrides = {};\n this._pendingDetailsSubagentMode = \"automatic\";\n this._pendingDetailsSubagentMaxTokens = null;\n this._pendingDetailsSubagentProvider = null;\n this._pendingDetailsSubagentModel = null;\n }\n}\n\ncustomElements.define(\"shadow-claw-conversations\", ShadowClawConversations);\n"],"mappings":"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"}