@slkiser/opencode-quota 3.11.2 → 4.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 (196) hide show
  1. package/README.md +90 -62
  2. package/dist/bin/opencode-quota.d.ts.map +1 -1
  3. package/dist/bin/opencode-quota.js +16 -7
  4. package/dist/bin/opencode-quota.js.map +1 -1
  5. package/dist/index.d.ts +2 -0
  6. package/dist/index.d.ts.map +1 -1
  7. package/dist/index.js +2 -0
  8. package/dist/index.js.map +1 -1
  9. package/dist/lib/cli-show.d.ts.map +1 -1
  10. package/dist/lib/cli-show.js +11 -7
  11. package/dist/lib/cli-show.js.map +1 -1
  12. package/dist/lib/command-surfaces.d.ts +10 -0
  13. package/dist/lib/command-surfaces.d.ts.map +1 -0
  14. package/dist/lib/command-surfaces.js +9 -0
  15. package/dist/lib/command-surfaces.js.map +1 -0
  16. package/dist/lib/config-file-utils.d.ts +5 -0
  17. package/dist/lib/config-file-utils.d.ts.map +1 -1
  18. package/dist/lib/config-file-utils.js +20 -3
  19. package/dist/lib/config-file-utils.js.map +1 -1
  20. package/dist/lib/config.d.ts +5 -3
  21. package/dist/lib/config.d.ts.map +1 -1
  22. package/dist/lib/config.js +124 -32
  23. package/dist/lib/config.js.map +1 -1
  24. package/dist/lib/copilot.d.ts +19 -12
  25. package/dist/lib/copilot.d.ts.map +1 -1
  26. package/dist/lib/copilot.js +462 -566
  27. package/dist/lib/copilot.js.map +1 -1
  28. package/dist/lib/display-sanitize.d.ts.map +1 -1
  29. package/dist/lib/display-sanitize.js +13 -0
  30. package/dist/lib/display-sanitize.js.map +1 -1
  31. package/dist/lib/entries.d.ts +53 -4
  32. package/dist/lib/entries.d.ts.map +1 -1
  33. package/dist/lib/entries.js.map +1 -1
  34. package/dist/lib/init-installer.d.ts +11 -1
  35. package/dist/lib/init-installer.d.ts.map +1 -1
  36. package/dist/lib/init-installer.js +524 -158
  37. package/dist/lib/init-installer.js.map +1 -1
  38. package/dist/lib/opencode-config-editor.d.ts +53 -0
  39. package/dist/lib/opencode-config-editor.d.ts.map +1 -0
  40. package/dist/lib/opencode-config-editor.js +274 -0
  41. package/dist/lib/opencode-config-editor.js.map +1 -0
  42. package/dist/lib/opencode-config-providers.d.ts +18 -0
  43. package/dist/lib/opencode-config-providers.d.ts.map +1 -1
  44. package/dist/lib/opencode-config-providers.js +75 -4
  45. package/dist/lib/opencode-config-providers.js.map +1 -1
  46. package/dist/lib/opencode-runtime-paths.d.ts.map +1 -1
  47. package/dist/lib/opencode-runtime-paths.js +10 -3
  48. package/dist/lib/opencode-runtime-paths.js.map +1 -1
  49. package/dist/lib/opencode-storage.d.ts +10 -0
  50. package/dist/lib/opencode-storage.d.ts.map +1 -1
  51. package/dist/lib/opencode-storage.js +75 -0
  52. package/dist/lib/opencode-storage.js.map +1 -1
  53. package/dist/lib/provider-add-command.d.ts +35 -0
  54. package/dist/lib/provider-add-command.d.ts.map +1 -0
  55. package/dist/lib/provider-add-command.js +185 -0
  56. package/dist/lib/provider-add-command.js.map +1 -0
  57. package/dist/lib/provider-add.d.ts +21 -0
  58. package/dist/lib/provider-add.d.ts.map +1 -0
  59. package/dist/lib/provider-add.js +210 -0
  60. package/dist/lib/provider-add.js.map +1 -0
  61. package/dist/lib/provider-metadata.d.ts +1 -1
  62. package/dist/lib/provider-metadata.d.ts.map +1 -1
  63. package/dist/lib/provider-metadata.js +11 -5
  64. package/dist/lib/provider-metadata.js.map +1 -1
  65. package/dist/lib/quota-command-format.d.ts +2 -0
  66. package/dist/lib/quota-command-format.d.ts.map +1 -1
  67. package/dist/lib/quota-command-format.js +94 -26
  68. package/dist/lib/quota-command-format.js.map +1 -1
  69. package/dist/lib/quota-dialog-commands.d.ts.map +1 -1
  70. package/dist/lib/quota-dialog-commands.js +8 -4
  71. package/dist/lib/quota-dialog-commands.js.map +1 -1
  72. package/dist/lib/quota-export-types.d.ts +48 -27
  73. package/dist/lib/quota-export-types.d.ts.map +1 -1
  74. package/dist/lib/quota-export-types.js +0 -7
  75. package/dist/lib/quota-export-types.js.map +1 -1
  76. package/dist/lib/quota-export.d.ts.map +1 -1
  77. package/dist/lib/quota-export.js +63 -16
  78. package/dist/lib/quota-export.js.map +1 -1
  79. package/dist/lib/quota-providers-local.d.ts +55 -0
  80. package/dist/lib/quota-providers-local.d.ts.map +1 -0
  81. package/dist/lib/quota-providers-local.js +313 -0
  82. package/dist/lib/quota-providers-local.js.map +1 -0
  83. package/dist/lib/quota-providers-remote.d.ts +23 -0
  84. package/dist/lib/quota-providers-remote.d.ts.map +1 -0
  85. package/dist/lib/quota-providers-remote.js +318 -0
  86. package/dist/lib/quota-providers-remote.js.map +1 -0
  87. package/dist/lib/quota-providers.d.ts +77 -0
  88. package/dist/lib/quota-providers.d.ts.map +1 -0
  89. package/dist/lib/quota-providers.js +630 -0
  90. package/dist/lib/quota-providers.js.map +1 -0
  91. package/dist/lib/quota-render-data.d.ts +1 -0
  92. package/dist/lib/quota-render-data.d.ts.map +1 -1
  93. package/dist/lib/quota-render-data.js +35 -16
  94. package/dist/lib/quota-render-data.js.map +1 -1
  95. package/dist/lib/quota-runtime-context.d.ts.map +1 -1
  96. package/dist/lib/quota-runtime-context.js +3 -4
  97. package/dist/lib/quota-runtime-context.js.map +1 -1
  98. package/dist/lib/quota-state.d.ts +5 -2
  99. package/dist/lib/quota-state.d.ts.map +1 -1
  100. package/dist/lib/quota-state.js +268 -51
  101. package/dist/lib/quota-state.js.map +1 -1
  102. package/dist/lib/quota-status.d.ts +2 -1
  103. package/dist/lib/quota-status.d.ts.map +1 -1
  104. package/dist/lib/quota-status.js +247 -69
  105. package/dist/lib/quota-status.js.map +1 -1
  106. package/dist/lib/qwen-local-quota.d.ts +12 -11
  107. package/dist/lib/qwen-local-quota.d.ts.map +1 -1
  108. package/dist/lib/qwen-local-quota.js +82 -87
  109. package/dist/lib/qwen-local-quota.js.map +1 -1
  110. package/dist/lib/scoped-update.d.ts.map +1 -1
  111. package/dist/lib/scoped-update.js +32 -22
  112. package/dist/lib/scoped-update.js.map +1 -1
  113. package/dist/lib/tui-runtime.d.ts +2 -0
  114. package/dist/lib/tui-runtime.d.ts.map +1 -1
  115. package/dist/lib/tui-runtime.js +33 -9
  116. package/dist/lib/tui-runtime.js.map +1 -1
  117. package/dist/lib/types.d.ts +51 -15
  118. package/dist/lib/types.d.ts.map +1 -1
  119. package/dist/lib/types.js +2 -1
  120. package/dist/lib/types.js.map +1 -1
  121. package/dist/plugin.d.ts.map +1 -1
  122. package/dist/plugin.js +75 -100
  123. package/dist/plugin.js.map +1 -1
  124. package/dist/providers/alibaba-coding-plan.d.ts.map +1 -1
  125. package/dist/providers/alibaba-coding-plan.js +35 -4
  126. package/dist/providers/alibaba-coding-plan.js.map +1 -1
  127. package/dist/providers/anthropic.d.ts.map +1 -1
  128. package/dist/providers/anthropic.js +13 -1
  129. package/dist/providers/anthropic.js.map +1 -1
  130. package/dist/providers/chutes.d.ts.map +1 -1
  131. package/dist/providers/chutes.js +6 -0
  132. package/dist/providers/chutes.js.map +1 -1
  133. package/dist/providers/copilot.d.ts +2 -1
  134. package/dist/providers/copilot.d.ts.map +1 -1
  135. package/dist/providers/copilot.js +143 -60
  136. package/dist/providers/copilot.js.map +1 -1
  137. package/dist/providers/cursor.d.ts.map +1 -1
  138. package/dist/providers/cursor.js +30 -1
  139. package/dist/providers/cursor.js.map +1 -1
  140. package/dist/providers/deepseek.d.ts.map +1 -1
  141. package/dist/providers/deepseek.js +13 -1
  142. package/dist/providers/deepseek.js.map +1 -1
  143. package/dist/providers/google-agy.d.ts.map +1 -1
  144. package/dist/providers/google-agy.js +7 -1
  145. package/dist/providers/google-agy.js.map +1 -1
  146. package/dist/providers/google-antigravity.d.ts.map +1 -1
  147. package/dist/providers/google-antigravity.js +10 -2
  148. package/dist/providers/google-antigravity.js.map +1 -1
  149. package/dist/providers/google-gemini-cli.d.ts.map +1 -1
  150. package/dist/providers/google-gemini-cli.js +8 -2
  151. package/dist/providers/google-gemini-cli.js.map +1 -1
  152. package/dist/providers/kimi-code.d.ts.map +1 -1
  153. package/dist/providers/kimi-code.js +6 -0
  154. package/dist/providers/kimi-code.js.map +1 -1
  155. package/dist/providers/minimax-coding-plan.d.ts.map +1 -1
  156. package/dist/providers/minimax-coding-plan.js +12 -4
  157. package/dist/providers/minimax-coding-plan.js.map +1 -1
  158. package/dist/providers/nanogpt.d.ts.map +1 -1
  159. package/dist/providers/nanogpt.js +19 -1
  160. package/dist/providers/nanogpt.js.map +1 -1
  161. package/dist/providers/ollama-cloud.d.ts.map +1 -1
  162. package/dist/providers/ollama-cloud.js +12 -0
  163. package/dist/providers/ollama-cloud.js.map +1 -1
  164. package/dist/providers/openai.d.ts.map +1 -1
  165. package/dist/providers/openai.js +6 -0
  166. package/dist/providers/openai.js.map +1 -1
  167. package/dist/providers/opencode-go.d.ts.map +1 -1
  168. package/dist/providers/opencode-go.js +9 -1
  169. package/dist/providers/opencode-go.js.map +1 -1
  170. package/dist/providers/quota-providers.d.ts +6 -0
  171. package/dist/providers/quota-providers.d.ts.map +1 -0
  172. package/dist/providers/quota-providers.js +276 -0
  173. package/dist/providers/quota-providers.js.map +1 -0
  174. package/dist/providers/qwen-code.d.ts.map +1 -1
  175. package/dist/providers/qwen-code.js +29 -3
  176. package/dist/providers/qwen-code.js.map +1 -1
  177. package/dist/providers/registry.d.ts.map +1 -1
  178. package/dist/providers/registry.js +2 -0
  179. package/dist/providers/registry.js.map +1 -1
  180. package/dist/providers/result-helpers.d.ts +2 -1
  181. package/dist/providers/result-helpers.d.ts.map +1 -1
  182. package/dist/providers/result-helpers.js +6 -1
  183. package/dist/providers/result-helpers.js.map +1 -1
  184. package/dist/providers/synthetic.d.ts.map +1 -1
  185. package/dist/providers/synthetic.js +7 -1
  186. package/dist/providers/synthetic.js.map +1 -1
  187. package/dist/providers/zai.d.ts.map +1 -1
  188. package/dist/providers/zai.js +7 -1
  189. package/dist/providers/zai.js.map +1 -1
  190. package/dist/providers/zhipu.d.ts.map +1 -1
  191. package/dist/providers/zhipu.js +7 -1
  192. package/dist/providers/zhipu.js.map +1 -1
  193. package/dist/tui.d.ts.map +1 -1
  194. package/dist/tui.js +345 -41
  195. package/dist/tui.tsx +267 -18
  196. package/package.json +28 -21
