@slkiser/opencode-quota 4.10.6 → 5.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/README.md +79 -127
  2. package/dist/bin/opencode-quota.d.ts +6 -0
  3. package/dist/bin/opencode-quota.d.ts.map +1 -1
  4. package/dist/bin/opencode-quota.js +17 -0
  5. package/dist/bin/opencode-quota.js.map +1 -1
  6. package/dist/data/modelsdev-pricing.min.json +83 -2
  7. package/dist/index.d.ts +1 -6
  8. package/dist/index.d.ts.map +1 -1
  9. package/dist/index.js +1 -13
  10. package/dist/index.js.map +1 -1
  11. package/dist/lib/accounting-format.js +1 -1
  12. package/dist/lib/accounting-format.js.map +1 -1
  13. package/dist/lib/alibaba-auth.d.ts +5 -5
  14. package/dist/lib/alibaba-auth.d.ts.map +1 -1
  15. package/dist/lib/alibaba-auth.js +15 -8
  16. package/dist/lib/alibaba-auth.js.map +1 -1
  17. package/dist/lib/alibaba-token-plan.d.ts +7 -4
  18. package/dist/lib/alibaba-token-plan.d.ts.map +1 -1
  19. package/dist/lib/alibaba-token-plan.js +32 -10
  20. package/dist/lib/alibaba-token-plan.js.map +1 -1
  21. package/dist/lib/anthropic-auth.d.ts +4 -1
  22. package/dist/lib/anthropic-auth.d.ts.map +1 -1
  23. package/dist/lib/anthropic-auth.js +5 -1
  24. package/dist/lib/anthropic-auth.js.map +1 -1
  25. package/dist/lib/anthropic.d.ts +7 -1
  26. package/dist/lib/anthropic.d.ts.map +1 -1
  27. package/dist/lib/anthropic.js +61 -7
  28. package/dist/lib/anthropic.js.map +1 -1
  29. package/dist/lib/api-key-resolver.d.ts +27 -16
  30. package/dist/lib/api-key-resolver.d.ts.map +1 -1
  31. package/dist/lib/api-key-resolver.js +46 -19
  32. package/dist/lib/api-key-resolver.js.map +1 -1
  33. package/dist/lib/chutes-config.d.ts +2 -2
  34. package/dist/lib/chutes-config.d.ts.map +1 -1
  35. package/dist/lib/chutes-config.js +4 -4
  36. package/dist/lib/chutes-config.js.map +1 -1
  37. package/dist/lib/cli-reports.d.ts +30 -0
  38. package/dist/lib/cli-reports.d.ts.map +1 -0
  39. package/dist/lib/cli-reports.js +172 -0
  40. package/dist/lib/cli-reports.js.map +1 -0
  41. package/dist/lib/cli-show.d.ts +14 -1
  42. package/dist/lib/cli-show.d.ts.map +1 -1
  43. package/dist/lib/cli-show.js +40 -138
  44. package/dist/lib/cli-show.js.map +1 -1
  45. package/dist/lib/cli-status.d.ts.map +1 -1
  46. package/dist/lib/cli-status.js +9 -36
  47. package/dist/lib/cli-status.js.map +1 -1
  48. package/dist/lib/config-file-utils.d.ts +10 -13
  49. package/dist/lib/config-file-utils.d.ts.map +1 -1
  50. package/dist/lib/config-file-utils.js +28 -30
  51. package/dist/lib/config-file-utils.js.map +1 -1
  52. package/dist/lib/config.d.ts +2 -2
  53. package/dist/lib/config.d.ts.map +1 -1
  54. package/dist/lib/config.js +6 -17
  55. package/dist/lib/config.js.map +1 -1
  56. package/dist/lib/copilot.d.ts +4 -1
  57. package/dist/lib/copilot.d.ts.map +1 -1
  58. package/dist/lib/copilot.js +17 -19
  59. package/dist/lib/copilot.js.map +1 -1
  60. package/dist/lib/cursor-detection.d.ts +1 -1
  61. package/dist/lib/cursor-detection.d.ts.map +1 -1
  62. package/dist/lib/cursor-detection.js +54 -51
  63. package/dist/lib/cursor-detection.js.map +1 -1
  64. package/dist/lib/cursor-pricing.d.ts +1 -1
  65. package/dist/lib/cursor-pricing.d.ts.map +1 -1
  66. package/dist/lib/cursor-pricing.js +85 -0
  67. package/dist/lib/cursor-pricing.js.map +1 -1
  68. package/dist/lib/deepseek-auth.d.ts +2 -2
  69. package/dist/lib/deepseek-auth.d.ts.map +1 -1
  70. package/dist/lib/deepseek-auth.js +4 -4
  71. package/dist/lib/deepseek-auth.js.map +1 -1
  72. package/dist/lib/display-sanitize.js +1 -1
  73. package/dist/lib/display-sanitize.js.map +1 -1
  74. package/dist/lib/entries.d.ts +7 -2
  75. package/dist/lib/entries.d.ts.map +1 -1
  76. package/dist/lib/format-utils.d.ts +1 -5
  77. package/dist/lib/format-utils.d.ts.map +1 -1
  78. package/dist/lib/format-utils.js +1 -4
  79. package/dist/lib/format-utils.js.map +1 -1
  80. package/dist/lib/glm-coding-plan.d.ts +1 -0
  81. package/dist/lib/glm-coding-plan.d.ts.map +1 -1
  82. package/dist/lib/glm-coding-plan.js +3 -1
  83. package/dist/lib/glm-coding-plan.js.map +1 -1
  84. package/dist/lib/google-agy.d.ts +6 -12
  85. package/dist/lib/google-agy.d.ts.map +1 -1
  86. package/dist/lib/google-agy.js +26 -24
  87. package/dist/lib/google-agy.js.map +1 -1
  88. package/dist/lib/google-companion-credentials.d.ts.map +1 -1
  89. package/dist/lib/google-companion-credentials.js +76 -26
  90. package/dist/lib/google-companion-credentials.js.map +1 -1
  91. package/dist/lib/google-gemini-cli.d.ts +7 -12
  92. package/dist/lib/google-gemini-cli.d.ts.map +1 -1
  93. package/dist/lib/google-gemini-cli.js +42 -31
  94. package/dist/lib/google-gemini-cli.js.map +1 -1
  95. package/dist/lib/init-installer.d.ts +3 -1
  96. package/dist/lib/init-installer.d.ts.map +1 -1
  97. package/dist/lib/init-installer.js +71 -174
  98. package/dist/lib/init-installer.js.map +1 -1
  99. package/dist/lib/kilo-config.d.ts +2 -2
  100. package/dist/lib/kilo-config.d.ts.map +1 -1
  101. package/dist/lib/kilo-config.js +6 -5
  102. package/dist/lib/kilo-config.js.map +1 -1
  103. package/dist/lib/kimi-auth.d.ts +2 -2
  104. package/dist/lib/kimi-auth.d.ts.map +1 -1
  105. package/dist/lib/kimi-auth.js +4 -4
  106. package/dist/lib/kimi-auth.js.map +1 -1
  107. package/dist/lib/maintainer-announcements.d.ts.map +1 -1
  108. package/dist/lib/maintainer-announcements.js +5 -5
  109. package/dist/lib/maintainer-announcements.js.map +1 -1
  110. package/dist/lib/markdown-table.d.ts +36 -0
  111. package/dist/lib/markdown-table.d.ts.map +1 -1
  112. package/dist/lib/markdown-table.js +56 -0
  113. package/dist/lib/markdown-table.js.map +1 -1
  114. package/dist/lib/mimo-config.d.ts.map +1 -1
  115. package/dist/lib/mimo-config.js +2 -3
  116. package/dist/lib/mimo-config.js.map +1 -1
  117. package/dist/lib/minimax-auth.d.ts +6 -6
  118. package/dist/lib/minimax-auth.d.ts.map +1 -1
  119. package/dist/lib/minimax-auth.js +18 -17
  120. package/dist/lib/minimax-auth.js.map +1 -1
  121. package/dist/lib/nanogpt-config.d.ts +2 -2
  122. package/dist/lib/nanogpt-config.d.ts.map +1 -1
  123. package/dist/lib/nanogpt-config.js +4 -4
  124. package/dist/lib/nanogpt-config.js.map +1 -1
  125. package/dist/lib/ollama-cloud-config.d.ts +2 -2
  126. package/dist/lib/ollama-cloud-config.d.ts.map +1 -1
  127. package/dist/lib/ollama-cloud-config.js +6 -5
  128. package/dist/lib/ollama-cloud-config.js.map +1 -1
  129. package/dist/lib/openai.d.ts +7 -2
  130. package/dist/lib/openai.d.ts.map +1 -1
  131. package/dist/lib/openai.js +22 -8
  132. package/dist/lib/openai.js.map +1 -1
  133. package/dist/lib/opencode-auth-sqlite.d.ts +17 -0
  134. package/dist/lib/opencode-auth-sqlite.d.ts.map +1 -0
  135. package/dist/lib/opencode-auth-sqlite.js +105 -0
  136. package/dist/lib/opencode-auth-sqlite.js.map +1 -0
  137. package/dist/lib/opencode-auth.d.ts +127 -14
  138. package/dist/lib/opencode-auth.d.ts.map +1 -1
  139. package/dist/lib/opencode-auth.js +374 -46
  140. package/dist/lib/opencode-auth.js.map +1 -1
  141. package/dist/lib/opencode-config-providers.d.ts.map +1 -1
  142. package/dist/lib/opencode-config-providers.js +17 -18
  143. package/dist/lib/opencode-config-providers.js.map +1 -1
  144. package/dist/lib/opencode-console-auth.d.ts +47 -0
  145. package/dist/lib/opencode-console-auth.d.ts.map +1 -0
  146. package/dist/lib/opencode-console-auth.js +63 -0
  147. package/dist/lib/opencode-console-auth.js.map +1 -0
  148. package/dist/lib/opencode-db-path.d.ts +9 -0
  149. package/dist/lib/opencode-db-path.d.ts.map +1 -0
  150. package/dist/lib/opencode-db-path.js +16 -0
  151. package/dist/lib/opencode-db-path.js.map +1 -0
  152. package/dist/lib/opencode-go-auth.d.ts +4 -2
  153. package/dist/lib/opencode-go-auth.d.ts.map +1 -1
  154. package/dist/lib/opencode-go-auth.js +9 -5
  155. package/dist/lib/opencode-go-auth.js.map +1 -1
  156. package/dist/lib/opencode-go.d.ts +12 -0
  157. package/dist/lib/opencode-go.d.ts.map +1 -1
  158. package/dist/lib/opencode-go.js +113 -0
  159. package/dist/lib/opencode-go.js.map +1 -1
  160. package/dist/lib/opencode-runtime-paths.d.ts +6 -12
  161. package/dist/lib/opencode-runtime-paths.d.ts.map +1 -1
  162. package/dist/lib/opencode-runtime-paths.js +12 -82
  163. package/dist/lib/opencode-runtime-paths.js.map +1 -1
  164. package/dist/lib/opencode-sqlite.d.ts +4 -0
  165. package/dist/lib/opencode-sqlite.d.ts.map +1 -1
  166. package/dist/lib/opencode-sqlite.js +17 -52
  167. package/dist/lib/opencode-sqlite.js.map +1 -1
  168. package/dist/lib/opencode-storage.d.ts +4 -8
  169. package/dist/lib/opencode-storage.d.ts.map +1 -1
  170. package/dist/lib/opencode-storage.js +66 -90
  171. package/dist/lib/opencode-storage.js.map +1 -1
  172. package/dist/lib/opencode-version.d.ts +6 -0
  173. package/dist/lib/opencode-version.d.ts.map +1 -0
  174. package/dist/lib/opencode-version.js +26 -0
  175. package/dist/lib/opencode-version.js.map +1 -0
  176. package/dist/lib/opencode-zen.d.ts +10 -4
  177. package/dist/lib/opencode-zen.d.ts.map +1 -1
  178. package/dist/lib/opencode-zen.js +11 -11
  179. package/dist/lib/opencode-zen.js.map +1 -1
  180. package/dist/lib/provider-registration.d.ts +3 -4
  181. package/dist/lib/provider-registration.d.ts.map +1 -1
  182. package/dist/lib/provider-registration.js +3 -4
  183. package/dist/lib/provider-registration.js.map +1 -1
  184. package/dist/lib/quota-columns.d.ts +38 -0
  185. package/dist/lib/quota-columns.d.ts.map +1 -0
  186. package/dist/lib/quota-columns.js +129 -0
  187. package/dist/lib/quota-columns.js.map +1 -0
  188. package/dist/lib/quota-command-format.d.ts +11 -0
  189. package/dist/lib/quota-command-format.d.ts.map +1 -1
  190. package/dist/lib/quota-command-format.js +80 -27
  191. package/dist/lib/quota-command-format.js.map +1 -1
  192. package/dist/lib/quota-dialog-command-specs.d.ts +63 -0
  193. package/dist/lib/quota-dialog-command-specs.d.ts.map +1 -0
  194. package/dist/lib/quota-dialog-command-specs.js +145 -0
  195. package/dist/lib/quota-dialog-command-specs.js.map +1 -0
  196. package/dist/lib/quota-dialog-commands.d.ts +3 -25
  197. package/dist/lib/quota-dialog-commands.d.ts.map +1 -1
  198. package/dist/lib/quota-dialog-commands.js +125 -231
  199. package/dist/lib/quota-dialog-commands.js.map +1 -1
  200. package/dist/lib/quota-export.d.ts.map +1 -1
  201. package/dist/lib/quota-export.js +1 -0
  202. package/dist/lib/quota-export.js.map +1 -1
  203. package/dist/lib/quota-providers-remote.d.ts +2 -2
  204. package/dist/lib/quota-providers-remote.d.ts.map +1 -1
  205. package/dist/lib/quota-providers-remote.js +6 -4
  206. package/dist/lib/quota-providers-remote.js.map +1 -1
  207. package/dist/lib/quota-render-data.d.ts +3 -0
  208. package/dist/lib/quota-render-data.d.ts.map +1 -1
  209. package/dist/lib/quota-render-data.js +2 -0
  210. package/dist/lib/quota-render-data.js.map +1 -1
  211. package/dist/lib/quota-report-message.d.ts +22 -0
  212. package/dist/lib/quota-report-message.d.ts.map +1 -0
  213. package/dist/lib/quota-report-message.js +36 -0
  214. package/dist/lib/quota-report-message.js.map +1 -0
  215. package/dist/lib/quota-runtime-context.d.ts +1 -0
  216. package/dist/lib/quota-runtime-context.d.ts.map +1 -1
  217. package/dist/lib/quota-runtime-context.js +1 -0
  218. package/dist/lib/quota-runtime-context.js.map +1 -1
  219. package/dist/lib/quota-state-codec.js +5 -5
  220. package/dist/lib/quota-state-codec.js.map +1 -1
  221. package/dist/lib/quota-stats-format.d.ts +8 -3
  222. package/dist/lib/quota-stats-format.d.ts.map +1 -1
  223. package/dist/lib/quota-stats-format.js +36 -37
  224. package/dist/lib/quota-stats-format.js.map +1 -1
  225. package/dist/lib/quota-stats.js +2 -1
  226. package/dist/lib/quota-stats.js.map +1 -1
  227. package/dist/lib/quota-status.d.ts +7 -12
  228. package/dist/lib/quota-status.d.ts.map +1 -1
  229. package/dist/lib/quota-status.js +42 -47
  230. package/dist/lib/quota-status.js.map +1 -1
  231. package/dist/lib/quota-surface-data.d.ts +26 -0
  232. package/dist/lib/quota-surface-data.d.ts.map +1 -0
  233. package/dist/lib/quota-surface-data.js +299 -0
  234. package/dist/lib/quota-surface-data.js.map +1 -0
  235. package/dist/lib/report-document.d.ts +56 -2
  236. package/dist/lib/report-document.d.ts.map +1 -1
  237. package/dist/lib/report-document.js +105 -24
  238. package/dist/lib/report-document.js.map +1 -1
  239. package/dist/lib/scoped-update-migration.d.ts +4 -4
  240. package/dist/lib/scoped-update-migration.d.ts.map +1 -1
  241. package/dist/lib/scoped-update-migration.js +11 -18
  242. package/dist/lib/scoped-update-migration.js.map +1 -1
  243. package/dist/lib/scoped-update.d.ts +5 -1
  244. package/dist/lib/scoped-update.d.ts.map +1 -1
  245. package/dist/lib/scoped-update.js +73 -51
  246. package/dist/lib/scoped-update.js.map +1 -1
  247. package/dist/lib/synthetic-config.d.ts +2 -2
  248. package/dist/lib/synthetic-config.d.ts.map +1 -1
  249. package/dist/lib/synthetic-config.js +4 -4
  250. package/dist/lib/synthetic-config.js.map +1 -1
  251. package/dist/lib/toast-format-grouped.js +1 -1
  252. package/dist/lib/toast-format-grouped.js.map +1 -1
  253. package/dist/lib/tui-panel-state.d.ts +0 -49
  254. package/dist/lib/tui-panel-state.d.ts.map +1 -1
  255. package/dist/lib/tui-panel-state.js +1 -41
  256. package/dist/lib/tui-panel-state.js.map +1 -1
  257. package/dist/lib/tui-sidebar-format.d.ts.map +1 -1
  258. package/dist/lib/tui-sidebar-format.js +8 -1
  259. package/dist/lib/tui-sidebar-format.js.map +1 -1
  260. package/dist/lib/types.d.ts +26 -7
  261. package/dist/lib/types.d.ts.map +1 -1
  262. package/dist/lib/types.js +1 -2
  263. package/dist/lib/types.js.map +1 -1
  264. package/dist/lib/xai.d.ts +5 -1
  265. package/dist/lib/xai.d.ts.map +1 -1
  266. package/dist/lib/xai.js +13 -4
  267. package/dist/lib/xai.js.map +1 -1
  268. package/dist/lib/zai-auth.d.ts +2 -2
  269. package/dist/lib/zai-auth.d.ts.map +1 -1
  270. package/dist/lib/zai-auth.js +4 -4
  271. package/dist/lib/zai-auth.js.map +1 -1
  272. package/dist/lib/zai.d.ts +1 -0
  273. package/dist/lib/zai.d.ts.map +1 -1
  274. package/dist/lib/zai.js.map +1 -1
  275. package/dist/lib/zhipu-auth.d.ts +2 -2
  276. package/dist/lib/zhipu-auth.d.ts.map +1 -1
  277. package/dist/lib/zhipu-auth.js +4 -4
  278. package/dist/lib/zhipu-auth.js.map +1 -1
  279. package/dist/lib/zhipu.d.ts +1 -0
  280. package/dist/lib/zhipu.d.ts.map +1 -1
  281. package/dist/lib/zhipu.js.map +1 -1
  282. package/dist/plugin.d.ts +6 -9
  283. package/dist/plugin.d.ts.map +1 -1
  284. package/dist/plugin.js +217 -259
  285. package/dist/plugin.js.map +1 -1
  286. package/dist/providers/alibaba-coding-plan.d.ts.map +1 -1
  287. package/dist/providers/alibaba-coding-plan.js +1 -1
  288. package/dist/providers/alibaba-coding-plan.js.map +1 -1
  289. package/dist/providers/alibaba-token-plan.d.ts.map +1 -1
  290. package/dist/providers/alibaba-token-plan.js +1 -0
  291. package/dist/providers/alibaba-token-plan.js.map +1 -1
  292. package/dist/providers/anthropic.d.ts.map +1 -1
  293. package/dist/providers/anthropic.js +83 -1
  294. package/dist/providers/anthropic.js.map +1 -1
  295. package/dist/providers/cache-policies.d.ts +2 -2
  296. package/dist/providers/cache-policies.d.ts.map +1 -1
  297. package/dist/providers/cache-policies.js +10 -9
  298. package/dist/providers/cache-policies.js.map +1 -1
  299. package/dist/providers/copilot.d.ts.map +1 -1
  300. package/dist/providers/copilot.js +60 -9
  301. package/dist/providers/copilot.js.map +1 -1
  302. package/dist/providers/deepseek.js +1 -1
  303. package/dist/providers/deepseek.js.map +1 -1
  304. package/dist/providers/glm-coding-plan-provider.d.ts +13 -1
  305. package/dist/providers/glm-coding-plan-provider.d.ts.map +1 -1
  306. package/dist/providers/glm-coding-plan-provider.js +53 -0
  307. package/dist/providers/glm-coding-plan-provider.js.map +1 -1
  308. package/dist/providers/google-agy.d.ts.map +1 -1
  309. package/dist/providers/google-agy.js +56 -7
  310. package/dist/providers/google-agy.js.map +1 -1
  311. package/dist/providers/google-gemini-cli.d.ts.map +1 -1
  312. package/dist/providers/google-gemini-cli.js +72 -7
  313. package/dist/providers/google-gemini-cli.js.map +1 -1
  314. package/dist/providers/kilo.js +1 -1
  315. package/dist/providers/kilo.js.map +1 -1
  316. package/dist/providers/kimi-code.d.ts.map +1 -1
  317. package/dist/providers/kimi-code.js +60 -1
  318. package/dist/providers/kimi-code.js.map +1 -1
  319. package/dist/providers/minimax-coding-plan.d.ts.map +1 -1
  320. package/dist/providers/minimax-coding-plan.js +52 -1
  321. package/dist/providers/minimax-coding-plan.js.map +1 -1
  322. package/dist/providers/nanogpt.js +1 -1
  323. package/dist/providers/nanogpt.js.map +1 -1
  324. package/dist/providers/ollama-cloud.js +1 -1
  325. package/dist/providers/ollama-cloud.js.map +1 -1
  326. package/dist/providers/openai.d.ts.map +1 -1
  327. package/dist/providers/openai.js +59 -29
  328. package/dist/providers/openai.js.map +1 -1
  329. package/dist/providers/opencode-go.d.ts.map +1 -1
  330. package/dist/providers/opencode-go.js +207 -55
  331. package/dist/providers/opencode-go.js.map +1 -1
  332. package/dist/providers/opencode-zen.d.ts.map +1 -1
  333. package/dist/providers/opencode-zen.js +37 -51
  334. package/dist/providers/opencode-zen.js.map +1 -1
  335. package/dist/providers/openrouter.js +1 -1
  336. package/dist/providers/openrouter.js.map +1 -1
  337. package/dist/providers/quota-providers.js +9 -9
  338. package/dist/providers/quota-providers.js.map +1 -1
  339. package/dist/providers/result-helpers.d.ts +2 -2
  340. package/dist/providers/result-helpers.d.ts.map +1 -1
  341. package/dist/providers/result-helpers.js +2 -2
  342. package/dist/providers/result-helpers.js.map +1 -1
  343. package/dist/providers/xai.d.ts.map +1 -1
  344. package/dist/providers/xai.js +49 -1
  345. package/dist/providers/xai.js.map +1 -1
  346. package/dist/providers/zai.d.ts.map +1 -1
  347. package/dist/providers/zai.js +3 -1
  348. package/dist/providers/zai.js.map +1 -1
  349. package/dist/providers/zhipu.d.ts.map +1 -1
  350. package/dist/providers/zhipu.js +3 -1
  351. package/dist/providers/zhipu.js.map +1 -1
  352. package/dist/rpc.d.ts +72 -0
  353. package/dist/rpc.d.ts.map +1 -0
  354. package/dist/rpc.js +77 -0
  355. package/dist/rpc.js.map +1 -0
  356. package/dist/tui-v2.d.ts +5 -0
  357. package/dist/tui-v2.d.ts.map +1 -0
  358. package/dist/tui-v2.jsx +624 -0
  359. package/dist/tui-v2.jsx.map +1 -0
  360. package/dist/tui.d.ts +4 -6
  361. package/dist/tui.d.ts.map +1 -1
  362. package/dist/tui.js +793 -934
  363. package/package.json +7 -19
  364. package/dist/lib/cache.d.ts +0 -39
  365. package/dist/lib/cache.d.ts.map +0 -1
  366. package/dist/lib/cache.js +0 -124
  367. package/dist/lib/cache.js.map +0 -1
  368. package/dist/lib/command-handled.d.ts +0 -17
  369. package/dist/lib/command-handled.d.ts.map +0 -1
  370. package/dist/lib/command-handled.js +0 -36
  371. package/dist/lib/command-handled.js.map +0 -1
  372. package/dist/lib/command-surfaces.d.ts +0 -10
  373. package/dist/lib/command-surfaces.d.ts.map +0 -1
  374. package/dist/lib/command-surfaces.js +0 -9
  375. package/dist/lib/command-surfaces.js.map +0 -1
  376. package/dist/lib/opencode-zen-config.d.ts +0 -33
  377. package/dist/lib/opencode-zen-config.d.ts.map +0 -1
  378. package/dist/lib/opencode-zen-config.js +0 -158
  379. package/dist/lib/opencode-zen-config.js.map +0 -1
  380. package/dist/lib/path-pick.d.ts +0 -2
  381. package/dist/lib/path-pick.d.ts.map +0 -1
  382. package/dist/lib/path-pick.js +0 -15
  383. package/dist/lib/path-pick.js.map +0 -1
  384. package/dist/lib/quota-toast-runtime.d.ts +0 -60
  385. package/dist/lib/quota-toast-runtime.d.ts.map +0 -1
  386. package/dist/lib/quota-toast-runtime.js +0 -766
  387. package/dist/lib/quota-toast-runtime.js.map +0 -1
  388. package/dist/lib/tui-config-diagnostics.d.ts +0 -17
  389. package/dist/lib/tui-config-diagnostics.d.ts.map +0 -1
  390. package/dist/lib/tui-config-diagnostics.js +0 -72
  391. package/dist/lib/tui-config-diagnostics.js.map +0 -1
  392. package/dist/lib/tui-line-style.d.ts +0 -3
  393. package/dist/lib/tui-line-style.d.ts.map +0 -1
  394. package/dist/lib/tui-line-style.js +0 -7
  395. package/dist/lib/tui-line-style.js.map +0 -1
  396. package/dist/lib/tui-native-provider-quota.d.ts +0 -7
  397. package/dist/lib/tui-native-provider-quota.d.ts.map +0 -1
  398. package/dist/lib/tui-native-provider-quota.js +0 -25
  399. package/dist/lib/tui-native-provider-quota.js.map +0 -1
  400. package/dist/lib/tui-refresh-lifecycle.d.ts +0 -17
  401. package/dist/lib/tui-refresh-lifecycle.d.ts.map +0 -1
  402. package/dist/lib/tui-refresh-lifecycle.js +0 -82
  403. package/dist/lib/tui-refresh-lifecycle.js.map +0 -1
  404. package/dist/lib/tui-runtime.d.ts +0 -84
  405. package/dist/lib/tui-runtime.d.ts.map +0 -1
  406. package/dist/lib/tui-runtime.js +0 -527
  407. package/dist/lib/tui-runtime.js.map +0 -1
  408. package/dist/lib/tui-sidebar-content.d.ts +0 -32
  409. package/dist/lib/tui-sidebar-content.d.ts.map +0 -1
  410. package/dist/lib/tui-sidebar-content.js +0 -52
  411. package/dist/lib/tui-sidebar-content.js.map +0 -1
  412. package/dist/tui.tsx +0 -1030
