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,297 @@
1
+ import { calculateLayout } from './layout.js';
2
+ import { calculateMasterLayout } from './layout-master.js';
3
+ import { renderHeader } from './components/header.js';
4
+ import { renderTaskBoard } from './components/task-board.js';
5
+ import { renderAgentPanel } from './components/agent-panel.js';
6
+ import { renderStatusBar } from './components/status-bar.js';
7
+ import { renderFrame } from './renderer.js';
8
+ import { getScreenSize, enterRawMode, exitRawMode, hideCursor, showCursor, clearScreen, } from './screen.js';
9
+ import { startKeyListener } from './input.js';
10
+ export function createTuiApp(config) {
11
+ const refreshRate = config.refreshRate ?? 250;
12
+ const state = {
13
+ phase: 'idle',
14
+ currentWave: 0,
15
+ totalWaves: 0,
16
+ tasks: [],
17
+ completedTasks: 0,
18
+ totalInputTokens: 0,
19
+ totalOutputTokens: 0,
20
+ activeAgent: null,
21
+ };
22
+ let renderInterval = null;
23
+ let cleanupKeyListener = null;
24
+ let running = false;
25
+ function render() {
26
+ const size = getScreenSize();
27
+ if (config.masterMode) {
28
+ // Master mode: full-width task board, no agent panel
29
+ const masterLayout = calculateMasterLayout(size.rows, size.cols);
30
+ const header = renderHeader({
31
+ version: config.version,
32
+ projectName: config.projectName,
33
+ phase: state.phase,
34
+ currentWave: state.currentWave,
35
+ totalWaves: state.totalWaves,
36
+ completedTasks: state.completedTasks,
37
+ totalTasks: state.tasks.length,
38
+ totalTokens: state.totalInputTokens + state.totalOutputTokens,
39
+ }, masterLayout.header);
40
+ const taskBoard = renderTaskBoard(state.tasks, state.currentWave, masterLayout.taskBoard);
41
+ const statusBar = renderStatusBar(masterLayout.statusBar);
42
+ // Use a compatible layout for renderFrame (agent panel has zero size)
43
+ const compatLayout = {
44
+ header: masterLayout.header,
45
+ taskBoard: masterLayout.taskBoard,
46
+ agentPanel: { top: masterLayout.header.height, left: size.cols, width: 0, height: 0 },
47
+ statusBar: masterLayout.statusBar,
48
+ };
49
+ renderFrame({ header, taskBoard, agentPanel: [], statusBar }, compatLayout);
50
+ }
51
+ else {
52
+ // Normal mode: split layout with agent panel
53
+ const layout = calculateLayout(size.rows, size.cols);
54
+ const header = renderHeader({
55
+ version: config.version,
56
+ projectName: config.projectName,
57
+ phase: state.phase,
58
+ currentWave: state.currentWave,
59
+ totalWaves: state.totalWaves,
60
+ completedTasks: state.completedTasks,
61
+ totalTasks: state.tasks.length,
62
+ totalTokens: state.totalInputTokens + state.totalOutputTokens,
63
+ }, layout.header);
64
+ const taskBoard = renderTaskBoard(state.tasks, state.currentWave, layout.taskBoard);
65
+ const agentPanelState = state.activeAgent
66
+ ? {
67
+ agentId: state.activeAgent.id,
68
+ taskTitle: state.activeAgent.taskTitle,
69
+ lines: state.activeAgent.lines,
70
+ tokens: state.activeAgent.tokens,
71
+ }
72
+ : null;
73
+ const agentPanel = renderAgentPanel(agentPanelState, layout.agentPanel);
74
+ const statusBar = renderStatusBar(layout.statusBar);
75
+ renderFrame({ header, taskBoard, agentPanel, statusBar }, layout);
76
+ }
77
+ }
78
+ function handleKey(key) {
79
+ if (key === 'q' || key === 'ctrl-c') {
80
+ stop();
81
+ if (key === 'ctrl-c') {
82
+ process.exit(0);
83
+ }
84
+ }
85
+ }
86
+ function onSigint() {
87
+ stop();
88
+ process.exit(0);
89
+ }
90
+ function onSigwinch() {
91
+ if (running) {
92
+ render();
93
+ }
94
+ }
95
+ function start() {
96
+ if (running)
97
+ return;
98
+ running = true;
99
+ enterRawMode();
100
+ hideCursor();
101
+ clearScreen();
102
+ cleanupKeyListener = startKeyListener(handleKey);
103
+ renderInterval = setInterval(render, refreshRate);
104
+ process.on('SIGINT', onSigint);
105
+ process.on('SIGWINCH', onSigwinch);
106
+ // Initial render
107
+ render();
108
+ }
109
+ function stop() {
110
+ if (!running)
111
+ return;
112
+ running = false;
113
+ if (renderInterval !== null) {
114
+ clearInterval(renderInterval);
115
+ renderInterval = null;
116
+ }
117
+ if (cleanupKeyListener !== null) {
118
+ cleanupKeyListener();
119
+ cleanupKeyListener = null;
120
+ }
121
+ process.removeListener('SIGINT', onSigint);
122
+ process.removeListener('SIGWINCH', onSigwinch);
123
+ showCursor();
124
+ exitRawMode();
125
+ clearScreen();
126
+ }
127
+ function handleEngineEvent(event) {
128
+ switch (event.type) {
129
+ case 'phase_changed':
130
+ state.phase = event.to;
131
+ break;
132
+ case 'tasks_loaded':
133
+ state.tasks = [...event.tasks];
134
+ state.totalWaves = event.totalWaves;
135
+ break;
136
+ case 'wave_started':
137
+ state.currentWave = event.wave;
138
+ break;
139
+ case 'wave_completed':
140
+ // Update completed count from results
141
+ for (const result of event.results.tasks) {
142
+ if (result.status === 'completed') {
143
+ const task = state.tasks.find((t) => t.id === result.taskId);
144
+ if (task) {
145
+ task.status = 'completed';
146
+ }
147
+ }
148
+ else if (result.status === 'failed') {
149
+ const task = state.tasks.find((t) => t.id === result.taskId);
150
+ if (task) {
151
+ task.status = 'failed';
152
+ }
153
+ }
154
+ }
155
+ state.completedTasks = state.tasks.filter((t) => t.status === 'completed').length;
156
+ state.totalInputTokens += event.results.totalInputTokens;
157
+ state.totalOutputTokens += event.results.totalOutputTokens;
158
+ break;
159
+ case 'task_event': {
160
+ const taskEvent = event.event;
161
+ if (taskEvent.type === 'task_created' && taskEvent.taskId) {
162
+ // We might receive tasks through task events
163
+ // If the task is not yet in our list, we note it
164
+ }
165
+ if (taskEvent.type === 'task_started' && taskEvent.taskId) {
166
+ const task = state.tasks.find((t) => t.id === taskEvent.taskId);
167
+ if (task) {
168
+ task.status = 'running';
169
+ // Set up active agent
170
+ state.activeAgent = {
171
+ id: taskEvent.agentId ?? 'agent',
172
+ taskTitle: task.title,
173
+ lines: [],
174
+ tokens: 0,
175
+ };
176
+ }
177
+ }
178
+ if (taskEvent.type === 'task_completed' && taskEvent.taskId) {
179
+ const task = state.tasks.find((t) => t.id === taskEvent.taskId);
180
+ if (task) {
181
+ task.status = 'completed';
182
+ }
183
+ state.completedTasks = state.tasks.filter((t) => t.status === 'completed').length;
184
+ // Clear active agent if it was this task
185
+ if (state.activeAgent && taskEvent.taskId) {
186
+ const agentTask = state.tasks.find((t) => t.title === state.activeAgent?.taskTitle);
187
+ if (agentTask && agentTask.id === taskEvent.taskId) {
188
+ state.activeAgent = null;
189
+ }
190
+ }
191
+ }
192
+ if (taskEvent.type === 'task_failed' && taskEvent.taskId) {
193
+ const task = state.tasks.find((t) => t.id === taskEvent.taskId);
194
+ if (task) {
195
+ task.status = 'failed';
196
+ }
197
+ }
198
+ if (taskEvent.type === 'wave_started' && taskEvent.wave !== undefined) {
199
+ state.currentWave = taskEvent.wave;
200
+ }
201
+ if (taskEvent.type === 'cost_update') {
202
+ if (taskEvent.inputTokens !== undefined) {
203
+ state.totalInputTokens += taskEvent.inputTokens;
204
+ }
205
+ if (taskEvent.outputTokens !== undefined) {
206
+ state.totalOutputTokens += taskEvent.outputTokens;
207
+ }
208
+ }
209
+ if (taskEvent.type === 'phase_changed' && taskEvent.phase) {
210
+ state.phase = taskEvent.phase;
211
+ }
212
+ break;
213
+ }
214
+ case 'agent_event':
215
+ // Delegate to handleAgentEvent
216
+ handleAgentEvent(event.taskId, event.event);
217
+ break;
218
+ case 'complete':
219
+ state.phase = 'complete';
220
+ state.totalInputTokens = event.totalInputTokens;
221
+ state.totalOutputTokens = event.totalOutputTokens;
222
+ state.activeAgent = null;
223
+ break;
224
+ case 'error':
225
+ state.phase = event.phase;
226
+ state.activeAgent = null;
227
+ break;
228
+ case 'approval_required':
229
+ // Nothing to do in TUI state for now
230
+ break;
231
+ case 'alert':
232
+ // Alerts are displayed via the agent panel
233
+ break;
234
+ }
235
+ }
236
+ function handleAgentEvent(taskId, event) {
237
+ // Ensure we have an active agent for this task
238
+ if (!state.activeAgent) {
239
+ const task = state.tasks.find((t) => t.id === taskId);
240
+ state.activeAgent = {
241
+ id: 'agent',
242
+ taskTitle: task?.title ?? taskId,
243
+ lines: [],
244
+ tokens: 0,
245
+ };
246
+ }
247
+ switch (event.type) {
248
+ case 'text_delta':
249
+ {
250
+ // Append text to current line or start new line
251
+ const parts = event.text.split('\n');
252
+ if (state.activeAgent.lines.length === 0) {
253
+ state.activeAgent.lines.push(parts[0]);
254
+ }
255
+ else {
256
+ const lastIdx = state.activeAgent.lines.length - 1;
257
+ state.activeAgent.lines[lastIdx] += parts[0];
258
+ }
259
+ for (let i = 1; i < parts.length; i++) {
260
+ state.activeAgent.lines.push(parts[i]);
261
+ }
262
+ }
263
+ // Cap buffer at 1000 lines
264
+ if (state.activeAgent.lines.length > 1000) {
265
+ state.activeAgent.lines.splice(0, state.activeAgent.lines.length - 1000);
266
+ }
267
+ break;
268
+ case 'cost_update':
269
+ state.activeAgent.tokens = event.inputTokens + event.outputTokens;
270
+ break;
271
+ case 'tool_use':
272
+ state.activeAgent.lines.push(`> ${String(event.tool)}`);
273
+ break;
274
+ case 'tool_result':
275
+ // Optionally show tool result summary
276
+ break;
277
+ case 'complete':
278
+ // Agent finished
279
+ break;
280
+ case 'error':
281
+ state.activeAgent.lines.push(`ERROR: ${event.error}`);
282
+ break;
283
+ }
284
+ }
285
+ // Expose internal state for testing
286
+ const app = {
287
+ start,
288
+ stop,
289
+ handleEngineEvent,
290
+ handleAgentEvent,
291
+ get _state() {
292
+ return state;
293
+ },
294
+ };
295
+ return app;
296
+ }
297
+ //# sourceMappingURL=app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"app.js","sourceRoot":"","sources":["../../src/tui/app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare const BANNER = "\n ad88888ba 88 db 8b d8 88888888888 88888888ba, 88888888ba 88 8b d8 88888888888 88888888ba\nd8\" \"8b 88 d88b `8b d8' 88 88 `\"8b 88 \"8b 88 `8b d8' 88 88 \"8b\nY8, 88 d8'`8b `8b d8' 88 88 `8b 88 ,8P 88 `8b d8' 88 88 ,8P\n`Y8aaaaa, 88 d8' `8b `8b d8' 88aaaaa 88 88 88aaaaaa8P' 88 `8b d8' 88aaaaa 88aaaaaa8P'\n `\"\"\"\"\"8b, 88 d8YaaaaY8b `8b d8' 88\"\"\"\"\" 88 88 88\"\"\"\"88' 88 `8b d8' 88\"\"\"\"\" 88\"\"\"\"88'\n `8b 88 d8\"\"\"\"\"\"\"\"8b `8b d8' 88 88 8P 88 `8b 88 `8b d8' 88 88 `8b\nY8a a8P 88 d8' `8b `888' 88 88 .a8P 88 `8b 88 `888' 88 88 `8b\n \"Y88888P\" 88888888888 d8' `8b `8' 88888888888 88888888Y\"' 88 `8b 88 `8' 88888888888 88 `8b\n";
@@ -0,0 +1,11 @@
1
+ export const BANNER = `
2
+ ad88888ba 88 db 8b d8 88888888888 88888888ba, 88888888ba 88 8b d8 88888888888 88888888ba
3
+ d8" "8b 88 d88b \`8b d8' 88 88 \`"8b 88 "8b 88 \`8b d8' 88 88 "8b
4
+ Y8, 88 d8'\`8b \`8b d8' 88 88 \`8b 88 ,8P 88 \`8b d8' 88 88 ,8P
5
+ \`Y8aaaaa, 88 d8' \`8b \`8b d8' 88aaaaa 88 88 88aaaaaa8P' 88 \`8b d8' 88aaaaa 88aaaaaa8P'
6
+ \`"""""8b, 88 d8YaaaaY8b \`8b d8' 88""""" 88 88 88""""88' 88 \`8b d8' 88""""" 88""""88'
7
+ \`8b 88 d8""""""""8b \`8b d8' 88 88 8P 88 \`8b 88 \`8b d8' 88 88 \`8b
8
+ Y8a a8P 88 d8' \`8b \`888' 88 88 .a8P 88 \`8b 88 \`888' 88 88 \`8b
9
+ "Y88888P" 88888888888 d8' \`8b \`8' 88888888888 88888888Y"' 88 \`8b 88 \`8' 88888888888 88 \`8b
10
+ `;
11
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../src/tui/banner.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,MAAM,GAAG;;;;;;;;;CASrB,CAAC"}
@@ -0,0 +1,22 @@
1
+ export declare const RESET = "\u001B[0m";
2
+ export declare const BOLD = "\u001B[1m";
3
+ export declare const DIM = "\u001B[2m";
4
+ export declare const ITALIC = "\u001B[3m";
5
+ export declare const UNDERLINE = "\u001B[4m";
6
+ export declare const BLACK = "\u001B[30m";
7
+ export declare const RED = "\u001B[31m";
8
+ export declare const GREEN = "\u001B[32m";
9
+ export declare const YELLOW = "\u001B[33m";
10
+ export declare const BLUE = "\u001B[34m";
11
+ export declare const MAGENTA = "\u001B[35m";
12
+ export declare const CYAN = "\u001B[36m";
13
+ export declare const WHITE = "\u001B[37m";
14
+ export declare const GRAY = "\u001B[90m";
15
+ export declare const BG_BLACK = "\u001B[40m";
16
+ export declare const BG_RED = "\u001B[41m";
17
+ export declare const BG_GREEN = "\u001B[42m";
18
+ export declare const BG_YELLOW = "\u001B[43m";
19
+ export declare const BG_BLUE = "\u001B[44m";
20
+ export declare const BG_WHITE = "\u001B[47m";
21
+ export declare function color(text: string, ...codes: string[]): string;
22
+ export declare function stripAnsi(text: string): string;
@@ -0,0 +1,30 @@
1
+ export const RESET = '\x1b[0m';
2
+ export const BOLD = '\x1b[1m';
3
+ export const DIM = '\x1b[2m';
4
+ export const ITALIC = '\x1b[3m';
5
+ export const UNDERLINE = '\x1b[4m';
6
+ // Foreground colors
7
+ export const BLACK = '\x1b[30m';
8
+ export const RED = '\x1b[31m';
9
+ export const GREEN = '\x1b[32m';
10
+ export const YELLOW = '\x1b[33m';
11
+ export const BLUE = '\x1b[34m';
12
+ export const MAGENTA = '\x1b[35m';
13
+ export const CYAN = '\x1b[36m';
14
+ export const WHITE = '\x1b[37m';
15
+ export const GRAY = '\x1b[90m';
16
+ // Background colors
17
+ export const BG_BLACK = '\x1b[40m';
18
+ export const BG_RED = '\x1b[41m';
19
+ export const BG_GREEN = '\x1b[42m';
20
+ export const BG_YELLOW = '\x1b[43m';
21
+ export const BG_BLUE = '\x1b[44m';
22
+ export const BG_WHITE = '\x1b[47m';
23
+ // Helpers
24
+ export function color(text, ...codes) {
25
+ return codes.join('') + text + RESET;
26
+ }
27
+ export function stripAnsi(text) {
28
+ return text.replace(/\x1b\[[0-9;]*m/g, '');
29
+ }
30
+ //# sourceMappingURL=colors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"colors.js","sourceRoot":"","sources":["../../src/tui/colors.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC;AAC/B,MAAM,CAAC,MAAM,IAAI,GAAG,SAAS,CAAC;AAC9B,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC;AAC7B,MAAM,CAAC,MAAM,MAAM,GAAG,SAAS,CAAC;AAChC,MAAM,CAAC,MAAM,SAAS,GAAG,SAAS,CAAC;AAEnC,oBAAoB;AACpB,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAC;AAChC,MAAM,CAAC,MAAM,GAAG,GAAG,UAAU,CAAC;AAC9B,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAC;AAChC,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC;AACjC,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAC;AAC/B,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC;AAClC,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAC;AAC/B,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAC;AAChC,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAC;AAE/B,oBAAoB;AACpB,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AACnC,MAAM,CAAC,MAAM,MAAM,GAAG,UAAU,CAAC;AACjC,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AACnC,MAAM,CAAC,MAAM,SAAS,GAAG,UAAU,CAAC;AACpC,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC;AAClC,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAC;AAEnC,UAAU;AACV,MAAM,UAAU,KAAK,CAAC,IAAY,EAAE,GAAG,KAAe;IACpD,OAAO,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,KAAK,CAAC;AACvC,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,OAAO,IAAI,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,CAAC;AAC7C,CAAC"}
@@ -0,0 +1,8 @@
1
+ import type { Rect } from '../layout.js';
2
+ export interface AgentPanelState {
3
+ readonly agentId: string;
4
+ readonly taskTitle: string;
5
+ readonly lines: readonly string[];
6
+ readonly tokens: number;
7
+ }
8
+ export declare function renderAgentPanel(state: AgentPanelState | null, rect: Rect): string[];
@@ -0,0 +1,80 @@
1
+ import { RESET, BOLD, DIM, GREEN, WHITE, GRAY, stripAnsi, } from '../colors.js';
2
+ function padRight(text, width) {
3
+ const visibleLen = stripAnsi(text).length;
4
+ if (visibleLen >= width)
5
+ return text;
6
+ return text + ' '.repeat(width - visibleLen);
7
+ }
8
+ function truncateVisible(text, maxLen) {
9
+ // Truncate based on visible length (without ANSI codes)
10
+ const stripped = stripAnsi(text);
11
+ if (stripped.length <= maxLen)
12
+ return text;
13
+ if (maxLen <= 3)
14
+ return stripped.slice(0, maxLen);
15
+ return stripped.slice(0, maxLen - 1) + '\u2026';
16
+ }
17
+ function wrapLine(text, width) {
18
+ if (width <= 0)
19
+ return [''];
20
+ const stripped = stripAnsi(text);
21
+ if (stripped.length <= width)
22
+ return [text];
23
+ // Wrap raw text (strip ANSI for simplicity in wrapping)
24
+ const result = [];
25
+ for (let i = 0; i < stripped.length; i += width) {
26
+ result.push(stripped.slice(i, i + width));
27
+ }
28
+ return result;
29
+ }
30
+ export function renderAgentPanel(state, rect) {
31
+ const lines = [];
32
+ const maxWidth = rect.width;
33
+ if (state === null) {
34
+ // Center "No active agent" message
35
+ const msg = 'No active agent';
36
+ const centerRow = Math.floor(rect.height / 2);
37
+ for (let i = 0; i < rect.height; i++) {
38
+ if (i === centerRow) {
39
+ const pad = Math.max(0, Math.floor((maxWidth - msg.length) / 2));
40
+ lines.push(padRight(' '.repeat(pad) + `${DIM}${msg}${RESET}`, maxWidth));
41
+ }
42
+ else {
43
+ lines.push(' '.repeat(maxWidth));
44
+ }
45
+ }
46
+ return lines.slice(0, rect.height);
47
+ }
48
+ // Header line: "Agent: executor-1 │ Task: Setup DB │ 12K tok"
49
+ const tokenStr = state.tokens >= 1000 ? `${Math.round(state.tokens / 1000)}K` : String(state.tokens);
50
+ const headerParts = [
51
+ `${BOLD}Agent:${RESET} ${GREEN}${state.agentId}${RESET}`,
52
+ `${BOLD}Task:${RESET} ${WHITE}${state.taskTitle}${RESET}`,
53
+ `${GREEN}${tokenStr} tok${RESET}`,
54
+ ];
55
+ const headerLine = ` ${headerParts.join(` ${DIM}\u2502${RESET} `)}`;
56
+ lines.push(padRight(truncateVisible(headerLine, maxWidth), maxWidth));
57
+ // Separator line
58
+ lines.push(`${DIM}${'─'.repeat(maxWidth)}${RESET}`);
59
+ // Output lines - show last N lines that fit
60
+ const availableHeight = rect.height - 2; // header + separator
61
+ const wrappedOutput = [];
62
+ for (const outputLine of state.lines) {
63
+ const wrapped = wrapLine(outputLine, maxWidth > 1 ? maxWidth - 1 : 1);
64
+ for (const w of wrapped) {
65
+ wrappedOutput.push(w);
66
+ }
67
+ }
68
+ // Take the last availableHeight lines (scroll to bottom)
69
+ const startIdx = Math.max(0, wrappedOutput.length - availableHeight);
70
+ const visibleOutput = wrappedOutput.slice(startIdx, startIdx + availableHeight);
71
+ for (const line of visibleOutput) {
72
+ lines.push(padRight(` ${GRAY}${line}${RESET}`, maxWidth));
73
+ }
74
+ // Fill remaining height with empty lines
75
+ while (lines.length < rect.height) {
76
+ lines.push(' '.repeat(maxWidth));
77
+ }
78
+ return lines.slice(0, rect.height);
79
+ }
80
+ //# sourceMappingURL=agent-panel.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"agent-panel.js","sourceRoot":"","sources":["../../../src/tui/components/agent-panel.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ import type { Phase } from '../../types.js';
2
+ import type { Rect } from '../layout.js';
3
+ export interface HeaderState {
4
+ readonly version: string;
5
+ readonly projectName: string;
6
+ readonly phase: Phase;
7
+ readonly currentWave: number;
8
+ readonly totalWaves: number;
9
+ readonly completedTasks: number;
10
+ readonly totalTasks: number;
11
+ readonly totalTokens: number;
12
+ }
13
+ export declare function phaseColor(phase: Phase): string;
14
+ export declare function formatTokenCount(tokens: number): string;
15
+ export declare function renderHeader(state: HeaderState, rect: Rect): string;
@@ -0,0 +1,69 @@
1
+ import { RESET, BOLD, DIM, RED, GREEN, YELLOW, BLUE, CYAN, WHITE, BG_BLUE, stripAnsi, } from '../colors.js';
2
+ export function phaseColor(phase) {
3
+ switch (phase) {
4
+ case 'discover':
5
+ return CYAN;
6
+ case 'plan':
7
+ return BLUE;
8
+ case 'execute':
9
+ return GREEN;
10
+ case 'security-review':
11
+ return RED;
12
+ case 'qa-review':
13
+ return YELLOW;
14
+ case 'verify':
15
+ return YELLOW;
16
+ case 'complete':
17
+ return GREEN;
18
+ case 'idle':
19
+ default:
20
+ return DIM;
21
+ }
22
+ }
23
+ export function formatTokenCount(tokens) {
24
+ if (tokens >= 1_000_000) {
25
+ return `${(tokens / 1_000_000).toFixed(1)}M`;
26
+ }
27
+ if (tokens >= 1_000) {
28
+ return `${Math.round(tokens / 1_000)}K`;
29
+ }
30
+ return String(tokens);
31
+ }
32
+ function progressBar(completed, total, width) {
33
+ if (total === 0)
34
+ return '░'.repeat(width);
35
+ const filled = Math.round((completed / total) * width);
36
+ const empty = width - filled;
37
+ return '█'.repeat(filled) + '░'.repeat(empty);
38
+ }
39
+ export function renderHeader(state, rect) {
40
+ const phaseName = state.phase.toUpperCase();
41
+ const phaseStr = `${phaseColor(state.phase)}${BOLD}${phaseName}${RESET}`;
42
+ const waveStr = state.totalWaves > 0
43
+ ? `Wave ${state.currentWave}/${state.totalWaves}`
44
+ : 'Wave -/-';
45
+ const barWidth = 6;
46
+ const bar = progressBar(state.completedTasks, state.totalTasks, barWidth);
47
+ const progressStr = `${bar} ${state.completedTasks}/${state.totalTasks}`;
48
+ const tokenStr = `${formatTokenCount(state.totalTokens)} tok`;
49
+ const titleStr = `${BOLD}${WHITE}slavedriver${RESET} ${DIM}v${state.version}${RESET}`;
50
+ const parts = [
51
+ titleStr,
52
+ state.projectName,
53
+ phaseStr,
54
+ waveStr,
55
+ progressStr,
56
+ tokenStr,
57
+ ];
58
+ const line = `${BG_BLUE}${WHITE} ${parts.join(` ${DIM}\u2502${RESET}${BG_BLUE}${WHITE} `)} ${RESET}`;
59
+ // Pad to full width
60
+ const visibleLen = stripAnsi(line).length;
61
+ if (visibleLen < rect.width) {
62
+ return line.replace(new RegExp(`${escapeRegex(RESET)}$`), `${BG_BLUE}${' '.repeat(rect.width - visibleLen)}${RESET}`);
63
+ }
64
+ return line;
65
+ }
66
+ function escapeRegex(str) {
67
+ return str.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
68
+ }
69
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.js","sourceRoot":"","sources":["../../../src/tui/components/header.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ import type { Rect } from '../layout.js';
2
+ export declare function renderStatusBar(rect: Rect): string;
@@ -0,0 +1,8 @@
1
+ import { RESET, DIM, GRAY, BG_BLACK, WHITE, stripAnsi, } from '../colors.js';
2
+ export function renderStatusBar(rect) {
3
+ const hints = `${GRAY}${DIM} q${RESET}${BG_BLACK}${WHITE} Quit ${DIM}${GRAY}\u2502${RESET}${BG_BLACK}${GRAY}${DIM} Ctrl+C${RESET}${BG_BLACK}${WHITE} Force Quit${RESET}`;
4
+ const visibleLen = stripAnsi(hints).length;
5
+ const padding = Math.max(0, rect.width - visibleLen);
6
+ return `${BG_BLACK}${hints}${' '.repeat(padding)}${RESET}`;
7
+ }
8
+ //# sourceMappingURL=status-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"status-bar.js","sourceRoot":"","sources":["../../../src/tui/components/status-bar.ts"],"names":[],"mappings":"AACA,OAAO,EACL,KAAK,EACL,GAAG,EACH,IAAI,EACJ,QAAQ,EACR,KAAK,EACL,SAAS,GACV,MAAM,cAAc,CAAC;AAEtB,MAAM,UAAU,eAAe,CAAC,IAAU;IACxC,MAAM,KAAK,GAAG,GAAG,IAAI,GAAG,GAAG,KAAK,KAAK,GAAG,QAAQ,GAAG,KAAK,SAAS,GAAG,GAAG,IAAI,SAAS,KAAK,GAAG,QAAQ,GAAG,IAAI,GAAG,GAAG,UAAU,KAAK,GAAG,QAAQ,GAAG,KAAK,cAAc,KAAK,EAAE,CAAC;IAEzK,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,GAAG,UAAU,CAAC,CAAC;IAErD,OAAO,GAAG,QAAQ,GAAG,KAAK,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,KAAK,EAAE,CAAC;AAC7D,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { Task } from '../../types.js';
2
+ import type { Rect } from '../layout.js';
3
+ export declare function renderTaskBoard(tasks: readonly Task[], currentWave: number, rect: Rect): string[];