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.
- package/README.md +165 -0
- package/dist/config.d.ts +3 -0
- package/dist/config.js +42 -0
- package/dist/config.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.js +56 -0
- package/dist/index.js.map +1 -0
- package/dist/installer.d.ts +7 -0
- package/dist/installer.js +105 -0
- package/dist/installer.js.map +1 -0
- package/dist/parsers/git.d.ts +5 -0
- package/dist/parsers/git.js +31 -0
- package/dist/parsers/git.js.map +1 -0
- package/dist/parsers/gsd.d.ts +2 -0
- package/dist/parsers/gsd.js +37 -0
- package/dist/parsers/gsd.js.map +1 -0
- package/dist/parsers/memory.d.ts +2 -0
- package/dist/parsers/memory.js +28 -0
- package/dist/parsers/memory.js.map +1 -0
- package/dist/parsers/token-speed.d.ts +9 -0
- package/dist/parsers/token-speed.js +21 -0
- package/dist/parsers/token-speed.js.map +1 -0
- package/dist/parsers/transcript.d.ts +4 -0
- package/dist/parsers/transcript.js +148 -0
- package/dist/parsers/transcript.js.map +1 -0
- package/dist/render/colors.d.ts +20 -0
- package/dist/render/colors.js +59 -0
- package/dist/render/colors.js.map +1 -0
- package/dist/render/icons.d.ts +19 -0
- package/dist/render/icons.js +20 -0
- package/dist/render/icons.js.map +1 -0
- package/dist/render/index.d.ts +2 -0
- package/dist/render/index.js +27 -0
- package/dist/render/index.js.map +1 -0
- package/dist/render/line1.d.ts +3 -0
- package/dist/render/line1.js +89 -0
- package/dist/render/line1.js.map +1 -0
- package/dist/render/line2.d.ts +3 -0
- package/dist/render/line2.js +108 -0
- package/dist/render/line2.js.map +1 -0
- package/dist/render/line3.d.ts +3 -0
- package/dist/render/line3.js +60 -0
- package/dist/render/line3.js.map +1 -0
- package/dist/render/line4.d.ts +3 -0
- package/dist/render/line4.js +17 -0
- package/dist/render/line4.js.map +1 -0
- package/dist/render/minimal.d.ts +3 -0
- package/dist/render/minimal.js +120 -0
- package/dist/render/minimal.js.map +1 -0
- package/dist/render/text.d.ts +5 -0
- package/dist/render/text.js +70 -0
- package/dist/render/text.js.map +1 -0
- package/dist/stdin.d.ts +3 -0
- package/dist/stdin.js +40 -0
- package/dist/stdin.js.map +1 -0
- package/dist/types.d.ts +152 -0
- package/dist/types.js +45 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/cache.d.ts +8 -0
- package/dist/utils/cache.js +48 -0
- package/dist/utils/cache.js.map +1 -0
- package/dist/utils/exec.d.ts +5 -0
- package/dist/utils/exec.js +14 -0
- package/dist/utils/exec.js.map +1 -0
- package/dist/utils/format.d.ts +4 -0
- package/dist/utils/format.js +36 -0
- package/dist/utils/format.js.map +1 -0
- package/dist/utils/terminal.d.ts +2 -0
- package/dist/utils/terminal.js +53 -0
- package/dist/utils/terminal.js.map +1 -0
- 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,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":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,OAAO,EAAgB,MAAM,WAAW,CAAC;AAClD,OAAO,EAAE,eAAe,EAAE,aAAa,EAAe,MAAM,aAAa,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,cAAc,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAG9F,MAAM,GAAG,GAAG,oBAAoB,CAAC;AAEjC,SAAS,eAAe,CAAC,GAAW,EAAE,CAAS;IAC7C,MAAM,QAAQ,GAAG,EAAE,CAAC;IACpB,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,GAAG,CAAC,GAAG,QAAQ,CAAC,CAAC;IAClD,MAAM,OAAO,GAAG,CAAC,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC,CAAC;IACxC,MAAM,GAAG,GAAG,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,CAAC,CAAC;IACpG,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,GAAG,IAAI,EAAE;QAAE,IAAI,GAAG,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SACzC,IAAI,GAAG,IAAI,EAAE;QAAE,IAAI,GAAG,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAChD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IACzE,OAAO,IAAI,GAAG,KAAK,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACvD,CAAC;AAED,SAAS,eAAe,CAAC,QAAgB;IACvC,MAAM,MAAM,GAAG,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACrC,IAAI,MAAM,IAAI,CAAC;QAAE,OAAO,EAAE,CAAC;IAC3B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAC7C,MAAM,CAAC,GAAG,QAAQ,GAAG,EAAE,CAAC;IACxB,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;IACxD,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,GAAG,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC;IACxD,OAAO,GAAG,CAAC,GAAG,CAAC;AACjB,CAAC;AAED,MAAM,UAAU,WAAW,CACzB,KAAsB,EACtB,UAAyB,EACzB,cAA8B,EAC9B,CAAS,EACT,OAAuB,EACvB,IAAY,EACZ,SAA4B,IAAI;IAEhC,MAAM,SAAS,GAAa,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAa,EAAE,CAAC;IAEhC,cAAc;IACd,IAAI,OAAO,CAAC,UAAU,EAAE,CAAC;QACvB,MAAM,GAAG,GAAG,KAAK,CAAC,cAAc,CAAC,eAAe,CAAC;QACjD,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC;IAC1C,CAAC;IAED,SAAS;IACT,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;QACnB,MAAM,QAAQ,GAAG,KAAK,CAAC,cAAc,CAAC,kBAAkB,CAAC;QACzD,MAAM,SAAS,GAAG,KAAK,CAAC,cAAc,CAAC,mBAAmB,CAAC;QAC3D,MAAM,KAAK,GAAa,EAAE,CAAC;QAC3B,IAAI,QAAQ,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;QAC/D,IAAI,SAAS,IAAI,IAAI;YAAE,KAAK,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;QACjE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC;YAAE,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,OAAO,IAAI,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;IAC9E,CAAC;IAED,mBAAmB;IACnB,IAAI,OAAO,CAAC,IAAI,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QACtD,IAAI,QAAQ,GAAG,OAAO,CAAC;QACvB,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACrB,MAAM,IAAI,GAAG,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;YACrF,IAAI,IAAI;gBAAE,QAAQ,IAAI,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,CAAC;QACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC;IAED,WAAW;IACX,IAAI,OAAO,CAAC,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;QACnC,SAAS,CAAC,IAAI,CAAC,GAAG,KAAK,CAAC,KAAK,IAAI,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,EAAE,CAAC,CAAC;IACnF,CAAC;IAED,SAAS;IACT,IAAI,OAAO,CAAC,MAAM,IAAI,MAAM,EAAE,CAAC;QAC7B,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,MAAM,CAAC,UAAU,OAAO,CAAC,CAAC,CAAC;IACrD,CAAC;IAED,cAAc;IACd,IAAI,OAAO,CAAC,UAAU,IAAI,UAAU,IAAI,IAAI,EAAE,CAAC;QAC7C,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,GAAG,UAAU,QAAQ,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED,mCAAmC;IACnC,IAAI,OAAO,CAAC,UAAU,IAAI,KAAK,CAAC,WAAW,EAAE,CAAC;QAC5C,MAAM,MAAM,GAAmD;YAC7D,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC;YACnC,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,SAAS,CAAC;SACpC,CAAC;QACF,KAAK,MAAM,CAAC,KAAK,EAAE,GAAG,CAAC,IAAI,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,eAAe,GAAG,EAAE;gBAAE,SAAS;YAC/C,MAAM,OAAO,GAAG,CAAC,CAAC,aAAa,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC,CAAC;YACtD,IAAI,QAAQ,GAAG,OAAO,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,GAAG,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC;YACrF,IAAI,GAAG,CAAC,eAAe,IAAI,EAAE,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,eAAe,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;gBACjD,IAAI,SAAS;oBAAE,QAAQ,IAAI,CAAC,CAAC,GAAG,CAAC,IAAI,SAAS,EAAE,CAAC,CAAC;YACpD,CAAC;YACD,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;IACH,CAAC;IAED,uBAAuB;IACvB,IAAI,OAAO,CAAC,GAAG,IAAI,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;QACnC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;IAChD,CAAC;IAED,wCAAwC;IACxC,IAAI,OAAO,CAAC,MAAM,IAAI,cAAc,IAAI,cAAc,KAAK,QAAQ,EAAE,CAAC;QACpE,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,cAAc,EAAE,CAAC,CAAC,CAAC;IAC/C,CAAC;IAED,MAAM,OAAO,GAAG,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IACpC,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,OAAO,CAAC;IAC5C,OAAO,OAAO,CAAC,OAAO,EAAE,UAAU,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,IAAI,CAAC,CAAC;AACtD,CAAC"}
|
|
@@ -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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"}
|