@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,274 @@
1
+ import { existsSync } from "node:fs";
2
+ import { readFile, rm } from "node:fs/promises";
3
+ import { applyEdits, findNodeAtLocation, modify, parse, parseTree, } from "jsonc-parser";
4
+ import { writeTextAtomic } from "./atomic-json.js";
5
+ export class ConfigDocumentError extends Error {
6
+ path;
7
+ constructor(message, path) {
8
+ super(message);
9
+ this.path = path;
10
+ this.name = "ConfigDocumentError";
11
+ }
12
+ }
13
+ function isPlainObject(value) {
14
+ return Boolean(value) && typeof value === "object" && !Array.isArray(value);
15
+ }
16
+ function parseErrors(raw, format) {
17
+ const errors = [];
18
+ const value = parse(raw, errors, {
19
+ allowTrailingComma: format === "jsonc",
20
+ disallowComments: format === "json",
21
+ });
22
+ return { value, errors };
23
+ }
24
+ export function parseConfigDocument(raw, format, path) {
25
+ const parsed = parseErrors(raw, format);
26
+ if (parsed.errors.length > 0) {
27
+ throw new ConfigDocumentError(`Cannot parse ${format.toUpperCase()} config: ${path}`, path);
28
+ }
29
+ if (!isPlainObject(parsed.value)) {
30
+ throw new ConfigDocumentError(`Config root must be an object: ${path}`, path);
31
+ }
32
+ return parsed.value;
33
+ }
34
+ function jsonEqual(left, right) {
35
+ return JSON.stringify(left) === JSON.stringify(right);
36
+ }
37
+ function collectValueEdits(current, desired, path, edits) {
38
+ if (jsonEqual(current, desired)) {
39
+ return;
40
+ }
41
+ if (isPlainObject(current) && isPlainObject(desired)) {
42
+ for (const [key, value] of Object.entries(desired)) {
43
+ collectValueEdits(current[key], value, [...path, key], edits);
44
+ }
45
+ return;
46
+ }
47
+ if (Array.isArray(current) && Array.isArray(desired)) {
48
+ const prefixMatches = desired.length >= current.length &&
49
+ current.every((value, index) => jsonEqual(value, desired[index]));
50
+ if (prefixMatches) {
51
+ for (let index = current.length; index < desired.length; index++) {
52
+ edits.push({ path: [...path, -1], value: desired[index] });
53
+ }
54
+ return;
55
+ }
56
+ if (desired.length < current.length) {
57
+ let desiredIndex = 0;
58
+ const removedIndexes = [];
59
+ for (let currentIndex = 0; currentIndex < current.length; currentIndex++) {
60
+ if (desiredIndex < desired.length &&
61
+ jsonEqual(current[currentIndex], desired[desiredIndex])) {
62
+ desiredIndex++;
63
+ }
64
+ else {
65
+ removedIndexes.push(currentIndex);
66
+ }
67
+ }
68
+ if (desiredIndex === desired.length) {
69
+ for (const removedIndex of removedIndexes.reverse()) {
70
+ edits.push({ path: [...path, removedIndex], value: undefined });
71
+ }
72
+ return;
73
+ }
74
+ }
75
+ }
76
+ edits.push({ path, value: desired });
77
+ }
78
+ function removeArrayElementPreservingSiblings(raw, path) {
79
+ const tree = parseTree(raw, [], {
80
+ allowTrailingComma: true,
81
+ disallowComments: false,
82
+ });
83
+ const node = tree ? findNodeAtLocation(tree, path) : undefined;
84
+ const parent = node?.parent;
85
+ if (!node || !parent || parent.type !== "array" || !parent.children) {
86
+ return undefined;
87
+ }
88
+ const index = parent.children.indexOf(node);
89
+ if (index < 0)
90
+ return undefined;
91
+ if (parent.children.length === 1) {
92
+ return raw.slice(0, node.offset) + raw.slice(node.offset + node.length);
93
+ }
94
+ if (index < parent.children.length - 1) {
95
+ const next = parent.children[index + 1];
96
+ const between = raw.slice(node.offset + node.length, next.offset);
97
+ const commaOffset = between.indexOf(",");
98
+ if (commaOffset < 0)
99
+ return undefined;
100
+ const removeEnd = node.offset + node.length + commaOffset + 1;
101
+ return raw.slice(0, node.offset) + raw.slice(removeEnd);
102
+ }
103
+ const previous = parent.children[index - 1];
104
+ const between = raw.slice(previous.offset + previous.length, node.offset);
105
+ const commaOffset = between.lastIndexOf(",");
106
+ if (commaOffset < 0)
107
+ return undefined;
108
+ const removeStart = previous.offset + previous.length + commaOffset;
109
+ return raw.slice(0, removeStart) + raw.slice(node.offset + node.length);
110
+ }
111
+ function addManagedComment(raw, comment) {
112
+ if (raw.includes(comment.text)) {
113
+ return raw;
114
+ }
115
+ const tree = parseTree(raw, [], {
116
+ allowTrailingComma: true,
117
+ disallowComments: false,
118
+ });
119
+ const valueNode = tree ? findNodeAtLocation(tree, comment.path) : undefined;
120
+ const propertyNode = valueNode?.parent;
121
+ if (!propertyNode || propertyNode.type !== "property") {
122
+ return raw;
123
+ }
124
+ const lineStart = raw.lastIndexOf("\n", propertyNode.offset - 1) + 1;
125
+ const indentation = raw.slice(lineStart, propertyNode.offset);
126
+ if (!/^\s*$/.test(indentation)) {
127
+ return raw;
128
+ }
129
+ return raw.slice(0, lineStart) + `${indentation}${comment.text}\n` + raw.slice(lineStart);
130
+ }
131
+ export function editConfigDocumentPaths(params) {
132
+ let updated = params.raw;
133
+ for (const edit of params.edits) {
134
+ const removed = edit.value === undefined
135
+ ? removeArrayElementPreservingSiblings(updated, edit.path)
136
+ : undefined;
137
+ updated = removed ?? applyEdits(updated, modify(updated, edit.path, edit.value, {}));
138
+ }
139
+ parseConfigDocument(updated, params.format, params.path);
140
+ return updated;
141
+ }
142
+ export function editConfigDocument(params) {
143
+ const current = parseConfigDocument(params.raw, params.sourceFormat, params.path);
144
+ const edits = [];
145
+ collectValueEdits(current, params.desiredData, [], edits);
146
+ const eol = params.raw.includes("\r\n") ? "\r\n" : "\n";
147
+ let updated = params.raw;
148
+ for (const edit of edits) {
149
+ const removed = edit.value === undefined
150
+ ? removeArrayElementPreservingSiblings(updated, edit.path)
151
+ : undefined;
152
+ updated =
153
+ removed ??
154
+ applyEdits(updated, modify(updated, edit.path, edit.value, {
155
+ formattingOptions: {
156
+ insertSpaces: true,
157
+ tabSize: 2,
158
+ eol,
159
+ },
160
+ }));
161
+ }
162
+ if (params.outputFormat === "jsonc") {
163
+ for (const comment of params.managedComments ?? []) {
164
+ updated = addManagedComment(updated, comment);
165
+ }
166
+ }
167
+ if (!updated.endsWith(eol)) {
168
+ updated += eol;
169
+ }
170
+ parseConfigDocument(updated, params.outputFormat, params.path);
171
+ return updated;
172
+ }
173
+ export async function planConfigDocumentEdit(params) {
174
+ const originalBytes = params.target.existed ? await readFile(params.target.sourcePath) : null;
175
+ const originalRaw = originalBytes?.toString("utf8") ?? "{}\n";
176
+ const sourceFormat = params.target.sourcePath.endsWith(".jsonc")
177
+ ? "jsonc"
178
+ : "json";
179
+ const convertingJsonToJsonc = sourceFormat === "json" && params.target.format === "jsonc";
180
+ const raw = convertingJsonToJsonc ? "{}\n" : originalRaw;
181
+ const updated = editConfigDocument({
182
+ raw,
183
+ sourceFormat,
184
+ outputFormat: params.target.format,
185
+ path: params.target.path,
186
+ desiredData: params.desiredData,
187
+ managedComments: params.managedComments,
188
+ });
189
+ const targetOriginalBytes = params.target.path === params.target.sourcePath
190
+ ? originalBytes
191
+ : existsSync(params.target.path)
192
+ ? await readFile(params.target.path)
193
+ : null;
194
+ return {
195
+ path: params.target.path,
196
+ sourcePath: params.target.sourcePath,
197
+ removeSourcePath: params.target.removeSourcePath,
198
+ format: params.target.format,
199
+ originalBytes,
200
+ targetOriginalBytes,
201
+ updated,
202
+ changed: updated !== raw || params.target.path !== params.target.sourcePath || !params.target.existed,
203
+ };
204
+ }
205
+ export async function validateConfigDocumentEdit(edit, options = {}) {
206
+ if (!edit.changed) {
207
+ return;
208
+ }
209
+ const readBytes = options.readBytes ?? ((path) => readFile(path));
210
+ const pathExists = options.pathExists ?? existsSync;
211
+ if (edit.originalBytes === null) {
212
+ if (pathExists(edit.sourcePath)) {
213
+ throw new ConfigDocumentError(`Config changed since preview: ${edit.sourcePath}`, edit.sourcePath);
214
+ }
215
+ }
216
+ else {
217
+ let current;
218
+ try {
219
+ current = await readBytes(edit.sourcePath);
220
+ }
221
+ catch {
222
+ throw new ConfigDocumentError(`Failed reading config: ${edit.sourcePath}`, edit.sourcePath);
223
+ }
224
+ if (!current.equals(edit.originalBytes)) {
225
+ throw new ConfigDocumentError(`Config changed since preview: ${edit.sourcePath}`, edit.sourcePath);
226
+ }
227
+ }
228
+ if (edit.path !== edit.sourcePath) {
229
+ if (edit.targetOriginalBytes === null) {
230
+ if (pathExists(edit.path)) {
231
+ throw new ConfigDocumentError(`Config target appeared since preview: ${edit.path}`, edit.path);
232
+ }
233
+ }
234
+ else {
235
+ let currentTarget;
236
+ try {
237
+ currentTarget = await readBytes(edit.path);
238
+ }
239
+ catch {
240
+ throw new ConfigDocumentError(`Failed reading config target: ${edit.path}`, edit.path);
241
+ }
242
+ if (!currentTarget.equals(edit.targetOriginalBytes)) {
243
+ throw new ConfigDocumentError(`Config target changed since preview: ${edit.path}`, edit.path);
244
+ }
245
+ }
246
+ }
247
+ }
248
+ export async function applyConfigDocumentEdit(edit, options = {}) {
249
+ if (!edit.changed) {
250
+ return;
251
+ }
252
+ await validateConfigDocumentEdit(edit, options);
253
+ const writeText = options.writeText ?? writeTextAtomic;
254
+ const removePath = options.removePath ?? ((path) => rm(path));
255
+ await writeText(edit.path, edit.updated);
256
+ if (!edit.removeSourcePath) {
257
+ return;
258
+ }
259
+ try {
260
+ await removePath(edit.removeSourcePath);
261
+ }
262
+ catch {
263
+ if (edit.targetOriginalBytes === null) {
264
+ try {
265
+ await removePath(edit.path);
266
+ }
267
+ catch {
268
+ // Best effort: the original source is still intact and remains the rollback authority.
269
+ }
270
+ }
271
+ throw new ConfigDocumentError(`Failed removing converted config source: ${edit.removeSourcePath}`, edit.removeSourcePath);
272
+ }
273
+ }
274
+ //# sourceMappingURL=opencode-config-editor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"opencode-config-editor.js","sourceRoot":"","sources":["../../src/lib/opencode-config-editor.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,24 @@
1
+ import { type ConfigFileFormat } from "./config-file-utils.js";
1
2
  export interface LoadConfiguredProviderIdsOptions {
2
3
  configRootDir: string;
3
4
  }
