pi-mission-control 0.0.0-dev

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 (110) hide show
  1. package/README.md +205 -0
  2. package/agents/auditor.md +45 -0
  3. package/agents/worker.md +44 -0
  4. package/dist/index.d.ts +9 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +526 -0
  7. package/dist/index.js.map +1 -0
  8. package/dist/state.d.ts +265 -0
  9. package/dist/state.d.ts.map +1 -0
  10. package/dist/state.js +474 -0
  11. package/dist/state.js.map +1 -0
  12. package/dist/tools/add-phase.d.ts +28 -0
  13. package/dist/tools/add-phase.d.ts.map +1 -0
  14. package/dist/tools/add-phase.js +69 -0
  15. package/dist/tools/add-phase.js.map +1 -0
  16. package/dist/tools/add-task.d.ts +30 -0
  17. package/dist/tools/add-task.d.ts.map +1 -0
  18. package/dist/tools/add-task.js +85 -0
  19. package/dist/tools/add-task.js.map +1 -0
  20. package/dist/tools/index.d.ts +13 -0
  21. package/dist/tools/index.d.ts.map +1 -0
  22. package/dist/tools/index.js +16 -0
  23. package/dist/tools/index.js.map +1 -0
  24. package/dist/tools/init.d.ts +34 -0
  25. package/dist/tools/init.d.ts.map +1 -0
  26. package/dist/tools/init.js +75 -0
  27. package/dist/tools/init.js.map +1 -0
  28. package/dist/tools/mission-complete.d.ts +30 -0
  29. package/dist/tools/mission-complete.d.ts.map +1 -0
  30. package/dist/tools/mission-complete.js +85 -0
  31. package/dist/tools/mission-complete.js.map +1 -0
  32. package/dist/tools/mission-resume.d.ts +35 -0
  33. package/dist/tools/mission-resume.d.ts.map +1 -0
  34. package/dist/tools/mission-resume.js +87 -0
  35. package/dist/tools/mission-resume.js.map +1 -0
  36. package/dist/tools/scaffold.d.ts +24 -0
  37. package/dist/tools/scaffold.d.ts.map +1 -0
  38. package/dist/tools/scaffold.js +129 -0
  39. package/dist/tools/scaffold.js.map +1 -0
  40. package/dist/tools/update-phase.d.ts +33 -0
  41. package/dist/tools/update-phase.d.ts.map +1 -0
  42. package/dist/tools/update-phase.js +101 -0
  43. package/dist/tools/update-phase.js.map +1 -0
  44. package/dist/tools/update-task.d.ts +34 -0
  45. package/dist/tools/update-task.d.ts.map +1 -0
  46. package/dist/tools/update-task.js +104 -0
  47. package/dist/tools/update-task.js.map +1 -0
  48. package/dist/tui/dashboard.d.ts +146 -0
  49. package/dist/tui/dashboard.d.ts.map +1 -0
  50. package/dist/tui/dashboard.js +381 -0
  51. package/dist/tui/dashboard.js.map +1 -0
  52. package/dist/tui/header.d.ts +39 -0
  53. package/dist/tui/header.d.ts.map +1 -0
  54. package/dist/tui/header.js +62 -0
  55. package/dist/tui/header.js.map +1 -0
  56. package/dist/tui/idle-view.d.ts +44 -0
  57. package/dist/tui/idle-view.d.ts.map +1 -0
  58. package/dist/tui/idle-view.js +87 -0
  59. package/dist/tui/idle-view.js.map +1 -0
  60. package/dist/tui/index.d.ts +13 -0
  61. package/dist/tui/index.d.ts.map +1 -0
  62. package/dist/tui/index.js +15 -0
  63. package/dist/tui/index.js.map +1 -0
  64. package/dist/tui/past-runs.d.ts +49 -0
  65. package/dist/tui/past-runs.d.ts.map +1 -0
  66. package/dist/tui/past-runs.js +207 -0
  67. package/dist/tui/past-runs.js.map +1 -0
  68. package/dist/tui/phases-panel.d.ts +46 -0
  69. package/dist/tui/phases-panel.d.ts.map +1 -0
  70. package/dist/tui/phases-panel.js +161 -0
  71. package/dist/tui/phases-panel.js.map +1 -0
  72. package/dist/tui/progress-bar.d.ts +37 -0
  73. package/dist/tui/progress-bar.d.ts.map +1 -0
  74. package/dist/tui/progress-bar.js +123 -0
  75. package/dist/tui/progress-bar.js.map +1 -0
  76. package/dist/tui/styles.d.ts +8 -0
  77. package/dist/tui/styles.d.ts.map +1 -0
  78. package/dist/tui/styles.js +22 -0
  79. package/dist/tui/styles.js.map +1 -0
  80. package/dist/tui/tasks-panel.d.ts +48 -0
  81. package/dist/tui/tasks-panel.d.ts.map +1 -0
  82. package/dist/tui/tasks-panel.js +191 -0
  83. package/dist/tui/tasks-panel.js.map +1 -0
  84. package/package.json +42 -0
  85. package/skills/mission-memory/SKILL.md +88 -0
  86. package/skills/mission-orchestrator/SKILL.md +167 -0
  87. package/skills/mission-pm/SKILL.md +83 -0
  88. package/skills/mission-research/SKILL.md +66 -0
  89. package/skills/mission-tech-lead/SKILL.md +68 -0
  90. package/src/index.ts +659 -0
  91. package/src/state.ts +623 -0
  92. package/src/tools/add-phase.ts +98 -0
  93. package/src/tools/add-task.ts +121 -0
  94. package/src/tools/index.ts +18 -0
  95. package/src/tools/init.ts +109 -0
  96. package/src/tools/mission-complete.ts +118 -0
  97. package/src/tools/mission-resume.ts +119 -0
  98. package/src/tools/scaffold.ts +167 -0
  99. package/src/tools/update-phase.ts +140 -0
  100. package/src/tools/update-task.ts +145 -0
  101. package/src/tui/dashboard.ts +441 -0
  102. package/src/tui/header.ts +85 -0
  103. package/src/tui/idle-view.ts +114 -0
  104. package/src/tui/index.ts +20 -0
  105. package/src/tui/past-runs.ts +261 -0
  106. package/src/tui/phases-panel.ts +199 -0
  107. package/src/tui/progress-bar.ts +152 -0
  108. package/src/tui/styles.ts +27 -0
  109. package/src/tui/tasks-panel.ts +228 -0
  110. package/templates/state.json +5 -0
