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.
Files changed (240) hide show
  1. package/README.md +165 -0
  2. package/agents/executor.md +26 -0
  3. package/agents/planner.md +41 -0
  4. package/agents/researcher.md +28 -0
  5. package/agents/verifier.md +25 -0
  6. package/dist/agents/backends/claude-code.d.ts +2 -0
  7. package/dist/agents/backends/claude-code.js +215 -0
  8. package/dist/agents/backends/claude-code.js.map +1 -0
  9. package/dist/agents/backends/mock.d.ts +9 -0
  10. package/dist/agents/backends/mock.js +31 -0
  11. package/dist/agents/backends/mock.js.map +1 -0
  12. package/dist/agents/context-builder.d.ts +10 -0
  13. package/dist/agents/context-builder.js +61 -0
  14. package/dist/agents/context-builder.js.map +1 -0
  15. package/dist/agents/prompt-compiler.d.ts +27 -0
  16. package/dist/agents/prompt-compiler.js +549 -0
  17. package/dist/agents/prompt-compiler.js.map +1 -0
  18. package/dist/agents/runtime.d.ts +40 -0
  19. package/dist/agents/runtime.js +2 -0
  20. package/dist/agents/runtime.js.map +1 -0
  21. package/dist/cli/arg-parser.d.ts +6 -0
  22. package/dist/cli/arg-parser.js +59 -0
  23. package/dist/cli/arg-parser.js.map +1 -0
  24. package/dist/cli/commands/config.d.ts +9 -0
  25. package/dist/cli/commands/config.js +120 -0
  26. package/dist/cli/commands/config.js.map +1 -0
  27. package/dist/cli/commands/dashboard.d.ts +1 -0
  28. package/dist/cli/commands/dashboard.js +54 -0
  29. package/dist/cli/commands/dashboard.js.map +1 -0
  30. package/dist/cli/commands/find-root.d.ts +14 -0
  31. package/dist/cli/commands/find-root.js +55 -0
  32. package/dist/cli/commands/find-root.js.map +1 -0
  33. package/dist/cli/commands/init.d.ts +1 -0
  34. package/dist/cli/commands/init.js +65 -0
  35. package/dist/cli/commands/init.js.map +1 -0
  36. package/dist/cli/commands/next.d.ts +1 -0
  37. package/dist/cli/commands/next.js +61 -0
  38. package/dist/cli/commands/next.js.map +1 -0
  39. package/dist/cli/commands/plan.d.ts +2 -0
  40. package/dist/cli/commands/plan.js +53 -0
  41. package/dist/cli/commands/plan.js.map +1 -0
  42. package/dist/cli/commands/replan.d.ts +1 -0
  43. package/dist/cli/commands/replan.js +54 -0
  44. package/dist/cli/commands/replan.js.map +1 -0
  45. package/dist/cli/commands/run-pipeline.d.ts +2 -0
  46. package/dist/cli/commands/run-pipeline.js +74 -0
  47. package/dist/cli/commands/run-pipeline.js.map +1 -0
  48. package/dist/cli/commands/run.d.ts +2 -0
  49. package/dist/cli/commands/run.js +106 -0
  50. package/dist/cli/commands/run.js.map +1 -0
  51. package/dist/cli/commands/status.d.ts +1 -0
  52. package/dist/cli/commands/status.js +51 -0
  53. package/dist/cli/commands/status.js.map +1 -0
  54. package/dist/cli/commands/verify.d.ts +1 -0
  55. package/dist/cli/commands/verify.js +63 -0
  56. package/dist/cli/commands/verify.js.map +1 -0
  57. package/dist/cli/commands/wizard.d.ts +8 -0
  58. package/dist/cli/commands/wizard.js +39 -0
  59. package/dist/cli/commands/wizard.js.map +1 -0
  60. package/dist/cli/index.d.ts +2 -0
  61. package/dist/cli/index.js +82 -0
  62. package/dist/cli/index.js.map +1 -0
  63. package/dist/cli/wizard/index.d.ts +11 -0
  64. package/dist/cli/wizard/index.js +40 -0
  65. package/dist/cli/wizard/index.js.map +1 -0
  66. package/dist/cli/wizard/interview.d.ts +26 -0
  67. package/dist/cli/wizard/interview.js +284 -0
  68. package/dist/cli/wizard/interview.js.map +1 -0
  69. package/dist/cli/wizard/prompt.d.ts +18 -0
  70. package/dist/cli/wizard/prompt.js +72 -0
  71. package/dist/cli/wizard/prompt.js.map +1 -0
  72. package/dist/cli/wizard/template-generator.d.ts +8 -0
  73. package/dist/cli/wizard/template-generator.js +133 -0
  74. package/dist/cli/wizard/template-generator.js.map +1 -0
  75. package/dist/mcp/index.d.ts +2 -0
  76. package/dist/mcp/index.js +68 -0
  77. package/dist/mcp/index.js.map +1 -0
  78. package/dist/mcp/protocol.d.ts +33 -0
  79. package/dist/mcp/protocol.js +82 -0
  80. package/dist/mcp/protocol.js.map +1 -0
  81. package/dist/mcp/resources.d.ts +20 -0
  82. package/dist/mcp/resources.js +101 -0
  83. package/dist/mcp/resources.js.map +1 -0
  84. package/dist/mcp/run-manager.d.ts +36 -0
  85. package/dist/mcp/run-manager.js +179 -0
  86. package/dist/mcp/run-manager.js.map +1 -0
  87. package/dist/mcp/server.d.ts +13 -0
  88. package/dist/mcp/server.js +99 -0
  89. package/dist/mcp/server.js.map +1 -0
  90. package/dist/mcp/tools.d.ts +32 -0
  91. package/dist/mcp/tools.js +259 -0
  92. package/dist/mcp/tools.js.map +1 -0
  93. package/dist/orchestrator/alert-types.d.ts +16 -0
  94. package/dist/orchestrator/alert-types.js +2 -0
  95. package/dist/orchestrator/alert-types.js.map +1 -0
  96. package/dist/orchestrator/alerts.d.ts +20 -0
  97. package/dist/orchestrator/alerts.js +76 -0
  98. package/dist/orchestrator/alerts.js.map +1 -0
  99. package/dist/orchestrator/checkpoints.d.ts +8 -0
  100. package/dist/orchestrator/checkpoints.js +24 -0
  101. package/dist/orchestrator/checkpoints.js.map +1 -0
  102. package/dist/orchestrator/engine.d.ts +71 -0
  103. package/dist/orchestrator/engine.js +420 -0
  104. package/dist/orchestrator/engine.js.map +1 -0
  105. package/dist/orchestrator/phase-gates.d.ts +6 -0
  106. package/dist/orchestrator/phase-gates.js +127 -0
  107. package/dist/orchestrator/phase-gates.js.map +1 -0
  108. package/dist/orchestrator/plan-approval.d.ts +10 -0
  109. package/dist/orchestrator/plan-approval.js +51 -0
  110. package/dist/orchestrator/plan-approval.js.map +1 -0
  111. package/dist/orchestrator/safety.d.ts +22 -0
  112. package/dist/orchestrator/safety.js +126 -0
  113. package/dist/orchestrator/safety.js.map +1 -0
  114. package/dist/orchestrator/task-graph.d.ts +17 -0
  115. package/dist/orchestrator/task-graph.js +156 -0
  116. package/dist/orchestrator/task-graph.js.map +1 -0
  117. package/dist/orchestrator/wave-executor.d.ts +37 -0
  118. package/dist/orchestrator/wave-executor.js +237 -0
  119. package/dist/orchestrator/wave-executor.js.map +1 -0
  120. package/dist/session/in-process.d.ts +2 -0
  121. package/dist/session/in-process.js +149 -0
  122. package/dist/session/in-process.js.map +1 -0
  123. package/dist/session/log-capture.d.ts +7 -0
  124. package/dist/session/log-capture.js +56 -0
  125. package/dist/session/log-capture.js.map +1 -0
  126. package/dist/session/manager.d.ts +20 -0
  127. package/dist/session/manager.js +2 -0
  128. package/dist/session/manager.js.map +1 -0
  129. package/dist/state/file-store.d.ts +3 -0
  130. package/dist/state/file-store.js +124 -0
  131. package/dist/state/file-store.js.map +1 -0
  132. package/dist/state/lock.d.ts +6 -0
  133. package/dist/state/lock.js +71 -0
  134. package/dist/state/lock.js.map +1 -0
  135. package/dist/state/plan-parser.d.ts +6 -0
  136. package/dist/state/plan-parser.js +54 -0
  137. package/dist/state/plan-parser.js.map +1 -0
  138. package/dist/state/store.d.ts +27 -0
  139. package/dist/state/store.js +2 -0
  140. package/dist/state/store.js.map +1 -0
  141. package/dist/steps/events.d.ts +49 -0
  142. package/dist/steps/events.js +2 -0
  143. package/dist/steps/events.js.map +1 -0
  144. package/dist/steps/pipeline.d.ts +14 -0
  145. package/dist/steps/pipeline.js +284 -0
  146. package/dist/steps/pipeline.js.map +1 -0
  147. package/dist/steps/plan-parser.d.ts +35 -0
  148. package/dist/steps/plan-parser.js +147 -0
  149. package/dist/steps/plan-parser.js.map +1 -0
  150. package/dist/steps/runner.d.ts +13 -0
  151. package/dist/steps/runner.js +155 -0
  152. package/dist/steps/runner.js.map +1 -0
  153. package/dist/steps/store.d.ts +26 -0
  154. package/dist/steps/store.js +164 -0
  155. package/dist/steps/store.js.map +1 -0
  156. package/dist/steps/types.d.ts +36 -0
  157. package/dist/steps/types.js +2 -0
  158. package/dist/steps/types.js.map +1 -0
  159. package/dist/tui/app.d.ts +15 -0
  160. package/dist/tui/app.js +297 -0
  161. package/dist/tui/app.js.map +1 -0
  162. package/dist/tui/banner.d.ts +1 -0
  163. package/dist/tui/banner.js +11 -0
  164. package/dist/tui/banner.js.map +1 -0
  165. package/dist/tui/colors.d.ts +22 -0
  166. package/dist/tui/colors.js +30 -0
  167. package/dist/tui/colors.js.map +1 -0
  168. package/dist/tui/components/agent-panel.d.ts +8 -0
  169. package/dist/tui/components/agent-panel.js +80 -0
  170. package/dist/tui/components/agent-panel.js.map +1 -0
  171. package/dist/tui/components/header.d.ts +15 -0
  172. package/dist/tui/components/header.js +69 -0
  173. package/dist/tui/components/header.js.map +1 -0
  174. package/dist/tui/components/status-bar.d.ts +2 -0
  175. package/dist/tui/components/status-bar.js +8 -0
  176. package/dist/tui/components/status-bar.js.map +1 -0
  177. package/dist/tui/components/task-board.d.ts +3 -0
  178. package/dist/tui/components/task-board.js +96 -0
  179. package/dist/tui/components/task-board.js.map +1 -0
  180. package/dist/tui/display.d.ts +23 -0
  181. package/dist/tui/display.js +125 -0
  182. package/dist/tui/display.js.map +1 -0
  183. package/dist/tui/input.d.ts +2 -0
  184. package/dist/tui/input.js +44 -0
  185. package/dist/tui/input.js.map +1 -0
  186. package/dist/tui/layout-master.d.ts +7 -0
  187. package/dist/tui/layout-master.js +31 -0
  188. package/dist/tui/layout-master.js.map +1 -0
  189. package/dist/tui/layout.d.ts +13 -0
  190. package/dist/tui/layout.js +37 -0
  191. package/dist/tui/layout.js.map +1 -0
  192. package/dist/tui/pane-formatter.d.ts +27 -0
  193. package/dist/tui/pane-formatter.js +153 -0
  194. package/dist/tui/pane-formatter.js.map +1 -0
  195. package/dist/tui/renderer.d.ts +8 -0
  196. package/dist/tui/renderer.js +30 -0
  197. package/dist/tui/renderer.js.map +1 -0
  198. package/dist/tui/screen.d.ts +12 -0
  199. package/dist/tui/screen.js +32 -0
  200. package/dist/tui/screen.js.map +1 -0
  201. package/dist/tui/structured-display.d.ts +5 -0
  202. package/dist/tui/structured-display.js +74 -0
  203. package/dist/tui/structured-display.js.map +1 -0
  204. package/dist/tui/tmux-display.d.ts +6 -0
  205. package/dist/tui/tmux-display.js +187 -0
  206. package/dist/tui/tmux-display.js.map +1 -0
  207. package/dist/tui/tmux.d.ts +26 -0
  208. package/dist/tui/tmux.js +265 -0
  209. package/dist/tui/tmux.js.map +1 -0
  210. package/dist/types.d.ts +15 -0
  211. package/dist/types.js +2 -0
  212. package/dist/types.js.map +1 -0
  213. package/dist/utils/git.d.ts +6 -0
  214. package/dist/utils/git.js +35 -0
  215. package/dist/utils/git.js.map +1 -0
  216. package/dist/utils/hello.d.ts +1 -0
  217. package/dist/utils/hello.js +4 -0
  218. package/dist/utils/hello.js.map +1 -0
  219. package/dist/utils/id.d.ts +1 -0
  220. package/dist/utils/id.js +5 -0
  221. package/dist/utils/id.js.map +1 -0
  222. package/dist/utils/jsonl.d.ts +2 -0
  223. package/dist/utils/jsonl.js +18 -0
  224. package/dist/utils/jsonl.js.map +1 -0
  225. package/dist/utils/logger.d.ts +20 -0
  226. package/dist/utils/logger.js +40 -0
  227. package/dist/utils/logger.js.map +1 -0
  228. package/dist/utils/pricing.d.ts +3 -0
  229. package/dist/utils/pricing.js +26 -0
  230. package/dist/utils/pricing.js.map +1 -0
  231. package/dist/utils/xml.d.ts +13 -0
  232. package/dist/utils/xml.js +67 -0
  233. package/dist/utils/xml.js.map +1 -0
  234. package/dist/utils/yaml.d.ts +5 -0
  235. package/dist/utils/yaml.js +126 -0
  236. package/dist/utils/yaml.js.map +1 -0
  237. package/package.json +45 -0
  238. package/templates/CONSTITUTION.md +10 -0
  239. package/templates/STATE.md +3 -0
  240. 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,2 @@
1
+ export type KeyHandler = (key: string) => void;
2
+ export declare function startKeyListener(handler: KeyHandler): () => void;
@@ -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,7 @@
1
+ import type { Rect } from './layout.js';
2
+ export interface MasterLayout {
3
+ readonly header: Rect;
4
+ readonly taskBoard: Rect;
5
+ readonly statusBar: Rect;
6
+ }
7
+ export declare function calculateMasterLayout(rows: number, cols: number): MasterLayout;
@@ -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;