5
+ export interface ReconcileDetectedProviderConfigOptions {
6
+ configRootDir: string;
7
+ detectedProviderIds: readonly string[];
8
+ preferredFormat?: ConfigFileFormat;
9
+ writeText?: (path: string, content: string) => Promise<void>;
10
+ }
11
+ export interface ReconcileDetectedProviderConfigResult {
12
+ path: string | null;
13
+ format: ConfigFileFormat | null;
14
+ addedProviderIds: string[];
15
+ changed: boolean;
16
+ }
4
17
  export declare function loadConfiguredOpenCodeConfig(options: LoadConfiguredProviderIdsOptions): Promise<Record<string, unknown>>;
5
18
  export declare function loadConfiguredProviderIds(options: LoadConfiguredProviderIdsOptions): Promise<string[]>;
19
+ /**
20
+ * Adds providers proven available at runtime to the global OpenCode config only.
21
+ * Project declarations participate in the read/precedence check but are never written.
22
+ */
23
+ export declare function reconcileDetectedProvidersInGlobalConfig(options: ReconcileDetectedProviderConfigOptions): Promise<ReconcileDetectedProviderConfigResult>;
6
24
  //# sourceMappingURL=opencode-config-providers.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-config-providers.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-config-providers.ts"],"names":[],"mappings":"AAWA,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,MAAM,CAAC;CACvB;AA4ED,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAYlC;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC,MAAM,EAAE,CAAC,CAMnB"}
