@tokscale/cli 1.4.2 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/dist/index.d.ts +3 -0
  2. package/dist/index.d.ts.map +1 -0
  3. package/dist/index.js +128 -0
  4. package/dist/index.js.map +1 -0
  5. package/package.json +19 -26
  6. package/dist/auth.d.ts +0 -17
  7. package/dist/auth.d.ts.map +0 -1
  8. package/dist/auth.js +0 -162
  9. package/dist/auth.js.map +0 -1
  10. package/dist/cli.d.ts +0 -9
  11. package/dist/cli.d.ts.map +0 -1
  12. package/dist/cli.js +0 -1523
  13. package/dist/cli.js.map +0 -1
  14. package/dist/credentials.d.ts +0 -50
  15. package/dist/credentials.d.ts.map +0 -1
  16. package/dist/credentials.js +0 -151
  17. package/dist/credentials.js.map +0 -1
  18. package/dist/cursor.d.ts +0 -167
  19. package/dist/cursor.d.ts.map +0 -1
  20. package/dist/cursor.js +0 -906
  21. package/dist/cursor.js.map +0 -1
  22. package/dist/date-utils.d.ts +0 -10
  23. package/dist/date-utils.d.ts.map +0 -1
  24. package/dist/date-utils.js +0 -47
  25. package/dist/date-utils.js.map +0 -1
  26. package/dist/graph-types.d.ts +0 -142
  27. package/dist/graph-types.d.ts.map +0 -1
  28. package/dist/graph-types.js +0 -6
  29. package/dist/graph-types.js.map +0 -1
  30. package/dist/native-runner.d.ts +0 -11
  31. package/dist/native-runner.d.ts.map +0 -1
  32. package/dist/native-runner.js +0 -77
  33. package/dist/native-runner.js.map +0 -1
  34. package/dist/native.d.ts +0 -105
  35. package/dist/native.d.ts.map +0 -1
  36. package/dist/native.js +0 -302
  37. package/dist/native.js.map +0 -1
  38. package/dist/sessions/types.d.ts +0 -28
  39. package/dist/sessions/types.d.ts.map +0 -1
  40. package/dist/sessions/types.js +0 -27
  41. package/dist/sessions/types.js.map +0 -1
  42. package/dist/spinner.d.ts +0 -75
  43. package/dist/spinner.d.ts.map +0 -1
  44. package/dist/spinner.js +0 -203
  45. package/dist/spinner.js.map +0 -1
  46. package/dist/submit.d.ts +0 -22
  47. package/dist/submit.d.ts.map +0 -1
  48. package/dist/submit.js +0 -292
  49. package/dist/submit.js.map +0 -1
  50. package/dist/table.d.ts +0 -42
  51. package/dist/table.d.ts.map +0 -1
  52. package/dist/table.js +0 -181
  53. package/dist/table.js.map +0 -1
  54. package/dist/tui/App.d.ts +0 -4
  55. package/dist/tui/App.d.ts.map +0 -1
  56. package/dist/tui/App.js +0 -350
  57. package/dist/tui/App.js.map +0 -1
  58. package/dist/tui/components/BarChart.d.ts +0 -17
  59. package/dist/tui/components/BarChart.d.ts.map +0 -1
  60. package/dist/tui/components/BarChart.js +0 -146
  61. package/dist/tui/components/BarChart.js.map +0 -1
  62. package/dist/tui/components/DailyView.d.ts +0 -13
  63. package/dist/tui/components/DailyView.d.ts.map +0 -1
  64. package/dist/tui/components/DailyView.js +0 -86
  65. package/dist/tui/components/DailyView.js.map +0 -1
  66. package/dist/tui/components/DateBreakdownPanel.d.ts +0 -7
  67. package/dist/tui/components/DateBreakdownPanel.d.ts.map +0 -1
  68. package/dist/tui/components/DateBreakdownPanel.js +0 -36
  69. package/dist/tui/components/DateBreakdownPanel.js.map +0 -1
  70. package/dist/tui/components/Footer.d.ts +0 -28
  71. package/dist/tui/components/Footer.d.ts.map +0 -1
  72. package/dist/tui/components/Footer.js +0 -130
  73. package/dist/tui/components/Footer.js.map +0 -1
  74. package/dist/tui/components/Header.d.ts +0 -9
  75. package/dist/tui/components/Header.d.ts.map +0 -1
  76. package/dist/tui/components/Header.js +0 -20
  77. package/dist/tui/components/Header.js.map +0 -1
  78. package/dist/tui/components/Legend.d.ts +0 -7
  79. package/dist/tui/components/Legend.d.ts.map +0 -1
  80. package/dist/tui/components/Legend.js +0 -16
  81. package/dist/tui/components/Legend.js.map +0 -1
  82. package/dist/tui/components/LoadingSpinner.d.ts +0 -8
  83. package/dist/tui/components/LoadingSpinner.d.ts.map +0 -1
  84. package/dist/tui/components/LoadingSpinner.js +0 -55
  85. package/dist/tui/components/LoadingSpinner.js.map +0 -1
  86. package/dist/tui/components/ModelRow.d.ts +0 -13
  87. package/dist/tui/components/ModelRow.d.ts.map +0 -1
  88. package/dist/tui/components/ModelRow.js +0 -15
  89. package/dist/tui/components/ModelRow.js.map +0 -1
  90. package/dist/tui/components/ModelView.d.ts +0 -13
  91. package/dist/tui/components/ModelView.d.ts.map +0 -1
  92. package/dist/tui/components/ModelView.js +0 -96
  93. package/dist/tui/components/ModelView.js.map +0 -1
  94. package/dist/tui/components/OverviewView.d.ts +0 -14
  95. package/dist/tui/components/OverviewView.d.ts.map +0 -1
  96. package/dist/tui/components/OverviewView.js +0 -65
  97. package/dist/tui/components/OverviewView.js.map +0 -1
  98. package/dist/tui/components/StatsView.d.ts +0 -14
  99. package/dist/tui/components/StatsView.d.ts.map +0 -1
  100. package/dist/tui/components/StatsView.js +0 -102
  101. package/dist/tui/components/StatsView.js.map +0 -1
  102. package/dist/tui/components/TokenBreakdown.d.ts +0 -14
  103. package/dist/tui/components/TokenBreakdown.d.ts.map +0 -1
  104. package/dist/tui/components/TokenBreakdown.js +0 -10
  105. package/dist/tui/components/TokenBreakdown.js.map +0 -1
  106. package/dist/tui/components/index.d.ts +0 -16
  107. package/dist/tui/components/index.d.ts.map +0 -1
  108. package/dist/tui/components/index.js +0 -13
  109. package/dist/tui/components/index.js.map +0 -1
  110. package/dist/tui/config/settings.d.ts +0 -15
  111. package/dist/tui/config/settings.d.ts.map +0 -1
  112. package/dist/tui/config/settings.js +0 -147
  113. package/dist/tui/config/settings.js.map +0 -1
  114. package/dist/tui/config/themes.d.ts +0 -15
  115. package/dist/tui/config/themes.d.ts.map +0 -1
  116. package/dist/tui/config/themes.js +0 -82
  117. package/dist/tui/config/themes.js.map +0 -1
  118. package/dist/tui/hooks/useData.d.ts +0 -19
  119. package/dist/tui/hooks/useData.d.ts.map +0 -1
  120. package/dist/tui/hooks/useData.js +0 -467
  121. package/dist/tui/hooks/useData.js.map +0 -1
  122. package/dist/tui/index.d.ts +0 -4
  123. package/dist/tui/index.d.ts.map +0 -1
  124. package/dist/tui/index.js +0 -36
  125. package/dist/tui/index.js.map +0 -1
  126. package/dist/tui/types/index.d.ts +0 -137
  127. package/dist/tui/types/index.d.ts.map +0 -1
  128. package/dist/tui/types/index.js +0 -25
  129. package/dist/tui/types/index.js.map +0 -1
  130. package/dist/tui/utils/cleanup.d.ts +0 -22
  131. package/dist/tui/utils/cleanup.d.ts.map +0 -1
  132. package/dist/tui/utils/cleanup.js +0 -59
  133. package/dist/tui/utils/cleanup.js.map +0 -1
  134. package/dist/tui/utils/colors.d.ts +0 -19
  135. package/dist/tui/utils/colors.d.ts.map +0 -1
  136. package/dist/tui/utils/colors.js +0 -68
  137. package/dist/tui/utils/colors.js.map +0 -1
  138. package/dist/tui/utils/format.d.ts +0 -7
  139. package/dist/tui/utils/format.d.ts.map +0 -1
  140. package/dist/tui/utils/format.js +0 -45
  141. package/dist/tui/utils/format.js.map +0 -1
  142. package/dist/tui/utils/responsive.d.ts +0 -5
  143. package/dist/tui/utils/responsive.d.ts.map +0 -1
  144. package/dist/tui/utils/responsive.js +0 -5
  145. package/dist/tui/utils/responsive.js.map +0 -1
  146. package/dist/wrapped.d.ts +0 -43
  147. package/dist/wrapped.d.ts.map +0 -1
  148. package/dist/wrapped.js +0 -716
  149. package/dist/wrapped.js.map +0 -1
  150. package/src/auth.ts +0 -211
  151. package/src/cli.ts +0 -1865
  152. package/src/credentials.ts +0 -176
  153. package/src/cursor.ts +0 -1044
  154. package/src/date-utils.ts +0 -51
  155. package/src/graph-types.ts +0 -175
  156. package/src/native-runner.js +0 -4
  157. package/src/native-runner.ts +0 -91
  158. package/src/native.ts +0 -631
  159. package/src/sessions/types.ts +0 -59
  160. package/src/spinner.ts +0 -283
  161. package/src/submit.ts +0 -358
  162. package/src/table.ts +0 -233
  163. package/src/tui/App.tsx +0 -443
  164. package/src/tui/components/BarChart.tsx +0 -205
  165. package/src/tui/components/DailyView.tsx +0 -132
  166. package/src/tui/components/DateBreakdownPanel.tsx +0 -79
  167. package/src/tui/components/Footer.tsx +0 -368
  168. package/src/tui/components/Header.tsx +0 -68
  169. package/src/tui/components/Legend.tsx +0 -39
  170. package/src/tui/components/LoadingSpinner.tsx +0 -81
  171. package/src/tui/components/ModelRow.tsx +0 -47
  172. package/src/tui/components/ModelView.tsx +0 -147
  173. package/src/tui/components/OverviewView.tsx +0 -121
  174. package/src/tui/components/StatsView.tsx +0 -249
  175. package/src/tui/components/TokenBreakdown.tsx +0 -46
  176. package/src/tui/components/index.ts +0 -15
  177. package/src/tui/config/settings.ts +0 -183
  178. package/src/tui/config/themes.ts +0 -115
  179. package/src/tui/hooks/useData.ts +0 -557
  180. package/src/tui/index.tsx +0 -44
  181. package/src/tui/opentui.d.ts +0 -166
  182. package/src/tui/types/index.ts +0 -172
  183. package/src/tui/utils/cleanup.ts +0 -65
  184. package/src/tui/utils/colors.ts +0 -76
  185. package/src/tui/utils/format.ts +0 -36
  186. package/src/tui/utils/responsive.ts +0 -8
  187. package/src/types.d.ts +0 -28
  188. package/src/wrapped.ts +0 -845
