oc2token 0.1.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 (159) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +399 -0
  3. package/dist/src/accounting/index.d.ts +1 -0
  4. package/dist/src/accounting/index.js +2 -0
  5. package/dist/src/accounting/index.js.map +1 -0
  6. package/dist/src/accounting/reducer.d.ts +21 -0
  7. package/dist/src/accounting/reducer.js +105 -0
  8. package/dist/src/accounting/reducer.js.map +1 -0
  9. package/dist/src/antigravity/discovery.d.ts +18 -0
  10. package/dist/src/antigravity/discovery.js +95 -0
  11. package/dist/src/antigravity/discovery.js.map +1 -0
  12. package/dist/src/antigravity/doctor.d.ts +6 -0
  13. package/dist/src/antigravity/doctor.js +78 -0
  14. package/dist/src/antigravity/doctor.js.map +1 -0
  15. package/dist/src/antigravity/index.d.ts +3 -0
  16. package/dist/src/antigravity/index.js +4 -0
  17. package/dist/src/antigravity/index.js.map +1 -0
  18. package/dist/src/antigravity/proto.d.ts +73 -0
  19. package/dist/src/antigravity/proto.js +259 -0
  20. package/dist/src/antigravity/proto.js.map +1 -0
  21. package/dist/src/antigravity/scanner.d.ts +8 -0
  22. package/dist/src/antigravity/scanner.js +552 -0
  23. package/dist/src/antigravity/scanner.js.map +1 -0
  24. package/dist/src/application.d.ts +73 -0
  25. package/dist/src/application.js +657 -0
  26. package/dist/src/application.js.map +1 -0
  27. package/dist/src/cache/filesystem.d.ts +8 -0
  28. package/dist/src/cache/filesystem.js +70 -0
  29. package/dist/src/cache/filesystem.js.map +1 -0
  30. package/dist/src/cache/index.d.ts +5 -0
  31. package/dist/src/cache/index.js +6 -0
  32. package/dist/src/cache/index.js.map +1 -0
  33. package/dist/src/cache/lock.d.ts +40 -0
  34. package/dist/src/cache/lock.js +227 -0
  35. package/dist/src/cache/lock.js.map +1 -0
  36. package/dist/src/cache/schema.d.ts +45 -0
  37. package/dist/src/cache/schema.js +308 -0
  38. package/dist/src/cache/schema.js.map +1 -0
  39. package/dist/src/cache/store.d.ts +46 -0
  40. package/dist/src/cache/store.js +396 -0
  41. package/dist/src/cache/store.js.map +1 -0
  42. package/dist/src/cache/types.d.ts +130 -0
  43. package/dist/src/cache/types.js +6 -0
  44. package/dist/src/cache/types.js.map +1 -0
  45. package/dist/src/cli.d.ts +8 -0
  46. package/dist/src/cli.js +874 -0
  47. package/dist/src/cli.js.map +1 -0
  48. package/dist/src/codex/discovery.d.ts +6 -0
  49. package/dist/src/codex/discovery.js +88 -0
  50. package/dist/src/codex/discovery.js.map +1 -0
  51. package/dist/src/codex/doctor.d.ts +6 -0
  52. package/dist/src/codex/doctor.js +52 -0
  53. package/dist/src/codex/doctor.js.map +1 -0
  54. package/dist/src/codex/index.d.ts +3 -0
  55. package/dist/src/codex/index.js +3 -0
  56. package/dist/src/codex/index.js.map +1 -0
  57. package/dist/src/codex/scanner.d.ts +6 -0
  58. package/dist/src/codex/scanner.js +487 -0
  59. package/dist/src/codex/scanner.js.map +1 -0
  60. package/dist/src/codex/types.d.ts +31 -0
  61. package/dist/src/codex/types.js +5 -0
  62. package/dist/src/codex/types.js.map +1 -0
  63. package/dist/src/collector/collector.d.ts +15 -0
  64. package/dist/src/collector/collector.js +597 -0
  65. package/dist/src/collector/collector.js.map +1 -0
  66. package/dist/src/collector/index.d.ts +3 -0
  67. package/dist/src/collector/index.js +3 -0
  68. package/dist/src/collector/index.js.map +1 -0
  69. package/dist/src/collector/types.d.ts +55 -0
  70. package/dist/src/collector/types.js +18 -0
  71. package/dist/src/collector/types.js.map +1 -0
  72. package/dist/src/dashboard/render/ansi.d.ts +53 -0
  73. package/dist/src/dashboard/render/ansi.js +106 -0
  74. package/dist/src/dashboard/render/ansi.js.map +1 -0
  75. package/dist/src/dashboard/render/dashboard.d.ts +13 -0
  76. package/dist/src/dashboard/render/dashboard.js +750 -0
  77. package/dist/src/dashboard/render/dashboard.js.map +1 -0
  78. package/dist/src/dashboard/render/format.d.ts +23 -0
  79. package/dist/src/dashboard/render/format.js +169 -0
  80. package/dist/src/dashboard/render/format.js.map +1 -0
  81. package/dist/src/dashboard/render/redraw.d.ts +13 -0
  82. package/dist/src/dashboard/render/redraw.js +24 -0
  83. package/dist/src/dashboard/render/redraw.js.map +1 -0
  84. package/dist/src/dashboard/render/types.d.ts +83 -0
  85. package/dist/src/dashboard/render/types.js +528 -0
  86. package/dist/src/dashboard/render/types.js.map +1 -0
  87. package/dist/src/dashboard/scheduler/index.d.ts +1 -0
  88. package/dist/src/dashboard/scheduler/index.js +2 -0
  89. package/dist/src/dashboard/scheduler/index.js.map +1 -0
  90. package/dist/src/dashboard/scheduler/refresh-scheduler.d.ts +46 -0
  91. package/dist/src/dashboard/scheduler/refresh-scheduler.js +137 -0
  92. package/dist/src/dashboard/scheduler/refresh-scheduler.js.map +1 -0
  93. package/dist/src/dashboard/settings/index.d.ts +25 -0
  94. package/dist/src/dashboard/settings/index.js +162 -0
  95. package/dist/src/dashboard/settings/index.js.map +1 -0
  96. package/dist/src/dashboard/state/index.d.ts +2 -0
  97. package/dist/src/dashboard/state/index.js +3 -0
  98. package/dist/src/dashboard/state/index.js.map +1 -0
  99. package/dist/src/dashboard/state/refresh-coordinator.d.ts +72 -0
  100. package/dist/src/dashboard/state/refresh-coordinator.js +346 -0
  101. package/dist/src/dashboard/state/refresh-coordinator.js.map +1 -0
  102. package/dist/src/dashboard/state/types.d.ts +68 -0
  103. package/dist/src/dashboard/state/types.js +2 -0
  104. package/dist/src/dashboard/state/types.js.map +1 -0
  105. package/dist/src/domain/contracts.d.ts +219 -0
  106. package/dist/src/domain/contracts.js +2 -0
  107. package/dist/src/domain/contracts.js.map +1 -0
  108. package/dist/src/domain/errors.d.ts +25 -0
  109. package/dist/src/domain/errors.js +65 -0
  110. package/dist/src/domain/errors.js.map +1 -0
  111. package/dist/src/domain/index.d.ts +5 -0
  112. package/dist/src/domain/index.js +6 -0
  113. package/dist/src/domain/index.js.map +1 -0
  114. package/dist/src/domain/records.d.ts +59 -0
  115. package/dist/src/domain/records.js +141 -0
  116. package/dist/src/domain/records.js.map +1 -0
  117. package/dist/src/domain/tokens.d.ts +51 -0
  118. package/dist/src/domain/tokens.js +93 -0
  119. package/dist/src/domain/tokens.js.map +1 -0
  120. package/dist/src/domain/windows.d.ts +59 -0
  121. package/dist/src/domain/windows.js +272 -0
  122. package/dist/src/domain/windows.js.map +1 -0
  123. package/dist/src/index.d.ts +9 -0
  124. package/dist/src/index.js +9 -0
  125. package/dist/src/index.js.map +1 -0
  126. package/dist/src/opencode/adapter.d.ts +47 -0
  127. package/dist/src/opencode/adapter.js +118 -0
  128. package/dist/src/opencode/adapter.js.map +1 -0
  129. package/dist/src/opencode/client.d.ts +64 -0
  130. package/dist/src/opencode/client.js +118 -0
  131. package/dist/src/opencode/client.js.map +1 -0
  132. package/dist/src/opencode/doctor.d.ts +28 -0
  133. package/dist/src/opencode/doctor.js +82 -0
  134. package/dist/src/opencode/doctor.js.map +1 -0
  135. package/dist/src/opencode/index.d.ts +5 -0
  136. package/dist/src/opencode/index.js +6 -0
  137. package/dist/src/opencode/index.js.map +1 -0
  138. package/dist/src/opencode/stats.d.ts +8 -0
  139. package/dist/src/opencode/stats.js +174 -0
  140. package/dist/src/opencode/stats.js.map +1 -0
  141. package/dist/src/opencode/transport.d.ts +54 -0
  142. package/dist/src/opencode/transport.js +621 -0
  143. package/dist/src/opencode/transport.js.map +1 -0
  144. package/dist/src/output/index.d.ts +20 -0
  145. package/dist/src/output/index.js +46 -0
  146. package/dist/src/output/index.js.map +1 -0
  147. package/dist/src/output/json.d.ts +72 -0
  148. package/dist/src/output/json.js +133 -0
  149. package/dist/src/output/json.js.map +1 -0
  150. package/dist/src/output/table.d.ts +4 -0
  151. package/dist/src/output/table.js +81 -0
  152. package/dist/src/output/table.js.map +1 -0
  153. package/dist/src/pricing/index.d.ts +1 -0
  154. package/dist/src/pricing/index.js +2 -0
  155. package/dist/src/pricing/index.js.map +1 -0
  156. package/dist/src/pricing/pricing.d.ts +19 -0
  157. package/dist/src/pricing/pricing.js +441 -0
  158. package/dist/src/pricing/pricing.js.map +1 -0
  159. package/package.json +27 -0