1
+ {"version":3,"file":"opencode-config-providers.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-config-providers.ts"],"names":[],"mappings":"AAEA,OAAO,EAML,KAAK,gBAAgB,EACtB,MAAM,wBAAwB,CAAC;AAehC,MAAM,WAAW,gCAAgC;IAC/C,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,sCAAsC;IACrD,aAAa,EAAE,MAAM,CAAC;IACtB,mBAAmB,EAAE,SAAS,MAAM,EAAE,CAAC;IACvC,eAAe,CAAC,EAAE,gBAAgB,CAAC;IACnC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CAC9D;AAED,MAAM,WAAW,qCAAqC;IACpD,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,MAAM,EAAE,gBAAgB,GAAG,IAAI,CAAC;IAChC,gBAAgB,EAAE,MAAM,EAAE,CAAC;IAC3B,OAAO,EAAE,OAAO,CAAC;CAClB;AA6ED,wBAAsB,4BAA4B,CAChD,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAYlC;AAED,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,gCAAgC,GACxC,OAAO,CAAC,MAAM,EAAE,CAAC,CAMnB;AAUD;;;GAGG;AACH,wBAAsB,wCAAwC,CAC5D,OAAO,EAAE,sCAAsC,GAC9C,OAAO,CAAC,qCAAqC,CAAC,CAsEhD"}
@@ -1,15 +1,20 @@
1
1
  import { readFile } from "fs/promises";