@@ -0,0 +1,381 @@
1
+ /**
2
+ * Mission Control TUI Dashboard
3
+ *
4
+ * Main dashboard component that composes:
5
+ * - Header (run ID, timer, phase)
6
+ * - Phases panel (left)
7
+ * - Tasks panel (right)
8
+ * - Progress bar (bottom)
9
+ *
10
+ * Features:
11
+ * - Keyboard navigation (Up/Down/Left/Right)
12
+ * - Esc to close
13
+ * - Enter to init new mission when idle
14
+ * - Timed refresh for clock/file state
15
+ * - Overlay support via ctx.ui.custom(..., { overlay: true })
16
+ */
17
+ import { matchesKey, Key, truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
18
+ import { readState, readRun, listRuns as listAllRuns } from "../state.js";
19
+ import { HeaderComponent, formatElapsedTime } from "./header.js";
20
+ import { PhasesPanelComponent } from "./phases-panel.js";
21
+ import { TasksPanelComponent } from "./tasks-panel.js";
22
+ import { ProgressBarComponent } from "./progress-bar.js";
23
+ import { IdleViewComponent } from "./idle-view.js";
24
+ import { PastRunsComponent, extractPastRuns } from "./past-runs.js";
25
+ /**
26
+ * Mission Control Dashboard Component
27
+ *
28
+ * Usage:
29
+ * ```typescript
30
+ * const handle = ctx.ui.custom(
31
+ * (tui, theme, keybindings, done) => new MissionDashboard({ onClose: done }),
32
+ * { overlay: true }
33
+ * );
34
+ * ```
35
+ */
36
+ export class MissionDashboard {
37
+ // Sub-components
38
+ header;
39
+ phasesPanel;
40
+ tasksPanel;
41
+ progressBar;
42
+ idleView;
43
+ pastRuns;
44
+ // State
45
+ mode = "idle";
46
+ run = null;
47
+ state = null;
48
+ refreshInterval = null;
49
+ cachedWidth;
50
+ cachedLines;
51
+ tui = null;
52
+ theme = null;
53
+ // Callbacks
54
+ onClose;
55
+ onInitMission;
56
+ constructor(props) {
57
+ this.onClose = props.onClose;
58
+ this.onInitMission = props.onInitMission;
59
+ // Initialize sub-components
60
+ this.header = new HeaderComponent(null, "idle", true, true);
61
+ this.phasesPanel = new PhasesPanelComponent([], true);
62
+ this.tasksPanel = new TasksPanelComponent(null, false);
63
+ this.progressBar = new ProgressBarComponent(null, "");
64
+ this.idleView = new IdleViewComponent({
65
+ onInitMission: () => this.handleInitMission(),
66
+ onClose: () => this.onClose()
67
+ });
68
+ this.pastRuns = new PastRunsComponent();
69
+ // Initial data load
70
+ this.refreshData();
71
+ }
72
+ /**
73
+ * Start the refresh interval for clock/timer updates
74
+ */
75
+ startRefresh(tui) {
76
+ this.tui = tui;
77
+ if (this.refreshInterval) {
78
+ clearInterval(this.refreshInterval);
79
+ }
80
+ // Refresh every second for timer updates
81
+ this.refreshInterval = setInterval(() => {
82
+ this.refreshData();
83
+ tui.requestRender();
84
+ }, 1000);
85
+ }
86
+ /**
87
+ * Stop the refresh interval
88
+ */
89
+ stopRefresh() {
90
+ if (this.refreshInterval) {
91
+ clearInterval(this.refreshInterval);
92
+ this.refreshInterval = null;
93
+ }
94
+ }
95
+ /**
96
+ * Refresh data from files
97
+ */
98
+ refreshData() {
99
+ // Read state
100
+ this.state = readState();
101
+ // Determine mode and load run data
102
+ if (this.state.active_run_id) {
103
+ this.mode = "active";
104
+ const runData = readRun(this.state.active_run_id);
105
+ if (runData) {
106
+ const previousSelectedPhaseId = this.phasesPanel.getSelectedPhase()?.id;
107
+ this.run = runData;
108
+ this.header.update(this.run, this.state.current_phase, true, true);
109
+ this.progressBar.update(this.run, this.state.current_status_message);
110
+ const selectedPhaseIndex = previousSelectedPhaseId
111
+ ? runData.phases.findIndex((phase) => phase.id === previousSelectedPhaseId)
112
+ : undefined;
113
+ if (selectedPhaseIndex !== undefined && selectedPhaseIndex >= 0) {
114
+ this.phasesPanel.update(runData.phases, selectedPhaseIndex);
115
+ }
116
+ else {
117
+ this.phasesPanel.update(runData.phases);
118
+ }
119
+ const selectedPhase = this.phasesPanel.getSelectedPhase();
120
+ this.tasksPanel.update(selectedPhase ?? null);
121
+ }
122
+ }
123
+ else {
124
+ this.mode = "idle";
125
+ this.run = null;
126
+ this.header.update(null, "idle", true, true);
127
+ // Update idle view with past runs
128
+ const allRuns = listAllRuns()
129
+ .filter(r => r.run !== null)
130
+ .map(r => r.run);
131
+ this.idleView.update(allRuns, true, true);
132
+ const items = extractPastRuns(allRuns);
133
+ this.pastRuns.updateRuns(items);
134
+ }
135
+ this.invalidate();
136
+ }
137
+ /**
138
+ * Handle init mission action (Enter in idle mode)
139
+ */
140
+ handleInitMission() {
141
+ if (this.onInitMission) {
142
+ this.onInitMission();
143
+ }
144
+ }
145
+ /**
146
+ * Handle keyboard input
147
+ */
148
+ handleInput(data) {
149
+ // Global keys
150
+ if (matchesKey(data, Key.escape)) {
151
+ this.onClose();
152
+ return;
153
+ }
154
+ const isEnter = matchesKey(data, Key.enter);
155
+ const isUp = matchesKey(data, Key.up);
156
+ const isDown = matchesKey(data, Key.down);
157
+ const isLeft = matchesKey(data, Key.left);
158
+ const isRight = matchesKey(data, Key.right);
159
+ if (this.mode === "idle") {
160
+ // Idle mode: pass to idle view
161
+ this.idleView.handleInput(data, isEnter, false, isUp, isDown);
162
+ this.requestRender();
163
+ }
164
+ else {
165
+ // Active mode: handle panel navigation
166
+ if (isLeft) {
167
+ this.phasesPanel.setFocused(true);
168
+ this.tasksPanel.setFocused(false);
169
+ this.requestRender();
170
+ }
171
+ else if (isRight) {
172
+ this.phasesPanel.setFocused(false);
173
+ this.tasksPanel.setFocused(true);
174
+ this.requestRender();
175
+ }
176
+ else if (isUp) {
177
+ if (this.phasesPanel.isFocused()) {
178
+ this.phasesPanel.navigateUp();
179
+ // Update tasks panel to show tasks for selected phase
180
+ const phase = this.phasesPanel.getSelectedPhase();
181
+ this.tasksPanel.update(phase ?? null);
182
+ }
183
+ else {
184
+ this.tasksPanel.navigateUp();
185
+ }
186
+ this.requestRender();
187
+ }
188
+ else if (isDown) {
189
+ if (this.phasesPanel.isFocused()) {
190
+ this.phasesPanel.navigateDown();
191
+ // Update tasks panel to show tasks for selected phase
192
+ const phase = this.phasesPanel.getSelectedPhase();
193
+ this.tasksPanel.update(phase ?? null);
194
+ }
195
+ else {
196
+ this.tasksPanel.navigateDown();
197
+ }
198
+ this.requestRender();
199
+ }
200
+ }
201
+ }
202
+ /**
203
+ * Request a re-render from TUI
204
+ */
205
+ requestRender() {
206
+ if (this.tui) {
207
+ this.tui.requestRender();
208
+ }
209
+ }
210
+ /**
211
+ * Render the dashboard
212
+ */
213
+ render(width, theme) {
214
+ this.theme = theme;
215
+ // Use cached if dimensions match
216
+ if (this.cachedLines && this.cachedWidth === width) {
217
+ return this.cachedLines;
218
+ }
219
+ if (this.mode === "idle") {
220
+ this.cachedLines = this.renderIdle(width, theme);
221
+ }
222
+ else {
223
+ this.cachedLines = this.renderActive(width, theme);
224
+ }
225
+ this.cachedWidth = width;
226
+ return this.cachedLines;
227
+ }
228
+ renderShortcutLegend(width, theme, mode) {
229
+ const items = mode === "idle"
230
+ ? [
231
+ { key: "[ ENTER ]", label: "Init Mission" },
232
+ { key: "[ ↑/↓ ]", label: "Past Runs" },
233
+ { key: "[ ←/→ ]", label: "Panels" },
234
+ { key: "[ ESC ]", label: "Close" },
235
+ ]
236
+ : [
237
+ { key: "[ ↑/↓ ]", label: "Lists" },
238
+ { key: "[ ←/→ ]", label: "Panels" },
239
+ { key: "[ ESC ]", label: "Close" },
240
+ ];
241
+ const gap = 2;
242
+ const cellWidth = Math.max(12, Math.floor((width - gap * (items.length - 1)) / items.length));
243
+ const formatCell = (text) => text.padEnd(cellWidth, " ");
244
+ const keysLine = items
245
+ .map((item) => theme.fg("text", theme.bold(formatCell(item.key))))
246
+ .join(" ".repeat(gap));
247
+ const labelsLine = items
248
+ .map((item) => theme.fg("dim", formatCell(item.label)))
249
+ .join(" ".repeat(gap));
250
+ return [truncateToWidth(keysLine, width), truncateToWidth(labelsLine, width)];
251
+ }
252
+ /**
253
+ * Render idle mode
254
+ */
255
+ renderIdle(width, theme) {
256
+ const contentHeight = 12;
257
+ const lines = [];
258
+ lines.push(...this.header.render(width, theme));
259
+ lines.push(theme.fg("border", "─".repeat(width)));
260
+ lines.push(...this.renderShortcutLegend(width, theme, "idle"));
261
+ lines.push(theme.fg("dim", "Elapsed: --:--:--"));
262
+ lines.push("");
263
+ lines.push(...this.idleView.render(width, contentHeight, theme));
264
+ lines.push("");
265
+ lines.push(...this.progressBar.render(width, theme));
266
+ return lines;
267
+ }
268
+ /**
269
+ * Render active mode with a simple 40/60 split
270
+ */
271
+ renderActive(width, theme) {
272
+ const lines = [];
273
+ const contentHeight = 12;
274
+ lines.push(...this.header.render(width, theme));
275
+ lines.push(theme.fg("border", "─".repeat(width)));
276
+ lines.push(...this.renderShortcutLegend(width, theme, "active"));
277
+ lines.push(theme.fg("dim", `Elapsed: ${this.run ? formatElapsedTime(this.run.started_at) : "--:--:--"}`));
278
+ lines.push("");
279
+ const gap = 4;
280
+ const availableWidth = Math.max(16, width - gap);
281
+ let leftWidth;
282
+ let rightWidth;
283
+ if (availableWidth <= 44) {
284
+ leftWidth = Math.max(8, Math.floor(availableWidth * 0.4));
285
+ rightWidth = Math.max(8, availableWidth - leftWidth);
286
+ }
287
+ else {
288
+ leftWidth = Math.floor(availableWidth * 0.4);
289
+ rightWidth = availableWidth - leftWidth;
290
+ }
291
+ const phasesLines = this.phasesPanel.render(leftWidth, contentHeight, theme);
292
+ const tasksLines = this.tasksPanel.render(rightWidth, contentHeight, theme);
293
+ for (let i = 0; i < contentHeight; i++) {
294
+ const leftLine = phasesLines[i] ?? "";
295
+ const rightLine = tasksLines[i] ?? "";
296
+ const leftPadding = Math.max(0, leftWidth - visibleWidth(leftLine));
297
+ lines.push(truncateToWidth(leftLine + " ".repeat(leftPadding + gap) + rightLine, width));
298
+ }
299
+ lines.push("");
300
+ lines.push(...this.progressBar.render(width, theme));
301
+ return lines;
302
+ }
303
+ /**
304
+ * Invalidate cached render output
305
+ */
306
+ invalidate() {
307
+ this.cachedWidth = undefined;
308
+ this.cachedLines = undefined;
309
+ this.header.invalidate();
310
+ this.phasesPanel.invalidate();
311
+ this.tasksPanel.invalidate();
312
+ this.progressBar.invalidate();
313
+ this.idleView.invalidate();
314
+ this.pastRuns.invalidate();
315
+ }
316
+ /**
317
+ * Get current mode
318
+ */
319
+ getMode() {
320
+ return this.mode;
321
+ }
322
+ /**
323
+ * Get active run (if any)
324
+ */
325
+ getRun() {
326
+ return this.run;
327
+ }
328
+ /**
329
+ * Dispose of resources
330
+ */
331
+ dispose() {
332
+ this.stopRefresh();
333
+ }
334
+ }
335
+ /**
336
+ * Open the Mission Control dashboard
337
+ *
338
+ * Usage in extension:
339
+ * ```typescript
340
+ * pi.registerCommand("mission", {
341
+ * handler: async (_args, ctx) => {
342
+ * const result = await ctx.ui.custom<string | null>(
343
+ * (tui, theme, _kb, done) => {
344
+ * const dashboard = new MissionDashboard({
345
+ * onClose: () => done(null),
346
+ * onInitMission: () => {
347
+ * // Trigger mission_init tool
348
+ * done("init");
349
+ * }
350
+ * });
351
+ * dashboard.startRefresh(tui);
352
+ * return dashboard;
353
+ * },
354
+ * { overlay: true }
355
+ * );
356
+ *
357
+ * if (result === "init") {
358
+ * // Handle init action
359
+ * }
360
+ * }
361
+ * });
362
+ * ```
363
+ */
364
+ export async function openMissionControl(ctx) {
365
+ await ctx.ui.custom((tui, theme, _keybindings, done) => {
366
+ const dashboard = new MissionDashboard({
367
+ onClose: () => {
368
+ dashboard.dispose();
369
+ done(null);
370
+ },
371
+ onInitMission: () => {
372
+ dashboard.dispose();
373
+ done("init");
374
+ }
375
+ });
376
+ dashboard.startRefresh(tui);
377
+ return dashboard;
378
+ }, { overlay: true });
379
+ }
380
+ export default MissionDashboard;
381
+ //# sourceMappingURL=dashboard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dashboard.js","sourceRoot":"","sources":["../../src/tui/dashboard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,39 @@
1
+ /**
2
+ * Mission Control TUI Header Component
3
+ *
4
+ * Displays:
5
+ * - Title with icon
6
+ * - Run ID
7
+ * - Mission timer (elapsed time from run.started_at)
8
+ * - Compact legend for keyboard navigation
9
+ */
10
+ import type { Theme } from "@mariozechner/pi-coding-agent";
11
+ import type { Run } from "../state.js";
12
+ export interface HeaderProps {
13
+ run: Run | null;
14
+ currentPhase: string;
15
+ agentsReady: boolean;
16
+ skillsReady: boolean;
17
+ }
18
+ /**
19
+ * Format elapsed time as HH:MM:SS
20
+ */
21
+ export declare function formatElapsedTime(startedAt: string): string;
22
+ /**
23
+ * Render the header component
24
+ * Returns an array of strings (one per line)
25
+ */
26
+ export declare function renderHeader(width: number, props: HeaderProps, theme: Theme): string[];
27
+ /**
28
+ * Header component class for dashboard integration
29
+ */
30
+ export declare class HeaderComponent {
31
+ private props;
32
+ private cachedWidth?;
33
+ private cachedLines?;
34
+ constructor(run: Run | null, currentPhase: string, agentsReady?: boolean, skillsReady?: boolean);
35
+ update(run: Run | null, currentPhase: string, agentsReady?: boolean, skillsReady?: boolean): void;
36
+ render(width: number, theme: Theme): string[];
37
+ invalidate(): void;
38
+ }
39
+ //# sourceMappingURL=header.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.d.ts","sourceRoot":"","sources":["../../src/tui/header.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAGvC,MAAM,WAAW,WAAW;IAC1B,GAAG,EAAE,GAAG,GAAG,IAAI,CAAC;IAChB,YAAY,EAAE,MAAM,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,CAU3D;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAC1B,KAAK,EAAE,MAAM,EACb,KAAK,EAAE,WAAW,EAClB,KAAK,EAAE,KAAK,GACX,MAAM,EAAE,CAOV;AAED;;GAEG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,KAAK,CAAc;IAC3B,OAAO,CAAC,WAAW,CAAC,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAC,CAAW;gBAEnB,GAAG,EAAE,GAAG,GAAG,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,UAAO,EAAE,WAAW,UAAO;IAIzF,MAAM,CAAC,GAAG,EAAE,GAAG,GAAG,IAAI,EAAE,YAAY,EAAE,MAAM,EAAE,WAAW,UAAO,EAAE,WAAW,UAAO,GAAG,IAAI;IAK3F,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE;IAU7C,UAAU,IAAI,IAAI;CAInB"}
@@ -0,0 +1,62 @@
1
+ /**
2
+ * Mission Control TUI Header Component
3
+ *
4
+ * Displays:
5
+ * - Title with icon
6
+ * - Run ID
7
+ * - Mission timer (elapsed time from run.started_at)
8
+ * - Compact legend for keyboard navigation
9
+ */
10
+ import { truncateToWidth, visibleWidth } from "@mariozechner/pi-tui";
11
+ /**
12
+ * Format elapsed time as HH:MM:SS
13
+ */
14
+ export function formatElapsedTime(startedAt) {
15
+ const start = new Date(startedAt).getTime();
16
+ const now = Date.now();
17
+ const elapsed = Math.floor((now - start) / 1000);
18
+ const hours = Math.floor(elapsed / 3600);
19
+ const minutes = Math.floor((elapsed % 3600) / 60);
20
+ const seconds = elapsed % 60;
21
+ return `${hours.toString().padStart(2, "0")}:${minutes.toString().padStart(2, "0")}:${seconds.toString().padStart(2, "0")}`;
22
+ }
23
+ /**
24
+ * Render the header component
25
+ * Returns an array of strings (one per line)
26
+ */
27
+ export function renderHeader(width, props, theme) {
28
+ const title = theme.fg("accent", theme.bold("Mission Control"));
29
+ const agents = props.agentsReady ? "[√] Agents" : "[ ] Agents";
30
+ const skills = props.skillsReady ? "[√] Skills" : "[ ] Skills";
31
+ const status = `${theme.fg(props.agentsReady ? "success" : "muted", agents)} ${theme.fg(props.skillsReady ? "success" : "muted", skills)}`;
32
+ const padding = Math.max(1, width - visibleWidth(title) - visibleWidth(status));
33
+ return [truncateToWidth(title + " ".repeat(padding) + status, width)];
34
+ }
35
+ /**
36
+ * Header component class for dashboard integration
37
+ */
38
+ export class HeaderComponent {
39
+ props;
40
+ cachedWidth;
41
+ cachedLines;
42
+ constructor(run, currentPhase, agentsReady = true, skillsReady = true) {
43
+ this.props = { run, currentPhase, agentsReady, skillsReady };
44
+ }
45
+ update(run, currentPhase, agentsReady = true, skillsReady = true) {
46
+ this.props = { run, currentPhase, agentsReady, skillsReady };
47
+ this.invalidate();
48
+ }
49
+ render(width, theme) {
50
+ if (this.cachedLines && this.cachedWidth === width) {
51
+ return this.cachedLines;
52
+ }
53
+ this.cachedLines = renderHeader(width, this.props, theme);
54
+ this.cachedWidth = width;
55
+ return this.cachedLines;
56
+ }
57
+ invalidate() {
58
+ this.cachedWidth = undefined;
59
+ this.cachedLines = undefined;
60
+ }
61
+ }
62
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.js","sourceRoot":"","sources":["../../src/tui/header.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ /**
2
+ * Mission Control TUI Idle View
3
+ *
4
+ * Displays when no mission is active:
5
+ * - Agents/Skills readiness
6
+ * - Past runs list (if any exist)
7
+ *
8
+ * Keyboard:
9
+ * - Enter: Trigger init new mission
10
+ * - Esc: Close view
11
+ * - Up/Down: Navigate past runs
12
+ */
13
+ import type { Theme } from "@mariozechner/pi-coding-agent";
14
+ import type { Run } from "../state.js";
15
+ export interface IdleViewProps {
16
+ pastRuns: Run[];
17
+ agentsReady: boolean;
18
+ skillsReady: boolean;
19
+ }
20
+ export interface IdleViewCallbacks {
21
+ onInitMission: () => void;
22
+ onClose: () => void;
23
+ }
24
+ /**
25
+ * Render the idle view
26
+ */
27
+ export declare function renderIdleView(width: number, height: number, props: IdleViewProps, callbacks: IdleViewCallbacks, theme: Theme): string[];
28
+ /**
29
+ * Idle view component class
30
+ *
31
+ * Composes PastRunsComponent and adds the idle-specific UI
32
+ */
33
+ export declare class IdleViewComponent {
34
+ private pastRuns;
35
+ private props;
36
+ private callbacks;
37
+ private showRuns;
38
+ constructor(callbacks: IdleViewCallbacks);
39
+ update(pastRuns: Run[], agentsReady?: boolean, skillsReady?: boolean): void;
40
+ handleInput(data: string, isEnter: boolean, isEscape: boolean, isUp: boolean, isDown: boolean): void;
41
+ render(width: number, height: number, theme: Theme): string[];
42
+ invalidate(): void;
43
+ }
44
+ //# sourceMappingURL=idle-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-view.d.ts","sourceRoot":"","sources":["../../src/tui/idle-view.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,+BAA+B,CAAC;AAC3D,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAIvC,MAAM,WAAW,aAAa;IAC5B,QAAQ,EAAE,GAAG,EAAE,CAAC;IAChB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,OAAO,CAAC;CACtB;AAED,MAAM,WAAW,iBAAiB;IAChC,aAAa,EAAE,MAAM,IAAI,CAAC;IAC1B,OAAO,EAAE,MAAM,IAAI,CAAC;CACrB;AAED;;GAEG;AACH,wBAAgB,cAAc,CAC5B,KAAK,EAAE,MAAM,EACb,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,aAAa,EACpB,SAAS,EAAE,iBAAiB,EAC5B,KAAK,EAAE,KAAK,GACX,MAAM,EAAE,CAIV;AAED;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAoB;IACpC,OAAO,CAAC,KAAK,CAAiD;IAC9D,OAAO,CAAC,SAAS,CAAoB;IACrC,OAAO,CAAC,QAAQ,CAAkB;gBAEtB,SAAS,EAAE,iBAAiB;IAMxC,MAAM,CAAC,QAAQ,EAAE,GAAG,EAAE,EAAE,WAAW,UAAO,EAAE,WAAW,UAAO,GAAG,IAAI;IASrE,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAG,IAAI;IAcpG,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,KAAK,GAAG,MAAM,EAAE;IA0B7D,UAAU,IAAI,IAAI;CAGnB"}
@@ -0,0 +1,87 @@
1
+ /**
2
+ * Mission Control TUI Idle View
3
+ *
4
+ * Displays when no mission is active:
5
+ * - Agents/Skills readiness
6
+ * - Past runs list (if any exist)
7
+ *
8
+ * Keyboard:
9
+ * - Enter: Trigger init new mission
10
+ * - Esc: Close view
11
+ * - Up/Down: Navigate past runs
12
+ */
13
+ import { PastRunsComponent, extractPastRuns } from "./past-runs.js";
14
+ import { truncateToWidth } from "@mariozechner/pi-tui";
15
+ /**
16
+ * Render the idle view
17
+ */
18
+ export function renderIdleView(width, height, props, callbacks, theme) {
19
+ void props;
20
+ void callbacks;
21
+ return new Array(height).fill("").map((_line, index) => (index === 0 ? truncateToWidth(theme.fg("dim", "No active mission"), width) : ""));
22
+ }
23
+ /**
24
+ * Idle view component class
25
+ *
26
+ * Composes PastRunsComponent and adds the idle-specific UI
27
+ */
28
+ export class IdleViewComponent {
29
+ pastRuns;
30
+ props;
31
+ callbacks;
32
+ showRuns = false;
33
+ constructor(callbacks) {
34
+ this.callbacks = callbacks;
35
+ this.pastRuns = new PastRunsComponent();
36
+ this.props = { agentsReady: true, skillsReady: true };
37
+ }
38
+ update(pastRuns, agentsReady = true, skillsReady = true) {
39
+ this.props.agentsReady = agentsReady;
40
+ this.props.skillsReady = skillsReady;
41
+ const items = extractPastRuns(pastRuns);
42
+ this.pastRuns.updateRuns(items);
43
+ this.showRuns = items.length > 0;
44
+ }
45
+ handleInput(data, isEnter, isEscape, isUp, isDown) {
46
+ if (isEnter) {
47
+ this.callbacks.onInitMission();
48
+ }
49
+ else if (isEscape) {
50
+ this.callbacks.onClose();
51
+ }
52
+ else if (this.showRuns) {
53
+ if (isUp) {
54
+ this.pastRuns.navigateUp();
55
+ }
56
+ else if (isDown) {
57
+ this.pastRuns.navigateDown();
58
+ }
59
+ }
60
+ }
61
+ render(width, height, theme) {
62
+ const lines = [];
63
+ const { agentsReady, skillsReady } = this.props;
64
+ const readiness = agentsReady && skillsReady
65
+ ? theme.fg("dim", "Ready to initialize a mission")
66
+ : theme.fg("muted", "Waiting for Mission Control resources");
67
+ lines.push(truncateToWidth(readiness, width));
68
+ lines.push("");
69
+ if (this.showRuns) {
70
+ const runsHeight = Math.min(this.pastRuns['props'].runs.length + 4, Math.max(4, height - 2));
71
+ const runsLines = this.pastRuns.render(width, runsHeight, theme);
72
+ lines.push(...runsLines);
73
+ }
74
+ else {
75
+ lines.push(truncateToWidth(theme.fg("muted", "No past runs yet."), width));
76
+ }
77
+ // Pad to height
78
+ while (lines.length < height) {
79
+ lines.push("");
80
+ }
81
+ return lines.slice(0, height);
82
+ }
83
+ invalidate() {
84
+ this.pastRuns.invalidate();
85
+ }
86
+ }
87
+ //# sourceMappingURL=idle-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"idle-view.js","sourceRoot":"","sources":["../../src/tui/idle-view.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Mission Control TUI Components
3
+ *
4
+ * Exports all TUI components for the Mission Control dashboard.
5
+ */
6
+ export { HeaderComponent, renderHeader, formatElapsedTime } from "./header.js";
7
+ export { PhasesPanelComponent, renderPhasesPanel } from "./phases-panel.js";
8
+ export { TasksPanelComponent, renderTasksPanel } from "./tasks-panel.js";
9
+ export { ProgressBarComponent, renderProgressBarComponent } from "./progress-bar.js";
10
+ export { PastRunsComponent, renderPastRuns, extractPastRuns } from "./past-runs.js";
11
+ export { IdleViewComponent, renderIdleView } from "./idle-view.js";
12
+ export { MissionDashboard, openMissionControl, type DashboardProps } from "./dashboard.js";
13
+ //# sourceMappingURL=index.d.ts.map