@baanish/hydra-cli 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 (92) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +122 -0
  3. package/dist/config.d.ts +29 -0
  4. package/dist/config.d.ts.map +1 -0
  5. package/dist/config.js +338 -0
  6. package/dist/config.js.map +1 -0
  7. package/dist/db/client.d.ts +10 -0
  8. package/dist/db/client.d.ts.map +1 -0
  9. package/dist/db/client.js +93 -0
  10. package/dist/db/client.js.map +1 -0
  11. package/dist/db/queries.d.ts +67 -0
  12. package/dist/db/queries.d.ts.map +1 -0
  13. package/dist/db/queries.js +336 -0
  14. package/dist/db/queries.js.map +1 -0
  15. package/dist/engine/concurrency.d.ts +3 -0
  16. package/dist/engine/concurrency.d.ts.map +1 -0
  17. package/dist/engine/concurrency.js +42 -0
  18. package/dist/engine/concurrency.js.map +1 -0
  19. package/dist/engine/eta.d.ts +16 -0
  20. package/dist/engine/eta.d.ts.map +1 -0
  21. package/dist/engine/eta.js +54 -0
  22. package/dist/engine/eta.js.map +1 -0
  23. package/dist/engine/model.d.ts +57 -0
  24. package/dist/engine/model.d.ts.map +1 -0
  25. package/dist/engine/model.js +445 -0
  26. package/dist/engine/model.js.map +1 -0
  27. package/dist/engine/personas.d.ts +30 -0
  28. package/dist/engine/personas.d.ts.map +1 -0
  29. package/dist/engine/personas.js +336 -0
  30. package/dist/engine/personas.js.map +1 -0
  31. package/dist/engine/pipeline.d.ts +61 -0
  32. package/dist/engine/pipeline.d.ts.map +1 -0
  33. package/dist/engine/pipeline.js +638 -0
  34. package/dist/engine/pipeline.js.map +1 -0
  35. package/dist/engine/prompts.d.ts +10 -0
  36. package/dist/engine/prompts.d.ts.map +1 -0
  37. package/dist/engine/prompts.js +49 -0
  38. package/dist/engine/prompts.js.map +1 -0
  39. package/dist/engine/search.d.ts +46 -0
  40. package/dist/engine/search.d.ts.map +1 -0
  41. package/dist/engine/search.js +159 -0
  42. package/dist/engine/search.js.map +1 -0
  43. package/dist/index.d.ts +5 -0
  44. package/dist/index.d.ts.map +1 -0
  45. package/dist/index.js +648 -0
  46. package/dist/index.js.map +1 -0
  47. package/dist/security.d.ts +18 -0
  48. package/dist/security.d.ts.map +1 -0
  49. package/dist/security.js +168 -0
  50. package/dist/security.js.map +1 -0
  51. package/dist/types.d.ts +143 -0
  52. package/dist/types.d.ts.map +1 -0
  53. package/dist/types.js +2 -0
  54. package/dist/types.js.map +1 -0
  55. package/dist/ui/agent-mode.d.ts +8 -0
  56. package/dist/ui/agent-mode.d.ts.map +1 -0
  57. package/dist/ui/agent-mode.js +138 -0
  58. package/dist/ui/agent-mode.js.map +1 -0
  59. package/dist/ui/animations.d.ts +8 -0
  60. package/dist/ui/animations.d.ts.map +1 -0
  61. package/dist/ui/animations.js +19 -0
  62. package/dist/ui/animations.js.map +1 -0
  63. package/dist/ui/components/agent-list.d.ts +2 -0
  64. package/dist/ui/components/agent-list.d.ts.map +1 -0
  65. package/dist/ui/components/agent-list.js +2 -0
  66. package/dist/ui/components/agent-list.js.map +1 -0
  67. package/dist/ui/components/header.d.ts +2 -0
  68. package/dist/ui/components/header.d.ts.map +1 -0
  69. package/dist/ui/components/header.js +2 -0
  70. package/dist/ui/components/header.js.map +1 -0
  71. package/dist/ui/components/phase-bar.d.ts +2 -0
  72. package/dist/ui/components/phase-bar.d.ts.map +1 -0
  73. package/dist/ui/components/phase-bar.js +2 -0
  74. package/dist/ui/components/phase-bar.js.map +1 -0
  75. package/dist/ui/components/stats-bar.d.ts +2 -0
  76. package/dist/ui/components/stats-bar.d.ts.map +1 -0
  77. package/dist/ui/components/stats-bar.js +2 -0
  78. package/dist/ui/components/stats-bar.js.map +1 -0
  79. package/dist/ui/tui.d.ts +18 -0
  80. package/dist/ui/tui.d.ts.map +1 -0
  81. package/dist/ui/tui.js +464 -0
  82. package/dist/ui/tui.js.map +1 -0
  83. package/dist/web/app.html +1352 -0
  84. package/dist/web/index.d.ts +2 -0
  85. package/dist/web/index.d.ts.map +1 -0
  86. package/dist/web/index.js +2 -0
  87. package/dist/web/index.js.map +1 -0
  88. package/dist/web/server.d.ts +2 -0
  89. package/dist/web/server.d.ts.map +1 -0
  90. package/dist/web/server.js +864 -0
  91. package/dist/web/server.js.map +1 -0
  92. package/package.json +59 -0
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=header.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"header.js","sourceRoot":"","sources":["../../../src/ui/components/header.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=phase-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-bar.d.ts","sourceRoot":"","sources":["../../../src/ui/components/phase-bar.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=phase-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"phase-bar.js","sourceRoot":"","sources":["../../../src/ui/components/phase-bar.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stats-bar.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats-bar.d.ts","sourceRoot":"","sources":["../../../src/ui/components/stats-bar.ts"],"names":[],"mappings":""}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=stats-bar.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"stats-bar.js","sourceRoot":"","sources":["../../../src/ui/components/stats-bar.ts"],"names":[],"mappings":""}
@@ -0,0 +1,18 @@
1
+ import type { PipelineEvent } from "../types.js";
2
+ interface HydraUIOptions {
3
+ concurrency: number;
4
+ totalDebateRounds: number;
5
+ }
6
+ /** render live progress in OpenTUI. */
7
+ export declare class HydraUI {
8
+ #private;
9
+ constructor(options: HydraUIOptions);
10
+ /** create renderer and mount the live UI. */
11
+ start(query: string, agentCount: number): Promise<void>;
12
+ /** process all pipeline events and sync UI state. */
13
+ handleEvent(event: PipelineEvent): void;
14
+ /** stop live rendering and print the final brief. */
15
+ stop(brief?: string): void;
16
+ }
17
+ export {};
18
+ //# sourceMappingURL=tui.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.d.ts","sourceRoot":"","sources":["../../src/ui/tui.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAc,aAAa,EAAa,MAAM,aAAa,CAAC;AAUxE,UAAU,cAAc;IACvB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,CAAC;CAC1B;AAwID,uCAAuC;AACvC,qBAAa,OAAO;;gBAmCP,OAAO,EAAE,cAAc;IAQnC,6CAA6C;IACvC,KAAK,CAAC,KAAK,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyE7D,qDAAqD;IACrD,WAAW,CAAC,KAAK,EAAE,aAAa,GAAG,IAAI;IAmHvC,qDAAqD;IACrD,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI;CAoN1B"}
package/dist/ui/tui.js ADDED
@@ -0,0 +1,464 @@
1
+ import { BoxRenderable, TextRenderable, bold, brightBlack, createCliRenderer, green, magenta, t, yellow, } from "@opentui/core";
2
+ import { getRunAgentRuns } from "../db/queries.js";
3
+ import { ETAEstimator, formatDuration } from "../engine/eta.js";
4
+ import { sanitizeForTerminal } from "../security.js";
5
+ import { DB_SYNC_INTERVAL_MS, PHASE_SPINNER, QUEUED_SPINNER, RUNNING_SPINNER, UI_REFRESH_INTERVAL_MS, spinnerFrameAt, } from "./animations.js";
6
+ function formatSearchLabel(count) {
7
+ return `${count} search${count === 1 ? "" : "es"}`;
8
+ }
9
+ function makePlaceholder(agentIndex) {
10
+ return {
11
+ persona: `Agent ${agentIndex}`,
12
+ status: "queued",
13
+ phase: "decompose",
14
+ durationMs: null,
15
+ searchCount: 0,
16
+ startedAt: Number.POSITIVE_INFINITY,
17
+ };
18
+ }
19
+ function formatAgentLine(entry, nowMs) {
20
+ const safePersona = sanitizeForTerminal(entry.persona);
21
+ if (entry.status === "running") {
22
+ const runningElapsedMs = entry.startedAt > 0 && Number.isFinite(entry.startedAt)
23
+ ? Math.max(0, nowMs - entry.startedAt)
24
+ : Math.max(0, entry.durationMs ?? 0);
25
+ const spinner = spinnerFrameAt(RUNNING_SPINNER, runningElapsedMs);
26
+ return `${spinner} ${safePersona} — searching... (${formatDuration(runningElapsedMs)})`;
27
+ }
28
+ if (entry.status === "queued") {
29
+ const spinner = spinnerFrameAt(QUEUED_SPINNER, nowMs);
30
+ return `${spinner} ${safePersona} — queued`;
31
+ }
32
+ if (entry.status === "error") {
33
+ return `❌ ${safePersona} — error (${formatDuration(entry.durationMs ?? 0)}, ${formatSearchLabel(entry.searchCount)})`;
34
+ }
35
+ return `✅ ${safePersona} — done (${formatDuration(entry.durationMs ?? 0)}, ${formatSearchLabel(entry.searchCount)})`;
36
+ }
37
+ function parseSearchCount(rawSearchQueries) {
38
+ try {
39
+ const parsed = JSON.parse(rawSearchQueries);
40
+ return Array.isArray(parsed) ? parsed.length : 0;
41
+ }
42
+ catch {
43
+ return 0;
44
+ }
45
+ }
46
+ function mapRunStatusToAgentPhase(status) {
47
+ if (status === "researching") {
48
+ return "research";
49
+ }
50
+ if (status === "debating") {
51
+ return "debate";
52
+ }
53
+ if (status === "synthesizing") {
54
+ return "synthesis";
55
+ }
56
+ return "decompose";
57
+ }
58
+ function mapAgentPhaseToRunStatus(phase) {
59
+ if (phase === "research") {
60
+ return "researching";
61
+ }
62
+ if (phase === "debate") {
63
+ return "debating";
64
+ }
65
+ if (phase === "synthesis") {
66
+ return "synthesizing";
67
+ }
68
+ return "decomposing";
69
+ }
70
+ function clamp(value, min, max) {
71
+ if (!Number.isFinite(value)) {
72
+ return min;
73
+ }
74
+ return Math.max(min, Math.min(max, value));
75
+ }
76
+ function mapStatusForDisplay(status, debateRound, totalDebateRounds) {
77
+ if (status === "debating") {
78
+ return `DEBATING | Round ${debateRound}/${Math.max(1, totalDebateRounds)}`;
79
+ }
80
+ return status.toUpperCase();
81
+ }
82
+ function renderMarkdownAsAnsi(markdown) {
83
+ const safeMarkdown = sanitizeForTerminal(markdown);
84
+ const reset = "\x1b[0m";
85
+ const bold = "\x1b[1m";
86
+ const heading = safeMarkdown.replace(/^##\s*(.*)$/gm, (_match, title) => `${bold}## ${title}${reset}`);
87
+ return heading.replace(/\*\*(.+?)\*\*/g, `${bold}$1${reset}`);
88
+ }
89
+ function truncateQuery(query, width) {
90
+ const cleaned = sanitizeForTerminal(query).replace(/\s+/g, " ").trim();
91
+ const maxLength = Math.max(30, width - 14);
92
+ if (cleaned.length <= maxLength) {
93
+ return cleaned;
94
+ }
95
+ return `${cleaned.slice(0, maxLength - 3)}...`;
96
+ }
97
+ function makePlaceholders(count) {
98
+ return Array.from({ length: count }, (_, index) => ({
99
+ ...makePlaceholder(index + 1),
100
+ }));
101
+ }
102
+ function renderTokens(totalPromptTokens, totalCompletionTokens) {
103
+ const total = Math.max(0, Math.round(totalPromptTokens + totalCompletionTokens));
104
+ return total.toLocaleString();
105
+ }
106
+ /** render live progress in OpenTUI. */
107
+ export class HydraUI {
108
+ #renderer = null;
109
+ #tickHandle = null;
110
+ #stopped = false;
111
+ #started = false;
112
+ #runId = "";
113
+ #query = "";
114
+ #totalAgents = 0;
115
+ #runCreatedAt = 0;
116
+ #phaseStartedAt = 0;
117
+ #status = "decomposing";
118
+ #phase = "decompose";
119
+ #progressCompleted = 0;
120
+ #progressTotal = 0;
121
+ #debateRound = 0;
122
+ #debateRoundComplete = false;
123
+ #totalDebateRounds = 1;
124
+ #estimatedMs = 0;
125
+ #totalPromptTokens = 0;
126
+ #totalCompletionTokens = 0;
127
+ #totalSearches = 0;
128
+ #etaEstimator = new ETAEstimator();
129
+ #lastDbSyncAt = 0;
130
+ #agentEntries = [];
131
+ #agentRows = [];
132
+ #rootPanel = null;
133
+ #titleText = null;
134
+ #queryText = null;
135
+ #phaseText = null;
136
+ #summaryText = null;
137
+ #agentListPanel = null;
138
+ #footerText = null;
139
+ #concurrency;
140
+ constructor(options) {
141
+ this.#concurrency = clamp(options.concurrency, 1, 10);
142
+ this.#totalDebateRounds = Math.max(1, Math.trunc(options.totalDebateRounds));
143
+ }
144
+ /** create renderer and mount the live UI. */
145
+ async start(query, agentCount) {
146
+ if (this.#started) {
147
+ return;
148
+ }
149
+ this.#started = true;
150
+ this.#query = query;
151
+ this.#totalAgents = clamp(agentCount, 1, 20);
152
+ this.#progressTotal = this.#totalAgents;
153
+ this.#agentEntries = makePlaceholders(this.#totalAgents);
154
+ this.#renderer = await createCliRenderer({
155
+ exitOnCtrlC: true,
156
+ useAlternateScreen: true,
157
+ });
158
+ const rootPanel = new BoxRenderable(this.#renderer, {
159
+ border: true,
160
+ borderStyle: "rounded",
161
+ flexDirection: "column",
162
+ gap: 1,
163
+ padding: 1,
164
+ width: "100%",
165
+ height: "100%",
166
+ });
167
+ this.#renderer.root.add(rootPanel);
168
+ this.#rootPanel = rootPanel;
169
+ this.#titleText = new TextRenderable(this.#renderer, {
170
+ content: t `${green(bold("🐉 HYDRA — Swarm Intelligence Engine"))}`,
171
+ });
172
+ this.#queryText = new TextRenderable(this.#renderer, {
173
+ content: `Query: ${sanitizeForTerminal(this.#query)}`,
174
+ });
175
+ this.#phaseText = new TextRenderable(this.#renderer, {
176
+ content: "Phase: DECOMPOSING",
177
+ });
178
+ this.#summaryText = new TextRenderable(this.#renderer, {
179
+ content: "ETA: -- | Elapsed: 0s | Tokens: 0",
180
+ });
181
+ this.#agentListPanel = new BoxRenderable(this.#renderer, {
182
+ flexDirection: "column",
183
+ flexGrow: 1,
184
+ gap: 0,
185
+ });
186
+ this.#footerText = new TextRenderable(this.#renderer, {
187
+ content: "",
188
+ });
189
+ rootPanel.add(this.#titleText);
190
+ rootPanel.add(this.#queryText);
191
+ rootPanel.add(this.#phaseText);
192
+ rootPanel.add(this.#summaryText);
193
+ rootPanel.add(this.#agentListPanel);
194
+ rootPanel.add(this.#footerText);
195
+ this.#rebuildAgentRows();
196
+ this.#renderer.requestLive();
197
+ this.#runCreatedAt = Date.now();
198
+ this.#phaseStartedAt = this.#runCreatedAt;
199
+ this.#lastDbSyncAt = 0;
200
+ this.#tickHandle = setInterval(() => {
201
+ const now = Date.now();
202
+ this.#estimatedMs = now - this.#phaseStartedAt;
203
+ if (now - this.#lastDbSyncAt >= DB_SYNC_INTERVAL_MS) {
204
+ this.#syncAgentListFromDb();
205
+ }
206
+ this.#refreshRunningAgentDurations(now);
207
+ this.#refresh(now);
208
+ }, UI_REFRESH_INTERVAL_MS);
209
+ this.#refresh(Date.now());
210
+ }
211
+ /** process all pipeline events and sync UI state. */
212
+ handleEvent(event) {
213
+ if (!this.#renderer) {
214
+ return;
215
+ }
216
+ if (event.type === "run-created") {
217
+ this.#runId = event.runId;
218
+ this.#query = event.query;
219
+ this.#totalAgents = event.agentCount;
220
+ this.#progressTotal = event.agentCount;
221
+ this.#progressCompleted = 0;
222
+ this.#totalPromptTokens = 0;
223
+ this.#totalCompletionTokens = 0;
224
+ this.#status = "decomposing";
225
+ this.#phase = "decompose";
226
+ this.#debateRound = 0;
227
+ this.#debateRoundComplete = false;
228
+ this.#runCreatedAt = event.timestamp;
229
+ this.#phaseStartedAt = event.timestamp;
230
+ this.#lastDbSyncAt = 0;
231
+ this.#etaEstimator.reset();
232
+ this.#agentEntries = makePlaceholders(this.#totalAgents);
233
+ this.#syncAgentListFromDb();
234
+ this.#refresh();
235
+ return;
236
+ }
237
+ if (event.type === "run-status-changed") {
238
+ const previousStatus = this.#status;
239
+ this.#status = event.status;
240
+ if (event.status !== "complete" && event.status !== "error") {
241
+ this.#phase = mapRunStatusToAgentPhase(event.status);
242
+ }
243
+ this.#phaseStartedAt = event.timestamp;
244
+ if (event.status === "debating" && previousStatus !== "debating") {
245
+ this.#debateRound += 1;
246
+ this.#debateRoundComplete = false;
247
+ }
248
+ if (event.status === "researching" || event.status === "debating") {
249
+ this.#progressCompleted = 0;
250
+ }
251
+ if (event.status === "synthesizing") {
252
+ this.#progressCompleted = this.#totalAgents;
253
+ }
254
+ if (event.status !== "decomposing") {
255
+ this.#progressTotal = this.#totalAgents;
256
+ }
257
+ this.#syncAgentListFromDb();
258
+ this.#refresh();
259
+ return;
260
+ }
261
+ if (event.type === "agent-progress") {
262
+ const newPhase = mapAgentPhaseToRunStatus(event.phase);
263
+ if (newPhase === "debating") {
264
+ const isNewRoundByCompletion = event.completedAgents < this.#progressCompleted ||
265
+ this.#debateRoundComplete;
266
+ if (isNewRoundByCompletion) {
267
+ this.#debateRound += 1;
268
+ this.#debateRoundComplete = false;
269
+ }
270
+ }
271
+ this.#status = newPhase;
272
+ this.#phase = event.phase;
273
+ this.#progressCompleted = event.completedAgents;
274
+ this.#progressTotal = event.totalAgents;
275
+ if (newPhase === "debating" &&
276
+ event.completedAgents >= event.totalAgents) {
277
+ this.#debateRoundComplete = true;
278
+ }
279
+ this.#syncAgentListFromDb();
280
+ this.#refresh();
281
+ return;
282
+ }
283
+ if (event.type === "agent-complete") {
284
+ const promptTokens = Number.isFinite(event.state.promptTokens)
285
+ ? event.state.promptTokens
286
+ : 0;
287
+ const completionTokens = Number.isFinite(event.state.completionTokens)
288
+ ? event.state.completionTokens
289
+ : 0;
290
+ this.#totalPromptTokens += promptTokens;
291
+ this.#totalCompletionTokens += completionTokens;
292
+ if (typeof event.state.completedAt === "number" &&
293
+ typeof event.state.startedAt === "number") {
294
+ const durationMs = event.state.completedAt - event.state.startedAt;
295
+ if (Number.isFinite(durationMs) && durationMs > 0) {
296
+ this.#etaEstimator.recordCompletion(durationMs);
297
+ }
298
+ }
299
+ this.#syncAgentListFromDb();
300
+ this.#refresh();
301
+ return;
302
+ }
303
+ if (event.type === "run-complete") {
304
+ this.#status = "complete";
305
+ this.#progressCompleted = this.#totalAgents;
306
+ this.#totalPromptTokens = event.totalPromptTokens;
307
+ this.#totalCompletionTokens = event.totalCompletionTokens;
308
+ this.#syncAgentListFromDb();
309
+ this.#refresh();
310
+ }
311
+ }
312
+ /** stop live rendering and print the final brief. */
313
+ stop(brief) {
314
+ if (!this.#renderer || this.#stopped) {
315
+ return;
316
+ }
317
+ this.#stopped = true;
318
+ if (this.#tickHandle) {
319
+ clearInterval(this.#tickHandle);
320
+ this.#tickHandle = null;
321
+ }
322
+ this.#renderer.dropLive();
323
+ this.#renderer.destroy();
324
+ if (brief === undefined) {
325
+ return;
326
+ }
327
+ const rendered = renderMarkdownAsAnsi(brief.trim());
328
+ if (rendered.length === 0) {
329
+ return;
330
+ }
331
+ console.log("");
332
+ console.log(rendered);
333
+ }
334
+ #syncAgentListFromDb() {
335
+ const syncTimestamp = Date.now();
336
+ if (!this.#runId) {
337
+ this.#totalSearches = this.#agentEntries.reduce((total, entry) => total + entry.searchCount, 0);
338
+ this.#lastDbSyncAt = syncTimestamp;
339
+ return;
340
+ }
341
+ const runAgentRuns = getRunAgentRuns(this.#runId);
342
+ const phaseRows = runAgentRuns.filter((row) => row.phase === this.#phase);
343
+ const rawRows = phaseRows.length > 0 ? phaseRows : runAgentRuns;
344
+ const byPersona = new Map();
345
+ for (const row of rawRows) {
346
+ byPersona.set(row.persona, row);
347
+ }
348
+ const updatedEntries = [];
349
+ const now = Date.now();
350
+ for (const row of byPersona.values()) {
351
+ const status = row.status;
352
+ const durationMs = row.completedAt && (status === "complete" || status === "error")
353
+ ? Math.max(0, row.completedAt - row.startedAt)
354
+ : status === "running" && row.startedAt > 0
355
+ ? Math.max(0, now - row.startedAt)
356
+ : null;
357
+ updatedEntries.push({
358
+ persona: row.persona,
359
+ status,
360
+ phase: row.phase,
361
+ durationMs,
362
+ searchCount: parseSearchCount(row.searchQueries),
363
+ startedAt: row.startedAt,
364
+ });
365
+ }
366
+ while (updatedEntries.length < this.#totalAgents) {
367
+ updatedEntries.push(makePlaceholder(updatedEntries.length + 1));
368
+ }
369
+ if (updatedEntries.length > this.#totalAgents) {
370
+ updatedEntries.length = this.#totalAgents;
371
+ }
372
+ this.#agentEntries = updatedEntries;
373
+ this.#totalSearches = runAgentRuns.reduce((total, entry) => total + parseSearchCount(entry.searchQueries), 0);
374
+ this.#rebuildAgentRows();
375
+ this.#lastDbSyncAt = syncTimestamp;
376
+ }
377
+ #rebuildAgentRows() {
378
+ if (!this.#agentListPanel || !this.#renderer) {
379
+ return;
380
+ }
381
+ for (const child of this.#agentListPanel.getChildren()) {
382
+ this.#agentListPanel.remove(child.id);
383
+ }
384
+ this.#agentRows = [];
385
+ const now = Date.now();
386
+ for (const entry of this.#agentEntries) {
387
+ const row = new TextRenderable(this.#renderer, {
388
+ content: formatAgentLine(entry, now),
389
+ });
390
+ this.#agentListPanel.add(row);
391
+ this.#agentRows.push(row);
392
+ }
393
+ }
394
+ #refreshAgentRows(nowMs) {
395
+ if (!this.#agentListPanel || !this.#renderer) {
396
+ return;
397
+ }
398
+ if (this.#agentRows.length !== this.#agentEntries.length) {
399
+ this.#rebuildAgentRows();
400
+ }
401
+ const rowCount = Math.min(this.#agentRows.length, this.#agentEntries.length);
402
+ for (let index = 0; index < rowCount; index += 1) {
403
+ this.#agentRows[index].content = formatAgentLine(this.#agentEntries[index], nowMs);
404
+ }
405
+ }
406
+ #refresh(nowMs = Date.now()) {
407
+ if (!this.#renderer ||
408
+ !this.#titleText ||
409
+ !this.#queryText ||
410
+ !this.#phaseText ||
411
+ !this.#summaryText ||
412
+ !this.#footerText) {
413
+ return;
414
+ }
415
+ this.#refreshAgentRows(nowMs);
416
+ const width = this.#renderer.width;
417
+ const phase = mapStatusForDisplay(this.#status, this.#debateRound, this.#totalDebateRounds);
418
+ const totalForDisplay = Math.max(1, this.#progressTotal || this.#totalAgents || 1);
419
+ const completed = clamp(this.#progressCompleted, 0, totalForDisplay);
420
+ const remaining = Math.max(0, totalForDisplay - completed);
421
+ const progressBar = this.#buildProgressBar(completed, totalForDisplay);
422
+ const eta = this.#status === "complete"
423
+ ? "0s"
424
+ : this.#etaEstimator.estimate(remaining, this.#concurrency);
425
+ const elapsed = formatDuration(this.#status === "decomposing"
426
+ ? this.#estimatedMs
427
+ : Math.max(0, nowMs - this.#runCreatedAt));
428
+ const progressText = `${completed}/${totalForDisplay}`;
429
+ const tokens = renderTokens(this.#totalPromptTokens, this.#totalCompletionTokens);
430
+ const errors = this.#agentEntries.filter((entry) => entry.status === "error").length;
431
+ const phaseElapsedMs = Math.max(0, nowMs - this.#phaseStartedAt);
432
+ const phaseGlyph = this.#status === "complete"
433
+ ? "✅"
434
+ : this.#status === "error"
435
+ ? "❌"
436
+ : spinnerFrameAt(PHASE_SPINNER, phaseElapsedMs);
437
+ this.#queryText.content = t `Query: ${brightBlack(truncateQuery(this.#query, width))}`;
438
+ this.#phaseText.content = t `Phase: ${green(`${phaseGlyph} ${phase}`)} [${progressBar}] ${progressText} agents`;
439
+ this.#summaryText.content = t `ETA: ${yellow(eta)} | Elapsed: ${yellow(elapsed)} | Tokens: ${yellow(tokens)}`;
440
+ this.#footerText.content = t `Concurrency: ${magenta(this.#concurrency)} | Searches: ${magenta(this.#totalSearches)} | Errors: ${magenta(errors)}`;
441
+ }
442
+ #buildProgressBar(completed, total) {
443
+ const width = clamp(this.#renderer ? this.#renderer.width - 30 : 24, 12, 64);
444
+ const safeCompleted = clamp(completed, 0, total);
445
+ const safeTotal = Math.max(1, total);
446
+ const filled = Math.round((safeCompleted / safeTotal) * width);
447
+ const empty = Math.max(0, width - filled);
448
+ return `${"█".repeat(filled)}${"░".repeat(empty)}`;
449
+ }
450
+ #refreshRunningAgentDurations(nowMs) {
451
+ if (!this.#agentEntries.length) {
452
+ return;
453
+ }
454
+ for (const entry of this.#agentEntries) {
455
+ if (entry.status !== "running" ||
456
+ entry.startedAt <= 0 ||
457
+ !Number.isFinite(entry.startedAt)) {
458
+ continue;
459
+ }
460
+ entry.durationMs = Math.max(0, nowMs - entry.startedAt);
461
+ }
462
+ }
463
+ }
464
+ //# sourceMappingURL=tui.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tui.js","sourceRoot":"","sources":["../../src/ui/tui.ts"],"names":[],"mappings":"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"}