2
- import { dedupeNonEmptyStrings, extractPluginSpecsFromParsedConfig, extractProviderIdsFromParsedConfig, getConfigFileCandidatePaths, } from "./config-file-utils.js";
2
+ import { dedupeNonEmptyStrings, extractPluginSpecsFromParsedConfig, extractProviderIdsFromParsedConfig, resolveEditableConfigPath, resolveExistingConfigPath, } from "./config-file-utils.js";
3
3
  import { parseJsonOrJsonc } from "./jsonc.js";
4
4
  import { getOpencodeRuntimeDirCandidates } from "./opencode-runtime-paths.js";
5
+ import { applyConfigDocumentEdit, ConfigDocumentError, parseConfigDocument, planConfigDocumentEdit, } from "./opencode-config-editor.js";
6
+ import { getQuotaProviderRuntimeIds, getQuotaProviderShape, normalizeQuotaProviderId, } from "./provider-metadata.js";
5
7
  function isRecord(value) {
6
8
  return Boolean(value) && typeof value === "object" && !Array.isArray(value);
7
9
  }
8
10
  function getCandidatePaths(configRootDir) {
9
11
  return dedupeNonEmptyStrings([
10
- ...getOpencodeRuntimeDirCandidates().configDirs.flatMap((dir) => getConfigFileCandidatePaths(dir, "opencode")),
11
- ...getConfigFileCandidatePaths(configRootDir, "opencode"),
12
- ]);
12
+ ...getOpencodeRuntimeDirCandidates().configDirs,
13
+ configRootDir,
14
+ ]).flatMap((dir) => {
15
+ const path = resolveExistingConfigPath(dir, "opencode");
16
+ return path ? [path] : [];
17
+ });
13
18
  }
14
19
  async function readConfig(path) {
15
20
  try {
@@ -76,4 +81,70 @@ export async function loadConfiguredProviderIds(options) {
76
81
  ...inferProviderIdsFromPluginSpecs(extractPluginSpecsFromParsedConfig(config)),
77
82
  ]);
78
83
  }
