@slkiser/opencode-quota 4.0.1 → 4.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (358) hide show
  1. package/README.md +94 -28
  2. package/dist/bin/opencode-quota.d.ts.map +1 -1
  3. package/dist/bin/opencode-quota.js +8 -0
  4. package/dist/bin/opencode-quota.js.map +1 -1
  5. package/dist/index.d.ts +1 -1
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/lib/anthropic.d.ts.map +1 -1
  8. package/dist/lib/anthropic.js +78 -72
  9. package/dist/lib/anthropic.js.map +1 -1
  10. package/dist/lib/api-key-resolver.d.ts +73 -22
  11. package/dist/lib/api-key-resolver.d.ts.map +1 -1
  12. package/dist/lib/api-key-resolver.js +116 -39
  13. package/dist/lib/api-key-resolver.js.map +1 -1
  14. package/dist/lib/atomic-json.d.ts +3 -1
  15. package/dist/lib/atomic-json.d.ts.map +1 -1
  16. package/dist/lib/atomic-json.js +23 -9
  17. package/dist/lib/atomic-json.js.map +1 -1
  18. package/dist/lib/chutes-config.d.ts.map +1 -1
  19. package/dist/lib/chutes-config.js +2 -4
  20. package/dist/lib/chutes-config.js.map +1 -1
  21. package/dist/lib/chutes.d.ts.map +1 -1
  22. package/dist/lib/chutes.js +28 -23
  23. package/dist/lib/chutes.js.map +1 -1
  24. package/dist/lib/cli-show.d.ts +9 -0
  25. package/dist/lib/cli-show.d.ts.map +1 -1
  26. package/dist/lib/cli-show.js +34 -5
  27. package/dist/lib/cli-show.js.map +1 -1
  28. package/dist/lib/cli-status.d.ts +8 -0
  29. package/dist/lib/cli-status.d.ts.map +1 -0
  30. package/dist/lib/cli-status.js +125 -0
  31. package/dist/lib/cli-status.js.map +1 -0
  32. package/dist/lib/config.d.ts +1 -1
  33. package/dist/lib/config.d.ts.map +1 -1
  34. package/dist/lib/config.js +47 -12
  35. package/dist/lib/config.js.map +1 -1
  36. package/dist/lib/copilot.d.ts +11 -5
  37. package/dist/lib/copilot.d.ts.map +1 -1
  38. package/dist/lib/copilot.js +378 -79
  39. package/dist/lib/copilot.js.map +1 -1
  40. package/dist/lib/deepseek-auth.d.ts.map +1 -1
  41. package/dist/lib/deepseek-auth.js +3 -7
  42. package/dist/lib/deepseek-auth.js.map +1 -1
  43. package/dist/lib/deepseek.d.ts.map +1 -1
  44. package/dist/lib/deepseek.js +22 -17
  45. package/dist/lib/deepseek.js.map +1 -1
  46. package/dist/lib/display-sanitize.d.ts.map +1 -1
  47. package/dist/lib/display-sanitize.js +8 -0
  48. package/dist/lib/display-sanitize.js.map +1 -1
  49. package/dist/lib/entries.d.ts +14 -0
  50. package/dist/lib/entries.d.ts.map +1 -1
  51. package/dist/lib/entries.js.map +1 -1
  52. package/dist/lib/format-utils.d.ts +7 -0
  53. package/dist/lib/format-utils.d.ts.map +1 -1
  54. package/dist/lib/format-utils.js +18 -0
  55. package/dist/lib/format-utils.js.map +1 -1
  56. package/dist/lib/format.d.ts +1 -0
  57. package/dist/lib/format.d.ts.map +1 -1
  58. package/dist/lib/format.js +22 -7
  59. package/dist/lib/format.js.map +1 -1
  60. package/dist/lib/glm-coding-plan.d.ts +18 -0
  61. package/dist/lib/glm-coding-plan.d.ts.map +1 -0
  62. package/dist/lib/glm-coding-plan.js +68 -0
  63. package/dist/lib/glm-coding-plan.js.map +1 -0
  64. package/dist/lib/google-agy-companion.d.ts +4 -25
  65. package/dist/lib/google-agy-companion.d.ts.map +1 -1
  66. package/dist/lib/google-agy-companion.js +47 -272
  67. package/dist/lib/google-agy-companion.js.map +1 -1
  68. package/dist/lib/google-agy.d.ts.map +1 -1
  69. package/dist/lib/google-agy.js +204 -111
  70. package/dist/lib/google-agy.js.map +1 -1
  71. package/dist/lib/google-antigravity-companion.d.ts +4 -25
  72. package/dist/lib/google-antigravity-companion.d.ts.map +1 -1
  73. package/dist/lib/google-antigravity-companion.js +44 -283
  74. package/dist/lib/google-antigravity-companion.js.map +1 -1
  75. package/dist/lib/google-companion-credentials.d.ts +70 -0
  76. package/dist/lib/google-companion-credentials.d.ts.map +1 -0
  77. package/dist/lib/google-companion-credentials.js +265 -0
  78. package/dist/lib/google-companion-credentials.js.map +1 -0
  79. package/dist/lib/google-gemini-cli-companion.d.ts +4 -25
  80. package/dist/lib/google-gemini-cli-companion.d.ts.map +1 -1
  81. package/dist/lib/google-gemini-cli-companion.js +47 -258
  82. package/dist/lib/google-gemini-cli-companion.js.map +1 -1
  83. package/dist/lib/google-gemini-cli.d.ts.map +1 -1
  84. package/dist/lib/google-gemini-cli.js +55 -61
  85. package/dist/lib/google-gemini-cli.js.map +1 -1
  86. package/dist/lib/google-token-cache.d.ts.map +1 -1
  87. package/dist/lib/google-token-cache.js +87 -34
  88. package/dist/lib/google-token-cache.js.map +1 -1
  89. package/dist/lib/google.d.ts.map +1 -1
  90. package/dist/lib/google.js +80 -84
  91. package/dist/lib/google.js.map +1 -1
  92. package/dist/lib/grouped-entry-normalization.d.ts.map +1 -1
  93. package/dist/lib/grouped-entry-normalization.js +7 -1
  94. package/dist/lib/grouped-entry-normalization.js.map +1 -1
  95. package/dist/lib/http.d.ts +12 -7
  96. package/dist/lib/http.d.ts.map +1 -1
  97. package/dist/lib/http.js +28 -15
  98. package/dist/lib/http.js.map +1 -1
  99. package/dist/lib/init-installer.d.ts +2 -1
  100. package/dist/lib/init-installer.d.ts.map +1 -1
  101. package/dist/lib/init-installer.js +29 -2
  102. package/dist/lib/init-installer.js.map +1 -1
  103. package/dist/lib/kimi-auth.d.ts +3 -26
  104. package/dist/lib/kimi-auth.d.ts.map +1 -1
  105. package/dist/lib/kimi-auth.js +24 -91
  106. package/dist/lib/kimi-auth.js.map +1 -1
  107. package/dist/lib/kimi.d.ts.map +1 -1
  108. package/dist/lib/kimi.js +20 -15
  109. package/dist/lib/kimi.js.map +1 -1
  110. package/dist/lib/maintainer-announcements.d.ts.map +1 -1
  111. package/dist/lib/maintainer-announcements.js +5 -0
  112. package/dist/lib/maintainer-announcements.js.map +1 -1
  113. package/dist/lib/map-with-concurrency.d.ts +2 -0
  114. package/dist/lib/map-with-concurrency.d.ts.map +1 -0
  115. package/dist/lib/map-with-concurrency.js +17 -0
  116. package/dist/lib/map-with-concurrency.js.map +1 -0
  117. package/dist/lib/mimo-config.d.ts +29 -0
  118. package/dist/lib/mimo-config.d.ts.map +1 -0
  119. package/dist/lib/mimo-config.js +147 -0
  120. package/dist/lib/mimo-config.js.map +1 -0
  121. package/dist/lib/mimo.d.ts +35 -0
  122. package/dist/lib/mimo.d.ts.map +1 -0
  123. package/dist/lib/mimo.js +236 -0
  124. package/dist/lib/mimo.js.map +1 -0
  125. package/dist/lib/modelsdev-pricing.d.ts.map +1 -1
  126. package/dist/lib/modelsdev-pricing.js +39 -27
  127. package/dist/lib/modelsdev-pricing.js.map +1 -1
  128. package/dist/lib/nanogpt-config.d.ts.map +1 -1
  129. package/dist/lib/nanogpt-config.js +2 -4
  130. package/dist/lib/nanogpt-config.js.map +1 -1
  131. package/dist/lib/nanogpt.d.ts.map +1 -1
  132. package/dist/lib/nanogpt.js +40 -30
  133. package/dist/lib/nanogpt.js.map +1 -1
  134. package/dist/lib/ollama-cloud.d.ts +1 -1
  135. package/dist/lib/ollama-cloud.d.ts.map +1 -1
  136. package/dist/lib/ollama-cloud.js +73 -68
  137. package/dist/lib/ollama-cloud.js.map +1 -1
  138. package/dist/lib/openai.d.ts.map +1 -1
  139. package/dist/lib/openai.js +53 -48
  140. package/dist/lib/openai.js.map +1 -1
  141. package/dist/lib/opencode-config-providers.d.ts.map +1 -1
  142. package/dist/lib/opencode-config-providers.js +13 -16
  143. package/dist/lib/opencode-config-providers.js.map +1 -1
  144. package/dist/lib/opencode-config-read.d.ts +23 -0
  145. package/dist/lib/opencode-config-read.d.ts.map +1 -0
  146. package/dist/lib/opencode-config-read.js +30 -0
  147. package/dist/lib/opencode-config-read.js.map +1 -0
  148. package/dist/lib/opencode-go.d.ts.map +1 -1
  149. package/dist/lib/opencode-go.js +44 -39
  150. package/dist/lib/opencode-go.js.map +1 -1
  151. package/dist/lib/opencode-zen-config.d.ts +34 -0
  152. package/dist/lib/opencode-zen-config.d.ts.map +1 -0
  153. package/dist/lib/opencode-zen-config.js +103 -0
  154. package/dist/lib/opencode-zen-config.js.map +1 -0
  155. package/dist/lib/opencode-zen.d.ts +27 -0
  156. package/dist/lib/opencode-zen.d.ts.map +1 -0
  157. package/dist/lib/opencode-zen.js +143 -0
  158. package/dist/lib/opencode-zen.js.map +1 -0
  159. package/dist/lib/openrouter.d.ts +13 -0
  160. package/dist/lib/openrouter.d.ts.map +1 -0
  161. package/dist/lib/openrouter.js +41 -0
  162. package/dist/lib/openrouter.js.map +1 -0
  163. package/dist/lib/provider-add-command.d.ts.map +1 -1
  164. package/dist/lib/provider-add-command.js +4 -12
  165. package/dist/lib/provider-add-command.js.map +1 -1
  166. package/dist/lib/provider-add-json-v1-questionnaire.d.ts +32 -0
  167. package/dist/lib/provider-add-json-v1-questionnaire.d.ts.map +1 -0
  168. package/dist/lib/provider-add-json-v1-questionnaire.js +336 -0
  169. package/dist/lib/provider-add-json-v1-questionnaire.js.map +1 -0
  170. package/dist/lib/provider-availability.d.ts +2 -2
  171. package/dist/lib/provider-availability.d.ts.map +1 -1
  172. package/dist/lib/provider-availability.js +2 -3
  173. package/dist/lib/provider-availability.js.map +1 -1
  174. package/dist/lib/provider-metadata.d.ts +300 -1
  175. package/dist/lib/provider-metadata.d.ts.map +1 -1
  176. package/dist/lib/provider-metadata.js +332 -227
  177. package/dist/lib/provider-metadata.js.map +1 -1
  178. package/dist/lib/quota-command-format.d.ts.map +1 -1
  179. package/dist/lib/quota-command-format.js +12 -16
  180. package/dist/lib/quota-command-format.js.map +1 -1
  181. package/dist/lib/quota-dialog-commands.d.ts +59 -2
  182. package/dist/lib/quota-dialog-commands.d.ts.map +1 -1
  183. package/dist/lib/quota-dialog-commands.js +73 -39
  184. package/dist/lib/quota-dialog-commands.js.map +1 -1
  185. package/dist/lib/quota-entry-display.d.ts +2 -0
  186. package/dist/lib/quota-entry-display.d.ts.map +1 -1
  187. package/dist/lib/quota-entry-display.js +27 -13
  188. package/dist/lib/quota-entry-display.js.map +1 -1
  189. package/dist/lib/quota-providers-remote.d.ts +0 -1
  190. package/dist/lib/quota-providers-remote.d.ts.map +1 -1
  191. package/dist/lib/quota-providers-remote.js +3 -16
  192. package/dist/lib/quota-providers-remote.js.map +1 -1
  193. package/dist/lib/quota-render-data.d.ts +4 -0
  194. package/dist/lib/quota-render-data.d.ts.map +1 -1
  195. package/dist/lib/quota-render-data.js +118 -127
  196. package/dist/lib/quota-render-data.js.map +1 -1
  197. package/dist/lib/quota-runtime-context.d.ts +9 -1
  198. package/dist/lib/quota-runtime-context.d.ts.map +1 -1
  199. package/dist/lib/quota-runtime-context.js +5 -0
  200. package/dist/lib/quota-runtime-context.js.map +1 -1
  201. package/dist/lib/quota-state.d.ts.map +1 -1
  202. package/dist/lib/quota-state.js +25 -1
  203. package/dist/lib/quota-state.js.map +1 -1
  204. package/dist/lib/quota-stats.d.ts +1 -0
  205. package/dist/lib/quota-stats.d.ts.map +1 -1
  206. package/dist/lib/quota-stats.js +14 -4
  207. package/dist/lib/quota-stats.js.map +1 -1
  208. package/dist/lib/quota-status.d.ts +7 -17
  209. package/dist/lib/quota-status.d.ts.map +1 -1
  210. package/dist/lib/quota-status.js +123 -948
  211. package/dist/lib/quota-status.js.map +1 -1
  212. package/dist/lib/runtime-provider-ids.d.ts +4 -0
  213. package/dist/lib/runtime-provider-ids.d.ts.map +1 -0
  214. package/dist/lib/runtime-provider-ids.js +10 -0
  215. package/dist/lib/runtime-provider-ids.js.map +1 -0
  216. package/dist/lib/session-tokens.d.ts +2 -0
  217. package/dist/lib/session-tokens.d.ts.map +1 -1
  218. package/dist/lib/session-tokens.js +4 -2
  219. package/dist/lib/session-tokens.js.map +1 -1
  220. package/dist/lib/synthetic-config.d.ts.map +1 -1
  221. package/dist/lib/synthetic-config.js +2 -4
  222. package/dist/lib/synthetic-config.js.map +1 -1
  223. package/dist/lib/synthetic.d.ts.map +1 -1
  224. package/dist/lib/synthetic.js +37 -32
  225. package/dist/lib/synthetic.js.map +1 -1
  226. package/dist/lib/toast-format-grouped.d.ts +1 -0
  227. package/dist/lib/toast-format-grouped.d.ts.map +1 -1
  228. package/dist/lib/toast-format-grouped.js +33 -29
  229. package/dist/lib/toast-format-grouped.js.map +1 -1
  230. package/dist/lib/tui-refresh-lifecycle.d.ts +17 -0
  231. package/dist/lib/tui-refresh-lifecycle.d.ts.map +1 -0
  232. package/dist/lib/tui-refresh-lifecycle.js +83 -0
  233. package/dist/lib/tui-refresh-lifecycle.js.map +1 -0
  234. package/dist/lib/tui-runtime.d.ts +0 -5
  235. package/dist/lib/tui-runtime.d.ts.map +1 -1
  236. package/dist/lib/tui-runtime.js +1 -6
  237. package/dist/lib/tui-runtime.js.map +1 -1
  238. package/dist/lib/tui-sidebar-format.d.ts +1 -1
  239. package/dist/lib/tui-sidebar-format.d.ts.map +1 -1
  240. package/dist/lib/tui-sidebar-format.js +1 -0
  241. package/dist/lib/tui-sidebar-format.js.map +1 -1
  242. package/dist/lib/types.d.ts +72 -8
  243. package/dist/lib/types.d.ts.map +1 -1
  244. package/dist/lib/types.js +2 -0
  245. package/dist/lib/types.js.map +1 -1
  246. package/dist/lib/xai.d.ts +39 -0
  247. package/dist/lib/xai.d.ts.map +1 -0
  248. package/dist/lib/xai.js +153 -0
  249. package/dist/lib/xai.js.map +1 -0
  250. package/dist/lib/zai-auth.d.ts +3 -26
  251. package/dist/lib/zai-auth.d.ts.map +1 -1
  252. package/dist/lib/zai-auth.js +24 -94
  253. package/dist/lib/zai-auth.js.map +1 -1
  254. package/dist/lib/zai.d.ts +1 -8
  255. package/dist/lib/zai.d.ts.map +1 -1
  256. package/dist/lib/zai.js +11 -91
  257. package/dist/lib/zai.js.map +1 -1
  258. package/dist/lib/zhipu-auth.d.ts +3 -26
  259. package/dist/lib/zhipu-auth.d.ts.map +1 -1
  260. package/dist/lib/zhipu-auth.js +24 -94
  261. package/dist/lib/zhipu-auth.js.map +1 -1
  262. package/dist/lib/zhipu.d.ts +1 -8
  263. package/dist/lib/zhipu.d.ts.map +1 -1
  264. package/dist/lib/zhipu.js +10 -84
  265. package/dist/lib/zhipu.js.map +1 -1
  266. package/dist/plugin.d.ts.map +1 -1
  267. package/dist/plugin.js +20 -145
  268. package/dist/plugin.js.map +1 -1
  269. package/dist/providers/alibaba-coding-plan.d.ts.map +1 -1
  270. package/dist/providers/alibaba-coding-plan.js +33 -6
  271. package/dist/providers/alibaba-coding-plan.js.map +1 -1
  272. package/dist/providers/anthropic.d.ts.map +1 -1
  273. package/dist/providers/anthropic.js +35 -7
  274. package/dist/providers/anthropic.js.map +1 -1
  275. package/dist/providers/chutes.d.ts.map +1 -1
  276. package/dist/providers/chutes.js +10 -3
  277. package/dist/providers/chutes.js.map +1 -1
  278. package/dist/providers/copilot.d.ts.map +1 -1
  279. package/dist/providers/copilot.js +102 -31
  280. package/dist/providers/copilot.js.map +1 -1
  281. package/dist/providers/cursor.d.ts.map +1 -1
  282. package/dist/providers/cursor.js +34 -6
  283. package/dist/providers/cursor.js.map +1 -1
  284. package/dist/providers/deepseek.d.ts.map +1 -1
  285. package/dist/providers/deepseek.js +10 -3
  286. package/dist/providers/deepseek.js.map +1 -1
  287. package/dist/providers/glm-coding-plan-provider.d.ts +44 -0
  288. package/dist/providers/glm-coding-plan-provider.d.ts.map +1 -0
  289. package/dist/providers/glm-coding-plan-provider.js +62 -0
  290. package/dist/providers/glm-coding-plan-provider.js.map +1 -0
  291. package/dist/providers/google-agy.d.ts.map +1 -1
  292. package/dist/providers/google-agy.js +83 -42
  293. package/dist/providers/google-agy.js.map +1 -1
  294. package/dist/providers/google-antigravity.d.ts.map +1 -1
  295. package/dist/providers/google-antigravity.js +31 -6
  296. package/dist/providers/google-antigravity.js.map +1 -1
  297. package/dist/providers/google-gemini-cli.d.ts.map +1 -1
  298. package/dist/providers/google-gemini-cli.js +24 -6
  299. package/dist/providers/google-gemini-cli.js.map +1 -1
  300. package/dist/providers/kimi-code.d.ts.map +1 -1
  301. package/dist/providers/kimi-code.js +27 -8
  302. package/dist/providers/kimi-code.js.map +1 -1
  303. package/dist/providers/mimo.d.ts +3 -0
  304. package/dist/providers/mimo.d.ts.map +1 -0
  305. package/dist/providers/mimo.js +127 -0
  306. package/dist/providers/mimo.js.map +1 -0
  307. package/dist/providers/minimax-coding-plan.d.ts.map +1 -1
  308. package/dist/providers/minimax-coding-plan.js +68 -32
  309. package/dist/providers/minimax-coding-plan.js.map +1 -1
  310. package/dist/providers/nanogpt.d.ts.map +1 -1
  311. package/dist/providers/nanogpt.js +41 -4
  312. package/dist/providers/nanogpt.js.map +1 -1
  313. package/dist/providers/openai.d.ts.map +1 -1
  314. package/dist/providers/openai.js +20 -3
  315. package/dist/providers/openai.js.map +1 -1
  316. package/dist/providers/opencode-go.d.ts.map +1 -1
  317. package/dist/providers/opencode-go.js +33 -15
  318. package/dist/providers/opencode-go.js.map +1 -1
  319. package/dist/providers/opencode-zen.d.ts +3 -0
  320. package/dist/providers/opencode-zen.d.ts.map +1 -0
  321. package/dist/providers/opencode-zen.js +99 -0
  322. package/dist/providers/opencode-zen.js.map +1 -0
  323. package/dist/providers/openrouter.d.ts +6 -0
  324. package/dist/providers/openrouter.d.ts.map +1 -0
  325. package/dist/providers/openrouter.js +25 -0
  326. package/dist/providers/openrouter.js.map +1 -0
  327. package/dist/providers/quota-providers.d.ts.map +1 -1
  328. package/dist/providers/quota-providers.js +3 -3
  329. package/dist/providers/quota-providers.js.map +1 -1
  330. package/dist/providers/qwen-code.d.ts.map +1 -1
  331. package/dist/providers/qwen-code.js +19 -5
  332. package/dist/providers/qwen-code.js.map +1 -1
  333. package/dist/providers/registry.d.ts.map +1 -1
  334. package/dist/providers/registry.js +8 -0
  335. package/dist/providers/registry.js.map +1 -1
  336. package/dist/providers/result-helpers.d.ts +29 -1
  337. package/dist/providers/result-helpers.d.ts.map +1 -1
  338. package/dist/providers/result-helpers.js +69 -0
  339. package/dist/providers/result-helpers.js.map +1 -1
  340. package/dist/providers/synthetic.d.ts.map +1 -1
  341. package/dist/providers/synthetic.js +10 -3
  342. package/dist/providers/synthetic.js.map +1 -1
  343. package/dist/providers/xai.d.ts +6 -0
  344. package/dist/providers/xai.d.ts.map +1 -0
  345. package/dist/providers/xai.js +51 -0
  346. package/dist/providers/xai.js.map +1 -0
  347. package/dist/providers/zai.d.ts +1 -7
  348. package/dist/providers/zai.d.ts.map +1 -1
  349. package/dist/providers/zai.js +11 -46
  350. package/dist/providers/zai.js.map +1 -1
  351. package/dist/providers/zhipu.d.ts +1 -7
  352. package/dist/providers/zhipu.d.ts.map +1 -1
  353. package/dist/providers/zhipu.js +11 -46
  354. package/dist/providers/zhipu.js.map +1 -1
  355. package/dist/tui.d.ts.map +1 -1
  356. package/dist/tui.js +47 -136
  357. package/dist/tui.tsx +62 -179
  358. package/package.json +1 -1
