@slkiser/opencode-quota 5.0.3 → 6.0.0-beta.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 (794) hide show
  1. package/README.md +30 -44
  2. package/dist/agent-tools.d.ts +24 -0
  3. package/dist/agent-tools.d.ts.map +1 -0
  4. package/dist/agent-tools.js +578 -0
  5. package/dist/agent-tools.js.map +1 -0
  6. package/dist/bin/opencode-quota.d.ts.map +1 -1
  7. package/dist/bin/opencode-quota.js +1 -32
  8. package/dist/bin/opencode-quota.js.map +1 -1
  9. package/dist/core/errors.d.ts +12 -0
  10. package/dist/core/errors.d.ts.map +1 -0
  11. package/dist/core/errors.js +141 -0
  12. package/dist/core/errors.js.map +1 -0
  13. package/dist/core/pace.d.ts +13 -0
  14. package/dist/core/pace.d.ts.map +1 -0
  15. package/dist/core/pace.js +52 -0
  16. package/dist/core/pace.js.map +1 -0
  17. package/dist/core/persist.d.ts +44 -0
  18. package/dist/core/persist.d.ts.map +1 -0
  19. package/dist/core/persist.js +210 -0
  20. package/dist/core/persist.js.map +1 -0
  21. package/dist/core/provider-source.d.ts +40 -0
  22. package/dist/core/provider-source.d.ts.map +1 -0
  23. package/dist/core/provider-source.js +210 -0
  24. package/dist/core/provider-source.js.map +1 -0
  25. package/dist/core/redact.d.ts +17 -0
  26. package/dist/core/redact.d.ts.map +1 -0
  27. package/dist/core/redact.js +217 -0
  28. package/dist/core/redact.js.map +1 -0
  29. package/dist/core/rows.d.ts +20 -0
  30. package/dist/core/rows.d.ts.map +1 -0
  31. package/dist/core/rows.js +142 -0
  32. package/dist/core/rows.js.map +1 -0
  33. package/dist/core/selection.d.ts +15 -0
  34. package/dist/core/selection.d.ts.map +1 -0
  35. package/dist/core/selection.js +43 -0
  36. package/dist/core/selection.js.map +1 -0
  37. package/dist/core/snapshot-publisher.d.ts +15 -0
  38. package/dist/core/snapshot-publisher.d.ts.map +1 -0
  39. package/dist/core/snapshot-publisher.js +57 -0
  40. package/dist/core/snapshot-publisher.js.map +1 -0
  41. package/dist/core/store.d.ts +93 -0
  42. package/dist/core/store.d.ts.map +1 -0
  43. package/dist/core/store.js +563 -0
  44. package/dist/core/store.js.map +1 -0
  45. package/dist/core/types.d.ts +186 -0
  46. package/dist/core/types.d.ts.map +1 -0
  47. package/dist/core/types.js +2 -0
  48. package/dist/core/types.js.map +1 -0
  49. package/dist/core/usage-ranges.d.ts +46 -0
  50. package/dist/core/usage-ranges.d.ts.map +1 -0
  51. package/dist/core/usage-ranges.js +72 -0
  52. package/dist/core/usage-ranges.js.map +1 -0
  53. package/dist/core/usage.d.ts +100 -0
  54. package/dist/core/usage.d.ts.map +1 -0
  55. package/dist/core/usage.js +373 -0
  56. package/dist/core/usage.js.map +1 -0
  57. package/dist/core/validate.d.ts +8 -0
  58. package/dist/core/validate.d.ts.map +1 -0
  59. package/dist/core/validate.js +167 -0
  60. package/dist/core/validate.js.map +1 -0
  61. package/dist/core/windows.d.ts +24 -0
  62. package/dist/core/windows.d.ts.map +1 -0
  63. package/dist/core/windows.js +43 -0
  64. package/dist/core/windows.js.map +1 -0
  65. package/dist/index.d.ts +2 -1
  66. package/dist/index.d.ts.map +1 -1
  67. package/dist/index.js.map +1 -1
  68. package/dist/lib/accounting-format.d.ts +2 -52
  69. package/dist/lib/accounting-format.d.ts.map +1 -1
  70. package/dist/lib/accounting-format.js +6 -255
  71. package/dist/lib/accounting-format.js.map +1 -1
  72. package/dist/lib/alibaba-auth.d.ts +14 -21
  73. package/dist/lib/alibaba-auth.d.ts.map +1 -1
  74. package/dist/lib/alibaba-auth.js +36 -149
  75. package/dist/lib/alibaba-auth.js.map +1 -1
  76. package/dist/lib/alibaba-coding-plan-local-quota.d.ts +1 -6
  77. package/dist/lib/alibaba-coding-plan-local-quota.d.ts.map +1 -1
  78. package/dist/lib/alibaba-coding-plan-local-quota.js +1 -1
  79. package/dist/lib/alibaba-coding-plan-local-quota.js.map +1 -1
  80. package/dist/lib/alibaba-token-plan.d.ts +18 -27
  81. package/dist/lib/alibaba-token-plan.d.ts.map +1 -1
  82. package/dist/lib/alibaba-token-plan.js +121 -285
  83. package/dist/lib/alibaba-token-plan.js.map +1 -1
  84. package/dist/lib/anthropic-auth.d.ts +3 -5
  85. package/dist/lib/anthropic-auth.d.ts.map +1 -1
  86. package/dist/lib/anthropic-auth.js +6 -9
  87. package/dist/lib/anthropic-auth.js.map +1 -1
  88. package/dist/lib/anthropic.d.ts +12 -37
  89. package/dist/lib/anthropic.d.ts.map +1 -1
  90. package/dist/lib/anthropic.js +348 -698
  91. package/dist/lib/anthropic.js.map +1 -1
  92. package/dist/lib/api-key-resolver.d.ts +165 -192
  93. package/dist/lib/api-key-resolver.d.ts.map +1 -1
  94. package/dist/lib/api-key-resolver.js +208 -234
  95. package/dist/lib/api-key-resolver.js.map +1 -1
  96. package/dist/lib/atomic-json.d.ts +4 -1
  97. package/dist/lib/atomic-json.d.ts.map +1 -1
  98. package/dist/lib/atomic-json.js +2 -3
  99. package/dist/lib/atomic-json.js.map +1 -1
  100. package/dist/lib/calendar-date.d.ts +15 -0
  101. package/dist/lib/calendar-date.d.ts.map +1 -0
  102. package/dist/lib/calendar-date.js +21 -0
  103. package/dist/lib/calendar-date.js.map +1 -0
  104. package/dist/lib/chutes.d.ts +0 -1
  105. package/dist/lib/chutes.d.ts.map +1 -1
  106. package/dist/lib/chutes.js +2 -4
  107. package/dist/lib/chutes.js.map +1 -1
  108. package/dist/lib/cli-reports.d.ts +15 -11
  109. package/dist/lib/cli-reports.d.ts.map +1 -1
  110. package/dist/lib/cli-reports.js +34 -107
  111. package/dist/lib/cli-reports.js.map +1 -1
  112. package/dist/lib/cli-show.d.ts +9 -22
  113. package/dist/lib/cli-show.d.ts.map +1 -1
  114. package/dist/lib/cli-show.js +104 -75
  115. package/dist/lib/cli-show.js.map +1 -1
  116. package/dist/lib/config-file-utils.d.ts +3 -15
  117. package/dist/lib/config-file-utils.d.ts.map +1 -1
  118. package/dist/lib/config-file-utils.js +4 -63
  119. package/dist/lib/config-file-utils.js.map +1 -1
  120. package/dist/lib/config-write-target.d.ts +4 -7
  121. package/dist/lib/config-write-target.d.ts.map +1 -1
  122. package/dist/lib/config-write-target.js +4 -18
  123. package/dist/lib/config-write-target.js.map +1 -1
  124. package/dist/lib/copilot.d.ts +29 -20
  125. package/dist/lib/copilot.d.ts.map +1 -1
  126. package/dist/lib/copilot.js +392 -649
  127. package/dist/lib/copilot.js.map +1 -1
  128. package/dist/lib/cursor-detection.d.ts +3 -3
  129. package/dist/lib/cursor-detection.d.ts.map +1 -1
  130. package/dist/lib/cursor-detection.js +44 -88
  131. package/dist/lib/cursor-detection.js.map +1 -1
  132. package/dist/lib/cursor-pricing.d.ts +71 -8
  133. package/dist/lib/cursor-pricing.d.ts.map +1 -1
  134. package/dist/lib/cursor-pricing.js +33 -125
  135. package/dist/lib/cursor-pricing.js.map +1 -1
  136. package/dist/lib/cursor-usage.d.ts +6 -4
  137. package/dist/lib/cursor-usage.d.ts.map +1 -1
  138. package/dist/lib/cursor-usage.js +27 -40
  139. package/dist/lib/cursor-usage.js.map +1 -1
  140. package/dist/lib/deepseek.d.ts +9 -17
  141. package/dist/lib/deepseek.d.ts.map +1 -1
  142. package/dist/lib/deepseek.js +24 -54
  143. package/dist/lib/deepseek.js.map +1 -1
  144. package/dist/lib/display-sanitize.d.ts +0 -8
  145. package/dist/lib/display-sanitize.d.ts.map +1 -1
  146. package/dist/lib/display-sanitize.js +0 -139
  147. package/dist/lib/display-sanitize.js.map +1 -1
  148. package/dist/lib/entries.d.ts +13 -239
  149. package/dist/lib/entries.d.ts.map +1 -1
  150. package/dist/lib/entries.js +1 -46
  151. package/dist/lib/entries.js.map +1 -1
  152. package/dist/lib/file-lock.d.ts +23 -0
  153. package/dist/lib/file-lock.d.ts.map +1 -0
  154. package/dist/lib/file-lock.js +122 -0
  155. package/dist/lib/file-lock.js.map +1 -0
  156. package/dist/lib/format-utils.d.ts +2 -82
  157. package/dist/lib/format-utils.d.ts.map +1 -1
  158. package/dist/lib/format-utils.js +2 -191
  159. package/dist/lib/format-utils.js.map +1 -1
  160. package/dist/lib/glm-coding-plan.d.ts +6 -5
  161. package/dist/lib/glm-coding-plan.d.ts.map +1 -1
  162. package/dist/lib/glm-coding-plan.js +19 -1
  163. package/dist/lib/glm-coding-plan.js.map +1 -1
  164. package/dist/lib/google-agy.d.ts +8 -40
  165. package/dist/lib/google-agy.d.ts.map +1 -1
  166. package/dist/lib/google-agy.js +88 -519
  167. package/dist/lib/google-agy.js.map +1 -1
  168. package/dist/lib/google-companion-credentials.d.ts +9 -40
  169. package/dist/lib/google-companion-credentials.d.ts.map +1 -1
  170. package/dist/lib/google-companion-credentials.js +167 -224
  171. package/dist/lib/google-companion-credentials.js.map +1 -1
  172. package/dist/lib/google-gemini-cli.d.ts +5 -38
  173. package/dist/lib/google-gemini-cli.d.ts.map +1 -1
  174. package/dist/lib/google-gemini-cli.js +71 -442
  175. package/dist/lib/google-gemini-cli.js.map +1 -1
  176. package/dist/lib/google-oauth-quota.d.ts +76 -0
  177. package/dist/lib/google-oauth-quota.d.ts.map +1 -0
  178. package/dist/lib/google-oauth-quota.js +297 -0
  179. package/dist/lib/google-oauth-quota.js.map +1 -0
  180. package/dist/lib/google-token-cache.d.ts +3 -5
  181. package/dist/lib/google-token-cache.d.ts.map +1 -1
  182. package/dist/lib/google-token-cache.js +2 -14
  183. package/dist/lib/google-token-cache.js.map +1 -1
  184. package/dist/lib/home-dir-display.d.ts.map +1 -1
  185. package/dist/lib/home-dir-display.js +21 -39
  186. package/dist/lib/home-dir-display.js.map +1 -1
  187. package/dist/lib/http.d.ts +4 -1
  188. package/dist/lib/http.d.ts.map +1 -1
  189. package/dist/lib/http.js +2 -1
  190. package/dist/lib/http.js.map +1 -1
  191. package/dist/lib/json-guards.d.ts +11 -0
  192. package/dist/lib/json-guards.d.ts.map +1 -0
  193. package/dist/lib/json-guards.js +25 -0
  194. package/dist/lib/json-guards.js.map +1 -0
  195. package/dist/lib/kilo.d.ts +0 -2
  196. package/dist/lib/kilo.d.ts.map +1 -1
  197. package/dist/lib/kilo.js +33 -116
  198. package/dist/lib/kilo.js.map +1 -1
  199. package/dist/lib/kimi-endpoints.d.ts +2 -2
  200. package/dist/lib/kimi-endpoints.d.ts.map +1 -1
  201. package/dist/lib/kimi-endpoints.js +1 -1
  202. package/dist/lib/kimi-endpoints.js.map +1 -1
  203. package/dist/lib/kimi.d.ts.map +1 -1
  204. package/dist/lib/kimi.js +40 -86
  205. package/dist/lib/kimi.js.map +1 -1
  206. package/dist/lib/maintainer-announcements.d.ts +4 -17
  207. package/dist/lib/maintainer-announcements.d.ts.map +1 -1
  208. package/dist/lib/maintainer-announcements.js +7 -44
  209. package/dist/lib/maintainer-announcements.js.map +1 -1
  210. package/dist/lib/maintainer-home-notice.d.ts +19 -0
  211. package/dist/lib/maintainer-home-notice.d.ts.map +1 -0
  212. package/dist/lib/maintainer-home-notice.js +92 -0
  213. package/dist/lib/maintainer-home-notice.js.map +1 -0
  214. package/dist/lib/mimo-config.d.ts +6 -9
  215. package/dist/lib/mimo-config.d.ts.map +1 -1
  216. package/dist/lib/mimo-config.js +43 -74
  217. package/dist/lib/mimo-config.js.map +1 -1
  218. package/dist/lib/mimo.d.ts +2 -5
  219. package/dist/lib/mimo.d.ts.map +1 -1
  220. package/dist/lib/mimo.js +57 -109
  221. package/dist/lib/mimo.js.map +1 -1
  222. package/dist/lib/minimax-endpoints.d.ts +2 -2
  223. package/dist/lib/minimax-endpoints.d.ts.map +1 -1
  224. package/dist/lib/minimax-endpoints.js +1 -1
  225. package/dist/lib/minimax-endpoints.js.map +1 -1
  226. package/dist/lib/modelsdev-pricing.d.ts +22 -16
  227. package/dist/lib/modelsdev-pricing.d.ts.map +1 -1
  228. package/dist/lib/modelsdev-pricing.js +279 -560
  229. package/dist/lib/modelsdev-pricing.js.map +1 -1
  230. package/dist/lib/nanogpt.d.ts +6 -6
  231. package/dist/lib/nanogpt.d.ts.map +1 -1
  232. package/dist/lib/nanogpt.js +19 -72
  233. package/dist/lib/nanogpt.js.map +1 -1
  234. package/dist/lib/ollama-cloud.d.ts +3 -6
  235. package/dist/lib/ollama-cloud.d.ts.map +1 -1
  236. package/dist/lib/ollama-cloud.js +26 -37
  237. package/dist/lib/ollama-cloud.js.map +1 -1
  238. package/dist/lib/openai.d.ts +18 -29
  239. package/dist/lib/openai.d.ts.map +1 -1
  240. package/dist/lib/openai.js +108 -182
  241. package/dist/lib/openai.js.map +1 -1
  242. package/dist/lib/opencode-auth-sqlite.d.ts.map +1 -1
  243. package/dist/lib/opencode-auth-sqlite.js +22 -23
  244. package/dist/lib/opencode-auth-sqlite.js.map +1 -1
  245. package/dist/lib/opencode-auth.d.ts +17 -11
  246. package/dist/lib/opencode-auth.d.ts.map +1 -1
  247. package/dist/lib/opencode-auth.js +39 -46
  248. package/dist/lib/opencode-auth.js.map +1 -1
  249. package/dist/lib/opencode-config-editor.d.ts +3 -34
  250. package/dist/lib/opencode-config-editor.d.ts.map +1 -1
  251. package/dist/lib/opencode-config-editor.js +23 -142
  252. package/dist/lib/opencode-config-editor.js.map +1 -1
  253. package/dist/lib/opencode-config-providers.d.ts +4 -3
  254. package/dist/lib/opencode-config-providers.d.ts.map +1 -1
  255. package/dist/lib/opencode-config-providers.js +7 -11
  256. package/dist/lib/opencode-config-providers.js.map +1 -1
  257. package/dist/lib/opencode-config-read.d.ts +2 -1
  258. package/dist/lib/opencode-config-read.d.ts.map +1 -1
  259. package/dist/lib/opencode-config-read.js +3 -2
  260. package/dist/lib/opencode-config-read.js.map +1 -1
  261. package/dist/lib/opencode-console-auth.d.ts +2 -3
  262. package/dist/lib/opencode-console-auth.d.ts.map +1 -1
  263. package/dist/lib/opencode-console-auth.js +2 -2
  264. package/dist/lib/opencode-console-auth.js.map +1 -1
  265. package/dist/lib/opencode-go.d.ts.map +1 -1
  266. package/dist/lib/opencode-go.js +51 -79
  267. package/dist/lib/opencode-go.js.map +1 -1
  268. package/dist/lib/opencode-storage.d.ts +18 -3
  269. package/dist/lib/opencode-storage.d.ts.map +1 -1
  270. package/dist/lib/opencode-storage.js +134 -2
  271. package/dist/lib/opencode-storage.js.map +1 -1
  272. package/dist/lib/opencode-zen.d.ts +15 -12
  273. package/dist/lib/opencode-zen.d.ts.map +1 -1
  274. package/dist/lib/opencode-zen.js +139 -147
  275. package/dist/lib/opencode-zen.js.map +1 -1
  276. package/dist/lib/openrouter.d.ts.map +1 -1
  277. package/dist/lib/openrouter.js +1 -13
  278. package/dist/lib/openrouter.js.map +1 -1
  279. package/dist/lib/pricing-key.d.ts +48 -0
  280. package/dist/lib/pricing-key.d.ts.map +1 -0
  281. package/dist/lib/pricing-key.js +371 -0
  282. package/dist/lib/pricing-key.js.map +1 -0
  283. package/dist/lib/provider-metadata.d.ts +16 -20
  284. package/dist/lib/provider-metadata.d.ts.map +1 -1
  285. package/dist/lib/provider-metadata.js +69 -69
  286. package/dist/lib/provider-metadata.js.map +1 -1
  287. package/dist/lib/provider-model-matching.d.ts +2 -1
  288. package/dist/lib/provider-model-matching.d.ts.map +1 -1
  289. package/dist/lib/provider-registration.d.ts +1 -177
  290. package/dist/lib/provider-registration.d.ts.map +1 -1
  291. package/dist/lib/provider-registration.js +1 -163
  292. package/dist/lib/provider-registration.js.map +1 -1
  293. package/dist/lib/quota-dialog-commands.d.ts +87 -53
  294. package/dist/lib/quota-dialog-commands.d.ts.map +1 -1
  295. package/dist/lib/quota-dialog-commands.js +259 -519
  296. package/dist/lib/quota-dialog-commands.js.map +1 -1
  297. package/dist/lib/quota-export-types.d.ts +29 -23
  298. package/dist/lib/quota-export-types.d.ts.map +1 -1
  299. package/dist/lib/quota-export.d.ts +16 -26
  300. package/dist/lib/quota-export.d.ts.map +1 -1
  301. package/dist/lib/quota-export.js +105 -147
  302. package/dist/lib/quota-export.js.map +1 -1
  303. package/dist/lib/quota-providers-local.d.ts +12 -8
  304. package/dist/lib/quota-providers-local.d.ts.map +1 -1
  305. package/dist/lib/quota-providers-local.js +150 -223
  306. package/dist/lib/quota-providers-local.js.map +1 -1
  307. package/dist/lib/quota-providers-remote.d.ts +3 -8
  308. package/dist/lib/quota-providers-remote.d.ts.map +1 -1
  309. package/dist/lib/quota-providers-remote.js +309 -449
  310. package/dist/lib/quota-providers-remote.js.map +1 -1
  311. package/dist/lib/quota-providers.d.ts +57 -15
  312. package/dist/lib/quota-providers.d.ts.map +1 -1
  313. package/dist/lib/quota-providers.js +157 -64
  314. package/dist/lib/quota-providers.js.map +1 -1
  315. package/dist/lib/quota-report-message.d.ts +23 -10
  316. package/dist/lib/quota-report-message.d.ts.map +1 -1
  317. package/dist/lib/quota-report-message.js +37 -13
  318. package/dist/lib/quota-report-message.js.map +1 -1
  319. package/dist/lib/quota-retry-wait.d.ts +14 -6
  320. package/dist/lib/quota-retry-wait.d.ts.map +1 -1
  321. package/dist/lib/quota-retry-wait.js +37 -39
  322. package/dist/lib/quota-retry-wait.js.map +1 -1
  323. package/dist/lib/quota-status.d.ts +50 -33
  324. package/dist/lib/quota-status.d.ts.map +1 -1
  325. package/dist/lib/quota-status.js +1113 -773
  326. package/dist/lib/quota-status.js.map +1 -1
  327. package/dist/lib/quota-telemetry.d.ts +7 -14
  328. package/dist/lib/quota-telemetry.d.ts.map +1 -1
  329. package/dist/lib/quota-telemetry.js +46 -97
  330. package/dist/lib/quota-telemetry.js.map +1 -1
  331. package/dist/lib/report-document.d.ts +5 -65
  332. package/dist/lib/report-document.d.ts.map +1 -1
  333. package/dist/lib/report-document.js +14 -167
  334. package/dist/lib/report-document.js.map +1 -1
  335. package/dist/lib/resolved-auth-identity.d.ts +1 -2
  336. package/dist/lib/resolved-auth-identity.d.ts.map +1 -1
  337. package/dist/lib/resolved-auth-identity.js +0 -4
  338. package/dist/lib/resolved-auth-identity.js.map +1 -1
  339. package/dist/lib/session-tokens.d.ts +19 -19
  340. package/dist/lib/session-tokens.d.ts.map +1 -1
  341. package/dist/lib/session-tokens.js +58 -44
  342. package/dist/lib/session-tokens.js.map +1 -1
  343. package/dist/lib/synthetic.d.ts +0 -1
  344. package/dist/lib/synthetic.d.ts.map +1 -1
  345. package/dist/lib/synthetic.js +43 -94
  346. package/dist/lib/synthetic.js.map +1 -1
  347. package/dist/lib/token-buckets.d.ts +0 -1
  348. package/dist/lib/token-buckets.d.ts.map +1 -1
  349. package/dist/lib/token-buckets.js +0 -3
  350. package/dist/lib/token-buckets.js.map +1 -1
  351. package/dist/lib/token-cost.d.ts +2 -1
  352. package/dist/lib/token-cost.d.ts.map +1 -1
  353. package/dist/lib/types.d.ts +25 -333
  354. package/dist/lib/types.d.ts.map +1 -1
  355. package/dist/lib/types.js +2 -70
  356. package/dist/lib/types.js.map +1 -1
  357. package/dist/lib/xai.d.ts +6 -6
  358. package/dist/lib/xai.d.ts.map +1 -1
  359. package/dist/lib/xai.js +51 -90
  360. package/dist/lib/xai.js.map +1 -1
  361. package/dist/plugin.d.ts +6 -3
  362. package/dist/plugin.d.ts.map +1 -1
  363. package/dist/plugin.js +315 -90
  364. package/dist/plugin.js.map +1 -1
  365. package/dist/providers/alibaba-coding-plan.d.ts +4 -0
  366. package/dist/providers/alibaba-coding-plan.d.ts.map +1 -1
  367. package/dist/providers/alibaba-coding-plan.js +47 -77
  368. package/dist/providers/alibaba-coding-plan.js.map +1 -1
  369. package/dist/providers/alibaba-token-plan.d.ts.map +1 -1
  370. package/dist/providers/alibaba-token-plan.js +34 -46
  371. package/dist/providers/alibaba-token-plan.js.map +1 -1
  372. package/dist/providers/anthropic.d.ts +2 -4
  373. package/dist/providers/anthropic.d.ts.map +1 -1
  374. package/dist/providers/anthropic.js +80 -162
  375. package/dist/providers/anthropic.js.map +1 -1
  376. package/dist/providers/cache-policies.d.ts +0 -2
  377. package/dist/providers/cache-policies.d.ts.map +1 -1
  378. package/dist/providers/cache-policies.js +38 -88
  379. package/dist/providers/cache-policies.js.map +1 -1
  380. package/dist/providers/chutes.d.ts +0 -3
  381. package/dist/providers/chutes.d.ts.map +1 -1
  382. package/dist/providers/chutes.js +16 -28
  383. package/dist/providers/chutes.js.map +1 -1
  384. package/dist/providers/contract.d.ts +128 -0
  385. package/dist/providers/contract.d.ts.map +1 -0
  386. package/dist/providers/contract.js +101 -0
  387. package/dist/providers/contract.js.map +1 -0
  388. package/dist/providers/copilot.d.ts.map +1 -1
  389. package/dist/providers/copilot.js +171 -175
  390. package/dist/providers/copilot.js.map +1 -1
  391. package/dist/providers/cursor.d.ts.map +1 -1
  392. package/dist/providers/cursor.js +56 -109
  393. package/dist/providers/cursor.js.map +1 -1
  394. package/dist/providers/deepseek.d.ts +1 -6
  395. package/dist/providers/deepseek.d.ts.map +1 -1
  396. package/dist/providers/deepseek.js +46 -81
  397. package/dist/providers/deepseek.js.map +1 -1
  398. package/dist/providers/glm-coding-plan.d.ts +8 -0
  399. package/dist/providers/glm-coding-plan.d.ts.map +1 -0
  400. package/dist/providers/glm-coding-plan.js +106 -0
  401. package/dist/providers/glm-coding-plan.js.map +1 -0
  402. package/dist/providers/google-agy.d.ts +0 -1
  403. package/dist/providers/google-agy.d.ts.map +1 -1
  404. package/dist/providers/google-agy.js +41 -192
  405. package/dist/providers/google-agy.js.map +1 -1
  406. package/dist/providers/google-gemini-cli.d.ts.map +1 -1
  407. package/dist/providers/google-gemini-cli.js +51 -151
  408. package/dist/providers/google-gemini-cli.js.map +1 -1
  409. package/dist/providers/google-oauth-provider.d.ts +39 -0
  410. package/dist/providers/google-oauth-provider.d.ts.map +1 -0
  411. package/dist/providers/google-oauth-provider.js +161 -0
  412. package/dist/providers/google-oauth-provider.js.map +1 -0
  413. package/dist/providers/kilo.d.ts +0 -3
  414. package/dist/providers/kilo.d.ts.map +1 -1
  415. package/dist/providers/kilo.js +69 -123
  416. package/dist/providers/kilo.js.map +1 -1
  417. package/dist/providers/kimi-code.d.ts +5 -0
  418. package/dist/providers/kimi-code.d.ts.map +1 -1
  419. package/dist/providers/kimi-code.js +91 -136
  420. package/dist/providers/kimi-code.js.map +1 -1
  421. package/dist/providers/mimo.d.ts.map +1 -1
  422. package/dist/providers/mimo.js +55 -94
  423. package/dist/providers/mimo.js.map +1 -1
  424. package/dist/providers/minimax-coding-plan.d.ts +2 -23
  425. package/dist/providers/minimax-coding-plan.d.ts.map +1 -1
  426. package/dist/providers/minimax-coding-plan.js +161 -277
  427. package/dist/providers/minimax-coding-plan.js.map +1 -1
  428. package/dist/providers/nanogpt.d.ts +0 -3
  429. package/dist/providers/nanogpt.d.ts.map +1 -1
  430. package/dist/providers/nanogpt.js +61 -95
  431. package/dist/providers/nanogpt.js.map +1 -1
  432. package/dist/providers/ollama-cloud.d.ts +0 -6
  433. package/dist/providers/ollama-cloud.d.ts.map +1 -1
  434. package/dist/providers/ollama-cloud.js +86 -112
  435. package/dist/providers/ollama-cloud.js.map +1 -1
  436. package/dist/providers/openai.d.ts.map +1 -1
  437. package/dist/providers/openai.js +144 -166
  438. package/dist/providers/openai.js.map +1 -1
  439. package/dist/providers/opencode-go.d.ts.map +1 -1
  440. package/dist/providers/opencode-go.js +157 -199
  441. package/dist/providers/opencode-go.js.map +1 -1
  442. package/dist/providers/opencode-zen.d.ts.map +1 -1
  443. package/dist/providers/opencode-zen.js +100 -150
  444. package/dist/providers/opencode-zen.js.map +1 -1
  445. package/dist/providers/openrouter.d.ts +0 -3
  446. package/dist/providers/openrouter.d.ts.map +1 -1
  447. package/dist/providers/openrouter.js +26 -13
  448. package/dist/providers/openrouter.js.map +1 -1
  449. package/dist/providers/quota-providers.d.ts +7 -3
  450. package/dist/providers/quota-providers.d.ts.map +1 -1
  451. package/dist/providers/quota-providers.js +111 -217
  452. package/dist/providers/quota-providers.js.map +1 -1
  453. package/dist/providers/registry.d.ts.map +1 -1
  454. package/dist/providers/registry.js +1 -2
  455. package/dist/providers/registry.js.map +1 -1
  456. package/dist/providers/result-helpers.d.ts +10 -37
  457. package/dist/providers/result-helpers.d.ts.map +1 -1
  458. package/dist/providers/result-helpers.js +23 -56
  459. package/dist/providers/result-helpers.js.map +1 -1
  460. package/dist/providers/synthetic.d.ts +0 -3
  461. package/dist/providers/synthetic.d.ts.map +1 -1
  462. package/dist/providers/synthetic.js +16 -58
  463. package/dist/providers/synthetic.js.map +1 -1
  464. package/dist/providers/xai.d.ts +2 -1
  465. package/dist/providers/xai.d.ts.map +1 -1
  466. package/dist/providers/xai.js +49 -71
  467. package/dist/providers/xai.js.map +1 -1
  468. package/dist/rpc.d.ts +110 -38
  469. package/dist/rpc.d.ts.map +1 -1
  470. package/dist/rpc.js +125 -37
  471. package/dist/rpc.js.map +1 -1
  472. package/dist/settings/convert.d.ts +60 -0
  473. package/dist/settings/convert.d.ts.map +1 -0
  474. package/dist/settings/convert.js +473 -0
  475. package/dist/settings/convert.js.map +1 -0
  476. package/dist/settings/file.d.ts +89 -0
  477. package/dist/settings/file.d.ts.map +1 -0
  478. package/dist/settings/file.js +452 -0
  479. package/dist/settings/file.js.map +1 -0
  480. package/dist/settings/index.d.ts +10 -0
  481. package/dist/settings/index.d.ts.map +1 -0
  482. package/dist/settings/index.js +3 -0
  483. package/dist/settings/index.js.map +1 -0
  484. package/dist/settings/schema.d.ts +607 -0
  485. package/dist/settings/schema.d.ts.map +1 -0
  486. package/dist/settings/schema.js +479 -0
  487. package/dist/settings/schema.js.map +1 -0
  488. package/dist/tui/client.d.ts +86 -0
  489. package/dist/tui/client.d.ts.map +1 -0
  490. package/dist/tui/client.js +229 -0
  491. package/dist/tui/client.js.map +1 -0
  492. package/dist/tui/display.d.ts +127 -0
  493. package/dist/tui/display.d.ts.map +1 -0
  494. package/dist/tui/display.js +474 -0
  495. package/dist/tui/display.js.map +1 -0
  496. package/dist/tui/index.d.ts +21 -0
  497. package/dist/tui/index.d.ts.map +1 -0
  498. package/dist/tui/index.js +305 -0
  499. package/dist/tui/server-settings.d.ts +43 -0
  500. package/dist/tui/server-settings.d.ts.map +1 -0
  501. package/dist/tui/server-settings.js +233 -0
  502. package/dist/tui/server-settings.js.map +1 -0
  503. package/dist/tui/sidebar.d.ts +41 -0
  504. package/dist/tui/sidebar.d.ts.map +1 -0
  505. package/dist/tui/sidebar.js +148 -0
  506. package/dist/tui/status-line.d.ts +14 -0
  507. package/dist/tui/status-line.d.ts.map +1 -0
  508. package/dist/tui/status-line.js +225 -0
  509. package/dist/tui/theme.d.ts +41 -0
  510. package/dist/tui/theme.d.ts.map +1 -0
  511. package/dist/tui/theme.js +52 -0
  512. package/dist/tui/theme.js.map +1 -0
  513. package/dist/tui/toast-colors.d.ts +37 -0
  514. package/dist/tui/toast-colors.d.ts.map +1 -0
  515. package/dist/tui/toast-colors.js +77 -0
  516. package/dist/tui/toasts.d.ts +59 -0
  517. package/dist/tui/toasts.d.ts.map +1 -0
  518. package/dist/tui/toasts.js +148 -0
  519. package/dist/tui/toasts.js.map +1 -0
  520. package/dist/tui/window/drag.d.ts +26 -0
  521. package/dist/tui/window/drag.d.ts.map +1 -0
  522. package/dist/tui/window/drag.js +80 -0
  523. package/dist/tui/window/drag.js.map +1 -0
  524. package/dist/tui/window/limits.d.ts +15 -0
  525. package/dist/tui/window/limits.d.ts.map +1 -0
  526. package/dist/tui/window/limits.js +227 -0
  527. package/dist/tui/window/limits.js.map +1 -0
  528. package/dist/tui/window/rail.d.ts +21 -0
  529. package/dist/tui/window/rail.d.ts.map +1 -0
  530. package/dist/tui/window/rail.js +81 -0
  531. package/dist/tui/window/settings.d.ts +164 -0
  532. package/dist/tui/window/settings.d.ts.map +1 -0
  533. package/dist/tui/window/settings.js +1679 -0
  534. package/dist/tui/window/shell.d.ts +108 -0
  535. package/dist/tui/window/shell.d.ts.map +1 -0
  536. package/dist/tui/window/shell.js +1003 -0
  537. package/dist/tui/window/usage.d.ts +75 -0
  538. package/dist/tui/window/usage.d.ts.map +1 -0
  539. package/dist/tui/window/usage.js +928 -0
  540. package/dist/tui/window/views.d.ts +61 -0
  541. package/dist/tui/window/views.d.ts.map +1 -0
  542. package/dist/tui/window/views.js +242 -0
  543. package/dist/tui.d.ts +1 -5
  544. package/dist/tui.js +1 -894
  545. package/dist/view/columns.d.ts +15 -0
  546. package/dist/view/columns.d.ts.map +1 -0
  547. package/dist/view/columns.js +48 -0
  548. package/dist/view/columns.js.map +1 -0
  549. package/dist/view/format.d.ts +82 -0
  550. package/dist/view/format.d.ts.map +1 -0
  551. package/dist/view/format.js +201 -0
  552. package/dist/view/format.js.map +1 -0
  553. package/dist/view/quick-look.d.ts +28 -0
  554. package/dist/view/quick-look.d.ts.map +1 -0
  555. package/dist/view/quick-look.js +150 -0
  556. package/dist/view/quick-look.js.map +1 -0
  557. package/dist/view/select.d.ts +67 -0
  558. package/dist/view/select.d.ts.map +1 -0
  559. package/dist/view/select.js +87 -0
  560. package/dist/view/select.js.map +1 -0
  561. package/dist/view/text.d.ts +153 -0
  562. package/dist/view/text.d.ts.map +1 -0
  563. package/dist/view/text.js +642 -0
  564. package/dist/view/text.js.map +1 -0
  565. package/dist/view/usage.d.ts +86 -0
  566. package/dist/view/usage.d.ts.map +1 -0
  567. package/dist/view/usage.js +724 -0
  568. package/dist/view/usage.js.map +1 -0
  569. package/package.json +4 -6
  570. package/dist/lib/chutes-config.d.ts +0 -15
  571. package/dist/lib/chutes-config.d.ts.map +0 -1
  572. package/dist/lib/chutes-config.js +0 -28
  573. package/dist/lib/chutes-config.js.map +0 -1
  574. package/dist/lib/cli-status.d.ts +0 -8
  575. package/dist/lib/cli-status.d.ts.map +0 -1
  576. package/dist/lib/cli-status.js +0 -98
  577. package/dist/lib/cli-status.js.map +0 -1
  578. package/dist/lib/command-parsing.d.ts +0 -43
  579. package/dist/lib/command-parsing.d.ts.map +0 -1
  580. package/dist/lib/command-parsing.js +0 -103
  581. package/dist/lib/command-parsing.js.map +0 -1
  582. package/dist/lib/config.d.ts +0 -63
  583. package/dist/lib/config.d.ts.map +0 -1
  584. package/dist/lib/config.js +0 -1092
  585. package/dist/lib/config.js.map +0 -1
  586. package/dist/lib/deepseek-auth.d.ts +0 -15
  587. package/dist/lib/deepseek-auth.d.ts.map +0 -1
  588. package/dist/lib/deepseek-auth.js +0 -28
  589. package/dist/lib/deepseek-auth.js.map +0 -1
  590. package/dist/lib/format.d.ts +0 -25
  591. package/dist/lib/format.d.ts.map +0 -1
  592. package/dist/lib/format.js +0 -300
  593. package/dist/lib/format.js.map +0 -1
  594. package/dist/lib/google-agy-companion.d.ts +0 -8
  595. package/dist/lib/google-agy-companion.d.ts.map +0 -1
  596. package/dist/lib/google-agy-companion.js +0 -64
  597. package/dist/lib/google-agy-companion.js.map +0 -1
  598. package/dist/lib/google-gemini-cli-companion.d.ts +0 -8
  599. package/dist/lib/google-gemini-cli-companion.d.ts.map +0 -1
  600. package/dist/lib/google-gemini-cli-companion.js +0 -64
  601. package/dist/lib/google-gemini-cli-companion.js.map +0 -1
  602. package/dist/lib/grouped-entry-normalization.d.ts +0 -12
  603. package/dist/lib/grouped-entry-normalization.d.ts.map +0 -1
  604. package/dist/lib/grouped-entry-normalization.js +0 -124
  605. package/dist/lib/grouped-entry-normalization.js.map +0 -1
  606. package/dist/lib/grouped-header-format.d.ts +0 -5
  607. package/dist/lib/grouped-header-format.d.ts.map +0 -1
  608. package/dist/lib/grouped-header-format.js +0 -16
  609. package/dist/lib/grouped-header-format.js.map +0 -1
  610. package/dist/lib/init-installer.d.ts +0 -123
  611. package/dist/lib/init-installer.d.ts.map +0 -1
  612. package/dist/lib/init-installer.js +0 -1111
  613. package/dist/lib/init-installer.js.map +0 -1
  614. package/dist/lib/jsonc.d.ts +0 -17
  615. package/dist/lib/jsonc.d.ts.map +0 -1
  616. package/dist/lib/jsonc.js +0 -23
  617. package/dist/lib/jsonc.js.map +0 -1
  618. package/dist/lib/kilo-config.d.ts +0 -15
  619. package/dist/lib/kilo-config.d.ts.map +0 -1
  620. package/dist/lib/kilo-config.js +0 -27
  621. package/dist/lib/kilo-config.js.map +0 -1
  622. package/dist/lib/kimi-auth.d.ts +0 -49
  623. package/dist/lib/kimi-auth.d.ts.map +0 -1
  624. package/dist/lib/kimi-auth.js +0 -82
  625. package/dist/lib/kimi-auth.js.map +0 -1
  626. package/dist/lib/markdown-table.d.ts +0 -51
  627. package/dist/lib/markdown-table.d.ts.map +0 -1
  628. package/dist/lib/markdown-table.js +0 -179
  629. package/dist/lib/markdown-table.js.map +0 -1
  630. package/dist/lib/minimax-auth.d.ts +0 -62
  631. package/dist/lib/minimax-auth.d.ts.map +0 -1
  632. package/dist/lib/minimax-auth.js +0 -206
  633. package/dist/lib/minimax-auth.js.map +0 -1
  634. package/dist/lib/nanogpt-config.d.ts +0 -15
  635. package/dist/lib/nanogpt-config.d.ts.map +0 -1
  636. package/dist/lib/nanogpt-config.js +0 -31
  637. package/dist/lib/nanogpt-config.js.map +0 -1
  638. package/dist/lib/ollama-cloud-config.d.ts +0 -15
  639. package/dist/lib/ollama-cloud-config.d.ts.map +0 -1
  640. package/dist/lib/ollama-cloud-config.js +0 -27
  641. package/dist/lib/ollama-cloud-config.js.map +0 -1
  642. package/dist/lib/opencode-go-auth.d.ts +0 -16
  643. package/dist/lib/opencode-go-auth.d.ts.map +0 -1
  644. package/dist/lib/opencode-go-auth.js +0 -42
  645. package/dist/lib/opencode-go-auth.js.map +0 -1
  646. package/dist/lib/opencode-version.d.ts +0 -6
  647. package/dist/lib/opencode-version.d.ts.map +0 -1
  648. package/dist/lib/opencode-version.js +0 -26
  649. package/dist/lib/opencode-version.js.map +0 -1
  650. package/dist/lib/provider-add-command.d.ts +0 -35
  651. package/dist/lib/provider-add-command.d.ts.map +0 -1
  652. package/dist/lib/provider-add-command.js +0 -204
  653. package/dist/lib/provider-add-command.js.map +0 -1
  654. package/dist/lib/provider-add-json-v1-questionnaire.d.ts +0 -32
  655. package/dist/lib/provider-add-json-v1-questionnaire.d.ts.map +0 -1
  656. package/dist/lib/provider-add-json-v1-questionnaire.js +0 -336
  657. package/dist/lib/provider-add-json-v1-questionnaire.js.map +0 -1
  658. package/dist/lib/provider-add.d.ts +0 -21
  659. package/dist/lib/provider-add.d.ts.map +0 -1
  660. package/dist/lib/provider-add.js +0 -219
  661. package/dist/lib/provider-add.js.map +0 -1
  662. package/dist/lib/quota-accounting-projection.d.ts +0 -9
  663. package/dist/lib/quota-accounting-projection.d.ts.map +0 -1
  664. package/dist/lib/quota-accounting-projection.js +0 -254
  665. package/dist/lib/quota-accounting-projection.js.map +0 -1
  666. package/dist/lib/quota-columns.d.ts +0 -38
  667. package/dist/lib/quota-columns.d.ts.map +0 -1
  668. package/dist/lib/quota-columns.js +0 -129
  669. package/dist/lib/quota-columns.js.map +0 -1
  670. package/dist/lib/quota-command-format.d.ts +0 -34
  671. package/dist/lib/quota-command-format.d.ts.map +0 -1
  672. package/dist/lib/quota-command-format.js +0 -240
  673. package/dist/lib/quota-command-format.js.map +0 -1
  674. package/dist/lib/quota-dialog-command-specs.d.ts +0 -63
  675. package/dist/lib/quota-dialog-command-specs.d.ts.map +0 -1
  676. package/dist/lib/quota-dialog-command-specs.js +0 -145
  677. package/dist/lib/quota-dialog-command-specs.js.map +0 -1
  678. package/dist/lib/quota-entry-display.d.ts +0 -7
  679. package/dist/lib/quota-entry-display.d.ts.map +0 -1
  680. package/dist/lib/quota-entry-display.js +0 -59
  681. package/dist/lib/quota-entry-display.js.map +0 -1
  682. package/dist/lib/quota-exhaustion-projection.d.ts +0 -11
  683. package/dist/lib/quota-exhaustion-projection.d.ts.map +0 -1
  684. package/dist/lib/quota-exhaustion-projection.js +0 -105
  685. package/dist/lib/quota-exhaustion-projection.js.map +0 -1
  686. package/dist/lib/quota-format-style.d.ts +0 -21
  687. package/dist/lib/quota-format-style.d.ts.map +0 -1
  688. package/dist/lib/quota-format-style.js +0 -38
  689. package/dist/lib/quota-format-style.js.map +0 -1
  690. package/dist/lib/quota-render-data.d.ts +0 -102
  691. package/dist/lib/quota-render-data.d.ts.map +0 -1
  692. package/dist/lib/quota-render-data.js +0 -419
  693. package/dist/lib/quota-render-data.js.map +0 -1
  694. package/dist/lib/quota-reset-notifications.d.ts +0 -20
  695. package/dist/lib/quota-reset-notifications.d.ts.map +0 -1
  696. package/dist/lib/quota-reset-notifications.js +0 -331
  697. package/dist/lib/quota-reset-notifications.js.map +0 -1
  698. package/dist/lib/quota-runtime-context.d.ts +0 -54
  699. package/dist/lib/quota-runtime-context.d.ts.map +0 -1
  700. package/dist/lib/quota-runtime-context.js +0 -110
  701. package/dist/lib/quota-runtime-context.js.map +0 -1
  702. package/dist/lib/quota-state-codec.d.ts +0 -16
  703. package/dist/lib/quota-state-codec.d.ts.map +0 -1
  704. package/dist/lib/quota-state-codec.js +0 -412
  705. package/dist/lib/quota-state-codec.js.map +0 -1
  706. package/dist/lib/quota-state.d.ts +0 -28
  707. package/dist/lib/quota-state.d.ts.map +0 -1
  708. package/dist/lib/quota-state.js +0 -473
  709. package/dist/lib/quota-state.js.map +0 -1
  710. package/dist/lib/quota-stats-format.d.ts +0 -29
  711. package/dist/lib/quota-stats-format.d.ts.map +0 -1
  712. package/dist/lib/quota-stats-format.js +0 -459
  713. package/dist/lib/quota-stats-format.js.map +0 -1
  714. package/dist/lib/quota-stats.d.ts +0 -126
  715. package/dist/lib/quota-stats.d.ts.map +0 -1
  716. package/dist/lib/quota-stats.js +0 -695
  717. package/dist/lib/quota-stats.js.map +0 -1
  718. package/dist/lib/quota-surface-data.d.ts +0 -21
  719. package/dist/lib/quota-surface-data.d.ts.map +0 -1
  720. package/dist/lib/quota-surface-data.js +0 -362
  721. package/dist/lib/quota-surface-data.js.map +0 -1
  722. package/dist/lib/scoped-update-migration.d.ts +0 -103
  723. package/dist/lib/scoped-update-migration.d.ts.map +0 -1
  724. package/dist/lib/scoped-update-migration.js +0 -344
  725. package/dist/lib/scoped-update-migration.js.map +0 -1
  726. package/dist/lib/scoped-update.d.ts +0 -77
  727. package/dist/lib/scoped-update.d.ts.map +0 -1
  728. package/dist/lib/scoped-update.js +0 -590
  729. package/dist/lib/scoped-update.js.map +0 -1
  730. package/dist/lib/session-tokens-format.d.ts +0 -36
  731. package/dist/lib/session-tokens-format.d.ts.map +0 -1
  732. package/dist/lib/session-tokens-format.js +0 -111
  733. package/dist/lib/session-tokens-format.js.map +0 -1
  734. package/dist/lib/synthetic-config.d.ts +0 -15
  735. package/dist/lib/synthetic-config.d.ts.map +0 -1
  736. package/dist/lib/synthetic-config.js +0 -28
  737. package/dist/lib/synthetic-config.js.map +0 -1
  738. package/dist/lib/toast-format-grouped.d.ts +0 -25
  739. package/dist/lib/toast-format-grouped.d.ts.map +0 -1
  740. package/dist/lib/toast-format-grouped.js +0 -296
  741. package/dist/lib/toast-format-grouped.js.map +0 -1
  742. package/dist/lib/tui-compact-format.d.ts +0 -10
  743. package/dist/lib/tui-compact-format.d.ts.map +0 -1
  744. package/dist/lib/tui-compact-format.js +0 -460
  745. package/dist/lib/tui-compact-format.js.map +0 -1
  746. package/dist/lib/tui-panel-state.d.ts +0 -15
  747. package/dist/lib/tui-panel-state.d.ts.map +0 -1
  748. package/dist/lib/tui-panel-state.js +0 -2
  749. package/dist/lib/tui-panel-state.js.map +0 -1
  750. package/dist/lib/tui-prompt-bar-format.d.ts +0 -25
  751. package/dist/lib/tui-prompt-bar-format.d.ts.map +0 -1
  752. package/dist/lib/tui-prompt-bar-format.js +0 -206
  753. package/dist/lib/tui-prompt-bar-format.js.map +0 -1
  754. package/dist/lib/tui-sidebar-format.d.ts +0 -13
  755. package/dist/lib/tui-sidebar-format.d.ts.map +0 -1
  756. package/dist/lib/tui-sidebar-format.js +0 -34
  757. package/dist/lib/tui-sidebar-format.js.map +0 -1
  758. package/dist/lib/zai-auth.d.ts +0 -15
  759. package/dist/lib/zai-auth.d.ts.map +0 -1
  760. package/dist/lib/zai-auth.js +0 -37
  761. package/dist/lib/zai-auth.js.map +0 -1
  762. package/dist/lib/zai.d.ts +0 -5
  763. package/dist/lib/zai.d.ts.map +0 -1
  764. package/dist/lib/zai.js +0 -14
  765. package/dist/lib/zai.js.map +0 -1
  766. package/dist/lib/zhipu-auth.d.ts +0 -15
  767. package/dist/lib/zhipu-auth.d.ts.map +0 -1
  768. package/dist/lib/zhipu-auth.js +0 -42
  769. package/dist/lib/zhipu-auth.js.map +0 -1
  770. package/dist/lib/zhipu.d.ts +0 -5
  771. package/dist/lib/zhipu.d.ts.map +0 -1
  772. package/dist/lib/zhipu.js +0 -13
  773. package/dist/lib/zhipu.js.map +0 -1
  774. package/dist/providers/glm-coding-plan-provider.d.ts +0 -56
  775. package/dist/providers/glm-coding-plan-provider.d.ts.map +0 -1
  776. package/dist/providers/glm-coding-plan-provider.js +0 -115
  777. package/dist/providers/glm-coding-plan-provider.js.map +0 -1
  778. package/dist/providers/google-account-format.d.ts +0 -7
  779. package/dist/providers/google-account-format.d.ts.map +0 -1
  780. package/dist/providers/google-account-format.js +0 -52
  781. package/dist/providers/google-account-format.js.map +0 -1
  782. package/dist/providers/zai.d.ts +0 -2
  783. package/dist/providers/zai.d.ts.map +0 -1
  784. package/dist/providers/zai.js +0 -24
  785. package/dist/providers/zai.js.map +0 -1
  786. package/dist/providers/zhipu.d.ts +0 -2
  787. package/dist/providers/zhipu.d.ts.map +0 -1
  788. package/dist/providers/zhipu.js +0 -21
  789. package/dist/providers/zhipu.js.map +0 -1
  790. package/dist/tui-v2.d.ts +0 -5
  791. package/dist/tui-v2.d.ts.map +0 -1
  792. package/dist/tui-v2.jsx +0 -624
  793. package/dist/tui-v2.jsx.map +0 -1
  794. package/dist/tui.d.ts.map +0 -1
