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,20 @@
1
+ import type { Writable } from "node:stream";
2
+ import type { DashboardSnapshotInput, OutputOptions } from "../dashboard/render/types.js";
3
+ export * from "./json.js";
4
+ export * from "./table.js";
5
+ export * from "../dashboard/render/types.js";
6
+ export * from "../dashboard/render/format.js";
7
+ export * from "../dashboard/render/ansi.js";
8
+ export * from "../dashboard/render/dashboard.js";
9
+ export * from "../dashboard/render/redraw.js";
10
+ export interface WriteOutputOptions extends OutputOptions {
11
+ readonly stream?: Writable;
12
+ }
13
+ /**
14
+ * Auto mode is a dashboard only for an actual TTY. Redirected output is
15
+ * always plain table text, so pipes never receive cursor or color escapes.
16
+ */
17
+ export declare function renderOutput(input: DashboardSnapshotInput, options?: OutputOptions): string;
18
+ export declare function writeOutput(input: DashboardSnapshotInput, options?: WriteOutputOptions): void;
19
+ /** Render one TTY frame using cursor-home and line-erasure redraw semantics. */
20
+ export declare function renderRedraw(input: DashboardSnapshotInput, options?: OutputOptions): string;
@@ -0,0 +1,46 @@
1
+ import { renderDashboard } from "../dashboard/render/dashboard.js";
2
+ import { renderInPlace } from "../dashboard/render/ansi.js";
3
+ import { renderJSON } from "./json.js";
4
+ import { renderTable } from "./table.js";
5
+ export * from "./json.js";
6
+ export * from "./table.js";
7
+ export * from "../dashboard/render/types.js";
8
+ export * from "../dashboard/render/format.js";
9
+ export * from "../dashboard/render/ansi.js";
10
+ export * from "../dashboard/render/dashboard.js";
11
+ export * from "../dashboard/render/redraw.js";
12
+ /**
13
+ * Auto mode is a dashboard only for an actual TTY. Redirected output is
14
+ * always plain table text, so pipes never receive cursor or color escapes.
15
+ */
16
+ export function renderOutput(input, options = {}) {
17
+ const format = options.format ?? "auto";
18
+ if (format === "json")
19
+ return renderJSON(input, options.prettyJson === true);
20
+ if (format === "table")
21
+ return renderTable(input);
22
+ if (format === "dashboard")
23
+ return renderDashboard(input, options);
24
+ return options.isTTY === true ? renderDashboard(input, options) : renderTable(input);
25
+ }
26
+ export function writeOutput(input, options = {}) {
27
+ const stream = options.stream ?? process.stdout;
28
+ const isTTY = options.isTTY ?? Boolean(stream.isTTY);
29
+ const rendered = renderOutput(input, { ...options, isTTY });
30
+ stream.write(rendered.endsWith("\n") ? rendered : rendered + "\n");
31
+ }
32
+ /** Render one TTY frame using cursor-home and line-erasure redraw semantics. */
33
+ export function renderRedraw(input, options = {}) {
34
+ const { previousLineCount, ...dashboardOptions } = options;
35
+ const rendered = renderDashboard(input, {
36
+ ...dashboardOptions,
37
+ isTTY: true,
38
+ ansi: true,
39
+ });
40
+ return renderInPlace(rendered, previousLineCount ?? 0, {
41
+ isTTY: true,
42
+ ansi: true,
43
+ color: options.color,
44
+ });
45
+ }
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/output/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,eAAe,EAAE,MAAM,kCAAkC,CAAC;AACnE,OAAO,EAAE,aAAa,EAAoB,MAAM,6BAA6B,CAAC;AAC9E,OAAO,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAGzC,cAAc,WAAW,CAAC;AAC1B,cAAc,YAAY,CAAC;AAC3B,cAAc,8BAA8B,CAAC;AAC7C,cAAc,+BAA+B,CAAC;AAC9C,cAAc,6BAA6B,CAAC;AAC5C,cAAc,kCAAkC,CAAC;AACjD,cAAc,+BAA+B,CAAC;AAM9C;;;GAGG;AACH,MAAM,UAAU,YAAY,CAC1B,KAA6B,EAC7B,UAAyB,EAAE;IAE3B,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,MAAM,CAAC;IACxC,IAAI,MAAM,KAAK,MAAM;QAAE,OAAO,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,UAAU,KAAK,IAAI,CAAC,CAAC;IAC7E,IAAI,MAAM,KAAK,OAAO;QAAE,OAAO,WAAW,CAAC,KAAK,CAAC,CAAC;IAClD,IAAI,MAAM,KAAK,WAAW;QAAE,OAAO,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;IACnE,OAAO,OAAO,CAAC,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;AACvF,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,KAA6B,EAC7B,UAA8B,EAAE;IAEhC,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,MAAM,CAAC;IAChD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,OAAO,CAAE,MAAyC,CAAC,KAAK,CAAC,CAAC;IACzF,MAAM,QAAQ,GAAG,YAAY,CAAC,KAAK,EAAE,EAAE,GAAG,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;AACrE,CAAC;AAED,gFAAgF;AAChF,MAAM,UAAU,YAAY,CAC1B,KAA6B,EAC7B,UAAyB,EAAE;IAE3B,MAAM,EAAE,iBAAiB,EAAE,GAAG,gBAAgB,EAAE,GAAG,OAAO,CAAC;IAC3D,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE;QACtC,GAAG,gBAAgB;QACnB,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,IAAI;KACX,CAAC,CAAC;IACH,OAAO,aAAa,CAAC,QAAQ,EAAE,iBAAiB,IAAI,CAAC,EAAE;QACrD,KAAK,EAAE,IAAI;QACX,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,OAAO,CAAC,KAAK;KACC,CAAC,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,72 @@
1
+ import type { UsageTotals, UsageWindowKind } from "../domain/index.js";
2
+ import { type DashboardSnapshotInput } from "../dashboard/render/types.js";
3
+ export declare const JSON_SCHEMA_VERSION: 4;
4
+ export interface SerializedWindow {
5
+ readonly kind: UsageWindowKind;
6
+ readonly semantics: string;
7
+ readonly timezone: string;
8
+ readonly from: string;
9
+ readonly to: string;
10
+ readonly label: string;
11
+ readonly localDate?: string;
12
+ readonly isoWeekYear?: number;
13
+ readonly isoWeek?: number;
14
+ readonly isoWeekLabel?: string;
15
+ }
16
+ export interface StableCoverage {
17
+ readonly complete: boolean;
18
+ readonly sessionsDiscovered: number;
19
+ readonly sessionsScanned: number;
20
+ readonly sessionsSkipped: number;
21
+ readonly pagesRead: number;
22
+ readonly jobsRetried: number;
23
+ readonly provisionalMessages: number;
24
+ readonly errors: ReadonlyArray<{
25
+ readonly code: string;
26
+ readonly message?: string;
27
+ readonly sessionID?: string;
28
+ readonly retryable: boolean;
29
+ }>;
30
+ }
31
+ export interface SerializedTrend {
32
+ readonly label: string;
33
+ readonly totals: UsageTotals;
34
+ readonly from: string | null;
35
+ readonly to: string | null;
36
+ }
37
+ export interface SerializedBreakdown {
38
+ readonly name: string;
39
+ readonly provider?: string;
40
+ readonly totals: UsageTotals;
41
+ readonly cost?: number | null;
42
+ }
43
+ export interface StableJSONSnapshot {
44
+ readonly schemaVersion: typeof JSON_SCHEMA_VERSION;
45
+ readonly windows: Readonly<Record<UsageWindowKind, SerializedWindow>>;
46
+ readonly source: string;
47
+ readonly version: string;
48
+ readonly lastUpdated: string | null;
49
+ readonly nextRefreshAt: string | null;
50
+ readonly stale: boolean;
51
+ readonly coverage: StableCoverage;
52
+ readonly totals: Readonly<Record<UsageWindowKind, UsageTotals>>;
53
+ readonly costs: Readonly<Record<UsageWindowKind, number | null>>;
54
+ readonly trends: Readonly<Record<UsageWindowKind, ReadonlyArray<SerializedTrend>>>;
55
+ readonly models: ReadonlyArray<SerializedBreakdown>;
56
+ readonly providers: ReadonlyArray<SerializedBreakdown>;
57
+ readonly projects: ReadonlyArray<SerializedBreakdown>;
58
+ readonly providersByWindow: Readonly<Record<UsageWindowKind, ReadonlyArray<SerializedBreakdown>>>;
59
+ readonly projectsByWindow: Readonly<Record<UsageWindowKind, ReadonlyArray<SerializedBreakdown>>>;
60
+ readonly totalsByProvider: Readonly<Record<UsageWindowKind, Readonly<Record<string, UsageTotals>>>>;
61
+ readonly totalsByProject: Readonly<Record<UsageWindowKind, Readonly<Record<string, UsageTotals>>>>;
62
+ readonly costsByProvider: Readonly<Record<UsageWindowKind, Readonly<Record<string, number | null>>>>;
63
+ readonly costsByProject: Readonly<Record<UsageWindowKind, Readonly<Record<string, number | null>>>>;
64
+ }
65
+ /**
66
+ * Build a stable metadata-first JSON contract. All three exact windows are
67
+ * emitted, even when the terminal view currently focuses on one period.
68
+ */
69
+ export declare function toJSONSnapshot(input: DashboardSnapshotInput): StableJSONSnapshot;
70
+ export declare function renderJSON(input: DashboardSnapshotInput, pretty?: boolean): string;
71
+ export declare const renderJson: typeof renderJSON;
72
+ export declare const serializeDashboardSnapshot: typeof toJSONSnapshot;
@@ -0,0 +1,133 @@
1
+ import { allWindowKinds, normalizeDashboardSnapshot, } from "../dashboard/render/types.js";
2
+ export const JSON_SCHEMA_VERSION = 4;
3
+ function dateToISO(value) {
4
+ if (value instanceof Date) {
5
+ return Number.isNaN(value.getTime()) ? null : value.toISOString();
6
+ }
7
+ if (typeof value === "string" || typeof value === "number") {
8
+ const date = new Date(value);
9
+ return Number.isNaN(date.getTime()) ? null : date.toISOString();
10
+ }
11
+ return null;
12
+ }
13
+ function serializeWindow(value) {
14
+ const source = value.window;
15
+ return {
16
+ kind: source.kind,
17
+ semantics: source.semantics,
18
+ timezone: source.timezone,
19
+ from: dateToISO(source.from) ?? new Date(0).toISOString(),
20
+ to: dateToISO(source.to) ?? new Date(0).toISOString(),
21
+ label: source.label,
22
+ ...(source.kind === "day" ? { localDate: source.localDate } : {}),
23
+ ...(source.kind === "week"
24
+ ? {
25
+ isoWeekYear: source.isoWeekYear,
26
+ isoWeek: source.isoWeek,
27
+ isoWeekLabel: source.isoWeekLabel,
28
+ }
29
+ : {}),
30
+ };
31
+ }
32
+ function serializeCoverage(value) {
33
+ return {
34
+ complete: value.complete,
35
+ sessionsDiscovered: value.sessionsDiscovered,
36
+ sessionsScanned: value.sessionsScanned,
37
+ sessionsSkipped: value.sessionsSkipped,
38
+ pagesRead: value.pagesRead,
39
+ jobsRetried: value.jobsRetried,
40
+ provisionalMessages: value.provisionalMessages,
41
+ errors: value.errors.map((error) => ({
42
+ code: error.code,
43
+ ...(error.message === undefined ? {} : { message: error.message }),
44
+ ...(error.sessionID === undefined ? {} : { sessionID: error.sessionID }),
45
+ retryable: error.retryable,
46
+ })),
47
+ };
48
+ }
49
+ function serializeTrend(value) {
50
+ return {
51
+ label: value.label,
52
+ totals: value.totals,
53
+ from: dateToISO(value.from ?? null),
54
+ to: dateToISO(value.to ?? null),
55
+ };
56
+ }
57
+ function serializeBreakdown(value) {
58
+ return {
59
+ name: value.name,
60
+ ...(value.provider === undefined ? {} : { provider: value.provider }),
61
+ totals: value.totals,
62
+ ...(value.cost === undefined ? {} : { cost: value.cost }),
63
+ };
64
+ }
65
+ /**
66
+ * Build a stable metadata-first JSON contract. All three exact windows are
67
+ * emitted, even when the terminal view currently focuses on one period.
68
+ */
69
+ export function toJSONSnapshot(input) {
70
+ const snapshot = normalizeDashboardSnapshot(input);
71
+ const windows = {};
72
+ const totals = {};
73
+ const costs = {};
74
+ const trends = {};
75
+ const providersByWindow = {};
76
+ const projectsByWindow = {};
77
+ const totalsByProvider = {};
78
+ const totalsByProject = {};
79
+ const costsByProvider = {};
80
+ const costsByProject = {};
81
+ for (const kind of allWindowKinds()) {
82
+ windows[kind] = serializeWindow(snapshot.windows[kind]);
83
+ totals[kind] = snapshot.windows[kind].totals;
84
+ costs[kind] = snapshot.windows[kind].cost ?? null;
85
+ trends[kind] = snapshot.windows[kind].trends.map(serializeTrend);
86
+ providersByWindow[kind] = snapshot.windows[kind].providers.map(serializeBreakdown);
87
+ projectsByWindow[kind] = snapshot.windows[kind].projects.map(serializeBreakdown);
88
+ const perProvider = {};
89
+ const perProviderCost = {};
90
+ for (const entry of snapshot.windows[kind].providers) {
91
+ perProvider[entry.name] = entry.totals;
92
+ perProviderCost[entry.name] = entry.cost ?? null;
93
+ }
94
+ totalsByProvider[kind] = perProvider;
95
+ costsByProvider[kind] = perProviderCost;
96
+ const perProject = {};
97
+ const perProjectCost = {};
98
+ for (const entry of snapshot.windows[kind].projects) {
99
+ perProject[entry.name] = entry.totals;
100
+ perProjectCost[entry.name] = entry.cost ?? null;
101
+ }
102
+ totalsByProject[kind] = perProject;
103
+ costsByProject[kind] = perProjectCost;
104
+ }
105
+ return {
106
+ schemaVersion: JSON_SCHEMA_VERSION,
107
+ windows,
108
+ source: snapshot.source,
109
+ version: snapshot.version,
110
+ lastUpdated: dateToISO(snapshot.lastUpdated),
111
+ nextRefreshAt: dateToISO(snapshot.nextRefreshAt),
112
+ stale: snapshot.stale,
113
+ coverage: serializeCoverage(snapshot.coverage),
114
+ totals,
115
+ costs,
116
+ trends,
117
+ models: snapshot.models.map(serializeBreakdown),
118
+ providers: snapshot.providers.map(serializeBreakdown),
119
+ projects: snapshot.projects.map(serializeBreakdown),
120
+ providersByWindow,
121
+ projectsByWindow,
122
+ totalsByProvider,
123
+ totalsByProject,
124
+ costsByProvider,
125
+ costsByProject,
126
+ };
127
+ }
128
+ export function renderJSON(input, pretty = false) {
129
+ return JSON.stringify(toJSONSnapshot(input), null, pretty ? 2 : undefined);
130
+ }
131
+ export const renderJson = renderJSON;
132
+ export const serializeDashboardSnapshot = toJSONSnapshot;
133
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/output/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type DashboardSnapshotInput } from "../dashboard/render/types.js";
2
+ /** Deterministic non-ANSI table for pipes, logs, and explicit table mode. */
3
+ export declare function renderTable(input: DashboardSnapshotInput): string;
4
+ export declare const renderNonTTYTable: typeof renderTable;
@@ -0,0 +1,81 @@
1
+ import { allWindowKinds, normalizeDashboardSnapshot, } from "../dashboard/render/types.js";
2
+ import { formatCost, formatCoverage, formatExactTokenCount, safeIdentifier, } from "../dashboard/render/format.js";
3
+ function tableRow(columns, widths) {
4
+ return columns.map((column, index) => column.padEnd(widths[index] ?? column.length)).join(" ");
5
+ }
6
+ function renderSection(title, values) {
7
+ const lines = [title];
8
+ if (values.length === 0)
9
+ return [...lines, " (none)"];
10
+ const rows = values.slice(0, 20).map((item) => [
11
+ item.provider
12
+ ? `${safeIdentifier(item.provider)}/${safeIdentifier(item.name)}`
13
+ : safeIdentifier(item.name),
14
+ formatExactTokenCount(item.totals.recorded_total),
15
+ formatExactTokenCount(item.totals.input),
16
+ formatExactTokenCount(item.totals.output + item.totals.reasoning),
17
+ formatExactTokenCount(item.totals.cacheRead + item.totals.cacheWrite),
18
+ formatCost(item.cost),
19
+ ]);
20
+ const widths = [
21
+ Math.max("Name".length, ...rows.map((row) => row[0].length)),
22
+ Math.max("Recorded".length, ...rows.map((row) => row[1].length)),
23
+ Math.max("In".length, ...rows.map((row) => row[2].length)),
24
+ Math.max("Out".length, ...rows.map((row) => row[3].length)),
25
+ Math.max("Cache".length, ...rows.map((row) => row[4].length)),
26
+ Math.max("Cost".length, ...rows.map((row) => row[5].length)),
27
+ ];
28
+ lines.push(tableRow(["Name", "Recorded", "In", "Out", "Cache", "Cost"], widths));
29
+ lines.push(tableRow(widths.map((width) => "-".repeat(width)), widths));
30
+ lines.push(...rows.map((row) => tableRow(row, widths)));
31
+ if (values.length > rows.length)
32
+ lines.push(` +${values.length - rows.length} more`);
33
+ return lines;
34
+ }
35
+ /** Deterministic non-ANSI table for pipes, logs, and explicit table mode. */
36
+ export function renderTable(input) {
37
+ const snapshot = normalizeDashboardSnapshot(input);
38
+ const rows = [
39
+ ["Window", "Recorded", "In", "Out", "Cache", "Cost"],
40
+ ];
41
+ for (const kind of allWindowKinds()) {
42
+ const win = snapshot.windows[kind];
43
+ const totals = win.totals;
44
+ rows.push([
45
+ kind === "hour" ? "Last hour" : kind === "day" ? "Today" : "This week",
46
+ formatExactTokenCount(totals.recorded_total),
47
+ formatExactTokenCount(totals.input),
48
+ formatExactTokenCount(totals.output + totals.reasoning),
49
+ formatExactTokenCount(totals.cacheRead + totals.cacheWrite),
50
+ formatCost(win.cost),
51
+ ]);
52
+ }
53
+ const widths = rows[0].map((_, column) => Math.max(...rows.map((row) => row[column].length)));
54
+ const status = snapshot.stale
55
+ ? "STALE"
56
+ : snapshot.coverage.complete
57
+ ? "COMPLETE"
58
+ : "PARTIAL";
59
+ // Unified source is explicit when multiple providers contribute; normalize ensures "unified" even for legacy snapshots
60
+ const displaySource = snapshot.providers.length > 1 ? "unified" : snapshot.source;
61
+ const sortedProviders = [...snapshot.providers].sort((a, b) => b.totals.recorded_total - a.totals.recorded_total || a.name.localeCompare(b.name));
62
+ const sortedProjects = [...snapshot.projects].sort((a, b) => b.totals.recorded_total - a.totals.recorded_total || a.name.localeCompare(b.name));
63
+ const lines = [
64
+ "OpenCode 2 Token Usage",
65
+ `Source: ${safeIdentifier(displaySource)} Version: ${safeIdentifier(snapshot.version)}`,
66
+ `Status: ${status} Coverage: ${formatCoverage(snapshot.coverage, snapshot.stale)}`,
67
+ "",
68
+ tableRow(rows[0], widths),
69
+ tableRow(rows[0].map((column) => "-".repeat(column.length)), widths),
70
+ ...rows.slice(1).map((row) => tableRow(row, widths)),
71
+ "",
72
+ ...renderSection("Models", snapshot.models),
73
+ "",
74
+ ...renderSection("Providers", sortedProviders),
75
+ "",
76
+ ...renderSection("Projects", sortedProjects),
77
+ ];
78
+ return lines.join("\n");
79
+ }
80
+ export const renderNonTTYTable = renderTable;
81
+ //# sourceMappingURL=table.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"table.js","sourceRoot":"","sources":["../../../src/output/table.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from "./pricing.js";
@@ -0,0 +1,2 @@
1
+ export * from "./pricing.js";
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/pricing/index.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC"}
@@ -0,0 +1,19 @@
1
+ import type { UsageTotals } from "../domain/tokens.js";
2
+ export interface ModelPricing {
3
+ readonly input: number;
4
+ readonly output: number;
5
+ readonly reasoning: number;
6
+ readonly cacheRead: number;
7
+ readonly cacheWrite: number;
8
+ }
9
+ export declare function pricingForModel(model: string): ModelPricing | undefined;
10
+ export declare function costForTokens(totals: UsageTotals, pricing: ModelPricing): number;
11
+ export declare function estimatedCost(totals: UsageTotals, model: string): number | undefined;
12
+ export declare function estimatedCostForBreakdowns(breakdowns: ReadonlyArray<{
13
+ readonly name: string;
14
+ readonly totals: UsageTotals;
15
+ }>, strict?: boolean): number | undefined;
16
+ export declare function estimatedCostForBreakdownsPartial(breakdowns: ReadonlyArray<{
17
+ readonly name: string;
18
+ readonly totals: UsageTotals;
19
+ }>): number;