84
+ function isDetectedProviderDeclared(providerId, configuredProviderIds) {
85
+ const runtimeIds = getQuotaProviderRuntimeIds(providerId);
86
+ return [providerId, ...runtimeIds].some((id) => configuredProviderIds.has(id));
87
+ }
88
+ /**
89
+ * Adds providers proven available at runtime to the global OpenCode config only.
90
+ * Project declarations participate in the read/precedence check but are never written.
91
+ */
92
+ export async function reconcileDetectedProvidersInGlobalConfig(options) {
93
+ const detectedProviderIds = dedupeNonEmptyStrings(options.detectedProviderIds
94
+ .map((providerId) => normalizeQuotaProviderId(providerId))
95
+ .filter((providerId) => {
96
+ const shape = getQuotaProviderShape(providerId);
97
+ return Boolean(shape && shape.id !== "quota-providers");
98
+ }));
99
+ const { configDirs } = getOpencodeRuntimeDirCandidates();
100
+ const globalConfigDir = configDirs[0];
101
+ if (!globalConfigDir || detectedProviderIds.length === 0) {
102
+ return { path: null, format: null, addedProviderIds: [], changed: false };
103
+ }
104
+ const effectiveConfig = await loadConfiguredOpenCodeConfig({
105
+ configRootDir: options.configRootDir,
106
+ });
107
+ const configuredProviderIds = new Set(extractProviderIdsFromParsedConfig(effectiveConfig));
108
+ const addedProviderIds = detectedProviderIds.filter((providerId) => !isDetectedProviderDeclared(providerId, configuredProviderIds));
109
+ const projectPath = resolveExistingConfigPath(options.configRootDir, "opencode");
110
+ const projectFormat = projectPath
111
+ ? projectPath.endsWith(".jsonc")
112
+ ? "jsonc"
113
+ : "json"
114
+ : undefined;
115
+ const target = resolveEditableConfigPath({
116
+ dir: globalConfigDir,
117
+ kind: "opencode",
118
+ preferredFormat: options.preferredFormat ?? projectFormat,
119
+ convertJsonToJsonc: false,
120
+ });
121
+ if (addedProviderIds.length === 0) {
122
+ return { path: target.path, format: target.format, addedProviderIds, changed: false };
123
+ }
124
+ const raw = target.existed ? await readFile(target.sourcePath, "utf8") : "{}\n";
125
+ const sourceFormat = target.sourcePath.endsWith(".jsonc") ? "jsonc" : "json";
126
+ const root = parseConfigDocument(raw, sourceFormat, target.sourcePath);
127
+ if (root.provider !== undefined && !isRecord(root.provider)) {
128
+ throw new ConfigDocumentError(`Cannot add detected providers because provider is not an object: ${target.sourcePath}`, target.sourcePath);
129
+ }
130
+ const provider = isRecord(root.provider) ? { ...root.provider } : {};
131
+ for (const providerId of addedProviderIds) {
132
+ provider[providerId] = {};
133
+ }
134
+ const edit = await planConfigDocumentEdit({
135
+ target,
136
+ desiredData: { ...root, provider },
137
+ managedComments: addedProviderIds.map((providerId) => ({
138
+ path: ["provider", providerId],
139
+ text: `// Detected ${providerId} authentication; opencode-quota added this global provider declaration.`,
140
+ })),
141
+ });
142
+ await applyConfigDocumentEdit(edit, { writeText: options.writeText });
143
+ return {
144
+ path: target.path,
145
+ format: target.format,
146
+ addedProviderIds,
147
+ changed: edit.changed,
148
+ };
149
+ }
79
150
  //# sourceMappingURL=opencode-config-providers.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-config-providers.js","sourceRoot":"","sources":["../../src/lib/opencode-config-providers.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencode-config-providers.js","sourceRoot":"","sources":["../../src/lib/opencode-config-providers.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-runtime-paths.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-runtime-paths.ts"],"names":[],"mappings":"AASA,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAcD,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,mBAAmB,CAiBtB;AAED,wBAAgB,+BAA+B,CAAC,MAAM,CAAC,EAAE;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B,GAAG,4BAA4B,CA6D/B"}
1
+ {"version":3,"file":"opencode-runtime-paths.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-runtime-paths.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,SAAS,EAAE,MAAM,EAAE,CAAC;CACrB;AAcD,wBAAgB,sBAAsB,CAAC,MAAM,CAAC,EAAE;IAC9C,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,mBAAmB,CAwBtB;AAED,wBAAgB,+BAA+B,CAAC,MAAM,CAAC,EAAE;IACvD,QAAQ,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IACxB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,mBAAmB,CAAC;CAC/B,GAAG,4BAA4B,CA6D/B"}
@@ -1,6 +1,6 @@
1
1
  import { homedir } from "os";
