@raingor/pi-web-switch 0.3.3 → 0.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.ja.md +17 -1
- package/README.md +17 -1
- package/README.zh-CN.md +17 -1
- package/package.json +45 -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/server/pi-reader.ts +199 -70
- package/src/components/layout/Sidebar.tsx +1 -5
- package/src/components/providers/ProvidersModelsPage.tsx +743 -139
- 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/index.css +5 -1
- package/src/lib/config.ts +61 -0
- package/src/lib/translations/en.ts +30 -0
- package/src/lib/translations/ja.ts +30 -0
- package/src/lib/translations/zh-CN.ts +30 -0
- package/src/lib/translations/zh-TW.ts +30 -0
- package/src/main.tsx +9 -0
- package/src/store/config-store.ts +37 -21
- package/tsconfig.json +1 -1
- package/vite.config.ts +9 -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);
|
|
@@ -144,30 +166,107 @@ function parseProviderImport(raw: string): ParsedImport {
|
|
|
144
166
|
return out;
|
|
145
167
|
}
|
|
146
168
|
|
|
169
|
+
// ─── Enabled Models Panel (cross-provider) ────────────────
|
|
170
|
+
// Lists every enabled model across all providers. Shares settings.enabledModels
|
|
171
|
+
// as the single source of truth with the per-provider model rows, so toggling
|
|
172
|
+
// here stays in sync with the enable/disable state inside each provider.
|
|
173
|
+
|
|
174
|
+
function EnabledModelsPanel() {
|
|
175
|
+
const { t } = useTranslation();
|
|
176
|
+
const { allModels, settings, removeEnabledModel, updateSettings } = useConfigStore();
|
|
177
|
+
const enabledSet = new Set(settings?.enabledModels ?? []);
|
|
178
|
+
const enabledModels = allModels.filter((m) => enabledSet.has(`${m.providerId}/${m.id}`));
|
|
179
|
+
|
|
180
|
+
const disableAll = () => updateSettings({ enabledModels: [] });
|
|
181
|
+
|
|
182
|
+
return (
|
|
183
|
+
<div className="rounded-xl border border-gray-800 bg-gray-900/50 p-4">
|
|
184
|
+
<div className="flex items-center justify-between gap-3">
|
|
185
|
+
<div className="flex items-center gap-2">
|
|
186
|
+
<Zap className="h-4 w-4 text-emerald-400" />
|
|
187
|
+
<h2 className="text-sm font-semibold" style={{ color: "var(--page-text)" }}>
|
|
188
|
+
{t("providers_models.enabled_models_title")}
|
|
189
|
+
</h2>
|
|
190
|
+
<span className="rounded-full border border-gray-700 bg-gray-800 px-2 py-0.5 text-xs text-gray-400">
|
|
191
|
+
{enabledModels.length}
|
|
192
|
+
</span>
|
|
193
|
+
</div>
|
|
194
|
+
{enabledModels.length > 0 && (
|
|
195
|
+
<button
|
|
196
|
+
onClick={disableAll}
|
|
197
|
+
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"
|
|
198
|
+
>
|
|
199
|
+
{t("providers_models.disable_all")}
|
|
200
|
+
</button>
|
|
201
|
+
)}
|
|
202
|
+
</div>
|
|
203
|
+
|
|
204
|
+
{enabledModels.length === 0 ? (
|
|
205
|
+
<p className="mt-3 text-sm text-gray-500">{t("providers_models.no_enabled_models")}</p>
|
|
206
|
+
) : (
|
|
207
|
+
<div className="mt-3 grid max-h-72 gap-1.5 overflow-y-auto pr-1 lg:grid-cols-2">
|
|
208
|
+
{enabledModels.map((m) => {
|
|
209
|
+
const ref = `${m.providerId}/${m.id}`;
|
|
210
|
+
return (
|
|
211
|
+
<div
|
|
212
|
+
key={ref}
|
|
213
|
+
className="flex items-center gap-2 rounded-lg border border-gray-700 bg-gray-900/70 px-3 py-2"
|
|
214
|
+
>
|
|
215
|
+
<button
|
|
216
|
+
onClick={() => removeEnabledModel(ref)}
|
|
217
|
+
title={t("models.enabled")}
|
|
218
|
+
className="relative inline-flex h-4 w-7 shrink-0 items-center rounded-full bg-emerald-500 transition-colors"
|
|
219
|
+
>
|
|
220
|
+
<span className="inline-block h-3 w-3 transform translate-x-3.5 rounded-full bg-white transition-transform" />
|
|
221
|
+
</button>
|
|
222
|
+
<Box className="h-4 w-4 shrink-0 text-gray-500" />
|
|
223
|
+
<span className="min-w-0 flex-1 truncate font-mono text-sm text-gray-200">
|
|
224
|
+
{m.name || m.id}
|
|
225
|
+
</span>
|
|
226
|
+
<span className="shrink-0 rounded-md border border-gray-600 bg-gray-800/50 px-2 py-0.5 text-xs text-gray-400">
|
|
227
|
+
{m.providerName}
|
|
228
|
+
</span>
|
|
229
|
+
</div>
|
|
230
|
+
);
|
|
231
|
+
})}
|
|
232
|
+
</div>
|
|
233
|
+
)}
|
|
234
|
+
</div>
|
|
235
|
+
);
|
|
236
|
+
}
|
|
237
|
+
|
|
147
238
|
export function ProvidersModelsPage() {
|
|
148
239
|
const { t } = useTranslation();
|
|
149
240
|
const { allProviders, auth, modelsJson, removeCustomProvider } = useConfigStore();
|
|
241
|
+
const hasKey = (p: Provider) => p.hasAuth || !!p.apiKey || !!auth?.[p.id]?.key;
|
|
150
242
|
|
|
151
|
-
const builtinProviders = allProviders
|
|
243
|
+
const builtinProviders = allProviders
|
|
244
|
+
.filter((p) => p.type === "builtin")
|
|
245
|
+
.sort((a, b) => {
|
|
246
|
+
const aKey = hasKey(a) ? 1 : 0;
|
|
247
|
+
const bKey = hasKey(b) ? 1 : 0;
|
|
248
|
+
if (aKey !== bKey) return bKey - aKey;
|
|
249
|
+
return a.name.localeCompare(b.name);
|
|
250
|
+
});
|
|
152
251
|
const customProviders = allProviders.filter((p) => p.type === "custom");
|
|
153
252
|
|
|
154
253
|
const [selectedId, setSelectedId] = useState<string | null>(null);
|
|
155
254
|
const [adding, setAdding] = useState(false);
|
|
156
255
|
const [importing, setImporting] = useState(false);
|
|
157
256
|
const [importBump, setImportBump] = useState(0);
|
|
257
|
+
const [builtinExpanded, setBuiltinExpanded] = useState(false);
|
|
158
258
|
const [deleteConfirm, setDeleteConfirm] = useState<string | null>(null);
|
|
159
259
|
const [deleteError, setDeleteError] = useState(false);
|
|
160
260
|
|
|
161
261
|
// Keep a valid selection (default: first custom, else first builtin)
|
|
162
262
|
const selected = allProviders.find((p) => p.id === selectedId) ?? null;
|
|
263
|
+
const visibleBuiltinProviders = builtinExpanded ? builtinProviders : builtinProviders.slice(0, 10);
|
|
163
264
|
useEffect(() => {
|
|
164
265
|
if (!selected && !adding && allProviders.length > 0) {
|
|
165
266
|
setSelectedId(customProviders[0]?.id ?? allProviders[0]?.id ?? null);
|
|
166
267
|
}
|
|
167
268
|
}, [selected, adding, allProviders, customProviders]);
|
|
168
269
|
|
|
169
|
-
const hasKey = (p: Provider) => p.hasAuth || !!p.apiKey || !!auth?.[p.id]?.key;
|
|
170
|
-
|
|
171
270
|
const handleAddProvider = async (id: string, cfg: CustomProviderConfig): Promise<boolean> => {
|
|
172
271
|
const ok = await useConfigStore.getState().addCustomProvider(id, cfg);
|
|
173
272
|
if (ok) {
|
|
@@ -191,18 +290,36 @@ export function ProvidersModelsPage() {
|
|
|
191
290
|
|
|
192
291
|
const handleDuplicateProvider = async (id: string) => {
|
|
193
292
|
const existing = modelsJson?.providers[id];
|
|
194
|
-
|
|
293
|
+
// Resolve the source models: prefer models.json override, else the
|
|
294
|
+
// builtin provider's model list so duplicates keep their models.
|
|
295
|
+
const sourceProvider = allProviders.find((p) => p.id === id);
|
|
296
|
+
const sourceModels = existing?.models ?? sourceProvider?.models ?? [];
|
|
195
297
|
const suffix = "-copy";
|
|
196
|
-
|
|
197
|
-
//
|
|
298
|
+
let newId = sanitizeProviderId(id + suffix);
|
|
299
|
+
// Ensure uniqueness against existing provider ids
|
|
300
|
+
const taken = new Set(allProviders.map((p) => p.id));
|
|
301
|
+
let i = 2;
|
|
302
|
+
while (taken.has(newId)) newId = sanitizeProviderId(`${id}-copy${i++}`);
|
|
303
|
+
// Copy config but clear apiKey; carry models + headers + overrides
|
|
198
304
|
const cfg: CustomProviderConfig = {
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
305
|
+
name: `${sourceProvider?.name ?? id} (copy)`,
|
|
306
|
+
baseUrl: existing?.baseUrl ?? sourceProvider?.baseUrl,
|
|
307
|
+
api: existing?.api ?? sourceProvider?.api,
|
|
308
|
+
headers: existing?.headers,
|
|
309
|
+
compat: existing?.compat,
|
|
310
|
+
modelOverrides: existing?.modelOverrides,
|
|
311
|
+
models: sourceModels.map((m) => ({ ...m, enabled: true })),
|
|
203
312
|
};
|
|
204
313
|
const ok = await useConfigStore.getState().addCustomProvider(newId, cfg);
|
|
205
|
-
if (ok)
|
|
314
|
+
if (ok) {
|
|
315
|
+
// Enable the carried models in settings.enabledModels
|
|
316
|
+
const list = useConfigStore.getState().settings?.enabledModels ?? [];
|
|
317
|
+
const refs = sourceModels.map((m) => `${newId}/${m.id}`);
|
|
318
|
+
await useConfigStore.getState().updateSettings({
|
|
319
|
+
enabledModels: Array.from(new Set([...list, ...refs])),
|
|
320
|
+
});
|
|
321
|
+
setSelectedId(newId);
|
|
322
|
+
}
|
|
206
323
|
};
|
|
207
324
|
|
|
208
325
|
return (
|
|
@@ -216,28 +333,50 @@ export function ProvidersModelsPage() {
|
|
|
216
333
|
</p>
|
|
217
334
|
</div>
|
|
218
335
|
|
|
336
|
+
<EnabledModelsPanel />
|
|
337
|
+
|
|
219
338
|
<div className="flex overflow-hidden rounded-xl border border-gray-800 bg-gray-900/50">
|
|
220
339
|
{/* ─── Left: Provider List ─────────────────────── */}
|
|
221
340
|
<div className="w-60 shrink-0 border-r border-gray-800 p-3">
|
|
222
341
|
{builtinProviders.length > 0 && (
|
|
223
342
|
<>
|
|
224
|
-
<
|
|
225
|
-
|
|
226
|
-
|
|
343
|
+
<div className="flex items-center justify-between px-2 pb-2 pt-1">
|
|
344
|
+
<p className="text-xs font-medium uppercase tracking-wider text-gray-500">
|
|
345
|
+
{t("providers.builtin")} ({builtinProviders.length})
|
|
346
|
+
</p>
|
|
347
|
+
</div>
|
|
227
348
|
<div className="space-y-0.5">
|
|
228
|
-
{
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
349
|
+
{visibleBuiltinProviders.map((p) => (
|
|
350
|
+
<ProviderListItem
|
|
351
|
+
key={p.id}
|
|
352
|
+
provider={p}
|
|
353
|
+
active={!adding && selectedId === p.id}
|
|
354
|
+
hasKey={hasKey(p)}
|
|
355
|
+
onClick={() => {
|
|
356
|
+
setAdding(false);
|
|
357
|
+
setSelectedId(p.id);
|
|
358
|
+
}}
|
|
359
|
+
/>
|
|
239
360
|
))}
|
|
240
361
|
</div>
|
|
362
|
+
{builtinProviders.length > 10 && (
|
|
363
|
+
<button
|
|
364
|
+
onClick={() => setBuiltinExpanded(!builtinExpanded)}
|
|
365
|
+
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"
|
|
366
|
+
>
|
|
367
|
+
{builtinExpanded ? (
|
|
368
|
+
<>
|
|
369
|
+
<ChevronUp className="h-3.5 w-3.5" />
|
|
370
|
+
{t("providers_models.collapse")}
|
|
371
|
+
</>
|
|
372
|
+
) : (
|
|
373
|
+
<>
|
|
374
|
+
<ChevronDown className="h-3.5 w-3.5" />
|
|
375
|
+
{t("providers_models.expand", String(builtinProviders.length - 10))}
|
|
376
|
+
</>
|
|
377
|
+
)}
|
|
378
|
+
</button>
|
|
379
|
+
)}
|
|
241
380
|
</>
|
|
242
381
|
)}
|
|
243
382
|
|
|
@@ -460,6 +599,7 @@ function TestConnectionButton({ baseUrl, apiKey }: { baseUrl: string; apiKey?: s
|
|
|
460
599
|
|
|
461
600
|
function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provider; onDelete: () => void; onDuplicate: () => void }) {
|
|
462
601
|
const { t } = useTranslation();
|
|
602
|
+
const { currency } = useCurrency();
|
|
463
603
|
const {
|
|
464
604
|
auth,
|
|
465
605
|
settings,
|
|
@@ -474,6 +614,27 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
474
614
|
removeEnabledModel,
|
|
475
615
|
} = useConfigStore();
|
|
476
616
|
|
|
617
|
+
// Whether a model is currently enabled (source of truth: settings.enabledModels)
|
|
618
|
+
const enabledRefs = new Set(settings?.enabledModels ?? []);
|
|
619
|
+
const isModelEnabled = (modelId: string) => enabledRefs.has(`${provider.id}/${modelId}`);
|
|
620
|
+
|
|
621
|
+
// Toggle a single model's enabled state
|
|
622
|
+
const toggleModelEnabled = (modelId: string) => {
|
|
623
|
+
const ref = `${provider.id}/${modelId}`;
|
|
624
|
+
if (enabledRefs.has(ref)) removeEnabledModel(ref);
|
|
625
|
+
else addEnabledModel(ref);
|
|
626
|
+
};
|
|
627
|
+
|
|
628
|
+
// Enable/disable all models of this provider at once (batched)
|
|
629
|
+
const setAllModelsEnabled = async (on: boolean) => {
|
|
630
|
+
const list = settings?.enabledModels ?? [];
|
|
631
|
+
const refs = provider.models.map((m) => `${provider.id}/${m.id}`);
|
|
632
|
+
const set = new Set(list);
|
|
633
|
+
if (on) refs.forEach((r) => set.add(r));
|
|
634
|
+
else refs.forEach((r) => set.delete(r));
|
|
635
|
+
await updateSettings({ enabledModels: Array.from(set) });
|
|
636
|
+
};
|
|
637
|
+
|
|
477
638
|
const isCustom = provider.type === "custom";
|
|
478
639
|
const savedKey = provider.apiKey ?? auth?.[provider.id]?.key ?? "";
|
|
479
640
|
|
|
@@ -486,13 +647,22 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
486
647
|
const [showAddModel, setShowAddModel] = useState(false);
|
|
487
648
|
const [deleteModel, setDeleteModel] = useState<Model | null>(null);
|
|
488
649
|
const [modelQuery, setModelQuery] = useState("");
|
|
650
|
+
const [modelSort, setModelSort] = useState<"default" | "family" | "price-asc" | "price-desc">("default");
|
|
651
|
+
const [supportsDeveloperRole, setSupportsDeveloperRole] = useState(
|
|
652
|
+
provider.compat?.supportsDeveloperRole ?? false
|
|
653
|
+
);
|
|
489
654
|
const [saveState, setSaveState] = useState<"idle" | "saving" | "saved" | "error">("idle");
|
|
490
655
|
|
|
656
|
+
// ─── Quick add (inline, one-liner) ───
|
|
657
|
+
const [quickId, setQuickId] = useState("");
|
|
658
|
+
const [quickHint, setQuickHint] = useState<string | null>(null);
|
|
659
|
+
const [copiedParams, setCopiedParams] = useState<string | null>(null);
|
|
660
|
+
|
|
491
661
|
// ─── Fetch Models State ───
|
|
492
662
|
const [fetchOpen, setFetchOpen] = useState(false);
|
|
493
663
|
const [fetching, setFetching] = useState(false);
|
|
494
664
|
const [fetchError, setFetchError] = useState<string | null>(null);
|
|
495
|
-
const [fetchedModels, setFetchedModels] = useState<
|
|
665
|
+
const [fetchedModels, setFetchedModels] = useState<FetchedModel[]>([]);
|
|
496
666
|
const [fetchSelected, setFetchSelected] = useState<Set<string>>(new Set());
|
|
497
667
|
const [fetchImported, setFetchImported] = useState<number | null>(null);
|
|
498
668
|
|
|
@@ -547,7 +717,18 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
547
717
|
const selected = availableModels.filter((m) => isSelected(m.id));
|
|
548
718
|
if (selected.length === 0) return;
|
|
549
719
|
selected.forEach((m) => {
|
|
550
|
-
|
|
720
|
+
const input: Model["input"] = ["text"];
|
|
721
|
+
if (m.vision) input.push("image");
|
|
722
|
+
if (m.audio) input.push("audio");
|
|
723
|
+
addModel(provider.id, {
|
|
724
|
+
id: m.id,
|
|
725
|
+
name: m.name,
|
|
726
|
+
reasoning: m.reasoning ?? false,
|
|
727
|
+
input,
|
|
728
|
+
contextWindow: m.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
|
|
729
|
+
maxTokens: m.maxTokens ?? DEFAULT_MAX_TOKENS,
|
|
730
|
+
cost: m.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
731
|
+
} as Model);
|
|
551
732
|
});
|
|
552
733
|
// Enable in a single batched write — per-model addEnabledModel calls race
|
|
553
734
|
// on the same settings snapshot and overwrite each other.
|
|
@@ -591,10 +772,86 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
591
772
|
}
|
|
592
773
|
};
|
|
593
774
|
|
|
594
|
-
|
|
775
|
+
// Test every model of the provider sequentially (reuses /api/pi/model-test).
|
|
776
|
+
const handleTestAll = async () => {
|
|
777
|
+
for (const m of provider.models) {
|
|
778
|
+
await handleTestModel(m);
|
|
779
|
+
}
|
|
780
|
+
};
|
|
781
|
+
|
|
782
|
+
// Quick-add id changes → live hint
|
|
783
|
+
useEffect(() => {
|
|
784
|
+
const id = quickId.trim();
|
|
785
|
+
if (!id) { setQuickHint(null); return; }
|
|
786
|
+
const g = guessModelMeta(id);
|
|
787
|
+
setQuickHint(
|
|
788
|
+
g.source === "catalog" && g.matched
|
|
789
|
+
? t("models.detected_catalog", g.matched)
|
|
790
|
+
: g.source === "heuristic"
|
|
791
|
+
? t("models.detected_heuristic")
|
|
792
|
+
: null
|
|
793
|
+
);
|
|
794
|
+
}, [quickId, t]);
|
|
795
|
+
|
|
796
|
+
const handleQuickAdd = async () => {
|
|
797
|
+
const id = quickId.trim();
|
|
798
|
+
if (!id) return;
|
|
799
|
+
// Don't duplicate
|
|
800
|
+
if (provider.models.some((m) => m.id === id)) {
|
|
801
|
+
setQuickId("");
|
|
802
|
+
setQuickHint(null);
|
|
803
|
+
return;
|
|
804
|
+
}
|
|
805
|
+
const g = guessModelMeta(id);
|
|
806
|
+
const cw = g.contextWindow ?? DEFAULT_CONTEXT_WINDOW;
|
|
807
|
+
const mt = g.contextWindow
|
|
808
|
+
? (g.contextWindow >= 1_000_000 ? 65536 : g.contextWindow >= 200_000 ? 32768 : 8192)
|
|
809
|
+
: DEFAULT_MAX_TOKENS;
|
|
810
|
+
// Pull full cost/name from catalog if available
|
|
811
|
+
const entries = searchCatalog(id, 5);
|
|
812
|
+
const match = g.source === "catalog"
|
|
813
|
+
? entries.find((e) => e.patterns.some((p) => id.toLowerCase().includes(p.toLowerCase())))
|
|
814
|
+
: undefined;
|
|
815
|
+
const model: Model = {
|
|
816
|
+
id,
|
|
817
|
+
name: match?.name,
|
|
818
|
+
reasoning: g.reasoning ?? false,
|
|
819
|
+
input: g.input ?? ["text"],
|
|
820
|
+
contextWindow: match?.contextWindow ?? cw,
|
|
821
|
+
maxTokens: match?.maxTokens ?? mt,
|
|
822
|
+
cost: match?.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
823
|
+
enabled: true,
|
|
824
|
+
};
|
|
825
|
+
addModel(provider.id, model);
|
|
826
|
+
// Enable
|
|
827
|
+
const list = settings?.enabledModels ?? [];
|
|
828
|
+
await updateSettings({ enabledModels: Array.from(new Set([...list, `${provider.id}/${id}`])) });
|
|
829
|
+
setQuickId("");
|
|
830
|
+
setQuickHint(null);
|
|
831
|
+
};
|
|
832
|
+
|
|
833
|
+
const handleCopyParams = async (m: Model) => {
|
|
834
|
+
const payload = {
|
|
835
|
+
reasoning: m.reasoning,
|
|
836
|
+
input: m.input,
|
|
837
|
+
contextWindow: m.contextWindow,
|
|
838
|
+
maxTokens: m.maxTokens,
|
|
839
|
+
cost: m.cost,
|
|
840
|
+
};
|
|
841
|
+
try {
|
|
842
|
+
await navigator.clipboard.writeText(JSON.stringify(payload, null, 2));
|
|
843
|
+
setCopiedParams(m.id);
|
|
844
|
+
setTimeout(() => setCopiedParams(null), 1500);
|
|
845
|
+
} catch {
|
|
846
|
+
// ignore
|
|
847
|
+
}
|
|
848
|
+
};
|
|
849
|
+
|
|
850
|
+
const urlInvalid = baseUrl.trim() !== "" && !isValidHttpUrl(baseUrl.trim());
|
|
595
851
|
|
|
596
852
|
const dirty =
|
|
597
|
-
(isCustom && (providerName !== (provider.name ?? "") || baseUrl !== (provider.baseUrl ?? "") || api !== (provider.api ?? "openai-completions"))) ||
|
|
853
|
+
(isCustom && (providerName !== (provider.name ?? "") || baseUrl !== (provider.baseUrl ?? "") || api !== (provider.api ?? "openai-completions") || supportsDeveloperRole !== (provider.compat?.supportsDeveloperRole ?? true))) ||
|
|
854
|
+
(!isCustom && (baseUrl !== (provider.baseUrl ?? "") || api !== (provider.api ?? "openai-completions"))) ||
|
|
598
855
|
apiKey !== savedKey;
|
|
599
856
|
|
|
600
857
|
const handleSave = async () => {
|
|
@@ -606,43 +863,57 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
606
863
|
baseUrl: baseUrl || undefined,
|
|
607
864
|
api,
|
|
608
865
|
apiKey: apiKey || undefined,
|
|
866
|
+
compat: { supportsDeveloperRole },
|
|
609
867
|
});
|
|
610
|
-
} else
|
|
611
|
-
|
|
612
|
-
|
|
613
|
-
|
|
868
|
+
} else {
|
|
869
|
+
// Builtin providers: baseUrl / api are persisted as a models.json
|
|
870
|
+
// override (so the user can point them at a proxy/gateway), while the
|
|
871
|
+
// API key stays in auth.json (the original behavior) to avoid creating a
|
|
872
|
+
// duplicate standalone custom-provider card.
|
|
873
|
+
const cfgPatch: Partial<CustomProviderConfig> = {};
|
|
874
|
+
if (baseUrl !== (provider.baseUrl ?? "")) cfgPatch.baseUrl = baseUrl || undefined;
|
|
875
|
+
if (api !== (provider.api ?? "openai-completions")) cfgPatch.api = api;
|
|
876
|
+
if (Object.keys(cfgPatch).length > 0) {
|
|
877
|
+
ok = await updateCustomProvider(provider.id, cfgPatch);
|
|
878
|
+
}
|
|
879
|
+
if (apiKey !== savedKey) {
|
|
880
|
+
const authOk = apiKey
|
|
881
|
+
? await setProviderAuth(provider.id, apiKey)
|
|
882
|
+
: await removeProviderAuth(provider.id);
|
|
883
|
+
ok = ok && authOk;
|
|
884
|
+
}
|
|
885
|
+
if (Object.keys(cfgPatch).length === 0 && apiKey === savedKey) ok = true;
|
|
614
886
|
}
|
|
615
887
|
setSaveState(ok ? "saved" : "error");
|
|
616
888
|
if (ok) setTimeout(() => setSaveState("idle"), 2500);
|
|
617
889
|
};
|
|
618
890
|
|
|
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
891
|
const q = modelQuery.trim().toLowerCase();
|
|
640
|
-
const
|
|
892
|
+
const baseModels = q
|
|
641
893
|
? provider.models.filter(
|
|
642
894
|
(m) => m.id.toLowerCase().includes(q) || (m.name ?? "").toLowerCase().includes(q)
|
|
643
895
|
)
|
|
644
896
|
: provider.models;
|
|
645
897
|
|
|
898
|
+
// Look up the catalog family for a model id (for sorting/grouping)
|
|
899
|
+
const familyOf = (id: string): string => {
|
|
900
|
+
const hit = searchCatalog(id, 1)[0];
|
|
901
|
+
return hit?.family ?? "—";
|
|
902
|
+
};
|
|
903
|
+
|
|
904
|
+
const visibleModels = useMemo(() => {
|
|
905
|
+
const arr = [...baseModels];
|
|
906
|
+
if (modelSort === "family") {
|
|
907
|
+
arr.sort((a, b) => familyOf(a.id).localeCompare(familyOf(b.id)));
|
|
908
|
+
} else if (modelSort === "price-asc" || modelSort === "price-desc") {
|
|
909
|
+
const price = (m: typeof arr[number]) => m.cost?.input ?? 0;
|
|
910
|
+
arr.sort((a, b) => price(a) - price(b));
|
|
911
|
+
if (modelSort === "price-desc") arr.reverse();
|
|
912
|
+
}
|
|
913
|
+
return arr;
|
|
914
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
915
|
+
}, [baseModels, modelSort]);
|
|
916
|
+
|
|
646
917
|
return (
|
|
647
918
|
<div className="space-y-5">
|
|
648
919
|
{/* Header */}
|
|
@@ -692,17 +963,19 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
692
963
|
<input
|
|
693
964
|
type="text"
|
|
694
965
|
value={baseUrl}
|
|
695
|
-
disabled={!isCustom}
|
|
696
966
|
onChange={(e) => setBaseUrl(e.target.value)}
|
|
697
967
|
placeholder="https://api.example.com/v1"
|
|
698
968
|
className={cn(
|
|
699
|
-
"mt-1.5 w-full rounded-lg border bg-gray-800 px-3 py-2.5 text-sm text-white
|
|
969
|
+
"mt-1.5 w-full rounded-lg border bg-gray-800 px-3 py-2.5 text-sm text-white",
|
|
700
970
|
urlInvalid ? "border-red-500" : "border-gray-700"
|
|
701
971
|
)}
|
|
702
972
|
/>
|
|
703
973
|
{urlInvalid && (
|
|
704
974
|
<p className="mt-1 text-xs text-red-400">{t("providers_models.invalid_url")}</p>
|
|
705
975
|
)}
|
|
976
|
+
{!isCustom && !urlInvalid && baseUrl !== (provider.baseUrl ?? "") && (
|
|
977
|
+
<p className="mt-1 text-xs text-amber-400">{t("providers_models.baseurl_override")}</p>
|
|
978
|
+
)}
|
|
706
979
|
</div>
|
|
707
980
|
|
|
708
981
|
{/* API Type */}
|
|
@@ -710,9 +983,8 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
710
983
|
<label className="block text-sm text-gray-400">{t("providers.api_type")}</label>
|
|
711
984
|
<select
|
|
712
985
|
value={api}
|
|
713
|
-
disabled={!isCustom}
|
|
714
986
|
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
|
|
987
|
+
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
988
|
>
|
|
717
989
|
{API_TYPES.map((a) => (
|
|
718
990
|
<option key={a.value} value={a.value}>{a.label}</option>
|
|
@@ -738,6 +1010,26 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
738
1010
|
{showKey ? <EyeOff className="h-4 w-4" /> : <Eye className="h-4 w-4" />}
|
|
739
1011
|
</button>
|
|
740
1012
|
</div>
|
|
1013
|
+
{apiKey.trim().startsWith("$") && (
|
|
1014
|
+
<p className="mt-1 text-xs text-sky-400">
|
|
1015
|
+
{t("providers_models.api_key_env", apiKey.trim())}
|
|
1016
|
+
</p>
|
|
1017
|
+
)}
|
|
1018
|
+
</div>
|
|
1019
|
+
|
|
1020
|
+
{/* Developer Role Support */}
|
|
1021
|
+
<div className="flex items-center gap-2">
|
|
1022
|
+
<input
|
|
1023
|
+
id="supports-developer-role"
|
|
1024
|
+
type="checkbox"
|
|
1025
|
+
checked={supportsDeveloperRole}
|
|
1026
|
+
onChange={(e) => setSupportsDeveloperRole(e.target.checked)}
|
|
1027
|
+
className="rounded border-gray-600 bg-gray-800 text-blue-500"
|
|
1028
|
+
/>
|
|
1029
|
+
<label htmlFor="supports-developer-role" className="text-sm text-gray-400">
|
|
1030
|
+
<span>{t("compat.supports_developer_role")}</span>
|
|
1031
|
+
<span className="ml-2 text-xs text-gray-500">{t("compat.supports_developer_role_desc")}</span>
|
|
1032
|
+
</label>
|
|
741
1033
|
</div>
|
|
742
1034
|
|
|
743
1035
|
{/* Save / Test / Feedback row */}
|
|
@@ -777,17 +1069,25 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
777
1069
|
{provider.models.length > 0 && (
|
|
778
1070
|
<div className="flex items-center gap-2">
|
|
779
1071
|
<button
|
|
780
|
-
onClick={() =>
|
|
781
|
-
className="rounded-md px-2 py-1 text-xs text-
|
|
1072
|
+
onClick={() => setAllModelsEnabled(true)}
|
|
1073
|
+
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
1074
|
>
|
|
783
1075
|
{t("providers_models.enable_all")}
|
|
784
1076
|
</button>
|
|
785
1077
|
<button
|
|
786
|
-
onClick={() =>
|
|
787
|
-
className="rounded-md px-2 py-1 text-xs text-gray-
|
|
1078
|
+
onClick={() => setAllModelsEnabled(false)}
|
|
1079
|
+
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
1080
|
>
|
|
789
1081
|
{t("providers_models.disable_all")}
|
|
790
1082
|
</button>
|
|
1083
|
+
<button
|
|
1084
|
+
onClick={handleTestAll}
|
|
1085
|
+
title={t("providers_models.test_all")}
|
|
1086
|
+
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"
|
|
1087
|
+
>
|
|
1088
|
+
<Zap className="mr-1 inline h-3 w-3" />
|
|
1089
|
+
{t("providers_models.test_all")}
|
|
1090
|
+
</button>
|
|
791
1091
|
</div>
|
|
792
1092
|
)}
|
|
793
1093
|
</div>
|
|
@@ -805,6 +1105,22 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
805
1105
|
</div>
|
|
806
1106
|
)}
|
|
807
1107
|
|
|
1108
|
+
{provider.models.length > 1 && (
|
|
1109
|
+
<div className="mt-1.5 flex items-center gap-2">
|
|
1110
|
+
<label className="text-xs text-gray-500">{t("providers_models.sort_by")}</label>
|
|
1111
|
+
<select
|
|
1112
|
+
value={modelSort}
|
|
1113
|
+
onChange={(e) => setModelSort(e.target.value as typeof modelSort)}
|
|
1114
|
+
className="rounded-lg border border-gray-700 bg-gray-800 px-2 py-1.5 text-xs text-gray-200"
|
|
1115
|
+
>
|
|
1116
|
+
<option value="default">{t("providers_models.sort_default")}</option>
|
|
1117
|
+
<option value="family">{t("providers_models.sort_family")}</option>
|
|
1118
|
+
<option value="price-asc">{t("providers_models.sort_price_asc")}</option>
|
|
1119
|
+
<option value="price-desc">{t("providers_models.sort_price_desc")}</option>
|
|
1120
|
+
</select>
|
|
1121
|
+
</div>
|
|
1122
|
+
)}
|
|
1123
|
+
|
|
808
1124
|
<div className="mt-1.5 space-y-2 rounded-lg border border-gray-800 p-3">
|
|
809
1125
|
{provider.models.length === 0 && (
|
|
810
1126
|
<p className="px-1 py-2 text-sm text-gray-500">{t("models.no_models")}</p>
|
|
@@ -812,14 +1128,28 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
812
1128
|
{provider.models.length > 0 && visibleModels.length === 0 && (
|
|
813
1129
|
<p className="px-1 py-2 text-sm text-gray-500">{t("models.no_models")}</p>
|
|
814
1130
|
)}
|
|
815
|
-
{visibleModels.map((m) =>
|
|
1131
|
+
{visibleModels.map((m) => {
|
|
1132
|
+
const enabled = isModelEnabled(m.id);
|
|
1133
|
+
return (
|
|
816
1134
|
<div
|
|
817
1135
|
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
|
-
)}
|
|
1136
|
+
className="flex items-center gap-2 rounded-lg border border-gray-700 bg-gray-900/70 px-3 py-2.5"
|
|
822
1137
|
>
|
|
1138
|
+
<button
|
|
1139
|
+
onClick={() => toggleModelEnabled(m.id)}
|
|
1140
|
+
title={enabled ? t("models.enabled") : t("models.disabled")}
|
|
1141
|
+
className={cn(
|
|
1142
|
+
"relative inline-flex h-4 w-7 shrink-0 items-center rounded-full transition-colors",
|
|
1143
|
+
enabled ? "bg-emerald-500" : "bg-gray-600"
|
|
1144
|
+
)}
|
|
1145
|
+
>
|
|
1146
|
+
<span
|
|
1147
|
+
className={cn(
|
|
1148
|
+
"inline-block h-3 w-3 transform rounded-full bg-white transition-transform",
|
|
1149
|
+
enabled ? "translate-x-3.5" : "translate-x-0.5"
|
|
1150
|
+
)}
|
|
1151
|
+
/>
|
|
1152
|
+
</button>
|
|
823
1153
|
<Box className="h-4 w-4 shrink-0 text-gray-500" />
|
|
824
1154
|
<span className="min-w-0 flex-1 truncate font-mono text-sm text-gray-200">
|
|
825
1155
|
{m.id}
|
|
@@ -834,25 +1164,26 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
834
1164
|
<ImageIcon className="h-3.5 w-3.5 text-blue-400" />
|
|
835
1165
|
</span>
|
|
836
1166
|
)}
|
|
837
|
-
|
|
1167
|
+
{m.input?.includes("audio") && (
|
|
1168
|
+
<span title={t("models.audio_input")} className="flex shrink-0">
|
|
1169
|
+
<Mic className="h-3.5 w-3.5 text-emerald-400" />
|
|
1170
|
+
</span>
|
|
1171
|
+
)}
|
|
1172
|
+
<span
|
|
1173
|
+
className="rounded-md border border-gray-600 bg-gray-800/50 px-2 py-0.5 text-xs text-gray-400"
|
|
1174
|
+
title={
|
|
1175
|
+
m.cost
|
|
1176
|
+
? `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)}`
|
|
1177
|
+
: undefined
|
|
1178
|
+
}
|
|
1179
|
+
>
|
|
838
1180
|
{m.cost && (m.cost.input || m.cost.output)
|
|
839
|
-
?
|
|
1181
|
+
? `${formatCost(m.cost.input, currency)}/${formatCost(m.cost.output, currency)}`
|
|
840
1182
|
: t("models.free")}
|
|
841
1183
|
</span>
|
|
842
1184
|
<span className="rounded-md border border-gray-600 bg-gray-800/50 px-2 py-0.5 text-xs text-gray-400">
|
|
843
1185
|
{m.contextWindow ? formatTokens(m.contextWindow) : "—"}
|
|
844
1186
|
</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
1187
|
{/* Test model */}
|
|
857
1188
|
{(() => {
|
|
858
1189
|
const test = getModelTest(m.id);
|
|
@@ -890,6 +1221,19 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
890
1221
|
);
|
|
891
1222
|
return null;
|
|
892
1223
|
})()}
|
|
1224
|
+
{copiedParams === m.id ? (
|
|
1225
|
+
<span className="flex items-center gap-1 px-1 text-xs text-emerald-400">
|
|
1226
|
+
<Check className="h-3.5 w-3.5" />
|
|
1227
|
+
</span>
|
|
1228
|
+
) : (
|
|
1229
|
+
<button
|
|
1230
|
+
onClick={() => handleCopyParams(m)}
|
|
1231
|
+
className="rounded-md p-1.5 text-gray-500 transition-colors hover:bg-gray-700 hover:text-gray-200"
|
|
1232
|
+
title={t("models.copy_params")}
|
|
1233
|
+
>
|
|
1234
|
+
<Copy className="h-3.5 w-3.5" />
|
|
1235
|
+
</button>
|
|
1236
|
+
)}
|
|
893
1237
|
<button
|
|
894
1238
|
onClick={() => setEditModel(m)}
|
|
895
1239
|
className="rounded-md p-1.5 text-gray-500 transition-colors hover:bg-gray-700 hover:text-gray-200"
|
|
@@ -905,8 +1249,48 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
905
1249
|
<Trash2 className="h-3.5 w-3.5" />
|
|
906
1250
|
</button>
|
|
907
1251
|
</div>
|
|
908
|
-
)
|
|
1252
|
+
);
|
|
1253
|
+
})}
|
|
1254
|
+
</div>
|
|
1255
|
+
{/* Quick-add input */}
|
|
1256
|
+
<div className="mt-3">
|
|
1257
|
+
<div className="flex gap-2">
|
|
1258
|
+
<div className="relative flex-1">
|
|
1259
|
+
<Wand2 className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-emerald-400" />
|
|
1260
|
+
<input
|
|
1261
|
+
type="text"
|
|
1262
|
+
value={quickId}
|
|
1263
|
+
onChange={(e) => setQuickId(e.target.value)}
|
|
1264
|
+
onKeyDown={(e) => {
|
|
1265
|
+
if (e.key === "Enter") { e.preventDefault(); handleQuickAdd(); }
|
|
1266
|
+
}}
|
|
1267
|
+
placeholder={t("models.quick_add_placeholder")}
|
|
1268
|
+
className="w-full rounded-lg border border-gray-700 bg-gray-800 py-2 pl-9 pr-3 text-sm text-white"
|
|
1269
|
+
/>
|
|
1270
|
+
</div>
|
|
1271
|
+
<button
|
|
1272
|
+
onClick={handleQuickAdd}
|
|
1273
|
+
disabled={!quickId.trim()}
|
|
1274
|
+
className="flex items-center gap-1.5 rounded-lg px-3 py-2 text-sm font-medium text-white transition-colors disabled:opacity-50"
|
|
1275
|
+
style={{ backgroundColor: "#10b981" }}
|
|
1276
|
+
>
|
|
1277
|
+
<Plus className="h-4 w-4" />
|
|
1278
|
+
{t("models.quick_add")}
|
|
1279
|
+
</button>
|
|
1280
|
+
<button
|
|
1281
|
+
onClick={() => setShowAddModel(true)}
|
|
1282
|
+
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"
|
|
1283
|
+
>
|
|
1284
|
+
{t("models.add_model")}
|
|
1285
|
+
</button>
|
|
1286
|
+
</div>
|
|
1287
|
+
{quickHint && (
|
|
1288
|
+
<p className="mt-1.5 flex items-center gap-1 text-[11px] text-emerald-400">
|
|
1289
|
+
<Wand2 className="h-3 w-3" /> {quickHint}
|
|
1290
|
+
</p>
|
|
1291
|
+
)}
|
|
909
1292
|
</div>
|
|
1293
|
+
|
|
910
1294
|
<div className="flex flex-wrap gap-2 mt-3">
|
|
911
1295
|
<button
|
|
912
1296
|
onClick={fetchModels}
|
|
@@ -921,13 +1305,6 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
921
1305
|
{fetching ? <Loader2 className="h-4 w-4 animate-spin" /> : <Download className="h-4 w-4" />}
|
|
922
1306
|
{fetching ? t("providers_models.fetching") : t("providers_models.fetch_models")}
|
|
923
1307
|
</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
1308
|
</div>
|
|
932
1309
|
</div>
|
|
933
1310
|
|
|
@@ -979,12 +1356,25 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
979
1356
|
</div>
|
|
980
1357
|
<input type="checkbox" checked={isSelected(m.id)} onChange={() => toggleSelect(m.id)} className="sr-only" />
|
|
981
1358
|
<span className="min-w-0 flex-1 truncate font-mono text-sm text-gray-200">{m.id}</span>
|
|
982
|
-
|
|
983
|
-
|
|
1359
|
+
{m.reasoning && (
|
|
1360
|
+
<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">
|
|
1361
|
+
<Brain className="h-3 w-3" />
|
|
1362
|
+
</span>
|
|
1363
|
+
)}
|
|
1364
|
+
<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"}`}>
|
|
1365
|
+
{m.vision ? <ImageIcon className="h-3 w-3" /> : <span className="h-3 w-3 inline-block" />}
|
|
984
1366
|
{m.vision ? t("providers_models.modality_vision") : t("providers_models.modality_text")}
|
|
985
1367
|
</span>
|
|
986
|
-
{m.
|
|
987
|
-
|
|
1368
|
+
{m.audio && (
|
|
1369
|
+
<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">
|
|
1370
|
+
<Mic className="h-3 w-3" />
|
|
1371
|
+
</span>
|
|
1372
|
+
)}
|
|
1373
|
+
{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>}
|
|
1374
|
+
{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>}
|
|
1375
|
+
{m.cost && (m.cost.input || m.cost.output) ? (
|
|
1376
|
+
<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>
|
|
1377
|
+
) : null}
|
|
988
1378
|
</label>
|
|
989
1379
|
))}
|
|
990
1380
|
</div>
|
|
@@ -1090,16 +1480,16 @@ function ProviderDetail({ provider, onDelete, onDuplicate }: { provider: Provide
|
|
|
1090
1480
|
|
|
1091
1481
|
// ─── Model Form (add & edit) ──────────────────────────────
|
|
1092
1482
|
|
|
1093
|
-
|
|
1094
|
-
initial,
|
|
1095
|
-
onSubmit,
|
|
1096
|
-
onCancel,
|
|
1097
|
-
}: {
|
|
1483
|
+
interface ModelFormProps {
|
|
1098
1484
|
initial?: Model;
|
|
1099
1485
|
onSubmit: (form: Partial<Model>) => void;
|
|
1100
1486
|
onCancel: () => void;
|
|
1101
|
-
}
|
|
1487
|
+
}
|
|
1488
|
+
|
|
1489
|
+
function ModelForm({ initial, onSubmit, onCancel }: ModelFormProps) {
|
|
1102
1490
|
const { t } = useTranslation();
|
|
1491
|
+
const isEdit = !!initial;
|
|
1492
|
+
|
|
1103
1493
|
const [form, setForm] = useState<Partial<Model>>(
|
|
1104
1494
|
initial
|
|
1105
1495
|
? { ...initial }
|
|
@@ -1113,10 +1503,191 @@ function ModelForm({
|
|
|
1113
1503
|
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
|
|
1114
1504
|
}
|
|
1115
1505
|
);
|
|
1116
|
-
|
|
1506
|
+
|
|
1507
|
+
// Which fields the user has manually changed (so auto-detect doesn't clobber them)
|
|
1508
|
+
const touchedRef = useRef<Set<string>>(new Set());
|
|
1509
|
+
const touch = (field: string) => { touchedRef.current.add(field); };
|
|
1510
|
+
const wasTouched = (field: string) => touchedRef.current.has(field);
|
|
1511
|
+
|
|
1512
|
+
// Auto-detect from model id when not editing and id changes
|
|
1513
|
+
const [detectHint, setDetectHint] = useState<string | null>(null);
|
|
1514
|
+
useEffect(() => {
|
|
1515
|
+
if (isEdit) return;
|
|
1516
|
+
const id = (form.id ?? "").trim();
|
|
1517
|
+
if (!id) { setDetectHint(null); return; }
|
|
1518
|
+
|
|
1519
|
+
const guess = guessModelMeta(id);
|
|
1520
|
+
if (guess.source === "default") { setDetectHint(null); return; }
|
|
1521
|
+
|
|
1522
|
+
setForm((prev) => {
|
|
1523
|
+
const next = { ...prev };
|
|
1524
|
+
if (guess.contextWindow && !wasTouched("contextWindow")) next.contextWindow = guess.contextWindow;
|
|
1525
|
+
if (!wasTouched("maxTokens")) {
|
|
1526
|
+
// Use reasonable maxTokens per context family when detected
|
|
1527
|
+
next.maxTokens = guess.contextWindow
|
|
1528
|
+
? (guess.contextWindow >= 1_000_000 ? 65536 : guess.contextWindow >= 200_000 ? 32768 : 8192)
|
|
1529
|
+
: DEFAULT_MAX_TOKENS;
|
|
1530
|
+
}
|
|
1531
|
+
if (guess.reasoning !== undefined && !wasTouched("reasoning")) next.reasoning = guess.reasoning;
|
|
1532
|
+
if (guess.input && !wasTouched("input")) next.input = [...guess.input];
|
|
1533
|
+
// Catalog match → also set name + cost
|
|
1534
|
+
if (guess.source === "catalog") {
|
|
1535
|
+
// Find the matched catalog entry for name + cost
|
|
1536
|
+
const entries = searchCatalog(id, 5);
|
|
1537
|
+
const match = entries.find((e) => e.patterns.some((p) => id.toLowerCase().includes(p.toLowerCase())));
|
|
1538
|
+
if (match) {
|
|
1539
|
+
if (!wasTouched("name")) next.name = match.name;
|
|
1540
|
+
if (match.cost && !wasTouched("cost")) next.cost = { ...match.cost };
|
|
1541
|
+
}
|
|
1542
|
+
}
|
|
1543
|
+
return next;
|
|
1544
|
+
});
|
|
1545
|
+
|
|
1546
|
+
setDetectHint(
|
|
1547
|
+
guess.source === "catalog" && guess.matched
|
|
1548
|
+
? t("models.detected_catalog", guess.matched)
|
|
1549
|
+
: t("models.detected_heuristic")
|
|
1550
|
+
);
|
|
1551
|
+
}, [form.id, isEdit, t]);
|
|
1552
|
+
|
|
1553
|
+
// ── Catalog picker (add-mode only) ──
|
|
1554
|
+
const [pickerOpen, setPickerOpen] = useState(false);
|
|
1555
|
+
const [pickerQuery, setPickerQuery] = useState("");
|
|
1556
|
+
const pickerResults = useMemo(
|
|
1557
|
+
() => searchCatalog(pickerQuery, 30),
|
|
1558
|
+
[pickerQuery]
|
|
1559
|
+
);
|
|
1560
|
+
const applyPreset = (entry: ReturnType<typeof searchCatalog>[number]) => {
|
|
1561
|
+
const preset = catalogToModel(entry);
|
|
1562
|
+
// Apply all fields as if they were default (no touch-marking)
|
|
1563
|
+
touchedRef.current = new Set();
|
|
1564
|
+
setForm((prev) => ({ ...prev, ...preset }));
|
|
1565
|
+
setPickerOpen(false);
|
|
1566
|
+
setDetectHint(t("models.detected_catalog", entry.name ?? entry.patterns[0] ?? ""));
|
|
1567
|
+
};
|
|
1568
|
+
|
|
1569
|
+
// Apply a quick template (Claude-style, GPT-style, Reasoning, Local small)
|
|
1570
|
+
const applyTemplate = (kind: "claude" | "gpt" | "reasoning" | "small") => {
|
|
1571
|
+
touchedRef.current = new Set();
|
|
1572
|
+
setForm((prev) => {
|
|
1573
|
+
switch (kind) {
|
|
1574
|
+
case "claude":
|
|
1575
|
+
return { ...prev, reasoning: true, input: ["text", "image"], contextWindow: 200_000, maxTokens: 8192 };
|
|
1576
|
+
case "gpt":
|
|
1577
|
+
return { ...prev, reasoning: false, input: ["text", "image"], contextWindow: 128_000, maxTokens: 16_384 };
|
|
1578
|
+
case "reasoning":
|
|
1579
|
+
return { ...prev, reasoning: true, input: ["text"], contextWindow: 128_000, maxTokens: 65_536 };
|
|
1580
|
+
case "small":
|
|
1581
|
+
return { ...prev, reasoning: false, input: ["text"], contextWindow: 32_768, maxTokens: 4096 };
|
|
1582
|
+
}
|
|
1583
|
+
});
|
|
1584
|
+
};
|
|
1585
|
+
|
|
1586
|
+
const setId = (v: string) => { touch("id"); setForm((p) => ({ ...p, id: v })); };
|
|
1587
|
+
const setName = (v: string) => { touch("name"); setForm((p) => ({ ...p, name: v })); };
|
|
1588
|
+
const setContextWindow = (v: number) => { touch("contextWindow"); setForm((p) => ({ ...p, contextWindow: v })); };
|
|
1589
|
+
const setMaxTokens = (v: number) => { touch("maxTokens"); setForm((p) => ({ ...p, maxTokens: v })); };
|
|
1590
|
+
const setReasoning = (v: boolean) => { touch("reasoning"); setForm((p) => ({ ...p, reasoning: v })); };
|
|
1591
|
+
const setImage = (v: boolean) => {
|
|
1592
|
+
touch("input");
|
|
1593
|
+
setForm((p) => ({ ...p, input: v ? ["text", "image"] : ["text"] }));
|
|
1594
|
+
};
|
|
1595
|
+
const setAudio = (v: boolean) => {
|
|
1596
|
+
touch("input");
|
|
1597
|
+
setForm((p) => {
|
|
1598
|
+
const hasText = p.input?.includes("text") ?? true;
|
|
1599
|
+
const hasImage = p.input?.includes("image") ?? false;
|
|
1600
|
+
const next: ("text" | "image" | "audio")[] = [];
|
|
1601
|
+
if (hasText) next.push("text");
|
|
1602
|
+
if (hasImage) next.push("image");
|
|
1603
|
+
if (v) next.push("audio");
|
|
1604
|
+
return { ...p, input: next };
|
|
1605
|
+
});
|
|
1606
|
+
};
|
|
1607
|
+
const setCostField = (field: keyof NonNullable<Model["cost"]>, v: number) => {
|
|
1608
|
+
touch("cost");
|
|
1609
|
+
setForm((p) => ({
|
|
1610
|
+
...p,
|
|
1611
|
+
cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0, ...p.cost, [field]: v },
|
|
1612
|
+
}));
|
|
1613
|
+
};
|
|
1117
1614
|
|
|
1118
1615
|
return (
|
|
1119
1616
|
<div className="space-y-4">
|
|
1617
|
+
{/* ── Catalog picker / templates (add-mode) ── */}
|
|
1618
|
+
{!isEdit && (
|
|
1619
|
+
<div className="rounded-lg border border-gray-800 bg-gray-900/40 p-3">
|
|
1620
|
+
<div className="flex items-center justify-between gap-2 flex-wrap">
|
|
1621
|
+
<button
|
|
1622
|
+
type="button"
|
|
1623
|
+
onClick={() => setPickerOpen((o) => !o)}
|
|
1624
|
+
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"
|
|
1625
|
+
>
|
|
1626
|
+
<Sparkles className="h-3.5 w-3.5 text-amber-400" />
|
|
1627
|
+
{t("models.pick_preset")}
|
|
1628
|
+
</button>
|
|
1629
|
+
<div className="flex flex-wrap items-center gap-1.5">
|
|
1630
|
+
<span className="text-[10px] uppercase tracking-wide text-gray-500 mr-1">{t("models.manual_fill")}:</span>
|
|
1631
|
+
{([
|
|
1632
|
+
["claude", "models.preset_claude"],
|
|
1633
|
+
["gpt", "models.preset_gpt"],
|
|
1634
|
+
["reasoning", "models.preset_reasoning"],
|
|
1635
|
+
["small", "models.preset_small_local"],
|
|
1636
|
+
] as const).map(([kind, key]) => (
|
|
1637
|
+
<button
|
|
1638
|
+
key={kind}
|
|
1639
|
+
type="button"
|
|
1640
|
+
onClick={() => applyTemplate(kind)}
|
|
1641
|
+
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"
|
|
1642
|
+
>
|
|
1643
|
+
{t(key)}
|
|
1644
|
+
</button>
|
|
1645
|
+
))}
|
|
1646
|
+
</div>
|
|
1647
|
+
</div>
|
|
1648
|
+
|
|
1649
|
+
{pickerOpen && (
|
|
1650
|
+
<div className="mt-3 space-y-2">
|
|
1651
|
+
<div className="relative">
|
|
1652
|
+
<Search className="absolute left-3 top-1/2 h-4 w-4 -translate-y-1/2 text-gray-500" />
|
|
1653
|
+
<input
|
|
1654
|
+
autoFocus
|
|
1655
|
+
type="text"
|
|
1656
|
+
value={pickerQuery}
|
|
1657
|
+
onChange={(e) => setPickerQuery(e.target.value)}
|
|
1658
|
+
placeholder={t("models.pick_preset_placeholder")}
|
|
1659
|
+
className="w-full rounded-lg border border-gray-700 bg-gray-800 py-2 pl-9 pr-3 text-sm text-white"
|
|
1660
|
+
/>
|
|
1661
|
+
</div>
|
|
1662
|
+
<div className="max-h-56 overflow-y-auto rounded-lg border border-gray-800">
|
|
1663
|
+
{pickerResults.length === 0 && (
|
|
1664
|
+
<p className="px-3 py-4 text-center text-xs text-gray-500">—</p>
|
|
1665
|
+
)}
|
|
1666
|
+
{pickerResults.map((e) => (
|
|
1667
|
+
<button
|
|
1668
|
+
key={e.patterns[0]}
|
|
1669
|
+
type="button"
|
|
1670
|
+
onClick={() => applyPreset(e)}
|
|
1671
|
+
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"
|
|
1672
|
+
>
|
|
1673
|
+
<span className="min-w-0 flex-1">
|
|
1674
|
+
<span className="block truncate text-sm text-gray-200">{e.name}</span>
|
|
1675
|
+
<span className="block truncate font-mono text-[11px] text-gray-500">{e.patterns[0]}</span>
|
|
1676
|
+
</span>
|
|
1677
|
+
{e.reasoning && <Brain className="h-3.5 w-3.5 shrink-0 text-purple-400" aria-label="reasoning" />}
|
|
1678
|
+
{e.input?.includes("image") && <ImageIcon className="h-3.5 w-3.5 shrink-0 text-blue-400" aria-label="vision" />}
|
|
1679
|
+
<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">
|
|
1680
|
+
{formatTokens(e.contextWindow)}
|
|
1681
|
+
</span>
|
|
1682
|
+
</button>
|
|
1683
|
+
))}
|
|
1684
|
+
</div>
|
|
1685
|
+
</div>
|
|
1686
|
+
)}
|
|
1687
|
+
</div>
|
|
1688
|
+
)}
|
|
1689
|
+
|
|
1690
|
+
{/* ── Core fields ── */}
|
|
1120
1691
|
<div className="grid grid-cols-2 gap-4">
|
|
1121
1692
|
<div>
|
|
1122
1693
|
<label className="block text-xs font-medium text-gray-400">{t("models.model_id")} *</label>
|
|
@@ -1124,17 +1695,23 @@ function ModelForm({
|
|
|
1124
1695
|
type="text"
|
|
1125
1696
|
value={form.id ?? ""}
|
|
1126
1697
|
disabled={isEdit}
|
|
1127
|
-
onChange={(e) =>
|
|
1698
|
+
onChange={(e) => setId(e.target.value)}
|
|
1128
1699
|
placeholder="my-model-id"
|
|
1129
1700
|
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
1701
|
/>
|
|
1702
|
+
{!isEdit && detectHint && (
|
|
1703
|
+
<p className="mt-1 flex items-center gap-1 text-[11px] text-emerald-400">
|
|
1704
|
+
<Wand2 className="h-3 w-3" />
|
|
1705
|
+
{detectHint}
|
|
1706
|
+
</p>
|
|
1707
|
+
)}
|
|
1131
1708
|
</div>
|
|
1132
1709
|
<div>
|
|
1133
1710
|
<label className="block text-xs font-medium text-gray-400">{t("models.display_name")}</label>
|
|
1134
1711
|
<input
|
|
1135
1712
|
type="text"
|
|
1136
1713
|
value={form.name ?? ""}
|
|
1137
|
-
onChange={(e) =>
|
|
1714
|
+
onChange={(e) => setName(e.target.value)}
|
|
1138
1715
|
placeholder="My Custom Model"
|
|
1139
1716
|
className="mt-1 w-full rounded-lg border border-gray-700 bg-gray-800 px-3 py-2 text-sm text-white"
|
|
1140
1717
|
/>
|
|
@@ -1144,7 +1721,7 @@ function ModelForm({
|
|
|
1144
1721
|
<input
|
|
1145
1722
|
type="number"
|
|
1146
1723
|
value={form.contextWindow ?? DEFAULT_CONTEXT_WINDOW}
|
|
1147
|
-
onChange={(e) =>
|
|
1724
|
+
onChange={(e) => setContextWindow(parseInt(e.target.value) || DEFAULT_CONTEXT_WINDOW)}
|
|
1148
1725
|
className="mt-1 w-full rounded-lg border border-gray-700 bg-gray-800 px-3 py-2 text-sm text-white"
|
|
1149
1726
|
/>
|
|
1150
1727
|
</div>
|
|
@@ -1153,34 +1730,44 @@ function ModelForm({
|
|
|
1153
1730
|
<input
|
|
1154
1731
|
type="number"
|
|
1155
1732
|
value={form.maxTokens ?? DEFAULT_MAX_TOKENS}
|
|
1156
|
-
onChange={(e) =>
|
|
1733
|
+
onChange={(e) => setMaxTokens(parseInt(e.target.value) || DEFAULT_MAX_TOKENS)}
|
|
1157
1734
|
className="mt-1 w-full rounded-lg border border-gray-700 bg-gray-800 px-3 py-2 text-sm text-white"
|
|
1158
1735
|
/>
|
|
1159
1736
|
</div>
|
|
1160
1737
|
</div>
|
|
1161
1738
|
|
|
1162
1739
|
{/* Capabilities */}
|
|
1163
|
-
<div className="flex flex-wrap gap-
|
|
1740
|
+
<div className="flex flex-wrap gap-4">
|
|
1164
1741
|
<label className="flex items-center gap-2 text-sm text-gray-300">
|
|
1165
1742
|
<input
|
|
1166
1743
|
type="checkbox"
|
|
1167
1744
|
checked={form.reasoning ?? false}
|
|
1168
|
-
onChange={(e) =>
|
|
1745
|
+
onChange={(e) => setReasoning(e.target.checked)}
|
|
1169
1746
|
className="rounded border-gray-600 bg-gray-800 text-blue-500"
|
|
1170
1747
|
/>
|
|
1748
|
+
<Brain className="h-3.5 w-3.5 text-purple-400" />
|
|
1171
1749
|
{t("models.reasoning")}
|
|
1172
1750
|
</label>
|
|
1173
1751
|
<label className="flex items-center gap-2 text-sm text-gray-300">
|
|
1174
1752
|
<input
|
|
1175
1753
|
type="checkbox"
|
|
1176
1754
|
checked={form.input?.includes("image") ?? false}
|
|
1177
|
-
onChange={(e) =>
|
|
1178
|
-
setForm({ ...form, input: e.target.checked ? ["text", "image"] : ["text"] })
|
|
1179
|
-
}
|
|
1755
|
+
onChange={(e) => setImage(e.target.checked)}
|
|
1180
1756
|
className="rounded border-gray-600 bg-gray-800 text-blue-500"
|
|
1181
1757
|
/>
|
|
1758
|
+
<ImageIcon className="h-3.5 w-3.5 text-blue-400" />
|
|
1182
1759
|
{t("models.image_input")}
|
|
1183
1760
|
</label>
|
|
1761
|
+
<label className="flex items-center gap-2 text-sm text-gray-300">
|
|
1762
|
+
<input
|
|
1763
|
+
type="checkbox"
|
|
1764
|
+
checked={form.input?.includes("audio") ?? false}
|
|
1765
|
+
onChange={(e) => setAudio(e.target.checked)}
|
|
1766
|
+
className="rounded border-gray-600 bg-gray-800 text-blue-500"
|
|
1767
|
+
/>
|
|
1768
|
+
<Mic className="h-3.5 w-3.5 text-emerald-400" />
|
|
1769
|
+
{t("models.audio_input")}
|
|
1770
|
+
</label>
|
|
1184
1771
|
</div>
|
|
1185
1772
|
|
|
1186
1773
|
{/* Cost */}
|
|
@@ -1199,22 +1786,17 @@ function ModelForm({
|
|
|
1199
1786
|
type="number"
|
|
1200
1787
|
step="0.01"
|
|
1201
1788
|
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
|
-
}
|
|
1789
|
+
onChange={(e) => setCostField(field, parseFloat(e.target.value) || 0)}
|
|
1212
1790
|
className="mt-1 w-full rounded-lg border border-gray-700 bg-gray-800 px-3 py-2 text-sm text-white"
|
|
1213
1791
|
/>
|
|
1214
1792
|
</div>
|
|
1215
1793
|
))}
|
|
1216
1794
|
</div>
|
|
1217
1795
|
|
|
1796
|
+
{!isEdit && (
|
|
1797
|
+
<p className="text-[11px] text-gray-500">{t("models.catalog_hint")}</p>
|
|
1798
|
+
)}
|
|
1799
|
+
|
|
1218
1800
|
<div className="flex justify-end gap-3 pt-2">
|
|
1219
1801
|
<button onClick={onCancel} className="rounded-lg px-4 py-2 text-sm text-gray-400 hover:bg-gray-800">
|
|
1220
1802
|
{t("models.cancel")}
|
|
@@ -1459,7 +2041,7 @@ function ImportProviderModal({
|
|
|
1459
2041
|
const [fetching, setFetching] = useState(false);
|
|
1460
2042
|
const [fetchErr, setFetchErr] = useState<string | null>(null);
|
|
1461
2043
|
const [fetchDone, setFetchDone] = useState(false);
|
|
1462
|
-
const [fetchedModels, setFetchedModels] = useState<
|
|
2044
|
+
const [fetchedModels, setFetchedModels] = useState<FetchedModel[]>([]);
|
|
1463
2045
|
const [fetchSel, setFetchSel] = useState<Set<string>>(new Set());
|
|
1464
2046
|
|
|
1465
2047
|
// Re-parse on every paste/edit of the raw text; fields below stay editable
|
|
@@ -1518,7 +2100,7 @@ function ImportProviderModal({
|
|
|
1518
2100
|
if (data.error) {
|
|
1519
2101
|
setFetchErr(data.error);
|
|
1520
2102
|
} else {
|
|
1521
|
-
const models = (data.models ?? []) as
|
|
2103
|
+
const models = (data.models ?? []) as FetchedModel[];
|
|
1522
2104
|
setFetchedModels(models);
|
|
1523
2105
|
// Select everything by default so import is a single click
|
|
1524
2106
|
setFetchSel(new Set(models.map((m) => m.id)));
|
|
@@ -1560,15 +2142,30 @@ function ImportProviderModal({
|
|
|
1560
2142
|
maxTokens: DEFAULT_MAX_TOKENS,
|
|
1561
2143
|
...defaults,
|
|
1562
2144
|
})),
|
|
1563
|
-
// Fetched models carry real context/output
|
|
1564
|
-
...selectedFetched.map((m) =>
|
|
1565
|
-
|
|
1566
|
-
|
|
1567
|
-
|
|
1568
|
-
|
|
1569
|
-
|
|
1570
|
-
|
|
1571
|
-
|
|
2145
|
+
// Fetched models carry real context/output/reasoning/cost when the endpoint provides them
|
|
2146
|
+
...selectedFetched.map((m) => {
|
|
2147
|
+
const input: Model["input"] = ["text"];
|
|
2148
|
+
if (m.vision) input.push("image");
|
|
2149
|
+
if (m.audio) input.push("audio");
|
|
2150
|
+
const cost = m.cost
|
|
2151
|
+
? {
|
|
2152
|
+
input: m.cost.input ?? 0,
|
|
2153
|
+
output: m.cost.output ?? 0,
|
|
2154
|
+
cacheRead: m.cost.cacheRead ?? 0,
|
|
2155
|
+
cacheWrite: m.cost.cacheWrite ?? 0,
|
|
2156
|
+
}
|
|
2157
|
+
: defaults.cost;
|
|
2158
|
+
return {
|
|
2159
|
+
...defaults,
|
|
2160
|
+
id: m.id,
|
|
2161
|
+
name: m.name ?? (m.id.split("/").pop() || m.id),
|
|
2162
|
+
reasoning: m.reasoning ?? false,
|
|
2163
|
+
input,
|
|
2164
|
+
contextWindow: m.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
|
|
2165
|
+
maxTokens: m.maxTokens ?? DEFAULT_MAX_TOKENS,
|
|
2166
|
+
cost,
|
|
2167
|
+
};
|
|
2168
|
+
}),
|
|
1572
2169
|
];
|
|
1573
2170
|
const newIds = newModels.map((m) => m.id);
|
|
1574
2171
|
|
|
@@ -1785,15 +2382,22 @@ function ImportProviderModal({
|
|
|
1785
2382
|
className="h-3.5 w-3.5 accent-blue-500"
|
|
1786
2383
|
/>
|
|
1787
2384
|
<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)}
|
|
2385
|
+
<span className="ml-auto flex shrink-0 items-center gap-1">
|
|
2386
|
+
{m.reasoning && <Brain className="h-3 w-3 text-purple-400" />}
|
|
2387
|
+
{m.audio && <Mic className="h-3 w-3 text-emerald-400" />}
|
|
2388
|
+
<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"}`}>
|
|
2389
|
+
{m.vision && <ImageIcon className="h-2.5 w-2.5" />}
|
|
2390
|
+
{m.vision ? t("providers_models.modality_vision") : t("providers_models.modality_text")}
|
|
1795
2391
|
</span>
|
|
1796
|
-
|
|
2392
|
+
{m.contextWindow && (
|
|
2393
|
+
<span className="shrink-0 text-[10px] text-gray-500 font-mono">
|
|
2394
|
+
{formatTokens(m.contextWindow)}
|
|
2395
|
+
</span>
|
|
2396
|
+
)}
|
|
2397
|
+
{m.cost && (m.cost.input || m.cost.output) ? (
|
|
2398
|
+
<span className="shrink-0 text-[10px] text-gray-500 font-mono">${m.cost.input}/${m.cost.output}</span>
|
|
2399
|
+
) : null}
|
|
2400
|
+
</span>
|
|
1797
2401
|
</label>
|
|
1798
2402
|
))}
|
|
1799
2403
|
</div>
|