lumira 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 (71) hide show
  1. package/README.md +165 -0
  2. package/dist/config.d.ts +3 -0
  3. package/dist/config.js +42 -0
  4. package/dist/config.js.map +1 -0
  5. package/dist/index.d.ts +3 -0
  6. package/dist/index.js +56 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/installer.d.ts +7 -0
  9. package/dist/installer.js +105 -0
  10. package/dist/installer.js.map +1 -0
  11. package/dist/parsers/git.d.ts +5 -0
  12. package/dist/parsers/git.js +31 -0
  13. package/dist/parsers/git.js.map +1 -0
  14. package/dist/parsers/gsd.d.ts +2 -0
  15. package/dist/parsers/gsd.js +37 -0
  16. package/dist/parsers/gsd.js.map +1 -0
  17. package/dist/parsers/memory.d.ts +2 -0
  18. package/dist/parsers/memory.js +28 -0
  19. package/dist/parsers/memory.js.map +1 -0
  20. package/dist/parsers/token-speed.d.ts +9 -0
  21. package/dist/parsers/token-speed.js +21 -0
  22. package/dist/parsers/token-speed.js.map +1 -0
  23. package/dist/parsers/transcript.d.ts +4 -0
  24. package/dist/parsers/transcript.js +148 -0
  25. package/dist/parsers/transcript.js.map +1 -0
  26. package/dist/render/colors.d.ts +20 -0
  27. package/dist/render/colors.js +59 -0
  28. package/dist/render/colors.js.map +1 -0
  29. package/dist/render/icons.d.ts +19 -0
  30. package/dist/render/icons.js +20 -0
  31. package/dist/render/icons.js.map +1 -0
  32. package/dist/render/index.d.ts +2 -0
  33. package/dist/render/index.js +27 -0
  34. package/dist/render/index.js.map +1 -0
  35. package/dist/render/line1.d.ts +3 -0
  36. package/dist/render/line1.js +89 -0
  37. package/dist/render/line1.js.map +1 -0
  38. package/dist/render/line2.d.ts +3 -0
  39. package/dist/render/line2.js +108 -0
  40. package/dist/render/line2.js.map +1 -0
  41. package/dist/render/line3.d.ts +3 -0
  42. package/dist/render/line3.js +60 -0
  43. package/dist/render/line3.js.map +1 -0
  44. package/dist/render/line4.d.ts +3 -0
  45. package/dist/render/line4.js +17 -0
  46. package/dist/render/line4.js.map +1 -0
  47. package/dist/render/minimal.d.ts +3 -0
  48. package/dist/render/minimal.js +120 -0
  49. package/dist/render/minimal.js.map +1 -0
  50. package/dist/render/text.d.ts +5 -0
  51. package/dist/render/text.js +70 -0
  52. package/dist/render/text.js.map +1 -0
  53. package/dist/stdin.d.ts +3 -0
  54. package/dist/stdin.js +40 -0
  55. package/dist/stdin.js.map +1 -0
  56. package/dist/types.d.ts +152 -0
  57. package/dist/types.js +45 -0
  58. package/dist/types.js.map +1 -0
  59. package/dist/utils/cache.d.ts +8 -0
  60. package/dist/utils/cache.js +48 -0
  61. package/dist/utils/cache.js.map +1 -0
  62. package/dist/utils/exec.d.ts +5 -0
  63. package/dist/utils/exec.js +14 -0
  64. package/dist/utils/exec.js.map +1 -0
  65. package/dist/utils/format.d.ts +4 -0
  66. package/dist/utils/format.js +36 -0
  67. package/dist/utils/format.js.map +1 -0
  68. package/dist/utils/terminal.d.ts +2 -0
  69. package/dist/utils/terminal.js +53 -0
  70. package/dist/utils/terminal.js.map +1 -0
  71. package/package.json +46 -0