2
- import { join } from "path";
3
- import { xdgCache, xdgConfig, xdgData, xdgState, } from "xdg-basedir";
2
+ import { isAbsolute, join, resolve } from "path";
3
+ import { xdgCache, xdgConfig, xdgData, xdgState } from "xdg-basedir";
4
4
  function dedupe(list) {
5
5
  const out = [];
6
6
  const seen = new Set();
@@ -21,11 +21,18 @@ export function getOpencodeRuntimeDirs(params) {
21
21
  // xdg-basedir may return undefined if env is missing; provide deterministic fallbacks.
22
22
  const dataBase = env.XDG_DATA_HOME?.trim() || xdgData || join(home, ".local", "share");
23
23
  const configBase = env.XDG_CONFIG_HOME?.trim() || xdgConfig || join(home, ".config");
24
+ const defaultConfigDir = join(configBase, "opencode");
25
+ const configuredConfigDir = env.OPENCODE_CONFIG_DIR?.trim();
26
+ const configDir = configuredConfigDir
27
+ ? isAbsolute(configuredConfigDir)
28
+ ? configuredConfigDir
29
+ : resolve(defaultConfigDir, configuredConfigDir)
30
+ : defaultConfigDir;
24
31
  const cacheBase = env.XDG_CACHE_HOME?.trim() || xdgCache || join(home, ".cache");
25
32
  const stateBase = env.XDG_STATE_HOME?.trim() || xdgState || join(home, ".local", "state");
26
33
  return {
27
34
  dataDir: join(dataBase, "opencode"),
28
- configDir: join(configBase, "opencode"),
35
+ configDir,
29
36
  cacheDir: join(cacheBase, "opencode"),
30
37
  stateDir: join(stateBase, "opencode"),
31
38
  };
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-runtime-paths.js","sourceRoot":"","sources":["../../src/lib/opencode-runtime-paths.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"opencode-runtime-paths.js","sourceRoot":"","sources":["../../src/lib/opencode-runtime-paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,EAAW,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC1D,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAgBrE,SAAS,MAAM,CAAC,IAAc;IAC5B,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,KAAK,MAAM,IAAI,IAAI,IAAI,EAAE,CAAC;QACxB,IAAI,CAAC,IAAI;YAAE,SAAS;QACpB,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAAE,SAAS;QAC7B,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACf,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACjB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,MAGtC;IACC,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE,CAAC;IAE1C,0EAA0E;IAC1E,uFAAuF;IACvF,MAAM,QAAQ,GAAG,GAAG,CAAC,aAAa,EAAE,IAAI,EAAE,IAAI,OAAO,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IACvF,MAAM,UAAU,GAAG,GAAG,CAAC,eAAe,EAAE,IAAI,EAAE,IAAI,SAAS,IAAI,IAAI,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;IACrF,MAAM,gBAAgB,GAAG,IAAI,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;IACtD,MAAM,mBAAmB,GAAG,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC;IAC5D,MAAM,SAAS,GAAG,mBAAmB;QACnC,CAAC,CAAC,UAAU,CAAC,mBAAmB,CAAC;YAC/B,CAAC,CAAC,mBAAmB;YACrB,CAAC,CAAC,OAAO,CAAC,gBAAgB,EAAE,mBAAmB,CAAC;QAClD,CAAC,CAAC,gBAAgB,CAAC;IACrB,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACjF,MAAM,SAAS,GAAG,GAAG,CAAC,cAAc,EAAE,IAAI,EAAE,IAAI,QAAQ,IAAI,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC;IAE1F,OAAO;QACL,OAAO,EAAE,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC;QACnC,SAAS;QACT,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;QACrC,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC;KACtC,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,+BAA+B,CAAC,MAK/C;IACC,MAAM,QAAQ,GAAG,MAAM,EAAE,QAAQ,IAAI,OAAO,CAAC,QAAQ,CAAC;IACtD,MAAM,GAAG,GAAG,MAAM,EAAE,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC;IACvC,MAAM,IAAI,GAAG,MAAM,EAAE,OAAO,IAAI,OAAO,EAAE,CAAC;IAE1C,MAAM,OAAO,GAAG,MAAM,EAAE,OAAO,IAAI,sBAAsB,CAAC,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC;IAElF,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,EAAE,IAAI,EAAE,CAAC;IACvC,MAAM,eAAe,GAAG,GAAG,CAAC,YAAY,EAAE,IAAI,EAAE,CAAC;IAEjD,MAAM,sBAAsB,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;IAChE,MAAM,oBAAoB,GAAG,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAa,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAa,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACjD,MAAM,SAAS,GAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAC/C,MAAM,SAAS,GAAa,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;IAE/C,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QACzB,wEAAwE;QACxE,2EAA2E;QAC3E,kFAAkF;QAClF,MAAM,WAAW,GAAG,UAAU,IAAI,sBAAsB,CAAC;QACzD,MAAM,gBAAgB,GAAG,eAAe,IAAI,oBAAoB,CAAC;QAEjE,iEAAiE;QACjE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;QAC7C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC;QAElD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC,CAAC;QAC/C,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC;QAEpD,qCAAqC;QACrC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC;QACnD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,UAAU,CAAC,CAAC,CAAC;IACrD,CAAC;SAAM,IAAI,QAAQ,KAAK,QAAQ,EAAE,CAAC;QACjC,oEAAoE;QACpE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACnD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;QACjD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QAE1D,sEAAsE;QACtE,mEAAmE;QACnE,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAC,CAAC;QACxE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,qBAAqB,EAAE,UAAU,CAAC,CAAC,CAAC;QAC1E,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;IAC9D,CAAC;SAAM,CAAC;QACN,8CAA8C;QAC9C,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;QACzD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;QACnD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;QACjD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,OAAO;QACL,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC;QAC1B,UAAU,EAAE,MAAM,CAAC,UAAU,CAAC;QAC9B,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;QAC5B,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC;KAC7B,CAAC;AACJ,CAAC"}
@@ -60,6 +60,16 @@ export declare function iterAssistantMessages(params: {
60
60
  sinceMs?: number;
61
61
  untilMs?: number;
62
62
  }): Promise<OpenCodeMessage[]>;
63
+ /**
64
+ * Read authoritative completed assistant/model-loop rows by completion time.
65
+ *
66
+ * This path intentionally does not share the creation-time filters used by token
67
+ * history. A request may be created before a window cutoff and complete inside it.
68
+ */
69
+ export declare function iterCompletedAssistantMessages(params: {
70
+ completedSinceMs?: number;
71
+ completedUntilMs?: number;
72
+ }): Promise<OpenCodeMessage[]>;
63
73
  /**
64
74
  * Read assistant messages for a specific session only.
65
75
  */
@@ -1 +1 @@
1
- {"version":3,"file":"opencode-storage.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-storage.ts"],"names":[],"mappings":"AAOA;;;;;;;GAOG;AACH,qBAAa,oBAAqB,SAAQ,KAAK;aAE3B,SAAS,EAAE,MAAM;aACjB,WAAW,EAAE,MAAM;gBADnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM;CAKtC;AAED,MAAM,WAAW,kBAAkB;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,kBAAkB,CAAC;CAC3B;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,GAAG,WAAW,GAAG,MAAM,CAAC;IACpC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,MAAM,CAAC,EAAE,cAAc,CAAC;IACxB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC;IACF,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,mBAAmB;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE;QACL,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,OAAO,CAAC,EAAE,MAAM,CAAC;KAClB,CAAC;CACH;AAED,MAAM,MAAM,eAAe,GAAG;IAC5B,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,YAAY,EAAE,MAAM,CAAC;IACrB,qBAAqB,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,wBAAgB,4BAA4B,IAAI,MAAM,EAAE,CAIvD;AAED,wBAAgB,kBAAkB,IAAI,MAAM,CAE3C;AAED,wBAAgB,2BAA2B,IAAI,MAAM,EAAE,CAEtD;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAoLD,wBAAsB,kBAAkB,IAAI,OAAO,CAAC,eAAe,CAAC,CAuCnE;AAED,wBAAsB,qBAAqB,CAAC,MAAM,EAAE;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAY7B;AAED;;GAEG;AACH,wBAAsB,+BAA+B,CAAC,MAAM,EAAE;IAC5D,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CAwB7B;AAED;;GAEG;AACH,wBAAsB,gCAAgC,CAAC,MAAM,EAAE;IAC7D,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC,CA+B7B;AAED,wBAAsB,oBAAoB,IAAI,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,CA4BzF"}
1
+ {"version":3,"file":"opencode-storage.d.ts","sourceRoot":"","sources":["../../src/lib/opencode-storage.ts"],"names":[],"mappings":"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"}
@@ -171,6 +171,45 @@ function mapAssistantMessages(rows) {
171
171
  }
172
172
  return out;
173
173
  }
