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,528 @@
1
+ import { costForTokens, estimatedCost, estimatedCostForBreakdowns, pricingForModel, } from "../../pricing/pricing.js";
2
+ const WINDOW_KINDS = ["hour", "day", "week"];
3
+ const COMPONENTS = ["input", "output", "reasoning", "cacheRead", "cacheWrite"];
4
+ function isRecord(value) {
5
+ return typeof value === "object" && value !== null;
6
+ }
7
+ function asRecord(value) {
8
+ return isRecord(value) ? value : {};
9
+ }
10
+ function asString(value, fallback) {
11
+ return typeof value === "string" ? value : fallback;
12
+ }
13
+ function asOptionalString(value) {
14
+ return typeof value === "string" && value.length > 0 ? value : undefined;
15
+ }
16
+ function asDate(value) {
17
+ if (value instanceof Date) {
18
+ return Number.isNaN(value.getTime()) ? null : new Date(value.getTime());
19
+ }
20
+ if (typeof value === "string" || typeof value === "number") {
21
+ const parsed = new Date(value);
22
+ return Number.isNaN(parsed.getTime()) ? null : parsed.toISOString();
23
+ }
24
+ return null;
25
+ }
26
+ function asCount(value) {
27
+ return typeof value === "number" && Number.isSafeInteger(value) && value >= 0 ? value : 0;
28
+ }
29
+ function tokenInput(value) {
30
+ const record = asRecord(value);
31
+ const cache = asRecord(record.cache);
32
+ return {
33
+ input: record.input,
34
+ output: record.output,
35
+ reasoning: record.reasoning,
36
+ cacheRead: record.cacheRead ?? cache.read,
37
+ cacheWrite: record.cacheWrite ?? cache.write,
38
+ };
39
+ }
40
+ function totalsFor(value) {
41
+ const input = tokenInput(value);
42
+ const components = {
43
+ input: asCount(input.input),
44
+ output: asCount(input.output),
45
+ reasoning: asCount(input.reasoning),
46
+ cacheRead: asCount(input.cacheRead),
47
+ cacheWrite: asCount(input.cacheWrite),
48
+ };
49
+ const recorded_total = COMPONENTS.reduce((sum, name) => sum + components[name], 0);
50
+ return { ...components, recorded_total };
51
+ }
52
+ function dateForWindow(value, fallback) {
53
+ const date = asDate(value);
54
+ return date === null ? new Date(fallback.getTime()) : new Date(date);
55
+ }
56
+ function fallbackWindow(kind, timezone) {
57
+ const now = new Date(0);
58
+ const from = new Date(kind === "hour" ? -60 * 60 * 1000 : 0);
59
+ const to = kind === "hour" ? now : new Date(60 * 60 * 1000);
60
+ return {
61
+ kind,
62
+ semantics: kind === "hour" ? "rolling-hour" : kind === "day" ? "local-day" : "iso-week",
63
+ timezone,
64
+ from,
65
+ to,
66
+ label: kind === "hour" ? "last 60 minutes" : kind === "day" ? "today" : "this week",
67
+ ...(kind === "day" ? { localDate: "1970-01-01" } : {}),
68
+ ...(kind === "week" ? { isoWeekYear: 1970, isoWeek: 1, isoWeekLabel: "1970-W01" } : {}),
69
+ };
70
+ }
71
+ function normalizeWindow(kind, value, timezone) {
72
+ const source = asRecord(value);
73
+ const fallback = fallbackWindow(kind, timezone);
74
+ const from = dateForWindow(source.from, fallback.from);
75
+ const to = dateForWindow(source.to, fallback.to);
76
+ const common = {
77
+ kind,
78
+ semantics: asString(source.semantics, fallback.semantics),
79
+ timezone: asString(source.timezone, timezone),
80
+ from,
81
+ to,
82
+ label: asString(source.label, fallback.label),
83
+ };
84
+ if (kind === "day") {
85
+ return {
86
+ ...common,
87
+ kind,
88
+ semantics: "local-day",
89
+ localDate: asString(source.localDate, asString(source.label, "today")),
90
+ };
91
+ }
92
+ if (kind === "week") {
93
+ return {
94
+ ...common,
95
+ kind,
96
+ semantics: "iso-week",
97
+ isoWeekYear: asCount(source.isoWeekYear) || 1970,
98
+ isoWeek: asCount(source.isoWeek) || 1,
99
+ isoWeekLabel: asString(source.isoWeekLabel, asString(source.label, "1970-W01")),
100
+ };
101
+ }
102
+ return { ...common, kind, semantics: "rolling-hour" };
103
+ }
104
+ function normalizeTrend(value) {
105
+ const source = asRecord(value);
106
+ const label = asString(source.label ?? source.name ?? source.bucket, "");
107
+ if (!label)
108
+ return null;
109
+ return {
110
+ label,
111
+ totals: totalsFor(source.totals ?? source.usage ?? source),
112
+ ...(source.from === undefined ? {} : { from: asDate(source.from) ?? undefined }),
113
+ ...(source.to === undefined ? {} : { to: asDate(source.to) ?? undefined }),
114
+ };
115
+ }
116
+ function normalizeTrends(value) {
117
+ if (!Array.isArray(value))
118
+ return [];
119
+ return value.map(normalizeTrend).filter((item) => item !== null);
120
+ }
121
+ function normalizeBreakdown(value) {
122
+ if (!Array.isArray(value))
123
+ return [];
124
+ const result = [];
125
+ for (const item of value) {
126
+ const source = asRecord(item);
127
+ const name = asString(source.name ?? source.model ?? source.provider ?? source.key, "");
128
+ if (!name)
129
+ continue;
130
+ const provider = asOptionalString(source.provider);
131
+ const totals = totalsFor(source.totals ?? source.usage ?? source);
132
+ const hasExplicitCost = "cost" in source;
133
+ let cost;
134
+ if (hasExplicitCost) {
135
+ const raw = source.cost;
136
+ cost = typeof raw === "number" && Number.isFinite(raw) && raw >= 0 ? raw : undefined;
137
+ }
138
+ else {
139
+ cost = estimatedCost(totals, name);
140
+ }
141
+ result.push({
142
+ name,
143
+ ...(provider === undefined ? {} : { provider }),
144
+ totals,
145
+ ...(cost === undefined ? {} : { cost }),
146
+ });
147
+ }
148
+ return result.sort((left, right) => right.totals.recorded_total - left.totals.recorded_total ||
149
+ left.name.localeCompare(right.name) ||
150
+ (left.provider ?? "").localeCompare(right.provider ?? ""));
151
+ }
152
+ function normalizeCoverage(value, stale) {
153
+ const source = asRecord(value);
154
+ const errors = Array.isArray(source.errors)
155
+ ? source.errors.map((item) => {
156
+ const error = asRecord(item);
157
+ return {
158
+ code: asString(error.code, "unknown"),
159
+ ...(asOptionalString(error.message) === undefined
160
+ ? {}
161
+ : { message: asOptionalString(error.message) }),
162
+ ...(asOptionalString(error.sessionID) === undefined
163
+ ? {}
164
+ : { sessionID: asOptionalString(error.sessionID) }),
165
+ retryable: error.retryable === true,
166
+ };
167
+ })
168
+ : [];
169
+ return {
170
+ complete: stale ? false : source.complete === true,
171
+ sessionsDiscovered: asCount(source.sessionsDiscovered),
172
+ sessionsScanned: asCount(source.sessionsScanned),
173
+ sessionsSkipped: asCount(source.sessionsSkipped),
174
+ pagesRead: asCount(source.pagesRead),
175
+ jobsRetried: asCount(source.jobsRetried),
176
+ provisionalMessages: asCount(source.provisionalMessages),
177
+ errors,
178
+ };
179
+ }
180
+ function readWindowData(root, kind) {
181
+ const windows = Array.isArray(root.windows)
182
+ ? root.windows.find((value) => asRecord(value).kind === kind)
183
+ : asRecord(root.windows)[kind];
184
+ const candidate = asRecord(windows);
185
+ const collection = asRecord(root.windowData);
186
+ const collectionCandidate = asRecord(collection[kind]);
187
+ return Object.keys(candidate).length > 0 ? candidate : collectionCandidate;
188
+ }
189
+ function readTotals(root, kind, data) {
190
+ const totals = asRecord(root.totals);
191
+ const usage = asRecord(root.usage);
192
+ const windowTotals = asRecord(root.windowTotals ?? root.totalsByWindow);
193
+ return totalsFor(data.totals ??
194
+ totals[kind] ??
195
+ usage[kind] ??
196
+ windowTotals[kind] ??
197
+ data);
198
+ }
199
+ function sourceAndVersion(root) {
200
+ const sourceValue = root.source;
201
+ const sourceObject = asRecord(sourceValue);
202
+ const source = typeof sourceValue === "string"
203
+ ? sourceValue
204
+ : asString(sourceObject.kind ?? sourceObject.name ?? sourceObject.type, "unknown");
205
+ return {
206
+ source,
207
+ version: asString(root.version ?? root.serverVersion ?? sourceObject.version, "unknown"),
208
+ };
209
+ }
210
+ function bucketLabel(date, timezone, kind) {
211
+ try {
212
+ return new Intl.DateTimeFormat("en-CA", kind === "week"
213
+ ? { timeZone: timezone, year: "numeric", month: "2-digit", day: "2-digit" }
214
+ : { timeZone: timezone, hour: "2-digit", minute: "2-digit", hourCycle: "h23" }).format(date);
215
+ }
216
+ catch {
217
+ return date.toISOString();
218
+ }
219
+ }
220
+ function deriveTrends(root, kind, window) {
221
+ if (!Array.isArray(root.records))
222
+ return [];
223
+ const duration = window.to.getTime() - window.from.getTime();
224
+ const bucketDuration = kind === "hour"
225
+ ? 5 * 60 * 1000
226
+ : kind === "day"
227
+ ? 60 * 60 * 1000
228
+ : 24 * 60 * 60 * 1000;
229
+ const bucketCount = Math.max(1, Math.min(24, Math.ceil(duration / bucketDuration)));
230
+ const values = Array.from({ length: bucketCount }, (_, index) => {
231
+ const from = new Date(window.from.getTime() + index * bucketDuration);
232
+ const to = new Date(Math.min(window.to.getTime(), from.getTime() + bucketDuration));
233
+ return {
234
+ label: bucketLabel(from, window.timezone, kind),
235
+ from,
236
+ to,
237
+ totals: {
238
+ input: 0,
239
+ output: 0,
240
+ reasoning: 0,
241
+ cacheRead: 0,
242
+ cacheWrite: 0,
243
+ recorded_total: 0,
244
+ },
245
+ };
246
+ });
247
+ for (const item of root.records) {
248
+ const record = asRecord(item);
249
+ if (record.completeness === "provisional")
250
+ continue;
251
+ const createdAt = asDate(record.createdAt ?? record.time);
252
+ if (createdAt === null || !(createdAt instanceof Date))
253
+ continue;
254
+ const timestamp = createdAt.getTime();
255
+ if (timestamp < window.from.getTime() || timestamp >= window.to.getTime())
256
+ continue;
257
+ const index = Math.min(values.length - 1, Math.max(0, Math.floor((timestamp - window.from.getTime()) / bucketDuration)));
258
+ const next = totalsFor(record);
259
+ const current = values[index].totals;
260
+ for (const component of COMPONENTS)
261
+ current[component] += next[component];
262
+ current.recorded_total += next.recorded_total;
263
+ }
264
+ return values;
265
+ }
266
+ function recordsAsBreakdown(root, key, window) {
267
+ if (!Array.isArray(root.records))
268
+ return [];
269
+ const groups = new Map();
270
+ for (const item of root.records) {
271
+ const record = asRecord(item);
272
+ if (record.completeness === "provisional")
273
+ continue;
274
+ if (window !== undefined) {
275
+ const createdAt = asDate(record.createdAt ?? record.time);
276
+ if (createdAt === null)
277
+ continue;
278
+ const timestamp = new Date(createdAt).getTime();
279
+ if (!Number.isFinite(timestamp) || timestamp < window.from.getTime() || timestamp >= window.to.getTime())
280
+ continue;
281
+ }
282
+ const model = asOptionalString(record.model);
283
+ const rawName = asOptionalString(record[key]);
284
+ let name;
285
+ if (key === "provider") {
286
+ // For opencode records the provider field is the generic "opencode" – the
287
+ // vendor (openai, anthropic …) lives in the model prefix and is what the
288
+ // Providers breakdown is expected to show in single-source fixtures.
289
+ if (rawName === "opencode" && model?.includes("/")) {
290
+ name = model.split("/", 1)[0];
291
+ }
292
+ else {
293
+ name = rawName ?? (model?.includes("/") ? model.split("/", 1)[0] : undefined);
294
+ }
295
+ }
296
+ else if (key === "project") {
297
+ name = rawName;
298
+ // Also accept directory-like values directly
299
+ if (!name && typeof record.project === "string")
300
+ name = record.project;
301
+ }
302
+ else {
303
+ name = rawName;
304
+ }
305
+ if (!name)
306
+ continue;
307
+ const next = totalsFor(record);
308
+ const existing = groups.get(name);
309
+ const totals = existing?.totals
310
+ ? { ...existing.totals }
311
+ : {
312
+ input: 0,
313
+ output: 0,
314
+ reasoning: 0,
315
+ cacheRead: 0,
316
+ cacheWrite: 0,
317
+ recorded_total: 0,
318
+ };
319
+ const mutable = totals;
320
+ for (const component of COMPONENTS) {
321
+ mutable[component] += next[component];
322
+ }
323
+ mutable.recorded_total += next.recorded_total;
324
+ let costSum = existing?.costSum ?? 0;
325
+ let hasUnknown = existing?.hasUnknown ?? false;
326
+ const pricingKey = model ?? name;
327
+ const pricing = pricingForModel(pricingKey);
328
+ if (pricing === undefined) {
329
+ hasUnknown = true;
330
+ }
331
+ else {
332
+ costSum += costForTokens(next, pricing);
333
+ }
334
+ groups.set(name, { totals, costSum, hasUnknown });
335
+ }
336
+ const result = [];
337
+ for (const [name, group] of groups) {
338
+ const cost = group.hasUnknown ? undefined : Math.round(group.costSum * 1_000_000) / 1_000_000;
339
+ result.push({
340
+ name,
341
+ totals: group.totals,
342
+ ...(cost === undefined ? {} : { cost }),
343
+ });
344
+ }
345
+ return result.sort((left, right) => right.totals.recorded_total - left.totals.recorded_total ||
346
+ left.name.localeCompare(right.name) ||
347
+ (left.provider ?? "").localeCompare(right.provider ?? ""));
348
+ }
349
+ function breakdownFromMap(value) {
350
+ if (!isRecord(value) || Array.isArray(value))
351
+ return null;
352
+ const entries = Object.entries(value);
353
+ if (entries.length === 0)
354
+ return null;
355
+ const sample = entries.find(([, entry]) => isRecord(entry) || typeof entry === "object");
356
+ if (sample === undefined)
357
+ return null;
358
+ // Detect totals-like map: value looks like { opencode: { input:.. } } and not a breakdown item
359
+ const isTotalsMap = entries.every(([, entry]) => {
360
+ const record = asRecord(entry);
361
+ return ("input" in record ||
362
+ "output" in record ||
363
+ "recorded_total" in record ||
364
+ "totals" in record ||
365
+ "usage" in record);
366
+ });
367
+ if (!isTotalsMap)
368
+ return null;
369
+ const breakdown = entries.map(([name, entry]) => {
370
+ const record = asRecord(entry);
371
+ const totalsSource = "totals" in record || "usage" in record ? (record.totals ?? record.usage) : entry;
372
+ return { name, provider: keyIsProvider(name) ? name : undefined, totals: totalsFor(totalsSource) };
373
+ });
374
+ // Require at least provider-like keys for provider maps
375
+ return breakdown.length > 0 ? normalizeBreakdown(breakdown) : null;
376
+ }
377
+ function keyIsProvider(value) {
378
+ return value === "opencode" || value === "codex" || value === "antigravity";
379
+ }
380
+ function breakdownForWindow(root, key, kind, window) {
381
+ const byWindowKey = key === "model" ? "modelsByWindow" : key === "provider" ? "providersByWindow" : "projectsByWindow";
382
+ const byWindow = asRecord(root[byWindowKey]);
383
+ const scoped = byWindow[kind];
384
+ if (Array.isArray(scoped))
385
+ return normalizeBreakdown(scoped);
386
+ const scopedMap = breakdownFromMap(scoped);
387
+ if (scopedMap !== null)
388
+ return scopedMap;
389
+ // Additive alias: totalsByProvider / totalsByWindow style maps
390
+ if (key === "provider") {
391
+ const totalsAlias = asRecord(root.totalsByProvider ?? root.totalsByWindow ?? {});
392
+ const aliasScoped = totalsAlias[kind];
393
+ if (Array.isArray(aliasScoped))
394
+ return normalizeBreakdown(aliasScoped);
395
+ const aliasMap = breakdownFromMap(aliasScoped);
396
+ if (aliasMap !== null)
397
+ return aliasMap;
398
+ const aliasGlobal = asRecord(root.totalsByProvider ?? {});
399
+ const hasProviderKeys = ["opencode", "codex", "antigravity"].some((provider) => provider in aliasGlobal);
400
+ if (hasProviderKeys) {
401
+ const globalMap = breakdownFromMap(aliasGlobal);
402
+ if (globalMap !== null)
403
+ return globalMap;
404
+ }
405
+ }
406
+ if (key === "project") {
407
+ const totalsAlias = asRecord(root.totalsByProject ?? root.totalsByProject ?? {});
408
+ const aliasScoped = totalsAlias[kind];
409
+ if (Array.isArray(aliasScoped))
410
+ return normalizeBreakdown(aliasScoped);
411
+ const aliasMap = breakdownFromMap(aliasScoped);
412
+ if (aliasMap !== null)
413
+ return aliasMap;
414
+ }
415
+ const global = key === "model"
416
+ ? root.models ?? root.modelTotals ?? asRecord(root.breakdown).models
417
+ : key === "provider"
418
+ ? root.providers ?? root.providerTotals ?? asRecord(root.breakdown).providers
419
+ : root.projects ?? root.projectTotals ?? asRecord(root.breakdown).projects;
420
+ if (Array.isArray(global))
421
+ return normalizeBreakdown(global);
422
+ const globalMap = breakdownFromMap(global);
423
+ if (globalMap !== null)
424
+ return globalMap;
425
+ // Message scans carry individual records rather than stats aggregates, so
426
+ // derive the selected window directly from record creation timestamps.
427
+ if (Array.isArray(root.records) && root.records.length > 0) {
428
+ return recordsAsBreakdown(root, key, window);
429
+ }
430
+ return normalizeBreakdown(global);
431
+ }
432
+ /**
433
+ * Normalize the collector's shared-domain snapshot into the renderer's read-only
434
+ * view. The renderer intentionally reads only metadata and token aggregates.
435
+ */
436
+ export function normalizeDashboardSnapshot(input) {
437
+ const root = asRecord(input);
438
+ const metadata = asRecord(root.metadata);
439
+ const requestedWindows = Array.isArray(root.requestedWindows) ? root.requestedWindows : root.windows;
440
+ const timezone = asString(root.timezone ??
441
+ metadata.timezone ??
442
+ (Array.isArray(requestedWindows) ? asRecord(requestedWindows[0]).timezone : undefined), "UTC");
443
+ const stale = root.stale === true;
444
+ const sourceVersion = sourceAndVersion(root);
445
+ const rootTrends = asRecord(root.trends);
446
+ const trendsByWindow = asRecord(root.trendsByWindow);
447
+ const windows = {};
448
+ for (const kind of WINDOW_KINDS) {
449
+ const windowData = readWindowData(root, kind);
450
+ const requestedWindow = Array.isArray(requestedWindows)
451
+ ? requestedWindows.find((value) => asRecord(value).kind === kind)
452
+ : undefined;
453
+ const window = normalizeWindow(kind, requestedWindow ?? windowData.window ?? windowData, timezone);
454
+ const suppliedTrends = windowData.trends ??
455
+ (Array.isArray(rootTrends[kind]) ? rootTrends[kind] : undefined) ??
456
+ (Array.isArray(trendsByWindow[kind]) ? trendsByWindow[kind] : undefined);
457
+ const trends = normalizeTrends(suppliedTrends);
458
+ const models = breakdownForWindow(root, "model", kind, window);
459
+ const providers = breakdownForWindow(root, "provider", kind, window);
460
+ const projects = breakdownForWindow(root, "project", kind, window);
461
+ const totals = readTotals(root, kind, windowData);
462
+ const rawWindowCost = estimatedCostForBreakdowns(models, true);
463
+ const windowCost = rawWindowCost;
464
+ windows[kind] = {
465
+ window,
466
+ totals,
467
+ ...(windowCost === undefined ? {} : { cost: windowCost }),
468
+ trends: Array.isArray(suppliedTrends) ? trends : deriveTrends(root, kind, window),
469
+ models,
470
+ providers,
471
+ projects,
472
+ };
473
+ }
474
+ const coverage = normalizeCoverage(root.coverage, stale);
475
+ const rawModelValues = root.models ??
476
+ root.modelTotals ??
477
+ asRecord(root.breakdown).models ??
478
+ windows.week.models;
479
+ const rawProviderValues = root.providers ??
480
+ root.providerTotals ??
481
+ asRecord(root.breakdown).providers ??
482
+ windows.week.providers;
483
+ const rawProjectValues = root.projects ??
484
+ root.projectTotals ??
485
+ asRecord(root.breakdown).projects ??
486
+ windows.week.projects;
487
+ const modelMapFallback = breakdownFromMap(rawModelValues);
488
+ const providerMapFallback = breakdownFromMap(rawProviderValues) ??
489
+ breakdownFromMap(asRecord(root.totalsByProvider ?? {}));
490
+ const projectMapFallback = breakdownFromMap(rawProjectValues) ??
491
+ breakdownFromMap(asRecord(root.totalsByProject ?? {}));
492
+ const models = Array.isArray(rawModelValues)
493
+ ? normalizeBreakdown(rawModelValues)
494
+ : modelMapFallback ?? normalizeBreakdown(rawModelValues);
495
+ const providers = Array.isArray(rawProviderValues)
496
+ ? normalizeBreakdown(rawProviderValues)
497
+ : providerMapFallback ?? normalizeBreakdown(rawProviderValues);
498
+ const projects = Array.isArray(rawProjectValues)
499
+ ? normalizeBreakdown(rawProjectValues)
500
+ : projectMapFallback ?? normalizeBreakdown(rawProjectValues);
501
+ // Derive from records if global is empty but window projects exist
502
+ const derivedProjects = projects.length === 0 && Array.isArray(root.records) && root.records.length > 0
503
+ ? recordsAsBreakdown(root, "project")
504
+ : projects;
505
+ const effectiveProjects = derivedProjects.length > 0 ? derivedProjects : projects;
506
+ const hasMultiProviders = providers.length > 1 || Object.values(windows).some((entry) => entry.providers.length > 1);
507
+ const source = sourceVersion.source === "unified" || hasMultiProviders ? "unified" : sourceVersion.source || (hasMultiProviders ? "unified" : "unknown");
508
+ const finalSource = hasMultiProviders ? "unified" : source;
509
+ return {
510
+ windows,
511
+ source: finalSource,
512
+ version: sourceVersion.version,
513
+ lastUpdated: asDate(root.lastUpdated ?? metadata.lastUpdated ?? root.capturedAt),
514
+ nextRefreshAt: asDate(root.nextRefreshAt ?? metadata.nextRefreshAt),
515
+ stale,
516
+ coverage,
517
+ models,
518
+ providers,
519
+ projects: effectiveProjects,
520
+ };
521
+ }
522
+ export function usageTotalsFrom(value) {
523
+ return totalsFor(value);
524
+ }
525
+ export function allWindowKinds() {
526
+ return WINDOW_KINDS;
527
+ }
528
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/dashboard/render/types.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from "./refresh-scheduler.js";
@@ -0,0 +1,2 @@
1
+ export * from "./refresh-scheduler.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/dashboard/scheduler/index.ts"],"names":[],"mappings":"AAAA,cAAc,wBAAwB,CAAC"}
@@ -0,0 +1,46 @@
1
+ import type { Clock, RefreshReason } from "../state/types.js";
2
+ export declare const DEFAULT_REFRESH_INTERVAL_SECONDS = 300;
3
+ export declare const DEFAULT_REFRESH_INTERVAL_MS: number;
4
+ export interface TimerDriver {
5
+ setTimeout(callback: () => void, delayMilliseconds: number): unknown;
6
+ clearTimeout(handle: unknown): void;
7
+ }
8
+ export interface RefreshSchedulerOptions {
9
+ readonly clock: Clock;
10
+ readonly onRequest: (reason: Exclude<RefreshReason, "initial">) => void;
11
+ readonly refreshIntervalSeconds?: number;
12
+ readonly timers?: TimerDriver;
13
+ }
14
+ /**
15
+ * Monotonic, one-shot refresh scheduler.
16
+ *
17
+ * There is only ever one armed timer. Resetting it invalidates the old timer
18
+ * callback as well as clearing it, which protects fake timer implementations
19
+ * and hosts that deliver a callback after clearTimeout.
20
+ */
21
+ export declare class RefreshScheduler {
22
+ private readonly clock;
23
+ private readonly onRequest;
24
+ private readonly timers;
25
+ private intervalMilliseconds;
26
+ private running;
27
+ private deadline;
28
+ private timerHandle;
29
+ private timerToken;
30
+ constructor(options: RefreshSchedulerOptions);
31
+ get refreshIntervalSeconds(): number;
32
+ setRefreshIntervalSeconds(seconds: number): void;
33
+ get isRunning(): boolean;
34
+ start(): void;
35
+ stop(): void;
36
+ /** Trigger an immediate refresh and restart the automatic cadence. */
37
+ manual(): void;
38
+ /** Treat wake as one invalidation, never as one callback per missed tick. */
39
+ wake(): void;
40
+ nextRefreshAt(): number | undefined;
41
+ countdownSeconds(): number | undefined;
42
+ /** Reset the cadence after a completed refresh or an externally detected wake. */
43
+ reset(): void;
44
+ private resetDeadline;
45
+ private clearTimer;
46
+ }