@@ -0,0 +1,313 @@
1
+ import { readFile, stat } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ import { iterCompletedAssistantMessages } from "./opencode-storage.js";
4
+ import { getOpencodeRuntimeDirs } from "./opencode-runtime-paths.js";
5
+ import { writeJsonAtomic } from "./atomic-json.js";
6
+ import { resolvePricingKey } from "./quota-stats.js";
7
+ import { lookupCost } from "./modelsdev-pricing.js";
8
+ import { calculateUsdFromTokenBuckets } from "./token-cost.js";
9
+ import { tokenBucketsFromMessage } from "./token-buckets.js";
10
+ export const QUOTA_PROVIDER_LOCAL_STATE_VERSION = 1;
11
+ const LOCAL_STATE_DIR = "opencode-quota/quota-providers";
12
+ const DAY_MS = 24 * 60 * 60 * 1000;
13
+ function hasOnlyKeys(value, allowed) {
14
+ const allowedSet = new Set(allowed);
15
+ return Object.keys(value).every((key) => allowedSet.has(key));
16
+ }
17
+ function asRecord(value) {
18
+ return value && typeof value === "object" && !Array.isArray(value)
19
+ ? value
20
+ : null;
21
+ }
22
+ function isTokenBuckets(value) {
23
+ const record = asRecord(value);
24
+ if (!record ||
25
+ !hasOnlyKeys(record, ["input", "output", "reasoning", "cache_read", "cache_write"])) {
26
+ return false;
27
+ }
28
+ return ["input", "output", "reasoning", "cache_read", "cache_write"].every((key) => typeof record[key] === "number" && Number.isFinite(record[key]) && Number(record[key]) >= 0);
29
+ }
30
+ function normalizeMessage(value) {
31
+ const record = asRecord(value);
32
+ if (!record ||
33
+ !hasOnlyKeys(record, ["id", "atMs", "providerId", "modelId", "tokens"]) ||
34
+ typeof record.id !== "string" ||
35
+ record.id.length === 0 ||
36
+ typeof record.atMs !== "number" ||
37
+ !Number.isFinite(record.atMs) ||
38
+ record.atMs <= 0 ||
39
+ typeof record.providerId !== "string" ||
40
+ record.providerId.length === 0 ||
41
+ typeof record.modelId !== "string" ||
42
+ record.modelId.length === 0 ||
43
+ !isTokenBuckets(record.tokens)) {
44
+ return null;
45
+ }
46
+ return {
47
+ id: record.id,
48
+ atMs: Math.trunc(record.atMs),
49
+ providerId: record.providerId,
50
+ modelId: record.modelId,
51
+ tokens: { ...record.tokens },
52
+ };
53
+ }
54
+ function normalizeState(value, definition) {
55
+ const record = asRecord(value);
56
+ if (!record)
57
+ return { state: emptyState(definition, 0), health: "malformed" };
58
+ if (record.version !== QUOTA_PROVIDER_LOCAL_STATE_VERSION) {
59
+ return { state: emptyState(definition, 0), health: "version_mismatch" };
60
+ }
61
+ if (!hasOnlyKeys(record, ["version", "definitionId", "providerId", "updatedAt", "messages"]) ||
62
+ record.definitionId !== definition.id ||
63
+ record.providerId !== definition.providerId ||
64
+ typeof record.updatedAt !== "number" ||
65
+ !Number.isFinite(record.updatedAt) ||
66
+ record.updatedAt < 0 ||
67
+ !Array.isArray(record.messages)) {
68
+ return { state: emptyState(definition, 0), health: "malformed" };
69
+ }
70
+ const messages = [];
71
+ for (const value of record.messages) {
72
+ const message = normalizeMessage(value);
73
+ if (!message)
74
+ return { state: emptyState(definition, 0), health: "malformed" };
75
+ messages.push(message);
76
+ }
77
+ return {
78
+ state: {
79
+ version: QUOTA_PROVIDER_LOCAL_STATE_VERSION,
80
+ definitionId: definition.id,
81
+ providerId: definition.providerId,
82
+ updatedAt: Math.trunc(record.updatedAt),
83
+ messages,
84
+ },
85
+ health: "healthy",
86
+ };
87
+ }
88
+ function emptyState(definition, updatedAt) {
89
+ return {
90
+ version: QUOTA_PROVIDER_LOCAL_STATE_VERSION,
91
+ definitionId: definition.id,
92
+ providerId: definition.providerId,
93
+ updatedAt,
94
+ messages: [],
95
+ };
96
+ }
97
+ export function getLocalQuotaProviderStatePath(definitionId, runtimeDirs = getOpencodeRuntimeDirs()) {
98
+ return join(runtimeDirs.stateDir, LOCAL_STATE_DIR, `${definitionId}.json`);
99
+ }
100
+ function utcDayStart(nowMs) {
101
+ const now = new Date(nowMs);
102
+ return Date.UTC(now.getUTCFullYear(), now.getUTCMonth(), now.getUTCDate());
103
+ }
104
+ function windowStart(window, nowMs) {
105
+ return window.type === "utc-day"
106
+ ? utcDayStart(nowMs)
107
+ : nowMs - window.durationMinutes * 60 * 1000;
108
+ }
109
+ function retentionStart(definition, nowMs) {
110
+ return Math.min(...definition.windows.map((window) => windowStart(window, nowMs)));
111
+ }
112
+ function messageTimestamp(message) {
113
+ const value = message.time?.completed;
114
+ return typeof value === "number" && Number.isFinite(value) && value > 0
115
+ ? Math.trunc(value)
116
+ : null;
117
+ }
118
+ function matchesDefinition(definition, message) {
119
+ return (message.role === "assistant" &&
120
+ message.providerID === definition.providerId &&
121
+ typeof message.modelID === "string" &&
122
+ (definition.modelIds === undefined || definition.modelIds.includes(message.modelID)));
123
+ }
124
+ function toStateMessage(message) {
125
+ const atMs = messageTimestamp(message);
126
+ if (!atMs || !message.providerID || !message.modelID || !message.id)
127
+ return null;
128
+ return {
129
+ id: message.id,
130
+ atMs,
131
+ providerId: message.providerID,
132
+ modelId: message.modelID,
133
+ tokens: tokenBucketsFromMessage(message),
134
+ };
135
+ }
136
+ export async function syncLocalQuotaProviderState(definition, dependencies = {}) {
137
+ const nowMs = dependencies.nowMs ?? Date.now();
138
+ const path = getLocalQuotaProviderStatePath(definition.id, dependencies.runtimeDirs);
139
+ const readMessages = dependencies.readMessages ??
140
+ ((params) => iterCompletedAssistantMessages({
141
+ completedSinceMs: params.completedSinceMs,
142
+ completedUntilMs: params.completedUntilMs,
143
+ }));
144
+ const writeState = dependencies.writeState ??
145
+ ((target, state) => writeJsonAtomic(target, state, { trailingNewline: true }));
146
+ const completedSinceMs = retentionStart(definition, nowMs);
147
+ const fresh = await readMessages({ completedSinceMs, completedUntilMs: nowMs });
148
+ const byId = new Map();
149
+ for (const raw of fresh) {
150
+ if (!matchesDefinition(definition, raw))
151
+ continue;
152
+ const message = toStateMessage(raw);
153
+ if (message && message.atMs >= completedSinceMs && message.atMs <= nowMs) {
154
+ byId.set(message.id, message);
155
+ }
156
+ }
157
+ const next = {
158
+ version: QUOTA_PROVIDER_LOCAL_STATE_VERSION,
159
+ definitionId: definition.id,
160
+ providerId: definition.providerId,
161
+ updatedAt: nowMs,
162
+ messages: [...byId.values()].sort((left, right) => left.atMs - right.atMs || left.id.localeCompare(right.id)),
163
+ };
164
+ await writeState(path, next);
165
+ return next;
166
+ }
167
+ function resolveMessageCost(definition, message) {
168
+ const automatic = resolvePricingKey({
169
+ providerID: message.providerId,
170
+ modelID: message.modelId,
171
+ });
172
+ if (automatic.ok) {
173
+ const rates = lookupCost(automatic.key.provider, automatic.key.model);
174
+ return rates ? calculateUsdFromTokenBuckets(rates, message.tokens) : null;
175
+ }
176
+ const manual = definition.pricingModelMap?.[message.modelId];
177
+ if (!manual)
178
+ return null;
179
+ const slash = manual.indexOf("/");
180
+ const rates = lookupCost(manual.slice(0, slash), manual.slice(slash + 1));
181
+ return rates ? calculateUsdFromTokenBuckets(rates, message.tokens) : null;
182
+ }
183
+ function nextUtcMidnight(nowMs) {
184
+ return new Date(utcDayStart(nowMs) + DAY_MS).toISOString();
185
+ }
186
+ function rollingReset(messages, window) {
187
+ const oldest = messages[0];
188
+ return oldest
189
+ ? new Date(oldest.atMs + window.durationMinutes * 60 * 1000).toISOString()
190
+ : undefined;
191
+ }
192
+ function formatUsd(value) {
193
+ return `$${value.toFixed(2)}`;
194
+ }
195
+ function percentRemaining(used, limit) {
196
+ return Math.max(0, Math.min(100, ((limit - used) / limit) * 100));
197
+ }
198
+ export function computeLocalQuotaProviderEstimate(params) {
199
+ const nowMs = params.nowMs ?? Date.now();
200
+ const entries = [];
201
+ let totalUnpriced = 0;
202
+ for (const window of params.definition.windows) {
203
+ const sinceMs = windowStart(window, nowMs);
204
+ const messages = params.state.messages.filter((message) => message.atMs >= sinceMs && message.atMs <= nowMs);
205
+ const resetTimeIso = window.type === "utc-day" ? nextUtcMidnight(nowMs) : rollingReset(messages, window);
206
+ entries.push({
207
+ accounting: {
208
+ resultType: "rate_limit",
209
+ acquisitionMethod: "local_estimation",
210
+ ownership: "user_configured",
211
+ authority: "locally_derived",
212
+ sourceId: params.definition.id,
213
+ observedAtIso: new Date(params.state.updatedAt).toISOString(),
214
+ },
215
+ kind: "percent",
216
+ name: `${params.definition.label} ${window.label}`,
217
+ group: params.definition.label,
218
+ label: `${window.label}:`,
219
+ right: `${messages.length}/${window.requestLimit}`,
220
+ percentRemaining: percentRemaining(messages.length, window.requestLimit),
221
+ ...(resetTimeIso ? { resetTimeIso } : {}),
222
+ });
223
+ if (window.usdBudget === undefined)
224
+ continue;
225
+ let costUsd = 0;
226
+ let unpriced = 0;
227
+ for (const message of messages) {
228
+ const cost = resolveMessageCost(params.definition, message);
229
+ if (cost === null)
230
+ unpriced += 1;
231
+ else
232
+ costUsd += cost;
233
+ }
234
+ totalUnpriced += unpriced;
235
+ const common = {
236
+ accounting: {
237
+ resultType: "budget",
238
+ acquisitionMethod: "local_estimation",
239
+ ownership: "user_configured",
240
+ authority: "locally_derived",
241
+ sourceId: params.definition.id,
242
+ observedAtIso: new Date(params.state.updatedAt).toISOString(),
243
+ },
244
+ name: `${params.definition.label} ${window.label} budget`,
245
+ group: params.definition.label,
246
+ label: `${window.label} budget:`,
247
+ ...(resetTimeIso ? { resetTimeIso } : {}),
248
+ };
249
+ if (unpriced > 0) {
250
+ entries.push({
251
+ ...common,
252
+ kind: "value",
253
+ value: `Unavailable (${unpriced} unpriced request${unpriced === 1 ? "" : "s"})`,
254
+ });
255
+ }
256
+ else {
257
+ entries.push({
258
+ ...common,
259
+ kind: "percent",
260
+ right: `${formatUsd(costUsd)}/${formatUsd(window.usdBudget)}`,
261
+ percentRemaining: percentRemaining(costUsd, window.usdBudget),
262
+ });
263
+ }
264
+ }
265
+ return { entries, state: params.state, unpricedMessageCount: totalUnpriced };
266
+ }
267
+ export async function collectLocalQuotaProviderEstimate(definition, dependencies = {}) {
268
+ const state = await syncLocalQuotaProviderState(definition, dependencies);
269
+ return computeLocalQuotaProviderEstimate({
270
+ definition,
271
+ state,
272
+ ...(dependencies.nowMs !== undefined ? { nowMs: dependencies.nowMs } : {}),
273
+ });
274
+ }
275
+ export async function inspectLocalQuotaProviderState(definition, dependencies = {}) {
276
+ const path = getLocalQuotaProviderStatePath(definition.id, dependencies.runtimeDirs);
277
+ const readText = dependencies.readText ?? ((target) => readFile(target, "utf8"));
278
+ try {
279
+ const raw = JSON.parse(await readText(path));
280
+ const record = asRecord(raw);
281
+ const version = typeof record?.version === "number" ? record.version : null;
282
+ const normalized = normalizeState(raw, definition);
283
+ let lastUpdatedAt = null;
284
+ try {
285
+ const fileStats = await stat(path);
286
+ lastUpdatedAt =
287
+ normalized.health === "healthy" ? normalized.state.updatedAt : fileStats.mtimeMs;
288
+ }
289
+ catch {
290
+ lastUpdatedAt = normalized.health === "healthy" ? normalized.state.updatedAt : null;
291
+ }
292
+ return {
293
+ path,
294
+ exists: true,
295
+ health: normalized.health,
296
+ version,
297
+ lastUpdatedAt,
298
+ };
299
+ }
300
+ catch (error) {
301
+ if (error &&
302
+ typeof error === "object" &&
303
+ "code" in error &&
304
+ String(error.code) === "ENOENT") {
305
+ return { path, exists: false, health: "missing", version: null, lastUpdatedAt: null };
306
+ }
307
+ return { path, exists: true, health: "malformed", version: null, lastUpdatedAt: null };
308
+ }
309
+ }
310
+ export function __resetLocalQuotaProviderStateForTests() {
311
+ // Local state is derived from authoritative OpenCode storage; no mutation queue exists.
312
+ }
313
+ //# sourceMappingURL=quota-providers-local.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota-providers-local.js","sourceRoot":"","sources":["../../src/lib/quota-providers-local.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import type { QuotaToastEntry } from "./entries.js";
2
+ import type { RemoteApiQuotaProviderDefinition } from "./quota-providers.js";
3
+ export declare const QUOTA_PROVIDER_MAX_BODY_BYTES: number;
4
+ export declare const QUOTA_PROVIDER_MAX_ACCOUNTING_ROWS = 100;
5
+ export declare const QUOTA_PROVIDER_CONCURRENCY = 4;
6
+ export type QuotaProviderAuthSource = "env" | "opencode.json" | "opencode.jsonc" | "auth.json";
7
+ export interface QuotaProviderAuthResolution {
8
+ key?: string;
9
+ source: QuotaProviderAuthSource | null;
10
+ checkedPaths: string[];
11
+ authPaths: string[];
12
+ }
13
+ export type RemoteQuotaProviderResult = {
14
+ success: true;
15
+ entries: QuotaToastEntry[];
16
+ } | {
17
+ success: false;
18
+ error: string;
19
+ };
20
+ export declare function resolveQuotaProviderApiKey(source: RemoteApiQuotaProviderDefinition): Promise<QuotaProviderAuthResolution>;
21
+ export declare function fetchRemoteQuotaProvider(source: RemoteApiQuotaProviderDefinition, apiKey: string, requestTimeoutMs?: number): Promise<RemoteQuotaProviderResult>;
22
+ export declare function mapWithConcurrency<T, R>(values: readonly T[], concurrency: number, map: (value: T, index: number) => Promise<R>): Promise<R[]>;
23
+ //# sourceMappingURL=quota-providers-remote.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota-providers-remote.d.ts","sourceRoot":"","sources":["../../src/lib/quota-providers-remote.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAwB,eAAe,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,KAAK,EAAE,gCAAgC,EAAE,MAAM,sBAAsB,CAAC;AAW7E,eAAO,MAAM,6BAA6B,QAAa,CAAC;AACxD,eAAO,MAAM,kCAAkC,MAAM,CAAC;AACtD,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAa5C,MAAM,MAAM,uBAAuB,GAAG,KAAK,GAAG,eAAe,GAAG,gBAAgB,GAAG,WAAW,CAAC;AAE/F,MAAM,WAAW,2BAA2B;IAC1C,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,uBAAuB,GAAG,IAAI,CAAC;IACvC,YAAY,EAAE,MAAM,EAAE,CAAC;IACvB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAED,MAAM,MAAM,yBAAyB,GACjC;IAAE,OAAO,EAAE,IAAI,CAAC;IAAC,OAAO,EAAE,eAAe,EAAE,CAAA;CAAE,GAC7C;IAAE,OAAO,EAAE,KAAK,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC;AAyCtC,wBAAsB,0BAA0B,CAC9C,MAAM,EAAE,gCAAgC,GACvC,OAAO,CAAC,2BAA2B,CAAC,CAyBtC;AA6ND,wBAAsB,wBAAwB,CAC5C,MAAM,EAAE,gCAAgC,EACxC,MAAM,EAAE,MAAM,EACd,gBAAgB,CAAC,EAAE,MAAM,GACxB,OAAO,CAAC,yBAAyB,CAAC,CAgDpC;AAED,wBAAsB,kBAAkB,CAAC,CAAC,EAAE,CAAC,EAC3C,MAAM,EAAE,SAAS,CAAC,EAAE,EACpB,WAAW,EAAE,MAAM,EACnB,GAAG,EAAE,CAAC,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC,CAAC,CAAC,GAC3C,OAAO,CAAC,CAAC,EAAE,CAAC,CAiBd"}