shadow-claw 1.26.0 → 1.27.1

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 +148 -15
  8. package/bin/build/build.test.mjs +128 -0
  9. package/bin/cli.mjs +35 -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 +447 -0
  13. package/bin/commands/skills-index.test.mjs +243 -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 +32 -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 +14 -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,8 +2,8 @@ import ShadowClawElement from "./components/shadow-claw-element.js";
2
2
  import { n as getDb } from "./txPromise-CuGh-TGK.js";
3
3
  import { b as OAUTH_PROVIDER_DEFINITIONS, 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";
6
- import { c as escapeHtml, n as setSanitizedHtml } from "./trusted-types-CkLDpLiZ.js";
5
+ import { t as orchestratorStore } from "./orchestrator-KRjx0eba.js";
6
+ import { c as escapeHtml, n as setSanitizedHtml } from "./trusted-types-Dx0RZlrd.js";
7
7
  import { f as detectProvider, h as resolveStoredCredentialAuthMode } from "./mcp-reconnect-C86MR3z8.js";
8
8
  import { a as showSuccess, r as showError } from "./toast-DZ6r7_YI.js";
9
9
  import "./shadow-claw-empty-state-DPfDqaMA.js";
@@ -931,7 +931,7 @@ var ShadowClawGit = class extends ShadowClawElement {
931
931
  await setConfig(this.db, CONFIG_KEYS.GIT_CORS_PROXY, proxyPref);
932
932
  if (proxyPref === "custom") {
933
933
  const url = root.querySelector("[data-setting=\"git-proxy-url-input\"]")?.value.trim() || "/git-proxy";
934
- const { orchestratorStore } = await import("./orchestrator-DCfomsn9.js").then((n) => n.n);
934
+ const { orchestratorStore } = await import("./orchestrator-KRjx0eba.js").then((n) => n.n);
935
935
  await orchestratorStore.setGitProxyUrl(this.db, url);
936
936
  }
937
937
  const nameInput = root.querySelector("[data-setting=\"git-author-name-input\"]");
@@ -976,4 +976,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
976
976
 
977
977
  //#endregion
978
978
  export { ShadowClawGit as t };
979
- //# sourceMappingURL=shadow-claw-git-tcSpT-P0.js.map
979
+ //# sourceMappingURL=shadow-claw-git-Bg1SWgsF.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shadow-claw-git-tcSpT-P0.js","names":["shadowClawGitStyles","shadowClawGitTemplate"],"sources":["../../src/components/settings/shadow-claw-git/shadow-claw-git.ts"],"sourcesContent":["import {\n CONFIG_KEYS,\n OAUTH_PROVIDER_DEFINITIONS,\n} from \"../../../config/config.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\nimport { showError, showSuccess } from \"../../../ui/toast.js\";\nimport { escapeHtml } from \"../../../utils/utils.js\";\nimport { setSanitizedHtml } from \"../../../security/trusted-types.js\";\nimport {\n resolveStoredCredentialAuthMode,\n type PendingOAuthResult,\n} from \"../../../subsystems/accounts/stored-credentials.js\";\n\nimport { getDb, type ShadowClawDatabase } from \"../../../db/db.js\";\nimport { detectProvider } from \"../../../subsystems/git/credentials.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport \"../../common/shadow-claw-empty-state/shadow-claw-empty-state.js\";\nimport \"../../common/shadow-claw-actions/shadow-claw-actions.js\";\nimport \"../../common/shadow-claw-card/shadow-claw-card.js\";\n\nimport { GitAccount } from \"../../../subsystems/git/types.js\";\nimport shadowClawGitStyles from \"./shadow-claw-git.css\" with { type: \"css\" };\nimport shadowClawGitTemplate from \"./shadow-claw-git.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-git\";\nconst GIT_OAUTH_PROVIDER_IDS = [\"github\", \"gitlab\", \"azure_devops\"];\n\nfunction mapDetectedProviderToOAuthProviderId(\n provider: ReturnType<typeof detectProvider>,\n): string | undefined {\n if (provider === \"azure-devops\") {\n return \"azure_devops\";\n }\n\n if (provider === \"github\" || provider === \"gitlab\") {\n return provider;\n }\n\n return undefined;\n}\n\nfunction resolveGitAccountAuthMode(\n account: GitAccount | null,\n): \"token\" | \"oauth\" | \"basic\" {\n return resolveStoredCredentialAuthMode(account);\n}\n\nexport class ShadowClawGit extends ShadowClawElement {\n static styles = shadowClawGitStyles;\n static template = shadowClawGitTemplate;\n\n accounts: GitAccount[] = [];\n db: ShadowClawDatabase | null = null;\n defaultAccountId: string = \"\";\n editingAccountId: string | null = null;\n pendingOauthResult: PendingOAuthResult | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.db = await getDb();\n\n await this.render();\n\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"save-git-settings\"]')\n ?.addEventListener(\"click\", () => this.saveGitSettings());\n\n root.querySelectorAll('input[name=\"git-proxy\"]').forEach((radio) => {\n radio.addEventListener(\"change\", () => {\n this.updateGitWarning();\n this.updateCustomProxyVisibility();\n });\n });\n\n root\n .querySelector('[data-action=\"add-account\"]')\n ?.addEventListener(\"click\", () => this.showAccountForm(\"new\"));\n\n root\n .querySelector('[data-region=\"account-list\"]')\n ?.addEventListener(\"settings-action\", (event) => {\n const detail = (event as CustomEvent<{ action: string; id: string }>)\n .detail;\n const { action, id } = detail || { action: \"\", id: \"\" };\n\n if (!id) {\n return;\n }\n\n if (action === \"edit-account\") {\n this.showAccountForm(id);\n } else if (action === \"delete-account\") {\n this.deleteAccount(id);\n } else if (action === \"set-default\") {\n this.setDefaultAccount(id);\n }\n });\n }\n\n /**\n * Hide the account form.\n */\n hideAccountForm() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const slot = root.querySelector('[data-region=\"account-form-slot\"]');\n if (slot) {\n slot.replaceChildren();\n }\n\n this.editingAccountId = null;\n this.pendingOauthResult = null;\n }\n\n /**\n * Render the account card list.\n */\n renderAccountList() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const listEl = root.querySelector('[data-region=\"account-list\"]');\n if (!listEl) {\n return;\n }\n\n listEl.replaceChildren();\n\n if (this.accounts.length === 0) {\n const emptyState = document.createElement(\"shadow-claw-empty-state\");\n emptyState.setAttribute(\"message\", \"No Git accounts configured.\");\n emptyState.setAttribute(\n \"hint\",\n \"Click '+ Add Git Account' to get started.\",\n );\n listEl.append(emptyState);\n\n return;\n }\n\n const fragment = document.createDocumentFragment();\n\n this.accounts.forEach((acct) => {\n const isDefault = acct.id === this.defaultAccountId;\n const hasToken = !!acct.token;\n const hasUser = !!acct.username;\n const authMode = resolveGitAccountAuthMode(acct);\n const authLabel = hasToken\n ? authMode === \"oauth\"\n ? acct.oauthReauthRequired\n ? \"Reconnect required\"\n : `OAuth token saved${acct.oauthProviderId ? ` (${acct.oauthProviderId})` : \"\"}`\n : \"Token (PAT)\"\n : hasUser\n ? `Username: ${acct.username}`\n : \"No credentials\";\n const cardMeta = `${acct.hostPattern} · ${authLabel}`;\n\n const card = document.createElement(\"shadow-claw-card\");\n card.setAttribute(\"data-account-id\", acct.id);\n card.setAttribute(\"label\", acct.label);\n card.setAttribute(\"meta\", cardMeta);\n if (isDefault) {\n card.setAttribute(\"highlight\", \"\");\n card.setAttribute(\"badge\", \"Default\");\n }\n\n const actions = document.createElement(\"shadow-claw-actions\");\n actions.setAttribute(\"slot\", \"actions\");\n actions.setAttribute(\"kind\", \"account\");\n actions.setAttribute(\"item-id\", acct.id);\n if (isDefault) {\n actions.setAttribute(\"is-default\", \"\");\n }\n\n card.append(actions);\n fragment.append(card);\n });\n\n listEl.append(fragment);\n }\n\n /**\n * Show the inline account form for adding or editing.\n */\n showAccountForm(accountId: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n this.editingAccountId = accountId;\n this.pendingOauthResult = null;\n const isNew = accountId === \"new\";\n const existing = isNew\n ? null\n : this.accounts.find((a) => a.id === accountId);\n const selectedAuthMode = resolveGitAccountAuthMode(existing || null);\n const inferredProviderId = existing?.oauthProviderId\n ? existing.oauthProviderId\n : mapDetectedProviderToOAuthProviderId(\n detectProvider(existing?.hostPattern || \"\"),\n );\n\n const oauthProviderId =\n inferredProviderId && OAUTH_PROVIDER_DEFINITIONS[inferredProviderId]\n ? inferredProviderId\n : \"github\";\n const oauthScope = existing?.scopes?.join(\" \") || \"\";\n const oauthProviderOptions = GIT_OAUTH_PROVIDER_IDS.filter(\n (providerId) => !!OAUTH_PROVIDER_DEFINITIONS[providerId],\n )\n .map((providerId) => {\n const provider = OAUTH_PROVIDER_DEFINITIONS[providerId];\n\n return `<option value=\"${provider.id}\"${provider.id === oauthProviderId ? \" selected\" : \"\"}>${escapeHtml(provider.name)}</option>`;\n })\n .join(\"\");\n\n const slot = root.querySelector('[data-region=\"account-form-slot\"]');\n if (!slot) {\n return;\n }\n\n setSanitizedHtml(\n slot,\n `\n <div class=\"account-form\">\n <h4>${isNew ? \"Add Git Account\" : \"Edit Account\"}</h4>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Label</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-label\"\n placeholder=\"e.g. GitHub, Azure DevOps\"\n value=\"${escapeHtml(existing?.label || \"\")}\" />\n <div class=\"form-helper\">A friendly name to identify this account.</div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Host Pattern</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-host\"\n placeholder=\"e.g. github.com, dev.azure.com\"\n value=\"${escapeHtml(existing?.hostPattern || \"\")}\" />\n <div class=\"form-helper\">\n Matched against remote URLs to auto-select credentials.\n </div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Auth Mode</label>\n <select class=\"form-input\" data-field=\"acct-auth-mode\">\n <option value=\"token\"${selectedAuthMode === \"token\" ? \" selected\" : \"\"}>PAT / Username</option>\n <option value=\"oauth\"${selectedAuthMode === \"oauth\" ? \" selected\" : \"\"}>OAuth</option>\n </select>\n <div class=\"form-helper\">Use OAuth for provider-managed access tokens or PAT for manual Git credentials.</div>\n </div>\n\n <div class=\"oauth-fields\" data-region=\"oauth-fields\">\n <div class=\"form-group\">\n <label class=\"form-label\">OAuth Provider</label>\n <select class=\"form-input\" data-field=\"acct-oauth-provider\">${oauthProviderOptions}</select>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">OAuth Client ID</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-oauth-client-id\"\n value=\"${escapeHtml(existing?.oauthClientId || \"\")}\"\n placeholder=\"Enter provider OAuth app client ID\" />\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">OAuth Client Secret (if required)</label>\n <input type=\"password\" class=\"form-input\" data-field=\"acct-oauth-client-secret\"\n placeholder=\"${existing?.oauthClientSecret ? \"•••••••••••• (Saved)\" : \"Enter client secret if provider requires it\"}\" />\n <div class=\"form-helper\">Stored encrypted locally. Needed by some providers for token exchange/refresh.</div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">OAuth Scope (if required)</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-oauth-scope\"\n value=\"${escapeHtml(oauthScope)}\"\n placeholder=\"space-separated scopes\" />\n <div class=\"form-helper\">Leave blank to use provider defaults.</div>\n </div>\n\n <div class=\"form-group oauth-connect-row\">\n <button class=\"confirm-btn oauth-connect-btn\" data-action=\"connect-oauth\" type=\"button\">Connect OAuth</button>\n <span class=\"oauth-status\" data-region=\"oauth-status\">${selectedAuthMode === \"oauth\" && existing?.oauthReauthRequired ? \"Reconnect required\" : selectedAuthMode === \"oauth\" && existing?.token ? \"OAuth token already saved\" : \"Not connected\"}</span>\n </div>\n </div>\n\n <div data-region=\"pat-fields\">\n <div class=\"form-group\">\n <label class=\"form-label\">Token (PAT)</label>\n <input type=\"password\" class=\"form-input\" data-field=\"acct-token\"\n placeholder=\"${existing?.token ? \"•••••••••••• (Saved)\" : \"ghp_xxxx or Azure PAT\"}\" />\n <div class=\"form-helper\">\n Stored encrypted locally. Leave blank to keep existing.\n </div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Username</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-username\"\n placeholder=\"Optional — alternative to PAT\"\n value=\"${escapeHtml(existing?.username || \"\")}\" />\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Password</label>\n <input type=\"password\" class=\"form-input\" data-field=\"acct-password\"\n placeholder=\"${existing?.password ? \"•••••••••••• (Saved)\" : \"Optional — used with username\"}\" />\n <div class=\"form-helper\">Stored encrypted locally. Leave blank to keep existing.</div>\n </div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Author Name (optional)</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-author-name\"\n placeholder=\"Override default author for this account\"\n value=\"${escapeHtml(existing?.authorName || \"\")}\" />\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Author Email (optional)</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-author-email\"\n placeholder=\"Override default author email for this account\"\n value=\"${escapeHtml(existing?.authorEmail || \"\")}\" />\n </div>\n\n <div class=\"account-form-actions\">\n <button class=\"confirm-btn\" data-action=\"save-account\">\n ${isNew ? \"Add Account\" : \"Update Account\"}\n </button>\n <button class=\"cancel-btn\" data-action=\"cancel-account-form\">Cancel</button>\n </div>\n </div>`,\n );\n\n slot\n .querySelector('[data-action=\"save-account\"]')\n ?.addEventListener(\"click\", () => this.saveAccountForm());\n slot\n .querySelector('[data-action=\"cancel-account-form\"]')\n ?.addEventListener(\"click\", () => this.hideAccountForm());\n slot\n .querySelector('[data-field=\"acct-auth-mode\"]')\n ?.addEventListener(\"change\", () => this.updateAuthModeVisibility(slot));\n slot\n .querySelector('[data-action=\"connect-oauth\"]')\n ?.addEventListener(\"click\", () => void this.connectOAuthFromForm(slot));\n\n this.updateAuthModeVisibility(slot);\n }\n\n updateAuthModeVisibility(slot: Element) {\n const mode = (\n slot.querySelector('[data-field=\"acct-auth-mode\"]') as HTMLSelectElement\n )?.value;\n const isOAuth = mode === \"oauth\";\n\n const oauthRegion = slot.querySelector('[data-region=\"oauth-fields\"]');\n const patRegion = slot.querySelector('[data-region=\"pat-fields\"]');\n\n if (oauthRegion instanceof HTMLElement) {\n oauthRegion.style.display = isOAuth ? \"block\" : \"none\";\n }\n\n if (patRegion instanceof HTMLElement) {\n patRegion.style.display = isOAuth ? \"none\" : \"block\";\n }\n }\n\n /**\n * Show/hide the custom proxy URL input based on current radio selection.\n */\n updateCustomProxyVisibility() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const customRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-custom\"]',\n );\n\n const field: HTMLElement | null = root.querySelector(\n '[data-region=\"git-custom-proxy-field\"]',\n );\n if (field instanceof HTMLElement) {\n field.style.display = customRadio?.checked ? \"block\" : \"none\";\n }\n }\n\n async connectOAuthFromForm(slot: Element) {\n const providerId = (\n slot.querySelector(\n '[data-field=\"acct-oauth-provider\"]',\n ) as HTMLSelectElement\n )?.value;\n const clientId = (\n slot.querySelector(\n '[data-field=\"acct-oauth-client-id\"]',\n ) as HTMLInputElement\n )?.value.trim();\n const clientSecret = (\n slot.querySelector(\n '[data-field=\"acct-oauth-client-secret\"]',\n ) as HTMLInputElement\n )?.value.trim();\n const scopeRaw = (\n slot.querySelector('[data-field=\"acct-oauth-scope\"]') as HTMLInputElement\n )?.value.trim();\n\n if (!providerId) {\n showError(\"OAuth provider is required.\", 4000);\n\n return;\n }\n\n if (!clientId) {\n showError(\"OAuth client ID is required.\", 4000);\n\n return;\n }\n\n const oauthStatus = slot.querySelector('[data-region=\"oauth-status\"]');\n const connectBtn = slot.querySelector(\n '[data-action=\"connect-oauth\"]',\n ) as HTMLButtonElement | null;\n\n if (oauthStatus) {\n oauthStatus.textContent = \"Starting OAuth...\";\n }\n\n if (connectBtn) {\n connectBtn.disabled = true;\n }\n\n try {\n const scope = scopeRaw\n ? scopeRaw\n .split(/[\\s,]+/)\n .map((token) => token.trim())\n .filter(Boolean)\n : undefined;\n\n const authorizeRes = await fetch(\"/oauth/authorize\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n providerId,\n clientId,\n clientSecret: clientSecret || undefined,\n redirectUri: `${window.location.origin}/oauth/callback`,\n scope,\n }),\n });\n\n const authorizePayload = (await authorizeRes.json()) as {\n state?: string;\n authorizeUrl?: string;\n error?: string;\n };\n\n if (\n !authorizeRes.ok ||\n !authorizePayload.state ||\n !authorizePayload.authorizeUrl\n ) {\n throw new Error(authorizePayload.error || \"OAuth authorize failed\");\n }\n\n window.open(\n authorizePayload.authorizeUrl,\n \"shadowclaw-oauth\",\n \"popup=yes,width=540,height=720\",\n );\n\n const state = authorizePayload.state;\n let status = \"pending\";\n for (let attempt = 0; attempt < 60; attempt++) {\n const sessionRes = await fetch(\n `/oauth/session/${encodeURIComponent(state)}`,\n );\n const sessionPayload = (await sessionRes.json()) as {\n status?: string;\n error?: string;\n };\n\n if (!sessionRes.ok) {\n throw new Error(sessionPayload.error || \"OAuth session not found\");\n }\n\n status = sessionPayload.status || \"pending\";\n\n if (status === \"authorized\") {\n break;\n }\n\n if (status === \"error\") {\n throw new Error(sessionPayload.error || \"OAuth authorization failed\");\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n if (status !== \"authorized\") {\n throw new Error(\"OAuth authorization timed out\");\n }\n\n const tokenRes = await fetch(\"/oauth/token\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ state }),\n });\n\n const tokenPayload = (await tokenRes.json()) as {\n accessToken?: string;\n refreshToken?: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n error?: string;\n };\n\n if (!tokenRes.ok || !tokenPayload.accessToken) {\n throw new Error(tokenPayload.error || \"OAuth token exchange failed\");\n }\n\n this.pendingOauthResult = {\n providerId,\n accessToken: tokenPayload.accessToken,\n refreshToken: tokenPayload.refreshToken,\n expiresAt: tokenPayload.expiresIn\n ? Date.now() + tokenPayload.expiresIn * 1000\n : undefined,\n scope: tokenPayload.scope,\n tokenType: tokenPayload.tokenType,\n };\n\n if (oauthStatus) {\n oauthStatus.textContent = \"OAuth connected\";\n }\n\n showSuccess(\"OAuth connected\", 3000);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (oauthStatus) {\n oauthStatus.textContent = \"OAuth failed\";\n }\n\n showError(`OAuth connect failed: ${message}`, 6000);\n } finally {\n if (connectBtn) {\n connectBtn.disabled = false;\n }\n }\n }\n\n /**\n * Delete an account by id.\n */\n async deleteAccount(id: string) {\n if (!this.db) {\n return;\n }\n\n this.accounts = this.accounts.filter((a) => a.id !== id);\n\n // If we deleted the default, pick a new default\n if (this.defaultAccountId === id) {\n this.defaultAccountId = this.accounts[0]?.id || \"\";\n }\n\n try {\n const { setConfig } = await import(\"../../../db/setConfig.js\");\n await setConfig(this.db, CONFIG_KEYS.GIT_ACCOUNTS, this.accounts);\n await setConfig(\n this.db,\n CONFIG_KEYS.GIT_DEFAULT_ACCOUNT,\n this.defaultAccountId,\n );\n } catch (err) {\n console.warn(\"Error persisting account deletion:\", err);\n }\n\n this.renderAccountList();\n this.updateGitWarning();\n\n showSuccess(\"Account deleted\", 3000);\n }\n\n /**\n * Migrate legacy single-key config into an account entry.\n * Only runs when no accounts exist and a legacy token or username is present.\n */\n async migrateLegacyAccount() {\n if (!this.db) {\n return;\n }\n\n const encToken = await getConfig(this.db, CONFIG_KEYS.GIT_TOKEN);\n const username = await getConfig(this.db, CONFIG_KEYS.GIT_USERNAME);\n\n if (!encToken && !username) {\n return;\n }\n\n const encPassword =\n (await getConfig(this.db, CONFIG_KEYS.GIT_PASSWORD)) || \"\";\n\n const legacy: GitAccount = {\n id: \"legacy-migrated\",\n label: \"GitHub\",\n hostPattern: \"github.com\",\n token: encToken || \"\",\n username: username || \"\",\n password: encPassword,\n authorName: \"\",\n authorEmail: \"\",\n };\n\n this.accounts = [legacy];\n this.defaultAccountId = legacy.id;\n\n const { setConfig } = await import(\"../../../db/setConfig.js\");\n await setConfig(this.db, CONFIG_KEYS.GIT_ACCOUNTS, this.accounts);\n await setConfig(this.db, CONFIG_KEYS.GIT_DEFAULT_ACCOUNT, legacy.id);\n }\n\n async render() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n try {\n const proxyPref =\n (await getConfig(this.db, CONFIG_KEYS.GIT_CORS_PROXY)) || \"local\";\n\n const localRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-local\"]',\n );\n\n const publicRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-public\"]',\n );\n\n const customRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-custom\"]',\n );\n\n const customUrlInput: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-url-input\"]',\n );\n\n if (localRadio && publicRadio && customRadio) {\n localRadio.checked = proxyPref === \"local\";\n publicRadio.checked = proxyPref === \"public\";\n customRadio.checked = proxyPref === \"custom\";\n }\n\n if (customUrlInput) {\n customUrlInput.value = orchestratorStore.gitProxyUrl || \"/git-proxy\";\n }\n\n this.updateCustomProxyVisibility();\n\n const authorNameInput: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-author-name-input\"]',\n );\n\n if (authorNameInput) {\n authorNameInput.value =\n (await getConfig(this.db, CONFIG_KEYS.GIT_AUTHOR_NAME)) ||\n \"ShadowClaw\";\n }\n\n const authorEmailInput: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-author-email-input\"]',\n );\n\n if (authorEmailInput) {\n authorEmailInput.value =\n (await getConfig(this.db, CONFIG_KEYS.GIT_AUTHOR_EMAIL)) ||\n \"agent@example.com\";\n }\n\n // Load accounts\n const raw = await getConfig(this.db, CONFIG_KEYS.GIT_ACCOUNTS);\n this.accounts = Array.isArray(raw) ? raw : [];\n this.defaultAccountId =\n (await getConfig(this.db, CONFIG_KEYS.GIT_DEFAULT_ACCOUNT)) || \"\";\n\n // Migrate legacy single-account if no accounts exist\n if (this.accounts.length === 0) {\n await this.migrateLegacyAccount();\n }\n\n this.renderAccountList();\n this.updateGitWarning();\n } catch (e) {\n console.warn(\"Could not load git settings:\", e);\n }\n }\n\n /**\n * Save the current account form (add or update).\n */\n async saveAccountForm() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const slot: HTMLInputElement | null = root.querySelector(\n '[data-region=\"account-form-slot\"]',\n );\n if (!slot) {\n return;\n }\n\n const label = (\n slot.querySelector('[data-field=\"acct-label\"]') as HTMLInputElement\n )?.value.trim();\n const hostPattern = (\n slot.querySelector('[data-field=\"acct-host\"]') as HTMLInputElement\n )?.value.trim();\n const authMode = (\n slot.querySelector('[data-field=\"acct-auth-mode\"]') as HTMLSelectElement\n )?.value as GitAccount[\"authMode\"];\n\n if (!label || !hostPattern) {\n showError(\"Label and Host Pattern are required.\", 4000);\n\n return;\n }\n\n try {\n const { encryptValue } = await import(\"../../../security/crypto.js\");\n const { setConfig } = await import(\"../../../db/setConfig.js\");\n\n const tokenRaw = (\n slot.querySelector('[data-field=\"acct-token\"]') as HTMLInputElement\n )?.value.trim();\n\n const passwordRaw = (\n slot.querySelector('[data-field=\"acct-password\"]') as HTMLInputElement\n )?.value.trim();\n\n const username =\n (\n slot.querySelector('[data-field=\"acct-username\"]') as HTMLInputElement\n )?.value.trim() || \"\";\n\n const authorName =\n (\n slot.querySelector(\n '[data-field=\"acct-author-name\"]',\n ) as HTMLInputElement\n )?.value.trim() || \"\";\n\n const authorEmail =\n (\n slot.querySelector(\n '[data-field=\"acct-author-email\"]',\n ) as HTMLInputElement\n )?.value.trim() || \"\";\n\n const isNew = this.editingAccountId === \"new\";\n const existing = isNew\n ? null\n : this.accounts.find((a) => a.id === this.editingAccountId);\n\n let token = existing?.token || \"\";\n let password = existing?.password || \"\";\n let oauthProviderId = existing?.oauthProviderId;\n let oauthClientId = existing?.oauthClientId;\n let oauthClientSecret = existing?.oauthClientSecret;\n let accessTokenExpiresAt = existing?.accessTokenExpiresAt;\n let refreshToken = existing?.refreshToken;\n let scopes = existing?.scopes;\n let tokenType = existing?.tokenType;\n let oauthRefreshFailureCount = existing?.oauthRefreshFailureCount;\n let oauthReauthRequired = existing?.oauthReauthRequired;\n let oauthReauthRequiredAt = existing?.oauthReauthRequiredAt;\n\n if (authMode === \"oauth\") {\n oauthProviderId = (\n slot.querySelector(\n '[data-field=\"acct-oauth-provider\"]',\n ) as HTMLSelectElement\n )?.value;\n oauthClientId = (\n slot.querySelector(\n '[data-field=\"acct-oauth-client-id\"]',\n ) as HTMLInputElement\n )?.value.trim();\n const oauthClientSecretRaw = (\n slot.querySelector(\n '[data-field=\"acct-oauth-client-secret\"]',\n ) as HTMLInputElement\n )?.value.trim();\n const oauthScopeRaw = (\n slot.querySelector(\n '[data-field=\"acct-oauth-scope\"]',\n ) as HTMLInputElement\n )?.value.trim();\n const configuredScopes = oauthScopeRaw\n ? oauthScopeRaw\n .split(/[\\s,]+/)\n .map((entry) => entry.trim())\n .filter(Boolean)\n : undefined;\n\n if (!oauthProviderId) {\n showError(\"OAuth provider is required for OAuth mode.\", 4000);\n\n return;\n }\n\n if (!oauthClientId) {\n showError(\"OAuth client ID is required for OAuth mode.\", 4000);\n\n return;\n }\n\n if (oauthClientSecretRaw) {\n const encryptedClientSecret =\n await encryptValue(oauthClientSecretRaw);\n if (encryptedClientSecret) {\n oauthClientSecret = encryptedClientSecret;\n }\n }\n\n if (this.pendingOauthResult?.accessToken) {\n const encryptedAccessToken = await encryptValue(\n this.pendingOauthResult.accessToken,\n );\n if (encryptedAccessToken) {\n token = encryptedAccessToken;\n }\n\n if (this.pendingOauthResult.refreshToken) {\n const encryptedRefreshToken = await encryptValue(\n this.pendingOauthResult.refreshToken,\n );\n if (encryptedRefreshToken) {\n refreshToken = encryptedRefreshToken;\n }\n }\n\n accessTokenExpiresAt = this.pendingOauthResult.expiresAt;\n scopes = this.pendingOauthResult.scope\n ? this.pendingOauthResult.scope\n .split(/[\\s,]+/)\n .map((entry) => entry.trim())\n .filter(Boolean)\n : configuredScopes || scopes;\n tokenType = this.pendingOauthResult.tokenType;\n oauthRefreshFailureCount = 0;\n oauthReauthRequired = false;\n oauthReauthRequiredAt = undefined;\n } else {\n scopes = configuredScopes || scopes;\n }\n\n if (!token) {\n showError(\n \"Connect OAuth first to obtain an access token for this account.\",\n 5000,\n );\n\n return;\n }\n\n password = \"\";\n } else {\n if (tokenRaw) {\n const enc = await encryptValue(tokenRaw);\n if (enc) {\n token = enc;\n }\n }\n\n if (passwordRaw) {\n const enc = await encryptValue(passwordRaw);\n if (enc) {\n password = enc;\n }\n }\n\n oauthProviderId = undefined;\n oauthClientId = undefined;\n oauthClientSecret = undefined;\n accessTokenExpiresAt = undefined;\n refreshToken = undefined;\n scopes = undefined;\n tokenType = undefined;\n oauthRefreshFailureCount = undefined;\n oauthReauthRequired = undefined;\n oauthReauthRequiredAt = undefined;\n }\n\n if (isNew) {\n const { ulid } = await import(\"../../../utils/ulid.js\");\n const acct: GitAccount = {\n id: ulid(),\n label,\n hostPattern,\n token,\n username: authMode === \"oauth\" ? \"\" : username,\n password,\n authorName,\n authorEmail,\n authMode: authMode || \"token\",\n oauthProviderId,\n oauthClientId,\n oauthClientSecret,\n accessTokenExpiresAt,\n refreshToken,\n scopes,\n tokenType,\n oauthRefreshFailureCount,\n oauthReauthRequired,\n oauthReauthRequiredAt,\n };\n\n this.accounts.push(acct);\n\n // First account becomes default automatically\n if (this.accounts.length === 1) {\n this.defaultAccountId = acct.id;\n\n await setConfig(this.db, CONFIG_KEYS.GIT_DEFAULT_ACCOUNT, acct.id);\n }\n } else if (existing) {\n existing.label = label;\n existing.hostPattern = hostPattern;\n existing.token = token;\n existing.username = authMode === \"oauth\" ? \"\" : username;\n existing.password = password;\n existing.authorName = authorName;\n existing.authorEmail = authorEmail;\n existing.authMode = authMode || \"token\";\n existing.oauthProviderId = oauthProviderId;\n existing.oauthClientId = oauthClientId;\n existing.oauthClientSecret = oauthClientSecret;\n existing.accessTokenExpiresAt = accessTokenExpiresAt;\n existing.refreshToken = refreshToken;\n existing.scopes = scopes;\n existing.tokenType = tokenType;\n existing.oauthRefreshFailureCount = oauthRefreshFailureCount;\n existing.oauthReauthRequired = oauthReauthRequired;\n existing.oauthReauthRequiredAt = oauthReauthRequiredAt;\n }\n\n await setConfig(this.db, CONFIG_KEYS.GIT_ACCOUNTS, this.accounts);\n\n this.hideAccountForm();\n this.renderAccountList();\n this.updateGitWarning();\n\n showSuccess(isNew ? \"Account added\" : \"Account updated\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving account: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save global Git settings (proxy, default author).\n */\n async saveGitSettings() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n try {\n const { setConfig } = await import(\"../../../db/setConfig.js\");\n\n // Proxy preference\n const publicRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-public\"]',\n );\n\n const customRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-custom\"]',\n );\n\n const proxyPref = publicRadio?.checked\n ? \"public\"\n : customRadio?.checked\n ? \"custom\"\n : \"local\";\n\n await setConfig(this.db, CONFIG_KEYS.GIT_CORS_PROXY, proxyPref);\n\n if (proxyPref === \"custom\") {\n const customUrlInput: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-url-input\"]',\n );\n\n const url = customUrlInput?.value.trim() || \"/git-proxy\";\n const { orchestratorStore } =\n await import(\"../../../stores/orchestrator.js\");\n\n await orchestratorStore.setGitProxyUrl(this.db, url);\n }\n\n // Author info\n const nameInput: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-author-name-input\"]',\n );\n\n if (nameInput) {\n await setConfig(\n this.db,\n CONFIG_KEYS.GIT_AUTHOR_NAME,\n nameInput.value.trim() || \"ShadowClaw\",\n );\n }\n\n const emailInput: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-author-email-input\"]',\n );\n if (emailInput) {\n await setConfig(\n this.db,\n CONFIG_KEYS.GIT_AUTHOR_EMAIL,\n emailInput.value.trim() || \"agent@example.com\",\n );\n }\n\n showSuccess(\"Git settings saved\", 3000);\n\n this.updateGitWarning();\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Git settings: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Set an account as the default.\n */\n async setDefaultAccount(id: string) {\n if (!this.db) {\n return;\n }\n\n this.defaultAccountId = id;\n\n try {\n const { setConfig } = await import(\"../../../db/setConfig.js\");\n await setConfig(this.db, CONFIG_KEYS.GIT_DEFAULT_ACCOUNT, id);\n } catch (err) {\n console.warn(\"Error setting default account:\", err);\n }\n\n this.renderAccountList();\n\n showSuccess(\"Default account updated\", 3000);\n }\n\n /**\n * Update the Git security warning visibility.\n */\n async updateGitWarning() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const warningEl: HTMLElement | null = root.querySelector(\n '[data-setting=\"git-proxy-warning\"]',\n );\n\n if (!warningEl) {\n return;\n }\n\n const publicRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-public\"]',\n );\n\n const hasToken = this.accounts.some((a) => !!a.token);\n\n warningEl.style.display =\n publicRadio?.checked && hasToken ? \"block\" : \"none\";\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawGit);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"shadow-claw-git-Bg1SWgsF.js","names":["shadowClawGitStyles","shadowClawGitTemplate"],"sources":["../../src/components/settings/shadow-claw-git/shadow-claw-git.ts"],"sourcesContent":["import {\n CONFIG_KEYS,\n OAUTH_PROVIDER_DEFINITIONS,\n} from \"../../../config/config.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\nimport { showError, showSuccess } from \"../../../ui/toast.js\";\nimport { escapeHtml } from \"../../../utils/utils.js\";\nimport { setSanitizedHtml } from \"../../../security/trusted-types.js\";\nimport {\n resolveStoredCredentialAuthMode,\n type PendingOAuthResult,\n} from \"../../../subsystems/accounts/stored-credentials.js\";\n\nimport { getDb, type ShadowClawDatabase } from \"../../../db/db.js\";\nimport { detectProvider } from \"../../../subsystems/git/credentials.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport \"../../common/shadow-claw-empty-state/shadow-claw-empty-state.js\";\nimport \"../../common/shadow-claw-actions/shadow-claw-actions.js\";\nimport \"../../common/shadow-claw-card/shadow-claw-card.js\";\n\nimport { GitAccount } from \"../../../subsystems/git/types.js\";\nimport shadowClawGitStyles from \"./shadow-claw-git.css\" with { type: \"css\" };\nimport shadowClawGitTemplate from \"./shadow-claw-git.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-git\";\nconst GIT_OAUTH_PROVIDER_IDS = [\"github\", \"gitlab\", \"azure_devops\"];\n\nfunction mapDetectedProviderToOAuthProviderId(\n provider: ReturnType<typeof detectProvider>,\n): string | undefined {\n if (provider === \"azure-devops\") {\n return \"azure_devops\";\n }\n\n if (provider === \"github\" || provider === \"gitlab\") {\n return provider;\n }\n\n return undefined;\n}\n\nfunction resolveGitAccountAuthMode(\n account: GitAccount | null,\n): \"token\" | \"oauth\" | \"basic\" {\n return resolveStoredCredentialAuthMode(account);\n}\n\nexport class ShadowClawGit extends ShadowClawElement {\n static styles = shadowClawGitStyles;\n static template = shadowClawGitTemplate;\n\n accounts: GitAccount[] = [];\n db: ShadowClawDatabase | null = null;\n defaultAccountId: string = \"\";\n editingAccountId: string | null = null;\n pendingOauthResult: PendingOAuthResult | null = null;\n\n constructor() {\n super();\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.db = await getDb();\n\n await this.render();\n\n this.bindEventListeners();\n }\n\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-action=\"save-git-settings\"]')\n ?.addEventListener(\"click\", () => this.saveGitSettings());\n\n root.querySelectorAll('input[name=\"git-proxy\"]').forEach((radio) => {\n radio.addEventListener(\"change\", () => {\n this.updateGitWarning();\n this.updateCustomProxyVisibility();\n });\n });\n\n root\n .querySelector('[data-action=\"add-account\"]')\n ?.addEventListener(\"click\", () => this.showAccountForm(\"new\"));\n\n root\n .querySelector('[data-region=\"account-list\"]')\n ?.addEventListener(\"settings-action\", (event) => {\n const detail = (event as CustomEvent<{ action: string; id: string }>)\n .detail;\n const { action, id } = detail || { action: \"\", id: \"\" };\n\n if (!id) {\n return;\n }\n\n if (action === \"edit-account\") {\n this.showAccountForm(id);\n } else if (action === \"delete-account\") {\n this.deleteAccount(id);\n } else if (action === \"set-default\") {\n this.setDefaultAccount(id);\n }\n });\n }\n\n /**\n * Hide the account form.\n */\n hideAccountForm() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const slot = root.querySelector('[data-region=\"account-form-slot\"]');\n if (slot) {\n slot.replaceChildren();\n }\n\n this.editingAccountId = null;\n this.pendingOauthResult = null;\n }\n\n /**\n * Render the account card list.\n */\n renderAccountList() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const listEl = root.querySelector('[data-region=\"account-list\"]');\n if (!listEl) {\n return;\n }\n\n listEl.replaceChildren();\n\n if (this.accounts.length === 0) {\n const emptyState = document.createElement(\"shadow-claw-empty-state\");\n emptyState.setAttribute(\"message\", \"No Git accounts configured.\");\n emptyState.setAttribute(\n \"hint\",\n \"Click '+ Add Git Account' to get started.\",\n );\n listEl.append(emptyState);\n\n return;\n }\n\n const fragment = document.createDocumentFragment();\n\n this.accounts.forEach((acct) => {\n const isDefault = acct.id === this.defaultAccountId;\n const hasToken = !!acct.token;\n const hasUser = !!acct.username;\n const authMode = resolveGitAccountAuthMode(acct);\n const authLabel = hasToken\n ? authMode === \"oauth\"\n ? acct.oauthReauthRequired\n ? \"Reconnect required\"\n : `OAuth token saved${acct.oauthProviderId ? ` (${acct.oauthProviderId})` : \"\"}`\n : \"Token (PAT)\"\n : hasUser\n ? `Username: ${acct.username}`\n : \"No credentials\";\n const cardMeta = `${acct.hostPattern} · ${authLabel}`;\n\n const card = document.createElement(\"shadow-claw-card\");\n card.setAttribute(\"data-account-id\", acct.id);\n card.setAttribute(\"label\", acct.label);\n card.setAttribute(\"meta\", cardMeta);\n if (isDefault) {\n card.setAttribute(\"highlight\", \"\");\n card.setAttribute(\"badge\", \"Default\");\n }\n\n const actions = document.createElement(\"shadow-claw-actions\");\n actions.setAttribute(\"slot\", \"actions\");\n actions.setAttribute(\"kind\", \"account\");\n actions.setAttribute(\"item-id\", acct.id);\n if (isDefault) {\n actions.setAttribute(\"is-default\", \"\");\n }\n\n card.append(actions);\n fragment.append(card);\n });\n\n listEl.append(fragment);\n }\n\n /**\n * Show the inline account form for adding or editing.\n */\n showAccountForm(accountId: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n this.editingAccountId = accountId;\n this.pendingOauthResult = null;\n const isNew = accountId === \"new\";\n const existing = isNew\n ? null\n : this.accounts.find((a) => a.id === accountId);\n const selectedAuthMode = resolveGitAccountAuthMode(existing || null);\n const inferredProviderId = existing?.oauthProviderId\n ? existing.oauthProviderId\n : mapDetectedProviderToOAuthProviderId(\n detectProvider(existing?.hostPattern || \"\"),\n );\n\n const oauthProviderId =\n inferredProviderId && OAUTH_PROVIDER_DEFINITIONS[inferredProviderId]\n ? inferredProviderId\n : \"github\";\n const oauthScope = existing?.scopes?.join(\" \") || \"\";\n const oauthProviderOptions = GIT_OAUTH_PROVIDER_IDS.filter(\n (providerId) => !!OAUTH_PROVIDER_DEFINITIONS[providerId],\n )\n .map((providerId) => {\n const provider = OAUTH_PROVIDER_DEFINITIONS[providerId];\n\n return `<option value=\"${provider.id}\"${provider.id === oauthProviderId ? \" selected\" : \"\"}>${escapeHtml(provider.name)}</option>`;\n })\n .join(\"\");\n\n const slot = root.querySelector('[data-region=\"account-form-slot\"]');\n if (!slot) {\n return;\n }\n\n setSanitizedHtml(\n slot,\n `\n <div class=\"account-form\">\n <h4>${isNew ? \"Add Git Account\" : \"Edit Account\"}</h4>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Label</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-label\"\n placeholder=\"e.g. GitHub, Azure DevOps\"\n value=\"${escapeHtml(existing?.label || \"\")}\" />\n <div class=\"form-helper\">A friendly name to identify this account.</div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Host Pattern</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-host\"\n placeholder=\"e.g. github.com, dev.azure.com\"\n value=\"${escapeHtml(existing?.hostPattern || \"\")}\" />\n <div class=\"form-helper\">\n Matched against remote URLs to auto-select credentials.\n </div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Auth Mode</label>\n <select class=\"form-input\" data-field=\"acct-auth-mode\">\n <option value=\"token\"${selectedAuthMode === \"token\" ? \" selected\" : \"\"}>PAT / Username</option>\n <option value=\"oauth\"${selectedAuthMode === \"oauth\" ? \" selected\" : \"\"}>OAuth</option>\n </select>\n <div class=\"form-helper\">Use OAuth for provider-managed access tokens or PAT for manual Git credentials.</div>\n </div>\n\n <div class=\"oauth-fields\" data-region=\"oauth-fields\">\n <div class=\"form-group\">\n <label class=\"form-label\">OAuth Provider</label>\n <select class=\"form-input\" data-field=\"acct-oauth-provider\">${oauthProviderOptions}</select>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">OAuth Client ID</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-oauth-client-id\"\n value=\"${escapeHtml(existing?.oauthClientId || \"\")}\"\n placeholder=\"Enter provider OAuth app client ID\" />\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">OAuth Client Secret (if required)</label>\n <input type=\"password\" class=\"form-input\" data-field=\"acct-oauth-client-secret\"\n placeholder=\"${existing?.oauthClientSecret ? \"•••••••••••• (Saved)\" : \"Enter client secret if provider requires it\"}\" />\n <div class=\"form-helper\">Stored encrypted locally. Needed by some providers for token exchange/refresh.</div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">OAuth Scope (if required)</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-oauth-scope\"\n value=\"${escapeHtml(oauthScope)}\"\n placeholder=\"space-separated scopes\" />\n <div class=\"form-helper\">Leave blank to use provider defaults.</div>\n </div>\n\n <div class=\"form-group oauth-connect-row\">\n <button class=\"confirm-btn oauth-connect-btn\" data-action=\"connect-oauth\" type=\"button\">Connect OAuth</button>\n <span class=\"oauth-status\" data-region=\"oauth-status\">${selectedAuthMode === \"oauth\" && existing?.oauthReauthRequired ? \"Reconnect required\" : selectedAuthMode === \"oauth\" && existing?.token ? \"OAuth token already saved\" : \"Not connected\"}</span>\n </div>\n </div>\n\n <div data-region=\"pat-fields\">\n <div class=\"form-group\">\n <label class=\"form-label\">Token (PAT)</label>\n <input type=\"password\" class=\"form-input\" data-field=\"acct-token\"\n placeholder=\"${existing?.token ? \"•••••••••••• (Saved)\" : \"ghp_xxxx or Azure PAT\"}\" />\n <div class=\"form-helper\">\n Stored encrypted locally. Leave blank to keep existing.\n </div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Username</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-username\"\n placeholder=\"Optional — alternative to PAT\"\n value=\"${escapeHtml(existing?.username || \"\")}\" />\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Password</label>\n <input type=\"password\" class=\"form-input\" data-field=\"acct-password\"\n placeholder=\"${existing?.password ? \"•••••••••••• (Saved)\" : \"Optional — used with username\"}\" />\n <div class=\"form-helper\">Stored encrypted locally. Leave blank to keep existing.</div>\n </div>\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Author Name (optional)</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-author-name\"\n placeholder=\"Override default author for this account\"\n value=\"${escapeHtml(existing?.authorName || \"\")}\" />\n </div>\n\n <div class=\"form-group\">\n <label class=\"form-label\">Author Email (optional)</label>\n <input type=\"text\" class=\"form-input\" data-field=\"acct-author-email\"\n placeholder=\"Override default author email for this account\"\n value=\"${escapeHtml(existing?.authorEmail || \"\")}\" />\n </div>\n\n <div class=\"account-form-actions\">\n <button class=\"confirm-btn\" data-action=\"save-account\">\n ${isNew ? \"Add Account\" : \"Update Account\"}\n </button>\n <button class=\"cancel-btn\" data-action=\"cancel-account-form\">Cancel</button>\n </div>\n </div>`,\n );\n\n slot\n .querySelector('[data-action=\"save-account\"]')\n ?.addEventListener(\"click\", () => this.saveAccountForm());\n slot\n .querySelector('[data-action=\"cancel-account-form\"]')\n ?.addEventListener(\"click\", () => this.hideAccountForm());\n slot\n .querySelector('[data-field=\"acct-auth-mode\"]')\n ?.addEventListener(\"change\", () => this.updateAuthModeVisibility(slot));\n slot\n .querySelector('[data-action=\"connect-oauth\"]')\n ?.addEventListener(\"click\", () => void this.connectOAuthFromForm(slot));\n\n this.updateAuthModeVisibility(slot);\n }\n\n updateAuthModeVisibility(slot: Element) {\n const mode = (\n slot.querySelector('[data-field=\"acct-auth-mode\"]') as HTMLSelectElement\n )?.value;\n const isOAuth = mode === \"oauth\";\n\n const oauthRegion = slot.querySelector('[data-region=\"oauth-fields\"]');\n const patRegion = slot.querySelector('[data-region=\"pat-fields\"]');\n\n if (oauthRegion instanceof HTMLElement) {\n oauthRegion.style.display = isOAuth ? \"block\" : \"none\";\n }\n\n if (patRegion instanceof HTMLElement) {\n patRegion.style.display = isOAuth ? \"none\" : \"block\";\n }\n }\n\n /**\n * Show/hide the custom proxy URL input based on current radio selection.\n */\n updateCustomProxyVisibility() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const customRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-custom\"]',\n );\n\n const field: HTMLElement | null = root.querySelector(\n '[data-region=\"git-custom-proxy-field\"]',\n );\n if (field instanceof HTMLElement) {\n field.style.display = customRadio?.checked ? \"block\" : \"none\";\n }\n }\n\n async connectOAuthFromForm(slot: Element) {\n const providerId = (\n slot.querySelector(\n '[data-field=\"acct-oauth-provider\"]',\n ) as HTMLSelectElement\n )?.value;\n const clientId = (\n slot.querySelector(\n '[data-field=\"acct-oauth-client-id\"]',\n ) as HTMLInputElement\n )?.value.trim();\n const clientSecret = (\n slot.querySelector(\n '[data-field=\"acct-oauth-client-secret\"]',\n ) as HTMLInputElement\n )?.value.trim();\n const scopeRaw = (\n slot.querySelector('[data-field=\"acct-oauth-scope\"]') as HTMLInputElement\n )?.value.trim();\n\n if (!providerId) {\n showError(\"OAuth provider is required.\", 4000);\n\n return;\n }\n\n if (!clientId) {\n showError(\"OAuth client ID is required.\", 4000);\n\n return;\n }\n\n const oauthStatus = slot.querySelector('[data-region=\"oauth-status\"]');\n const connectBtn = slot.querySelector(\n '[data-action=\"connect-oauth\"]',\n ) as HTMLButtonElement | null;\n\n if (oauthStatus) {\n oauthStatus.textContent = \"Starting OAuth...\";\n }\n\n if (connectBtn) {\n connectBtn.disabled = true;\n }\n\n try {\n const scope = scopeRaw\n ? scopeRaw\n .split(/[\\s,]+/)\n .map((token) => token.trim())\n .filter(Boolean)\n : undefined;\n\n const authorizeRes = await fetch(\"/oauth/authorize\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({\n providerId,\n clientId,\n clientSecret: clientSecret || undefined,\n redirectUri: `${window.location.origin}/oauth/callback`,\n scope,\n }),\n });\n\n const authorizePayload = (await authorizeRes.json()) as {\n state?: string;\n authorizeUrl?: string;\n error?: string;\n };\n\n if (\n !authorizeRes.ok ||\n !authorizePayload.state ||\n !authorizePayload.authorizeUrl\n ) {\n throw new Error(authorizePayload.error || \"OAuth authorize failed\");\n }\n\n window.open(\n authorizePayload.authorizeUrl,\n \"shadowclaw-oauth\",\n \"popup=yes,width=540,height=720\",\n );\n\n const state = authorizePayload.state;\n let status = \"pending\";\n for (let attempt = 0; attempt < 60; attempt++) {\n const sessionRes = await fetch(\n `/oauth/session/${encodeURIComponent(state)}`,\n );\n const sessionPayload = (await sessionRes.json()) as {\n status?: string;\n error?: string;\n };\n\n if (!sessionRes.ok) {\n throw new Error(sessionPayload.error || \"OAuth session not found\");\n }\n\n status = sessionPayload.status || \"pending\";\n\n if (status === \"authorized\") {\n break;\n }\n\n if (status === \"error\") {\n throw new Error(sessionPayload.error || \"OAuth authorization failed\");\n }\n\n await new Promise((resolve) => setTimeout(resolve, 1000));\n }\n\n if (status !== \"authorized\") {\n throw new Error(\"OAuth authorization timed out\");\n }\n\n const tokenRes = await fetch(\"/oauth/token\", {\n method: \"POST\",\n headers: {\n \"content-type\": \"application/json\",\n },\n body: JSON.stringify({ state }),\n });\n\n const tokenPayload = (await tokenRes.json()) as {\n accessToken?: string;\n refreshToken?: string;\n expiresIn?: number;\n scope?: string;\n tokenType?: string;\n error?: string;\n };\n\n if (!tokenRes.ok || !tokenPayload.accessToken) {\n throw new Error(tokenPayload.error || \"OAuth token exchange failed\");\n }\n\n this.pendingOauthResult = {\n providerId,\n accessToken: tokenPayload.accessToken,\n refreshToken: tokenPayload.refreshToken,\n expiresAt: tokenPayload.expiresIn\n ? Date.now() + tokenPayload.expiresIn * 1000\n : undefined,\n scope: tokenPayload.scope,\n tokenType: tokenPayload.tokenType,\n };\n\n if (oauthStatus) {\n oauthStatus.textContent = \"OAuth connected\";\n }\n\n showSuccess(\"OAuth connected\", 3000);\n } catch (err) {\n const message = err instanceof Error ? err.message : String(err);\n if (oauthStatus) {\n oauthStatus.textContent = \"OAuth failed\";\n }\n\n showError(`OAuth connect failed: ${message}`, 6000);\n } finally {\n if (connectBtn) {\n connectBtn.disabled = false;\n }\n }\n }\n\n /**\n * Delete an account by id.\n */\n async deleteAccount(id: string) {\n if (!this.db) {\n return;\n }\n\n this.accounts = this.accounts.filter((a) => a.id !== id);\n\n // If we deleted the default, pick a new default\n if (this.defaultAccountId === id) {\n this.defaultAccountId = this.accounts[0]?.id || \"\";\n }\n\n try {\n const { setConfig } = await import(\"../../../db/setConfig.js\");\n await setConfig(this.db, CONFIG_KEYS.GIT_ACCOUNTS, this.accounts);\n await setConfig(\n this.db,\n CONFIG_KEYS.GIT_DEFAULT_ACCOUNT,\n this.defaultAccountId,\n );\n } catch (err) {\n console.warn(\"Error persisting account deletion:\", err);\n }\n\n this.renderAccountList();\n this.updateGitWarning();\n\n showSuccess(\"Account deleted\", 3000);\n }\n\n /**\n * Migrate legacy single-key config into an account entry.\n * Only runs when no accounts exist and a legacy token or username is present.\n */\n async migrateLegacyAccount() {\n if (!this.db) {\n return;\n }\n\n const encToken = await getConfig(this.db, CONFIG_KEYS.GIT_TOKEN);\n const username = await getConfig(this.db, CONFIG_KEYS.GIT_USERNAME);\n\n if (!encToken && !username) {\n return;\n }\n\n const encPassword =\n (await getConfig(this.db, CONFIG_KEYS.GIT_PASSWORD)) || \"\";\n\n const legacy: GitAccount = {\n id: \"legacy-migrated\",\n label: \"GitHub\",\n hostPattern: \"github.com\",\n token: encToken || \"\",\n username: username || \"\",\n password: encPassword,\n authorName: \"\",\n authorEmail: \"\",\n };\n\n this.accounts = [legacy];\n this.defaultAccountId = legacy.id;\n\n const { setConfig } = await import(\"../../../db/setConfig.js\");\n await setConfig(this.db, CONFIG_KEYS.GIT_ACCOUNTS, this.accounts);\n await setConfig(this.db, CONFIG_KEYS.GIT_DEFAULT_ACCOUNT, legacy.id);\n }\n\n async render() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n try {\n const proxyPref =\n (await getConfig(this.db, CONFIG_KEYS.GIT_CORS_PROXY)) || \"local\";\n\n const localRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-local\"]',\n );\n\n const publicRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-public\"]',\n );\n\n const customRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-custom\"]',\n );\n\n const customUrlInput: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-url-input\"]',\n );\n\n if (localRadio && publicRadio && customRadio) {\n localRadio.checked = proxyPref === \"local\";\n publicRadio.checked = proxyPref === \"public\";\n customRadio.checked = proxyPref === \"custom\";\n }\n\n if (customUrlInput) {\n customUrlInput.value = orchestratorStore.gitProxyUrl || \"/git-proxy\";\n }\n\n this.updateCustomProxyVisibility();\n\n const authorNameInput: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-author-name-input\"]',\n );\n\n if (authorNameInput) {\n authorNameInput.value =\n (await getConfig(this.db, CONFIG_KEYS.GIT_AUTHOR_NAME)) ||\n \"ShadowClaw\";\n }\n\n const authorEmailInput: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-author-email-input\"]',\n );\n\n if (authorEmailInput) {\n authorEmailInput.value =\n (await getConfig(this.db, CONFIG_KEYS.GIT_AUTHOR_EMAIL)) ||\n \"agent@example.com\";\n }\n\n // Load accounts\n const raw = await getConfig(this.db, CONFIG_KEYS.GIT_ACCOUNTS);\n this.accounts = Array.isArray(raw) ? raw : [];\n this.defaultAccountId =\n (await getConfig(this.db, CONFIG_KEYS.GIT_DEFAULT_ACCOUNT)) || \"\";\n\n // Migrate legacy single-account if no accounts exist\n if (this.accounts.length === 0) {\n await this.migrateLegacyAccount();\n }\n\n this.renderAccountList();\n this.updateGitWarning();\n } catch (e) {\n console.warn(\"Could not load git settings:\", e);\n }\n }\n\n /**\n * Save the current account form (add or update).\n */\n async saveAccountForm() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const slot: HTMLInputElement | null = root.querySelector(\n '[data-region=\"account-form-slot\"]',\n );\n if (!slot) {\n return;\n }\n\n const label = (\n slot.querySelector('[data-field=\"acct-label\"]') as HTMLInputElement\n )?.value.trim();\n const hostPattern = (\n slot.querySelector('[data-field=\"acct-host\"]') as HTMLInputElement\n )?.value.trim();\n const authMode = (\n slot.querySelector('[data-field=\"acct-auth-mode\"]') as HTMLSelectElement\n )?.value as GitAccount[\"authMode\"];\n\n if (!label || !hostPattern) {\n showError(\"Label and Host Pattern are required.\", 4000);\n\n return;\n }\n\n try {\n const { encryptValue } = await import(\"../../../security/crypto.js\");\n const { setConfig } = await import(\"../../../db/setConfig.js\");\n\n const tokenRaw = (\n slot.querySelector('[data-field=\"acct-token\"]') as HTMLInputElement\n )?.value.trim();\n\n const passwordRaw = (\n slot.querySelector('[data-field=\"acct-password\"]') as HTMLInputElement\n )?.value.trim();\n\n const username =\n (\n slot.querySelector('[data-field=\"acct-username\"]') as HTMLInputElement\n )?.value.trim() || \"\";\n\n const authorName =\n (\n slot.querySelector(\n '[data-field=\"acct-author-name\"]',\n ) as HTMLInputElement\n )?.value.trim() || \"\";\n\n const authorEmail =\n (\n slot.querySelector(\n '[data-field=\"acct-author-email\"]',\n ) as HTMLInputElement\n )?.value.trim() || \"\";\n\n const isNew = this.editingAccountId === \"new\";\n const existing = isNew\n ? null\n : this.accounts.find((a) => a.id === this.editingAccountId);\n\n let token = existing?.token || \"\";\n let password = existing?.password || \"\";\n let oauthProviderId = existing?.oauthProviderId;\n let oauthClientId = existing?.oauthClientId;\n let oauthClientSecret = existing?.oauthClientSecret;\n let accessTokenExpiresAt = existing?.accessTokenExpiresAt;\n let refreshToken = existing?.refreshToken;\n let scopes = existing?.scopes;\n let tokenType = existing?.tokenType;\n let oauthRefreshFailureCount = existing?.oauthRefreshFailureCount;\n let oauthReauthRequired = existing?.oauthReauthRequired;\n let oauthReauthRequiredAt = existing?.oauthReauthRequiredAt;\n\n if (authMode === \"oauth\") {\n oauthProviderId = (\n slot.querySelector(\n '[data-field=\"acct-oauth-provider\"]',\n ) as HTMLSelectElement\n )?.value;\n oauthClientId = (\n slot.querySelector(\n '[data-field=\"acct-oauth-client-id\"]',\n ) as HTMLInputElement\n )?.value.trim();\n const oauthClientSecretRaw = (\n slot.querySelector(\n '[data-field=\"acct-oauth-client-secret\"]',\n ) as HTMLInputElement\n )?.value.trim();\n const oauthScopeRaw = (\n slot.querySelector(\n '[data-field=\"acct-oauth-scope\"]',\n ) as HTMLInputElement\n )?.value.trim();\n const configuredScopes = oauthScopeRaw\n ? oauthScopeRaw\n .split(/[\\s,]+/)\n .map((entry) => entry.trim())\n .filter(Boolean)\n : undefined;\n\n if (!oauthProviderId) {\n showError(\"OAuth provider is required for OAuth mode.\", 4000);\n\n return;\n }\n\n if (!oauthClientId) {\n showError(\"OAuth client ID is required for OAuth mode.\", 4000);\n\n return;\n }\n\n if (oauthClientSecretRaw) {\n const encryptedClientSecret =\n await encryptValue(oauthClientSecretRaw);\n if (encryptedClientSecret) {\n oauthClientSecret = encryptedClientSecret;\n }\n }\n\n if (this.pendingOauthResult?.accessToken) {\n const encryptedAccessToken = await encryptValue(\n this.pendingOauthResult.accessToken,\n );\n if (encryptedAccessToken) {\n token = encryptedAccessToken;\n }\n\n if (this.pendingOauthResult.refreshToken) {\n const encryptedRefreshToken = await encryptValue(\n this.pendingOauthResult.refreshToken,\n );\n if (encryptedRefreshToken) {\n refreshToken = encryptedRefreshToken;\n }\n }\n\n accessTokenExpiresAt = this.pendingOauthResult.expiresAt;\n scopes = this.pendingOauthResult.scope\n ? this.pendingOauthResult.scope\n .split(/[\\s,]+/)\n .map((entry) => entry.trim())\n .filter(Boolean)\n : configuredScopes || scopes;\n tokenType = this.pendingOauthResult.tokenType;\n oauthRefreshFailureCount = 0;\n oauthReauthRequired = false;\n oauthReauthRequiredAt = undefined;\n } else {\n scopes = configuredScopes || scopes;\n }\n\n if (!token) {\n showError(\n \"Connect OAuth first to obtain an access token for this account.\",\n 5000,\n );\n\n return;\n }\n\n password = \"\";\n } else {\n if (tokenRaw) {\n const enc = await encryptValue(tokenRaw);\n if (enc) {\n token = enc;\n }\n }\n\n if (passwordRaw) {\n const enc = await encryptValue(passwordRaw);\n if (enc) {\n password = enc;\n }\n }\n\n oauthProviderId = undefined;\n oauthClientId = undefined;\n oauthClientSecret = undefined;\n accessTokenExpiresAt = undefined;\n refreshToken = undefined;\n scopes = undefined;\n tokenType = undefined;\n oauthRefreshFailureCount = undefined;\n oauthReauthRequired = undefined;\n oauthReauthRequiredAt = undefined;\n }\n\n if (isNew) {\n const { ulid } = await import(\"../../../utils/ulid.js\");\n const acct: GitAccount = {\n id: ulid(),\n label,\n hostPattern,\n token,\n username: authMode === \"oauth\" ? \"\" : username,\n password,\n authorName,\n authorEmail,\n authMode: authMode || \"token\",\n oauthProviderId,\n oauthClientId,\n oauthClientSecret,\n accessTokenExpiresAt,\n refreshToken,\n scopes,\n tokenType,\n oauthRefreshFailureCount,\n oauthReauthRequired,\n oauthReauthRequiredAt,\n };\n\n this.accounts.push(acct);\n\n // First account becomes default automatically\n if (this.accounts.length === 1) {\n this.defaultAccountId = acct.id;\n\n await setConfig(this.db, CONFIG_KEYS.GIT_DEFAULT_ACCOUNT, acct.id);\n }\n } else if (existing) {\n existing.label = label;\n existing.hostPattern = hostPattern;\n existing.token = token;\n existing.username = authMode === \"oauth\" ? \"\" : username;\n existing.password = password;\n existing.authorName = authorName;\n existing.authorEmail = authorEmail;\n existing.authMode = authMode || \"token\";\n existing.oauthProviderId = oauthProviderId;\n existing.oauthClientId = oauthClientId;\n existing.oauthClientSecret = oauthClientSecret;\n existing.accessTokenExpiresAt = accessTokenExpiresAt;\n existing.refreshToken = refreshToken;\n existing.scopes = scopes;\n existing.tokenType = tokenType;\n existing.oauthRefreshFailureCount = oauthRefreshFailureCount;\n existing.oauthReauthRequired = oauthReauthRequired;\n existing.oauthReauthRequiredAt = oauthReauthRequiredAt;\n }\n\n await setConfig(this.db, CONFIG_KEYS.GIT_ACCOUNTS, this.accounts);\n\n this.hideAccountForm();\n this.renderAccountList();\n this.updateGitWarning();\n\n showSuccess(isNew ? \"Account added\" : \"Account updated\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving account: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save global Git settings (proxy, default author).\n */\n async saveGitSettings() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n try {\n const { setConfig } = await import(\"../../../db/setConfig.js\");\n\n // Proxy preference\n const publicRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-public\"]',\n );\n\n const customRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-custom\"]',\n );\n\n const proxyPref = publicRadio?.checked\n ? \"public\"\n : customRadio?.checked\n ? \"custom\"\n : \"local\";\n\n await setConfig(this.db, CONFIG_KEYS.GIT_CORS_PROXY, proxyPref);\n\n if (proxyPref === \"custom\") {\n const customUrlInput: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-url-input\"]',\n );\n\n const url = customUrlInput?.value.trim() || \"/git-proxy\";\n const { orchestratorStore } =\n await import(\"../../../stores/orchestrator.js\");\n\n await orchestratorStore.setGitProxyUrl(this.db, url);\n }\n\n // Author info\n const nameInput: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-author-name-input\"]',\n );\n\n if (nameInput) {\n await setConfig(\n this.db,\n CONFIG_KEYS.GIT_AUTHOR_NAME,\n nameInput.value.trim() || \"ShadowClaw\",\n );\n }\n\n const emailInput: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-author-email-input\"]',\n );\n if (emailInput) {\n await setConfig(\n this.db,\n CONFIG_KEYS.GIT_AUTHOR_EMAIL,\n emailInput.value.trim() || \"agent@example.com\",\n );\n }\n\n showSuccess(\"Git settings saved\", 3000);\n\n this.updateGitWarning();\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Git settings: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Set an account as the default.\n */\n async setDefaultAccount(id: string) {\n if (!this.db) {\n return;\n }\n\n this.defaultAccountId = id;\n\n try {\n const { setConfig } = await import(\"../../../db/setConfig.js\");\n await setConfig(this.db, CONFIG_KEYS.GIT_DEFAULT_ACCOUNT, id);\n } catch (err) {\n console.warn(\"Error setting default account:\", err);\n }\n\n this.renderAccountList();\n\n showSuccess(\"Default account updated\", 3000);\n }\n\n /**\n * Update the Git security warning visibility.\n */\n async updateGitWarning() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const warningEl: HTMLElement | null = root.querySelector(\n '[data-setting=\"git-proxy-warning\"]',\n );\n\n if (!warningEl) {\n return;\n }\n\n const publicRadio: HTMLInputElement | null = root.querySelector(\n '[data-setting=\"git-proxy-public\"]',\n );\n\n const hasToken = this.accounts.some((a) => !!a.token);\n\n warningEl.style.display =\n publicRadio?.checked && hasToken ? \"block\" : \"none\";\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawGit);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA0BA,MAAM,cAAc;AACpB,MAAM,yBAAyB;CAAC;CAAU;CAAU;AAAc;AAElE,SAAS,qCACP,UACoB;CACpB,IAAI,aAAa,gBACf,OAAO;CAGT,IAAI,aAAa,YAAY,aAAa,UACxC,OAAO;AAIX;AAEA,SAAS,0BACP,SAC6B;CAC7B,OAAO,gCAAgC,OAAO;AAChD;AAEA,IAAa,gBAAb,cAAmC,kBAAkB;CACnD,OAAO,SAASA;CAChB,OAAO,WAAWC;CAElB,WAAyB,CAAC;CAC1B,KAAgC;CAChC,mBAA2B;CAC3B,mBAAkC;CAClC,qBAAgD;CAEhD,cAAc;EACZ,MAAM;CACR;CAEA,MAAM,oBAAoB;EAExB,IAAI,CADS,KAAK,YAEhB,MAAM,IAAI,MAAM,sBAAsB;EAGxC,KAAK,KAAK,MAAM,MAAM;EAEtB,MAAM,KAAK,OAAO;EAElB,KAAK,mBAAmB;CAC1B;CAEA,qBAAqB;EACnB,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,KACG,cAAc,qCAAmC,CAAC,EACjD,iBAAiB,eAAe,KAAK,gBAAgB,CAAC;EAE1D,KAAK,iBAAiB,2BAAyB,CAAC,CAAC,SAAS,UAAU;GAClE,MAAM,iBAAiB,gBAAgB;IACrC,KAAK,iBAAiB;IACtB,KAAK,4BAA4B;GACnC,CAAC;EACH,CAAC;EAED,KACG,cAAc,+BAA6B,CAAC,EAC3C,iBAAiB,eAAe,KAAK,gBAAgB,KAAK,CAAC;EAE/D,KACG,cAAc,gCAA8B,CAAC,EAC5C,iBAAiB,oBAAoB,UAAU;GAG/C,MAAM,EAAE,QAAQ,OAFA,MACb,UAC8B;IAAE,QAAQ;IAAI,IAAI;GAAG;GAEtD,IAAI,CAAC,IACH;GAGF,IAAI,WAAW,gBACb,KAAK,gBAAgB,EAAE;QAClB,IAAI,WAAW,kBACpB,KAAK,cAAc,EAAE;QAChB,IAAI,WAAW,eACpB,KAAK,kBAAkB,EAAE;EAE7B,CAAC;CACL;;;;CAKA,kBAAkB;EAChB,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,OAAO,KAAK,cAAc,qCAAmC;EACnE,IAAI,MACF,KAAK,gBAAgB;EAGvB,KAAK,mBAAmB;EACxB,KAAK,qBAAqB;CAC5B;;;;CAKA,oBAAoB;EAClB,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,SAAS,KAAK,cAAc,gCAA8B;EAChE,IAAI,CAAC,QACH;EAGF,OAAO,gBAAgB;EAEvB,IAAI,KAAK,SAAS,WAAW,GAAG;GAC9B,MAAM,aAAa,SAAS,cAAc,yBAAyB;GACnE,WAAW,aAAa,WAAW,6BAA6B;GAChE,WAAW,aACT,QACA,2CACF;GACA,OAAO,OAAO,UAAU;GAExB;EACF;EAEA,MAAM,WAAW,SAAS,uBAAuB;EAEjD,KAAK,SAAS,SAAS,SAAS;GAC9B,MAAM,YAAY,KAAK,OAAO,KAAK;GACnC,MAAM,WAAW,CAAC,CAAC,KAAK;GACxB,MAAM,UAAU,CAAC,CAAC,KAAK;GACvB,MAAM,WAAW,0BAA0B,IAAI;GAC/C,MAAM,YAAY,WACd,aAAa,UACX,KAAK,sBACH,uBACA,oBAAoB,KAAK,kBAAkB,KAAK,KAAK,gBAAgB,KAAK,OAC5E,gBACF,UACE,aAAa,KAAK,aAClB;GACN,MAAM,WAAW,GAAG,KAAK,YAAY,KAAK;GAE1C,MAAM,OAAO,SAAS,cAAc,kBAAkB;GACtD,KAAK,aAAa,mBAAmB,KAAK,EAAE;GAC5C,KAAK,aAAa,SAAS,KAAK,KAAK;GACrC,KAAK,aAAa,QAAQ,QAAQ;GAClC,IAAI,WAAW;IACb,KAAK,aAAa,aAAa,EAAE;IACjC,KAAK,aAAa,SAAS,SAAS;GACtC;GAEA,MAAM,UAAU,SAAS,cAAc,qBAAqB;GAC5D,QAAQ,aAAa,QAAQ,SAAS;GACtC,QAAQ,aAAa,QAAQ,SAAS;GACtC,QAAQ,aAAa,WAAW,KAAK,EAAE;GACvC,IAAI,WACF,QAAQ,aAAa,cAAc,EAAE;GAGvC,KAAK,OAAO,OAAO;GACnB,SAAS,OAAO,IAAI;EACtB,CAAC;EAED,OAAO,OAAO,QAAQ;CACxB;;;;CAKA,gBAAgB,WAAmB;EACjC,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,KAAK,mBAAmB;EACxB,KAAK,qBAAqB;EAC1B,MAAM,QAAQ,cAAc;EAC5B,MAAM,WAAW,QACb,OACA,KAAK,SAAS,MAAM,MAAM,EAAE,OAAO,SAAS;EAChD,MAAM,mBAAmB,0BAA0B,YAAY,IAAI;EACnE,MAAM,qBAAqB,UAAU,kBACjC,SAAS,kBACT,qCACE,eAAe,UAAU,eAAe,EAAE,CAC5C;EAEJ,MAAM,kBACJ,sBAAsB,2BAA2B,sBAC7C,qBACA;EACN,MAAM,aAAa,UAAU,QAAQ,KAAK,GAAG,KAAK;EAClD,MAAM,uBAAuB,uBAAuB,QACjD,eAAe,CAAC,CAAC,2BAA2B,WAC/C,CAAC,CACE,KAAK,eAAe;GACnB,MAAM,WAAW,2BAA2B;GAE5C,OAAO,kBAAkB,SAAS,GAAG,GAAG,SAAS,OAAO,kBAAkB,cAAc,GAAG,GAAG,WAAW,SAAS,IAAI,EAAE;EAC1H,CAAC,CAAC,CACD,KAAK,EAAE;EAEV,MAAM,OAAO,KAAK,cAAc,qCAAmC;EACnE,IAAI,CAAC,MACH;EAGF,iBACE,MACA;;cAEQ,QAAQ,oBAAoB,eAAe;;;;;;0BAM/B,WAAW,UAAU,SAAS,EAAE,EAAE;;;;;;;;0BAQlC,WAAW,UAAU,eAAe,EAAE,EAAE;;;;;;;;;mCAS/B,qBAAqB,UAAU,cAAc,GAAG;mCAChD,qBAAqB,UAAU,cAAc,GAAG;;;;;;;;0EAQT,qBAAqB;;;;;;4BAMnE,WAAW,UAAU,iBAAiB,EAAE,EAAE;;;;;;;kCAOpC,UAAU,oBAAoB,yBAAyB,8CAA8C;;;;;;;4BAO3G,WAAW,UAAU,EAAE;;;;;;;oEAOiB,qBAAqB,WAAW,UAAU,sBAAsB,uBAAuB,qBAAqB,WAAW,UAAU,QAAQ,8BAA8B,gBAAgB;;;;;;;;kCAQzN,UAAU,QAAQ,yBAAyB,wBAAwB;;;;;;;;;;4BAUzE,WAAW,UAAU,YAAY,EAAE,EAAE;;;;;;kCAM/B,UAAU,WAAW,yBAAyB,gCAAgC;;;;;;;;;0BAStF,WAAW,UAAU,cAAc,EAAE,EAAE;;;;;;;0BAOvC,WAAW,UAAU,eAAe,EAAE,EAAE;;;;;cAKpD,QAAQ,gBAAgB,iBAAiB;;;;aAKnD;EAEA,KACG,cAAc,gCAA8B,CAAC,EAC5C,iBAAiB,eAAe,KAAK,gBAAgB,CAAC;EAC1D,KACG,cAAc,uCAAqC,CAAC,EACnD,iBAAiB,eAAe,KAAK,gBAAgB,CAAC;EAC1D,KACG,cAAc,iCAA+B,CAAC,EAC7C,iBAAiB,gBAAgB,KAAK,yBAAyB,IAAI,CAAC;EACxE,KACG,cAAc,iCAA+B,CAAC,EAC7C,iBAAiB,eAAe,KAAK,KAAK,qBAAqB,IAAI,CAAC;EAExE,KAAK,yBAAyB,IAAI;CACpC;CAEA,yBAAyB,MAAe;EAItC,MAAM,UAFJ,KAAK,cAAc,iCAA+B,CAAC,EAClD,UACsB;EAEzB,MAAM,cAAc,KAAK,cAAc,gCAA8B;EACrE,MAAM,YAAY,KAAK,cAAc,8BAA4B;EAEjE,IAAI,uBAAuB,aACzB,YAAY,MAAM,UAAU,UAAU,UAAU;EAGlD,IAAI,qBAAqB,aACvB,UAAU,MAAM,UAAU,UAAU,SAAS;CAEjD;;;;CAKA,8BAA8B;EAC5B,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,cAAuC,KAAK,cAChD,qCACF;EAEA,MAAM,QAA4B,KAAK,cACrC,0CACF;EACA,IAAI,iBAAiB,aACnB,MAAM,MAAM,UAAU,aAAa,UAAU,UAAU;CAE3D;CAEA,MAAM,qBAAqB,MAAe;EACxC,MAAM,aACJ,KAAK,cACH,sCACF,CAAC,EACA;EACH,MAAM,WACJ,KAAK,cACH,uCACF,CAAC,EACA,MAAM,KAAK;EACd,MAAM,eACJ,KAAK,cACH,2CACF,CAAC,EACA,MAAM,KAAK;EACd,MAAM,WACJ,KAAK,cAAc,mCAAiC,CAAC,EACpD,MAAM,KAAK;EAEd,IAAI,CAAC,YAAY;GACf,UAAU,+BAA+B,GAAI;GAE7C;EACF;EAEA,IAAI,CAAC,UAAU;GACb,UAAU,gCAAgC,GAAI;GAE9C;EACF;EAEA,MAAM,cAAc,KAAK,cAAc,gCAA8B;EACrE,MAAM,aAAa,KAAK,cACtB,iCACF;EAEA,IAAI,aACF,YAAY,cAAc;EAG5B,IAAI,YACF,WAAW,WAAW;EAGxB,IAAI;GACF,MAAM,QAAQ,WACV,SACG,MAAM,QAAQ,CAAC,CACf,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,CAC5B,OAAO,OAAO,IACjB;GAEJ,MAAM,eAAe,MAAM,MAAM,oBAAoB;IACnD,QAAQ;IACR,SAAS,EACP,gBAAgB,mBAClB;IACA,MAAM,KAAK,UAAU;KACnB;KACA;KACA,cAAc,gBAAgB;KAC9B,aAAa,GAAG,OAAO,SAAS,OAAO;KACvC;IACF,CAAC;GACH,CAAC;GAED,MAAM,mBAAoB,MAAM,aAAa,KAAK;GAMlD,IACE,CAAC,aAAa,MACd,CAAC,iBAAiB,SAClB,CAAC,iBAAiB,cAElB,MAAM,IAAI,MAAM,iBAAiB,SAAS,wBAAwB;GAGpE,OAAO,KACL,iBAAiB,cACjB,oBACA,gCACF;GAEA,MAAM,QAAQ,iBAAiB;GAC/B,IAAI,SAAS;GACb,KAAK,IAAI,UAAU,GAAG,UAAU,IAAI,WAAW;IAC7C,MAAM,aAAa,MAAM,MACvB,kBAAkB,mBAAmB,KAAK,GAC5C;IACA,MAAM,iBAAkB,MAAM,WAAW,KAAK;IAK9C,IAAI,CAAC,WAAW,IACd,MAAM,IAAI,MAAM,eAAe,SAAS,yBAAyB;IAGnE,SAAS,eAAe,UAAU;IAElC,IAAI,WAAW,cACb;IAGF,IAAI,WAAW,SACb,MAAM,IAAI,MAAM,eAAe,SAAS,4BAA4B;IAGtE,MAAM,IAAI,SAAS,YAAY,WAAW,SAAS,GAAI,CAAC;GAC1D;GAEA,IAAI,WAAW,cACb,MAAM,IAAI,MAAM,+BAA+B;GAGjD,MAAM,WAAW,MAAM,MAAM,gBAAgB;IAC3C,QAAQ;IACR,SAAS,EACP,gBAAgB,mBAClB;IACA,MAAM,KAAK,UAAU,EAAE,MAAM,CAAC;GAChC,CAAC;GAED,MAAM,eAAgB,MAAM,SAAS,KAAK;GAS1C,IAAI,CAAC,SAAS,MAAM,CAAC,aAAa,aAChC,MAAM,IAAI,MAAM,aAAa,SAAS,6BAA6B;GAGrE,KAAK,qBAAqB;IACxB;IACA,aAAa,aAAa;IAC1B,cAAc,aAAa;IAC3B,WAAW,aAAa,YACpB,KAAK,IAAI,IAAI,aAAa,YAAY,MACtC;IACJ,OAAO,aAAa;IACpB,WAAW,aAAa;GAC1B;GAEA,IAAI,aACF,YAAY,cAAc;GAG5B,YAAY,mBAAmB,GAAI;EACrC,SAAS,KAAK;GACZ,MAAM,UAAU,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG;GAC/D,IAAI,aACF,YAAY,cAAc;GAG5B,UAAU,yBAAyB,WAAW,GAAI;EACpD,UAAU;GACR,IAAI,YACF,WAAW,WAAW;EAE1B;CACF;;;;CAKA,MAAM,cAAc,IAAY;EAC9B,IAAI,CAAC,KAAK,IACR;EAGF,KAAK,WAAW,KAAK,SAAS,QAAQ,MAAM,EAAE,OAAO,EAAE;EAGvD,IAAI,KAAK,qBAAqB,IAC5B,KAAK,mBAAmB,KAAK,SAAS,EAAE,EAAE,MAAM;EAGlD,IAAI;GACF,MAAM,EAAE,cAAc,MAAM,OAAO,0BAA2B;GAC9D,MAAM,UAAU,KAAK,IAAI,YAAY,cAAc,KAAK,QAAQ;GAChE,MAAM,UACJ,KAAK,IACL,YAAY,qBACZ,KAAK,gBACP;EACF,SAAS,KAAK;GACZ,QAAQ,KAAK,sCAAsC,GAAG;EACxD;EAEA,KAAK,kBAAkB;EACvB,KAAK,iBAAiB;EAEtB,YAAY,mBAAmB,GAAI;CACrC;;;;;CAMA,MAAM,uBAAuB;EAC3B,IAAI,CAAC,KAAK,IACR;EAGF,MAAM,WAAW,MAAM,UAAU,KAAK,IAAI,YAAY,SAAS;EAC/D,MAAM,WAAW,MAAM,UAAU,KAAK,IAAI,YAAY,YAAY;EAElE,IAAI,CAAC,YAAY,CAAC,UAChB;EAGF,MAAM,cACH,MAAM,UAAU,KAAK,IAAI,YAAY,YAAY,KAAM;EAE1D,MAAM,SAAqB;GACzB,IAAI;GACJ,OAAO;GACP,aAAa;GACb,OAAO,YAAY;GACnB,UAAU,YAAY;GACtB,UAAU;GACV,YAAY;GACZ,aAAa;EACf;EAEA,KAAK,WAAW,CAAC,MAAM;EACvB,KAAK,mBAAmB,OAAO;EAE/B,MAAM,EAAE,cAAc,MAAM,OAAO,0BAA2B;EAC9D,MAAM,UAAU,KAAK,IAAI,YAAY,cAAc,KAAK,QAAQ;EAChE,MAAM,UAAU,KAAK,IAAI,YAAY,qBAAqB,OAAO,EAAE;CACrE;CAEA,MAAM,SAAS;EACb,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,IAAI;GACF,MAAM,YACH,MAAM,UAAU,KAAK,IAAI,YAAY,cAAc,KAAM;GAE5D,MAAM,aAAsC,KAAK,cAC/C,oCACF;GAEA,MAAM,cAAuC,KAAK,cAChD,qCACF;GAEA,MAAM,cAAuC,KAAK,cAChD,qCACF;GAEA,MAAM,iBAA0C,KAAK,cACnD,wCACF;GAEA,IAAI,cAAc,eAAe,aAAa;IAC5C,WAAW,UAAU,cAAc;IACnC,YAAY,UAAU,cAAc;IACpC,YAAY,UAAU,cAAc;GACtC;GAEA,IAAI,gBACF,eAAe,QAAQ,kBAAkB,eAAe;GAG1D,KAAK,4BAA4B;GAEjC,MAAM,kBAA2C,KAAK,cACpD,0CACF;GAEA,IAAI,iBACF,gBAAgB,QACb,MAAM,UAAU,KAAK,IAAI,YAAY,eAAe,KACrD;GAGJ,MAAM,mBAA4C,KAAK,cACrD,2CACF;GAEA,IAAI,kBACF,iBAAiB,QACd,MAAM,UAAU,KAAK,IAAI,YAAY,gBAAgB,KACtD;GAIJ,MAAM,MAAM,MAAM,UAAU,KAAK,IAAI,YAAY,YAAY;GAC7D,KAAK,WAAW,MAAM,QAAQ,GAAG,IAAI,MAAM,CAAC;GAC5C,KAAK,mBACF,MAAM,UAAU,KAAK,IAAI,YAAY,mBAAmB,KAAM;GAGjE,IAAI,KAAK,SAAS,WAAW,GAC3B,MAAM,KAAK,qBAAqB;GAGlC,KAAK,kBAAkB;GACvB,KAAK,iBAAiB;EACxB,SAAS,GAAG;GACV,QAAQ,KAAK,gCAAgC,CAAC;EAChD;CACF;;;;CAKA,MAAM,kBAAkB;EACtB,IAAI,CAAC,KAAK,IACR;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,OAAgC,KAAK,cACzC,qCACF;EACA,IAAI,CAAC,MACH;EAGF,MAAM,QACJ,KAAK,cAAc,6BAA2B,CAAC,EAC9C,MAAM,KAAK;EACd,MAAM,cACJ,KAAK,cAAc,4BAA0B,CAAC,EAC7C,MAAM,KAAK;EACd,MAAM,WACJ,KAAK,cAAc,iCAA+B,CAAC,EAClD;EAEH,IAAI,CAAC,SAAS,CAAC,aAAa;GAC1B,UAAU,wCAAwC,GAAI;GAEtD;EACF;EAEA,IAAI;GACF,MAAM,EAAE,iBAAiB,MAAM,OAAO,uBAA8B;GACpE,MAAM,EAAE,cAAc,MAAM,OAAO,0BAA2B;GAE9D,MAAM,WACJ,KAAK,cAAc,6BAA2B,CAAC,EAC9C,MAAM,KAAK;GAEd,MAAM,cACJ,KAAK,cAAc,gCAA8B,CAAC,EACjD,MAAM,KAAK;GAEd,MAAM,WAEF,KAAK,cAAc,gCAA8B,CAAC,EACjD,MAAM,KAAK,KAAK;GAErB,MAAM,aAEF,KAAK,cACH,mCACF,CAAC,EACA,MAAM,KAAK,KAAK;GAErB,MAAM,cAEF,KAAK,cACH,oCACF,CAAC,EACA,MAAM,KAAK,KAAK;GAErB,MAAM,QAAQ,KAAK,qBAAqB;GACxC,MAAM,WAAW,QACb,OACA,KAAK,SAAS,MAAM,MAAM,EAAE,OAAO,KAAK,gBAAgB;GAE5D,IAAI,QAAQ,UAAU,SAAS;GAC/B,IAAI,WAAW,UAAU,YAAY;GACrC,IAAI,kBAAkB,UAAU;GAChC,IAAI,gBAAgB,UAAU;GAC9B,IAAI,oBAAoB,UAAU;GAClC,IAAI,uBAAuB,UAAU;GACrC,IAAI,eAAe,UAAU;GAC7B,IAAI,SAAS,UAAU;GACvB,IAAI,YAAY,UAAU;GAC1B,IAAI,2BAA2B,UAAU;GACzC,IAAI,sBAAsB,UAAU;GACpC,IAAI,wBAAwB,UAAU;GAEtC,IAAI,aAAa,SAAS;IACxB,kBACE,KAAK,cACH,sCACF,CAAC,EACA;IACH,gBACE,KAAK,cACH,uCACF,CAAC,EACA,MAAM,KAAK;IACd,MAAM,uBACJ,KAAK,cACH,2CACF,CAAC,EACA,MAAM,KAAK;IACd,MAAM,gBACJ,KAAK,cACH,mCACF,CAAC,EACA,MAAM,KAAK;IACd,MAAM,mBAAmB,gBACrB,cACG,MAAM,QAAQ,CAAC,CACf,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,CAC5B,OAAO,OAAO,IACjB;IAEJ,IAAI,CAAC,iBAAiB;KACpB,UAAU,8CAA8C,GAAI;KAE5D;IACF;IAEA,IAAI,CAAC,eAAe;KAClB,UAAU,+CAA+C,GAAI;KAE7D;IACF;IAEA,IAAI,sBAAsB;KACxB,MAAM,wBACJ,MAAM,aAAa,oBAAoB;KACzC,IAAI,uBACF,oBAAoB;IAExB;IAEA,IAAI,KAAK,oBAAoB,aAAa;KACxC,MAAM,uBAAuB,MAAM,aACjC,KAAK,mBAAmB,WAC1B;KACA,IAAI,sBACF,QAAQ;KAGV,IAAI,KAAK,mBAAmB,cAAc;MACxC,MAAM,wBAAwB,MAAM,aAClC,KAAK,mBAAmB,YAC1B;MACA,IAAI,uBACF,eAAe;KAEnB;KAEA,uBAAuB,KAAK,mBAAmB;KAC/C,SAAS,KAAK,mBAAmB,QAC7B,KAAK,mBAAmB,MACrB,MAAM,QAAQ,CAAC,CACf,KAAK,UAAU,MAAM,KAAK,CAAC,CAAC,CAC5B,OAAO,OAAO,IACjB,oBAAoB;KACxB,YAAY,KAAK,mBAAmB;KACpC,2BAA2B;KAC3B,sBAAsB;KACtB,wBAAwB;IAC1B,OACE,SAAS,oBAAoB;IAG/B,IAAI,CAAC,OAAO;KACV,UACE,mEACA,GACF;KAEA;IACF;IAEA,WAAW;GACb,OAAO;IACL,IAAI,UAAU;KACZ,MAAM,MAAM,MAAM,aAAa,QAAQ;KACvC,IAAI,KACF,QAAQ;IAEZ;IAEA,IAAI,aAAa;KACf,MAAM,MAAM,MAAM,aAAa,WAAW;KAC1C,IAAI,KACF,WAAW;IAEf;IAEA,kBAAkB;IAClB,gBAAgB;IAChB,oBAAoB;IACpB,uBAAuB;IACvB,eAAe;IACf,SAAS;IACT,YAAY;IACZ,2BAA2B;IAC3B,sBAAsB;IACtB,wBAAwB;GAC1B;GAEA,IAAI,OAAO;IACT,MAAM,EAAE,SAAS,MAAM,OAAO;IAC9B,MAAM,OAAmB;KACvB,IAAI,KAAK;KACT;KACA;KACA;KACA,UAAU,aAAa,UAAU,KAAK;KACtC;KACA;KACA;KACA,UAAU,YAAY;KACtB;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;KACA;IACF;IAEA,KAAK,SAAS,KAAK,IAAI;IAGvB,IAAI,KAAK,SAAS,WAAW,GAAG;KAC9B,KAAK,mBAAmB,KAAK;KAE7B,MAAM,UAAU,KAAK,IAAI,YAAY,qBAAqB,KAAK,EAAE;IACnE;GACF,OAAO,IAAI,UAAU;IACnB,SAAS,QAAQ;IACjB,SAAS,cAAc;IACvB,SAAS,QAAQ;IACjB,SAAS,WAAW,aAAa,UAAU,KAAK;IAChD,SAAS,WAAW;IACpB,SAAS,aAAa;IACtB,SAAS,cAAc;IACvB,SAAS,WAAW,YAAY;IAChC,SAAS,kBAAkB;IAC3B,SAAS,gBAAgB;IACzB,SAAS,oBAAoB;IAC7B,SAAS,uBAAuB;IAChC,SAAS,eAAe;IACxB,SAAS,SAAS;IAClB,SAAS,YAAY;IACrB,SAAS,2BAA2B;IACpC,SAAS,sBAAsB;IAC/B,SAAS,wBAAwB;GACnC;GAEA,MAAM,UAAU,KAAK,IAAI,YAAY,cAAc,KAAK,QAAQ;GAEhE,KAAK,gBAAgB;GACrB,KAAK,kBAAkB;GACvB,KAAK,iBAAiB;GAEtB,YAAY,QAAQ,kBAAkB,mBAAmB,GAAI;EAC/D,SAAS,KAAK;GAEZ,UAAU,4BADO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,IACjB,GAAI;EACrD;CACF;;;;CAKA,MAAM,kBAAkB;EACtB,IAAI,CAAC,KAAK,IACR;EAGF,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,IAAI;GACF,MAAM,EAAE,cAAc,MAAM,OAAO,0BAA2B;GAG9D,MAAM,cAAuC,KAAK,cAChD,qCACF;GAEA,MAAM,cAAuC,KAAK,cAChD,qCACF;GAEA,MAAM,YAAY,aAAa,UAC3B,WACA,aAAa,UACX,WACA;GAEN,MAAM,UAAU,KAAK,IAAI,YAAY,gBAAgB,SAAS;GAE9D,IAAI,cAAc,UAAU;IAK1B,MAAM,MAJ0C,KAAK,cACnD,wCAGuB,CAAC,EAAE,MAAM,KAAK,KAAK;IAC5C,MAAM,EAAE,sBACN,MAAM,OAAO,6BAAkC;IAEjD,MAAM,kBAAkB,eAAe,KAAK,IAAI,GAAG;GACrD;GAGA,MAAM,YAAqC,KAAK,cAC9C,0CACF;GAEA,IAAI,WACF,MAAM,UACJ,KAAK,IACL,YAAY,iBACZ,UAAU,MAAM,KAAK,KAAK,YAC5B;GAGF,MAAM,aAAsC,KAAK,cAC/C,2CACF;GACA,IAAI,YACF,MAAM,UACJ,KAAK,IACL,YAAY,kBACZ,WAAW,MAAM,KAAK,KAAK,mBAC7B;GAGF,YAAY,sBAAsB,GAAI;GAEtC,KAAK,iBAAiB;EACxB,SAAS,KAAK;GAEZ,UAAU,iCADO,eAAe,QAAQ,IAAI,UAAU,OAAO,GAAG,IACZ,GAAI;EAC1D;CACF;;;;CAKA,MAAM,kBAAkB,IAAY;EAClC,IAAI,CAAC,KAAK,IACR;EAGF,KAAK,mBAAmB;EAExB,IAAI;GACF,MAAM,EAAE,cAAc,MAAM,OAAO,0BAA2B;GAC9D,MAAM,UAAU,KAAK,IAAI,YAAY,qBAAqB,EAAE;EAC9D,SAAS,KAAK;GACZ,QAAQ,KAAK,kCAAkC,GAAG;EACpD;EAEA,KAAK,kBAAkB;EAEvB,YAAY,2BAA2B,GAAI;CAC7C;;;;CAKA,MAAM,mBAAmB;EACvB,MAAM,OAAO,KAAK;EAClB,IAAI,CAAC,MACH;EAGF,MAAM,YAAgC,KAAK,cACzC,sCACF;EAEA,IAAI,CAAC,WACH;EAGF,MAAM,cAAuC,KAAK,cAChD,qCACF;EAEA,MAAM,WAAW,KAAK,SAAS,MAAM,MAAM,CAAC,CAAC,EAAE,KAAK;EAEpD,UAAU,MAAM,UACd,aAAa,WAAW,WAAW,UAAU;CACjD;AACF;AAEA,IAAI,CAAC,eAAe,IAAI,WAAW,GACjC,eAAe,OAAO,aAAa,aAAa"}
@@ -4,7 +4,7 @@ import { r as CONFIG_KEYS } from "./config--CFrw3J3.js";
4
4
  import { t as getConfig } from "./getConfig-BxxXMyuM.js";
5
5
  import { t as setConfig } from "./setConfig-BFED5CXn.js";
6
6
  import { ulid } from "./utils/ulid.js";
7
- import { n as setSanitizedHtml } from "./trusted-types-CkLDpLiZ.js";
7
+ import { n as setSanitizedHtml } from "./trusted-types-Dx0RZlrd.js";
8
8
  import { r as encryptValue } from "./crypto-BPECyFrG.js";
9
9
  import { a as upsertEmailConnection, i as listEmailConnections, n as deleteEmailConnection, o as getEmailPluginManifest, s as listEmailPluginManifests, t as bindEmailCredentialRef } from "./connections-DwjzwVz0.js";
10
10
  import { a as showSuccess, r as showError } from "./toast-DZ6r7_YI.js";
@@ -1108,4 +1108,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
1108
1108
 
1109
1109
  //#endregion
1110
1110
  export { ShadowClawIntegrations as t };
1111
- //# sourceMappingURL=shadow-claw-integrations-NbcCx_ZI.js.map
1111
+ //# sourceMappingURL=shadow-claw-integrations-Ds-CLPhj.js.map