@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,928 @@
1
+ import { use as _$use } from "@opentui/solid";
2
+ import { createTextNode as _$createTextNode } from "@opentui/solid";
3
+ import { createComponent as _$createComponent } from "@opentui/solid";
4
+ import { insertNode as _$insertNode } from "@opentui/solid";
5
+ import { effect as _$effect } from "@opentui/solid";
6
+ import { insert as _$insert } from "@opentui/solid";
7
+ import { memo as _$memo } from "@opentui/solid";
8
+ import { setProp as _$setProp } from "@opentui/solid";
9
+ import { createElement as _$createElement } from "@opentui/solid";
10
+ /** @jsxImportSource @opentui/solid */
11
+ /**
12
+ * The quota window's Usage tab: tokens and API cost from OpenCode's own history, laid out by
13
+ * `view/usage.ts`, and the model detail popup. The window puts the range list (`Rail`) left of
14
+ * the scrolling content (`View`), a muted line between them. The content's first line has the
15
+ * chosen range and its dates, and Cost and Tokens at its right; the Breakdown heading has Model
16
+ * and Day at its right.
17
+ *
18
+ * The range list has the keyboard when the tab shows: ↑↓ change the range. → or enter give the
19
+ * keyboard to the model rows: ↑↓ walk them, the current one highlighted, enter opens a model's
20
+ * details and ← goes back to the range list. Anywhere in the tab: c cost, t tokens, b by model
21
+ * or by day, p download new prices, and d types the dates of "Between": the two date boxes show
22
+ * on the first line, enter goes to the next date and then applies them, tab switches dates, esc
23
+ * gives the keyboard back. A click picks a range, Cost or Tokens, Model or Day, or opens a model.
24
+ *
25
+ * The tab keeps Cost or Tokens and Model or Day while the window is open and closed. Switching
26
+ * to the tab, or opening the window on it, shows the default range; `/quota_usage <range>` and
27
+ * the `/tokens_*` commands show theirs. Each show asks the server again. An answer that arrives
28
+ * after a newer question is dropped.
29
+ */
30
+ import { RGBA, TextAttributes } from "@opentui/core";
31
+ import { useTerminalDimensions } from "@opentui/solid";
32
+ import { createSignal, Show } from "solid-js";
33
+ import { DEFAULT_USAGE_RANGE, USAGE_RANGES, usageRangeLabel } from "../../core/usage-ranges.js";
34
+ import { parseCalendarDate } from "../../lib/calendar-date.js";
35
+ import { sanitizeDisplayText } from "../../lib/display-sanitize.js";
36
+ import { QuotaRpc } from "../../rpc.js";
37
+ import { breakdownModels, modelDetailTitle, modelDetailView, rangeDates, usageView } from "../../view/usage.js";
38
+ import { errorToast, quotaCallOptions, rpcErrorMessage } from "../client.js";
39
+ import { Rail, railRoom } from "./rail.js";
40
+
41
+ /** OpenCode's theme also has categorical hue scales, for things told apart by color. */
42
+
43
+ /** OpenCode's "large" dialog width (dialogWidth in its ui/dialog.tsx). */
44
+ const DIALOG_WIDTH = 88;
45
+ /** Room for " esc" after the model popup's title. */
46
+ const CLOSE_LABEL_ROOM = " esc".length;
47
+ const KEYS = "Usage";
48
+ /** An option's two spaces around its label, inside its raised background. */
49
+ const OPTION_PAD = 2;
50
+ const TRANSPARENT = RGBA.fromInts(0, 0, 0, 0);
51
+ /** The content starts one column after the range list's line. */
52
+ const RANGE_LIST_GAP = 1;
53
+ /** What the window keeps left of the content: the range list, the line after it and a gap. */
54
+ export const USAGE_RAIL_WIDTH = railRoom(RANGE_LIST_GAP);
55
+
56
+ /** How each "by type" part is shaded, from the muted color (0) to the text color (1). */
57
+ const PART_SHADES = {
58
+ "part:cacheRead": 0,
59
+ "part:input": 0.45,
60
+ "part:cacheWrite": 0.75,
61
+ "part:output": 1
62
+ };
63
+
64
+ /** Where the tab's keyboard is: the range list, or the content with its model rows. */
65
+
66
+ /** A range's line in the range list. */
67
+ function rangeId(range) {
68
+ return `quota-usage-range-${range}`;
69
+ }
70
+
71
+ /** The range list's items, each with its element id. */
72
+ const RANGE_ITEMS = USAGE_RANGES.map(item => ({
73
+ key: item.range,
74
+ label: item.label,
75
+ id: rangeId(item.range)
76
+ }));
77
+
78
+ /** A model row's element id, to scroll it into view. */
79
+ function modelRowId(index) {
80
+ return `quota-usage-model-${index}`;
81
+ }
82
+ function isBreakdownHeading(line) {
83
+ return line.length === 1 && line[0].role === "heading" && line[0].text === "Breakdown";
84
+ }
85
+
86
+ /** `from` moved `share` of the way to `to`. */
87
+ function mix(from, to, share) {
88
+ const step = (a, b) => a + (b - a) * share;
89
+ return RGBA.fromValues(step(from.r, to.r), step(from.g, to.g), step(from.b, to.b), step(from.a, to.a));
90
+ }
91
+ /** The first day of this month and today, local dates like "2026-10-01". */
92
+ function thisMonth(nowMs) {
93
+ const now = new Date(nowMs);
94
+ const month = `${now.getFullYear()}-${String(now.getMonth() + 1).padStart(2, "0")}`;
95
+ return {
96
+ from: `${month}-01`,
97
+ to: `${month}-${String(now.getDate()).padStart(2, "0")}`
98
+ };
99
+ }
100
+ function roleColor(theme, role) {
101
+ if (role.startsWith("provider:")) {
102
+ const scales = theme.categorical ?? [];
103
+ const scale = scales[Number(role.slice("provider:".length)) % Math.max(1, scales.length)];
104
+ return scale?.[200] ?? theme.hue.accent[500] ?? theme.text.base;
105
+ }
106
+ if (role.startsWith("part:")) return mix(theme.text.muted, theme.text.base, PART_SHADES[role] ?? 1);
107
+ switch (role) {
108
+ case "muted":
109
+ return theme.text.muted;
110
+ case "warning":
111
+ return theme.text.feedback.warning.base;
112
+ case "good":
113
+ return theme.text.feedback.success.base;
114
+ case "bar":
115
+ return theme.hue.accent[500] ?? theme.text.base;
116
+ default:
117
+ return theme.text.base;
118
+ }
119
+ }
120
+
121
+ /**
122
+ * One view line as one text, each span in its role's color on its `back` role's color (a chart
123
+ * cell shared by two providers); title and headings bold.
124
+ */
125
+ function UsageLineText(props) {
126
+ const theme = () => props.theme;
127
+ return (() => {
128
+ var _el$ = _$createElement("text");
129
+ _$setProp(_el$, "wrapMode", "none");
130
+ _$setProp(_el$, "flexShrink", 0);
131
+ _$insert(_el$, () => props.line.length === 0 ? " " : null, null);
132
+ _$insert(_el$, () => props.line.map(part => (() => {
133
+ var _el$2 = _$createElement("span");
134
+ _$insert(_el$2, () => sanitizeDisplayText(part.text));
135
+ _$effect(_$p => _$setProp(_el$2, "style", {
136
+ fg: props.selected ? theme().text.action.primary.focused : roleColor(theme(), part.role),
137
+ // A span keeps a background once drawn: set one always, so a line let go clears it.
138
+ bg: props.selected ? theme().background.action.primary.focused : part.back ? roleColor(theme(), part.back) : TRANSPARENT,
139
+ bold: part.role === "title" || part.role === "heading"
140
+ }, _$p));
141
+ return _el$2;
142
+ })()), null);
143
+ _$effect(_p$ => {
144
+ var _v$ = props.id,
145
+ _v$2 = props.onClick;
146
+ _v$ !== _p$.e && (_p$.e = _$setProp(_el$, "id", _v$, _p$.e));
147
+ _v$2 !== _p$.t && (_p$.t = _$setProp(_el$, "onMouseUp", _v$2, _p$.t));
148
+ return _p$;
149
+ }, {
150
+ e: undefined,
151
+ t: undefined
152
+ });
153
+ return _el$;
154
+ })();
155
+ }
156
+
157
+ /** A tab of the window's tab bar: bold and underlined when it is the current one. */
158
+ export function Choice(props) {
159
+ return (() => {
160
+ var _el$3 = _$createElement("text");
161
+ _$setProp(_el$3, "wrapMode", "none");
162
+ _$setProp(_el$3, "selectable", false);
163
+ _$insert(_el$3, () => props.label);
164
+ _$effect(_p$ => {
165
+ var _v$3 = props.active ? props.theme.text.action.primary.selected : props.theme.text.muted,
166
+ _v$4 = props.active ? TextAttributes.BOLD | TextAttributes.UNDERLINE : TextAttributes.NONE,
167
+ _v$5 = props.run;
168
+ _v$3 !== _p$.e && (_p$.e = _$setProp(_el$3, "fg", _v$3, _p$.e));
169
+ _v$4 !== _p$.t && (_p$.t = _$setProp(_el$3, "attributes", _v$4, _p$.t));
170
+ _v$5 !== _p$.a && (_p$.a = _$setProp(_el$3, "onMouseUp", _v$5, _p$.a));
171
+ return _p$;
172
+ }, {
173
+ e: undefined,
174
+ t: undefined,
175
+ a: undefined
176
+ });
177
+ return _el$3;
178
+ })();
179
+ }
180
+
181
+ /**
182
+ * An option inside the Usage tab (cost or tokens, model or day): the current one bold on
183
+ * a raised background, so a row of options reads apart from the tab bar's underlined tabs. On
184
+ * the highlighted line (`lit`) the other options take its text color.
185
+ */
186
+ export function Option(props) {
187
+ const idle = () => props.lit ? props.theme.text.action.primary.focused : props.theme.text.muted;
188
+ return (() => {
189
+ var _el$4 = _$createElement("box"),
190
+ _el$5 = _$createElement("text");
191
+ _$insertNode(_el$4, _el$5);
192
+ _$setProp(_el$4, "paddingLeft", 1);
193
+ _$setProp(_el$4, "paddingRight", 1);
194
+ _$setProp(_el$4, "flexShrink", 0);
195
+ _$setProp(_el$5, "wrapMode", "none");
196
+ _$setProp(_el$5, "selectable", false);
197
+ _$insert(_el$5, () => props.label);
198
+ _$effect(_p$ => {
199
+ var _v$6 = props.active ? props.theme.background.raised.high : TRANSPARENT,
200
+ _v$7 = props.run,
201
+ _v$8 = props.active ? props.theme.text.action.primary.selected : idle(),
202
+ _v$9 = props.active ? TextAttributes.BOLD : TextAttributes.NONE;
203
+ _v$6 !== _p$.e && (_p$.e = _$setProp(_el$4, "backgroundColor", _v$6, _p$.e));
204
+ _v$7 !== _p$.t && (_p$.t = _$setProp(_el$4, "onMouseUp", _v$7, _p$.t));
205
+ _v$8 !== _p$.a && (_p$.a = _$setProp(_el$5, "fg", _v$8, _p$.a));
206
+ _v$9 !== _p$.o && (_p$.o = _$setProp(_el$5, "attributes", _v$9, _p$.o));
207
+ return _p$;
208
+ }, {
209
+ e: undefined,
210
+ t: undefined,
211
+ a: undefined,
212
+ o: undefined
213
+ });
214
+ return _el$4;
215
+ })();
216
+ }
217
+
218
+ /** The model detail popup, in OpenCode's dialog: scrolls with ↑↓, closes with esc. */
219
+ function ModelDetail(props) {
220
+ const theme = () => props.api.theme;
221
+ const dimensions = useTerminalDimensions();
222
+ // The dialog is its size's width, at most the terminal's minus 2, inside this box's paddings
223
+ // (2 + 2). The lines below the title leave a column for the scrollbar; the title leaves room
224
+ // for " esc".
225
+ const innerWidth = () => Math.min(DIALOG_WIDTH, dimensions().width - 2) - 4;
226
+ const width = () => innerWidth() - 1;
227
+ const title = () => modelDetailTitle(props.report, props.model, innerWidth() - CLOSE_LABEL_ROOM);
228
+ // The dialog starts a quarter of the way down; the title row and paddings take 4 rows.
229
+ const maxHeight = () => Math.max(1, Math.floor(dimensions().height * 0.75) - 4);
230
+ const lines = () => modelDetailView(props.report, props.model, {
231
+ mode: props.mode,
232
+ width: width()
233
+ });
234
+ let scroll;
235
+ props.api.keymap.layer(() => ({
236
+ mode: "modal",
237
+ commands: [{
238
+ bind: "up",
239
+ title: "Scroll up",
240
+ group: KEYS,
241
+ run: () => scroll?.scrollBy(-1)
242
+ }, {
243
+ bind: "down",
244
+ title: "Scroll down",
245
+ group: KEYS,
246
+ run: () => scroll?.scrollBy(1)
247
+ }]
248
+ }));
249
+ return (() => {
250
+ var _el$6 = _$createElement("box"),
251
+ _el$7 = _$createElement("box"),
252
+ _el$8 = _$createElement("box"),
253
+ _el$9 = _$createElement("text"),
254
+ _el$1 = _$createElement("scrollbox");
255
+ _$insertNode(_el$6, _el$7);
256
+ _$insertNode(_el$6, _el$1);
257
+ _$setProp(_el$6, "paddingLeft", 2);
258
+ _$setProp(_el$6, "paddingRight", 2);
259
+ _$setProp(_el$6, "paddingBottom", 1);
260
+ _$insertNode(_el$7, _el$8);
261
+ _$insertNode(_el$7, _el$9);
262
+ _$setProp(_el$7, "flexDirection", "row");
263
+ _$insert(_el$7, _$createComponent(UsageLineText, {
264
+ get line() {
265
+ return title();
266
+ },
267
+ get theme() {
268
+ return theme();
269
+ }
270
+ }), _el$8);
271
+ _$setProp(_el$8, "flexGrow", 1);
272
+ _$insertNode(_el$9, _$createTextNode(`esc`));
273
+ _$setProp(_el$9, "flexShrink", 0);
274
+ _$setProp(_el$9, "selectable", false);
275
+ _$setProp(_el$9, "onMouseUp", () => props.api.ui.dialog.clear());
276
+ _$use(element => {
277
+ scroll = element;
278
+ }, _el$1);
279
+ _$insert(_el$1, () => lines().slice(1).map(line => _$createComponent(UsageLineText, {
280
+ line: line,
281
+ get theme() {
282
+ return theme();
283
+ }
284
+ })));
285
+ _$effect(_p$ => {
286
+ var _v$0 = theme().text.muted,
287
+ _v$1 = maxHeight();
288
+ _v$0 !== _p$.e && (_p$.e = _$setProp(_el$9, "fg", _v$0, _p$.e));
289
+ _v$1 !== _p$.t && (_p$.t = _$setProp(_el$1, "maxHeight", _v$1, _p$.t));
290
+ return _p$;
291
+ }, {
292
+ e: undefined,
293
+ t: undefined
294
+ });
295
+ return _el$6;
296
+ })();
297
+ }
298
+
299
+ /** A range to show, with its dates for "between". */
300
+
301
+ /** `scroll`: the window's scrollbox, which keeps the current model row in view. */
302
+ export function createUsageTab(api, scroll) {
303
+ const [range, setRange] = createSignal(DEFAULT_USAGE_RANGE);
304
+ const [mode, setMode] = createSignal("cost");
305
+ const [breakdown, setBreakdown] = createSignal("model");
306
+ const [dates, setDates] = createSignal(thisMonth(Date.now()));
307
+ const [area, setArea] = createSignal("ranges");
308
+ /** The model row the content highlights while it has the keyboard (see `litModel`). */
309
+ const [modelFocus, setModelFocus] = createSignal(0);
310
+ const [result, setResult] = createSignal({
311
+ state: "loading"
312
+ });
313
+ const [downloading, setDownloading] = createSignal(false);
314
+ /** The two date boxes show on the first line in place of the dates. */
315
+ const [editingDates, setEditingDates] = createSignal(false);
316
+ let sessionID = "";
317
+ let latestQuestion = 0;
318
+ let fromInput;
319
+ let toInput;
320
+ let windowBox = () => undefined;
321
+ /** The date input that has the keyboard, if any. */
322
+ const [dateFocus, setDateFocus] = createSignal();
323
+ function dateInput(field) {
324
+ return field === "from" ? fromInput : toInput;
325
+ }
326
+ async function load() {
327
+ const question = ++latestQuestion;
328
+ const query = {
329
+ range: range(),
330
+ sessionID
331
+ };
332
+ if (range() === "between") Object.assign(query, dates());
333
+ setResult({
334
+ state: "loading"
335
+ });
336
+ try {
337
+ const {
338
+ report
339
+ } = await api.client.rpc(QuotaRpc).usage(query, quotaCallOptions(api));
340
+ if (question === latestQuestion) setResult({
341
+ state: "ready",
342
+ report
343
+ });
344
+ } catch (error) {
345
+ if (question !== latestQuestion) return;
346
+ setResult({
347
+ state: "failed",
348
+ message: sanitizeDisplayText(rpcErrorMessage(error))
349
+ });
350
+ }
351
+ }
352
+
353
+ /** Shows the date boxes and gives the first one the keyboard once it is drawn. */
354
+ function typeDates() {
355
+ setEditingDates(true);
356
+ setTimeout(() => fromInput?.focus(), 50);
357
+ }
358
+
359
+ /** The range list keeps the keyboard; a click on "Between" (`typing`) types its dates. */
360
+ function chooseRange(next, typing) {
361
+ setRange(next);
362
+ setArea("ranges");
363
+ void load();
364
+ if (next === "between" && typing) typeDates();
365
+ }
366
+
367
+ /** Enter in a date: From goes on to To; To applies both when they are dates in order. */
368
+ function submitDate(field) {
369
+ if (field === "from") {
370
+ toInput?.focus();
371
+ return;
372
+ }
373
+ const from = fromInput?.value.trim() ?? dates().from;
374
+ const to = toInput?.value.trim() ?? dates().to;
375
+ if (!parseCalendarDate(from) || !parseCalendarDate(to) || to < from) {
376
+ api.ui.toast.show({
377
+ variant: "warning",
378
+ title: "Usage",
379
+ message: "Type two dates like 2026-09-01, the first one not after the second."
380
+ });
381
+ return;
382
+ }
383
+ setDates({
384
+ from,
385
+ to
386
+ });
387
+ backToWindow();
388
+ void load();
389
+ }
390
+
391
+ /** The keyboard back to the window; the dates show again in place of the boxes. */
392
+ function backToWindow() {
393
+ setDateFocus(undefined);
394
+ setEditingDates(false);
395
+ windowBox()?.focus();
396
+ }
397
+ async function downloadPrices() {
398
+ if (downloading()) return;
399
+ setDownloading(true);
400
+ try {
401
+ const answer = await api.client.rpc(QuotaRpc).downloadPrices({}, quotaCallOptions(api));
402
+ api.ui.toast.show({
403
+ variant: answer.ok ? "success" : "error",
404
+ title: "Prices",
405
+ message: sanitizeDisplayText(answer.message),
406
+ duration: 6_000
407
+ });
408
+ if (answer.ok) void load();
409
+ } catch (error) {
410
+ api.ui.toast.show(errorToast(error, "Prices"));
411
+ } finally {
412
+ setDownloading(false);
413
+ }
414
+ }
415
+ function readyReport() {
416
+ const current = result();
417
+ return current.state === "ready" ? current.report : undefined;
418
+ }
419
+ function failure() {
420
+ const current = result();
421
+ return current.state === "failed" ? current.message : undefined;
422
+ }
423
+
424
+ /** The models the breakdown shows as rows: none by day, without usage or without a report. */
425
+ function modelRows() {
426
+ const report = readyReport();
427
+ return report && breakdown() === "model" ? breakdownModels(report, mode()) : [];
428
+ }
429
+
430
+ /**
431
+ * The highlighted model row: while the content has the keyboard, the chosen row, or the last
432
+ * one when a new report has fewer rows. Undefined without rows.
433
+ */
434
+ function litModel() {
435
+ const count = modelRows().length;
436
+ if (area() !== "content" || count === 0) return undefined;
437
+ return Math.min(modelFocus(), count - 1);
438
+ }
439
+ function openModel(index) {
440
+ const report = readyReport();
441
+ const model = modelRows()[index];
442
+ if (!report || !model) return;
443
+ setArea("content");
444
+ setModelFocus(index);
445
+ const shownMode = mode();
446
+ api.ui.dialog.show(() => _$createComponent(ModelDetail, {
447
+ api: api,
448
+ report: report,
449
+ model: model,
450
+ mode: shownMode
451
+ }));
452
+ api.ui.dialog.set({
453
+ size: "large"
454
+ });
455
+ }
456
+
457
+ /** The breakdown's order follows the mode, so the first model row is the chosen one again. */
458
+ function chooseMode(next) {
459
+ setMode(next);
460
+ setModelFocus(0);
461
+ }
462
+ function chooseBreakdown(next) {
463
+ setBreakdown(next);
464
+ setModelFocus(0);
465
+ }
466
+
467
+ /** → or enter in the range list: the model rows get the keyboard, the first one in view. */
468
+ function toModels() {
469
+ if (modelRows().length === 0) return false;
470
+ setArea("content");
471
+ setModelFocus(0);
472
+ scroll()?.scrollChildIntoView(modelRowId(0));
473
+ }
474
+
475
+ /** ← in the content: the range list gets the keyboard back, the content its top line. */
476
+ function toRanges() {
477
+ setArea("ranges");
478
+ scroll()?.scrollTo(0);
479
+ }
480
+
481
+ /**
482
+ * ↑↓: the next range in the range list (applied at once); in the content the next model row,
483
+ * scrolled into view. Past the first or last row, or without rows, the window scrolls.
484
+ */
485
+ function move(delta) {
486
+ if (area() === "ranges") {
487
+ const index = USAGE_RANGES.findIndex(item => item.range === range());
488
+ const next = USAGE_RANGES[index + delta];
489
+ if (next) chooseRange(next.range, false);
490
+ return;
491
+ }
492
+ const current = litModel();
493
+ if (current === undefined) return false;
494
+ const next = current + delta;
495
+ if (next < 0 || next >= modelRows().length) return false;
496
+ setModelFocus(next);
497
+ scroll()?.scrollChildIntoView(modelRowId(next));
498
+ }
499
+
500
+ /** Enter: in the range list the model rows get the keyboard; in the content it opens the model. */
501
+ function enter() {
502
+ if (area() === "ranges") return toModels();
503
+ const model = litModel();
504
+ if (model !== undefined) openModel(model);
505
+ }
506
+ function hints() {
507
+ const field = dateFocus();
508
+ if (field) {
509
+ return [{
510
+ key: "enter",
511
+ label: field === "from" ? "next date" : "apply"
512
+ }, {
513
+ key: "tab",
514
+ label: "other date"
515
+ }, {
516
+ key: "esc",
517
+ label: "back"
518
+ }];
519
+ }
520
+ const hasRows = modelRows().length > 0;
521
+ let moves;
522
+ if (area() === "ranges") {
523
+ moves = [{
524
+ key: "↑↓",
525
+ label: "range"
526
+ }, ...(hasRows ? [{
527
+ key: "→",
528
+ label: "models"
529
+ }] : [])];
530
+ } else if (hasRows) {
531
+ moves = [{
532
+ key: "↑↓",
533
+ label: "models"
534
+ }, {
535
+ key: "enter",
536
+ label: "details"
537
+ }, {
538
+ key: "←",
539
+ label: "ranges"
540
+ }];
541
+ } else {
542
+ moves = [{
543
+ key: "↑↓",
544
+ label: "scroll"
545
+ }, {
546
+ key: "←",
547
+ label: "ranges"
548
+ }];
549
+ }
550
+ return [...moves, ...(range() === "between" ? [{
551
+ key: "d",
552
+ label: "type dates"
553
+ }] : []), {
554
+ key: "c",
555
+ label: "cost"
556
+ }, {
557
+ key: "t",
558
+ label: "tokens"
559
+ }, {
560
+ key: "b",
561
+ label: "by model/day"
562
+ }, downloading() ? {
563
+ label: "updating prices…"
564
+ } : {
565
+ key: "p",
566
+ label: "update prices"
567
+ }, {
568
+ key: "tab",
569
+ label: "next tab"
570
+ }, {
571
+ key: "esc",
572
+ label: "close"
573
+ }];
574
+ }
575
+
576
+ /** The ranges (`rail.tsx`); a click picks one, and on "Between" types its dates. */
577
+ function RangeList() {
578
+ return _$createComponent(Rail, {
579
+ items: RANGE_ITEMS,
580
+ get chosen() {
581
+ return range();
582
+ },
583
+ get theme() {
584
+ return api.theme;
585
+ },
586
+ gap: RANGE_LIST_GAP,
587
+ pick: next => chooseRange(next, true)
588
+ });
589
+ }
590
+ function View(props) {
591
+ const theme = () => api.theme;
592
+ windowBox = props.keyTarget;
593
+ // A key's `window` action runs while the window has the keyboard, its `date` action while a
594
+ // date input inside the window has it. A key without the action, or an action that returns
595
+ // false, goes on to the window's own keys; letters and digits a date has no key for reach
596
+ // the input.
597
+ const keys = [{
598
+ bind: "up",
599
+ title: "Previous range or model",
600
+ window: () => move(-1)
601
+ }, {
602
+ bind: "down",
603
+ title: "Next range or model",
604
+ window: () => move(1)
605
+ }, {
606
+ bind: "right",
607
+ title: "To the models",
608
+ window: () => area() === "ranges" ? toModels() : false,
609
+ date: field => dateInput(field)?.moveCursorRight()
610
+ }, {
611
+ bind: "left",
612
+ title: "Back to the ranges",
613
+ window: () => area() === "content" ? toRanges() : false,
614
+ date: field => dateInput(field)?.moveCursorLeft()
615
+ }, {
616
+ bind: "return",
617
+ title: "To the models, open a model, or the next date",
618
+ window: enter,
619
+ date: field => submitDate(field)
620
+ }, {
621
+ bind: "tab",
622
+ title: "Other date",
623
+ date: field => dateInput(field === "from" ? "to" : "from")?.focus()
624
+ }, {
625
+ bind: "escape",
626
+ title: "Back to the window",
627
+ date: backToWindow
628
+ }, {
629
+ bind: "c",
630
+ title: "Show cost",
631
+ window: () => chooseMode("cost")
632
+ }, {
633
+ bind: "t",
634
+ title: "Show tokens",
635
+ window: () => chooseMode("tokens")
636
+ }, {
637
+ bind: "b",
638
+ title: "Breakdown by model or by day",
639
+ window: () => chooseBreakdown(breakdown() === "model" ? "day" : "model")
640
+ }, {
641
+ bind: "p",
642
+ title: "Update prices",
643
+ window: () => void downloadPrices()
644
+ }, {
645
+ bind: "d",
646
+ title: "Type the dates",
647
+ window: () => {
648
+ if (range() === "between") typeDates();
649
+ }
650
+ }];
651
+ // Above the window's own keys; the window's target also covers the inputs inside it.
652
+ api.keymap.layer(() => ({
653
+ target: props.keyTarget,
654
+ priority: 11,
655
+ commands: keys.map(key => ({
656
+ bind: key.bind,
657
+ title: key.title,
658
+ group: KEYS,
659
+ run: () => {
660
+ const field = dateFocus();
661
+ if (field) return key.date ? key.date(field) : false;
662
+ return key.window ? key.window() : false;
663
+ }
664
+ }))
665
+ }));
666
+ const lines = () => {
667
+ const report = readyReport();
668
+ return report ? usageView(report, {
669
+ mode: mode(),
670
+ breakdown: breakdown(),
671
+ width: props.width
672
+ }) : [];
673
+ };
674
+ /** The model rows follow the Breakdown heading and its column names (see `breakdownModels`). */
675
+ const firstModelLine = () => {
676
+ if (modelRows().length === 0) return Number.POSITIVE_INFINITY;
677
+ return lines().findIndex(isBreakdownHeading) + 2;
678
+ };
679
+ const dateBox = field => (() => {
680
+ var _el$10 = _$createElement("input");
681
+ _$use(element => {
682
+ if (field === "from") fromInput = element;else toInput = element;
683
+ element.on("focused", () => setDateFocus(field));
684
+ element.on("blurred", () => {
685
+ setDateFocus(now => now === field ? undefined : now);
686
+ // The keyboard went elsewhere (a click in the window): the dates show again.
687
+ queueMicrotask(() => {
688
+ if (dateFocus() === undefined) setEditingDates(false);
689
+ });
690
+ });
691
+ }, _el$10);
692
+ _$setProp(_el$10, "width", 13);
693
+ _$setProp(_el$10, "flexShrink", 0);
694
+ _$setProp(_el$10, "maxLength", 10);
695
+ _$setProp(_el$10, "placeholder", "YYYY-MM-DD");
696
+ _$setProp(_el$10, "onMouseDown", event => {
697
+ // The window under the box would take the keyboard back and end the typing.
698
+ event.stopPropagation();
699
+ dateInput(field)?.focus();
700
+ });
701
+ _$effect(_p$ => {
702
+ var _v$10 = dates()[field],
703
+ _v$11 = theme().background.raised.high,
704
+ _v$12 = theme().text.base;
705
+ _v$10 !== _p$.e && (_p$.e = _$setProp(_el$10, "value", _v$10, _p$.e));
706
+ _v$11 !== _p$.t && (_p$.t = _$setProp(_el$10, "backgroundColor", _v$11, _p$.t));
707
+ _v$12 !== _p$.a && (_p$.a = _$setProp(_el$10, "textColor", _v$12, _p$.a));
708
+ return _p$;
709
+ }, {
710
+ e: undefined,
711
+ t: undefined,
712
+ a: undefined
713
+ });
714
+ return _el$10;
715
+ })();
716
+ /** The report's dates after the range's name; a click on Between's types them. */
717
+ const datesText = () => {
718
+ const report = readyReport();
719
+ const text = report ? rangeDates(report) : undefined;
720
+ if (!text) return null;
721
+ return (() => {
722
+ var _el$11 = _$createElement("text");
723
+ _$setProp(_el$11, "wrapMode", "none");
724
+ _$setProp(_el$11, "flexShrink", 0);
725
+ _$setProp(_el$11, "selectable", false);
726
+ _$insert(_el$11, ` ${text}`);
727
+ _$effect(_p$ => {
728
+ var _v$13 = theme().text.muted,
729
+ _v$14 = range() === "between" ? typeDates : undefined;
730
+ _v$13 !== _p$.e && (_p$.e = _$setProp(_el$11, "fg", _v$13, _p$.e));
731
+ _v$14 !== _p$.t && (_p$.t = _$setProp(_el$11, "onMouseUp", _v$14, _p$.t));
732
+ return _p$;
733
+ }, {
734
+ e: undefined,
735
+ t: undefined
736
+ });
737
+ return _el$11;
738
+ })();
739
+ };
740
+ return (() => {
741
+ var _el$12 = _$createElement("box"),
742
+ _el$13 = _$createElement("box"),
743
+ _el$14 = _$createElement("text"),
744
+ _el$18 = _$createElement("box"),
745
+ _el$19 = _$createElement("box");
746
+ _$insertNode(_el$12, _el$13);
747
+ _$insertNode(_el$12, _el$19);
748
+ _$setProp(_el$12, "flexDirection", "column");
749
+ _$setProp(_el$12, "flexShrink", 0);
750
+ _$insertNode(_el$13, _el$14);
751
+ _$insertNode(_el$13, _el$18);
752
+ _$setProp(_el$13, "flexDirection", "row");
753
+ _$setProp(_el$13, "flexShrink", 0);
754
+ _$setProp(_el$14, "wrapMode", "none");
755
+ _$setProp(_el$14, "flexShrink", 0);
756
+ _$setProp(_el$14, "selectable", false);
757
+ _$insert(_el$14, () => usageRangeLabel(range()));
758
+ _$insert(_el$13, _$createComponent(Show, {
759
+ get when() {
760
+ return _$memo(() => !!editingDates())() && range() === "between";
761
+ },
762
+ get fallback() {
763
+ return datesText();
764
+ },
765
+ get children() {
766
+ var _el$15 = _$createElement("box"),
767
+ _el$16 = _$createElement("text");
768
+ _$insertNode(_el$15, _el$16);
769
+ _$setProp(_el$15, "flexDirection", "row");
770
+ _$setProp(_el$15, "columnGap", 1);
771
+ _$setProp(_el$15, "marginLeft", 2);
772
+ _$setProp(_el$15, "flexShrink", 0);
773
+ _$insert(_el$15, () => dateBox("from"), _el$16);
774
+ _$insertNode(_el$16, _$createTextNode(`to`));
775
+ _$setProp(_el$16, "wrapMode", "none");
776
+ _$setProp(_el$16, "flexShrink", 0);
777
+ _$setProp(_el$16, "selectable", false);
778
+ _$insert(_el$15, () => dateBox("to"), null);
779
+ _$effect(_$p => _$setProp(_el$16, "fg", theme().text.muted, _$p));
780
+ return _el$15;
781
+ }
782
+ }), _el$18);
783
+ _$setProp(_el$18, "flexGrow", 1);
784
+ _$insert(_el$13, _$createComponent(Option, {
785
+ label: "Cost",
786
+ get active() {
787
+ return mode() === "cost";
788
+ },
789
+ get theme() {
790
+ return theme();
791
+ },
792
+ run: () => chooseMode("cost")
793
+ }), null);
794
+ _$insert(_el$13, _$createComponent(Option, {
795
+ label: "Tokens",
796
+ get active() {
797
+ return mode() === "tokens";
798
+ },
799
+ get theme() {
800
+ return theme();
801
+ },
802
+ run: () => chooseMode("tokens")
803
+ }), null);
804
+ _$setProp(_el$19, "flexDirection", "column");
805
+ _$setProp(_el$19, "marginTop", 1);
806
+ _$insert(_el$19, _$createComponent(Show, {
807
+ get when() {
808
+ return result().state === "loading";
809
+ },
810
+ get children() {
811
+ var _el$20 = _$createElement("text");
812
+ _$insertNode(_el$20, _$createTextNode(`Loading usage…`));
813
+ _$effect(_$p => _$setProp(_el$20, "fg", theme().text.muted, _$p));
814
+ return _el$20;
815
+ }
816
+ }), null);
817
+ _$insert(_el$19, _$createComponent(Show, {
818
+ get when() {
819
+ return failure();
820
+ },
821
+ get children() {
822
+ var _el$22 = _$createElement("text");
823
+ _$setProp(_el$22, "wrapMode", "word");
824
+ _$insert(_el$22, () => `Couldn't load the usage: ${failure()}`);
825
+ _$effect(_$p => _$setProp(_el$22, "fg", theme().text.feedback.error.base, _$p));
826
+ return _el$22;
827
+ }
828
+ }), null);
829
+ _$insert(_el$19, () => lines().map((line, index) => {
830
+ if (isBreakdownHeading(line)) {
831
+ return (() => {
832
+ var _el$23 = _$createElement("box"),
833
+ _el$24 = _$createElement("box"),
834
+ _el$25 = _$createElement("box");
835
+ _$insertNode(_el$23, _el$24);
836
+ _$insertNode(_el$23, _el$25);
837
+ _$setProp(_el$23, "flexDirection", "row");
838
+ _$insert(_el$23, _$createComponent(UsageLineText, {
839
+ line: line,
840
+ get theme() {
841
+ return theme();
842
+ }
843
+ }), _el$24);
844
+ _$setProp(_el$24, "flexGrow", 1);
845
+ _$setProp(_el$25, "flexDirection", "row");
846
+ _$setProp(_el$25, "flexShrink", 0);
847
+ _$insert(_el$25, _$createComponent(Option, {
848
+ label: "Model",
849
+ get active() {
850
+ return breakdown() === "model";
851
+ },
852
+ get theme() {
853
+ return theme();
854
+ },
855
+ run: () => chooseBreakdown("model")
856
+ }), null);
857
+ _$insert(_el$25, _$createComponent(Option, {
858
+ label: "Day",
859
+ get active() {
860
+ return breakdown() === "day";
861
+ },
862
+ get theme() {
863
+ return theme();
864
+ },
865
+ run: () => chooseBreakdown("day")
866
+ }), null);
867
+ return _el$23;
868
+ })();
869
+ }
870
+ const model = index - firstModelLine();
871
+ if (model < 0 || model >= modelRows().length) {
872
+ return _$createComponent(UsageLineText, {
873
+ line: line,
874
+ get theme() {
875
+ return theme();
876
+ }
877
+ });
878
+ }
879
+ return _$createComponent(UsageLineText, {
880
+ line: line,
881
+ get theme() {
882
+ return theme();
883
+ },
884
+ get id() {
885
+ return modelRowId(model);
886
+ },
887
+ get selected() {
888
+ return litModel() === model;
889
+ },
890
+ onClick: () => openModel(model)
891
+ });
892
+ }), null);
893
+ _$effect(_p$ => {
894
+ var _v$15 = props.width,
895
+ _v$16 = theme().text.base,
896
+ _v$17 = TextAttributes.BOLD;
897
+ _v$15 !== _p$.e && (_p$.e = _$setProp(_el$12, "width", _v$15, _p$.e));
898
+ _v$16 !== _p$.t && (_p$.t = _$setProp(_el$14, "fg", _v$16, _p$.t));
899
+ _v$17 !== _p$.a && (_p$.a = _$setProp(_el$14, "attributes", _v$17, _p$.a));
900
+ return _p$;
901
+ }, {
902
+ e: undefined,
903
+ t: undefined,
904
+ a: undefined
905
+ });
906
+ return _el$12;
907
+ })();
908
+ }
909
+ return {
910
+ choose(choice) {
911
+ setRange(choice.range);
912
+ if (choice.from && choice.to) setDates({
913
+ from: choice.from,
914
+ to: choice.to
915
+ });
916
+ setArea("ranges");
917
+ },
918
+ typingDate: () => dateFocus() !== undefined,
919
+ show(nextSessionID) {
920
+ sessionID = nextSessionID;
921
+ setArea("ranges");
922
+ void load();
923
+ },
924
+ hints,
925
+ Rail: RangeList,
926
+ View
927
+ };
928
+ }