@raingor/pi-web-switch 0.3.3 → 0.4.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +17 -1
- package/README.md +17 -1
- package/README.zh-CN.md +17 -1
- package/package.json +49 -3
- package/public/apple-touch-icon.png +0 -0
- package/public/icon-192.png +0 -0
- package/public/icon-512.png +0 -0
- package/public/pi.svg +47 -4
- package/public/sw.js +28 -5
- package/server/agent-session-manager.ts +827 -0
- package/server/chat-api-plugin.ts +488 -0
- package/server/pi-reader.ts +441 -71
- package/src/App.tsx +2 -0
- package/src/components/chat/ChatInput.tsx +863 -0
- package/src/components/chat/ChatPage.tsx +617 -0
- package/src/components/chat/ChatWindow.tsx +338 -0
- package/src/components/chat/MessageView.tsx +595 -0
- package/src/components/dashboard/DashboardPage.tsx +45 -5
- package/src/components/layout/AppShell.tsx +12 -5
- package/src/components/layout/Sidebar.tsx +3 -5
- package/src/components/providers/ProvidersModelsPage.tsx +768 -146
- package/src/components/sessions/SessionsPage.tsx +466 -148
- package/src/components/settings/SettingsPage.tsx +74 -55
- package/src/data/builtin-providers.ts +7 -7
- package/src/data/model-catalog.ts +967 -0
- package/src/hooks/useAgentSession.ts +1104 -0
- package/src/index.css +29 -1
- package/src/lib/config.ts +61 -0
- package/src/lib/translations/en.ts +99 -0
- package/src/lib/translations/ja.ts +99 -0
- package/src/lib/translations/zh-CN.ts +99 -0
- package/src/lib/translations/zh-TW.ts +99 -0
- package/src/main.tsx +13 -2
- package/src/store/config-store.ts +78 -21
- package/src/types/chat.ts +217 -0
- package/tsconfig.json +1 -1
- package/vite.config.ts +150 -1
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-1-1785132166652.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-1-1785291744290.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-1-1785291756870.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-1-1785293871314.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-10-1785297139944.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-2-1785132240502.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-2-1785132249748.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-2-1785294992352.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-2-1785295104532.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-2-1785295132507.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-3-1785132387218.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-4-1785295319523.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-4-1785295349664.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-4-1785295399600.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-5-1785295450850.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-5-1785295487872.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-5-1785295562600.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-5-1785295761054.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-5-1785295840175.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-6-1785295915007.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-6-1785296069913.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-7-1785296128252.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-9-1785297091531.png +0 -0
- package/.pi/.pi-puppeteer/artifacts/screenshots/session-9-1785297116790.png +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/ActorSafetyLists/9.5220.3721/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/ActorSafetyLists/9.5220.3721/listdata.json +0 -91946
- package/.pi/.pi-puppeteer/profiles/chrome/default/ActorSafetyLists/9.5220.3721/manifest.json +0 -5
- package/.pi/.pi-puppeteer/profiles/chrome/default/AmountExtractionHeuristicRegexes/4/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/AmountExtractionHeuristicRegexes/4/heuristic_regexes.binarypb +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/AmountExtractionHeuristicRegexes/4/manifest.json +0 -5
- package/.pi/.pi-puppeteer/profiles/chrome/default/BrowserMetrics/BrowserMetrics-6A6978EB-A861.pma +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/BrowserMetrics-spare.pma +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/CaptchaProviders/8.5419.4434/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/CaptchaProviders/8.5419.4434/captcha_providers.json +0 -12
- package/.pi/.pi-puppeteer/profiles/chrome/default/CaptchaProviders/8.5419.4434/manifest.json +0 -5
- package/.pi/.pi-puppeteer/profiles/chrome/default/CertificateRevocation/10680/LICENSE +0 -27
- package/.pi/.pi-puppeteer/profiles/chrome/default/CertificateRevocation/10680/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/CertificateRevocation/10680/crl-set +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/CertificateRevocation/10680/manifest.json +0 -5
- package/.pi/.pi-puppeteer/profiles/chrome/default/ChromeFeatureState +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Consent To Send Stats +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Crowd Deny/2026.7.27.84/Preload Data +0 -24078
- package/.pi/.pi-puppeteer/profiles/chrome/default/Crowd Deny/2026.7.27.84/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Crowd Deny/2026.7.27.84/manifest.json +0 -6
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/.com.google.Chrome.Hbf1ld +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Account Web Data +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Account Web Data-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Affiliation Database +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Affiliation Database-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/AutofillAiModelCache/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/AutofillAiModelCache/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/AutofillAiModelCache/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/AutofillStrikeDatabase/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/AutofillStrikeDatabase/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/AutofillStrikeDatabase/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/BookmarkMergedSurfaceOrdering +0 -2
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/BudgetDatabase/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/BudgetDatabase/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/BudgetDatabase/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/003827f5ea5ac9e9_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/00473eec8b9b56d5_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/05a190c784b641e3_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/066df8884be8cf8d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/09627b0809e61f83_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/09b27ac23861b1d7_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/0fd9412b623e5a66_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/118fb0fa2505d3b2_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/1194588b7e2b20e9_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/135a3004445f6f03_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/13f1e7131fe25bc6_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/15a2a5dccd304be7_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/17893ac60e1e94c2_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/19474b63539a4609_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/1a1ecc22219568db_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/1bb0006133ebefa3_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/1cfaeeed4b13a026_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/1e3cf5f23a4de58b_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/20427e8d33888ba3_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/2258d238accf0bfa_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/228c3ad9d63adf48_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/2437d308abe15ac2_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/246f33a252b55bce_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/25862298f2999d7d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/262d9bff9f7f64bb_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/264aad789515de93_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/269ad8897b8e63d0_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/2cd2c50a38161cab_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/2dd4db1365eeeac8_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/2eae0c639fd772df_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/30bb21d39b68bd84_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/31121aeb5ecffa5f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/32766be1527c8e9a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/328e80b1ed10d28d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/339dcbdde8b8ac4e_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/34439c1d4bfc8dad_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/381d5603ee3fd8b9_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/38fbe92680d28074_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/393ce7bb08410970_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/3d74b8be0f86614f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/4016e35a2021656d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/409bcaf42c9c09b4_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/41888ebeeb475a59_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/4714ef11264459f5_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/479d2c4f7d4f3b38_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/4824ea24720f1a77_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/4a73d37e6e4ce922_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/4ecdd068adbdf42a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/54e6cc05346dd07c_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/5505ea174dc90263_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/551679343b836505_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/573f6264a77df462_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/578926a5c39768ed_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/582a8182776d9380_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/5f3aa184b329759d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/6351cd107efed247_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/637516a46d1d8587_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/65e82d9cb58cbd6d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/66d24a1529d6dae0_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/6995a7c799490d3d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/6d10426240c5ff67_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/6dc325603c897784_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/6fbab020dd731222_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/70fa542a6974378a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/72a8c452abd1b0e6_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/72df48e9888c822b_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/73abcb8da3b9f73d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/741e8bcc257a64a9_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/75df0820975fcdfa_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/7789e307be36811d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/79a161a9b2f4a11e_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/7afd0bc7f9852bf0_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/7ce691ce1ceb3b8d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/7ef6780a186001ac_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/80402f00feb6a222_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/85b55ea0ca260643_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/86300205c03092e4_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/87c94a2eac816ea9_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/880c25af3ab59187_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/8a7d0881c813aeec_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/8bad3b1bccd25517_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/8bd9377481fa7d43_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/8c1a58ce19e15d16_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/8e44e385f5911b07_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/90e39d8d065f6ac0_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/93d81321f8c35eab_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/93e9945beb439414_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/944e08f273fccc44_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/95edd63493c49660_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9789c4ee76bdb350_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9a5911308e0f26ad_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9a6cdf8f5c03aee5_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9aeb4a3d1a607b07_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9aff0e1ff1742ee0_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9bdabd2703f2e3ba_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9d4d11ac8a8e264f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9dd169e672e31961_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9e72442bf8821115_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/a330965ccf5564ca_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/a3a3c6351a3f2f42_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/a818977d416f829d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/aa452720fc9d634f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/ac06b722aea9fcb8_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/aca3b8cf1f98e0bb_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/add439b7aae9334a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/b0113626d8ba968d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/ba97b9d927729aa7_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/bfcb9d225e4f11a8_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/c364377515d768e0_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/c4376485fa897eca_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/c5b74f49505d3ecc_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/c7e10eb03f6d5cc2_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/c91efba145098b4c_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/caecbbde37e3c866_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/cdddd64b252697fd_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d3efa3ab37db7796_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d6289ab00fe343c0_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d6be42432091d3ae_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d7137f065f39412f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d83db61c108fa34f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d86cd6e1d99a8eaf_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d97f1cfcc2edd001_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/de620df53673a107_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/de86892a6fa4e33b_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/deb2cfe585bf96b0_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/df93d6767095d5ea_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e1f8d8432edb7ea6_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e2e1058ec6a8e645_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e39ddd81e303f259_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e468a0fb6aa7fd4e_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e46f51470717ac3c_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e4a531774ba47406_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e57a3a1fa60638e1_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e594d414c7f4d6a1_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e771a081db13a5b8_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e78c0ca6dbdafcd0_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e8e671ad5c3fb2a8_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e96e46c4d92b214f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/ea24ade36915d935_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/eaa70273ce58d3b3_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/eca41bfe04d1680d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/ed551f6d52fa6049_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/ee2190fb8068ea31_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/ee688f43baa25b4b_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f016dffa17337f95_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f0707f1f113fa72c_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f12650f2be214ec8_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f1887b75d61dbd90_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f28900863f2e45b7_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f4ee911c81881048_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f557a2bca202c132_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f61ed35c6c0b87d8_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f6f1caefb3e18ade_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/fd695fa621d42490_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/index-dir/the-real-index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/No_Vary_Search/journal.baj +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/No_Vary_Search/snapshot.baf +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/ClientCertificates/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/ClientCertificates/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/ClientCertificates/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/02b3a268866a7a0c_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/0edbc65a5e505019_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/1051d2e224b9dd7a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/13cf7a1704163ded_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/16860cee78cb7179_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/17ea85d6fceb9229_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/1b6c1ba202c59494_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/1ebec9ea59157454_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/1ee2a6b57d251d09_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/2445a9737b996e2a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/2d10a08da99d6d96_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/325c8b935b677e9d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/454c49e6be2650e9_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/4a34df5a255ad22e_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/4dfd5beef212627f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/5fe872a733479fff_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/66943b0755a2799d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/6a1839253b0d0b0a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/6e13894af36f3b79_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/786d3f1f49d31154_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/82f67f35254528ab_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/831e5a135cde918e_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/9965b2c8a33ec50d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/a15b1367fd75ef89_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/a7c7741248aeea07_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/a8e54c52a52541a9_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/afa0d16c75997a6c_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/b35d29b5b3583a88_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/bc55d051b6fd0744_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/bc8566d00f634dfb_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/c0be8aeb35882f7c_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/c771807a395d295c_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/c9058e9015c26dc7_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/d6804628a868f972_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/d7f211a5cec70609_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/d9c03164fc246389_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/e1011bf217f0ad7a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/efd85d739d006527_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/f5fe496bf55cd561_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/fc52f43646894a73_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/fc8954eb9445852d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/ff6de2f37189b29f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/index-dir/the-real-index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/wasm/index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/wasm/index-dir/the-real-index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cookies +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cookies-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DIPS +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnGraphiteCache/data_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnGraphiteCache/data_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnGraphiteCache/data_2 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnGraphiteCache/data_3 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnGraphiteCache/index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnWebGPUCache/data_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnWebGPUCache/data_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnWebGPUCache/data_2 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnWebGPUCache/data_3 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnWebGPUCache/index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Rules/CURRENT +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Rules/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Rules/LOG +0 -2
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Rules/MANIFEST-000001 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Scripts/CURRENT +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Scripts/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Scripts/LOG +0 -2
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Scripts/MANIFEST-000001 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension State/CURRENT +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension State/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension State/LOG +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension State/LOG.old +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension State/MANIFEST-000001 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Favicons +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Favicons-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Feature Engagement Tracker/AvailabilityDB/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Feature Engagement Tracker/AvailabilityDB/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Feature Engagement Tracker/AvailabilityDB/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Feature Engagement Tracker/EventDB/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Feature Engagement Tracker/EventDB/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Feature Engagement Tracker/EventDB/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GCM Store/CURRENT +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GCM Store/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GCM Store/LOG +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GCM Store/LOG.old +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GCM Store/MANIFEST-000001 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GPUCache/data_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GPUCache/data_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GPUCache/data_2 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GPUCache/data_3 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GPUCache/index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/History +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/History-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Local Storage/leveldb/CURRENT +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Local Storage/leveldb/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Local Storage/leveldb/LOG +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Local Storage/leveldb/LOG.old +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Local Storage/leveldb/MANIFEST-000001 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Login Data +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Login Data For Account +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Login Data For Account-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Login Data-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Network Action Predictor +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Network Action Predictor-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Network Persistent State +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/PersistentOriginTrials/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/PersistentOriginTrials/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/PersistentOriginTrials/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Preferences +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/PreferredApps +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/README +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Reporting and NEL +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Reporting and NEL-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Safe Browsing Cookies +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Safe Browsing Cookies-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Secure Preferences +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SegmentInfoDB/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SegmentInfoDB/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SegmentInfoDB/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SignalDB/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SignalDB/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SignalDB/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SignalStorageConfigDB/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SignalStorageConfigDB/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SignalStorageConfigDB/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/ServerCertificate +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/ServerCertificate-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/09ed93488198f423_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/09ed93488198f423_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/0a30220965d74d1e_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/1300177f362c3a4a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/1300177f362c3a4a_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/27b9ccf88365ee26_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/2921673031323747_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/2921673031323747_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/35f037f406300022_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/35f037f406300022_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/3adbee165bfbf214_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/3c8f4750e95148d9_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/3ce96b151d8c7cc1_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/3ce96b151d8c7cc1_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/483d56a1df05215a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/483d56a1df05215a_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/4d82f9d0e0941cce_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/4f42af3671d8c6c6_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/4f42af3671d8c6c6_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5973e266a3773c26_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5ad1663b68163b6f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5b4c15b3725d9989_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5b4c15b3725d9989_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5c619235d9c64bc3_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5c619235d9c64bc3_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5e3af97b8dccb412_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5e3af97b8dccb412_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/6e068fc05df362b0_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/6e068fc05df362b0_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/755a4c7663f8dc02_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/755a4c7663f8dc02_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/7969561312c7823f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/7969561312c7823f_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/79ffa2733a735063_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/7f91cd3066f0019f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/7f91cd3066f0019f_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/7f97d42038a92017_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/7f97d42038a92017_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/820d43cc26b882ff_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/820d43cc26b882ff_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/88e95753fb6f9ea9_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/8b469fd8bafad3b3_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/8b469fd8bafad3b3_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/900dd661df81967a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/9546d2c6dd38203c_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/9546d2c6dd38203c_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/96d03a8b051613e1_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/96d03a8b051613e1_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/a0222364eb3781e3_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/a0222364eb3781e3_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/a524d2c2d64c3660_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/a524d2c2d64c3660_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/a78bfbcc1859fb76_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/a78bfbcc1859fb76_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/ac56d7aa94c8dd89_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/ac56d7aa94c8dd89_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/b5055aa76b1823e0_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/b5055aa76b1823e0_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c0b18bd33c20f43c_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c0b18bd33c20f43c_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c31100b4d5efc61d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c31100b4d5efc61d_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c62331d49f110533_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c62331d49f110533_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c7bb739419f12b43_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/cdf6536f6656df3e_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/cdf6536f6656df3e_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d0e2620915e19afb_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d0e2620915e19afb_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d4313ca21cedf2ad_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d4313ca21cedf2ad_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d4cbe68232f52d97_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d4cbe68232f52d97_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d90bf1dbbf713592_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d90bf1dbbf713592_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/df18dfd2a1ad9fb4_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/df18dfd2a1ad9fb4_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e321e1f483bdf8f3_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e321e1f483bdf8f3_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e3cf32438c59b057_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e3cf32438c59b057_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e5d70b58b9ad133a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e5d70b58b9ad133a_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e6bebc23f041524b_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e6bebc23f041524b_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/ec2dbc36a8a707bf_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f0d3846d04ec57fa_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f0d3846d04ec57fa_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f41ecefc4e8c4d02_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f41ecefc4e8c4d02_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f641877808e85797_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f641877808e85797_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f792102a3adfa574_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f792102a3adfa574_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f87456efb50ead2b_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f87456efb50ead2b_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f9c75818bcb88359_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f9c75818bcb88359_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/fb21145c8e2675cb_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/fb21145c8e2675cb_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/index-dir/the-real-index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/0281c98fa97441e5_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/319cb45fc46cfd93_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/685282d5721939ea_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/8634e8d5eb849493_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/c6ba0abf049dda93_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/ff32d8eaf874a37b_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/index-dir/the-real-index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/index.txt +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/024678dda211fa26_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/024678dda211fa26_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/037830b98bc2d51d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/037830b98bc2d51d_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/058b480bfb167f1d_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/058b480bfb167f1d_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/0655e9ff0425de79_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/0a59caba16743dc4_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/0a59caba16743dc4_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/136ff5c99b26781c_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/136ff5c99b26781c_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/17a566dc27c99ba4_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/17a566dc27c99ba4_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/21f0f05b2eceebc6_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/21f0f05b2eceebc6_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/258481d12e2d6b56_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/258481d12e2d6b56_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/384fffcb0c07b624_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/4d19946442d4bfbb_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/4db2b1b4ab66bab9_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/4db2b1b4ab66bab9_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/51f125f305445381_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/51f125f305445381_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/5a8718d400d2f051_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/5a8718d400d2f051_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/61766447abeea15f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/61766447abeea15f_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/62151dfee245ae9b_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/62151dfee245ae9b_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/696c1b7392b5c15a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/696c1b7392b5c15a_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/6c82448ab5b28377_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/6c82448ab5b28377_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/6d24995ced602e98_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/722befb3ecafcb3f_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/78c3660b76e7d93a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/78c3660b76e7d93a_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/798dd4b9b7d9d5c2_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/8595071248e29ee1_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/8595071248e29ee1_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/8b04b7c22f0fd1f9_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/8b04b7c22f0fd1f9_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/8f520d5d41ee00bd_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/8f520d5d41ee00bd_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/901ff14ab13b28c6_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/901ff14ab13b28c6_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/a1d474dd0b6dd558_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/a1d474dd0b6dd558_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/a3011f5e2ef033c1_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/a3011f5e2ef033c1_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/a8b1cac4bc45ce95_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/a8b1cac4bc45ce95_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/ba58c86b9d2825b2_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/ba58c86b9d2825b2_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/c5d7b8f405d5e062_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/ca40ebe1bbd077ac_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/ca40ebe1bbd077ac_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/d0ab2b640b0a13e7_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/d0ab2b640b0a13e7_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/d0c3865f553ac976_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/d0c3865f553ac976_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/da45add0238a285a_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/da45add0238a285a_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/e4307c16470799da_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/e4307c16470799da_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/e7690ca8c63cad14_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/e7690ca8c63cad14_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/e7ba6f4de6562c89_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/e7ba6f4de6562c89_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/eb1bcf853b355e13_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/eb1bcf853b355e13_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/f32ce7214b1774ba_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/f32ce7214b1774ba_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/f62e4b05ee7d99f9_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/f62e4b05ee7d99f9_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/fc5ef4b63ae4bb4b_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/index-dir/the-real-index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/52158ab3c1d3fdde_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/9c3cfbb43286df23_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/b19f1b829e018cf2_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/b8ae4f867095f4fd_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/bdc920a7c2524c3b_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/ea5f9af36eefd38b_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/index-dir/the-real-index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/index.txt +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/Database/CURRENT +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/Database/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/Database/LOG +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/Database/LOG.old +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/Database/MANIFEST-000001 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/ScriptCache/2cc80dabc69f58b6_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/ScriptCache/2cc80dabc69f58b6_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/ScriptCache/fa813c9ad67834ac_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/ScriptCache/fa813c9ad67834ac_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/ScriptCache/index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/ScriptCache/index-dir/the-real-index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Session Storage/CURRENT +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Session Storage/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Session Storage/LOG +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Session Storage/LOG.old +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Session Storage/MANIFEST-000001 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sessions/Session_13429768577966436 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sessions/Tabs_13429770684888237 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sessions/Tabs_13429770734729173 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Shared Dictionary/cache/index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Shared Dictionary/cache/index-dir/the-real-index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Shared Dictionary/db +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Shared Dictionary/db-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/SharedStorage +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Shortcuts +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Shortcuts-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Site Characteristics Database/CURRENT +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Site Characteristics Database/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Site Characteristics Database/LOG +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Site Characteristics Database/LOG.old +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Site Characteristics Database/MANIFEST-000001 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sync Data/LevelDB/CURRENT +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sync Data/LevelDB/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sync Data/LevelDB/LOG +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sync Data/LevelDB/LOG.old +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sync Data/LevelDB/MANIFEST-000001 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Top Sites +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Top Sites-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Translate Ranker Model +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/TransportSecurity +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Trust Tokens +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Trust Tokens-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Web Data +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Web Data-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/WebStorage/QuotaManager +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/WebStorage/QuotaManager-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/chrome_cart_db/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/chrome_cart_db/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/chrome_cart_db/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/commerce_subscription_db/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/commerce_subscription_db/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/commerce_subscription_db/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/discount_infos_db/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/discount_infos_db/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/discount_infos_db/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/discounts_db/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/discounts_db/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/discounts_db/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/engine_allowlist.bf +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/heavy_ad_intervention_opt_out.db +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/heavy_ad_intervention_opt_out.db-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/parcel_tracking_db/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/parcel_tracking_db/LOG +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/parcel_tracking_db/LOG.old +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/CURRENT +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/LOG +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/LOG.old +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/MANIFEST-000001 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/metadata/CURRENT +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/metadata/LOCK +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/metadata/LOG +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/metadata/LOG.old +0 -3
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/metadata/MANIFEST-000001 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Default/trusted_vault.pb +0 -2
- package/.pi/.pi-puppeteer/profiles/chrome/default/DevToolsActivePort +0 -2
- package/.pi/.pi-puppeteer/profiles/chrome/default/FileTypePolicies/145.0.7584.0/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/FileTypePolicies/145.0.7584.0/download_file_types.pb +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/FileTypePolicies/145.0.7584.0/manifest.json +0 -5
- package/.pi/.pi-puppeteer/profiles/chrome/default/FirstPartySetsPreloaded/2025.7.24.0/LICENSE +0 -27
- package/.pi/.pi-puppeteer/profiles/chrome/default/FirstPartySetsPreloaded/2025.7.24.0/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/FirstPartySetsPreloaded/2025.7.24.0/manifest.json +0 -5
- package/.pi/.pi-puppeteer/profiles/chrome/default/FirstPartySetsPreloaded/2025.7.24.0/sets.json +0 -70
- package/.pi/.pi-puppeteer/profiles/chrome/default/GPUPersistentCache/GPUCache/NDJN3PYMYS2VQL44TKFDS34NLSXM6YVU/cache.db +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/GPUPersistentCache/GPUCache/NDJN3PYMYS2VQL44TKFDS34NLSXM6YVU/cache.db-wal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/GPUPersistentCache/GPUCache/NDJN3PYMYS2VQL44TKFDS34NLSXM6YVU/cache.journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/data_0 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/data_1 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/data_2 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/data_3 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/f_000001 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/f_000002 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/f_000003 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/f_000004 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/index +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Last Version +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Local State +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/MEIPreload/1.1.0.3/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/MEIPreload/1.1.0.3/manifest.json +0 -7
- package/.pi/.pi-puppeteer/profiles/chrome/default/MEIPreload/1.1.0.3/preloaded_data.pb +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/PKIMetadata/1728/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/PKIMetadata/1728/crs.pb +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/PKIMetadata/1728/ct_config.pb +3 -322
- package/.pi/.pi-puppeteer/profiles/chrome/default/PKIMetadata/1728/kp_pinslist.pb +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/PKIMetadata/1728/manifest.json +0 -5
- package/.pi/.pi-puppeteer/profiles/chrome/default/PKIMetadata/1728/mtc_config.pb +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/SSLErrorAssistant/7/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/SSLErrorAssistant/7/manifest.json +0 -5
- package/.pi/.pi-puppeteer/profiles/chrome/default/SSLErrorAssistant/7/ssl_error_assistant.pb +0 -54
- package/.pi/.pi-puppeteer/profiles/chrome/default/SafetyTips/3091/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/SafetyTips/3091/manifest.json +0 -5
- package/.pi/.pi-puppeteer/profiles/chrome/default/SafetyTips/3091/safety_tips.pb +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Subresource Filter/Indexed Rules/38/9.70.0/Ruleset Data +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/Subresource Filter/Unindexed Rules/9.70.0/Filtering Rules +0 -6106
- package/.pi/.pi-puppeteer/profiles/chrome/default/Subresource Filter/Unindexed Rules/9.70.0/LICENSE.txt +0 -383
- package/.pi/.pi-puppeteer/profiles/chrome/default/Subresource Filter/Unindexed Rules/9.70.0/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/Subresource Filter/Unindexed Rules/9.70.0/manifest.json +0 -6
- package/.pi/.pi-puppeteer/profiles/chrome/default/TrustTokenKeyCommitments/2026.3.23.1/LICENSE +0 -27
- package/.pi/.pi-puppeteer/profiles/chrome/default/TrustTokenKeyCommitments/2026.3.23.1/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/TrustTokenKeyCommitments/2026.3.23.1/keys.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/TrustTokenKeyCommitments/2026.3.23.1/manifest.json +0 -5
- package/.pi/.pi-puppeteer/profiles/chrome/default/Variations +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/background_compiled.js +0 -40
- package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/bindings_main.js +0 -6281
- package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/bindings_main.wasm +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/manifest.json +0 -5
- package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/offscreen.html +0 -2
- package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/offscreen_compiled.js +0 -131
- package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/streaming_worklet_processor.js +0 -78
- package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/voices.json +0 -1779
- package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/wasm_tts_manifest_v3.json +0 -43
- package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/_metadata/verified_contents.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/english_wikipedia.txt +0 -30000
- package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/female_names.txt +0 -3712
- package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/male_names.txt +0 -984
- package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/manifest.json +0 -5
- package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/passwords.txt +0 -30000
- package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/ranked_dicts +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/surnames.txt +0 -10000
- package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/us_tv_and_film.txt +0 -19160
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/0d784450fcc5b3ad7ab4efa85b2e1fe56bd5086b69807eab756f62c257ea0d8b +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/0d994b6c9c5d4b0316bcc7a79f4939a2390c638169ea6dc783198c17286d8255 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/3eb16d6c28b502ac4cfee8f4a148df05f4d93229fa36a71db8b08d06329ff18a +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/4448b37acb13eb51a842a8ebc85ea826729571c7293f2213d855d3a76cb9a4f8 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/545666a4efd056351597bb386aea1368105ededc976ed5650d8682daab9f37ff +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/56c21927faa028be6ce18c931660eec37e41da4bfbfd47cafa48350f828c0dbd +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/733776833212346a1018b95197c61bed2d107fbb7790a985ef692780e02f31cb +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/7b05c14dba04ed522210b733f004cb0e74d7679a653b19bd029f9bc0e6b19903 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/8f2c0712b6800fa9622a039cb167cc9503d508a271247e445f08a96eded5772f +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/9bec6c2c0185d3305ac8495047a1aa01e725d58f8f18d219742a2988f07cd93a +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/9f157bd09a986baa46110a0acb7e3d7407208e58d02250c637902962e5ed2c5e +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/abd93867c038d4d17c101ace2226d7e21303d984d7097271392bae6be478495b +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/ae216724654f3e52d3c502328caf83f773e66cc5818c38850165864005a35169 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/c8c2fd0acdb7eecaf4f66d5164204c4e8e5ebbabb6398e0ee6ec6d8af71ea672 +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/fd8fd38c229ab33755ff429ccc9919eba21b566551cbfb17d8e11e35e941ee0e +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/metadata.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/extensions_crx_cache/metadata.json +0 -1
- package/.pi/.pi-puppeteer/profiles/chrome/default/first_party_sets.db +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/first_party_sets.db-journal +0 -0
- package/.pi/.pi-puppeteer/profiles/chrome/default/segmentation_platform/ukm_db +0 -0
- package/.pi-subagents/artifacts/6d0b4431_custom.vision-agent_0_input.md +0 -54
- package/.pi-subagents/artifacts/6d0b4431_custom.vision-agent_0_meta.json +0 -114
- package/.pi-subagents/artifacts/6d0b4431_custom.vision-agent_0_output.md +0 -22
- package/.pi-subagents/artifacts/6d0b4431_custom.vision-agent_0_transcript.jsonl +0 -7
- package/tsconfig.tsbuildinfo +0 -1
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import { useEffect, useState } from "react";
|
|
1
|
+
import { useEffect, useMemo, useRef, useState } from "react";
|
|
2
2
|
import { useConfigStore } from "@/store/config-store";
|
|
3
3
|
import { useTranslation } from "@/lib/i18n";
|
|
4
4
|
import { Badge } from "@/components/ui/Badge";
|
|
5
5
|
import { Modal } from "@/components/ui/Modal";
|
|
6
|
-
import { formatTokens, cn } from "@/lib/utils";
|
|
6
|
+
import { formatTokens, cn, formatCost, USD_TO_CNY } from "@/lib/utils";
|
|
7
|
+
import { useCurrency } from "@/lib/currency";
|
|
7
8
|
import type { ApiType, CustomProviderConfig, Model, Provider } from "@/types";
|
|
9
|
+
import { searchCatalog, catalogToModel, guessModelMeta } from "@/data/model-catalog";
|
|
8
10
|
import {
|
|
9
11
|
Plus,
|
|
10
12
|
Trash2,
|
|
@@ -25,11 +27,18 @@ import {
|
|
|
25
27
|
Download,
|
|
26
28
|
SquareCheck,
|
|
27
29
|
Copy,
|
|
30
|
+
ChevronDown,
|
|
31
|
+
ChevronUp,
|
|
32
|
+
Sparkles,
|
|
33
|
+
Mic,
|
|
34
|
+
Wand2,
|
|
28
35
|
} from "lucide-react";
|
|
29
36
|
|
|
30
37
|
const API_TYPES: { value: ApiType; label: string }[] = [
|
|
31
38
|
{ value: "openai-completions", label: "Chat Completions (/chat/completions)" },
|
|
32
39
|
{ value: "openai-responses", label: "OpenAI Responses" },
|
|
40
|
+
{ value: "openai-codex-responses", label: "OpenAI Codex Responses" },
|
|
41
|
+
{ value: "azure-openai-responses", label: "Azure OpenAI Responses" },
|
|
33
42
|
{ value: "anthropic-messages", label: "Anthropic Messages" },
|
|
34
43
|
{ value: "google-generative-ai", label: "Google Generative AI" },
|
|
35
44
|
{ value: "google-vertex", label: "Google Vertex AI" },
|
|
@@ -37,6 +46,19 @@ const API_TYPES: { value: ApiType; label: string }[] = [
|
|
|
37
46
|
{ value: "mistral-conversations", label: "Mistral" },
|
|
38
47
|
];
|
|
39
48
|
|
|
49
|
+
// Shape returned by /api/pi/provider-models (see server/pi-reader.ts FetchedModel)
|
|
50
|
+
interface FetchedModel {
|
|
51
|
+
id: string;
|
|
52
|
+
name?: string;
|
|
53
|
+
contextWindow?: number;
|
|
54
|
+
maxTokens?: number;
|
|
55
|
+
reasoning?: boolean;
|
|
56
|
+
vision?: boolean;
|
|
57
|
+
audio?: boolean;
|
|
58
|
+
cost?: { input: number; output: number; cacheRead?: number; cacheWrite?: number };
|
|
59
|
+
source?: string;
|
|
60
|
+
}
|
|
61
|
+
|
|
40
62
|
function isValidHttpUrl(value: string): boolean {
|
|
41
63
|
try {
|
|
42
64
|
const u = new URL(value);
|
|
@@ -51,19 +73,20 @@ function isValidHttpUrl(value: string): boolean {
|
|
|
51
73
|
const DEFAULT_CONTEXT_WINDOW = 262144;
|
|
52
74
|
const DEFAULT_MAX_TOKENS = 32768;
|
|
53
75
|
|
|
54
|
-
// Sanitize to a config-safe id:
|
|
76
|
+
// Sanitize to a config-safe id: letters (any script), digits and hyphens.
|
|
77
|
+
// pi shows this key verbatim in its model picker badge, so keep it readable.
|
|
55
78
|
function sanitizeProviderId(name: string): string {
|
|
56
79
|
return name
|
|
57
80
|
.trim()
|
|
58
81
|
.toLowerCase()
|
|
59
82
|
.replace(/\s+/g, "-")
|
|
60
|
-
.replace(/[
|
|
83
|
+
.replace(/[^\p{L}\p{N}-]/gu, "")
|
|
61
84
|
.replace(/-+/g, "-")
|
|
62
85
|
.replace(/^-|-$/g, "");
|
|
63
86
|
}
|
|
64
87
|
|
|
65
|
-
//
|
|
66
|
-
//
|
|
88
|
+
// Empty or symbol-only names fall back to the endpoint hostname so the
|
|
89
|
+
// provider still gets a valid id while keeping the original display name.
|
|
67
90
|
function deriveProviderId(name: string, baseUrl: string): string {
|
|
68
91
|
const fromName = sanitizeProviderId(name);
|
|
69
92
|
if (fromName || !name.trim()) return fromName;
|
|
@@ -144,30 +167,107 @@ function parseProviderImport(raw: string): ParsedImport {
|
|
|
144
167
|
return out;
|
|
145
168
|
}
|
|
146
169
|
|
|
170
|
+
// ─── Enabled Models Panel (cross-provider) ────────────────
|
|
171
|
+
// Lists every enabled model across all providers. Shares settings.enabledModels
|
|
172
|
+
// as the single source of truth with the per-provider model rows, so toggling
|
|
173
|
+
// here stays in sync with the enable/disable state inside each provider.
|
|
174
|
+
|
|
175
|
+
function EnabledModelsPanel() {
|
|
176
|
+
const { t } = useTranslation();
|
|
177
|
+
const { allModels, settings, removeEnabledModel, updateSettings } = useConfigStore();
|
|
178
|
+
const enabledSet = new Set(settings?.enabledModels ?? []);
|
|
179
|
+
const enabledModels = allModels.filter((m) => enabledSet.has(`${m.providerId}/${m.id}`));
|
|
180
|
+
|
|
181
|
+
const disableAll = () => updateSettings({ enabledModels: [] });
|
|
182
|
+
|
|
183
|
+
return (
|
|
184
|
+
<div className="rounded-xl border border-gray-800 bg-gray-900/50 p-4">
|
|
185
|
+
<div className="flex items-center justify-between gap-3">
|
|
186
|
+
<div className="flex items-center gap-2">
|
|
187
|
+
<Zap className="h-4 w-4 text-emerald-400" />
|
|
188
|
+
<h2 className="text-sm font-semibold" style={{ color: "var(--page-text)" }}>
|
|
189
|
+
{t("providers_models.enabled_models_title")}
|
|
190
|
+
</h2>
|
|
191
|
+
<span className="rounded-full border border-gray-700 bg-gray-800 px-2 py-0.5 text-xs text-gray-400">
|
|
192
|
+
{enabledModels.length}
|
|
193
|
+
</span>
|
|
194
|
+
</div>
|
|
195
|
+
{enabledModels.length > 0 && (
|
|
196
|
+
<button
|
|
197
|
+
onClick={disableAll}
|
|
198
|
+
className="rounded-lg border border-gray-700 px-3 py-1 text-xs text-gray-300 transition-colors hover:bg-gray-800 hover:text-white"
|
|
199
|
+
>
|
|
200
|
+
{t("providers_models.disable_all")}
|
|
201
|
+
</button>
|
|
202
|
+
)}
|
|
203
|
+
</div>
|
|
204
|
+
|
|
205
|
+
{enabledModels.length === 0 ? (
|
|
206
|
+
<p className="mt-3 text-sm text-gray-500">{t("providers_models.no_enabled_models")}</p>
|
|
207
|
+
) : (
|
|
208
|
+
<div className="mt-3 grid max-h-72 gap-1.5 overflow-y-auto pr-1 lg:grid-cols-2">
|
|
209
|
+
{enabledModels.map((m) => {
|
|
210
|
+
const ref = `${m.providerId}/${m.id}`;
|
|
211
|
+
return (
|
|
212
|
+
<div
|
|
213
|
+
key={ref}
|
|
214
|
+
className="flex items-center gap-2 rounded-lg border border-gray-700 bg-gray-900/70 px-3 py-2"
|
|
215
|
+
>
|
|
216
|
+
<button
|
|
217
|
+
onClick={() => removeEnabledModel(ref)}
|
|
218
|
+
title={t("models.enabled")}
|
|
219
|
+
className="relative inline-flex h-4 w-7 shrink-0 items-center rounded-full bg-emerald-500 transition-colors"
|
|
220
|
+
>
|
|
221
|
+
<span className="inline-block h-3 w-3 transform translate-x-3.5 rounded-full bg-white transition-transform" />
|
|
222
|
+
</button>
|
|
223
|
+
<Box className="h-4 w-4 shrink-0 text-gray-500" />
|
|
224
|
+
<span className="min-w-0 flex-1 truncate font-mono text-sm text-gray-200">
|
|
225
|
+
{m.name || m.id}
|
|
226
|
+
</span>
|
|
227
|
+
<span className="shrink-0 rounded-md border border-gray-600 bg-gray-800/50 px-2 py-0.5 text-xs text-gray-400">
|
|
228
|
+
{m.providerName}
|
|
229
|
+
</span>
|
|
230
|
+
</div>
|
|
231
|
+
);
|
|
232
|
+
})}
|
|
233
|
+
</div>
|
|
234
|
+
)}
|
|
235
|
+
</div>
|
|
236
|
+
);
|
|
237
|
+
}
|
|
238
|
+
|
|
147
239
|
export function ProvidersModelsPage() {
|
|
148
240
|
const { t } = useTranslation();
|
|
149
241
|
const { allProviders, auth, modelsJson, removeCustomProvider } = useConfigStore();
|
|
242
|
+
const hasKey = (p: Provider) => p.hasAuth || !!p.apiKey || !!auth?.[p.id]?.key;
|
|
150
243
|
|
|
151
|
-
const builtinProviders = allProviders
|
|
244
|
+
const builtinProviders = allProviders
|
|
245
|
+
.filter((p) => p.type === "builtin")
|
|
246
|
+
.sort((a, b) => {
|
|
247
|
+
const aKey = hasKey(a) ? 1 : 0;
|
|
248
|
+
const bKey = hasKey(b) ? 1 : 0;
|
|
249
|
+
if (aKey !== bKey) return bKey - aKey;
|
|
250
|
+
return a.name.localeCompare(b.name);
|
|
251
|
+
});
|
|
152
252
|
const customProviders = allProviders.filter((p) => p.type === "custom");
|
|
153
253
|
|
|
154
254
|
const [selectedId, setSelectedId] = useState<string | null>(null);
|
|
155
255
|
const [adding, setAdding] = useState(false);
|
|
156
256
|
const [importing, setImporting] = useState(false);
|
|
157
257
|
const [importBump, setImportBump] = useState(0);
|
|
258
|
+
const [builtinExpanded, setBuiltinExpanded] = useState(false);
|
|
158
259
|
const [deleteConfirm, setDeleteConfirm] = useState<string | null>(null);
|
|
159
260
|
const [deleteError, setDeleteError] = useState(false);
|
|
160
261
|
|
|
161
262
|
// Keep a valid selection (default: first custom, else first builtin)
|
|
162
263
|
const selected = allProviders.find((p) => p.id === selectedId) ?? null;
|
|
264
|
+
const visibleBuiltinProviders = builtinExpanded ? builtinProviders : builtinProviders.slice(0, 10);
|
|
163
265
|
useEffect(() => {
|
|
164
266
|
if (!selected && !adding && allProviders.length > 0) {
|
|
165
267
|
setSelectedId(customProviders[0]?.id ?? allProviders[0]?.id ?? null);
|
|
166
268
|
}
|
|
167
269
|
}, [selected, adding, allProviders, customProviders]);
|
|
168
270
|
|
|
169
|
-
const hasKey = (p: Provider) => p.hasAuth || !!p.apiKey || !!auth?.[p.id]?.key;
|
|
170
|
-
|
|
171
271
|
const handleAddProvider = async (id: string, cfg: CustomProviderConfig): Promise<boolean> => {
|
|
172
272
|
const ok = await useConfigStore.getState().addCustomProvider(id, cfg);
|
|
173
273
|
if (ok) {
|
|
@@ -191,18 +291,40 @@ export function ProvidersModelsPage() {
|
|
|
191
291
|
|
|
192
292
|
const handleDuplicateProvider = async (id: string) => {
|
|
193
293
|
const existing = modelsJson?.providers[id];
|
|
194
|
-
|
|
294
|
+
// Resolve the source models: prefer models.json override, else the
|
|
295
|
+
// builtin provider's model list so duplicates keep their models.
|
|
296
|
+
const sourceProvider = allProviders.find((p) => p.id === id);
|
|
297
|
+
const sourceModels = existing?.models ?? sourceProvider?.models ?? [];
|
|
298
|
+
const sourceName = sourceProvider?.name ?? id;
|
|
299
|
+
// Derive the new key from the display name so pi's model picker badge
|
|
300
|
+
// matches what the user sees in this UI.
|
|
301
|
+
const baseId = sanitizeProviderId(sourceName) || id;
|
|
195
302
|
const suffix = "-copy";
|
|
196
|
-
|
|
197
|
-
//
|
|
303
|
+
let newId = sanitizeProviderId(baseId + suffix);
|
|
304
|
+
// Ensure uniqueness against existing provider ids
|
|
305
|
+
const taken = new Set(allProviders.map((p) => p.id));
|
|
306
|
+
let i = 2;
|
|
307
|
+
while (taken.has(newId)) newId = sanitizeProviderId(`${baseId}-copy${i++}`);
|
|
308
|
+
// Copy config but clear apiKey; carry models + headers + overrides
|
|
198
309
|
const cfg: CustomProviderConfig = {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
310
|
+
name: `${sourceName} (copy)`,
|
|
311
|
+
baseUrl: existing?.baseUrl ?? sourceProvider?.baseUrl,
|
|
312
|
+
api: existing?.api ?? sourceProvider?.api,
|
|
313
|
+
headers: existing?.headers,
|
|
314
|
+
compat: existing?.compat,
|
|
315
|
+
modelOverrides: existing?.modelOverrides,
|
|
316
|
+
models: sourceModels.map((m) => ({ ...m, enabled: true })),
|
|
203
317
|
};
|
|
204
318
|
const ok = await useConfigStore.getState().addCustomProvider(newId, cfg);
|
|
205
|
-
if (ok)
|
|
319
|
+
if (ok) {
|
|
320
|
+
// Enable the carried models in settings.enabledModels
|
|
321
|
+
const list = useConfigStore.getState().settings?.enabledModels ?? [];
|
|
322
|
+
const refs = sourceModels.map((m) => `${newId}/${m.id}`);
|
|
323
|
+
await useConfigStore.getState().updateSettings({
|
|
324
|
+
enabledModels: Array.from(new Set([...list, ...refs])),
|
|
325
|
+
});
|
|
326
|
+
setSelectedId(newId);
|
|
327
|
+
}
|
|
206
328
|
};
|
|
207
329
|
|
|
208
330
|
return (
|
|
@@ -216,28 +338,50 @@ export function ProvidersModelsPage() {
|
|
|
216
338
|
</p>
|
|
217
339
|
</div>
|
|
218
340
|
|
|
341
|
+
<EnabledModelsPanel />
|
|
342
|
+
|
|
219
343
|
<div className="flex overflow-hidden rounded-xl border border-gray-800 bg-gray-900/50">
|
|
220
344
|
{/* ─── Left: Provider List ─────────────────────── */}
|
|
221
345
|
<div className="w-60 shrink-0 border-r border-gray-800 p-3">
|
|
222
346
|
{builtinProviders.length > 0 && (
|
|
223
347
|
<>
|
|
224
|
-
<
|
|
225
|
-
|
|
226
|
-
|
|
348
|
+
<div className="flex items-center justify-between px-2 pb-2 pt-1">
|
|
349
|
+
<p className="text-xs font-medium uppercase tracking-wider text-gray-500">
|
|
350
|
+
{t("providers.builtin")} ({builtinProviders.length})
|
|
351
|
+
</p>
|
|
352
|
+
</div>
|
|
227
353
|
<div className="space-y-0.5">
|
|
228
|
-
{
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
354
|
+
{visibleBuiltinProviders.map((p) => (
|
|
355
|
+
<ProviderListItem
|
|
356
|
+
key={p.id}
|
|
357
|
+
provider={p}
|
|
358
|
+
active={!adding && selectedId === p.id}
|
|
359
|
+
hasKey={hasKey(p)}
|
|
360
|
+
onClick={() => {
|
|
361
|
+
setAdding(false);
|
|
362
|
+
setSelectedId(p.id);
|
|
363
|
+
}}
|
|
364
|
+
/>
|
|
239
365
|
))}
|
|
240
366
|
</div>
|
|
367
|
+
{builtinProviders.length > 10 && (
|
|
368
|
+
<button
|
|
369
|
+
onClick={() => setBuiltinExpanded(!builtinExpanded)}
|
|
370
|
+
className="mt-1 flex w-full items-center justify-center gap-1 rounded-lg py-1.5 text-xs text-gray-500 transition-colors hover:bg-gray-800/70 hover:text-gray-300"
|
|
371
|
+
>
|
|
372
|
+
{builtinExpanded ? (
|
|
373
|
+
<>
|
|
374
|
+
<ChevronUp className="h-3.5 w-3.5" />
|
|
375
|
+
{t("providers_models.collapse")}
|
|
376
|
+
</>
|
|
377
|
+
) : (
|
|
378
|
+
<>
|
|
379
|
+
<ChevronDown className="h-3.5 w-3.5" />
|
|
380
|
+
{t("providers_models.expand", String(builtinProviders.length - 10))}
|
|
381
|
+
</>
|
|
382
|
+
)}
|
|
383
|
+
</button>
|
|
384
|
+
)}
|
|
241
385
|
</>
|
|
242
386
|
)}
|
|
243
387
|
|
|
@@ -291,6 +435,7 @@ export function ProvidersModelsPage() {
|
|
|
291
435
|
provider={selected}
|
|
292
436
|
onDelete={() => setDeleteConfirm(selected.id)}
|
|
293
437
|
onDuplicate={() => handleDuplicateProvider(selected.id)}
|
|
438
|
+
onRenamed={(newId) => setSelectedId(newId)}
|
|
294
439
|
/>
|
|
295
440
|
) : (
|
|
296
441
|
<div className="flex h-40 items-center justify-center text-sm text-gray-500">
|
|
@@ -458,13 +603,15 @@ function TestConnectionButton({ baseUrl, apiKey }: { baseUrl: string; apiKey?: s
|
|
|
458
603
|
|
|
459
604
|
// ─── Provider Detail Panel ────────────────────────────────
|
|
460
605
|
|
|
461
|
-
function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provider; onDelete: () => void; onDuplicate: () => void }) {
|
|
606
|
+
function ProviderDetail({ provider, onDelete, onDuplicate, onRenamed }: { provider: Provider; onDelete: () => void; onDuplicate: () => void; onRenamed: (newId: string) => void }) {
|
|
462
607
|
const { t } = useTranslation();
|
|
608
|
+
const { currency } = useCurrency();
|
|
463
609
|
const {
|
|
464
610
|
auth,
|
|
465
611
|
settings,
|
|
466
612
|
updateSettings,
|
|
467
613
|
updateCustomProvider,
|
|
614
|
+
renameCustomProvider,
|
|
468
615
|
setProviderAuth,
|
|
469
616
|
removeProviderAuth,
|
|
470
617
|
addModel,
|
|
@@ -474,6 +621,27 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
474
621
|
removeEnabledModel,
|
|
475
622
|
} = useConfigStore();
|
|
476
623
|
|
|
624
|
+
// Whether a model is currently enabled (source of truth: settings.enabledModels)
|
|
625
|
+
const enabledRefs = new Set(settings?.enabledModels ?? []);
|
|
626
|
+
const isModelEnabled = (modelId: string) => enabledRefs.has(`${provider.id}/${modelId}`);
|
|
627
|
+
|
|
628
|
+
// Toggle a single model's enabled state
|
|
629
|
+
const toggleModelEnabled = (modelId: string) => {
|
|
630
|
+
const ref = `${provider.id}/${modelId}`;
|
|
631
|
+
if (enabledRefs.has(ref)) removeEnabledModel(ref);
|
|
632
|
+
else addEnabledModel(ref);
|
|
633
|
+
};
|
|
634
|
+
|
|
635
|
+
// Enable/disable all models of this provider at once (batched)
|
|
636
|
+
const setAllModelsEnabled = async (on: boolean) => {
|
|
637
|
+
const list = settings?.enabledModels ?? [];
|
|
638
|
+
const refs = provider.models.map((m) => `${provider.id}/${m.id}`);
|
|
639
|
+
const set = new Set(list);
|
|
640
|
+
if (on) refs.forEach((r) => set.add(r));
|
|
641
|
+
else refs.forEach((r) => set.delete(r));
|
|
642
|
+
await updateSettings({ enabledModels: Array.from(set) });
|
|
643
|
+
};
|
|
644
|
+
|
|
477
645
|
const isCustom = provider.type === "custom";
|
|
478
646
|
const savedKey = provider.apiKey ?? auth?.[provider.id]?.key ?? "";
|
|
479
647
|
|
|
@@ -486,13 +654,22 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
486
654
|
const [showAddModel, setShowAddModel] = useState(false);
|
|
487
655
|
const [deleteModel, setDeleteModel] = useState<Model | null>(null);
|
|
488
656
|
const [modelQuery, setModelQuery] = useState("");
|
|
657
|
+
const [modelSort, setModelSort] = useState<"default" | "family" | "price-asc" | "price-desc">("default");
|
|
658
|
+
const [supportsDeveloperRole, setSupportsDeveloperRole] = useState(
|
|
659
|
+
provider.compat?.supportsDeveloperRole ?? false
|
|
660
|
+
);
|
|
489
661
|
const [saveState, setSaveState] = useState<"idle" | "saving" | "saved" | "error">("idle");
|
|
490
662
|
|
|
663
|
+
// ─── Quick add (inline, one-liner) ───
|
|
664
|
+
const [quickId, setQuickId] = useState("");
|
|
665
|
+
const [quickHint, setQuickHint] = useState<string | null>(null);
|
|
666
|
+
const [copiedParams, setCopiedParams] = useState<string | null>(null);
|
|
667
|
+
|
|
491
668
|
// ─── Fetch Models State ───
|
|
492
669
|
const [fetchOpen, setFetchOpen] = useState(false);
|
|
493
670
|
const [fetching, setFetching] = useState(false);
|
|
494
671
|
const [fetchError, setFetchError] = useState<string | null>(null);
|
|
495
|
-
const [fetchedModels, setFetchedModels] = useState<
|
|
672
|
+
const [fetchedModels, setFetchedModels] = useState<FetchedModel[]>([]);
|
|
496
673
|
const [fetchSelected, setFetchSelected] = useState<Set<string>>(new Set());
|
|
497
674
|
const [fetchImported, setFetchImported] = useState<number | null>(null);
|
|
498
675
|
|
|
@@ -547,7 +724,18 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
547
724
|
const selected = availableModels.filter((m) => isSelected(m.id));
|
|
548
725
|
if (selected.length === 0) return;
|
|
549
726
|
selected.forEach((m) => {
|
|
550
|
-
|
|
727
|
+
const input: Model["input"] = ["text"];
|
|
728
|
+
if (m.vision) input.push("image");
|
|
729
|
+
if (m.audio) input.push("audio");
|
|
730
|
+
addModel(provider.id, {
|
|
731
|
+
id: m.id,
|
|
732
|
+
name: m.name,
|
|
733
|
+
reasoning: m.reasoning ?? false,
|
|
734
|
+
input,
|
|
735
|
+
contextWindow: m.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
|
|
736
|
+
maxTokens: m.maxTokens ?? DEFAULT_MAX_TOKENS,
|
|
737
|
+
cost: m.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
738
|
+
} as Model);
|
|
551
739
|
});
|
|
552
740
|
// Enable in a single batched write — per-model addEnabledModel calls race
|
|
553
741
|
// on the same settings snapshot and overwrite each other.
|
|
@@ -591,58 +779,159 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
591
779
|
}
|
|
592
780
|
};
|
|
593
781
|
|
|
594
|
-
|
|
782
|
+
// Test every model of the provider sequentially (reuses /api/pi/model-test).
|
|
783
|
+
const handleTestAll = async () => {
|
|
784
|
+
for (const m of provider.models) {
|
|
785
|
+
await handleTestModel(m);
|
|
786
|
+
}
|
|
787
|
+
};
|
|
788
|
+
|
|
789
|
+
// Quick-add id changes → live hint
|
|
790
|
+
useEffect(() => {
|
|
791
|
+
const id = quickId.trim();
|
|
792
|
+
if (!id) { setQuickHint(null); return; }
|
|
793
|
+
const g = guessModelMeta(id);
|
|
794
|
+
setQuickHint(
|
|
795
|
+
g.source === "catalog" && g.matched
|
|
796
|
+
? t("models.detected_catalog", g.matched)
|
|
797
|
+
: g.source === "heuristic"
|
|
798
|
+
? t("models.detected_heuristic")
|
|
799
|
+
: null
|
|
800
|
+
);
|
|
801
|
+
}, [quickId, t]);
|
|
802
|
+
|
|
803
|
+
const handleQuickAdd = async () => {
|
|
804
|
+
const id = quickId.trim();
|
|
805
|
+
if (!id) return;
|
|
806
|
+
// Don't duplicate
|
|
807
|
+
if (provider.models.some((m) => m.id === id)) {
|
|
808
|
+
setQuickId("");
|
|
809
|
+
setQuickHint(null);
|
|
810
|
+
return;
|
|
811
|
+
}
|
|
812
|
+
const g = guessModelMeta(id);
|
|
813
|
+
const cw = g.contextWindow ?? DEFAULT_CONTEXT_WINDOW;
|
|
814
|
+
const mt = g.contextWindow
|
|
815
|
+
? (g.contextWindow >= 1_000_000 ? 65536 : g.contextWindow >= 200_000 ? 32768 : 8192)
|
|
816
|
+
: DEFAULT_MAX_TOKENS;
|
|
817
|
+
// Pull full cost/name from catalog if available
|
|
818
|
+
const entries = searchCatalog(id, 5);
|
|
819
|
+
const match = g.source === "catalog"
|
|
820
|
+
? entries.find((e) => e.patterns.some((p) => id.toLowerCase().includes(p.toLowerCase())))
|
|
821
|
+
: undefined;
|
|
822
|
+
const model: Model = {
|
|
823
|
+
id,
|
|
824
|
+
name: match?.name,
|
|
825
|
+
reasoning: g.reasoning ?? false,
|
|
826
|
+
input: g.input ?? ["text"],
|
|
827
|
+
contextWindow: match?.contextWindow ?? cw,
|
|
828
|
+
maxTokens: match?.maxTokens ?? mt,
|
|
829
|
+
cost: match?.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
830
|
+
enabled: true,
|
|
831
|
+
};
|
|
832
|
+
addModel(provider.id, model);
|
|
833
|
+
// Enable
|
|
834
|
+
const list = settings?.enabledModels ?? [];
|
|
835
|
+
await updateSettings({ enabledModels: Array.from(new Set([...list, `${provider.id}/${id}`])) });
|
|
836
|
+
setQuickId("");
|
|
837
|
+
setQuickHint(null);
|
|
838
|
+
};
|
|
839
|
+
|
|
840
|
+
const handleCopyParams = async (m: Model) => {
|
|
841
|
+
const payload = {
|
|
842
|
+
reasoning: m.reasoning,
|
|
843
|
+
input: m.input,
|
|
844
|
+
contextWindow: m.contextWindow,
|
|
845
|
+
maxTokens: m.maxTokens,
|
|
846
|
+
cost: m.cost,
|
|
847
|
+
};
|
|
848
|
+
try {
|
|
849
|
+
await navigator.clipboard.writeText(JSON.stringify(payload, null, 2));
|
|
850
|
+
setCopiedParams(m.id);
|
|
851
|
+
setTimeout(() => setCopiedParams(null), 1500);
|
|
852
|
+
} catch {
|
|
853
|
+
// ignore
|
|
854
|
+
}
|
|
855
|
+
};
|
|
856
|
+
|
|
857
|
+
const urlInvalid = baseUrl.trim() !== "" && !isValidHttpUrl(baseUrl.trim());
|
|
595
858
|
|
|
596
859
|
const dirty =
|
|
597
|
-
(isCustom && (providerName !== (provider.name ?? "") || baseUrl !== (provider.baseUrl ?? "") || api !== (provider.api ?? "openai-completions"))) ||
|
|
860
|
+
(isCustom && (providerName !== (provider.name ?? "") || baseUrl !== (provider.baseUrl ?? "") || api !== (provider.api ?? "openai-completions") || supportsDeveloperRole !== (provider.compat?.supportsDeveloperRole ?? true))) ||
|
|
861
|
+
(!isCustom && (baseUrl !== (provider.baseUrl ?? "") || api !== (provider.api ?? "openai-completions"))) ||
|
|
598
862
|
apiKey !== savedKey;
|
|
599
863
|
|
|
600
864
|
const handleSave = async () => {
|
|
601
865
|
setSaveState("saving");
|
|
602
866
|
let ok = true;
|
|
603
867
|
if (isCustom) {
|
|
604
|
-
|
|
868
|
+
const cfgPatch = {
|
|
605
869
|
name: providerName || undefined,
|
|
606
870
|
baseUrl: baseUrl || undefined,
|
|
607
871
|
api,
|
|
608
872
|
apiKey: apiKey || undefined,
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
873
|
+
compat: { supportsDeveloperRole },
|
|
874
|
+
};
|
|
875
|
+
// pi's model picker shows the provider key, not the display name, so
|
|
876
|
+
// rename the key too when the name changes (references get rewritten).
|
|
877
|
+
const nameChanged = providerName !== (provider.name ?? "");
|
|
878
|
+
const newId = nameChanged ? sanitizeProviderId(providerName) : "";
|
|
879
|
+
const taken = new Set(useConfigStore.getState().allProviders.map((p) => p.id));
|
|
880
|
+
if (newId && newId !== provider.id && !taken.has(newId)) {
|
|
881
|
+
ok = await renameCustomProvider(provider.id, newId, cfgPatch);
|
|
882
|
+
if (ok) onRenamed(newId);
|
|
883
|
+
} else {
|
|
884
|
+
ok = await updateCustomProvider(provider.id, cfgPatch);
|
|
885
|
+
}
|
|
886
|
+
} else {
|
|
887
|
+
// Builtin providers: baseUrl / api are persisted as a models.json
|
|
888
|
+
// override (so the user can point them at a proxy/gateway), while the
|
|
889
|
+
// API key stays in auth.json (the original behavior) to avoid creating a
|
|
890
|
+
// duplicate standalone custom-provider card.
|
|
891
|
+
const cfgPatch: Partial<CustomProviderConfig> = {};
|
|
892
|
+
if (baseUrl !== (provider.baseUrl ?? "")) cfgPatch.baseUrl = baseUrl || undefined;
|
|
893
|
+
if (api !== (provider.api ?? "openai-completions")) cfgPatch.api = api;
|
|
894
|
+
if (Object.keys(cfgPatch).length > 0) {
|
|
895
|
+
ok = await updateCustomProvider(provider.id, cfgPatch);
|
|
896
|
+
}
|
|
897
|
+
if (apiKey !== savedKey) {
|
|
898
|
+
const authOk = apiKey
|
|
899
|
+
? await setProviderAuth(provider.id, apiKey)
|
|
900
|
+
: await removeProviderAuth(provider.id);
|
|
901
|
+
ok = ok && authOk;
|
|
902
|
+
}
|
|
903
|
+
if (Object.keys(cfgPatch).length === 0 && apiKey === savedKey) ok = true;
|
|
614
904
|
}
|
|
615
905
|
setSaveState(ok ? "saved" : "error");
|
|
616
906
|
if (ok) setTimeout(() => setSaveState("idle"), 2500);
|
|
617
907
|
};
|
|
618
908
|
|
|
619
|
-
// Enabled state lives in settings.enabledModels ("provider/model" refs) —
|
|
620
|
-
// the same source pi reads, so toggling here matches the CLI behavior.
|
|
621
|
-
const isEnabled = (modelId: string) =>
|
|
622
|
-
settings?.enabledModels?.includes(`${provider.id}/${modelId}`) ?? false;
|
|
623
|
-
|
|
624
|
-
const handleToggle = (modelId: string) => {
|
|
625
|
-
const ref = `${provider.id}/${modelId}`;
|
|
626
|
-
if (isEnabled(modelId)) removeEnabledModel(ref);
|
|
627
|
-
else addEnabledModel(ref);
|
|
628
|
-
};
|
|
629
|
-
|
|
630
|
-
const setAllEnabled = (enable: boolean) => {
|
|
631
|
-
const list = settings?.enabledModels ?? [];
|
|
632
|
-
const refs = provider.models.map((m) => `${provider.id}/${m.id}`);
|
|
633
|
-
const next = enable
|
|
634
|
-
? Array.from(new Set([...list, ...refs]))
|
|
635
|
-
: list.filter((r) => !refs.includes(r));
|
|
636
|
-
updateSettings({ enabledModels: next });
|
|
637
|
-
};
|
|
638
|
-
|
|
639
909
|
const q = modelQuery.trim().toLowerCase();
|
|
640
|
-
const
|
|
910
|
+
const baseModels = q
|
|
641
911
|
? provider.models.filter(
|
|
642
912
|
(m) => m.id.toLowerCase().includes(q) || (m.name ?? "").toLowerCase().includes(q)
|
|
643
913
|
)
|
|
644
914
|
: provider.models;
|
|
645
915
|
|
|
916
|
+
// Look up the catalog family for a model id (for sorting/grouping)
|
|
917
|
+
const familyOf = (id: string): string => {
|
|
918
|
+
const hit = searchCatalog(id, 1)[0];
|
|
919
|
+
return hit?.family ?? "—";
|
|
920
|
+
};
|
|
921
|
+
|
|
922
|
+
const visibleModels = useMemo(() => {
|
|
923
|
+
const arr = [...baseModels];
|
|
924
|
+
if (modelSort === "family") {
|
|
925
|
+
arr.sort((a, b) => familyOf(a.id).localeCompare(familyOf(b.id)));
|
|
926
|
+
} else if (modelSort === "price-asc" || modelSort === "price-desc") {
|
|
927
|
+
const price = (m: typeof arr[number]) => m.cost?.input ?? 0;
|
|
928
|
+
arr.sort((a, b) => price(a) - price(b));
|
|
929
|
+
if (modelSort === "price-desc") arr.reverse();
|
|
930
|
+
}
|
|
931
|
+
return arr;
|
|
932
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
933
|
+
}, [baseModels, modelSort]);
|
|
934
|
+
|
|
646
935
|
return (
|
|
647
936
|
<div className="space-y-5">
|
|
648
937
|
{/* Header */}
|
|
@@ -692,17 +981,19 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
692
981
|
<input
|
|
693
982
|
type="text"
|
|
694
983
|
value={baseUrl}
|
|
695
|
-
disabled={!isCustom}
|
|
696
984
|
onChange={(e) => setBaseUrl(e.target.value)}
|
|
697
985
|
placeholder="https://api.example.com/v1"
|
|
698
986
|
className={cn(
|
|
699
|
-
"mt-1.5 w-full rounded-lg border bg-gray-800 px-3 py-2.5 text-sm text-white
|
|
987
|
+
"mt-1.5 w-full rounded-lg border bg-gray-800 px-3 py-2.5 text-sm text-white",
|
|
700
988
|
urlInvalid ? "border-red-500" : "border-gray-700"
|
|
701
989
|
)}
|
|
702
990
|
/>
|
|
703
991
|
{urlInvalid && (
|
|
704
992
|
<p className="mt-1 text-xs text-red-400">{t("providers_models.invalid_url")}</p>
|
|
705
993
|
)}
|
|
994
|
+
{!isCustom && !urlInvalid && baseUrl !== (provider.baseUrl ?? "") && (
|
|
995
|
+
<p className="mt-1 text-xs text-amber-400">{t("providers_models.baseurl_override")}</p>
|
|
996
|
+
)}
|
|
706
997
|
</div>
|
|
707
998
|
|
|
708
999
|
{/* API Type */}
|
|
@@ -710,9 +1001,8 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
710
1001
|
<label className="block text-sm text-gray-400">{t("providers.api_type")}</label>
|
|
711
1002
|
<select
|
|
712
1003
|
value={api}
|
|
713
|
-
disabled={!isCustom}
|
|
714
1004
|
onChange={(e) => setApi(e.target.value as ApiType)}
|
|
715
|
-
className="mt-1.5 w-full rounded-lg border border-gray-700 bg-gray-800 px-3 py-2.5 text-sm text-white
|
|
1005
|
+
className="mt-1.5 w-full rounded-lg border border-gray-700 bg-gray-800 px-3 py-2.5 text-sm text-white"
|
|
716
1006
|
>
|
|
717
1007
|
{API_TYPES.map((a) => (
|
|
718
1008
|
<option key={a.value} value={a.value}>{a.label}</option>
|
|
@@ -738,6 +1028,26 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
738
1028
|
{showKey ? <EyeOff className="h-4 w-4" /> : <Eye className="h-4 w-4" />}
|
|
739
1029
|
</button>
|
|
740
1030
|
</div>
|
|
1031
|
+
{apiKey.trim().startsWith("$") && (
|
|
1032
|
+
<p className="mt-1 text-xs text-sky-400">
|
|
1033
|
+
{t("providers_models.api_key_env", apiKey.trim())}
|
|
1034
|
+
</p>
|
|
1035
|
+
)}
|
|
1036
|
+
</div>
|
|
1037
|
+
|
|
1038
|
+
{/* Developer Role Support */}
|
|
1039
|
+
<div className="flex items-center gap-2">
|
|
1040
|
+
<input
|
|
1041
|
+
id="supports-developer-role"
|
|
1042
|
+
type="checkbox"
|
|
1043
|
+
checked={supportsDeveloperRole}
|
|
1044
|
+
onChange={(e) => setSupportsDeveloperRole(e.target.checked)}
|
|
1045
|
+
className="rounded border-gray-600 bg-gray-800 text-blue-500"
|
|
1046
|
+
/>
|
|
1047
|
+
<label htmlFor="supports-developer-role" className="text-sm text-gray-400">
|
|
1048
|
+
<span>{t("compat.supports_developer_role")}</span>
|
|
1049
|
+
<span className="ml-2 text-xs text-gray-500">{t("compat.supports_developer_role_desc")}</span>
|
|
1050
|
+
</label>
|
|
741
1051
|
</div>
|
|
742
1052
|
|
|
743
1053
|
{/* Save / Test / Feedback row */}
|
|
@@ -777,17 +1087,25 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
777
1087
|
{provider.models.length > 0 && (
|
|
778
1088
|
<div className="flex items-center gap-2">
|
|
779
1089
|
<button
|
|
780
|
-
onClick={() =>
|
|
781
|
-
className="rounded-md px-2 py-1 text-xs text-
|
|
1090
|
+
onClick={() => setAllModelsEnabled(true)}
|
|
1091
|
+
className="rounded-md border border-gray-700 px-2.5 py-1 text-xs text-gray-300 transition-colors hover:bg-gray-800 hover:text-white"
|
|
782
1092
|
>
|
|
783
1093
|
{t("providers_models.enable_all")}
|
|
784
1094
|
</button>
|
|
785
1095
|
<button
|
|
786
|
-
onClick={() =>
|
|
787
|
-
className="rounded-md px-2 py-1 text-xs text-gray-
|
|
1096
|
+
onClick={() => setAllModelsEnabled(false)}
|
|
1097
|
+
className="rounded-md border border-gray-700 px-2.5 py-1 text-xs text-gray-300 transition-colors hover:bg-gray-800 hover:text-white"
|
|
788
1098
|
>
|
|
789
1099
|
{t("providers_models.disable_all")}
|
|
790
1100
|
</button>
|
|
1101
|
+
<button
|
|
1102
|
+
onClick={handleTestAll}
|
|
1103
|
+
title={t("providers_models.test_all")}
|
|
1104
|
+
className="rounded-md border border-gray-700 px-2.5 py-1 text-xs text-gray-300 transition-colors hover:bg-gray-800 hover:text-white"
|
|
1105
|
+
>
|
|
1106
|
+
<Zap className="mr-1 inline h-3 w-3" />
|
|
1107
|
+
{t("providers_models.test_all")}
|
|
1108
|
+
</button>
|
|
791
1109
|
</div>
|
|
792
1110
|
)}
|
|
793
1111
|
</div>
|
|
@@ -805,6 +1123,22 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
805
1123
|
</div>
|
|
806
1124
|
)}
|
|
807
1125
|
|
|
1126
|
+
{provider.models.length > 1 && (
|
|
1127
|
+
<div className="mt-1.5 flex items-center gap-2">
|
|
1128
|
+
<label className="text-xs text-gray-500">{t("providers_models.sort_by")}</label>
|
|
1129
|
+
<select
|
|
1130
|
+
value={modelSort}
|
|
1131
|
+
onChange={(e) => setModelSort(e.target.value as typeof modelSort)}
|
|
1132
|
+
className="rounded-lg border border-gray-700 bg-gray-800 px-2 py-1.5 text-xs text-gray-200"
|
|
1133
|
+
>
|
|
1134
|
+
<option value="default">{t("providers_models.sort_default")}</option>
|
|
1135
|
+
<option value="family">{t("providers_models.sort_family")}</option>
|
|
1136
|
+
<option value="price-asc">{t("providers_models.sort_price_asc")}</option>
|
|
1137
|
+
<option value="price-desc">{t("providers_models.sort_price_desc")}</option>
|
|
1138
|
+
</select>
|
|
1139
|
+
</div>
|
|
1140
|
+
)}
|
|
1141
|
+
|
|
808
1142
|
<div className="mt-1.5 space-y-2 rounded-lg border border-gray-800 p-3">
|
|
809
1143
|
{provider.models.length === 0 && (
|
|
810
1144
|
<p className="px-1 py-2 text-sm text-gray-500">{t("models.no_models")}</p>
|
|
@@ -812,14 +1146,28 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
812
1146
|
{provider.models.length > 0 && visibleModels.length === 0 && (
|
|
813
1147
|
<p className="px-1 py-2 text-sm text-gray-500">{t("models.no_models")}</p>
|
|
814
1148
|
)}
|
|
815
|
-
{visibleModels.map((m) =>
|
|
1149
|
+
{visibleModels.map((m) => {
|
|
1150
|
+
const enabled = isModelEnabled(m.id);
|
|
1151
|
+
return (
|
|
816
1152
|
<div
|
|
817
1153
|
key={m.id}
|
|
818
|
-
className=
|
|
819
|
-
"flex items-center gap-2 rounded-lg border border-gray-700 bg-gray-900/70 px-3 py-2.5",
|
|
820
|
-
!isEnabled(m.id) && "opacity-50"
|
|
821
|
-
)}
|
|
1154
|
+
className="flex items-center gap-2 rounded-lg border border-gray-700 bg-gray-900/70 px-3 py-2.5"
|
|
822
1155
|
>
|
|
1156
|
+
<button
|
|
1157
|
+
onClick={() => toggleModelEnabled(m.id)}
|
|
1158
|
+
title={enabled ? t("models.enabled") : t("models.disabled")}
|
|
1159
|
+
className={cn(
|
|
1160
|
+
"relative inline-flex h-4 w-7 shrink-0 items-center rounded-full transition-colors",
|
|
1161
|
+
enabled ? "bg-emerald-500" : "bg-gray-600"
|
|
1162
|
+
)}
|
|
1163
|
+
>
|
|
1164
|
+
<span
|
|
1165
|
+
className={cn(
|
|
1166
|
+
"inline-block h-3 w-3 transform rounded-full bg-white transition-transform",
|
|
1167
|
+
enabled ? "translate-x-3.5" : "translate-x-0.5"
|
|
1168
|
+
)}
|
|
1169
|
+
/>
|
|
1170
|
+
</button>
|
|
823
1171
|
<Box className="h-4 w-4 shrink-0 text-gray-500" />
|
|
824
1172
|
<span className="min-w-0 flex-1 truncate font-mono text-sm text-gray-200">
|
|
825
1173
|
{m.id}
|
|
@@ -834,25 +1182,26 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
834
1182
|
<ImageIcon className="h-3.5 w-3.5 text-blue-400" />
|
|
835
1183
|
</span>
|
|
836
1184
|
)}
|
|
837
|
-
|
|
1185
|
+
{m.input?.includes("audio") && (
|
|
1186
|
+
<span title={t("models.audio_input")} className="flex shrink-0">
|
|
1187
|
+
<Mic className="h-3.5 w-3.5 text-emerald-400" />
|
|
1188
|
+
</span>
|
|
1189
|
+
)}
|
|
1190
|
+
<span
|
|
1191
|
+
className="rounded-md border border-gray-600 bg-gray-800/50 px-2 py-0.5 text-xs text-gray-400"
|
|
1192
|
+
title={
|
|
1193
|
+
m.cost
|
|
1194
|
+
? `In ${formatCost(m.cost.input, currency)} / Out ${formatCost(m.cost.output, currency)} · CacheR ${formatCost(m.cost.cacheRead ?? 0, currency)} / CacheW ${formatCost(m.cost.cacheWrite ?? 0, currency)}`
|
|
1195
|
+
: undefined
|
|
1196
|
+
}
|
|
1197
|
+
>
|
|
838
1198
|
{m.cost && (m.cost.input || m.cost.output)
|
|
839
|
-
?
|
|
1199
|
+
? `${formatCost(m.cost.input, currency)}/${formatCost(m.cost.output, currency)}`
|
|
840
1200
|
: t("models.free")}
|
|
841
1201
|
</span>
|
|
842
1202
|
<span className="rounded-md border border-gray-600 bg-gray-800/50 px-2 py-0.5 text-xs text-gray-400">
|
|
843
1203
|
{m.contextWindow ? formatTokens(m.contextWindow) : "—"}
|
|
844
1204
|
</span>
|
|
845
|
-
<button
|
|
846
|
-
onClick={() => handleToggle(m.id)}
|
|
847
|
-
className={cn(
|
|
848
|
-
"rounded-md px-2 py-1 text-xs transition-colors",
|
|
849
|
-
isEnabled(m.id)
|
|
850
|
-
? "text-emerald-400 hover:bg-emerald-500/10"
|
|
851
|
-
: "text-gray-500 hover:bg-gray-700"
|
|
852
|
-
)}
|
|
853
|
-
>
|
|
854
|
-
{isEnabled(m.id) ? t("models.enabled") : t("models.disabled")}
|
|
855
|
-
</button>
|
|
856
1205
|
{/* Test model */}
|
|
857
1206
|
{(() => {
|
|
858
1207
|
const test = getModelTest(m.id);
|
|
@@ -890,6 +1239,19 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
890
1239
|
);
|
|
891
1240
|
return null;
|
|
892
1241
|
})()}
|
|
1242
|
+
{copiedParams === m.id ? (
|
|
1243
|
+
<span className="flex items-center gap-1 px-1 text-xs text-emerald-400">
|
|
1244
|
+
<Check className="h-3.5 w-3.5" />
|
|
1245
|
+
</span>
|
|
1246
|
+
) : (
|
|
1247
|
+
<button
|
|
1248
|
+
onClick={() => handleCopyParams(m)}
|
|
1249
|
+
className="rounded-md p-1.5 text-gray-500 transition-colors hover:bg-gray-700 hover:text-gray-200"
|
|
1250
|
+
title={t("models.copy_params")}
|
|
1251
|
+
>
|
|
1252
|
+
<Copy className="h-3.5 w-3.5" />
|
|
1253
|
+
</button>
|
|
1254
|
+
)}
|
|
893
1255
|
<button
|
|
894
1256
|
onClick={() => setEditModel(m)}
|
|
895
1257
|
className="rounded-md p-1.5 text-gray-500 transition-colors hover:bg-gray-700 hover:text-gray-200"
|
|
@@ -905,8 +1267,48 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
905
1267
|
<Trash2 className="h-3.5 w-3.5" />
|
|
906
1268
|
</button>
|
|
907
1269
|
</div>
|
|
908
|
-
)
|
|
1270
|
+
);
|
|
1271
|
+
})}
|
|
909
1272
|
</div>
|
|
1273
|
+
{/* Quick-add input */}
|
|
1274
|
+
<div className="mt-3">
|
|
1275
|
+
<div className="flex gap-2">
|
|
1276
|
+
<div className="relative flex-1">
|
|
1277
|
+
<Wand2 className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-emerald-400" />
|
|
1278
|
+
<input
|
|
1279
|
+
type="text"
|
|
1280
|
+
value={quickId}
|
|
1281
|
+
onChange={(e) => setQuickId(e.target.value)}
|
|
1282
|
+
onKeyDown={(e) => {
|
|
1283
|
+
if (e.key === "Enter") { e.preventDefault(); handleQuickAdd(); }
|
|
1284
|
+
}}
|
|
1285
|
+
placeholder={t("models.quick_add_placeholder")}
|
|
1286
|
+
className="w-full rounded-lg border border-gray-700 bg-gray-800 py-2 pl-9 pr-3 text-sm text-white"
|
|
1287
|
+
/>
|
|
1288
|
+
</div>
|
|
1289
|
+
<button
|
|
1290
|
+
onClick={handleQuickAdd}
|
|
1291
|
+
disabled={!quickId.trim()}
|
|
1292
|
+
className="flex items-center gap-1.5 rounded-lg px-3 py-2 text-sm font-medium text-white transition-colors disabled:opacity-50"
|
|
1293
|
+
style={{ backgroundColor: "#10b981" }}
|
|
1294
|
+
>
|
|
1295
|
+
<Plus className="h-4 w-4" />
|
|
1296
|
+
{t("models.quick_add")}
|
|
1297
|
+
</button>
|
|
1298
|
+
<button
|
|
1299
|
+
onClick={() => setShowAddModel(true)}
|
|
1300
|
+
className="flex items-center gap-1.5 rounded-lg border border-gray-700 px-3 py-2 text-sm text-gray-300 transition-colors hover:bg-gray-800"
|
|
1301
|
+
>
|
|
1302
|
+
{t("models.add_model")}
|
|
1303
|
+
</button>
|
|
1304
|
+
</div>
|
|
1305
|
+
{quickHint && (
|
|
1306
|
+
<p className="mt-1.5 flex items-center gap-1 text-[11px] text-emerald-400">
|
|
1307
|
+
<Wand2 className="h-3 w-3" /> {quickHint}
|
|
1308
|
+
</p>
|
|
1309
|
+
)}
|
|
1310
|
+
</div>
|
|
1311
|
+
|
|
910
1312
|
<div className="flex flex-wrap gap-2 mt-3">
|
|
911
1313
|
<button
|
|
912
1314
|
onClick={fetchModels}
|
|
@@ -921,13 +1323,6 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
921
1323
|
{fetching ? <Loader2 className="h-4 w-4 animate-spin" /> : <Download className="h-4 w-4" />}
|
|
922
1324
|
{fetching ? t("providers_models.fetching") : t("providers_models.fetch_models")}
|
|
923
1325
|
</button>
|
|
924
|
-
<button
|
|
925
|
-
onClick={() => setShowAddModel(true)}
|
|
926
|
-
className="flex items-center gap-2 rounded-lg border border-gray-700 px-4 py-2 text-sm text-gray-300 transition-colors hover:bg-gray-800"
|
|
927
|
-
>
|
|
928
|
-
<Plus className="h-4 w-4" />
|
|
929
|
-
{t("models.add_model")}
|
|
930
|
-
</button>
|
|
931
1326
|
</div>
|
|
932
1327
|
</div>
|
|
933
1328
|
|
|
@@ -979,12 +1374,25 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
979
1374
|
</div>
|
|
980
1375
|
<input type="checkbox" checked={isSelected(m.id)} onChange={() => toggleSelect(m.id)} className="sr-only" />
|
|
981
1376
|
<span className="min-w-0 flex-1 truncate font-mono text-sm text-gray-200">{m.id}</span>
|
|
982
|
-
|
|
983
|
-
|
|
1377
|
+
{m.reasoning && (
|
|
1378
|
+
<span className="flex shrink-0 items-center rounded border border-purple-500/40 bg-purple-500/10 px-1.5 py-0.5 text-[10px] text-purple-400">
|
|
1379
|
+
<Brain className="h-3 w-3" />
|
|
1380
|
+
</span>
|
|
1381
|
+
)}
|
|
1382
|
+
<span className={`flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-[10px] ${m.vision ? "border-blue-500/40 bg-blue-500/10 text-blue-400" : "border-gray-700 bg-gray-800 text-gray-500"}`}>
|
|
1383
|
+
{m.vision ? <ImageIcon className="h-3 w-3" /> : <span className="h-3 w-3 inline-block" />}
|
|
984
1384
|
{m.vision ? t("providers_models.modality_vision") : t("providers_models.modality_text")}
|
|
985
1385
|
</span>
|
|
986
|
-
{m.
|
|
987
|
-
|
|
1386
|
+
{m.audio && (
|
|
1387
|
+
<span className="flex shrink-0 items-center rounded border border-emerald-500/40 bg-emerald-500/10 px-1.5 py-0.5 text-[10px] text-emerald-400">
|
|
1388
|
+
<Mic className="h-3 w-3" />
|
|
1389
|
+
</span>
|
|
1390
|
+
)}
|
|
1391
|
+
{m.contextWindow && <span className="rounded border border-gray-700 bg-gray-800 px-1.5 py-0.5 text-[10px] text-gray-500 font-mono">{formatTokens(m.contextWindow)}</span>}
|
|
1392
|
+
{m.maxTokens && <span className="rounded border border-gray-700 bg-gray-800 px-1.5 py-0.5 text-[10px] text-gray-500 font-mono">{formatTokens(m.maxTokens)}</span>}
|
|
1393
|
+
{m.cost && (m.cost.input || m.cost.output) ? (
|
|
1394
|
+
<span className="rounded border border-gray-700 bg-gray-800 px-1.5 py-0.5 text-[10px] text-gray-500 font-mono">${m.cost.input}/${m.cost.output}</span>
|
|
1395
|
+
) : null}
|
|
988
1396
|
</label>
|
|
989
1397
|
))}
|
|
990
1398
|
</div>
|
|
@@ -1090,16 +1498,16 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
1090
1498
|
|
|
1091
1499
|
// ─── Model Form (add & edit) ──────────────────────────────
|
|
1092
1500
|
|
|
1093
|
-
|
|
1094
|
-
initial,
|
|
1095
|
-
onSubmit,
|
|
1096
|
-
onCancel,
|
|
1097
|
-
}: {
|
|
1501
|
+
interface ModelFormProps {
|
|
1098
1502
|
initial?: Model;
|
|
1099
1503
|
onSubmit: (form: Partial<Model>) => void;
|
|
1100
1504
|
onCancel: () => void;
|
|
1101
|
-
}
|
|
1505
|
+
}
|
|
1506
|
+
|
|
1507
|
+
function ModelForm({ initial, onSubmit, onCancel }: ModelFormProps) {
|
|
1102
1508
|
const { t } = useTranslation();
|
|
1509
|
+
const isEdit = !!initial;
|
|
1510
|
+
|
|
1103
1511
|
const [form, setForm] = useState<Partial<Model>>(
|
|
1104
1512
|
initial
|
|
1105
1513
|
? { ...initial }
|
|
@@ -1113,10 +1521,191 @@ function ModelForm({
|
|
|
1113
1521
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
1114
1522
|
}
|
|
1115
1523
|
);
|
|
1116
|
-
|
|
1524
|
+
|
|
1525
|
+
// Which fields the user has manually changed (so auto-detect doesn't clobber them)
|
|
1526
|
+
const touchedRef = useRef<Set<string>>(new Set());
|
|
1527
|
+
const touch = (field: string) => { touchedRef.current.add(field); };
|
|
1528
|
+
const wasTouched = (field: string) => touchedRef.current.has(field);
|
|
1529
|
+
|
|
1530
|
+
// Auto-detect from model id when not editing and id changes
|
|
1531
|
+
const [detectHint, setDetectHint] = useState<string | null>(null);
|
|
1532
|
+
useEffect(() => {
|
|
1533
|
+
if (isEdit) return;
|
|
1534
|
+
const id = (form.id ?? "").trim();
|
|
1535
|
+
if (!id) { setDetectHint(null); return; }
|
|
1536
|
+
|
|
1537
|
+
const guess = guessModelMeta(id);
|
|
1538
|
+
if (guess.source === "default") { setDetectHint(null); return; }
|
|
1539
|
+
|
|
1540
|
+
setForm((prev) => {
|
|
1541
|
+
const next = { ...prev };
|
|
1542
|
+
if (guess.contextWindow && !wasTouched("contextWindow")) next.contextWindow = guess.contextWindow;
|
|
1543
|
+
if (!wasTouched("maxTokens")) {
|
|
1544
|
+
// Use reasonable maxTokens per context family when detected
|
|
1545
|
+
next.maxTokens = guess.contextWindow
|
|
1546
|
+
? (guess.contextWindow >= 1_000_000 ? 65536 : guess.contextWindow >= 200_000 ? 32768 : 8192)
|
|
1547
|
+
: DEFAULT_MAX_TOKENS;
|
|
1548
|
+
}
|
|
1549
|
+
if (guess.reasoning !== undefined && !wasTouched("reasoning")) next.reasoning = guess.reasoning;
|
|
1550
|
+
if (guess.input && !wasTouched("input")) next.input = [...guess.input];
|
|
1551
|
+
// Catalog match → also set name + cost
|
|
1552
|
+
if (guess.source === "catalog") {
|
|
1553
|
+
// Find the matched catalog entry for name + cost
|
|
1554
|
+
const entries = searchCatalog(id, 5);
|
|
1555
|
+
const match = entries.find((e) => e.patterns.some((p) => id.toLowerCase().includes(p.toLowerCase())));
|
|
1556
|
+
if (match) {
|
|
1557
|
+
if (!wasTouched("name")) next.name = match.name;
|
|
1558
|
+
if (match.cost && !wasTouched("cost")) next.cost = { ...match.cost };
|
|
1559
|
+
}
|
|
1560
|
+
}
|
|
1561
|
+
return next;
|
|
1562
|
+
});
|
|
1563
|
+
|
|
1564
|
+
setDetectHint(
|
|
1565
|
+
guess.source === "catalog" && guess.matched
|
|
1566
|
+
? t("models.detected_catalog", guess.matched)
|
|
1567
|
+
: t("models.detected_heuristic")
|
|
1568
|
+
);
|
|
1569
|
+
}, [form.id, isEdit, t]);
|
|
1570
|
+
|
|
1571
|
+
// ── Catalog picker (add-mode only) ──
|
|
1572
|
+
const [pickerOpen, setPickerOpen] = useState(false);
|
|
1573
|
+
const [pickerQuery, setPickerQuery] = useState("");
|
|
1574
|
+
const pickerResults = useMemo(
|
|
1575
|
+
() => searchCatalog(pickerQuery, 30),
|
|
1576
|
+
[pickerQuery]
|
|
1577
|
+
);
|
|
1578
|
+
const applyPreset = (entry: ReturnType<typeof searchCatalog>[number]) => {
|
|
1579
|
+
const preset = catalogToModel(entry);
|
|
1580
|
+
// Apply all fields as if they were default (no touch-marking)
|
|
1581
|
+
touchedRef.current = new Set();
|
|
1582
|
+
setForm((prev) => ({ ...prev, ...preset }));
|
|
1583
|
+
setPickerOpen(false);
|
|
1584
|
+
setDetectHint(t("models.detected_catalog", entry.name ?? entry.patterns[0] ?? ""));
|
|
1585
|
+
};
|
|
1586
|
+
|
|
1587
|
+
// Apply a quick template (Claude-style, GPT-style, Reasoning, Local small)
|
|
1588
|
+
const applyTemplate = (kind: "claude" | "gpt" | "reasoning" | "small") => {
|
|
1589
|
+
touchedRef.current = new Set();
|
|
1590
|
+
setForm((prev) => {
|
|
1591
|
+
switch (kind) {
|
|
1592
|
+
case "claude":
|
|
1593
|
+
return { ...prev, reasoning: true, input: ["text", "image"], contextWindow: 200_000, maxTokens: 8192 };
|
|
1594
|
+
case "gpt":
|
|
1595
|
+
return { ...prev, reasoning: false, input: ["text", "image"], contextWindow: 128_000, maxTokens: 16_384 };
|
|
1596
|
+
case "reasoning":
|
|
1597
|
+
return { ...prev, reasoning: true, input: ["text"], contextWindow: 128_000, maxTokens: 65_536 };
|
|
1598
|
+
case "small":
|
|
1599
|
+
return { ...prev, reasoning: false, input: ["text"], contextWindow: 32_768, maxTokens: 4096 };
|
|
1600
|
+
}
|
|
1601
|
+
});
|
|
1602
|
+
};
|
|
1603
|
+
|
|
1604
|
+
const setId = (v: string) => { touch("id"); setForm((p) => ({ ...p, id: v })); };
|
|
1605
|
+
const setName = (v: string) => { touch("name"); setForm((p) => ({ ...p, name: v })); };
|
|
1606
|
+
const setContextWindow = (v: number) => { touch("contextWindow"); setForm((p) => ({ ...p, contextWindow: v })); };
|
|
1607
|
+
const setMaxTokens = (v: number) => { touch("maxTokens"); setForm((p) => ({ ...p, maxTokens: v })); };
|
|
1608
|
+
const setReasoning = (v: boolean) => { touch("reasoning"); setForm((p) => ({ ...p, reasoning: v })); };
|
|
1609
|
+
const setImage = (v: boolean) => {
|
|
1610
|
+
touch("input");
|
|
1611
|
+
setForm((p) => ({ ...p, input: v ? ["text", "image"] : ["text"] }));
|
|
1612
|
+
};
|
|
1613
|
+
const setAudio = (v: boolean) => {
|
|
1614
|
+
touch("input");
|
|
1615
|
+
setForm((p) => {
|
|
1616
|
+
const hasText = p.input?.includes("text") ?? true;
|
|
1617
|
+
const hasImage = p.input?.includes("image") ?? false;
|
|
1618
|
+
const next: ("text" | "image" | "audio")[] = [];
|
|
1619
|
+
if (hasText) next.push("text");
|
|
1620
|
+
if (hasImage) next.push("image");
|
|
1621
|
+
if (v) next.push("audio");
|
|
1622
|
+
return { ...p, input: next };
|
|
1623
|
+
});
|
|
1624
|
+
};
|
|
1625
|
+
const setCostField = (field: keyof NonNullable<Model["cost"]>, v: number) => {
|
|
1626
|
+
touch("cost");
|
|
1627
|
+
setForm((p) => ({
|
|
1628
|
+
...p,
|
|
1629
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, ...p.cost, [field]: v },
|
|
1630
|
+
}));
|
|
1631
|
+
};
|
|
1117
1632
|
|
|
1118
1633
|
return (
|
|
1119
1634
|
<div className="space-y-4">
|
|
1635
|
+
{/* ── Catalog picker / templates (add-mode) ── */}
|
|
1636
|
+
{!isEdit && (
|
|
1637
|
+
<div className="rounded-lg border border-gray-800 bg-gray-900/40 p-3">
|
|
1638
|
+
<div className="flex items-center justify-between gap-2 flex-wrap">
|
|
1639
|
+
<button
|
|
1640
|
+
type="button"
|
|
1641
|
+
onClick={() => setPickerOpen((o) => !o)}
|
|
1642
|
+
className="flex items-center gap-1.5 rounded-md border border-gray-700 bg-gray-800 px-3 py-1.5 text-xs text-gray-300 hover:bg-gray-700"
|
|
1643
|
+
>
|
|
1644
|
+
<Sparkles className="h-3.5 w-3.5 text-amber-400" />
|
|
1645
|
+
{t("models.pick_preset")}
|
|
1646
|
+
</button>
|
|
1647
|
+
<div className="flex flex-wrap items-center gap-1.5">
|
|
1648
|
+
<span className="text-[10px] uppercase tracking-wide text-gray-500 mr-1">{t("models.manual_fill")}:</span>
|
|
1649
|
+
{([
|
|
1650
|
+
["claude", "models.preset_claude"],
|
|
1651
|
+
["gpt", "models.preset_gpt"],
|
|
1652
|
+
["reasoning", "models.preset_reasoning"],
|
|
1653
|
+
["small", "models.preset_small_local"],
|
|
1654
|
+
] as const).map(([kind, key]) => (
|
|
1655
|
+
<button
|
|
1656
|
+
key={kind}
|
|
1657
|
+
type="button"
|
|
1658
|
+
onClick={() => applyTemplate(kind)}
|
|
1659
|
+
className="rounded-md border border-gray-700 bg-gray-800/70 px-2 py-1 text-[11px] text-gray-400 hover:bg-gray-700 hover:text-gray-200"
|
|
1660
|
+
>
|
|
1661
|
+
{t(key)}
|
|
1662
|
+
</button>
|
|
1663
|
+
))}
|
|
1664
|
+
</div>
|
|
1665
|
+
</div>
|
|
1666
|
+
|
|
1667
|
+
{pickerOpen && (
|
|
1668
|
+
<div className="mt-3 space-y-2">
|
|
1669
|
+
<div className="relative">
|
|
1670
|
+
<Search className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-500" />
|
|
1671
|
+
<input
|
|
1672
|
+
autoFocus
|
|
1673
|
+
type="text"
|
|
1674
|
+
value={pickerQuery}
|
|
1675
|
+
onChange={(e) => setPickerQuery(e.target.value)}
|
|
1676
|
+
placeholder={t("models.pick_preset_placeholder")}
|
|
1677
|
+
className="w-full rounded-lg border border-gray-700 bg-gray-800 py-2 pl-9 pr-3 text-sm text-white"
|
|
1678
|
+
/>
|
|
1679
|
+
</div>
|
|
1680
|
+
<div className="max-h-56 overflow-y-auto rounded-lg border border-gray-800">
|
|
1681
|
+
{pickerResults.length === 0 && (
|
|
1682
|
+
<p className="px-3 py-4 text-center text-xs text-gray-500">—</p>
|
|
1683
|
+
)}
|
|
1684
|
+
{pickerResults.map((e) => (
|
|
1685
|
+
<button
|
|
1686
|
+
key={e.patterns[0]}
|
|
1687
|
+
type="button"
|
|
1688
|
+
onClick={() => applyPreset(e)}
|
|
1689
|
+
className="flex w-full items-center gap-3 border-b border-gray-800 px-3 py-2 text-left hover:bg-gray-800 last:border-0"
|
|
1690
|
+
>
|
|
1691
|
+
<span className="min-w-0 flex-1">
|
|
1692
|
+
<span className="block truncate text-sm text-gray-200">{e.name}</span>
|
|
1693
|
+
<span className="block truncate font-mono text-[11px] text-gray-500">{e.patterns[0]}</span>
|
|
1694
|
+
</span>
|
|
1695
|
+
{e.reasoning && <Brain className="h-3.5 w-3.5 shrink-0 text-purple-400" aria-label="reasoning" />}
|
|
1696
|
+
{e.input?.includes("image") && <ImageIcon className="h-3.5 w-3.5 shrink-0 text-blue-400" aria-label="vision" />}
|
|
1697
|
+
<span className="shrink-0 rounded border border-gray-700 bg-gray-800 px-1.5 py-0.5 text-[10px] font-mono text-gray-500">
|
|
1698
|
+
{formatTokens(e.contextWindow)}
|
|
1699
|
+
</span>
|
|
1700
|
+
</button>
|
|
1701
|
+
))}
|
|
1702
|
+
</div>
|
|
1703
|
+
</div>
|
|
1704
|
+
)}
|
|
1705
|
+
</div>
|
|
1706
|
+
)}
|
|
1707
|
+
|
|
1708
|
+
{/* ── Core fields ── */}
|
|
1120
1709
|
<div className="grid grid-cols-2 gap-4">
|
|
1121
1710
|
<div>
|
|
1122
1711
|
<label className="block text-xs font-medium text-gray-400">{t("models.model_id")} *</label>
|
|
@@ -1124,17 +1713,23 @@ function ModelForm({
|
|
|
1124
1713
|
type="text"
|
|
1125
1714
|
value={form.id ?? ""}
|
|
1126
1715
|
disabled={isEdit}
|
|
1127
|
-
onChange={(e) =>
|
|
1716
|
+
onChange={(e) => setId(e.target.value)}
|
|
1128
1717
|
placeholder="my-model-id"
|
|
1129
1718
|
className="mt-1 w-full rounded-lg border border-gray-700 bg-gray-800 px-3 py-2 text-sm text-white disabled:opacity-50"
|
|
1130
1719
|
/>
|
|
1720
|
+
{!isEdit && detectHint && (
|
|
1721
|
+
<p className="mt-1 flex items-center gap-1 text-[11px] text-emerald-400">
|
|
1722
|
+
<Wand2 className="h-3 w-3" />
|
|
1723
|
+
{detectHint}
|
|
1724
|
+
</p>
|
|
1725
|
+
)}
|
|
1131
1726
|
</div>
|
|
1132
1727
|
<div>
|
|
1133
1728
|
<label className="block text-xs font-medium text-gray-400">{t("models.display_name")}</label>
|
|
1134
1729
|
<input
|
|
1135
1730
|
type="text"
|
|
1136
1731
|
value={form.name ?? ""}
|
|
1137
|
-
onChange={(e) =>
|
|
1732
|
+
onChange={(e) => setName(e.target.value)}
|
|
1138
1733
|
placeholder="My Custom Model"
|
|
1139
1734
|
className="mt-1 w-full rounded-lg border border-gray-700 bg-gray-800 px-3 py-2 text-sm text-white"
|
|
1140
1735
|
/>
|
|
@@ -1144,7 +1739,7 @@ function ModelForm({
|
|
|
1144
1739
|
<input
|
|
1145
1740
|
type="number"
|
|
1146
1741
|
value={form.contextWindow ?? DEFAULT_CONTEXT_WINDOW}
|
|
1147
|
-
onChange={(e) =>
|
|
1742
|
+
onChange={(e) => setContextWindow(parseInt(e.target.value) || DEFAULT_CONTEXT_WINDOW)}
|
|
1148
1743
|
className="mt-1 w-full rounded-lg border border-gray-700 bg-gray-800 px-3 py-2 text-sm text-white"
|
|
1149
1744
|
/>
|
|
1150
1745
|
</div>
|
|
@@ -1153,34 +1748,44 @@ function ModelForm({
|
|
|
1153
1748
|
<input
|
|
1154
1749
|
type="number"
|
|
1155
1750
|
value={form.maxTokens ?? DEFAULT_MAX_TOKENS}
|
|
1156
|
-
onChange={(e) =>
|
|
1751
|
+
onChange={(e) => setMaxTokens(parseInt(e.target.value) || DEFAULT_MAX_TOKENS)}
|
|
1157
1752
|
className="mt-1 w-full rounded-lg border border-gray-700 bg-gray-800 px-3 py-2 text-sm text-white"
|
|
1158
1753
|
/>
|
|
1159
1754
|
</div>
|
|
1160
1755
|
</div>
|
|
1161
1756
|
|
|
1162
1757
|
{/* Capabilities */}
|
|
1163
|
-
<div className="flex flex-wrap gap-
|
|
1758
|
+
<div className="flex flex-wrap gap-4">
|
|
1164
1759
|
<label className="flex items-center gap-2 text-sm text-gray-300">
|
|
1165
1760
|
<input
|
|
1166
1761
|
type="checkbox"
|
|
1167
1762
|
checked={form.reasoning ?? false}
|
|
1168
|
-
onChange={(e) =>
|
|
1763
|
+
onChange={(e) => setReasoning(e.target.checked)}
|
|
1169
1764
|
className="rounded border-gray-600 bg-gray-800 text-blue-500"
|
|
1170
1765
|
/>
|
|
1766
|
+
<Brain className="h-3.5 w-3.5 text-purple-400" />
|
|
1171
1767
|
{t("models.reasoning")}
|
|
1172
1768
|
</label>
|
|
1173
1769
|
<label className="flex items-center gap-2 text-sm text-gray-300">
|
|
1174
1770
|
<input
|
|
1175
1771
|
type="checkbox"
|
|
1176
1772
|
checked={form.input?.includes("image") ?? false}
|
|
1177
|
-
onChange={(e) =>
|
|
1178
|
-
setForm({ ...form, input: e.target.checked ? ["text", "image"] : ["text"] })
|
|
1179
|
-
}
|
|
1773
|
+
onChange={(e) => setImage(e.target.checked)}
|
|
1180
1774
|
className="rounded border-gray-600 bg-gray-800 text-blue-500"
|
|
1181
1775
|
/>
|
|
1776
|
+
<ImageIcon className="h-3.5 w-3.5 text-blue-400" />
|
|
1182
1777
|
{t("models.image_input")}
|
|
1183
1778
|
</label>
|
|
1779
|
+
<label className="flex items-center gap-2 text-sm text-gray-300">
|
|
1780
|
+
<input
|
|
1781
|
+
type="checkbox"
|
|
1782
|
+
checked={form.input?.includes("audio") ?? false}
|
|
1783
|
+
onChange={(e) => setAudio(e.target.checked)}
|
|
1784
|
+
className="rounded border-gray-600 bg-gray-800 text-blue-500"
|
|
1785
|
+
/>
|
|
1786
|
+
<Mic className="h-3.5 w-3.5 text-emerald-400" />
|
|
1787
|
+
{t("models.audio_input")}
|
|
1788
|
+
</label>
|
|
1184
1789
|
</div>
|
|
1185
1790
|
|
|
1186
1791
|
{/* Cost */}
|
|
@@ -1199,22 +1804,17 @@ function ModelForm({
|
|
|
1199
1804
|
type="number"
|
|
1200
1805
|
step="0.01"
|
|
1201
1806
|
value={form.cost?.[field] ?? 0}
|
|
1202
|
-
onChange={(e) =>
|
|
1203
|
-
setForm({
|
|
1204
|
-
...form,
|
|
1205
|
-
cost: {
|
|
1206
|
-
input: 0, output: 0, cacheRead: 0, cacheWrite: 0,
|
|
1207
|
-
...form.cost,
|
|
1208
|
-
[field]: parseFloat(e.target.value) || 0,
|
|
1209
|
-
},
|
|
1210
|
-
})
|
|
1211
|
-
}
|
|
1807
|
+
onChange={(e) => setCostField(field, parseFloat(e.target.value) || 0)}
|
|
1212
1808
|
className="mt-1 w-full rounded-lg border border-gray-700 bg-gray-800 px-3 py-2 text-sm text-white"
|
|
1213
1809
|
/>
|
|
1214
1810
|
</div>
|
|
1215
1811
|
))}
|
|
1216
1812
|
</div>
|
|
1217
1813
|
|
|
1814
|
+
{!isEdit && (
|
|
1815
|
+
<p className="text-[11px] text-gray-500">{t("models.catalog_hint")}</p>
|
|
1816
|
+
)}
|
|
1817
|
+
|
|
1218
1818
|
<div className="flex justify-end gap-3 pt-2">
|
|
1219
1819
|
<button onClick={onCancel} className="rounded-lg px-4 py-2 text-sm text-gray-400 hover:bg-gray-800">
|
|
1220
1820
|
{t("models.cancel")}
|
|
@@ -1459,7 +2059,7 @@ function ImportProviderModal({
|
|
|
1459
2059
|
const [fetching, setFetching] = useState(false);
|
|
1460
2060
|
const [fetchErr, setFetchErr] = useState<string | null>(null);
|
|
1461
2061
|
const [fetchDone, setFetchDone] = useState(false);
|
|
1462
|
-
const [fetchedModels, setFetchedModels] = useState<
|
|
2062
|
+
const [fetchedModels, setFetchedModels] = useState<FetchedModel[]>([]);
|
|
1463
2063
|
const [fetchSel, setFetchSel] = useState<Set<string>>(new Set());
|
|
1464
2064
|
|
|
1465
2065
|
// Re-parse on every paste/edit of the raw text; fields below stay editable
|
|
@@ -1518,7 +2118,7 @@ function ImportProviderModal({
|
|
|
1518
2118
|
if (data.error) {
|
|
1519
2119
|
setFetchErr(data.error);
|
|
1520
2120
|
} else {
|
|
1521
|
-
const models = (data.models ?? []) as
|
|
2121
|
+
const models = (data.models ?? []) as FetchedModel[];
|
|
1522
2122
|
setFetchedModels(models);
|
|
1523
2123
|
// Select everything by default so import is a single click
|
|
1524
2124
|
setFetchSel(new Set(models.map((m) => m.id)));
|
|
@@ -1560,15 +2160,30 @@ function ImportProviderModal({
|
|
|
1560
2160
|
maxTokens: DEFAULT_MAX_TOKENS,
|
|
1561
2161
|
...defaults,
|
|
1562
2162
|
})),
|
|
1563
|
-
// Fetched models carry real context/output
|
|
1564
|
-
...selectedFetched.map((m) =>
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
2163
|
+
// Fetched models carry real context/output/reasoning/cost when the endpoint provides them
|
|
2164
|
+
...selectedFetched.map((m) => {
|
|
2165
|
+
const input: Model["input"] = ["text"];
|
|
2166
|
+
if (m.vision) input.push("image");
|
|
2167
|
+
if (m.audio) input.push("audio");
|
|
2168
|
+
const cost = m.cost
|
|
2169
|
+
? {
|
|
2170
|
+
input: m.cost.input ?? 0,
|
|
2171
|
+
output: m.cost.output ?? 0,
|
|
2172
|
+
cacheRead: m.cost.cacheRead ?? 0,
|
|
2173
|
+
cacheWrite: m.cost.cacheWrite ?? 0,
|
|
2174
|
+
}
|
|
2175
|
+
: defaults.cost;
|
|
2176
|
+
return {
|
|
2177
|
+
...defaults,
|
|
2178
|
+
id: m.id,
|
|
2179
|
+
name: m.name ?? (m.id.split("/").pop() || m.id),
|
|
2180
|
+
reasoning: m.reasoning ?? false,
|
|
2181
|
+
input,
|
|
2182
|
+
contextWindow: m.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
|
|
2183
|
+
maxTokens: m.maxTokens ?? DEFAULT_MAX_TOKENS,
|
|
2184
|
+
cost,
|
|
2185
|
+
};
|
|
2186
|
+
}),
|
|
1572
2187
|
];
|
|
1573
2188
|
const newIds = newModels.map((m) => m.id);
|
|
1574
2189
|
|
|
@@ -1785,15 +2400,22 @@ function ImportProviderModal({
|
|
|
1785
2400
|
className="h-3.5 w-3.5 accent-blue-500"
|
|
1786
2401
|
/>
|
|
1787
2402
|
<span className="truncate font-mono text-xs text-gray-200">{m.id}</span>
|
|
1788
|
-
<span className=
|
|
1789
|
-
{m.
|
|
1790
|
-
{m.
|
|
1791
|
-
|
|
1792
|
-
|
|
1793
|
-
|
|
1794
|
-
{formatTokens(m.contextWindow)}
|
|
2403
|
+
<span className="ml-auto flex shrink-0 items-center gap-1">
|
|
2404
|
+
{m.reasoning && <Brain className="h-3 w-3 text-purple-400" />}
|
|
2405
|
+
{m.audio && <Mic className="h-3 w-3 text-emerald-400" />}
|
|
2406
|
+
<span className={`flex items-center gap-1 rounded border px-1 py-px text-[10px] ${m.vision ? "border-blue-500/40 bg-blue-500/10 text-blue-400" : "border-gray-700 bg-gray-800 text-gray-500"}`}>
|
|
2407
|
+
{m.vision && <ImageIcon className="h-2.5 w-2.5" />}
|
|
2408
|
+
{m.vision ? t("providers_models.modality_vision") : t("providers_models.modality_text")}
|
|
1795
2409
|
</span>
|
|
1796
|
-
|
|
2410
|
+
{m.contextWindow && (
|
|
2411
|
+
<span className="shrink-0 text-[10px] text-gray-500 font-mono">
|
|
2412
|
+
{formatTokens(m.contextWindow)}
|
|
2413
|
+
</span>
|
|
2414
|
+
)}
|
|
2415
|
+
{m.cost && (m.cost.input || m.cost.output) ? (
|
|
2416
|
+
<span className="shrink-0 text-[10px] text-gray-500 font-mono">${m.cost.input}/${m.cost.output}</span>
|
|
2417
|
+
) : null}
|
|
2418
|
+
</span>
|
|
1797
2419
|
</label>
|
|
1798
2420
|
))}
|
|
1799
2421
|
</div>
|