@@ -0,0 +1,642 @@
1
+ /**
2
+ * The lines of every quota surface, built from the visible groups (`select.ts`). The TUI
3
+ * draws each segment in its color role; the Web and terminal `/quota` text print the plain
4
+ * text.
5
+ */
6
+ import { describeError } from "../core/errors.js";
7
+ import { paceOf, paceText } from "../core/pace.js";
8
+ import { WINDOWS } from "../core/windows.js";
9
+ import { columnsOf } from "./columns.js";
10
+ import { barParts, cacheHit, evenUseCell, fit, LOW_CACHE_MARK, percentText, percentWord, resetText, rowValueText, sessionTokensText, } from "./format.js";
11
+ import { pickRow, windowFor } from "./select.js";
12
+ export function lineText(line) {
13
+ return line.segments.map((segment) => segment.text).join("");
14
+ }
15
+ /**
16
+ * The start of a row without a bar: its name, cut to `most` columns, then spaces up to the bar
17
+ * column, or 2 after a name that reaches it.
18
+ */
19
+ function valueRowStart(indent, name, most, barColumn) {
20
+ const text = `${" ".repeat(indent)}${columnsOf(name) > most ? fit(name, most) : name}`;
21
+ const gap = barColumn - columnsOf(text);
22
+ return `${text}${" ".repeat(gap >= 1 ? gap : 2)}`;
23
+ }
24
+ /** Where even use would be, the ┃ mark in a bar. */
25
+ const EVEN_USE_MARK = "┃";
26
+ /** A bar's cells at the least for the even-use mark; a shorter bar has none. */
27
+ const EVEN_USE_MIN_CELLS = 3;
28
+ /**
29
+ * A bar in two parts: the part left in its level color, then the used part. With `evenLeft`, the
30
+ * percent even use would leave now (`core/pace.ts`), the ┃ mark takes the place of the cell where
31
+ * even use would be, in the row labels' color; a bar under 3 cells gets no mark.
32
+ */
33
+ export function barSegments(shape, percent, width, evenLeft) {
34
+ const [filled, empty] = barParts(shape, percent, width);
35
+ const bar = [
36
+ { text: filled, role: "bar", percent },
37
+ { text: empty, role: "empty", percent },
38
+ ];
39
+ if (evenLeft === undefined || shape === "none" || width < EVEN_USE_MIN_CELLS)
40
+ return bar;
41
+ const mark = evenUseCell(evenLeft, width);
42
+ const marked = [];
43
+ let start = 0;
44
+ for (const segment of bar) {
45
+ const cells = [...segment.text];
46
+ const at = mark - start;
47
+ start += cells.length;
48
+ if (at < 0 || at >= cells.length) {
49
+ marked.push(segment);
50
+ continue;
51
+ }
52
+ marked.push({ ...segment, text: cells.slice(0, at).join("") }, { text: EVEN_USE_MARK, role: "label" }, { ...segment, text: cells.slice(at + 1).join("") });
53
+ }
54
+ return marked.filter((segment) => segment.text !== "");
55
+ }
56
+ /** Where even use would be for a row's bar, when the place draws the mark and the row has a pace. */
57
+ function evenLeftOf(on, row, nowMs) {
58
+ return on ? paceOf(row, nowMs)?.evenLeft : undefined;
59
+ }
60
+ /** The words for a group's last error ("Sign in again"); undefined when its last check worked. */
61
+ function errorWords(group, nowMs) {
62
+ return group.error
63
+ ? { text: describeError(group.error, group.name, nowMs), role: "error" }
64
+ : undefined;
65
+ }
66
+ /** The words after a group's title: its error, or "not checked yet" before the first check. */
67
+ function groupState(group, nowMs) {
68
+ if (group.error)
69
+ return errorWords(group, nowMs);
70
+ if (group.unchecked)
71
+ return { text: "not checked yet", role: "value" };
72
+ return undefined;
73
+ }
74
+ /**
75
+ * "runs out in 1h 5m" when the surface shows it (`on`) and the row, used at its pace so far,
76
+ * runs out before it resets.
77
+ */
78
+ function runsOutText(on, row, nowMs, words) {
79
+ const pace = on ? paceOf(row, nowMs) : undefined;
80
+ return pace?.runsOutInMs === undefined ? undefined : paceText(pace, words);
81
+ }
82
+ /** Marks rows kept from an earlier check when there is no room for the error's words. */
83
+ const ERROR_MARK = "⚠";
84
+ /** Cuts the segments so their text fits in `width` terminal columns. */
85
+ function cut(segments, width) {
86
+ const clipped = [];
87
+ let room = width;
88
+ for (const segment of segments) {
89
+ if (room <= 0)
90
+ break;
91
+ const text = columnsOf(segment.text) > room ? fit(segment.text, room) : segment.text;
92
+ clipped.push({ ...segment, text });
93
+ room -= columnsOf(text);
94
+ }
95
+ return clipped;
96
+ }
97
+ /**
98
+ * Cuts the segments so their text fits in `width` terminal columns. An error never goes
99
+ * away: when not even the start of its words fits, the line ends in " ⚠" instead.
100
+ */
101
+ function clip(segments, width) {
102
+ const clipped = cut(segments, width);
103
+ const error = segments.find((segment) => segment.role === "error");
104
+ if (!error)
105
+ return clipped;
106
+ const kept = clipped.find((segment) => segment.role === "error");
107
+ const mark = ` ${ERROR_MARK}`;
108
+ if ((kept && /[\p{L}\p{N}]|⚠/u.test(kept.text)) || width < columnsOf(mark))
109
+ return clipped;
110
+ const rest = segments.filter((segment) => segment !== error);
111
+ return [...cut(rest, width - columnsOf(mark)), { ...error, text: mark }];
112
+ }
113
+ /**
114
+ * A row's name on the sidebar, the collapsed panel, the status line and a toast: your name for
115
+ * it; else, with `words.rowNames` "short", its window's short name ("5h", "7d") when no other
116
+ * row of its group has the same one; else its label.
117
+ */
118
+ export function rowName(item, group, words) {
119
+ if (words.rowNames === "full" || item.named || !item.row.window) {
120
+ return item.label;
121
+ }
122
+ const short = WINDOWS[item.row.window].short;
123
+ const shared = group.rows.some((other) => other !== item && other.row.window && WINDOWS[other.row.window].short === short);
124
+ return shared ? item.label : short;
125
+ }
126
+ /** §4.1: the expanded panel's title, with the percent's word its rows leave out: "▼ Quota left". */
127
+ export function sidebarTitle(words) {
128
+ const word = percentWord(words);
129
+ return word ? `▼ Quota ${word}` : "▼ Quota";
130
+ }
131
+ /**
132
+ * A group's title line: the provider's name in bold and its account, then (`withState`) its
133
+ * error or "not checked yet" after two spaces. Cut to `width` columns.
134
+ */
135
+ function groupLine(group, nowMs, width, withState) {
136
+ const state = withState ? groupState(group, nowMs) : undefined;
137
+ return {
138
+ id: group.providerId,
139
+ segments: clip([
140
+ { text: group.name, role: "provider", bold: true },
141
+ ...(group.account ? [{ text: ` (${group.account})`, role: "account" }] : []),
142
+ ...(state ? [{ ...state, text: ` ${state.text}` }] : []),
143
+ ], width),
144
+ };
145
+ }
146
+ /** "Session 12.3K in · 2.10K out", cut to `width` columns. */
147
+ function sessionLine(tokens, width) {
148
+ return {
149
+ id: "session",
150
+ segments: clip([
151
+ { text: "Session", role: "label", bold: true },
152
+ { text: ` ${sessionTokensText(tokens)}`, role: "value" },
153
+ ], width),
154
+ };
155
+ }
156
+ /**
157
+ * "⚠ low cache: 35% (claude-sonnet-5)" for the model with the lowest cache hit among those
158
+ * whose cache hit is low (`cacheHit`), its name cut to fit `width`; undefined when none is.
159
+ */
160
+ function lowCacheLine(models, width) {
161
+ let worst;
162
+ for (const model of models) {
163
+ const hit = cacheHit(model);
164
+ if (!hit?.low)
165
+ continue;
166
+ if (!worst || hit.share < worst.hit.share)
167
+ worst = { modelID: model.modelID, hit };
168
+ }
169
+ if (!worst)
170
+ return undefined;
171
+ const start = `${LOW_CACHE_MARK} low cache: ${worst.hit.text}`;
172
+ const nameRoom = width - columnsOf(start) - " ()".length;
173
+ const name = worst.modelID;
174
+ const text = nameRoom >= 2
175
+ ? `${start} (${fit(name, Math.min(columnsOf(name), nameRoom)).trimEnd()})`
176
+ : start;
177
+ return { id: "session", segments: clip([{ text, role: "warning" }], width) };
178
+ }
179
+ /** The most cells a "fill" bar takes on the sidebar. */
180
+ const SIDEBAR_BAR_MOST = 20;
181
+ /**
182
+ * §4.1: the expanded Quota panel, below its title line (`sidebarTitle`). The name column fits
183
+ * the longest name next to a bar; a row without a bar (a balance) starts its value there, or 2
184
+ * columns after a longer name.
185
+ */
186
+ export function sidebarLines(input) {
187
+ const { layout, words, nowMs, width } = input;
188
+ const percentRows = input.groups.flatMap((group) => group.rows
189
+ .filter((item) => item.row.percentRemaining !== undefined)
190
+ .map((item) => ({ ...item, name: rowName(item, group, words) })));
191
+ const resetWidth = 1 + Math.max(0, ...percentRows.map((item) => resetText(item.row, nowMs, words).length));
192
+ const nameWidth = Math.min(layout.labelWidth, Math.max(0, ...percentRows.map((item) => columnsOf(item.name))));
193
+ const barColumn = layout.indent + nameWidth + 1;
194
+ const fixed = barColumn + 5 + resetWidth;
195
+ const wanted = layout.barWidth === "fill" ? SIDEBAR_BAR_MOST : layout.barWidth;
196
+ const barWidth = layout.bar === "none" ? 0 : Math.max(0, Math.min(wanted, width - fixed));
197
+ const rowLine = (item, group) => {
198
+ const { row } = item;
199
+ const percent = row.percentRemaining;
200
+ const name = rowName(item, group, words);
201
+ if (percent === undefined) {
202
+ const start = valueRowStart(layout.indent, name, layout.labelWidth, barColumn);
203
+ return {
204
+ id: row.id,
205
+ segments: clip([
206
+ { text: start, role: "label" },
207
+ { text: rowValueText(row), role: "value" },
208
+ ], width),
209
+ };
210
+ }
211
+ const labelText = `${" ".repeat(layout.indent)}${fit(name, nameWidth)} `;
212
+ return {
213
+ id: row.id,
214
+ segments: [
215
+ { text: labelText, role: "label", percent },
216
+ ...barSegments(layout.bar, percent, barWidth, evenLeftOf(layout.evenUse, row, nowMs)),
217
+ { text: percentText(words, percent, false).padStart(5), role: "percent", percent },
218
+ { text: resetText(row, nowMs, words).padStart(resetWidth), role: "reset", percent },
219
+ ],
220
+ };
221
+ };
222
+ const lines = [];
223
+ input.groups.forEach((group, index) => {
224
+ if (index > 0) {
225
+ for (let gap = 0; gap < layout.providerGap; gap++)
226
+ lines.push({ id: "", segments: [] });
227
+ }
228
+ lines.push(groupLine(group, nowMs, width, true));
229
+ for (const item of group.rows) {
230
+ lines.push(rowLine(item, group));
231
+ const runsOut = runsOutText(input.runsOut, item.row, nowMs, words);
232
+ if (!runsOut)
233
+ continue;
234
+ const text = `${" ".repeat(barColumn)}${runsOut}`;
235
+ lines.push({ id: item.row.id, segments: clip([{ text, role: "warning" }], width) });
236
+ }
237
+ });
238
+ if (input.sessionTokens) {
239
+ for (let gap = 0; gap < layout.providerGap; gap++)
240
+ lines.push({ id: "", segments: [] });
241
+ lines.push(sessionLine(input.sessionTokens, width));
242
+ const lowCache = lowCacheLine(input.sessionTokens.models ?? [], width);
243
+ if (lowCache)
244
+ lines.push(lowCache);
245
+ }
246
+ return lines;
247
+ }
248
+ /** §4.2: the collapsed panel's title. A provider with several accounts counts once. */
249
+ export function collapsedTitle(groups) {
250
+ const count = new Set(groups.map((group) => group.providerId)).size;
251
+ const errors = new Set(groups.filter((group) => group.error).map((group) => group.providerId))
252
+ .size;
253
+ const providers = `${count} ${count === 1 ? "provider" : "providers"}`;
254
+ return `▶ Quota (${providers}${errors ? `, ${errors} ${errors === 1 ? "error" : "errors"}` : ""})`;
255
+ }
256
+ /** A collapsed line's provider (10) and row name (5) columns. */
257
+ const COLLAPSED_NAMES = 15;
258
+ /** The most cells a collapsed bar takes. */
259
+ const COLLAPSED_BAR_MOST = 10;
260
+ /**
261
+ * §4.2: one line per provider with its preferred window. When the last check failed, the
262
+ * error's words take the place of the reset time next to the rows kept from before. The bar
263
+ * takes the room the names, the percent and the longest reset time leave, at most 10 cells.
264
+ */
265
+ export function collapsedLines(input) {
266
+ const { layout, words, nowMs } = input;
267
+ const picks = input.groups.map((group) => ({
268
+ group,
269
+ picked: pickRow(group, windowFor(input.window, group.providerId)),
270
+ }));
271
+ const withWord = words.percent === "used";
272
+ // The percent after a space: " 100%", or " 100% used" with its word.
273
+ const percentWidth = withWord ? 10 : 5;
274
+ // The reset as wide as the longest, at least "11h 59m".
275
+ const resetWidth = Math.max(7, ...picks.map(({ picked }) => picked?.row.percentRemaining === undefined
276
+ ? 0
277
+ : columnsOf(resetText(picked.row, nowMs, words))));
278
+ const room = input.width - COLLAPSED_NAMES - percentWidth - 1 - resetWidth;
279
+ const wanted = layout.barWidth === "fill" ? COLLAPSED_BAR_MOST : layout.barWidth;
280
+ const barWidth = layout.bar === "none" ? 0 : Math.max(0, Math.min(wanted, COLLAPSED_BAR_MOST, room));
281
+ const providerLine = (group, picked) => {
282
+ const percent = picked?.row.percentRemaining;
283
+ const name = { text: `${fit(group.title, 9)} `, role: "provider", percent };
284
+ const state = groupState(group, nowMs);
285
+ if (!picked || percent === undefined) {
286
+ const value = state ?? {
287
+ text: picked ? rowValueText(picked.row) : "",
288
+ role: "value",
289
+ };
290
+ return { id: group.providerId, segments: clip([name, value], input.width) };
291
+ }
292
+ const error = errorWords(group, nowMs);
293
+ return {
294
+ id: group.providerId,
295
+ segments: clip([
296
+ name,
297
+ { text: `${fit(rowName(picked, group, words), 4)} `, role: "label", percent },
298
+ ...barSegments(layout.bar, percent, barWidth, evenLeftOf(layout.evenUse, picked.row, nowMs)),
299
+ {
300
+ text: percentText(words, percent, withWord).padStart(percentWidth),
301
+ role: "percent",
302
+ percent,
303
+ },
304
+ error
305
+ ? { ...error, text: ` ${error.text}` }
306
+ : {
307
+ text: ` ${resetText(picked.row, nowMs, words).padStart(resetWidth)}`,
308
+ role: "reset",
309
+ percent,
310
+ },
311
+ ], input.width),
312
+ };
313
+ };
314
+ return picks.flatMap(({ group, picked }) => {
315
+ const line = providerLine(group, picked);
316
+ const runsOut = picked && runsOutText(input.runsOut, picked.row, nowMs, words);
317
+ if (!runsOut)
318
+ return [line];
319
+ const text = `${" ".repeat(10)}${runsOut}`;
320
+ return [
321
+ line,
322
+ { id: group.providerId, segments: clip([{ text, role: "warning" }], input.width) },
323
+ ];
324
+ });
325
+ }
326
+ const STATUS_LEVELS = ["full", "bar", "reset", "numbers"];
327
+ /** The status line's little bar. */
328
+ const STATUS_BAR_WIDTH = 5;
329
+ /** A provider's name on the status line: with its account only when it shows several. */
330
+ function statusName(input, group) {
331
+ const accounts = input.groups.filter((other) => other.providerId === group.providerId).length;
332
+ return accounts > 1 ? group.title : group.name;
333
+ }
334
+ /**
335
+ * One provider's status line segment at a level of detail (without the separator). When the
336
+ * last check failed, the error's words take the place of the reset time next to the rows kept
337
+ * from before, or "⚠" where the level shows no reset time.
338
+ */
339
+ function statusSegment(input, group, level) {
340
+ const { layout, words, nowMs } = input;
341
+ const picked = pickRow(group, windowFor(input.window, group.providerId));
342
+ const percent = picked?.row.percentRemaining;
343
+ const name = { text: statusName(input, group), role: "statusName", percent };
344
+ if (!picked || percent === undefined) {
345
+ const state = groupState(group, nowMs);
346
+ const value = state ?? { text: picked ? rowValueText(picked.row) : "", role: "value" };
347
+ return { id: group.providerId, segments: [name, { ...value, text: ` ${value.text}` }] };
348
+ }
349
+ const withBar = layout.bar !== "none" && (level === "full" || level === "bar");
350
+ const withReset = level === "full" || level === "reset";
351
+ const error = errorWords(group, nowMs);
352
+ const reset = withReset ? resetText(picked.row, nowMs, words) : "";
353
+ const after = error
354
+ ? { ...error, text: ` ${withReset ? error.text : ERROR_MARK}` }
355
+ : reset
356
+ ? { text: ` ${reset}`, role: "reset", percent }
357
+ : undefined;
358
+ const runsOut = runsOutText(input.runsOut, picked.row, nowMs, words);
359
+ return {
360
+ id: group.providerId,
361
+ segments: [
362
+ name,
363
+ ...(withBar
364
+ ? [
365
+ { text: " ", role: "separator" },
366
+ ...barSegments(layout.bar, percent, STATUS_BAR_WIDTH, evenLeftOf(layout.evenUse, picked.row, nowMs)),
367
+ ]
368
+ : []),
369
+ {
370
+ text: ` ${percentText(words, percent, words.percent === "used")}`,
371
+ role: "percent",
372
+ percent,
373
+ },
374
+ ...(after ? [after] : []),
375
+ ...(runsOut ? [{ text: ` (${runsOut})`, role: "warning" }] : []),
376
+ ],
377
+ };
378
+ }
379
+ /** Cuts the name (the first segment) so the rest still fits in `width`; else cuts the end. */
380
+ function shortenName(segments, width) {
381
+ const [name, ...rest] = segments;
382
+ const nameWidth = width - columnsOf(rest.map((segment) => segment.text).join(""));
383
+ if (!name || nameWidth < 2)
384
+ return clip(segments, width);
385
+ return [{ ...name, text: fit(name.text, nameWidth) }, ...rest];
386
+ }
387
+ /**
388
+ * §4.3 "all" mode: the most detail that fits every group in `room` columns ("% only" when
389
+ * nothing else fits), then the groups that fit from `start`, keeping room for the "‹ " and
390
+ * " +N ›" markers. When not even the first of them fits, its name is cut short, so the
391
+ * markers stay. `level` fixes the detail instead of "auto".
392
+ */
393
+ export function statusLayout(input, room, start, level) {
394
+ const { groups } = input;
395
+ const separator = input.layout.separator;
396
+ const widthAt = (candidate) => groups.reduce((sum, group) => sum + columnsOf(lineText(statusSegment(input, group, candidate))), 0) +
397
+ Math.max(0, groups.length - 1) * columnsOf(separator);
398
+ const chosen = level !== "auto"
399
+ ? level
400
+ : (STATUS_LEVELS.find((candidate) => widthAt(candidate) <= room) ?? "numbers");
401
+ const first = Math.max(0, Math.min(start, groups.length - 1));
402
+ const shown = [];
403
+ let used = first > 0 ? 2 : 0;
404
+ const markerWidth = (index) => index < groups.length - 1 ? columnsOf(` +${groups.length - index} ›`) : 0;
405
+ for (let index = first; index < groups.length; index++) {
406
+ const segment = statusSegment(input, groups[index], chosen);
407
+ const width = columnsOf(lineText(segment)) + (shown.length > 0 ? columnsOf(separator) : 0);
408
+ if (used + width + markerWidth(index) > room)
409
+ break;
410
+ shown.push(segment);
411
+ used += width;
412
+ }
413
+ const firstGroup = groups[first];
414
+ const left = room - used - markerWidth(first);
415
+ if (shown.length === 0 && firstGroup && left > 0) {
416
+ const segment = statusSegment(input, firstGroup, chosen);
417
+ shown.push({ ...segment, segments: shortenName(segment.segments, left) });
418
+ }
419
+ return { level: chosen, start: first, shown, hiddenAfter: groups.length - first - shown.length };
420
+ }
421
+ /**
422
+ * §4.3 "one provider, big bar" (v5's prompt bar): the first group with a 10-cell bar. The
423
+ * error's words take the place of the reset time; without a percent row the line shows the
424
+ * group's error or value instead of a bar. Cut to `width` columns when given, keeping " ⚠"
425
+ * when the error's words don't fit.
426
+ */
427
+ export function bigStatusLine(input, width) {
428
+ const group = input.groups[0];
429
+ if (!group)
430
+ return undefined;
431
+ const picked = pickRow(group, windowFor(input.window, group.providerId));
432
+ const percent = picked?.row.percentRemaining;
433
+ if (!picked || percent === undefined) {
434
+ const line = statusSegment(input, group, "full");
435
+ return width === undefined ? line : { ...line, segments: clip(line.segments, width) };
436
+ }
437
+ const error = errorWords(group, input.nowMs);
438
+ const reset = resetText(picked.row, input.nowMs, input.words);
439
+ const after = error
440
+ ? { ...error, text: ` · ${error.text}` }
441
+ : reset
442
+ ? { text: ` · ${reset}`, role: "reset", percent }
443
+ : undefined;
444
+ const runsOut = runsOutText(input.runsOut, picked.row, input.nowMs, input.words);
445
+ const segments = [
446
+ {
447
+ text: `${statusName(input, group)} ${rowName(picked, group, input.words)} `,
448
+ role: "statusName",
449
+ percent,
450
+ },
451
+ ...barSegments(input.layout.bar, percent, 10, evenLeftOf(input.layout.evenUse, picked.row, input.nowMs)),
452
+ { text: ` ${percentText(input.words, percent, true)}`, role: "percent", percent },
453
+ ...(after ? [after] : []),
454
+ ...(runsOut ? [{ text: ` · ${runsOut}`, role: "warning" }] : []),
455
+ ];
456
+ return { id: group.providerId, segments: width === undefined ? segments : clip(segments, width) };
457
+ }
458
+ /** The name column of plain lines: the provider and the row's label. */
459
+ const PLAIN_NAME_WIDTH = 19;
460
+ /**
461
+ * §4.4: plain text, one line per visible row, then a line per provider error. The Web and
462
+ * terminal `/quota` text print these.
463
+ */
464
+ export function plainLines(params) {
465
+ const { words, nowMs } = params;
466
+ const lines = params.groups.flatMap((group) => {
467
+ const rows = group.rows.map(({ row, label }) => {
468
+ const name = fit(`${group.title} ${label}`, PLAIN_NAME_WIDTH);
469
+ if (row.percentRemaining === undefined)
470
+ return `${name} ${rowValueText(row)}`.trimEnd();
471
+ const percent = percentText(words, row.percentRemaining, true).padEnd(13);
472
+ const line = `${name} ${percent} ${resetText(row, nowMs, words)}`.trimEnd();
473
+ const runsOut = runsOutText(params.runsOut, row, nowMs, words);
474
+ return runsOut ? `${line} ${runsOut}` : line;
475
+ });
476
+ const state = groupState(group, nowMs);
477
+ return state ? [...rows, `${fit(group.title, PLAIN_NAME_WIDTH)} ${state.text}`] : rows;
478
+ });
479
+ return params.sessionTokens
480
+ ? [...lines, `Session ${sessionTokensText(params.sessionTokens)}`]
481
+ : lines;
482
+ }
483
+ /** A toast bar's cells at the least; with less room the row has no bar. */
484
+ const TOAST_BAR_MIN = 3;
485
+ /** A grouped toast's row indent, its name column and its bar at the most. */
486
+ const GROUPED_INDENT = 2;
487
+ const GROUPED_NAME_MAX = 9;
488
+ const GROUPED_BAR_MAX = 20;
489
+ /** The segments without the spaces at the end of their line. */
490
+ function trimEnd(segments) {
491
+ const trimmed = [...segments];
492
+ while (trimmed.length > 0) {
493
+ const last = trimmed[trimmed.length - 1];
494
+ const text = last.text.trimEnd();
495
+ if (text) {
496
+ trimmed[trimmed.length - 1] = { ...last, text };
497
+ break;
498
+ }
499
+ trimmed.pop();
500
+ }
501
+ return trimmed;
502
+ }
503
+ /** "runs out in 2h" at `column`, or further left so it ends inside `room`. */
504
+ function runsOutLine(id, runsOut, column, room) {
505
+ const indent = Math.max(0, Math.min(column, room - columnsOf(runsOut)));
506
+ return {
507
+ id,
508
+ segments: clip([{ text: `${" ".repeat(indent)}${runsOut}`, role: "warning" }], room),
509
+ };
510
+ }
511
+ /**
512
+ * The grouped toast: a line per provider account with its error, then its rows indented 2:
513
+ * the name, a bar in the room the other columns leave (at most 20 cells), the percent and the
514
+ * reset time. "runs out in" goes under the row at the bar's column. The name column fits the
515
+ * longest name next to a bar; a row without a bar starts its value there, or 2 columns after a
516
+ * longer name.
517
+ */
518
+ function groupedToastLines(input) {
519
+ const { words, nowMs, room } = input;
520
+ const word = percentWord(words);
521
+ // "100% left": the number right-aligned, then its word.
522
+ const percentWidth = 4 + (word ? word.length + 1 : 0);
523
+ const named = input.groups.map((group) => ({
524
+ group,
525
+ rows: group.rows.map((item) => ({ ...item, name: rowName(item, group, words) })),
526
+ }));
527
+ const items = named.flatMap(({ rows }) => rows);
528
+ const resetWidth = Math.max(0, ...items.map(({ row }) => row.percentRemaining === undefined ? 0 : columnsOf(resetText(row, nowMs, words))));
529
+ const nameWidth = Math.min(GROUPED_NAME_MAX, Math.max(0, ...items
530
+ .filter(({ row }) => row.percentRemaining !== undefined)
531
+ .map(({ name }) => columnsOf(name))));
532
+ const barColumn = GROUPED_INDENT + nameWidth + 1;
533
+ const fixed = barColumn + 1 + percentWidth + (resetWidth > 0 ? 2 + resetWidth : 0);
534
+ const barWidth = input.bar === "none" ? 0 : Math.min(GROUPED_BAR_MAX, room - fixed);
535
+ const withBar = barWidth >= TOAST_BAR_MIN;
536
+ const rowLines = (item) => {
537
+ const { row } = item;
538
+ const percent = row.percentRemaining;
539
+ if (percent === undefined) {
540
+ const start = valueRowStart(GROUPED_INDENT, item.name, GROUPED_NAME_MAX, barColumn);
541
+ const value = { text: rowValueText(row), role: "value" };
542
+ return [{ id: row.id, segments: clip([{ text: start, role: "label" }, value], room) }];
543
+ }
544
+ const name = `${" ".repeat(GROUPED_INDENT)}${fit(item.name, nameWidth)} `;
545
+ const number = percentText(words, percent, false).padStart(4);
546
+ const reset = resetText(row, nowMs, words);
547
+ const segments = [
548
+ { text: name, role: "label", percent },
549
+ ...(withBar
550
+ ? barSegments(input.bar, percent, barWidth, evenLeftOf(input.evenUse, row, nowMs))
551
+ : []),
552
+ {
553
+ text: `${withBar ? " " : ""}${word ? `${number} ${word}` : number}`,
554
+ role: "percent",
555
+ percent,
556
+ },
557
+ ...(reset ? [{ text: ` ${reset}`, role: "reset", percent }] : []),
558
+ ];
559
+ const line = { id: row.id, segments: clip(segments, room) };
560
+ const runsOut = runsOutText(input.runsOut, row, nowMs, words);
561
+ return runsOut ? [line, runsOutLine(row.id, runsOut, barColumn, room)] : [line];
562
+ };
563
+ const lines = named.flatMap(({ group, rows }) => [
564
+ groupLine(group, nowMs, room, true),
565
+ ...rows.flatMap(rowLines),
566
+ ]);
567
+ return input.sessionTokens ? [...lines, sessionLine(input.sessionTokens, room)] : lines;
568
+ }
569
+ /**
570
+ * `left` at the start of a line `room` columns wide and `right` at its end; `left` is cut with
571
+ * "…" when both don't fit.
572
+ */
573
+ function spread(left, right, room) {
574
+ const leftRoom = room - columnsOf(right.text) - 1;
575
+ if (leftRoom < 1)
576
+ return clip([left, { ...right, text: ` ${right.text}` }], room);
577
+ const leftText = columnsOf(left.text) > leftRoom ? fit(left.text, leftRoom) : left.text;
578
+ const gap = " ".repeat(room - columnsOf(leftText) - columnsOf(right.text));
579
+ return [
580
+ { ...left, text: leftText },
581
+ { ...right, text: `${gap}${right.text}` },
582
+ ];
583
+ }
584
+ /**
585
+ * The detailed toast (v5's look): an empty line between providers, the provider's name, its
586
+ * error under it, then per row its name with the reset time at the right, and a bar as wide
587
+ * as the toast with the percent at the right. "runs out in" goes under the bar.
588
+ */
589
+ function detailedToastLines(input) {
590
+ const { words, nowMs, room } = input;
591
+ const percents = input.groups.flatMap((group) => group.rows.flatMap(({ row }) => row.percentRemaining === undefined ? [] : [percentText(words, row.percentRemaining, true)]));
592
+ const percentWidth = Math.max(0, ...percents.map(columnsOf));
593
+ const barWidth = input.bar === "none" ? 0 : room - 2 - percentWidth;
594
+ const rowLines = (item, group) => {
595
+ const { row } = item;
596
+ const percent = row.percentRemaining;
597
+ const name = { text: rowName(item, group, words), role: "label", percent };
598
+ if (percent === undefined) {
599
+ const value = { text: rowValueText(row), role: "value" };
600
+ return [{ id: row.id, segments: spread(name, value, room) }];
601
+ }
602
+ const reset = resetText(row, nowMs, words);
603
+ const percentWords = percentText(words, percent, true).padStart(percentWidth);
604
+ const bar = barWidth >= TOAST_BAR_MIN
605
+ ? [
606
+ ...barSegments(input.bar, percent, barWidth, evenLeftOf(input.evenUse, row, nowMs)),
607
+ { text: ` ${percentWords}`, role: "percent", percent },
608
+ ]
609
+ : [{ text: percentWords.padStart(room), role: "percent", percent }];
610
+ const runsOut = runsOutText(input.runsOut, row, nowMs, words);
611
+ return [
612
+ {
613
+ id: row.id,
614
+ segments: reset
615
+ ? spread(name, { text: reset, role: "reset", percent }, room)
616
+ : clip([name], room),
617
+ },
618
+ { id: row.id, segments: clip(bar, room) },
619
+ ...(runsOut ? [runsOutLine(row.id, runsOut, 0, room)] : []),
620
+ ];
621
+ };
622
+ const blank = { id: "", segments: [] };
623
+ const lines = input.groups.flatMap((group, index) => {
624
+ const state = groupState(group, nowMs);
625
+ return [
626
+ ...(index > 0 ? [blank] : []),
627
+ groupLine(group, nowMs, room, false),
628
+ ...(state ? [{ id: group.providerId, segments: clip([state], room) }] : []),
629
+ ...group.rows.flatMap((item) => rowLines(item, group)),
630
+ ];
631
+ });
632
+ if (!input.sessionTokens)
633
+ return lines;
634
+ const session = spread({ text: "Session", role: "label", bold: true }, { text: sessionTokensText(input.sessionTokens), role: "value" }, room);
635
+ return [...lines, ...(lines.length > 0 ? [blank] : []), { id: "session", segments: session }];
636
+ }
637
+ /** §4.4: a quota toast's lines in its layout, none wider than `room` columns. */
638
+ export function toastLines(input) {
639
+ const lines = input.layout === "detailed" ? detailedToastLines(input) : groupedToastLines(input);
640
+ return lines.map((line) => ({ ...line, segments: trimEnd(line.segments) }));
641
+ }
642
+ //# sourceMappingURL=text.js.map