shadow-claw 1.51.0 → 1.52.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (296) hide show
  1. package/.well-known/mcp/server-card.json +1 -1
  2. package/.well-known/mcp.json +1 -1
  3. package/README.md +1 -1
  4. package/dist/cli/{chunk-Dtse8rAn.js → chunk-5ryVpyup.js} +1 -1
  5. package/dist/cli/chunk-Aq3057Xo.js +1 -0
  6. package/dist/cli/{chunk-4CZJpLqA.js → chunk-BV9JBYpl.js} +2 -2
  7. package/dist/cli/{chunk-mbFAP9Ev.js → chunk-BZI3bWDA.js} +1 -1
  8. package/dist/cli/chunk-BaUCHRPD.js +1 -0
  9. package/dist/cli/{chunk-vzUrhBN5.js → chunk-BdbEt6gM.js} +1 -1
  10. package/dist/cli/{chunk-BU8UG4L_.js → chunk-BiWLawPV.js} +1 -1
  11. package/dist/cli/chunk-BkLnHJeo.js +1 -0
  12. package/dist/cli/{chunk-BqfPWIBf.js → chunk-BzWY1sKE.js} +1 -1
  13. package/dist/cli/{chunk-DajM7Kro.js → chunk-C79eIU-4.js} +1 -1
  14. package/dist/cli/{chunk-CI9r1AM5.js → chunk-CDw214Zi.js} +1 -1
  15. package/dist/cli/chunk-CNqc7LLn.js +1 -0
  16. package/dist/cli/{chunk-CEhU-Ah-.js → chunk-CWW7dqIv.js} +1 -1
  17. package/dist/cli/{chunk-BT_C3OlA.js → chunk-CcSTYHtR.js} +1 -1
  18. package/dist/cli/chunk-ClOfk6Ga.js +1 -0
  19. package/dist/cli/chunk-ComXUwW0.js +1 -0
  20. package/dist/cli/{chunk-lL1BhHVe.js → chunk-CooeO4UQ.js} +1 -1
  21. package/dist/cli/{chunk-khr7--yI.js → chunk-CtfWY4G6.js} +1 -1
  22. package/dist/cli/{chunk-C4iW1XuQ.js → chunk-DFgSiYMW.js} +1 -1
  23. package/dist/cli/chunk-DGBnjngK.js +1 -0
  24. package/dist/cli/{chunk-D7bFIUK3.js → chunk-DGu1OhJs.js} +1 -1
  25. package/dist/cli/{chunk-CzfOerQR.js → chunk-DIjCY0Wf.js} +1 -1
  26. package/dist/cli/{chunk-D-iqEY5G.js → chunk-DJ_LeQtz.js} +1 -1
  27. package/dist/cli/{chunk-BmEsDkRK.js → chunk-DQRu-9wO.js} +1 -1
  28. package/dist/cli/{chunk-DojiYody.js → chunk-DToVgO9a.js} +1 -1
  29. package/dist/cli/{chunk-De5a_Rlp.js → chunk-DVbNkQRL.js} +1 -1
  30. package/dist/cli/{chunk-c8MIYB2y.js → chunk-Ddtzaj43.js} +1 -1
  31. package/dist/cli/{chunk-aJ6fufe-.js → chunk-DiqS56rD.js} +1 -1
  32. package/dist/cli/{chunk-CeUEmZNt.js → chunk-DnRcu9b4.js} +1 -1
  33. package/dist/cli/chunk-DtgZDsJA.js +1 -0
  34. package/dist/cli/{chunk-DVMcK7g6.js → chunk-Du4qvxo_.js} +2 -2
  35. package/dist/cli/{chunk-CegcvNc9.js → chunk-Dz5_hgvL.js} +8 -8
  36. package/dist/cli/{chunk-Cd4Dv5Eq.js → chunk-I3mxEelq.js} +1 -1
  37. package/dist/cli/{chunk-Do3VICh1.js → chunk-IU2SH_ti.js} +1 -1
  38. package/dist/cli/{chunk-BQveaAaD.js → chunk-NC8XsSSA.js} +1 -1
  39. package/dist/cli/{chunk-D702W_Ry.js → chunk-Q4BZ9QN9.js} +1 -1
  40. package/dist/cli/chunk-WTlDd4Ou.js +1 -0
  41. package/dist/cli/chunk-XGzq5joC.js +1 -0
  42. package/dist/cli/{chunk-ar7eAlxK.js → chunk-aJfaGe2s.js} +8 -8
  43. package/dist/cli/chunk-bPVrFlmk.js +1 -0
  44. package/dist/cli/chunk-jXJHKxdR.js +1 -0
  45. package/dist/cli/{chunk-C3dTAmV_.js → chunk-rstVU7U0.js} +1 -1
  46. package/dist/cli/{chunk-DGfTzQui.js → chunk-t72uObQ7.js} +1 -1
  47. package/dist/cli/{chunk-DDgfljzN.js → chunk-vq8xlroY.js} +1 -1
  48. package/dist/cli/cli.js +1 -1
  49. package/dist/headless-agent.js +1 -1
  50. package/dist/lib/components/common/shadow-claw-provider-model-picker.js +1 -1
  51. package/dist/lib/components/index.js +27 -27
  52. package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
  53. package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
  54. package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
  55. package/dist/lib/components/settings/shadow-claw-git.js +1 -1
  56. package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
  57. package/dist/lib/components/settings/shadow-claw-llm/model-ranking.d.ts +12 -0
  58. package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
  59. package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
  60. package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
  61. package/dist/lib/components/settings/shadow-claw-notifications.js +1 -1
  62. package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
  63. package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
  64. package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
  65. package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
  66. package/dist/lib/components/shadow-claw-a2ui.js +1 -1
  67. package/dist/lib/components/shadow-claw-accounts.js +1 -1
  68. package/dist/lib/components/shadow-claw-channel-config.js +1 -1
  69. package/dist/lib/components/shadow-claw-channels.js +1 -1
  70. package/dist/lib/components/shadow-claw-chat/shadow-claw-chat.d.ts +1 -0
  71. package/dist/lib/components/shadow-claw-chat.js +1 -1
  72. package/dist/lib/components/shadow-claw-control-plane.js +1 -1
  73. package/dist/lib/components/shadow-claw-conversations.js +1 -1
  74. package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
  75. package/dist/lib/components/shadow-claw-files.js +1 -1
  76. package/dist/lib/components/shadow-claw-git.js +1 -1
  77. package/dist/lib/components/shadow-claw-integrations.js +1 -1
  78. package/dist/lib/components/shadow-claw-llm.js +1 -1
  79. package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
  80. package/dist/lib/components/shadow-claw-networking.js +1 -1
  81. package/dist/lib/components/shadow-claw-notifications.js +1 -1
  82. package/dist/lib/components/shadow-claw-page-header.js +1 -1
  83. package/dist/lib/components/shadow-claw-pages.js +1 -1
  84. package/dist/lib/components/shadow-claw-peerjs.js +1 -1
  85. package/dist/lib/components/shadow-claw-provider-model-picker.js +1 -1
  86. package/dist/lib/components/shadow-claw-settings.js +1 -1
  87. package/dist/lib/components/shadow-claw-storage.js +1 -1
  88. package/dist/lib/components/shadow-claw-task-server.js +1 -1
  89. package/dist/lib/components/shadow-claw-tasks.js +1 -1
  90. package/dist/lib/components/shadow-claw-terminal.js +1 -1
  91. package/dist/lib/components/shadow-claw-tools.js +1 -1
  92. package/dist/lib/components/shadow-claw-webvm.js +1 -1
  93. package/dist/lib/components/shadow-claw.js +1 -1
  94. package/dist/lib/config/config.d.ts +2 -1
  95. package/dist/lib/{config-DxDaVDTn.js → config-DFLs7eoC.js} +3 -2
  96. package/dist/lib/config-DFLs7eoC.js.map +1 -0
  97. package/dist/lib/{configurePeerJs-ScwZiGbF.js → configurePeerJs-DJ0H6e6s.js} +3 -3
  98. package/dist/lib/{configurePeerJs-ScwZiGbF.js.map → configurePeerJs-DJ0H6e6s.js.map} +1 -1
  99. package/dist/lib/{connections-D82zele0.js → connections-DT3nPylw.js} +2 -2
  100. package/dist/lib/{connections-D82zele0.js.map → connections-DT3nPylw.js.map} +1 -1
  101. package/dist/lib/{downloadGroupFile-D7-5y6NI.js → downloadGroupFile-DMnAiPj4.js} +2 -2
  102. package/dist/lib/{downloadGroupFile-D7-5y6NI.js.map → downloadGroupFile-DMnAiPj4.js.map} +1 -1
  103. package/dist/lib/{file-viewer-BMvvndPQ.js → file-viewer-OHmGC_l7.js} +5 -5
  104. package/dist/lib/{file-viewer-BMvvndPQ.js.map → file-viewer-OHmGC_l7.js.map} +1 -1
  105. package/dist/lib/{getGroupDir-BidwYPfP.js → getGroupDir-mTV2Iz2b.js} +3 -3
  106. package/dist/lib/{getGroupDir-BidwYPfP.js.map → getGroupDir-mTV2Iz2b.js.map} +1 -1
  107. package/dist/lib/{git-CXmWufWS.js → git-CGdKghMC.js} +3 -3
  108. package/dist/lib/{git-CXmWufWS.js.map → git-CGdKghMC.js.map} +1 -1
  109. package/dist/lib/index.js +28 -28
  110. package/dist/lib/{initChatSplitResize-tvUZ-wsp.js → initChatSplitResize-B8zHHQdm.js} +2 -2
  111. package/dist/lib/{initChatSplitResize-tvUZ-wsp.js.map → initChatSplitResize-B8zHHQdm.js.map} +1 -1
  112. package/dist/lib/{initControlPlane-Dnjkb-6J.js → initControlPlane-BczrlTf3.js} +14 -14
  113. package/dist/lib/{initControlPlane-Dnjkb-6J.js.map → initControlPlane-BczrlTf3.js.map} +1 -1
  114. package/dist/lib/{markdown-WCXar9C8.js → markdown-D-7Cjyye.js} +3 -3
  115. package/dist/lib/{markdown-WCXar9C8.js.map → markdown-D-7Cjyye.js.map} +1 -1
  116. package/dist/lib/{mcp-reconnect-WTOQONHZ.js → mcp-reconnect-Czf7QCCv.js} +2 -2
  117. package/dist/lib/{mcp-reconnect-WTOQONHZ.js.map → mcp-reconnect-Czf7QCCv.js.map} +1 -1
  118. package/dist/lib/{memoryStorage-Bo2Wpfmg.js → memoryStorage-CXyKsKMo.js} +2 -2
  119. package/dist/lib/{memoryStorage-Bo2Wpfmg.js.map → memoryStorage-CXyKsKMo.js.map} +1 -1
  120. package/dist/lib/model-ranking-Bo8CpGH1.js +116 -0
  121. package/dist/lib/model-ranking-Bo8CpGH1.js.map +1 -0
  122. package/dist/lib/{orchestrator-Crw4btGn.js → orchestrator-BK138MkV.js} +10 -10
  123. package/dist/lib/{orchestrator-Crw4btGn.js.map → orchestrator-BK138MkV.js.map} +1 -1
  124. package/dist/lib/{orchestrator-Dro541iH.js → orchestrator-BtbxiPQB.js} +17 -16
  125. package/dist/lib/{orchestrator-Dro541iH.js.map → orchestrator-BtbxiPQB.js.map} +1 -1
  126. package/dist/lib/{peerjs-D741bHrf.js → peerjs-QJr03K9F.js} +7 -7
  127. package/dist/lib/{peerjs-D741bHrf.js.map → peerjs-QJr03K9F.js.map} +1 -1
  128. package/dist/lib/{prompt-api-D9XdrCep.js → prompt-api-vf351sf2.js} +2 -19
  129. package/dist/lib/{prompt-api-D9XdrCep.js.map → prompt-api-vf351sf2.js.map} +1 -1
  130. package/dist/lib/{push-client-DKFUY_Ti.js → push-client-BOHgqHbk.js} +4 -4
  131. package/dist/lib/{push-client-DKFUY_Ti.js.map → push-client-BOHgqHbk.js.map} +1 -1
  132. package/dist/lib/{readGroupFileBytes-C8Xqlb8l.js → readGroupFileBytes-CRA6dmgT.js} +2 -2
  133. package/dist/lib/{readGroupFileBytes-C8Xqlb8l.js.map → readGroupFileBytes-CRA6dmgT.js.map} +1 -1
  134. package/dist/lib/{shadow-claw-a2ui-CPydWVdW.js → shadow-claw-a2ui-DbZa4Gxp.js} +2 -2
  135. package/dist/lib/{shadow-claw-a2ui-CPydWVdW.js.map → shadow-claw-a2ui-DbZa4Gxp.js.map} +1 -1
  136. package/dist/lib/{shadow-claw-accounts-CUypXc3I.js → shadow-claw-accounts-B6OW2NVD.js} +3 -3
  137. package/dist/lib/{shadow-claw-accounts-CUypXc3I.js.map → shadow-claw-accounts-B6OW2NVD.js.map} +1 -1
  138. package/dist/lib/{shadow-claw-channel-config-D_Vb2ous.js → shadow-claw-channel-config-F_EJ-uK2.js} +3 -3
  139. package/dist/lib/{shadow-claw-channel-config-D_Vb2ous.js.map → shadow-claw-channel-config-F_EJ-uK2.js.map} +1 -1
  140. package/dist/lib/{shadow-claw-channels-hgjjzvRr.js → shadow-claw-channels-XYylMpjg.js} +3 -3
  141. package/dist/lib/{shadow-claw-channels-hgjjzvRr.js.map → shadow-claw-channels-XYylMpjg.js.map} +1 -1
  142. package/dist/lib/{shadow-claw-chat-D69IiLXd.js → shadow-claw-chat-dbK_DGO_.js} +124 -38
  143. package/dist/lib/shadow-claw-chat-dbK_DGO_.js.map +1 -0
  144. package/dist/lib/{shadow-claw-control-plane-zBYlFvzQ.js → shadow-claw-control-plane-BJKkmahQ.js} +7 -7
  145. package/dist/lib/{shadow-claw-control-plane-zBYlFvzQ.js.map → shadow-claw-control-plane-BJKkmahQ.js.map} +1 -1
  146. package/dist/lib/{shadow-claw-conversations-1GW8_e8o.js → shadow-claw-conversations-BKSsMYTc.js} +6 -6
  147. package/dist/lib/{shadow-claw-conversations-1GW8_e8o.js.map → shadow-claw-conversations-BKSsMYTc.js.map} +1 -1
  148. package/dist/lib/{shadow-claw-D3z3tFyE.js → shadow-claw-eBB2dbpd.js} +11 -11
  149. package/dist/lib/{shadow-claw-D3z3tFyE.js.map → shadow-claw-eBB2dbpd.js.map} +1 -1
  150. package/dist/lib/{shadow-claw-file-viewer-DI4r7Th9.js → shadow-claw-file-viewer-BqChtTvM.js} +8 -8
  151. package/dist/lib/{shadow-claw-file-viewer-DI4r7Th9.js.map → shadow-claw-file-viewer-BqChtTvM.js.map} +1 -1
  152. package/dist/lib/{shadow-claw-files-BM7qW3TW.js → shadow-claw-files-Bu7VCQw6.js} +9 -9
  153. package/dist/lib/{shadow-claw-files-BM7qW3TW.js.map → shadow-claw-files-Bu7VCQw6.js.map} +1 -1
  154. package/dist/lib/{shadow-claw-git-BBTiTYIn.js → shadow-claw-git-CdPPN6Qb.js} +6 -6
  155. package/dist/lib/{shadow-claw-git-BBTiTYIn.js.map → shadow-claw-git-CdPPN6Qb.js.map} +1 -1
  156. package/dist/lib/{shadow-claw-integrations-DTY3E545.js → shadow-claw-integrations-DehqBSRe.js} +4 -4
  157. package/dist/lib/{shadow-claw-integrations-DTY3E545.js.map → shadow-claw-integrations-DehqBSRe.js.map} +1 -1
  158. package/dist/lib/{shadow-claw-llm-AJwzkOGo.js → shadow-claw-llm-COZkufA8.js} +13 -11
  159. package/dist/lib/shadow-claw-llm-COZkufA8.js.map +1 -0
  160. package/dist/lib/{shadow-claw-mcp-remote-n7YXKxmv.js → shadow-claw-mcp-remote-axF50-le.js} +4 -4
  161. package/dist/lib/{shadow-claw-mcp-remote-n7YXKxmv.js.map → shadow-claw-mcp-remote-axF50-le.js.map} +1 -1
  162. package/dist/lib/{shadow-claw-networking-B3leDgZ4.js → shadow-claw-networking-BT_Rxj36.js} +2 -2
  163. package/dist/lib/{shadow-claw-networking-B3leDgZ4.js.map → shadow-claw-networking-BT_Rxj36.js.map} +1 -1
  164. package/dist/lib/{shadow-claw-notifications-Bm2aHQ0U.js → shadow-claw-notifications-ClqAXDDN.js} +3 -3
  165. package/dist/lib/{shadow-claw-notifications-Bm2aHQ0U.js.map → shadow-claw-notifications-ClqAXDDN.js.map} +1 -1
  166. package/dist/lib/{shadow-claw-page-header-BBqSWlhP.js → shadow-claw-page-header-bigC_h6U.js} +2 -2
  167. package/dist/lib/{shadow-claw-page-header-BBqSWlhP.js.map → shadow-claw-page-header-bigC_h6U.js.map} +1 -1
  168. package/dist/lib/{shadow-claw-pages-BFOcluFY.js → shadow-claw-pages-kA2qa-4B.js} +9 -9
  169. package/dist/lib/{shadow-claw-pages-BFOcluFY.js.map → shadow-claw-pages-kA2qa-4B.js.map} +1 -1
  170. package/dist/lib/{shadow-claw-peerjs-BvD_MH_l.js → shadow-claw-peerjs-CvcH2DkA.js} +3 -3
  171. package/dist/lib/{shadow-claw-peerjs-BvD_MH_l.js.map → shadow-claw-peerjs-CvcH2DkA.js.map} +1 -1
  172. package/dist/lib/{shadow-claw-provider-model-picker-CsA-507a.js → shadow-claw-provider-model-picker-fcVQdDtQ.js} +2 -2
  173. package/dist/lib/{shadow-claw-provider-model-picker-CsA-507a.js.map → shadow-claw-provider-model-picker-fcVQdDtQ.js.map} +1 -1
  174. package/dist/lib/{shadow-claw-settings-CZgGMz0a.js → shadow-claw-settings-CkO6JjA4.js} +6 -6
  175. package/dist/lib/{shadow-claw-settings-CZgGMz0a.js.map → shadow-claw-settings-CkO6JjA4.js.map} +1 -1
  176. package/dist/lib/{shadow-claw-storage-BTUpEKO0.js → shadow-claw-storage-10w-y8vL.js} +5 -5
  177. package/dist/lib/{shadow-claw-storage-BTUpEKO0.js.map → shadow-claw-storage-10w-y8vL.js.map} +1 -1
  178. package/dist/lib/{shadow-claw-task-server-B1X2AYyZ.js → shadow-claw-task-server-U98sZxPu.js} +2 -2
  179. package/dist/lib/{shadow-claw-task-server-B1X2AYyZ.js.map → shadow-claw-task-server-U98sZxPu.js.map} +1 -1
  180. package/dist/lib/{shadow-claw-tasks-BYtaRUAd.js → shadow-claw-tasks-DrSVUOsP.js} +8 -8
  181. package/dist/lib/{shadow-claw-tasks-BYtaRUAd.js.map → shadow-claw-tasks-DrSVUOsP.js.map} +1 -1
  182. package/dist/lib/{shadow-claw-terminal-LGuXKu77.js → shadow-claw-terminal-B7HYLuce.js} +2 -2
  183. package/dist/lib/{shadow-claw-terminal-LGuXKu77.js.map → shadow-claw-terminal-B7HYLuce.js.map} +1 -1
  184. package/dist/lib/{shadow-claw-tools-C_S-xXVG.js → shadow-claw-tools-BKrXzZfF.js} +7 -7
  185. package/dist/lib/{shadow-claw-tools-C_S-xXVG.js.map → shadow-claw-tools-BKrXzZfF.js.map} +1 -1
  186. package/dist/lib/{shadow-claw-webvm-Cab1n1bu.js → shadow-claw-webvm-Duwa5oiW.js} +3 -3
  187. package/dist/lib/{shadow-claw-webvm-Cab1n1bu.js.map → shadow-claw-webvm-Duwa5oiW.js.map} +1 -1
  188. package/dist/lib/{syncWebMcpRegistration-Dy5NS_4G.js → syncWebMcpRegistration-BOx-0F6_.js} +5 -5
  189. package/dist/lib/{syncWebMcpRegistration-Dy5NS_4G.js.map → syncWebMcpRegistration-BOx-0F6_.js.map} +1 -1
  190. package/dist/lib/{tools-B7gC1eb_.js → tools-BEuBatUs.js} +4 -4
  191. package/dist/lib/{tools-B7gC1eb_.js.map → tools-BEuBatUs.js.map} +1 -1
  192. package/dist/lib/utils/index.js +1 -1
  193. package/dist/lib/utils/utils.js +1 -1
  194. package/dist/lib/{utils-D_ylqOY-.js → utils-D8AxCH6m.js} +2 -2
  195. package/dist/lib/{utils-D_ylqOY-.js.map → utils-D8AxCH6m.js.map} +1 -1
  196. package/dist/lib/{webmcp-CkYINKJj.js → webmcp-BjfVWX1K.js} +2 -2
  197. package/dist/lib/{webmcp-CkYINKJj.js.map → webmcp-BjfVWX1K.js.map} +1 -1
  198. package/dist/public/.well-known/mcp/server-card.json +1 -1
  199. package/dist/public/.well-known/mcp.json +1 -1
  200. package/dist/public/README.md +1 -1
  201. package/dist/public/agent.worker.js +1 -1
  202. package/dist/public/components/shadow-claw-chat/shadow-claw-chat.html +1 -1
  203. package/dist/public/config-071HSho8.js +1 -0
  204. package/dist/public/{configurePeerJs-DQQ6YL-5.js → configurePeerJs-DL-LurJY.js} +1 -1
  205. package/dist/public/{connections-CRNk2FxF.js → connections-Bb0rBpV-.js} +1 -1
  206. package/dist/public/{custom-element-security-3_FKCXcg.js → custom-element-security-Td4vrRc_.js} +1 -1
  207. package/dist/public/docs/example/article/index.html +1 -1
  208. package/dist/public/docs/example/article.html +1 -1
  209. package/dist/public/docs/publishing/index.html +1 -1
  210. package/dist/public/docs/publishing.html +1 -1
  211. package/dist/public/docs/skill-creator/index.html +1 -1
  212. package/dist/public/docs/skill-creator.html +1 -1
  213. package/dist/public/docs/subsystems/providers.md +1 -1
  214. package/dist/public/{downloadGroupFile-wkdhVgrZ.js → downloadGroupFile-Unq8_7D9.js} +1 -1
  215. package/dist/public/{e2e-bridge-DnFHPuwg.js → e2e-bridge-Dbc9fCDq.js} +1 -1
  216. package/dist/public/{file-viewer-C92v4Ggd.js → file-viewer-QkCuknFn.js} +1 -1
  217. package/dist/public/{getGroupDir-BGGIJL4Y.js → getGroupDir-Bj5XCflQ.js} +1 -1
  218. package/dist/public/{git-BH6qyToB.js → git-Bhz4YHc8.js} +2 -2
  219. package/dist/public/index.html +1 -1
  220. package/dist/public/index.js +1 -1
  221. package/dist/public/{initChatSplitResize--RH5kzVF.js → initChatSplitResize-KNL9Oh7s.js} +1 -1
  222. package/dist/public/{initControlPlane-yPJ3ajkj.js → initControlPlane-D2fVhRFC.js} +1 -1
  223. package/dist/public/main/index.html +1 -1
  224. package/dist/public/main/memory/index.html +1 -1
  225. package/dist/public/main/memory.html +1 -1
  226. package/dist/public/main.html +1 -1
  227. package/dist/public/{markdown-CA0v11cd.js → markdown-By6gdUvF.js} +1 -1
  228. package/dist/public/{mcp-reconnect-uyNSigzu.js → mcp-reconnect-CDRJPuoN.js} +1 -1
  229. package/dist/public/{memoryStorage-DjPNAT5t.js → memoryStorage-C-ao9y-j.js} +1 -1
  230. package/dist/public/model-ranking-DUdrFOcC.js +1 -0
  231. package/dist/public/{orchestrator-DTzgyL23.js → orchestrator-B7MpomoG.js} +2 -2
  232. package/dist/public/{orchestrator-Cmr69pMC.js → orchestrator-C8aIHbDy.js} +2 -2
  233. package/dist/public/{peerjs-Br38mUFC.js → peerjs-DwGjY5VX.js} +1 -1
  234. package/dist/public/prompt-api-BWe_j3Wg.js +1 -0
  235. package/dist/public/{push-client-CB8haOGC.js → push-client-o8g5_EOe.js} +1 -1
  236. package/dist/public/service-worker.js +1 -1
  237. package/dist/public/{shadow-claw-RuFQ2Ej5.js → shadow-claw-Ba2ZFE9m.js} +2 -2
  238. package/dist/public/{shadow-claw-accounts-BMsEItB6.js → shadow-claw-accounts-BbNPiiaV.js} +1 -1
  239. package/dist/public/{shadow-claw-channels-Q_AXuEaI.js → shadow-claw-channels-CHGtPkfY.js} +1 -1
  240. package/dist/public/{shadow-claw-chat-DZQ3OaH7.js → shadow-claw-chat-3TmjJA6-.js} +90 -23
  241. package/dist/public/{shadow-claw-control-plane-CyXA8tB8.js → shadow-claw-control-plane-BAFT06LL.js} +2 -2
  242. package/dist/public/{shadow-claw-conversations-BLKtlvHe.js → shadow-claw-conversations-DsQ_kxWm.js} +1 -1
  243. package/dist/public/{shadow-claw-file-viewer-CVLDfpZe.js → shadow-claw-file-viewer-hBxTknL2.js} +1 -1
  244. package/dist/public/{shadow-claw-files-DB6VVjir.js → shadow-claw-files-Daw6IIrJ.js} +1 -1
  245. package/dist/public/{shadow-claw-git-D57bTSMF.js → shadow-claw-git-CxGwyxim.js} +2 -2
  246. package/dist/public/{shadow-claw-integrations-BOwhUY-4.js → shadow-claw-integrations-DnIr6xp-.js} +1 -1
  247. package/dist/public/{shadow-claw-llm-CYenm-mm.js → shadow-claw-llm-Bc6tZ8kk.js} +3 -3
  248. package/dist/public/{shadow-claw-mcp-remote-CJ-Ckl0j.js → shadow-claw-mcp-remote-nGPpFpI-.js} +1 -1
  249. package/dist/public/{shadow-claw-networking-Cut76YQL.js → shadow-claw-networking-B6YgtiA7.js} +1 -1
  250. package/dist/public/{shadow-claw-notifications-C3kYCrIa.js → shadow-claw-notifications-BSxifptS.js} +1 -1
  251. package/dist/public/{shadow-claw-page-header-Dd7QafUk.js → shadow-claw-page-header-LzVgEn46.js} +1 -1
  252. package/dist/public/{shadow-claw-pages-BWtVtwTG.js → shadow-claw-pages-Cy6T0G9y.js} +1 -1
  253. package/dist/public/{shadow-claw-settings-Bj7jnngO.js → shadow-claw-settings-DGkwt1ge.js} +2 -2
  254. package/dist/public/{shadow-claw-storage-CMSzQs1-.js → shadow-claw-storage-DX_4T7KR.js} +1 -1
  255. package/dist/public/{shadow-claw-task-server-CFclo7UX.js → shadow-claw-task-server-DTsbEs5z.js} +1 -1
  256. package/dist/public/{shadow-claw-tasks-ClDdeB6Z.js → shadow-claw-tasks-rr6fMxAM.js} +1 -1
  257. package/dist/public/{shadow-claw-terminal-3ysWZJix.js → shadow-claw-terminal-C7DhrrX6.js} +1 -1
  258. package/dist/public/{shadow-claw-tools-DQVwpTcZ.js → shadow-claw-tools-DcQroojH.js} +1 -1
  259. package/dist/public/{shadow-claw-webvm-Cnxz04Fk.js → shadow-claw-webvm-bZj44Did.js} +1 -1
  260. package/dist/public/{syncWebMcpRegistration-QwnLMAK3.js → syncWebMcpRegistration-XJjIlDNO.js} +1 -1
  261. package/dist/public/{tools-DvQ_ngXn.js → tools-BpZh7hgB.js} +1 -1
  262. package/dist/public/{webmcp-CJymew4t.js → webmcp-CkfDZfZ0.js} +1 -1
  263. package/dist/server.js +1 -1
  264. package/package.json +1 -1
  265. package/src/components/settings/shadow-claw-llm/model-ranking.test.ts +121 -7
  266. package/src/components/settings/shadow-claw-llm/model-ranking.ts +97 -0
  267. package/src/components/settings/shadow-claw-llm/shadow-claw-llm.test.ts +35 -0
  268. package/src/components/settings/shadow-claw-llm/shadow-claw-llm.ts +15 -5
  269. package/src/components/shadow-claw-chat/shadow-claw-chat.html +81 -14
  270. package/src/components/shadow-claw-chat/shadow-claw-chat.test.ts +73 -0
  271. package/src/components/shadow-claw-chat/shadow-claw-chat.trusted-types.test.ts +3 -0
  272. package/src/components/shadow-claw-chat/shadow-claw-chat.ts +79 -32
  273. package/src/config/config.test.ts +4 -4
  274. package/src/config/config.ts +2 -1
  275. package/src/core/orchestrator/orchestrator.test.ts +2 -1
  276. package/src/core/orchestrator/utils/initTasks.ts +5 -4
  277. package/dist/cli/chunk-B3S061IE.js +0 -1
  278. package/dist/cli/chunk-BUJdF9o3.js +0 -1
  279. package/dist/cli/chunk-BX0R2gIY.js +0 -1
  280. package/dist/cli/chunk-BoiPfhwJ.js +0 -1
  281. package/dist/cli/chunk-BtJYj7vB.js +0 -1
  282. package/dist/cli/chunk-BwXrZVeU.js +0 -1
  283. package/dist/cli/chunk-CaWh9Pru.js +0 -1
  284. package/dist/cli/chunk-Ck4ePI8z.js +0 -1
  285. package/dist/cli/chunk-Ctg-SXcP.js +0 -1
  286. package/dist/cli/chunk-DTKv1-tk.js +0 -1
  287. package/dist/cli/chunk-DdYpd9Nu.js +0 -1
  288. package/dist/cli/chunk-DflhmBY2.js +0 -1
  289. package/dist/lib/config-DxDaVDTn.js.map +0 -1
  290. package/dist/lib/model-ranking-CDXs7hkK.js +0 -57
  291. package/dist/lib/model-ranking-CDXs7hkK.js.map +0 -1
  292. package/dist/lib/shadow-claw-chat-D69IiLXd.js.map +0 -1
  293. package/dist/lib/shadow-claw-llm-AJwzkOGo.js.map +0 -1
  294. package/dist/public/config-Dqn5OMfC.js +0 -1
  295. package/dist/public/model-ranking-DLIC9IDU.js +0 -1
  296. package/dist/public/prompt-api-B-8N-MRY.js +0 -11