174
+ function completedAt(message) {
175
+ const value = message.time?.completed;
176
+ return typeof value === "number" && Number.isFinite(value) && value > 0
177
+ ? Math.trunc(value)
178
+ : null;
179
+ }
180
+ function mapCompletedAssistantMessages(rows) {
181
+ return mapAssistantMessages(rows).filter((message) => completedAt(message) !== null);
182
+ }
183
+ function compareCompletedMessageOrder(a, b) {
184
+ const aCompleted = completedAt(a) ?? Number.MAX_SAFE_INTEGER;
185
+ const bCompleted = completedAt(b) ?? Number.MAX_SAFE_INTEGER;
186
+ if (aCompleted !== bCompleted)
187
+ return aCompleted - bCompleted;
188
+ return a.id.localeCompare(b.id);
189
+ }
190
+ function buildCompletedAssistantQuery(params) {
191
+ const completedExpression = `CAST(json_extract(data, '$.time.completed') AS REAL)`;
192
+ const where = [
193
+ `json_extract(data, '$.role') = 'assistant'`,
194
+ `json_type(data, '$.time.completed') IN ('integer', 'real')`,
195
+ `${completedExpression} > 0`,
196
+ ];
197
+ const args = [];
198
+ if (typeof params.completedSinceMs === "number") {
199
+ where.push(`${completedExpression} >= ?`);
200
+ args.push(params.completedSinceMs);
201
+ }
202
+ if (typeof params.completedUntilMs === "number") {
203
+ where.push(`${completedExpression} <= ?`);
204
+ args.push(params.completedUntilMs);
205
+ }
206
+ return {
207
+ sql: `SELECT id, session_id, time_created, time_updated, data FROM "message"` +
208
+ ` WHERE ${where.join(" AND ")}` +
209
+ ` ORDER BY ${completedExpression} ASC, id ASC`,
210
+ args,
211
+ };
212
+ }
174
213
  function compareMessageOrder(a, b) {
175
214
  const aCreated = typeof a.time?.created === "number" ? a.time.created : Number.MAX_SAFE_INTEGER;
176
215
  const bCreated = typeof b.time?.created === "number" ? b.time.created : Number.MAX_SAFE_INTEGER;
@@ -230,6 +269,42 @@ export async function iterAssistantMessages(params) {
230
269
  conn.close();
231
270
  }
232
271
  }
