@kaitranntt/ccs 8.2.0 → 8.3.0-dev.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (311) hide show
  1. package/README.md +12 -0
  2. package/config/base-claude.settings.json +1 -5
  3. package/dist/api/services/cliproxy-profile-bridge.d.ts.map +1 -1
  4. package/dist/api/services/cliproxy-profile-bridge.js +6 -0
  5. package/dist/api/services/cliproxy-profile-bridge.js.map +1 -1
  6. package/dist/api/services/profile-writer.d.ts.map +1 -1
  7. package/dist/api/services/profile-writer.js +18 -8
  8. package/dist/api/services/profile-writer.js.map +1 -1
  9. package/dist/auth/commands/create-command.d.ts.map +1 -1
  10. package/dist/auth/commands/create-command.js +11 -0
  11. package/dist/auth/commands/create-command.js.map +1 -1
  12. package/dist/cliproxy/accounts/account-safety-cross-lane.d.ts +41 -0
  13. package/dist/cliproxy/accounts/account-safety-cross-lane.d.ts.map +1 -0
  14. package/dist/cliproxy/accounts/account-safety-cross-lane.js +177 -0
  15. package/dist/cliproxy/accounts/account-safety-cross-lane.js.map +1 -0
  16. package/dist/cliproxy/accounts/account-safety.d.ts +29 -1
  17. package/dist/cliproxy/accounts/account-safety.d.ts.map +1 -1
  18. package/dist/cliproxy/accounts/account-safety.js +41 -7
  19. package/dist/cliproxy/accounts/account-safety.js.map +1 -1
  20. package/dist/cliproxy/accounts/drain-order.d.ts +277 -0
  21. package/dist/cliproxy/accounts/drain-order.d.ts.map +1 -0
  22. package/dist/cliproxy/accounts/drain-order.js +575 -0
  23. package/dist/cliproxy/accounts/drain-order.js.map +1 -0
  24. package/dist/cliproxy/accounts/pool-state.d.ts +132 -0
  25. package/dist/cliproxy/accounts/pool-state.d.ts.map +1 -0
  26. package/dist/cliproxy/accounts/pool-state.js +201 -0
  27. package/dist/cliproxy/accounts/pool-state.js.map +1 -0
  28. package/dist/cliproxy/accounts/registry.d.ts +17 -1
  29. package/dist/cliproxy/accounts/registry.d.ts.map +1 -1
  30. package/dist/cliproxy/accounts/registry.js +47 -1
  31. package/dist/cliproxy/accounts/registry.js.map +1 -1
  32. package/dist/cliproxy/accounts/types.d.ts +20 -0
  33. package/dist/cliproxy/accounts/types.d.ts.map +1 -1
  34. package/dist/cliproxy/auth/oauth-handler.d.ts.map +1 -1
  35. package/dist/cliproxy/auth/oauth-handler.js +29 -0
  36. package/dist/cliproxy/auth/oauth-handler.js.map +1 -1
  37. package/dist/cliproxy/binary/platform-detector.d.ts.map +1 -1
  38. package/dist/cliproxy/binary/platform-detector.js +34 -1
  39. package/dist/cliproxy/binary/platform-detector.js.map +1 -1
  40. package/dist/cliproxy/binary/types.d.ts +3 -0
  41. package/dist/cliproxy/binary/types.d.ts.map +1 -1
  42. package/dist/cliproxy/binary/types.js +7 -2
  43. package/dist/cliproxy/binary/types.js.map +1 -1
  44. package/dist/cliproxy/binary/version-cache.d.ts.map +1 -1
  45. package/dist/cliproxy/binary/version-cache.js +4 -0
  46. package/dist/cliproxy/binary/version-cache.js.map +1 -1
  47. package/dist/cliproxy/claude-shadow-warning.d.ts +39 -0
  48. package/dist/cliproxy/claude-shadow-warning.d.ts.map +1 -0
  49. package/dist/cliproxy/claude-shadow-warning.js +187 -0
  50. package/dist/cliproxy/claude-shadow-warning.js.map +1 -0
  51. package/dist/cliproxy/config/base-config-loader.d.ts +6 -5
  52. package/dist/cliproxy/config/base-config-loader.d.ts.map +1 -1
  53. package/dist/cliproxy/config/base-config-loader.js +19 -12
  54. package/dist/cliproxy/config/base-config-loader.js.map +1 -1
  55. package/dist/cliproxy/config/env-builder.d.ts +3 -0
  56. package/dist/cliproxy/config/env-builder.d.ts.map +1 -1
  57. package/dist/cliproxy/config/env-builder.js +158 -20
  58. package/dist/cliproxy/config/env-builder.js.map +1 -1
  59. package/dist/cliproxy/config/generator.d.ts +2 -1
  60. package/dist/cliproxy/config/generator.d.ts.map +1 -1
  61. package/dist/cliproxy/config/generator.js +66 -9
  62. package/dist/cliproxy/config/generator.js.map +1 -1
  63. package/dist/cliproxy/config/thinking-config.d.ts.map +1 -1
  64. package/dist/cliproxy/config/thinking-config.js +2 -0
  65. package/dist/cliproxy/config/thinking-config.js.map +1 -1
  66. package/dist/cliproxy/executor/account-resolution.d.ts.map +1 -1
  67. package/dist/cliproxy/executor/account-resolution.js +5 -0
  68. package/dist/cliproxy/executor/account-resolution.js.map +1 -1
  69. package/dist/cliproxy/executor/auth-coordinator.d.ts +4 -0
  70. package/dist/cliproxy/executor/auth-coordinator.d.ts.map +1 -1
  71. package/dist/cliproxy/executor/auth-coordinator.js +5 -1
  72. package/dist/cliproxy/executor/auth-coordinator.js.map +1 -1
  73. package/dist/cliproxy/executor/index.d.ts.map +1 -1
  74. package/dist/cliproxy/executor/index.js +20 -0
  75. package/dist/cliproxy/executor/index.js.map +1 -1
  76. package/dist/cliproxy/model-catalog.d.ts.map +1 -1
  77. package/dist/cliproxy/model-catalog.js +15 -0
  78. package/dist/cliproxy/model-catalog.js.map +1 -1
  79. package/dist/cliproxy/proxy/upstream-response-timeout.d.ts.map +1 -1
  80. package/dist/cliproxy/proxy/upstream-response-timeout.js +8 -1
  81. package/dist/cliproxy/proxy/upstream-response-timeout.js.map +1 -1
  82. package/dist/cliproxy/quota/quota-fetcher-claude.d.ts +9 -0
  83. package/dist/cliproxy/quota/quota-fetcher-claude.d.ts.map +1 -1
  84. package/dist/cliproxy/quota/quota-fetcher-claude.js +53 -16
  85. package/dist/cliproxy/quota/quota-fetcher-claude.js.map +1 -1
  86. package/dist/cliproxy/quota/quota-fetcher.d.ts.map +1 -1
  87. package/dist/cliproxy/quota/quota-fetcher.js +4 -0
  88. package/dist/cliproxy/quota/quota-fetcher.js.map +1 -1
  89. package/dist/cliproxy/quota/quota-manager.d.ts +7 -0
  90. package/dist/cliproxy/quota/quota-manager.d.ts.map +1 -1
  91. package/dist/cliproxy/quota/quota-manager.js +51 -2
  92. package/dist/cliproxy/quota/quota-manager.js.map +1 -1
  93. package/dist/cliproxy/routing/pool-onboarding-hint.d.ts +95 -0
  94. package/dist/cliproxy/routing/pool-onboarding-hint.d.ts.map +1 -0
  95. package/dist/cliproxy/routing/pool-onboarding-hint.js +172 -0
  96. package/dist/cliproxy/routing/pool-onboarding-hint.js.map +1 -0
  97. package/dist/cliproxy/routing/pool-opt-in-prompt.d.ts +50 -0
  98. package/dist/cliproxy/routing/pool-opt-in-prompt.d.ts.map +1 -0
  99. package/dist/cliproxy/routing/pool-opt-in-prompt.js +232 -0
  100. package/dist/cliproxy/routing/pool-opt-in-prompt.js.map +1 -0
  101. package/dist/cliproxy/routing/routing-strategy.d.ts +132 -0
  102. package/dist/cliproxy/routing/routing-strategy.d.ts.map +1 -1
  103. package/dist/cliproxy/routing/routing-strategy.js +342 -5
  104. package/dist/cliproxy/routing/routing-strategy.js.map +1 -1
  105. package/dist/cliproxy/services/stats-fetcher.d.ts +13 -0
  106. package/dist/cliproxy/services/stats-fetcher.d.ts.map +1 -1
  107. package/dist/cliproxy/services/stats-fetcher.js +25 -1
  108. package/dist/cliproxy/services/stats-fetcher.js.map +1 -1
  109. package/dist/commands/bar/help-subcommand.d.ts +2 -0
  110. package/dist/commands/bar/help-subcommand.d.ts.map +1 -0
  111. package/dist/commands/bar/help-subcommand.js +63 -0
  112. package/dist/commands/bar/help-subcommand.js.map +1 -0
  113. package/dist/commands/bar/index.d.ts +8 -0
  114. package/dist/commands/bar/index.d.ts.map +1 -0
  115. package/dist/commands/bar/index.js +78 -0
  116. package/dist/commands/bar/index.js.map +1 -0
  117. package/dist/commands/bar/install-subcommand.d.ts +92 -0
  118. package/dist/commands/bar/install-subcommand.d.ts.map +1 -0
  119. package/dist/commands/bar/install-subcommand.js +605 -0
  120. package/dist/commands/bar/install-subcommand.js.map +1 -0
  121. package/dist/commands/bar/launch-subcommand.d.ts +64 -0
  122. package/dist/commands/bar/launch-subcommand.d.ts.map +1 -0
  123. package/dist/commands/bar/launch-subcommand.js +236 -0
  124. package/dist/commands/bar/launch-subcommand.js.map +1 -0
  125. package/dist/commands/bar/uninstall-subcommand.d.ts +13 -0
  126. package/dist/commands/bar/uninstall-subcommand.d.ts.map +1 -0
  127. package/dist/commands/bar/uninstall-subcommand.js +78 -0
  128. package/dist/commands/bar/uninstall-subcommand.js.map +1 -0
  129. package/dist/commands/bar/version-subcommand.d.ts +8 -0
  130. package/dist/commands/bar/version-subcommand.d.ts.map +1 -0
  131. package/dist/commands/bar/version-subcommand.js +62 -0
  132. package/dist/commands/bar/version-subcommand.js.map +1 -0
  133. package/dist/commands/cliproxy/help-subcommand.d.ts.map +1 -1
  134. package/dist/commands/cliproxy/help-subcommand.js +20 -1
  135. package/dist/commands/cliproxy/help-subcommand.js.map +1 -1
  136. package/dist/commands/cliproxy/index.d.ts.map +1 -1
  137. package/dist/commands/cliproxy/index.js +20 -0
  138. package/dist/commands/cliproxy/index.js.map +1 -1
  139. package/dist/commands/cliproxy/order-subcommand.d.ts +16 -0
  140. package/dist/commands/cliproxy/order-subcommand.d.ts.map +1 -0
  141. package/dist/commands/cliproxy/order-subcommand.js +520 -0
  142. package/dist/commands/cliproxy/order-subcommand.js.map +1 -0
  143. package/dist/commands/cliproxy/pool-state-renderer.d.ts +40 -0
  144. package/dist/commands/cliproxy/pool-state-renderer.d.ts.map +1 -0
  145. package/dist/commands/cliproxy/pool-state-renderer.js +220 -0
  146. package/dist/commands/cliproxy/pool-state-renderer.js.map +1 -0
  147. package/dist/commands/cliproxy/pool-subcommand.d.ts +10 -0
  148. package/dist/commands/cliproxy/pool-subcommand.d.ts.map +1 -0
  149. package/dist/commands/cliproxy/pool-subcommand.js +112 -0
  150. package/dist/commands/cliproxy/pool-subcommand.js.map +1 -0
  151. package/dist/commands/cliproxy/quota-subcommand.d.ts.map +1 -1
  152. package/dist/commands/cliproxy/quota-subcommand.js +7 -0
  153. package/dist/commands/cliproxy/quota-subcommand.js.map +1 -1
  154. package/dist/commands/cliproxy/routing-subcommand.d.ts.map +1 -1
  155. package/dist/commands/cliproxy/routing-subcommand.js +19 -0
  156. package/dist/commands/cliproxy/routing-subcommand.js.map +1 -1
  157. package/dist/commands/command-catalog.d.ts.map +1 -1
  158. package/dist/commands/command-catalog.js +7 -0
  159. package/dist/commands/command-catalog.js.map +1 -1
  160. package/dist/commands/help-command.d.ts.map +1 -1
  161. package/dist/commands/help-command.js +6 -1
  162. package/dist/commands/help-command.js.map +1 -1
  163. package/dist/commands/root-command-router.d.ts.map +1 -1
  164. package/dist/commands/root-command-router.js +7 -0
  165. package/dist/commands/root-command-router.js.map +1 -1
  166. package/dist/config/loader/yaml-serializer.d.ts.map +1 -1
  167. package/dist/config/loader/yaml-serializer.js +13 -0
  168. package/dist/config/loader/yaml-serializer.js.map +1 -1
  169. package/dist/config/schemas/cliproxy.d.ts +37 -0
  170. package/dist/config/schemas/cliproxy.d.ts.map +1 -1
  171. package/dist/config/schemas/quota.d.ts +26 -2
  172. package/dist/config/schemas/quota.d.ts.map +1 -1
  173. package/dist/config/schemas/quota.js +20 -1
  174. package/dist/config/schemas/quota.js.map +1 -1
  175. package/dist/config/unified-config-loader.d.ts.map +1 -1
  176. package/dist/config/unified-config-loader.js +3 -0
  177. package/dist/config/unified-config-loader.js.map +1 -1
  178. package/dist/dispatcher/flows/account-flow.d.ts.map +1 -1
  179. package/dist/dispatcher/flows/account-flow.js +9 -0
  180. package/dist/dispatcher/flows/account-flow.js.map +1 -1
  181. package/dist/glmt/delta-accumulator.d.ts.map +1 -1
  182. package/dist/glmt/delta-accumulator.js +1 -0
  183. package/dist/glmt/delta-accumulator.js.map +1 -1
  184. package/dist/management/doctor.d.ts.map +1 -1
  185. package/dist/management/doctor.js +10 -0
  186. package/dist/management/doctor.js.map +1 -1
  187. package/dist/proxy/profile-router.d.ts +14 -0
  188. package/dist/proxy/profile-router.d.ts.map +1 -1
  189. package/dist/proxy/profile-router.js +1 -0
  190. package/dist/proxy/profile-router.js.map +1 -1
  191. package/dist/proxy/server/http-helpers.d.ts +5 -0
  192. package/dist/proxy/server/http-helpers.d.ts.map +1 -1
  193. package/dist/proxy/server/http-helpers.js +40 -1
  194. package/dist/proxy/server/http-helpers.js.map +1 -1
  195. package/dist/proxy/server/messages-route.d.ts.map +1 -1
  196. package/dist/proxy/server/messages-route.js +173 -10
  197. package/dist/proxy/server/messages-route.js.map +1 -1
  198. package/dist/proxy/upstream-url.d.ts +42 -2
  199. package/dist/proxy/upstream-url.d.ts.map +1 -1
  200. package/dist/proxy/upstream-url.js +83 -4
  201. package/dist/proxy/upstream-url.js.map +1 -1
  202. package/dist/ui/assets/{Trans-DsGR5Bhb.js → Trans-RG_sMDEu.js} +1 -1
  203. package/dist/ui/assets/accounts-yTXURc-q.js +1 -0
  204. package/dist/ui/assets/{alert-dialog-Do0XfN46.js → alert-dialog-DjvPgzFs.js} +1 -1
  205. package/dist/ui/assets/{api-B7OYas_V.js → api-Ck1dtNEM.js} +3 -3
  206. package/dist/ui/assets/{auth-section-BmTeNetL.js → auth-section-DBnY_LPz.js} +1 -1
  207. package/dist/ui/assets/{backups-section-COawLfTr.js → backups-section-Ci-uL4Of.js} +1 -1
  208. package/dist/ui/assets/{channels-C9LVYmNJ.js → channels-BeS9O5q0.js} +1 -1
  209. package/dist/ui/assets/{checkbox-BkFzg8C-.js → checkbox-DFeFDZBp.js} +1 -1
  210. package/dist/ui/assets/{claude-extension-Ch7L4lTF.js → claude-extension-DS5qN19Z.js} +1 -1
  211. package/dist/ui/assets/{cliproxy-B3uWt6gn.js → cliproxy-D7HJH4mZ.js} +1 -1
  212. package/dist/ui/assets/{cliproxy-ai-providers-Bn1_AdKD.js → cliproxy-ai-providers-oJQZXrtc.js} +1 -1
  213. package/dist/ui/assets/{cliproxy-control-panel-DC4pOOfY.js → cliproxy-control-panel-2mRPEcRj.js} +1 -1
  214. package/dist/ui/assets/codex-D0AUQ6jA.js +30 -0
  215. package/dist/ui/assets/{confirm-dialog-4rb-E8-R.js → confirm-dialog-B37-CVuq.js} +1 -1
  216. package/dist/ui/assets/{copilot-zgPXNkMw.js → copilot-KaaW-mko.js} +2 -2
  217. package/dist/ui/assets/{cursor-lRPpppk-.js → cursor-BKiTgYi5.js} +1 -1
  218. package/dist/ui/assets/{droid-koOj34SB.js → droid-DHdqGnFw.js} +2 -2
  219. package/dist/ui/assets/{globalenv-section-jOkPVwvN.js → globalenv-section-SfZO97nU.js} +1 -1
  220. package/dist/ui/assets/health-CSRS9O0D.js +1 -0
  221. package/dist/ui/assets/icons-DSLG1YsC.js +1 -0
  222. package/dist/ui/assets/{index-D7crOfea.js → index-CGgavq2X.js} +37 -37
  223. package/dist/ui/assets/{index-BLC5PyZn.js → index-ChTYEBCZ.js} +1 -1
  224. package/dist/ui/assets/index-Cu_F55_O.js +1 -0
  225. package/dist/ui/assets/{index-CRhKyfnS.js → index-DJ66NrBH.js} +1 -1
  226. package/dist/ui/assets/index-DWUuSBUe.js +1 -0
  227. package/dist/ui/assets/{index-BK-PSsqi.js → index-DycwEe96.js} +1 -1
  228. package/dist/ui/assets/index-DzFlVVV3.css +1 -0
  229. package/dist/ui/assets/{index-De3yNJ94.js → index-iQuEEGbH.js} +1 -1
  230. package/dist/ui/assets/{logs-BplpQHRb.js → logs-tiZ_51mo.js} +1 -1
  231. package/dist/ui/assets/{masked-input-DuLL3EwS.js → masked-input-D9FVoeMA.js} +1 -1
  232. package/dist/ui/assets/proxy-status-widget-2k26d8pS.js +1 -0
  233. package/dist/ui/assets/{raw-json-settings-editor-panel-ClPqZ6iZ.js → raw-json-settings-editor-panel-CguBh93H.js} +1 -1
  234. package/dist/ui/assets/{searchable-select-BH1b065u.js → searchable-select-C4wShshD.js} +1 -1
  235. package/dist/ui/assets/{separator-BOiJ0l4s.js → separator-mvGlDdEW.js} +1 -1
  236. package/dist/ui/assets/{shared-CunXigZu.js → shared-Ck0yAwbs.js} +1 -1
  237. package/dist/ui/assets/{table-C7ysR1Xz.js → table-DrUJOxKL.js} +1 -1
  238. package/dist/ui/assets/updates-BVHBFcq8.js +1 -0
  239. package/dist/ui/assets/{use-accounts-CwRU3ln9.js → use-accounts-DLtuaniS.js} +1 -1
  240. package/dist/ui/index.html +3 -3
  241. package/dist/utils/browser/mcp-installer.d.ts.map +1 -1
  242. package/dist/utils/browser/mcp-installer.js +5 -34
  243. package/dist/utils/browser/mcp-installer.js.map +1 -1
  244. package/dist/utils/claude-user-config-lock.d.ts +9 -0
  245. package/dist/utils/claude-user-config-lock.d.ts.map +1 -0
  246. package/dist/utils/claude-user-config-lock.js +96 -0
  247. package/dist/utils/claude-user-config-lock.js.map +1 -0
  248. package/dist/utils/image-analysis/mcp-installer.d.ts.map +1 -1
  249. package/dist/utils/image-analysis/mcp-installer.js +5 -34
  250. package/dist/utils/image-analysis/mcp-installer.js.map +1 -1
  251. package/dist/utils/websearch/mcp-installer.d.ts.map +1 -1
  252. package/dist/utils/websearch/mcp-installer.js +112 -78
  253. package/dist/utils/websearch/mcp-installer.js.map +1 -1
  254. package/dist/web-server/model-pricing.d.ts.map +1 -1
  255. package/dist/web-server/model-pricing.js +7 -0
  256. package/dist/web-server/model-pricing.js.map +1 -1
  257. package/dist/web-server/routes/account-routes.d.ts.map +1 -1
  258. package/dist/web-server/routes/account-routes.js +116 -0
  259. package/dist/web-server/routes/account-routes.js.map +1 -1
  260. package/dist/web-server/routes/bar-routes.d.ts +149 -0
  261. package/dist/web-server/routes/bar-routes.d.ts.map +1 -0
  262. package/dist/web-server/routes/bar-routes.js +415 -0
  263. package/dist/web-server/routes/bar-routes.js.map +1 -0
  264. package/dist/web-server/routes/index.d.ts.map +1 -1
  265. package/dist/web-server/routes/index.js +18 -0
  266. package/dist/web-server/routes/index.js.map +1 -1
  267. package/dist/web-server/usage/bar-analytics.d.ts +101 -0
  268. package/dist/web-server/usage/bar-analytics.d.ts.map +1 -0
  269. package/dist/web-server/usage/bar-analytics.js +315 -0
  270. package/dist/web-server/usage/bar-analytics.js.map +1 -0
  271. package/dist/web-server/usage/claude-native-credentials.d.ts +56 -0
  272. package/dist/web-server/usage/claude-native-credentials.d.ts.map +1 -0
  273. package/dist/web-server/usage/claude-native-credentials.js +140 -0
  274. package/dist/web-server/usage/claude-native-credentials.js.map +1 -0
  275. package/dist/web-server/usage/cliproxy-snapshot-reader.d.ts +24 -0
  276. package/dist/web-server/usage/cliproxy-snapshot-reader.d.ts.map +1 -0
  277. package/dist/web-server/usage/cliproxy-snapshot-reader.js +82 -0
  278. package/dist/web-server/usage/cliproxy-snapshot-reader.js.map +1 -0
  279. package/dist/web-server/usage/cliproxy-usage-syncer.d.ts +3 -2
  280. package/dist/web-server/usage/cliproxy-usage-syncer.d.ts.map +1 -1
  281. package/dist/web-server/usage/cliproxy-usage-syncer.js +14 -2
  282. package/dist/web-server/usage/cliproxy-usage-syncer.js.map +1 -1
  283. package/dist/web-server/usage/cliproxy-usage-transformer.d.ts +8 -1
  284. package/dist/web-server/usage/cliproxy-usage-transformer.d.ts.map +1 -1
  285. package/dist/web-server/usage/cliproxy-usage-transformer.js +31 -4
  286. package/dist/web-server/usage/cliproxy-usage-transformer.js.map +1 -1
  287. package/dist/web-server/usage/codex-local-quota-collector.d.ts +74 -0
  288. package/dist/web-server/usage/codex-local-quota-collector.d.ts.map +1 -0
  289. package/dist/web-server/usage/codex-local-quota-collector.js +250 -0
  290. package/dist/web-server/usage/codex-local-quota-collector.js.map +1 -0
  291. package/dist/web-server/usage/data-aggregator.d.ts +11 -0
  292. package/dist/web-server/usage/data-aggregator.d.ts.map +1 -1
  293. package/dist/web-server/usage/data-aggregator.js +29 -1
  294. package/dist/web-server/usage/data-aggregator.js.map +1 -1
  295. package/dist/web-server/usage/native-quota-collector.d.ts +44 -0
  296. package/dist/web-server/usage/native-quota-collector.d.ts.map +1 -0
  297. package/dist/web-server/usage/native-quota-collector.js +378 -0
  298. package/dist/web-server/usage/native-quota-collector.js.map +1 -0
  299. package/dist/web-server/usage/types.d.ts +2 -0
  300. package/dist/web-server/usage/types.d.ts.map +1 -1
  301. package/package.json +1 -1
  302. package/scripts/run-test-bucket.js +183 -17
  303. package/dist/ui/assets/accounts-DHBmHeH-.js +0 -1
  304. package/dist/ui/assets/codex-CcODhykP.js +0 -30
  305. package/dist/ui/assets/health-CxHauE3Y.js +0 -1
  306. package/dist/ui/assets/icons-DzKUh8vG.js +0 -1
  307. package/dist/ui/assets/index-DOfPoKe_.css +0 -1
  308. package/dist/ui/assets/index-DUGnoURR.js +0 -1
  309. package/dist/ui/assets/index-I_ek1xyD.js +0 -1
  310. package/dist/ui/assets/proxy-status-widget-BruRPTSl.js +0 -1
  311. package/dist/ui/assets/updates-BtBCV2xk.js +0 -1