@@ -1 +0,0 @@
1
- {"version":3,"file":"shadow-claw-llm-AJwzkOGo.js","names":["shadowClawLlmStyles","shadowClawLlmTemplate"],"sources":["../../src/components/settings/shadow-claw-llm/utils/getRecommendedMaxTokens.ts","../../src/components/settings/shadow-claw-llm/shadow-claw-llm.ts"],"sourcesContent":["import {\n DEFAULT_PROMPT_API_FALLBACK_MODEL,\n getModelMaxTokens,\n} from \"../../../../config/config.js\";\nimport { modelRegistry } from \"../../../../subsystems/providers/model-registry.js\";\nimport { isPromptApiSupported } from \"../../../../subsystems/providers/prompt-api-provider.js\";\n\nexport type BrowserNavigator = Navigator & {\n deviceMemory?: number;\n};\n\n/**\n * Known native context windows for ONNX community / browser-native models.\n * These are the model's *native* context size (not an API-enforced cap).\n */\nconst BROWSER_MODEL_CONTEXT_WINDOWS: Array<{\n pattern: string;\n contextWindow: number;\n}> = [\n // Gemma 3 1B (GQA / standard) — 128K native context\n { pattern: \"gemma-3-1b-it-ONNX-GQA\", contextWindow: 128_000 },\n { pattern: \"gemma-3-1b-it-ONNX\", contextWindow: 128_000 },\n // Qwen3 0.6B — 131K native context (from tokenizer_config.json model_max_length)\n { pattern: \"Qwen3-0.6B-ONNX\", contextWindow: 131_072 },\n // Qwen3.5 ONNX variants\n { pattern: \"Qwen3.5\", contextWindow: 32_768 },\n // Llama 3.2 1B/3B — 128K native context\n { pattern: \"Llama-3.2\", contextWindow: 128_000 },\n // Phi-3.5 / Phi-4 mini — 128K native context\n { pattern: \"Phi-4\", contextWindow: 128_000 },\n { pattern: \"Phi-3.5\", contextWindow: 128_000 },\n // SmolLM2/SmolLM3 — 8K context\n { pattern: \"SmolLM\", contextWindow: 8_192 },\n // DeepSeek-R1 Distill — 128K native context\n { pattern: \"DeepSeek-R1\", contextWindow: 128_000 },\n // LFM2 1.2B\n { pattern: \"LFM2\", contextWindow: 32_768 },\n // GPT-OSS 20B\n { pattern: \"gpt-oss\", contextWindow: 32_768 },\n // Gemma 4 ONNX variants\n { pattern: \"gemma-4\", contextWindow: 128_000 },\n // Chrome Gemini Nano — hard API cap\n { pattern: \"browser-built-in\", contextWindow: 4_096 },\n];\n\nfunction getBrowserModelContextWindow(modelId: string): number | null {\n const dynamicInfo = modelRegistry.getModelInfo(modelId);\n if (\n dynamicInfo &&\n typeof dynamicInfo.contextWindow === \"number\" &&\n dynamicInfo.contextWindow > 0\n ) {\n return dynamicInfo.contextWindow;\n }\n\n for (const { pattern, contextWindow } of BROWSER_MODEL_CONTEXT_WINDOWS) {\n if (modelId.includes(pattern)) {\n return contextWindow;\n }\n }\n\n return null;\n}\n\nexport function getRecommendedMaxTokens(\n providerId: string,\n modelId: string,\n fallbackModelId?: string,\n): {\n recommended: number;\n detail: string;\n} {\n let effectiveModel = modelId;\n if (\n providerId === \"prompt_api\" &&\n (modelId === \"browser-built-in\" || !modelId)\n ) {\n if (fallbackModelId) {\n effectiveModel = fallbackModelId;\n } else if (!isPromptApiSupported()) {\n effectiveModel = DEFAULT_PROMPT_API_FALLBACK_MODEL;\n }\n }\n\n const modelCeiling = getModelMaxTokens(effectiveModel);\n const browserNavigator: BrowserNavigator | null =\n typeof navigator === \"undefined\" ? null : (navigator as BrowserNavigator);\n const deviceMemory =\n typeof browserNavigator?.deviceMemory === \"number\"\n ? browserNavigator.deviceMemory\n : null;\n const cpuThreads =\n typeof browserNavigator?.hardwareConcurrency === \"number\"\n ? browserNavigator.hardwareConcurrency\n : null;\n\n const isBrowserLocal =\n providerId === \"prompt_api\" ||\n providerId === \"transformers_js_browser\" ||\n providerId === \"litert_lm_browser\";\n\n // For browser-local providers, factor in device hardware and model context\n if (isBrowserLocal || providerId === \"ollama\") {\n const knownContext = getBrowserModelContextWindow(effectiveModel);\n let recommended = modelCeiling;\n\n // Hardware-aware scaling\n if (deviceMemory !== null) {\n if (deviceMemory >= 32) {\n recommended = Math.min(recommended, 16384);\n } else if (deviceMemory >= 16) {\n recommended = Math.min(recommended, 8192);\n } else if (deviceMemory >= 8) {\n recommended = Math.min(recommended, 4096);\n } else {\n recommended = Math.min(recommended, 2048);\n }\n }\n\n if (cpuThreads !== null) {\n if (cpuThreads <= 4) {\n recommended = Math.min(recommended, 2048);\n } else if (cpuThreads >= 16) {\n recommended = Math.min(modelCeiling, Math.max(recommended, 8192));\n } else if (cpuThreads >= 8) {\n recommended = Math.min(modelCeiling, Math.max(recommended, 4096));\n }\n }\n\n if (/thinking|reasoning/i.test(effectiveModel)) {\n recommended = Math.min(recommended, 4096);\n }\n\n recommended = Math.max(512, Math.min(recommended, modelCeiling));\n\n const hints: string[] = [];\n if (knownContext !== null) {\n hints.push(`native context: ${knownContext.toLocaleString()} tokens`);\n }\n\n if (deviceMemory !== null) {\n hints.push(`${deviceMemory} GB browser-reported memory`);\n }\n\n if (cpuThreads !== null) {\n hints.push(`${cpuThreads} CPU threads`);\n }\n\n if (/thinking|reasoning/i.test(effectiveModel)) {\n hints.push(\"reasoning model\");\n }\n\n return {\n recommended,\n detail:\n hints.length > 0\n ? `Recommended for this device: ${recommended.toLocaleString()} tokens (${hints.join(\", \")}). Model ceiling: ${modelCeiling.toLocaleString()}.`\n : `Recommended for local inference: ${recommended.toLocaleString()} tokens. Model ceiling: ${modelCeiling.toLocaleString()}.`,\n };\n }\n\n // Cloud providers: use the model ceiling directly\n return {\n recommended: modelCeiling,\n detail: `Model-aware ceiling: ${modelCeiling.toLocaleString()} tokens.`,\n };\n}\n","import {\n CONFIG_KEYS,\n DEFAULT_PROMPT_API_FALLBACK_MODEL,\n DEFAULT_SUBAGENT_MAX_PARALLEL,\n DEFAULT_SUBAGENT_WORKSPACE_MODE,\n} from \"../../../config/config.js\";\n\nimport { effect } from \"../../../core/effect.js\";\nimport { getBedrockSettings } from \"../../../core/orchestrator/utils/operations/provider.js\";\nimport { getDb } from \"../../../db/db.js\";\nimport { getConfig } from \"../../../db/getConfig.js\";\nimport { setConfig } from \"../../../db/setConfig.js\";\nimport { setSanitizedHtml } from \"../../../security/trusted-types.js\";\nimport { orchestratorStore } from \"../../../stores/orchestrator.js\";\nimport { showError, showSuccess, showWarning } from \"../../../ui/toast.js\";\nimport { getRecommendedMaxTokens } from \"./utils/getRecommendedMaxTokens.js\";\nimport { fetchTokenizerConfig } from \"../../../subsystems/providers/utils/chatTemplate.js\";\n\nimport {\n buildLlamafileHelpDialogOptions,\n LLAMAFILE_EXPECTED_DIR,\n} from \"../../common/help/llamafile.js\";\n\nimport {\n isNativePromptApiSupported,\n isNativePromptApiAvailable,\n} from \"../../common/help/prompt-api.js\";\n\nimport {\n compareLocalModelCandidates,\n isLikelyInstructionModelId,\n} from \"./model-ranking.js\";\n\nimport {\n getApiKeyForHeaders,\n getAvailableProviders,\n getLlamafileSettings,\n setBedrockSettings,\n setLlamafileSettings,\n setMeshLlmSettings,\n setModel,\n setProvider,\n} from \"../../../core/orchestrator/utils/operations/provider.js\";\n\nimport {\n setContextCompressionEnabled,\n setMaxIterations,\n setMaxTokens,\n setRateLimitAutoAdapt,\n setRateLimitCallsPerMinute,\n setReasoningEffort,\n setStreamingEnabled,\n} from \"../../../core/orchestrator/utils/settings.js\";\n\nimport type { Orchestrator } from \"../../../core/orchestrator/orchestrator.js\";\nimport type { ShadowClawDatabase } from \"../../../db/types.js\";\nimport type { LLMProvider } from \"../../../subsystems/providers/types.js\";\nimport type { AppDialogOptions } from \"../../../ui/types.js\";\n\nimport ShadowClawElement from \"../../shadow-claw-element.js\";\nimport shadowClawLlmStyles from \"./shadow-claw-llm.css\" with { type: \"css\" };\nimport shadowClawLlmTemplate from \"./shadow-claw-llm.html\" with { type: \"html\" };\n\nconst elementName = \"shadow-claw-llm\";\n\n/**\n * Settings sub-component for LLM Provider, API Key, Model selection,\n * and streaming toggle.\n */\nexport class ShadowClawLlm extends ShadowClawElement {\n static styles = shadowClawLlmStyles;\n static template = shadowClawLlmTemplate;\n\n db: ShadowClawDatabase | null;\n lastLlamafileHelpKey: string;\n llamafileDiscoveredModelIds: string[];\n llamafileModelLoadError: string | null;\n modelFetchToken: number;\n orchestrator: Orchestrator | null;\n\n constructor() {\n super();\n\n this.db = null;\n this.orchestrator = null;\n this.llamafileDiscoveredModelIds = [];\n this.llamafileModelLoadError = null;\n this.lastLlamafileHelpKey = \"\";\n this.modelFetchToken = 0;\n }\n\n async connectedCallback() {\n const root = this.shadowRoot;\n if (!root) {\n throw new Error(\"shadowRoot not found\");\n }\n\n this.db = await getDb();\n this.orchestrator = orchestratorStore.orchestrator;\n\n this.bindEventListeners();\n\n this.setupEffects();\n }\n\n applyRecommendedMaxTokens() {\n if (!this.orchestrator) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"max-tokens-input\"]',\n ) as HTMLInputElement | null;\n if (!input) {\n return;\n }\n\n const providerId = this.orchestrator.provider;\n const modelId = this.orchestrator.model;\n let fallbackModelId: string | undefined;\n\n if (providerId === \"prompt_api\") {\n const fallbackSelect = root.querySelector(\n '[data-setting=\"prompt-api-fallback-select\"]',\n ) as HTMLSelectElement | null;\n fallbackModelId =\n fallbackSelect?.value || DEFAULT_PROMPT_API_FALLBACK_MODEL;\n }\n\n const recommendation = getRecommendedMaxTokens(\n providerId,\n modelId,\n fallbackModelId,\n );\n\n input.value = String(recommendation.recommended);\n }\n\n /**\n * Bind all event listeners.\n */\n bindEventListeners() {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n root\n .querySelector('[data-setting=\"provider-select\"]')\n ?.addEventListener(\"change\", () => this.onProviderChange());\n\n root\n .querySelector('[data-setting=\"prompt-api-fallback-select\"]')\n ?.addEventListener(\"change\", (e) => {\n const target = e.target as HTMLSelectElement | null;\n if (target?.value) {\n fetchTokenizerConfig(target.value)\n .then(() => this.updateMaxTokensUI())\n .catch(() => {});\n }\n this.updateMaxTokensUI();\n });\n\n root\n .querySelector('[data-action=\"save-llm-provider\"]')\n ?.addEventListener(\"click\", () => this.saveApiKey());\n\n root\n .querySelector('[data-action=\"save-model\"]')\n ?.addEventListener(\"click\", () => this.saveModel());\n\n root\n .querySelector('[data-action=\"refresh-models\"]')\n ?.addEventListener(\"click\", () => this.updateModelSelector());\n\n root\n .querySelector('[data-setting=\"model-select\"]')\n ?.addEventListener(\"change\", (e) => {\n const customInput = root.querySelector(\n '[data-setting=\"custom-model-input\"]',\n ) as HTMLElement | null;\n\n const target = e.target as HTMLSelectElement | null;\n if (customInput && target) {\n customInput.style.display =\n target.value === \"__custom__\" ? \"block\" : \"none\";\n }\n });\n\n root\n .querySelector('[data-setting=\"streaming-toggle\"]')\n ?.addEventListener(\"change\", (e) => {\n if (e.target instanceof HTMLInputElement) {\n this.onStreamingToggle(e.target.checked);\n }\n });\n\n root\n .querySelector('[data-setting=\"context-compression-toggle\"]')\n ?.addEventListener(\"change\", (e) => {\n if (e.target instanceof HTMLInputElement) {\n this.onContextCompressionToggle(e.target.checked);\n }\n });\n\n root\n .querySelector('[data-action=\"save-max-iterations\"]')\n ?.addEventListener(\"click\", () => this.saveMaxIterations());\n\n root\n .querySelector('[data-action=\"save-subagent-max-parallel\"]')\n ?.addEventListener(\"click\", () => this.saveSubagentMaxParallel());\n\n root\n .querySelector('[data-action=\"save-subagent-workspace-mode\"]')\n ?.addEventListener(\"click\", () => this.saveSubagentWorkspaceMode());\n\n root\n .querySelector('[data-action=\"save-rate-limit-settings\"]')\n ?.addEventListener(\"click\", () => this.saveRateLimitSettings());\n\n root\n .querySelector('[data-action=\"save-max-tokens\"]')\n ?.addEventListener(\"click\", () => this.saveMaxTokens());\n\n root\n .querySelector('[data-action=\"save-reasoning-effort\"]')\n ?.addEventListener(\"click\", () => this.saveReasoningEffort());\n\n root\n .querySelector('[data-action=\"apply-recommended-max-tokens\"]')\n ?.addEventListener(\"click\", () => this.applyRecommendedMaxTokens());\n\n root\n .querySelector('[data-action=\"save-llamafile-settings\"]')\n ?.addEventListener(\"click\", () => this.saveLlamafileSettings());\n\n root\n .querySelector('[data-action=\"save-bedrock-settings\"]')\n ?.addEventListener(\"click\", () => this.saveBedrockSettings());\n\n root\n .querySelector('[data-action=\"save-mesh-llm-settings\"]')\n ?.addEventListener(\"click\", () => this.saveMeshLlmSettings());\n\n root\n .querySelector('[data-action=\"save-transformers-js-settings\"]')\n ?.addEventListener(\"click\", () => this.saveTransformersJsSettings());\n\n root\n .querySelector('[data-action=\"save-builtin-ai-settings\"]')\n ?.addEventListener(\"click\", () => this.saveBuiltinAiSettings());\n\n root\n .querySelector('[data-setting=\"llamafile-mode\"]')\n ?.addEventListener(\"change\", () => {\n this.updateLlamafileModeVisibility();\n this.updateLlamafileModelSectionVisibility();\n this.updateModelSelector();\n });\n }\n\n renderBedrockSettings() {\n if (!this.orchestrator) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const settings = this.orchestrator\n ? getBedrockSettings(this.orchestrator)\n : null;\n\n const regionInput = root.querySelector(\n '[data-setting=\"bedrock-region-input\"]',\n ) as HTMLInputElement | null;\n const profileInput = root.querySelector(\n '[data-setting=\"bedrock-profile-input\"]',\n ) as HTMLInputElement | null;\n const authModeSelect = root.querySelector(\n '[data-setting=\"bedrock-auth-mode\"]',\n ) as HTMLSelectElement | null;\n\n if (regionInput) {\n regionInput.value = settings?.region || \"\";\n }\n\n if (profileInput) {\n profileInput.value = settings?.profile || \"\";\n }\n\n if (authModeSelect) {\n authModeSelect.value = settings?.authMode || \"provider_chain\";\n }\n }\n\n renderLlamafileSettings() {\n if (!this.orchestrator) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const settings = getLlamafileSettings(this.orchestrator);\n if (!settings) {\n return;\n }\n\n const modeInput = root.querySelector(\n '[data-setting=\"llamafile-mode\"], [data-setting=\"llamafile-mode-select\"]',\n ) as HTMLSelectElement | null;\n const hostInput = root.querySelector(\n '[data-setting=\"llamafile-host\"], [data-setting=\"llamafile-host-input\"]',\n ) as HTMLInputElement | null;\n const portInput = root.querySelector(\n '[data-setting=\"llamafile-port\"], [data-setting=\"llamafile-port-input\"]',\n ) as HTMLInputElement | null;\n const offlineInput = root.querySelector(\n '[data-setting=\"llamafile-offline\"], [data-setting=\"llamafile-offline-toggle\"]',\n ) as HTMLInputElement | null;\n\n if (modeInput) {\n modeInput.value = settings.mode;\n }\n\n if (hostInput) {\n hostInput.value = settings.host;\n }\n\n if (portInput) {\n portInput.value = String(settings.port);\n }\n\n if (offlineInput) {\n offlineInput.checked = settings.offline;\n }\n }\n\n renderMeshLlmSettings() {\n if (!this.orchestrator) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const settings = (this.orchestrator as any).getMeshLlmSettings?.();\n const hostInput = root.querySelector(\n '[data-setting=\"mesh-llm-host-input\"]',\n ) as HTMLInputElement | null;\n if (hostInput) {\n hostInput.value = settings?.host || \"\";\n }\n }\n\n /**\n * Set up reactive effects.\n */\n setupEffects() {\n effect(() => {\n if (orchestratorStore.ready) {\n this.orchestrator = orchestratorStore.orchestrator;\n this.render();\n }\n });\n }\n\n updateBedrockSettingsVisibility(providerId: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const section = root.querySelector(\n '[data-setting=\"bedrock-settings\"]',\n ) as HTMLElement | null;\n if (!section) {\n return;\n }\n\n section.style.display = providerId === \"bedrock_proxy\" ? \"block\" : \"none\";\n }\n\n updateLlamafileModelSectionVisibility() {\n if (!this.orchestrator) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const modelSection = root.querySelector(\n '[data-setting=\"model-settings\"]',\n ) as HTMLElement | null;\n if (!modelSection) {\n return;\n }\n\n const llamafileSettings = getLlamafileSettings(this.orchestrator);\n modelSection.style.display =\n llamafileSettings?.mode === \"server\" ? \"none\" : \"block\";\n }\n\n updateLlamafileModeVisibility() {\n if (!this.orchestrator) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const serverOnly = root.querySelector(\n '[data-setting=\"llamafile-server-only\"]',\n ) as HTMLElement | null;\n const cliOnly = root.querySelector(\n '[data-setting=\"llamafile-cli-only\"]',\n ) as HTMLElement | null;\n\n if (!serverOnly && !cliOnly) {\n return;\n }\n\n const provider = this.orchestrator.provider;\n const isServerMode =\n provider === \"llamafile\" &&\n getLlamafileSettings(this.orchestrator)?.mode === \"server\";\n\n if (serverOnly) {\n serverOnly.style.display = isServerMode ? \"block\" : \"none\";\n }\n\n if (cliOnly) {\n cliOnly.style.display = isServerMode ? \"none\" : \"block\";\n }\n }\n\n updateLlamafileSettingsVisibility(providerId: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const section = root.querySelector(\n '[data-setting=\"llamafile-settings\"]',\n ) as HTMLElement | null;\n if (!section) {\n return;\n }\n\n section.style.display = providerId === \"llamafile\" ? \"block\" : \"none\";\n }\n\n updateMaxTokensUI() {\n if (!this.orchestrator) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"max-tokens-input\"]',\n ) as HTMLInputElement | null;\n const helper = root.querySelector(\n '[data-setting=\"max-tokens-helper\"]',\n ) as HTMLElement | null;\n\n const providerId = this.orchestrator.provider;\n const modelId = this.orchestrator.model;\n let fallbackModelId: string | undefined;\n\n if (providerId === \"prompt_api\") {\n const fallbackSelect = root.querySelector(\n '[data-setting=\"prompt-api-fallback-select\"]',\n ) as HTMLSelectElement | null;\n fallbackModelId =\n fallbackSelect?.value || DEFAULT_PROMPT_API_FALLBACK_MODEL;\n }\n\n const currentValue = this.orchestrator.maxTokens;\n const recommendation = getRecommendedMaxTokens(\n providerId,\n modelId,\n fallbackModelId,\n );\n\n if (input) {\n input.value = String(currentValue);\n // No max cap — let the user set any value; the model will error at\n // runtime if it genuinely can't handle the requested length.\n input.removeAttribute(\"max\");\n }\n\n if (helper) {\n helper.textContent = `${recommendation.detail} Current value: ${currentValue.toLocaleString()}.`;\n }\n }\n\n updateMeshLlmSettingsVisibility(providerId: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const section = root.querySelector(\n '[data-setting=\"mesh-llm-settings\"]',\n ) as HTMLElement | null;\n if (!section) {\n return;\n }\n\n section.style.display = providerId === \"mesh-llm\" ? \"block\" : \"none\";\n }\n\n updateModelProviderHelperText() {\n const root = this.shadowRoot;\n if (!root || !this.orchestrator) {\n return;\n }\n\n const helper = root.querySelector(\n '[data-setting=\"model-provider-helper\"]',\n ) as HTMLElement | null;\n if (!helper) {\n return;\n }\n\n const provider = this.orchestrator.provider;\n const llamafileSettings = getLlamafileSettings(this.orchestrator);\n if (provider !== \"llamafile\" || llamafileSettings?.mode === \"server\") {\n helper.hidden = true;\n helper.textContent = \"\";\n\n return;\n }\n\n helper.hidden = false;\n if (this.llamafileDiscoveredModelIds.length > 0) {\n helper.textContent = `Discovered ${this.llamafileDiscoveredModelIds.length} *.llamafile model${this.llamafileDiscoveredModelIds.length === 1 ? \"\" : \"s\"} in ${LLAMAFILE_EXPECTED_DIR}. Choose Custom Model ID to target a file name that is not listed yet.`;\n\n return;\n }\n\n if (this.llamafileModelLoadError) {\n helper.textContent = `Could not load llamafile models from ${LLAMAFILE_EXPECTED_DIR}. You can still enter a custom model id, but the file must exist there.`;\n\n return;\n }\n\n helper.textContent = `ShadowClaw looks for *.llamafile binaries in ${LLAMAFILE_EXPECTED_DIR}.`;\n }\n\n /**\n * Update model selector based on current provider.\n */\n updateModelSelector() {\n if (!this.orchestrator) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const providers = getAvailableProviders();\n const currentProvider = this.orchestrator.provider;\n const currentProviderData = providers.find(\n (p: LLMProvider) => p.id === currentProvider,\n ) as LLMProvider | undefined;\n const selectionToken = ++this.modelFetchToken;\n\n if (currentProvider !== \"llamafile\") {\n this.llamafileDiscoveredModelIds = [];\n this.llamafileModelLoadError = null;\n }\n\n let skipModelFetch = false;\n if (currentProvider === \"llamafile\") {\n const llamafileSettings = getLlamafileSettings(this.orchestrator);\n if (llamafileSettings?.mode === \"server\") {\n const modelSelect = root.querySelector(\n '[data-setting=\"model-select\"]',\n ) as HTMLSelectElement | null;\n\n if (modelSelect) {\n setSanitizedHtml(\n modelSelect,\n '<option value=\"\">Model is served by local llamafile server</option>',\n );\n modelSelect.disabled = true;\n }\n\n skipModelFetch = true;\n }\n }\n\n this.updateModelProviderHelperText();\n\n // Toggle Prompt API Fallback Group\n const promptApiFallbackGroup = root.querySelector(\n '[data-setting=\"prompt-api-fallback-group\"]',\n ) as HTMLElement | null;\n if (promptApiFallbackGroup) {\n const isAvailable = isNativePromptApiSupported();\n promptApiFallbackGroup.style.display =\n currentProvider === \"prompt_api\" && !isAvailable ? \"block\" : \"none\";\n void isNativePromptApiAvailable().then((available) => {\n if (this.orchestrator?.provider === \"prompt_api\") {\n promptApiFallbackGroup.style.display = !available ? \"block\" : \"none\";\n }\n });\n }\n\n const modelSelect = root.querySelector(\n '[data-setting=\"model-select\"]',\n ) as HTMLSelectElement | null;\n const customModelInput = root.querySelector(\n '[data-setting=\"custom-model-input\"]',\n ) as HTMLInputElement | null;\n const currentModel = this.orchestrator.model;\n const localOnlyProviderIds = new Set([\n \"transformers_js_local\",\n \"transformers_js_browser\",\n \"ollama\",\n \"llamafile\",\n \"prompt_api\",\n ]);\n\n const escapeHtml = (value: string): string =>\n value\n .replace(/&/g, \"&amp;\")\n .replace(/</g, \"&lt;\")\n .replace(/>/g, \"&gt;\")\n .replace(/\\\"/g, \"&quot;\")\n .replace(/'/g, \"&#39;\");\n\n /**\n * Heuristic to determine if a model is \"free\" or \"included\" based on provider metadata\n */\n const isFreeModel = (m: any) => {\n if (\n localOnlyProviderIds.has(currentProvider) ||\n currentProvider === \"mesh-llm\"\n ) {\n return true;\n }\n\n if (typeof m === \"string\") {\n return false;\n }\n\n // HuggingFace Router format\n if (Array.isArray(m.providers)) {\n return m.providers.some(\n (p) =>\n p.provider === \"hf-inference\" ||\n !p.pricing ||\n (parseFloat(String(p.pricing.input || p.pricing.prompt || 0)) ===\n 0 &&\n parseFloat(\n String(p.pricing.output || p.pricing.completion || 0),\n ) === 0),\n );\n }\n\n // OpenRouter format\n if (m.pricing) {\n return (\n parseFloat(String(m.pricing.prompt || 0)) === 0 &&\n parseFloat(String(m.pricing.completion || 0)) === 0\n );\n }\n\n return false;\n };\n\n /**\n * Helper to check if a model supports tool calling\n */\n const supportsTools = (m: any): boolean => {\n const id = typeof m === \"string\" ? m : m.id || m.name;\n if (localOnlyProviderIds.has(currentProvider)) {\n return isLikelyInstructionModelId(id);\n }\n\n if (typeof m === \"string\") {\n return false;\n }\n\n // Explicit property from our proxy or other custom formats\n if (m.supports_tools === true || m.supportsTools === true) {\n return true;\n }\n\n // HuggingFace format\n if (Array.isArray(m.providers)) {\n return m.providers.some((p) => p.supports_tools === true);\n }\n\n // OpenRouter format\n if (Array.isArray(m.supported_parameters)) {\n return m.supported_parameters.includes(\"tools\");\n }\n\n return false;\n };\n\n const getToolsBadge = (m: any): string => {\n const id = typeof m === \"string\" ? m : m.id || m.name;\n if (localOnlyProviderIds.has(currentProvider)) {\n return isLikelyInstructionModelId(id) ? \" 🛠️\" : \" ❔🛠️\";\n }\n\n if (typeof m === \"string\") {\n return \" ❔🛠️\";\n }\n\n if (m.supports_tools === true || m.supportsTools === true) {\n return \" 🛠️\";\n }\n\n if (m.supports_tools === false || m.supportsTools === false) {\n return \" 🚫🛠️\";\n }\n\n if (Array.isArray(m.providers)) {\n const anySupportsTools = m.providers.some(\n (p) => p.supports_tools === true,\n );\n const anyExplicitNoTools = m.providers.some(\n (p) => p.supports_tools === false,\n );\n if (anySupportsTools) {\n return \" 🛠️\";\n }\n\n if (anyExplicitNoTools) {\n return \" 🚫🛠️\";\n }\n }\n\n if (Array.isArray(m.supported_parameters)) {\n return m.supported_parameters.includes(\"tools\") ? \" 🛠️\" : \" 🚫🛠️\";\n }\n\n return \" ❔🛠️\";\n };\n\n /**\n * Helper to get context length\n */\n const getContextLength = (m: any) => {\n if (typeof m === \"string\") {\n return 0;\n }\n\n if (typeof m.context_length === \"number\") {\n return m.context_length;\n }\n\n if (typeof m.context_window === \"number\") {\n return m.context_window;\n }\n\n if (Array.isArray(m.providers)) {\n return Math.max(...m.providers.map((p) => p.context_length || 0), 0);\n }\n\n return 0;\n };\n\n /**\n * Helper to render options and ensure current model is selected or custom is shown\n */\n const renderOptions = (modelItems: any[]) => {\n if (!modelSelect || !customModelInput) {\n return;\n }\n\n if (!Array.isArray(modelItems) || modelItems.length === 0) {\n const currentValue = this.orchestrator?.model || \"\";\n const emptyMessage =\n currentProvider === \"llamafile\"\n ? `No *.llamafile models found in ${LLAMAFILE_EXPECTED_DIR}`\n : \"No models available\";\n\n setSanitizedHtml(\n modelSelect,\n [\n `<option value=\"\" ${currentValue ? \"\" : \"selected\"}>${escapeHtml(emptyMessage)}</option>`,\n `<option value=\"__custom__\">-- Custom Model ID --</option>`,\n ].join(\"\"),\n );\n\n if (currentValue) {\n modelSelect.value = \"__custom__\";\n customModelInput.value = currentValue;\n customModelInput.style.display = \"block\";\n } else {\n modelSelect.value = \"\";\n customModelInput.value = \"\";\n customModelInput.style.display = \"none\";\n }\n\n if (currentProvider === \"llamafile\" && !currentValue) {\n void this.showLlamafileHelpDialog(\n this.llamafileModelLoadError\n ? `Failed to load *.llamafile models: ${this.llamafileModelLoadError}`\n : `No *.llamafile files were found in ${LLAMAFILE_EXPECTED_DIR}.`,\n );\n }\n\n this.updateModelProviderHelperText();\n\n return;\n }\n\n const freeModels: any[] = [];\n const paidModels: any[] = [];\n\n for (const item of modelItems) {\n if (!item || (typeof item !== \"string\" && !item.id)) {\n continue;\n }\n\n if (isFreeModel(item)) {\n freeModels.push(item);\n } else {\n paidModels.push(item);\n }\n }\n\n const modelComparator = (a, b) => {\n if (localOnlyProviderIds.has(currentProvider)) {\n const idA = typeof a === \"string\" ? a : a.id || a.name;\n const idB = typeof b === \"string\" ? b : b.id || b.name;\n\n return compareLocalModelCandidates(\n {\n id: idA,\n supportsTools: supportsTools(a),\n contextLength: getContextLength(a),\n },\n {\n id: idB,\n supportsTools: supportsTools(b),\n contextLength: getContextLength(b),\n },\n currentProvider,\n );\n }\n\n // 1. Tools support\n const toolsA = supportsTools(a);\n const toolsB = supportsTools(b);\n if (toolsA !== toolsB) {\n return toolsB ? 1 : -1;\n }\n\n // 2. Context length\n const ctxA = getContextLength(a);\n const ctxB = getContextLength(b);\n if (ctxA !== ctxB) {\n return ctxB - ctxA;\n }\n\n // 3. ID\n const idA = typeof a === \"string\" ? a : a.id || a.name;\n const idB = typeof b === \"string\" ? b : b.id || b.name;\n\n return idA.localeCompare(idB);\n };\n\n freeModels.sort(modelComparator);\n paidModels.sort(modelComparator);\n\n const toOption = (m) => {\n const id = typeof m === \"string\" ? m : m.id || m.name;\n const displayName =\n typeof m === \"string\"\n ? id\n : typeof m.displayName === \"string\" && m.displayName.trim()\n ? m.displayName.trim()\n : typeof m.name === \"string\" && m.name.trim()\n ? m.name.trim()\n : id;\n const toolsBadge = getToolsBadge(m);\n const ctx = getContextLength(m);\n let ctxStr = \"\";\n if (ctx >= 1000000) {\n ctxStr = ` (${(ctx / 1000000).toFixed(1)}M)`;\n } else if (ctx >= 1000) {\n ctxStr = ` (${Math.round(ctx / 1024)}k)`;\n } else if (ctx > 0) {\n ctxStr = ` (${ctx})`;\n }\n\n const label = displayName === id ? id : `${displayName} - ${id}`;\n\n return `<option value=\"${escapeHtml(id)}\">${escapeHtml(label)}${ctxStr}${toolsBadge}</option>`;\n };\n\n let html = \"\";\n if (localOnlyProviderIds.has(currentProvider)) {\n const localModels = [...freeModels, ...paidModels].sort(\n modelComparator,\n );\n if (localModels.length > 0) {\n const localLabel =\n currentProvider === \"prompt_api\"\n ? \"Built-in\"\n : \"Local / Self-hosted\";\n html += `<optgroup label=\"${localLabel}\">`;\n html += localModels.map(toOption).join(\"\");\n html += `</optgroup>`;\n }\n } else {\n if (freeModels.length > 0) {\n html += `<optgroup label=\"Free / Included\">`;\n html += freeModels.map(toOption).join(\"\");\n html += `</optgroup>`;\n }\n\n if (paidModels.length > 0) {\n html += `<optgroup label=\"Paid / Pro\">`;\n html += paidModels.map(toOption).join(\"\");\n html += `</optgroup>`;\n }\n }\n\n html += `<option value=\"__custom__\">-- Custom Model ID --</option>`;\n setSanitizedHtml(modelSelect, html);\n\n // Check if current model exists in the list\n const allModelIds = modelItems.map((m) =>\n typeof m === \"string\" ? m : m.id || m.name,\n );\n\n if (allModelIds.includes(currentModel)) {\n modelSelect.value = currentModel;\n customModelInput.style.display = \"none\";\n } else {\n // Fallback to custom input\n modelSelect.value = \"__custom__\";\n customModelInput.value = currentModel || \"\";\n customModelInput.style.display = \"block\";\n }\n\n this.updateModelProviderHelperText();\n };\n\n // If the provider has a pre-selected list, prioritize it\n if (skipModelFetch) {\n // Server mode: no model list fetch; runtime server decides model.\n } else if (currentProviderData?.modelsUrl && modelSelect) {\n // Fetch models dynamically and merge with static models\n const fetchToken = selectionToken;\n setSanitizedHtml(modelSelect, \"<option>Loading models…</option>\");\n modelSelect.disabled = true;\n\n const headers = { ...currentProviderData.headers };\n if (currentProvider === \"llamafile\") {\n const llamafileSettings = getLlamafileSettings(this.orchestrator);\n if (llamafileSettings) {\n headers[\"x-llamafile-mode\"] = llamafileSettings.mode;\n headers[\"x-llamafile-host\"] = llamafileSettings.host;\n headers[\"x-llamafile-port\"] = String(llamafileSettings.port);\n headers[\"x-llamafile-offline\"] = llamafileSettings.offline\n ? \"true\"\n : \"false\";\n }\n } else if (currentProvider === \"bedrock_proxy\") {\n const bedrockSettings = this.orchestrator\n ? getBedrockSettings(this.orchestrator)\n : null;\n if (bedrockSettings?.region) {\n headers[\"x-bedrock-region\"] = bedrockSettings.region;\n }\n\n if (bedrockSettings?.profile) {\n headers[\"x-bedrock-profile\"] = bedrockSettings.profile;\n }\n\n if (bedrockSettings?.authMode) {\n headers[\"x-bedrock-auth-mode\"] = bedrockSettings.authMode;\n }\n }\n\n getApiKeyForHeaders(this.orchestrator).then((apiKey) => {\n if (apiKey && currentProviderData.apiKeyHeader) {\n const format = currentProviderData.apiKeyHeaderFormat || \"{key}\";\n const authValue = format.replace(\"{key}\", apiKey);\n headers[currentProviderData.apiKeyHeader] = authValue;\n }\n\n if (!currentProviderData.modelsUrl) {\n return;\n }\n\n fetch(currentProviderData.modelsUrl, { headers })\n .then((r) => {\n if (!r.ok) {\n throw new Error(`HTTP ${r.status}`);\n }\n\n return r.json();\n })\n .then((data) => {\n if (fetchToken !== this.modelFetchToken) {\n return;\n }\n\n if (this.orchestrator?.provider !== currentProvider) {\n return;\n }\n\n // Robustly handle different API response structures\n let items: any[] = [];\n if (Array.isArray(data)) {\n items = data;\n } else if (data && typeof data === \"object\") {\n // Standard wrappers\n items = data.models || data.data || [];\n\n // If still empty, scan for any non-empty array in the response (some proxies/routers flatten differently)\n if (items.length === 0) {\n for (const key in data) {\n if (Array.isArray(data[key]) && data[key].length > 0) {\n items = data[key];\n\n break;\n }\n }\n }\n\n // If still empty but the object itself looks like a model\n if (items.length === 0 && data.id) {\n items = [data];\n }\n }\n\n // Merge static models if any\n if (Array.isArray(currentProviderData.models)) {\n const dynamicIds = new Set(\n items.map((i) => (typeof i === \"string\" ? i : i.id || i.name)),\n );\n const statics = currentProviderData.models.filter((m: any) => {\n const mId = typeof m === \"string\" ? m : m.id || m.name;\n\n return !dynamicIds.has(mId);\n });\n items = [...statics, ...items];\n }\n\n if (currentProvider === \"llamafile\") {\n this.llamafileModelLoadError = null;\n this.llamafileDiscoveredModelIds = items\n .map((item) =>\n typeof item === \"string\"\n ? item\n : String(item?.id || item?.name || \"\"),\n )\n .filter(Boolean);\n }\n\n modelSelect.disabled = false;\n renderOptions(items);\n })\n .catch((err) => {\n if (fetchToken !== this.modelFetchToken) {\n return;\n }\n\n if (this.orchestrator?.provider !== currentProvider) {\n return;\n }\n\n console.error(\n \"[ShadowClaw] Failed to load models from\",\n currentProviderData.modelsUrl,\n err,\n );\n const message = err instanceof Error ? err.message : String(err);\n\n if (currentProvider === \"llamafile\") {\n this.llamafileDiscoveredModelIds = [];\n this.llamafileModelLoadError = message;\n modelSelect.disabled = false;\n renderOptions([]);\n\n return;\n }\n\n setSanitizedHtml(\n modelSelect,\n \"<option>Failed to load models</option>\",\n );\n\n if (currentProviderData?.models) {\n console.warn(\n \"Falling back to statically configured models due to fetch failure.\",\n );\n modelSelect.disabled = false;\n renderOptions(currentProviderData.models);\n } else {\n showError(\n \"Could not reach the model server \\u2014 or proxy configuration is wrong\",\n 5000,\n );\n }\n });\n });\n } else if (currentProviderData?.models && modelSelect) {\n modelSelect.disabled = false;\n renderOptions(currentProviderData.models);\n } else if (modelSelect) {\n modelSelect.disabled = false;\n renderOptions([]);\n }\n\n // Update helper text for API key\n const helperText = root.querySelector('[data-setting=\"api-key-helper\"]');\n const providerSelect = root.querySelector(\n '[data-setting=\"provider-select\"]',\n ) as HTMLSelectElement | null;\n\n if (helperText && providerSelect) {\n const providerName =\n providerSelect.selectedOptions[0]?.text || \"Provider\";\n const requiresApiKey = currentProviderData?.requiresApiKey !== false;\n helperText.textContent =\n currentProvider === \"llamafile\"\n ? \"Runs local .llamafile binaries through the local proxy. No API key required.\"\n : !requiresApiKey\n ? \"This provider does not require an API key.\"\n : `Enter your ${providerName} API key. It is encrypted and stored locally.`;\n }\n\n const keyInput = root.querySelector(\n '[data-setting=\"api-key-input\"]',\n ) as HTMLInputElement | null;\n if (keyInput) {\n const noKeyProvider = currentProviderData?.requiresApiKey === false;\n keyInput.disabled = noKeyProvider;\n keyInput.placeholder = noKeyProvider ? \"No API key required\" : \"sk-...\";\n }\n }\n\n updateTransformersJsSettingsVisibility(provider: string) {\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const section = root.querySelector(\n '[data-setting=\"transformers-js-settings\"]',\n ) as HTMLElement | null;\n if (section) {\n section.style.display =\n provider === \"transformers_js_browser\" ? \"block\" : \"none\";\n }\n }\n\n /**\n * Handle context compression toggle change.\n */\n async onContextCompressionToggle(enabled: boolean) {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n try {\n await setContextCompressionEnabled(this.orchestrator, this.db, enabled);\n showSuccess(\n enabled\n ? \"Context compression enabled\"\n : \"Context compression disabled\",\n 2500,\n );\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving context compression setting: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Handle provider selection change.\n */\n async onProviderChange() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const providerSelect = root.querySelector(\n '[data-setting=\"provider-select\"]',\n ) as HTMLSelectElement | null;\n if (!providerSelect) {\n return;\n }\n\n const providerId = providerSelect.value;\n const currentProvider = this.orchestrator.provider;\n\n if (providerId !== currentProvider) {\n try {\n await setProvider(this.orchestrator, this.db, providerId, {\n loadApiKeyForProvider: this.orchestrator.loadApiKeyForProvider.bind(\n this.orchestrator,\n ),\n getApiKeyForHeaders: () => getApiKeyForHeaders(this.orchestrator!),\n });\n this.updateModelSelector();\n this.updateMaxTokensUI();\n this.updateLlamafileSettingsVisibility(providerId);\n this.renderLlamafileSettings();\n this.updateLlamafileModeVisibility();\n this.updateLlamafileModelSectionVisibility();\n this.updateBedrockSettingsVisibility(providerId);\n this.updateBedrockSettingsVisibility(providerId);\n this.updateMeshLlmSettingsVisibility(providerId);\n this.updateTransformersJsSettingsVisibility(providerId);\n await this.renderTransformersJsSettings();\n\n const selectedText =\n providerSelect.selectedOptions[0]?.text || providerId;\n showSuccess(`Switched to ${selectedText}`, 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error switching provider: \" + errorMsg, 6000);\n providerSelect.value = currentProvider;\n }\n }\n }\n\n /**\n * Handle streaming toggle change.\n */\n async onStreamingToggle(enabled: boolean) {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n try {\n await setStreamingEnabled(this.orchestrator, this.db, enabled);\n showSuccess(enabled ? \"Streaming enabled\" : \"Streaming disabled\", 2500);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving streaming setting: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Enforce section visibility based on host data-view attribute.\n * This complements CSS scoping and prevents UI drift when templates are edited.\n */\n\n /**\n * Load and populate all settings fields.\n */\n async render() {\n const root = this.shadowRoot;\n if (!root || !this.orchestrator || !this.db) {\n return;\n }\n\n this.bindEventListeners();\n\n // Populate provider selector\n const providers = getAvailableProviders();\n const currentProvider = this.orchestrator.provider;\n const providerSelect = root.querySelector(\n '[data-setting=\"provider-select\"]',\n ) as HTMLSelectElement | null;\n\n if (providerSelect) {\n setSanitizedHtml(\n providerSelect,\n providers\n .map(\n (p: LLMProvider) =>\n `<option value=\"${p.id}\" ${p.id === currentProvider ? \"selected\" : \"\"}>${p.name}</option>`,\n )\n .join(\"\"),\n );\n }\n\n // Populate model selector\n this.updateModelSelector();\n\n this.updateLlamafileSettingsVisibility(currentProvider);\n this.renderLlamafileSettings();\n this.updateLlamafileModeVisibility();\n this.updateLlamafileModelSectionVisibility();\n this.updateModelProviderHelperText();\n this.updateBedrockSettingsVisibility(currentProvider);\n this.renderBedrockSettings();\n this.updateMeshLlmSettingsVisibility(currentProvider);\n this.renderMeshLlmSettings();\n this.updateTransformersJsSettingsVisibility(currentProvider);\n await this.renderTransformersJsSettings();\n void this.renderBuiltinAiSettings();\n\n const promptApiFallbackSelect = root.querySelector(\n '[data-setting=\"prompt-api-fallback-select\"]',\n ) as HTMLSelectElement | null;\n if (promptApiFallbackSelect) {\n const configuredFallback = await getConfig(\n this.db,\n CONFIG_KEYS.PROMPT_API_FALLBACK_MODEL,\n );\n promptApiFallbackSelect.value =\n configuredFallback || DEFAULT_PROMPT_API_FALLBACK_MODEL;\n this.updateMaxTokensUI();\n\n if (promptApiFallbackSelect.value) {\n fetchTokenizerConfig(promptApiFallbackSelect.value)\n .then(() => {\n this.updateMaxTokensUI();\n })\n .catch(() => {});\n }\n }\n\n const promptApiDeviceSelect = root.querySelector(\n '[data-setting=\"prompt-api-device-select\"]',\n ) as HTMLSelectElement | null;\n if (promptApiDeviceSelect) {\n const configuredBackend =\n (await getConfig(this.db, CONFIG_KEYS.PROMPT_API_BACKEND)) || \"auto\";\n promptApiDeviceSelect.value = configuredBackend;\n }\n\n const promptApiDtypeSelect = root.querySelector(\n '[data-setting=\"prompt-api-dtype-select\"]',\n ) as HTMLSelectElement | null;\n if (promptApiDtypeSelect) {\n const configuredDtype =\n (await getConfig(this.db, CONFIG_KEYS.PROMPT_API_DTYPE_STRATEGY)) ||\n \"auto\";\n promptApiDtypeSelect.value = configuredDtype;\n }\n\n // Load streaming toggle\n const streamingToggle = root.querySelector(\n '[data-setting=\"streaming-toggle\"]',\n ) as HTMLInputElement | null;\n if (streamingToggle) {\n streamingToggle.checked = this.orchestrator.streamingEnabled;\n }\n\n // Load context compression toggle\n const ccToggle = root.querySelector(\n '[data-setting=\"context-compression-toggle\"]',\n ) as HTMLInputElement | null;\n if (ccToggle) {\n ccToggle.checked = this.orchestrator.contextCompressionEnabled;\n }\n\n const reasoningSelect = root.querySelector(\n '[data-setting=\"reasoning-effort-select\"]',\n ) as HTMLSelectElement | null;\n if (reasoningSelect) {\n reasoningSelect.value = this.orchestrator.reasoningEffort || \"none\";\n }\n\n // Load max iterations\n const maxIterInput = root.querySelector(\n '[data-setting=\"max-iterations-input\"]',\n ) as HTMLInputElement | null;\n if (maxIterInput && this.orchestrator) {\n maxIterInput.value = String(this.orchestrator.maxIterations);\n }\n\n // Load subagent max parallel\n const subagentMaxInput = root.querySelector(\n '[data-setting=\"subagent-max-parallel-input\"]',\n ) as HTMLInputElement | null;\n if (subagentMaxInput) {\n const rawMax = await getConfig(\n this.db,\n CONFIG_KEYS.SUBAGENT_MAX_PARALLEL,\n );\n const configuredMax = Number(rawMax);\n subagentMaxInput.value = String(\n Number.isFinite(configuredMax) && configuredMax > 0\n ? configuredMax\n : DEFAULT_SUBAGENT_MAX_PARALLEL,\n );\n }\n\n const subagentWorkspaceModeSelect = root.querySelector(\n '[data-setting=\"subagent-workspace-mode-select\"]',\n ) as HTMLSelectElement | null;\n if (subagentWorkspaceModeSelect) {\n const rawMode = await getConfig(\n this.db,\n CONFIG_KEYS.SUBAGENT_WORKSPACE_MODE,\n );\n const normalizedMode =\n rawMode === \"parent\" ||\n rawMode === \"isolated\" ||\n rawMode === \"automatic\"\n ? rawMode\n : DEFAULT_SUBAGENT_WORKSPACE_MODE;\n subagentWorkspaceModeSelect.value = normalizedMode;\n }\n\n const rateLimitInput = root.querySelector(\n '[data-setting=\"rate-limit-calls-per-minute-input\"]',\n ) as HTMLInputElement | null;\n if (rateLimitInput && this.orchestrator) {\n rateLimitInput.value = String(\n this.orchestrator.rateLimitCallsPerMinute || 0,\n );\n }\n\n const rateLimitAutoToggle = root.querySelector(\n '[data-setting=\"rate-limit-auto-adapt-toggle\"]',\n ) as HTMLInputElement | null;\n if (rateLimitAutoToggle && this.orchestrator) {\n rateLimitAutoToggle.checked =\n this.orchestrator.rateLimitAutoAdapt !== false;\n }\n\n this.updateMaxTokensUI();\n }\n\n async renderBuiltinAiSettings() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const compactionSelect = root.querySelector(\n '[data-setting=\"compaction-engine-select\"]',\n ) as HTMLSelectElement | null;\n const toolsBackendSelect = root.querySelector(\n '[data-setting=\"builtin-ai-tools-backend-select\"]',\n ) as HTMLSelectElement | null;\n\n const compactionPref = await getConfig(\n this.db,\n CONFIG_KEYS.COMPACTION_ENGINE_PREFERENCE,\n );\n const toolsPref = await getConfig(\n this.db,\n CONFIG_KEYS.BUILTIN_AI_TOOLS_BACKEND,\n );\n\n if (compactionSelect) {\n compactionSelect.value = compactionPref || \"auto\";\n }\n\n if (toolsBackendSelect) {\n toolsBackendSelect.value = toolsPref || \"active_provider\";\n }\n }\n\n async renderTransformersJsSettings() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const { getConfig } = await import(\"../../../db/getConfig.js\");\n const { CONFIG_KEYS } = await import(\"../../../config/config.js\");\n\n const backend =\n (await getConfig(this.db, CONFIG_KEYS.TRANSFORMERS_JS_BACKEND)) || \"auto\";\n const dtypeStrategy =\n (await getConfig(this.db, CONFIG_KEYS.TRANSFORMERS_JS_DTYPE_STRATEGY)) ||\n \"auto\";\n\n const backendSelect = root.querySelector(\n '[data-setting=\"transformers-js-backend\"], [data-setting=\"transformers-js-device-select\"]',\n ) as HTMLSelectElement | null;\n if (backendSelect) {\n backendSelect.value = backend;\n }\n\n const dtypeStrategySelect = root.querySelector(\n '[data-setting=\"transformers-js-dtype-strategy\"], [data-setting=\"transformers-js-dtype-select\"]',\n ) as HTMLSelectElement | null;\n if (dtypeStrategySelect) {\n dtypeStrategySelect.value = dtypeStrategy;\n }\n }\n\n async requestAppDialog(options: AppDialogOptions): Promise<boolean> {\n const el = document.querySelector(\"shadow-claw\") as any;\n if (el && typeof el.requestDialog === \"function\") {\n return await el.requestDialog(options);\n }\n\n return false;\n }\n\n /**\n * Save API key and provider.\n */\n async saveApiKey() {\n if (!this.orchestrator || !this.db) {\n showError(\"Orchestrator not initialized\", 5000);\n\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const keyInput = root.querySelector(\n '[data-setting=\"api-key-input\"]',\n ) as HTMLInputElement | null;\n const providerSelect = root.querySelector(\n '[data-setting=\"provider-select\"]',\n ) as HTMLSelectElement | null;\n\n if (!keyInput || !providerSelect) {\n return;\n }\n\n const key = keyInput.value.trim();\n const providerId = providerSelect.value;\n const selectedProvider = getAvailableProviders().find(\n (p: LLMProvider) => p.id === providerId,\n );\n const requiresApiKey = selectedProvider?.requiresApiKey !== false;\n\n if (!requiresApiKey) {\n try {\n await setProvider(this.orchestrator, this.db, providerId, {\n loadApiKeyForProvider: this.orchestrator.loadApiKeyForProvider.bind(\n this.orchestrator,\n ),\n getApiKeyForHeaders: () => getApiKeyForHeaders(this.orchestrator!),\n });\n keyInput.value = \"\";\n showSuccess(\"Provider saved (no API key required)\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving provider: \" + errorMsg, 6000);\n }\n\n return;\n }\n\n if (!key) {\n showWarning(\"Please enter an API key\", 3000);\n\n return;\n }\n\n try {\n await this.orchestrator.setApiKey(this.db, key);\n keyInput.value = \"\";\n showSuccess(\"API key and provider saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving API key: \" + errorMsg, 6000);\n }\n }\n\n async saveBedrockSettings() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const regionInput = root.querySelector(\n '[data-setting=\"bedrock-region-input\"]',\n ) as HTMLInputElement | null;\n const profileInput = root.querySelector(\n '[data-setting=\"bedrock-profile-input\"]',\n ) as HTMLInputElement | null;\n const authModeSelect = root.querySelector(\n '[data-setting=\"bedrock-auth-mode\"]',\n ) as HTMLSelectElement | null;\n\n if (!regionInput || !profileInput) {\n return;\n }\n\n const region = regionInput.value.trim();\n const profile = profileInput.value.trim();\n const authMode = authModeSelect?.value || \"provider_chain\";\n\n if ((region && !profile) || (!region && profile)) {\n showWarning(\n \"Enter both Bedrock region and profile (or leave both blank to rely on environment variables)\",\n 4000,\n );\n\n return;\n }\n\n try {\n await setBedrockSettings(this.orchestrator, this.db, {\n region,\n profile,\n authMode,\n });\n showSuccess(\"Bedrock fallback settings saved\", 3000);\n if (this.orchestrator.provider === \"bedrock_proxy\") {\n this.updateModelSelector();\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Bedrock fallback settings: \" + errorMsg, 6000);\n }\n }\n\n async saveBuiltinAiSettings() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const compactionSelect = root.querySelector(\n '[data-setting=\"compaction-engine-select\"]',\n ) as HTMLSelectElement | null;\n const toolsBackendSelect = root.querySelector(\n '[data-setting=\"builtin-ai-tools-backend-select\"]',\n ) as HTMLSelectElement | null;\n\n try {\n if (compactionSelect) {\n await setConfig(\n this.db,\n CONFIG_KEYS.COMPACTION_ENGINE_PREFERENCE,\n compactionSelect.value,\n );\n }\n if (toolsBackendSelect) {\n await setConfig(\n this.db,\n CONFIG_KEYS.BUILTIN_AI_TOOLS_BACKEND,\n toolsBackendSelect.value,\n );\n }\n showSuccess(\"Built-in AI settings saved successfully\", 2500);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Built-in AI settings: \" + errorMsg, 5000);\n }\n }\n\n async saveLlamafileSettings() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const modeInput = root.querySelector(\n '[data-setting=\"llamafile-mode\"], [data-setting=\"llamafile-mode-select\"]',\n ) as HTMLSelectElement | null;\n const hostInput = root.querySelector(\n '[data-setting=\"llamafile-host\"], [data-setting=\"llamafile-host-input\"]',\n ) as HTMLInputElement | null;\n const portInput = root.querySelector(\n '[data-setting=\"llamafile-port\"], [data-setting=\"llamafile-port-input\"]',\n ) as HTMLInputElement | null;\n const offlineInput = root.querySelector(\n '[data-setting=\"llamafile-offline\"], [data-setting=\"llamafile-offline-toggle\"]',\n ) as HTMLInputElement | null;\n\n if (!modeInput || !hostInput || !portInput || !offlineInput) {\n return;\n }\n\n const mode = modeInput.value === \"cli\" ? \"cli\" : \"server\";\n const host = hostInput.value.trim();\n const port = parseInt(portInput.value, 10);\n\n if (!host) {\n showWarning(\"Please enter a host\", 3000);\n\n return;\n }\n\n if (!Number.isFinite(port) || port < 1 || port > 65535) {\n showWarning(\"Please enter a valid port (1-65535)\", 3000);\n\n return;\n }\n\n try {\n await setLlamafileSettings(this.orchestrator, this.db, {\n mode,\n host,\n port,\n offline: offlineInput.checked,\n });\n this.updateLlamafileModeVisibility();\n this.updateLlamafileModelSectionVisibility();\n this.updateModelSelector();\n\n const isLlamafileProvider = this.orchestrator.provider === \"llamafile\";\n if (isLlamafileProvider) {\n const restarted = await orchestratorStore.restartCurrentRequest();\n showSuccess(\n restarted\n ? \"Llamafile settings saved, request restarted\"\n : \"Llamafile settings saved\",\n 3000,\n );\n\n return;\n }\n\n showSuccess(\"Llamafile settings saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving llamafile settings: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Handle activity log disk logging toggle change.\n */\n\n async saveMaxIterations() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"max-iterations-input\"]',\n ) as HTMLInputElement | null;\n if (!input) {\n return;\n }\n\n const value = parseInt(input.value, 10);\n if (!value || value < 1) {\n showWarning(\"Please enter a valid number (1 or higher)\", 3000);\n\n return;\n }\n\n try {\n await setMaxIterations(this.orchestrator, this.db, value);\n showSuccess(\"Max iterations saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving max iterations: \" + errorMsg, 6000);\n }\n }\n\n async saveMaxTokens() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"max-tokens-input\"]',\n ) as HTMLInputElement | null;\n if (!input) {\n return;\n }\n\n const value = parseInt(input.value, 10);\n if (!value || value < 1) {\n showWarning(\"Please enter a valid number (1 or higher)\", 3000);\n\n return;\n }\n\n try {\n await setMaxTokens(this.orchestrator, this.db, value);\n this.updateMaxTokensUI();\n showSuccess(\"Max tokens saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving max tokens: \" + errorMsg, 6000);\n }\n }\n\n async saveMeshLlmSettings() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const hostInput = root.querySelector(\n '[data-setting=\"mesh-llm-host-input\"]',\n ) as HTMLInputElement | null;\n if (!hostInput) {\n return;\n }\n\n const host = hostInput.value.trim();\n\n try {\n if (this.orchestrator) {\n await setMeshLlmSettings(this.orchestrator, this.db, { host });\n showSuccess(\"Mesh LLM settings saved\", 3000);\n if (this.orchestrator.provider === \"mesh-llm\") {\n this.updateModelSelector();\n }\n }\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving Mesh LLM settings: \" + errorMsg, 6000);\n }\n }\n\n /**\n * Save model selection.\n */\n async saveModel() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const modelSelect = root.querySelector(\n '[data-setting=\"model-select\"]',\n ) as HTMLSelectElement | null;\n const customModelInput = root.querySelector(\n '[data-setting=\"custom-model-input\"]',\n ) as HTMLInputElement | null;\n\n if (!modelSelect || !customModelInput) {\n return;\n }\n\n let finalModel = modelSelect.value;\n if (finalModel === \"__custom__\") {\n finalModel = customModelInput.value.trim();\n }\n\n const isLlamafileCli =\n this.orchestrator.provider === \"llamafile\" &&\n getLlamafileSettings(this.orchestrator).mode === \"cli\";\n\n if (isLlamafileCli && !finalModel) {\n await this.showLlamafileHelpDialog(\n `Select a discovered *.llamafile model or enter a custom model id that matches a file in the ${LLAMAFILE_EXPECTED_DIR} folder.`,\n );\n\n return;\n }\n\n if (this.orchestrator.provider === \"prompt_api\") {\n const promptApiFallbackSelect = root.querySelector(\n '[data-setting=\"prompt-api-fallback-select\"]',\n ) as HTMLSelectElement | null;\n if (promptApiFallbackSelect) {\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.PROMPT_API_FALLBACK_MODEL,\n promptApiFallbackSelect.value,\n );\n } catch (err) {\n console.warn(\"Error saving prompt api fallback model\", err);\n }\n }\n\n const promptApiDeviceSelect = root.querySelector(\n '[data-setting=\"prompt-api-device-select\"]',\n ) as HTMLSelectElement | null;\n if (promptApiDeviceSelect) {\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.PROMPT_API_BACKEND,\n promptApiDeviceSelect.value,\n );\n } catch (err) {\n console.warn(\"Error saving prompt api backend\", err);\n }\n }\n\n const promptApiDtypeSelect = root.querySelector(\n '[data-setting=\"prompt-api-dtype-select\"]',\n ) as HTMLSelectElement | null;\n if (promptApiDtypeSelect) {\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.PROMPT_API_DTYPE_STRATEGY,\n promptApiDtypeSelect.value,\n );\n } catch (err) {\n console.warn(\"Error saving prompt api dtype strategy\", err);\n }\n }\n }\n\n try {\n await setModel(this.orchestrator, this.db, finalModel);\n this.updateMaxTokensUI();\n const isLlamafileProvider = this.orchestrator.provider === \"llamafile\";\n if (isLlamafileProvider) {\n const restarted = await orchestratorStore.restartCurrentRequest();\n showSuccess(\n restarted ? \"Model saved, request restarted\" : \"Model saved\",\n 3000,\n );\n\n return;\n }\n\n showSuccess(\"Model saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving model: \" + errorMsg, 6000);\n }\n }\n\n async saveRateLimitSettings() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const callsInput = root.querySelector(\n '[data-setting=\"rate-limit-calls-per-minute-input\"]',\n ) as HTMLInputElement | null;\n const autoToggle = root.querySelector(\n '[data-setting=\"rate-limit-auto-adapt-toggle\"]',\n ) as HTMLInputElement | null;\n\n if (!callsInput || !autoToggle) {\n return;\n }\n\n const callsPerMinute = parseInt(callsInput.value, 10);\n if (!Number.isFinite(callsPerMinute) || callsPerMinute < 0) {\n showWarning(\n \"Please enter a valid non-negative calls-per-minute value\",\n 3000,\n );\n\n return;\n }\n\n try {\n await setRateLimitCallsPerMinute(\n this.orchestrator,\n this.db,\n callsPerMinute,\n );\n await setRateLimitAutoAdapt(\n this.orchestrator,\n this.db,\n autoToggle.checked,\n );\n showSuccess(\"Rate limit settings saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving rate limit settings: \" + errorMsg, 6000);\n }\n }\n\n async saveReasoningEffort() {\n if (!this.orchestrator || !this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const select = root.querySelector(\n '[data-setting=\"reasoning-effort-select\"]',\n ) as HTMLSelectElement | null;\n if (!select) {\n return;\n }\n\n try {\n await setReasoningEffort(\n this.orchestrator,\n this.db,\n select.value || \"none\",\n );\n showSuccess(\"Reasoning effort saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving reasoning effort: \" + errorMsg, 6000);\n }\n }\n\n async saveSubagentMaxParallel() {\n if (!this.db) {\n showError(\"Database not initialized\", 3000);\n\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const input = root.querySelector(\n '[data-setting=\"subagent-max-parallel-input\"]',\n ) as HTMLInputElement | null;\n if (!input) {\n return;\n }\n\n const value = parseInt(input.value, 10);\n if (!value || value < 1) {\n showWarning(\"Please enter a valid number (1 or higher)\", 3000);\n\n return;\n }\n\n try {\n await setConfig(\n this.db,\n CONFIG_KEYS.SUBAGENT_MAX_PARALLEL,\n String(value),\n );\n showSuccess(\"Subagent limit saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving subagent limit: \" + errorMsg, 6000);\n }\n }\n\n async saveSubagentWorkspaceMode() {\n if (!this.db) {\n showError(\"Database not initialized\", 3000);\n\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const select = root.querySelector(\n '[data-setting=\"subagent-workspace-mode-select\"]',\n ) as HTMLSelectElement | null;\n if (!select) {\n return;\n }\n\n const value = select.value;\n if (value !== \"automatic\" && value !== \"parent\" && value !== \"isolated\") {\n showWarning(\"Please select a valid subagent workspace mode\", 3000);\n\n return;\n }\n\n try {\n await setConfig(this.db, CONFIG_KEYS.SUBAGENT_WORKSPACE_MODE, value);\n showSuccess(\"Subagent workspace mode saved\", 3000);\n } catch (err) {\n const errorMsg = err instanceof Error ? err.message : String(err);\n showError(\"Error saving subagent workspace mode: \" + errorMsg, 6000);\n }\n }\n\n async saveTransformersJsSettings() {\n if (!this.db) {\n return;\n }\n\n const root = this.shadowRoot;\n if (!root) {\n return;\n }\n\n const backendSelect = root.querySelector(\n '[data-setting=\"transformers-js-backend\"], [data-setting=\"transformers-js-device-select\"]',\n ) as HTMLSelectElement | null;\n const backend = backendSelect?.value || \"auto\";\n const dtypeStrategySelect = root.querySelector(\n '[data-setting=\"transformers-js-dtype-strategy\"], [data-setting=\"transformers-js-dtype-select\"]',\n ) as HTMLSelectElement | null;\n const dtypeStrategy = dtypeStrategySelect?.value || \"auto\";\n\n const { setConfig } = await import(\"../../../db/setConfig.js\");\n const { CONFIG_KEYS } = await import(\"../../../config/config.js\");\n\n await setConfig(this.db, CONFIG_KEYS.TRANSFORMERS_JS_BACKEND, backend);\n await setConfig(\n this.db,\n CONFIG_KEYS.TRANSFORMERS_JS_DTYPE_STRATEGY,\n dtypeStrategy,\n );\n\n showSuccess(\"Transformers.js settings saved.\");\n }\n\n async showLlamafileHelpDialog(reason?: string): Promise<void> {\n const key = `${reason || \"\"}|${this.orchestrator?.model || \"\"}`;\n if (this.lastLlamafileHelpKey === key) {\n return;\n }\n\n this.lastLlamafileHelpKey = key;\n await this.requestAppDialog(buildLlamafileHelpDialogOptions(reason));\n }\n}\n\nif (!customElements.get(elementName)) {\n customElements.define(elementName, ShadowClawLlm);\n}\n"],"mappings":"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"}
@@ -1 +0,0 @@
1
- import{n as e}from"./rolldown-runtime-DBVvNlSN.js";import{o as t}from"./app-routes-CanH2f3S.js";const n=[{id:`claude-fable-5`,provider:`anthropic`,contextWindow:1e6,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsThinking:!0,supportsPromptCaching:!0},{id:`claude-fable-5.1`,provider:`anthropic`,contextWindow:1e6,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsThinking:!0,supportsPromptCaching:!0},{id:`claude-fable`,provider:`anthropic`,contextWindow:1e6,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsThinking:!0,supportsPromptCaching:!0},{id:`claude-sonnet-5`,provider:`anthropic`,contextWindow:1e6,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsThinking:!0,supportsPromptCaching:!0},{id:`claude-opus-5`,provider:`anthropic`,contextWindow:1e6,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsThinking:!0,supportsPromptCaching:!0},{id:`claude-opus-4.8`,provider:`anthropic`,contextWindow:1e6,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsThinking:!0,supportsPromptCaching:!0},{id:`claude-haiku-5`,provider:`anthropic`,contextWindow:1e6,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsPromptCaching:!0},{id:`claude-mythos-5`,provider:`anthropic`,contextWindow:1e6,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsThinking:!0,supportsPromptCaching:!0},{id:`claude-mythos`,provider:`anthropic`,contextWindow:1e6,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsThinking:!0,supportsPromptCaching:!0},{id:`gpt-6-astra`,provider:`openai`,contextWindow:105e4,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsAudio:!0,supportsVideo:!0,supportsThinking:!1,supportsPromptCaching:!1},{id:`gpt-6-sol`,provider:`openai`,contextWindow:105e4,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsThinking:!1,supportsPromptCaching:!1},{id:`gpt-6-luna`,provider:`openai`,contextWindow:1e6,maxOutput:64e3,supportsImages:!0,supportsDocuments:!0,supportsThinking:!1,supportsPromptCaching:!1},{id:`gpt-6`,provider:`openai`,contextWindow:105e4,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsThinking:!1,supportsPromptCaching:!1},{id:`astra`,provider:`openai`,contextWindow:105e4,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsAudio:!0,supportsVideo:!0,supportsThinking:!1,supportsPromptCaching:!1},{id:`gpt-5`,provider:`openai`,contextWindow:4e5,maxOutput:128e3,supportsImages:!0,supportsDocuments:!0,supportsThinking:!1,supportsPromptCaching:!1},{id:`gemini-3.5-pro`,provider:`google`,contextWindow:2097152,maxOutput:65536,supportsImages:!0,supportsDocuments:!0,supportsAudio:!0,supportsVideo:!0,supportsThinking:!1,supportsPromptCaching:!1},{id:`gemini-3.5-flash`,provider:`google`,contextWindow:1048576,maxOutput:65536,supportsImages:!0,supportsDocuments:!0,supportsAudio:!0,supportsVideo:!0,supportsThinking:!1,supportsPromptCaching:!1},{id:`gemini-3.8-flash`,provider:`google`,contextWindow:1048576,maxOutput:65536,supportsImages:!0,supportsDocuments:!0,supportsAudio:!0,supportsVideo:!0,supportsThinking:!1,supportsPromptCaching:!1},{id:`gemini-2.5-pro`,provider:`google`,contextWindow:1048576,maxOutput:65536,supportsImages:!0,supportsDocuments:!0,supportsAudio:!0,supportsVideo:!0,supportsThinking:!1,supportsPromptCaching:!1},{id:`gemini-2.5-flash`,provider:`google`,contextWindow:1048576,maxOutput:65536,supportsImages:!0,supportsDocuments:!0,supportsAudio:!0,supportsVideo:!0,supportsThinking:!1,supportsPromptCaching:!1}];let r;function i(e){r=e}function a(e){let t=e||r;if(t)for(let e of n)t.registerModelInfo(e.id,{contextWindow:e.contextWindow,maxOutput:e.maxOutput,supportsImageInput:e.supportsImages,supportsDocumentInput:e.supportsDocuments,...e.supportsAudio!==void 0&&{supportsAudioInput:e.supportsAudio},...e.supportsVideo!==void 0&&{supportsVideoInput:e.supportsVideo},...e.supportsPromptCaching!==void 0&&{supportsPromptCaching:e.supportsPromptCaching}})}const o=new class{loading=!1;models=/* @__PURE__ */ new Map;getModelInfo(e){if(!e||typeof e!=`string`)return null;let t=e.toLowerCase().trim(),n=this.models.get(t);if(n)return n;if(t.includes(`/`)){let e=t.split(`/`).pop();if(e&&this.models.has(e))return this.models.get(e)}else for(let[e,n]of this.models.entries())if(e.endsWith(`/${t}`))return n;if(t.includes(`:`)){let e=t.split(`:`)[0],n=this.getModelInfo(e);if(n)return n}return null}registerModelInfo(e,t){this.models.set(e.toLowerCase(),t)}clear(){this.models.clear()}seedStaticCatalog(){a(this)}async fetchModelInfo(e,t,n){if(e.modelsUrl){this.loading=!0;try{let r=new Headers;if(r.set(`Content-Type`,`application/json`),e.headers)for(let[t,n]of Object.entries(e.headers))r.set(t,n);if(n)for(let[e,t]of Object.entries(n))r.set(e,t);if(t&&e.apiKeyHeader){let n=e.apiKeyHeaderFormat;r.set(e.apiKeyHeader,n?n.replace(`{key}`,t):t)}let i=await fetch(e.modelsUrl,{headers:r});if(!i.ok)throw Error(`HTTP ${i.status} ${i.statusText}`);let a=await i.json(),o=Array.isArray(a.data)?a.data:Array.isArray(a.models)?a.models:[];for(let e of o){if(!e.id)continue;let t=e.context_length??e.context_window??0,n=e.max_completion_tokens||e.per_request_limits?.completion_tokens||e.top_provider?.max_completion_tokens||null,r=typeof e.supports_tools==`boolean`?e.supports_tools:typeof e.supportsTools==`boolean`?e.supportsTools:void 0,i=this.extractModalities(e,`input`),a=this.extractModalities(e,`output`),o=this.modalitiesInclude(i,`image`,`vision`),s=this.modalitiesInclude(i,`audio`,`voice`,`hearing`),c=this.modalitiesInclude(i,`video`),l=this.modalitiesInclude(i,`document`,`pdf`,`file`)||(typeof e.supports_document_input==`boolean`?e.supports_document_input:typeof e.supportsDocumentInput==`boolean`?e.supportsDocumentInput:void 0),u=e.id===`openrouter/free`||this.supportedParametersInclude(e,`image`,`vision`,`audio`,`tool`,`structured`),d=this.extractReasoning(e),f=typeof e.supports_prompt_caching==`boolean`?e.supports_prompt_caching:typeof e.supportsPromptCaching==`boolean`?e.supportsPromptCaching:this.supportedParametersInclude(e,`cache_control`,`prompt_caching`)?!0:void 0;!t&&Array.isArray(e.providers)&&e.providers.length>0&&(t=e.providers[0]?.context_length||0),this.registerModelInfo(e.id,{contextWindow:t,maxOutput:n,...r!==void 0&&{supportsTools:r},...i.length>0&&{inputModalities:i},...a.length>0&&{outputModalities:a},...o!==void 0&&{supportsImageInput:o},...s!==void 0&&{supportsAudioInput:s},...c!==void 0&&{supportsVideoInput:c},...l!==void 0&&{supportsDocumentInput:l},...d&&{reasoning:d},...u&&{routesByRequestFeatures:u},...f!==void 0&&{supportsPromptCaching:f}})}o.length>0&&console.log(`[ModelRegistry] Registered ${o.length} models for provider "${e.id}"`)}catch(t){console.error(`[ModelRegistry] Error fetching models for ${e.id}:`,t)}finally{this.loading=!1}}}extractModalities(e,t){let n=t===`input`?e.input_modalities||e.inputModalities:e.output_modalities||e.outputModalities,r=e.architecture||{},i=t===`input`?r.input_modalities||r.inputModalities:r.output_modalities||r.outputModalities,a=typeof r.modality==`string`?r.modality:``,o=this.parseArchitectureModality(a,t),s=[...this.normalizeStringArray(n),...this.normalizeStringArray(i),...o];return Array.from(new Set(s))}extractReasoning(e){let t=e?.reasoning;if(!t||typeof t!=`object`)return;let n=this.normalizeStringArray(t.supported_efforts),r=typeof t.default_effort==`string`?t.default_effort.toLowerCase():void 0,i=typeof t.default_enabled==`boolean`?t.default_enabled:void 0,a=typeof t.supports_max_tokens==`boolean`?t.supports_max_tokens:void 0,o=typeof t.mandatory==`boolean`?t.mandatory:void 0;if(n.length!==0||r!==void 0||i!==void 0||a!==void 0||o!==void 0)return{...n.length>0&&{supportedEfforts:n},...r!==void 0&&{defaultEffort:r},...i!==void 0&&{defaultEnabled:i},...a!==void 0&&{supportsMaxTokens:a},...o!==void 0&&{mandatory:o}}}modalitiesInclude(e,...t){if(e.length!==0)return t.some(t=>e.some(e=>e.includes(t)))}normalizeStringArray(e){return Array.isArray(e)?e.filter(e=>typeof e==`string`).map(e=>e.toLowerCase()):[]}parseArchitectureModality(e,t){if(!e)return[];let[n=``,r=``]=e.toLowerCase().split(`->`).map(e=>e.trim());return(t===`input`?n:r).split(/[+,/\s]+/).map(e=>e.trim()).filter(Boolean)}supportedParametersInclude(e,...t){let n=this.normalizeStringArray(e.supported_parameters||e.supportedParameters);return t.some(e=>n.some(t=>t.includes(e)))}};i(o);var s=/* @__PURE__ */ e({AGENTFILE_PROXY_MODELS_URL:()=>I,AGENTFILE_PROXY_TOOLS_URL:()=>AGENTFILE_PROXY_TOOLS_URL,AGENTFILE_PROXY_URL:()=>F,ASSISTANT_NAME:()=>c,BASH_DEFAULT_TIMEOUT_SEC:()=>900,BASH_MAX_TIMEOUT_SEC:()=>g,BEDROCK_PROXY_MODELS_URL:()=>A,BEDROCK_PROXY_URL:()=>k,CONFIG_KEYS:()=>J,CONTEXT_WINDOW_SIZE:()=>50,DB_VERSION:()=>2,DEFAULT_CONTROL_PLANE_ENABLED:()=>!1,DEFAULT_CONTROL_PLANE_TRANSPORT:()=>`sse`,DEFAULT_DEV_HOST:()=>Y,DEFAULT_DEV_IP:()=>DEFAULT_DEV_IP,DEFAULT_DEV_PORT:()=>X,DEFAULT_FILES_UPLOAD_APPEND_ULID:()=>!1,DEFAULT_GROUP_ID:()=>C,DEFAULT_MAX_ITERATIONS:()=>50,DEFAULT_MAX_TOKENS:()=>u,DEFAULT_PROMPT_API_BACKEND:()=>DEFAULT_PROMPT_API_BACKEND,DEFAULT_PROMPT_API_DTYPE_STRATEGY:()=>DEFAULT_PROMPT_API_DTYPE_STRATEGY,DEFAULT_PROMPT_API_FALLBACK_MODEL:()=>Q,DEFAULT_PROVIDER:()=>p,DEFAULT_SERVER_GROUP_ID:()=>DEFAULT_SERVER_GROUP_ID,DEFAULT_SUBAGENT_MAX_PARALLEL:()=>5,DEFAULT_SUBAGENT_WORKSPACE_MODE:()=>Z,DEFAULT_TASK_SERVER_ENABLED:()=>!1,DEFAULT_TASK_SERVER_URL:()=>$,DEFAULT_TRANSFORMERS_JS_BACKEND:()=>DEFAULT_TRANSFORMERS_JS_BACKEND,DEFAULT_TRANSFORMERS_JS_DTYPE_STRATEGY:()=>DEFAULT_TRANSFORMERS_JS_DTYPE_STRATEGY,DEFAULT_TRANSFORMERS_JS_MODEL:()=>DEFAULT_TRANSFORMERS_JS_MODEL,DEFAULT_VM_BOOT_HOST:()=>v,DEFAULT_VM_NETWORK_RELAY_URL:()=>_,FETCH_MAX_RESPONSE:()=>h,GENERAL_ACCOUNT_PROVIDER_CAPABILITIES:()=>z,IMESSAGE_POLL_TIMEOUT:()=>25,IMESSAGE_REQUEST_TIMEOUT_MS:()=>D,LEGACY_DB_NAME:()=>y,LEGACY_OPFS_ROOT:()=>x,LLAMAFILE_PROXY_MODELS_URL:()=>P,LLAMAFILE_PROXY_TOOLS_URL:()=>LLAMAFILE_PROXY_TOOLS_URL,LLAMAFILE_PROXY_URL:()=>N,MODEL_OUTPUT_LIMITS:()=>d,OAUTH_PROVIDER_DEFINITIONS:()=>B,OLLAMA_PROXY_MODELS_URL:()=>R,OLLAMA_PROXY_URL:()=>L,OPFS_ROOT:()=>S,PEERJS_DEFAULT_HOST:()=>O,PEERJS_DEFAULT_PATH:()=>`/`,PEERJS_DEFAULT_PORT:()=>443,PEERJS_DEFAULT_SECURE:()=>!0,PROCESS_LOOP_INTERVAL:()=>100,PROVIDERS:()=>V,SCHEDULER_INTERVAL:()=>m,TELEGRAM_API_BASE:()=>w,TELEGRAM_MAX_LENGTH:()=>E,TELEGRAM_POLL_TIMEOUT:()=>30,TELEGRAM_PROXY_BASE:()=>T,TRANSFORMERS_JS_PROXY_MODELS_URL:()=>M,TRANSFORMERS_JS_PROXY_URL:()=>j,buildTriggerPattern:()=>l,getAvailableProviders:()=>W,getDbName:()=>b,getDefaultProvider:()=>U,getGeneralAccountProviderCapabilities:()=>K,getModelMaxTokens:()=>f,getProvider:()=>H,getProviderApiKeyConfigKey:()=>G,getProviderTokenAuthScheme:()=>q});const c=`ShadowClaw`;function l(e){let t=e.replace(/[.*+?^${}()|[\]\\]/g,`\\$&`);return RegExp(`(^|\\s)@${t}\\b`,`i`)}l(c);const u=8192,d=[{pattern:`claude-fable-5`,maxTokens:128e3},{pattern:`claude-fable`,maxTokens:128e3},{pattern:`claude-mythos-5`,maxTokens:128e3},{pattern:`claude-mythos`,maxTokens:128e3},{pattern:`claude-sonnet-5`,maxTokens:128e3},{pattern:`claude-opus-5`,maxTokens:128e3},{pattern:`claude-opus-4-8`,maxTokens:128e3},{pattern:`claude-opus-4`,maxTokens:128e3},{pattern:`claude-sonnet-4`,maxTokens:64e3},{pattern:`claude-haiku-5`,maxTokens:128e3},{pattern:`claude-haiku-4`,maxTokens:64e3},{pattern:`claude-3-5`,maxTokens:8192},{pattern:`claude-3`,maxTokens:4096},{pattern:`gpt-6-luna`,maxTokens:64e3},{pattern:`gpt-6-sol`,maxTokens:128e3},{pattern:`gpt-6-astra`,maxTokens:128e3},{pattern:`astra`,maxTokens:128e3},{pattern:`gpt-6`,maxTokens:128e3},{pattern:`gpt-5`,maxTokens:128e3},{pattern:`gemini-3`,maxTokens:65536},{pattern:`gemini-2.5`,maxTokens:65536},{pattern:`gemini-2.0`,maxTokens:65536},{pattern:`gpt-4o`,maxTokens:16384},{pattern:`gpt-4.1`,maxTokens:32768},{pattern:`gpt-4-turbo`,maxTokens:4096},{pattern:`gpt-4`,maxTokens:8192},{pattern:`gpt-3.5`,maxTokens:4096},{pattern:`qwen-2.5`,maxTokens:32768},{pattern:`Qwen3.5`,maxTokens:32768},{pattern:`qwen3.5`,maxTokens:32768},{pattern:`Qwen3`,maxTokens:32768},{pattern:`qwen3`,maxTokens:32768},{pattern:`gemma-4`,maxTokens:16384},{pattern:`gemini-nano`,maxTokens:4096},{pattern:`phi-mini`,maxTokens:9216},{pattern:`aion`,maxTokens:9216},{pattern:`gemma-3-1b-it-ONNX-GQA`,maxTokens:32768},{pattern:`gemma-3-1b-it-ONNX`,maxTokens:32768},{pattern:`gemma-3`,maxTokens:32768},{pattern:`Qwen3-0.6B-ONNX`,maxTokens:32768},{pattern:`Qwen3.5`,maxTokens:32768},{pattern:`Llama-3.2`,maxTokens:32768},{pattern:`SmolLM`,maxTokens:8192},{pattern:`DeepSeek-R1`,maxTokens:32768},{pattern:`Phi-4`,maxTokens:16384},{pattern:`Phi-3.5`,maxTokens:16384},{pattern:`LFM2`,maxTokens:16384},{pattern:`gpt-oss`,maxTokens:32768},{pattern:`browser-built-in`,maxTokens:4096},{pattern:`mesh`,maxTokens:32768},{pattern:`openrouter/free`,maxTokens:32768},{pattern:`qwen3:8b`,maxTokens:4096},{pattern:`llama3:8b`,maxTokens:8192}];function f(e){if(!e)return u;let t=o.getModelInfo(e);if(t){if(typeof t.maxOutput==`number`){let e=t.contextWindow?Math.max(8192,Math.floor(t.contextWindow/2)):32768;return Math.min(t.maxOutput,e)}if(t.contextWindow){let e;return e=t.contextWindow>=2e5?131072:t.contextWindow>=1e5?65536:32768,Math.min(e,Math.floor(t.contextWindow/2))}}for(let{pattern:t,maxTokens:n}of d)if(e.includes(t))return n;return u}const p=`prompt_api`,m=6e4,h=102400,g=1800,_=`wss://relay.widgetry.org/`,v=`http://localhost:8888`,y=`shadowclaw`;function b(){let e=t();return e?`shadowclaw-${e}`:y}b();const x=`shadowclaw`,S=`shadowclaw`,C=`br:main`,w=`https://api.telegram.org/bot`,T=`/telegram/bot`,E=4096,D=15e3,O=`0.peerjs.com`,k=`http://localhost:8888/bedrock-proxy/invoke`,A=`http://localhost:8888/bedrock-proxy/models`,j=`http://localhost:8888/transformers-js-proxy/chat/completions`,M=`http://localhost:8888/transformers-js-proxy/models`,N=`http://localhost:8888/llamafile-proxy/chat/completions`,P=`http://localhost:8888/llamafile-proxy/models`,F=`http://localhost:8888/agentfile-proxy/chat/completions`,I=`http://localhost:8888/agentfile-proxy/models`,L=`http://localhost:8888/ollama-proxy/chat/completions`,R=`http://localhost:8888/ollama-proxy/models`,z={github:{providerId:`github`,name:`GitHub`,aliases:[`github`,`api.github.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`token `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://github.com/login/oauth/authorize`,tokenUrl:`https://github.com/login/oauth/access_token`,defaultScopes:[`repo`,`read:user`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},gitlab:{providerId:`gitlab`,name:`GitLab`,aliases:[`gitlab`,`gitlab.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`PRIVATE-TOKEN`,headerPrefix:``},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},tokenAuthByServiceType:{git_remote:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}}},oauth:{authorizeUrl:`https://gitlab.com/oauth/authorize`,tokenUrl:`https://gitlab.com/oauth/token`,defaultScopes:[`read_api`,`read_user`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},figma:{providerId:`figma`,name:`Figma`,aliases:[`figma`,`api.figma.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`X-Figma-Token`,headerPrefix:``},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://www.figma.com/oauth`,tokenUrl:`https://api.figma.com/v1/oauth/token`,refreshUrl:`https://api.figma.com/v1/oauth/refresh`,defaultScopes:[],usePkce:!0,clientAuthMethod:`basic_header`,scopeSeparator:`space`}},notion:{providerId:`notion`,name:`Notion`,aliases:[`notion`,`api.notion.com`,`notion.so`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://api.notion.com/v1/oauth/authorize`,tokenUrl:`https://api.notion.com/v1/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`basic_header`,scopeSeparator:`space`}},microsoft_graph:{providerId:`microsoft_graph`,name:`Microsoft Graph`,aliases:[`microsoft`,`graph.microsoft.com`,`microsoft_graph`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/authorize`,tokenUrl:`https://login.microsoftonline.com/common/oauth2/v2.0/token`,defaultScopes:[`openid`,`profile`,`offline_access`,`User.Read`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},yahoo_mail:{providerId:`yahoo_mail`,name:`Yahoo Mail`,aliases:[`yahoo`,`yahoo_mail`,`mail.yahoo.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://api.login.yahoo.com/oauth2/request_auth`,tokenUrl:`https://api.login.yahoo.com/oauth2/get_token`,defaultScopes:[`mail-r`,`mail-w`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},google:{providerId:`google`,name:`Google`,aliases:[`google`,`googleapis.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://accounts.google.com/o/oauth2/v2/auth`,tokenUrl:`https://oauth2.googleapis.com/token`,defaultScopes:[`openid`,`profile`,`email`],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},atlassian:{providerId:`atlassian`,name:`Atlassian`,aliases:[`atlassian`,`api.atlassian.com`],modes:[`oauth`,`token`,`basic`],defaultMode:`basic`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`,`basic_userpass`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `},basic:{headerName:`Authorization`,headerPrefix:`Basic `}},oauth:{authorizeUrl:`https://auth.atlassian.com/authorize`,tokenUrl:`https://auth.atlassian.com/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},slack:{providerId:`slack`,name:`Slack`,aliases:[`slack`,`slack.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://slack.com/oauth/v2/authorize`,tokenUrl:`https://slack.com/api/oauth.v2.access`,defaultScopes:[],usePkce:!1,clientAuthMethod:`request_body`,scopeSeparator:`comma`}},linear:{providerId:`linear`,name:`Linear`,aliases:[`linear`,`api.linear.app`,`linear.app`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`],authTypes:[`token`,`oauth`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://linear.app/oauth/authorize`,tokenUrl:`https://api.linear.app/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}},azure_devops:{providerId:`azure_devops`,name:`Azure DevOps`,aliases:[`azure_devops`,`dev.azure.com`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`http_api`,`git_remote`],authTypes:[`token`,`oauth`,`basic_userpass`,`ssh_key`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},tokenAuthByServiceType:{git_remote:{token:{headerName:`Authorization`,headerPrefix:`Basic `},oauth:{headerName:`Authorization`,headerPrefix:`Basic `}}},oauth:{authorizeUrl:`https://app.vssps.visualstudio.com/oauth2/authorize`,tokenUrl:`https://app.vssps.visualstudio.com/oauth2/token`,defaultScopes:[`vso.code`,`vso.profile`,`offline_access`],usePkce:!1,clientAuthMethod:`request_body`,scopeSeparator:`space`}},custom_mcp:{providerId:`custom_mcp`,name:`Custom MCP`,aliases:[`custom_mcp`],modes:[`oauth`,`token`],defaultMode:`oauth`,serviceTypes:[`mcp_remote`,`webmcp_local`],authTypes:[`none`,`token`,`oauth`,`custom_header`,`ssh_key`],tokenAuth:{token:{headerName:`Authorization`,headerPrefix:`Bearer `},oauth:{headerName:`Authorization`,headerPrefix:`Bearer `}},oauth:{authorizeUrl:`https://example.com/oauth/authorize`,tokenUrl:`https://example.com/oauth/token`,defaultScopes:[],usePkce:!0,clientAuthMethod:`request_body`,scopeSeparator:`space`}}},B=Object.fromEntries(Object.values(z).filter(e=>!!e.oauth).map(e=>{let t=e.oauth;return[e.providerId,{id:e.providerId,name:e.name,authorizeUrl:t.authorizeUrl,tokenUrl:t.tokenUrl,redirectUri:t.redirectUri,defaultScopes:t.defaultScopes,usePkce:t.usePkce,clientAuthMethod:t.clientAuthMethod,scopeSeparator:t.scopeSeparator}]}));Object.fromEntries(Object.values(z).map(e=>[e.providerId,{providerId:e.providerId,modes:e.modes,defaultMode:e.defaultMode}]));const V={openrouter:{id:`openrouter`,name:`OpenRouter`,baseUrl:`https://openrouter.ai/api/v1/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,apiKeyHeaderFormat:`Bearer {key}`,headers:{"HTTP-Referer":`https://xt-ml.github.io/shadow-claw/`,"X-OpenRouter-Title":`ShadowClaw`},defaultModel:`openrouter/free`,modelsUrl:`https://openrouter.ai/api/v1/models`,requiresApiKey:!0,supportsStreaming:!0,reasoningParam:`reasoning`},huggingface:{id:`huggingface`,name:`HuggingFace`,baseUrl:`https://router.huggingface.co/v1/chat/completions`,format:`openai`,apiKeyHeader:`Authorization`,apiKeyHeaderFormat:`Bearer {key}`,headers:{},defaultModel:`meta-llama/Llama-3.1-8B-Instruct`,modelsUrl:`https://router.huggingface.co/v1/models`,requiresApiKey:!0,supportsStreaming:!0},bedrock_proxy:{id:`bedrock_proxy`,name:`AWS Bedrock (Local Proxy)`,baseUrl:k,format:`anthropic`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`anthropic.claude-sonnet-5-v1:0`,modelsUrl:A,requiresApiKey:!1,supportsStreaming:!0,reasoningParam:`thinking`},gemini_proxy:{id:`gemini_proxy`,name:`Gemini (Local Proxy)`,baseUrl:`http://localhost:8888/gemini-proxy/chat/completions`,format:`openai`,apiKeyHeader:`x-goog-api-key`,headers:{},defaultModel:`gemini-2.0-flash`,modelsUrl:`http://localhost:8888/gemini-proxy/models`,requiresApiKey:!0,supportsStreaming:!0,reasoningParam:`thinkingConfig`},vertex_ai:{id:`vertex_ai`,name:`Vertex AI (Local Proxy)`,baseUrl:`http://localhost:8888/vertex-ai-proxy/chat/completions`,format:`openai`,apiKeyHeader:`x-vertex-project`,headers:{},defaultModel:`gemini-2.5-flash`,modelsUrl:`http://localhost:8888/vertex-ai-proxy/models`,requiresApiKey:!0,supportsStreaming:!0,reasoningParam:`thinkingConfig`},"mesh-llm":{id:`mesh-llm`,name:`Mesh LLM (Local Proxy)`,baseUrl:`http://localhost:8888/mesh-llm-proxy/chat/completions`,format:`mesh-llm`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`mesh`,modelsUrl:`http://localhost:8888/mesh-llm-proxy/models`,requiresApiKey:!1,supportsStreaming:!0},ollama:{id:`ollama`,name:`Ollama (Local Proxy)`,baseUrl:L,format:`openai`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`qwen3:8b`,modelsUrl:R,requiresApiKey:!1,supportsStreaming:!0},llamafile:{id:`llamafile`,name:`Llamafile (Local Proxy)`,baseUrl:N,format:`openai`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`Qwen3.5-9B-Q5_K_S`,modelsUrl:P,requiresApiKey:!1,supportsStreaming:!0},agentfile:{id:`agentfile`,name:`Agentfile (Local Binary)`,baseUrl:F,format:`openai`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`default.agentfile`,modelsUrl:I,requiresApiKey:!1,supportsStreaming:!0},transformers_js_local:{id:`transformers_js_local`,name:`Transformers.js (Local Proxy)`,baseUrl:j,format:`openai`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`onnx-community/Qwen3-0.6B-ONNX`,modelsUrl:M,models:[`onnx-community/DeepSeek-R1-Distill-Qwen-1.5B-ONNX`,`onnx-community/gemma-3-1b-it-ONNX-GQA`,`onnx-community/gemma-3-1b-it-ONNX`,`onnx-community/gemma-4-E2B-it-ONNX`,`onnx-community/gemma-4-E2B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E4B-it-ONNX`,`onnx-community/gemma-4-E4B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E9B-it-ONNX`,`onnx-community/gemma-4-12B-it-ONNX`,`onnx-community/gemma-4-12B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E27B-it-ONNX`,`onnx-community/gpt-oss-20b-ONNX`,`onnx-community/LFM2-1.2B-ONNX`,`onnx-community/Llama-3.2-1B-Instruct-ONNX`,`onnx-community/Llama-3.2-3B-Instruct-ONNX`,`onnx-community/Phi-3.5-mini-instruct-onnx-web`,`onnx-community/Phi-4-mini-instruct-ONNX`,`onnx-community/Qwen3-0.6B-ONNX`,`onnx-community/Qwen3.5-0.8B-ONNX-OPT`,`onnx-community/Qwen3.5-4B-ONNX-OPT`,`HuggingFaceTB/SmolLM3-3B-ONNX`,`LiquidAI/LFM2.5-1.2B-Thinking-ONNX`,`webgpu/Qwen3-4B-ONNX`],requiresApiKey:!1,supportsStreaming:!0},transformers_js_browser:{id:`transformers_js_browser`,name:`Transformers.js (Browser)`,baseUrl:`local://transformers-js`,format:`transformers_js`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`onnx-community/Qwen3-0.6B-ONNX`,modelsUrl:`https://huggingface.co/api/models?author=onnx-community`,models:[`onnx-community/Qwen3-0.6B-ONNX`,`onnx-community/gemma-3-1b-it-ONNX`,`onnx-community/gemma-3-1b-it-ONNX-GQA`,`onnx-community/gemma-4-E2B-it-ONNX`,`onnx-community/gemma-4-E4B-it-ONNX`,`onnx-community/gemma-4-E9B-it-ONNX`,`onnx-community/gemma-4-E27B-it-ONNX`,`onnx-community/gemma-4-12B-it-ONNX`,`onnx-community/gemma-4-E2B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-E4B-it-qat-mobile-ONNX`,`onnx-community/gemma-4-12B-it-qat-mobile-ONNX`,`onnx-community/Phi-3.5-mini-instruct-onnx-web`,`onnx-community/Phi-4-mini-instruct-ONNX`,`onnx-community/Llama-3.2-1B-Instruct-ONNX`,`onnx-community/Llama-3.2-3B-Instruct-ONNX`,`webgpu/Qwen3-4B-ONNX`,`onnx-community/DeepSeek-R1-Distill-Qwen-1.5B-ONNX`,`onnx-community/gpt-oss-20b-ONNX`,`onnx-community/LFM2-1.2B-ONNX`,`LiquidAI/LFM2.5-1.2B-Thinking-ONNX`,`HuggingFaceTB/SmolLM3-3B-ONNX`,`onnx-community/Qwen3.5-0.8B-ONNX-OPT`,`onnx-community/Qwen3.5-4B-ONNX-OPT`],requiresApiKey:!1,supportsStreaming:!1},litert_lm_browser:{id:`litert_lm_browser`,name:`LiteRT-LM (Browser)`,baseUrl:`local://litert-lm`,format:`transformers_js`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`litert-community/gemma-4-E2B-it-litert-lm`,models:[`litert-community/gemma-4-E2B-it-litert-lm`,`litert-community/gemma-4-E4B-it-litert-lm`],requiresApiKey:!1,supportsStreaming:!1},prompt_api:{id:`prompt_api`,name:`Prompt API (Browser)`,baseUrl:`builtin://language-model`,format:`prompt_api`,apiKeyHeader:`Authorization`,headers:{},defaultModel:`browser-built-in`,models:[`browser-built-in`],requiresApiKey:!1,supportsStreaming:!1}};function H(e){return V[e]||null}function U(){return V[p]}function W(){return Object.keys(V)}function G(e){return`api_key:${e}`}function K(e){return z[e]||null}function q(e,t,n=`http_api`){let r=K(e);return r&&(r.tokenAuthByServiceType?.[n]?.[t]||r.tokenAuth[t])||null}const J={ACTIVE_TOOL_PROFILE:`active_tool_profile`,ACTIVITY_LOG_DISK_LOGGING_ENABLED:`activity_log_disk_logging_enabled`,ALLOWED_CUSTOM_ELEMENTS:`allowed_custom_elements`,ALLOWED_CUSTOM_ELEMENT_HOST_PATTERNS:`allowed_custom_element_host_patterns`,ALLOWED_IFRAME_HOST_PATTERNS:`allowed_iframe_host_patterns`,API_KEY:`api_key`,ASSISTANT_NAME:`assistant_name`,BEDROCK_AUTH_MODE:`bedrock_auth_mode`,BEDROCK_PROFILE_FALLBACK:`bedrock_profile_fallback`,BEDROCK_REGION_FALLBACK:`bedrock_region_fallback`,BUILTIN_AI_SUBAGENT_ROUTING:`builtin_ai_subagent_routing`,BUILTIN_AI_TOOLS_BACKEND:`builtin_ai_tools_backend`,CHANNEL_ENABLED_PREFIX:`channel_enabled:`,CHAT_INPUT_AREA_HEIGHT:`chat_input_area_height`,CHAT_SPLIT_VIEW_ENABLED:`chat_split_view_enabled`,CHAT_SPLIT_VIEW_HEIGHT:`chat_split_view_height`,COMPACTION_ENGINE_PREFERENCE:`compaction_engine_preference`,CONTEXT_COMPRESSION_ENABLED:`context_compression_enabled`,CONTROL_PLANE_CLIENT_ID:`control_plane_client_id`,CONTROL_PLANE_ENABLED:`control_plane_enabled`,CONTROL_PLANE_TRANSPORT:`control_plane_transport`,CONTROL_PLANE_URL:`control_plane_url`,CONVERSATIONS_HEIGHT:`conversations_height`,CUSTOM_TOOLS:`custom_tools`,DB_MIGRATED_FROM_LEGACY:`db_migrated_from_legacy`,DECLARATIVE_TOOLS_ENABLED:`declarative_tools_enabled`,DEFAULT_PINNED_PAGE:`default_pinned_page`,DIRECT_TOOL_COMMAND_POLICY:`direct_tool_command_policy`,ENABLED_TOOLS:`enabled_tools`,FILES_UPLOAD_APPEND_ULID:`files_upload_append_ulid`,GIT_ACCOUNTS:`git_accounts`,GIT_AUTHOR_EMAIL:`git_author_email`,GIT_AUTHOR_NAME:`git_author_name`,GIT_CORS_PROXY:`git_cors_proxy`,GIT_DEFAULT_ACCOUNT:`git_default_account`,GIT_PASSWORD:`git_password`,GIT_PROXY_URL:`git_proxy_url`,GIT_TOKEN:`git_token`,GIT_USERNAME:`git_username`,IMESSAGE_API_KEY:`imessage_api_key`,IMESSAGE_CHAT_IDS:`imessage_chat_ids`,IMESSAGE_SERVER_URL:`imessage_server_url`,INTEGRATION_CONNECTIONS:`integration_connections`,MARKDOWN_FRONTMATTER_CHAT:`markdown_frontmatter_chat`,MARKDOWN_FRONTMATTER_FILE_VIEWER:`markdown_frontmatter_file_viewer`,MARKDOWN_FRONTMATTER_PAGES:`markdown_frontmatter_pages`,MARKDOWN_FRONTMATTER_TASKS:`markdown_frontmatter_tasks`,LAST_ACTIVE_GROUP:`last_active_group`,LAST_ACTIVE_PAGE:`last_active_page`,LAST_SELECTED_PINNED_PAGE:`last_selected_pinned_page`,LLAMAFILE_HOST:`llamafile_host`,LLAMAFILE_MODE:`llamafile_mode`,LLAMAFILE_OFFLINE:`llamafile_offline`,LLAMAFILE_PORT:`llamafile_port`,MAIN_GROUP_INDEX_SUPPRESSED:`main_group_index_suppressed`,MAIN_GROUP_README_SUPPRESSED:`main_group_readme_suppressed`,MAX_ITERATIONS:`max_iterations`,MAX_TOKENS:`max_tokens`,MESH_LLM_HOST:`mesh_llm_host`,MODEL:`model`,OAUTH_PROVIDER_DEFINITIONS:`oauth_provider_definitions`,OPFS_MIGRATED_FROM_LEGACY:`opfs_migrated_from_legacy`,OVERRIDE_PRERENDER_SKELETON:`override_prerender_skeleton`,PAGES_ALLOW_LIST:`pages_allow_list`,PAGES_AUTO_REFRESH_INTERVAL:`pages_auto_refresh_interval`,PAGES_DENY_LIST:`pages_deny_list`,PAGES_LIST:`pages_list`,PASSPHRASE_SALT:`passphrase_salt`,PASSPHRASE_VERIFY:`passphrase_verify`,PROMPT_API_BACKEND:`prompt_api_backend`,PROMPT_API_DTYPE_STRATEGY:`prompt_api_dtype_strategy`,PROMPT_API_FALLBACK_MODEL:`prompt_api_fallback_model`,PROMPT_API_ONBOARDING_SEEN:`prompt_api_onboarding_seen`,PEERJS_MY_ALIAS:`peerjs_my_alias`,PEERJS_MY_PEER_ID:`peerjs_my_peer_id`,PEERJS_PEER_ALIASES:`peerjs_peer_aliases`,PEERJS_SERVER_HOST:`peerjs_server_host`,PEERJS_SERVER_PATH:`peerjs_server_path`,PEERJS_SERVER_PORT:`peerjs_server_port`,PEERJS_SERVER_SECURE:`peerjs_server_secure`,PEERJS_TRUSTED_PEER_IDS:`peerjs_trusted_peer_ids`,PROVIDER:`provider`,PROXY_URL:`proxy_url`,PUSH_PROXY_URL:`push_proxy_url`,RATE_LIMIT_AUTO_ADAPT:`rate_limit_auto_adapt`,RATE_LIMIT_CALLS_PER_MINUTE:`rate_limit_calls_per_minute`,REASONING_EFFORT:`reasoning_effort`,REMOTE_MCP_CONNECTIONS:`remote_mcp_connections`,SERVICE_ACCOUNTS:`service_accounts`,SERVICE_DEFAULT_ACCOUNT:`service_default_account`,SIDEBAR_CHAT_HIDDEN:`sidebar_chat_hidden`,SIDEBAR_DEFAULT_PAGE:`sidebar_default_page`,SIDEBAR_FILES_HIDDEN:`sidebar_files_hidden`,SIDEBAR_PAGES_HIDDEN:`sidebar_pages_hidden`,SIDEBAR_TASKS_HIDDEN:`sidebar_tasks_hidden`,SIDEBAR_WIDTH:`sidebar_width`,SITE_CONFIG_SEEDED:`site_config_seeded`,STATIC_MAIN_SITE_SEEDED:`static_main_site_seeded`,STORAGE_HANDLE:`storage_handle`,SUBSCRIBER_ID:`subscriber_id`,STREAMING_ENABLED:`streaming_enabled`,SUBAGENT_MAX_PARALLEL:`subagent_max_parallel`,SUBAGENT_WORKSPACE_MODE:`subagent_workspace_mode`,SUPPRESSED_PAGES_LIST:`suppressed_pages_list`,SYSTEM_PROMPT_OVERRIDE:`system_prompt_override`,TASK_SERVER_ENABLED:`task_server_enabled`,TASK_SERVER_URL:`task_server_url`,TASK_SYNC_OUTBOX:`task_sync_outbox`,TELEGRAM_BOT_TOKEN:`telegram_bot_token`,TELEGRAM_CHAT_IDS:`telegram_chat_ids`,TELEGRAM_USE_PROXY:`telegram_use_proxy`,TOOL_PROFILES:`tool_profiles`,TRANSFORMERS_JS_BACKEND:`transformers_js_backend`,TRANSFORMERS_JS_DTYPE_STRATEGY:`transformers_js_dtype_strategy`,TRIGGER_PATTERN:`trigger_pattern`,USE_PROXY:`use_proxy`,VAPID_SUBJECT:`vapid_subject`,VM_BASH_FULL_INTERNET_ACCESS:`vm_bash_full_internet_access`,VM_BASH_TIMEOUT_SEC:`vm_bash_timeout_sec`,VM_BOOT_HOST:`vm_boot_host`,VM_BOOT_MODE:`vm_boot_mode`,VM_NETWORK_RELAY_URL:`vm_network_relay_url`,WEBMCP_MODE:`webmcp_mode`,WEBMCP_TOOLS_ENABLED:`webmcp_tools_enabled`,WEB_SEARCH_PROXY_URL:`web_search_proxy_url`,WEB_SEARCH_URL:`web_search_url`,WEB_SEARCH_USE_PROXY:`web_search_use_proxy`,SEARCH_FILES_MAX_FILE_BYTES:`search_files_max_file_bytes`,SEARCH_FILES_MAX_FILES_VISITED:`search_files_max_files_visited`,SEARCH_FILES_SKIP_DIRS:`search_files_skip_dirs`},Y=`localhost`,X=8888,Z=`automatic`,Q=`onnx-community/Qwen3-0.6B-ONNX`,$=`http://localhost:8888/schedule`;export{W as A,V as C,T as D,E,H as F,G as I,q as L,U as M,K as N,l as O,f as P,o as R,O as S,w as T,y as _,X as a,B as b,Q as c,$ as d,v as f,D as g,z as h,Y as i,b as j,s as k,p as l,h as m,g as n,C as o,_ as p,J as r,u as s,c as t,Z as u,x as v,m as w,S as x,N as y};
@@ -1 +0,0 @@
1
- function e(e){let t=e.toLowerCase(),n=/(?:^|[-_\/.])(\d+(?:\.\d+)?)b(?:[-_\/.]|$)/i.exec(t);if(n){let e=Number(n[1]);if(Number.isFinite(e)&&e>0)return e}let r=/(?:^|[-_\/.])e(\d+(?:\.\d+)?)b(?:[-_\/.]|$)/i.exec(t);if(!r)return null;let i=Number(r[1]);return!Number.isFinite(i)||i<=0?null:i}function t(e){let t=e.toLowerCase();return!!(/(^|[-_./])(instruct|chat|assistant|tool|it)([-_./]|$)/i.test(t)||/(qwen\d*(?:\.\d+)?|deepseek-r1-distill)/i.test(t))}function n(e){return/(^|[-_./])(q\d+|int8|uint8|4bit|8bit|bnb4|opt)([-_./]|$)/i.test(e)}function r(r,i){let a=r.id.toLowerCase(),o=e(r.id),s=0;return r.supportsTools||(s+=60),t(r.id)&&(s-=40),a.includes(`onnx`)?s-=30:s+=90,n(a)&&(s-=20),o===null?s+=10:o<=.6?s-=120:o<=.8?s-=100:o<=1.2?s-=80:o<=1.8?s-=40:s+=o<=3?20:80,/thinking|reasoning/i.test(a)&&(s+=25),i===`transformers_js_browser`&&(o!==null&&o>1.5&&(s+=40),a.includes(`onnx`)||(s+=80)),s}function i(e,t,n){let i=r(e,n),a=r(t,n);return i===a?e.contextLength===t.contextLength?e.id.localeCompare(t.id):t.contextLength-e.contextLength:i-a}export{t as n,i as t};
@@ -1,11 +0,0 @@
1
- function e(){if(typeof window>`u`&&typeof globalThis>`u`)return!1;let e=typeof window<`u`?window:globalThis;return!e.TRANSFORMERS_CONFIG&&!!(e.LanguageModel&&typeof e.LanguageModel.create==`function`||e.ai?.languageModel&&typeof e.ai.languageModel.create==`function`)}async function t(){if(!e())return!1;let t=typeof window<`u`?window:globalThis,n=t.LanguageModel||t.ai?.languageModel;if(typeof n?.availability==`function`)try{let e=await n.availability();return e!==`unavailable`&&e!==`no`}catch{return!1}return!0}function n(e){return e?`<div class="chat__prompt-api-badge chat__prompt-api-badge--success">&#10003; Native Prompt API detected</div>
2
- <p class="chat__prompt-api-status-note">Your browser has built-in on-device AI support enabled.</p>`:`<div class="chat__prompt-api-badge chat__prompt-api-badge--warning">&#9888;&#65039; Native Prompt API not detected &mdash; using local ONNX fallback</div>
3
- <div class="chat__prompt-api-instructions">
4
- <p class="chat__prompt-api-instructions-title"><strong>To enable native Prompt API in your browser:</strong></p>
5
- <ol class="chat__prompt-api-steps">
6
- <li>Navigate to <code>chrome://flags</code> (or <code>edge://flags</code>)</li>
7
- <li>Enable <code>#prompt-api-for-gemini-nano</code> (or <code>#prompt-api</code>) and <code>#enables-optimization-guide-on-device-model</code></li>
8
- <li>Visit <code>chrome://components</code> (or <code>edge://components</code>) and click <em>Check for update</em> next to the on-device model component</li>
9
- <li>Restart your browser</li>
10
- </ol>
11
- </div>`}function r(e){let t=[`ShadowClaw uses the browser-native Prompt API for local, private AI inference.`,`If native browser Prompt API is unavailable, ShadowClaw falls back to running a local ONNX model in your browser (defaulting to Qwen 0.6B).`,`To enable native Prompt API: enable the Prompt API flags and optimization guide under your browser's experimental flags (chrome://flags or edge://flags).`];return e&&e.trim()&&t.push(`Details: ${e.trim()}`),{mode:`info`,title:`Prompt API Setup & Info`,message:`ShadowClaw is configured to use the browser-native Prompt API.`,details:t,confirmLabel:`OK`,autoCloseSeconds:30,links:[{label:`Prompt API Documentation`,href:`https://developer.chrome.com/docs/ai/built-in`}]}}export{n as i,t as n,e as r,r as t};