@tokscale/cli 1.4.3 → 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 -1550
  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 -106
  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 -23
  47. package/dist/submit.d.ts.map +0 -1
  48. package/dist/submit.js +0 -294
  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 -333
  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 -468
  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 -26
  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 -71
  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 -719
  149. package/dist/wrapped.js.map +0 -1
  150. package/src/auth.ts +0 -211
  151. package/src/cli.ts +0 -1892
  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 -633
  159. package/src/sessions/types.ts +0 -59
  160. package/src/spinner.ts +0 -283
  161. package/src/submit.ts +0 -360
  162. package/src/table.ts +0 -233
  163. package/src/tui/App.tsx +0 -453
  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 -380
  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 -558
  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 -173
  183. package/src/tui/utils/cleanup.ts +0 -65
  184. package/src/tui/utils/colors.ts +0 -78
  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 -848
@@ -1,166 +0,0 @@
1
- declare module "@opentui/solid/preload" {
2
- const preload: void;
3
- export default preload;
4
- }
5
-
6
- declare module "@opentui/core" {
7
- export interface CliRendererConfig {
8
- exitOnCtrlC?: boolean;
9
- targetFps?: number;
10
- backgroundColor?: string;
11
- useAlternateScreen?: boolean;
12
- useMouse?: boolean;
13
- gatherStats?: boolean;
14
- useKittyKeyboard?: Record<string, unknown> | null;
15
- }
16
-
17
- export interface CliRenderer {
18
- root: {
19
- add: (renderable: unknown) => void;
20
- };
21
- start: () => void;
22
- stop: () => void;
23
- destroy: () => void;
24
- console: {
25
- show: () => void;
26
- };
27
- }
28
-
29
- export function createCliRenderer(config?: CliRendererConfig): Promise<CliRenderer>;
30
-
31
- export interface KeyEvent {
32
- name: string;
33
- eventType: "press" | "release";
34
- repeated?: boolean;
35
- ctrl?: boolean;
36
- meta?: boolean;
37
- shift?: boolean;
38
- super?: boolean;
39
- }
40
- }
41
-
42
- declare module "@opentui/solid" {
43
- import type { Accessor, JSX as SolidJSX } from "solid-js";
44
- import type { CliRendererConfig, CliRenderer, KeyEvent } from "@opentui/core";
45
-
46
- export function render(
47
- node: () => SolidJSX.Element,
48
- config?: CliRendererConfig
49
- ): Promise<void>;
50
-
51
- export function useKeyboard(
52
- handler: (key: KeyEvent) => void,
53
- options?: { release?: boolean }
54
- ): void;
55
-
56
- export function useTerminalDimensions(): Accessor<{
57
- width: number;
58
- height: number;
59
- }>;
60
-
61
- export function useRenderer(): CliRenderer;
62
-
63
- export function useOnResize(callback: (width: number, height: number) => void): void;
64
- }
65
-
66
- // OpenTUI element types for JSX
67
- // Using `any` for children due to JSX.Element type mismatch between solid-js and solid-js/h/jsx-runtime
68
- type OpenTUIChildren = any;
69
-
70
- interface OpenTUIMouseEvent {
71
- x: number;
72
- y: number;
73
- button: number;
74
- type: "down" | "up" | "move" | "drag" | "scroll";
75
- }
76
-
77
- interface OpenTUIMouseEventHandlers {
78
- onMouse?: (event: OpenTUIMouseEvent) => void;
79
- onMouseDown?: (event: OpenTUIMouseEvent) => void;
80
- onMouseUp?: (event: OpenTUIMouseEvent) => void;
81
- onMouseMove?: (event: OpenTUIMouseEvent) => void;
82
- onMouseDrag?: (event: OpenTUIMouseEvent) => void;
83
- onMouseOver?: (event: OpenTUIMouseEvent) => void;
84
- onMouseOut?: (event: OpenTUIMouseEvent) => void;
85
- onMouseScroll?: (event: OpenTUIMouseEvent) => void;
86
- }
87
-
88
- interface OpenTUIBoxProps extends OpenTUIMouseEventHandlers {
89
- flexDirection?: "row" | "column";
90
- flexGrow?: number;
91
- flexShrink?: number;
92
- flexWrap?: "wrap" | "nowrap";
93
- justifyContent?: "flex-start" | "flex-end" | "center" | "space-between" | "space-around" | "space-evenly";
94
- alignItems?: "flex-start" | "flex-end" | "center" | "stretch" | "baseline";
95
- alignSelf?: "auto" | "flex-start" | "flex-end" | "center" | "stretch" | "baseline";
96
- gap?: number;
97
- width?: number | string;
98
- height?: number | string;
99
- minWidth?: number | string;
100
- minHeight?: number | string;
101
- maxWidth?: number | string;
102
- maxHeight?: number | string;
103
- padding?: number;
104
- paddingX?: number;
105
- paddingY?: number;
106
- paddingTop?: number;
107
- paddingRight?: number;
108
- paddingBottom?: number;
109
- paddingLeft?: number;
110
- margin?: number;
111
- marginTop?: number;
112
- marginRight?: number;
113
- marginBottom?: number;
114
- marginLeft?: number;
115
- position?: "relative" | "absolute";
116
- top?: number;
117
- right?: number;
118
- bottom?: number;
119
- left?: number;
120
- backgroundColor?: string;
121
- borderStyle?: "single" | "double" | "round" | "bold" | "singleDouble" | "doubleSingle" | "classic";
122
- borderColor?: string;
123
- borderTop?: boolean;
124
- borderRight?: boolean;
125
- borderBottom?: boolean;
126
- borderLeft?: boolean;
127
- overflow?: "visible" | "hidden" | "scroll";
128
- children?: OpenTUIChildren;
129
- }
130
-
131
- interface OpenTUITextProps extends OpenTUIMouseEventHandlers {
132
- fg?: string;
133
- bg?: string;
134
- backgroundColor?: string;
135
- bold?: boolean;
136
- dim?: boolean;
137
- italic?: boolean;
138
- underline?: boolean;
139
- strikethrough?: boolean;
140
- inverse?: boolean;
141
- wrap?: "wrap" | "truncate" | "truncate-start" | "truncate-middle" | "truncate-end";
142
- children?: OpenTUIChildren;
143
- }
144
-
145
- interface OpenTUISpanProps extends OpenTUIMouseEventHandlers {
146
- fg?: string;
147
- bg?: string;
148
- bold?: boolean;
149
- dim?: boolean;
150
- italic?: boolean;
151
- underline?: boolean;
152
- strikethrough?: boolean;
153
- inverse?: boolean;
154
- children?: OpenTUIChildren;
155
- }
156
-
157
- // Module augmentation for solid-js/h/jsx-runtime
158
- declare module "solid-js/h/jsx-runtime" {
159
- namespace JSX {
160
- interface IntrinsicElements {
161
- box: OpenTUIBoxProps;
162
- text: OpenTUITextProps;
163
- span: OpenTUISpanProps;
164
- }
165
- }
166
- }
@@ -1,173 +0,0 @@
1
- import type { ColorPaletteName } from "../config/themes.js";
2
-
3
- export type TabType = "overview" | "model" | "daily" | "stats";
4
- export type SortType = "cost" | "tokens" | "date";
5
- export type SourceType = "opencode" | "claude" | "codex" | "cursor" | "gemini" | "amp" | "droid" | "openclaw" | "pi" | "kimi";
6
-
7
- export type { ColorPaletteName };
8
-
9
- export interface ModelEntry {
10
- source: string;
11
- model: string;
12
- input: number;
13
- output: number;
14
- cacheWrite: number;
15
- cacheRead: number;
16
- reasoning: number;
17
- total: number;
18
- cost: number;
19
- }
20
-
21
- export interface DailyEntry {
22
- date: string;
23
- input: number;
24
- output: number;
25
- cacheRead: number;
26
- cacheWrite: number;
27
- total: number;
28
- cost: number;
29
- }
30
-
31
- export interface ContributionDay {
32
- date: string;
33
- cost: number;
34
- tokens: number;
35
- level: number;
36
- }
37
-
38
- export interface GridCell {
39
- date: string | null;
40
- level: number;
41
- }
42
-
43
- export interface TotalBreakdown {
44
- input: number;
45
- output: number;
46
- cacheWrite: number;
47
- cacheRead: number;
48
- reasoning: number;
49
- total: number;
50
- cost: number;
51
- }
52
-
53
- export interface Stats {
54
- favoriteModel: string;
55
- totalTokens: number;
56
- sessions: number;
57
- longestSession: string;
58
- currentStreak: number;
59
- longestStreak: number;
60
- activeDays: number;
61
- totalDays: number;
62
- peakHour: string;
63
- }
64
-
65
- export interface ModelWithPercentage {
66
- modelId: string;
67
- percentage: number;
68
- inputTokens: number;
69
- outputTokens: number;
70
- cacheReadTokens: number;
71
- cacheWriteTokens: number;
72
- totalTokens: number;
73
- cost: number;
74
- }
75
-
76
- export interface ChartModelData {
77
- modelId: string;
78
- tokens: number;
79
- color: string;
80
- }
81
-
82
- export interface ChartDataPoint {
83
- date: string;
84
- models: ChartModelData[];
85
- total: number;
86
- }
87
-
88
- export interface TUIData {
89
- modelEntries: ModelEntry[];
90
- dailyEntries: DailyEntry[];
91
- contributions: ContributionDay[];
92
- contributionGrid: GridCell[][];
93
- stats: Stats;
94
- totalCost: number;
95
- totals: TotalBreakdown;
96
- modelCount: number;
97
- chartData: ChartDataPoint[];
98
- topModels: ModelWithPercentage[];
99
- dailyBreakdowns: Map<string, DailyModelBreakdown>;
100
- }
101
-
102
- export interface TUISettings {
103
- colorPalette: string;
104
- }
105
-
106
- export type LoadingPhase =
107
- | "idle"
108
- | "parsing-sources"
109
- | "loading-pricing"
110
- | "finalizing-report"
111
- | "complete";
112
-
113
- export interface DailyModelBreakdown {
114
- date: string;
115
- cost: number;
116
- totalTokens: number;
117
- models: Array<{
118
- modelId: string;
119
- source: string;
120
- tokens: {
121
- input: number;
122
- output: number;
123
- cacheRead: number;
124
- cacheWrite: number;
125
- reasoning: number;
126
- };
127
- cost: number;
128
- messages: number;
129
- }>;
130
- }
131
-
132
- export interface TUIOptions {
133
- initialTab?: TabType;
134
- enabledSources?: SourceType[];
135
- sortBy?: SortType;
136
- sortDesc?: boolean;
137
- since?: string;
138
- until?: string;
139
- year?: string;
140
- sinceTs?: number;
141
- untilTs?: number;
142
- colorPalette?: ColorPaletteName;
143
- }
144
-
145
-
146
-
147
- export const LAYOUT = {
148
- HEADER_HEIGHT: 1,
149
- FOOTER_HEIGHT: 3,
150
- MIN_CONTENT_HEIGHT: 12,
151
- CHART_HEIGHT_RATIO: 0.35,
152
- MIN_CHART_HEIGHT: 5,
153
- MIN_LIST_HEIGHT: 4,
154
- CHART_AXIS_WIDTH: 8,
155
- MIN_CHART_WIDTH: 20,
156
- MAX_VISIBLE_BARS: 52,
157
- } as const;
158
-
159
- export const SOURCE_LABELS: Record<SourceType, string> = {
160
- opencode: "OC",
161
- claude: "CC",
162
- codex: "CX",
163
- cursor: "CR",
164
- gemini: "GM",
165
- amp: "AM",
166
- droid: "DR",
167
- openclaw: "CL",
168
- pi: "PI",
169
- kimi: "KM",
170
- } as const;
171
-
172
- export const TABS: readonly TabType[] = ["overview", "model", "daily", "stats"] as const;
173
- export const ALL_SOURCES: readonly SourceType[] = ["opencode", "claude", "codex", "cursor", "gemini", "amp", "droid", "openclaw", "pi", "kimi"] as const;
@@ -1,65 +0,0 @@
1
- /**
2
- * Terminal cleanup utility for restoring terminal state when TUI exits.
3
- * Provides fallback cleanup for crash scenarios where OpenTUI's destroy() may not run.
4
- */
5
-
6
- /**
7
- * Complete terminal state restoration sequences.
8
- * Based on research from xterm, kitty keyboard protocol, and popular TUI libraries.
9
- */
10
- export const TERMINAL_CLEANUP_SEQUENCES = [
11
- // Disable all mouse tracking modes
12
- '\x1b[?1016l', // SGR Pixel Mode
13
- '\x1b[?1015l', // URXVT Mouse
14
- '\x1b[?1006l', // SGR Mouse (produces "51;77;17M" sequences)
15
- '\x1b[?1005l', // UTF-8 Mouse
16
- '\x1b[?1004l', // Focus Events
17
- '\x1b[?1003l', // Any Event Mouse (motion tracking)
18
- '\x1b[?1002l', // Button Event Mouse (drag tracking)
19
- '\x1b[?1001l', // Highlight Mouse
20
- '\x1b[?1000l', // VT200 Mouse
21
- '\x1b[?9l', // X10 Mouse
22
-
23
- // Disable kitty keyboard protocol (produces "9;5u" sequences)
24
- '\x1b[<u', // Disable kitty keyboard progressive enhancement
25
- '\x1b[>4;0m', // Disable modifyOtherKeys (xterm)
26
-
27
- // Disable synchronized updates
28
- '\x1b[?2026l',
29
-
30
- // Restore cursor and attributes
31
- '\x1b[?25h', // Show cursor (DECTCEM)
32
- '\x1b[0m', // Reset all text attributes (SGR 0)
33
-
34
- // Exit alternate screen buffer
35
- '\x1b[?1049l', // Exit alt screen + restore cursor
36
- '\x1b[?47l', // Legacy: exit alt screen
37
- '\x1b[?1047l', // Legacy: another alt screen mode
38
- ].join('');
39
-
40
- let hasCleanedUp = false;
41
-
42
- /**
43
- * Write terminal restoration sequences to stdout.
44
- * Idempotent - safe to call multiple times.
45
- *
46
- * This is a FALLBACK for crash scenarios. Normal exit should use
47
- * renderer.destroy() which handles cleanup properly.
48
- */
49
- export function restoreTerminalState(): void {
50
- if (hasCleanedUp) return;
51
- hasCleanedUp = true;
52
-
53
- try {
54
- process.stdout.write(TERMINAL_CLEANUP_SEQUENCES);
55
- } catch {
56
- // Ignore write errors (stdout may be closed)
57
- }
58
- }
59
-
60
- /**
61
- * Reset cleanup state (for testing purposes).
62
- */
63
- export function resetCleanupState(): void {
64
- hasCleanedUp = false;
65
- }
@@ -1,78 +0,0 @@
1
- import type { SourceType } from "../types/index.js";
2
-
3
- export const PROVIDER_COLORS = {
4
- anthropic: "#FF6B35",
5
- openai: "#10B981",
6
- google: "#3B82F6",
7
- cursor: "#8B5CF6",
8
- opencode: "#6B7280",
9
- deepseek: "#06B6D4",
10
- xai: "#EAB308",
11
- meta: "#6366F1",
12
- unknown: "#FFFFFF",
13
- } as const;
14
-
15
- export type ProviderType = keyof typeof PROVIDER_COLORS;
16
-
17
- const PROVIDER_PATTERNS: readonly [RegExp, ProviderType][] = [
18
- [/claude|sonnet|opus|haiku/i, "anthropic"],
19
- [/gpt|^o1|^o3|codex|text-embedding|dall-e|whisper|tts/i, "openai"],
20
- [/gemini/i, "google"],
21
- [/deepseek/i, "deepseek"],
22
- [/grok/i, "xai"],
23
- [/llama|mixtral/i, "meta"],
24
- [/^auto$|cursor/i, "cursor"],
25
- ] as const;
26
-
27
- const providerCache = new Map<string, ProviderType>();
28
- const colorCache = new Map<string, string>();
29
-
30
- export function getProviderFromModel(modelId: string): ProviderType {
31
- const cached = providerCache.get(modelId);
32
- if (cached) return cached;
33
-
34
- let provider: ProviderType = "unknown";
35
- for (const [pattern, type] of PROVIDER_PATTERNS) {
36
- if (pattern.test(modelId)) {
37
- provider = type;
38
- break;
39
- }
40
- }
41
-
42
- providerCache.set(modelId, provider);
43
- return provider;
44
- }
45
-
46
- export function getModelColor(modelId: string): string {
47
- const cached = colorCache.get(modelId);
48
- if (cached) return cached;
49
-
50
- const color = PROVIDER_COLORS[getProviderFromModel(modelId)];
51
- colorCache.set(modelId, color);
52
- return color;
53
- }
54
-
55
- export const SOURCE_COLORS: Record<SourceType, string> = {
56
- opencode: "#22c55e",
57
- claude: "#f97316",
58
- codex: "#3b82f6",
59
- cursor: "#a855f7",
60
- gemini: "#06b6d4",
61
- amp: "#EC4899",
62
- droid: "#10b981",
63
- openclaw: "#ef4444",
64
- pi: "#fb923c",
65
- kimi: "#8B5CF6",
66
- };
67
-
68
- export function getSourceColor(source: SourceType | string): string {
69
- return SOURCE_COLORS[source as SourceType] || "#888888";
70
- }
71
-
72
- export function getSourceDisplayName(source: string): string {
73
- if (source === "droid") return "Droid";
74
- if (source === "openclaw") return "OpenClaw";
75
- if (source === "pi") return "Pi";
76
- if (source === "kimi") return "Kimi";
77
- return source.charAt(0).toUpperCase() + source.slice(1);
78
- }
@@ -1,36 +0,0 @@
1
- export function formatTokens(n: number): string {
2
- if (!Number.isFinite(n) || n < 0) return "0";
3
- return n.toLocaleString();
4
- }
5
-
6
- export function formatTokensShort(n: number): string {
7
- if (!Number.isFinite(n) || n < 0) return "0";
8
- if (n >= 1_000_000_000) return `${(n / 1_000_000_000).toFixed(1)}B`;
9
- if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;
10
- if (n >= 1_000) return `${(n / 1_000).toFixed(1)}K`;
11
- return n.toLocaleString();
12
- }
13
-
14
- export function formatTokensCompact(n: number): string {
15
- if (!Number.isFinite(n) || n < 0) return "0";
16
- if (n >= 1_000_000_000) return `${(n / 1_000_000_000).toFixed(1)}B`;
17
- if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`;
18
- if (n >= 1_000) return `${(n / 1_000).toFixed(0)}K`;
19
- return n.toLocaleString();
20
- }
21
-
22
- export function formatCost(cost: number): string {
23
- if (!Number.isFinite(cost) || cost < 0) return "$0.00";
24
- if (cost >= 1000) return `$${(cost / 1000).toFixed(1)}K`;
25
- return `$${cost.toFixed(2)}`;
26
- }
27
-
28
- export function formatCostFull(cost: number): string {
29
- if (!Number.isFinite(cost) || cost < 0) return "$0.00";
30
- return `$${cost.toFixed(2)}`;
31
- }
32
-
33
- export function formatPercentage(value: number): string {
34
- if (!Number.isFinite(value)) return "0.0%";
35
- return `${value.toFixed(1)}%`;
36
- }
@@ -1,8 +0,0 @@
1
- export const NARROW_TERMINAL_WIDTH = 80;
2
- export const VERY_NARROW_TERMINAL_WIDTH = 60;
3
-
4
- export const isNarrow = (width: number | undefined): boolean =>
5
- (width ?? 100) < NARROW_TERMINAL_WIDTH;
6
-
7
- export const isVeryNarrow = (width: number | undefined): boolean =>
8
- (width ?? 100) < VERY_NARROW_TERMINAL_WIDTH;
package/src/types.d.ts DELETED
@@ -1,28 +0,0 @@
1
- declare module "string-width" {
2
- export default function stringWidth(str: string): number;
3
- }
4
-
5
- declare module "./tui-bundle.js" {
6
- import type { TUIOptions } from "./tui/types/index.js";
7
- export function launchTUI(options?: TUIOptions): Promise<void>;
8
- export type { TUIOptions };
9
- }
10
-
11
- declare module "bun" {
12
- export interface BunSubprocess {
13
- stdin: any;
14
- stdout: any;
15
- stderr: any;
16
- exited: Promise<number>;
17
- kill(signal?: string): void;
18
- }
19
-
20
- export function spawn(options: {
21
- cmd: string[];
22
- stdin?: "pipe";
23
- stdout?: "pipe";
24
- stderr?: "pipe";
25
- timeout?: number;
26
- killSignal?: string;
27
- }): BunSubprocess;
28
- }