package/dist/native.js DELETED
@@ -1,302 +0,0 @@
1
- /**
2
- * Native module loader for Rust core
3
- *
4
- * Exposes all Rust functions with proper TypeScript types.
5
- * Native module is REQUIRED - no TypeScript fallback.
6
- */
7
- import { loadSettings } from "./tui/config/settings.js";
8
- // =============================================================================
9
- // Module loading
10
- // =============================================================================
11
- let nativeCore = null;
12
- try {
13
- // Type assertion needed because dynamic import returns module namespace
14
- // nativeCore.version() is called directly, async functions go through subprocess
15
- nativeCore = await import("@tokscale/core").then((m) => (m.default || m));
16
- }
17
- catch (e) {
18
- void e;
19
- }
20
- // =============================================================================
21
- // Public API
22
- // =============================================================================
23
- /**
24
- * Check if native module is available
25
- */
26
- export function isNativeAvailable() {
27
- return nativeCore !== null;
28
- }
29
- /**
30
- * Get native module version
31
- */
32
- export function getNativeVersion() {
33
- return nativeCore?.version() ?? null;
34
- }
35
- /**
36
- * Convert native result to TypeScript format
37
- */
38
- function fromNativeResult(result) {
39
- return {
40
- meta: {
41
- generatedAt: result.meta.generatedAt,
42
- version: result.meta.version,
43
- dateRange: {
44
- start: result.meta.dateRangeStart,
45
- end: result.meta.dateRangeEnd,
46
- },
47
- },
48
- summary: {
49
- totalTokens: result.summary.totalTokens,
50
- totalCost: result.summary.totalCost,
51
- totalDays: result.summary.totalDays,
52
- activeDays: result.summary.activeDays,
53
- averagePerDay: result.summary.averagePerDay,
54
- maxCostInSingleDay: result.summary.maxCostInSingleDay,
55
- sources: result.summary.sources,
56
- models: result.summary.models,
57
- },
58
- years: result.years.map((y) => ({
59
- year: y.year,
60
- totalTokens: y.totalTokens,
61
- totalCost: y.totalCost,
62
- range: {
63
- start: y.rangeStart,
64
- end: y.rangeEnd,
65
- },
66
- })),
67
- contributions: result.contributions.map((c) => ({
68
- date: c.date,
69
- timestampMs: c.timestampMs ?? undefined,
70
- totals: {
71
- tokens: c.totals.tokens,
72
- cost: c.totals.cost,
73
- messages: c.totals.messages,
74
- },
75
- intensity: c.intensity,
76
- tokenBreakdown: {
77
- input: c.tokenBreakdown.input,
78
- output: c.tokenBreakdown.output,
79
- cacheRead: c.tokenBreakdown.cacheRead,
80
- cacheWrite: c.tokenBreakdown.cacheWrite,
81
- reasoning: c.tokenBreakdown.reasoning,
82
- },
83
- sources: c.sources.map((s) => ({
84
- source: s.source,
85
- modelId: s.modelId,
86
- providerId: s.providerId,
87
- tokens: {
88
- input: s.tokens.input,
89
- output: s.tokens.output,
90
- cacheRead: s.tokens.cacheRead,
91
- cacheWrite: s.tokens.cacheWrite,
92
- reasoning: s.tokens.reasoning,
93
- },
94
- cost: s.cost,
95
- messages: s.messages,
96
- })),
97
- })),
98
- };
99
- }
100
- // =============================================================================
101
- // Async Subprocess Wrappers (Non-blocking for UI)
102
- // =============================================================================
103
- import { fileURLToPath } from "node:url";
104
- import { dirname, join } from "node:path";
105
- import { writeFileSync, readFileSync, unlinkSync, mkdirSync, existsSync } from "node:fs";
106
- import { tmpdir } from "node:os";
107
- import { randomUUID } from "node:crypto";
108
- const __filename = fileURLToPath(import.meta.url);
109
- const __dirname = dirname(__filename);
110
- const SIGKILL_GRACE_MS = 500;
111
- function getNativeTimeoutMs() {
112
- const settings = loadSettings();
113
- return process.env.TOKSCALE_NATIVE_TIMEOUT_MS
114
- ? parseInt(process.env.TOKSCALE_NATIVE_TIMEOUT_MS, 10)
115
- : (settings.nativeTimeoutMs ?? 300_000);
116
- }
117
- function safeKill(proc, signal) {
118
- try {
119
- proc.kill(signal);
120
- }
121
- catch { }
122
- }
123
- async function runInSubprocess(method, args) {
124
- const NATIVE_TIMEOUT_MS = getNativeTimeoutMs();
125
- const runnerPath = join(__dirname, "native-runner.js");
126
- const input = JSON.stringify({ method, args });
127
- const tmpDir = join(tmpdir(), "tokscale");
128
- mkdirSync(tmpDir, { recursive: true });
129
- const id = randomUUID();
130
- const inputFile = join(tmpDir, `input-${id}.json`);
131
- const outputFile = join(tmpDir, `output-${id}.json`);
132
- writeFileSync(inputFile, input, "utf-8");
133
- const BunGlobal = globalThis.Bun;
134
- let proc;
135
- try {
136
- proc = BunGlobal.spawn([process.execPath, runnerPath, inputFile, outputFile], {
137
- stdout: "ignore",
138
- stderr: "pipe",
139
- });
140
- }
141
- catch (e) {
142
- try {
143
- unlinkSync(inputFile);
144
- }
145
- catch { }
146
- throw new Error(`Failed to spawn subprocess: ${e.message}`);
147
- }
148
- let timeoutId = null;
149
- let sigkillId = null;
150
- let weInitiatedKill = false;
151
- const cleanup = async () => {
152
- if (timeoutId)
153
- clearTimeout(timeoutId);
154
- if (sigkillId)
155
- clearTimeout(sigkillId);
156
- try {
157
- unlinkSync(inputFile);
158
- }
159
- catch { }
160
- try {
161
- unlinkSync(outputFile);
162
- }
163
- catch { }
164
- };
165
- try {
166
- const timeoutPromise = new Promise((_, reject) => {
167
- timeoutId = setTimeout(() => {
168
- weInitiatedKill = true;
169
- safeKill(proc, "SIGTERM");
170
- sigkillId = setTimeout(() => {
171
- safeKill(proc, "SIGKILL");
172
- reject(new Error(`Subprocess '${method}' timed out after ${NATIVE_TIMEOUT_MS}ms (hard kill)`));
173
- }, SIGKILL_GRACE_MS);
174
- }, NATIVE_TIMEOUT_MS);
175
- });
176
- const exitCode = await Promise.race([proc.exited, timeoutPromise]);
177
- if (timeoutId)
178
- clearTimeout(timeoutId);
179
- if (weInitiatedKill || proc.signalCode) {
180
- throw new Error(`Subprocess '${method}' was killed (signal: ${proc.signalCode || "SIGTERM"})`);
181
- }
182
- if (exitCode !== 0) {
183
- const stderr = await proc.stderr.text();
184
- let errorMsg = `Process exited with code ${exitCode}`;
185
- if (stderr) {
186
- try {
187
- const parsed = JSON.parse(stderr);
188
- if (parsed.error) {
189
- errorMsg = parsed.error;
190
- }
191
- else {
192
- errorMsg = stderr;
193
- }
194
- }
195
- catch {
196
- // Not JSON — include raw stderr so the user sees the actual error
197
- // (e.g. dynamic linker errors on NixOS, missing shared libraries, etc.)
198
- errorMsg = stderr;
199
- }
200
- }
201
- throw new Error(`Subprocess '${method}' failed: ${errorMsg}`);
202
- }
203
- if (!existsSync(outputFile)) {
204
- throw new Error(`Subprocess '${method}' did not produce output file`);
205
- }
206
- try {
207
- const output = readFileSync(outputFile, "utf-8");
208
- return JSON.parse(output);
209
- }
210
- catch (e) {
211
- throw new Error(`Failed to parse subprocess output: ${e.message}`);
212
- }
213
- }
214
- finally {
215
- await cleanup();
216
- }
217
- }
218
- export async function parseLocalSourcesAsync(options) {
219
- if (!isNativeAvailable()) {
220
- throw new Error("Native module required. Run: bun run build:core");
221
- }
222
- const nativeOptions = {
223
- homeDir: options.homeDir,
224
- sources: options.sources,
225
- since: options.since,
226
- until: options.until,
227
- year: options.year,
228
- sinceTs: options.sinceTs,
229
- untilTs: options.untilTs,
230
- };
231
- return runInSubprocess("parseLocalSources", [nativeOptions]);
232
- }
233
- export async function finalizeReportAsync(options) {
234
- if (!isNativeAvailable()) {
235
- throw new Error("Native module required. Run: bun run build:core");
236
- }
237
- const nativeOptions = {
238
- homeDir: undefined,
239
- localMessages: options.localMessages,
240
- includeCursor: options.includeCursor,
241
- since: options.since,
242
- until: options.until,
243
- year: options.year,
244
- sinceTs: options.sinceTs,
245
- untilTs: options.untilTs,
246
- };
247
- return runInSubprocess("finalizeReport", [nativeOptions]);
248
- }
249
- export async function finalizeMonthlyReportAsync(options) {
250
- if (!isNativeAvailable()) {
251
- throw new Error("Native module required. Run: bun run build:core");
252
- }
253
- const nativeOptions = {
254
- homeDir: undefined,
255
- localMessages: options.localMessages,
256
- includeCursor: options.includeCursor,
257
- since: options.since,
258
- until: options.until,
259
- year: options.year,
260
- sinceTs: options.sinceTs,
261
- untilTs: options.untilTs,
262
- };
263
- return runInSubprocess("finalizeMonthlyReport", [nativeOptions]);
264
- }
265
- export async function finalizeGraphAsync(options) {
266
- if (!isNativeAvailable()) {
267
- throw new Error("Native module required. Run: bun run build:core");
268
- }
269
- const nativeOptions = {
270
- homeDir: undefined,
271
- localMessages: options.localMessages,
272
- includeCursor: options.includeCursor,
273
- since: options.since,
274
- until: options.until,
275
- year: options.year,
276
- sinceTs: options.sinceTs,
277
- untilTs: options.untilTs,
278
- };
279
- const result = await runInSubprocess("finalizeGraph", [nativeOptions]);
280
- return fromNativeResult(result);
281
- }
282
- export async function finalizeReportAndGraphAsync(options) {
283
- if (!isNativeAvailable()) {
284
- throw new Error("Native module required. Run: bun run build:core");
285
- }
286
- const nativeOptions = {
287
- homeDir: undefined,
288
- localMessages: options.localMessages,
289
- includeCursor: options.includeCursor,
290
- since: options.since,
291
- until: options.until,
292
- year: options.year,
293
- sinceTs: options.sinceTs,
294
- untilTs: options.untilTs,
295
- };
296
- const result = await runInSubprocess("finalizeReportAndGraph", [nativeOptions]);
297
- return {
298
- report: result.report,
299
- graph: fromNativeResult(result.graph),
300
- };
301
- }
302
- //# sourceMappingURL=native.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"native.js","sourceRoot":"","sources":["../src/native.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAMH,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AA2KxD,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAEhF,IAAI,UAAU,GAAsB,IAAI,CAAC;AAEzC,IAAI,CAAC;IACH,wEAAwE;IACxE,iFAAiF;IACjF,UAAU,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC,IAAI,CAC9C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,IAAI,CAAC,CAA0B,CACjD,CAAC;AACJ,CAAC;AAAC,OAAO,CAAC,EAAE,CAAC;IACX,KAAK,CAAC,CAAC;AACT,CAAC;AAED,gFAAgF;AAChF,aAAa;AACb,gFAAgF;AAEhF;;GAEG;AACH,MAAM,UAAU,iBAAiB;IAC/B,OAAO,UAAU,KAAK,IAAI,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB;IAC9B,OAAO,UAAU,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC;AACvC,CAAC;AAED;;GAEG;AACH,SAAS,gBAAgB,CAAC,MAAyB;IACjD,OAAO;QACL,IAAI,EAAE;YACJ,WAAW,EAAE,MAAM,CAAC,IAAI,CAAC,WAAW;YACpC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,OAAO;YAC5B,SAAS,EAAE;gBACT,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,cAAc;gBACjC,GAAG,EAAE,MAAM,CAAC,IAAI,CAAC,YAAY;aAC9B;SACF;QACD,OAAO,EAAE;YACP,WAAW,EAAE,MAAM,CAAC,OAAO,CAAC,WAAW;YACvC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;YACnC,SAAS,EAAE,MAAM,CAAC,OAAO,CAAC,SAAS;YACnC,UAAU,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU;YACrC,aAAa,EAAE,MAAM,CAAC,OAAO,CAAC,aAAa;YAC3C,kBAAkB,EAAE,MAAM,CAAC,OAAO,CAAC,kBAAkB;YACrD,OAAO,EAAE,MAAM,CAAC,OAAO,CAAC,OAAuB;YAC/C,MAAM,EAAE,MAAM,CAAC,OAAO,CAAC,MAAM;SAC9B;QACD,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9B,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW;YAC1B,SAAS,EAAE,CAAC,CAAC,SAAS;YACtB,KAAK,EAAE;gBACL,KAAK,EAAE,CAAC,CAAC,UAAU;gBACnB,GAAG,EAAE,CAAC,CAAC,QAAQ;aAChB;SACF,CAAC,CAAC;QACH,aAAa,EAAE,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAC9C,IAAI,EAAE,CAAC,CAAC,IAAI;YACZ,WAAW,EAAE,CAAC,CAAC,WAAW,IAAI,SAAS;YACvC,MAAM,EAAE;gBACN,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;gBACvB,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI;gBACnB,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,QAAQ;aAC5B;YACD,SAAS,EAAE,CAAC,CAAC,SAA8B;YAC3C,cAAc,EAAE;gBACd,KAAK,EAAE,CAAC,CAAC,cAAc,CAAC,KAAK;gBAC7B,MAAM,EAAE,CAAC,CAAC,cAAc,CAAC,MAAM;gBAC/B,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,SAAS;gBACrC,UAAU,EAAE,CAAC,CAAC,cAAc,CAAC,UAAU;gBACvC,SAAS,EAAE,CAAC,CAAC,cAAc,CAAC,SAAS;aACtC;YACD,OAAO,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;gBAC7B,MAAM,EAAE,CAAC,CAAC,MAAoB;gBAC9B,OAAO,EAAE,CAAC,CAAC,OAAO;gBAClB,UAAU,EAAE,CAAC,CAAC,UAAU;gBACxB,MAAM,EAAE;oBACN,KAAK,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK;oBACrB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,MAAM;oBACvB,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS;oBAC7B,UAAU,EAAE,CAAC,CAAC,MAAM,CAAC,UAAU;oBAC/B,SAAS,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS;iBAC9B;gBACD,IAAI,EAAE,CAAC,CAAC,IAAI;gBACZ,QAAQ,EAAE,CAAC,CAAC,QAAQ;aACrB,CAAC,CAAC;SACJ,CAAC,CAAC;KACJ,CAAC;AACJ,CAAC;AAmGD,gFAAgF;AAChF,kDAAkD;AAClD,gFAAgF;AAEhF,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAC1C,OAAO,EAAE,aAAa,EAAE,YAAY,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AACzF,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AAEtC,MAAM,gBAAgB,GAAG,GAAG,CAAC;AAE7B,SAAS,kBAAkB;IACzB,MAAM,QAAQ,GAAG,YAAY,EAAE,CAAC;IAChC,OAAO,OAAO,CAAC,GAAG,CAAC,0BAA0B;QAC3C,CAAC,CAAC,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,0BAA0B,EAAE,EAAE,CAAC;QACtD,CAAC,CAAC,CAAC,QAAQ,CAAC,eAAe,IAAI,OAAO,CAAC,CAAC;AAC5C,CAAC;AAoBD,SAAS,QAAQ,CAAC,IAAa,EAAE,MAAe;IAC9C,IAAI,CAAC;QACF,IAA4C,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC7D,CAAC;IAAC,MAAM,CAAC,CAAA,CAAC;AACZ,CAAC;AAED,KAAK,UAAU,eAAe,CAAI,MAAc,EAAE,IAAe;IAC/D,MAAM,iBAAiB,GAAG,kBAAkB,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,SAAS,EAAE,kBAAkB,CAAC,CAAC;IACvD,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IAE/C,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC;IAC1C,SAAS,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IACvC,MAAM,EAAE,GAAG,UAAU,EAAE,CAAC;IACxB,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;IACnD,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IAErD,aAAa,CAAC,SAAS,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;IAEzC,MAAM,SAAS,GAAI,UAAsC,CAAC,GAAoB,CAAC;IAE/E,IAAI,IAAmB,CAAC;IACxB,IAAI,CAAC;QACH,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAE,SAAS,EAAE,UAAU,CAAC,EAAE;YAC5E,MAAM,EAAE,QAAQ;YAChB,MAAM,EAAE,MAAM;SACf,CAAC,CAAC;IACL,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC;YAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACvC,MAAM,IAAI,KAAK,CAAC,+BAAgC,CAAW,CAAC,OAAO,EAAE,CAAC,CAAC;IACzE,CAAC;IAED,IAAI,SAAS,GAAyC,IAAI,CAAC;IAC3D,IAAI,SAAS,GAAyC,IAAI,CAAC;IAC3D,IAAI,eAAe,GAAG,KAAK,CAAC;IAE5B,MAAM,OAAO,GAAG,KAAK,IAAI,EAAE;QACzB,IAAI,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QACvC,IAAI,CAAC;YAAC,UAAU,CAAC,SAAS,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;QACvC,IAAI,CAAC;YAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAAC,CAAC;QAAC,MAAM,CAAC,CAAA,CAAC;IAC1C,CAAC,CAAC;IAEF,IAAI,CAAC;QACH,MAAM,cAAc,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;YACtD,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC1B,eAAe,GAAG,IAAI,CAAC;gBACvB,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;gBAC1B,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;oBAC1B,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,CAAC;oBAC1B,MAAM,CAAC,IAAI,KAAK,CACd,eAAe,MAAM,qBAAqB,iBAAiB,gBAAgB,CAC5E,CAAC,CAAC;gBACL,CAAC,EAAE,gBAAgB,CAAC,CAAC;YACvB,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;QAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC,CAAC;QAEnE,IAAI,SAAS;YAAE,YAAY,CAAC,SAAS,CAAC,CAAC;QAEvC,IAAI,eAAe,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACvC,MAAM,IAAI,KAAK,CACb,eAAe,MAAM,yBAAyB,IAAI,CAAC,UAAU,IAAI,SAAS,GAAG,CAC9E,CAAC;QACJ,CAAC;QAED,IAAI,QAAQ,KAAK,CAAC,EAAE,CAAC;YACnB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACxC,IAAI,QAAQ,GAAG,4BAA4B,QAAQ,EAAE,CAAC;YACtD,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC;oBACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;oBAClC,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;wBACjB,QAAQ,GAAG,MAAM,CAAC,KAAK,CAAC;oBAC1B,CAAC;yBAAM,CAAC;wBACN,QAAQ,GAAG,MAAM,CAAC;oBACpB,CAAC;gBACH,CAAC;gBAAC,MAAM,CAAC;oBACP,kEAAkE;oBAClE,wEAAwE;oBACxE,QAAQ,GAAG,MAAM,CAAC;gBACpB,CAAC;YACH,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,aAAa,QAAQ,EAAE,CAAC,CAAC;QAChE,CAAC;QAED,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,eAAe,MAAM,+BAA+B,CAAC,CAAC;QACxE,CAAC;QAED,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,YAAY,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;YACjD,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAM,CAAC;QACjC,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,sCAAuC,CAAW,CAAC,OAAO,EAAE,CAC7D,CAAC;QACJ,CAAC;IACH,CAAC;YAAS,CAAC;QACT,MAAM,OAAO,EAAE,CAAC;IAClB,CAAC;AACH,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,sBAAsB,CAAC,OAA0B;IACrE,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,aAAa,GAA4B;QAC7C,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;IAEF,OAAO,eAAe,CAAiB,mBAAmB,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;AAC/E,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAAwB;IAChE,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,aAAa,GAAgC;QACjD,OAAO,EAAE,SAAS;QAClB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;IAEF,OAAO,eAAe,CAAc,gBAAgB,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;AACzE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,0BAA0B,CAAC,OAAwB;IACvE,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,aAAa,GAAgC;QACjD,OAAO,EAAE,SAAS;QAClB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;IAEF,OAAO,eAAe,CAAgB,uBAAuB,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;AAClF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,OAAwB;IAC/D,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,aAAa,GAAgC;QACjD,OAAO,EAAE,SAAS;QAClB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAoB,eAAe,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IAC1F,OAAO,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAYD,MAAM,CAAC,KAAK,UAAU,2BAA2B,CAAC,OAAwB;IACxE,IAAI,CAAC,iBAAiB,EAAE,EAAE,CAAC;QACzB,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;IACrE,CAAC;IAED,MAAM,aAAa,GAAgC;QACjD,OAAO,EAAE,SAAS;QAClB,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,aAAa,EAAE,OAAO,CAAC,aAAa;QACpC,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,IAAI,EAAE,OAAO,CAAC,IAAI;QAClB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,OAAO,EAAE,OAAO,CAAC,OAAO;KACzB,CAAC;IAEF,MAAM,MAAM,GAAG,MAAM,eAAe,CAAuB,wBAAwB,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC;IACtG,OAAO;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,KAAK,EAAE,gBAAgB,CAAC,MAAM,CAAC,KAAK,CAAC;KACtC,CAAC;AACJ,CAAC"}
@@ -1,28 +0,0 @@
1
- /**
2
- * Unified message types for session parsers (matches Rust UnifiedMessage)
3
- */
4
- export interface TokenBreakdown {
5
- input: number;
6
- output: number;
7
- cacheRead: number;
8
- cacheWrite: number;
9
- reasoning: number;
10
- }
11
- export interface UnifiedMessage {
12
- source: string;
13
- modelId: string;
14
- providerId: string;
15
- sessionId: string;
16
- timestamp: number;
17
- date: string;
18
- tokens: TokenBreakdown;
19
- cost: number;
20
- agent?: string;
21
- }
22
- export type SourceType = "opencode" | "claude" | "codex" | "gemini" | "cursor" | "amp" | "droid" | "openclaw" | "pi";
23
- /**
24
- * Convert Unix milliseconds timestamp to YYYY-MM-DD date string
25
- */
26
- export declare function timestampToDate(timestampMs: number): string;
27
- export declare function createUnifiedMessage(source: string, modelId: string, providerId: string, sessionId: string, timestamp: number, tokens: TokenBreakdown, cost?: number, agent?: string): UnifiedMessage;
28
- //# sourceMappingURL=types.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,cAAc,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,MAAM,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,OAAO,GAAG,QAAQ,GAAG,QAAQ,GAAG,KAAK,GAAG,OAAO,GAAG,UAAU,GAAG,IAAI,CAAC;AAErH;;GAEG;AACH,wBAAgB,eAAe,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,MAAM,EACd,OAAO,EAAE,MAAM,EACf,UAAU,EAAE,MAAM,EAClB,SAAS,EAAE,MAAM,EACjB,SAAS,EAAE,MAAM,EACjB,MAAM,EAAE,cAAc,EACtB,IAAI,GAAE,MAAU,EAChB,KAAK,CAAC,EAAE,MAAM,GACb,cAAc,CAYhB"}
@@ -1,27 +0,0 @@
1
- /**
2
- * Unified message types for session parsers (matches Rust UnifiedMessage)
3
- */
4
- /**
5
- * Convert Unix milliseconds timestamp to YYYY-MM-DD date string
6
- */
7
- export function timestampToDate(timestampMs) {
8
- const date = new Date(timestampMs);
9
- const year = date.getUTCFullYear();
10
- const month = String(date.getUTCMonth() + 1).padStart(2, "0");
11
- const day = String(date.getUTCDate()).padStart(2, "0");
12
- return `${year}-${month}-${day}`;
13
- }
14
- export function createUnifiedMessage(source, modelId, providerId, sessionId, timestamp, tokens, cost = 0, agent) {
15
- return {
16
- source,
17
- modelId,
18
- providerId,
19
- sessionId,
20
- timestamp,
21
- date: timestampToDate(timestamp),
22
- tokens,
23
- cost,
24
- agent,
25
- };
26
- }
27
- //# sourceMappingURL=types.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/sessions/types.ts"],"names":[],"mappings":"AAAA;;GAEG;AAwBH;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,WAAmB;IACjD,MAAM,IAAI,GAAG,IAAI,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,EAAE,CAAC;IACnC,MAAM,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAC9D,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACvD,OAAO,GAAG,IAAI,IAAI,KAAK,IAAI,GAAG,EAAE,CAAC;AACnC,CAAC;AAED,MAAM,UAAU,oBAAoB,CAClC,MAAc,EACd,OAAe,EACf,UAAkB,EAClB,SAAiB,EACjB,SAAiB,EACjB,MAAsB,EACtB,OAAe,CAAC,EAChB,KAAc;IAEd,OAAO;QACL,MAAM;QACN,OAAO;QACP,UAAU;QACV,SAAS;QACT,SAAS;QACT,IAAI,EAAE,eAAe,CAAC,SAAS,CAAC;QAChC,MAAM;QACN,IAAI;QACJ,KAAK;KACN,CAAC;AACJ,CAAC"}
package/dist/spinner.d.ts DELETED
@@ -1,75 +0,0 @@
1
- /**
2
- * OpenCode-style Knight Rider Spinner
3
- * Accurate port from: https://github.com/sst/opencode/blob/dev/packages/opencode/src/cli/cmd/tui/ui/spinner.ts
4
- *
5
- * Features:
6
- * - Bidirectional sweep (left→right→left)
7
- * - Hold frames at each end (pause effect)
8
- * - Color gradient trail using ANSI 256 colors
9
- * - Same characters as OpenCode: ■ (active) / ⬝ (inactive)
10
- */
11
- type ColorName = "cyan" | "green" | "magenta" | "yellow" | "red" | "blue" | "white";
12
- interface SpinnerOptions {
13
- /** Width of the spinner in characters (default: 8) */
14
- width?: number;
15
- /** Frames to hold at start position (default: 30) */
16
- holdStart?: number;
17
- /** Frames to hold at end position (default: 9) */
18
- holdEnd?: number;
19
- /** Trail length - number of colored blocks behind lead (default: 4) */
20
- trailLength?: number;
21
- /** Color theme (default: "cyan") */
22
- color?: ColorName;
23
- /** Frame interval in ms (default: 40) */
24
- interval?: number;
25
- }
26
- export declare class Spinner {
27
- private intervalId;
28
- private frameIndex;
29
- private width;
30
- private holdStart;
31
- private holdEnd;
32
- private trailLength;
33
- private gradient;
34
- private interval;
35
- private message;
36
- private totalFrames;
37
- constructor(options?: SpinnerOptions);
38
- /**
39
- * Start the spinner with a message
40
- */
41
- start(message: string): void;
42
- /**
43
- * Update the spinner message while running
44
- */
45
- update(message: string): void;
46
- /**
47
- * Stop the spinner and show a success message
48
- */
49
- success(message: string): void;
50
- /**
51
- * Stop the spinner and show an error message
52
- */
53
- error(message: string): void;
54
- /**
55
- * Stop the spinner without a message
56
- */
57
- stop(): void;
58
- /**
59
- * Check if spinner is currently running
60
- */
61
- isSpinning(): boolean;
62
- }
63
- /**
64
- * Create a spinner with default OpenCode settings
65
- */
66
- export declare function createSpinner(options?: SpinnerOptions): Spinner;
67
- /**
68
- * Run an async function with a spinner
69
- */
70
- export declare function withSpinner<T>(message: string, fn: () => Promise<T>, options?: SpinnerOptions & {
71
- successMessage?: string;
72
- errorMessage?: string;
73
- }): Promise<T>;
74
- export {};
75
- //# sourceMappingURL=spinner.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spinner.d.ts","sourceRoot":"","sources":["../src/spinner.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAoBH,KAAK,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,GAAG,QAAQ,GAAG,KAAK,GAAG,MAAM,GAAG,OAAO,CAAC;AAmBpF,UAAU,cAAc;IACtB,sDAAsD;IACtD,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,qDAAqD;IACrD,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,kDAAkD;IAClD,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,uEAAuE;IACvE,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,oCAAoC;IACpC,KAAK,CAAC,EAAE,SAAS,CAAC;IAClB,yCAAyC;IACzC,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAkGD,qBAAa,OAAO;IAClB,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,UAAU,CAAK;IACvB,OAAO,CAAC,KAAK,CAAS;IACtB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,QAAQ,CAAW;IAC3B,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,OAAO,CAAc;IAC7B,OAAO,CAAC,WAAW,CAAS;gBAEhB,OAAO,GAAE,cAAmB;IAaxC;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAsB5B;;OAEG;IACH,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAI7B;;OAEG;IACH,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK9B;;OAEG;IACH,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;IAK5B;;OAEG;IACH,IAAI,IAAI,IAAI;IASZ;;OAEG;IACH,UAAU,IAAI,OAAO;CAGtB;AAMD;;GAEG;AACH,wBAAgB,aAAa,CAAC,OAAO,CAAC,EAAE,cAAc,GAAG,OAAO,CAE/D;AAED;;GAEG;AACH,wBAAsB,WAAW,CAAC,CAAC,EACjC,OAAO,EAAE,MAAM,EACf,EAAE,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACpB,OAAO,CAAC,EAAE,cAAc,GAAG;IAAE,cAAc,CAAC,EAAE,MAAM,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAA;CAAE,GAC5E,OAAO,CAAC,CAAC,CAAC,CAYZ"}
package/dist/spinner.js DELETED
@@ -1,203 +0,0 @@
1
- /**
2
- * OpenCode-style Knight Rider Spinner
3
- * Accurate port from: https://github.com/sst/opencode/blob/dev/packages/opencode/src/cli/cmd/tui/ui/spinner.ts
4
- *
5
- * Features:
6
- * - Bidirectional sweep (left→right→left)
7
- * - Hold frames at each end (pause effect)
8
- * - Color gradient trail using ANSI 256 colors
9
- * - Same characters as OpenCode: ■ (active) / ⬝ (inactive)
10
- */
11
- // =============================================================================
12
- // ANSI Color Helpers
13
- // =============================================================================
14
- function ansi256Fg(code) {
15
- return `\x1b[38;5;${code}m`;
16
- }
17
- const RESET = "\x1b[0m";
18
- const HIDE_CURSOR = "\x1B[?25l";
19
- const SHOW_CURSOR = "\x1B[?25h";
20
- const CLEAR_LINE = "\r\x1B[K";
21
- const COLOR_GRADIENTS = {
22
- // Bright → dim (6 steps for trail)
23
- cyan: [51, 44, 37, 30, 23, 17],
24
- green: [46, 40, 34, 28, 22, 22],
25
- magenta: [201, 165, 129, 93, 57, 53],
26
- yellow: [226, 220, 214, 178, 136, 94],
27
- red: [196, 160, 124, 88, 52, 52],
28
- blue: [33, 27, 21, 18, 17, 17],
29
- white: [255, 250, 245, 240, 236, 232],
30
- };
31
- const INACTIVE_COLOR = 240; // Gray for ⬝
32
- /**
33
- * Calculate scanner state for a given frame index
34
- * Matches OpenCode's getScannerState() exactly
35
- */
36
- function getScannerState(frameIndex, width, holdStart, holdEnd) {
37
- const forwardFrames = width;
38
- const backwardFrames = width - 1;
39
- const totalCycle = forwardFrames + holdEnd + backwardFrames + holdStart;
40
- // Normalize frame index to cycle
41
- const normalizedFrame = frameIndex % totalCycle;
42
- if (normalizedFrame < forwardFrames) {
43
- // Phase 1: Moving forward (0 → width-1)
44
- return {
45
- activePosition: normalizedFrame,
46
- isMovingForward: true,
47
- };
48
- }
49
- else if (normalizedFrame < forwardFrames + holdEnd) {
50
- // Phase 2: Holding at end
51
- return {
52
- activePosition: width - 1,
53
- isMovingForward: true,
54
- };
55
- }
56
- else if (normalizedFrame < forwardFrames + holdEnd + backwardFrames) {
57
- // Phase 3: Moving backward (width-2 → 0)
58
- const backwardIndex = normalizedFrame - forwardFrames - holdEnd;
59
- return {
60
- activePosition: width - 2 - backwardIndex,
61
- isMovingForward: false,
62
- };
63
- }
64
- else {
65
- // Phase 4: Holding at start
66
- return {
67
- activePosition: 0,
68
- isMovingForward: false,
69
- };
70
- }
71
- }
72
- /**
73
- * Generate a single frame string with colors
74
- */
75
- function generateColoredFrame(frameIndex, width, holdStart, holdEnd, trailLength, gradient) {
76
- const state = getScannerState(frameIndex, width, holdStart, holdEnd);
77
- const { activePosition, isMovingForward } = state;
78
- let result = "";
79
- for (let i = 0; i < width; i++) {
80
- // Calculate directional distance (positive = trailing behind)
81
- const directionalDistance = isMovingForward
82
- ? activePosition - i // Forward: trail is to the left
83
- : i - activePosition; // Backward: trail is to the right
84
- if (directionalDistance >= 0 && directionalDistance < trailLength) {
85
- // Active position with color gradient
86
- const colorIdx = Math.min(directionalDistance, gradient.length - 1);
87
- result += ansi256Fg(gradient[colorIdx]) + "■" + RESET;
88
- }
89
- else {
90
- // Inactive position
91
- result += ansi256Fg(INACTIVE_COLOR) + "⬝" + RESET;
92
- }
93
- }
94
- return result;
95
- }
96
- /**
97
- * Calculate total frames in one complete cycle
98
- */
99
- function getTotalFrames(width, holdStart, holdEnd) {
100
- return width + holdEnd + (width - 1) + holdStart;
101
- }
102
- // =============================================================================
103
- // Spinner Class
104
- // =============================================================================
105
- export class Spinner {
106
- intervalId = null;
107
- frameIndex = 0;
108
- width;
109
- holdStart;
110
- holdEnd;
111
- trailLength;
112
- gradient;
113
- interval;
114
- message = "";
115
- totalFrames;
116
- constructor(options = {}) {
117
- this.width = options.width ?? 8;
118
- this.holdStart = options.holdStart ?? 30;
119
- this.holdEnd = options.holdEnd ?? 9;
120
- this.trailLength = options.trailLength ?? 4;
121
- this.interval = options.interval ?? 40;
122
- const colorName = options.color ?? "cyan";
123
- this.gradient = COLOR_GRADIENTS[colorName] || COLOR_GRADIENTS.cyan;
124
- this.totalFrames = getTotalFrames(this.width, this.holdStart, this.holdEnd);
125
- }
126
- /**
127
- * Start the spinner with a message
128
- */
129
- start(message) {
130
- this.message = message;
131
- this.frameIndex = 0;
132
- // Hide cursor
133
- process.stdout.write(HIDE_CURSOR);
134
- this.intervalId = setInterval(() => {
135
- const frame = generateColoredFrame(this.frameIndex, this.width, this.holdStart, this.holdEnd, this.trailLength, this.gradient);
136
- process.stdout.write(`${CLEAR_LINE} ${frame} ${this.message}`);
137
- this.frameIndex = (this.frameIndex + 1) % this.totalFrames;
138
- }, this.interval);
139
- }
140
- /**
141
- * Update the spinner message while running
142
- */
143
- update(message) {
144
- this.message = message;
145
- }
146
- /**
147
- * Stop the spinner and show a success message
148
- */
149
- success(message) {
150
- this.stop();
151
- console.log(` \x1b[32m✓\x1b[0m ${message}`);
152
- }
153
- /**
154
- * Stop the spinner and show an error message
155
- */
156
- error(message) {
157
- this.stop();
158
- console.log(` \x1b[31m✗\x1b[0m ${message}`);
159
- }
160
- /**
161
- * Stop the spinner without a message
162
- */
163
- stop() {
164
- if (this.intervalId) {
165
- clearInterval(this.intervalId);
166
- this.intervalId = null;
167
- }
168
- process.stdout.write(CLEAR_LINE);
169
- process.stdout.write(SHOW_CURSOR);
170
- }
171
- /**
172
- * Check if spinner is currently running
173
- */
174
- isSpinning() {
175
- return this.intervalId !== null;
176
- }
177
- }
178
- // =============================================================================
179
- // Convenience Functions
180
- // =============================================================================
181
- /**
182
- * Create a spinner with default OpenCode settings
183
- */
184
- export function createSpinner(options) {
185
- return new Spinner(options);
186
- }
187
- /**
188
- * Run an async function with a spinner
189
- */
190
- export async function withSpinner(message, fn, options) {
191
- const spinner = new Spinner(options);
192
- spinner.start(message);
193
- try {
194
- const result = await fn();
195
- spinner.success(options?.successMessage ?? message);
196
- return result;
197
- }
198
- catch (error) {
199
- spinner.error(options?.errorMessage ?? `Failed: ${message}`);
200
- throw error;
201
- }
202
- }
203
- //# sourceMappingURL=spinner.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"spinner.js","sourceRoot":"","sources":["../src/spinner.ts"],"names":[],"mappings":"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"}