@@ -0,0 +1,624 @@
1
+ /** @jsxImportSource @opentui/solid */
2
+ import { Plugin } from "@opencode/plugin/tui";
3
+ import { TextAttributes } from "@opentui/core";
4
+ import { useTerminalDimensions } from "@opentui/solid";
5
+ import { createSignal, onCleanup, Show } from "solid-js";
6
+ import { loadConfig } from "./lib/config.js";
7
+ import { resolveOpenCodeLocationRoots } from "./lib/config-file-utils.js";
8
+ import { sanitizeDisplayText } from "./lib/display-sanitize.js";
9
+ import { fitTableToWidth } from "./lib/markdown-table.js";
10
+ import { layoutQuotaTables } from "./lib/quota-columns.js";
11
+ import { parseQuotaSlashCommand, QUOTA_DIALOG_COMMANDS, } from "./lib/quota-dialog-command-specs.js";
12
+ import { readQuotaReportMetadata } from "./lib/quota-report-message.js";
13
+ import { renderableSections, renderKvRow, } from "./lib/report-document.js";
14
+ import { QuotaRpc, } from "./rpc.js";
15
+ const REFRESH_INTERVAL_MS = 60_000;
16
+ const RPC_TIMEOUT_MS = 60_000;
17
+ function getSessionID(event) {
18
+ const sessionID = event.data?.sessionID;
19
+ return typeof sessionID === "string" && sessionID ? sessionID : undefined;
20
+ }
21
+ function quotaClient(context) {
22
+ return {
23
+ config: {
24
+ get: async () => ({ data: {} }),
25
+ providers: async () => ({
26
+ data: {
27
+ providers: context.data.location?.provider.list(context.location ?? context.data.location.default()) ?? [],
28
+ },
29
+ }),
30
+ },
31
+ };
32
+ }
33
+ /** Same project roots as the server plugin: the location's Git worktree, else the location directory. */
34
+ function quotaRoots(context) {
35
+ return resolveOpenCodeLocationRoots(context.location?.directory ?? process.cwd());
36
+ }
37
+ /**
38
+ * The server plugin computes every quota surface; the TUI asks it over the quota RPC. The
39
+ * RPC client is made per call, never during setup. Each call names the TUI's location, so
40
+ * the server uses that folder's settings, and gives up after a minute.
41
+ */
42
+ function quotaRpc(context) {
43
+ return context.client.rpc(QuotaRpc);
44
+ }
45
+ function quotaRpcOptions(context) {
46
+ return {
47
+ location: context.location ?? context.data.location.default(),
48
+ signal: AbortSignal.timeout(RPC_TIMEOUT_MS),
49
+ };
50
+ }
51
+ async function getQuotaMessage(context, sessionID, surface) {
52
+ const output = await quotaRpc(context).surface({ surface, sessionID }, quotaRpcOptions(context));
53
+ return output.quota ?? undefined;
54
+ }
55
+ /** RPC calls reject with a plain `{ type, message }` object, not an Error. */
56
+ function rpcErrorMessage(error) {
57
+ if (error instanceof Error)
58
+ return error.message;
59
+ if (typeof error === "object" &&
60
+ error !== null &&
61
+ "message" in error &&
62
+ typeof error.message === "string") {
63
+ return error.message;
64
+ }
65
+ return String(error);
66
+ }
67
+ /**
68
+ * One view's refresh loop, as in v4 (tui-refresh-lifecycle.ts): a refresh that
69
+ * arrives while a load runs is coalesced into one follow-up load, and a result is
70
+ * dropped when the view was disposed or a newer load started.
71
+ */
72
+ function createViewRefresh(load, apply) {
73
+ let disposed = false;
74
+ let loadVersion = 0;
75
+ let inFlight = false;
76
+ let queued = false;
77
+ const refresh = () => {
78
+ if (disposed)
79
+ return;
80
+ if (inFlight) {
81
+ queued = true;
82
+ return;
83
+ }
84
+ inFlight = true;
85
+ const currentVersion = ++loadVersion;
86
+ void load()
87
+ .then((value) => {
88
+ if (disposed || currentVersion !== loadVersion)
89
+ return;
90
+ apply(value);
91
+ })
92
+ .catch(reportFailure)
93
+ .finally(() => {
94
+ if (disposed)
95
+ return;
96
+ inFlight = false;
97
+ if (queued) {
98
+ queued = false;
99
+ refresh();
100
+ }
101
+ });
102
+ };
103
+ return {
104
+ refresh,
105
+ dispose: () => {
106
+ disposed = true;
107
+ },
108
+ };
109
+ }
110
+ function QuotaFooter(props) {
111
+ const [lines, setLines] = createSignal([]);
112
+ const view = createViewRefresh(async () => {
113
+ const output = await quotaRpc(props.context).footer({ surface: props.surface, sessionID: props.sessionID }, quotaRpcOptions(props.context));
114
+ return output.lines;
115
+ }, (next) => {
116
+ setLines(next);
117
+ if (props.surface !== "home")
118
+ return;
119
+ // Fire-and-forget: the server writes the export file if enabled. A failed write
120
+ // must never affect rendering, so log a warning and continue.
121
+ void quotaRpc(props.context)
122
+ .writeExport({}, quotaRpcOptions(props.context))
123
+ .catch((error) => {
124
+ console.warn(`[opencode-quota] quota export write failed: ${rpcErrorMessage(error)}`);
125
+ });
126
+ });
127
+ view.refresh();
128
+ const interval = setInterval(view.refresh, REFRESH_INTERVAL_MS);
129
+ const stop = props.context.data.on("session.step.ended", (event) => {
130
+ if (props.surface === "home" || getSessionID(event) === props.sessionID)
131
+ view.refresh();
132
+ });
133
+ onCleanup(() => {
134
+ view.dispose();
135
+ clearInterval(interval);
136
+ stop();
137
+ });
138
+ return (<Show when={lines().length}>
139
+ <box flexDirection="column">
140
+ {lines().map((line) => (<text fg={props.context.theme.text.muted}>{line}</text>))}
141
+ </box>
142
+ </Show>);
143
+ }
144
+ function reportFailure(error) {
145
+ // OpenCode answers rpc.unavailable when no server plugin registered the quota RPC here.
146
+ const hint = typeof error === "object" &&
147
+ error !== null &&
148
+ "type" in error &&
149
+ error.type === "rpc.unavailable"
150
+ ? " (OpenCode Quota's server plugin is not loaded for this folder)"
151
+ : "";
152
+ console.warn(`[opencode-quota] failed to load quota: ${rpcErrorMessage(error)}${hint}`);
153
+ }
154
+ /** OpenCode's dialog widths (dialogWidth in its ui/dialog.tsx). */
155
+ const DIALOG_WIDTHS = { medium: 60, large: 88, xlarge: 116 };
156
+ function sanitizeQuotaRow(row) {
157
+ return {
158
+ ...row,
159
+ label: sanitizeDisplayText(row.label),
160
+ value: sanitizeDisplayText(row.value),
161
+ usage: row.usage === undefined ? undefined : sanitizeDisplayText(row.usage),
162
+ reset: row.reset === undefined ? undefined : sanitizeDisplayText(row.reset),
163
+ notes: row.notes.map(sanitizeDisplayText),
164
+ };
165
+ }
166
+ /** A report's /quota blocks, sanitized, for layoutQuotaTables. */
167
+ function quotaBlocks(section) {
168
+ return section.blocks.flatMap((block) => block.kind === "quota"
169
+ ? [
170
+ {
171
+ ...block,
172
+ provider: sanitizeDisplayText(block.provider),
173
+ rows: block.rows.map(sanitizeQuotaRow),
174
+ },
175
+ ]
176
+ : []);
177
+ }
178
+ /**
179
+ * A /quota table (see layoutQuotaTables): its title bold, like a section title, then its
180
+ * header bold in OpenCode's primary accent, like the token tables, and its providers bold.
181
+ * In the rows, labels, reset times, and notes are muted; bars, percents, and values base.
182
+ */
183
+ function QuotaTableView(props) {
184
+ return (<box flexDirection="column">
185
+ <text attributes={TextAttributes.BOLD} fg={props.theme.text.base}>
186
+ {props.table.title}
187
+ </text>
188
+ {props.table.lines.map((line) => line.style === "row" ? (<text fg={props.theme.text.base} wrapMode="none">
189
+ {line.segments.map((segment) => (<span style={{ fg: segment.muted ? props.theme.text.muted : props.theme.text.base }}>
190
+ {segment.text}
191
+ </span>))}
192
+ </text>) : (<text attributes={TextAttributes.BOLD} fg={line.style === "header"
193
+ ? props.theme.text.action.primary.selected
194
+ : props.theme.text.base} wrapMode={line.style === "header" ? "none" : undefined}>
195
+ {line.segments.map((segment) => segment.text).join("")}
196
+ </text>))}
197
+ </box>);
198
+ }
199
+ /**
200
+ * One block of a report. Lines, and the chat lines of /quota rows the dialog's tables do not
201
+ * fit, and key-value rows wrap at words. A table keeps each row on one line and spans `width`
202
+ * columns when it fits (see fitTableToWidth), with the header row bold in OpenCode's primary
203
+ * accent (its text color for a selected tab). Like OpenCode's sidebar, labels are muted and
204
+ * values are base.
205
+ */
206
+ function ReportBlockView(props) {
207
+ const block = props.block;
208
+ if (block.kind === "lines" || block.kind === "quota") {
209
+ return <text fg={props.theme.text.muted}>{sanitizeDisplayText(block.lines.join("\n"))}</text>;
210
+ }
211
+ if (block.kind === "kv") {
212
+ return (<box flexDirection="column">
213
+ {block.rows.map(({ value, ...key }) => value === undefined ? (<text fg={props.theme.text.muted}>{sanitizeDisplayText(renderKvRow(key))}</text>) : (<text fg={props.theme.text.muted}>
214
+ {sanitizeDisplayText(renderKvRow({ ...key, trailingColon: true }))}
215
+ <span style={{ fg: props.theme.text.base }}> {sanitizeDisplayText(value)}</span>
216
+ </text>))}
217
+ </box>);
218
+ }
219
+ // Read in the JSX, so the table is laid out again when the terminal is resized.
220
+ const table = () => fitTableToWidth({
221
+ headers: block.headers.map(sanitizeDisplayText),
222
+ fullHeaders: block.fullHeaders?.map(sanitizeDisplayText),
223
+ rows: block.rows.map((row) => row.map(sanitizeDisplayText)),
224
+ aligns: block.aligns,
225
+ width: props.width,
226
+ });
227
+ return (<box flexDirection="column">
228
+ <text attributes={TextAttributes.BOLD} fg={props.theme.text.action.primary.selected} wrapMode="none">
229
+ {table().header}
230
+ </text>
231
+ {table().rows.map((row) => (<text fg={props.theme.text.base} wrapMode="none">
232
+ {row}
233
+ </text>))}
234
+ </box>);
235
+ }
236
+ /**
237
+ * Draws a report document's sections with the same spacing as its plain text: one blank row
238
+ * between the sections and between the blocks of a section, and a section title directly
239
+ * above its first block. Section titles are bold. A /quota report's provider sections come
240
+ * first; when their rows fit the dialog's tables (see layoutQuotaTables), the tables take
241
+ * their place. The dialog shows the heading's subtitle under its own title, so the heading
242
+ * line is left out.
243
+ */
244
+ function ReportDocumentView(props) {
245
+ const sections = renderableSections(props.document);
246
+ const blocks = sections.flatMap(quotaBlocks);
247
+ // Read in the JSX, so the tables are laid out again when the terminal is resized.
248
+ const tables = () => (blocks.length > 0 ? layoutQuotaTables(blocks, props.width) : undefined);
249
+ return (<box flexDirection="column" gap={1}>
250
+ {[
251
+ ...(tables() ?? []).map((table) => <QuotaTableView table={table} theme={props.theme}/>),
252
+ ...sections
253
+ .filter((section) => !tables() || !section.blocks.some((block) => block.kind === "quota"))
254
+ .map((section) => (<box flexDirection="column">
255
+ {section.title ? (<text attributes={TextAttributes.BOLD} fg={props.theme.text.base}>
256
+ {sanitizeDisplayText(section.title)}
257
+ </text>) : null}
258
+ <box flexDirection="column" gap={1}>
259
+ {section.blocks.map((block) => (<ReportBlockView block={block} theme={props.theme} width={props.width}/>))}
260
+ </box>
261
+ </box>)),
262
+ ]}
263
+ </box>);
264
+ }
265
+ /**
266
+ * Shows command output like OpenCode's alert dialog, but inside a scrollbox so long
267
+ * reports (/quota_status, /tokens_*) stay reachable. The mouse wheel scrolls the box;
268
+ * arrows, PageUp/PageDown, and Home/End scroll it from the keyboard. Esc is handled by
269
+ * the host dialog; Enter and the ok/esc labels close it.
270
+ */
271
+ function QuotaOutputDialog(props) {
272
+ const theme = () => props.context.theme.surface("dialog");
273
+ const dimensions = useTerminalDimensions();
274
+ // OpenCode's dialog is its size's width, at most the terminal width minus 2. Inside it
275
+ // come this box's paddings (2 + 2) and one column for the scrollbox's scrollbar, which
276
+ // shows when the report is taller than the box.
277
+ const tableWidth = () => Math.min(DIALOG_WIDTHS[props.size], dimensions().width - 2) - 4 - 1;
278
+ const subtitle = props.document.heading?.subtitle;
279
+ // The host dialog starts a quarter of the way down the terminal. The remaining
280
+ // 8 rows cover the title, ok button, paddings, gaps, and one spare row; the subtitle
281
+ // takes one more.
282
+ const maxHeight = () => Math.max(1, Math.floor(dimensions().height * 0.75) - 8 - (subtitle ? 1 : 0));
283
+ let scroll;
284
+ const close = () => props.context.ui.dialog.clear();
285
+ props.context.keymap.layer(() => ({
286
+ mode: "modal",
287
+ commands: [
288
+ { bind: "return", title: "Close", group: "Dialog", run: close },
289
+ { bind: "up", title: "Scroll up", group: "Dialog", run: () => scroll?.scrollBy(-1) },
290
+ { bind: "down", title: "Scroll down", group: "Dialog", run: () => scroll?.scrollBy(1) },
291
+ {
292
+ bind: "pageup",
293
+ title: "Scroll up one page",
294
+ group: "Dialog",
295
+ run: () => scroll?.scrollBy(-maxHeight()),
296
+ },
297
+ {
298
+ bind: "pagedown",
299
+ title: "Scroll down one page",
300
+ group: "Dialog",
301
+ run: () => scroll?.scrollBy(maxHeight()),
302
+ },
303
+ { bind: "home", title: "Scroll to top", group: "Dialog", run: () => scroll?.scrollTo(0) },
304
+ {
305
+ bind: "end",
306
+ title: "Scroll to bottom",
307
+ group: "Dialog",
308
+ run: () => scroll?.scrollTo(scroll.scrollHeight),
309
+ },
310
+ ],
311
+ }));
312
+ return (<box paddingLeft={2} paddingRight={2} gap={1}>
313
+ <box>
314
+ <box flexDirection="row" justifyContent="space-between">
315
+ <text attributes={TextAttributes.BOLD} fg={theme().text.base}>
316
+ {props.title}
317
+ </text>
318
+ <text fg={theme().text.muted} onMouseUp={close}>
319
+ esc
320
+ </text>
321
+ </box>
322
+ {subtitle ? <text fg={theme().text.muted}>{sanitizeDisplayText(subtitle)}</text> : null}
323
+ </box>
324
+ <box paddingBottom={1}>
325
+ <scrollbox ref={(element) => {
326
+ scroll = element;
327
+ }} maxHeight={maxHeight()}>
328
+ <ReportDocumentView document={props.document} theme={theme()} width={tableWidth()}/>
329
+ </scrollbox>
330
+ </box>
331
+ <box flexDirection="row" justifyContent="flex-end" paddingBottom={1}>
332
+ <box paddingLeft={3} paddingRight={3} backgroundColor={theme().background.action.primary.focused} onMouseUp={close}>
333
+ <text fg={theme().text.action.primary.focused}>ok</text>
334
+ </box>
335
+ </box>
336
+ </box>);
337
+ }
338
+ function showQuotaOutputDialog(context, output) {
339
+ return new Promise((resolve) => {
340
+ context.ui.dialog.show(() => (<QuotaOutputDialog context={context} title={output.title} document={output.document} size={output.dialogSize}/>), resolve);
341
+ context.ui.dialog.set({ size: output.dialogSize });
342
+ });
343
+ }
344
+ /**
345
+ * Runs a quota command from the command palette or the prompt. It opens the dialog and
346
+ * posts no message. `typed` holds the arguments typed after the command name in the prompt.
347
+ */
348
+ async function runQuotaCommand(context, command, sessionID, typed) {
349
+ const spec = QUOTA_DIALOG_COMMANDS.find((item) => item.id === command);
350
+ let argumentsText = typed?.argumentsText;
351
+ // Only /tokens_between needs arguments; the palette asks for them.
352
+ if (command === "tokens_between" && !typed) {
353
+ const value = await context.ui.dialog.prompt({
354
+ title: spec.title,
355
+ placeholder: "YYYY-MM-DD YYYY-MM-DD",
356
+ });
357
+ if (value === undefined)
358
+ return;
359
+ argumentsText = value.trim() || undefined;
360
+ }
361
+ try {
362
+ const result = await quotaRpc(context).command({ command, arguments: argumentsText, sessionID }, quotaRpcOptions(context));
363
+ if (result.state === "noop")
364
+ return;
365
+ await showQuotaOutputDialog(context, {
366
+ title: result.title,
367
+ document: result.document,
368
+ dialogSize: result.dialogSize,
369
+ });
370
+ }
371
+ catch (error) {
372
+ context.ui.toast.show({
373
+ variant: "error",
374
+ title: "OpenCode Quota",
375
+ message: sanitizeDisplayText(rpcErrorMessage(error)),
376
+ });
377
+ }
378
+ }
379
+ /**
380
+ * Quota slash commands that reach the server (from Web or Desktop, queued in the TUI, or
381
+ * typed in "inline" mode) post the report into the chat as a pending inbox item. When a
382
+ * report arrives for the session on screen, tuiCommandDisplay decides what the TUI shows: "dialog" opens the report in the dialog and cancels the pending
383
+ * item, so no chat message remains; "inline" leaves the report in the chat.
384
+ * A command sent from Home creates its session, and OpenCode opens that session before the
385
+ * server runs the command, so its report also arrives for the session on screen.
386
+ * The TUI cannot tell which client typed the command, so in "dialog" mode it also removes a
387
+ * report that Web or Desktop requested for the same session while the TUI shows it.
388
+ */
389
+ async function showPostedQuotaReport(context, event) {
390
+ const sessionID = getSessionID(event);
391
+ if (!sessionID || sessionID !== getRouteSessionID(context))
392
+ return;
393
+ const inboxID = event.data?.inboxID;
394
+ const item = event.data?.item;
395
+ if (typeof inboxID !== "string")
396
+ return;
397
+ if (item?.type !== "user" || typeof item.payload?.text !== "string")
398
+ return;
399
+ const report = readQuotaReportMetadata(item.payload.metadata);
400
+ if (!report)
401
+ return;
402
+ const spec = QUOTA_DIALOG_COMMANDS.find((candidate) => candidate.id === report.command);
403
+ if (!spec)
404
+ return;
405
+ const config = await loadConfig(quotaClient(context), undefined, {
406
+ configRootDir: quotaRoots(context).configRoot,
407
+ });
408
+ if (config.tuiCommandDisplay !== "dialog")
409
+ return;
410
+ // Cancelling deletes the pending item before it becomes a stored message, the same
411
+ // request the TUI sends when the user deletes a pending prompt.
412
+ void context.client.session.inbox.cancel({ sessionID, inboxID }).catch((error) => {
413
+ const message = error instanceof Error ? error.message : String(error);
414
+ console.warn(`[opencode-quota] failed to remove the quota report from the chat: ${message}`);
415
+ });
416
+ void showQuotaOutputDialog(context, {
417
+ title: report.title,
418
+ document: report.document,
419
+ dialogSize: spec.dialogSize,
420
+ });
421
+ }
422
+ function getRouteSessionID(context) {
423
+ const route = context.ui.router.current();
424
+ return route.type === "session" ? route.sessionID : undefined;
425
+ }
426
+ function registerQuotaCommands(context) {
427
+ context.keymap.layer(() => ({
428
+ mode: "global",
429
+ commands: QUOTA_DIALOG_COMMANDS.map((spec) => ({
430
+ id: `quota.${spec.id}`,
431
+ title: spec.title,
432
+ group: "OpenCode Quota",
433
+ // No slash entry: the server plugin registers the "/" commands, so each is listed once.
434
+ palette: true,
435
+ run: () => runQuotaCommand(context, spec.id, getRouteSessionID(context)),
436
+ })),
437
+ }));
438
+ }
439
+ /**
440
+ * Runs typed quota slash commands in the TUI. On Enter, before OpenCode submits the prompt,
441
+ * a prompt that holds exactly a quota command is cleared and the command opens its dialog.
442
+ * So the report never shows in the chat, and on Home no session is created for it.
443
+ * Everything else, and every command in "inline" mode, goes on to OpenCode's submit, and
444
+ * the server command posts the report as before.
445
+ * The layer has no mode, so it is off while the "/" list or a dialog is open. tuiCommandDisplay
446
+ * must be known when Enter is pressed, so it is read at start and again after each typed
447
+ * quota command. Until the first read finishes, typed commands follow the default, "dialog".
448
+ */
449
+ function registerTypedQuotaCommands(context) {
450
+ let commandDisplay;
451
+ const readCommandDisplay = () => {
452
+ void loadConfig(quotaClient(context), undefined, {
453
+ configRootDir: quotaRoots(context).configRoot,
454
+ })
455
+ .then((config) => {
456
+ commandDisplay = config.tuiCommandDisplay;
457
+ })
458
+ .catch(reportFailure);
459
+ };
460
+ readCommandDisplay();
461
+ context.keymap.layer(() => ({
462
+ // Above OpenCode's textarea layer, which submits the prompt on Enter.
463
+ priority: 1,
464
+ commands: [
465
+ {
466
+ bind: "return",
467
+ // Synchronous on purpose: a returned promise counts as handled.
468
+ run: () => {
469
+ const editor = context.renderer.currentFocusedEditor;
470
+ const typed = editor ? parseQuotaSlashCommand(editor.plainText) : undefined;
471
+ if (!editor || !typed)
472
+ return false;
473
+ const display = commandDisplay;
474
+ readCommandDisplay();
475
+ if (display === "inline")
476
+ return false;
477
+ editor.clear();
478
+ void runQuotaCommand(context, typed.command, getRouteSessionID(context), typed);
479
+ },
480
+ },
481
+ ],
482
+ }));
483
+ }
484
+ function SidebarQuotaView(props) {
485
+ const [open, setOpen] = createSignal(true);
486
+ const [quota, setQuota] = createSignal(undefined);
487
+ const lines = () => quota()?.message.split("\n") ?? [];
488
+ const expandable = () => lines().length > 2;
489
+ const view = createViewRefresh(() => getQuotaMessage(props.context, props.sessionID, "sidebar"), setQuota);
490
+ view.refresh();
491
+ const interval = setInterval(view.refresh, REFRESH_INTERVAL_MS);
492
+ const unsubscribe = props.context.data.on("session.step.ended", (event) => {
493
+ if (getSessionID(event) === props.sessionID)
494
+ view.refresh();
495
+ });
496
+ onCleanup(() => {
497
+ view.dispose();
498
+ clearInterval(interval);
499
+ unsubscribe();
500
+ });
501
+ return (<box flexDirection="column">
502
+ <box flexDirection="row" gap={1} onMouseDown={() => expandable() && setOpen((value) => !value)}>
503
+ <Show when={expandable()}>
504
+ <text fg={props.context.theme.text.base}>{open() ? "▼" : "▶"}</text>
505
+ </Show>
506
+ <text fg={props.context.theme.text.base}>
507
+ <b>Quota</b>
508
+ <Show when={expandable() && !open() && quota()?.activeProviderCount}>
509
+ {(count) => ` (${count()} active)`}
510
+ </Show>
511
+ </text>
512
+ </box>
513
+ <Show when={quota()} fallback={<text fg={props.context.theme.text.muted}>No quota data available</text>}>
514
+ <Show when={!expandable() || open()}>
515
+ {lines().map((line) =>
516
+ // Provider headers such as "[Copilot] (individual)" are bold, like section titles.
517
+ line.startsWith("[") ? (<text fg={props.context.theme.text.base} wrapMode="none">
518
+ <b>{line}</b>
519
+ </text>) : (<text fg={props.context.theme.text.muted} wrapMode="none">
520
+ {line || " "}
521
+ </text>))}
522
+ </Show>
523
+ </Show>
524
+ </box>);
525
+ }
526
+ const plugin = Plugin.define({
527
+ id: "@slkiser/opencode-quota",
528
+ setup(context) {
529
+ const api = context;
530
+ let disposeEvents;
531
+ const questionToolCalls = new Set();
532
+ const disposeApp = api.ui.slot({
533
+ append: "app",
534
+ render: () => {
535
+ // OpenCode mounts this slot again when it reconnects to its server, which can also
536
+ // happen right after it starts. Leaving a mount drops its keymap layers and event
537
+ // listeners, so each mount replaces the listeners and registers everything again.
538
+ disposeEvents?.();
539
+ registerQuotaCommands(api);
540
+ registerTypedQuotaCommands(api);
541
+ const trigger = (event, reason) => {
542
+ const sessionID = getSessionID(event);
543
+ if (!sessionID)
544
+ return;
545
+ // As in v4, subagent (child) sessions never show quota toasts.
546
+ if (api.data.session.get(sessionID)?.parentID)
547
+ return;
548
+ void getQuotaMessage(api, sessionID, reason)
549
+ .then((quota) => {
550
+ if (!quota)
551
+ return;
552
+ api.ui.toast.show({
553
+ variant: "info",
554
+ title: "OpenCode Quota",
555
+ message: quota.message,
556
+ duration: quota.duration,
557
+ });
558
+ if (quota.resetNotification) {
559
+ api.ui.toast.show({
560
+ variant: "success",
561
+ title: "Quota available",
562
+ message: sanitizeDisplayText(quota.resetNotification),
563
+ duration: quota.duration,
564
+ });
565
+ }
566
+ })
567
+ .catch(reportFailure);
568
+ };
569
+ const onExecutionSucceeded = api.data.on("session.execution.succeeded", (event) => trigger(event, "idle"));
570
+ const onCompacted = api.data.on("session.compaction.ended", (event) => trigger(event, "compacted"));
571
+ const onQuestionStarted = api.data.on("session.tool.input.started", (event) => {
572
+ const id = event.data?.id;
573
+ if (event.data?.name === "question" && typeof id === "string") {
574
+ questionToolCalls.add(id);
575
+ }
576
+ });
577
+ const onQuestionSucceeded = api.data.on("session.tool.success", (event) => {
578
+ const id = event.data?.id;
579
+ if (typeof id === "string" && questionToolCalls.delete(id))
580
+ trigger(event, "question");
581
+ });
582
+ const onQuestionFailed = api.data.on("session.tool.failed", (event) => {
583
+ const id = event.data?.id;
584
+ if (typeof id === "string")
585
+ questionToolCalls.delete(id);
586
+ });
587
+ const onInboxEnqueued = api.data.on("session.inbox.enqueued", (event) => {
588
+ void showPostedQuotaReport(api, event).catch(reportFailure);
589
+ });
590
+ disposeEvents = () => {
591
+ onExecutionSucceeded();
592
+ onCompacted();
593
+ onQuestionStarted();
594
+ onQuestionSucceeded();
595
+ onQuestionFailed();
596
+ onInboxEnqueued();
597
+ questionToolCalls.clear();
598
+ };
599
+ return null;
600
+ },
601
+ });
602
+ const disposeSidebar = api.ui.slot({
603
+ append: "sidebar.content",
604
+ render: (props) => <SidebarQuotaView context={api} sessionID={props.sessionID}/>,
605
+ });
606
+ const disposePrompt = api.ui.slot({
607
+ append: "prompt.footer",
608
+ render: (props) => <QuotaFooter context={api} sessionID={props.sessionID} surface="prompt"/>,
609
+ });
610
+ const disposeHome = api.ui.slot({
611
+ append: "home.footer.status",
612
+ render: () => <QuotaFooter context={api} surface="home"/>,
613
+ });
614
+ return () => {
615
+ disposeEvents?.();
616
+ disposeApp();
617
+ disposeSidebar();
618
+ disposePrompt();
619
+ disposeHome();
620
+ };
621
+ },
622
+ });
623
+ export default plugin;
624
+ //# sourceMappingURL=tui-v2.jsx.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui-v2.jsx","sourceRoot":"","sources":["../src/tui-v2.tsx"],"names":[],"mappings":"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"}