@raingor/pi-web-switch 0.3.3 → 0.4.1

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