@@ -1,3 +1,5 @@
1
+ import { readFile } from "fs/promises";
2
+ import { sanitizeDisplayText } from "../lib/display-sanitize.js";
1
3
  export function notAttemptedResult() {
2
4
  return { attempted: false, entries: [], errors: [] };
3
5
  }
@@ -12,6 +14,73 @@ export function attemptedResult(entries, errors = [], presentation) {
12
14
  export function attemptedErrorResult(label, message) {
13
15
  return attemptedResult([], [{ label, message }]);
14
16
  }
17
+ export function statusDetailsFromRecord(values) {
18
+ return Object.entries(values).flatMap(([key, value]) => value === undefined ? [] : [{ key, value }]);
19
+ }
20
+ export function configStatusDetails(diagnostics) {
21
+ return statusDetailsFromRecord({
22
+ config_state: diagnostics.state,
23
+ config_source: diagnostics.source ?? "(none)",
24
+ config_missing: diagnostics.missing ?? undefined,
25
+ config_error: diagnostics.error ?? undefined,
26
+ config_checked_paths: diagnostics.checkedPaths.join(" | ") || "(none)",
27
+ });
28
+ }
29
+ export function simpleApiKeyStatusDetails(diagnostics) {
30
+ return statusDetailsFromRecord({
31
+ api_key_configured: diagnostics.configured ? "true" : "false",
32
+ api_key_source: diagnostics.source ?? "(none)",
33
+ api_key_checked_paths: diagnostics.checkedPaths.join(" | ") || "(none)",
34
+ api_key_auth_paths: diagnostics.authPaths.join(" | ") || "(none)",
35
+ });
36
+ }
37
+ export function apiKeyStatusDetails(diagnostics) {
38
+ return statusDetailsFromRecord({
39
+ auth_state: diagnostics.state,
40
+ api_key_configured: diagnostics.state === "configured" ? "true" : "false",
41
+ api_key_source: diagnostics.source ?? "(none)",
42
+ api_key_checked_paths: diagnostics.checkedPaths.join(" | ") || "(none)",
43
+ api_key_auth_paths: diagnostics.authPaths.join(" | ") || "(none)",
44
+ auth_error: diagnostics.error ? sanitizeDisplayText(diagnostics.error) : undefined,
45
+ });
46
+ }
47
+ export function withStatusDetails(result, statusDetails) {
48
+ return {
49
+ ...result,
50
+ statusDetails: statusDetails.map((detail) => ({ ...detail })),
51
+ };
52
+ }
53
+ export async function inspectGeneratedCounterFile(path, expectedVersion) {
54
+ try {
55
+ const parsed = JSON.parse(await readFile(path, "utf8"));
56
+ const record = parsed && typeof parsed === "object" && !Array.isArray(parsed)
57
+ ? parsed
58
+ : null;
59
+ const version = typeof record?.version === "number" ? record.version : null;
60
+ const updatedAt = typeof record?.updatedAt === "number" && Number.isFinite(record.updatedAt)
61
+ ? record.updatedAt
62
+ : null;
63
+ return {
64
+ exists: true,
65
+ health: !record || version === null || updatedAt === null
66
+ ? "malformed"
67
+ : version === expectedVersion
68
+ ? "healthy"
69
+ : "version_mismatch",
70
+ version,
71
+ lastUpdatedAt: updatedAt,
72
+ };
73
+ }
74
+ catch (error) {
75
+ if (error &&
76
+ typeof error === "object" &&
77
+ "code" in error &&
78
+ String(error.code) === "ENOENT") {
79
+ return { exists: false, health: "missing", version: null, lastUpdatedAt: null };
80
+ }
81
+ return { exists: true, health: "malformed", version: null, lastUpdatedAt: null };
82
+ }
83
+ }
15
84
  export function mapNullableProviderResult(result, params) {
16
85
  if (!result) {
17
86
  return notAttemptedResult();
@@ -1 +1 @@
1
- {"version":3,"file":"result-helpers.js","sourceRoot":"","sources":["../../src/providers/result-helpers.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,kBAAkB;IAChC,OAAO,EAAE,SAAS,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,eAAe,CAC7B,OAA0B,EAC1B,SAA4B,EAAE,EAC9B,YAAwC;IAExC,OAAO;QACL,SAAS,EAAE,IAAI;QACf,OAAO;QACP,MAAM;QACN,GAAG,CAAC,YAAY,CAAC,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1C,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,KAAa,EAAE,OAAe;IACjE,OAAO,eAAe,CAAC,EAAE,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;AACnD,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,MAA2D,EAC3D,MAGC;IAED,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO,kBAAkB,EAAE,CAAC;IAC9B,CAAC;IAED,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,OAAO,oBAAoB,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC;IAC/D,CAAC;IAED,OAAO,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,2BAA2B,CAAC,MAY3C;IACC,MAAM,OAAO,GAAsB,EAAE,CAAC;IAEtC,KAAK,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QACvD,IAAI,CAAC,MAAM;YAAE,SAAS;QAEtB,OAAO,CAAC,IAAI,CAAC;YACX,UAAU,EAAE,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE;YACpC,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,EAAE;YACjC,KAAK,EAAE,MAAM,CAAC,KAAK;YACnB,KAAK;YACL,gBAAgB,EAAE,MAAM,CAAC,gBAAgB;YACzC,YAAY,EAAE,MAAM,CAAC,YAAY;SAClC,CAAC,CAAC;IACL,CAAC;IAED,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,IAAI,MAAM,CAAC,iBAAiB,KAAK,KAAK,EAAE,CAAC;QAC/D,OAAO,CAAC,IAAI,CAAC;YACX,UAAU,EAAE,EAAE,GAAG,MAAM,CAAC,UAAU,EAAE;YACpC,IAAI,EAAE,MAAM,CAAC,KAAK;YAClB,gBAAgB,EAAE,CAAC;SACpB,CAAC,CAAC;IACL,CAAC;IAED,OAAO,OAAO,CAAC;AACjB,CAAC"}
1
+ {"version":3,"file":"result-helpers.js","sourceRoot":"","sources":["../../src/providers/result-helpers.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"synthetic.d.ts","sourceRoot":"","sources":["../../src/providers/synthetic.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,aAAa,EAId,MAAM,mBAAmB,CAAC;AA0C3B,eAAO,MAAM,iBAAiB,EAAE,aA6C/B,CAAC"}
1
+ {"version":3,"file":"synthetic.d.ts","sourceRoot":"","sources":["../../src/providers/synthetic.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,aAAa,EAId,MAAM,mBAAmB,CAAC;AA8C3B,eAAO,MAAM,iBAAiB,EAAE,aAmD/B,CAAC"}
@@ -2,9 +2,9 @@
2
2
  * Synthetic provider wrapper.
3
3
  */
4
4
  import { isCanonicalProviderAvailable } from "../lib/provider-availability.js";
5
- import { hasSyntheticApiKeyConfigured, querySyntheticQuota } from "../lib/synthetic.js";
5
+ import { getSyntheticKeyDiagnostics, hasSyntheticApiKeyConfigured, querySyntheticQuota, } from "../lib/synthetic.js";
6
6
  import { modelProviderIncludesAny } from "../lib/provider-model-matching.js";
7
- import { attemptedResult, mapNullableProviderResult } from "./result-helpers.js";
7
+ import { attemptedResult, mapNullableProviderResult, withStatusDetails } from "./result-helpers.js";
8
8
  function formatSyntheticRoundedValue(value) {
9
9
  if (!Number.isFinite(value))
10
10
  return "0";
@@ -48,8 +48,13 @@ export const syntheticProvider = {
48
48
  return modelProviderIncludesAny(model, ["synthetic"]);
49
49
  },
50
50
  async fetch(ctx) {
51
+ const diagnostics = await getSyntheticKeyDiagnostics().catch(() => ({
52
+ configured: false,
53
+ source: null,
54
+ checkedPaths: [],
55
+ }));
51
56
  const result = await querySyntheticQuota({ requestTimeoutMs: ctx.config?.requestTimeoutMs });
52
- return mapNullableProviderResult(result, {
57
+ const providerResult = mapNullableProviderResult(result, {
53
58
  errorLabel: "Synthetic",
54
59
  onSuccess: (result) => attemptedResult([
55
60
  toSyntheticEntry({
@@ -67,6 +72,8 @@ export const syntheticProvider = {
67
72
  singleWindowShowRight: true,
68
73
  }),
69
74
  });
75
+ const detail = `configured=${diagnostics.configured ? "true" : "false"}${diagnostics.source ? ` source=${diagnostics.source}` : ""}${diagnostics.checkedPaths.length > 0 ? ` checked=${diagnostics.checkedPaths.join(" | ")}` : ""}`;
76
+ return withStatusDetails(providerResult, [{ key: "synthetic api key", value: detail }]);
70
77
  },
71
78
  };
72
79
  //# sourceMappingURL=synthetic.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"synthetic.js","sourceRoot":"","sources":["../../src/providers/synthetic.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"synthetic.js","sourceRoot":"","sources":["../../src/providers/synthetic.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EACL,0BAA0B,EAC1B,4BAA4B,EAC5B,mBAAmB,GACpB,MAAM,qBAAqB,CAAC;AAE7B,OAAO,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAC7E,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAEpG,SAAS,2BAA2B,CAAC,KAAa;IAChD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,GAAG,CAAC;IACxC,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAChD,CAAC;AAED,SAAS,sBAAsB,CAAC,MAA4B,EAAE,QAAQ,GAAG,KAAK;IAC5E,MAAM,IAAI,GAAG,2BAA2B,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,2BAA2B,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxD,OAAO,QAAQ,CAAC,CAAC,CAAC,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,IAAI,IAAI,KAAK,EAAE,CAAC;AAC9D,CAAC;AAED,SAAS,gBAAgB,CAAC,MAKzB;IACC,MAAM,KAAK,GAAG,sBAAsB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAErE,OAAO;QACL,UAAU,EAAE;YACV,UAAU,EAAE,OAAO;YACnB,iBAAiB,EAAE,YAAY;YAC/B,SAAS,EAAE,YAAY;YACvB,SAAS,EAAE,mBAAmB;SAC/B;QACD,IAAI,EAAE,aAAa,MAAM,CAAC,MAAM,EAAE;QAClC,KAAK,EAAE,WAAW;QAClB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB;QAChD,KAAK;QACL,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY;KACzC,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,iBAAiB,GAAkB;IAC9C,EAAE,EAAE,WAAW;IAEf,KAAK,CAAC,WAAW,CAAC,GAAyB;QACzC,MAAM,iBAAiB,GAAG,MAAM,4BAA4B,CAAC;YAC3D,GAAG;YACH,UAAU,EAAE,WAAW;YACvB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QACH,IAAI,iBAAiB;YAAE,OAAO,IAAI,CAAC;QAEnC,OAAO,MAAM,4BAA4B,EAAE,CAAC;IAC9C,CAAC;IAED,mBAAmB,CAAC,KAAa;QAC/B,OAAO,wBAAwB,CAAC,KAAK,EAAE,CAAC,WAAW,CAAC,CAAC,CAAC;IACxD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAyB;QACnC,MAAM,WAAW,GAAG,MAAM,0BAA0B,EAAE,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;YAClE,UAAU,EAAE,KAAK;YACjB,MAAM,EAAE,IAAI;YACZ,YAAY,EAAE,EAAE;SACjB,CAAC,CAAC,CAAC;QACJ,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAC7F,MAAM,cAAc,GAAG,yBAAyB,CAAC,MAAM,EAAE;YACvD,UAAU,EAAE,WAAW;YACvB,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CACpB,eAAe,CACb;gBACE,gBAAgB,CAAC;oBACf,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ;oBAC/B,MAAM,EAAE,IAAI;oBACZ,KAAK,EAAE,KAAK;iBACb,CAAC;gBACF,gBAAgB,CAAC;oBACf,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;oBAC7B,MAAM,EAAE,QAAQ;oBAChB,KAAK,EAAE,SAAS;oBAChB,QAAQ,EAAE,IAAI;iBACf,CAAC;aACH,EACD,EAAE,EACF;gBACE,qBAAqB,EAAE,IAAI;aAC5B,CACF;SACJ,CAAC,CAAC;QACH,MAAM,MAAM,GAAG,cAAc,WAAW,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,OAAO,GAAG,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,WAAW,CAAC,YAAY,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,YAAY,WAAW,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QACrO,OAAO,iBAAiB,CAAC,cAAc,EAAE,CAAC,EAAE,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC;IAC1F,CAAC;CACF,CAAC"}
@@ -0,0 +1,6 @@
1
+ /**
2
+ * xAI SuperGrok provider wrapper.
3
+ */
4
+ import type { QuotaProvider } from "../lib/entries.js";
5
+ export declare const xaiProvider: QuotaProvider;
6
+ //# sourceMappingURL=xai.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xai.d.ts","sourceRoot":"","sources":["../../src/providers/xai.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EACV,aAAa,EAId,MAAM,mBAAmB,CAAC;AAW3B,eAAO,MAAM,WAAW,EAAE,aAkDzB,CAAC"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * xAI SuperGrok provider wrapper.
3
+ */
4
+ import { isCanonicalProviderAvailable } from "../lib/provider-availability.js";
5
+ import { modelProviderMatchesRuntimeId } from "../lib/provider-model-matching.js";
6
+ import { DEFAULT_XAI_AUTH_CACHE_MAX_AGE_MS, hasXaiOAuthCached, periodKindLabel, queryXaiQuota, } from "../lib/xai.js";
7
+ import { attemptedResult, mapNullableProviderResult } from "./result-helpers.js";
8
+ export const xaiProvider = {
9
+ id: "xai",
10
+ async isAvailable(ctx) {
11
+ const providerAvailable = await isCanonicalProviderAvailable({
12
+ ctx,
13
+ providerId: "xai",
14
+ fallbackOnError: false,
15
+ });
16
+ if (providerAvailable)
17
+ return hasXaiOAuthCached({ maxAgeMs: 0 });
18
+ return hasXaiOAuthCached({ maxAgeMs: DEFAULT_XAI_AUTH_CACHE_MAX_AGE_MS });
19
+ },
20
+ matchesCurrentModel(model, context) {
21
+ if (context?.currentProviderID) {
22
+ return context.currentProviderID.trim().toLowerCase() === "xai";
23
+ }
24
+ return modelProviderMatchesRuntimeId(model, "xai");
25
+ },
26
+ async fetch(ctx) {
27
+ const result = await queryXaiQuota({ requestTimeoutMs: ctx.config?.requestTimeoutMs });
28
+ return mapNullableProviderResult(result, {
29
+ errorLabel: "xAI",
30
+ onSuccess: (result) => {
31
+ const period = periodKindLabel(result.window.kind);
32
+ return attemptedResult([
33
+ {
34
+ accounting: {
35
+ resultType: "quota",
36
+ acquisitionMethod: "remote_api",
37
+ ownership: "maintained",
38
+ authority: "provider_reported",
39
+ },
40
+ name: `${result.label} ${period}`,
41
+ group: result.label,
42
+ label: `${period}:`,
43
+ percentRemaining: result.window.percentRemaining,
44
+ resetTimeIso: result.window.resetTimeIso,
45
+ },
46
+ ], [], { singleWindowDisplayName: result.label });
47
+ },
48
+ });
49
+ },
50
+ };
51
+ //# sourceMappingURL=xai.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"xai.js","sourceRoot":"","sources":["../../src/providers/xai.ts"],"names":[],"mappings":"AAAA;;GAEG;AAQH,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,EACL,iCAAiC,EACjC,iBAAiB,EACjB,eAAe,EACf,aAAa,GACd,MAAM,eAAe,CAAC;AACvB,OAAO,EAAE,eAAe,EAAE,yBAAyB,EAAE,MAAM,qBAAqB,CAAC;AAEjF,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,EAAE,EAAE,KAAK;IAET,KAAK,CAAC,WAAW,CAAC,GAAyB;QACzC,MAAM,iBAAiB,GAAG,MAAM,4BAA4B,CAAC;YAC3D,GAAG;YACH,UAAU,EAAE,KAAK;YACjB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QACH,IAAI,iBAAiB;YAAE,OAAO,iBAAiB,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,CAAC,CAAC;QAEjE,OAAO,iBAAiB,CAAC,EAAE,QAAQ,EAAE,iCAAiC,EAAE,CAAC,CAAC;IAC5E,CAAC;IAED,mBAAmB,CAAC,KAAa,EAAE,OAAmC;QACpE,IAAI,OAAO,EAAE,iBAAiB,EAAE,CAAC;YAC/B,OAAO,OAAO,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,KAAK,KAAK,CAAC;QAClE,CAAC;QACD,OAAO,6BAA6B,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;IACrD,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAyB;QACnC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAEvF,OAAO,yBAAyB,CAAC,MAAM,EAAE;YACvC,UAAU,EAAE,KAAK;YACjB,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE;gBACpB,MAAM,MAAM,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;gBACnD,OAAO,eAAe,CACpB;oBACE;wBACE,UAAU,EAAE;4BACV,UAAU,EAAE,OAAO;4BACnB,iBAAiB,EAAE,YAAY;4BAC/B,SAAS,EAAE,YAAY;4BACvB,SAAS,EAAE,mBAAmB;yBAC/B;wBACD,IAAI,EAAE,GAAG,MAAM,CAAC,KAAK,IAAI,MAAM,EAAE;wBACjC,KAAK,EAAE,MAAM,CAAC,KAAK;wBACnB,KAAK,EAAE,GAAG,MAAM,GAAG;wBACnB,gBAAgB,EAAE,MAAM,CAAC,MAAM,CAAC,gBAAgB;wBAChD,YAAY,EAAE,MAAM,CAAC,MAAM,CAAC,YAAY;qBACzC;iBACF,EACD,EAAE,EACF,EAAE,uBAAuB,EAAE,MAAM,CAAC,KAAK,EAAE,CAC1C,CAAC;YACJ,CAAC;SACF,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
@@ -1,8 +1,2 @@
1
- /**
2
- * Z.ai provider wrapper.
3
- *
4
- * Normalizes Z.ai quota into generic toast entries.
5
- */
6
- import type { QuotaProvider } from "../lib/entries.js";
7
- export declare const zaiProvider: QuotaProvider;
1
+ export declare const zaiProvider: import("../lib/entries.js").QuotaProvider;
8
2
  //# sourceMappingURL=zai.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"zai.d.ts","sourceRoot":"","sources":["../../src/providers/zai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAA6C,MAAM,mBAAmB,CAAC;AAUlG,eAAO,MAAM,WAAW,EAAE,aAwDzB,CAAC"}
1
+ {"version":3,"file":"zai.d.ts","sourceRoot":"","sources":["../../src/providers/zai.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,WAAW,2CAgBtB,CAAC"}
@@ -1,28 +1,15 @@
1
- /**
2
- * Z.ai provider wrapper.
3
- *
4
- * Normalizes Z.ai quota into generic toast entries.
5
- */
1
+ /** Z.ai provider wrapper. */
6
2
  import { queryZaiQuota } from "../lib/zai.js";
7
- import { isCanonicalProviderAvailable } from "../lib/provider-availability.js";
8
- import { DEFAULT_ZAI_AUTH_CACHE_MAX_AGE_MS, resolveZaiAuthCached } from "../lib/zai-auth.js";
9
- import { attemptedResult, groupedPercentWindowEntries, mapNullableProviderResult, } from "./result-helpers.js";
10
- export const zaiProvider = {
3
+ import { DEFAULT_ZAI_AUTH_CACHE_MAX_AGE_MS, getZaiAuthDiagnostics, resolveZaiAuthCached, } from "../lib/zai-auth.js";
4
+ import { createGlmCodingPlanProvider } from "./glm-coding-plan-provider.js";
5
+ export const zaiProvider = createGlmCodingPlanProvider({
11
6
  id: "zai",
12
- async isAvailable(ctx) {
13
- const providerAvailable = await isCanonicalProviderAvailable({
14
- ctx,
15
- providerId: "zai",
16
- fallbackOnError: false,
17
- });
18
- if (!providerAvailable) {
19
- return false;
20
- }
21
- const auth = await resolveZaiAuthCached({
22
- maxAgeMs: DEFAULT_ZAI_AUTH_CACHE_MAX_AGE_MS,
23
- });
24
- return auth.state === "configured" || auth.state === "invalid";
25
- },
7
+ providerId: "zai",
8
+ errorLabel: "Z.ai",
9
+ authCacheMaxAgeMs: DEFAULT_ZAI_AUTH_CACHE_MAX_AGE_MS,
10
+ resolveAuth: resolveZaiAuthCached,
11
+ getAuthDiagnostics: getZaiAuthDiagnostics,
12
+ queryQuota: queryZaiQuota,
26
13
  matchesCurrentModel(model) {
27
14
  const lower = model.toLowerCase();
28
15
  const provider = lower.split("/")[0];
@@ -31,27 +18,5 @@ export const zaiProvider = {
31
18
  }
32
19
  return lower.includes("glm");
33
20
  },
34
- async fetch(ctx) {
35
- const result = await queryZaiQuota({ requestTimeoutMs: ctx.config?.requestTimeoutMs });
36
- return mapNullableProviderResult(result, {
37
- errorLabel: "Z.ai",
38
- onSuccess: (result) => attemptedResult(groupedPercentWindowEntries({
39
- group: result.label,
40
- accounting: {
41
- resultType: "quota",
42
- acquisitionMethod: "remote_api",
43
- ownership: "maintained",
44
- authority: "provider_reported",
45
- },
46
- windows: [
47
- { window: result.windows.fiveHour, suffix: "5h", label: "5h:" },
48
- { window: result.windows.weekly, suffix: "Weekly", label: "Weekly:" },
49
- { window: result.windows.mcp, suffix: "MCP", label: "MCP:" },
50
- ],
51
- }), [], {
52
- singleWindowDisplayName: result.label,
53
- }),
54
- });
55
- },
56
- };
21
+ });
57
22
  //# sourceMappingURL=zai.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zai.js","sourceRoot":"","sources":["../../src/providers/zai.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,iCAAiC,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAC;AAC7F,OAAO,EACL,eAAe,EACf,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,WAAW,GAAkB;IACxC,EAAE,EAAE,KAAK;IAET,KAAK,CAAC,WAAW,CAAC,GAAyB;QACzC,MAAM,iBAAiB,GAAG,MAAM,4BAA4B,CAAC;YAC3D,GAAG;YACH,UAAU,EAAE,KAAK;YACjB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,oBAAoB,CAAC;YACtC,QAAQ,EAAE,iCAAiC;SAC5C,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,KAAK,YAAY,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC;IACjE,CAAC;IAED,mBAAmB,CAAC,KAAa;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAyB;QACnC,MAAM,MAAM,GAAG,MAAM,aAAa,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAEvF,OAAO,yBAAyB,CAAC,MAAM,EAAE;YACvC,UAAU,EAAE,MAAM;YAClB,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CACpB,eAAe,CACb,2BAA2B,CAAC;gBAC1B,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,UAAU,EAAE;oBACV,UAAU,EAAE,OAAO;oBACnB,iBAAiB,EAAE,YAAY;oBAC/B,SAAS,EAAE,YAAY;oBACvB,SAAS,EAAE,mBAAmB;iBAC/B;gBACD,OAAO,EAAE;oBACP,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;oBAC/D,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;oBACrE,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE;iBAC7D;aACF,CAAC,EACF,EAAE,EACF;gBACE,uBAAuB,EAAE,MAAM,CAAC,KAAK;aACtC,CACF;SACJ,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"zai.js","sourceRoot":"","sources":["../../src/providers/zai.ts"],"names":[],"mappings":"AAAA,6BAA6B;AAC7B,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EACL,iCAAiC,EACjC,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,MAAM,CAAC,MAAM,WAAW,GAAG,2BAA2B,CAAC;IACrD,EAAE,EAAE,KAAK;IACT,UAAU,EAAE,KAAK;IACjB,UAAU,EAAE,MAAM;IAClB,iBAAiB,EAAE,iCAAiC;IACpD,WAAW,EAAE,oBAAoB;IACjC,kBAAkB,EAAE,qBAAqB;IACzC,UAAU,EAAE,aAAa;IACzB,mBAAmB,CAAC,KAAK;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,IAAI,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC/B,CAAC;CACF,CAAC,CAAC"}
@@ -1,8 +1,2 @@
1
- /**
2
- * Zhipu provider wrapper.
3
- *
4
- * Normalizes Zhipu quota into generic toast entries.
5
- */
6
- import type { QuotaProvider } from "../lib/entries.js";
7
- export declare const zhipuProvider: QuotaProvider;
1
+ export declare const zhipuProvider: import("../lib/entries.js").QuotaProvider;
8
2
  //# sourceMappingURL=zhipu.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"zhipu.d.ts","sourceRoot":"","sources":["../../src/providers/zhipu.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,aAAa,EAA6C,MAAM,mBAAmB,CAAC;AAUlG,eAAO,MAAM,aAAa,EAAE,aAqD3B,CAAC"}
1
+ {"version":3,"file":"zhipu.d.ts","sourceRoot":"","sources":["../../src/providers/zhipu.ts"],"names":[],"mappings":"AASA,eAAO,MAAM,aAAa,2CAaxB,CAAC"}
@@ -1,54 +1,19 @@
1
- /**
2
- * Zhipu provider wrapper.
3
- *
4
- * Normalizes Zhipu quota into generic toast entries.
5
- */
1
+ /** Zhipu provider wrapper. */
6
2
  import { queryZhipuQuota } from "../lib/zhipu.js";
7
- import { isCanonicalProviderAvailable } from "../lib/provider-availability.js";
8
- import { DEFAULT_ZHIPU_AUTH_CACHE_MAX_AGE_MS, resolveZhipuAuthCached } from "../lib/zhipu-auth.js";
9
- import { attemptedResult, groupedPercentWindowEntries, mapNullableProviderResult, } from "./result-helpers.js";
10
- export const zhipuProvider = {
3
+ import { DEFAULT_ZHIPU_AUTH_CACHE_MAX_AGE_MS, getZhipuAuthDiagnostics, resolveZhipuAuthCached, } from "../lib/zhipu-auth.js";
4
+ import { createGlmCodingPlanProvider } from "./glm-coding-plan-provider.js";
5
+ export const zhipuProvider = createGlmCodingPlanProvider({
11
6
  id: "zhipu",
12
- async isAvailable(ctx) {
13
- const providerAvailable = await isCanonicalProviderAvailable({
14
- ctx,
15
- providerId: "zhipu",
16
- fallbackOnError: false,
17
- });
18
- if (!providerAvailable) {
19
- return false;
20
- }
21
- const auth = await resolveZhipuAuthCached({
22
- maxAgeMs: DEFAULT_ZHIPU_AUTH_CACHE_MAX_AGE_MS,
23
- });
24
- return auth.state === "configured" || auth.state === "invalid";
25
- },
7
+ providerId: "zhipu",
8
+ errorLabel: "Zhipu",
9
+ authCacheMaxAgeMs: DEFAULT_ZHIPU_AUTH_CACHE_MAX_AGE_MS,
10
+ resolveAuth: resolveZhipuAuthCached,
11
+ getAuthDiagnostics: getZhipuAuthDiagnostics,
12
+ queryQuota: queryZhipuQuota,
26
13
  matchesCurrentModel(model) {
27
14
  const lower = model.toLowerCase();
28
15
  const provider = lower.split("/")[0];
29
16
  return !!provider && (provider.includes("zhipu") || provider === "glm-coding-plan");
30
17
  },
31
- async fetch(ctx) {
32
- const result = await queryZhipuQuota({ requestTimeoutMs: ctx.config?.requestTimeoutMs });
33
- return mapNullableProviderResult(result, {
34
- errorLabel: "Zhipu",
35
- onSuccess: (result) => attemptedResult(groupedPercentWindowEntries({
36
- group: result.label,
37
- accounting: {
38
- resultType: "quota",
39
- acquisitionMethod: "remote_api",
40
- ownership: "maintained",
41
- authority: "provider_reported",
42
- },
43
- windows: [
44
- { window: result.windows.fiveHour, suffix: "5h", label: "5h:" },
45
- { window: result.windows.weekly, suffix: "Weekly", label: "Weekly:" },
46
- { window: result.windows.mcp, suffix: "MCP", label: "MCP:" },
47
- ],
48
- }), [], {
49
- singleWindowDisplayName: result.label,
50
- }),
51
- });
52
- },
53
- };
18
+ });
54
19
  //# sourceMappingURL=zhipu.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"zhipu.js","sourceRoot":"","sources":["../../src/providers/zhipu.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,iCAAiC,CAAC;AAC/E,OAAO,EAAE,mCAAmC,EAAE,sBAAsB,EAAE,MAAM,sBAAsB,CAAC;AACnG,OAAO,EACL,eAAe,EACf,2BAA2B,EAC3B,yBAAyB,GAC1B,MAAM,qBAAqB,CAAC;AAE7B,MAAM,CAAC,MAAM,aAAa,GAAkB;IAC1C,EAAE,EAAE,OAAO;IAEX,KAAK,CAAC,WAAW,CAAC,GAAyB;QACzC,MAAM,iBAAiB,GAAG,MAAM,4BAA4B,CAAC;YAC3D,GAAG;YACH,UAAU,EAAE,OAAO;YACnB,eAAe,EAAE,KAAK;SACvB,CAAC,CAAC;QACH,IAAI,CAAC,iBAAiB,EAAE,CAAC;YACvB,OAAO,KAAK,CAAC;QACf,CAAC;QAED,MAAM,IAAI,GAAG,MAAM,sBAAsB,CAAC;YACxC,QAAQ,EAAE,mCAAmC;SAC9C,CAAC,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,KAAK,YAAY,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,CAAC;IACjE,CAAC;IAED,mBAAmB,CAAC,KAAa;QAC/B,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,KAAK,iBAAiB,CAAC,CAAC;IACtF,CAAC;IAED,KAAK,CAAC,KAAK,CAAC,GAAyB;QACnC,MAAM,MAAM,GAAG,MAAM,eAAe,CAAC,EAAE,gBAAgB,EAAE,GAAG,CAAC,MAAM,EAAE,gBAAgB,EAAE,CAAC,CAAC;QAEzF,OAAO,yBAAyB,CAAC,MAAM,EAAE;YACvC,UAAU,EAAE,OAAO;YACnB,SAAS,EAAE,CAAC,MAAM,EAAE,EAAE,CACpB,eAAe,CACb,2BAA2B,CAAC;gBAC1B,KAAK,EAAE,MAAM,CAAC,KAAK;gBACnB,UAAU,EAAE;oBACV,UAAU,EAAE,OAAO;oBACnB,iBAAiB,EAAE,YAAY;oBAC/B,SAAS,EAAE,YAAY;oBACvB,SAAS,EAAE,mBAAmB;iBAC/B;gBACD,OAAO,EAAE;oBACP,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE;oBAC/D,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,EAAE;oBACrE,EAAE,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,EAAE;iBAC7D;aACF,CAAC,EACF,EAAE,EACF;gBACE,uBAAuB,EAAE,MAAM,CAAC,KAAK;aACtC,CACF;SACJ,CAAC,CAAC;IACL,CAAC;CACF,CAAC"}
1
+ {"version":3,"file":"zhipu.js","sourceRoot":"","sources":["../../src/providers/zhipu.ts"],"names":[],"mappings":"AAAA,8BAA8B;AAC9B,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EACL,mCAAmC,EACnC,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,2BAA2B,EAAE,MAAM,+BAA+B,CAAC;AAE5E,MAAM,CAAC,MAAM,aAAa,GAAG,2BAA2B,CAAC;IACvD,EAAE,EAAE,OAAO;IACX,UAAU,EAAE,OAAO;IACnB,UAAU,EAAE,OAAO;IACnB,iBAAiB,EAAE,mCAAmC;IACtD,WAAW,EAAE,sBAAsB;IACnC,kBAAkB,EAAE,uBAAuB;IAC3C,UAAU,EAAE,eAAe;IAC3B,mBAAmB,CAAC,KAAK;QACvB,MAAM,KAAK,GAAG,KAAK,CAAC,WAAW,EAAE,CAAC;QAClC,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,OAAO,CAAC,CAAC,QAAQ,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,QAAQ,KAAK,iBAAiB,CAAC,CAAC;IACtF,CAAC;CACF,CAAC,CAAC"}
package/dist/tui.d.ts.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,eAAe,EAEhB,MAAM,yBAAyB,CAAC;AA8vBjC,QAAA,MAAM,YAAY,EAAE,eAAe,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAGjD,CAAC;AAEF,eAAe,YAAY,CAAC"}
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../src/tui.tsx"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAGV,eAAe,EAEhB,MAAM,yBAAyB,CAAC;AAyoBjC,QAAA,MAAM,YAAY,EAAE,eAAe,GAAG;IAAE,EAAE,EAAE,MAAM,CAAA;CAGjD,CAAC;AAEF,eAAe,YAAY,CAAC"}
package/dist/tui.js CHANGED
@@ -9,6 +9,7 @@ import { createElement as _$createElement } from "@opentui/solid";
9
9
  /** @jsxImportSource @opentui/solid */
10
10
 
11
11
  import { Show, createEffect, createSignal, onCleanup } from "solid-js";
12
+ import { createTuiRefreshLifecycle } from "./lib/tui-refresh-lifecycle.js";
12
13
  import { getCompactStatusText, getHomeBottomAnnouncementText, getSidebarPanelLines, getSidebarPanelLinesExpanded, shouldRenderCompactStatus, shouldRenderHomeBottom, shouldRenderSidebarPanel } from "./lib/tui-panel-state.js";
13
14
  import { getSidebarBodyLineColor } from "./lib/tui-line-style.js";
14
15
  import { createTuiQuotaClient, getTuiRuntimeRootHints, getTuiSessionModelMeta, loadTuiHomeBottomStatus, loadTuiSessionQuotaSurfaces, normalizeTuiSessionID, resolveTuiSurfaceRegistration, writeTuiQuotaExportIfEnabled } from "./lib/tui-runtime.js";
@@ -38,98 +39,51 @@ function createSessionQuotaResource(api, sessionID) {
38
39
  const [compact, setCompact] = createSignal({
39
40
  status: "loading"
40
41
  });
41
- let refCount = 0;
42
- let disposed = false;
43
- let loadVersion = 0;
44
- let inFlight = false;
45
- let queued = false;
46
- const timers = new Set();
47
- const reload = () => {
48
- if (disposed) return;
49
- if (inFlight) {
50
- queued = true;
51
- loadVersion += 1;
52
- return;
53
- }
54
- inFlight = true;
55
- const currentVersion = ++loadVersion;
56
- void loadTuiSessionQuotaSurfaces({
42
+ const lifecycle = createTuiRefreshLifecycle({
43
+ load: () => loadTuiSessionQuotaSurfaces({
57
44
  api,
58
45
  sessionID
59
- }).then(next => {
60
- if (disposed || currentVersion !== loadVersion) return;
46
+ }),
47
+ apply: next => {
61
48
  setSidebar(next.sidebar);
62
49
  setCompact(next.compact);
63
- }).catch(() => {
64
- if (disposed || currentVersion !== loadVersion) return;
65
- }).finally(() => {
66
- if (disposed) return;
67
- inFlight = false;
68
- if (queued) {
69
- queued = false;
70
- reload();
50
+ },
51
+ intervalMs: REFRESH_INTERVAL_MS,
52
+ eventRefreshDelaysMs: EVENT_REFRESH_DELAYS_MS,
53
+ // TUI/session state can hydrate asynchronously after mount or session switch,
54
+ // so retry a few times to recover from empty first-load reads.
55
+ recoveryDelaysMs: MOUNT_RECOVERY_DELAYS_MS,
56
+ subscribe: scheduleRefresh => [api.event.on("session.updated", event => {
57
+ if (event.properties?.info?.id === sessionID) {
58
+ scheduleRefresh();
71
59
  }
72
- });
73
- };
74
- const queueRefresh = delay => {
75
- if (disposed) return;
76
- const timer = setTimeout(() => {
77
- timers.delete(timer);
78
- reload();
79
- }, delay);
80
- timers.add(timer);
81
- };
82
- const scheduleRefresh = () => {
83
- for (const delay of EVENT_REFRESH_DELAYS_MS) queueRefresh(delay);
84
- };
85
-
86
- // TUI/session state can hydrate asynchronously after mount or session switch,
87
- // so retry a few times to recover from empty first-load reads.
88
- const scheduleMountRecovery = () => {
89
- for (const delay of MOUNT_RECOVERY_DELAYS_MS) queueRefresh(delay);
90
- };
91
- const interval = setInterval(reload, REFRESH_INTERVAL_MS);
92
- const unsubscribers = [api.event.on("session.updated", event => {
93
- if (event.properties?.info?.id === sessionID) {
94
- scheduleRefresh();
95
- }
96
- }), api.event.on("message.updated", event => {
97
- if (event.properties?.info?.sessionID === sessionID) {
98
- scheduleRefresh();
99
- }
100
- }), api.event.on("message.removed", event => {
101
- if (event.properties?.sessionID === sessionID) {
102
- scheduleRefresh();
103
- }
104
- }), api.event.on("tui.session.select", event => {
105
- if (event.properties?.sessionID === sessionID) {
106
- scheduleRefresh();
60
+ }), api.event.on("message.updated", event => {
61
+ if (event.properties?.info?.sessionID === sessionID) {
62
+ scheduleRefresh();
63
+ }
64
+ }), api.event.on("message.removed", event => {
65
+ if (event.properties?.sessionID === sessionID) {
66
+ scheduleRefresh();
67
+ }
68
+ }), api.event.on("tui.session.select", event => {
69
+ if (event.properties?.sessionID === sessionID) {
70
+ scheduleRefresh();
71
+ }
72
+ })],
73
+ onDispose: () => {
74
+ getSessionResourceMap(api).delete(sessionID);
107
75
  }
108
- })];
109
- const dispose = () => {
110
- if (disposed) return;
111
- disposed = true;
112
- clearInterval(interval);
113
- for (const timer of timers) clearTimeout(timer);
114
- timers.clear();
115
- for (const unsubscribe of unsubscribers) unsubscribe();
116
- getSessionResourceMap(api).delete(sessionID);
117
- };
76
+ });
118
77
  const resource = {
119
78
  sessionID,
120
79
  sidebar,
121
80
  compact,
122
81
  retain: () => {
123
- refCount += 1;
82
+ lifecycle.retain();
124
83
  return resource;
125
84
  },
126
- release: () => {
127
- refCount -= 1;
128
- if (refCount <= 0) dispose();
129
- }
85
+ release: lifecycle.release
130
86
  };
131
- reload();
132
- scheduleMountRecovery();
133
87
  return resource;
134
88
  }
135
89
  function acquireSessionQuotaResource(api, sessionID) {
@@ -149,26 +103,12 @@ function createHomeBottomResource(api, compactHomeBottomEnabled) {
149
103
  status: "disabled"
150
104
  }
151
105
  });
152
- let refCount = 0;
153
- let disposed = false;
154
- let loadVersion = 0;
155
- let inFlight = false;
156
- let queued = false;
157
- const timers = new Set();
158
- const reload = () => {
159
- if (disposed) return;
160
- if (inFlight) {
161
- queued = true;
162
- loadVersion += 1;
163
- return;
164
- }
165
- inFlight = true;
166
- const currentVersion = ++loadVersion;
167
- void loadTuiHomeBottomStatus({
106
+ const lifecycle = createTuiRefreshLifecycle({
107
+ load: () => loadTuiHomeBottomStatus({
168
108
  api
169
- }).then(next => {
170
- if (disposed || currentVersion !== loadVersion) return;
171
- setBottom(next);
109
+ }),
110
+ apply: setBottom,
111
+ afterApply: () => {
172
112
  // Fire-and-forget: write export file if enabled. A failed write must
173
113
  // never affect TUI rendering, so log a warning and continue.
174
114
  void writeTuiQuotaExportIfEnabled({
@@ -176,51 +116,22 @@ function createHomeBottomResource(api, compactHomeBottomEnabled) {
176
116
  }).catch(err => {
177
117
  console.warn(`[opencode-quota] quota export write failed: ${String(err)}`);
178
118
  });
179
- }).catch(() => {
180
- if (disposed || currentVersion !== loadVersion) return;
181
- }).finally(() => {
182
- if (disposed) return;
183
- inFlight = false;
184
- if (queued) {
185
- queued = false;
186
- reload();
187
- }
188
- });
189
- };
190
- const queueRefresh = delay => {
191
- if (disposed) return;
192
- const timer = setTimeout(() => {
193
- timers.delete(timer);
194
- reload();
195
- }, delay);
196
- timers.add(timer);
197
- };
198
- const scheduleRefresh = () => {
199
- for (const delay of EVENT_REFRESH_DELAYS_MS) queueRefresh(delay);
200
- };
201
- const interval = setInterval(reload, REFRESH_INTERVAL_MS);
202
- const unsubscribers = [api.event.on("session.updated", scheduleRefresh), api.event.on("message.updated", scheduleRefresh), api.event.on("message.removed", scheduleRefresh), api.event.on("tui.session.select", scheduleRefresh)];
203
- const dispose = () => {
204
- if (disposed) return;
205
- disposed = true;
206
- clearInterval(interval);
207
- for (const timer of timers) clearTimeout(timer);
208
- timers.clear();
209
- for (const unsubscribe of unsubscribers) unsubscribe();
210
- homeResources.delete(api);
211
- };
119
+ },
120
+ intervalMs: REFRESH_INTERVAL_MS,
121
+ eventRefreshDelaysMs: EVENT_REFRESH_DELAYS_MS,
122
+ subscribe: scheduleRefresh => [api.event.on("session.updated", scheduleRefresh), api.event.on("message.updated", scheduleRefresh), api.event.on("message.removed", scheduleRefresh), api.event.on("tui.session.select", scheduleRefresh)],
123
+ onDispose: () => {
124
+ homeResources.delete(api);
125
+ }
126
+ });
212
127
  const resource = {
213
128
  bottom,
214
129
  retain: () => {
215
- refCount += 1;
130
+ lifecycle.retain();
216
131
  return resource;
217
132
  },
218
- release: () => {
219
- refCount -= 1;
220
- if (refCount <= 0) dispose();
221
- }
133
+ release: lifecycle.release
222
134
  };
223
- reload();
224
135
  return resource;
225
136
  }
226
137
  function acquireHomeBottomResource(api, compactHomeBottomEnabled) {