@slkiser/opencode-quota 3.11.1 → 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 (208) hide show
  1. package/README.md +103 -57
  2. package/dist/bin/opencode-quota.d.ts.map +1 -1
  3. package/dist/bin/opencode-quota.js +24 -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/anthropic.d.ts.map +1 -1
  10. package/dist/lib/anthropic.js +106 -3
  11. package/dist/lib/anthropic.js.map +1 -1
  12. package/dist/lib/atomic-json.d.ts +1 -0
  13. package/dist/lib/atomic-json.d.ts.map +1 -1
  14. package/dist/lib/atomic-json.js +5 -2
  15. package/dist/lib/atomic-json.js.map +1 -1
  16. package/dist/lib/cli-show.d.ts.map +1 -1
  17. package/dist/lib/cli-show.js +11 -7
  18. package/dist/lib/cli-show.js.map +1 -1
  19. package/dist/lib/command-surfaces.d.ts +10 -0
  20. package/dist/lib/command-surfaces.d.ts.map +1 -0
  21. package/dist/lib/command-surfaces.js +9 -0
  22. package/dist/lib/command-surfaces.js.map +1 -0
  23. package/dist/lib/config-file-utils.d.ts +5 -0
  24. package/dist/lib/config-file-utils.d.ts.map +1 -1
  25. package/dist/lib/config-file-utils.js +20 -3
  26. package/dist/lib/config-file-utils.js.map +1 -1
  27. package/dist/lib/config.d.ts +5 -3
  28. package/dist/lib/config.d.ts.map +1 -1
  29. package/dist/lib/config.js +124 -32
  30. package/dist/lib/config.js.map +1 -1
  31. package/dist/lib/copilot.d.ts +19 -12
  32. package/dist/lib/copilot.d.ts.map +1 -1
  33. package/dist/lib/copilot.js +462 -566
  34. package/dist/lib/copilot.js.map +1 -1
  35. package/dist/lib/display-sanitize.d.ts.map +1 -1
  36. package/dist/lib/display-sanitize.js +13 -0
  37. package/dist/lib/display-sanitize.js.map +1 -1
  38. package/dist/lib/entries.d.ts +53 -4
  39. package/dist/lib/entries.d.ts.map +1 -1
  40. package/dist/lib/entries.js.map +1 -1
  41. package/dist/lib/init-installer.d.ts +11 -1
  42. package/dist/lib/init-installer.d.ts.map +1 -1
  43. package/dist/lib/init-installer.js +542 -154
  44. package/dist/lib/init-installer.js.map +1 -1
  45. package/dist/lib/openai.d.ts +9 -12
  46. package/dist/lib/openai.d.ts.map +1 -1
  47. package/dist/lib/openai.js +69 -40
  48. package/dist/lib/openai.js.map +1 -1
  49. package/dist/lib/opencode-config-editor.d.ts +53 -0
  50. package/dist/lib/opencode-config-editor.d.ts.map +1 -0
  51. package/dist/lib/opencode-config-editor.js +274 -0
  52. package/dist/lib/opencode-config-editor.js.map +1 -0
  53. package/dist/lib/opencode-config-providers.d.ts +18 -0
  54. package/dist/lib/opencode-config-providers.d.ts.map +1 -1
  55. package/dist/lib/opencode-config-providers.js +75 -4
  56. package/dist/lib/opencode-config-providers.js.map +1 -1
  57. package/dist/lib/opencode-runtime-paths.d.ts.map +1 -1
  58. package/dist/lib/opencode-runtime-paths.js +10 -3
  59. package/dist/lib/opencode-runtime-paths.js.map +1 -1
  60. package/dist/lib/opencode-storage.d.ts +10 -0
  61. package/dist/lib/opencode-storage.d.ts.map +1 -1
  62. package/dist/lib/opencode-storage.js +75 -0
  63. package/dist/lib/opencode-storage.js.map +1 -1
  64. package/dist/lib/provider-add-command.d.ts +35 -0
  65. package/dist/lib/provider-add-command.d.ts.map +1 -0
  66. package/dist/lib/provider-add-command.js +185 -0
  67. package/dist/lib/provider-add-command.js.map +1 -0
  68. package/dist/lib/provider-add.d.ts +21 -0
  69. package/dist/lib/provider-add.d.ts.map +1 -0
  70. package/dist/lib/provider-add.js +210 -0
  71. package/dist/lib/provider-add.js.map +1 -0
  72. package/dist/lib/provider-metadata.d.ts +1 -1
  73. package/dist/lib/provider-metadata.d.ts.map +1 -1
  74. package/dist/lib/provider-metadata.js +11 -5
  75. package/dist/lib/provider-metadata.js.map +1 -1
  76. package/dist/lib/quota-command-format.d.ts +2 -0
  77. package/dist/lib/quota-command-format.d.ts.map +1 -1
  78. package/dist/lib/quota-command-format.js +94 -26
  79. package/dist/lib/quota-command-format.js.map +1 -1
  80. package/dist/lib/quota-dialog-commands.d.ts.map +1 -1
  81. package/dist/lib/quota-dialog-commands.js +8 -4
  82. package/dist/lib/quota-dialog-commands.js.map +1 -1
  83. package/dist/lib/quota-export-types.d.ts +48 -27
  84. package/dist/lib/quota-export-types.d.ts.map +1 -1
  85. package/dist/lib/quota-export-types.js +0 -7
  86. package/dist/lib/quota-export-types.js.map +1 -1
  87. package/dist/lib/quota-export.d.ts.map +1 -1
  88. package/dist/lib/quota-export.js +63 -16
  89. package/dist/lib/quota-export.js.map +1 -1
  90. package/dist/lib/quota-providers-local.d.ts +55 -0
  91. package/dist/lib/quota-providers-local.d.ts.map +1 -0
  92. package/dist/lib/quota-providers-local.js +313 -0
  93. package/dist/lib/quota-providers-local.js.map +1 -0
  94. package/dist/lib/quota-providers-remote.d.ts +23 -0
  95. package/dist/lib/quota-providers-remote.d.ts.map +1 -0
  96. package/dist/lib/quota-providers-remote.js +318 -0
  97. package/dist/lib/quota-providers-remote.js.map +1 -0
  98. package/dist/lib/quota-providers.d.ts +77 -0
  99. package/dist/lib/quota-providers.d.ts.map +1 -0
  100. package/dist/lib/quota-providers.js +630 -0
  101. package/dist/lib/quota-providers.js.map +1 -0
  102. package/dist/lib/quota-render-data.d.ts +1 -0
  103. package/dist/lib/quota-render-data.d.ts.map +1 -1
  104. package/dist/lib/quota-render-data.js +35 -16
  105. package/dist/lib/quota-render-data.js.map +1 -1
  106. package/dist/lib/quota-runtime-context.d.ts.map +1 -1
  107. package/dist/lib/quota-runtime-context.js +3 -4
  108. package/dist/lib/quota-runtime-context.js.map +1 -1
  109. package/dist/lib/quota-state.d.ts +5 -2
  110. package/dist/lib/quota-state.d.ts.map +1 -1
  111. package/dist/lib/quota-state.js +268 -51
  112. package/dist/lib/quota-state.js.map +1 -1
  113. package/dist/lib/quota-status.d.ts +2 -1
  114. package/dist/lib/quota-status.d.ts.map +1 -1
  115. package/dist/lib/quota-status.js +247 -69
  116. package/dist/lib/quota-status.js.map +1 -1
  117. package/dist/lib/qwen-local-quota.d.ts +12 -11
  118. package/dist/lib/qwen-local-quota.d.ts.map +1 -1
  119. package/dist/lib/qwen-local-quota.js +82 -87
  120. package/dist/lib/qwen-local-quota.js.map +1 -1
  121. package/dist/lib/scoped-update.d.ts +63 -0
  122. package/dist/lib/scoped-update.d.ts.map +1 -0
  123. package/dist/lib/scoped-update.js +311 -0
  124. package/dist/lib/scoped-update.js.map +1 -0
  125. package/dist/lib/tui-runtime.d.ts +2 -0
  126. package/dist/lib/tui-runtime.d.ts.map +1 -1
  127. package/dist/lib/tui-runtime.js +33 -9
  128. package/dist/lib/tui-runtime.js.map +1 -1
  129. package/dist/lib/types.d.ts +51 -15
  130. package/dist/lib/types.d.ts.map +1 -1
  131. package/dist/lib/types.js +2 -1
  132. package/dist/lib/types.js.map +1 -1
  133. package/dist/plugin.d.ts.map +1 -1
  134. package/dist/plugin.js +75 -100
  135. package/dist/plugin.js.map +1 -1
  136. package/dist/providers/alibaba-coding-plan.d.ts.map +1 -1
  137. package/dist/providers/alibaba-coding-plan.js +35 -4
  138. package/dist/providers/alibaba-coding-plan.js.map +1 -1
  139. package/dist/providers/anthropic.d.ts.map +1 -1
  140. package/dist/providers/anthropic.js +13 -1
  141. package/dist/providers/anthropic.js.map +1 -1
  142. package/dist/providers/chutes.d.ts.map +1 -1
  143. package/dist/providers/chutes.js +6 -0
  144. package/dist/providers/chutes.js.map +1 -1
  145. package/dist/providers/copilot.d.ts +2 -1
  146. package/dist/providers/copilot.d.ts.map +1 -1
  147. package/dist/providers/copilot.js +143 -60
  148. package/dist/providers/copilot.js.map +1 -1
  149. package/dist/providers/cursor.d.ts.map +1 -1
  150. package/dist/providers/cursor.js +30 -1
  151. package/dist/providers/cursor.js.map +1 -1
  152. package/dist/providers/deepseek.d.ts.map +1 -1
  153. package/dist/providers/deepseek.js +13 -1
  154. package/dist/providers/deepseek.js.map +1 -1
  155. package/dist/providers/google-agy.d.ts.map +1 -1
  156. package/dist/providers/google-agy.js +7 -1
  157. package/dist/providers/google-agy.js.map +1 -1
  158. package/dist/providers/google-antigravity.d.ts.map +1 -1
  159. package/dist/providers/google-antigravity.js +10 -2
  160. package/dist/providers/google-antigravity.js.map +1 -1
  161. package/dist/providers/google-gemini-cli.d.ts.map +1 -1
  162. package/dist/providers/google-gemini-cli.js +8 -2
  163. package/dist/providers/google-gemini-cli.js.map +1 -1
  164. package/dist/providers/kimi-code.d.ts.map +1 -1
  165. package/dist/providers/kimi-code.js +6 -0
  166. package/dist/providers/kimi-code.js.map +1 -1
  167. package/dist/providers/minimax-coding-plan.d.ts.map +1 -1
  168. package/dist/providers/minimax-coding-plan.js +12 -4
  169. package/dist/providers/minimax-coding-plan.js.map +1 -1
  170. package/dist/providers/nanogpt.d.ts.map +1 -1
  171. package/dist/providers/nanogpt.js +19 -1
  172. package/dist/providers/nanogpt.js.map +1 -1
  173. package/dist/providers/ollama-cloud.d.ts.map +1 -1
  174. package/dist/providers/ollama-cloud.js +12 -0
  175. package/dist/providers/ollama-cloud.js.map +1 -1
  176. package/dist/providers/openai.d.ts.map +1 -1
  177. package/dist/providers/openai.js +7 -0
  178. package/dist/providers/openai.js.map +1 -1
  179. package/dist/providers/opencode-go.d.ts.map +1 -1
  180. package/dist/providers/opencode-go.js +9 -1
  181. package/dist/providers/opencode-go.js.map +1 -1
  182. package/dist/providers/quota-providers.d.ts +6 -0
  183. package/dist/providers/quota-providers.d.ts.map +1 -0
  184. package/dist/providers/quota-providers.js +276 -0
  185. package/dist/providers/quota-providers.js.map +1 -0
  186. package/dist/providers/qwen-code.d.ts.map +1 -1
  187. package/dist/providers/qwen-code.js +29 -3
  188. package/dist/providers/qwen-code.js.map +1 -1
  189. package/dist/providers/registry.d.ts.map +1 -1
  190. package/dist/providers/registry.js +2 -0
  191. package/dist/providers/registry.js.map +1 -1
  192. package/dist/providers/result-helpers.d.ts +2 -1
  193. package/dist/providers/result-helpers.d.ts.map +1 -1
  194. package/dist/providers/result-helpers.js +6 -1
  195. package/dist/providers/result-helpers.js.map +1 -1
  196. package/dist/providers/synthetic.d.ts.map +1 -1
  197. package/dist/providers/synthetic.js +7 -1
  198. package/dist/providers/synthetic.js.map +1 -1
  199. package/dist/providers/zai.d.ts.map +1 -1
  200. package/dist/providers/zai.js +7 -1
  201. package/dist/providers/zai.js.map +1 -1
  202. package/dist/providers/zhipu.d.ts.map +1 -1
  203. package/dist/providers/zhipu.js +7 -1
  204. package/dist/providers/zhipu.js.map +1 -1
  205. package/dist/tui.d.ts.map +1 -1
  206. package/dist/tui.js +148 -122
  207. package/dist/tui.tsx +122 -114
  208. package/package.json +29 -21