@@ -0,0 +1,621 @@
1
+ import { DomainError, cancellationError, isCancellationError, parseTokenComponents, toUsageTotals, } from "../domain/index.js";
2
+ const DEFAULT_MAX_ATTEMPTS = 3;
3
+ const DEFAULT_BASE_DELAY_MS = 100;
4
+ const DEFAULT_MAX_DELAY_MS = 2_000;
5
+ const DEFAULT_JITTER = 0.2;
6
+ const DEFAULT_REQUEST_TIMEOUT_MS = 15_000;
7
+ const DEFAULT_PAGE_SIZE = 100;
8
+ function isRecord(value) {
9
+ return typeof value === "object" && value !== null;
10
+ }
11
+ function own(value, key) {
12
+ return Object.prototype.hasOwnProperty.call(value, key) ? value[key] : undefined;
13
+ }
14
+ function statusFromError(error, seen = new Set()) {
15
+ if (error === null || (typeof error !== "object" && typeof error !== "function")) {
16
+ return undefined;
17
+ }
18
+ if (seen.has(error))
19
+ return undefined;
20
+ seen.add(error);
21
+ const record = error;
22
+ for (const candidate of [record.status, record.statusCode, record.response]) {
23
+ if (typeof candidate === "number" && Number.isInteger(candidate))
24
+ return candidate;
25
+ if (candidate instanceof Response && Number.isInteger(candidate.status))
26
+ return candidate.status;
27
+ const nested = statusFromError(candidate, seen);
28
+ if (nested !== undefined)
29
+ return nested;
30
+ }
31
+ return statusFromError(record.cause, seen);
32
+ }
33
+ function headersFromError(error, seen = new Set()) {
34
+ if (error === null || (typeof error !== "object" && typeof error !== "function")) {
35
+ return undefined;
36
+ }
37
+ if (seen.has(error))
38
+ return undefined;
39
+ seen.add(error);
40
+ const record = error;
41
+ if (record.headers instanceof Headers)
42
+ return record.headers;
43
+ if (isRecord(record.headers))
44
+ return new Headers(record.headers);
45
+ if (record.response instanceof Response)
46
+ return record.response.headers;
47
+ return headersFromError(record.cause, seen);
48
+ }
49
+ function retryAfterMs(error, now = Date.now()) {
50
+ const value = headersFromError(error)?.get("retry-after");
51
+ if (value === null || value === undefined || value.trim() === "")
52
+ return undefined;
53
+ const seconds = Number(value);
54
+ if (Number.isFinite(seconds) && seconds >= 0)
55
+ return Math.ceil(seconds * 1_000);
56
+ const date = Date.parse(value);
57
+ if (!Number.isFinite(date))
58
+ return undefined;
59
+ return Math.max(0, date - now);
60
+ }
61
+ function timeoutError() {
62
+ return new DomainError("transport", "OpenCode request timed out", {
63
+ retryable: true,
64
+ });
65
+ }
66
+ function abortError() {
67
+ return cancellationError();
68
+ }
69
+ function adapterError(error) {
70
+ if (error instanceof DomainError)
71
+ return error;
72
+ const status = statusFromError(error);
73
+ if (status === 401 || status === 403) {
74
+ return new DomainError("authentication", `OpenCode service rejected the request (${status})`, {
75
+ cause: error,
76
+ });
77
+ }
78
+ if (status === 429) {
79
+ return new DomainError("rate-limited", "OpenCode service rate-limited the request", {
80
+ retryable: true,
81
+ cause: error,
82
+ });
83
+ }
84
+ if (status === 408 || status === 425) {
85
+ return new DomainError("transport", `OpenCode service returned HTTP ${status}`, {
86
+ retryable: true,
87
+ cause: error,
88
+ });
89
+ }
90
+ if (status !== undefined && status >= 500) {
91
+ return new DomainError("transport", `OpenCode service returned HTTP ${status}`, {
92
+ retryable: true,
93
+ cause: error,
94
+ });
95
+ }
96
+ if (status !== undefined && status >= 400) {
97
+ return new DomainError("protocol", `OpenCode service rejected the request (${status})`, {
98
+ cause: error,
99
+ });
100
+ }
101
+ const reason = isRecord(error) && typeof error.reason === "string" ? error.reason : undefined;
102
+ if (reason === "MalformedResponse" || reason === "UnsupportedContentType") {
103
+ return new DomainError("invalid-data", "OpenCode returned a malformed response", {
104
+ cause: error,
105
+ });
106
+ }
107
+ if (reason === "Transport" || reason === "UnexpectedStatus") {
108
+ return new DomainError("transport", "OpenCode transport request failed", {
109
+ retryable: true,
110
+ cause: error,
111
+ });
112
+ }
113
+ if (error instanceof Error && error.name === "AbortError") {
114
+ return new DomainError("transport", "OpenCode request was aborted by its deadline", {
115
+ retryable: true,
116
+ cause: error,
117
+ });
118
+ }
119
+ return new DomainError("transport", error instanceof Error ? error.message : String(error), {
120
+ retryable: true,
121
+ cause: error,
122
+ });
123
+ }
124
+ function throwIfAborted(signal) {
125
+ if (signal?.aborted)
126
+ throw abortError();
127
+ }
128
+ function makeAttemptSignal(parent, timeoutMs) {
129
+ const controller = new AbortController();
130
+ let timedOut = false;
131
+ let timer;
132
+ const abortFromParent = () => controller.abort(parent?.reason);
133
+ if (parent !== undefined) {
134
+ if (parent.aborted)
135
+ controller.abort(parent.reason);
136
+ else
137
+ parent.addEventListener("abort", abortFromParent, { once: true });
138
+ }
139
+ if (timeoutMs > 0) {
140
+ timer = setTimeout(() => {
141
+ timedOut = true;
142
+ controller.abort(new DOMException("Request timed out", "TimeoutError"));
143
+ }, timeoutMs);
144
+ }
145
+ return {
146
+ signal: controller.signal,
147
+ didTimeout: () => timedOut,
148
+ dispose: () => {
149
+ if (timer !== undefined)
150
+ clearTimeout(timer);
151
+ parent?.removeEventListener("abort", abortFromParent);
152
+ },
153
+ };
154
+ }
155
+ function abortable(promise, signal) {
156
+ if (signal.aborted)
157
+ return Promise.reject(signal.reason ?? new DOMException("Aborted", "AbortError"));
158
+ return new Promise((resolve, reject) => {
159
+ const onAbort = () => reject(signal.reason ?? new DOMException("Aborted", "AbortError"));
160
+ signal.addEventListener("abort", onAbort, { once: true });
161
+ promise.then((value) => {
162
+ signal.removeEventListener("abort", onAbort);
163
+ resolve(value);
164
+ }, (error) => {
165
+ signal.removeEventListener("abort", onAbort);
166
+ reject(error);
167
+ });
168
+ });
169
+ }
170
+ async function defaultSleep(milliseconds, signal) {
171
+ if (milliseconds <= 0)
172
+ return;
173
+ await new Promise((resolve, reject) => {
174
+ const timer = setTimeout(resolve, milliseconds);
175
+ if (signal === undefined)
176
+ return;
177
+ const onAbort = () => {
178
+ clearTimeout(timer);
179
+ signal.removeEventListener("abort", onAbort);
180
+ reject(signal.reason ?? new DOMException("Aborted", "AbortError"));
181
+ };
182
+ if (signal.aborted)
183
+ onAbort();
184
+ else
185
+ signal.addEventListener("abort", onAbort, { once: true });
186
+ });
187
+ }
188
+ function backoffDelay(attempt, policy) {
189
+ const exponential = Math.min(policy.maxDelayMs, policy.baseDelayMs * 2 ** Math.max(0, attempt - 1));
190
+ const random = Math.min(1, Math.max(0, policy.random?.() ?? Math.random()));
191
+ const multiplier = 1 + (random * 2 - 1) * policy.jitter;
192
+ return Math.max(0, Math.min(policy.maxDelayMs, Math.round(exponential * multiplier)));
193
+ }
194
+ export async function retryingRead(operation, options = {}) {
195
+ const maxAttempts = Math.max(1, Math.floor(options.maxAttempts ?? DEFAULT_MAX_ATTEMPTS));
196
+ const baseDelayMs = Math.max(0, options.baseDelayMs ?? DEFAULT_BASE_DELAY_MS);
197
+ const maxDelayMs = Math.max(baseDelayMs, options.maxDelayMs ?? DEFAULT_MAX_DELAY_MS);
198
+ const jitter = Math.max(0, Math.min(1, options.jitter ?? DEFAULT_JITTER));
199
+ const timeoutMs = Math.max(0, options.requestTimeoutMs ?? DEFAULT_REQUEST_TIMEOUT_MS);
200
+ const sleep = options.sleep ?? defaultSleep;
201
+ const parent = options.signal;
202
+ for (let attempt = 1; attempt <= maxAttempts; attempt += 1) {
203
+ throwIfAborted(parent);
204
+ const attemptSignal = makeAttemptSignal(parent, timeoutMs);
205
+ try {
206
+ const result = await abortable(operation(attemptSignal.signal), attemptSignal.signal);
207
+ attemptSignal.dispose();
208
+ throwIfAborted(parent);
209
+ return result;
210
+ }
211
+ catch (error) {
212
+ const timedOut = attemptSignal.didTimeout();
213
+ attemptSignal.dispose();
214
+ if (parent?.aborted)
215
+ throw abortError();
216
+ if (timedOut)
217
+ error = timeoutError();
218
+ const normalized = adapterError(error);
219
+ const shouldRetry = normalized.retryable && attempt < maxAttempts;
220
+ if (!shouldRetry)
221
+ throw normalized;
222
+ const retryAfter = normalized.code === "rate-limited" ? retryAfterMs(error) : undefined;
223
+ const delay = Math.min(maxDelayMs, retryAfter ?? backoffDelay(attempt, { baseDelayMs, maxDelayMs, jitter, random: options.random }));
224
+ try {
225
+ await sleep(delay, parent);
226
+ }
227
+ catch (sleepError) {
228
+ if (parent?.aborted || isCancellationError(sleepError))
229
+ throw abortError();
230
+ throw adapterError(sleepError);
231
+ }
232
+ }
233
+ }
234
+ throw new DomainError("transport", "OpenCode retry budget was exhausted");
235
+ }
236
+ function safeInteger(value, path) {
237
+ if (!Number.isSafeInteger(value) || typeof value !== "number") {
238
+ throw new DomainError("invalid-data", `${path} must be a safe integer`);
239
+ }
240
+ return value;
241
+ }
242
+ function dateFromMilliseconds(value, path) {
243
+ const milliseconds = safeInteger(value, path);
244
+ const date = new Date(milliseconds);
245
+ if (Number.isNaN(date.getTime())) {
246
+ throw new DomainError("invalid-data", `${path} must be a valid millisecond timestamp`);
247
+ }
248
+ return date;
249
+ }
250
+ function tokenInput(value) {
251
+ // parseTokenComponents deliberately performs the shared validation. The
252
+ // returned flat form avoids retaining arbitrary provider response fields.
253
+ const parsed = parseTokenComponents(value);
254
+ return { ...parsed };
255
+ }
256
+ function unwrapData(value) {
257
+ if (isRecord(value) && isRecord(value.data) && !("range" in value))
258
+ return value.data;
259
+ return value;
260
+ }
261
+ function parseStatsBreakdowns(raw) {
262
+ if (!Array.isArray(raw.models))
263
+ return {};
264
+ const models = [];
265
+ const providers = new Map();
266
+ for (const [index, value] of raw.models.entries()) {
267
+ if (!isRecord(value) || !isRecord(value.model)) {
268
+ throw new DomainError("invalid-data", `stats.models[${index}] is malformed`);
269
+ }
270
+ const model = value.model;
271
+ if (typeof model.id !== "string" || model.id.length === 0) {
272
+ throw new DomainError("invalid-data", `stats.models[${index}].model.id is missing`);
273
+ }
274
+ const totals = toUsageTotals(parseTokenComponents(value.tokens));
275
+ const provider = typeof model.providerID === "string" && model.providerID.length > 0
276
+ ? model.providerID
277
+ : undefined;
278
+ models.push({ name: model.id, ...(provider === undefined ? {} : { provider }), totals });
279
+ if (provider !== undefined) {
280
+ const current = providers.get(provider);
281
+ if (current === undefined) {
282
+ providers.set(provider, { name: provider, totals });
283
+ }
284
+ else {
285
+ const merged = {
286
+ input: current.totals.input + totals.input,
287
+ output: current.totals.output + totals.output,
288
+ reasoning: current.totals.reasoning + totals.reasoning,
289
+ cacheRead: current.totals.cacheRead + totals.cacheRead,
290
+ cacheWrite: current.totals.cacheWrite + totals.cacheWrite,
291
+ };
292
+ providers.set(provider, { name: provider, totals: toUsageTotals(merged) });
293
+ }
294
+ }
295
+ }
296
+ return { models, providers: [...providers.values()] };
297
+ }
298
+ function parseStats(value, window) {
299
+ const raw = unwrapData(value);
300
+ if (!isRecord(raw) || !isRecord(raw.range)) {
301
+ throw new DomainError("invalid-data", "OpenCode stats response is missing range");
302
+ }
303
+ const reportedFrom = dateFromMilliseconds(own(raw.range, "from"), "stats.range.from");
304
+ const reportedTo = dateFromMilliseconds(own(raw.range, "to"), "stats.range.to");
305
+ if (reportedFrom.getTime() >= reportedTo.getTime()) {
306
+ throw new DomainError("invalid-data", "OpenCode stats response has an invalid range");
307
+ }
308
+ if (!("tokens" in raw)) {
309
+ throw new DomainError("invalid-data", "OpenCode stats response is missing tokens");
310
+ }
311
+ let totals;
312
+ try {
313
+ totals = toUsageTotals(parseTokenComponents(raw.tokens));
314
+ }
315
+ catch (error) {
316
+ if (error instanceof DomainError)
317
+ throw error;
318
+ throw new DomainError("invalid-data", "OpenCode stats tokens could not be parsed", { cause: error });
319
+ }
320
+ const reportedRange = {
321
+ from: reportedFrom,
322
+ to: reportedTo,
323
+ timezone: window.timezone,
324
+ };
325
+ const requestedFrom = window.from.getTime();
326
+ const requestedTo = window.to.getTime();
327
+ const exact = reportedFrom.getTime() === requestedFrom && reportedTo.getTime() === requestedTo;
328
+ if (!exact) {
329
+ const broader = reportedFrom.getTime() < requestedFrom || reportedTo.getTime() > requestedTo;
330
+ throw new StatsRangeMismatchError(window, reportedRange, broader);
331
+ }
332
+ return {
333
+ requestedWindow: window,
334
+ reportedRange,
335
+ totals,
336
+ ...parseStatsBreakdowns(raw),
337
+ };
338
+ }
339
+ export const parseOpenCodeSessionStats = parseStats;
340
+ function parseCursor(value, path) {
341
+ if (value === undefined || value === null)
342
+ return null;
343
+ if (typeof value !== "string" || value.length === 0) {
344
+ throw new DomainError("invalid-data", `${path} must be a non-empty string or null`);
345
+ }
346
+ return value;
347
+ }
348
+ function parseCursorEnvelope(value, path) {
349
+ if (!isRecord(value) || !Array.isArray(value.data) || !isRecord(value.cursor)) {
350
+ throw new DomainError("invalid-data", `${path} response must contain data and cursor`);
351
+ }
352
+ return {
353
+ data: value.data,
354
+ nextCursor: parseCursor(own(value.cursor, "next"), `${path}.cursor.next`),
355
+ };
356
+ }
357
+ function parseSession(value, index) {
358
+ if (!isRecord(value) || typeof value.id !== "string" || value.id.length === 0) {
359
+ throw new DomainError("invalid-data", `sessions.data[${index}] is missing id`);
360
+ }
361
+ if (value.parentID !== undefined && value.parentID !== null && typeof value.parentID !== "string") {
362
+ throw new DomainError("invalid-data", `sessions.data[${index}].parentID is invalid`);
363
+ }
364
+ let projectID;
365
+ if (typeof value.projectID === "string" && value.projectID.length > 0) {
366
+ projectID = value.projectID;
367
+ }
368
+ else if (typeof value.project === "string" && value.project !== undefined) {
369
+ // fallback alias if API returns `project` instead of `projectID`
370
+ const raw = value.project;
371
+ if (typeof raw === "string" && raw.length > 0)
372
+ projectID = raw;
373
+ }
374
+ let directory;
375
+ let workspaceID;
376
+ const location = value.location;
377
+ if (isRecord(location)) {
378
+ if (typeof location.directory === "string" && location.directory.length > 0) {
379
+ directory = location.directory;
380
+ }
381
+ if (typeof location.workspaceID === "string" && location.workspaceID.length > 0) {
382
+ workspaceID = location.workspaceID;
383
+ }
384
+ else if (typeof location.workspace === "string" && location.workspace.length > 0) {
385
+ workspaceID = location.workspace;
386
+ }
387
+ }
388
+ else if (typeof value.directory === "string" && value.directory.length > 0) {
389
+ directory = value.directory;
390
+ }
391
+ return {
392
+ sessionID: value.id,
393
+ ...(typeof value.parentID === "string" ? { parentSessionID: value.parentID } : {}),
394
+ ...(projectID === undefined ? {} : { projectID }),
395
+ ...(directory === undefined ? {} : { directory }),
396
+ ...(workspaceID === undefined ? {} : { workspaceID }),
397
+ };
398
+ }
399
+ function parseProject(value, index) {
400
+ if (!isRecord(value) || typeof value.id !== "string" || value.id.length === 0) {
401
+ throw new DomainError("invalid-data", `projects.data[${index}] is missing id`);
402
+ }
403
+ if (typeof value.canonical !== "string" || value.canonical.length === 0) {
404
+ throw new DomainError("invalid-data", `projects.data[${index}] is missing canonical`);
405
+ }
406
+ const name = typeof value.name === "string" && value.name.length > 0 ? value.name : undefined;
407
+ return {
408
+ id: value.id,
409
+ canonical: value.canonical,
410
+ ...(name === undefined ? {} : { name }),
411
+ };
412
+ }
413
+ function parseProjectsEnvelope(value) {
414
+ if (Array.isArray(value)) {
415
+ return value.map(parseProject);
416
+ }
417
+ if (isRecord(value) && Array.isArray(value.data)) {
418
+ return value.data.map(parseProject);
419
+ }
420
+ if (isRecord(value) && Array.isArray(value.projects)) {
421
+ return value.projects.map(parseProject);
422
+ }
423
+ throw new DomainError("invalid-data", "OpenCode project list response is malformed");
424
+ }
425
+ function parseModel(value, path) {
426
+ if (!isRecord(value) || typeof value.id !== "string" || value.id.length === 0) {
427
+ throw new DomainError("invalid-data", `${path} is missing model.id`);
428
+ }
429
+ if (value.providerID !== undefined && (typeof value.providerID !== "string" || value.providerID.length === 0)) {
430
+ throw new DomainError("invalid-data", `${path}.providerID is invalid`);
431
+ }
432
+ return typeof value.providerID === "string" ? `${value.providerID}/${value.id}` : value.id;
433
+ }
434
+ function parseMessage(value, index, sessionID) {
435
+ if (!isRecord(value)) {
436
+ throw new DomainError("invalid-data", `messages.data[${index}] is not an object`);
437
+ }
438
+ if (value.type !== "assistant")
439
+ return undefined;
440
+ if (typeof value.id !== "string" || value.id.length === 0) {
441
+ throw new DomainError("invalid-data", `messages.data[${index}] is missing id`);
442
+ }
443
+ if (!isRecord(value.time)) {
444
+ throw new DomainError("invalid-data", `messages.data[${index}] is missing time`);
445
+ }
446
+ const createdAt = dateFromMilliseconds(own(value.time, "created"), `messages.data[${index}].time.created`);
447
+ const model = parseModel(value.model, `messages.data[${index}].model`);
448
+ let tokens;
449
+ if ("tokens" in value)
450
+ tokens = tokenInput(value.tokens);
451
+ let completed;
452
+ if ("completed" in value.time && value.time.completed !== undefined) {
453
+ completed = safeInteger(value.time.completed, `messages.data[${index}].time.completed`);
454
+ }
455
+ if ("finish" in value && value.finish !== undefined && typeof value.finish !== "string") {
456
+ throw new DomainError("invalid-data", `messages.data[${index}].finish is invalid`);
457
+ }
458
+ const completeness = completed !== undefined || value.finish !== undefined ? "final" : "provisional";
459
+ return {
460
+ sessionID,
461
+ messageID: value.id,
462
+ createdAt,
463
+ model,
464
+ ...(tokens === undefined ? {} : { tokens }),
465
+ completeness,
466
+ };
467
+ }
468
+ function requestInput(cursor, limit) {
469
+ return {
470
+ ...(cursor === undefined ? {} : { cursor }),
471
+ limit,
472
+ };
473
+ }
474
+ export class StatsRangeMismatchError extends DomainError {
475
+ requestedWindow;
476
+ reportedRange;
477
+ broader;
478
+ constructor(requestedWindow, reportedRange, broader) {
479
+ super("protocol", broader
480
+ ? "OpenCode stats response covered a broader range than requested"
481
+ : "OpenCode stats response range did not exactly match the requested window");
482
+ this.requestedWindow = requestedWindow;
483
+ this.reportedRange = reportedRange;
484
+ this.broader = broader;
485
+ }
486
+ }
487
+ export function isStatsRangeMismatch(error) {
488
+ return error instanceof StatsRangeMismatchError;
489
+ }
490
+ /**
491
+ * Read-only V2 transport. Response parsing happens after the retry boundary so
492
+ * malformed data is never retried and never mistaken for a transient outage.
493
+ */
494
+ export class OpenCode2Transport {
495
+ client;
496
+ pageSize;
497
+ retryPolicy;
498
+ constructor(options) {
499
+ this.client = options.client;
500
+ this.pageSize = Math.max(1, Math.min(1_000, Math.floor(options.pageSize ?? DEFAULT_PAGE_SIZE)));
501
+ this.retryPolicy = { ...options };
502
+ }
503
+ async getHealth(options = {}) {
504
+ // The transport cannot derive a safe fingerprint without the endpoint.
505
+ // Callers that need the service fingerprint should use connectOpenCode;
506
+ // this method still returns the stable API health metadata.
507
+ const raw = await retryingRead((signal) => this.client.health.get({ signal }), { ...this.retryPolicy, signal: options.signal });
508
+ if (!isRecord(raw) || raw.healthy !== true || typeof raw.version !== "string") {
509
+ throw new DomainError("invalid-data", "OpenCode health response is malformed");
510
+ }
511
+ const pid = raw.pid;
512
+ const fingerprint = `${raw.version}:${typeof pid === "number" ? pid : "unknown"}`;
513
+ return { version: raw.version, fingerprint };
514
+ }
515
+ async getSessionStats(window, options = {}) {
516
+ const input = {
517
+ from: window.from.getTime(),
518
+ to: window.to.getTime(),
519
+ ...(options.project === undefined ? {} : { project: options.project }),
520
+ timezone: window.timezone,
521
+ tools: "none",
522
+ };
523
+ const raw = await retryingRead((signal) => this.client.session.stats(input, { signal }), { ...this.retryPolicy, signal: options.signal });
524
+ return parseStats(raw, window);
525
+ }
526
+ async listSessions(request = {}) {
527
+ const input = requestInput(request.cursor, Math.max(1, Math.min(1_000, Math.floor(request.limit ?? this.pageSize))));
528
+ const raw = await retryingRead((signal) => this.client.session.list(input, { signal }), { ...this.retryPolicy, signal: request.signal });
529
+ const envelope = parseCursorEnvelope(raw, "sessions");
530
+ return {
531
+ sessions: envelope.data.map(parseSession),
532
+ nextCursor: envelope.nextCursor,
533
+ };
534
+ }
535
+ async listMessages(request) {
536
+ if (typeof request.sessionID !== "string" || request.sessionID.length === 0) {
537
+ throw new DomainError("invalid-data", "message list requires a sessionID");
538
+ }
539
+ const input = {
540
+ sessionID: request.sessionID,
541
+ ...requestInput(request.cursor, Math.max(1, Math.min(1_000, Math.floor(request.limit ?? this.pageSize)))),
542
+ };
543
+ let raw;
544
+ try {
545
+ raw = await retryingRead((signal) => this.client.message.list(input, { signal }), { ...this.retryPolicy, signal: request.signal });
546
+ }
547
+ catch (error) {
548
+ if (error instanceof DomainError && error.sessionID === undefined) {
549
+ throw new DomainError(error.code, error.message, {
550
+ retryable: error.retryable,
551
+ sessionID: request.sessionID,
552
+ cause: error,
553
+ });
554
+ }
555
+ throw error;
556
+ }
557
+ const envelope = parseCursorEnvelope(raw, "messages");
558
+ const messages = envelope.data.flatMap((value, index) => {
559
+ const message = parseMessage(value, index, request.sessionID);
560
+ return message === undefined ? [] : [message];
561
+ });
562
+ return { messages, nextCursor: envelope.nextCursor };
563
+ }
564
+ async listAllSessions(options = {}) {
565
+ const pages = Math.max(1, Math.floor(options.maxPages ?? 10_000));
566
+ const sessions = [];
567
+ const seenCursors = new Set();
568
+ let cursor = options.cursor;
569
+ for (let page = 0; page < pages; page += 1) {
570
+ if (cursor !== undefined) {
571
+ if (seenCursors.has(cursor))
572
+ throw new DomainError("protocol", "OpenCode session pagination repeated a cursor");
573
+ seenCursors.add(cursor);
574
+ }
575
+ const result = await this.listSessions({ ...options, cursor });
576
+ sessions.push(...result.sessions);
577
+ if (result.nextCursor === null)
578
+ return sessions;
579
+ cursor = result.nextCursor;
580
+ }
581
+ throw new DomainError("protocol", "OpenCode session pagination exceeded its page bound");
582
+ }
583
+ async listAllMessages(options) {
584
+ const pages = Math.max(1, Math.floor(options.maxPages ?? 10_000));
585
+ const messages = [];
586
+ const seenCursors = new Set();
587
+ let cursor = options.cursor;
588
+ for (let page = 0; page < pages; page += 1) {
589
+ if (cursor !== undefined) {
590
+ if (seenCursors.has(cursor))
591
+ throw new DomainError("protocol", "OpenCode message pagination repeated a cursor");
592
+ seenCursors.add(cursor);
593
+ }
594
+ const result = await this.listMessages({ ...options, cursor });
595
+ messages.push(...result.messages);
596
+ if (result.nextCursor === null)
597
+ return messages;
598
+ cursor = result.nextCursor;
599
+ }
600
+ throw new DomainError("protocol", "OpenCode message pagination exceeded its page bound");
601
+ }
602
+ async listProjects(options = {}) {
603
+ const clientProject = this.client.project;
604
+ if (clientProject === undefined || typeof clientProject.list !== "function") {
605
+ return [];
606
+ }
607
+ const raw = await retryingRead((signal) => clientProject.list({ signal }), { ...this.retryPolicy, signal: options.signal });
608
+ try {
609
+ return parseProjectsEnvelope(raw);
610
+ }
611
+ catch (error) {
612
+ if (error instanceof DomainError)
613
+ throw error;
614
+ throw new DomainError("invalid-data", "OpenCode project list could not be parsed", { cause: error });
615
+ }
616
+ }
617
+ }
618
+ export function createOpenCodeTransport(options) {
619
+ return new OpenCode2Transport(options);
620
+ }
621
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../src/opencode/transport.ts"],"names":[],"mappings":"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"}