272
+ /**
273
+ * Read authoritative completed assistant/model-loop rows by completion time.
274
+ *
275
+ * This path intentionally does not share the creation-time filters used by token
276
+ * history. A request may be created before a window cutoff and complete inside it.
277
+ */
278
+ export async function iterCompletedAssistantMessages(params) {
279
+ const db = openDbOrNull();
280
+ if (!db)
281
+ return [];
282
+ const conn = await db.open();
283
+ try {
284
+ if (await hasJsonExtract(conn)) {
285
+ const query = buildCompletedAssistantQuery(params);
286
+ return mapCompletedAssistantMessages(conn.all(query.sql, query.args));
287
+ }
288
+ const rows = conn.all(`SELECT id, session_id, time_created, time_updated, data FROM "message"`);
289
+ return mapCompletedAssistantMessages(rows)
290
+ .filter((message) => {
291
+ const atMs = completedAt(message);
292
+ if (atMs === null)
293
+ return false;
294
+ if (typeof params.completedSinceMs === "number" && atMs < params.completedSinceMs) {
295
+ return false;
296
+ }
297
+ if (typeof params.completedUntilMs === "number" && atMs > params.completedUntilMs) {
298
+ return false;
299
+ }
300
+ return true;
301
+ })
302
+ .sort(compareCompletedMessageOrder);
303
+ }
304
+ finally {
305
+ conn.close();
306
+ }
307
+ }
233
308
  /**
234
309
  * Read assistant messages for a specific session only.
235
310
  */