slavedriver 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/agents/executor.md +26 -0
- package/agents/planner.md +41 -0
- package/agents/researcher.md +28 -0
- package/agents/verifier.md +25 -0
- package/dist/agents/backends/claude-code.d.ts +2 -0
- package/dist/agents/backends/claude-code.js +215 -0
- package/dist/agents/backends/claude-code.js.map +1 -0
- package/dist/agents/backends/mock.d.ts +9 -0
- package/dist/agents/backends/mock.js +31 -0
- package/dist/agents/backends/mock.js.map +1 -0
- package/dist/agents/context-builder.d.ts +10 -0
- package/dist/agents/context-builder.js +61 -0
- package/dist/agents/context-builder.js.map +1 -0
- package/dist/agents/prompt-compiler.d.ts +27 -0
- package/dist/agents/prompt-compiler.js +549 -0
- package/dist/agents/prompt-compiler.js.map +1 -0
- package/dist/agents/runtime.d.ts +40 -0
- package/dist/agents/runtime.js +2 -0
- package/dist/agents/runtime.js.map +1 -0
- package/dist/cli/arg-parser.d.ts +6 -0
- package/dist/cli/arg-parser.js +59 -0
- package/dist/cli/arg-parser.js.map +1 -0
- package/dist/cli/commands/config.d.ts +9 -0
- package/dist/cli/commands/config.js +120 -0
- package/dist/cli/commands/config.js.map +1 -0
- package/dist/cli/commands/dashboard.d.ts +1 -0
- package/dist/cli/commands/dashboard.js +54 -0
- package/dist/cli/commands/dashboard.js.map +1 -0
- package/dist/cli/commands/find-root.d.ts +14 -0
- package/dist/cli/commands/find-root.js +55 -0
- package/dist/cli/commands/find-root.js.map +1 -0
- package/dist/cli/commands/init.d.ts +1 -0
- package/dist/cli/commands/init.js +65 -0
- package/dist/cli/commands/init.js.map +1 -0
- package/dist/cli/commands/next.d.ts +1 -0
- package/dist/cli/commands/next.js +61 -0
- package/dist/cli/commands/next.js.map +1 -0
- package/dist/cli/commands/plan.d.ts +2 -0
- package/dist/cli/commands/plan.js +53 -0
- package/dist/cli/commands/plan.js.map +1 -0
- package/dist/cli/commands/replan.d.ts +1 -0
- package/dist/cli/commands/replan.js +54 -0
- package/dist/cli/commands/replan.js.map +1 -0
- package/dist/cli/commands/run-pipeline.d.ts +2 -0
- package/dist/cli/commands/run-pipeline.js +74 -0
- package/dist/cli/commands/run-pipeline.js.map +1 -0
- package/dist/cli/commands/run.d.ts +2 -0
- package/dist/cli/commands/run.js +106 -0
- package/dist/cli/commands/run.js.map +1 -0
- package/dist/cli/commands/status.d.ts +1 -0
- package/dist/cli/commands/status.js +51 -0
- package/dist/cli/commands/status.js.map +1 -0
- package/dist/cli/commands/verify.d.ts +1 -0
- package/dist/cli/commands/verify.js +63 -0
- package/dist/cli/commands/verify.js.map +1 -0
- package/dist/cli/commands/wizard.d.ts +8 -0
- package/dist/cli/commands/wizard.js +39 -0
- package/dist/cli/commands/wizard.js.map +1 -0
- package/dist/cli/index.d.ts +2 -0
- package/dist/cli/index.js +82 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/cli/wizard/index.d.ts +11 -0
- package/dist/cli/wizard/index.js +40 -0
- package/dist/cli/wizard/index.js.map +1 -0
- package/dist/cli/wizard/interview.d.ts +26 -0
- package/dist/cli/wizard/interview.js +284 -0
- package/dist/cli/wizard/interview.js.map +1 -0
- package/dist/cli/wizard/prompt.d.ts +18 -0
- package/dist/cli/wizard/prompt.js +72 -0
- package/dist/cli/wizard/prompt.js.map +1 -0
- package/dist/cli/wizard/template-generator.d.ts +8 -0
- package/dist/cli/wizard/template-generator.js +133 -0
- package/dist/cli/wizard/template-generator.js.map +1 -0
- package/dist/mcp/index.d.ts +2 -0
- package/dist/mcp/index.js +68 -0
- package/dist/mcp/index.js.map +1 -0
- package/dist/mcp/protocol.d.ts +33 -0
- package/dist/mcp/protocol.js +82 -0
- package/dist/mcp/protocol.js.map +1 -0
- package/dist/mcp/resources.d.ts +20 -0
- package/dist/mcp/resources.js +101 -0
- package/dist/mcp/resources.js.map +1 -0
- package/dist/mcp/run-manager.d.ts +36 -0
- package/dist/mcp/run-manager.js +179 -0
- package/dist/mcp/run-manager.js.map +1 -0
- package/dist/mcp/server.d.ts +13 -0
- package/dist/mcp/server.js +99 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +32 -0
- package/dist/mcp/tools.js +259 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/orchestrator/alert-types.d.ts +16 -0
- package/dist/orchestrator/alert-types.js +2 -0
- package/dist/orchestrator/alert-types.js.map +1 -0
- package/dist/orchestrator/alerts.d.ts +20 -0
- package/dist/orchestrator/alerts.js +76 -0
- package/dist/orchestrator/alerts.js.map +1 -0
- package/dist/orchestrator/checkpoints.d.ts +8 -0
- package/dist/orchestrator/checkpoints.js +24 -0
- package/dist/orchestrator/checkpoints.js.map +1 -0
- package/dist/orchestrator/engine.d.ts +71 -0
- package/dist/orchestrator/engine.js +420 -0
- package/dist/orchestrator/engine.js.map +1 -0
- package/dist/orchestrator/phase-gates.d.ts +6 -0
- package/dist/orchestrator/phase-gates.js +127 -0
- package/dist/orchestrator/phase-gates.js.map +1 -0
- package/dist/orchestrator/plan-approval.d.ts +10 -0
- package/dist/orchestrator/plan-approval.js +51 -0
- package/dist/orchestrator/plan-approval.js.map +1 -0
- package/dist/orchestrator/safety.d.ts +22 -0
- package/dist/orchestrator/safety.js +126 -0
- package/dist/orchestrator/safety.js.map +1 -0
- package/dist/orchestrator/task-graph.d.ts +17 -0
- package/dist/orchestrator/task-graph.js +156 -0
- package/dist/orchestrator/task-graph.js.map +1 -0
- package/dist/orchestrator/wave-executor.d.ts +37 -0
- package/dist/orchestrator/wave-executor.js +237 -0
- package/dist/orchestrator/wave-executor.js.map +1 -0
- package/dist/session/in-process.d.ts +2 -0
- package/dist/session/in-process.js +149 -0
- package/dist/session/in-process.js.map +1 -0
- package/dist/session/log-capture.d.ts +7 -0
- package/dist/session/log-capture.js +56 -0
- package/dist/session/log-capture.js.map +1 -0
- package/dist/session/manager.d.ts +20 -0
- package/dist/session/manager.js +2 -0
- package/dist/session/manager.js.map +1 -0
- package/dist/state/file-store.d.ts +3 -0
- package/dist/state/file-store.js +124 -0
- package/dist/state/file-store.js.map +1 -0
- package/dist/state/lock.d.ts +6 -0
- package/dist/state/lock.js +71 -0
- package/dist/state/lock.js.map +1 -0
- package/dist/state/plan-parser.d.ts +6 -0
- package/dist/state/plan-parser.js +54 -0
- package/dist/state/plan-parser.js.map +1 -0
- package/dist/state/store.d.ts +27 -0
- package/dist/state/store.js +2 -0
- package/dist/state/store.js.map +1 -0
- package/dist/steps/events.d.ts +49 -0
- package/dist/steps/events.js +2 -0
- package/dist/steps/events.js.map +1 -0
- package/dist/steps/pipeline.d.ts +14 -0
- package/dist/steps/pipeline.js +284 -0
- package/dist/steps/pipeline.js.map +1 -0
- package/dist/steps/plan-parser.d.ts +35 -0
- package/dist/steps/plan-parser.js +147 -0
- package/dist/steps/plan-parser.js.map +1 -0
- package/dist/steps/runner.d.ts +13 -0
- package/dist/steps/runner.js +155 -0
- package/dist/steps/runner.js.map +1 -0
- package/dist/steps/store.d.ts +26 -0
- package/dist/steps/store.js +164 -0
- package/dist/steps/store.js.map +1 -0
- package/dist/steps/types.d.ts +36 -0
- package/dist/steps/types.js +2 -0
- package/dist/steps/types.js.map +1 -0
- package/dist/tui/app.d.ts +15 -0
- package/dist/tui/app.js +297 -0
- package/dist/tui/app.js.map +1 -0
- package/dist/tui/banner.d.ts +1 -0
- package/dist/tui/banner.js +11 -0
- package/dist/tui/banner.js.map +1 -0
- package/dist/tui/colors.d.ts +22 -0
- package/dist/tui/colors.js +30 -0
- package/dist/tui/colors.js.map +1 -0
- package/dist/tui/components/agent-panel.d.ts +8 -0
- package/dist/tui/components/agent-panel.js +80 -0
- package/dist/tui/components/agent-panel.js.map +1 -0
- package/dist/tui/components/header.d.ts +15 -0
- package/dist/tui/components/header.js +69 -0
- package/dist/tui/components/header.js.map +1 -0
- package/dist/tui/components/status-bar.d.ts +2 -0
- package/dist/tui/components/status-bar.js +8 -0
- package/dist/tui/components/status-bar.js.map +1 -0
- package/dist/tui/components/task-board.d.ts +3 -0
- package/dist/tui/components/task-board.js +96 -0
- package/dist/tui/components/task-board.js.map +1 -0
- package/dist/tui/display.d.ts +23 -0
- package/dist/tui/display.js +125 -0
- package/dist/tui/display.js.map +1 -0
- package/dist/tui/input.d.ts +2 -0
- package/dist/tui/input.js +44 -0
- package/dist/tui/input.js.map +1 -0
- package/dist/tui/layout-master.d.ts +7 -0
- package/dist/tui/layout-master.js +31 -0
- package/dist/tui/layout-master.js.map +1 -0
- package/dist/tui/layout.d.ts +13 -0
- package/dist/tui/layout.js +37 -0
- package/dist/tui/layout.js.map +1 -0
- package/dist/tui/pane-formatter.d.ts +27 -0
- package/dist/tui/pane-formatter.js +153 -0
- package/dist/tui/pane-formatter.js.map +1 -0
- package/dist/tui/renderer.d.ts +8 -0
- package/dist/tui/renderer.js +30 -0
- package/dist/tui/renderer.js.map +1 -0
- package/dist/tui/screen.d.ts +12 -0
- package/dist/tui/screen.js +32 -0
- package/dist/tui/screen.js.map +1 -0
- package/dist/tui/structured-display.d.ts +5 -0
- package/dist/tui/structured-display.js +74 -0
- package/dist/tui/structured-display.js.map +1 -0
- package/dist/tui/tmux-display.d.ts +6 -0
- package/dist/tui/tmux-display.js +187 -0
- package/dist/tui/tmux-display.js.map +1 -0
- package/dist/tui/tmux.d.ts +26 -0
- package/dist/tui/tmux.js +265 -0
- package/dist/tui/tmux.js.map +1 -0
- package/dist/types.d.ts +15 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/git.d.ts +6 -0
- package/dist/utils/git.js +35 -0
- package/dist/utils/git.js.map +1 -0
- package/dist/utils/hello.d.ts +1 -0
- package/dist/utils/hello.js +4 -0
- package/dist/utils/hello.js.map +1 -0
- package/dist/utils/id.d.ts +1 -0
- package/dist/utils/id.js +5 -0
- package/dist/utils/id.js.map +1 -0
- package/dist/utils/jsonl.d.ts +2 -0
- package/dist/utils/jsonl.js +18 -0
- package/dist/utils/jsonl.js.map +1 -0
- package/dist/utils/logger.d.ts +20 -0
- package/dist/utils/logger.js +40 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/pricing.d.ts +3 -0
- package/dist/utils/pricing.js +26 -0
- package/dist/utils/pricing.js.map +1 -0
- package/dist/utils/xml.d.ts +13 -0
- package/dist/utils/xml.js +67 -0
- package/dist/utils/xml.js.map +1 -0
- package/dist/utils/yaml.d.ts +5 -0
- package/dist/utils/yaml.js +126 -0
- package/dist/utils/yaml.js.map +1 -0
- package/package.json +45 -0
- package/templates/CONSTITUTION.md +10 -0
- package/templates/STATE.md +3 -0
- package/templates/config.json +11 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { RESET, BOLD, DIM, RED, GREEN, YELLOW, GRAY, CYAN, WHITE, color, stripAnsi, } from '../colors.js';
|
|
2
|
+
function statusIcon(status, isCurrentWave) {
|
|
3
|
+
switch (status) {
|
|
4
|
+
case 'pending':
|
|
5
|
+
return color('\u00b7', GRAY); // ·
|
|
6
|
+
case 'running':
|
|
7
|
+
return color('\u27f3', YELLOW); // ⟳
|
|
8
|
+
case 'completed':
|
|
9
|
+
return color('\u2713', GREEN); // ✓
|
|
10
|
+
case 'failed':
|
|
11
|
+
return color('\u2717', RED); // ✗
|
|
12
|
+
case 'skipped':
|
|
13
|
+
return color('\u2013', DIM); // –
|
|
14
|
+
default:
|
|
15
|
+
return color('\u00b7', GRAY);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
function truncate(text, maxLen) {
|
|
19
|
+
if (text.length <= maxLen)
|
|
20
|
+
return text;
|
|
21
|
+
if (maxLen <= 3)
|
|
22
|
+
return text.slice(0, maxLen);
|
|
23
|
+
return text.slice(0, maxLen - 1) + '\u2026';
|
|
24
|
+
}
|
|
25
|
+
function padRight(text, width) {
|
|
26
|
+
const visibleLen = stripAnsi(text).length;
|
|
27
|
+
if (visibleLen >= width)
|
|
28
|
+
return text;
|
|
29
|
+
return text + ' '.repeat(width - visibleLen);
|
|
30
|
+
}
|
|
31
|
+
export function renderTaskBoard(tasks, currentWave, rect) {
|
|
32
|
+
const lines = [];
|
|
33
|
+
const maxWidth = rect.width;
|
|
34
|
+
if (tasks.length === 0) {
|
|
35
|
+
// Center "No tasks" message
|
|
36
|
+
const msg = `${DIM}No tasks${RESET}`;
|
|
37
|
+
const pad = Math.max(0, Math.floor((maxWidth - 8) / 2));
|
|
38
|
+
lines.push(padRight(' '.repeat(pad) + msg, maxWidth));
|
|
39
|
+
// Fill remaining lines
|
|
40
|
+
while (lines.length < rect.height) {
|
|
41
|
+
lines.push(' '.repeat(maxWidth));
|
|
42
|
+
}
|
|
43
|
+
return lines.slice(0, rect.height);
|
|
44
|
+
}
|
|
45
|
+
// Group tasks by wave
|
|
46
|
+
const waves = new Map();
|
|
47
|
+
for (const task of tasks) {
|
|
48
|
+
const existing = waves.get(task.wave);
|
|
49
|
+
if (existing) {
|
|
50
|
+
existing.push(task);
|
|
51
|
+
}
|
|
52
|
+
else {
|
|
53
|
+
waves.set(task.wave, [task]);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Sort wave numbers
|
|
57
|
+
const waveNumbers = [...waves.keys()].sort((a, b) => a - b);
|
|
58
|
+
for (const waveNum of waveNumbers) {
|
|
59
|
+
if (lines.length >= rect.height)
|
|
60
|
+
break;
|
|
61
|
+
const waveTasks = waves.get(waveNum);
|
|
62
|
+
const isActive = waveNum === currentWave;
|
|
63
|
+
// Wave header
|
|
64
|
+
const waveLabel = ` Wave ${waveNum} `;
|
|
65
|
+
const dashLen = Math.max(0, maxWidth - waveLabel.length - 2);
|
|
66
|
+
const leftDash = '\u2500'.repeat(Math.floor(dashLen / 2));
|
|
67
|
+
const rightDash = '\u2500'.repeat(dashLen - Math.floor(dashLen / 2));
|
|
68
|
+
const headerLine = isActive
|
|
69
|
+
? `${BOLD}${CYAN}${leftDash}${waveLabel}${rightDash}${RESET}`
|
|
70
|
+
: `${DIM}${leftDash}${waveLabel}${rightDash}${RESET}`;
|
|
71
|
+
lines.push(padRight(headerLine, maxWidth));
|
|
72
|
+
// Task lines
|
|
73
|
+
for (const task of waveTasks) {
|
|
74
|
+
if (lines.length >= rect.height)
|
|
75
|
+
break;
|
|
76
|
+
const icon = statusIcon(task.status, isActive);
|
|
77
|
+
const idStr = task.id;
|
|
78
|
+
// " ✓ T1 Setup DB" format
|
|
79
|
+
// Icon takes ~1 visible char, spacing: " {icon} {id} {title}"
|
|
80
|
+
const prefix = ` ${icon} ${idStr} `;
|
|
81
|
+
const prefixLen = stripAnsi(prefix).length;
|
|
82
|
+
const titleMaxLen = Math.max(0, maxWidth - prefixLen);
|
|
83
|
+
const title = truncate(task.title, titleMaxLen);
|
|
84
|
+
const taskLine = isActive && task.status === 'running'
|
|
85
|
+
? `${prefix}${BOLD}${WHITE}${title}${RESET}`
|
|
86
|
+
: `${prefix}${title}`;
|
|
87
|
+
lines.push(padRight(taskLine, maxWidth));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
// Fill remaining height with empty lines
|
|
91
|
+
while (lines.length < rect.height) {
|
|
92
|
+
lines.push(' '.repeat(maxWidth));
|
|
93
|
+
}
|
|
94
|
+
return lines.slice(0, rect.height);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=task-board.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"task-board.js","sourceRoot":"","sources":["../../../src/tui/components/task-board.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import type { StepEvent } from '../steps/events.js';
|
|
2
|
+
export type DisplayMode = 'plain' | 'tmux' | 'structured';
|
|
3
|
+
export interface DisplayTarget {
|
|
4
|
+
readonly mode: DisplayMode;
|
|
5
|
+
handleEvent(event: StepEvent): void;
|
|
6
|
+
start(): void;
|
|
7
|
+
stop(): void;
|
|
8
|
+
/** Tmux session name, if running in detached mode. */
|
|
9
|
+
getSessionName?(): string | null;
|
|
10
|
+
}
|
|
11
|
+
export interface DisplayConfig {
|
|
12
|
+
readonly version: string;
|
|
13
|
+
readonly projectName: string;
|
|
14
|
+
readonly noTui: boolean;
|
|
15
|
+
/** Always create a detached tmux session instead of splitting the current one. */
|
|
16
|
+
readonly forceDetached?: boolean;
|
|
17
|
+
/** Path for structured JSON line output. */
|
|
18
|
+
readonly structuredLogPath?: string;
|
|
19
|
+
}
|
|
20
|
+
export declare function formatTokens(tokens: number): string;
|
|
21
|
+
export declare function formatElapsed(ms: number): string;
|
|
22
|
+
export declare function createPlainDisplay(config: DisplayConfig): DisplayTarget;
|
|
23
|
+
export declare function createDisplay(config: DisplayConfig): DisplayTarget;
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { createTmuxDisplay as createTmuxDisplayImpl } from './tmux-display.js';
|
|
2
|
+
import { createStructuredDisplay } from './structured-display.js';
|
|
3
|
+
// --- Shared formatting helpers ---
|
|
4
|
+
export function formatTokens(tokens) {
|
|
5
|
+
if (tokens >= 1_000_000) {
|
|
6
|
+
return `${(tokens / 1_000_000).toFixed(1)}M`;
|
|
7
|
+
}
|
|
8
|
+
if (tokens >= 1_000) {
|
|
9
|
+
return `${Math.round(tokens / 1_000)}K`;
|
|
10
|
+
}
|
|
11
|
+
return String(tokens);
|
|
12
|
+
}
|
|
13
|
+
export function formatElapsed(ms) {
|
|
14
|
+
const seconds = Math.floor(ms / 1000);
|
|
15
|
+
if (seconds < 60) {
|
|
16
|
+
return `${seconds}s`;
|
|
17
|
+
}
|
|
18
|
+
const minutes = Math.floor(seconds / 60);
|
|
19
|
+
const remainingSeconds = seconds % 60;
|
|
20
|
+
if (minutes < 60) {
|
|
21
|
+
return `${minutes}m${remainingSeconds}s`;
|
|
22
|
+
}
|
|
23
|
+
const hours = Math.floor(minutes / 60);
|
|
24
|
+
const remainingMinutes = minutes % 60;
|
|
25
|
+
return `${hours}h${remainingMinutes}m${remainingSeconds}s`;
|
|
26
|
+
}
|
|
27
|
+
// --- Plain display (console.log) ---
|
|
28
|
+
export function createPlainDisplay(config) {
|
|
29
|
+
const startTime = Date.now();
|
|
30
|
+
function handleEvent(event) {
|
|
31
|
+
switch (event.type) {
|
|
32
|
+
case 'pipeline_started':
|
|
33
|
+
console.log(`[pipeline] Started: ${event.goal}${event.mode ? ` [${event.mode}]` : ''}`);
|
|
34
|
+
break;
|
|
35
|
+
case 'step_created':
|
|
36
|
+
console.log(`[step ${event.stepNumber}] Created: ${event.name}${event.phase ? ` (phase: ${event.phase})` : ''}`);
|
|
37
|
+
break;
|
|
38
|
+
case 'step_started': {
|
|
39
|
+
const elapsed = formatElapsed(Date.now() - startTime);
|
|
40
|
+
console.log(`[${elapsed}] Step ${event.stepNumber} started: ${event.name} [${event.agent}]`);
|
|
41
|
+
break;
|
|
42
|
+
}
|
|
43
|
+
case 'step_completed': {
|
|
44
|
+
const elapsed = formatElapsed(Date.now() - startTime);
|
|
45
|
+
const tok = formatTokens(event.inputTokens + event.outputTokens);
|
|
46
|
+
console.log(`[${elapsed}] Step ${event.stepNumber} completed: ${event.name} (${tok} tok)`);
|
|
47
|
+
break;
|
|
48
|
+
}
|
|
49
|
+
case 'step_failed':
|
|
50
|
+
console.log(`[error] Step ${event.stepNumber} failed: ${event.name} — ${event.error}`);
|
|
51
|
+
break;
|
|
52
|
+
case 'agent_event':
|
|
53
|
+
// Silently tracked
|
|
54
|
+
break;
|
|
55
|
+
case 'phase_started': {
|
|
56
|
+
const elapsed = formatElapsed(Date.now() - startTime);
|
|
57
|
+
console.log('');
|
|
58
|
+
console.log(`[${elapsed}] ── Phase: ${event.phase} ──`);
|
|
59
|
+
console.log(` ${event.description}`);
|
|
60
|
+
break;
|
|
61
|
+
}
|
|
62
|
+
case 'phase_completed': {
|
|
63
|
+
const elapsed = formatElapsed(Date.now() - startTime);
|
|
64
|
+
console.log(`[${elapsed}] Phase ${event.phase} completed`);
|
|
65
|
+
break;
|
|
66
|
+
}
|
|
67
|
+
case 'pipeline_complete': {
|
|
68
|
+
const elapsed = formatElapsed(Date.now() - startTime);
|
|
69
|
+
const totalTok = formatTokens(event.totalInputTokens + event.totalOutputTokens);
|
|
70
|
+
console.log('');
|
|
71
|
+
console.log('='.repeat(50));
|
|
72
|
+
console.log('Pipeline complete');
|
|
73
|
+
console.log(` Steps: ${event.completedSteps}/${event.totalSteps}`);
|
|
74
|
+
console.log(` Tokens: ${totalTok}`);
|
|
75
|
+
console.log(` Duration: ${elapsed}`);
|
|
76
|
+
console.log('='.repeat(50));
|
|
77
|
+
break;
|
|
78
|
+
}
|
|
79
|
+
case 'pipeline_error':
|
|
80
|
+
console.error(`[error] ${event.error}`);
|
|
81
|
+
break;
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
return {
|
|
85
|
+
mode: 'plain',
|
|
86
|
+
handleEvent,
|
|
87
|
+
start() { },
|
|
88
|
+
stop() { },
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
// --- Factory ---
|
|
92
|
+
export function createDisplay(config) {
|
|
93
|
+
// Path 0: Structured JSON log output
|
|
94
|
+
if (config.structuredLogPath) {
|
|
95
|
+
return createStructuredDisplay({
|
|
96
|
+
...config,
|
|
97
|
+
structuredLogPath: config.structuredLogPath,
|
|
98
|
+
});
|
|
99
|
+
}
|
|
100
|
+
if (config.noTui) {
|
|
101
|
+
return createPlainDisplay(config);
|
|
102
|
+
}
|
|
103
|
+
// Path 1: Already inside a tmux session — split panes in current session
|
|
104
|
+
if (process.env.TMUX) {
|
|
105
|
+
try {
|
|
106
|
+
return createTmuxDisplayImpl(config);
|
|
107
|
+
}
|
|
108
|
+
catch {
|
|
109
|
+
// tmux pane creation failed — fall through
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
// Path 2: Not inside tmux, but tmux binary exists — create detached session
|
|
113
|
+
if (!process.env.TMUX) {
|
|
114
|
+
try {
|
|
115
|
+
const display = createTmuxDisplayImpl(config);
|
|
116
|
+
return display;
|
|
117
|
+
}
|
|
118
|
+
catch {
|
|
119
|
+
// tmux binary not found or session creation failed — fall through
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
// Path 3: Plain console logging
|
|
123
|
+
return createPlainDisplay(config);
|
|
124
|
+
}
|
|
125
|
+
//# sourceMappingURL=display.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/tui/display.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export function startKeyListener(handler) {
|
|
2
|
+
const onData = (data) => {
|
|
3
|
+
const bytes = data;
|
|
4
|
+
// Ctrl+C
|
|
5
|
+
if (bytes.length === 1 && bytes[0] === 0x03) {
|
|
6
|
+
handler('ctrl-c');
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
// Escape sequences (arrows)
|
|
10
|
+
if (bytes.length === 3 && bytes[0] === 0x1b && bytes[1] === 0x5b) {
|
|
11
|
+
if (bytes[2] === 0x41) {
|
|
12
|
+
handler('up');
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (bytes[2] === 0x42) {
|
|
16
|
+
handler('down');
|
|
17
|
+
return;
|
|
18
|
+
}
|
|
19
|
+
// Ignore other escape sequences
|
|
20
|
+
return;
|
|
21
|
+
}
|
|
22
|
+
// Single character keys
|
|
23
|
+
if (bytes.length === 1) {
|
|
24
|
+
const char = String.fromCharCode(bytes[0]);
|
|
25
|
+
if (char === 'q') {
|
|
26
|
+
handler('q');
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
if (process.stdin.isTTY) {
|
|
32
|
+
process.stdin.setRawMode(true);
|
|
33
|
+
}
|
|
34
|
+
process.stdin.resume();
|
|
35
|
+
process.stdin.on('data', onData);
|
|
36
|
+
return () => {
|
|
37
|
+
process.stdin.removeListener('data', onData);
|
|
38
|
+
process.stdin.pause();
|
|
39
|
+
if (process.stdin.isTTY) {
|
|
40
|
+
process.stdin.setRawMode(false);
|
|
41
|
+
}
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=input.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"input.js","sourceRoot":"","sources":["../../src/tui/input.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,gBAAgB,CAAC,OAAmB;IAClD,MAAM,MAAM,GAAG,CAAC,IAAY,EAAQ,EAAE;QACpC,MAAM,KAAK,GAAG,IAAI,CAAC;QAEnB,SAAS;QACT,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YAC5C,OAAO,CAAC,QAAQ,CAAC,CAAC;YAClB,OAAO;QACT,CAAC;QAED,4BAA4B;QAC5B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACjE,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACtB,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YACD,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;gBACtB,OAAO,CAAC,MAAM,CAAC,CAAC;gBAChB,OAAO;YACT,CAAC;YACD,gCAAgC;YAChC,OAAO;QACT,CAAC;QAED,wBAAwB;QACxB,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACvB,MAAM,IAAI,GAAG,MAAM,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAC3C,IAAI,IAAI,KAAK,GAAG,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,CAAC;gBACb,OAAO;YACT,CAAC;QACH,CAAC;IACH,CAAC,CAAC;IAEF,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;IACjC,CAAC;IACD,OAAO,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;IACvB,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAEjC,OAAO,GAAG,EAAE;QACV,OAAO,CAAC,KAAK,CAAC,cAAc,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QAC7C,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QACtB,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACxB,OAAO,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC;QAClC,CAAC;IACH,CAAC,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
export function calculateMasterLayout(rows, cols) {
|
|
2
|
+
const safeRows = Math.max(rows, 6);
|
|
3
|
+
const safeCols = Math.max(cols, 20);
|
|
4
|
+
const headerHeight = 1;
|
|
5
|
+
const statusBarHeight = 1;
|
|
6
|
+
const bodyHeight = safeRows - headerHeight - statusBarHeight;
|
|
7
|
+
// Task board gets full width minus 1-col border on each side
|
|
8
|
+
const border = 1;
|
|
9
|
+
const taskBoardWidth = safeCols - border * 2;
|
|
10
|
+
return {
|
|
11
|
+
header: {
|
|
12
|
+
top: 0,
|
|
13
|
+
left: 0,
|
|
14
|
+
width: safeCols,
|
|
15
|
+
height: headerHeight,
|
|
16
|
+
},
|
|
17
|
+
taskBoard: {
|
|
18
|
+
top: headerHeight,
|
|
19
|
+
left: border,
|
|
20
|
+
width: taskBoardWidth,
|
|
21
|
+
height: bodyHeight,
|
|
22
|
+
},
|
|
23
|
+
statusBar: {
|
|
24
|
+
top: safeRows - statusBarHeight,
|
|
25
|
+
left: 0,
|
|
26
|
+
width: safeCols,
|
|
27
|
+
height: statusBarHeight,
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=layout-master.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout-master.js","sourceRoot":"","sources":["../../src/tui/layout-master.ts"],"names":[],"mappings":"AAQA,MAAM,UAAU,qBAAqB,CAAC,IAAY,EAAE,IAAY;IAC9D,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEpC,MAAM,YAAY,GAAG,CAAC,CAAC;IACvB,MAAM,eAAe,GAAG,CAAC,CAAC;IAC1B,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,eAAe,CAAC;IAE7D,6DAA6D;IAC7D,MAAM,MAAM,GAAG,CAAC,CAAC;IACjB,MAAM,cAAc,GAAG,QAAQ,GAAG,MAAM,GAAG,CAAC,CAAC;IAE7C,OAAO;QACL,MAAM,EAAE;YACN,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,YAAY;SACrB;QACD,SAAS,EAAE;YACT,GAAG,EAAE,YAAY;YACjB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,cAAc;YACrB,MAAM,EAAE,UAAU;SACnB;QACD,SAAS,EAAE;YACT,GAAG,EAAE,QAAQ,GAAG,eAAe;YAC/B,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,eAAe;SACxB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export interface Rect {
|
|
2
|
+
readonly top: number;
|
|
3
|
+
readonly left: number;
|
|
4
|
+
readonly width: number;
|
|
5
|
+
readonly height: number;
|
|
6
|
+
}
|
|
7
|
+
export interface Layout {
|
|
8
|
+
readonly header: Rect;
|
|
9
|
+
readonly taskBoard: Rect;
|
|
10
|
+
readonly agentPanel: Rect;
|
|
11
|
+
readonly statusBar: Rect;
|
|
12
|
+
}
|
|
13
|
+
export declare function calculateLayout(rows: number, cols: number): Layout;
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
export function calculateLayout(rows, cols) {
|
|
2
|
+
// Enforce minimum size
|
|
3
|
+
const safeRows = Math.max(rows, 6);
|
|
4
|
+
const safeCols = Math.max(cols, 20);
|
|
5
|
+
const headerHeight = 1;
|
|
6
|
+
const statusBarHeight = 1;
|
|
7
|
+
const bodyHeight = safeRows - headerHeight - statusBarHeight;
|
|
8
|
+
const taskBoardWidth = Math.floor(safeCols * 0.35);
|
|
9
|
+
const agentPanelWidth = safeCols - taskBoardWidth;
|
|
10
|
+
return {
|
|
11
|
+
header: {
|
|
12
|
+
top: 0,
|
|
13
|
+
left: 0,
|
|
14
|
+
width: safeCols,
|
|
15
|
+
height: headerHeight,
|
|
16
|
+
},
|
|
17
|
+
taskBoard: {
|
|
18
|
+
top: headerHeight,
|
|
19
|
+
left: 0,
|
|
20
|
+
width: taskBoardWidth,
|
|
21
|
+
height: bodyHeight,
|
|
22
|
+
},
|
|
23
|
+
agentPanel: {
|
|
24
|
+
top: headerHeight,
|
|
25
|
+
left: taskBoardWidth,
|
|
26
|
+
width: agentPanelWidth,
|
|
27
|
+
height: bodyHeight,
|
|
28
|
+
},
|
|
29
|
+
statusBar: {
|
|
30
|
+
top: safeRows - statusBarHeight,
|
|
31
|
+
left: 0,
|
|
32
|
+
width: safeCols,
|
|
33
|
+
height: statusBarHeight,
|
|
34
|
+
},
|
|
35
|
+
};
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=layout.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"layout.js","sourceRoot":"","sources":["../../src/tui/layout.ts"],"names":[],"mappings":"AAcA,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,IAAY;IACxD,uBAAuB;IACvB,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IACnC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IAEpC,MAAM,YAAY,GAAG,CAAC,CAAC;IACvB,MAAM,eAAe,GAAG,CAAC,CAAC;IAC1B,MAAM,UAAU,GAAG,QAAQ,GAAG,YAAY,GAAG,eAAe,CAAC;IAE7D,MAAM,cAAc,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,IAAI,CAAC,CAAC;IACnD,MAAM,eAAe,GAAG,QAAQ,GAAG,cAAc,CAAC;IAElD,OAAO;QACL,MAAM,EAAE;YACN,GAAG,EAAE,CAAC;YACN,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,YAAY;SACrB;QACD,SAAS,EAAE;YACT,GAAG,EAAE,YAAY;YACjB,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,cAAc;YACrB,MAAM,EAAE,UAAU;SACnB;QACD,UAAU,EAAE;YACV,GAAG,EAAE,YAAY;YACjB,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,eAAe;YACtB,MAAM,EAAE,UAAU;SACnB;QACD,SAAS,EAAE;YACT,GAAG,EAAE,QAAQ,GAAG,eAAe;YAC/B,IAAI,EAAE,CAAC;YACP,KAAK,EAAE,QAAQ;YACf,MAAM,EAAE,eAAe;SACxB;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export declare const STATUS_PROCESSING = "\u25CF";
|
|
2
|
+
export declare const STATUS_WAITING = "\u25D0";
|
|
3
|
+
export declare const STATUS_IDLE = "\u25CB";
|
|
4
|
+
export declare const STATUS_ERROR = "\u2715";
|
|
5
|
+
export declare const STATUS_DONE = "\u2713";
|
|
6
|
+
export type AgentStatus = 'processing' | 'waiting' | 'idle' | 'error' | 'done';
|
|
7
|
+
export declare function statusIndicator(status: AgentStatus): string;
|
|
8
|
+
export interface PaneFormatter {
|
|
9
|
+
formatTextDelta(text: string): string;
|
|
10
|
+
formatToolUse(tool: string): string;
|
|
11
|
+
formatToolResult(tool: string, output: string): string;
|
|
12
|
+
formatError(error: string): string;
|
|
13
|
+
formatComplete(status: 'completed' | 'failed', summary: string): string;
|
|
14
|
+
formatPaneHeader(agentId: string, stepName: string, stepNumber: number): string;
|
|
15
|
+
formatStatusLine(agentId: string, status: AgentStatus, tokens: number): string;
|
|
16
|
+
}
|
|
17
|
+
export declare function createPaneFormatter(): PaneFormatter;
|
|
18
|
+
export interface DashboardFormatter {
|
|
19
|
+
formatBanner(projectName: string, version: string): string;
|
|
20
|
+
formatStepStarted(stepNumber: number, name: string, agentId: string): string;
|
|
21
|
+
formatStepCompleted(stepNumber: number, name: string, tokens: number): string;
|
|
22
|
+
formatStepFailed(stepNumber: number, name: string, error: string): string;
|
|
23
|
+
formatPipelineComplete(stepCount: number, tokens: number, elapsed: string): string;
|
|
24
|
+
formatPipelineError(error: string): string;
|
|
25
|
+
formatStatusBarText(completedSteps: number, totalSteps: number, tokens: number): string;
|
|
26
|
+
}
|
|
27
|
+
export declare function createDashboardFormatter(): DashboardFormatter;
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
import { BOLD, DIM, RED, GREEN, YELLOW, CYAN, GRAY, WHITE, color } from './colors.js';
|
|
2
|
+
import { formatTokens } from './display.js';
|
|
3
|
+
// --- Status indicators (tmuxcc-style) ---
|
|
4
|
+
export const STATUS_PROCESSING = '\u25cf'; // ●
|
|
5
|
+
export const STATUS_WAITING = '\u25d0'; // ◐
|
|
6
|
+
export const STATUS_IDLE = '\u25cb'; // ○
|
|
7
|
+
export const STATUS_ERROR = '\u2715'; // ✕
|
|
8
|
+
export const STATUS_DONE = '\u2713'; // ✓
|
|
9
|
+
export function statusIndicator(status) {
|
|
10
|
+
switch (status) {
|
|
11
|
+
case 'processing': return color(STATUS_PROCESSING, GREEN);
|
|
12
|
+
case 'waiting': return color(STATUS_WAITING, YELLOW);
|
|
13
|
+
case 'idle': return color(STATUS_IDLE, GRAY);
|
|
14
|
+
case 'error': return color(STATUS_ERROR, RED);
|
|
15
|
+
case 'done': return color(STATUS_DONE, GREEN);
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
// --- Box-drawing characters ---
|
|
19
|
+
const BOX_H = '\u2500'; // ─
|
|
20
|
+
const BOX_TL = '\u250c'; // ┌
|
|
21
|
+
const BOX_TR = '\u2510'; // ┐
|
|
22
|
+
const BOX_BL = '\u2514'; // └
|
|
23
|
+
const BOX_BR = '\u2518'; // ┘
|
|
24
|
+
const BOX_V = '\u2502'; // │
|
|
25
|
+
function boxLine(text, width) {
|
|
26
|
+
const padded = text.padEnd(width - 4);
|
|
27
|
+
return `${BOX_V} ${padded} ${BOX_V}`;
|
|
28
|
+
}
|
|
29
|
+
export function createPaneFormatter() {
|
|
30
|
+
function formatTextDelta(text) {
|
|
31
|
+
return text;
|
|
32
|
+
}
|
|
33
|
+
function formatToolUse(tool) {
|
|
34
|
+
return color(`${STATUS_PROCESSING} `, GREEN) + color(`> ${tool}`, YELLOW) + '\n';
|
|
35
|
+
}
|
|
36
|
+
function formatToolResult(tool, output) {
|
|
37
|
+
const lines = output.split('\n');
|
|
38
|
+
const truncated = lines.slice(0, 3).join('\n');
|
|
39
|
+
const suffix = lines.length > 3 ? color(` ... (${lines.length - 3} more lines)`, GRAY) + '\n' : '';
|
|
40
|
+
return color(truncated, DIM, GRAY) + '\n' + suffix;
|
|
41
|
+
}
|
|
42
|
+
function formatError(error) {
|
|
43
|
+
return color(`${STATUS_ERROR} ERROR: ${error}`, BOLD, RED) + '\n';
|
|
44
|
+
}
|
|
45
|
+
function formatComplete(status, summary) {
|
|
46
|
+
const width = Math.max(summary.length + 6, 30);
|
|
47
|
+
const topBorder = BOX_TL + BOX_H.repeat(width - 2) + BOX_TR;
|
|
48
|
+
const bottomBorder = BOX_BL + BOX_H.repeat(width - 2) + BOX_BR;
|
|
49
|
+
const indicator = status === 'completed' ? STATUS_DONE : STATUS_ERROR;
|
|
50
|
+
const statusText = status === 'completed' ? `${indicator} COMPLETED` : `${indicator} FAILED`;
|
|
51
|
+
const statusColor = status === 'completed' ? GREEN : RED;
|
|
52
|
+
const lines = [
|
|
53
|
+
'',
|
|
54
|
+
color(topBorder, statusColor),
|
|
55
|
+
color(boxLine(color(statusText, BOLD, statusColor), width), statusColor),
|
|
56
|
+
color(boxLine(summary, width), statusColor),
|
|
57
|
+
color(bottomBorder, statusColor),
|
|
58
|
+
'',
|
|
59
|
+
];
|
|
60
|
+
return lines.join('\n');
|
|
61
|
+
}
|
|
62
|
+
function formatPaneHeader(agentId, stepName, stepNumber) {
|
|
63
|
+
const width = 60;
|
|
64
|
+
const topBorder = BOX_TL + BOX_H.repeat(width - 2) + BOX_TR;
|
|
65
|
+
const bottomBorder = BOX_BL + BOX_H.repeat(width - 2) + BOX_BR;
|
|
66
|
+
const lines = [
|
|
67
|
+
color(topBorder, CYAN),
|
|
68
|
+
color(boxLine(color(`${STATUS_PROCESSING} Agent: ${agentId}`, BOLD, CYAN), width), CYAN),
|
|
69
|
+
color(boxLine(color(`Step ${stepNumber}: ${stepName}`, CYAN), width), CYAN),
|
|
70
|
+
color(bottomBorder, CYAN),
|
|
71
|
+
'',
|
|
72
|
+
];
|
|
73
|
+
return lines.join('\n');
|
|
74
|
+
}
|
|
75
|
+
function formatStatusLine(agentId, status, tokens) {
|
|
76
|
+
const ind = statusIndicator(status);
|
|
77
|
+
const tok = color(formatTokens(tokens), CYAN);
|
|
78
|
+
return `${ind} ${agentId} ${tok}`;
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
formatTextDelta,
|
|
82
|
+
formatToolUse,
|
|
83
|
+
formatToolResult,
|
|
84
|
+
formatError,
|
|
85
|
+
formatComplete,
|
|
86
|
+
formatPaneHeader,
|
|
87
|
+
formatStatusLine,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
export function createDashboardFormatter() {
|
|
91
|
+
const BANNER_WIDTH = 62;
|
|
92
|
+
function formatBanner(projectName, version) {
|
|
93
|
+
const lines = [
|
|
94
|
+
'',
|
|
95
|
+
color(`${BOX_TL}${BOX_H.repeat(BANNER_WIDTH - 2)}${BOX_TR}`, CYAN),
|
|
96
|
+
color(`${BOX_V}${' '.repeat(BANNER_WIDTH - 2)}${BOX_V}`, CYAN),
|
|
97
|
+
color(`${BOX_V}`, CYAN) + color(` SLAVEDRIVER v${version}`.padEnd(BANNER_WIDTH - 2), BOLD, CYAN) + color(BOX_V, CYAN),
|
|
98
|
+
color(`${BOX_V}`, CYAN) + color(` ${projectName}`.padEnd(BANNER_WIDTH - 2), WHITE) + color(BOX_V, CYAN),
|
|
99
|
+
color(`${BOX_V}${' '.repeat(BANNER_WIDTH - 2)}${BOX_V}`, CYAN),
|
|
100
|
+
color(`${BOX_BL}${BOX_H.repeat(BANNER_WIDTH - 2)}${BOX_BR}`, CYAN),
|
|
101
|
+
'',
|
|
102
|
+
];
|
|
103
|
+
return lines.join('\n');
|
|
104
|
+
}
|
|
105
|
+
function formatStepStarted(stepNumber, name, agentId) {
|
|
106
|
+
return ` ${statusIndicator('processing')} ${color(`Step ${stepNumber}`, BOLD)} ${name} ${color(`[${agentId}]`, DIM)}\n`;
|
|
107
|
+
}
|
|
108
|
+
function formatStepCompleted(stepNumber, name, tokens) {
|
|
109
|
+
return ` ${statusIndicator('done')} ${color(`Step ${stepNumber}`, BOLD)} ${name} ${color(`(${formatTokens(tokens)} tok)`, DIM)}\n`;
|
|
110
|
+
}
|
|
111
|
+
function formatStepFailed(stepNumber, name, error) {
|
|
112
|
+
return ` ${statusIndicator('error')} ${color(`Step ${stepNumber}`, BOLD)} ${name}\n` +
|
|
113
|
+
color(` ${error}`, RED) + '\n';
|
|
114
|
+
}
|
|
115
|
+
function formatPipelineComplete(stepCount, tokens, elapsed) {
|
|
116
|
+
const lines = [
|
|
117
|
+
'',
|
|
118
|
+
color(`${BOX_TL}${BOX_H.repeat(BANNER_WIDTH - 2)}${BOX_TR}`, GREEN),
|
|
119
|
+
color(`${BOX_V}`, GREEN) + color(` ${STATUS_DONE} PIPELINE COMPLETE`.padEnd(BANNER_WIDTH - 2), BOLD, GREEN) + color(BOX_V, GREEN),
|
|
120
|
+
color(`${BOX_V}`, GREEN) + ` Steps: ${String(stepCount).padEnd(BANNER_WIDTH - 14)}` + color(BOX_V, GREEN),
|
|
121
|
+
color(`${BOX_V}`, GREEN) + ` Tokens: ${formatTokens(tokens).padEnd(BANNER_WIDTH - 14)}` + color(BOX_V, GREEN),
|
|
122
|
+
color(`${BOX_V}`, GREEN) + ` Duration: ${elapsed.padEnd(BANNER_WIDTH - 14)}` + color(BOX_V, GREEN),
|
|
123
|
+
color(`${BOX_BL}${BOX_H.repeat(BANNER_WIDTH - 2)}${BOX_BR}`, GREEN),
|
|
124
|
+
'',
|
|
125
|
+
];
|
|
126
|
+
return lines.join('\n');
|
|
127
|
+
}
|
|
128
|
+
function formatPipelineError(error) {
|
|
129
|
+
const lines = [
|
|
130
|
+
'',
|
|
131
|
+
color(`${BOX_TL}${BOX_H.repeat(BANNER_WIDTH - 2)}${BOX_TR}`, RED),
|
|
132
|
+
color(`${BOX_V}`, RED) + color(` ${STATUS_ERROR} PIPELINE ERROR`.padEnd(BANNER_WIDTH - 2), BOLD, RED) + color(BOX_V, RED),
|
|
133
|
+
color(`${BOX_V}`, RED) + ` ${error.slice(0, BANNER_WIDTH - 5).padEnd(BANNER_WIDTH - 4)}` + color(BOX_V, RED),
|
|
134
|
+
color(`${BOX_BL}${BOX_H.repeat(BANNER_WIDTH - 2)}${BOX_BR}`, RED),
|
|
135
|
+
'',
|
|
136
|
+
];
|
|
137
|
+
return lines.join('\n');
|
|
138
|
+
}
|
|
139
|
+
function formatStatusBarText(completedSteps, totalSteps, tokens) {
|
|
140
|
+
const progress = totalSteps > 0 ? `${completedSteps}/${totalSteps}` : '0/0';
|
|
141
|
+
return ` SLAVEDRIVER | Steps: ${progress} | #[fg=green]${formatTokens(tokens)} tok#[default] `;
|
|
142
|
+
}
|
|
143
|
+
return {
|
|
144
|
+
formatBanner,
|
|
145
|
+
formatStepStarted,
|
|
146
|
+
formatStepCompleted,
|
|
147
|
+
formatStepFailed,
|
|
148
|
+
formatPipelineComplete,
|
|
149
|
+
formatPipelineError,
|
|
150
|
+
formatStatusBarText,
|
|
151
|
+
};
|
|
152
|
+
}
|
|
153
|
+
//# sourceMappingURL=pane-formatter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pane-formatter.js","sourceRoot":"","sources":["../../src/tui/pane-formatter.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Layout } from './layout.js';
|
|
2
|
+
export interface RenderFrame {
|
|
3
|
+
readonly header: string;
|
|
4
|
+
readonly taskBoard: readonly string[];
|
|
5
|
+
readonly agentPanel: readonly string[];
|
|
6
|
+
readonly statusBar: string;
|
|
7
|
+
}
|
|
8
|
+
export declare function renderFrame(frame: RenderFrame, layout: Layout): void;
|