shadow-claw 1.26.0 → 1.27.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.agents/skills/main/skill-creator/SKILL.md +39 -0
- package/.agents/skills/main/skill-creator/references/declarative-pipelines.md +44 -0
- package/.agents/skills/main/skill-creator/references/declarative-tools.md +35 -0
- package/.agents/skills/main/skill-creator/references/frontmatter-spec.md +50 -0
- package/.well-known/agent-skills/index.json +14 -0
- package/README.md +5 -3
- package/bin/build/build.mjs +146 -15
- package/bin/build/build.test.mjs +57 -0
- package/bin/cli.mjs +26 -0
- package/bin/commands/mcp.mjs +277 -55
- package/bin/commands/mcp.test.mjs +275 -1
- package/bin/commands/skills-index.mjs +328 -0
- package/bin/commands/skills-index.test.mjs +161 -0
- package/bin/site-config/utils/custom-elements/get-approved-custom-element-scripts.test.mjs +2 -0
- package/bin/site-config/utils/custom-elements/sanitize-embedded-custom-element-scripts.test.mjs +10 -1
- package/dist/lib/components/index.js +25 -25
- package/dist/lib/components/settings/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/settings/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/settings/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/settings/shadow-claw-git.js +1 -1
- package/dist/lib/components/settings/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/settings/shadow-claw-llm.js +1 -1
- package/dist/lib/components/settings/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/settings/shadow-claw-networking.js +1 -1
- package/dist/lib/components/settings/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/settings/shadow-claw-storage.js +1 -1
- package/dist/lib/components/settings/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/settings/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw-a2ui.js +1 -1
- package/dist/lib/components/shadow-claw-accounts.js +1 -1
- package/dist/lib/components/shadow-claw-channel-config.js +1 -1
- package/dist/lib/components/shadow-claw-channels.js +1 -1
- package/dist/lib/components/shadow-claw-chat.js +1 -1
- package/dist/lib/components/shadow-claw-control-plane.js +1 -1
- package/dist/lib/components/shadow-claw-conversations.js +1 -1
- package/dist/lib/components/shadow-claw-file-viewer.js +1 -1
- package/dist/lib/components/shadow-claw-files.js +1 -1
- package/dist/lib/components/shadow-claw-git.js +1 -1
- package/dist/lib/components/shadow-claw-integrations.js +1 -1
- package/dist/lib/components/shadow-claw-llm.js +1 -1
- package/dist/lib/components/shadow-claw-mcp-remote.js +1 -1
- package/dist/lib/components/shadow-claw-networking.js +1 -1
- package/dist/lib/components/shadow-claw-page-header.js +1 -1
- package/dist/lib/components/shadow-claw-pages.js +1 -1
- package/dist/lib/components/shadow-claw-peerjs.js +1 -1
- package/dist/lib/components/shadow-claw-settings.js +1 -1
- package/dist/lib/components/shadow-claw-storage.js +1 -1
- package/dist/lib/components/shadow-claw-task-server.js +1 -1
- package/dist/lib/components/shadow-claw-tasks.js +1 -1
- package/dist/lib/components/shadow-claw-terminal.js +1 -1
- package/dist/lib/components/shadow-claw-tools.js +1 -1
- package/dist/lib/components/shadow-claw-webvm.js +1 -1
- package/dist/lib/components/shadow-claw.js +1 -1
- package/dist/lib/{configurePeerJs-CrlGan0m.js → configurePeerJs-oODzltaC.js} +2 -2
- package/dist/lib/{configurePeerJs-CrlGan0m.js.map → configurePeerJs-oODzltaC.js.map} +1 -1
- package/dist/lib/core/control-plane-client.d.ts +1 -0
- package/dist/lib/{downloadGroupFile-DboUjmp2.js → downloadGroupFile-DmcBQU1n.js} +2 -2
- package/dist/lib/{downloadGroupFile-DboUjmp2.js.map → downloadGroupFile-DmcBQU1n.js.map} +1 -1
- package/dist/lib/{file-viewer-BrK2Wxgh.js → file-viewer-C3YKnq_-.js} +4 -3
- package/dist/lib/{file-viewer-BrK2Wxgh.js.map → file-viewer-C3YKnq_-.js.map} +1 -1
- package/dist/lib/index.js +26 -26
- package/dist/lib/{initControlPlane-CsO4UR6_.js → initControlPlane-C2zURVIS.js} +86 -13
- package/dist/lib/initControlPlane-C2zURVIS.js.map +1 -0
- package/dist/lib/{markdown-eeSTFnMA.js → markdown-C6EHl9zs.js} +3 -3
- package/dist/lib/{markdown-eeSTFnMA.js.map → markdown-C6EHl9zs.js.map} +1 -1
- package/dist/lib/{orchestrator-CJvoC2Uu.js → orchestrator-CACLa_Ro.js} +7 -6
- package/dist/lib/{orchestrator-CJvoC2Uu.js.map → orchestrator-CACLa_Ro.js.map} +1 -1
- package/dist/lib/{orchestrator-DCfomsn9.js → orchestrator-KRjx0eba.js} +6 -534
- package/dist/lib/{orchestrator-DCfomsn9.js.map → orchestrator-KRjx0eba.js.map} +1 -1
- package/dist/lib/parsePath-DwC_YZjw.js +16 -0
- package/dist/lib/parsePath-DwC_YZjw.js.map +1 -0
- package/dist/lib/{peerjs-Dp02bXcG.js → peerjs-DFWOBcXf.js} +4 -4
- package/dist/lib/{peerjs-Dp02bXcG.js.map → peerjs-DFWOBcXf.js.map} +1 -1
- package/dist/lib/{readGroupFileBytes-Bve-e5e_.js → readGroupFileBytes-C8oOe8Iu.js} +3 -16
- package/dist/lib/readGroupFileBytes-C8oOe8Iu.js.map +1 -0
- package/dist/lib/security/custom-element-security.d.ts +8 -0
- package/dist/lib/server/control-plane-types.d.ts +1 -1
- package/dist/lib/{shadow-claw-D8xINM3c.js → shadow-claw-6UHdiy4a.js} +5 -5
- package/dist/lib/{shadow-claw-D8xINM3c.js.map → shadow-claw-6UHdiy4a.js.map} +1 -1
- package/dist/lib/{shadow-claw-a2ui-7rJqG4Ke.js → shadow-claw-a2ui-CpZUTzlh.js} +5 -4
- package/dist/lib/{shadow-claw-a2ui-7rJqG4Ke.js.map → shadow-claw-a2ui-CpZUTzlh.js.map} +1 -1
- package/dist/lib/{shadow-claw-accounts-CdruwN8A.js → shadow-claw-accounts-03oJ__XC.js} +2 -2
- package/dist/lib/{shadow-claw-accounts-CdruwN8A.js.map → shadow-claw-accounts-03oJ__XC.js.map} +1 -1
- package/dist/lib/{shadow-claw-channel-config-Bj0-Nk3t.js → shadow-claw-channel-config-DmfwJc6G.js} +3 -3
- package/dist/lib/{shadow-claw-channel-config-Bj0-Nk3t.js.map → shadow-claw-channel-config-DmfwJc6G.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-C_jI4KhP.js → shadow-claw-channels-1N6Jl-By.js} +3 -3
- package/dist/lib/{shadow-claw-channels-C_jI4KhP.js.map → shadow-claw-channels-1N6Jl-By.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-B16MspoP.js → shadow-claw-chat-BMoqQJRK.js} +10 -10
- package/dist/lib/{shadow-claw-chat-B16MspoP.js.map → shadow-claw-chat-BMoqQJRK.js.map} +1 -1
- package/dist/lib/{shadow-claw-control-plane-x8Ldid_h.js → shadow-claw-control-plane-UG0o7pCz.js} +6 -6
- package/dist/lib/{shadow-claw-control-plane-x8Ldid_h.js.map → shadow-claw-control-plane-UG0o7pCz.js.map} +1 -1
- package/dist/lib/{shadow-claw-conversations-Ct1kAYdB.js → shadow-claw-conversations-BwXep3iu.js} +4 -3
- package/dist/lib/{shadow-claw-conversations-Ct1kAYdB.js.map → shadow-claw-conversations-BwXep3iu.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-BfDHHgpA.js → shadow-claw-file-viewer-DUxzVxDT.js} +14 -10
- package/dist/lib/shadow-claw-file-viewer-DUxzVxDT.js.map +1 -0
- package/dist/lib/{shadow-claw-files-EYhOPYIH.js → shadow-claw-files-DIREEnT2.js} +7 -7
- package/dist/lib/{shadow-claw-files-EYhOPYIH.js.map → shadow-claw-files-DIREEnT2.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-tcSpT-P0.js → shadow-claw-git-Bg1SWgsF.js} +4 -4
- package/dist/lib/{shadow-claw-git-tcSpT-P0.js.map → shadow-claw-git-Bg1SWgsF.js.map} +1 -1
- package/dist/lib/{shadow-claw-integrations-NbcCx_ZI.js → shadow-claw-integrations-Ds-CLPhj.js} +2 -2
- package/dist/lib/{shadow-claw-integrations-NbcCx_ZI.js.map → shadow-claw-integrations-Ds-CLPhj.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-BazJdD5f.js → shadow-claw-llm-CazBrVpM.js} +3 -3
- package/dist/lib/{shadow-claw-llm-BazJdD5f.js.map → shadow-claw-llm-CazBrVpM.js.map} +1 -1
- package/dist/lib/{shadow-claw-mcp-remote-CYmhpg7a.js → shadow-claw-mcp-remote-CT5Q-54E.js} +2 -2
- package/dist/lib/{shadow-claw-mcp-remote-CYmhpg7a.js.map → shadow-claw-mcp-remote-CT5Q-54E.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-DImPxe0H.js → shadow-claw-networking-Df85tCbO.js} +2 -2
- package/dist/lib/{shadow-claw-networking-DImPxe0H.js.map → shadow-claw-networking-Df85tCbO.js.map} +1 -1
- package/dist/lib/{shadow-claw-page-header-CcHUfFUx.js → shadow-claw-page-header-Cti2fzf-.js} +2 -2
- package/dist/lib/{shadow-claw-page-header-CcHUfFUx.js.map → shadow-claw-page-header-Cti2fzf-.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-D54jF1Qq.js → shadow-claw-pages-BgPyIEZO.js} +15 -11
- package/dist/lib/shadow-claw-pages-BgPyIEZO.js.map +1 -0
- package/dist/lib/{shadow-claw-peerjs-B9-T8Nlx.js → shadow-claw-peerjs-xkBXILed.js} +3 -3
- package/dist/lib/{shadow-claw-peerjs-B9-T8Nlx.js.map → shadow-claw-peerjs-xkBXILed.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-Bt1VAe-1.js → shadow-claw-settings-CN89xRVU.js} +4 -4
- package/dist/lib/{shadow-claw-settings-Bt1VAe-1.js.map → shadow-claw-settings-CN89xRVU.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-CFOjGf1d.js → shadow-claw-storage-VnhcObCe.js} +3 -3
- package/dist/lib/{shadow-claw-storage-CFOjGf1d.js.map → shadow-claw-storage-VnhcObCe.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-BiKa2GOm.js → shadow-claw-task-server-jgEC2hHB.js} +2 -2
- package/dist/lib/{shadow-claw-task-server-BiKa2GOm.js.map → shadow-claw-task-server-jgEC2hHB.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-DDHd8W4d.js → shadow-claw-tasks-i_evIufy.js} +6 -6
- package/dist/lib/{shadow-claw-tasks-DDHd8W4d.js.map → shadow-claw-tasks-i_evIufy.js.map} +1 -1
- package/dist/lib/{shadow-claw-terminal-kB6_tWKz.js → shadow-claw-terminal-CwScROlu.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-kB6_tWKz.js.map → shadow-claw-terminal-CwScROlu.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-DxXIm0ku.js → shadow-claw-tools-DD3fyXP4.js} +5 -4
- package/dist/lib/{shadow-claw-tools-DxXIm0ku.js.map → shadow-claw-tools-DD3fyXP4.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-Dc8oo7ao.js → shadow-claw-webvm-DbJq4I3-.js} +2 -2
- package/dist/lib/{shadow-claw-webvm-Dc8oo7ao.js.map → shadow-claw-webvm-DbJq4I3-.js.map} +1 -1
- package/dist/lib/{syncWebMcpRegistration-jyRGbC9w.js → syncWebMcpRegistration-DNLnQ-jz.js} +3 -2
- package/dist/lib/{syncWebMcpRegistration-jyRGbC9w.js.map → syncWebMcpRegistration-DNLnQ-jz.js.map} +1 -1
- package/dist/lib/tools-DwwB9RBa.js +546 -0
- package/dist/lib/tools-DwwB9RBa.js.map +1 -0
- package/dist/lib/{trusted-types-CkLDpLiZ.js → trusted-types-Dx0RZlrd.js} +19 -8
- package/dist/lib/trusted-types-Dx0RZlrd.js.map +1 -0
- package/dist/lib/utils/index.js +1 -1
- package/dist/lib/utils/utils.js +1 -1
- package/dist/public/.well-known/agent-skills/index.json +14 -0
- package/dist/public/AGENTS.md +5 -3
- package/dist/public/README.md +5 -3
- package/dist/public/agent.worker.js +1 -1
- package/dist/public/{configurePeerJs-COcwE0E7.js → configurePeerJs-BqgeBjP7.js} +1 -1
- package/dist/public/custom-element-security-FU04Cq05.js +1 -0
- package/dist/public/dist-B9m1QM9v.js +58 -0
- package/dist/public/docs/README.md +31 -31
- package/dist/public/docs/example/article/index.html +1 -1
- package/dist/public/docs/publishing/index.html +1 -1
- package/dist/public/docs/skill-creator/index.html +1 -1
- package/dist/public/docs/subsystems/a2ui.md +11 -1
- package/dist/public/docs/subsystems/cli.md +29 -0
- package/dist/public/docs/subsystems/control-plane.md +8 -2
- package/dist/public/docs/subsystems/custom-element-security.md +19 -9
- package/dist/public/docs/subsystems/mcp-server.md +39 -15
- package/dist/public/docs/subsystems/skills.md +30 -0
- package/dist/public/docs/subsystems/webmcp.md +9 -0
- package/dist/public/downloadGroupFile-D8KRJGGL.js +1 -0
- package/dist/public/e2e/README.md +7 -4
- package/dist/public/{e2e-bridge-CHARpbpW.js → e2e-bridge-Ceqr5kGc.js} +1 -1
- package/dist/public/effect-BJCrpFdp.js +1 -0
- package/dist/public/file-viewer-C-6Jc_tb.js +1 -0
- package/dist/public/index.html +1 -1
- package/dist/public/index.js +1 -1
- package/dist/public/initControlPlane-BN9cWyO0.js +1 -0
- package/dist/public/main/index.html +1 -1
- package/dist/public/main/memory/index.html +1 -1
- package/dist/public/{markdown-1I3O6Mmd.js → markdown-C3M4OW_A.js} +1 -1
- package/dist/public/{orchestrator-Cl95w2vb.js → orchestrator-CMbCTjBf.js} +7 -7
- package/dist/public/{orchestrator-D-xlXG92.js → orchestrator-DHjdLtqa.js} +663 -663
- package/dist/public/peerjs-DUCKH-m9.js +1 -0
- package/dist/public/service-worker.js +1 -1
- package/dist/public/{shadow-claw-CaoKmIIB.js → shadow-claw-EAt2ml5Y.js} +3 -3
- package/dist/public/{shadow-claw-accounts-CJvYC4li.js → shadow-claw-accounts-xUOLBsQZ.js} +1 -1
- package/dist/public/{shadow-claw-channels-3K62sU5f.js → shadow-claw-channels-XsfuWFF8.js} +4 -4
- package/dist/public/{shadow-claw-chat-Cu2keU2I.js → shadow-claw-chat-CbSaOZ4q.js} +7 -7
- package/dist/public/{shadow-claw-control-plane-D1OwlQI_.js → shadow-claw-control-plane-DHvN3Ukg.js} +2 -2
- package/dist/public/{shadow-claw-conversations-DDtg3BEZ.js → shadow-claw-conversations-BWs5VVfs.js} +2 -2
- package/dist/public/{shadow-claw-file-viewer-BR__1z9S.js → shadow-claw-file-viewer-BWsoW5QS.js} +5 -4
- package/dist/public/{shadow-claw-files-BJSyZ-Bl.js → shadow-claw-files-CG7MqWiV.js} +8 -8
- package/dist/public/{shadow-claw-git-MAjhXRLc.js → shadow-claw-git-DBRPZNav.js} +6 -6
- package/dist/public/{shadow-claw-integrations-82UoFuDR.js → shadow-claw-integrations-BBVnO0Fc.js} +8 -8
- package/dist/public/{shadow-claw-llm-R8j0lwPP.js → shadow-claw-llm-DMvLgKXo.js} +2 -2
- package/dist/public/{shadow-claw-mcp-remote-BzZoz4LX.js → shadow-claw-mcp-remote-Bkx0gsmF.js} +2 -2
- package/dist/public/{shadow-claw-networking-DLEd9cNm.js → shadow-claw-networking-Dd8Rw31D.js} +2 -2
- package/dist/public/{shadow-claw-notifications-1vwR7TbT.js → shadow-claw-notifications-Dbevj-lq.js} +2 -2
- package/dist/public/{shadow-claw-page-header-DMKbkv3s.js → shadow-claw-page-header-BccSHItx.js} +1 -1
- package/dist/public/{shadow-claw-pages-CjyeIV__.js → shadow-claw-pages-3_lQAv0t.js} +4 -3
- package/dist/public/{shadow-claw-settings-BfbT4dBU.js → shadow-claw-settings-t8TIlgrM.js} +5 -5
- package/dist/public/{shadow-claw-storage-C-mWQQML.js → shadow-claw-storage-CfEXoSIE.js} +2 -2
- package/dist/public/{shadow-claw-task-server-D3lHp0Nc.js → shadow-claw-task-server-DxQSsgRZ.js} +2 -2
- package/dist/public/{shadow-claw-tasks-DVVWEm-c.js → shadow-claw-tasks-DNpicQwz.js} +14 -14
- package/dist/public/{shadow-claw-terminal-BwuTRp-O.js → shadow-claw-terminal-DpY6zU_r.js} +1 -1
- package/dist/public/{shadow-claw-toast-ClCwgzFG.js → shadow-claw-toast-BkrQIP-3.js} +1 -1
- package/dist/public/{shadow-claw-tools-zFLk2nbV.js → shadow-claw-tools-WSwWohnk.js} +2 -2
- package/dist/public/{shadow-claw-webvm-qR9X7fg7.js → shadow-claw-webvm-CP6oFjg5.js} +2 -2
- package/dist/public/syncWebMcpRegistration-DOn9gLnD.js +1 -0
- package/dist/public/toast-BXgUfbyh.js +1 -0
- package/dist/public/tools-DvckJZG2.js +1 -0
- package/dist/server.js +188 -188
- package/package.json +3 -1
- package/src/components/shadow-claw-a2ui/shadow-claw-a2ui.stories.ts +1380 -93
- package/src/components/shadow-claw-a2ui/shadow-claw-a2ui.ts +11 -6
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.test.ts +8 -1
- package/src/components/shadow-claw-file-viewer/shadow-claw-file-viewer.ts +13 -5
- package/src/components/shadow-claw-pages/utils/buildHtmlPageSrcdoc.ts +13 -5
- package/src/core/control-plane-client.ts +15 -0
- package/src/core/utils/initControlPlane.test.ts +187 -0
- package/src/core/utils/initControlPlane.ts +194 -20
- package/src/security/custom-element-security.test.ts +51 -0
- package/src/security/custom-element-security.ts +33 -15
- package/src/server/control-plane-types.ts +1 -0
- package/src/server/control-plane.test.ts +69 -0
- package/src/server/control-plane.ts +45 -3
- package/src/server/mcp/tools/built-in-tools.ts +80 -5
- package/src/server/mcp/tools/client-tool-relay.ts +183 -26
- package/src/server/mcp/tools/mcp-tools.test.ts +140 -0
- package/src/server/middleware/static-files.test.ts +142 -0
- package/src/server/middleware/static-files.ts +66 -8
- package/src/testing/jest-setup.ts +1 -0
- package/src/worker/utils/handleMessage.ts +4 -1
- package/dist/lib/initControlPlane-CsO4UR6_.js.map +0 -1
- package/dist/lib/readGroupFileBytes-Bve-e5e_.js.map +0 -1
- package/dist/lib/shadow-claw-file-viewer-BfDHHgpA.js.map +0 -1
- package/dist/lib/shadow-claw-pages-D54jF1Qq.js.map +0 -1
- package/dist/lib/trusted-types-CkLDpLiZ.js.map +0 -1
- package/dist/public/custom-element-security-NCqQ5lmC.js +0 -1
- package/dist/public/downloadGroupFile-G0BZQgQg.js +0 -1
- package/dist/public/effect-rHYr4nfu.js +0 -1
- package/dist/public/file-viewer-8PdCURDD.js +0 -1
- package/dist/public/initControlPlane-CcGXax0A.js +0 -1
- package/dist/public/peerjs-BZdxWQFv.js +0 -1
- package/dist/public/syncWebMcpRegistration-DD42YsYV.js +0 -1
- package/dist/public/toast-HAq8XWFj.js +0 -58
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shadow-claw-llm-BazJdD5f.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 isPromptApiPotentiallySupported,\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 =\n isNativePromptApiSupported() || isPromptApiPotentiallySupported();\n promptApiFallbackGroup.style.display =\n currentProvider === \"prompt_api\" && !isAvailable ? \"block\" : \"none\";\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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\\\"/g, \""\")\n .replace(/'/g, \"'\");\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
|
+
{"version":3,"file":"shadow-claw-llm-CazBrVpM.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 isPromptApiPotentiallySupported,\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 =\n isNativePromptApiSupported() || isPromptApiPotentiallySupported();\n promptApiFallbackGroup.style.display =\n currentProvider === \"prompt_api\" && !isAvailable ? \"block\" : \"none\";\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, \"&\")\n .replace(/</g, \"<\")\n .replace(/>/g, \">\")\n .replace(/\\\"/g, \""\")\n .replace(/'/g, \"'\");\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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"}
|
|
@@ -2,7 +2,7 @@ import ShadowClawElement from "./components/shadow-claw-element.js";
|
|
|
2
2
|
import { n as getDb } from "./txPromise-CuGh-TGK.js";
|
|
3
3
|
import { r as CONFIG_KEYS } from "./config--CFrw3J3.js";
|
|
4
4
|
import { t as getConfig } from "./getConfig-BxxXMyuM.js";
|
|
5
|
-
import { c as escapeHtml, n as setSanitizedHtml } from "./trusted-types-
|
|
5
|
+
import { c as escapeHtml, n as setSanitizedHtml } from "./trusted-types-Dx0RZlrd.js";
|
|
6
6
|
import { r as encryptValue } from "./crypto-BPECyFrG.js";
|
|
7
7
|
import { a as testRemoteMcpConnection, l as listRemoteMcpConnections, o as bindRemoteMcpCredentialRef, s as deleteRemoteMcpConnection, t as reconnectMcpOAuth, u as upsertRemoteMcpConnection } from "./mcp-reconnect-C86MR3z8.js";
|
|
8
8
|
import { a as showSuccess, r as showError } from "./toast-DZ6r7_YI.js";
|
|
@@ -751,4 +751,4 @@ if (!customElements.get(elementName)) customElements.define(elementName, ShadowC
|
|
|
751
751
|
|
|
752
752
|
//#endregion
|
|
753
753
|
export { ShadowClawMcpRemote as t };
|
|
754
|
-
//# sourceMappingURL=shadow-claw-mcp-remote-
|
|
754
|
+
//# sourceMappingURL=shadow-claw-mcp-remote-CT5Q-54E.js.map
|