@@ -0,0 +1,575 @@
1
+ "use strict";
2
+ /**
3
+ * Drain Order Management
4
+ *
5
+ * Manages CLIProxy account drain order via top-level "priority" field in auth JSONs.
6
+ *
7
+ * Architecture:
8
+ * - Priority >= 1 always (management layer treats 0 as delete-the-attribute)
9
+ * - Write path is dual: management API when proxy running, direct file when stopped
10
+ * - Tier-aware defaults only where AccountTier metadata exists (agy/gemini)
11
+ * - Claude pools: tier is unknown -> stable file order + manual --set required
12
+ * - Selector drain order: priority bucket desc, then Auth.ID asc
13
+ */
14
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
15
+ if (k2 === undefined) k2 = k;
16
+ var desc = Object.getOwnPropertyDescriptor(m, k);
17
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
18
+ desc = { enumerable: true, get: function() { return m[k]; } };
19
+ }
20
+ Object.defineProperty(o, k2, desc);
21
+ }) : (function(o, m, k, k2) {
22
+ if (k2 === undefined) k2 = k;
23
+ o[k2] = m[k];
24
+ }));
25
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
26
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
27
+ }) : function(o, v) {
28
+ o["default"] = v;
29
+ });
30
+ var __importStar = (this && this.__importStar) || function (mod) {
31
+ if (mod && mod.__esModule) return mod;
32
+ var result = {};
33
+ if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
34
+ __setModuleDefault(result, mod);
35
+ return result;
36
+ };
37
+ Object.defineProperty(exports, "__esModule", { value: true });
38
+ exports.fetchProxyAuthCooldowns = exports.resolveEffectiveDrainOrder = exports.tieBreakKey = exports.annotateCurrentPriorities = exports.applyDrainOrder = exports.clearDrainOrderPriorities = exports.clearAuthFilePriorityDirect = exports.clearAuthFilePriorityViaApi = exports.writeAuthFilePriorityViaApi = exports.writeAuthFilePriorityDirect = exports.readAuthFilePriority = exports.computeTierDrainOrder = exports.computeManualDrainOrder = exports.tierRank = exports.rankToPriority = exports.MIN_PRIORITY = void 0;
39
+ const fs = __importStar(require("fs"));
40
+ const path = __importStar(require("path"));
41
+ const config_generator_1 = require("../config/config-generator");
42
+ const proxy_target_resolver_1 = require("../proxy/proxy-target-resolver");
43
+ const registry_1 = require("./registry");
44
+ /** Minimum valid priority value. Management layer treats 0 as delete. */
45
+ exports.MIN_PRIORITY = 1;
46
+ /** Management API path for patching auth file fields */
47
+ const AUTH_FILES_FIELDS_PATH = '/v0/management/auth-files/fields';
48
+ /** Management API path for listing auth files (and their runtime status). */
49
+ const AUTH_FILES_PATH = '/v0/management/auth-files';
50
+ /** Timeout for management API calls in ms */
51
+ const MGMT_TIMEOUT_MS = 5000;
52
+ /**
53
+ * Tier rank for priority derivation.
54
+ * Higher rank = higher priority = drained first.
55
+ * ultra > pro > free, unknown = no rank (returns undefined).
56
+ */
57
+ const TIER_RANK = {
58
+ ultra: 3,
59
+ pro: 2,
60
+ free: 1,
61
+ };
62
+ /**
63
+ * Compute 1-based priority from a 0-based rank among N accounts.
64
+ * Rank 0 = highest priority = assigned priority N.
65
+ * Rank N-1 = lowest priority = assigned priority 1.
66
+ *
67
+ * Never returns 0 (management layer treats 0 as delete).
68
+ */
69
+ function rankToPriority(rank, total) {
70
+ const raw = total - rank;
71
+ return Math.max(exports.MIN_PRIORITY, raw);
72
+ }
73
+ exports.rankToPriority = rankToPriority;
74
+ /** Tier rank for a known tier, undefined for unknown. */
75
+ function tierRank(tier) {
76
+ if (!tier || tier === 'unknown')
77
+ return undefined;
78
+ return TIER_RANK[tier];
79
+ }
80
+ exports.tierRank = tierRank;
81
+ /**
82
+ * Compute drain order priorities for a list of accounts using manual ordering.
83
+ *
84
+ * @param orderedIds Account IDs in desired drain order (first = highest priority)
85
+ * @param allAccounts All accounts for the provider (some may not be in orderedIds)
86
+ * @returns DrainOrderEntry array ordered by resulting priority desc
87
+ */
88
+ function computeManualDrainOrder(orderedIds, allAccounts) {
89
+ const accountMap = new Map(allAccounts.map((a) => [a.accountId, a]));
90
+ const result = [];
91
+ // Reject duplicate IDs: a repeated account in --set is ambiguous and would
92
+ // otherwise be assigned two different priorities.
93
+ const seen = new Set();
94
+ for (const id of orderedIds) {
95
+ if (seen.has(id)) {
96
+ throw new Error(`Duplicate account ID in order: ${id}`);
97
+ }
98
+ seen.add(id);
99
+ }
100
+ // Validate that all specified IDs exist
101
+ for (const id of orderedIds) {
102
+ if (!accountMap.has(id)) {
103
+ throw new Error(`Account ID not found: ${id}`);
104
+ }
105
+ }
106
+ const specifiedSet = new Set(orderedIds);
107
+ // Use total + 1 so rank (N-1) maps to priority 2, keeping every specified
108
+ // account strictly above the MIN_PRIORITY floor assigned to unspecified ones.
109
+ const total = orderedIds.length + 1;
110
+ // Assign priorities to specified accounts (first = highest priority)
111
+ for (let rank = 0; rank < orderedIds.length; rank++) {
112
+ const id = orderedIds[rank];
113
+ const account = accountMap.get(id);
114
+ if (!account)
115
+ continue;
116
+ result.push({
117
+ accountId: id,
118
+ tokenFile: account.tokenFile,
119
+ priority: rankToPriority(rank, total),
120
+ tier: account.tier,
121
+ tierDerived: false,
122
+ currentPriority: undefined,
123
+ });
124
+ }
125
+ // Remaining accounts not in the specified list get priority 1 (lowest)
126
+ for (const account of allAccounts) {
127
+ if (!specifiedSet.has(account.accountId)) {
128
+ result.push({
129
+ accountId: account.accountId,
130
+ tokenFile: account.tokenFile,
131
+ priority: exports.MIN_PRIORITY,
132
+ tier: account.tier,
133
+ tierDerived: false,
134
+ currentPriority: undefined,
135
+ });
136
+ }
137
+ }
138
+ return result;
139
+ }
140
+ exports.computeManualDrainOrder = computeManualDrainOrder;
141
+ /**
142
+ * Compute drain order priorities for accounts using tier metadata.
143
+ * Only valid where tier metadata exists (agy/gemini providers).
144
+ *
145
+ * Accounts with unknown tier are sorted last (priority MIN_PRIORITY).
146
+ * Accounts within the same tier bucket are given equal priorities.
147
+ *
148
+ * @param accounts Accounts with optional tier metadata
149
+ * @returns DrainOrderEntry array
150
+ */
151
+ function computeTierDrainOrder(accounts) {
152
+ // Group by tier rank
153
+ const withRank = accounts.map((a) => ({
154
+ input: a,
155
+ rank: tierRank(a.tier) ?? 0,
156
+ }));
157
+ // Get unique ranks descending
158
+ const uniqueRanks = [...new Set(withRank.map((x) => x.rank))].sort((a, b) => b - a);
159
+ const numRanks = uniqueRanks.length;
160
+ // Assign priority buckets: highest rank -> highest priority (numRanks), lowest -> MIN_PRIORITY
161
+ const rankToPriorityMap = new Map();
162
+ uniqueRanks.forEach((rank, idx) => {
163
+ // idx 0 = highest rank, gets highest priority
164
+ const priority = Math.max(exports.MIN_PRIORITY, numRanks - idx);
165
+ rankToPriorityMap.set(rank, priority);
166
+ });
167
+ return withRank.map(({ input, rank }) => ({
168
+ accountId: input.accountId,
169
+ tokenFile: input.tokenFile,
170
+ priority: rankToPriorityMap.get(rank) ?? exports.MIN_PRIORITY,
171
+ tier: input.tier,
172
+ tierDerived: rank > 0, // only true when tier contributed a real rank
173
+ currentPriority: undefined,
174
+ }));
175
+ }
176
+ exports.computeTierDrainOrder = computeTierDrainOrder;
177
+ /**
178
+ * Read the current priority from an auth JSON file.
179
+ * Returns undefined if file missing, unreadable, or has no priority field.
180
+ */
181
+ function readAuthFilePriority(tokenFile) {
182
+ try {
183
+ const authDir = (0, config_generator_1.getAuthDir)();
184
+ const filePath = path.join(authDir, tokenFile);
185
+ const content = fs.readFileSync(filePath, 'utf-8');
186
+ const data = JSON.parse(content);
187
+ if (typeof data.priority === 'number' && Number.isFinite(data.priority) && data.priority >= 1) {
188
+ return data.priority;
189
+ }
190
+ return undefined;
191
+ }
192
+ catch {
193
+ return undefined;
194
+ }
195
+ }
196
+ exports.readAuthFilePriority = readAuthFilePriority;
197
+ /**
198
+ * Write priority directly to an auth JSON file (proxy must be stopped).
199
+ * Validates priority >= MIN_PRIORITY before writing.
200
+ * Preserves all other fields; uses atomic temp-rename.
201
+ */
202
+ function writeAuthFilePriorityDirect(tokenFile, priority) {
203
+ if (priority < exports.MIN_PRIORITY) {
204
+ throw new Error(`Priority must be >= ${exports.MIN_PRIORITY}, got ${priority}`);
205
+ }
206
+ const authDir = (0, config_generator_1.getAuthDir)();
207
+ const filePath = path.join(authDir, tokenFile);
208
+ if (!fs.existsSync(filePath)) {
209
+ throw new Error(`Auth file not found: ${tokenFile}`);
210
+ }
211
+ const content = fs.readFileSync(filePath, 'utf-8');
212
+ const data = JSON.parse(content);
213
+ data.priority = priority;
214
+ const tempPath = `${filePath}.tmp.${process.pid}`;
215
+ fs.writeFileSync(tempPath, JSON.stringify(data, null, 2) + '\n', { mode: 0o600 });
216
+ fs.renameSync(tempPath, filePath);
217
+ }
218
+ exports.writeAuthFilePriorityDirect = writeAuthFilePriorityDirect;
219
+ /**
220
+ * Write priority via CLIProxy management API (proxy must be running).
221
+ * Uses PATCH /v0/management/auth-files/fields.
222
+ *
223
+ * @param tokenFile File name (basename, e.g. "antigravity-foo.json")
224
+ * @param priority Priority value >= MIN_PRIORITY
225
+ * @returns true on success, false on failure
226
+ */
227
+ async function writeAuthFilePriorityViaApi(tokenFile, priority) {
228
+ if (priority < exports.MIN_PRIORITY) {
229
+ throw new Error(`Priority must be >= ${exports.MIN_PRIORITY}, got ${priority}`);
230
+ }
231
+ return patchAuthFilePriority(tokenFile, priority);
232
+ }
233
+ exports.writeAuthFilePriorityViaApi = writeAuthFilePriorityViaApi;
234
+ /**
235
+ * Remove the priority attribute via CLIProxy management API (proxy running).
236
+ * Sends PATCH /v0/management/auth-files/fields with priority:0, which the
237
+ * management layer treats as "delete the attribute" (verified upstream:
238
+ * CLIProxyAPIPlus syncAuthFilePriorityAttribute deletes the attribute when the
239
+ * incoming priority is 0 or absent, which then persists the auth file without a
240
+ * top-level priority field).
241
+ *
242
+ * Using the API path is mandatory while the proxy is running: a direct file
243
+ * write would be clobbered by the proxy's whole-file MarkResult persist.
244
+ *
245
+ * @param tokenFile File name (basename, e.g. "antigravity-foo.json")
246
+ * @returns true on success, false on failure
247
+ */
248
+ async function clearAuthFilePriorityViaApi(tokenFile) {
249
+ return patchAuthFilePriority(tokenFile, 0);
250
+ }
251
+ exports.clearAuthFilePriorityViaApi = clearAuthFilePriorityViaApi;
252
+ /** Shared PATCH-fields call for setting (>=1) or clearing (0) a file's priority. */
253
+ async function patchAuthFilePriority(tokenFile, priority) {
254
+ const target = (0, proxy_target_resolver_1.getProxyTarget)();
255
+ const url = (0, proxy_target_resolver_1.buildProxyUrl)(target, AUTH_FILES_FIELDS_PATH);
256
+ const headers = (0, proxy_target_resolver_1.buildManagementHeaders)(target, { 'Content-Type': 'application/json' });
257
+ const body = JSON.stringify({ name: tokenFile, priority });
258
+ const controller = new AbortController();
259
+ const timeoutId = setTimeout(() => controller.abort(), MGMT_TIMEOUT_MS);
260
+ try {
261
+ const response = await fetch(url, {
262
+ method: 'PATCH',
263
+ headers,
264
+ body,
265
+ signal: controller.signal,
266
+ });
267
+ return response.ok;
268
+ }
269
+ catch {
270
+ return false;
271
+ }
272
+ finally {
273
+ clearTimeout(timeoutId);
274
+ }
275
+ }
276
+ /**
277
+ * Remove the priority field directly from an auth JSON file (proxy stopped).
278
+ * No-op (returns false) when the file has no priority field. Preserves all
279
+ * other fields; uses the same atomic temp-rename as writeAuthFilePriorityDirect.
280
+ *
281
+ * @returns true if a priority field was present and removed, false otherwise
282
+ */
283
+ function clearAuthFilePriorityDirect(tokenFile) {
284
+ const authDir = (0, config_generator_1.getAuthDir)();
285
+ const filePath = path.join(authDir, tokenFile);
286
+ if (!fs.existsSync(filePath)) {
287
+ throw new Error(`Auth file not found: ${tokenFile}`);
288
+ }
289
+ const content = fs.readFileSync(filePath, 'utf-8');
290
+ const data = JSON.parse(content);
291
+ if (!('priority' in data)) {
292
+ return false;
293
+ }
294
+ delete data.priority;
295
+ const tempPath = `${filePath}.tmp.${process.pid}`;
296
+ fs.writeFileSync(tempPath, JSON.stringify(data, null, 2) + '\n', { mode: 0o600 });
297
+ fs.renameSync(tempPath, filePath);
298
+ return true;
299
+ }
300
+ exports.clearAuthFilePriorityDirect = clearAuthFilePriorityDirect;
301
+ /**
302
+ * Clear residual on-disk priority fields for the given auth files.
303
+ *
304
+ * Mirrors applyDrainOrder's dual write path:
305
+ * - Proxy running: PATCH priority:0 via the management API (the only safe path;
306
+ * a direct write is clobbered by the proxy's whole-file persist).
307
+ * - Proxy stopped: delete the field directly with an atomic temp-rename.
308
+ *
309
+ * Idempotent: files with no priority field are reported as alreadyClear, not
310
+ * failures. The running path always reports the file as cleared on a 200 (the
311
+ * API treats a missing-attribute delete as a successful no-op), so this is safe
312
+ * to run repeatedly.
313
+ *
314
+ * @param tokenFiles Auth file basenames to clear.
315
+ * @param proxyRunning Whether the proxy is currently running.
316
+ */
317
+ async function clearDrainOrderPriorities(tokenFiles, proxyRunning) {
318
+ const result = {
319
+ cleared: [],
320
+ alreadyClear: [],
321
+ failed: [],
322
+ usedManagementApi: proxyRunning,
323
+ };
324
+ for (const tokenFile of tokenFiles) {
325
+ if (proxyRunning) {
326
+ // Skip the API round-trip when the file already has no priority on disk.
327
+ if (readAuthFilePriority(tokenFile) === undefined) {
328
+ result.alreadyClear.push(tokenFile);
329
+ continue;
330
+ }
331
+ const ok = await clearAuthFilePriorityViaApi(tokenFile);
332
+ if (ok) {
333
+ result.cleared.push(tokenFile);
334
+ }
335
+ else {
336
+ result.failed.push({ tokenFile, reason: 'management API PATCH failed' });
337
+ }
338
+ }
339
+ else {
340
+ try {
341
+ const removed = clearAuthFilePriorityDirect(tokenFile);
342
+ if (removed) {
343
+ result.cleared.push(tokenFile);
344
+ }
345
+ else {
346
+ result.alreadyClear.push(tokenFile);
347
+ }
348
+ }
349
+ catch (err) {
350
+ result.failed.push({ tokenFile, reason: err.message });
351
+ }
352
+ }
353
+ }
354
+ return result;
355
+ }
356
+ exports.clearDrainOrderPriorities = clearDrainOrderPriorities;
357
+ /**
358
+ * Apply drain order priorities to auth files.
359
+ *
360
+ * Write path selection:
361
+ * - Proxy running (HTTP health check passes): use management API
362
+ * - Proxy stopped: direct file write
363
+ *
364
+ * Idempotent: skips entries where priority already equals the target value.
365
+ *
366
+ * @param entries Drain order entries with target priorities
367
+ * @param proxyRunning Whether the proxy is currently running
368
+ * @returns Result summary
369
+ */
370
+ async function applyDrainOrder(entries, proxyRunning) {
371
+ const result = {
372
+ written: [],
373
+ skipped: [],
374
+ failed: [],
375
+ usedManagementApi: proxyRunning,
376
+ };
377
+ for (const entry of entries) {
378
+ // Idempotency: read current value and skip if already set
379
+ const currentPriority = readAuthFilePriority(entry.tokenFile);
380
+ if (currentPriority === entry.priority) {
381
+ result.skipped.push({ ...entry, currentPriority });
382
+ continue;
383
+ }
384
+ if (proxyRunning) {
385
+ const ok = await writeAuthFilePriorityViaApi(entry.tokenFile, entry.priority);
386
+ if (ok) {
387
+ result.written.push({ ...entry, currentPriority });
388
+ }
389
+ else {
390
+ result.failed.push({
391
+ entry: { ...entry, currentPriority },
392
+ reason: 'management API PATCH failed',
393
+ });
394
+ }
395
+ }
396
+ else {
397
+ try {
398
+ writeAuthFilePriorityDirect(entry.tokenFile, entry.priority);
399
+ result.written.push({ ...entry, currentPriority });
400
+ }
401
+ catch (err) {
402
+ result.failed.push({
403
+ entry: { ...entry, currentPriority },
404
+ reason: err.message,
405
+ });
406
+ }
407
+ }
408
+ }
409
+ return result;
410
+ }
411
+ exports.applyDrainOrder = applyDrainOrder;
412
+ /**
413
+ * Read current drain order priorities for a set of accounts.
414
+ * Annotates each DrainOrderEntry with its current priority from disk.
415
+ *
416
+ * @param entries Entries to annotate (modifies currentPriority in-place)
417
+ */
418
+ function annotateCurrentPriorities(entries) {
419
+ for (const entry of entries) {
420
+ entry.currentPriority = readAuthFilePriority(entry.tokenFile);
421
+ }
422
+ }
423
+ exports.annotateCurrentPriorities = annotateCurrentPriorities;
424
+ /**
425
+ * Tie-break key for a token file, matching the upstream Go selector.
426
+ * The selector breaks priority ties by Auth.ID asc. Upstream (synthesizer
427
+ * file.go:120-122) lowercases Auth.ID only on Windows; on other platforms it
428
+ * compares by raw byte order. We mirror that platform-conditional behaviour so
429
+ * the displayed order matches what CLIProxy actually drains.
430
+ *
431
+ * @param platform process.platform; defaults to the current platform. Exposed
432
+ * for tests so non-Windows byte-order behaviour can be asserted deterministically.
433
+ */
434
+ function tieBreakKey(tokenFile, platform = process.platform) {
435
+ return platform === 'win32' ? tokenFile.toLowerCase() : tokenFile;
436
+ }
437
+ exports.tieBreakKey = tieBreakKey;
438
+ /**
439
+ * Resolve the effective drain order for a provider's active (non-paused)
440
+ * accounts, mirroring what `ccs cliproxy accounts order` shows and what the
441
+ * selector actually drains.
442
+ *
443
+ * Semantics (shared by the order subcommand and the quota pool section):
444
+ * 1. Pick the config mode (manual when stored ids still resolve, else tier when
445
+ * stored, else file order).
446
+ * 2. annotateCurrentPriorities() to read the on-disk priority for each account.
447
+ * 3. Sort by currentPriority desc (undefined treated as 0, matching the
448
+ * selector), tie-break by tieBreakKey(tokenFile) asc.
449
+ * 4. Flag drift when the computed config priority != on-disk priority anywhere.
450
+ *
451
+ * File mode never writes priorities, but it still honours any residual on-disk
452
+ * priority the selector reads (e.g. left by `order --reset`): it sorts by that
453
+ * priority desc then tieBreakKey asc, and flags drift when any residual is
454
+ * non-zero. With no residuals all priorities are 0 and it falls back to plain
455
+ * tieBreakKey order with no drift.
456
+ *
457
+ * @param activeAccounts Accounts in rotation (callers exclude paused accounts).
458
+ */
459
+ function resolveEffectiveDrainOrder(provider, activeAccounts) {
460
+ if (activeAccounts.length === 0) {
461
+ return { mode: 'file', entries: [], hasDrift: false };
462
+ }
463
+ const drainCfg = (0, registry_1.loadDrainOrderConfig)(provider);
464
+ // Manual mode is only usable when at least one stored ID still maps to a live
465
+ // account. If every stored ID is stale, fall back to the file-order view.
466
+ let manualValidIds;
467
+ if (drainCfg?.mode === 'manual' && drainCfg.orderedIds && drainCfg.orderedIds.length > 0) {
468
+ const existingIds = new Set(activeAccounts.map((a) => a.accountId));
469
+ manualValidIds = drainCfg.orderedIds.filter((id) => existingIds.has(id));
470
+ }
471
+ let entries;
472
+ let mode;
473
+ if (manualValidIds && manualValidIds.length > 0) {
474
+ entries = computeManualDrainOrder(manualValidIds, activeAccounts);
475
+ mode = 'manual';
476
+ }
477
+ else if (drainCfg?.mode === 'tier') {
478
+ entries = computeTierDrainOrder(activeAccounts);
479
+ mode = 'tier';
480
+ }
481
+ else {
482
+ // File order: config never writes priorities, so entries carry no computed
483
+ // priority. The selector still reads any residual on-disk priority (e.g.
484
+ // left behind by `order --reset`), so annotate, sort by that priority like
485
+ // the other modes, and flag drift when any residual is non-zero.
486
+ entries = activeAccounts.map((a) => ({
487
+ accountId: a.accountId,
488
+ tokenFile: a.tokenFile,
489
+ priority: exports.MIN_PRIORITY,
490
+ tier: a.tier,
491
+ tierDerived: false,
492
+ currentPriority: undefined,
493
+ }));
494
+ annotateCurrentPriorities(entries);
495
+ const fileHasDrift = entries.some((e) => (e.currentPriority ?? 0) !== 0);
496
+ entries.sort((a, b) => (b.currentPriority ?? 0) - (a.currentPriority ?? 0) ||
497
+ (tieBreakKey(a.tokenFile) < tieBreakKey(b.tokenFile) ? -1 : 1));
498
+ return { mode: 'file', entries, hasDrift: fileHasDrift };
499
+ }
500
+ // Annotate on-disk priorities (the selector's real input) before sorting.
501
+ annotateCurrentPriorities(entries);
502
+ // Drift: computed config priority diverges from on-disk anywhere. Missing
503
+ // file priority (undefined) is treated as 0, matching the selector.
504
+ const hasDrift = entries.some((e) => (e.currentPriority ?? 0) !== e.priority);
505
+ // Sort by on-disk priority desc (undefined as 0), tie-break by tokenFile asc.
506
+ entries.sort((a, b) => (b.currentPriority ?? 0) - (a.currentPriority ?? 0) ||
507
+ (tieBreakKey(a.tokenFile) < tieBreakKey(b.tokenFile) ? -1 : 1));
508
+ return { mode, entries, hasDrift };
509
+ }
510
+ exports.resolveEffectiveDrainOrder = resolveEffectiveDrainOrder;
511
+ /**
512
+ * Fetch in-proxy cooldowns from the running CLIProxy.
513
+ *
514
+ * Pool routing turns cooling ON, so when a credential hits a 429 the proxy
515
+ * marks it Unavailable and rotates to a healthy one. That cooldown lives inside
516
+ * the proxy process (not in CCS's quota-paused.json), so the only way the quota
517
+ * Pool section can explain a session hop is to read it here.
518
+ *
519
+ * GET /v0/management/auth-files returns { files: [{ name, unavailable,
520
+ * next_retry_after, ... }] }. We classify any entry with unavailable=true as a
521
+ * cooling credential and parse next_retry_after (RFC3339) into epoch ms when
522
+ * present.
523
+ *
524
+ * Degrades silently to an empty array on any failure (proxy not running,
525
+ * endpoint missing on an older binary, malformed/unknown response shape,
526
+ * timeout): the caller falls back to its CCS-side cooldown view with no error
527
+ * spam in quota output. Latency is bounded by a single request and MGMT_TIMEOUT_MS.
528
+ *
529
+ * @returns One entry per auth file the proxy reports unavailable.
530
+ */
531
+ async function fetchProxyAuthCooldowns() {
532
+ const target = (0, proxy_target_resolver_1.getProxyTarget)();
533
+ const url = (0, proxy_target_resolver_1.buildProxyUrl)(target, AUTH_FILES_PATH);
534
+ const headers = (0, proxy_target_resolver_1.buildManagementHeaders)(target);
535
+ const controller = new AbortController();
536
+ const timeoutId = setTimeout(() => controller.abort(), MGMT_TIMEOUT_MS);
537
+ try {
538
+ const response = await fetch(url, { method: 'GET', headers, signal: controller.signal });
539
+ if (!response.ok) {
540
+ return [];
541
+ }
542
+ const data = (await response.json());
543
+ if (!Array.isArray(data.files)) {
544
+ return [];
545
+ }
546
+ const cooldowns = [];
547
+ for (const raw of data.files) {
548
+ // Defensive parse: only entries the proxy explicitly flags unavailable.
549
+ if (!raw || raw.unavailable !== true) {
550
+ continue;
551
+ }
552
+ const name = typeof raw.name === 'string' ? raw.name : undefined;
553
+ if (!name) {
554
+ continue;
555
+ }
556
+ let cooldownUntil;
557
+ if (typeof raw.next_retry_after === 'string') {
558
+ const parsed = Date.parse(raw.next_retry_after);
559
+ if (Number.isFinite(parsed)) {
560
+ cooldownUntil = parsed;
561
+ }
562
+ }
563
+ cooldowns.push({ tokenFile: name, cooldownUntil });
564
+ }
565
+ return cooldowns;
566
+ }
567
+ catch {
568
+ return [];
569
+ }
570
+ finally {
571
+ clearTimeout(timeoutId);
572
+ }
573
+ }
574
+ exports.fetchProxyAuthCooldowns = fetchProxyAuthCooldowns;
575
+ //# sourceMappingURL=drain-order.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"drain-order.js","sourceRoot":"","sources":["../../../src/cliproxy/accounts/drain-order.ts"],"names":[],"mappings":";AAAA;;;;;;;;;;;GAWG;;;;;;;;;;;;;;;;;;;;;;;;;;AAEH,uCAAyB;AACzB,2CAA6B;AAC7B,iEAAwD;AACxD,0EAIwC;AACxC,yCAAkD;AAIlD,yEAAyE;AAC5D,QAAA,YAAY,GAAG,CAAC,CAAC;AAE9B,wDAAwD;AACxD,MAAM,sBAAsB,GAAG,kCAAkC,CAAC;AAElE,6EAA6E;AAC7E,MAAM,eAAe,GAAG,2BAA2B,CAAC;AAEpD,6CAA6C;AAC7C,MAAM,eAAe,GAAG,IAAI,CAAC;AAoB7B;;;;GAIG;AACH,MAAM,SAAS,GAAoD;IACjE,KAAK,EAAE,CAAC;IACR,GAAG,EAAE,CAAC;IACN,IAAI,EAAE,CAAC;CACR,CAAC;AAEF;;;;;;GAMG;AACH,SAAgB,cAAc,CAAC,IAAY,EAAE,KAAa;IACxD,MAAM,GAAG,GAAG,KAAK,GAAG,IAAI,CAAC;IACzB,OAAO,IAAI,CAAC,GAAG,CAAC,oBAAY,EAAE,GAAG,CAAC,CAAC;AACrC,CAAC;AAHD,wCAGC;AAED,yDAAyD;AACzD,SAAgB,QAAQ,CAAC,IAA6B;IACpD,IAAI,CAAC,IAAI,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAClD,OAAO,SAAS,CAAC,IAAI,CAAC,CAAC;AACzB,CAAC;AAHD,4BAGC;AA6BD;;;;;;GAMG;AACH,SAAgB,uBAAuB,CACrC,UAAoB,EACpB,WAA8B;IAE9B,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;IACrE,MAAM,MAAM,GAAsB,EAAE,CAAC;IAErC,2EAA2E;IAC3E,kDAAkD;IAClD,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACjB,MAAM,IAAI,KAAK,CAAC,kCAAkC,EAAE,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IACf,CAAC;IAED,wCAAwC;IACxC,KAAK,MAAM,EAAE,IAAI,UAAU,EAAE,CAAC;QAC5B,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,CAAC;YACxB,MAAM,IAAI,KAAK,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC;QACjD,CAAC;IACH,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;IACzC,0EAA0E;IAC1E,8EAA8E;IAC9E,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,GAAG,CAAC,CAAC;IAEpC,qEAAqE;IACrE,KAAK,IAAI,IAAI,GAAG,CAAC,EAAE,IAAI,GAAG,UAAU,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QACpD,MAAM,EAAE,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;QAC5B,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,OAAO;YAAE,SAAS;QAEvB,MAAM,CAAC,IAAI,CAAC;YACV,SAAS,EAAE,EAAE;YACb,SAAS,EAAE,OAAO,CAAC,SAAS;YAC5B,QAAQ,EAAE,cAAc,CAAC,IAAI,EAAE,KAAK,CAAC;YACrC,IAAI,EAAE,OAAO,CAAC,IAAI;YAClB,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC;IACL,CAAC;IAED,uEAAuE;IACvE,KAAK,MAAM,OAAO,IAAI,WAAW,EAAE,CAAC;QAClC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;YACzC,MAAM,CAAC,IAAI,CAAC;gBACV,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,SAAS,EAAE,OAAO,CAAC,SAAS;gBAC5B,QAAQ,EAAE,oBAAY;gBACtB,IAAI,EAAE,OAAO,CAAC,IAAI;gBAClB,WAAW,EAAE,KAAK;gBAClB,eAAe,EAAE,SAAS;aAC3B,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AA5DD,0DA4DC;AAED;;;;;;;;;GASG;AACH,SAAgB,qBAAqB,CAAC,QAA2B;IAC/D,qBAAqB;IACrB,MAAM,QAAQ,GAAoD,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACrF,KAAK,EAAE,CAAC;QACR,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;KAC5B,CAAC,CAAC,CAAC;IAEJ,8BAA8B;IAC9B,MAAM,WAAW,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IACpF,MAAM,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC;IAEpC,+FAA+F;IAC/F,MAAM,iBAAiB,GAAG,IAAI,GAAG,EAAkB,CAAC;IACpD,WAAW,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,GAAG,EAAE,EAAE;QAChC,8CAA8C;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,oBAAY,EAAE,QAAQ,GAAG,GAAG,CAAC,CAAC;QACxD,iBAAiB,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACxC,CAAC,CAAC,CAAC;IAEH,OAAO,QAAQ,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,CAAC;QACxC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,QAAQ,EAAE,iBAAiB,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,oBAAY;QACrD,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,WAAW,EAAE,IAAI,GAAG,CAAC,EAAE,8CAA8C;QACrE,eAAe,EAAE,SAAS;KAC3B,CAAC,CAAC,CAAC;AACN,CAAC;AA3BD,sDA2BC;AAED;;;GAGG;AACH,SAAgB,oBAAoB,CAAC,SAAiB;IACpD,IAAI,CAAC;QACH,MAAM,OAAO,GAAG,IAAA,6BAAU,GAAE,CAAC;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;QAC/C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA2B,CAAC;QAC3D,IAAI,OAAO,IAAI,CAAC,QAAQ,KAAK,QAAQ,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,EAAE,CAAC;YAC9F,OAAO,IAAI,CAAC,QAAQ,CAAC;QACvB,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC;AAbD,oDAaC;AAED;;;;GAIG;AACH,SAAgB,2BAA2B,CAAC,SAAiB,EAAE,QAAgB;IAC7E,IAAI,QAAQ,GAAG,oBAAY,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,uBAAuB,oBAAY,SAAS,QAAQ,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,MAAM,OAAO,GAAG,IAAA,6BAAU,GAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAE/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;IAE5D,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAEzB,MAAM,QAAQ,GAAG,GAAG,QAAQ,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IAClD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AACpC,CAAC;AApBD,kEAoBC;AAED;;;;;;;GAOG;AACI,KAAK,UAAU,2BAA2B,CAC/C,SAAiB,EACjB,QAAgB;IAEhB,IAAI,QAAQ,GAAG,oBAAY,EAAE,CAAC;QAC5B,MAAM,IAAI,KAAK,CAAC,uBAAuB,oBAAY,SAAS,QAAQ,EAAE,CAAC,CAAC;IAC1E,CAAC;IAED,OAAO,qBAAqB,CAAC,SAAS,EAAE,QAAQ,CAAC,CAAC;AACpD,CAAC;AATD,kEASC;AAED;;;;;;;;;;;;;GAaG;AACI,KAAK,UAAU,2BAA2B,CAAC,SAAiB;IACjE,OAAO,qBAAqB,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC;AAC7C,CAAC;AAFD,kEAEC;AAED,oFAAoF;AACpF,KAAK,UAAU,qBAAqB,CAAC,SAAiB,EAAE,QAAgB;IACtE,MAAM,MAAM,GAAG,IAAA,sCAAc,GAAE,CAAC;IAChC,MAAM,GAAG,GAAG,IAAA,qCAAa,EAAC,MAAM,EAAE,sBAAsB,CAAC,CAAC;IAC1D,MAAM,OAAO,GAAG,IAAA,8CAAsB,EAAC,MAAM,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE,CAAC,CAAC;IAEvF,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC,CAAC;IAE3D,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,eAAe,CAAC,CAAC;IAExE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE;YAChC,MAAM,EAAE,OAAO;YACf,OAAO;YACP,IAAI;YACJ,MAAM,EAAE,UAAU,CAAC,MAAM;SAC1B,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,EAAE,CAAC;IACrB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AAED;;;;;;GAMG;AACH,SAAgB,2BAA2B,CAAC,SAAiB;IAC3D,MAAM,OAAO,GAAG,IAAA,6BAAU,GAAE,CAAC;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,SAAS,CAAC,CAAC;IAE/C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,wBAAwB,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAA4B,CAAC;IAE5D,IAAI,CAAC,CAAC,UAAU,IAAI,IAAI,CAAC,EAAE,CAAC;QAC1B,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC,QAAQ,CAAC;IAErB,MAAM,QAAQ,GAAG,GAAG,QAAQ,QAAQ,OAAO,CAAC,GAAG,EAAE,CAAC;IAClD,EAAE,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAClF,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC;AACd,CAAC;AArBD,kEAqBC;AAcD;;;;;;;;;;;;;;;GAeG;AACI,KAAK,UAAU,yBAAyB,CAC7C,UAAoB,EACpB,YAAqB;IAErB,MAAM,MAAM,GAAoC;QAC9C,OAAO,EAAE,EAAE;QACX,YAAY,EAAE,EAAE;QAChB,MAAM,EAAE,EAAE;QACV,iBAAiB,EAAE,YAAY;KAChC,CAAC;IAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,YAAY,EAAE,CAAC;YACjB,yEAAyE;YACzE,IAAI,oBAAoB,CAAC,SAAS,CAAC,KAAK,SAAS,EAAE,CAAC;gBAClD,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACpC,SAAS;YACX,CAAC;YACD,MAAM,EAAE,GAAG,MAAM,2BAA2B,CAAC,SAAS,CAAC,CAAC;YACxD,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAE,6BAA6B,EAAE,CAAC,CAAC;YAC3E,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,MAAM,OAAO,GAAG,2BAA2B,CAAC,SAAS,CAAC,CAAC;gBACvD,IAAI,OAAO,EAAE,CAAC;oBACZ,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACjC,CAAC;qBAAM,CAAC;oBACN,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACtC,CAAC;YACH,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,MAAM,EAAG,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC;YACpE,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AAvCD,8DAuCC;AAgBD;;;;;;;;;;;;GAYG;AACI,KAAK,UAAU,eAAe,CACnC,OAA0B,EAC1B,YAAqB;IAErB,MAAM,MAAM,GAA0B;QACpC,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,MAAM,EAAE,EAAE;QACV,iBAAiB,EAAE,YAAY;KAChC,CAAC;IAEF,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,0DAA0D;QAC1D,MAAM,eAAe,GAAG,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC9D,IAAI,eAAe,KAAK,KAAK,CAAC,QAAQ,EAAE,CAAC;YACvC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;YACnD,SAAS;QACX,CAAC;QAED,IAAI,YAAY,EAAE,CAAC;YACjB,MAAM,EAAE,GAAG,MAAM,2BAA2B,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;YAC9E,IAAI,EAAE,EAAE,CAAC;gBACP,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;YACrD,CAAC;iBAAM,CAAC;gBACN,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE;oBACpC,MAAM,EAAE,6BAA6B;iBACtC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC;gBACH,2BAA2B,CAAC,KAAK,CAAC,SAAS,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAC;gBAC7D,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE,CAAC,CAAC;YACrD,CAAC;YAAC,OAAO,GAAG,EAAE,CAAC;gBACb,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBACjB,KAAK,EAAE,EAAE,GAAG,KAAK,EAAE,eAAe,EAAE;oBACpC,MAAM,EAAG,GAAa,CAAC,OAAO;iBAC/B,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC;AA3CD,0CA2CC;AAED;;;;;GAKG;AACH,SAAgB,yBAAyB,CAAC,OAA0B;IAClE,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;QAC5B,KAAK,CAAC,eAAe,GAAG,oBAAoB,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;IAChE,CAAC;AACH,CAAC;AAJD,8DAIC;AAED;;;;;;;;;GASG;AACH,SAAgB,WAAW,CACzB,SAAiB,EACjB,WAA4B,OAAO,CAAC,QAAQ;IAE5C,OAAO,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;AACpE,CAAC;AALD,kCAKC;AA2BD;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,SAAgB,0BAA0B,CACxC,QAA0B,EAC1B,cAAiC;IAEjC,IAAI,cAAc,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,KAAK,EAAE,CAAC;IACxD,CAAC;IAED,MAAM,QAAQ,GAAG,IAAA,+BAAoB,EAAC,QAAQ,CAAC,CAAC;IAEhD,8EAA8E;IAC9E,0EAA0E;IAC1E,IAAI,cAAoC,CAAC;IACzC,IAAI,QAAQ,EAAE,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,UAAU,IAAI,QAAQ,CAAC,UAAU,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACzF,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;QACpE,cAAc,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;IAC3E,CAAC;IAED,IAAI,OAA0B,CAAC;IAC/B,IAAI,IAA6B,CAAC;IAElC,IAAI,cAAc,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAChD,OAAO,GAAG,uBAAuB,CAAC,cAAc,EAAE,cAAc,CAAC,CAAC;QAClE,IAAI,GAAG,QAAQ,CAAC;IAClB,CAAC;SAAM,IAAI,QAAQ,EAAE,IAAI,KAAK,MAAM,EAAE,CAAC;QACrC,OAAO,GAAG,qBAAqB,CAAC,cAAc,CAAC,CAAC;QAChD,IAAI,GAAG,MAAM,CAAC;IAChB,CAAC;SAAM,CAAC;QACN,2EAA2E;QAC3E,yEAAyE;QACzE,2EAA2E;QAC3E,iEAAiE;QACjE,OAAO,GAAG,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACnC,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,QAAQ,EAAE,oBAAY;YACtB,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,KAAK;YAClB,eAAe,EAAE,SAAS;SAC3B,CAAC,CAAC,CAAC;QACJ,yBAAyB,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CACV,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC;YACnD,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACjE,CAAC;QACF,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,CAAC;IAC3D,CAAC;IAED,0EAA0E;IAC1E,yBAAyB,CAAC,OAAO,CAAC,CAAC;IAEnC,0EAA0E;IAC1E,oEAAoE;IACpE,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,CAAC;IAE9E,8EAA8E;IAC9E,OAAO,CAAC,IAAI,CACV,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CACP,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,eAAe,IAAI,CAAC,CAAC;QACnD,CAAC,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,GAAG,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CACjE,CAAC;IAEF,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC;AACrC,CAAC;AAjED,gEAiEC;AASD;;;;;;;;;;;;;;;;;;;GAmBG;AACI,KAAK,UAAU,uBAAuB;IAC3C,MAAM,MAAM,GAAG,IAAA,sCAAc,GAAE,CAAC;IAChC,MAAM,GAAG,GAAG,IAAA,qCAAa,EAAC,MAAM,EAAE,eAAe,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,IAAA,8CAAsB,EAAC,MAAM,CAAC,CAAC;IAE/C,MAAM,UAAU,GAAG,IAAI,eAAe,EAAE,CAAC;IACzC,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE,CAAC,UAAU,CAAC,KAAK,EAAE,EAAE,eAAe,CAAC,CAAC;IAExE,IAAI,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,MAAM,EAAE,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC;QACzF,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;YACjB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,IAAI,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAwB,CAAC;QAC5D,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,SAAS,GAAwB,EAAE,CAAC;QAC1C,KAAK,MAAM,GAAG,IAAI,IAAI,CAAC,KAAgC,EAAE,CAAC;YACxD,wEAAwE;YACxE,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,WAAW,KAAK,IAAI,EAAE,CAAC;gBACrC,SAAS;YACX,CAAC;YACD,MAAM,IAAI,GAAG,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,CAAC;YACjE,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,SAAS;YACX,CAAC;YACD,IAAI,aAAiC,CAAC;YACtC,IAAI,OAAO,GAAG,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;gBAC7C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;gBAChD,IAAI,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAC5B,aAAa,GAAG,MAAM,CAAC;gBACzB,CAAC;YACH,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,aAAa,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;YAAS,CAAC;QACT,YAAY,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;AACH,CAAC;AA5CD,0DA4CC"}