anypick 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1231) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +589 -0
  3. package/dist/adapters.d.ts +4 -0
  4. package/dist/adapters.d.ts.map +1 -0
  5. package/dist/adapters.js +2 -0
  6. package/dist/catalog/model-fetch.d.ts +34 -0
  7. package/dist/catalog/model-fetch.d.ts.map +1 -0
  8. package/dist/catalog/model-fetch.js +99 -0
  9. package/dist/catalog/model-fetch.js.map +1 -0
  10. package/dist/catalog/providers.d.ts +42 -0
  11. package/dist/catalog/providers.d.ts.map +1 -0
  12. package/dist/catalog/providers.js +424 -0
  13. package/dist/catalog/providers.js.map +1 -0
  14. package/dist/cli/bootstrap.d.ts +3 -0
  15. package/dist/cli/bootstrap.d.ts.map +1 -0
  16. package/dist/cli/bootstrap.js +78 -0
  17. package/dist/cli/bootstrap.js.map +1 -0
  18. package/dist/cli/commands.d.ts +29 -0
  19. package/dist/cli/commands.d.ts.map +1 -0
  20. package/dist/cli/commands.js +1043 -0
  21. package/dist/cli/commands.js.map +1 -0
  22. package/dist/cli/completion.d.ts +6 -0
  23. package/dist/cli/completion.d.ts.map +1 -0
  24. package/dist/cli/completion.js +202 -0
  25. package/dist/cli/completion.js.map +1 -0
  26. package/dist/cli/errors.d.ts +20 -0
  27. package/dist/cli/errors.d.ts.map +1 -0
  28. package/dist/cli/errors.js +47 -0
  29. package/dist/cli/errors.js.map +1 -0
  30. package/dist/cli/format.d.ts +6 -0
  31. package/dist/cli/format.d.ts.map +1 -0
  32. package/dist/cli/format.js +75 -0
  33. package/dist/cli/format.js.map +1 -0
  34. package/dist/cli/help.d.ts +6 -0
  35. package/dist/cli/help.d.ts.map +1 -0
  36. package/dist/cli/help.js +66 -0
  37. package/dist/cli/help.js.map +1 -0
  38. package/dist/cli/interactive-accounts.d.ts +3 -0
  39. package/dist/cli/interactive-accounts.d.ts.map +1 -0
  40. package/dist/cli/interactive-accounts.js +86 -0
  41. package/dist/cli/interactive-accounts.js.map +1 -0
  42. package/dist/cli/interactive-maintenance.d.ts +4 -0
  43. package/dist/cli/interactive-maintenance.d.ts.map +1 -0
  44. package/dist/cli/interactive-maintenance.js +30 -0
  45. package/dist/cli/interactive-maintenance.js.map +1 -0
  46. package/dist/cli/interactive.d.ts +14 -0
  47. package/dist/cli/interactive.d.ts.map +1 -0
  48. package/dist/cli/interactive.js +242 -0
  49. package/dist/cli/interactive.js.map +1 -0
  50. package/dist/cli/launch-client.d.ts +18 -0
  51. package/dist/cli/launch-client.d.ts.map +1 -0
  52. package/dist/cli/launch-client.js +117 -0
  53. package/dist/cli/launch-client.js.map +1 -0
  54. package/dist/cli/launcher-model.d.ts +64 -0
  55. package/dist/cli/launcher-model.d.ts.map +1 -0
  56. package/dist/cli/launcher-model.js +200 -0
  57. package/dist/cli/launcher-model.js.map +1 -0
  58. package/dist/cli/launcher-render.d.ts +22 -0
  59. package/dist/cli/launcher-render.d.ts.map +1 -0
  60. package/dist/cli/launcher-render.js +113 -0
  61. package/dist/cli/launcher-render.js.map +1 -0
  62. package/dist/cli/launcher.d.ts +27 -0
  63. package/dist/cli/launcher.d.ts.map +1 -0
  64. package/dist/cli/launcher.js +93 -0
  65. package/dist/cli/launcher.js.map +1 -0
  66. package/dist/cli/local-health.d.ts +17 -0
  67. package/dist/cli/local-health.d.ts.map +1 -0
  68. package/dist/cli/local-health.js +31 -0
  69. package/dist/cli/local-health.js.map +1 -0
  70. package/dist/cli/plugin-commands.d.ts +4 -0
  71. package/dist/cli/plugin-commands.d.ts.map +1 -0
  72. package/dist/cli/plugin-commands.js +160 -0
  73. package/dist/cli/plugin-commands.js.map +1 -0
  74. package/dist/cli/primary.d.ts +18 -0
  75. package/dist/cli/primary.d.ts.map +1 -0
  76. package/dist/cli/primary.js +593 -0
  77. package/dist/cli/primary.js.map +1 -0
  78. package/dist/cli/render-util.d.ts +24 -0
  79. package/dist/cli/render-util.d.ts.map +1 -0
  80. package/dist/cli/render-util.js +58 -0
  81. package/dist/cli/render-util.js.map +1 -0
  82. package/dist/cli/ux.d.ts +43 -0
  83. package/dist/cli/ux.d.ts.map +1 -0
  84. package/dist/cli/ux.js +114 -0
  85. package/dist/cli/ux.js.map +1 -0
  86. package/dist/cli.d.ts +3 -0
  87. package/dist/cli.d.ts.map +1 -0
  88. package/dist/cli.js +35 -0
  89. package/dist/cli.js.map +1 -0
  90. package/dist/clients/claude-client-apply.d.ts +8 -0
  91. package/dist/clients/claude-client-apply.d.ts.map +1 -0
  92. package/dist/clients/claude-client-apply.js +108 -0
  93. package/dist/clients/claude-client-apply.js.map +1 -0
  94. package/dist/clients/claude-code.d.ts +5 -0
  95. package/dist/clients/claude-code.d.ts.map +1 -0
  96. package/dist/clients/claude-code.js +189 -0
  97. package/dist/clients/claude-code.js.map +1 -0
  98. package/dist/clients/claude-settings-guard.d.ts +18 -0
  99. package/dist/clients/claude-settings-guard.d.ts.map +1 -0
  100. package/dist/clients/codex-desktop-catalog.d.ts +67 -0
  101. package/dist/clients/codex-desktop-catalog.d.ts.map +1 -0
  102. package/dist/clients/codex-desktop-catalog.js +212 -0
  103. package/dist/clients/codex-desktop-catalog.js.map +1 -0
  104. package/dist/clients/codex.d.ts +181 -0
  105. package/dist/clients/codex.d.ts.map +1 -0
  106. package/dist/clients/codex.js +783 -0
  107. package/dist/clients/codex.js.map +1 -0
  108. package/dist/clients/env-files.d.ts +14 -0
  109. package/dist/clients/env-files.d.ts.map +1 -0
  110. package/dist/clients/env-files.js +50 -0
  111. package/dist/clients/env-files.js.map +1 -0
  112. package/dist/clients/gemini-client-utils.d.ts +4 -0
  113. package/dist/clients/gemini-client-utils.d.ts.map +1 -0
  114. package/dist/clients/gemini-client-utils.js +33 -0
  115. package/dist/clients/gemini-client-utils.js.map +1 -0
  116. package/dist/clients/gemini.d.ts +16 -0
  117. package/dist/clients/gemini.d.ts.map +1 -0
  118. package/dist/clients/gemini.js +233 -0
  119. package/dist/clients/gemini.js.map +1 -0
  120. package/dist/clients/index.d.ts +14 -0
  121. package/dist/clients/index.d.ts.map +1 -0
  122. package/dist/clients/index.js +18 -0
  123. package/dist/clients/index.js.map +1 -0
  124. package/dist/clients/isolation.d.ts +28 -0
  125. package/dist/clients/isolation.d.ts.map +1 -0
  126. package/dist/clients/isolation.js +131 -0
  127. package/dist/clients/isolation.js.map +1 -0
  128. package/dist/clients/kiro.d.ts +10 -0
  129. package/dist/clients/kiro.d.ts.map +1 -0
  130. package/dist/clients/kiro.js +168 -0
  131. package/dist/clients/kiro.js.map +1 -0
  132. package/dist/clients/model-roles.d.ts +58 -0
  133. package/dist/clients/model-roles.d.ts.map +1 -0
  134. package/dist/clients/model-roles.js +139 -0
  135. package/dist/clients/model-roles.js.map +1 -0
  136. package/dist/clients/registry.d.ts +7 -0
  137. package/dist/clients/registry.d.ts.map +1 -0
  138. package/dist/clients/registry.js +16 -0
  139. package/dist/clients/registry.js.map +1 -0
  140. package/dist/clients/resolve.d.ts +27 -0
  141. package/dist/clients/resolve.d.ts.map +1 -0
  142. package/dist/clients/resolve.js +49 -0
  143. package/dist/clients/resolve.js.map +1 -0
  144. package/dist/core/account-codec.d.ts +32 -0
  145. package/dist/core/account-codec.d.ts.map +1 -0
  146. package/dist/core/account-codec.js +134 -0
  147. package/dist/core/account-codec.js.map +1 -0
  148. package/dist/core/account-transfer.d.ts +20 -0
  149. package/dist/core/account-transfer.d.ts.map +1 -0
  150. package/dist/core/account-transfer.js +136 -0
  151. package/dist/core/account-transfer.js.map +1 -0
  152. package/dist/core/activation-executor.d.ts +72 -0
  153. package/dist/core/activation-executor.d.ts.map +1 -0
  154. package/dist/core/activation-executor.js +690 -0
  155. package/dist/core/activation-executor.js.map +1 -0
  156. package/dist/core/activation-models.d.ts +6 -0
  157. package/dist/core/activation-models.d.ts.map +1 -0
  158. package/dist/core/activation-models.js +33 -0
  159. package/dist/core/activation-models.js.map +1 -0
  160. package/dist/core/activation-planner.d.ts +38 -0
  161. package/dist/core/activation-planner.d.ts.map +1 -0
  162. package/dist/core/activation-planner.js +248 -0
  163. package/dist/core/activation-planner.js.map +1 -0
  164. package/dist/core/activation-protocol.d.ts +3 -0
  165. package/dist/core/activation-protocol.d.ts.map +1 -0
  166. package/dist/core/activation-protocol.js +9 -0
  167. package/dist/core/activation-protocol.js.map +1 -0
  168. package/dist/core/activation-transport.d.ts +15 -0
  169. package/dist/core/activation-transport.d.ts.map +1 -0
  170. package/dist/core/activation-transport.js +23 -0
  171. package/dist/core/activation-transport.js.map +1 -0
  172. package/dist/core/app.d.ts +149 -0
  173. package/dist/core/app.d.ts.map +1 -0
  174. package/dist/core/app.js +372 -0
  175. package/dist/core/app.js.map +1 -0
  176. package/dist/core/binding-service.d.ts +93 -0
  177. package/dist/core/binding-service.d.ts.map +1 -0
  178. package/dist/core/binding-service.js +281 -0
  179. package/dist/core/binding-service.js.map +1 -0
  180. package/dist/core/binding-store.d.ts +23 -0
  181. package/dist/core/binding-store.d.ts.map +1 -0
  182. package/dist/core/binding-store.js +154 -0
  183. package/dist/core/binding-store.js.map +1 -0
  184. package/dist/core/brand.d.ts +18 -0
  185. package/dist/core/brand.d.ts.map +1 -0
  186. package/dist/core/brand.js +22 -0
  187. package/dist/core/brand.js.map +1 -0
  188. package/dist/core/capabilities.d.ts +30 -0
  189. package/dist/core/capabilities.d.ts.map +1 -0
  190. package/dist/core/capabilities.js +27 -0
  191. package/dist/core/capabilities.js.map +1 -0
  192. package/dist/core/client-state-store.d.ts +17 -0
  193. package/dist/core/client-state-store.d.ts.map +1 -0
  194. package/dist/core/client-state-store.js +47 -0
  195. package/dist/core/client-state-store.js.map +1 -0
  196. package/dist/core/codec/account.d.ts +52 -0
  197. package/dist/core/codec/account.d.ts.map +1 -0
  198. package/dist/core/codec/account.js +69 -0
  199. package/dist/core/codec/account.js.map +1 -0
  200. package/dist/core/codec/bindings.d.ts +38 -0
  201. package/dist/core/codec/bindings.d.ts.map +1 -0
  202. package/dist/core/codec/bindings.js +79 -0
  203. package/dist/core/codec/bindings.js.map +1 -0
  204. package/dist/core/codec/operations.d.ts +36 -0
  205. package/dist/core/codec/operations.d.ts.map +1 -0
  206. package/dist/core/codec/operations.js +82 -0
  207. package/dist/core/codec/operations.js.map +1 -0
  208. package/dist/core/codec/primitives.d.ts +59 -0
  209. package/dist/core/codec/primitives.d.ts.map +1 -0
  210. package/dist/core/codec/primitives.js +123 -0
  211. package/dist/core/codec/primitives.js.map +1 -0
  212. package/dist/core/codec/proxy-hub.d.ts +43 -0
  213. package/dist/core/codec/proxy-hub.d.ts.map +1 -0
  214. package/dist/core/codec/proxy-hub.js +69 -0
  215. package/dist/core/codec/proxy-hub.js.map +1 -0
  216. package/dist/core/codec/runtime.d.ts +41 -0
  217. package/dist/core/codec/runtime.d.ts.map +1 -0
  218. package/dist/core/codec/runtime.js +66 -0
  219. package/dist/core/codec/runtime.js.map +1 -0
  220. package/dist/core/codec.d.ts +43 -0
  221. package/dist/core/codec.d.ts.map +1 -0
  222. package/dist/core/codec.js +69 -0
  223. package/dist/core/codec.js.map +1 -0
  224. package/dist/core/codex-live-config.d.ts +92 -0
  225. package/dist/core/codex-live-config.d.ts.map +1 -0
  226. package/dist/core/codex-live-config.js +263 -0
  227. package/dist/core/codex-live-config.js.map +1 -0
  228. package/dist/core/config-service.d.ts +35 -0
  229. package/dist/core/config-service.d.ts.map +1 -0
  230. package/dist/core/config-service.js +87 -0
  231. package/dist/core/config-service.js.map +1 -0
  232. package/dist/core/config.d.ts +14 -0
  233. package/dist/core/config.d.ts.map +1 -0
  234. package/dist/core/config.js +45 -0
  235. package/dist/core/config.js.map +1 -0
  236. package/dist/core/db-schema.d.ts +30 -0
  237. package/dist/core/db-schema.d.ts.map +1 -0
  238. package/dist/core/db-schema.js +278 -0
  239. package/dist/core/db-schema.js.map +1 -0
  240. package/dist/core/db.d.ts +72 -0
  241. package/dist/core/db.d.ts.map +1 -0
  242. package/dist/core/db.js +192 -0
  243. package/dist/core/db.js.map +1 -0
  244. package/dist/core/doctor-fixes.d.ts +3 -0
  245. package/dist/core/doctor-fixes.d.ts.map +1 -0
  246. package/dist/core/doctor-fixes.js +102 -0
  247. package/dist/core/doctor-fixes.js.map +1 -0
  248. package/dist/core/doctor-format.d.ts +10 -0
  249. package/dist/core/doctor-format.d.ts.map +1 -0
  250. package/dist/core/doctor-format.js +45 -0
  251. package/dist/core/doctor-format.js.map +1 -0
  252. package/dist/core/doctor-report.d.ts +3 -0
  253. package/dist/core/doctor-report.d.ts.map +1 -0
  254. package/dist/core/doctor-report.js +174 -0
  255. package/dist/core/doctor-report.js.map +1 -0
  256. package/dist/core/doctor-scan.d.ts +7 -0
  257. package/dist/core/doctor-scan.d.ts.map +1 -0
  258. package/dist/core/doctor-scan.js +139 -0
  259. package/dist/core/doctor-scan.js.map +1 -0
  260. package/dist/core/doctor-types.d.ts +89 -0
  261. package/dist/core/doctor-types.d.ts.map +1 -0
  262. package/dist/core/doctor-types.js +14 -0
  263. package/dist/core/doctor-types.js.map +1 -0
  264. package/dist/core/doctor-utils.d.ts +3 -0
  265. package/dist/core/doctor-utils.d.ts.map +1 -0
  266. package/dist/core/doctor-utils.js +36 -0
  267. package/dist/core/doctor-utils.js.map +1 -0
  268. package/dist/core/doctor.d.ts +14 -0
  269. package/dist/core/doctor.d.ts.map +1 -0
  270. package/dist/core/doctor.js +127 -0
  271. package/dist/core/doctor.js.map +1 -0
  272. package/dist/core/events.d.ts +58 -0
  273. package/dist/core/events.d.ts.map +1 -0
  274. package/dist/core/events.js +88 -0
  275. package/dist/core/events.js.map +1 -0
  276. package/dist/core/journal.d.ts +23 -0
  277. package/dist/core/journal.d.ts.map +1 -0
  278. package/dist/core/journal.js +93 -0
  279. package/dist/core/journal.js.map +1 -0
  280. package/dist/core/lease-store.d.ts +22 -0
  281. package/dist/core/lease-store.d.ts.map +1 -0
  282. package/dist/core/lease-store.js +81 -0
  283. package/dist/core/lease-store.js.map +1 -0
  284. package/dist/core/migrate-bindings.d.ts +10 -0
  285. package/dist/core/migrate-bindings.d.ts.map +1 -0
  286. package/dist/core/migrate-bindings.js +98 -0
  287. package/dist/core/migrate-bindings.js.map +1 -0
  288. package/dist/core/migrate-fs.d.ts +11 -0
  289. package/dist/core/migrate-fs.d.ts.map +1 -0
  290. package/dist/core/migrate-fs.js +184 -0
  291. package/dist/core/migrate-fs.js.map +1 -0
  292. package/dist/core/model-cache-store.d.ts +27 -0
  293. package/dist/core/model-cache-store.d.ts.map +1 -0
  294. package/dist/core/model-cache-store.js +50 -0
  295. package/dist/core/model-cache-store.js.map +1 -0
  296. package/dist/core/model-discovery.d.ts +66 -0
  297. package/dist/core/model-discovery.d.ts.map +1 -0
  298. package/dist/core/model-discovery.js +127 -0
  299. package/dist/core/model-discovery.js.map +1 -0
  300. package/dist/core/model-policy.d.ts +40 -0
  301. package/dist/core/model-policy.d.ts.map +1 -0
  302. package/dist/core/model-policy.js +77 -0
  303. package/dist/core/model-policy.js.map +1 -0
  304. package/dist/core/model-roles.d.ts +9 -0
  305. package/dist/core/model-roles.d.ts.map +1 -0
  306. package/dist/core/model-roles.js +20 -0
  307. package/dist/core/model-roles.js.map +1 -0
  308. package/dist/core/mutation-lock.d.ts +31 -0
  309. package/dist/core/mutation-lock.d.ts.map +1 -0
  310. package/dist/core/mutation-lock.js +69 -0
  311. package/dist/core/mutation-lock.js.map +1 -0
  312. package/dist/core/paths.d.ts +49 -0
  313. package/dist/core/paths.d.ts.map +1 -0
  314. package/dist/core/paths.js +110 -0
  315. package/dist/core/paths.js.map +1 -0
  316. package/dist/core/plugin-loader.d.ts +40 -0
  317. package/dist/core/plugin-loader.d.ts.map +1 -0
  318. package/dist/core/plugin-loader.js +184 -0
  319. package/dist/core/plugin-loader.js.map +1 -0
  320. package/dist/core/plugin-service.d.ts +32 -0
  321. package/dist/core/plugin-service.d.ts.map +1 -0
  322. package/dist/core/plugin-service.js +110 -0
  323. package/dist/core/plugin-service.js.map +1 -0
  324. package/dist/core/plugin-store.d.ts +18 -0
  325. package/dist/core/plugin-store.d.ts.map +1 -0
  326. package/dist/core/plugin-store.js +50 -0
  327. package/dist/core/plugin-store.js.map +1 -0
  328. package/dist/core/pool-store.d.ts +44 -0
  329. package/dist/core/pool-store.d.ts.map +1 -0
  330. package/dist/core/pool-store.js +198 -0
  331. package/dist/core/pool-store.js.map +1 -0
  332. package/dist/core/preset-store.d.ts +29 -0
  333. package/dist/core/preset-store.d.ts.map +1 -0
  334. package/dist/core/preset-store.js +105 -0
  335. package/dist/core/preset-store.js.map +1 -0
  336. package/dist/core/profile-service.d.ts +50 -0
  337. package/dist/core/profile-service.d.ts.map +1 -0
  338. package/dist/core/profile-service.js +149 -0
  339. package/dist/core/profile-service.js.map +1 -0
  340. package/dist/core/profile-store.d.ts +20 -0
  341. package/dist/core/profile-store.d.ts.map +1 -0
  342. package/dist/core/profile-store.js +92 -0
  343. package/dist/core/profile-store.js.map +1 -0
  344. package/dist/core/profile-synth.d.ts +24 -0
  345. package/dist/core/profile-synth.d.ts.map +1 -0
  346. package/dist/core/profile-synth.js +30 -0
  347. package/dist/core/profile-synth.js.map +1 -0
  348. package/dist/core/project-root.d.ts +7 -0
  349. package/dist/core/project-root.d.ts.map +1 -0
  350. package/dist/core/project-root.js +23 -0
  351. package/dist/core/project-root.js.map +1 -0
  352. package/dist/core/proxy-hub-cli.d.ts +3 -0
  353. package/dist/core/proxy-hub-cli.d.ts.map +1 -0
  354. package/dist/core/proxy-hub-cli.js +80 -0
  355. package/dist/core/proxy-hub-cli.js.map +1 -0
  356. package/dist/core/proxy-hub-routes.d.ts +22 -0
  357. package/dist/core/proxy-hub-routes.d.ts.map +1 -0
  358. package/dist/core/proxy-hub-routes.js +92 -0
  359. package/dist/core/proxy-hub-routes.js.map +1 -0
  360. package/dist/core/proxy-hub-server.d.ts +59 -0
  361. package/dist/core/proxy-hub-server.d.ts.map +1 -0
  362. package/dist/core/proxy-hub-server.js +409 -0
  363. package/dist/core/proxy-hub-server.js.map +1 -0
  364. package/dist/core/proxy-hub-service.d.ts +97 -0
  365. package/dist/core/proxy-hub-service.d.ts.map +1 -0
  366. package/dist/core/proxy-hub-service.js +553 -0
  367. package/dist/core/proxy-hub-service.js.map +1 -0
  368. package/dist/core/proxy-hub-store.d.ts +28 -0
  369. package/dist/core/proxy-hub-store.d.ts.map +1 -0
  370. package/dist/core/proxy-hub-store.js +152 -0
  371. package/dist/core/proxy-hub-store.js.map +1 -0
  372. package/dist/core/proxy-lifecycle.d.ts +26 -0
  373. package/dist/core/proxy-lifecycle.d.ts.map +1 -0
  374. package/dist/core/proxy-lifecycle.js +33 -0
  375. package/dist/core/proxy-lifecycle.js.map +1 -0
  376. package/dist/core/proxy-ports.d.ts +50 -0
  377. package/dist/core/proxy-ports.d.ts.map +1 -0
  378. package/dist/core/proxy-ports.js +86 -0
  379. package/dist/core/proxy-ports.js.map +1 -0
  380. package/dist/core/proxy-service.d.ts +184 -0
  381. package/dist/core/proxy-service.d.ts.map +1 -0
  382. package/dist/core/proxy-service.js +860 -0
  383. package/dist/core/proxy-service.js.map +1 -0
  384. package/dist/core/quota-guard-policy.d.ts +8 -0
  385. package/dist/core/quota-guard-policy.d.ts.map +1 -0
  386. package/dist/core/quota-guard-policy.js +21 -0
  387. package/dist/core/quota-guard-policy.js.map +1 -0
  388. package/dist/core/realign-proxy-clients.d.ts +19 -0
  389. package/dist/core/realign-proxy-clients.d.ts.map +1 -0
  390. package/dist/core/realign-proxy-clients.js +40 -0
  391. package/dist/core/realign-proxy-clients.js.map +1 -0
  392. package/dist/core/refs.d.ts +84 -0
  393. package/dist/core/refs.d.ts.map +1 -0
  394. package/dist/core/refs.js +250 -0
  395. package/dist/core/refs.js.map +1 -0
  396. package/dist/core/registry.d.ts +46 -0
  397. package/dist/core/registry.d.ts.map +1 -0
  398. package/dist/core/registry.js +70 -0
  399. package/dist/core/registry.js.map +1 -0
  400. package/dist/core/resolve-source.d.ts +54 -0
  401. package/dist/core/resolve-source.d.ts.map +1 -0
  402. package/dist/core/resolve-source.js +148 -0
  403. package/dist/core/resolve-source.js.map +1 -0
  404. package/dist/core/runtime-service.d.ts +158 -0
  405. package/dist/core/runtime-service.d.ts.map +1 -0
  406. package/dist/core/runtime-service.js +422 -0
  407. package/dist/core/runtime-service.js.map +1 -0
  408. package/dist/core/service.d.ts +200 -0
  409. package/dist/core/service.d.ts.map +1 -0
  410. package/dist/core/service.js +643 -0
  411. package/dist/core/service.js.map +1 -0
  412. package/dist/core/store-snapshot.d.ts +10 -0
  413. package/dist/core/store-snapshot.d.ts.map +1 -0
  414. package/dist/core/store-snapshot.js +79 -0
  415. package/dist/core/store-snapshot.js.map +1 -0
  416. package/dist/core/store.d.ts +68 -0
  417. package/dist/core/store.d.ts.map +1 -0
  418. package/dist/core/store.js +159 -0
  419. package/dist/core/store.js.map +1 -0
  420. package/dist/core/tray-runtime.d.ts +15 -0
  421. package/dist/core/tray-runtime.d.ts.map +1 -0
  422. package/dist/core/tray-runtime.js +33 -0
  423. package/dist/core/tray-runtime.js.map +1 -0
  424. package/dist/core/tray-settings-service.d.ts +7 -0
  425. package/dist/core/tray-settings-service.d.ts.map +1 -0
  426. package/dist/core/tray-settings-service.js +24 -0
  427. package/dist/core/tray-settings-service.js.map +1 -0
  428. package/dist/core/update.d.ts +26 -0
  429. package/dist/core/update.d.ts.map +1 -0
  430. package/dist/core/update.js +128 -0
  431. package/dist/core/update.js.map +1 -0
  432. package/dist/index.d.ts +12 -0
  433. package/dist/index.d.ts.map +1 -0
  434. package/dist/index.js +7 -0
  435. package/dist/network/egress/allowlist.d.ts +2 -0
  436. package/dist/network/egress/allowlist.d.ts.map +1 -0
  437. package/dist/network/egress/allowlist.js +14 -0
  438. package/dist/network/egress/allowlist.js.map +1 -0
  439. package/dist/network/egress/direct.d.ts +17 -0
  440. package/dist/network/egress/direct.d.ts.map +1 -0
  441. package/dist/network/egress/direct.js +28 -0
  442. package/dist/network/egress/direct.js.map +1 -0
  443. package/dist/network/egress/errors.d.ts +4 -0
  444. package/dist/network/egress/errors.d.ts.map +1 -0
  445. package/dist/network/egress/errors.js +8 -0
  446. package/dist/network/egress/errors.js.map +1 -0
  447. package/dist/network/egress/index.d.ts +6 -0
  448. package/dist/network/egress/index.d.ts.map +1 -0
  449. package/dist/network/egress/index.js +11 -0
  450. package/dist/network/egress/index.js.map +1 -0
  451. package/dist/network/egress/types.d.ts +16 -0
  452. package/dist/network/egress/types.d.ts.map +1 -0
  453. package/dist/presentation/client-name.d.ts +14 -0
  454. package/dist/presentation/client-name.d.ts.map +1 -0
  455. package/dist/presentation/client-name.js +22 -0
  456. package/dist/presentation/client-name.js.map +1 -0
  457. package/dist/presentation/layout.d.ts +7 -0
  458. package/dist/presentation/layout.d.ts.map +1 -0
  459. package/dist/presentation/layout.js +10 -0
  460. package/dist/presentation/layout.js.map +1 -0
  461. package/dist/providers/auth-fingerprint.d.ts +56 -0
  462. package/dist/providers/auth-fingerprint.d.ts.map +1 -0
  463. package/dist/providers/auth-fingerprint.js +163 -0
  464. package/dist/providers/auth-fingerprint.js.map +1 -0
  465. package/dist/providers/claude.d.ts +43 -0
  466. package/dist/providers/claude.d.ts.map +1 -0
  467. package/dist/providers/claude.js +191 -0
  468. package/dist/providers/claude.js.map +1 -0
  469. package/dist/providers/codex-identity.d.ts +13 -0
  470. package/dist/providers/codex-identity.d.ts.map +1 -0
  471. package/dist/providers/codex-identity.js +69 -0
  472. package/dist/providers/codex-identity.js.map +1 -0
  473. package/dist/providers/codex-refresh.d.ts +30 -0
  474. package/dist/providers/codex-refresh.d.ts.map +1 -0
  475. package/dist/providers/codex-refresh.js +64 -0
  476. package/dist/providers/codex-refresh.js.map +1 -0
  477. package/dist/providers/codex-usage.d.ts +3 -0
  478. package/dist/providers/codex-usage.d.ts.map +1 -0
  479. package/dist/providers/codex-usage.js +42 -0
  480. package/dist/providers/codex-usage.js.map +1 -0
  481. package/dist/providers/codex.d.ts +61 -0
  482. package/dist/providers/codex.d.ts.map +1 -0
  483. package/dist/providers/codex.js +212 -0
  484. package/dist/providers/codex.js.map +1 -0
  485. package/dist/providers/gemini-antigravity-oauth.d.ts +83 -0
  486. package/dist/providers/gemini-antigravity-oauth.d.ts.map +1 -0
  487. package/dist/providers/gemini-antigravity-oauth.js +343 -0
  488. package/dist/providers/gemini-antigravity-oauth.js.map +1 -0
  489. package/dist/providers/gemini-antigravity-state.d.ts +35 -0
  490. package/dist/providers/gemini-antigravity-state.d.ts.map +1 -0
  491. package/dist/providers/gemini-antigravity-state.js +433 -0
  492. package/dist/providers/gemini-antigravity-state.js.map +1 -0
  493. package/dist/providers/gemini-env.d.ts +8 -0
  494. package/dist/providers/gemini-env.d.ts.map +1 -0
  495. package/dist/providers/gemini-env.js +78 -0
  496. package/dist/providers/gemini-env.js.map +1 -0
  497. package/dist/providers/gemini-identity.d.ts +2 -0
  498. package/dist/providers/gemini-identity.d.ts.map +1 -0
  499. package/dist/providers/gemini-identity.js +14 -0
  500. package/dist/providers/gemini-identity.js.map +1 -0
  501. package/dist/providers/gemini-proxy/main.d.ts +3 -0
  502. package/dist/providers/gemini-proxy/main.d.ts.map +1 -0
  503. package/dist/providers/gemini-proxy/main.js +176 -0
  504. package/dist/providers/gemini-proxy/main.js.map +1 -0
  505. package/dist/providers/gemini-proxy/server.d.ts +57 -0
  506. package/dist/providers/gemini-proxy/server.d.ts.map +1 -0
  507. package/dist/providers/gemini-proxy/server.js +1240 -0
  508. package/dist/providers/gemini-proxy/server.js.map +1 -0
  509. package/dist/providers/gemini-proxy-entry.d.ts +2 -0
  510. package/dist/providers/gemini-proxy-entry.d.ts.map +1 -0
  511. package/dist/providers/gemini-proxy-entry.js +16 -0
  512. package/dist/providers/gemini-proxy-entry.js.map +1 -0
  513. package/dist/providers/gemini-proxy-lifecycle.d.ts +11 -0
  514. package/dist/providers/gemini-proxy-lifecycle.d.ts.map +1 -0
  515. package/dist/providers/gemini-proxy-lifecycle.js +131 -0
  516. package/dist/providers/gemini-proxy-lifecycle.js.map +1 -0
  517. package/dist/providers/gemini.d.ts +137 -0
  518. package/dist/providers/gemini.d.ts.map +1 -0
  519. package/dist/providers/gemini.js +471 -0
  520. package/dist/providers/gemini.js.map +1 -0
  521. package/dist/providers/grok-proxy/auth.d.ts +27 -0
  522. package/dist/providers/grok-proxy/auth.d.ts.map +1 -0
  523. package/dist/providers/grok-proxy/auth.js +123 -0
  524. package/dist/providers/grok-proxy/auth.js.map +1 -0
  525. package/dist/providers/grok-proxy/main.d.ts +3 -0
  526. package/dist/providers/grok-proxy/main.d.ts.map +1 -0
  527. package/dist/providers/grok-proxy/main.js +111 -0
  528. package/dist/providers/grok-proxy/main.js.map +1 -0
  529. package/dist/providers/grok-proxy/server.d.ts +46 -0
  530. package/dist/providers/grok-proxy/server.d.ts.map +1 -0
  531. package/dist/providers/grok-proxy/server.js +595 -0
  532. package/dist/providers/grok-proxy/server.js.map +1 -0
  533. package/dist/providers/grok.d.ts +38 -0
  534. package/dist/providers/grok.d.ts.map +1 -0
  535. package/dist/providers/grok.js +250 -0
  536. package/dist/providers/grok.js.map +1 -0
  537. package/dist/providers/index.d.ts +14 -0
  538. package/dist/providers/index.d.ts.map +1 -0
  539. package/dist/providers/index.js +23 -0
  540. package/dist/providers/index.js.map +1 -0
  541. package/dist/providers/kiro-secret-store.d.ts +39 -0
  542. package/dist/providers/kiro-secret-store.d.ts.map +1 -0
  543. package/dist/providers/kiro-secret-store.js +168 -0
  544. package/dist/providers/kiro-secret-store.js.map +1 -0
  545. package/dist/providers/kiro.d.ts +50 -0
  546. package/dist/providers/kiro.d.ts.map +1 -0
  547. package/dist/providers/kiro.js +373 -0
  548. package/dist/providers/kiro.js.map +1 -0
  549. package/dist/providers/model-policy.d.ts +15 -0
  550. package/dist/providers/model-policy.d.ts.map +1 -0
  551. package/dist/providers/model-policy.js +26 -0
  552. package/dist/providers/model-policy.js.map +1 -0
  553. package/dist/providers/opencode-auth.d.ts +67 -0
  554. package/dist/providers/opencode-auth.d.ts.map +1 -0
  555. package/dist/providers/opencode-auth.js +146 -0
  556. package/dist/providers/opencode-auth.js.map +1 -0
  557. package/dist/providers/opencode-cli-entry.d.ts +36 -0
  558. package/dist/providers/opencode-cli-entry.d.ts.map +1 -0
  559. package/dist/providers/opencode-cli-entry.js +90 -0
  560. package/dist/providers/opencode-cli-entry.js.map +1 -0
  561. package/dist/providers/opencode-proxy/abort.d.ts +8 -0
  562. package/dist/providers/opencode-proxy/abort.d.ts.map +1 -0
  563. package/dist/providers/opencode-proxy/abort.js +42 -0
  564. package/dist/providers/opencode-proxy/abort.js.map +1 -0
  565. package/dist/providers/opencode-proxy/anthropic-handler.d.ts +4 -0
  566. package/dist/providers/opencode-proxy/anthropic-handler.d.ts.map +1 -0
  567. package/dist/providers/opencode-proxy/anthropic-handler.js +108 -0
  568. package/dist/providers/opencode-proxy/anthropic-handler.js.map +1 -0
  569. package/dist/providers/opencode-proxy/auth.d.ts +38 -0
  570. package/dist/providers/opencode-proxy/auth.d.ts.map +1 -0
  571. package/dist/providers/opencode-proxy/auth.js +128 -0
  572. package/dist/providers/opencode-proxy/auth.js.map +1 -0
  573. package/dist/providers/opencode-proxy/body.d.ts +9 -0
  574. package/dist/providers/opencode-proxy/body.d.ts.map +1 -0
  575. package/dist/providers/opencode-proxy/body.js +69 -0
  576. package/dist/providers/opencode-proxy/body.js.map +1 -0
  577. package/dist/providers/opencode-proxy/catalog-handlers.d.ts +7 -0
  578. package/dist/providers/opencode-proxy/catalog-handlers.d.ts.map +1 -0
  579. package/dist/providers/opencode-proxy/catalog-handlers.js +132 -0
  580. package/dist/providers/opencode-proxy/catalog-handlers.js.map +1 -0
  581. package/dist/providers/opencode-proxy/catalog.d.ts +41 -0
  582. package/dist/providers/opencode-proxy/catalog.d.ts.map +1 -0
  583. package/dist/providers/opencode-proxy/catalog.js +146 -0
  584. package/dist/providers/opencode-proxy/catalog.js.map +1 -0
  585. package/dist/providers/opencode-proxy/cli.d.ts +2 -0
  586. package/dist/providers/opencode-proxy/cli.d.ts.map +1 -0
  587. package/dist/providers/opencode-proxy/cli.js +162 -0
  588. package/dist/providers/opencode-proxy/cli.js.map +1 -0
  589. package/dist/providers/opencode-proxy/constants.d.ts +13 -0
  590. package/dist/providers/opencode-proxy/constants.d.ts.map +1 -0
  591. package/dist/providers/opencode-proxy/constants.js +15 -0
  592. package/dist/providers/opencode-proxy/constants.js.map +1 -0
  593. package/dist/providers/opencode-proxy/context-budget.d.ts +31 -0
  594. package/dist/providers/opencode-proxy/context-budget.d.ts.map +1 -0
  595. package/dist/providers/opencode-proxy/context-budget.js +165 -0
  596. package/dist/providers/opencode-proxy/context-budget.js.map +1 -0
  597. package/dist/providers/opencode-proxy/errors.d.ts +5 -0
  598. package/dist/providers/opencode-proxy/errors.d.ts.map +1 -0
  599. package/dist/providers/opencode-proxy/errors.js +45 -0
  600. package/dist/providers/opencode-proxy/errors.js.map +1 -0
  601. package/dist/providers/opencode-proxy/forwarders.d.ts +7 -0
  602. package/dist/providers/opencode-proxy/forwarders.d.ts.map +1 -0
  603. package/dist/providers/opencode-proxy/forwarders.js +214 -0
  604. package/dist/providers/opencode-proxy/forwarders.js.map +1 -0
  605. package/dist/providers/opencode-proxy/http.d.ts +11 -0
  606. package/dist/providers/opencode-proxy/http.d.ts.map +1 -0
  607. package/dist/providers/opencode-proxy/http.js +97 -0
  608. package/dist/providers/opencode-proxy/http.js.map +1 -0
  609. package/dist/providers/opencode-proxy/models.d.ts +42 -0
  610. package/dist/providers/opencode-proxy/models.d.ts.map +1 -0
  611. package/dist/providers/opencode-proxy/models.js +148 -0
  612. package/dist/providers/opencode-proxy/models.js.map +1 -0
  613. package/dist/providers/opencode-proxy/openai-handler.d.ts +5 -0
  614. package/dist/providers/opencode-proxy/openai-handler.d.ts.map +1 -0
  615. package/dist/providers/opencode-proxy/openai-handler.js +115 -0
  616. package/dist/providers/opencode-proxy/openai-handler.js.map +1 -0
  617. package/dist/providers/opencode-proxy/router.d.ts +4 -0
  618. package/dist/providers/opencode-proxy/router.d.ts.map +1 -0
  619. package/dist/providers/opencode-proxy/router.js +65 -0
  620. package/dist/providers/opencode-proxy/router.js.map +1 -0
  621. package/dist/providers/opencode-proxy/runtime.d.ts +23 -0
  622. package/dist/providers/opencode-proxy/runtime.d.ts.map +1 -0
  623. package/dist/providers/opencode-proxy/runtime.js +158 -0
  624. package/dist/providers/opencode-proxy/runtime.js.map +1 -0
  625. package/dist/providers/opencode-proxy/server.d.ts +13 -0
  626. package/dist/providers/opencode-proxy/server.d.ts.map +1 -0
  627. package/dist/providers/opencode-proxy/server.js +52 -0
  628. package/dist/providers/opencode-proxy/server.js.map +1 -0
  629. package/dist/providers/opencode-proxy/stream.d.ts +4 -0
  630. package/dist/providers/opencode-proxy/stream.d.ts.map +1 -0
  631. package/dist/providers/opencode-proxy/stream.js +71 -0
  632. package/dist/providers/opencode-proxy/stream.js.map +1 -0
  633. package/dist/providers/opencode-proxy/translate-stream.d.ts +3 -0
  634. package/dist/providers/opencode-proxy/translate-stream.d.ts.map +1 -0
  635. package/dist/providers/opencode-proxy/translate-stream.js +205 -0
  636. package/dist/providers/opencode-proxy/translate-stream.js.map +1 -0
  637. package/dist/providers/opencode-proxy/translate.d.ts +11 -0
  638. package/dist/providers/opencode-proxy/translate.d.ts.map +1 -0
  639. package/dist/providers/opencode-proxy/translate.js +250 -0
  640. package/dist/providers/opencode-proxy/translate.js.map +1 -0
  641. package/dist/providers/opencode-proxy/types.d.ts +110 -0
  642. package/dist/providers/opencode-proxy/types.d.ts.map +1 -0
  643. package/dist/providers/opencode-proxy/types.js +38 -0
  644. package/dist/providers/opencode-proxy/types.js.map +1 -0
  645. package/dist/providers/opencode-proxy-lifecycle.d.ts +11 -0
  646. package/dist/providers/opencode-proxy-lifecycle.d.ts.map +1 -0
  647. package/dist/providers/opencode-proxy-lifecycle.js +144 -0
  648. package/dist/providers/opencode-proxy-lifecycle.js.map +1 -0
  649. package/dist/providers/opencode.d.ts +40 -0
  650. package/dist/providers/opencode.d.ts.map +1 -0
  651. package/dist/providers/opencode.js +190 -0
  652. package/dist/providers/opencode.js.map +1 -0
  653. package/dist/providers/protocol/anthropic-convert.d.ts +12 -0
  654. package/dist/providers/protocol/anthropic-convert.d.ts.map +1 -0
  655. package/dist/providers/protocol/anthropic-convert.js +113 -0
  656. package/dist/providers/protocol/anthropic-convert.js.map +1 -0
  657. package/dist/providers/protocol/anthropic-helpers.d.ts +13 -0
  658. package/dist/providers/protocol/anthropic-helpers.d.ts.map +1 -0
  659. package/dist/providers/protocol/anthropic-helpers.js +179 -0
  660. package/dist/providers/protocol/anthropic-helpers.js.map +1 -0
  661. package/dist/providers/protocol/anthropic-stream-reader.d.ts +13 -0
  662. package/dist/providers/protocol/anthropic-stream-reader.d.ts.map +1 -0
  663. package/dist/providers/protocol/anthropic-stream-reader.js +46 -0
  664. package/dist/providers/protocol/anthropic-stream-reader.js.map +1 -0
  665. package/dist/providers/protocol/anthropic-stream.d.ts +7 -0
  666. package/dist/providers/protocol/anthropic-stream.d.ts.map +1 -0
  667. package/dist/providers/protocol/anthropic-stream.js +318 -0
  668. package/dist/providers/protocol/anthropic-stream.js.map +1 -0
  669. package/dist/providers/protocol/anthropic-types.d.ts +240 -0
  670. package/dist/providers/protocol/anthropic-types.d.ts.map +1 -0
  671. package/dist/providers/protocol/anthropic.d.ts +20 -0
  672. package/dist/providers/protocol/anthropic.d.ts.map +1 -0
  673. package/dist/providers/protocol/gemini/translate-anthropic.d.ts +15 -0
  674. package/dist/providers/protocol/gemini/translate-anthropic.d.ts.map +1 -0
  675. package/dist/providers/protocol/gemini/translate-anthropic.js +84 -0
  676. package/dist/providers/protocol/gemini/translate-anthropic.js.map +1 -0
  677. package/dist/providers/protocol/gemini/translate-chat.d.ts +5 -0
  678. package/dist/providers/protocol/gemini/translate-chat.d.ts.map +1 -0
  679. package/dist/providers/protocol/gemini/translate-chat.js +142 -0
  680. package/dist/providers/protocol/gemini/translate-chat.js.map +1 -0
  681. package/dist/providers/protocol/gemini/translate-models.d.ts +40 -0
  682. package/dist/providers/protocol/gemini/translate-models.d.ts.map +1 -0
  683. package/dist/providers/protocol/gemini/translate-models.js +186 -0
  684. package/dist/providers/protocol/gemini/translate-models.js.map +1 -0
  685. package/dist/providers/protocol/gemini/translate-responses.d.ts +6 -0
  686. package/dist/providers/protocol/gemini/translate-responses.d.ts.map +1 -0
  687. package/dist/providers/protocol/gemini/translate-responses.js +187 -0
  688. package/dist/providers/protocol/gemini/translate-responses.js.map +1 -0
  689. package/dist/providers/protocol/gemini/translate-schema.d.ts +9 -0
  690. package/dist/providers/protocol/gemini/translate-schema.d.ts.map +1 -0
  691. package/dist/providers/protocol/gemini/translate-schema.js +48 -0
  692. package/dist/providers/protocol/gemini/translate-schema.js.map +1 -0
  693. package/dist/providers/protocol/gemini/translate-shared.d.ts +8 -0
  694. package/dist/providers/protocol/gemini/translate-shared.d.ts.map +1 -0
  695. package/dist/providers/protocol/gemini/translate-shared.js +47 -0
  696. package/dist/providers/protocol/gemini/translate-shared.js.map +1 -0
  697. package/dist/providers/protocol/gemini/translate-thinking.d.ts +7 -0
  698. package/dist/providers/protocol/gemini/translate-thinking.d.ts.map +1 -0
  699. package/dist/providers/protocol/gemini/translate-thinking.js +65 -0
  700. package/dist/providers/protocol/gemini/translate-thinking.js.map +1 -0
  701. package/dist/providers/protocol/gemini/translate-types.d.ts +133 -0
  702. package/dist/providers/protocol/gemini/translate-types.d.ts.map +1 -0
  703. package/dist/providers/protocol/gemini/translate.d.ts +7 -0
  704. package/dist/providers/protocol/gemini/translate.d.ts.map +1 -0
  705. package/dist/providers/protocol/json-schema.d.ts +52 -0
  706. package/dist/providers/protocol/json-schema.d.ts.map +1 -0
  707. package/dist/providers/protocol/json-schema.js +189 -0
  708. package/dist/providers/protocol/json-schema.js.map +1 -0
  709. package/dist/providers/protocol/token-estimate.d.ts +15 -0
  710. package/dist/providers/protocol/token-estimate.d.ts.map +1 -0
  711. package/dist/providers/protocol/token-estimate.js +34 -0
  712. package/dist/providers/protocol/token-estimate.js.map +1 -0
  713. package/dist/providers/proxy-hub-backend.d.ts +4 -0
  714. package/dist/providers/proxy-hub-backend.d.ts.map +1 -0
  715. package/dist/providers/proxy-hub-backend.js +11 -0
  716. package/dist/providers/proxy-hub-backend.js.map +1 -0
  717. package/dist/providers/proxy-process.d.ts +35 -0
  718. package/dist/providers/proxy-process.d.ts.map +1 -0
  719. package/dist/providers/proxy-process.js +119 -0
  720. package/dist/providers/proxy-process.js.map +1 -0
  721. package/dist/providers/proxy-shared.d.ts +43 -0
  722. package/dist/providers/proxy-shared.d.ts.map +1 -0
  723. package/dist/providers/proxy-shared.js +128 -0
  724. package/dist/providers/proxy-shared.js.map +1 -0
  725. package/dist/providers/quota-guard.d.ts +49 -0
  726. package/dist/providers/quota-guard.d.ts.map +1 -0
  727. package/dist/providers/quota-guard.js +107 -0
  728. package/dist/providers/quota-guard.js.map +1 -0
  729. package/dist/providers/reasoning.d.ts +27 -0
  730. package/dist/providers/reasoning.d.ts.map +1 -0
  731. package/dist/providers/reasoning.js +61 -0
  732. package/dist/providers/reasoning.js.map +1 -0
  733. package/dist/providers/upstream-policy.d.ts +33 -0
  734. package/dist/providers/upstream-policy.d.ts.map +1 -0
  735. package/dist/providers/upstream-policy.js +97 -0
  736. package/dist/providers/upstream-policy.js.map +1 -0
  737. package/dist/public-types.d.ts +3 -0
  738. package/dist/public-types.d.ts.map +1 -0
  739. package/dist/public.d.ts +19 -0
  740. package/dist/public.d.ts.map +1 -0
  741. package/dist/public.js +16 -0
  742. package/dist/public.js.map +1 -0
  743. package/dist/sources/account-adapters.d.ts +64 -0
  744. package/dist/sources/account-adapters.d.ts.map +1 -0
  745. package/dist/sources/account-adapters.js +205 -0
  746. package/dist/sources/account-adapters.js.map +1 -0
  747. package/dist/sources/gateway-adapters.d.ts +26 -0
  748. package/dist/sources/gateway-adapters.d.ts.map +1 -0
  749. package/dist/sources/gateway-adapters.js +43 -0
  750. package/dist/sources/gateway-adapters.js.map +1 -0
  751. package/dist/sources/kiro-proxy-bin.d.ts +41 -0
  752. package/dist/sources/kiro-proxy-bin.d.ts.map +1 -0
  753. package/dist/sources/kiro-proxy-bin.js +140 -0
  754. package/dist/sources/kiro-proxy-bin.js.map +1 -0
  755. package/dist/sources/proxy-hub-adapters.d.ts +7 -0
  756. package/dist/sources/proxy-hub-adapters.d.ts.map +1 -0
  757. package/dist/sources/proxy-hub-adapters.js +26 -0
  758. package/dist/sources/proxy-hub-adapters.js.map +1 -0
  759. package/dist/testing.d.ts +9 -0
  760. package/dist/testing.d.ts.map +1 -0
  761. package/dist/testing.js +6 -0
  762. package/dist/tray/AnyPickTray.swift +3 -0
  763. package/dist/tray/activity.d.ts +18 -0
  764. package/dist/tray/activity.d.ts.map +1 -0
  765. package/dist/tray/activity.js +51 -0
  766. package/dist/tray/activity.js.map +1 -0
  767. package/dist/tray/app-icons/icon-1024.png +0 -0
  768. package/dist/tray/app-icons/icon-128.png +0 -0
  769. package/dist/tray/app-icons/icon-16.png +0 -0
  770. package/dist/tray/app-icons/icon-256.png +0 -0
  771. package/dist/tray/app-icons/icon-32.png +0 -0
  772. package/dist/tray/app-icons/icon-512.png +0 -0
  773. package/dist/tray/app-icons/icon-64.png +0 -0
  774. package/dist/tray/icons/claude.svg +1 -0
  775. package/dist/tray/icons/googlegemini.svg +1 -0
  776. package/dist/tray/icons/grok.svg +1 -0
  777. package/dist/tray/icons/kiro.svg +1 -0
  778. package/dist/tray/icons/openai.svg +1 -0
  779. package/dist/tray/icons/opencode.svg +1 -0
  780. package/dist/tray/icons/openrouter.svg +1 -0
  781. package/dist/tray/model-role-actions.d.ts +15 -0
  782. package/dist/tray/model-role-actions.d.ts.map +1 -0
  783. package/dist/tray/model-role-actions.js +41 -0
  784. package/dist/tray/model-role-actions.js.map +1 -0
  785. package/dist/tray/native/AccountsPanel.swift +434 -0
  786. package/dist/tray/native/AppEntry.swift +229 -0
  787. package/dist/tray/native/MainWindow.swift +300 -0
  788. package/dist/tray/native/ManageFormChrome.swift +332 -0
  789. package/dist/tray/native/ManageForms.swift +472 -0
  790. package/dist/tray/native/ManagePanel.swift +356 -0
  791. package/dist/tray/native/Models.swift +259 -0
  792. package/dist/tray/native/ModelsEditor.swift +390 -0
  793. package/dist/tray/native/ModelsOverview.swift +76 -0
  794. package/dist/tray/native/ModelsPickers.swift +273 -0
  795. package/dist/tray/native/ModelsRoutePickers.swift +718 -0
  796. package/dist/tray/native/MonitorPanel.swift +375 -0
  797. package/dist/tray/native/ProxyPanel.swift +326 -0
  798. package/dist/tray/native/QuickActivityRow.swift +40 -0
  799. package/dist/tray/native/QuickNav.swift +62 -0
  800. package/dist/tray/native/QuickPanel.swift +447 -0
  801. package/dist/tray/native/QuickRouteRow.swift +189 -0
  802. package/dist/tray/native/QuickServiceRows.swift +292 -0
  803. package/dist/tray/native/RoutingIssues.swift +293 -0
  804. package/dist/tray/native/SettingsPanel.swift +225 -0
  805. package/dist/tray/native/SharedUI.swift +681 -0
  806. package/dist/tray/native/Store.swift +540 -0
  807. package/dist/tray/native/Theme.swift +139 -0
  808. package/dist/tray/native/TrayChrome.swift +657 -0
  809. package/dist/tray/native/TrayControls.swift +475 -0
  810. package/dist/tray/native/TrayPreferences.swift +46 -0
  811. package/dist/tray/native/sources.txt +26 -0
  812. package/dist/tray/native-sources.d.ts +8 -0
  813. package/dist/tray/native-sources.d.ts.map +1 -0
  814. package/dist/tray/native-sources.js +19 -0
  815. package/dist/tray/native-sources.js.map +1 -0
  816. package/dist/tray/protocol.d.ts +79 -0
  817. package/dist/tray/protocol.d.ts.map +1 -0
  818. package/dist/tray/protocol.js +145 -0
  819. package/dist/tray/protocol.js.map +1 -0
  820. package/dist/tray/settings.d.ts +15 -0
  821. package/dist/tray/settings.d.ts.map +1 -0
  822. package/dist/tray/settings.js +72 -0
  823. package/dist/tray/settings.js.map +1 -0
  824. package/dist/tray/snapshot-client-routes.d.ts +11 -0
  825. package/dist/tray/snapshot-client-routes.d.ts.map +1 -0
  826. package/dist/tray/snapshot-client-routes.js +305 -0
  827. package/dist/tray/snapshot-client-routes.js.map +1 -0
  828. package/dist/tray/snapshot-helpers.d.ts +20 -0
  829. package/dist/tray/snapshot-helpers.d.ts.map +1 -0
  830. package/dist/tray/snapshot-helpers.js +74 -0
  831. package/dist/tray/snapshot-helpers.js.map +1 -0
  832. package/dist/tray/snapshot-hub.d.ts +7 -0
  833. package/dist/tray/snapshot-hub.d.ts.map +1 -0
  834. package/dist/tray/snapshot-hub.js +93 -0
  835. package/dist/tray/snapshot-hub.js.map +1 -0
  836. package/dist/tray/snapshot-resources.d.ts +19 -0
  837. package/dist/tray/snapshot-resources.d.ts.map +1 -0
  838. package/dist/tray/snapshot-resources.js +216 -0
  839. package/dist/tray/snapshot-resources.js.map +1 -0
  840. package/dist/tray/snapshot-types.d.ts +229 -0
  841. package/dist/tray/snapshot-types.d.ts.map +1 -0
  842. package/dist/tray/snapshot-usage.d.ts +9 -0
  843. package/dist/tray/snapshot-usage.d.ts.map +1 -0
  844. package/dist/tray/snapshot-usage.js +35 -0
  845. package/dist/tray/snapshot-usage.js.map +1 -0
  846. package/dist/tray/snapshot.d.ts +7 -0
  847. package/dist/tray/snapshot.d.ts.map +1 -0
  848. package/dist/tray/snapshot.js +48 -0
  849. package/dist/tray/snapshot.js.map +1 -0
  850. package/dist/tray/supervisor-actions.d.ts +19 -0
  851. package/dist/tray/supervisor-actions.d.ts.map +1 -0
  852. package/dist/tray/supervisor-actions.js +224 -0
  853. package/dist/tray/supervisor-actions.js.map +1 -0
  854. package/dist/tray/supervisor-activity.d.ts +5 -0
  855. package/dist/tray/supervisor-activity.d.ts.map +1 -0
  856. package/dist/tray/supervisor-activity.js +19 -0
  857. package/dist/tray/supervisor-activity.js.map +1 -0
  858. package/dist/tray/supervisor-errors.d.ts +9 -0
  859. package/dist/tray/supervisor-errors.d.ts.map +1 -0
  860. package/dist/tray/supervisor-errors.js +91 -0
  861. package/dist/tray/supervisor-errors.js.map +1 -0
  862. package/dist/tray/supervisor-logs.d.ts +6 -0
  863. package/dist/tray/supervisor-logs.d.ts.map +1 -0
  864. package/dist/tray/supervisor-logs.js +52 -0
  865. package/dist/tray/supervisor-logs.js.map +1 -0
  866. package/dist/tray/supervisor-mutations.d.ts +14 -0
  867. package/dist/tray/supervisor-mutations.d.ts.map +1 -0
  868. package/dist/tray/supervisor-mutations.js +218 -0
  869. package/dist/tray/supervisor-mutations.js.map +1 -0
  870. package/dist/tray/supervisor-native.d.ts +22 -0
  871. package/dist/tray/supervisor-native.d.ts.map +1 -0
  872. package/dist/tray/supervisor-native.js +227 -0
  873. package/dist/tray/supervisor-native.js.map +1 -0
  874. package/dist/tray/supervisor-proxies.d.ts +6 -0
  875. package/dist/tray/supervisor-proxies.d.ts.map +1 -0
  876. package/dist/tray/supervisor-proxies.js +37 -0
  877. package/dist/tray/supervisor-proxies.js.map +1 -0
  878. package/dist/tray/supervisor-tauri.d.ts +13 -0
  879. package/dist/tray/supervisor-tauri.d.ts.map +1 -0
  880. package/dist/tray/supervisor-tauri.js +36 -0
  881. package/dist/tray/supervisor-tauri.js.map +1 -0
  882. package/dist/tray/supervisor.d.ts +17 -0
  883. package/dist/tray/supervisor.d.ts.map +1 -0
  884. package/dist/tray/supervisor.js +372 -0
  885. package/dist/tray/supervisor.js.map +1 -0
  886. package/dist/tray/terminal-launcher.d.ts +12 -0
  887. package/dist/tray/terminal-launcher.d.ts.map +1 -0
  888. package/dist/tray/terminal-launcher.js +130 -0
  889. package/dist/tray/terminal-launcher.js.map +1 -0
  890. package/dist/tui/actions/ensure-proxy-up.d.ts +15 -0
  891. package/dist/tui/actions/ensure-proxy-up.d.ts.map +1 -0
  892. package/dist/tui/actions/ensure-proxy-up.js +41 -0
  893. package/dist/tui/actions/ensure-proxy-up.js.map +1 -0
  894. package/dist/tui/actions/use-account-actions.d.ts +35 -0
  895. package/dist/tui/actions/use-account-actions.d.ts.map +1 -0
  896. package/dist/tui/actions/use-account-actions.js +527 -0
  897. package/dist/tui/actions/use-account-actions.js.map +1 -0
  898. package/dist/tui/actions/use-app-bindings.d.ts +83 -0
  899. package/dist/tui/actions/use-app-bindings.d.ts.map +1 -0
  900. package/dist/tui/actions/use-app-bindings.js +472 -0
  901. package/dist/tui/actions/use-app-bindings.js.map +1 -0
  902. package/dist/tui/actions/use-gateway-actions.d.ts +45 -0
  903. package/dist/tui/actions/use-gateway-actions.d.ts.map +1 -0
  904. package/dist/tui/actions/use-gateway-actions.js +370 -0
  905. package/dist/tui/actions/use-gateway-actions.js.map +1 -0
  906. package/dist/tui/actions/use-home-filter.d.ts +24 -0
  907. package/dist/tui/actions/use-home-filter.d.ts.map +1 -0
  908. package/dist/tui/actions/use-home-filter.js +48 -0
  909. package/dist/tui/actions/use-home-filter.js.map +1 -0
  910. package/dist/tui/actions/use-model-role-editor.d.ts +44 -0
  911. package/dist/tui/actions/use-model-role-editor.d.ts.map +1 -0
  912. package/dist/tui/actions/use-model-role-editor.js +68 -0
  913. package/dist/tui/actions/use-model-role-editor.js.map +1 -0
  914. package/dist/tui/actions/use-provider-filter.d.ts +10 -0
  915. package/dist/tui/actions/use-provider-filter.d.ts.map +1 -0
  916. package/dist/tui/actions/use-provider-filter.js +22 -0
  917. package/dist/tui/actions/use-provider-filter.js.map +1 -0
  918. package/dist/tui/actions/use-proxy-actions.d.ts +31 -0
  919. package/dist/tui/actions/use-proxy-actions.d.ts.map +1 -0
  920. package/dist/tui/actions/use-proxy-actions.js +474 -0
  921. package/dist/tui/actions/use-proxy-actions.js.map +1 -0
  922. package/dist/tui/actions/use-text-input-submit.d.ts +16 -0
  923. package/dist/tui/actions/use-text-input-submit.d.ts.map +1 -0
  924. package/dist/tui/actions/use-text-input-submit.js +96 -0
  925. package/dist/tui/actions/use-text-input-submit.js.map +1 -0
  926. package/dist/tui/actions/use-tray-runtime-actions.d.ts +18 -0
  927. package/dist/tui/actions/use-tray-runtime-actions.d.ts.map +1 -0
  928. package/dist/tui/actions/use-tray-runtime-actions.js +78 -0
  929. package/dist/tui/actions/use-tray-runtime-actions.js.map +1 -0
  930. package/dist/tui/app-ui-helpers.d.ts +14 -0
  931. package/dist/tui/app-ui-helpers.d.ts.map +1 -0
  932. package/dist/tui/app-ui-helpers.js +48 -0
  933. package/dist/tui/app-ui-helpers.js.map +1 -0
  934. package/dist/tui/app-ui.d.ts +19 -0
  935. package/dist/tui/app-ui.d.ts.map +1 -0
  936. package/dist/tui/app-ui.js +98 -0
  937. package/dist/tui/app-ui.js.map +1 -0
  938. package/dist/tui/components/chrome/header.d.ts +39 -0
  939. package/dist/tui/components/chrome/header.d.ts.map +1 -0
  940. package/dist/tui/components/chrome/header.js +161 -0
  941. package/dist/tui/components/chrome/header.js.map +1 -0
  942. package/dist/tui/components/chrome/inputs.d.ts +34 -0
  943. package/dist/tui/components/chrome/inputs.d.ts.map +1 -0
  944. package/dist/tui/components/chrome/inputs.js +82 -0
  945. package/dist/tui/components/chrome/inputs.js.map +1 -0
  946. package/dist/tui/components/chrome/layout.d.ts +61 -0
  947. package/dist/tui/components/chrome/layout.d.ts.map +1 -0
  948. package/dist/tui/components/chrome/layout.js +119 -0
  949. package/dist/tui/components/chrome/layout.js.map +1 -0
  950. package/dist/tui/components/chrome/legacy.d.ts +84 -0
  951. package/dist/tui/components/chrome/legacy.d.ts.map +1 -0
  952. package/dist/tui/components/chrome/legacy.js +6 -0
  953. package/dist/tui/components/chrome/rows.d.ts +89 -0
  954. package/dist/tui/components/chrome/rows.d.ts.map +1 -0
  955. package/dist/tui/components/chrome/rows.js +151 -0
  956. package/dist/tui/components/chrome/rows.js.map +1 -0
  957. package/dist/tui/components/chrome/status.d.ts +50 -0
  958. package/dist/tui/components/chrome/status.d.ts.map +1 -0
  959. package/dist/tui/components/chrome/status.js +157 -0
  960. package/dist/tui/components/chrome/status.js.map +1 -0
  961. package/dist/tui/components/chrome.d.ts +7 -0
  962. package/dist/tui/components/chrome.d.ts.map +1 -0
  963. package/dist/tui/components/chrome.js +7 -0
  964. package/dist/tui/components.d.ts +26 -0
  965. package/dist/tui/components.d.ts.map +1 -0
  966. package/dist/tui/components.js +182 -0
  967. package/dist/tui/components.js.map +1 -0
  968. package/dist/tui/model/anypick.d.ts +106 -0
  969. package/dist/tui/model/anypick.d.ts.map +1 -0
  970. package/dist/tui/model/anypick.js +116 -0
  971. package/dist/tui/model/anypick.js.map +1 -0
  972. package/dist/tui/model/bindings.d.ts +39 -0
  973. package/dist/tui/model/bindings.d.ts.map +1 -0
  974. package/dist/tui/model/bindings.js +102 -0
  975. package/dist/tui/model/bindings.js.map +1 -0
  976. package/dist/tui/model/detail.d.ts +6 -0
  977. package/dist/tui/model/detail.d.ts.map +1 -0
  978. package/dist/tui/model/detail.js +85 -0
  979. package/dist/tui/model/detail.js.map +1 -0
  980. package/dist/tui/model/gateway.d.ts +46 -0
  981. package/dist/tui/model/gateway.d.ts.map +1 -0
  982. package/dist/tui/model/gateway.js +134 -0
  983. package/dist/tui/model/gateway.js.map +1 -0
  984. package/dist/tui/model/home-format.d.ts +52 -0
  985. package/dist/tui/model/home-format.d.ts.map +1 -0
  986. package/dist/tui/model/home-format.js +64 -0
  987. package/dist/tui/model/home-format.js.map +1 -0
  988. package/dist/tui/model/home-load.d.ts +8 -0
  989. package/dist/tui/model/home-load.d.ts.map +1 -0
  990. package/dist/tui/model/home-load.js +244 -0
  991. package/dist/tui/model/home-load.js.map +1 -0
  992. package/dist/tui/model/identity.d.ts +53 -0
  993. package/dist/tui/model/identity.d.ts.map +1 -0
  994. package/dist/tui/model/identity.js +176 -0
  995. package/dist/tui/model/identity.js.map +1 -0
  996. package/dist/tui/model/line-editor.d.ts +99 -0
  997. package/dist/tui/model/line-editor.d.ts.map +1 -0
  998. package/dist/tui/model/line-editor.js +186 -0
  999. package/dist/tui/model/line-editor.js.map +1 -0
  1000. package/dist/tui/model/names.d.ts +28 -0
  1001. package/dist/tui/model/names.d.ts.map +1 -0
  1002. package/dist/tui/model/names.js +42 -0
  1003. package/dist/tui/model/names.js.map +1 -0
  1004. package/dist/tui/model/pool.d.ts +11 -0
  1005. package/dist/tui/model/pool.d.ts.map +1 -0
  1006. package/dist/tui/model/pool.js +115 -0
  1007. package/dist/tui/model/pool.js.map +1 -0
  1008. package/dist/tui/model/provider-filter.d.ts +14 -0
  1009. package/dist/tui/model/provider-filter.d.ts.map +1 -0
  1010. package/dist/tui/model/provider-filter.js +46 -0
  1011. package/dist/tui/model/provider-filter.js.map +1 -0
  1012. package/dist/tui/model/proxy-hub.d.ts +23 -0
  1013. package/dist/tui/model/proxy-hub.d.ts.map +1 -0
  1014. package/dist/tui/model/proxy-hub.js +69 -0
  1015. package/dist/tui/model/proxy-hub.js.map +1 -0
  1016. package/dist/tui/model/proxy-labels.d.ts +5 -0
  1017. package/dist/tui/model/proxy-labels.d.ts.map +1 -0
  1018. package/dist/tui/model/proxy-labels.js +18 -0
  1019. package/dist/tui/model/proxy-labels.js.map +1 -0
  1020. package/dist/tui/model/proxy.d.ts +15 -0
  1021. package/dist/tui/model/proxy.d.ts.map +1 -0
  1022. package/dist/tui/model/proxy.js +214 -0
  1023. package/dist/tui/model/proxy.js.map +1 -0
  1024. package/dist/tui/model/root.d.ts +20 -0
  1025. package/dist/tui/model/root.d.ts.map +1 -0
  1026. package/dist/tui/model/root.js +126 -0
  1027. package/dist/tui/model/root.js.map +1 -0
  1028. package/dist/tui/model/route-builder.d.ts +25 -0
  1029. package/dist/tui/model/route-builder.d.ts.map +1 -0
  1030. package/dist/tui/model/route-builder.js +199 -0
  1031. package/dist/tui/model/route-builder.js.map +1 -0
  1032. package/dist/tui/model/screen.d.ts +260 -0
  1033. package/dist/tui/model/screen.d.ts.map +1 -0
  1034. package/dist/tui/model/types.d.ts +179 -0
  1035. package/dist/tui/model/types.d.ts.map +1 -0
  1036. package/dist/tui/model.d.ts +18 -0
  1037. package/dist/tui/model.d.ts.map +1 -0
  1038. package/dist/tui/model.js +17 -0
  1039. package/dist/tui/proxy-models-fetch.d.ts +34 -0
  1040. package/dist/tui/proxy-models-fetch.d.ts.map +1 -0
  1041. package/dist/tui/proxy-models-fetch.js +87 -0
  1042. package/dist/tui/proxy-models-fetch.js.map +1 -0
  1043. package/dist/tui/routes/account.d.ts +4 -0
  1044. package/dist/tui/routes/account.d.ts.map +1 -0
  1045. package/dist/tui/routes/account.js +327 -0
  1046. package/dist/tui/routes/account.js.map +1 -0
  1047. package/dist/tui/routes/apps.d.ts +3 -0
  1048. package/dist/tui/routes/apps.d.ts.map +1 -0
  1049. package/dist/tui/routes/apps.js +296 -0
  1050. package/dist/tui/routes/apps.js.map +1 -0
  1051. package/dist/tui/routes/common.d.ts +4 -0
  1052. package/dist/tui/routes/common.d.ts.map +1 -0
  1053. package/dist/tui/routes/common.js +117 -0
  1054. package/dist/tui/routes/common.js.map +1 -0
  1055. package/dist/tui/routes/context.d.ts +43 -0
  1056. package/dist/tui/routes/context.d.ts.map +1 -0
  1057. package/dist/tui/routes/gateway.d.ts +3 -0
  1058. package/dist/tui/routes/gateway.d.ts.map +1 -0
  1059. package/dist/tui/routes/gateway.js +199 -0
  1060. package/dist/tui/routes/gateway.js.map +1 -0
  1061. package/dist/tui/routes/proxy.d.ts +3 -0
  1062. package/dist/tui/routes/proxy.d.ts.map +1 -0
  1063. package/dist/tui/routes/proxy.js +234 -0
  1064. package/dist/tui/routes/proxy.js.map +1 -0
  1065. package/dist/tui/screens/account-detail.d.ts +14 -0
  1066. package/dist/tui/screens/account-detail.d.ts.map +1 -0
  1067. package/dist/tui/screens/account-detail.js +98 -0
  1068. package/dist/tui/screens/account-detail.js.map +1 -0
  1069. package/dist/tui/screens/accounts-home.d.ts +42 -0
  1070. package/dist/tui/screens/accounts-home.d.ts.map +1 -0
  1071. package/dist/tui/screens/accounts-home.js +321 -0
  1072. package/dist/tui/screens/accounts-home.js.map +1 -0
  1073. package/dist/tui/screens/add-account.d.ts +70 -0
  1074. package/dist/tui/screens/add-account.d.ts.map +1 -0
  1075. package/dist/tui/screens/add-account.js +323 -0
  1076. package/dist/tui/screens/add-account.js.map +1 -0
  1077. package/dist/tui/screens/anypick-home.d.ts +39 -0
  1078. package/dist/tui/screens/anypick-home.d.ts.map +1 -0
  1079. package/dist/tui/screens/anypick-home.js +253 -0
  1080. package/dist/tui/screens/anypick-home.js.map +1 -0
  1081. package/dist/tui/screens/anypick-preview.d.ts +13 -0
  1082. package/dist/tui/screens/anypick-preview.d.ts.map +1 -0
  1083. package/dist/tui/screens/anypick-preview.js +49 -0
  1084. package/dist/tui/screens/anypick-preview.js.map +1 -0
  1085. package/dist/tui/screens/app-route-preview.d.ts +14 -0
  1086. package/dist/tui/screens/app-route-preview.d.ts.map +1 -0
  1087. package/dist/tui/screens/app-route-preview.js +35 -0
  1088. package/dist/tui/screens/app-route-preview.js.map +1 -0
  1089. package/dist/tui/screens/app-route-source.d.ts +15 -0
  1090. package/dist/tui/screens/app-route-source.d.ts.map +1 -0
  1091. package/dist/tui/screens/app-route-source.js +97 -0
  1092. package/dist/tui/screens/app-route-source.js.map +1 -0
  1093. package/dist/tui/screens/apps-home.d.ts +22 -0
  1094. package/dist/tui/screens/apps-home.d.ts.map +1 -0
  1095. package/dist/tui/screens/apps-home.js +111 -0
  1096. package/dist/tui/screens/apps-home.js.map +1 -0
  1097. package/dist/tui/screens/confirm.d.ts +19 -0
  1098. package/dist/tui/screens/confirm.d.ts.map +1 -0
  1099. package/dist/tui/screens/confirm.js +42 -0
  1100. package/dist/tui/screens/confirm.js.map +1 -0
  1101. package/dist/tui/screens/credential-form.d.ts +30 -0
  1102. package/dist/tui/screens/credential-form.d.ts.map +1 -0
  1103. package/dist/tui/screens/credential-form.js +241 -0
  1104. package/dist/tui/screens/credential-form.js.map +1 -0
  1105. package/dist/tui/screens/gateway-connection-form.d.ts +16 -0
  1106. package/dist/tui/screens/gateway-connection-form.d.ts.map +1 -0
  1107. package/dist/tui/screens/gateway-connection-form.js +127 -0
  1108. package/dist/tui/screens/gateway-connection-form.js.map +1 -0
  1109. package/dist/tui/screens/gateway-pick-provider.d.ts +19 -0
  1110. package/dist/tui/screens/gateway-pick-provider.d.ts.map +1 -0
  1111. package/dist/tui/screens/gateway-pick-provider.js +62 -0
  1112. package/dist/tui/screens/gateway-pick-provider.js.map +1 -0
  1113. package/dist/tui/screens/gateways-home.d.ts +38 -0
  1114. package/dist/tui/screens/gateways-home.d.ts.map +1 -0
  1115. package/dist/tui/screens/gateways-home.js +247 -0
  1116. package/dist/tui/screens/gateways-home.js.map +1 -0
  1117. package/dist/tui/screens/health.d.ts +16 -0
  1118. package/dist/tui/screens/health.d.ts.map +1 -0
  1119. package/dist/tui/screens/health.js +109 -0
  1120. package/dist/tui/screens/health.js.map +1 -0
  1121. package/dist/tui/screens/help.d.ts +10 -0
  1122. package/dist/tui/screens/help.d.ts.map +1 -0
  1123. package/dist/tui/screens/help.js +213 -0
  1124. package/dist/tui/screens/help.js.map +1 -0
  1125. package/dist/tui/screens/manage-apps.d.ts +29 -0
  1126. package/dist/tui/screens/manage-apps.d.ts.map +1 -0
  1127. package/dist/tui/screens/manage-apps.js +165 -0
  1128. package/dist/tui/screens/manage-apps.js.map +1 -0
  1129. package/dist/tui/screens/proxy-board-helpers.d.ts +9 -0
  1130. package/dist/tui/screens/proxy-board-helpers.d.ts.map +1 -0
  1131. package/dist/tui/screens/proxy-board-helpers.js +70 -0
  1132. package/dist/tui/screens/proxy-board-helpers.js.map +1 -0
  1133. package/dist/tui/screens/proxy-board.d.ts +43 -0
  1134. package/dist/tui/screens/proxy-board.d.ts.map +1 -0
  1135. package/dist/tui/screens/proxy-board.js +351 -0
  1136. package/dist/tui/screens/proxy-board.js.map +1 -0
  1137. package/dist/tui/screens/proxy-hub.d.ts +21 -0
  1138. package/dist/tui/screens/proxy-hub.d.ts.map +1 -0
  1139. package/dist/tui/screens/proxy-hub.js +150 -0
  1140. package/dist/tui/screens/proxy-hub.js.map +1 -0
  1141. package/dist/tui/screens/proxy-models-utils.d.ts +13 -0
  1142. package/dist/tui/screens/proxy-models-utils.d.ts.map +1 -0
  1143. package/dist/tui/screens/proxy-models-utils.js +53 -0
  1144. package/dist/tui/screens/proxy-models-utils.js.map +1 -0
  1145. package/dist/tui/screens/proxy-models.d.ts +65 -0
  1146. package/dist/tui/screens/proxy-models.d.ts.map +1 -0
  1147. package/dist/tui/screens/proxy-models.js +252 -0
  1148. package/dist/tui/screens/proxy-models.js.map +1 -0
  1149. package/dist/tui/screens/proxy.d.ts +26 -0
  1150. package/dist/tui/screens/proxy.d.ts.map +1 -0
  1151. package/dist/tui/screens/text-input.d.ts +18 -0
  1152. package/dist/tui/screens/text-input.d.ts.map +1 -0
  1153. package/dist/tui/screens/text-input.js +67 -0
  1154. package/dist/tui/screens/text-input.js.map +1 -0
  1155. package/dist/tui/screens/tray-runtime.d.ts +19 -0
  1156. package/dist/tui/screens/tray-runtime.d.ts.map +1 -0
  1157. package/dist/tui/screens/tray-runtime.js +108 -0
  1158. package/dist/tui/screens/tray-runtime.js.map +1 -0
  1159. package/dist/tui/use-tui-nav.d.ts +40 -0
  1160. package/dist/tui/use-tui-nav.d.ts.map +1 -0
  1161. package/dist/tui/use-tui-nav.js +256 -0
  1162. package/dist/tui/use-tui-nav.js.map +1 -0
  1163. package/dist/tui/use-tui-shell.d.ts +46 -0
  1164. package/dist/tui/use-tui-shell.d.ts.map +1 -0
  1165. package/dist/tui/use-tui-shell.js +95 -0
  1166. package/dist/tui/use-tui-shell.js.map +1 -0
  1167. package/dist/types/account.d.ts +410 -0
  1168. package/dist/types/account.d.ts.map +1 -0
  1169. package/dist/types/account.js +7 -0
  1170. package/dist/types/account.js.map +1 -0
  1171. package/dist/types/bindings.d.ts +300 -0
  1172. package/dist/types/bindings.d.ts.map +1 -0
  1173. package/dist/types/catalog.d.ts +165 -0
  1174. package/dist/types/catalog.d.ts.map +1 -0
  1175. package/dist/types/clients.d.ts +174 -0
  1176. package/dist/types/clients.d.ts.map +1 -0
  1177. package/dist/types/clients.js +11 -0
  1178. package/dist/types/clients.js.map +1 -0
  1179. package/dist/types/plugins.d.ts +89 -0
  1180. package/dist/types/plugins.d.ts.map +1 -0
  1181. package/dist/types/plugins.js +14 -0
  1182. package/dist/types/plugins.js.map +1 -0
  1183. package/dist/types/proxy-hub.d.ts +109 -0
  1184. package/dist/types/proxy-hub.d.ts.map +1 -0
  1185. package/dist/types.d.ts +7 -0
  1186. package/dist/types.d.ts.map +1 -0
  1187. package/dist/types.js +1 -0
  1188. package/dist/utils/errors.d.ts +61 -0
  1189. package/dist/utils/errors.d.ts.map +1 -0
  1190. package/dist/utils/errors.js +119 -0
  1191. package/dist/utils/errors.js.map +1 -0
  1192. package/dist/utils/fs.d.ts +39 -0
  1193. package/dist/utils/fs.d.ts.map +1 -0
  1194. package/dist/utils/fs.js +126 -0
  1195. package/dist/utils/fs.js.map +1 -0
  1196. package/dist/utils/lock.d.ts +33 -0
  1197. package/dist/utils/lock.d.ts.map +1 -0
  1198. package/dist/utils/lock.js +95 -0
  1199. package/dist/utils/lock.js.map +1 -0
  1200. package/dist/utils/log.d.ts +10 -0
  1201. package/dist/utils/log.d.ts.map +1 -0
  1202. package/dist/utils/log.js +21 -0
  1203. package/dist/utils/log.js.map +1 -0
  1204. package/dist/utils/network.d.ts +3 -0
  1205. package/dist/utils/network.d.ts.map +1 -0
  1206. package/dist/utils/network.js +13 -0
  1207. package/dist/utils/network.js.map +1 -0
  1208. package/dist/utils/process/binary.d.ts +14 -0
  1209. package/dist/utils/process/binary.d.ts.map +1 -0
  1210. package/dist/utils/process/binary.js +29 -0
  1211. package/dist/utils/process/binary.js.map +1 -0
  1212. package/dist/utils/process/follow.d.ts +2 -0
  1213. package/dist/utils/process/follow.d.ts.map +1 -0
  1214. package/dist/utils/process/follow.js +90 -0
  1215. package/dist/utils/process/follow.js.map +1 -0
  1216. package/dist/utils/process/health.d.ts +43 -0
  1217. package/dist/utils/process/health.d.ts.map +1 -0
  1218. package/dist/utils/process/health.js +132 -0
  1219. package/dist/utils/process/health.js.map +1 -0
  1220. package/dist/utils/process/pid.d.ts +95 -0
  1221. package/dist/utils/process/pid.d.ts.map +1 -0
  1222. package/dist/utils/process/pid.js +243 -0
  1223. package/dist/utils/process/pid.js.map +1 -0
  1224. package/dist/utils/process.d.ts +5 -0
  1225. package/dist/utils/process.d.ts.map +1 -0
  1226. package/dist/utils/process.js +5 -0
  1227. package/dist/utils/slug.d.ts +18 -0
  1228. package/dist/utils/slug.d.ts.map +1 -0
  1229. package/dist/utils/slug.js +42 -0
  1230. package/dist/utils/slug.js.map +1 -0
  1231. package/package.json +121 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","names":[],"sources":["../../src/core/service.ts"],"sourcesContent":["import type {\n Account,\n AccountMeta,\n CredentialInput,\n LiveAuthStatus,\n LiveUsage,\n Provider,\n} from '../types';\nimport { AnyPickError, isAnyPickError } from '../utils/errors';\nimport { displayLabelFromName, normalizeAccountName } from '../utils/slug';\nimport type { ProviderRegistry } from './registry';\nimport type { AccountStore } from './store';\nimport { ProxyService } from './proxy-service';\nimport { providerCanProxy } from './capabilities';\nimport { withMutationLocks } from './mutation-lock';\nimport { providerScope } from './refs';\nimport { mkdir, mkdtemp, rm } from 'node:fs/promises';\nimport { join } from 'node:path';\nimport { tmpdir } from 'node:os';\nimport { exportAccountEnvelope, importAccountEnvelope } from './account-transfer';\n\n/**\n * Account name used when a login must be saved but cannot be named from its own\n * identity — either the provider reports no identity, or the identity contains\n * no slug-safe characters.\n */\nconst FALLBACK_ACCOUNT_NAME = 'stash';\n\nexport interface ListedAccount {\n name: string;\n provider: string;\n identity?: string;\n label?: string;\n active: boolean;\n updatedAt: string;\n createdAt: string;\n proxyEnabled: boolean;\n proxyRunning: boolean;\n /** True when this snapshot's material matches the current live login. */\n isLiveMatch: boolean;\n /** False when comparing this provider's live credential would require a secret prompt. */\n liveMatchKnown: boolean;\n}\n\nexport interface SwitchResult {\n provider: string;\n providerName: string;\n from: string | null;\n to: string;\n /** Whether the previous live auth was re-saved into the prior active account. */\n refreshedPrevious: boolean;\n /** Saved account whose snapshot received the latest live auth before switching. */\n refreshedAccount?: string;\n /** Proxy outcome for the newly active account (if any). */\n proxy?: {\n enabled: boolean;\n running: boolean;\n endpoint?: string;\n compatibility?: string;\n error?: string;\n };\n}\n\n/** Exact local-auth checkpoint used to compensate a failed/scoped switch. */\nexport interface LiveAuthCheckpoint {\n providerId: string;\n activeAccount: string | null;\n hadLiveAuth: boolean;\n directory: string;\n}\n\n/**\n * High-level account operations: save, switch, stash, refresh, delete,\n * and account metadata listing. Proxy lifecycle, pools, and port allocation\n * live in the injected `ProxyService` (exposed as `app.proxy`); this service\n * delegates to it for the proxy side effects of switch/stash/delete.\n *\n * CLI commands call this for account CRUD, and `app.proxy` for proxy control.\n */\nexport class AccountService {\n /** Proxy lifecycle collaborator (start/stop/pool/port). */\n readonly proxy: ProxyService;\n\n /**\n * Optional post-delete side effects (Proxy Hub source prune, pool member\n * sync). Wired from app.ts after Hub exists — AccountService is constructed\n * before Hub to avoid a cycle.\n */\n private afterDelete?: (providerId: string, accountName: string) => Promise<void>;\n\n /**\n * `proxy` stays optional for callers that only need account CRUD (several\n * tests, and any embedder that never starts a proxy). When omitted a private\n * one is built here — deliberately without a lease store, because a service\n * that was never handed the app's lease table must not record leases into a\n * table nobody reaps.\n */\n constructor(\n private readonly store: AccountStore,\n private readonly registry: ProviderRegistry,\n proxy?: ProxyService,\n ) {\n this.proxy = proxy ?? new ProxyService(store, registry);\n }\n\n setAfterDelete(fn: (providerId: string, accountName: string) => Promise<void>): void {\n this.afterDelete = fn;\n }\n\n provider(id: string): Provider {\n return this.registry.get(id);\n }\n\n listProviders(): Provider[] {\n return this.registry.list();\n }\n\n /** Currently active (live) account name for a provider, if any. */\n async getActive(providerId: string): Promise<string | null> {\n return this.store.getActive(providerId);\n }\n\n /** Load a saved account or return null if missing. */\n async get(providerId: string, name: string): Promise<Account | null> {\n return this.store.getAccount(providerId, normalizeAccountName(name));\n }\n\n /** Saved local name for an upstream identity, if one is already known. */\n async findNameByIdentity(providerId: string, identity: string): Promise<string | null> {\n return this.findAccountNameByIdentity(providerId, identity);\n }\n\n /**\n * Capture the real local login before a switch. The checkpoint is private to\n * the current operation and must be cleaned by `discardLiveAuthCheckpoint`.\n */\n async checkpointLiveAuth(\n providerId: string,\n opts: { durable?: boolean } = {},\n ): Promise<LiveAuthCheckpoint> {\n const provider = this.registry.get(providerId);\n const checkpointRoot = opts.durable ? join(this.store.root, 'recovery', 'live-auth') : tmpdir();\n await mkdir(checkpointRoot, { recursive: true, mode: 0o700 });\n const directory = await mkdtemp(join(checkpointRoot, 'anypick-live-checkpoint-'));\n try {\n const activeAccount = await this.store.getActive(providerId);\n const live = await provider.detectLive();\n if (live.present) {\n await provider.backup(directory);\n }\n return { providerId, activeAccount, hadLiveAuth: live.present, directory };\n } catch (err) {\n await rm(directory, { recursive: true, force: true });\n throw err;\n }\n }\n\n /** Restore a checkpoint, including the provider active pointer. */\n async restoreLiveAuthCheckpoint(checkpoint: LiveAuthCheckpoint): Promise<void> {\n const provider = this.registry.get(checkpoint.providerId);\n if (checkpoint.hadLiveAuth) {\n await provider.restore(checkpoint.directory);\n } else if (provider.clearLive) {\n await provider.clearLive();\n } else {\n throw new AnyPickError(\n `Cannot restore an empty ${provider.name} login state safely.`,\n 'SWITCH_ROLLBACK_UNAVAILABLE',\n );\n }\n if (checkpoint.activeAccount) {\n await this.store.setActive(checkpoint.providerId, checkpoint.activeAccount);\n } else {\n await this.store.clearActive(checkpoint.providerId);\n }\n }\n\n async discardLiveAuthCheckpoint(checkpoint: LiveAuthCheckpoint): Promise<void> {\n await rm(checkpoint.directory, { recursive: true, force: true });\n }\n\n async list(providerId?: string): Promise<ListedAccount[]> {\n const providers = providerId ? [this.registry.get(providerId)] : this.registry.list();\n\n const out: ListedAccount[] = [];\n for (const p of providers) {\n const active = await this.store.getActive(p.id);\n const accounts = await this.store.listAccounts(p.id);\n const live = await p.detectLive();\n const materialMatches = await Promise.all(\n accounts.map((account) => computeLiveMatch(p, account, live)),\n );\n const matchedNames = accounts\n .filter((_, index) => materialMatches[index] === true)\n .map((account) => account.meta.name);\n let liveAccountName =\n (active && matchedNames.includes(active) ? active : matchedNames[0]) ?? null;\n\n // A refreshed token can change the session fingerprint while keeping the\n // same upstream identity. Fall back once, choosing the active record when\n // possible, so duplicate snapshots never all render as live.\n const liveIdentity = live.identity;\n if (!liveAccountName && liveIdentity) {\n const identityMatches = accounts\n .filter(\n (account) =>\n account.meta.credentialKind !== 'proxy-only' &&\n account.meta.identity &&\n identitiesMatch(account.meta.identity, liveIdentity),\n )\n .map((account) => account.meta.name);\n liveAccountName =\n (active && identityMatches.includes(active) ? active : identityMatches[0]) ?? null;\n }\n // Some credential stores cannot be read during a background refresh without\n // prompting. The active pointer is authoritative immediately after AnyPick\n // restored that login, so present it as live until a provider can prove drift.\n if (!liveAccountName && active && live.present) {\n const activeIndex = accounts.findIndex((account) => account.meta.name === active);\n if (activeIndex >= 0 && materialMatches[activeIndex] === null) {\n liveAccountName = active;\n }\n }\n\n for (const [index, a] of accounts.entries()) {\n const proxyStatus =\n providerCanProxy(p) && a.proxy.enabled\n ? await this.proxy.proxyStatus(p.id, a.meta.name)\n : null;\n out.push({\n name: a.meta.name,\n provider: p.id,\n identity: a.meta.identity,\n label: a.meta.label,\n active: active === a.meta.name,\n updatedAt: a.meta.updatedAt,\n createdAt: a.meta.createdAt,\n proxyEnabled: a.proxy.enabled,\n proxyRunning: proxyStatus?.running ?? false,\n isLiveMatch: liveAccountName === a.meta.name,\n liveMatchKnown: materialMatches[index] !== null,\n });\n }\n }\n return out;\n }\n\n async current(providerId: string): Promise<{\n active: string | null;\n live: LiveAuthStatus;\n account: Account | null;\n proxy: import('../types').ProxyStatus | null;\n isLiveMatch: boolean;\n liveMatchKnown: boolean;\n }> {\n const provider = this.registry.get(providerId);\n const active = await this.store.getActive(providerId);\n const live = await provider.detectLive();\n const account = active ? await this.store.getAccount(providerId, active) : null;\n const proxy =\n providerCanProxy(provider) && account\n ? await this.proxy.proxyStatus(providerId, account.meta.name)\n : null;\n const liveMatch = account ? await computeLiveMatch(provider, account, live) : null;\n let isLiveMatch = liveMatch === true || (liveMatch === null && active !== null && live.present);\n if (\n !isLiveMatch &&\n account?.meta.credentialKind !== 'proxy-only' &&\n account?.meta.identity &&\n live.identity &&\n identitiesMatch(account.meta.identity, live.identity)\n ) {\n isLiveMatch = true;\n }\n return { active, live, account, proxy, isLiveMatch, liveMatchKnown: liveMatch !== null };\n }\n\n /** Best-effort usage for the provider's currently live local login only. */\n async liveUsage(providerId: string): Promise<LiveUsage | null> {\n const provider = this.registry.get(providerId);\n return provider.liveUsage ? provider.liveUsage() : null;\n }\n\n /**\n * Save current live auth as a named account.\n * If the name already exists, overwrite the snapshot (refresh).\n * Proxy config is preserved.\n */\n async save(\n providerId: string,\n name: string,\n opts: {\n label?: string;\n notes?: string;\n force?: boolean;\n source?: string;\n /** Credential typed by the user; replaces reading a live login. */\n input?: CredentialInput;\n } = {},\n ): Promise<AccountMeta> {\n // ADR 0009: the service owns its lock. Identity resolution is part of the\n // mutation, not a preamble to it — a concurrent save that renames the\n // target account in between would send this one to a stale snapshot.\n return withMutationLocks(this.store.root, [providerScope(providerId)], () =>\n this.saveLocked(providerId, name, opts),\n );\n }\n\n private async saveLocked(\n providerId: string,\n name: string,\n opts: {\n label?: string;\n notes?: string;\n force?: boolean;\n source?: string;\n /** Credential typed by the user; replaces reading a live login. */\n input?: CredentialInput;\n },\n ): Promise<AccountMeta> {\n const provider = this.registry.get(providerId);\n const requestedAccountName = normalizeAccountName(name);\n let accountName = requestedAccountName;\n\n if (opts.input && !provider.backupInput) {\n throw new AnyPickError(\n `${provider.name} does not accept a ${opts.input.kind} credential.`,\n 'UNSUPPORTED_CREDENTIAL_INPUT',\n );\n }\n\n // A typed-in credential has no live counterpart to read, so the live-auth\n // gate below would reject every one of them.\n const live: LiveAuthStatus = opts.input\n ? { present: true }\n : opts.source && provider.detectLiveSource\n ? await provider.detectLiveSource(opts.source)\n : await provider.detectLive();\n if (!live.present) {\n throw new AnyPickError(`No live ${provider.name} login to save.`, {\n code: 'NO_LIVE_AUTH',\n suggestions: [\n `Sign in with the official tool first, then re-run this command.`,\n `Or clear the live auth without saving it: anypick add account ${providerId} --new --no-backup`,\n ],\n });\n }\n\n // An identity (normally an email address) identifies the upstream login,\n // regardless of its local AnyPick name. A confirmed/automated overwrite\n // updates the existing snapshot instead of creating a duplicate.\n accountName = await this.resolveIdentityTarget(\n providerId,\n live.identity,\n accountName,\n opts.force === true,\n );\n\n const existing = await this.store.getAccount(providerId, accountName);\n if (!opts.input && existing?.meta.credentialKind === 'proxy-only') {\n throw new AnyPickError(\n `${providerId}/${accountName} holds a credential you supplied, not a login on this machine.`,\n {\n code: 'CREDENTIAL_KIND_MISMATCH',\n suggestions: [\n `Save the live login under a different name.`,\n `To replace the stored credential, re-run the command that created it.`,\n ],\n },\n );\n }\n\n const now = new Date().toISOString();\n const prepared = await this.store.prepareSnapshot(providerId, accountName);\n let meta: AccountMeta;\n try {\n const fromProvider =\n opts.input && provider.backupInput\n ? await provider.backupInput(opts.input, prepared.snapshotDir)\n : opts.source && provider.backupSource\n ? await provider.backupSource(opts.source, prepared.snapshotDir)\n : await provider.backup(prepared.snapshotDir);\n meta = {\n name: accountName,\n provider: providerId,\n createdAt: existing?.meta.createdAt ?? now,\n updatedAt: now,\n label:\n opts.label ??\n existing?.meta.label ??\n fromProvider.label ??\n (accountName === requestedAccountName\n ? displayLabelFromName(name, accountName)\n : undefined),\n identity: fromProvider.identity ?? live.identity ?? existing?.meta.identity,\n notes: opts.notes ?? existing?.meta.notes ?? fromProvider.notes,\n credentialKind: fromProvider.credentialKind,\n };\n await this.store.writeMeta(meta);\n } catch (err) {\n if (existing) {\n // Re-materialize the last committed DB snapshot after prepareSnapshot\n // cleared its on-disk cache.\n await this.store.getAccount(providerId, accountName).catch(() => null);\n } else {\n // A failed first save must not leave an empty account directory that\n // can later be mistaken for a real login.\n await rm(prepared.accountDir, { recursive: true, force: true }).catch(() => {});\n }\n throw err;\n }\n\n if (!(await this.store.getActive(providerId))) {\n await this.store.setActive(providerId, accountName);\n }\n\n return meta;\n }\n\n /**\n * Resolve the saved name for the auth material currently on disk.\n *\n * Existing identities always win so a refreshed token overwrites its saved\n * snapshot instead of creating an alias such as \"default\". A new login gets\n * a stable identity-derived name unless the caller supplied one.\n */\n async resolveCurrentSaveName(providerId: string, requestedName?: string): Promise<string> {\n const provider = this.registry.get(providerId);\n const live = await provider.detectLive();\n if (!live.present) {\n throw new AnyPickError(`No live ${provider.name} login to save.`, {\n code: 'NO_LIVE_AUTH',\n suggestions: ['Sign in with the official tool first, then try again.'],\n });\n }\n\n if (live.identity) {\n const existingName = await this.findAccountNameByIdentity(providerId, live.identity);\n if (existingName) {\n return existingName;\n }\n }\n\n if (requestedName?.trim()) {\n return normalizeAccountName(requestedName);\n }\n\n const active = await this.store.getActive(providerId);\n if (active) {\n const activeAccount = await this.store.getAccount(providerId, active);\n if (\n activeAccount &&\n (!live.identity ||\n (activeAccount.meta.identity &&\n identitiesMatch(activeAccount.meta.identity, live.identity)))\n ) {\n return active;\n }\n }\n\n if (live.identity) {\n return accountNameFromIdentity(live.identity);\n }\n\n throw new AnyPickError(`Name the ${provider.name} login before saving it.`, {\n code: 'MISSING_ACCOUNT_NAME',\n suggestions: [`anypick add account ${providerId} --current --name <name>`],\n });\n }\n\n /** Save current auth, reusing its existing account whenever possible. */\n async saveCurrent(providerId: string, requestedName?: string): Promise<AccountMeta> {\n const accountName = await this.resolveCurrentSaveName(providerId, requestedName);\n return this.save(providerId, accountName, { force: true });\n }\n\n /**\n * Switch live auth to a saved account.\n * Stops the previous account's proxy, restores auth, starts the new proxy if enabled.\n */\n async use(\n providerId: string,\n name: string,\n opts: { noRefresh?: boolean; noProxy?: boolean } = {},\n ): Promise<SwitchResult> {\n return withMutationLocks(this.store.root, [providerScope(providerId)], () =>\n this.useLocked(providerId, name, opts),\n );\n }\n\n private async useLocked(\n providerId: string,\n name: string,\n opts: { noRefresh?: boolean; noProxy?: boolean },\n ): Promise<SwitchResult> {\n const provider = this.registry.get(providerId);\n const accountName = normalizeAccountName(name);\n const target = await this.store.requireAccount(providerId, accountName);\n\n const previous = await this.store.getActive(providerId);\n let refreshedPrevious = false;\n let refreshedAccount: string | undefined;\n if (target.meta.credentialKind !== 'proxy-only') {\n await provider.preflightRestore?.(target.snapshotDir);\n }\n const checkpoint = await this.checkpointLiveAuth(providerId);\n let previousProxyWasRunning = false;\n\n try {\n // Stop previous proxy before swapping auth / starting a new one.\n if (previous && previous !== accountName && providerCanProxy(provider)) {\n const previousStatus = await this.proxy.proxyStatus(providerId, previous);\n previousProxyWasRunning = previousStatus.running;\n await this.proxy.stopProxyForAccount(provider, previous);\n }\n\n if (!opts.noRefresh && previous && previous !== accountName) {\n const live = await provider.detectLive();\n // Activating a proxy-only account never displaced the native login, so\n // there is nothing of its to preserve — and writing the live login into\n // its snapshot would overwrite the credential the user typed in.\n const previousMeta = await this.store.getAccount(providerId, previous);\n if (live.present && previousMeta?.meta.credentialKind !== 'proxy-only') {\n // Persist refreshed tokens into the account that actually owns the\n // live identity. The active pointer may be stale after an external\n // login change, so it must never choose the snapshot by itself.\n refreshedAccount = await this.saveLiveIntoExistingAccount(providerId, previous);\n refreshedPrevious = refreshedAccount === previous;\n }\n }\n\n // A proxy-only snapshot holds no native login, so restoring it would at\n // best write nothing and at worst let a provider that prunes stale\n // credential files delete the real login. Only the proxy reads it.\n if (target.meta.credentialKind !== 'proxy-only') {\n await provider.restore(target.snapshotDir);\n }\n await this.store.setActive(providerId, accountName);\n\n let proxy: SwitchResult['proxy'];\n if (!opts.noProxy && providerCanProxy(provider)) {\n const result = await this.proxy.startProxyForAccount(provider, accountName, target.proxy);\n if (result.error) {\n throw new AnyPickError(`Could not start the ${provider.name} proxy: ${result.error}`, {\n code: 'PROXY_START_FAILED',\n });\n }\n proxy = {\n enabled: target.proxy.enabled,\n running: result.running,\n endpoint: result.endpoint,\n compatibility: provider.proxyCompatibility,\n };\n } else {\n proxy = { enabled: false, running: false };\n }\n\n return {\n provider: providerId,\n providerName: provider.name,\n from: previous,\n to: accountName,\n refreshedPrevious,\n refreshedAccount,\n proxy,\n };\n } catch (err) {\n try {\n await this.restoreLiveAuthCheckpoint(checkpoint);\n if (previousProxyWasRunning && previous && providerCanProxy(provider)) {\n const prior = await this.store.requireAccount(providerId, previous);\n await this.proxy.startProxyForAccount(provider, previous, prior.proxy);\n }\n } catch (rollbackErr) {\n throw new AnyPickError(\n `Account switch failed and rollback could not complete: ${rollbackErr instanceof Error ? rollbackErr.message : String(rollbackErr)}`,\n 'SWITCH_ROLLBACK_FAILED',\n );\n }\n throw err;\n } finally {\n await this.discardLiveAuthCheckpoint(checkpoint);\n }\n }\n\n /**\n * Stash live auth: auto-backup (prefer matching email), then remove local\n * live files so the tool allows a new login — WITHOUT server-side logout/revoke.\n */\n async stash(\n providerId: string,\n opts: {\n /** Skip auto-backup before removing live files. */\n noBackup?: boolean;\n /** Force backup into this account name. */\n as?: string;\n /** Sign-in source to stash for providers that have more than one. */\n source?: 'gemini-cli' | 'antigravity';\n } = {},\n ): Promise<{\n provider: string;\n cleared: boolean;\n backedUpTo: string | null;\n previousIdentity?: string;\n /** True when backup reused an existing account with the same email. */\n matchedByIdentity: boolean;\n /** True when there was no live auth to back up (nothing to save). */\n skippedBackup: boolean;\n }> {\n return withMutationLocks(this.store.root, [providerScope(providerId)], () =>\n this.stashLocked(providerId, opts),\n );\n }\n\n private async stashLocked(\n providerId: string,\n opts: {\n noBackup?: boolean;\n as?: string;\n source?: 'gemini-cli' | 'antigravity';\n },\n ): Promise<{\n provider: string;\n cleared: boolean;\n backedUpTo: string | null;\n previousIdentity?: string;\n matchedByIdentity: boolean;\n skippedBackup: boolean;\n }> {\n const provider = this.registry.get(providerId);\n const clear =\n opts.source && provider.clearLiveSource\n ? () => provider.clearLiveSource!(opts.source!)\n : provider.clearLive\n ? () => provider.clearLive!()\n : null;\n if (!clear) {\n throw new AnyPickError(\n `Provider \"${providerId}\" does not support stash (clear live auth).`,\n 'STASH_UNSUPPORTED',\n );\n }\n\n const live =\n opts.source && provider.detectLiveSource\n ? await provider.detectLiveSource(opts.source)\n : await provider.detectLive();\n let backedUpTo: string | null = null;\n let matchedByIdentity = false;\n const previousIdentity = live.identity;\n let skippedBackup = !live.present;\n\n if (live.present && !opts.noBackup) {\n const resolved = await this.resolveStashBackupTarget(providerId, live.identity, opts.as);\n matchedByIdentity = resolved.matchedByIdentity;\n try {\n const meta = await this.save(providerId, resolved.name, {\n force: true,\n source: opts.source,\n });\n backedUpTo = meta.name;\n } catch (err) {\n // detectLive() may report a login from a Desktop/electron session while\n // the actual auth.json file (the thing we back up) is absent. Treat that\n // as \"nothing to back up\" rather than a hard failure.\n if (isAnyPickError(err) && err.code === 'NO_LIVE_AUTH') {\n skippedBackup = true;\n } else if (isAnyPickError(err) && err.code === 'ACCOUNT_IDENTITY_EXISTS') {\n // This is a user-resolvable naming conflict, not a failed backup.\n throw err;\n } else {\n throw new AnyPickError(\n `Could not back up the live ${provider.name} login before clearing it.`,\n {\n code: 'STASH_BACKUP_FAILED',\n suggestions: [\n `Fix whatever is blocking the live login, then try again.`,\n `Or clear it without a backup (unsaved tokens will be lost): anypick add account ${providerId} --new --no-backup`,\n ],\n },\n );\n }\n }\n }\n\n if (providerCanProxy(provider)) {\n const active = await this.store.getActive(providerId);\n if (active) {\n try {\n await this.proxy.stopProxyForAccount(provider, active);\n } catch {\n // continue\n }\n }\n }\n\n if (live.present) {\n await clear();\n }\n\n return {\n provider: providerId,\n cleared: live.present,\n backedUpTo,\n previousIdentity,\n matchedByIdentity,\n skippedBackup,\n };\n }\n\n /**\n * Pick account name for stash auto-backup, preferring same-email reuse.\n */\n private async resolveStashBackupTarget(\n providerId: string,\n liveIdentity: string | undefined,\n explicitAs?: string,\n ): Promise<{ name: string; matchedByIdentity: boolean }> {\n if (explicitAs) {\n return {\n name: normalizeAccountName(explicitAs),\n matchedByIdentity: false,\n };\n }\n\n if (liveIdentity) {\n const byIdentity = await this.findAccountNameByIdentity(providerId, liveIdentity);\n if (byIdentity) {\n return { name: byIdentity, matchedByIdentity: true };\n }\n }\n\n const active = await this.store.getActive(providerId);\n if (active) {\n const activeAccount = await this.store.getAccount(providerId, active);\n // Reuse active only when identity matches or active has no identity yet\n if (\n !liveIdentity ||\n !activeAccount?.meta.identity ||\n identitiesMatch(activeAccount.meta.identity, liveIdentity)\n ) {\n return { name: active, matchedByIdentity: false };\n }\n }\n\n if (liveIdentity) {\n return {\n name: accountNameFromIdentity(liveIdentity),\n matchedByIdentity: false,\n };\n }\n\n return { name: FALLBACK_ACCOUNT_NAME, matchedByIdentity: false };\n }\n\n private async findAccountNameByIdentity(\n providerId: string,\n identity: string,\n ): Promise<string | null> {\n const accounts = await this.store.listAccounts(providerId);\n for (const a of accounts) {\n if (a.meta.identity && identitiesMatch(a.meta.identity, identity)) {\n return a.meta.name;\n }\n }\n return null;\n }\n\n /**\n * Save live auth only into an already-saved account.\n *\n * Switching must never invent a new account or overwrite a stale active\n * pointer with another identity. An unsaved login is blocked so the caller\n * can explicitly name/save it before replacing the live auth file.\n */\n private async saveLiveIntoExistingAccount(\n providerId: string,\n fallbackActiveName: string,\n ): Promise<string> {\n const provider = this.registry.get(providerId);\n const live = await provider.detectLive();\n if (!live.present) {\n throw new AnyPickError(`No live ${provider.name} login to preserve.`, 'NO_LIVE_AUTH');\n }\n\n let targetName = live.identity\n ? await this.findAccountNameByIdentity(providerId, live.identity)\n : null;\n\n if (!targetName && !live.identity) {\n const accounts = await this.store.listAccounts(providerId);\n // Prefer the active snapshot only after credential material proves it\n // owns the live login. The active DB pointer is state, not identity.\n const ordered = accounts.toSorted((a, b) => {\n if (a.meta.name === fallbackActiveName) {\n return -1;\n }\n if (b.meta.name === fallbackActiveName) {\n return 1;\n }\n return a.meta.name.localeCompare(b.meta.name);\n });\n for (const account of ordered) {\n if ((await computeLiveMatch(provider, account, live)) === true) {\n targetName = account.meta.name;\n break;\n }\n }\n }\n\n if (!targetName) {\n throw new AnyPickError(\n `The live ${provider.name} login${live.identity ? ` (${live.identity})` : ''} is not saved yet.`,\n {\n code: 'UNSAVED_LIVE_AUTH',\n suggestions: [\n `Save it first: anypick add account ${providerId} --current${\n live.identity ? '' : ' --name <name>'\n }`,\n ],\n },\n );\n }\n\n const meta = await this.save(providerId, targetName, { force: true });\n return meta.name;\n }\n\n /** Resolve a duplicate identity to its existing local account after confirmation. */\n private async resolveIdentityTarget(\n providerId: string,\n identity: string | undefined,\n accountName: string,\n allowOverwrite: boolean,\n ): Promise<string> {\n if (!identity?.trim()) {\n return accountName;\n }\n const existingName = await this.findAccountNameByIdentity(providerId, identity);\n if (existingName && existingName !== accountName) {\n if (allowOverwrite) {\n return existingName;\n }\n throw new AnyPickError(\n `Login ${identity} is already saved as ${providerId}/${existingName}.`,\n {\n code: 'ACCOUNT_IDENTITY_EXISTS',\n suggestions: [`Use ${providerId}/${existingName} instead of saving a duplicate.`],\n details: { provider: providerId, identity, existingName },\n },\n );\n }\n return accountName;\n }\n\n /**\n * Refresh OAuth/OIDC tokens.\n *\n * - `refresh codex` → live auth (+ sync into active saved account if any)\n * - `refresh codex lucy` → saved snapshot `lucy` (+ restore to live if active)\n * - `refresh codex --all` → every saved account for a provider\n */\n async refresh(\n providerId: string,\n name?: string,\n opts: { all?: boolean } = {},\n ): Promise<\n Array<{\n target: string;\n identity?: string;\n ok: boolean;\n error?: string;\n }>\n > {\n return withMutationLocks(this.store.root, [providerScope(providerId)], () =>\n this.refreshLocked(providerId, name, opts),\n );\n }\n\n private async refreshLocked(\n providerId: string,\n name: string | undefined,\n opts: { all?: boolean },\n ): Promise<\n Array<{\n target: string;\n identity?: string;\n ok: boolean;\n error?: string;\n }>\n > {\n const provider = this.registry.get(providerId);\n if (!provider.refreshAuth) {\n throw new AnyPickError(\n `Provider \"${providerId}\" does not support token refresh.`,\n 'REFRESH_UNSUPPORTED',\n );\n }\n\n const results: Array<{\n target: string;\n identity?: string;\n ok: boolean;\n error?: string;\n }> = [];\n\n if (opts.all) {\n const accounts = await this.store.listAccounts(providerId);\n for (const a of accounts) {\n results.push(await this.refreshSavedAccount(provider, a.meta.name));\n }\n if (results.length === 0) {\n throw new AnyPickError(`No saved accounts for ${providerId}.`, 'REFRESH_EMPTY');\n }\n return results;\n }\n\n if (name) {\n results.push(await this.refreshSavedAccount(provider, normalizeAccountName(name)));\n return results;\n }\n\n // Default: refresh live auth\n results.push(await this.refreshLiveAuth(provider));\n return results;\n }\n\n private async refreshSavedAccount(\n provider: Provider,\n accountName: string,\n ): Promise<{\n target: string;\n identity?: string;\n ok: boolean;\n error?: string;\n }> {\n const target = `${provider.id}/${accountName}`;\n try {\n const account = await this.store.requireAccount(provider.id, accountName);\n const from = await provider.refreshAuth!(account.snapshotDir);\n const meta = {\n ...account.meta,\n updatedAt: new Date().toISOString(),\n identity: from.identity ?? account.meta.identity,\n };\n await this.store.writeMeta(meta);\n\n const active = await this.store.getActive(provider.id);\n if (active === accountName) {\n await provider.restore(account.snapshotDir);\n }\n\n return { target, identity: meta.identity, ok: true };\n } catch (err) {\n return {\n target,\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n private async refreshLiveAuth(provider: Provider): Promise<{\n target: string;\n identity?: string;\n ok: boolean;\n error?: string;\n }> {\n const target = `${provider.id}/live`;\n try {\n const live = await provider.detectLive();\n if (!live.present) {\n // Fall back to active saved account\n const active = await this.store.getActive(provider.id);\n if (active) {\n return this.refreshSavedAccount(provider, active);\n }\n return {\n target,\n ok: false,\n error: 'No live auth and no active account.',\n };\n }\n\n const dir = await mkdtemp(join(tmpdir(), 'anypick-refresh-'));\n try {\n await provider.backup(dir);\n const from = await provider.refreshAuth!(dir);\n await provider.restore(dir);\n\n // Sync the refreshed live login into the account that owns it — not\n // blindly into whichever account is active. A provider whose live auth\n // is a single global slot (Gemini reads one Antigravity keychain item\n // for every account) would otherwise let an out-of-band sign-in\n // overwrite an unrelated account's snapshot with someone else's token.\n const active = await this.store.getActive(provider.id);\n let syncError: string | undefined;\n if (active) {\n try {\n await this.saveLiveIntoExistingAccount(provider.id, active);\n } catch (err) {\n syncError = err instanceof Error ? err.message : String(err);\n }\n }\n\n return {\n target,\n identity: from.identity ?? live.identity,\n ok: !syncError,\n ...(syncError\n ? { error: `Live auth refreshed, but saved account sync failed: ${syncError}` }\n : {}),\n };\n } finally {\n await rm(dir, { recursive: true, force: true });\n }\n } catch (err) {\n return {\n target,\n ok: false,\n error: err instanceof Error ? err.message : String(err),\n };\n }\n }\n\n /** Update display metadata without touching the credential snapshot bytes. */\n async edit(\n providerId: string,\n name: string,\n opts: { label?: string | null },\n ): Promise<AccountMeta> {\n const accountName = normalizeAccountName(name);\n return withMutationLocks(this.store.root, [providerScope(providerId)], async () => {\n const account = await this.store.requireAccount(providerId, accountName);\n const label = opts.label === null ? undefined : opts.label?.trim() || account.meta.label;\n const meta: AccountMeta = {\n ...account.meta,\n label,\n updatedAt: new Date().toISOString(),\n };\n // writeMeta remains the atomic commit point (ADR 0004). requireAccount\n // materialized the complete snapshot before this metadata-only rewrite.\n await this.store.writeMeta(meta);\n return meta;\n });\n }\n\n async delete(providerId: string, name: string): Promise<void> {\n const provider = this.registry.get(providerId);\n const accountName = normalizeAccountName(name);\n await withMutationLocks(this.store.root, [providerScope(providerId)], async () => {\n if (providerCanProxy(provider)) {\n await this.proxy.stopProxyForAccount(provider, accountName);\n }\n await this.store.deleteAccount(providerId, accountName);\n });\n // Outside the provider lock: Hub/pool scopes are different and re-entry\n // across services is fine. Best-effort so a hub write failure cannot\n // resurrect the account row.\n try {\n await this.afterDelete?.(providerId, accountName);\n } catch {\n // Caller already got a successful delete; residual hub rows are\n // recoverable via doctor / next hub edit.\n }\n }\n\n // ── Export / import ─────────────────────────────────────────────\n\n async exportAccount(providerId: string, name: string, outPath: string): Promise<void> {\n await exportAccountEnvelope(this.store, providerId, name, outPath);\n }\n\n async importAccount(\n providerId: string,\n name: string,\n inPath: string,\n opts: { force?: boolean } = {},\n ): Promise<AccountMeta> {\n return withMutationLocks(this.store.root, [providerScope(providerId)], async () => {\n const provider = this.registry.get(providerId);\n return importAccountEnvelope(\n {\n store: this.store,\n provider,\n resolveIdentityTarget: (pid, identity, accountName, force) =>\n this.resolveIdentityTarget(pid, identity, accountName, force),\n },\n providerId,\n name,\n inPath,\n opts,\n );\n });\n }\n}\n\nfunction identitiesMatch(a: string, b: string): boolean {\n return a.trim().toLowerCase() === b.trim().toLowerCase();\n}\n\n/**\n * Whether a saved snapshot's auth material matches the current live login.\n * Capsule: delegates to the provider (which owns the fingerprint logic) and\n * falls back to identity equality when the provider does not implement it.\n */\nasync function computeLiveMatch(\n provider: Provider,\n account: Account,\n knownLive?: LiveAuthStatus,\n): Promise<boolean | null> {\n // A proxy-only credential never occupies the provider's live login file, so\n // it cannot be what is on disk no matter what the fingerprint says.\n if (account.meta.credentialKind === 'proxy-only') {\n return false;\n }\n const { snapshotDir } = account;\n if (typeof provider.snapshotMatchesLive === 'function') {\n try {\n return await provider.snapshotMatchesLive(snapshotDir);\n } catch (err) {\n if (isAnyPickError(err) && err.code === 'NOT_DETERMINABLE') {\n return null;\n }\n // fall through to identity-based fallback\n }\n }\n const live = knownLive ?? (await provider.detectLive());\n if (!live.identity) {\n return false;\n }\n const described = provider.describeSnapshot ? await provider.describeSnapshot(snapshotDir) : {};\n return described.identity != null && identitiesMatch(described.identity, live.identity);\n}\n\n/**\n * Derive a stable account slug from an email / identity string.\n *\n * Falls back to the same generic name the caller uses when there is no identity\n * at all: an identity that slugifies to nothing (all punctuation, non-Latin\n * script) is not a failure the user can act on, and refusing here would block\n * saving a real login over a cosmetic naming problem. `--name` overrides it.\n */\nfunction accountNameFromIdentity(identity: string): string {\n const trimmed = identity.trim();\n const local = trimmed.includes('@') ? trimmed.split('@')[0] : trimmed;\n try {\n return normalizeAccountName(local);\n } catch {\n return FALLBACK_ACCOUNT_NAME;\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import type { Account } from '../types.js';
2
+ import type { AnyPickDatabase } from './db.js';
3
+ export declare function rowToAccount(root: string, providerId: string, row: {
4
+ name: string;
5
+ meta_json: string;
6
+ proxy_json: string;
7
+ }): Account;
8
+ export declare function ingestSnapshotDir(db: AnyPickDatabase, providerId: string, name: string, snapDir: string): void;
9
+ export declare function materializeSnapshot(root: string, db: AnyPickDatabase, providerId: string, name: string): void;
10
+ //# sourceMappingURL=store-snapshot.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-snapshot.d.ts","sourceRoot":"","sources":["../../src/core/store-snapshot.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,OAAO,EAAe,MAAM,UAAU,CAAC;AAMrD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,MAAM,CAAC;AAG5C,wBAAgB,YAAY,CAC1B,IAAI,EAAE,MAAM,EACZ,UAAU,EAAE,MAAM,EAClB,GAAG,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC3D,OAAO,CAyBT;AAED,wBAAgB,iBAAiB,CAC/B,EAAE,EAAE,eAAe,EACnB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,GACd,IAAI,CA2BN;AAED,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,EAAE,EAAE,eAAe,EACnB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,GACX,IAAI,CAiDN"}
@@ -0,0 +1,79 @@
1
+ import { DEFAULT_PROXY_CONFIG } from "../types/account.js";
2
+ import { AnyPickError } from "../utils/errors.js";
3
+ import { decode, decodeWithFallback, decoders } from "./codec.js";
4
+ import { accountDir, accountSnapshotDir } from "./paths.js";
5
+ import { normalizeAccountName } from "../utils/slug.js";
6
+ import { stagedFilePath } from "./account-codec.js";
7
+ import { existsSync, mkdirSync, readFileSync, readdirSync, rmSync, writeFileSync } from "node:fs";
8
+ import { dirname, join } from "node:path";
9
+ //#region src/core/store-snapshot.ts
10
+ function rowToAccount(root, providerId, row) {
11
+ const storedName = normalizeAccountName(row.name);
12
+ const meta = {
13
+ ...decode(row.meta_json, decoders.accountMeta, `${providerId}/${storedName}`),
14
+ name: storedName,
15
+ provider: providerId
16
+ };
17
+ const proxy = decodeWithFallback(row.proxy_json, decoders.accountProxyConfig, { ...DEFAULT_PROXY_CONFIG }, `${providerId}/${storedName}`);
18
+ return {
19
+ meta,
20
+ snapshotDir: accountSnapshotDir(root, providerId, storedName),
21
+ accountDir: accountDir(root, providerId, storedName),
22
+ proxy
23
+ };
24
+ }
25
+ function ingestSnapshotDir(db, providerId, name, snapDir) {
26
+ db.prepare(`DELETE FROM account_snapshot_files WHERE provider = ? AND account = ?`).run(providerId, name);
27
+ if (!existsSync(snapDir)) return;
28
+ const ins = db.prepare(`INSERT INTO account_snapshot_files (provider, account, path, content)
29
+ VALUES (?, ?, ?, ?)`);
30
+ const walk = (dir, prefix) => {
31
+ for (const entry of readdirSync(dir, { withFileTypes: true })) {
32
+ const full = join(dir, entry.name);
33
+ const rel = prefix ? `${prefix}/${entry.name}` : entry.name;
34
+ if (entry.isDirectory()) walk(full, rel);
35
+ else if (entry.isFile()) ins.run(providerId, name, rel.split("\\").join("/"), readFileSync(full));
36
+ }
37
+ };
38
+ walk(snapDir, "");
39
+ }
40
+ function materializeSnapshot(root, db, providerId, name) {
41
+ const snap = accountSnapshotDir(root, providerId, name);
42
+ mkdirSync(snap, {
43
+ recursive: true,
44
+ mode: 448
45
+ });
46
+ const destinations = db.prepare(`SELECT path, content FROM account_snapshot_files
47
+ WHERE provider = ? AND account = ?`).all(providerId, name).map((row) => {
48
+ if (typeof row.path !== "string") throw new AnyPickError("Snapshot contains an invalid file path.", "SNAPSHOT_INVALID");
49
+ try {
50
+ return {
51
+ row,
52
+ dest: stagedFilePath(snap, row.path)
53
+ };
54
+ } catch {
55
+ throw new AnyPickError(`Snapshot contains an unsafe file path: ${JSON.stringify(row.path)}.`, "SNAPSHOT_INVALID");
56
+ }
57
+ });
58
+ const seen = /* @__PURE__ */ new Set();
59
+ for (const { row } of destinations) {
60
+ const rel = row.path.split("\\").join("/").replace(/^\.\//, "");
61
+ if ([...seen].some((existing) => rel === existing || rel.startsWith(`${existing}/`) || existing.startsWith(`${rel}/`))) throw new AnyPickError("Snapshot contains colliding file paths.", "SNAPSHOT_INVALID");
62
+ seen.add(rel);
63
+ }
64
+ for (const entry of readdirSync(snap, { withFileTypes: true })) rmSync(join(snap, entry.name), {
65
+ recursive: true,
66
+ force: true
67
+ });
68
+ for (const { row, dest } of destinations) {
69
+ mkdirSync(dirname(dest), {
70
+ recursive: true,
71
+ mode: 448
72
+ });
73
+ writeFileSync(dest, Buffer.isBuffer(row.content) ? row.content : Buffer.from(row.content), { mode: 384 });
74
+ }
75
+ }
76
+ //#endregion
77
+ export { ingestSnapshotDir, materializeSnapshot, rowToAccount };
78
+
79
+ //# sourceMappingURL=store-snapshot.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store-snapshot.js","names":[],"sources":["../../src/core/store-snapshot.ts"],"sourcesContent":["import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, writeFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport type { Account, AccountMeta } from '../types';\nimport { DEFAULT_PROXY_CONFIG } from '../types';\nimport { AnyPickError } from '../utils/errors';\nimport { normalizeAccountName } from '../utils/slug';\nimport { stagedFilePath } from './account-codec';\nimport { decode, decodeWithFallback, decoders } from './codec';\nimport type { AnyPickDatabase } from './db';\nimport { accountDir, accountSnapshotDir } from './paths';\n\nexport function rowToAccount(\n root: string,\n providerId: string,\n row: { name: string; meta_json: string; proxy_json: string },\n): Account {\n const storedName = normalizeAccountName(row.name);\n const rawMeta = decode(row.meta_json, decoders.accountMeta, `${providerId}/${storedName}`);\n // The SQL primary key is the authority for identity and filesystem paths.\n // Never let legacy/corrupt metadata redirect a snapshot outside its own\n // provider/account directory.\n const meta: AccountMeta = {\n ...rawMeta,\n name: storedName,\n provider: providerId,\n };\n const proxy = decodeWithFallback(\n row.proxy_json,\n decoders.accountProxyConfig,\n {\n ...DEFAULT_PROXY_CONFIG,\n },\n `${providerId}/${storedName}`,\n );\n return {\n meta,\n snapshotDir: accountSnapshotDir(root, providerId, storedName),\n accountDir: accountDir(root, providerId, storedName),\n proxy,\n };\n}\n\nexport function ingestSnapshotDir(\n db: AnyPickDatabase,\n providerId: string,\n name: string,\n snapDir: string,\n): void {\n db.prepare(`DELETE FROM account_snapshot_files WHERE provider = ? AND account = ?`).run(\n providerId,\n name,\n );\n\n if (!existsSync(snapDir)) {\n return;\n }\n\n const ins = db.prepare(\n `INSERT INTO account_snapshot_files (provider, account, path, content)\n VALUES (?, ?, ?, ?)`,\n );\n\n const walk = (dir: string, prefix: string): void => {\n for (const entry of readdirSync(dir, { withFileTypes: true })) {\n const full = join(dir, entry.name);\n const rel = prefix ? `${prefix}/${entry.name}` : entry.name;\n if (entry.isDirectory()) {\n walk(full, rel);\n } else if (entry.isFile()) {\n ins.run(providerId, name, rel.split('\\\\').join('/'), readFileSync(full));\n }\n }\n };\n walk(snapDir, '');\n}\n\nexport function materializeSnapshot(\n root: string,\n db: AnyPickDatabase,\n providerId: string,\n name: string,\n): void {\n const snap = accountSnapshotDir(root, providerId, name);\n mkdirSync(snap, { recursive: true, mode: 0o700 });\n\n const rows = db\n .prepare(\n `SELECT path, content FROM account_snapshot_files\n WHERE provider = ? AND account = ?`,\n )\n .all(providerId, name) as Array<{ path: string; content: Buffer }>;\n\n const destinations = rows.map((row) => {\n if (typeof row.path !== 'string') {\n throw new AnyPickError('Snapshot contains an invalid file path.', 'SNAPSHOT_INVALID');\n }\n try {\n return { row, dest: stagedFilePath(snap, row.path) };\n } catch {\n throw new AnyPickError(\n `Snapshot contains an unsafe file path: ${JSON.stringify(row.path)}.`,\n 'SNAPSHOT_INVALID',\n );\n }\n });\n const seen = new Set<string>();\n for (const { row } of destinations) {\n const rel = row.path.split('\\\\').join('/').replace(/^\\.\\//, '');\n if (\n [...seen].some(\n (existing) =>\n rel === existing || rel.startsWith(`${existing}/`) || existing.startsWith(`${rel}/`),\n )\n ) {\n throw new AnyPickError('Snapshot contains colliding file paths.', 'SNAPSHOT_INVALID');\n }\n seen.add(rel);\n }\n\n for (const entry of readdirSync(snap, { withFileTypes: true })) {\n rmSync(join(snap, entry.name), { recursive: true, force: true });\n }\n\n for (const { row, dest } of destinations) {\n mkdirSync(dirname(dest), { recursive: true, mode: 0o700 });\n const buf = Buffer.isBuffer(row.content)\n ? row.content\n : Buffer.from(row.content as unknown as ArrayBuffer);\n writeFileSync(dest, buf, { mode: 0o600 });\n }\n}\n"],"mappings":";;;;;;;;;AAWA,SAAgB,aACd,MACA,YACA,KACS;CACT,MAAM,aAAa,qBAAqB,IAAI,IAAI;CAKhD,MAAM,OAAoB;EACxB,GALc,OAAO,IAAI,WAAW,SAAS,aAAa,GAAG,WAAW,GAAG,YAKxE;EACH,MAAM;EACN,UAAU;CACZ;CACA,MAAM,QAAQ,mBACZ,IAAI,YACJ,SAAS,oBACT,EACE,GAAG,qBACL,GACA,GAAG,WAAW,GAAG,YACnB;CACA,OAAO;EACL;EACA,aAAa,mBAAmB,MAAM,YAAY,UAAU;EAC5D,YAAY,WAAW,MAAM,YAAY,UAAU;EACnD;CACF;AACF;AAEA,SAAgB,kBACd,IACA,YACA,MACA,SACM;CACN,GAAG,QAAQ,uEAAuE,CAAC,CAAC,IAClF,YACA,IACF;CAEA,IAAI,CAAC,WAAW,OAAO,GACrB;CAGF,MAAM,MAAM,GAAG,QACb;yBAEF;CAEA,MAAM,QAAQ,KAAa,WAAyB;EAClD,KAAK,MAAM,SAAS,YAAY,KAAK,EAAE,eAAe,KAAK,CAAC,GAAG;GAC7D,MAAM,OAAO,KAAK,KAAK,MAAM,IAAI;GACjC,MAAM,MAAM,SAAS,GAAG,OAAO,GAAG,MAAM,SAAS,MAAM;GACvD,IAAI,MAAM,YAAY,GACpB,KAAK,MAAM,GAAG;QACT,IAAI,MAAM,OAAO,GACtB,IAAI,IAAI,YAAY,MAAM,IAAI,MAAM,IAAI,CAAC,CAAC,KAAK,GAAG,GAAG,aAAa,IAAI,CAAC;EAE3E;CACF;CACA,KAAK,SAAS,EAAE;AAClB;AAEA,SAAgB,oBACd,MACA,IACA,YACA,MACM;CACN,MAAM,OAAO,mBAAmB,MAAM,YAAY,IAAI;CACtD,UAAU,MAAM;EAAE,WAAW;EAAM,MAAM;CAAM,CAAC;CAShD,MAAM,eAPO,GACV,QACC;0CAEF,CAAC,CACA,IAAI,YAAY,IAEE,CAAA,CAAK,KAAK,QAAQ;EACrC,IAAI,OAAO,IAAI,SAAS,UACtB,MAAM,IAAI,aAAa,2CAA2C,kBAAkB;EAEtF,IAAI;GACF,OAAO;IAAE;IAAK,MAAM,eAAe,MAAM,IAAI,IAAI;GAAE;EACrD,QAAQ;GACN,MAAM,IAAI,aACR,0CAA0C,KAAK,UAAU,IAAI,IAAI,EAAE,IACnE,kBACF;EACF;CACF,CAAC;CACD,MAAM,uBAAO,IAAI,IAAY;CAC7B,KAAK,MAAM,EAAE,SAAS,cAAc;EAClC,MAAM,MAAM,IAAI,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,QAAQ,SAAS,EAAE;EAC9D,IACE,CAAC,GAAG,IAAI,CAAC,CAAC,MACP,aACC,QAAQ,YAAY,IAAI,WAAW,GAAG,SAAS,EAAE,KAAK,SAAS,WAAW,GAAG,IAAI,EAAE,CACvF,GAEA,MAAM,IAAI,aAAa,2CAA2C,kBAAkB;EAEtF,KAAK,IAAI,GAAG;CACd;CAEA,KAAK,MAAM,SAAS,YAAY,MAAM,EAAE,eAAe,KAAK,CAAC,GAC3D,OAAO,KAAK,MAAM,MAAM,IAAI,GAAG;EAAE,WAAW;EAAM,OAAO;CAAK,CAAC;CAGjE,KAAK,MAAM,EAAE,KAAK,UAAU,cAAc;EACxC,UAAU,QAAQ,IAAI,GAAG;GAAE,WAAW;GAAM,MAAM;EAAM,CAAC;EAIzD,cAAc,MAHF,OAAO,SAAS,IAAI,OAAO,IACnC,IAAI,UACJ,OAAO,KAAK,IAAI,OAAiC,GAC5B,EAAE,MAAM,IAAM,CAAC;CAC1C;AACF"}
@@ -0,0 +1,68 @@
1
+ import type { Account, AccountMeta, AccountProxyConfig } from '../types.js';
2
+ import type { AnyPickDatabase } from './db.js';
3
+ export interface ProxyRuntimeState {
4
+ accountName: string;
5
+ endpoint: string;
6
+ compatibility?: string;
7
+ pid?: number;
8
+ logPath?: string;
9
+ startedAt: string;
10
+ /**
11
+ * Per-instance high-entropy secret (PROXY-01) required on every credentialed
12
+ * route. Persisted owner-only in proxy_state; never surfaced in status/doctor.
13
+ */
14
+ token?: string;
15
+ }
16
+ /**
17
+ * SQLite-backed account store.
18
+ *
19
+ * Structured data lives in ~/.anypick/anypick.db.
20
+ * Snapshot bytes are BLOBs; they are materialized to a cache dir when
21
+ * providers need a real filesystem path for backup/restore.
22
+ * Proxy pid/log runtime stays on disk (process-local).
23
+ */
24
+ export declare class AccountStore {
25
+ readonly root: string;
26
+ readonly db: AnyPickDatabase;
27
+ constructor(root: string, db: AnyPickDatabase);
28
+ ensureProvider(_providerId: string): Promise<void>;
29
+ listAccounts(providerId: string): Promise<Account[]>;
30
+ getAccount(providerId: string, name: string): Promise<Account | null>;
31
+ requireAccount(providerId: string, name: string): Promise<Account>;
32
+ /**
33
+ * Prepare an empty snapshot directory for writing a new/updated account.
34
+ * Caller fills the snapshot (provider.backup / import), THEN calls
35
+ * `writeMeta`, which atomically replaces the
36
+ * snapshot's DB rows + metadata.
37
+ *
38
+ * NOTE: prepareSnapshot must NOT delete the existing snapshot's DB rows —
39
+ * doing so before backup succeeds would destroy the previous snapshot on a
40
+ * fault (DATA-01). The previous rows are replaced only inside
41
+ * `writeMeta` transaction.
42
+ */
43
+ prepareSnapshot(providerId: string, name: string): Promise<{
44
+ snapshotDir: string;
45
+ accountDir: string;
46
+ }>;
47
+ /**
48
+ * Atomically replace an account's metadata + snapshot files in one
49
+ * transaction. Callers MUST fill `snapshotDir` (via provider.backup or import)
50
+ * before calling. Any throw leaves the previous rows + metadata exactly as
51
+ * they were (DATA-01): the old snapshot files are deleted and re-ingested
52
+ * together, never partially.
53
+ */
54
+ writeMeta(meta: AccountMeta): Promise<void>;
55
+ getProxyConfig(providerId: string, name: string): Promise<AccountProxyConfig>;
56
+ setProxyConfig(providerId: string, name: string, config: AccountProxyConfig): Promise<void>;
57
+ runtimeDir(providerId: string, name: string): string;
58
+ pidPath(providerId: string, name: string): string;
59
+ logPath(providerId: string, name: string): string;
60
+ writeProxyState(providerId: string, name: string, state: ProxyRuntimeState): Promise<void>;
61
+ readProxyState(providerId: string, name: string): Promise<ProxyRuntimeState | null>;
62
+ clearProxyState(providerId: string, name: string): Promise<void>;
63
+ deleteAccount(providerId: string, name: string): Promise<void>;
64
+ getActive(providerId: string): Promise<string | null>;
65
+ setActive(providerId: string, name: string): Promise<void>;
66
+ clearActive(providerId: string): Promise<void>;
67
+ }
68
+ //# sourceMappingURL=store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../../src/core/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,159 @@
1
+ import { DEFAULT_PROXY_CONFIG } from "../types/account.js";
2
+ import { AnyPickError } from "../utils/errors.js";
3
+ import { ensureDir, removePath } from "../utils/fs.js";
4
+ import { decodeWithFallback, decoders } from "./codec.js";
5
+ import { accountDir, accountProxyRuntimeDir, accountSnapshotDir, getAnyPickRoot, proxyLogPath, proxyPidPath } from "./paths.js";
6
+ import { ingestSnapshotDir, materializeSnapshot, rowToAccount } from "./store-snapshot.js";
7
+ import { readdirSync, rmSync } from "node:fs";
8
+ import { join } from "node:path";
9
+ //#region src/core/store.ts
10
+ /**
11
+ * SQLite-backed account store.
12
+ *
13
+ * Structured data lives in ~/.anypick/anypick.db.
14
+ * Snapshot bytes are BLOBs; they are materialized to a cache dir when
15
+ * providers need a real filesystem path for backup/restore.
16
+ * Proxy pid/log runtime stays on disk (process-local).
17
+ */
18
+ var AccountStore = class {
19
+ root;
20
+ db;
21
+ constructor(root, db) {
22
+ this.root = getAnyPickRoot(root);
23
+ this.db = db;
24
+ }
25
+ async ensureProvider(_providerId) {}
26
+ async listAccounts(providerId) {
27
+ return this.db.prepare(`SELECT name, meta_json, proxy_json FROM accounts
28
+ WHERE provider = ?
29
+ AND EXISTS (
30
+ SELECT 1 FROM account_snapshot_files
31
+ WHERE account_snapshot_files.provider = accounts.provider
32
+ AND account_snapshot_files.account = accounts.name
33
+ )
34
+ ORDER BY name`).all(providerId).map((row) => rowToAccount(this.root, providerId, row));
35
+ }
36
+ async getAccount(providerId, name) {
37
+ const row = this.db.prepare(`SELECT name, meta_json, proxy_json FROM accounts
38
+ WHERE provider = ? AND name = ?
39
+ AND EXISTS (
40
+ SELECT 1 FROM account_snapshot_files
41
+ WHERE account_snapshot_files.provider = accounts.provider
42
+ AND account_snapshot_files.account = accounts.name
43
+ )`).get(providerId, name);
44
+ if (!row) return null;
45
+ const account = rowToAccount(this.root, providerId, row);
46
+ materializeSnapshot(this.root, this.db, providerId, name);
47
+ return account;
48
+ }
49
+ async requireAccount(providerId, name) {
50
+ const account = await this.getAccount(providerId, name);
51
+ if (!account) throw new AnyPickError(`No account "${name}" for provider "${providerId}".`, "ACCOUNT_NOT_FOUND");
52
+ return account;
53
+ }
54
+ /**
55
+ * Prepare an empty snapshot directory for writing a new/updated account.
56
+ * Caller fills the snapshot (provider.backup / import), THEN calls
57
+ * `writeMeta`, which atomically replaces the
58
+ * snapshot's DB rows + metadata.
59
+ *
60
+ * NOTE: prepareSnapshot must NOT delete the existing snapshot's DB rows —
61
+ * doing so before backup succeeds would destroy the previous snapshot on a
62
+ * fault (DATA-01). The previous rows are replaced only inside
63
+ * `writeMeta` transaction.
64
+ */
65
+ async prepareSnapshot(providerId, name) {
66
+ const snap = accountSnapshotDir(this.root, providerId, name);
67
+ await ensureDir(snap);
68
+ for (const entry of readdirSync(snap, { withFileTypes: true })) rmSync(join(snap, entry.name), {
69
+ recursive: true,
70
+ force: true
71
+ });
72
+ return {
73
+ snapshotDir: snap,
74
+ accountDir: accountDir(this.root, providerId, name)
75
+ };
76
+ }
77
+ /**
78
+ * Atomically replace an account's metadata + snapshot files in one
79
+ * transaction. Callers MUST fill `snapshotDir` (via provider.backup or import)
80
+ * before calling. Any throw leaves the previous rows + metadata exactly as
81
+ * they were (DATA-01): the old snapshot files are deleted and re-ingested
82
+ * together, never partially.
83
+ */
84
+ async writeMeta(meta) {
85
+ const now = meta.updatedAt || (/* @__PURE__ */ new Date()).toISOString();
86
+ const snap = accountSnapshotDir(this.root, meta.provider, meta.name);
87
+ this.db.transaction(() => {
88
+ const existing = this.db.prepare(`SELECT proxy_json, created_at FROM accounts WHERE provider = ? AND name = ?`).get(meta.provider, meta.name);
89
+ const proxyJson = existing?.proxy_json ?? JSON.stringify(DEFAULT_PROXY_CONFIG);
90
+ const createdAt = existing?.created_at ?? meta.createdAt ?? now;
91
+ this.db.prepare(`INSERT INTO accounts (provider, name, meta_json, proxy_json, created_at, updated_at)
92
+ VALUES (?, ?, ?, ?, ?, ?)
93
+ ON CONFLICT(provider, name) DO UPDATE SET
94
+ meta_json = excluded.meta_json,
95
+ updated_at = excluded.updated_at`).run(meta.provider, meta.name, JSON.stringify({
96
+ ...meta,
97
+ updatedAt: now
98
+ }), proxyJson, createdAt, now);
99
+ this.db.prepare(`DELETE FROM account_snapshot_files WHERE provider = ? AND account = ?`).run(meta.provider, meta.name);
100
+ ingestSnapshotDir(this.db, meta.provider, meta.name, snap);
101
+ });
102
+ }
103
+ async getProxyConfig(providerId, name) {
104
+ const row = this.db.prepare(`SELECT proxy_json FROM accounts WHERE provider = ? AND name = ?`).get(providerId, name);
105
+ if (!row) return { ...DEFAULT_PROXY_CONFIG };
106
+ return decodeWithFallback(row.proxy_json, decoders.accountProxyConfig, { ...DEFAULT_PROXY_CONFIG }, `${providerId}/${name}`);
107
+ }
108
+ async setProxyConfig(providerId, name, config) {
109
+ await this.requireAccount(providerId, name);
110
+ this.db.prepare(`UPDATE accounts SET proxy_json = ?, updated_at = ? WHERE provider = ? AND name = ?`).run(JSON.stringify(config), (/* @__PURE__ */ new Date()).toISOString(), providerId, name);
111
+ }
112
+ runtimeDir(providerId, name) {
113
+ return accountProxyRuntimeDir(this.root, providerId, name);
114
+ }
115
+ pidPath(providerId, name) {
116
+ return proxyPidPath(this.root, providerId, name);
117
+ }
118
+ logPath(providerId, name) {
119
+ return proxyLogPath(this.root, providerId, name);
120
+ }
121
+ async writeProxyState(providerId, name, state) {
122
+ this.db.prepare(`INSERT INTO proxy_state (provider, account, state_json)
123
+ VALUES (?, ?, ?)
124
+ ON CONFLICT(provider, account) DO UPDATE SET state_json = excluded.state_json`).run(providerId, name, JSON.stringify(state));
125
+ }
126
+ async readProxyState(providerId, name) {
127
+ const row = this.db.prepare(`SELECT state_json FROM proxy_state WHERE provider = ? AND account = ?`).get(providerId, name);
128
+ if (!row) return null;
129
+ return decodeWithFallback(row.state_json, decoders.proxyRuntimeState, null, `${providerId}/${name}`);
130
+ }
131
+ async clearProxyState(providerId, name) {
132
+ this.db.prepare(`DELETE FROM proxy_state WHERE provider = ? AND account = ?`).run(providerId, name);
133
+ }
134
+ async deleteAccount(providerId, name) {
135
+ if (!this.db.transaction(() => {
136
+ if (this.db.prepare(`DELETE FROM accounts WHERE provider = ? AND name = ?`).run(providerId, name).changes === 0) return false;
137
+ this.db.prepare(`DELETE FROM proxy_state WHERE provider = ? AND account = ?`).run(providerId, name);
138
+ return true;
139
+ })) throw new AnyPickError(`No account "${name}" for provider "${providerId}".`, "ACCOUNT_NOT_FOUND");
140
+ await removePath(accountSnapshotDir(this.root, providerId, name));
141
+ await removePath(accountDir(this.root, providerId, name));
142
+ if (await this.getActive(providerId) === name) await this.clearActive(providerId);
143
+ }
144
+ async getActive(providerId) {
145
+ return this.db.prepare(`SELECT account_name FROM provider_active WHERE provider = ?`).get(providerId)?.account_name ?? null;
146
+ }
147
+ async setActive(providerId, name) {
148
+ this.db.prepare(`INSERT INTO provider_active (provider, account_name)
149
+ VALUES (?, ?)
150
+ ON CONFLICT(provider) DO UPDATE SET account_name = excluded.account_name`).run(providerId, name);
151
+ }
152
+ async clearActive(providerId) {
153
+ this.db.prepare(`DELETE FROM provider_active WHERE provider = ?`).run(providerId);
154
+ }
155
+ };
156
+ //#endregion
157
+ export { AccountStore };
158
+
159
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","names":[],"sources":["../../src/core/store.ts"],"sourcesContent":["import { readdirSync, rmSync } from 'node:fs';\nimport { join } from 'node:path';\nimport type { Account, AccountMeta, AccountProxyConfig } from '../types';\nimport { DEFAULT_PROXY_CONFIG } from '../types';\nimport { AnyPickError } from '../utils/errors';\nimport { ensureDir, removePath } from '../utils/fs';\nimport { decodeWithFallback, decoders } from './codec';\nimport type { AnyPickDatabase } from './db';\nimport {\n accountDir,\n accountProxyRuntimeDir,\n accountSnapshotDir,\n getAnyPickRoot,\n proxyLogPath,\n proxyPidPath,\n} from './paths';\nimport { ingestSnapshotDir, materializeSnapshot, rowToAccount } from './store-snapshot';\n\nexport interface ProxyRuntimeState {\n accountName: string;\n endpoint: string;\n compatibility?: string;\n pid?: number;\n logPath?: string;\n startedAt: string;\n /**\n * Per-instance high-entropy secret (PROXY-01) required on every credentialed\n * route. Persisted owner-only in proxy_state; never surfaced in status/doctor.\n */\n token?: string;\n}\n\n/**\n * SQLite-backed account store.\n *\n * Structured data lives in ~/.anypick/anypick.db.\n * Snapshot bytes are BLOBs; they are materialized to a cache dir when\n * providers need a real filesystem path for backup/restore.\n * Proxy pid/log runtime stays on disk (process-local).\n */\nexport class AccountStore {\n readonly root: string;\n readonly db: AnyPickDatabase;\n\n constructor(root: string, db: AnyPickDatabase) {\n this.root = getAnyPickRoot(root);\n this.db = db;\n }\n\n async ensureProvider(_providerId: string): Promise<void> {\n // No-op: SQLite has no per-provider directories to create.\n }\n\n async listAccounts(providerId: string): Promise<Account[]> {\n const rows = this.db\n .prepare(\n `SELECT name, meta_json, proxy_json FROM accounts\n WHERE provider = ?\n AND EXISTS (\n SELECT 1 FROM account_snapshot_files\n WHERE account_snapshot_files.provider = accounts.provider\n AND account_snapshot_files.account = accounts.name\n )\n ORDER BY name`,\n )\n .all(providerId) as Array<{ name: string; meta_json: string; proxy_json: string }>;\n\n return rows.map((row) => rowToAccount(this.root, providerId, row));\n }\n\n async getAccount(providerId: string, name: string): Promise<Account | null> {\n const row = this.db\n .prepare(\n `SELECT name, meta_json, proxy_json FROM accounts\n WHERE provider = ? AND name = ?\n AND EXISTS (\n SELECT 1 FROM account_snapshot_files\n WHERE account_snapshot_files.provider = accounts.provider\n AND account_snapshot_files.account = accounts.name\n )`,\n )\n .get(providerId, name) as { name: string; meta_json: string; proxy_json: string } | undefined;\n if (!row) {\n return null;\n }\n const account = rowToAccount(this.root, providerId, row);\n // Ensure snapshot files are on disk for provider.restore / export\n materializeSnapshot(this.root, this.db, providerId, name);\n return account;\n }\n\n async requireAccount(providerId: string, name: string): Promise<Account> {\n const account = await this.getAccount(providerId, name);\n if (!account) {\n throw new AnyPickError(\n `No account \"${name}\" for provider \"${providerId}\".`,\n 'ACCOUNT_NOT_FOUND',\n );\n }\n return account;\n }\n\n /**\n * Prepare an empty snapshot directory for writing a new/updated account.\n * Caller fills the snapshot (provider.backup / import), THEN calls\n * `writeMeta`, which atomically replaces the\n * snapshot's DB rows + metadata.\n *\n * NOTE: prepareSnapshot must NOT delete the existing snapshot's DB rows —\n * doing so before backup succeeds would destroy the previous snapshot on a\n * fault (DATA-01). The previous rows are replaced only inside\n * `writeMeta` transaction.\n */\n async prepareSnapshot(\n providerId: string,\n name: string,\n ): Promise<{ snapshotDir: string; accountDir: string }> {\n const snap = accountSnapshotDir(this.root, providerId, name);\n await ensureDir(snap);\n // Empty the on-disk materialize cache so the next backup starts fresh.\n // The DB rows (source of truth) are intentionally left intact here — they\n // are replaced only inside writeMeta's transaction, so a fault during\n // backup/describe cannot destroy the previous snapshot (DATA-01).\n for (const entry of readdirSync(snap, { withFileTypes: true })) {\n rmSync(join(snap, entry.name), { recursive: true, force: true });\n }\n return {\n snapshotDir: snap,\n accountDir: accountDir(this.root, providerId, name),\n };\n }\n\n /**\n * Atomically replace an account's metadata + snapshot files in one\n * transaction. Callers MUST fill `snapshotDir` (via provider.backup or import)\n * before calling. Any throw leaves the previous rows + metadata exactly as\n * they were (DATA-01): the old snapshot files are deleted and re-ingested\n * together, never partially.\n */\n async writeMeta(meta: AccountMeta): Promise<void> {\n const now = meta.updatedAt || new Date().toISOString();\n const snap = accountSnapshotDir(this.root, meta.provider, meta.name);\n\n this.db.transaction(() => {\n const existing = this.db\n .prepare(`SELECT proxy_json, created_at FROM accounts WHERE provider = ? AND name = ?`)\n .get(meta.provider, meta.name) as { proxy_json: string; created_at: string } | undefined;\n\n const proxyJson = existing?.proxy_json ?? JSON.stringify(DEFAULT_PROXY_CONFIG);\n const createdAt = existing?.created_at ?? meta.createdAt ?? now;\n\n this.db\n .prepare(\n `INSERT INTO accounts (provider, name, meta_json, proxy_json, created_at, updated_at)\n VALUES (?, ?, ?, ?, ?, ?)\n ON CONFLICT(provider, name) DO UPDATE SET\n meta_json = excluded.meta_json,\n updated_at = excluded.updated_at`,\n )\n .run(\n meta.provider,\n meta.name,\n JSON.stringify({ ...meta, updatedAt: now }),\n proxyJson,\n createdAt,\n now,\n );\n\n // Delete + re-ingest snapshot files atomically so a partial write cannot\n // strand old rows.\n this.db\n .prepare(`DELETE FROM account_snapshot_files WHERE provider = ? AND account = ?`)\n .run(meta.provider, meta.name);\n ingestSnapshotDir(this.db, meta.provider, meta.name, snap);\n });\n }\n\n async getProxyConfig(providerId: string, name: string): Promise<AccountProxyConfig> {\n const row = this.db\n .prepare(`SELECT proxy_json FROM accounts WHERE provider = ? AND name = ?`)\n .get(providerId, name) as { proxy_json: string } | undefined;\n if (!row) {\n return { ...DEFAULT_PROXY_CONFIG };\n }\n return decodeWithFallback(\n row.proxy_json,\n decoders.accountProxyConfig,\n {\n ...DEFAULT_PROXY_CONFIG,\n },\n `${providerId}/${name}`,\n );\n }\n\n async setProxyConfig(\n providerId: string,\n name: string,\n config: AccountProxyConfig,\n ): Promise<void> {\n await this.requireAccount(providerId, name);\n this.db\n .prepare(`UPDATE accounts SET proxy_json = ?, updated_at = ? WHERE provider = ? AND name = ?`)\n .run(JSON.stringify(config), new Date().toISOString(), providerId, name);\n }\n\n runtimeDir(providerId: string, name: string): string {\n return accountProxyRuntimeDir(this.root, providerId, name);\n }\n\n pidPath(providerId: string, name: string): string {\n return proxyPidPath(this.root, providerId, name);\n }\n\n logPath(providerId: string, name: string): string {\n return proxyLogPath(this.root, providerId, name);\n }\n\n async writeProxyState(providerId: string, name: string, state: ProxyRuntimeState): Promise<void> {\n this.db\n .prepare(\n `INSERT INTO proxy_state (provider, account, state_json)\n VALUES (?, ?, ?)\n ON CONFLICT(provider, account) DO UPDATE SET state_json = excluded.state_json`,\n )\n .run(providerId, name, JSON.stringify(state));\n }\n\n async readProxyState(providerId: string, name: string): Promise<ProxyRuntimeState | null> {\n const row = this.db\n .prepare(`SELECT state_json FROM proxy_state WHERE provider = ? AND account = ?`)\n .get(providerId, name) as { state_json: string } | undefined;\n if (!row) {\n return null;\n }\n return decodeWithFallback(\n row.state_json,\n decoders.proxyRuntimeState,\n null as ProxyRuntimeState | null,\n `${providerId}/${name}`,\n );\n }\n\n async clearProxyState(providerId: string, name: string): Promise<void> {\n this.db\n .prepare(`DELETE FROM proxy_state WHERE provider = ? AND account = ?`)\n .run(providerId, name);\n }\n\n async deleteAccount(providerId: string, name: string): Promise<void> {\n const deleted = this.db.transaction(() => {\n const result = this.db\n .prepare(`DELETE FROM accounts WHERE provider = ? AND name = ?`)\n .run(providerId, name);\n if (result.changes === 0) {\n return false;\n }\n this.db\n .prepare(`DELETE FROM proxy_state WHERE provider = ? AND account = ?`)\n .run(providerId, name);\n return true;\n });\n if (!deleted) {\n throw new AnyPickError(\n `No account \"${name}\" for provider \"${providerId}\".`,\n 'ACCOUNT_NOT_FOUND',\n );\n }\n\n // Clear materialize cache (best-effort; DB state already consistent)\n const snap = accountSnapshotDir(this.root, providerId, name);\n await removePath(snap);\n await removePath(accountDir(this.root, providerId, name));\n\n const active = await this.getActive(providerId);\n if (active === name) {\n await this.clearActive(providerId);\n }\n }\n\n async getActive(providerId: string): Promise<string | null> {\n const row = this.db\n .prepare(`SELECT account_name FROM provider_active WHERE provider = ?`)\n .get(providerId) as { account_name: string } | undefined;\n return row?.account_name ?? null;\n }\n\n async setActive(providerId: string, name: string): Promise<void> {\n this.db\n .prepare(\n `INSERT INTO provider_active (provider, account_name)\n VALUES (?, ?)\n ON CONFLICT(provider) DO UPDATE SET account_name = excluded.account_name`,\n )\n .run(providerId, name);\n }\n\n async clearActive(providerId: string): Promise<void> {\n this.db.prepare(`DELETE FROM provider_active WHERE provider = ?`).run(providerId);\n }\n}\n"],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ export interface TrayRuntimeState {
2
+ pid: number;
3
+ ready: boolean;
4
+ proxyCount: number;
5
+ startedAt: string;
6
+ /** SwiftUI on macOS, Tauri on Linux/Windows, or background-only fallback. */
7
+ mode?: 'native' | 'tauri' | 'headless';
8
+ }
9
+ export declare function trayRuntimeDir(root: string): string;
10
+ export declare function trayPidPath(root: string): string;
11
+ export declare function trayLogPath(root: string): string;
12
+ export declare function trayStatePath(root: string): string;
13
+ export declare function runningTrayPid(root: string): Promise<number | null>;
14
+ export declare function readTrayState(root: string): Promise<TrayRuntimeState | null>;
15
+ //# sourceMappingURL=tray-runtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tray-runtime.d.ts","sourceRoot":"","sources":["../../src/core/tray-runtime.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,OAAO,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,QAAQ,GAAG,OAAO,GAAG,UAAU,CAAC;CACxC;AAED,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEnD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAEhD;AAED,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAElD;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAGzE;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC,CAUlF"}
@@ -0,0 +1,33 @@
1
+ import { pathExists, readJsonFile } from "../utils/fs.js";
2
+ import { isProcessRunning, readPidFile } from "../utils/process/pid.js";
3
+ import { join } from "node:path";
4
+ //#region src/core/tray-runtime.ts
5
+ function trayRuntimeDir(root) {
6
+ return join(root, "runtime", "tray");
7
+ }
8
+ function trayPidPath(root) {
9
+ return join(trayRuntimeDir(root), "tray.pid");
10
+ }
11
+ function trayLogPath(root) {
12
+ return join(trayRuntimeDir(root), "tray.log");
13
+ }
14
+ function trayStatePath(root) {
15
+ return join(trayRuntimeDir(root), "state.json");
16
+ }
17
+ async function runningTrayPid(root) {
18
+ const pid = await readPidFile(trayPidPath(root));
19
+ return pid != null && isProcessRunning(pid) ? pid : null;
20
+ }
21
+ async function readTrayState(root) {
22
+ const path = trayStatePath(root);
23
+ if (!await pathExists(path)) return null;
24
+ try {
25
+ return await readJsonFile(path);
26
+ } catch {
27
+ return null;
28
+ }
29
+ }
30
+ //#endregion
31
+ export { readTrayState, runningTrayPid, trayLogPath, trayPidPath, trayRuntimeDir, trayStatePath };
32
+
33
+ //# sourceMappingURL=tray-runtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tray-runtime.js","names":[],"sources":["../../src/core/tray-runtime.ts"],"sourcesContent":["import { join } from 'node:path';\nimport { readJsonFile, pathExists } from '../utils/fs';\nimport { isProcessRunning, readPidFile } from '../utils/process';\n\nexport interface TrayRuntimeState {\n pid: number;\n ready: boolean;\n proxyCount: number;\n startedAt: string;\n /** SwiftUI on macOS, Tauri on Linux/Windows, or background-only fallback. */\n mode?: 'native' | 'tauri' | 'headless';\n}\n\nexport function trayRuntimeDir(root: string): string {\n return join(root, 'runtime', 'tray');\n}\n\nexport function trayPidPath(root: string): string {\n return join(trayRuntimeDir(root), 'tray.pid');\n}\n\nexport function trayLogPath(root: string): string {\n return join(trayRuntimeDir(root), 'tray.log');\n}\n\nexport function trayStatePath(root: string): string {\n return join(trayRuntimeDir(root), 'state.json');\n}\n\nexport async function runningTrayPid(root: string): Promise<number | null> {\n const pid = await readPidFile(trayPidPath(root));\n return pid != null && isProcessRunning(pid) ? pid : null;\n}\n\nexport async function readTrayState(root: string): Promise<TrayRuntimeState | null> {\n const path = trayStatePath(root);\n if (!(await pathExists(path))) {\n return null;\n }\n try {\n return await readJsonFile<TrayRuntimeState>(path);\n } catch {\n return null;\n }\n}\n"],"mappings":";;;;AAaA,SAAgB,eAAe,MAAsB;CACnD,OAAO,KAAK,MAAM,WAAW,MAAM;AACrC;AAEA,SAAgB,YAAY,MAAsB;CAChD,OAAO,KAAK,eAAe,IAAI,GAAG,UAAU;AAC9C;AAEA,SAAgB,YAAY,MAAsB;CAChD,OAAO,KAAK,eAAe,IAAI,GAAG,UAAU;AAC9C;AAEA,SAAgB,cAAc,MAAsB;CAClD,OAAO,KAAK,eAAe,IAAI,GAAG,YAAY;AAChD;AAEA,eAAsB,eAAe,MAAsC;CACzE,MAAM,MAAM,MAAM,YAAY,YAAY,IAAI,CAAC;CAC/C,OAAO,OAAO,QAAQ,iBAAiB,GAAG,IAAI,MAAM;AACtD;AAEA,eAAsB,cAAc,MAAgD;CAClF,MAAM,OAAO,cAAc,IAAI;CAC/B,IAAI,CAAE,MAAM,WAAW,IAAI,GACzB,OAAO;CAET,IAAI;EACF,OAAO,MAAM,aAA+B,IAAI;CAClD,QAAQ;EACN,OAAO;CACT;AACF"}
@@ -0,0 +1,7 @@
1
+ export declare class TraySettingsService {
2
+ private readonly root;
3
+ constructor(root: string);
4
+ launchAtLoginEnabled(): Promise<boolean>;
5
+ setLaunchAtLogin(cliEntry: string, enabled: boolean): Promise<void>;
6
+ }
7
+ //# sourceMappingURL=tray-settings-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tray-settings-service.d.ts","sourceRoot":"","sources":["../../src/core/tray-settings-service.ts"],"names":[],"mappings":"AASA,qBAAa,mBAAmB;IAClB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAAjC,YAA6B,IAAI,EAAE,MAAM,EAAI;IAEvC,oBAAoB,IAAI,OAAO,CAAC,OAAO,CAAC,CAE7C;IAEK,gBAAgB,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC,CAIxE;CACF"}
@@ -0,0 +1,24 @@
1
+ import { withMutationLock } from "./mutation-lock.js";
2
+ import { setTrayLaunchAtLogin, trayLaunchAtLoginEnabled } from "../tray/settings.js";
3
+ //#region src/core/tray-settings-service.ts
4
+ /**
5
+ * Tray-local settings that are not part of the SQLite global config document.
6
+ * Owns the `tray/login-item` mutation scope (ADR 0009).
7
+ */
8
+ var LOGIN_ITEM_SCOPE = "tray/login-item";
9
+ var TraySettingsService = class {
10
+ root;
11
+ constructor(root) {
12
+ this.root = root;
13
+ }
14
+ async launchAtLoginEnabled() {
15
+ return trayLaunchAtLoginEnabled();
16
+ }
17
+ async setLaunchAtLogin(cliEntry, enabled) {
18
+ await withMutationLock(this.root, LOGIN_ITEM_SCOPE, () => setTrayLaunchAtLogin(this.root, cliEntry, enabled));
19
+ }
20
+ };
21
+ //#endregion
22
+ export { TraySettingsService };
23
+
24
+ //# sourceMappingURL=tray-settings-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tray-settings-service.js","names":[],"sources":["../../src/core/tray-settings-service.ts"],"sourcesContent":["/**\n * Tray-local settings that are not part of the SQLite global config document.\n * Owns the `tray/login-item` mutation scope (ADR 0009).\n */\nimport { setTrayLaunchAtLogin, trayLaunchAtLoginEnabled } from '../tray/settings';\nimport { withMutationLock } from './mutation-lock';\n\nconst LOGIN_ITEM_SCOPE = 'tray/login-item';\n\nexport class TraySettingsService {\n constructor(private readonly root: string) {}\n\n async launchAtLoginEnabled(): Promise<boolean> {\n return trayLaunchAtLoginEnabled();\n }\n\n async setLaunchAtLogin(cliEntry: string, enabled: boolean): Promise<void> {\n await withMutationLock(this.root, LOGIN_ITEM_SCOPE, () =>\n setTrayLaunchAtLogin(this.root, cliEntry, enabled),\n );\n }\n}\n"],"mappings":";;;;;;;AAOA,IAAM,mBAAmB;AAEzB,IAAa,sBAAb,MAAiC;CACF;CAA7B,YAAY,MAA+B;EAAd,KAAA,OAAA;CAAe;CAE5C,MAAM,uBAAyC;EAC7C,OAAO,yBAAyB;CAClC;CAEA,MAAM,iBAAiB,UAAkB,SAAiC;EACxE,MAAM,iBAAiB,KAAK,MAAM,wBAChC,qBAAqB,KAAK,MAAM,UAAU,OAAO,CACnD;CACF;AACF"}