@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.
Files changed (737) hide show
  1. package/README.ja.md +17 -1
  2. package/README.md +17 -1
  3. package/README.zh-CN.md +17 -1
  4. package/package.json +45 -3
  5. package/public/apple-touch-icon.png +0 -0
  6. package/public/icon-192.png +0 -0
  7. package/public/icon-512.png +0 -0
  8. package/public/pi.svg +47 -4
  9. package/server/pi-reader.ts +199 -70
  10. package/src/components/layout/Sidebar.tsx +1 -5
  11. package/src/components/providers/ProvidersModelsPage.tsx +743 -139
  12. package/src/components/settings/SettingsPage.tsx +74 -55
  13. package/src/data/builtin-providers.ts +7 -7
  14. package/src/data/model-catalog.ts +967 -0
  15. package/src/index.css +5 -1
  16. package/src/lib/config.ts +61 -0
  17. package/src/lib/translations/en.ts +30 -0
  18. package/src/lib/translations/ja.ts +30 -0
  19. package/src/lib/translations/zh-CN.ts +30 -0
  20. package/src/lib/translations/zh-TW.ts +30 -0
  21. package/src/main.tsx +9 -0
  22. package/src/store/config-store.ts +37 -21
  23. package/tsconfig.json +1 -1
  24. package/vite.config.ts +9 -1
  25. package/.pi/.pi-puppeteer/artifacts/screenshots/session-1-1785132166652.png +0 -0
  26. package/.pi/.pi-puppeteer/artifacts/screenshots/session-1-1785291744290.png +0 -0
  27. package/.pi/.pi-puppeteer/artifacts/screenshots/session-1-1785291756870.png +0 -0
  28. package/.pi/.pi-puppeteer/artifacts/screenshots/session-1-1785293871314.png +0 -0
  29. package/.pi/.pi-puppeteer/artifacts/screenshots/session-10-1785297139944.png +0 -0
  30. package/.pi/.pi-puppeteer/artifacts/screenshots/session-2-1785132240502.png +0 -0
  31. package/.pi/.pi-puppeteer/artifacts/screenshots/session-2-1785132249748.png +0 -0
  32. package/.pi/.pi-puppeteer/artifacts/screenshots/session-2-1785294992352.png +0 -0
  33. package/.pi/.pi-puppeteer/artifacts/screenshots/session-2-1785295104532.png +0 -0
  34. package/.pi/.pi-puppeteer/artifacts/screenshots/session-2-1785295132507.png +0 -0
  35. package/.pi/.pi-puppeteer/artifacts/screenshots/session-3-1785132387218.png +0 -0
  36. package/.pi/.pi-puppeteer/artifacts/screenshots/session-4-1785295319523.png +0 -0
  37. package/.pi/.pi-puppeteer/artifacts/screenshots/session-4-1785295349664.png +0 -0
  38. package/.pi/.pi-puppeteer/artifacts/screenshots/session-4-1785295399600.png +0 -0
  39. package/.pi/.pi-puppeteer/artifacts/screenshots/session-5-1785295450850.png +0 -0
  40. package/.pi/.pi-puppeteer/artifacts/screenshots/session-5-1785295487872.png +0 -0
  41. package/.pi/.pi-puppeteer/artifacts/screenshots/session-5-1785295562600.png +0 -0
  42. package/.pi/.pi-puppeteer/artifacts/screenshots/session-5-1785295761054.png +0 -0
  43. package/.pi/.pi-puppeteer/artifacts/screenshots/session-5-1785295840175.png +0 -0
  44. package/.pi/.pi-puppeteer/artifacts/screenshots/session-6-1785295915007.png +0 -0
  45. package/.pi/.pi-puppeteer/artifacts/screenshots/session-6-1785296069913.png +0 -0
  46. package/.pi/.pi-puppeteer/artifacts/screenshots/session-7-1785296128252.png +0 -0
  47. package/.pi/.pi-puppeteer/artifacts/screenshots/session-9-1785297091531.png +0 -0
  48. package/.pi/.pi-puppeteer/artifacts/screenshots/session-9-1785297116790.png +0 -0
  49. package/.pi/.pi-puppeteer/profiles/chrome/default/ActorSafetyLists/9.5220.3721/_metadata/verified_contents.json +0 -1
  50. package/.pi/.pi-puppeteer/profiles/chrome/default/ActorSafetyLists/9.5220.3721/listdata.json +0 -91946
  51. package/.pi/.pi-puppeteer/profiles/chrome/default/ActorSafetyLists/9.5220.3721/manifest.json +0 -5
  52. package/.pi/.pi-puppeteer/profiles/chrome/default/AmountExtractionHeuristicRegexes/4/_metadata/verified_contents.json +0 -1
  53. package/.pi/.pi-puppeteer/profiles/chrome/default/AmountExtractionHeuristicRegexes/4/heuristic_regexes.binarypb +0 -3
  54. package/.pi/.pi-puppeteer/profiles/chrome/default/AmountExtractionHeuristicRegexes/4/manifest.json +0 -5
  55. package/.pi/.pi-puppeteer/profiles/chrome/default/BrowserMetrics/BrowserMetrics-6A6978EB-A861.pma +0 -0
  56. package/.pi/.pi-puppeteer/profiles/chrome/default/BrowserMetrics-spare.pma +0 -0
  57. package/.pi/.pi-puppeteer/profiles/chrome/default/CaptchaProviders/8.5419.4434/_metadata/verified_contents.json +0 -1
  58. package/.pi/.pi-puppeteer/profiles/chrome/default/CaptchaProviders/8.5419.4434/captcha_providers.json +0 -12
  59. package/.pi/.pi-puppeteer/profiles/chrome/default/CaptchaProviders/8.5419.4434/manifest.json +0 -5
  60. package/.pi/.pi-puppeteer/profiles/chrome/default/CertificateRevocation/10680/LICENSE +0 -27
  61. package/.pi/.pi-puppeteer/profiles/chrome/default/CertificateRevocation/10680/_metadata/verified_contents.json +0 -1
  62. package/.pi/.pi-puppeteer/profiles/chrome/default/CertificateRevocation/10680/crl-set +0 -0
  63. package/.pi/.pi-puppeteer/profiles/chrome/default/CertificateRevocation/10680/manifest.json +0 -5
  64. package/.pi/.pi-puppeteer/profiles/chrome/default/ChromeFeatureState +0 -1
  65. package/.pi/.pi-puppeteer/profiles/chrome/default/Consent To Send Stats +0 -1
  66. package/.pi/.pi-puppeteer/profiles/chrome/default/Crowd Deny/2026.7.27.84/Preload Data +0 -24078
  67. package/.pi/.pi-puppeteer/profiles/chrome/default/Crowd Deny/2026.7.27.84/_metadata/verified_contents.json +0 -1
  68. package/.pi/.pi-puppeteer/profiles/chrome/default/Crowd Deny/2026.7.27.84/manifest.json +0 -6
  69. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/.com.google.Chrome.Hbf1ld +0 -0
  70. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Account Web Data +0 -0
  71. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Account Web Data-journal +0 -0
  72. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Affiliation Database +0 -0
  73. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Affiliation Database-journal +0 -0
  74. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/AutofillAiModelCache/LOCK +0 -0
  75. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/AutofillAiModelCache/LOG +0 -0
  76. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/AutofillAiModelCache/LOG.old +0 -0
  77. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/AutofillStrikeDatabase/LOCK +0 -0
  78. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/AutofillStrikeDatabase/LOG +0 -0
  79. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/AutofillStrikeDatabase/LOG.old +0 -0
  80. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/BookmarkMergedSurfaceOrdering +0 -2
  81. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/BudgetDatabase/LOCK +0 -0
  82. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/BudgetDatabase/LOG +0 -0
  83. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/BudgetDatabase/LOG.old +0 -0
  84. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/003827f5ea5ac9e9_0 +0 -0
  85. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/00473eec8b9b56d5_0 +0 -0
  86. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/05a190c784b641e3_0 +0 -0
  87. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/066df8884be8cf8d_0 +0 -0
  88. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/09627b0809e61f83_0 +0 -0
  89. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/09b27ac23861b1d7_0 +0 -0
  90. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/0fd9412b623e5a66_0 +0 -0
  91. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/118fb0fa2505d3b2_0 +0 -0
  92. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/1194588b7e2b20e9_0 +0 -0
  93. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/135a3004445f6f03_0 +0 -0
  94. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/13f1e7131fe25bc6_0 +0 -0
  95. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/15a2a5dccd304be7_0 +0 -0
  96. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/17893ac60e1e94c2_0 +0 -0
  97. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/19474b63539a4609_0 +0 -0
  98. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/1a1ecc22219568db_0 +0 -0
  99. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/1bb0006133ebefa3_0 +0 -0
  100. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/1cfaeeed4b13a026_0 +0 -0
  101. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/1e3cf5f23a4de58b_0 +0 -0
  102. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/20427e8d33888ba3_0 +0 -0
  103. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/2258d238accf0bfa_0 +0 -0
  104. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/228c3ad9d63adf48_0 +0 -0
  105. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/2437d308abe15ac2_0 +0 -0
  106. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/246f33a252b55bce_0 +0 -0
  107. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/25862298f2999d7d_0 +0 -0
  108. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/262d9bff9f7f64bb_0 +0 -0
  109. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/264aad789515de93_0 +0 -0
  110. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/269ad8897b8e63d0_0 +0 -0
  111. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/2cd2c50a38161cab_0 +0 -0
  112. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/2dd4db1365eeeac8_0 +0 -0
  113. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/2eae0c639fd772df_0 +0 -0
  114. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/30bb21d39b68bd84_0 +0 -0
  115. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/31121aeb5ecffa5f_0 +0 -0
  116. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/32766be1527c8e9a_0 +0 -0
  117. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/328e80b1ed10d28d_0 +0 -0
  118. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/339dcbdde8b8ac4e_0 +0 -0
  119. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/34439c1d4bfc8dad_0 +0 -0
  120. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/381d5603ee3fd8b9_0 +0 -0
  121. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/38fbe92680d28074_0 +0 -0
  122. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/393ce7bb08410970_0 +0 -0
  123. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/3d74b8be0f86614f_0 +0 -0
  124. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/4016e35a2021656d_0 +0 -0
  125. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/409bcaf42c9c09b4_0 +0 -0
  126. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/41888ebeeb475a59_0 +0 -0
  127. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/4714ef11264459f5_0 +0 -0
  128. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/479d2c4f7d4f3b38_0 +0 -0
  129. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/4824ea24720f1a77_0 +0 -0
  130. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/4a73d37e6e4ce922_0 +0 -0
  131. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/4ecdd068adbdf42a_0 +0 -0
  132. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/54e6cc05346dd07c_0 +0 -0
  133. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/5505ea174dc90263_0 +0 -0
  134. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/551679343b836505_0 +0 -0
  135. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/573f6264a77df462_0 +0 -0
  136. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/578926a5c39768ed_0 +0 -0
  137. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/582a8182776d9380_0 +0 -0
  138. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/5f3aa184b329759d_0 +0 -0
  139. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/6351cd107efed247_0 +0 -0
  140. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/637516a46d1d8587_0 +0 -0
  141. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/65e82d9cb58cbd6d_0 +0 -0
  142. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/66d24a1529d6dae0_0 +0 -0
  143. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/6995a7c799490d3d_0 +0 -0
  144. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/6d10426240c5ff67_0 +0 -0
  145. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/6dc325603c897784_0 +0 -0
  146. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/6fbab020dd731222_0 +0 -0
  147. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/70fa542a6974378a_0 +0 -0
  148. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/72a8c452abd1b0e6_0 +0 -0
  149. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/72df48e9888c822b_0 +0 -0
  150. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/73abcb8da3b9f73d_0 +0 -0
  151. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/741e8bcc257a64a9_0 +0 -0
  152. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/75df0820975fcdfa_0 +0 -0
  153. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/7789e307be36811d_0 +0 -0
  154. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/79a161a9b2f4a11e_0 +0 -0
  155. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/7afd0bc7f9852bf0_0 +0 -0
  156. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/7ce691ce1ceb3b8d_0 +0 -0
  157. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/7ef6780a186001ac_0 +0 -0
  158. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/80402f00feb6a222_0 +0 -0
  159. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/85b55ea0ca260643_0 +0 -0
  160. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/86300205c03092e4_0 +0 -0
  161. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/87c94a2eac816ea9_0 +0 -0
  162. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/880c25af3ab59187_0 +0 -0
  163. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/8a7d0881c813aeec_0 +0 -0
  164. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/8bad3b1bccd25517_0 +0 -0
  165. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/8bd9377481fa7d43_0 +0 -0
  166. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/8c1a58ce19e15d16_0 +0 -0
  167. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/8e44e385f5911b07_0 +0 -0
  168. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/90e39d8d065f6ac0_0 +0 -0
  169. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/93d81321f8c35eab_0 +0 -0
  170. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/93e9945beb439414_0 +0 -0
  171. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/944e08f273fccc44_0 +0 -0
  172. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/95edd63493c49660_0 +0 -0
  173. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9789c4ee76bdb350_0 +0 -0
  174. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9a5911308e0f26ad_0 +0 -0
  175. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9a6cdf8f5c03aee5_0 +0 -0
  176. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9aeb4a3d1a607b07_0 +0 -0
  177. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9aff0e1ff1742ee0_0 +0 -0
  178. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9bdabd2703f2e3ba_0 +0 -0
  179. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9d4d11ac8a8e264f_0 +0 -0
  180. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9dd169e672e31961_0 +0 -0
  181. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/9e72442bf8821115_0 +0 -0
  182. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/a330965ccf5564ca_0 +0 -0
  183. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/a3a3c6351a3f2f42_0 +0 -0
  184. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/a818977d416f829d_0 +0 -0
  185. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/aa452720fc9d634f_0 +0 -0
  186. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/ac06b722aea9fcb8_0 +0 -0
  187. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/aca3b8cf1f98e0bb_0 +0 -0
  188. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/add439b7aae9334a_0 +0 -0
  189. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/b0113626d8ba968d_0 +0 -0
  190. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/ba97b9d927729aa7_0 +0 -0
  191. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/bfcb9d225e4f11a8_0 +0 -0
  192. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/c364377515d768e0_0 +0 -0
  193. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/c4376485fa897eca_0 +0 -0
  194. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/c5b74f49505d3ecc_0 +0 -0
  195. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/c7e10eb03f6d5cc2_0 +0 -0
  196. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/c91efba145098b4c_0 +0 -0
  197. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/caecbbde37e3c866_0 +0 -0
  198. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/cdddd64b252697fd_0 +0 -0
  199. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d3efa3ab37db7796_0 +0 -0
  200. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d6289ab00fe343c0_0 +0 -0
  201. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d6be42432091d3ae_0 +0 -0
  202. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d7137f065f39412f_0 +0 -0
  203. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d83db61c108fa34f_0 +0 -0
  204. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d86cd6e1d99a8eaf_0 +0 -0
  205. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/d97f1cfcc2edd001_0 +0 -0
  206. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/de620df53673a107_0 +0 -0
  207. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/de86892a6fa4e33b_0 +0 -0
  208. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/deb2cfe585bf96b0_0 +0 -0
  209. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/df93d6767095d5ea_0 +0 -0
  210. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e1f8d8432edb7ea6_0 +0 -0
  211. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e2e1058ec6a8e645_0 +0 -0
  212. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e39ddd81e303f259_0 +0 -0
  213. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e468a0fb6aa7fd4e_0 +0 -0
  214. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e46f51470717ac3c_0 +0 -0
  215. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e4a531774ba47406_0 +0 -0
  216. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e57a3a1fa60638e1_0 +0 -0
  217. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e594d414c7f4d6a1_0 +0 -0
  218. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e771a081db13a5b8_0 +0 -0
  219. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e78c0ca6dbdafcd0_0 +0 -0
  220. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e8e671ad5c3fb2a8_0 +0 -0
  221. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/e96e46c4d92b214f_0 +0 -0
  222. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/ea24ade36915d935_0 +0 -0
  223. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/eaa70273ce58d3b3_0 +0 -0
  224. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/eca41bfe04d1680d_0 +0 -0
  225. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/ed551f6d52fa6049_0 +0 -0
  226. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/ee2190fb8068ea31_0 +0 -0
  227. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/ee688f43baa25b4b_0 +0 -0
  228. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f016dffa17337f95_0 +0 -0
  229. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f0707f1f113fa72c_0 +0 -0
  230. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f12650f2be214ec8_0 +0 -0
  231. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f1887b75d61dbd90_0 +0 -0
  232. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f28900863f2e45b7_0 +0 -0
  233. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f4ee911c81881048_0 +0 -0
  234. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f557a2bca202c132_0 +0 -0
  235. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f61ed35c6c0b87d8_0 +0 -0
  236. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/f6f1caefb3e18ade_0 +0 -0
  237. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/fd695fa621d42490_0 +0 -0
  238. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/index +0 -0
  239. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/Cache_Data/index-dir/the-real-index +0 -0
  240. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/No_Vary_Search/journal.baj +0 -1
  241. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cache/No_Vary_Search/snapshot.baf +0 -0
  242. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/ClientCertificates/LOCK +0 -0
  243. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/ClientCertificates/LOG +0 -0
  244. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/ClientCertificates/LOG.old +0 -0
  245. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/02b3a268866a7a0c_0 +0 -0
  246. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/0edbc65a5e505019_0 +0 -0
  247. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/1051d2e224b9dd7a_0 +0 -0
  248. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/13cf7a1704163ded_0 +0 -0
  249. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/16860cee78cb7179_0 +0 -0
  250. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/17ea85d6fceb9229_0 +0 -0
  251. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/1b6c1ba202c59494_0 +0 -0
  252. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/1ebec9ea59157454_0 +0 -0
  253. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/1ee2a6b57d251d09_0 +0 -0
  254. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/2445a9737b996e2a_0 +0 -0
  255. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/2d10a08da99d6d96_0 +0 -0
  256. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/325c8b935b677e9d_0 +0 -0
  257. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/454c49e6be2650e9_0 +0 -0
  258. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/4a34df5a255ad22e_0 +0 -0
  259. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/4dfd5beef212627f_0 +0 -0
  260. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/5fe872a733479fff_0 +0 -0
  261. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/66943b0755a2799d_0 +0 -0
  262. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/6a1839253b0d0b0a_0 +0 -0
  263. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/6e13894af36f3b79_0 +0 -0
  264. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/786d3f1f49d31154_0 +0 -0
  265. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/82f67f35254528ab_0 +0 -0
  266. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/831e5a135cde918e_0 +0 -0
  267. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/9965b2c8a33ec50d_0 +0 -0
  268. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/a15b1367fd75ef89_0 +0 -0
  269. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/a7c7741248aeea07_0 +0 -0
  270. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/a8e54c52a52541a9_0 +0 -0
  271. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/afa0d16c75997a6c_0 +0 -0
  272. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/b35d29b5b3583a88_0 +0 -0
  273. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/bc55d051b6fd0744_0 +0 -0
  274. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/bc8566d00f634dfb_0 +0 -0
  275. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/c0be8aeb35882f7c_0 +0 -0
  276. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/c771807a395d295c_0 +0 -0
  277. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/c9058e9015c26dc7_0 +0 -0
  278. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/d6804628a868f972_0 +0 -0
  279. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/d7f211a5cec70609_0 +0 -0
  280. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/d9c03164fc246389_0 +0 -0
  281. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/e1011bf217f0ad7a_0 +0 -0
  282. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/efd85d739d006527_0 +0 -0
  283. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/f5fe496bf55cd561_0 +0 -0
  284. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/fc52f43646894a73_0 +0 -0
  285. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/fc8954eb9445852d_0 +0 -0
  286. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/ff6de2f37189b29f_0 +0 -0
  287. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/index +0 -0
  288. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/js/index-dir/the-real-index +0 -0
  289. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/wasm/index +0 -0
  290. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Code Cache/wasm/index-dir/the-real-index +0 -0
  291. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cookies +0 -0
  292. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Cookies-journal +0 -0
  293. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DIPS +0 -0
  294. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnGraphiteCache/data_0 +0 -0
  295. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnGraphiteCache/data_1 +0 -0
  296. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnGraphiteCache/data_2 +0 -0
  297. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnGraphiteCache/data_3 +0 -0
  298. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnGraphiteCache/index +0 -0
  299. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnWebGPUCache/data_0 +0 -0
  300. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnWebGPUCache/data_1 +0 -0
  301. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnWebGPUCache/data_2 +0 -0
  302. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnWebGPUCache/data_3 +0 -0
  303. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/DawnWebGPUCache/index +0 -0
  304. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Rules/CURRENT +0 -1
  305. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Rules/LOCK +0 -0
  306. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Rules/LOG +0 -2
  307. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Rules/MANIFEST-000001 +0 -0
  308. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Scripts/CURRENT +0 -1
  309. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Scripts/LOCK +0 -0
  310. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Scripts/LOG +0 -2
  311. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension Scripts/MANIFEST-000001 +0 -0
  312. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension State/CURRENT +0 -1
  313. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension State/LOCK +0 -0
  314. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension State/LOG +0 -3
  315. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension State/LOG.old +0 -3
  316. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Extension State/MANIFEST-000001 +0 -0
  317. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Favicons +0 -0
  318. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Favicons-journal +0 -0
  319. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Feature Engagement Tracker/AvailabilityDB/LOCK +0 -0
  320. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Feature Engagement Tracker/AvailabilityDB/LOG +0 -0
  321. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Feature Engagement Tracker/AvailabilityDB/LOG.old +0 -0
  322. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Feature Engagement Tracker/EventDB/LOCK +0 -0
  323. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Feature Engagement Tracker/EventDB/LOG +0 -0
  324. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Feature Engagement Tracker/EventDB/LOG.old +0 -0
  325. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GCM Store/CURRENT +0 -1
  326. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GCM Store/LOCK +0 -0
  327. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GCM Store/LOG +0 -3
  328. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GCM Store/LOG.old +0 -3
  329. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GCM Store/MANIFEST-000001 +0 -0
  330. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GPUCache/data_0 +0 -0
  331. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GPUCache/data_1 +0 -0
  332. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GPUCache/data_2 +0 -0
  333. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GPUCache/data_3 +0 -0
  334. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/GPUCache/index +0 -0
  335. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/History +0 -0
  336. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/History-journal +0 -0
  337. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/LOCK +0 -0
  338. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/LOG +0 -0
  339. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/LOG.old +0 -0
  340. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Local Storage/leveldb/CURRENT +0 -1
  341. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Local Storage/leveldb/LOCK +0 -0
  342. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Local Storage/leveldb/LOG +0 -3
  343. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Local Storage/leveldb/LOG.old +0 -3
  344. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Local Storage/leveldb/MANIFEST-000001 +0 -0
  345. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Login Data +0 -0
  346. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Login Data For Account +0 -0
  347. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Login Data For Account-journal +0 -0
  348. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Login Data-journal +0 -0
  349. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Network Action Predictor +0 -0
  350. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Network Action Predictor-journal +0 -0
  351. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Network Persistent State +0 -1
  352. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/PersistentOriginTrials/LOCK +0 -0
  353. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/PersistentOriginTrials/LOG +0 -0
  354. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/PersistentOriginTrials/LOG.old +0 -0
  355. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Preferences +0 -1
  356. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/PreferredApps +0 -1
  357. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/README +0 -1
  358. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Reporting and NEL +0 -0
  359. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Reporting and NEL-journal +0 -0
  360. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Safe Browsing Cookies +0 -0
  361. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Safe Browsing Cookies-journal +0 -0
  362. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Secure Preferences +0 -1
  363. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SegmentInfoDB/LOCK +0 -0
  364. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SegmentInfoDB/LOG +0 -0
  365. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SegmentInfoDB/LOG.old +0 -0
  366. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SignalDB/LOCK +0 -0
  367. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SignalDB/LOG +0 -0
  368. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SignalDB/LOG.old +0 -0
  369. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SignalStorageConfigDB/LOCK +0 -0
  370. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SignalStorageConfigDB/LOG +0 -0
  371. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Segmentation Platform/SignalStorageConfigDB/LOG.old +0 -0
  372. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/ServerCertificate +0 -0
  373. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/ServerCertificate-journal +0 -0
  374. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/09ed93488198f423_0 +0 -0
  375. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/09ed93488198f423_1 +0 -0
  376. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/0a30220965d74d1e_0 +0 -0
  377. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/1300177f362c3a4a_0 +0 -0
  378. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/1300177f362c3a4a_1 +0 -0
  379. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/27b9ccf88365ee26_0 +0 -0
  380. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/2921673031323747_0 +0 -0
  381. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/2921673031323747_1 +0 -0
  382. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/35f037f406300022_0 +0 -0
  383. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/35f037f406300022_1 +0 -0
  384. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/3adbee165bfbf214_0 +0 -0
  385. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/3c8f4750e95148d9_0 +0 -0
  386. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/3ce96b151d8c7cc1_0 +0 -0
  387. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/3ce96b151d8c7cc1_1 +0 -0
  388. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/483d56a1df05215a_0 +0 -0
  389. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/483d56a1df05215a_1 +0 -0
  390. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/4d82f9d0e0941cce_0 +0 -0
  391. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/4f42af3671d8c6c6_0 +0 -0
  392. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/4f42af3671d8c6c6_1 +0 -0
  393. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5973e266a3773c26_0 +0 -0
  394. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5ad1663b68163b6f_0 +0 -0
  395. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5b4c15b3725d9989_0 +0 -0
  396. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5b4c15b3725d9989_1 +0 -0
  397. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5c619235d9c64bc3_0 +0 -0
  398. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5c619235d9c64bc3_1 +0 -0
  399. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5e3af97b8dccb412_0 +0 -0
  400. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/5e3af97b8dccb412_1 +0 -0
  401. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/6e068fc05df362b0_0 +0 -0
  402. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/6e068fc05df362b0_1 +0 -0
  403. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/755a4c7663f8dc02_0 +0 -0
  404. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/755a4c7663f8dc02_1 +0 -0
  405. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/7969561312c7823f_0 +0 -0
  406. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/7969561312c7823f_1 +0 -0
  407. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/79ffa2733a735063_0 +0 -0
  408. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/7f91cd3066f0019f_0 +0 -0
  409. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/7f91cd3066f0019f_1 +0 -0
  410. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/7f97d42038a92017_0 +0 -0
  411. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/7f97d42038a92017_1 +0 -0
  412. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/820d43cc26b882ff_0 +0 -0
  413. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/820d43cc26b882ff_1 +0 -0
  414. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/88e95753fb6f9ea9_0 +0 -0
  415. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/8b469fd8bafad3b3_0 +0 -0
  416. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/8b469fd8bafad3b3_1 +0 -0
  417. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/900dd661df81967a_0 +0 -0
  418. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/9546d2c6dd38203c_0 +0 -0
  419. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/9546d2c6dd38203c_1 +0 -0
  420. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/96d03a8b051613e1_0 +0 -0
  421. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/96d03a8b051613e1_1 +0 -0
  422. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/a0222364eb3781e3_0 +0 -0
  423. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/a0222364eb3781e3_1 +0 -0
  424. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/a524d2c2d64c3660_0 +0 -0
  425. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/a524d2c2d64c3660_1 +0 -0
  426. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/a78bfbcc1859fb76_0 +0 -0
  427. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/a78bfbcc1859fb76_1 +0 -0
  428. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/ac56d7aa94c8dd89_0 +0 -0
  429. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/ac56d7aa94c8dd89_1 +0 -0
  430. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/b5055aa76b1823e0_0 +0 -0
  431. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/b5055aa76b1823e0_1 +0 -0
  432. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c0b18bd33c20f43c_0 +0 -0
  433. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c0b18bd33c20f43c_1 +0 -0
  434. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c31100b4d5efc61d_0 +0 -0
  435. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c31100b4d5efc61d_1 +0 -0
  436. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c62331d49f110533_0 +0 -0
  437. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c62331d49f110533_1 +0 -0
  438. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/c7bb739419f12b43_0 +0 -0
  439. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/cdf6536f6656df3e_0 +0 -0
  440. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/cdf6536f6656df3e_1 +0 -0
  441. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d0e2620915e19afb_0 +0 -0
  442. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d0e2620915e19afb_1 +0 -0
  443. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d4313ca21cedf2ad_0 +0 -0
  444. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d4313ca21cedf2ad_1 +0 -0
  445. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d4cbe68232f52d97_0 +0 -0
  446. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d4cbe68232f52d97_1 +0 -0
  447. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d90bf1dbbf713592_0 +0 -0
  448. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/d90bf1dbbf713592_1 +0 -0
  449. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/df18dfd2a1ad9fb4_0 +0 -0
  450. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/df18dfd2a1ad9fb4_1 +0 -0
  451. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e321e1f483bdf8f3_0 +0 -0
  452. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e321e1f483bdf8f3_1 +0 -0
  453. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e3cf32438c59b057_0 +0 -0
  454. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e3cf32438c59b057_1 +0 -0
  455. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e5d70b58b9ad133a_0 +0 -0
  456. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e5d70b58b9ad133a_1 +0 -0
  457. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e6bebc23f041524b_0 +0 -0
  458. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/e6bebc23f041524b_1 +0 -0
  459. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/ec2dbc36a8a707bf_0 +0 -0
  460. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f0d3846d04ec57fa_0 +0 -0
  461. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f0d3846d04ec57fa_1 +0 -0
  462. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f41ecefc4e8c4d02_0 +0 -0
  463. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f41ecefc4e8c4d02_1 +0 -0
  464. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f641877808e85797_0 +0 -0
  465. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f641877808e85797_1 +0 -0
  466. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f792102a3adfa574_0 +0 -0
  467. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f792102a3adfa574_1 +0 -0
  468. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f87456efb50ead2b_0 +0 -0
  469. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f87456efb50ead2b_1 +0 -0
  470. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f9c75818bcb88359_0 +0 -0
  471. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/f9c75818bcb88359_1 +0 -0
  472. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/fb21145c8e2675cb_0 +0 -0
  473. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/fb21145c8e2675cb_1 +0 -0
  474. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/index +0 -0
  475. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/56407312-0248-4546-be02-0d16e58a3522/index-dir/the-real-index +0 -0
  476. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/0281c98fa97441e5_0 +0 -0
  477. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/319cb45fc46cfd93_0 +0 -0
  478. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/685282d5721939ea_0 +0 -0
  479. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/8634e8d5eb849493_0 +0 -0
  480. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/c6ba0abf049dda93_0 +0 -0
  481. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/ff32d8eaf874a37b_0 +0 -0
  482. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/index +0 -0
  483. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/d12381ba-daf3-4f23-9177-0ab3706f83a2/index-dir/the-real-index +0 -0
  484. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/046fd1ef5e540ebf33332849ed99f4174f5bbafc/index.txt +0 -0
  485. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/024678dda211fa26_0 +0 -0
  486. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/024678dda211fa26_1 +0 -0
  487. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/037830b98bc2d51d_0 +0 -0
  488. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/037830b98bc2d51d_1 +0 -0
  489. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/058b480bfb167f1d_0 +0 -0
  490. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/058b480bfb167f1d_1 +0 -0
  491. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/0655e9ff0425de79_0 +0 -0
  492. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/0a59caba16743dc4_0 +0 -0
  493. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/0a59caba16743dc4_1 +0 -0
  494. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/136ff5c99b26781c_0 +0 -0
  495. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/136ff5c99b26781c_1 +0 -0
  496. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/17a566dc27c99ba4_0 +0 -0
  497. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/17a566dc27c99ba4_1 +0 -0
  498. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/21f0f05b2eceebc6_0 +0 -0
  499. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/21f0f05b2eceebc6_1 +0 -0
  500. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/258481d12e2d6b56_0 +0 -0
  501. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/258481d12e2d6b56_1 +0 -0
  502. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/384fffcb0c07b624_0 +0 -0
  503. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/4d19946442d4bfbb_0 +0 -0
  504. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/4db2b1b4ab66bab9_0 +0 -0
  505. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/4db2b1b4ab66bab9_1 +0 -0
  506. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/51f125f305445381_0 +0 -0
  507. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/51f125f305445381_1 +0 -0
  508. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/5a8718d400d2f051_0 +0 -0
  509. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/5a8718d400d2f051_1 +0 -0
  510. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/61766447abeea15f_0 +0 -0
  511. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/61766447abeea15f_1 +0 -0
  512. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/62151dfee245ae9b_0 +0 -0
  513. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/62151dfee245ae9b_1 +0 -0
  514. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/696c1b7392b5c15a_0 +0 -0
  515. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/696c1b7392b5c15a_1 +0 -0
  516. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/6c82448ab5b28377_0 +0 -0
  517. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/6c82448ab5b28377_1 +0 -0
  518. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/6d24995ced602e98_0 +0 -0
  519. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/722befb3ecafcb3f_0 +0 -0
  520. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/78c3660b76e7d93a_0 +0 -0
  521. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/78c3660b76e7d93a_1 +0 -0
  522. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/798dd4b9b7d9d5c2_0 +0 -0
  523. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/8595071248e29ee1_0 +0 -0
  524. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/8595071248e29ee1_1 +0 -0
  525. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/8b04b7c22f0fd1f9_0 +0 -0
  526. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/8b04b7c22f0fd1f9_1 +0 -0
  527. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/8f520d5d41ee00bd_0 +0 -0
  528. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/8f520d5d41ee00bd_1 +0 -0
  529. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/901ff14ab13b28c6_0 +0 -0
  530. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/901ff14ab13b28c6_1 +0 -0
  531. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/a1d474dd0b6dd558_0 +0 -0
  532. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/a1d474dd0b6dd558_1 +0 -0
  533. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/a3011f5e2ef033c1_0 +0 -0
  534. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/a3011f5e2ef033c1_1 +0 -0
  535. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/a8b1cac4bc45ce95_0 +0 -0
  536. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/a8b1cac4bc45ce95_1 +0 -0
  537. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/ba58c86b9d2825b2_0 +0 -0
  538. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/ba58c86b9d2825b2_1 +0 -0
  539. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/c5d7b8f405d5e062_0 +0 -0
  540. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/ca40ebe1bbd077ac_0 +0 -0
  541. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/ca40ebe1bbd077ac_1 +0 -0
  542. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/d0ab2b640b0a13e7_0 +0 -0
  543. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/d0ab2b640b0a13e7_1 +0 -0
  544. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/d0c3865f553ac976_0 +0 -0
  545. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/d0c3865f553ac976_1 +0 -0
  546. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/da45add0238a285a_0 +0 -0
  547. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/da45add0238a285a_1 +0 -0
  548. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/e4307c16470799da_0 +0 -0
  549. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/e4307c16470799da_1 +0 -0
  550. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/e7690ca8c63cad14_0 +0 -0
  551. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/e7690ca8c63cad14_1 +0 -0
  552. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/e7ba6f4de6562c89_0 +0 -0
  553. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/e7ba6f4de6562c89_1 +0 -0
  554. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/eb1bcf853b355e13_0 +0 -0
  555. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/eb1bcf853b355e13_1 +0 -0
  556. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/f32ce7214b1774ba_0 +0 -0
  557. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/f32ce7214b1774ba_1 +0 -0
  558. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/f62e4b05ee7d99f9_0 +0 -0
  559. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/f62e4b05ee7d99f9_1 +0 -0
  560. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/fc5ef4b63ae4bb4b_0 +0 -0
  561. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/index +0 -0
  562. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/3691c090-dad1-4066-a2d5-4462a09e7435/index-dir/the-real-index +0 -0
  563. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/52158ab3c1d3fdde_0 +0 -0
  564. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/9c3cfbb43286df23_0 +0 -0
  565. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/b19f1b829e018cf2_0 +0 -0
  566. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/b8ae4f867095f4fd_0 +0 -0
  567. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/bdc920a7c2524c3b_0 +0 -0
  568. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/ea5f9af36eefd38b_0 +0 -0
  569. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/index +0 -0
  570. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/de96e545-808a-4ef3-b7b1-a72521505ad2/index-dir/the-real-index +0 -0
  571. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/CacheStorage/2f12120e9e05877e5620444e87e1a223bba7f923/index.txt +0 -0
  572. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/Database/CURRENT +0 -1
  573. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/Database/LOCK +0 -0
  574. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/Database/LOG +0 -3
  575. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/Database/LOG.old +0 -3
  576. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/Database/MANIFEST-000001 +0 -0
  577. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/ScriptCache/2cc80dabc69f58b6_0 +0 -0
  578. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/ScriptCache/2cc80dabc69f58b6_1 +0 -0
  579. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/ScriptCache/fa813c9ad67834ac_0 +0 -0
  580. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/ScriptCache/fa813c9ad67834ac_1 +0 -0
  581. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/ScriptCache/index +0 -0
  582. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Service Worker/ScriptCache/index-dir/the-real-index +0 -0
  583. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Session Storage/CURRENT +0 -1
  584. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Session Storage/LOCK +0 -0
  585. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Session Storage/LOG +0 -3
  586. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Session Storage/LOG.old +0 -3
  587. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Session Storage/MANIFEST-000001 +0 -0
  588. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sessions/Session_13429768577966436 +0 -0
  589. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sessions/Tabs_13429770684888237 +0 -0
  590. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sessions/Tabs_13429770734729173 +0 -0
  591. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Shared Dictionary/cache/index +0 -0
  592. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Shared Dictionary/cache/index-dir/the-real-index +0 -0
  593. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Shared Dictionary/db +0 -0
  594. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Shared Dictionary/db-journal +0 -0
  595. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/SharedStorage +0 -0
  596. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Shortcuts +0 -0
  597. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Shortcuts-journal +0 -0
  598. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Site Characteristics Database/CURRENT +0 -1
  599. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Site Characteristics Database/LOCK +0 -0
  600. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Site Characteristics Database/LOG +0 -3
  601. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Site Characteristics Database/LOG.old +0 -3
  602. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Site Characteristics Database/MANIFEST-000001 +0 -0
  603. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sync Data/LevelDB/CURRENT +0 -1
  604. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sync Data/LevelDB/LOCK +0 -0
  605. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sync Data/LevelDB/LOG +0 -3
  606. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sync Data/LevelDB/LOG.old +0 -3
  607. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Sync Data/LevelDB/MANIFEST-000001 +0 -0
  608. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Top Sites +0 -0
  609. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Top Sites-journal +0 -0
  610. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Translate Ranker Model +0 -0
  611. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/TransportSecurity +0 -1
  612. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Trust Tokens +0 -0
  613. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Trust Tokens-journal +0 -0
  614. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Web Data +0 -0
  615. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/Web Data-journal +0 -0
  616. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/WebStorage/QuotaManager +0 -0
  617. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/WebStorage/QuotaManager-journal +0 -0
  618. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/chrome_cart_db/LOCK +0 -0
  619. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/chrome_cart_db/LOG +0 -0
  620. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/chrome_cart_db/LOG.old +0 -0
  621. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/commerce_subscription_db/LOCK +0 -0
  622. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/commerce_subscription_db/LOG +0 -0
  623. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/commerce_subscription_db/LOG.old +0 -0
  624. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/discount_infos_db/LOCK +0 -0
  625. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/discount_infos_db/LOG +0 -0
  626. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/discount_infos_db/LOG.old +0 -0
  627. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/discounts_db/LOCK +0 -0
  628. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/discounts_db/LOG +0 -0
  629. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/discounts_db/LOG.old +0 -0
  630. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/engine_allowlist.bf +0 -0
  631. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/heavy_ad_intervention_opt_out.db +0 -0
  632. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/heavy_ad_intervention_opt_out.db-journal +0 -0
  633. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/parcel_tracking_db/LOCK +0 -0
  634. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/parcel_tracking_db/LOG +0 -0
  635. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/parcel_tracking_db/LOG.old +0 -0
  636. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/CURRENT +0 -1
  637. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/LOCK +0 -0
  638. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/LOG +0 -3
  639. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/LOG.old +0 -3
  640. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/MANIFEST-000001 +0 -0
  641. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/metadata/CURRENT +0 -1
  642. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/metadata/LOCK +0 -0
  643. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/metadata/LOG +0 -3
  644. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/metadata/LOG.old +0 -3
  645. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/shared_proto_db/metadata/MANIFEST-000001 +0 -0
  646. package/.pi/.pi-puppeteer/profiles/chrome/default/Default/trusted_vault.pb +0 -2
  647. package/.pi/.pi-puppeteer/profiles/chrome/default/DevToolsActivePort +0 -2
  648. package/.pi/.pi-puppeteer/profiles/chrome/default/FileTypePolicies/145.0.7584.0/_metadata/verified_contents.json +0 -1
  649. package/.pi/.pi-puppeteer/profiles/chrome/default/FileTypePolicies/145.0.7584.0/download_file_types.pb +0 -0
  650. package/.pi/.pi-puppeteer/profiles/chrome/default/FileTypePolicies/145.0.7584.0/manifest.json +0 -5
  651. package/.pi/.pi-puppeteer/profiles/chrome/default/FirstPartySetsPreloaded/2025.7.24.0/LICENSE +0 -27
  652. package/.pi/.pi-puppeteer/profiles/chrome/default/FirstPartySetsPreloaded/2025.7.24.0/_metadata/verified_contents.json +0 -1
  653. package/.pi/.pi-puppeteer/profiles/chrome/default/FirstPartySetsPreloaded/2025.7.24.0/manifest.json +0 -5
  654. package/.pi/.pi-puppeteer/profiles/chrome/default/FirstPartySetsPreloaded/2025.7.24.0/sets.json +0 -70
  655. package/.pi/.pi-puppeteer/profiles/chrome/default/GPUPersistentCache/GPUCache/NDJN3PYMYS2VQL44TKFDS34NLSXM6YVU/cache.db +0 -0
  656. package/.pi/.pi-puppeteer/profiles/chrome/default/GPUPersistentCache/GPUCache/NDJN3PYMYS2VQL44TKFDS34NLSXM6YVU/cache.db-wal +0 -0
  657. package/.pi/.pi-puppeteer/profiles/chrome/default/GPUPersistentCache/GPUCache/NDJN3PYMYS2VQL44TKFDS34NLSXM6YVU/cache.journal +0 -0
  658. package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/data_0 +0 -0
  659. package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/data_1 +0 -0
  660. package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/data_2 +0 -0
  661. package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/data_3 +0 -0
  662. package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/f_000001 +0 -0
  663. package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/f_000002 +0 -0
  664. package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/f_000003 +0 -0
  665. package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/f_000004 +0 -0
  666. package/.pi/.pi-puppeteer/profiles/chrome/default/GraphiteDawnCache/index +0 -0
  667. package/.pi/.pi-puppeteer/profiles/chrome/default/Last Version +0 -1
  668. package/.pi/.pi-puppeteer/profiles/chrome/default/Local State +0 -1
  669. package/.pi/.pi-puppeteer/profiles/chrome/default/MEIPreload/1.1.0.3/_metadata/verified_contents.json +0 -1
  670. package/.pi/.pi-puppeteer/profiles/chrome/default/MEIPreload/1.1.0.3/manifest.json +0 -7
  671. package/.pi/.pi-puppeteer/profiles/chrome/default/MEIPreload/1.1.0.3/preloaded_data.pb +0 -0
  672. package/.pi/.pi-puppeteer/profiles/chrome/default/PKIMetadata/1728/_metadata/verified_contents.json +0 -1
  673. package/.pi/.pi-puppeteer/profiles/chrome/default/PKIMetadata/1728/crs.pb +0 -0
  674. package/.pi/.pi-puppeteer/profiles/chrome/default/PKIMetadata/1728/ct_config.pb +3 -322
  675. package/.pi/.pi-puppeteer/profiles/chrome/default/PKIMetadata/1728/kp_pinslist.pb +0 -0
  676. package/.pi/.pi-puppeteer/profiles/chrome/default/PKIMetadata/1728/manifest.json +0 -5
  677. package/.pi/.pi-puppeteer/profiles/chrome/default/PKIMetadata/1728/mtc_config.pb +0 -0
  678. package/.pi/.pi-puppeteer/profiles/chrome/default/SSLErrorAssistant/7/_metadata/verified_contents.json +0 -1
  679. package/.pi/.pi-puppeteer/profiles/chrome/default/SSLErrorAssistant/7/manifest.json +0 -5
  680. package/.pi/.pi-puppeteer/profiles/chrome/default/SSLErrorAssistant/7/ssl_error_assistant.pb +0 -54
  681. package/.pi/.pi-puppeteer/profiles/chrome/default/SafetyTips/3091/_metadata/verified_contents.json +0 -1
  682. package/.pi/.pi-puppeteer/profiles/chrome/default/SafetyTips/3091/manifest.json +0 -5
  683. package/.pi/.pi-puppeteer/profiles/chrome/default/SafetyTips/3091/safety_tips.pb +0 -0
  684. package/.pi/.pi-puppeteer/profiles/chrome/default/Subresource Filter/Indexed Rules/38/9.70.0/Ruleset Data +0 -0
  685. package/.pi/.pi-puppeteer/profiles/chrome/default/Subresource Filter/Unindexed Rules/9.70.0/Filtering Rules +0 -6106
  686. package/.pi/.pi-puppeteer/profiles/chrome/default/Subresource Filter/Unindexed Rules/9.70.0/LICENSE.txt +0 -383
  687. package/.pi/.pi-puppeteer/profiles/chrome/default/Subresource Filter/Unindexed Rules/9.70.0/_metadata/verified_contents.json +0 -1
  688. package/.pi/.pi-puppeteer/profiles/chrome/default/Subresource Filter/Unindexed Rules/9.70.0/manifest.json +0 -6
  689. package/.pi/.pi-puppeteer/profiles/chrome/default/TrustTokenKeyCommitments/2026.3.23.1/LICENSE +0 -27
  690. package/.pi/.pi-puppeteer/profiles/chrome/default/TrustTokenKeyCommitments/2026.3.23.1/_metadata/verified_contents.json +0 -1
  691. package/.pi/.pi-puppeteer/profiles/chrome/default/TrustTokenKeyCommitments/2026.3.23.1/keys.json +0 -1
  692. package/.pi/.pi-puppeteer/profiles/chrome/default/TrustTokenKeyCommitments/2026.3.23.1/manifest.json +0 -5
  693. package/.pi/.pi-puppeteer/profiles/chrome/default/Variations +0 -1
  694. package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/_metadata/verified_contents.json +0 -1
  695. package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/background_compiled.js +0 -40
  696. package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/bindings_main.js +0 -6281
  697. package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/bindings_main.wasm +0 -0
  698. package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/manifest.json +0 -5
  699. package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/offscreen.html +0 -2
  700. package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/offscreen_compiled.js +0 -131
  701. package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/streaming_worklet_processor.js +0 -78
  702. package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/voices.json +0 -1779
  703. package/.pi/.pi-puppeteer/profiles/chrome/default/WasmTtsEngine/20260723.1/wasm_tts_manifest_v3.json +0 -43
  704. package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/_metadata/verified_contents.json +0 -1
  705. package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/english_wikipedia.txt +0 -30000
  706. package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/female_names.txt +0 -3712
  707. package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/male_names.txt +0 -984
  708. package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/manifest.json +0 -5
  709. package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/passwords.txt +0 -30000
  710. package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/ranked_dicts +0 -0
  711. package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/surnames.txt +0 -10000
  712. package/.pi/.pi-puppeteer/profiles/chrome/default/ZxcvbnData/3/us_tv_and_film.txt +0 -19160
  713. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/0d784450fcc5b3ad7ab4efa85b2e1fe56bd5086b69807eab756f62c257ea0d8b +0 -0
  714. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/0d994b6c9c5d4b0316bcc7a79f4939a2390c638169ea6dc783198c17286d8255 +0 -0
  715. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/3eb16d6c28b502ac4cfee8f4a148df05f4d93229fa36a71db8b08d06329ff18a +0 -0
  716. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/4448b37acb13eb51a842a8ebc85ea826729571c7293f2213d855d3a76cb9a4f8 +0 -0
  717. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/545666a4efd056351597bb386aea1368105ededc976ed5650d8682daab9f37ff +0 -0
  718. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/56c21927faa028be6ce18c931660eec37e41da4bfbfd47cafa48350f828c0dbd +0 -0
  719. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/733776833212346a1018b95197c61bed2d107fbb7790a985ef692780e02f31cb +0 -0
  720. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/7b05c14dba04ed522210b733f004cb0e74d7679a653b19bd029f9bc0e6b19903 +0 -0
  721. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/8f2c0712b6800fa9622a039cb167cc9503d508a271247e445f08a96eded5772f +0 -0
  722. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/9bec6c2c0185d3305ac8495047a1aa01e725d58f8f18d219742a2988f07cd93a +0 -0
  723. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/9f157bd09a986baa46110a0acb7e3d7407208e58d02250c637902962e5ed2c5e +0 -0
  724. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/abd93867c038d4d17c101ace2226d7e21303d984d7097271392bae6be478495b +0 -0
  725. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/ae216724654f3e52d3c502328caf83f773e66cc5818c38850165864005a35169 +0 -0
  726. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/c8c2fd0acdb7eecaf4f66d5164204c4e8e5ebbabb6398e0ee6ec6d8af71ea672 +0 -0
  727. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/fd8fd38c229ab33755ff429ccc9919eba21b566551cbfb17d8e11e35e941ee0e +0 -0
  728. package/.pi/.pi-puppeteer/profiles/chrome/default/component_crx_cache/metadata.json +0 -1
  729. package/.pi/.pi-puppeteer/profiles/chrome/default/extensions_crx_cache/metadata.json +0 -1
  730. package/.pi/.pi-puppeteer/profiles/chrome/default/first_party_sets.db +0 -0
  731. package/.pi/.pi-puppeteer/profiles/chrome/default/first_party_sets.db-journal +0 -0
  732. package/.pi/.pi-puppeteer/profiles/chrome/default/segmentation_platform/ukm_db +0 -0
  733. package/.pi-subagents/artifacts/6d0b4431_custom.vision-agent_0_input.md +0 -54
  734. package/.pi-subagents/artifacts/6d0b4431_custom.vision-agent_0_meta.json +0 -114
  735. package/.pi-subagents/artifacts/6d0b4431_custom.vision-agent_0_output.md +0 -22
  736. package/.pi-subagents/artifacts/6d0b4431_custom.vision-agent_0_transcript.jsonl +0 -7
  737. 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.filter((p) => p.type === "builtin");
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
- if (!existing) return;
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
- const newId = sanitizeProviderId(id + suffix);
197
- // Copy config but clear apiKey, authHeader, and models
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
- baseUrl: existing.baseUrl,
200
- api: existing.api,
201
- headers: existing.headers,
202
- modelOverrides: existing.modelOverrides,
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) setSelectedId(newId);
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
- <p className="px-2 pb-2 pt-1 text-xs font-medium uppercase tracking-wider text-gray-500">
225
- {t("providers.builtin")}
226
- </p>
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
- {builtinProviders.map((p) => (
229
- <ProviderListItem
230
- key={p.id}
231
- provider={p}
232
- active={!adding && selectedId === p.id}
233
- hasKey={hasKey(p)}
234
- onClick={() => {
235
- setAdding(false);
236
- setSelectedId(p.id);
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<{ id: string; contextWindow?: number; maxTokens?: number; vision?: boolean }[]>([]);
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
- addModel(provider.id, { id: m.id, contextWindow: m.contextWindow ?? DEFAULT_CONTEXT_WINDOW, maxTokens: m.maxTokens ?? DEFAULT_MAX_TOKENS, input: m.vision ? ["text", "image"] : ["text"] } as Model);
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
- const urlInvalid = isCustom && baseUrl.trim() !== "" && !isValidHttpUrl(baseUrl.trim());
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 if (apiKey !== savedKey) {
611
- ok = apiKey
612
- ? await setProviderAuth(provider.id, apiKey)
613
- : await removeProviderAuth(provider.id);
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 visibleModels = q
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 disabled:opacity-50",
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 disabled:opacity-50"
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={() => setAllEnabled(true)}
781
- className="rounded-md px-2 py-1 text-xs text-emerald-400 transition-colors hover:bg-emerald-500/10"
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={() => setAllEnabled(false)}
787
- className="rounded-md px-2 py-1 text-xs text-gray-400 transition-colors hover:bg-gray-800"
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={cn(
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
- <span className="rounded-md border border-gray-600 bg-gray-800/50 px-2 py-0.5 text-xs text-gray-400">
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
- ? `$${m.cost.input}/${m.cost.output}`
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
- <span className={`flex shrink-0 items-center gap-1 rounded border px-1.5 py-0.5 text-xs ${m.vision ? "border-blue-500/40 bg-blue-500/10 text-blue-400" : "border-gray-700 bg-gray-800 text-gray-500"}`}>
983
- {m.vision && <ImageIcon className="h-3 w-3" />}
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.contextWindow && <span className="rounded border border-gray-700 bg-gray-800 px-1.5 py-0.5 text-xs text-gray-500 font-mono">{formatTokens(m.contextWindow)}</span>}
987
- {m.maxTokens && <span className="rounded border border-gray-700 bg-gray-800 px-1.5 py-0.5 text-xs text-gray-500 font-mono">{formatTokens(m.maxTokens)}</span>}
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
- function ModelForm({
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
- const isEdit = !!initial;
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) => setForm({ ...form, id: e.target.value })}
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) => setForm({ ...form, name: e.target.value })}
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) => setForm({ ...form, contextWindow: parseInt(e.target.value) || DEFAULT_CONTEXT_WINDOW })}
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) => setForm({ ...form, maxTokens: parseInt(e.target.value) || DEFAULT_MAX_TOKENS })}
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-3">
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) => setForm({ ...form, reasoning: e.target.checked })}
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<{ id: string; contextWindow?: number; maxTokens?: number; vision?: boolean }[]>([]);
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 { id: string; contextWindow?: number; maxTokens?: number; vision?: boolean }[];
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 limits when the endpoint provides them
1564
- ...selectedFetched.map((m) => ({
1565
- id: m.id,
1566
- name: m.id.split("/").pop() || m.id,
1567
- contextWindow: m.contextWindow ?? DEFAULT_CONTEXT_WINDOW,
1568
- maxTokens: m.maxTokens ?? DEFAULT_MAX_TOKENS,
1569
- ...defaults,
1570
- input: (m.vision ? ["text", "image"] : ["text"]) as Model["input"],
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={`ml-auto flex shrink-0 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"}`}>
1789
- {m.vision && <ImageIcon className="h-2.5 w-2.5" />}
1790
- {m.vision ? t("providers_models.modality_vision") : t("providers_models.modality_text")}
1791
- </span>
1792
- {m.contextWindow && (
1793
- <span className="shrink-0 text-[10px] text-gray-500">
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>