@@ -0,0 +1,148 @@
1
+ import { createReadStream, existsSync } from 'node:fs';
2
+ import { createInterface } from 'node:readline';
3
+ import { resolve } from 'node:path';
4
+ import { homedir, tmpdir } from 'node:os';
5
+ import { EMPTY_TRANSCRIPT } from '../types.js';
6
+ import { isMtimeFresh, getMtimeState } from '../utils/cache.js';
7
+ let cachedResult = null;
8
+ let cachedMtime = null;
9
+ let cachedPath = null;
10
+ const MAX_LINES = 50_000;
11
+ export function normalizeTodoStatus(status) {
12
+ if (!status)
13
+ return 'pending';
14
+ const s = String(status).toLowerCase();
15
+ if (s === 'completed' || s === 'done')
16
+ return 'completed';
17
+ if (s === 'in_progress' || s === 'in-progress' || s === 'running')
18
+ return 'in_progress';
19
+ return 'pending';
20
+ }
21
+ export function extractToolTarget(toolName, input) {
22
+ if (!input)
23
+ return undefined;
24
+ switch (toolName) {
25
+ case 'Read':
26
+ case 'Write':
27
+ case 'Edit':
28
+ return (input.file_path ?? input.path);
29
+ case 'Glob':
30
+ case 'Grep':
31
+ return input.pattern;
32
+ case 'Bash': {
33
+ const cmd = input.command || '';
34
+ return cmd.length > 30 ? cmd.slice(0, 30) + '...' : cmd;
35
+ }
36
+ default: return undefined;
37
+ }
38
+ }
39
+ export async function parseTranscript(transcriptPath) {
40
+ const result = { ...EMPTY_TRANSCRIPT, tools: [], agents: [], todos: [] };
41
+ if (!transcriptPath || !existsSync(transcriptPath))
42
+ return result;
43
+ const resolved = resolve(transcriptPath);
44
+ if (!resolved.startsWith(homedir()) && !resolved.startsWith(tmpdir()))
45
+ return result;
46
+ const currentMtime = getMtimeState(transcriptPath);
47
+ if (currentMtime && cachedPath === transcriptPath && cachedMtime && isMtimeFresh(transcriptPath, cachedMtime) && cachedResult) {
48
+ return cachedResult;
49
+ }
50
+ const toolMap = new Map();
51
+ const agentMap = new Map();
52
+ let todos = [];
53
+ const taskIdToIndex = new Map();
54
+ let thinkingEffort = '';
55
+ let fileStream = null;
56
+ try {
57
+ fileStream = createReadStream(transcriptPath);
58
+ const rl = createInterface({ input: fileStream, crlfDelay: Infinity });
59
+ let lineCount = 0;
60
+ for await (const line of rl) {
61
+ if (!line.trim())
62
+ continue;
63
+ if (++lineCount > MAX_LINES)
64
+ break;
65
+ try {
66
+ const entry = JSON.parse(line);
67
+ if (!result.sessionStart && entry.timestamp)
68
+ result.sessionStart = new Date(entry.timestamp);
69
+ const effortMatch = line.match(/Set model to .+ with (low|medium|high|max) effort/);
70
+ if (effortMatch)
71
+ thinkingEffort = effortMatch[1];
72
+ const timestamp = entry.timestamp ? new Date(entry.timestamp) : new Date();
73
+ const content = entry.message?.content;
74
+ if (!content || !Array.isArray(content))
75
+ continue;
76
+ for (const block of content) {
77
+ if (block.type === 'tool_use' && block.id && block.name) {
78
+ toolMap.set(block.id, { id: block.id, name: block.name, target: extractToolTarget(block.name, block.input), status: 'running', startTime: timestamp });
79
+ if (block.name === 'Task') {
80
+ const inp = block.input || {};
81
+ agentMap.set(block.id, { id: block.id, type: inp.subagent_type || 'unknown', model: inp.model, description: inp.description, status: 'running', startTime: timestamp });
82
+ }
83
+ if (block.name === 'TodoWrite' && block.input?.todos && Array.isArray(block.input.todos)) {
84
+ const existingById = new Map(todos.map(t => [t.id || t.content, t]));
85
+ todos = block.input.todos.map((t) => {
86
+ const id = t.id || t.content || '';
87
+ const existing = existingById.get(id);
88
+ if (existing && (!t.status || t.status === existing.status))
89
+ return existing;
90
+ return { id: t.id || '', content: t.content || '', status: normalizeTodoStatus(t.status) };
91
+ });
92
+ }
93
+ if (block.name === 'TaskCreate') {
94
+ const inp = block.input || {};
95
+ const todoContent = (typeof inp.subject === 'string' ? inp.subject : '') || (typeof inp.description === 'string' ? inp.description : '') || 'Untitled task';
96
+ todos.push({ id: inp.taskId || block.id, content: todoContent, status: normalizeTodoStatus(inp.status) });
97
+ if (inp.taskId || block.id)
98
+ taskIdToIndex.set(String(inp.taskId || block.id), todos.length - 1);
99
+ }
100
+ if (block.name === 'TaskUpdate') {
101
+ const inp = block.input || {};
102
+ let index = inp.taskId && taskIdToIndex.has(String(inp.taskId)) ? taskIdToIndex.get(String(inp.taskId)) : null;
103
+ if (index === null && typeof inp.taskId === 'string' && /^\d+$/.test(inp.taskId)) {
104
+ const n = parseInt(inp.taskId, 10) - 1;
105
+ if (n >= 0 && n < todos.length)
106
+ index = n;
107
+ }
108
+ if (index !== null && todos[index]) {
109
+ if (inp.status)
110
+ todos[index].status = normalizeTodoStatus(inp.status);
111
+ const subj = typeof inp.subject === 'string' ? inp.subject : '';
112
+ const desc = typeof inp.description === 'string' ? inp.description : '';
113
+ if (subj || desc)
114
+ todos[index].content = subj || desc;
115
+ }
116
+ }
117
+ }
118
+ if (block.type === 'tool_result' && block.tool_use_id) {
119
+ const tool = toolMap.get(block.tool_use_id);
120
+ if (tool) {
121
+ tool.status = block.is_error ? 'error' : 'completed';
122
+ tool.endTime = timestamp;
123
+ }
124
+ const agent = agentMap.get(block.tool_use_id);
125
+ if (agent) {
126
+ agent.status = 'completed';
127
+ agent.endTime = timestamp;
128
+ }
129
+ }
130
+ }
131
+ }
132
+ catch { /* skip malformed */ }
133
+ }
134
+ }
135
+ catch { /* partial results */ }
136
+ finally {
137
+ fileStream?.destroy();
138
+ }
139
+ result.tools = Array.from(toolMap.values()).slice(-20);
140
+ result.agents = Array.from(agentMap.values()).slice(-10);
141
+ result.todos = todos;
142
+ result.thinkingEffort = thinkingEffort;
143
+ cachedResult = result;
144
+ cachedMtime = currentMtime;
145
+ cachedPath = transcriptPath;
146
+ return result;
147
+ }
148
+ //# sourceMappingURL=transcript.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/parsers/transcript.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ export type ColorMode = 'named' | '256' | 'truecolor';
2
+ export type ColorName = 'cyan' | 'magenta' | 'yellow' | 'green' | 'orange' | 'red' | 'blinkRed' | 'gray' | 'brightBlue' | 'dim' | 'bold';
3
+ export interface Colors {
4
+ cyan: (s: string) => string;
5
+ magenta: (s: string) => string;
6
+ yellow: (s: string) => string;
7
+ green: (s: string) => string;
8
+ orange: (s: string) => string;
9
+ red: (s: string) => string;
10
+ blinkRed: (s: string) => string;
11
+ gray: (s: string) => string;
12
+ brightBlue: (s: string) => string;
13
+ dim: (s: string) => string;
14
+ bold: (s: string) => string;
15
+ }
16
+ export declare function createColors(mode: ColorMode): Colors;
17
+ export declare function stripAnsi(str: string): string;
18
+ export declare function detectColorMode(): ColorMode;
19
+ export declare function getContextColor(pct: number): ColorName;
20
+ export declare function getQuotaColor(pct: number): ColorName;
@@ -0,0 +1,59 @@
1
+ const RST = '\x1b[0m';
2
+ export function createColors(mode) {
3
+ const wrap = (code) => (s) => `${code}${s}${RST}`;
4
+ // Named ANSI colors as default — respects terminal theme (like the original JS).
5
+ // Only orange uses 256-color (no named ANSI equivalent).
6
+ // Truecolor/256 modes available for users who override via config.
7
+ const named = {
8
+ cyan: wrap('\x1b[36m'), magenta: wrap('\x1b[35m'),
9
+ yellow: wrap('\x1b[33m'), green: wrap('\x1b[32m'),
10
+ orange: wrap('\x1b[38;5;208m'), red: wrap('\x1b[31m'),
11
+ blinkRed: wrap('\x1b[5;31m'), gray: wrap('\x1b[90m'),
12
+ brightBlue: wrap('\x1b[94m'), dim: wrap('\x1b[2m'), bold: wrap('\x1b[1m'),
13
+ };
14
+ if (mode === 'truecolor') {
15
+ return {
16
+ ...named,
17
+ cyan: wrap('\x1b[38;2;0;255;255m'), magenta: wrap('\x1b[38;2;255;0;255m'),
18
+ yellow: wrap('\x1b[38;2;255;255;0m'), green: wrap('\x1b[38;2;0;255;0m'),
19
+ orange: wrap('\x1b[38;2;255;165;0m'),
20
+ brightBlue: wrap('\x1b[38;2;100;149;237m'),
21
+ };
22
+ }
23
+ if (mode === '256') {
24
+ return {
25
+ ...named,
26
+ cyan: wrap('\x1b[38;5;51m'), magenta: wrap('\x1b[38;5;201m'),
27
+ yellow: wrap('\x1b[38;5;226m'), green: wrap('\x1b[38;5;46m'),
28
+ brightBlue: wrap('\x1b[38;5;111m'),
29
+ };
30
+ }
31
+ return named;
32
+ }
33
+ export function stripAnsi(str) {
34
+ return str.replace(/\x1b\[\??[0-9;]*[a-zA-Z]|\x1b\][^\x07]*\x07|\x1b[()][AB012]/g, '');
35
+ }
36
+ export function detectColorMode() {
37
+ // Default to named ANSI — respects terminal theme colors.
38
+ // Only upgrade if user explicitly sets colors.mode in config.
39
+ return 'named';
40
+ }
41
+ export function getContextColor(pct) {
42
+ if (pct < 50)
43
+ return 'green';
44
+ if (pct < 65)
45
+ return 'yellow';
46
+ if (pct < 80)
47
+ return 'orange';
48
+ return 'blinkRed';
49
+ }
50
+ export function getQuotaColor(pct) {
51
+ if (pct < 50)
52
+ return 'green';
53
+ if (pct < 70)
54
+ return 'yellow';
55
+ if (pct < 85)
56
+ return 'orange';
57
+ return 'blinkRed';
58
+ }
59
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/render/colors.ts"],"names":[],"mappings":"AAGA,MAAM,GAAG,GAAG,SAAS,CAAC;AAgBtB,MAAM,UAAU,YAAY,CAAC,IAAe;IAC1C,MAAM,IAAI,GAAG,CAAC,IAAY,EAAE,EAAE,CAAC,CAAC,CAAS,EAAE,EAAE,CAAC,GAAG,IAAI,GAAG,CAAC,GAAG,GAAG,EAAE,CAAC;IAElE,iFAAiF;IACjF,yDAAyD;IACzD,mEAAmE;IACnE,MAAM,KAAK,GAAW;QACpB,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,UAAU,CAAC;QACjD,MAAM,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;QACjD,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,UAAU,CAAC;QACrD,QAAQ,EAAE,IAAI,CAAC,YAAY,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,UAAU,CAAC;QACpD,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;KAC1E,CAAC;IAEF,IAAI,IAAI,KAAK,WAAW,EAAE,CAAC;QACzB,OAAO;YACL,GAAG,KAAK;YACR,IAAI,EAAE,IAAI,CAAC,sBAAsB,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,sBAAsB,CAAC;YACzE,MAAM,EAAE,IAAI,CAAC,sBAAsB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,oBAAoB,CAAC;YACvE,MAAM,EAAE,IAAI,CAAC,sBAAsB,CAAC;YACpC,UAAU,EAAE,IAAI,CAAC,wBAAwB,CAAC;SAC3C,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,KAAK,KAAK,EAAE,CAAC;QACnB,OAAO;YACL,GAAG,KAAK;YACR,IAAI,EAAE,IAAI,CAAC,eAAe,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,gBAAgB,CAAC;YAC5D,MAAM,EAAE,IAAI,CAAC,gBAAgB,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,eAAe,CAAC;YAC5D,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC;SACnC,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,GAAW;IACnC,OAAO,GAAG,CAAC,OAAO,CAAC,8DAA8D,EAAE,EAAE,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,eAAe;IAC7B,0DAA0D;IAC1D,8DAA8D;IAC9D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,OAAO,CAAC;IAC7B,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,UAAU,CAAC;AACpB,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,OAAO,CAAC;IAC7B,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,GAAG,GAAG,EAAE;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,UAAU,CAAC;AACpB,CAAC"}
@@ -0,0 +1,19 @@
1
+ export declare const ICONS: {
2
+ readonly model: "";
3
+ readonly branch: "";
4
+ readonly folder: "";
5
+ readonly fire: "";
6
+ readonly skull: "";
7
+ readonly comment: "";
8
+ readonly clock: "";
9
+ readonly bolt: "";
10
+ readonly tree: "";
11
+ readonly cubes: "";
12
+ readonly hammer: "";
13
+ readonly warning: "";
14
+ readonly barFull: "█";
15
+ readonly barEmpty: "░";
16
+ readonly ellipsis: "…";
17
+ readonly dash: "—";
18
+ readonly checkmark: "✓";
19
+ };
@@ -0,0 +1,20 @@
1
+ export const ICONS = {
2
+ model: '\uEE0D', // fa-robot
3
+ branch: '\uE725', // dev-git-branch
4
+ folder: '\uF07C', // fa-folder-open
5
+ fire: '\uF06D', // fa-fire (context 65-79%)
6
+ skull: '\uEE15', // fa-skull (context >=80%)
7
+ comment: '\uF075', // fa-comment (tokens)
8
+ clock: '\uF017', // fa-clock (duration)
9
+ bolt: '\uF0E7', // fa-bolt (token speed, rate limits)
10
+ tree: '\uF1BB', // fa-tree (worktree)
11
+ cubes: '\uF1B3', // fa-cubes (agent)
12
+ hammer: '\uEEFF', // fa-hammer (GSD task)
13
+ warning: '\uF071', // fa-warning (GSD update)
14
+ barFull: '\u2588', // block full
15
+ barEmpty: '\u2591', // block light
16
+ ellipsis: '\u2026', // ...
17
+ dash: '\u2014', // em-dash
18
+ checkmark: '\u2713', // checkmark
19
+ };
20
+ //# sourceMappingURL=icons.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"icons.js","sourceRoot":"","sources":["../../src/render/icons.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,KAAK,EAAK,QAAQ,EAAG,WAAW;IAChC,MAAM,EAAI,QAAQ,EAAG,iBAAiB;IACtC,MAAM,EAAI,QAAQ,EAAG,iBAAiB;IACtC,IAAI,EAAM,QAAQ,EAAG,2BAA2B;IAChD,KAAK,EAAK,QAAQ,EAAG,2BAA2B;IAChD,OAAO,EAAG,QAAQ,EAAG,sBAAsB;IAC3C,KAAK,EAAK,QAAQ,EAAG,sBAAsB;IAC3C,IAAI,EAAM,QAAQ,EAAG,qCAAqC;IAC1D,IAAI,EAAM,QAAQ,EAAG,qBAAqB;IAC1C,KAAK,EAAK,QAAQ,EAAG,mBAAmB;IACxC,MAAM,EAAI,QAAQ,EAAG,uBAAuB;IAC5C,OAAO,EAAG,QAAQ,EAAG,0BAA0B;IAC/C,OAAO,EAAG,QAAQ,EAAG,aAAa;IAClC,QAAQ,EAAE,QAAQ,EAAG,cAAc;IACnC,QAAQ,EAAE,QAAQ,EAAG,MAAM;IAC3B,IAAI,EAAM,QAAQ,EAAG,UAAU;IAC/B,SAAS,EAAE,QAAQ,EAAE,YAAY;CACzB,CAAC"}
@@ -0,0 +1,2 @@
1
+ import type { RenderContext } from '../types.js';
2
+ export declare function render(ctx: RenderContext): string;
@@ -0,0 +1,27 @@
1
+ import { createColors, detectColorMode } from './colors.js';
2
+ import { renderLine1 } from './line1.js';
3
+ import { renderLine2 } from './line2.js';
4
+ import { renderLine3 } from './line3.js';
5
+ import { renderLine4 } from './line4.js';
6
+ import { renderMinimal } from './minimal.js';
7
+ export function render(ctx) {
8
+ const { input, git, transcript, tokenSpeed, memory, gsd, cols, config } = ctx;
9
+ const colorMode = config.colors.mode === 'auto' ? detectColorMode() : config.colors.mode;
10
+ const c = createColors(colorMode);
11
+ if (config.layout === 'minimal' || (config.layout === 'auto' && cols < 70)) {
12
+ return renderMinimal(input, git, transcript, tokenSpeed, gsd, c, config.display, cols);
13
+ }
14
+ const lines = [];
15
+ lines.push(renderLine1(input, git, transcript, c, config.display, cols));
16
+ lines.push(renderLine2(input, tokenSpeed, transcript.thinkingEffort, c, config.display, cols, memory));
17
+ const l3 = renderLine3(transcript.tools, transcript.todos, c);
18
+ if (l3)
19
+ lines.push(l3);
20
+ if (config.gsd) {
21
+ const l4 = renderLine4(gsd, c);
22
+ if (l4)
23
+ lines.push(l4);
24
+ }
25
+ return lines.filter(Boolean).join('\n');
26
+ }
27
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/render/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,eAAe,EAAkB,MAAM,aAAa,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AACzC,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAG7C,MAAM,UAAU,MAAM,CAAC,GAAkB;IACvC,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,GAAG,CAAC;IAC9E,MAAM,SAAS,GAAc,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;IACpG,MAAM,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC;IAElC,IAAI,MAAM,CAAC,MAAM,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,MAAM,IAAI,IAAI,GAAG,EAAE,CAAC,EAAE,CAAC;QAC3E,OAAO,aAAa,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACzF,CAAC;IAED,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IACzE,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,UAAU,EAAE,UAAU,CAAC,cAAc,EAAE,CAAC,EAAE,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACvG,MAAM,EAAE,GAAG,WAAW,CAAC,UAAU,CAAC,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAC9D,IAAI,EAAE;QAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACvB,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QAAC,MAAM,EAAE,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAAC,IAAI,EAAE;YAAE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;IAC3E,OAAO,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1C,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Colors } from './colors.js';
2
+ import type { ClaudeCodeInput, GitStatus, TranscriptData, DisplayToggles } from '../types.js';
3
+ export declare function renderLine1(input: ClaudeCodeInput, git: GitStatus, transcript: TranscriptData, c: Colors, display: DisplayToggles, cols: number): string;
@@ -0,0 +1,89 @@
1
+ import { basename } from 'node:path';
2
+ import { ICONS } from './icons.js';
3
+ import { fitSegments, truncField } from './text.js';
4
+ const SEP = ` \x1b[90m│\x1b[0m `;
5
+ function getModelName(model) {
6
+ if (typeof model === 'string')
7
+ return model;
8
+ if (model && typeof model === 'object' && 'display_name' in model)
9
+ return model.display_name;
10
+ return '';
11
+ }
12
+ function getActiveTodo(transcript) {
13
+ const inProgress = transcript.todos.filter(t => t.status === 'in_progress');
14
+ return inProgress[0]?.content;
15
+ }
16
+ export function renderLine1(input, git, transcript, c, display, cols) {
17
+ const left = [];
18
+ const right = [];
19
+ // Model
20
+ if (display.model) {
21
+ const modelName = getModelName(input.model);
22
+ if (modelName)
23
+ left.push(c.cyan(`${ICONS.model} ${modelName}`));
24
+ }
25
+ // Branch + git changes
26
+ if (display.branch && git.branch) {
27
+ const branchLen = cols < 60 ? 12 : cols < 80 ? 20 : cols < 100 ? 30 : cols < 120 ? 40 : 60;
28
+ const branchName = truncField(git.branch, branchLen);
29
+ let branchStr = c.magenta(`${ICONS.branch} ${branchName}`);
30
+ if (display.gitChanges) {
31
+ const parts = [];
32
+ if (git.staged > 0)
33
+ parts.push(c.green(`+${git.staged}`));
34
+ if (git.modified > 0)
35
+ parts.push(c.yellow(`!${git.modified}`));
36
+ if (git.untracked > 0)
37
+ parts.push(c.gray(`?${git.untracked}`));
38
+ if (parts.length > 0)
39
+ branchStr += ' ' + parts.join(' ');
40
+ }
41
+ left.push(branchStr);
42
+ }
43
+ // Directory
44
+ if (display.directory) {
45
+ const cwd = input.cwd || input.workspace?.current_dir || '';
46
+ if (cwd) {
47
+ const dirName = basename(cwd) || cwd;
48
+ const dirLen = cols < 80 ? 12 : cols < 120 ? 20 : 30;
49
+ left.push(c.brightBlue(`${ICONS.folder} ${truncField(dirName, dirLen)}`));
50
+ }
51
+ }
52
+ // Lines changed (right side)
53
+ if (display.linesChanged && input.cost) {
54
+ const added = input.cost.total_lines_added ?? 0;
55
+ const removed = input.cost.total_lines_removed ?? 0;
56
+ if (added > 0 || removed > 0) {
57
+ right.push(`${c.green(`+${added}`)} ${c.red(`-${removed}`)}`);
58
+ }
59
+ }
60
+ // Active task from todos
61
+ const activeTask = getActiveTodo(transcript);
62
+ if (activeTask) {
63
+ right.push(c.yellow(truncField(activeTask, 30)));
64
+ }
65
+ // Worktree
66
+ if (display.worktree && input.worktree?.name) {
67
+ right.push(c.gray(`${ICONS.tree} ${truncField(input.worktree.name, 15)}`));
68
+ }
69
+ // Agent
70
+ if (display.agent && input.agent?.name) {
71
+ right.push(c.gray(`${ICONS.cubes} ${truncField(input.agent.name, 15)}`));
72
+ }
73
+ // Session name
74
+ if (display.sessionName && input.session_name) {
75
+ right.push(c.dim(truncField(input.session_name, 20)));
76
+ }
77
+ // Style
78
+ if (display.style && input.output_style?.name) {
79
+ right.push(c.gray(input.output_style.name));
80
+ }
81
+ // Version
82
+ if (display.version && input.version) {
83
+ right.push(c.dim(`v${input.version}`));
84
+ }
85
+ if (left.length === 0 && right.length === 0)
86
+ return '';
87
+ return fitSegments(left, right, SEP, cols);
88
+ }
89
+ //# sourceMappingURL=line1.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line1.js","sourceRoot":"","sources":["../../src/render/line1.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { type Colors } from './colors.js';
2
+ import type { ClaudeCodeInput, DisplayToggles, ThinkingEffort, MemoryInfo } from '../types.js';
3
+ export declare function renderLine2(input: ClaudeCodeInput, tokenSpeed: number | null, thinkingEffort: ThinkingEffort, c: Colors, display: DisplayToggles, cols: number, memory?: MemoryInfo | null): string;
@@ -0,0 +1,108 @@
1
+ import { ICONS } from './icons.js';
2
+ import { padLine } from './text.js';
3
+ import { getContextColor, getQuotaColor } from './colors.js';
4
+ import { formatTokens, formatDuration, formatCost, formatBurnRate } from '../utils/format.js';
5
+ const SEP = ` \x1b[90m│\x1b[0m `;
6
+ function buildContextBar(pct, c) {
7
+ const SEGMENTS = 20;
8
+ const filled = Math.round((pct / 100) * SEGMENTS);
9
+ const colorFn = c[getContextColor(pct)];
10
+ const bar = colorFn(ICONS.barFull.repeat(filled)) + c.dim(ICONS.barEmpty.repeat(SEGMENTS - filled));
11
+ let icon = '';
12
+ if (pct >= 80)
13
+ icon = c.blinkRed(ICONS.skull);
14
+ else if (pct >= 65)
15
+ icon = c.orange(ICONS.fire);
16
+ const pctStr = colorFn(`${pct < 10 ? pct.toFixed(1) : pct.toFixed(0)}%`);
17
+ return `[${bar}] ${pctStr}${icon ? ' ' + icon : ''}`;
18
+ }
19
+ function formatCountdown(resetsAt) {
20
+ const diffMs = resetsAt - Date.now();
21
+ if (diffMs <= 0)
22
+ return '';
23
+ const totalSec = Math.floor(diffMs / 1000);
24
+ const h = Math.floor(totalSec / 3600);
25
+ const m = Math.floor((totalSec % 3600) / 60);
26
+ const s = totalSec % 60;
27
+ if (h > 0)
28
+ return `${h}h${String(m).padStart(2, '0')}m`;
29
+ if (m > 0)
30
+ return `${m}m${String(s).padStart(2, '0')}s`;
31
+ return `${s}s`;
32
+ }
33
+ export function renderLine2(input, tokenSpeed, thinkingEffort, c, display, cols, memory = null) {
34
+ const leftParts = [];
35
+ const rightParts = [];
36
+ // Context bar
37
+ if (display.contextBar) {
38
+ const pct = input.context_window.used_percentage;
39
+ leftParts.push(buildContextBar(pct, c));
40
+ }
41
+ // Tokens
42
+ if (display.tokens) {
43
+ const inTokens = input.context_window.total_input_tokens;
44
+ const outTokens = input.context_window.total_output_tokens;
45
+ const parts = [];
46
+ if (inTokens != null)
47
+ parts.push(`${formatTokens(inTokens)}↑`);
48
+ if (outTokens != null)
49
+ parts.push(`${formatTokens(outTokens)}↓`);
50
+ if (parts.length > 0)
51
+ leftParts.push(`${ICONS.comment} ${parts.join(' ')}`);
52
+ }
53
+ // Cost + burn rate
54
+ if (display.cost && input.cost) {
55
+ const costStr = formatCost(input.cost.total_cost_usd);
56
+ let costPart = costStr;
57
+ if (display.burnRate) {
58
+ const burn = formatBurnRate(input.cost.total_cost_usd, input.cost.total_duration_ms);
59
+ if (burn)
60
+ costPart += ` ${c.dim(burn)}`;
61
+ }
62
+ leftParts.push(costPart);
63
+ }
64
+ // Duration
65
+ if (display.duration && input.cost) {
66
+ leftParts.push(`${ICONS.clock} ${formatDuration(input.cost.total_duration_ms)}`);
67
+ }
68
+ // Memory
69
+ if (display.memory && memory) {
70
+ leftParts.push(c.dim(`${memory.percentage}% mem`));
71
+ }
72
+ // Token speed
73
+ if (display.tokenSpeed && tokenSpeed != null) {
74
+ leftParts.push(c.dim(`${ICONS.bolt}${tokenSpeed} tok/s`));
75
+ }
76
+ // Rate limits (only show if >=50%)
77
+ if (display.rateLimits && input.rate_limits) {
78
+ const limits = [
79
+ ['5h', input.rate_limits.five_hour],
80
+ ['7d', input.rate_limits.seven_day],
81
+ ];
82
+ for (const [label, win] of limits) {
83
+ if (!win || win.used_percentage < 50)
84
+ continue;
85
+ const colorFn = c[getQuotaColor(win.used_percentage)];
86
+ let limitStr = colorFn(`${ICONS.bolt} ${win.used_percentage.toFixed(0)}%(${label})`);
87
+ if (win.used_percentage >= 70 && win.resets_at) {
88
+ const countdown = formatCountdown(win.resets_at);
89
+ if (countdown)
90
+ limitStr += c.dim(` ${countdown}`);
91
+ }
92
+ leftParts.push(limitStr);
93
+ }
94
+ }
95
+ // Right side: vim mode
96
+ if (display.vim && input.vim?.mode) {
97
+ rightParts.push(c.dim(`[${input.vim.mode}]`));
98
+ }
99
+ // Right side: effort (hidden if medium)
100
+ if (display.effort && thinkingEffort && thinkingEffort !== 'medium') {
101
+ rightParts.push(c.dim(`^${thinkingEffort}`));
102
+ }
103
+ const leftStr = leftParts.join(SEP);
104
+ if (rightParts.length === 0)
105
+ return leftStr;
106
+ return padLine(leftStr, rightParts.join(' '), cols);
107
+ }
108
+ //# sourceMappingURL=line2.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line2.js","sourceRoot":"","sources":["../../src/render/line2.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Colors } from './colors.js';
2
+ import type { ToolEntry, TodoEntry } from '../types.js';
3
+ export declare function renderLine3(tools: ToolEntry[], todos: TodoEntry[], c: Colors): string;
@@ -0,0 +1,60 @@
1
+ import { ICONS } from './icons.js';
2
+ import { truncField } from './text.js';
3
+ const EXCLUDED_TOOLS = new Set(['TodoWrite', 'TaskCreate', 'TaskUpdate']);
4
+ const SEP_GRAY = ` \x1b[90m│\x1b[0m `;
5
+ function buildToolsPart(tools, c) {
6
+ const relevant = tools.filter(t => !EXCLUDED_TOOLS.has(t.name));
7
+ if (relevant.length === 0)
8
+ return '';
9
+ const parts = [];
10
+ // Running tools (last 2)
11
+ const running = relevant.filter(t => t.status === 'running').slice(-2);
12
+ for (const tool of running) {
13
+ const target = tool.target ? `: ${truncField(tool.target, 20)}` : '';
14
+ parts.push(c.yellow(`◐ ${tool.name}${target}`));
15
+ }
16
+ // Completed tools grouped by name (top 4 groups)
17
+ const completed = relevant.filter(t => t.status === 'completed');
18
+ const groups = new Map();
19
+ for (const tool of completed) {
20
+ groups.set(tool.name, (groups.get(tool.name) ?? 0) + 1);
21
+ }
22
+ const topGroups = Array.from(groups.entries())
23
+ .sort((a, b) => b[1] - a[1])
24
+ .slice(0, 4);
25
+ for (const [name, count] of topGroups) {
26
+ const countStr = count > 1 ? ` ×${count}` : '';
27
+ parts.push(c.dim(`${ICONS.checkmark} ${name}${countStr}`));
28
+ }
29
+ return parts.join(' ');
30
+ }
31
+ function buildTodosPart(todos, c) {
32
+ if (todos.length === 0)
33
+ return '';
34
+ const total = todos.length;
35
+ const completed = todos.filter(t => t.status === 'completed').length;
36
+ const inProgress = todos.filter(t => t.status === 'in_progress').length;
37
+ const pending = todos.filter(t => t.status === 'pending').length;
38
+ // Progress bar (10 segments)
39
+ const SEGMENTS = 10;
40
+ const filledCount = Math.round((completed / total) * SEGMENTS);
41
+ const bar = c.green(ICONS.barFull.repeat(filledCount)) + c.dim(ICONS.barEmpty.repeat(SEGMENTS - filledCount));
42
+ let str = `${bar} ${completed}/${total}`;
43
+ if (inProgress > 0)
44
+ str += ` ${c.yellow(`◐ ${inProgress}`)}`;
45
+ if (pending > 0)
46
+ str += ` ${c.dim(`○ ${pending}`)}`;
47
+ return str;
48
+ }
49
+ export function renderLine3(tools, todos, c) {
50
+ const toolsPart = buildToolsPart(tools, c);
51
+ const todosPart = buildTodosPart(todos, c);
52
+ if (!toolsPart && !todosPart)
53
+ return '';
54
+ if (!toolsPart)
55
+ return todosPart;
56
+ if (!todosPart)
57
+ return toolsPart;
58
+ return toolsPart + SEP_GRAY + todosPart;
59
+ }
60
+ //# sourceMappingURL=line3.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"line3.js","sourceRoot":"","sources":["../../src/render/line3.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { Colors } from './colors.js';
2
+ import type { GsdInfo } from '../types.js';
3
+ export declare function renderLine4(gsd: GsdInfo | null, c: Colors): string;