@@ -0,0 +1,318 @@
1
+ import { createProviderApiKeyResolver, getApiKeyCheckedPaths, getGlobalOpencodeConfigCandidatePaths, } from "./api-key-resolver.js";
2
+ import { sanitizeSingleLineDisplayText } from "./display-sanitize.js";
3
+ import { getAuthPaths, readAuthFile } from "./opencode-auth.js";
4
+ import { REQUEST_TIMEOUT_MS } from "./types.js";
5
+ export const QUOTA_PROVIDER_MAX_BODY_BYTES = 256 * 1024;
6
+ export const QUOTA_PROVIDER_MAX_ACCOUNTING_ROWS = 100;
7
+ export const QUOTA_PROVIDER_CONCURRENCY = 4;
8
+ const RESULT_TYPES = new Set([
9
+ "quota",
10
+ "rate_limit",
11
+ "usage",
12
+ "spend",
13
+ "budget",
14
+ "balance",
15
+ "status",
16
+ ]);
17
+ const ISO_TIMESTAMP_RE = /^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d+)?(?:Z|[+-]\d{2}:\d{2})$/;
18
+ function isRecord(value) {
19
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
20
+ }
21
+ function hasOnlyKeys(value, allowed) {
22
+ const allowedSet = new Set(allowed);
23
+ return Object.keys(value).every((key) => allowedSet.has(key));
24
+ }
25
+ function isIsoTimestamp(value) {
26
+ return (typeof value === "string" && ISO_TIMESTAMP_RE.test(value) && Number.isFinite(Date.parse(value)));
27
+ }
28
+ function boundedDisplayText(value, maxCodePoints) {
29
+ if (typeof value !== "string")
30
+ return null;
31
+ const normalized = sanitizeSingleLineDisplayText(value);
32
+ const length = Array.from(normalized).length;
33
+ return length >= 1 && length <= maxCodePoints ? normalized : null;
34
+ }
35
+ function formatUsd(value) {
36
+ return `$${value.toFixed(2)}`;
37
+ }
38
+ function accountingMetadata(resultType, observedAtIso) {
39
+ return {
40
+ resultType,
41
+ acquisitionMethod: "remote_api",
42
+ ownership: "user_configured",
43
+ authority: "provider_reported",
44
+ ...(observedAtIso ? { observedAtIso } : {}),
45
+ };
46
+ }
47
+ export async function resolveQuotaProviderApiKey(source) {
48
+ const resolver = createProviderApiKeyResolver({
49
+ envVars: source.apiKeyEnv ? [{ name: source.apiKeyEnv, source: "env" }] : [],
50
+ providerKeys: [source.providerId],
51
+ allowedEnvVars: source.apiKeyEnv ? [source.apiKeyEnv] : [],
52
+ configJsonSource: "opencode.json",
53
+ configJsoncSource: "opencode.jsonc",
54
+ getConfigCandidates: getGlobalOpencodeConfigCandidatePaths,
55
+ auth: {
56
+ readAuth: readAuthFile,
57
+ authKeys: [source.providerId],
58
+ authSource: "auth.json",
59
+ },
60
+ });
61
+ const resolved = await resolver.resolve();
62
+ return {
63
+ ...(resolved ? { key: resolved.key } : {}),
64
+ source: resolved?.source ?? null,
65
+ checkedPaths: getApiKeyCheckedPaths({
66
+ envVarNames: source.apiKeyEnv ? [source.apiKeyEnv] : [],
67
+ getConfigCandidates: getGlobalOpencodeConfigCandidatePaths,
68
+ }),
69
+ authPaths: getAuthPaths(),
70
+ };
71
+ }
72
+ async function readBoundedJson(response) {
73
+ const contentType = response.headers.get("content-type")?.split(";", 1)[0]?.trim().toLowerCase();
74
+ if (!contentType ||
75
+ (contentType !== "application/json" &&
76
+ !(contentType.startsWith("application/") && contentType.endsWith("+json")))) {
77
+ throw new Error("Expected a JSON response");
78
+ }
79
+ const contentLength = response.headers.get("content-length");
80
+ if (contentLength) {
81
+ const parsedLength = Number(contentLength);
82
+ if (Number.isFinite(parsedLength) && parsedLength > QUOTA_PROVIDER_MAX_BODY_BYTES) {
83
+ throw new Error("Response exceeded 262144 bytes");
84
+ }
85
+ }
86
+ let bytes;
87
+ if (response.body) {
88
+ const reader = response.body.getReader();
89
+ const chunks = [];
90
+ let total = 0;
91
+ try {
92
+ while (true) {
93
+ const next = await reader.read();
94
+ if (next.done)
95
+ break;
96
+ total += next.value.byteLength;
97
+ if (total > QUOTA_PROVIDER_MAX_BODY_BYTES) {
98
+ await reader.cancel();
99
+ throw new Error("Response exceeded 262144 bytes");
100
+ }
101
+ chunks.push(next.value);
102
+ }
103
+ }
104
+ finally {
105
+ reader.releaseLock();
106
+ }
107
+ bytes = new Uint8Array(total);
108
+ let offset = 0;
109
+ for (const chunk of chunks) {
110
+ bytes.set(chunk, offset);
111
+ offset += chunk.byteLength;
112
+ }
113
+ }
114
+ else {
115
+ const buffer = new Uint8Array(await response.arrayBuffer());
116
+ if (buffer.byteLength > QUOTA_PROVIDER_MAX_BODY_BYTES) {
117
+ throw new Error("Response exceeded 262144 bytes");
118
+ }
119
+ bytes = buffer;
120
+ }
121
+ try {
122
+ return JSON.parse(new TextDecoder().decode(bytes));
123
+ }
124
+ catch {
125
+ throw new Error("Invalid JSON response");
126
+ }
127
+ }
128
+ function parseAccountingV1(source, body) {
129
+ if (!isRecord(body) ||
130
+ !hasOnlyKeys(body, ["version", "entries"]) ||
131
+ body.version !== "accounting-v1" ||
132
+ !Array.isArray(body.entries)) {
133
+ return { success: false, error: "Invalid accounting-v1 response" };
134
+ }
135
+ if (body.entries.length < 1 || body.entries.length > QUOTA_PROVIDER_MAX_ACCOUNTING_ROWS) {
136
+ return { success: false, error: "Invalid accounting-v1 response" };
137
+ }
138
+ const entries = [];
139
+ for (const raw of body.entries) {
140
+ if (!isRecord(raw) ||
141
+ !hasOnlyKeys(raw, [
142
+ "kind",
143
+ "name",
144
+ "resultType",
145
+ "percentRemaining",
146
+ "value",
147
+ "label",
148
+ "right",
149
+ "resetTimeIso",
150
+ "observedAtIso",
151
+ ])) {
152
+ return { success: false, error: "Invalid accounting-v1 response" };
153
+ }
154
+ const name = boundedDisplayText(raw.name, 80);
155
+ const resultType = typeof raw.resultType === "string" && RESULT_TYPES.has(raw.resultType)
156
+ ? raw.resultType
157
+ : null;
158
+ const label = raw.label === undefined ? undefined : boundedDisplayText(raw.label, 80);
159
+ const right = raw.right === undefined ? undefined : boundedDisplayText(raw.right, 160);
160
+ const resetTimeIso = raw.resetTimeIso === undefined
161
+ ? undefined
162
+ : isIsoTimestamp(raw.resetTimeIso)
163
+ ? raw.resetTimeIso
164
+ : null;
165
+ const observedAtIso = raw.observedAtIso === undefined
166
+ ? undefined
167
+ : isIsoTimestamp(raw.observedAtIso)
168
+ ? raw.observedAtIso
169
+ : null;
170
+ if (!name ||
171
+ !resultType ||
172
+ (raw.label !== undefined && label === null) ||
173
+ (raw.right !== undefined && right === null) ||
174
+ resetTimeIso === null ||
175
+ observedAtIso === null) {
176
+ return { success: false, error: "Invalid accounting-v1 response" };
177
+ }
178
+ const common = {
179
+ accounting: accountingMetadata(resultType, observedAtIso),
180
+ name: `${source.label} ${name}`,
181
+ group: source.label,
182
+ ...(label ? { label } : {}),
183
+ ...(right ? { right } : {}),
184
+ ...(resetTimeIso ? { resetTimeIso } : {}),
185
+ };
186
+ if (raw.kind === "percent" &&
187
+ typeof raw.percentRemaining === "number" &&
188
+ Number.isFinite(raw.percentRemaining) &&
189
+ raw.percentRemaining <= 100 &&
190
+ ["quota", "rate_limit", "budget"].includes(resultType) &&
191
+ raw.value === undefined) {
192
+ entries.push({ ...common, kind: "percent", percentRemaining: raw.percentRemaining });
193
+ continue;
194
+ }
195
+ const value = boundedDisplayText(raw.value, 160);
196
+ if (raw.kind === "value" && value !== null && raw.percentRemaining === undefined) {
197
+ entries.push({ ...common, kind: "value", value });
198
+ continue;
199
+ }
200
+ return { success: false, error: "Invalid accounting-v1 response" };
201
+ }
202
+ return { success: true, entries };
203
+ }
204
+ function parseOpenRouterKeyV1(source, body) {
205
+ if (!isRecord(body) || !isRecord(body.data)) {
206
+ return { success: false, error: "Invalid openrouter-key-v1 response" };
207
+ }
208
+ const data = body.data;
209
+ const usage = data.usage;
210
+ const limit = data.limit;
211
+ const remaining = data.limit_remaining;
212
+ if (typeof usage !== "number" ||
213
+ !Number.isFinite(usage) ||
214
+ usage < 0 ||
215
+ (limit !== null && (typeof limit !== "number" || !Number.isFinite(limit) || limit < 0)) ||
216
+ (remaining !== undefined && (typeof remaining !== "number" || !Number.isFinite(remaining)))) {
217
+ return { success: false, error: "Invalid openrouter-key-v1 response" };
218
+ }
219
+ if (typeof limit === "number" && limit > 0) {
220
+ const remainingValue = typeof remaining === "number" ? remaining : limit - usage;
221
+ if (remainingValue > limit) {
222
+ return {
223
+ success: false,
224
+ error: "Invalid openrouter-key-v1 response",
225
+ };
226
+ }
227
+ const percentRemaining = (remainingValue / limit) * 100;
228
+ return {
229
+ success: true,
230
+ entries: [
231
+ {
232
+ accounting: accountingMetadata("budget"),
233
+ kind: "percent",
234
+ name: `${source.label} budget`,
235
+ group: source.label,
236
+ label: "Budget:",
237
+ right: `${formatUsd(usage)}/${formatUsd(limit)}`,
238
+ percentRemaining,
239
+ },
240
+ ],
241
+ };
242
+ }
243
+ return {
244
+ success: true,
245
+ entries: [
246
+ {
247
+ accounting: accountingMetadata("spend"),
248
+ kind: "value",
249
+ name: `${source.label} spend`,
250
+ group: source.label,
251
+ label: "Spend:",
252
+ value: formatUsd(usage),
253
+ },
254
+ ],
255
+ };
256
+ }
257
+ export async function fetchRemoteQuotaProvider(source, apiKey, requestTimeoutMs) {
258
+ const timeoutMs = requestTimeoutMs ?? REQUEST_TIMEOUT_MS;
259
+ const controller = new AbortController();
260
+ const timeoutId = setTimeout(() => controller.abort(), timeoutMs);
261
+ try {
262
+ const response = await fetch(source.url, {
263
+ method: "GET",
264
+ redirect: "manual",
265
+ signal: controller.signal,
266
+ headers: {
267
+ Authorization: `Bearer ${apiKey}`,
268
+ Accept: "application/json",
269
+ },
270
+ });
271
+ if (response.redirected || (response.status >= 300 && response.status < 400)) {
272
+ return { success: false, error: "Redirect rejected" };
273
+ }
274
+ if (!response.ok) {
275
+ return { success: false, error: `HTTP ${response.status}` };
276
+ }
277
+ const body = await readBoundedJson(response);
278
+ return source.format === "accounting-v1"
279
+ ? parseAccountingV1(source, body)
280
+ : parseOpenRouterKeyV1(source, body);
281
+ }
282
+ catch (error) {
283
+ if (controller.signal.aborted || (error instanceof Error && error.name === "AbortError")) {
284
+ return {
285
+ success: false,
286
+ error: `Request timeout after ${Math.round(timeoutMs / 1000)}s`,
287
+ };
288
+ }
289
+ if (error instanceof Error &&
290
+ [
291
+ "Response exceeded 262144 bytes",
292
+ "Expected a JSON response",
293
+ "Invalid JSON response",
294
+ ].includes(error.message)) {
295
+ return { success: false, error: error.message };
296
+ }
297
+ return { success: false, error: "Failed to read accounting data" };
298
+ }
299
+ finally {
300
+ clearTimeout(timeoutId);
301
+ }
302
+ }
303
+ export async function mapWithConcurrency(values, concurrency, map) {
304
+ const results = new Array(values.length);
305
+ let nextIndex = 0;
306
+ async function worker() {
307
+ while (true) {
308
+ const index = nextIndex;
309
+ nextIndex += 1;
310
+ if (index >= values.length)
311
+ return;
312
+ results[index] = await map(values[index], index);
313
+ }
314
+ }
315
+ await Promise.all(Array.from({ length: Math.min(Math.max(1, concurrency), values.length) }, () => worker()));
316
+ return results;
317
+ }
318
+ //# sourceMappingURL=quota-providers-remote.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota-providers-remote.js","sourceRoot":"","sources":["../../src/lib/quota-providers-remote.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,77 @@
1
+ export declare const QUOTA_PROVIDER_REMOTE_FORMATS: readonly ["accounting-v1", "openrouter-key-v1"];
2
+ export declare const QUOTA_PROVIDER_MODES: readonly ["remote-api", "local-estimate"];
3
+ export declare const QUOTA_PROVIDER_WINDOW_TYPES: readonly ["utc-day", "rolling"];
4
+ export declare const QUOTA_PROVIDERS_AGGREGATE_ID = "quota-providers";
5
+ export declare const MAINTAINED_LOCAL_ESTIMATE_IDS: readonly ["qwen-code", "alibaba-coding-plan"];
6
+ export declare function isMaintainedQuotaProviderTuning(definition: QuotaProviderDefinition): boolean;
7
+ export declare function customQuotaProviderDefinitions(definitions: readonly QuotaProviderDefinition[]): QuotaProviderDefinition[];
8
+ export declare function resolveQuotaProviderSessionModelIdentity(params: {
9
+ currentModel: string;
10
+ currentProviderID?: string;
11
+ }): {
12
+ providerId: string;
13
+ modelId: string;
14
+ } | null;
15
+ export declare function selectEligibleQuotaProviderDefinitions(params: {
16
+ definitions: readonly QuotaProviderDefinition[];
17
+ availableProviderIds: ReadonlySet<string>;
18
+ onlyCurrentModel?: boolean;
19
+ currentModel?: string;
20
+ currentProviderID?: string;
21
+ }): QuotaProviderDefinition[];
22
+ export type QuotaProviderRemoteFormat = (typeof QUOTA_PROVIDER_REMOTE_FORMATS)[number];
23
+ export type QuotaProviderMode = (typeof QUOTA_PROVIDER_MODES)[number];
24
+ export type QuotaProviderWindowType = (typeof QUOTA_PROVIDER_WINDOW_TYPES)[number];
25
+ interface QuotaProviderDefinitionBase {
26
+ id: string;
27
+ /** Effective OpenCode provider id. Input omits this when it is the same as id. */
28
+ providerId: string;
29
+ /** Normalized display label; omitted input defaults to id. */
30
+ label: string;
31
+ mode: QuotaProviderMode;
32
+ /** Exact OpenCode model ids, without a provider prefix. Omission covers the provider. */
33
+ modelIds?: string[];
34
+ }
35
+ export interface RemoteApiQuotaProviderDefinition extends QuotaProviderDefinitionBase {
36
+ mode: "remote-api";
37
+ /** Canonical absolute HTTPS URL, or loopback HTTP URL. */
38
+ url: string;
39
+ format: QuotaProviderRemoteFormat;
40
+ apiKeyEnv?: string;
41
+ }
42
+ export interface LocalEstimateWindow {
43
+ id: string;
44
+ label: string;
45
+ type: QuotaProviderWindowType;
46
+ /** Present only for rolling windows. */
47
+ durationMinutes?: number;
48
+ requestLimit: number;
49
+ usdBudget?: number;
50
+ }
51
+ export interface LocalEstimateQuotaProviderDefinition extends QuotaProviderDefinitionBase {
52
+ mode: "local-estimate";
53
+ windows: LocalEstimateWindow[];
54
+ /**
55
+ * Exact source model id -> models.dev provider/model fallback.
56
+ * Automatic models.dev matching always wins.
57
+ */
58
+ pricingModelMap?: Record<string, string>;
59
+ }
60
+ export type QuotaProviderDefinition = RemoteApiQuotaProviderDefinition | LocalEstimateQuotaProviderDefinition;
61
+ export interface QuotaProviderValidationIssue {
62
+ key: string;
63
+ message: string;
64
+ }
65
+ export type QuotaProvidersValidationResult = {
66
+ value: QuotaProviderDefinition[];
67
+ issues: [];
68
+ } | {
69
+ value?: undefined;
70
+ issues: QuotaProviderValidationIssue[];
71
+ };
72
+ /** Validate and normalize the complete global-only quotaProviders array atomically. */
73
+ export declare function validateQuotaProviders(value: unknown): QuotaProvidersValidationResult;
74
+ export declare function cloneQuotaProviders(definitions: readonly QuotaProviderDefinition[]): QuotaProviderDefinition[];
75
+ export declare function findQuotaProviderDefinition(definitions: readonly QuotaProviderDefinition[], id: string): QuotaProviderDefinition | undefined;
76
+ export {};
77
+ //# sourceMappingURL=quota-providers.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"quota-providers.d.ts","sourceRoot":"","sources":["../../src/lib/quota-providers.ts"],"names":[],"mappings":"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"}