shadow-claw 1.51.0 → 1.52.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.well-known/mcp/server-card.json +1 -1
- package/.well-known/mcp.json +1 -1
- package/README.md +1 -1
- package/dist/cli/{chunk-Dtse8rAn.js → chunk-5ryVpyup.js} +1 -1
- package/dist/cli/chunk-Aq3057Xo.js +1 -0
- package/dist/cli/{chunk-4CZJpLqA.js → chunk-BV9JBYpl.js} +2 -2
- package/dist/cli/{chunk-mbFAP9Ev.js → chunk-BZI3bWDA.js} +1 -1
- package/dist/cli/chunk-BaUCHRPD.js +1 -0
- package/dist/cli/{chunk-vzUrhBN5.js → chunk-BdbEt6gM.js} +1 -1
- package/dist/cli/{chunk-BU8UG4L_.js → chunk-BiWLawPV.js} +1 -1
- package/dist/cli/chunk-BkLnHJeo.js +1 -0
- package/dist/cli/{chunk-BqfPWIBf.js → chunk-BzWY1sKE.js} +1 -1
- package/dist/cli/{chunk-DajM7Kro.js → chunk-C79eIU-4.js} +1 -1
- package/dist/cli/{chunk-CI9r1AM5.js → chunk-CDw214Zi.js} +1 -1
- package/dist/cli/chunk-CNqc7LLn.js +1 -0
- package/dist/cli/{chunk-CEhU-Ah-.js → chunk-CWW7dqIv.js} +1 -1
- package/dist/cli/{chunk-BT_C3OlA.js → chunk-CcSTYHtR.js} +1 -1
- package/dist/cli/chunk-ClOfk6Ga.js +1 -0
- package/dist/cli/chunk-ComXUwW0.js +1 -0
- package/dist/cli/{chunk-lL1BhHVe.js → chunk-CooeO4UQ.js} +1 -1
- package/dist/cli/{chunk-khr7--yI.js → chunk-CtfWY4G6.js} +1 -1
- package/dist/cli/{chunk-C4iW1XuQ.js → chunk-DFgSiYMW.js} +1 -1
- package/dist/cli/chunk-DGBnjngK.js +1 -0
- package/dist/cli/{chunk-D7bFIUK3.js → chunk-DGu1OhJs.js} +1 -1
- package/dist/cli/{chunk-CzfOerQR.js → chunk-DIjCY0Wf.js} +1 -1
- package/dist/cli/{chunk-D-iqEY5G.js → chunk-DJ_LeQtz.js} +1 -1
- package/dist/cli/{chunk-BmEsDkRK.js → chunk-DQRu-9wO.js} +1 -1
- package/dist/cli/{chunk-DojiYody.js → chunk-DToVgO9a.js} +1 -1
- package/dist/cli/{chunk-De5a_Rlp.js → chunk-DVbNkQRL.js} +1 -1
- package/dist/cli/{chunk-c8MIYB2y.js → chunk-Ddtzaj43.js} +1 -1
- package/dist/cli/{chunk-aJ6fufe-.js → chunk-DiqS56rD.js} +1 -1
- package/dist/cli/{chunk-CeUEmZNt.js → chunk-DnRcu9b4.js} +1 -1
- package/dist/cli/chunk-DtgZDsJA.js +1 -0
- package/dist/cli/{chunk-DVMcK7g6.js → chunk-Du4qvxo_.js} +2 -2
- package/dist/cli/{chunk-CegcvNc9.js → chunk-Dz5_hgvL.js} +8 -8
- package/dist/cli/{chunk-Cd4Dv5Eq.js → chunk-I3mxEelq.js} +1 -1
- package/dist/cli/{chunk-Do3VICh1.js → chunk-IU2SH_ti.js} +1 -1
- package/dist/cli/{chunk-BQveaAaD.js → chunk-NC8XsSSA.js} +1 -1
- package/dist/cli/{chunk-D702W_Ry.js → chunk-Q4BZ9QN9.js} +1 -1
- package/dist/cli/chunk-WTlDd4Ou.js +1 -0
- package/dist/cli/chunk-XGzq5joC.js +1 -0
- package/dist/cli/{chunk-ar7eAlxK.js → chunk-aJfaGe2s.js} +8 -8
- package/dist/cli/chunk-bPVrFlmk.js +1 -0
- package/dist/cli/chunk-jXJHKxdR.js +1 -0
- package/dist/cli/{chunk-C3dTAmV_.js → chunk-rstVU7U0.js} +1 -1
- package/dist/cli/{chunk-DGfTzQui.js → chunk-t72uObQ7.js} +1 -1
- package/dist/cli/{chunk-DDgfljzN.js → chunk-vq8xlroY.js} +1 -1
- package/dist/cli/cli.js +1 -1
- package/dist/headless-agent.js +1 -1
- package/dist/lib/components/common/shadow-claw-provider-model-picker.js +1 -1
- package/dist/lib/components/index.js +27 -27
- 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/model-ranking.d.ts +12 -0
- 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-notifications.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/shadow-claw-chat.d.ts +1 -0
- 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-notifications.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-provider-model-picker.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/config/config.d.ts +2 -1
- package/dist/lib/{config-DxDaVDTn.js → config-DFLs7eoC.js} +3 -2
- package/dist/lib/config-DFLs7eoC.js.map +1 -0
- package/dist/lib/{configurePeerJs-ScwZiGbF.js → configurePeerJs-DJ0H6e6s.js} +3 -3
- package/dist/lib/{configurePeerJs-ScwZiGbF.js.map → configurePeerJs-DJ0H6e6s.js.map} +1 -1
- package/dist/lib/{connections-D82zele0.js → connections-DT3nPylw.js} +2 -2
- package/dist/lib/{connections-D82zele0.js.map → connections-DT3nPylw.js.map} +1 -1
- package/dist/lib/{downloadGroupFile-D7-5y6NI.js → downloadGroupFile-DMnAiPj4.js} +2 -2
- package/dist/lib/{downloadGroupFile-D7-5y6NI.js.map → downloadGroupFile-DMnAiPj4.js.map} +1 -1
- package/dist/lib/{file-viewer-BMvvndPQ.js → file-viewer-OHmGC_l7.js} +5 -5
- package/dist/lib/{file-viewer-BMvvndPQ.js.map → file-viewer-OHmGC_l7.js.map} +1 -1
- package/dist/lib/{getGroupDir-BidwYPfP.js → getGroupDir-mTV2Iz2b.js} +3 -3
- package/dist/lib/{getGroupDir-BidwYPfP.js.map → getGroupDir-mTV2Iz2b.js.map} +1 -1
- package/dist/lib/{git-CXmWufWS.js → git-CGdKghMC.js} +3 -3
- package/dist/lib/{git-CXmWufWS.js.map → git-CGdKghMC.js.map} +1 -1
- package/dist/lib/index.js +28 -28
- package/dist/lib/{initChatSplitResize-tvUZ-wsp.js → initChatSplitResize-B8zHHQdm.js} +2 -2
- package/dist/lib/{initChatSplitResize-tvUZ-wsp.js.map → initChatSplitResize-B8zHHQdm.js.map} +1 -1
- package/dist/lib/{initControlPlane-Dnjkb-6J.js → initControlPlane-BczrlTf3.js} +14 -14
- package/dist/lib/{initControlPlane-Dnjkb-6J.js.map → initControlPlane-BczrlTf3.js.map} +1 -1
- package/dist/lib/{markdown-WCXar9C8.js → markdown-D-7Cjyye.js} +3 -3
- package/dist/lib/{markdown-WCXar9C8.js.map → markdown-D-7Cjyye.js.map} +1 -1
- package/dist/lib/{mcp-reconnect-WTOQONHZ.js → mcp-reconnect-Czf7QCCv.js} +2 -2
- package/dist/lib/{mcp-reconnect-WTOQONHZ.js.map → mcp-reconnect-Czf7QCCv.js.map} +1 -1
- package/dist/lib/{memoryStorage-Bo2Wpfmg.js → memoryStorage-CXyKsKMo.js} +2 -2
- package/dist/lib/{memoryStorage-Bo2Wpfmg.js.map → memoryStorage-CXyKsKMo.js.map} +1 -1
- package/dist/lib/model-ranking-Bo8CpGH1.js +116 -0
- package/dist/lib/model-ranking-Bo8CpGH1.js.map +1 -0
- package/dist/lib/{orchestrator-Crw4btGn.js → orchestrator-BK138MkV.js} +10 -10
- package/dist/lib/{orchestrator-Crw4btGn.js.map → orchestrator-BK138MkV.js.map} +1 -1
- package/dist/lib/{orchestrator-Dro541iH.js → orchestrator-BtbxiPQB.js} +17 -16
- package/dist/lib/{orchestrator-Dro541iH.js.map → orchestrator-BtbxiPQB.js.map} +1 -1
- package/dist/lib/{peerjs-D741bHrf.js → peerjs-QJr03K9F.js} +7 -7
- package/dist/lib/{peerjs-D741bHrf.js.map → peerjs-QJr03K9F.js.map} +1 -1
- package/dist/lib/{prompt-api-D9XdrCep.js → prompt-api-vf351sf2.js} +2 -19
- package/dist/lib/{prompt-api-D9XdrCep.js.map → prompt-api-vf351sf2.js.map} +1 -1
- package/dist/lib/{push-client-DKFUY_Ti.js → push-client-BOHgqHbk.js} +4 -4
- package/dist/lib/{push-client-DKFUY_Ti.js.map → push-client-BOHgqHbk.js.map} +1 -1
- package/dist/lib/{readGroupFileBytes-C8Xqlb8l.js → readGroupFileBytes-CRA6dmgT.js} +2 -2
- package/dist/lib/{readGroupFileBytes-C8Xqlb8l.js.map → readGroupFileBytes-CRA6dmgT.js.map} +1 -1
- package/dist/lib/{shadow-claw-a2ui-CPydWVdW.js → shadow-claw-a2ui-DbZa4Gxp.js} +2 -2
- package/dist/lib/{shadow-claw-a2ui-CPydWVdW.js.map → shadow-claw-a2ui-DbZa4Gxp.js.map} +1 -1
- package/dist/lib/{shadow-claw-accounts-CUypXc3I.js → shadow-claw-accounts-B6OW2NVD.js} +3 -3
- package/dist/lib/{shadow-claw-accounts-CUypXc3I.js.map → shadow-claw-accounts-B6OW2NVD.js.map} +1 -1
- package/dist/lib/{shadow-claw-channel-config-D_Vb2ous.js → shadow-claw-channel-config-F_EJ-uK2.js} +3 -3
- package/dist/lib/{shadow-claw-channel-config-D_Vb2ous.js.map → shadow-claw-channel-config-F_EJ-uK2.js.map} +1 -1
- package/dist/lib/{shadow-claw-channels-hgjjzvRr.js → shadow-claw-channels-XYylMpjg.js} +3 -3
- package/dist/lib/{shadow-claw-channels-hgjjzvRr.js.map → shadow-claw-channels-XYylMpjg.js.map} +1 -1
- package/dist/lib/{shadow-claw-chat-D69IiLXd.js → shadow-claw-chat-dbK_DGO_.js} +124 -38
- package/dist/lib/shadow-claw-chat-dbK_DGO_.js.map +1 -0
- package/dist/lib/{shadow-claw-control-plane-zBYlFvzQ.js → shadow-claw-control-plane-BJKkmahQ.js} +7 -7
- package/dist/lib/{shadow-claw-control-plane-zBYlFvzQ.js.map → shadow-claw-control-plane-BJKkmahQ.js.map} +1 -1
- package/dist/lib/{shadow-claw-conversations-1GW8_e8o.js → shadow-claw-conversations-BKSsMYTc.js} +6 -6
- package/dist/lib/{shadow-claw-conversations-1GW8_e8o.js.map → shadow-claw-conversations-BKSsMYTc.js.map} +1 -1
- package/dist/lib/{shadow-claw-D3z3tFyE.js → shadow-claw-eBB2dbpd.js} +11 -11
- package/dist/lib/{shadow-claw-D3z3tFyE.js.map → shadow-claw-eBB2dbpd.js.map} +1 -1
- package/dist/lib/{shadow-claw-file-viewer-DI4r7Th9.js → shadow-claw-file-viewer-BqChtTvM.js} +8 -8
- package/dist/lib/{shadow-claw-file-viewer-DI4r7Th9.js.map → shadow-claw-file-viewer-BqChtTvM.js.map} +1 -1
- package/dist/lib/{shadow-claw-files-BM7qW3TW.js → shadow-claw-files-Bu7VCQw6.js} +9 -9
- package/dist/lib/{shadow-claw-files-BM7qW3TW.js.map → shadow-claw-files-Bu7VCQw6.js.map} +1 -1
- package/dist/lib/{shadow-claw-git-BBTiTYIn.js → shadow-claw-git-CdPPN6Qb.js} +6 -6
- package/dist/lib/{shadow-claw-git-BBTiTYIn.js.map → shadow-claw-git-CdPPN6Qb.js.map} +1 -1
- package/dist/lib/{shadow-claw-integrations-DTY3E545.js → shadow-claw-integrations-DehqBSRe.js} +4 -4
- package/dist/lib/{shadow-claw-integrations-DTY3E545.js.map → shadow-claw-integrations-DehqBSRe.js.map} +1 -1
- package/dist/lib/{shadow-claw-llm-AJwzkOGo.js → shadow-claw-llm-COZkufA8.js} +13 -11
- package/dist/lib/shadow-claw-llm-COZkufA8.js.map +1 -0
- package/dist/lib/{shadow-claw-mcp-remote-n7YXKxmv.js → shadow-claw-mcp-remote-axF50-le.js} +4 -4
- package/dist/lib/{shadow-claw-mcp-remote-n7YXKxmv.js.map → shadow-claw-mcp-remote-axF50-le.js.map} +1 -1
- package/dist/lib/{shadow-claw-networking-B3leDgZ4.js → shadow-claw-networking-BT_Rxj36.js} +2 -2
- package/dist/lib/{shadow-claw-networking-B3leDgZ4.js.map → shadow-claw-networking-BT_Rxj36.js.map} +1 -1
- package/dist/lib/{shadow-claw-notifications-Bm2aHQ0U.js → shadow-claw-notifications-ClqAXDDN.js} +3 -3
- package/dist/lib/{shadow-claw-notifications-Bm2aHQ0U.js.map → shadow-claw-notifications-ClqAXDDN.js.map} +1 -1
- package/dist/lib/{shadow-claw-page-header-BBqSWlhP.js → shadow-claw-page-header-bigC_h6U.js} +2 -2
- package/dist/lib/{shadow-claw-page-header-BBqSWlhP.js.map → shadow-claw-page-header-bigC_h6U.js.map} +1 -1
- package/dist/lib/{shadow-claw-pages-BFOcluFY.js → shadow-claw-pages-kA2qa-4B.js} +9 -9
- package/dist/lib/{shadow-claw-pages-BFOcluFY.js.map → shadow-claw-pages-kA2qa-4B.js.map} +1 -1
- package/dist/lib/{shadow-claw-peerjs-BvD_MH_l.js → shadow-claw-peerjs-CvcH2DkA.js} +3 -3
- package/dist/lib/{shadow-claw-peerjs-BvD_MH_l.js.map → shadow-claw-peerjs-CvcH2DkA.js.map} +1 -1
- package/dist/lib/{shadow-claw-provider-model-picker-CsA-507a.js → shadow-claw-provider-model-picker-fcVQdDtQ.js} +2 -2
- package/dist/lib/{shadow-claw-provider-model-picker-CsA-507a.js.map → shadow-claw-provider-model-picker-fcVQdDtQ.js.map} +1 -1
- package/dist/lib/{shadow-claw-settings-CZgGMz0a.js → shadow-claw-settings-CkO6JjA4.js} +6 -6
- package/dist/lib/{shadow-claw-settings-CZgGMz0a.js.map → shadow-claw-settings-CkO6JjA4.js.map} +1 -1
- package/dist/lib/{shadow-claw-storage-BTUpEKO0.js → shadow-claw-storage-10w-y8vL.js} +5 -5
- package/dist/lib/{shadow-claw-storage-BTUpEKO0.js.map → shadow-claw-storage-10w-y8vL.js.map} +1 -1
- package/dist/lib/{shadow-claw-task-server-B1X2AYyZ.js → shadow-claw-task-server-U98sZxPu.js} +2 -2
- package/dist/lib/{shadow-claw-task-server-B1X2AYyZ.js.map → shadow-claw-task-server-U98sZxPu.js.map} +1 -1
- package/dist/lib/{shadow-claw-tasks-BYtaRUAd.js → shadow-claw-tasks-DrSVUOsP.js} +8 -8
- package/dist/lib/{shadow-claw-tasks-BYtaRUAd.js.map → shadow-claw-tasks-DrSVUOsP.js.map} +1 -1
- package/dist/lib/{shadow-claw-terminal-LGuXKu77.js → shadow-claw-terminal-B7HYLuce.js} +2 -2
- package/dist/lib/{shadow-claw-terminal-LGuXKu77.js.map → shadow-claw-terminal-B7HYLuce.js.map} +1 -1
- package/dist/lib/{shadow-claw-tools-C_S-xXVG.js → shadow-claw-tools-BKrXzZfF.js} +7 -7
- package/dist/lib/{shadow-claw-tools-C_S-xXVG.js.map → shadow-claw-tools-BKrXzZfF.js.map} +1 -1
- package/dist/lib/{shadow-claw-webvm-Cab1n1bu.js → shadow-claw-webvm-Duwa5oiW.js} +3 -3
- package/dist/lib/{shadow-claw-webvm-Cab1n1bu.js.map → shadow-claw-webvm-Duwa5oiW.js.map} +1 -1
- package/dist/lib/{syncWebMcpRegistration-Dy5NS_4G.js → syncWebMcpRegistration-BOx-0F6_.js} +5 -5
- package/dist/lib/{syncWebMcpRegistration-Dy5NS_4G.js.map → syncWebMcpRegistration-BOx-0F6_.js.map} +1 -1
- package/dist/lib/{tools-B7gC1eb_.js → tools-BEuBatUs.js} +4 -4
- package/dist/lib/{tools-B7gC1eb_.js.map → tools-BEuBatUs.js.map} +1 -1
- package/dist/lib/utils/index.js +1 -1
- package/dist/lib/utils/utils.js +1 -1
- package/dist/lib/{utils-D_ylqOY-.js → utils-D8AxCH6m.js} +2 -2
- package/dist/lib/{utils-D_ylqOY-.js.map → utils-D8AxCH6m.js.map} +1 -1
- package/dist/lib/{webmcp-CkYINKJj.js → webmcp-BjfVWX1K.js} +2 -2
- package/dist/lib/{webmcp-CkYINKJj.js.map → webmcp-BjfVWX1K.js.map} +1 -1
- package/dist/public/.well-known/mcp/server-card.json +1 -1
- package/dist/public/.well-known/mcp.json +1 -1
- package/dist/public/README.md +1 -1
- package/dist/public/agent.worker.js +1 -1
- package/dist/public/components/shadow-claw-chat/shadow-claw-chat.html +1 -1
- package/dist/public/config-071HSho8.js +1 -0
- package/dist/public/{configurePeerJs-DQQ6YL-5.js → configurePeerJs-DL-LurJY.js} +1 -1
- package/dist/public/{connections-CRNk2FxF.js → connections-Bb0rBpV-.js} +1 -1
- package/dist/public/{custom-element-security-3_FKCXcg.js → custom-element-security-Td4vrRc_.js} +1 -1
- package/dist/public/docs/example/article/index.html +1 -1
- package/dist/public/docs/example/article.html +1 -1
- package/dist/public/docs/publishing/index.html +1 -1
- package/dist/public/docs/publishing.html +1 -1
- package/dist/public/docs/skill-creator/index.html +1 -1
- package/dist/public/docs/skill-creator.html +1 -1
- package/dist/public/docs/subsystems/providers.md +1 -1
- package/dist/public/{downloadGroupFile-wkdhVgrZ.js → downloadGroupFile-Unq8_7D9.js} +1 -1
- package/dist/public/{e2e-bridge-DnFHPuwg.js → e2e-bridge-Dbc9fCDq.js} +1 -1
- package/dist/public/{file-viewer-C92v4Ggd.js → file-viewer-QkCuknFn.js} +1 -1
- package/dist/public/{getGroupDir-BGGIJL4Y.js → getGroupDir-Bj5XCflQ.js} +1 -1
- package/dist/public/{git-BH6qyToB.js → git-Bhz4YHc8.js} +2 -2
- package/dist/public/index.html +1 -1
- package/dist/public/index.js +1 -1
- package/dist/public/{initChatSplitResize--RH5kzVF.js → initChatSplitResize-KNL9Oh7s.js} +1 -1
- package/dist/public/{initControlPlane-yPJ3ajkj.js → initControlPlane-D2fVhRFC.js} +1 -1
- package/dist/public/main/index.html +1 -1
- package/dist/public/main/memory/index.html +1 -1
- package/dist/public/main/memory.html +1 -1
- package/dist/public/main.html +1 -1
- package/dist/public/{markdown-CA0v11cd.js → markdown-By6gdUvF.js} +1 -1
- package/dist/public/{mcp-reconnect-uyNSigzu.js → mcp-reconnect-CDRJPuoN.js} +1 -1
- package/dist/public/{memoryStorage-DjPNAT5t.js → memoryStorage-C-ao9y-j.js} +1 -1
- package/dist/public/model-ranking-DUdrFOcC.js +1 -0
- package/dist/public/{orchestrator-DTzgyL23.js → orchestrator-B7MpomoG.js} +2 -2
- package/dist/public/{orchestrator-Cmr69pMC.js → orchestrator-C8aIHbDy.js} +2 -2
- package/dist/public/{peerjs-Br38mUFC.js → peerjs-DwGjY5VX.js} +1 -1
- package/dist/public/prompt-api-BWe_j3Wg.js +1 -0
- package/dist/public/{push-client-CB8haOGC.js → push-client-o8g5_EOe.js} +1 -1
- package/dist/public/service-worker.js +1 -1
- package/dist/public/{shadow-claw-RuFQ2Ej5.js → shadow-claw-Ba2ZFE9m.js} +2 -2
- package/dist/public/{shadow-claw-accounts-BMsEItB6.js → shadow-claw-accounts-BbNPiiaV.js} +1 -1
- package/dist/public/{shadow-claw-channels-Q_AXuEaI.js → shadow-claw-channels-CHGtPkfY.js} +1 -1
- package/dist/public/{shadow-claw-chat-DZQ3OaH7.js → shadow-claw-chat-3TmjJA6-.js} +90 -23
- package/dist/public/{shadow-claw-control-plane-CyXA8tB8.js → shadow-claw-control-plane-BAFT06LL.js} +2 -2
- package/dist/public/{shadow-claw-conversations-BLKtlvHe.js → shadow-claw-conversations-DsQ_kxWm.js} +1 -1
- package/dist/public/{shadow-claw-file-viewer-CVLDfpZe.js → shadow-claw-file-viewer-hBxTknL2.js} +1 -1
- package/dist/public/{shadow-claw-files-DB6VVjir.js → shadow-claw-files-Daw6IIrJ.js} +1 -1
- package/dist/public/{shadow-claw-git-D57bTSMF.js → shadow-claw-git-CxGwyxim.js} +2 -2
- package/dist/public/{shadow-claw-integrations-BOwhUY-4.js → shadow-claw-integrations-DnIr6xp-.js} +1 -1
- package/dist/public/{shadow-claw-llm-CYenm-mm.js → shadow-claw-llm-Bc6tZ8kk.js} +3 -3
- package/dist/public/{shadow-claw-mcp-remote-CJ-Ckl0j.js → shadow-claw-mcp-remote-nGPpFpI-.js} +1 -1
- package/dist/public/{shadow-claw-networking-Cut76YQL.js → shadow-claw-networking-B6YgtiA7.js} +1 -1
- package/dist/public/{shadow-claw-notifications-C3kYCrIa.js → shadow-claw-notifications-BSxifptS.js} +1 -1
- package/dist/public/{shadow-claw-page-header-Dd7QafUk.js → shadow-claw-page-header-LzVgEn46.js} +1 -1
- package/dist/public/{shadow-claw-pages-BWtVtwTG.js → shadow-claw-pages-Cy6T0G9y.js} +1 -1
- package/dist/public/{shadow-claw-settings-Bj7jnngO.js → shadow-claw-settings-DGkwt1ge.js} +2 -2
- package/dist/public/{shadow-claw-storage-CMSzQs1-.js → shadow-claw-storage-DX_4T7KR.js} +1 -1
- package/dist/public/{shadow-claw-task-server-CFclo7UX.js → shadow-claw-task-server-DTsbEs5z.js} +1 -1
- package/dist/public/{shadow-claw-tasks-ClDdeB6Z.js → shadow-claw-tasks-rr6fMxAM.js} +1 -1
- package/dist/public/{shadow-claw-terminal-3ysWZJix.js → shadow-claw-terminal-C7DhrrX6.js} +1 -1
- package/dist/public/{shadow-claw-tools-DQVwpTcZ.js → shadow-claw-tools-DcQroojH.js} +1 -1
- package/dist/public/{shadow-claw-webvm-Cnxz04Fk.js → shadow-claw-webvm-bZj44Did.js} +1 -1
- package/dist/public/{syncWebMcpRegistration-QwnLMAK3.js → syncWebMcpRegistration-XJjIlDNO.js} +1 -1
- package/dist/public/{tools-DvQ_ngXn.js → tools-BpZh7hgB.js} +1 -1
- package/dist/public/{webmcp-CJymew4t.js → webmcp-CkfDZfZ0.js} +1 -1
- package/dist/server.js +1 -1
- package/package.json +1 -1
- package/src/components/settings/shadow-claw-llm/model-ranking.test.ts +121 -7
- package/src/components/settings/shadow-claw-llm/model-ranking.ts +97 -0
- package/src/components/settings/shadow-claw-llm/shadow-claw-llm.test.ts +35 -0
- package/src/components/settings/shadow-claw-llm/shadow-claw-llm.ts +15 -5
- package/src/components/shadow-claw-chat/shadow-claw-chat.html +81 -14
- package/src/components/shadow-claw-chat/shadow-claw-chat.test.ts +73 -0
- package/src/components/shadow-claw-chat/shadow-claw-chat.trusted-types.test.ts +3 -0
- package/src/components/shadow-claw-chat/shadow-claw-chat.ts +79 -32
- package/src/config/config.test.ts +4 -4
- package/src/config/config.ts +2 -1
- package/src/core/orchestrator/orchestrator.test.ts +2 -1
- package/src/core/orchestrator/utils/initTasks.ts +5 -4
- package/dist/cli/chunk-B3S061IE.js +0 -1
- package/dist/cli/chunk-BUJdF9o3.js +0 -1
- package/dist/cli/chunk-BX0R2gIY.js +0 -1
- package/dist/cli/chunk-BoiPfhwJ.js +0 -1
- package/dist/cli/chunk-BtJYj7vB.js +0 -1
- package/dist/cli/chunk-BwXrZVeU.js +0 -1
- package/dist/cli/chunk-CaWh9Pru.js +0 -1
- package/dist/cli/chunk-Ck4ePI8z.js +0 -1
- package/dist/cli/chunk-Ctg-SXcP.js +0 -1
- package/dist/cli/chunk-DTKv1-tk.js +0 -1
- package/dist/cli/chunk-DdYpd9Nu.js +0 -1
- package/dist/cli/chunk-DflhmBY2.js +0 -1
- package/dist/lib/config-DxDaVDTn.js.map +0 -1
- package/dist/lib/model-ranking-CDXs7hkK.js +0 -57
- package/dist/lib/model-ranking-CDXs7hkK.js.map +0 -1
- package/dist/lib/shadow-claw-chat-D69IiLXd.js.map +0 -1
- package/dist/lib/shadow-claw-llm-AJwzkOGo.js.map +0 -1
- package/dist/public/config-Dqn5OMfC.js +0 -1
- package/dist/public/model-ranking-DLIC9IDU.js +0 -1
- package/dist/public/prompt-api-B-8N-MRY.js +0 -11
|
@@ -320,6 +320,41 @@ describe("shadow-claw-llm", () => {
|
|
|
320
320
|
document.body.removeChild(el);
|
|
321
321
|
});
|
|
322
322
|
|
|
323
|
+
it("renders identical top 4 models, hr divider, and alphabetized remainder for transformers_js_browser", async () => {
|
|
324
|
+
const orch = createOrchestratorStub();
|
|
325
|
+
orch.getProvider.mockReturnValue("transformers_js_browser");
|
|
326
|
+
orch.getModel.mockReturnValue("onnx-community/Qwen3-0.6B-ONNX");
|
|
327
|
+
(orchestratorStore as any).orchestrator = orch;
|
|
328
|
+
|
|
329
|
+
const el = new ShadowClawLlm();
|
|
330
|
+
document.body.appendChild(el);
|
|
331
|
+
await new Promise((r) => setTimeout(r, 100));
|
|
332
|
+
await el.render();
|
|
333
|
+
|
|
334
|
+
const modelSelect = el.shadowRoot?.querySelector(
|
|
335
|
+
'[data-setting="model-select"]',
|
|
336
|
+
) as HTMLSelectElement | null;
|
|
337
|
+
expect(modelSelect).not.toBeNull();
|
|
338
|
+
|
|
339
|
+
const html = modelSelect?.innerHTML || "";
|
|
340
|
+
expect(html).toContain('value="onnx-community/Qwen3-0.6B-ONNX"');
|
|
341
|
+
expect(html).toContain('value="onnx-community/gemma-3-1b-it-ONNX-GQA"');
|
|
342
|
+
expect(html).toContain('value="onnx-community/gemma-4-E2B-it-ONNX"');
|
|
343
|
+
expect(html).toContain('value="onnx-community/gemma-4-E4B-it-ONNX"');
|
|
344
|
+
|
|
345
|
+
const idxGemma4E4B = html.indexOf(
|
|
346
|
+
'value="onnx-community/gemma-4-E4B-it-ONNX"',
|
|
347
|
+
);
|
|
348
|
+
const idxHr = html.indexOf("<hr>");
|
|
349
|
+
const idxXenova = html.indexOf('value="Xenova/distilgpt2"');
|
|
350
|
+
|
|
351
|
+
expect(idxHr).toBeGreaterThan(idxGemma4E4B);
|
|
352
|
+
expect(idxHr).toBeLessThan(idxXenova);
|
|
353
|
+
expect(html).toContain('value="__custom__"');
|
|
354
|
+
|
|
355
|
+
document.body.removeChild(el);
|
|
356
|
+
});
|
|
357
|
+
|
|
323
358
|
it("saves max tokens from settings", async () => {
|
|
324
359
|
const orch = createOrchestratorStub();
|
|
325
360
|
(orchestratorStore as any).orchestrator = orch;
|
|
@@ -28,7 +28,9 @@ import {
|
|
|
28
28
|
|
|
29
29
|
import {
|
|
30
30
|
compareLocalModelCandidates,
|
|
31
|
+
getSortedTransformersJsBrowserModelIds,
|
|
31
32
|
isLikelyInstructionModelId,
|
|
33
|
+
renderTransformersJsBrowserModelOptions,
|
|
32
34
|
} from "./model-ranking.js";
|
|
33
35
|
|
|
34
36
|
import {
|
|
@@ -921,7 +923,13 @@ export class ShadowClawLlm extends ShadowClawElement {
|
|
|
921
923
|
};
|
|
922
924
|
|
|
923
925
|
let html = "";
|
|
924
|
-
if (
|
|
926
|
+
if (currentProvider === "transformers_js_browser") {
|
|
927
|
+
html = renderTransformersJsBrowserModelOptions(
|
|
928
|
+
currentModel,
|
|
929
|
+
modelItems,
|
|
930
|
+
{ includeCustom: true },
|
|
931
|
+
);
|
|
932
|
+
} else if (localOnlyProviderIds.has(currentProvider)) {
|
|
925
933
|
const localModels = [...freeModels, ...paidModels].sort(
|
|
926
934
|
modelComparator,
|
|
927
935
|
);
|
|
@@ -934,6 +942,7 @@ export class ShadowClawLlm extends ShadowClawElement {
|
|
|
934
942
|
html += localModels.map(toOption).join("");
|
|
935
943
|
html += `</optgroup>`;
|
|
936
944
|
}
|
|
945
|
+
html += `<option value="__custom__">-- Custom Model ID --</option>`;
|
|
937
946
|
} else {
|
|
938
947
|
if (freeModels.length > 0) {
|
|
939
948
|
html += `<optgroup label="Free / Included">`;
|
|
@@ -946,15 +955,16 @@ export class ShadowClawLlm extends ShadowClawElement {
|
|
|
946
955
|
html += paidModels.map(toOption).join("");
|
|
947
956
|
html += `</optgroup>`;
|
|
948
957
|
}
|
|
958
|
+
html += `<option value="__custom__">-- Custom Model ID --</option>`;
|
|
949
959
|
}
|
|
950
960
|
|
|
951
|
-
html += `<option value="__custom__">-- Custom Model ID --</option>`;
|
|
952
961
|
setSanitizedHtml(modelSelect, html);
|
|
953
962
|
|
|
954
963
|
// Check if current model exists in the list
|
|
955
|
-
const allModelIds =
|
|
956
|
-
|
|
957
|
-
|
|
964
|
+
const allModelIds =
|
|
965
|
+
currentProvider === "transformers_js_browser"
|
|
966
|
+
? getSortedTransformersJsBrowserModelIds(modelItems)
|
|
967
|
+
: modelItems.map((m) => (typeof m === "string" ? m : m.id || m.name));
|
|
958
968
|
|
|
959
969
|
if (allModelIds.includes(currentModel)) {
|
|
960
970
|
modelSelect.value = currentModel;
|
|
@@ -153,14 +153,14 @@
|
|
|
153
153
|
|
|
154
154
|
<shadow-claw-dialog
|
|
155
155
|
dialog-class="chat__prompt-api-dialog"
|
|
156
|
-
dialog-aria-label="
|
|
156
|
+
dialog-aria-label="Local AI Onboarding"
|
|
157
157
|
>
|
|
158
158
|
<form class="chat__prompt-api-form" method="dialog">
|
|
159
159
|
<div class="chat__prompt-api-header">
|
|
160
160
|
<div class="chat__prompt-api-icon" aria-hidden="true">✨</div>
|
|
161
161
|
<div>
|
|
162
162
|
<h3 class="chat__prompt-api-title">
|
|
163
|
-
Welcome to Local AI (
|
|
163
|
+
Welcome to Local AI (Transformers.js)
|
|
164
164
|
</h3>
|
|
165
165
|
<p class="chat__prompt-api-subtitle">
|
|
166
166
|
On-device intelligence built directly into your browser.
|
|
@@ -172,13 +172,16 @@
|
|
|
172
172
|
<section class="chat__prompt-api-card">
|
|
173
173
|
<h4>🔒 100% On-Device</h4>
|
|
174
174
|
<p>
|
|
175
|
-
ShadowClaw defaults to
|
|
176
|
-
<strong>
|
|
175
|
+
ShadowClaw defaults to
|
|
176
|
+
<strong>Transformers.js</strong>. Models execute directly on your
|
|
177
177
|
hardware with no API keys and no subscription costs.
|
|
178
178
|
</p>
|
|
179
179
|
</section>
|
|
180
180
|
|
|
181
|
-
<section
|
|
181
|
+
<section
|
|
182
|
+
class="chat__prompt-api-card chat__prompt-api-status-card"
|
|
183
|
+
hidden
|
|
184
|
+
>
|
|
182
185
|
<h4>🌐 Browser Capabilities</h4>
|
|
183
186
|
<div
|
|
184
187
|
class="chat__prompt-api-status-content"
|
|
@@ -199,11 +202,10 @@
|
|
|
199
202
|
</section>
|
|
200
203
|
|
|
201
204
|
<section class="chat__prompt-api-card chat__prompt-api-fallback-card">
|
|
202
|
-
<h4>⚙️ Default
|
|
205
|
+
<h4>⚙️ Default Transformers.js Model</h4>
|
|
203
206
|
<p class="chat__prompt-api-model-desc">
|
|
204
|
-
Choose your default
|
|
205
|
-
|
|
206
|
-
directly in the browser:
|
|
207
|
+
Choose your default Transformers.js model. ShadowClaw will run
|
|
208
|
+
this local model directly in the browser:
|
|
207
209
|
</p>
|
|
208
210
|
<div class="chat__prompt-api-select-group">
|
|
209
211
|
<label class="form-label" for="prompt-api-fallback-model-select"
|
|
@@ -230,6 +232,71 @@
|
|
|
230
232
|
onnx-community/gemma-4-E4B-it-ONNX — Alternative (4B
|
|
231
233
|
Parameters, 128k Context)
|
|
232
234
|
</option>
|
|
235
|
+
<hr />
|
|
236
|
+
<option value="HuggingFaceTB/SmolLM3-3B-ONNX">
|
|
237
|
+
HuggingFaceTB/SmolLM3-3B-ONNX
|
|
238
|
+
</option>
|
|
239
|
+
<option value="LiquidAI/LFM2.5-1.2B-Thinking-ONNX">
|
|
240
|
+
LiquidAI/LFM2.5-1.2B-Thinking-ONNX 🛠️
|
|
241
|
+
</option>
|
|
242
|
+
<option
|
|
243
|
+
value="onnx-community/DeepSeek-R1-Distill-Qwen-1.5B-ONNX"
|
|
244
|
+
>
|
|
245
|
+
onnx-community/DeepSeek-R1-Distill-Qwen-1.5B-ONNX
|
|
246
|
+
🛠️
|
|
247
|
+
</option>
|
|
248
|
+
<option value="onnx-community/LFM2-1.2B-ONNX">
|
|
249
|
+
onnx-community/LFM2-1.2B-ONNX
|
|
250
|
+
</option>
|
|
251
|
+
<option value="onnx-community/Llama-3.2-1B-Instruct-ONNX">
|
|
252
|
+
onnx-community/Llama-3.2-1B-Instruct-ONNX 🛠️
|
|
253
|
+
</option>
|
|
254
|
+
<option value="onnx-community/Llama-3.2-3B-Instruct-ONNX">
|
|
255
|
+
onnx-community/Llama-3.2-3B-Instruct-ONNX 🛠️
|
|
256
|
+
</option>
|
|
257
|
+
<option value="onnx-community/Phi-3.5-mini-instruct-onnx-web">
|
|
258
|
+
onnx-community/Phi-3.5-mini-instruct-onnx-web
|
|
259
|
+
🛠️
|
|
260
|
+
</option>
|
|
261
|
+
<option value="onnx-community/Phi-4-mini-instruct-ONNX">
|
|
262
|
+
onnx-community/Phi-4-mini-instruct-ONNX 🛠️
|
|
263
|
+
</option>
|
|
264
|
+
<option value="onnx-community/Qwen3.5-0.8B-ONNX-OPT">
|
|
265
|
+
onnx-community/Qwen3.5-0.8B-ONNX-OPT
|
|
266
|
+
</option>
|
|
267
|
+
<option value="onnx-community/Qwen3.5-4B-ONNX-OPT">
|
|
268
|
+
onnx-community/Qwen3.5-4B-ONNX-OPT
|
|
269
|
+
</option>
|
|
270
|
+
<option value="onnx-community/gemma-3-1b-it-ONNX">
|
|
271
|
+
onnx-community/gemma-3-1b-it-ONNX 🛠️
|
|
272
|
+
</option>
|
|
273
|
+
<option value="onnx-community/gemma-4-12B-it-ONNX">
|
|
274
|
+
onnx-community/gemma-4-12B-it-ONNX 🛠️
|
|
275
|
+
</option>
|
|
276
|
+
<option value="onnx-community/gemma-4-12B-it-qat-mobile-ONNX">
|
|
277
|
+
onnx-community/gemma-4-12B-it-qat-mobile-ONNX
|
|
278
|
+
🛠️
|
|
279
|
+
</option>
|
|
280
|
+
<option value="onnx-community/gemma-4-E27B-it-ONNX">
|
|
281
|
+
onnx-community/gemma-4-E27B-it-ONNX 🛠️
|
|
282
|
+
</option>
|
|
283
|
+
<option value="onnx-community/gemma-4-E2B-it-qat-mobile-ONNX">
|
|
284
|
+
onnx-community/gemma-4-E2B-it-qat-mobile-ONNX
|
|
285
|
+
🛠️
|
|
286
|
+
</option>
|
|
287
|
+
<option value="onnx-community/gemma-4-E4B-it-qat-mobile-ONNX">
|
|
288
|
+
onnx-community/gemma-4-E4B-it-qat-mobile-ONNX
|
|
289
|
+
🛠️
|
|
290
|
+
</option>
|
|
291
|
+
<option value="onnx-community/gemma-4-E9B-it-ONNX">
|
|
292
|
+
onnx-community/gemma-4-E9B-it-ONNX 🛠️
|
|
293
|
+
</option>
|
|
294
|
+
<option value="onnx-community/gpt-oss-20b-ONNX">
|
|
295
|
+
onnx-community/gpt-oss-20b-ONNX
|
|
296
|
+
</option>
|
|
297
|
+
<option value="webgpu/Qwen3-4B-ONNX">
|
|
298
|
+
webgpu/Qwen3-4B-ONNX
|
|
299
|
+
</option>
|
|
233
300
|
</select>
|
|
234
301
|
</div>
|
|
235
302
|
</section>
|
|
@@ -237,10 +304,10 @@
|
|
|
237
304
|
<section class="chat__prompt-api-card">
|
|
238
305
|
<h4>🌐 Prefer Cloud AI or Another Provider?</h4>
|
|
239
306
|
<p>
|
|
240
|
-
Local AI with
|
|
241
|
-
option. ShadowClaw also supports OpenRouter, Anthropic,
|
|
242
|
-
Google Gemini, and AWS Bedrock. You can configure any
|
|
243
|
-
any time in Settings.
|
|
307
|
+
Local AI with Transformers.js is free and private, but not your
|
|
308
|
+
only option. ShadowClaw also supports OpenRouter, Anthropic,
|
|
309
|
+
OpenAI, Google Gemini, and AWS Bedrock. You can configure any
|
|
310
|
+
provider at any time in Settings.
|
|
244
311
|
</p>
|
|
245
312
|
</section>
|
|
246
313
|
</div>
|
|
@@ -258,7 +325,7 @@
|
|
|
258
325
|
class="chat__prompt-api-confirm-btn"
|
|
259
326
|
data-action="confirm-prompt-api-onboarding"
|
|
260
327
|
>
|
|
261
|
-
Continue with
|
|
328
|
+
Continue with Transformers.js
|
|
262
329
|
</button>
|
|
263
330
|
</div>
|
|
264
331
|
</form>
|
|
@@ -415,6 +415,15 @@ describe("shadow-claw-chat UX enhancements (issue #10)", () => {
|
|
|
415
415
|
'value="onnx-community/gemma-4-E4B-it-ONNX"',
|
|
416
416
|
);
|
|
417
417
|
});
|
|
418
|
+
|
|
419
|
+
it("should reword onboarding dialog to Transformers.js and local AI", () => {
|
|
420
|
+
expect(templateHtml).toContain("Welcome to Local AI (Transformers.js)");
|
|
421
|
+
expect(templateHtml).toContain("Continue with Transformers.js");
|
|
422
|
+
expect(templateHtml).toContain("ShadowClaw defaults to");
|
|
423
|
+
expect(templateHtml).toContain("Transformers.js");
|
|
424
|
+
expect(templateHtml).not.toContain("Welcome to Local AI (Prompt API)");
|
|
425
|
+
expect(templateHtml).not.toContain("Continue with Prompt API");
|
|
426
|
+
});
|
|
418
427
|
});
|
|
419
428
|
|
|
420
429
|
describe("AUTO_SCROLL_THRESHOLD constant", () => {
|
|
@@ -1355,6 +1364,9 @@ describe("shadow-claw-chat prompt api onboarding", () => {
|
|
|
1355
1364
|
expect(storedConfig["prompt_api_fallback_model"]).toBe(
|
|
1356
1365
|
"onnx-community/Qwen3-0.6B-ONNX",
|
|
1357
1366
|
);
|
|
1367
|
+
expect(storedConfig["provider"]).toBe("transformers_js_browser");
|
|
1368
|
+
expect(storedConfig["model"]).toBe("onnx-community/Qwen3-0.6B-ONNX");
|
|
1369
|
+
expect(storedConfig["transformers_js_onboarding_seen"]).toBe("true");
|
|
1358
1370
|
expect(storedConfig["prompt_api_onboarding_seen"]).toBe("true");
|
|
1359
1371
|
expect(mockDialog.close).toHaveBeenCalledTimes(1);
|
|
1360
1372
|
});
|
|
@@ -1433,6 +1445,67 @@ describe("shadow-claw-chat prompt api onboarding", () => {
|
|
|
1433
1445
|
}
|
|
1434
1446
|
});
|
|
1435
1447
|
|
|
1448
|
+
it("should populate onboarding model select with top 4 prompt api models and alphabetized remainder", () => {
|
|
1449
|
+
const instance = Object.create(ShadowClawChat.prototype);
|
|
1450
|
+
const mockSelectEl: any = {
|
|
1451
|
+
innerHTML: "",
|
|
1452
|
+
value: "",
|
|
1453
|
+
};
|
|
1454
|
+
|
|
1455
|
+
instance.populateOnboardingModelSelect(
|
|
1456
|
+
mockSelectEl,
|
|
1457
|
+
"onnx-community/Qwen3-0.6B-ONNX",
|
|
1458
|
+
);
|
|
1459
|
+
|
|
1460
|
+
expect(mockSelectEl.value).toBe("onnx-community/Qwen3-0.6B-ONNX");
|
|
1461
|
+
// Ensure top 4 models are rendered
|
|
1462
|
+
expect(mockSelectEl.innerHTML).toContain(
|
|
1463
|
+
'value="onnx-community/Qwen3-0.6B-ONNX"',
|
|
1464
|
+
);
|
|
1465
|
+
expect(mockSelectEl.innerHTML).toContain(
|
|
1466
|
+
'value="onnx-community/gemma-3-1b-it-ONNX-GQA"',
|
|
1467
|
+
);
|
|
1468
|
+
expect(mockSelectEl.innerHTML).toContain(
|
|
1469
|
+
'value="onnx-community/gemma-4-E2B-it-ONNX"',
|
|
1470
|
+
);
|
|
1471
|
+
expect(mockSelectEl.innerHTML).toContain(
|
|
1472
|
+
'value="onnx-community/gemma-4-E4B-it-ONNX"',
|
|
1473
|
+
);
|
|
1474
|
+
// Ensure remainder models are present
|
|
1475
|
+
expect(mockSelectEl.innerHTML).toContain(
|
|
1476
|
+
'value="HuggingFaceTB/SmolLM3-3B-ONNX"',
|
|
1477
|
+
);
|
|
1478
|
+
expect(mockSelectEl.innerHTML).toContain('value="webgpu/Qwen3-4B-ONNX"');
|
|
1479
|
+
|
|
1480
|
+
// Verify ordering in rendered HTML
|
|
1481
|
+
const idxQwen3 = mockSelectEl.innerHTML.indexOf(
|
|
1482
|
+
'value="onnx-community/Qwen3-0.6B-ONNX"',
|
|
1483
|
+
);
|
|
1484
|
+
const idxGemma3 = mockSelectEl.innerHTML.indexOf(
|
|
1485
|
+
'value="onnx-community/gemma-3-1b-it-ONNX-GQA"',
|
|
1486
|
+
);
|
|
1487
|
+
const idxGemma4E2B = mockSelectEl.innerHTML.indexOf(
|
|
1488
|
+
'value="onnx-community/gemma-4-E2B-it-ONNX"',
|
|
1489
|
+
);
|
|
1490
|
+
const idxGemma4E4B = mockSelectEl.innerHTML.indexOf(
|
|
1491
|
+
'value="onnx-community/gemma-4-E4B-it-ONNX"',
|
|
1492
|
+
);
|
|
1493
|
+
const idxSmol = mockSelectEl.innerHTML.indexOf(
|
|
1494
|
+
'value="HuggingFaceTB/SmolLM3-3B-ONNX"',
|
|
1495
|
+
);
|
|
1496
|
+
const idxWebgpu = mockSelectEl.innerHTML.indexOf(
|
|
1497
|
+
'value="webgpu/Qwen3-4B-ONNX"',
|
|
1498
|
+
);
|
|
1499
|
+
|
|
1500
|
+
expect(idxQwen3).toBeLessThan(idxGemma3);
|
|
1501
|
+
expect(idxGemma3).toBeLessThan(idxGemma4E2B);
|
|
1502
|
+
expect(idxGemma4E2B).toBeLessThan(idxGemma4E4B);
|
|
1503
|
+
const idxHr = mockSelectEl.innerHTML.indexOf("<hr>");
|
|
1504
|
+
expect(idxHr).toBeGreaterThan(idxGemma4E4B);
|
|
1505
|
+
expect(idxHr).toBeLessThan(idxSmol);
|
|
1506
|
+
expect(idxSmol).toBeLessThan(idxWebgpu);
|
|
1507
|
+
});
|
|
1508
|
+
|
|
1436
1509
|
describe("ShadowClawChat helper methods", () => {
|
|
1437
1510
|
let instance: any;
|
|
1438
1511
|
|
|
@@ -108,6 +108,9 @@ jest.unstable_mockModule("../../utils/utils.js", () => ({
|
|
|
108
108
|
formatTimestamp: jest.fn(() => "now"),
|
|
109
109
|
handleSpecialLinkNavigation: jest.fn(() => false),
|
|
110
110
|
computeSha256: jest.fn(async (_: ArrayBuffer) => "mock-hash"),
|
|
111
|
+
escapeHtml: jest.fn((text: string) => text.replace(/</g, "<")),
|
|
112
|
+
sanitizeGroupId: jest.fn((id: string) => id.replace(/[^a-zA-Z0-9-]/g, "-")),
|
|
113
|
+
sanitizeHtml: jest.fn((html: string) => html),
|
|
111
114
|
}));
|
|
112
115
|
|
|
113
116
|
jest.unstable_mockModule(
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
CONFIG_KEYS,
|
|
6
6
|
DEFAULT_PROMPT_API_FALLBACK_MODEL,
|
|
7
7
|
DEFAULT_PROVIDER,
|
|
8
|
+
PROVIDERS,
|
|
8
9
|
} from "../../config/config.js";
|
|
9
10
|
import { decodePathSegment } from "../../core/app-routes.js";
|
|
10
11
|
|
|
@@ -64,10 +65,7 @@ import {
|
|
|
64
65
|
handleSpecialLinkNavigation,
|
|
65
66
|
} from "../../utils/utils.js";
|
|
66
67
|
import { isTruthyConfigValue } from "../../utils/parseBooleanConfig.js";
|
|
67
|
-
import {
|
|
68
|
-
isNativePromptApiAvailable,
|
|
69
|
-
renderPromptApiStatusHtml,
|
|
70
|
-
} from "../common/help/prompt-api.js";
|
|
68
|
+
import { renderTransformersJsBrowserModelOptions } from "../settings/shadow-claw-llm/model-ranking.js";
|
|
71
69
|
|
|
72
70
|
import { computeTokenDisplayValues } from "./utils/computeTokenDisplayValues.js";
|
|
73
71
|
import { escapeHtml } from "./utils/escapeHtml.js";
|
|
@@ -1979,6 +1977,11 @@ export class ShadowClawChat extends ShadowClawElement {
|
|
|
1979
1977
|
|
|
1980
1978
|
if (this.db) {
|
|
1981
1979
|
try {
|
|
1980
|
+
await setConfig(
|
|
1981
|
+
this.db,
|
|
1982
|
+
CONFIG_KEYS.TRANSFORMERS_JS_ONBOARDING_SEEN,
|
|
1983
|
+
"true",
|
|
1984
|
+
);
|
|
1982
1985
|
await setConfig(
|
|
1983
1986
|
this.db,
|
|
1984
1987
|
CONFIG_KEYS.PROMPT_API_ONBOARDING_SEEN,
|
|
@@ -2031,14 +2034,16 @@ export class ShadowClawChat extends ShadowClawElement {
|
|
|
2031
2034
|
typeof provider === "string" && provider.trim()
|
|
2032
2035
|
? provider.trim()
|
|
2033
2036
|
: DEFAULT_PROVIDER;
|
|
2034
|
-
if (effectiveProvider !== "
|
|
2037
|
+
if (effectiveProvider !== "transformers_js_browser") {
|
|
2035
2038
|
return;
|
|
2036
2039
|
}
|
|
2037
2040
|
|
|
2038
|
-
const seen =
|
|
2039
|
-
|
|
2040
|
-
|
|
2041
|
-
|
|
2041
|
+
const seen =
|
|
2042
|
+
(await getConfig(
|
|
2043
|
+
this.db,
|
|
2044
|
+
CONFIG_KEYS.TRANSFORMERS_JS_ONBOARDING_SEEN,
|
|
2045
|
+
)) ||
|
|
2046
|
+
(await getConfig(this.db, CONFIG_KEYS.PROMPT_API_ONBOARDING_SEEN));
|
|
2042
2047
|
if (isTruthyConfigValue(seen, false)) {
|
|
2043
2048
|
return;
|
|
2044
2049
|
}
|
|
@@ -2050,42 +2055,53 @@ export class ShadowClawChat extends ShadowClawElement {
|
|
|
2050
2055
|
|
|
2051
2056
|
this.ensureShadowDialogs();
|
|
2052
2057
|
|
|
2053
|
-
const isNativeSupported = await isNativePromptApiAvailable();
|
|
2054
|
-
const isAvailable = isNativeSupported;
|
|
2055
|
-
|
|
2056
2058
|
const statusCard = root.querySelector(".chat__prompt-api-status-card");
|
|
2057
2059
|
if (statusCard) {
|
|
2058
|
-
(statusCard as HTMLElement).hidden =
|
|
2059
|
-
}
|
|
2060
|
-
|
|
2061
|
-
const statusEl = root.querySelector('[data-info="prompt-api-status"]');
|
|
2062
|
-
if (statusEl) {
|
|
2063
|
-
setSanitizedHtml(
|
|
2064
|
-
statusEl as HTMLElement,
|
|
2065
|
-
renderPromptApiStatusHtml(isNativeSupported),
|
|
2066
|
-
);
|
|
2060
|
+
(statusCard as HTMLElement).hidden = true;
|
|
2067
2061
|
}
|
|
2068
2062
|
|
|
2069
2063
|
const fallbackCard = root.querySelector(
|
|
2070
2064
|
".chat__prompt-api-fallback-card",
|
|
2071
2065
|
);
|
|
2072
2066
|
if (fallbackCard) {
|
|
2073
|
-
(fallbackCard as HTMLElement).hidden =
|
|
2067
|
+
(fallbackCard as HTMLElement).hidden = false;
|
|
2074
2068
|
}
|
|
2075
2069
|
|
|
2076
2070
|
const modelSelect = root.querySelector(
|
|
2077
2071
|
'[data-setting="prompt-api-onboarding-fallback-model"]',
|
|
2078
2072
|
) as HTMLSelectElement | null;
|
|
2079
2073
|
if (modelSelect) {
|
|
2080
|
-
const
|
|
2081
|
-
this.db,
|
|
2082
|
-
CONFIG_KEYS.PROMPT_API_FALLBACK_MODEL
|
|
2083
|
-
);
|
|
2074
|
+
const storedModel =
|
|
2075
|
+
(await getConfig(this.db, CONFIG_KEYS.MODEL)) ||
|
|
2076
|
+
(await getConfig(this.db, CONFIG_KEYS.PROMPT_API_FALLBACK_MODEL));
|
|
2084
2077
|
const currentModel =
|
|
2085
|
-
typeof
|
|
2086
|
-
?
|
|
2087
|
-
:
|
|
2088
|
-
|
|
2078
|
+
typeof storedModel === "string" && storedModel.trim()
|
|
2079
|
+
? storedModel.trim()
|
|
2080
|
+
: PROVIDERS.transformers_js_browser?.defaultModel ||
|
|
2081
|
+
"onnx-community/Qwen3-0.6B-ONNX";
|
|
2082
|
+
|
|
2083
|
+
this.populateOnboardingModelSelect(modelSelect, currentModel);
|
|
2084
|
+
|
|
2085
|
+
const modelsUrl = PROVIDERS.transformers_js_browser?.modelsUrl;
|
|
2086
|
+
if (modelsUrl && typeof fetch === "function") {
|
|
2087
|
+
fetch(modelsUrl)
|
|
2088
|
+
.then((r) => (r.ok ? r.json() : null))
|
|
2089
|
+
.then((data) => {
|
|
2090
|
+
if (!data) return;
|
|
2091
|
+
const items = Array.isArray(data)
|
|
2092
|
+
? data
|
|
2093
|
+
: data.models || data.data || [];
|
|
2094
|
+
if (Array.isArray(items) && items.length > 0) {
|
|
2095
|
+
const currentSelected = modelSelect.value || currentModel;
|
|
2096
|
+
this.populateOnboardingModelSelect(
|
|
2097
|
+
modelSelect,
|
|
2098
|
+
currentSelected,
|
|
2099
|
+
items,
|
|
2100
|
+
);
|
|
2101
|
+
}
|
|
2102
|
+
})
|
|
2103
|
+
.catch(() => {});
|
|
2104
|
+
}
|
|
2089
2105
|
}
|
|
2090
2106
|
|
|
2091
2107
|
const shadowDialog = root.querySelector(
|
|
@@ -2111,6 +2127,19 @@ export class ShadowClawChat extends ShadowClawElement {
|
|
|
2111
2127
|
}
|
|
2112
2128
|
}
|
|
2113
2129
|
|
|
2130
|
+
populateOnboardingModelSelect(
|
|
2131
|
+
modelSelect: HTMLSelectElement,
|
|
2132
|
+
selectedModel: string,
|
|
2133
|
+
modelItems?: any[],
|
|
2134
|
+
): void {
|
|
2135
|
+
const html = renderTransformersJsBrowserModelOptions(
|
|
2136
|
+
selectedModel,
|
|
2137
|
+
modelItems,
|
|
2138
|
+
);
|
|
2139
|
+
setSanitizedHtml(modelSelect, html);
|
|
2140
|
+
modelSelect.value = selectedModel;
|
|
2141
|
+
}
|
|
2142
|
+
|
|
2114
2143
|
async confirmPromptApiOnboarding(): Promise<void> {
|
|
2115
2144
|
const root = this.shadowRoot;
|
|
2116
2145
|
if (!root) {
|
|
@@ -2125,15 +2154,28 @@ export class ShadowClawChat extends ShadowClawElement {
|
|
|
2125
2154
|
'[data-setting="prompt-api-onboarding-fallback-model"]',
|
|
2126
2155
|
) as HTMLSelectElement | null;
|
|
2127
2156
|
const selectedModel =
|
|
2128
|
-
modelSelect?.value?.trim() ||
|
|
2157
|
+
modelSelect?.value?.trim() ||
|
|
2158
|
+
PROVIDERS.transformers_js_browser?.defaultModel ||
|
|
2159
|
+
DEFAULT_PROMPT_API_FALLBACK_MODEL;
|
|
2129
2160
|
|
|
2130
2161
|
if (this.db) {
|
|
2131
2162
|
try {
|
|
2163
|
+
await setConfig(
|
|
2164
|
+
this.db,
|
|
2165
|
+
CONFIG_KEYS.PROVIDER,
|
|
2166
|
+
"transformers_js_browser",
|
|
2167
|
+
);
|
|
2168
|
+
await setConfig(this.db, CONFIG_KEYS.MODEL, selectedModel);
|
|
2132
2169
|
await setConfig(
|
|
2133
2170
|
this.db,
|
|
2134
2171
|
CONFIG_KEYS.PROMPT_API_FALLBACK_MODEL,
|
|
2135
2172
|
selectedModel,
|
|
2136
2173
|
);
|
|
2174
|
+
await setConfig(
|
|
2175
|
+
this.db,
|
|
2176
|
+
CONFIG_KEYS.TRANSFORMERS_JS_ONBOARDING_SEEN,
|
|
2177
|
+
"true",
|
|
2178
|
+
);
|
|
2137
2179
|
await setConfig(
|
|
2138
2180
|
this.db,
|
|
2139
2181
|
CONFIG_KEYS.PROMPT_API_ONBOARDING_SEEN,
|
|
@@ -2144,6 +2186,11 @@ export class ShadowClawChat extends ShadowClawElement {
|
|
|
2144
2186
|
}
|
|
2145
2187
|
}
|
|
2146
2188
|
|
|
2189
|
+
if (orchestratorStore.orchestrator) {
|
|
2190
|
+
orchestratorStore.orchestrator.provider = "transformers_js_browser";
|
|
2191
|
+
orchestratorStore.orchestrator.model = selectedModel;
|
|
2192
|
+
}
|
|
2193
|
+
|
|
2147
2194
|
const shadowDialog = root.querySelector(
|
|
2148
2195
|
'shadow-claw-dialog[dialog-class="chat__prompt-api-dialog"]',
|
|
2149
2196
|
);
|
|
@@ -2156,7 +2203,7 @@ export class ShadowClawChat extends ShadowClawElement {
|
|
|
2156
2203
|
}
|
|
2157
2204
|
}
|
|
2158
2205
|
|
|
2159
|
-
showSuccess("
|
|
2206
|
+
showSuccess("Transformers.js configured", 2500);
|
|
2160
2207
|
}
|
|
2161
2208
|
|
|
2162
2209
|
async downloadAttachment(groupId: string, attachment: MessageAttachment) {
|
|
@@ -67,7 +67,7 @@ describe("config.js", () => {
|
|
|
67
67
|
});
|
|
68
68
|
|
|
69
69
|
it("should have valid DEFAULT_PROVIDER", () => {
|
|
70
|
-
expect(DEFAULT_PROVIDER).toBe("
|
|
70
|
+
expect(DEFAULT_PROVIDER).toBe("transformers_js_browser");
|
|
71
71
|
});
|
|
72
72
|
|
|
73
73
|
it("should have valid SCHEDULER_INTERVAL", () => {
|
|
@@ -561,10 +561,10 @@ describe("config.js", () => {
|
|
|
561
561
|
expect(provider.id).toBe(DEFAULT_PROVIDER);
|
|
562
562
|
});
|
|
563
563
|
|
|
564
|
-
it("default provider should be valid
|
|
564
|
+
it("default provider should be valid transformers_js_browser config", () => {
|
|
565
565
|
const provider = getDefaultProvider();
|
|
566
|
-
expect(provider.name).toBe("
|
|
567
|
-
expect(provider.format).toBe("
|
|
566
|
+
expect(provider.name).toBe("Transformers.js (Browser)");
|
|
567
|
+
expect(provider.format).toBe("transformers_js");
|
|
568
568
|
});
|
|
569
569
|
});
|
|
570
570
|
|
package/src/config/config.ts
CHANGED
|
@@ -191,7 +191,7 @@ export function getModelMaxTokens(modelId: string): number {
|
|
|
191
191
|
}
|
|
192
192
|
|
|
193
193
|
/** Default provider */
|
|
194
|
-
export const DEFAULT_PROVIDER = "
|
|
194
|
+
export const DEFAULT_PROVIDER = "transformers_js_browser";
|
|
195
195
|
|
|
196
196
|
/** Task scheduler check interval (ms) */
|
|
197
197
|
export const SCHEDULER_INTERVAL = 60_000;
|
|
@@ -1129,6 +1129,7 @@ export const CONFIG_KEYS = {
|
|
|
1129
1129
|
PROMPT_API_DTYPE_STRATEGY: "prompt_api_dtype_strategy",
|
|
1130
1130
|
PROMPT_API_FALLBACK_MODEL: "prompt_api_fallback_model",
|
|
1131
1131
|
PROMPT_API_ONBOARDING_SEEN: "prompt_api_onboarding_seen",
|
|
1132
|
+
TRANSFORMERS_JS_ONBOARDING_SEEN: "transformers_js_onboarding_seen",
|
|
1132
1133
|
PEERJS_MY_ALIAS: "peerjs_my_alias",
|
|
1133
1134
|
PEERJS_MY_PEER_ID: "peerjs_my_peer_id",
|
|
1134
1135
|
PEERJS_PEER_ALIASES: "peerjs_peer_aliases",
|
|
@@ -1554,7 +1554,7 @@ describe("Orchestrator", () => {
|
|
|
1554
1554
|
trustedPeerIds: [],
|
|
1555
1555
|
});
|
|
1556
1556
|
|
|
1557
|
-
expect(o.provider).toBe("
|
|
1557
|
+
expect(o.provider).toBe("transformers_js_browser");
|
|
1558
1558
|
expect(o.proxyUrl).toBe("/proxy");
|
|
1559
1559
|
|
|
1560
1560
|
expect(o.rateLimitAutoAdapt).toBe(true);
|
|
@@ -2424,6 +2424,7 @@ describe("Orchestrator", () => {
|
|
|
2424
2424
|
|
|
2425
2425
|
// Active request restarted
|
|
2426
2426
|
o.state = "thinking";
|
|
2427
|
+
o.provider = "prompt_api";
|
|
2427
2428
|
o.inFlightTriggerByGroup.set("g-restart", "Original prompt");
|
|
2428
2429
|
o.agentWorker = {
|
|
2429
2430
|
postMessage: jest.fn(),
|
|
@@ -291,11 +291,12 @@ export async function initProviderAndModel(
|
|
|
291
291
|
getConfig(db, CONFIG_KEYS.RATE_LIMIT_AUTO_ADAPT),
|
|
292
292
|
]);
|
|
293
293
|
|
|
294
|
-
const
|
|
295
|
-
|
|
294
|
+
const effectiveProvider = storedProvider || orchestrator.provider;
|
|
295
|
+
const matchedProvider = effectiveProvider
|
|
296
|
+
? getProvider(effectiveProvider)
|
|
296
297
|
: undefined;
|
|
297
|
-
if (
|
|
298
|
-
orchestrator.provider =
|
|
298
|
+
if (matchedProvider) {
|
|
299
|
+
orchestrator.provider = effectiveProvider;
|
|
299
300
|
orchestrator.providerConfig = matchedProvider;
|
|
300
301
|
}
|
|
301
302
|
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{r as orchestratorStore}from"./chunk-DVMcK7g6.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{t as fetchDiscoveryManifest}from"./chunk-D702W_Ry.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{n as runWebRtcListenCommand}from"./chunk-BQveaAaD.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{t as resolveAgentProvider,s as runAgentRun}from"./chunk-CegcvNc9.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{t as getAgentCore}from"./chunk-khr7--yI.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{t as importRemoteArtifacts}from"./chunk-mbFAP9Ev.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{n as runWebRtcListenCommand}from"./chunk-aJ6fufe-.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{r as orchestratorStore}from"./chunk-4CZJpLqA.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{a as getMemoryOpfsRoot}from"./chunk-D7bFIUK3.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{t as fetchDiscoveryManifest}from"./chunk-D-iqEY5G.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{t as getAgentCore}from"./chunk-BU8UG4L_.js";
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export{t as importRemoteArtifacts}from"./chunk-BT_C3OlA.js";
|