@tienne/gestalt 0.2.0 → 0.5.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 (178) hide show
  1. package/CLAUDE.md +56 -2
  2. package/README.md +301 -12
  3. package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts +94 -0
  4. package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts.map +1 -0
  5. package/dist/benchmarks/runners/passthrough-benchmark-runner.js +454 -0
  6. package/dist/benchmarks/runners/passthrough-benchmark-runner.js.map +1 -0
  7. package/dist/benchmarks/scenarios/api-gateway.scenario.d.ts +3 -0
  8. package/dist/benchmarks/scenarios/api-gateway.scenario.d.ts.map +1 -0
  9. package/dist/benchmarks/scenarios/api-gateway.scenario.js +115 -0
  10. package/dist/benchmarks/scenarios/api-gateway.scenario.js.map +1 -0
  11. package/dist/benchmarks/scenarios/auth-system.scenario.d.ts +3 -0
  12. package/dist/benchmarks/scenarios/auth-system.scenario.d.ts.map +1 -0
  13. package/dist/benchmarks/scenarios/auth-system.scenario.js +114 -0
  14. package/dist/benchmarks/scenarios/auth-system.scenario.js.map +1 -0
  15. package/dist/benchmarks/scenarios/dashboard.scenario.d.ts +3 -0
  16. package/dist/benchmarks/scenarios/dashboard.scenario.d.ts.map +1 -0
  17. package/dist/benchmarks/scenarios/dashboard.scenario.js +110 -0
  18. package/dist/benchmarks/scenarios/dashboard.scenario.js.map +1 -0
  19. package/dist/benchmarks/types.d.ts +148 -0
  20. package/dist/benchmarks/types.d.ts.map +1 -0
  21. package/dist/benchmarks/types.js +2 -0
  22. package/dist/benchmarks/types.js.map +1 -0
  23. package/dist/package.json +5 -1
  24. package/dist/src/agent/parser.d.ts.map +1 -1
  25. package/dist/src/agent/parser.js +2 -0
  26. package/dist/src/agent/parser.js.map +1 -1
  27. package/dist/src/agent/passthrough-generator.d.ts +27 -0
  28. package/dist/src/agent/passthrough-generator.d.ts.map +1 -0
  29. package/dist/src/agent/passthrough-generator.js +133 -0
  30. package/dist/src/agent/passthrough-generator.js.map +1 -0
  31. package/dist/src/agent/registry.d.ts +1 -0
  32. package/dist/src/agent/registry.d.ts.map +1 -1
  33. package/dist/src/agent/registry.js +4 -1
  34. package/dist/src/agent/registry.js.map +1 -1
  35. package/dist/src/agent/role-agent-registry.d.ts +18 -0
  36. package/dist/src/agent/role-agent-registry.d.ts.map +1 -0
  37. package/dist/src/agent/role-agent-registry.js +62 -0
  38. package/dist/src/agent/role-agent-registry.js.map +1 -0
  39. package/dist/src/agent/role-consensus-engine.d.ts +9 -0
  40. package/dist/src/agent/role-consensus-engine.d.ts.map +1 -0
  41. package/dist/src/agent/role-consensus-engine.js +35 -0
  42. package/dist/src/agent/role-consensus-engine.js.map +1 -0
  43. package/dist/src/agent/role-match-engine.d.ts +14 -0
  44. package/dist/src/agent/role-match-engine.d.ts.map +1 -0
  45. package/dist/src/agent/role-match-engine.js +46 -0
  46. package/dist/src/agent/role-match-engine.js.map +1 -0
  47. package/dist/src/agent/role-prompt-generator.d.ts +10 -0
  48. package/dist/src/agent/role-prompt-generator.d.ts.map +1 -0
  49. package/dist/src/agent/role-prompt-generator.js +22 -0
  50. package/dist/src/agent/role-prompt-generator.js.map +1 -0
  51. package/dist/src/cli/commands/monitor.d.ts +2 -0
  52. package/dist/src/cli/commands/monitor.d.ts.map +1 -0
  53. package/dist/src/cli/commands/monitor.js +13 -0
  54. package/dist/src/cli/commands/monitor.js.map +1 -0
  55. package/dist/src/cli/index.d.ts.map +1 -1
  56. package/dist/src/cli/index.js +7 -0
  57. package/dist/src/cli/index.js.map +1 -1
  58. package/dist/src/core/config.d.ts +3 -0
  59. package/dist/src/core/config.d.ts.map +1 -1
  60. package/dist/src/core/config.js +4 -0
  61. package/dist/src/core/config.js.map +1 -1
  62. package/dist/src/core/errors.d.ts +3 -0
  63. package/dist/src/core/errors.d.ts.map +1 -1
  64. package/dist/src/core/errors.js +6 -0
  65. package/dist/src/core/errors.js.map +1 -1
  66. package/dist/src/core/types.d.ts +77 -1
  67. package/dist/src/core/types.d.ts.map +1 -1
  68. package/dist/src/events/types.d.ts +13 -1
  69. package/dist/src/events/types.d.ts.map +1 -1
  70. package/dist/src/events/types.js +15 -0
  71. package/dist/src/events/types.js.map +1 -1
  72. package/dist/src/execute/passthrough-engine.d.ts +31 -2
  73. package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
  74. package/dist/src/execute/passthrough-engine.js +128 -8
  75. package/dist/src/execute/passthrough-engine.js.map +1 -1
  76. package/dist/src/execute/session.d.ts +4 -1
  77. package/dist/src/execute/session.d.ts.map +1 -1
  78. package/dist/src/execute/session.js +29 -0
  79. package/dist/src/execute/session.js.map +1 -1
  80. package/dist/src/mcp/schemas.d.ts +347 -9
  81. package/dist/src/mcp/schemas.d.ts.map +1 -1
  82. package/dist/src/mcp/schemas.js +81 -0
  83. package/dist/src/mcp/schemas.js.map +1 -1
  84. package/dist/src/mcp/server.d.ts.map +1 -1
  85. package/dist/src/mcp/server.js +214 -36
  86. package/dist/src/mcp/server.js.map +1 -1
  87. package/dist/src/mcp/tools/benchmark-passthrough.d.ts +3 -0
  88. package/dist/src/mcp/tools/benchmark-passthrough.d.ts.map +1 -0
  89. package/dist/src/mcp/tools/benchmark-passthrough.js +95 -0
  90. package/dist/src/mcp/tools/benchmark-passthrough.js.map +1 -0
  91. package/dist/src/mcp/tools/create-agent-passthrough.d.ts +5 -0
  92. package/dist/src/mcp/tools/create-agent-passthrough.d.ts.map +1 -0
  93. package/dist/src/mcp/tools/create-agent-passthrough.js +59 -0
  94. package/dist/src/mcp/tools/create-agent-passthrough.js.map +1 -0
  95. package/dist/src/mcp/tools/execute-passthrough.d.ts.map +1 -1
  96. package/dist/src/mcp/tools/execute-passthrough.js +50 -0
  97. package/dist/src/mcp/tools/execute-passthrough.js.map +1 -1
  98. package/dist/src/mcp/tools/review-passthrough.d.ts +6 -0
  99. package/dist/src/mcp/tools/review-passthrough.d.ts.map +1 -0
  100. package/dist/src/mcp/tools/review-passthrough.js +134 -0
  101. package/dist/src/mcp/tools/review-passthrough.js.map +1 -0
  102. package/dist/src/mcp/tools/status.d.ts +2 -1
  103. package/dist/src/mcp/tools/status.d.ts.map +1 -1
  104. package/dist/src/mcp/tools/status.js +74 -27
  105. package/dist/src/mcp/tools/status.js.map +1 -1
  106. package/dist/src/review/agent-matcher.d.ts +15 -0
  107. package/dist/src/review/agent-matcher.d.ts.map +1 -0
  108. package/dist/src/review/agent-matcher.js +61 -0
  109. package/dist/src/review/agent-matcher.js.map +1 -0
  110. package/dist/src/review/context-collector.d.ts +7 -0
  111. package/dist/src/review/context-collector.d.ts.map +1 -0
  112. package/dist/src/review/context-collector.js +44 -0
  113. package/dist/src/review/context-collector.js.map +1 -0
  114. package/dist/src/review/passthrough-engine.d.ts +53 -0
  115. package/dist/src/review/passthrough-engine.d.ts.map +1 -0
  116. package/dist/src/review/passthrough-engine.js +257 -0
  117. package/dist/src/review/passthrough-engine.js.map +1 -0
  118. package/dist/src/review/report-generator.d.ts +7 -0
  119. package/dist/src/review/report-generator.d.ts.map +1 -0
  120. package/dist/src/review/report-generator.js +82 -0
  121. package/dist/src/review/report-generator.js.map +1 -0
  122. package/dist/src/tui/components/TUIApp.d.ts +20 -0
  123. package/dist/src/tui/components/TUIApp.d.ts.map +1 -0
  124. package/dist/src/tui/components/TUIApp.js +84 -0
  125. package/dist/src/tui/components/TUIApp.js.map +1 -0
  126. package/dist/src/tui/hooks/event-store-reader.d.ts +28 -0
  127. package/dist/src/tui/hooks/event-store-reader.d.ts.map +1 -0
  128. package/dist/src/tui/hooks/event-store-reader.js +143 -0
  129. package/dist/src/tui/hooks/event-store-reader.js.map +1 -0
  130. package/dist/src/tui/hooks/useEventStorePoller.d.ts +12 -0
  131. package/dist/src/tui/hooks/useEventStorePoller.d.ts.map +1 -0
  132. package/dist/src/tui/hooks/useEventStorePoller.js +86 -0
  133. package/dist/src/tui/hooks/useEventStorePoller.js.map +1 -0
  134. package/dist/src/tui/screens/DashboardScreen.d.ts +4 -0
  135. package/dist/src/tui/screens/DashboardScreen.d.ts.map +1 -0
  136. package/dist/src/tui/screens/DashboardScreen.js +132 -0
  137. package/dist/src/tui/screens/DashboardScreen.js.map +1 -0
  138. package/dist/src/tui/screens/DebugScreen.d.ts +4 -0
  139. package/dist/src/tui/screens/DebugScreen.d.ts.map +1 -0
  140. package/dist/src/tui/screens/DebugScreen.js +40 -0
  141. package/dist/src/tui/screens/DebugScreen.js.map +1 -0
  142. package/dist/src/tui/screens/EvolutionScreen.d.ts +4 -0
  143. package/dist/src/tui/screens/EvolutionScreen.d.ts.map +1 -0
  144. package/dist/src/tui/screens/EvolutionScreen.js +136 -0
  145. package/dist/src/tui/screens/EvolutionScreen.js.map +1 -0
  146. package/dist/src/tui/screens/HUDPanel.d.ts +4 -0
  147. package/dist/src/tui/screens/HUDPanel.d.ts.map +1 -0
  148. package/dist/src/tui/screens/HUDPanel.js +13 -0
  149. package/dist/src/tui/screens/HUDPanel.js.map +1 -0
  150. package/dist/src/tui/screens/InterviewScreen.d.ts +4 -0
  151. package/dist/src/tui/screens/InterviewScreen.d.ts.map +1 -0
  152. package/dist/src/tui/screens/InterviewScreen.js +103 -0
  153. package/dist/src/tui/screens/InterviewScreen.js.map +1 -0
  154. package/dist/src/tui/screens/LogScreen.d.ts +4 -0
  155. package/dist/src/tui/screens/LogScreen.d.ts.map +1 -0
  156. package/dist/src/tui/screens/LogScreen.js +83 -0
  157. package/dist/src/tui/screens/LogScreen.js.map +1 -0
  158. package/dist/src/tui/screens/SessionListScreen.d.ts +4 -0
  159. package/dist/src/tui/screens/SessionListScreen.d.ts.map +1 -0
  160. package/dist/src/tui/screens/SessionListScreen.js +71 -0
  161. package/dist/src/tui/screens/SessionListScreen.js.map +1 -0
  162. package/dist/src/tui/screens/SpecViewerScreen.d.ts +4 -0
  163. package/dist/src/tui/screens/SpecViewerScreen.d.ts.map +1 -0
  164. package/dist/src/tui/screens/SpecViewerScreen.js +73 -0
  165. package/dist/src/tui/screens/SpecViewerScreen.js.map +1 -0
  166. package/dist/src/tui/widgets/DriftMeter.d.ts +15 -0
  167. package/dist/src/tui/widgets/DriftMeter.d.ts.map +1 -0
  168. package/dist/src/tui/widgets/DriftMeter.js +27 -0
  169. package/dist/src/tui/widgets/DriftMeter.js.map +1 -0
  170. package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts +9 -0
  171. package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts.map +1 -0
  172. package/dist/src/tui/widgets/GestaltPrincipleBar.js +35 -0
  173. package/dist/src/tui/widgets/GestaltPrincipleBar.js.map +1 -0
  174. package/dist/src/tui/widgets/TaskDAGTree.d.ts +15 -0
  175. package/dist/src/tui/widgets/TaskDAGTree.d.ts.map +1 -0
  176. package/dist/src/tui/widgets/TaskDAGTree.js +54 -0
  177. package/dist/src/tui/widgets/TaskDAGTree.js.map +1 -0
  178. package/package.json +5 -1
@@ -0,0 +1,143 @@
1
+ import Database from 'better-sqlite3';
2
+ function rowToEvent(row) {
3
+ return {
4
+ id: row.id,
5
+ aggregateType: row.aggregate_type,
6
+ aggregateId: row.aggregate_id,
7
+ eventType: row.event_type,
8
+ payload: JSON.parse(row.payload),
9
+ timestamp: row.timestamp,
10
+ createdAt: row.created_at,
11
+ };
12
+ }
13
+ export class EventStoreReader {
14
+ db;
15
+ constructor(dbPath) {
16
+ this.db = new Database(dbPath, { readonly: true });
17
+ this.db.pragma('journal_mode = WAL');
18
+ }
19
+ getEventsSince(lastEventId, limit = 500) {
20
+ if (!lastEventId) {
21
+ const rows = this.db
22
+ .prepare('SELECT * FROM events ORDER BY created_at ASC LIMIT ?')
23
+ .all(limit);
24
+ return rows.map(rowToEvent);
25
+ }
26
+ const anchor = this.db
27
+ .prepare('SELECT created_at, id FROM events WHERE id = ?')
28
+ .get(lastEventId);
29
+ if (!anchor) {
30
+ const rows = this.db
31
+ .prepare('SELECT * FROM events ORDER BY created_at ASC LIMIT ?')
32
+ .all(limit);
33
+ return rows.map(rowToEvent);
34
+ }
35
+ const rows = this.db
36
+ .prepare(`SELECT * FROM events
37
+ WHERE (created_at > ?) OR (created_at = ? AND id > ?)
38
+ ORDER BY created_at ASC LIMIT ?`)
39
+ .all(anchor.created_at, anchor.created_at, anchor.id, limit);
40
+ return rows.map(rowToEvent);
41
+ }
42
+ getSessions() {
43
+ const rows = this.db
44
+ .prepare(`SELECT
45
+ aggregate_id,
46
+ aggregate_type,
47
+ MIN(timestamp) as first_event,
48
+ COUNT(*) as event_count
49
+ FROM events
50
+ WHERE aggregate_id != 'system'
51
+ GROUP BY aggregate_type, aggregate_id
52
+ ORDER BY first_event DESC`)
53
+ .all();
54
+ return rows.map((row) => {
55
+ const startEvent = this.db
56
+ .prepare(`SELECT payload FROM events
57
+ WHERE aggregate_id = ? AND event_type LIKE '%_STARTED%'
58
+ ORDER BY timestamp ASC LIMIT 1`)
59
+ .get(row.aggregate_id);
60
+ const lastEvent = this.db
61
+ .prepare(`SELECT event_type FROM events
62
+ WHERE aggregate_id = ?
63
+ ORDER BY timestamp DESC LIMIT 1`)
64
+ .get(row.aggregate_id);
65
+ let topic = '';
66
+ if (startEvent) {
67
+ try {
68
+ const parsed = JSON.parse(startEvent.payload);
69
+ topic = parsed.topic ?? parsed.goal ?? '';
70
+ }
71
+ catch {
72
+ // ignore
73
+ }
74
+ }
75
+ const status = this.inferStatus(lastEvent?.event_type ?? '');
76
+ return {
77
+ sessionId: row.aggregate_id,
78
+ type: row.aggregate_type,
79
+ status,
80
+ topic,
81
+ createdAt: row.first_event,
82
+ eventCount: row.event_count,
83
+ };
84
+ });
85
+ }
86
+ getSessionEvents(sessionId) {
87
+ const rows = this.db
88
+ .prepare('SELECT * FROM events WHERE aggregate_id = ? ORDER BY created_at ASC')
89
+ .all(sessionId);
90
+ return rows.map(rowToEvent);
91
+ }
92
+ getStats() {
93
+ const total = this.db
94
+ .prepare('SELECT COUNT(*) as count FROM events')
95
+ .get();
96
+ const byTypeRows = this.db
97
+ .prepare('SELECT event_type, COUNT(*) as count FROM events GROUP BY event_type')
98
+ .all();
99
+ const byAggRows = this.db
100
+ .prepare('SELECT aggregate_type, COUNT(*) as count FROM events GROUP BY aggregate_type')
101
+ .all();
102
+ const oldest = this.db
103
+ .prepare('SELECT timestamp FROM events ORDER BY timestamp ASC LIMIT 1')
104
+ .get();
105
+ const newest = this.db
106
+ .prepare('SELECT timestamp FROM events ORDER BY timestamp DESC LIMIT 1')
107
+ .get();
108
+ const byType = {};
109
+ for (const row of byTypeRows) {
110
+ byType[row.event_type] = row.count;
111
+ }
112
+ const byAggregate = {};
113
+ for (const row of byAggRows) {
114
+ byAggregate[row.aggregate_type] = row.count;
115
+ }
116
+ return {
117
+ totalEvents: total.count,
118
+ byType,
119
+ byAggregate,
120
+ oldestEvent: oldest?.timestamp ?? null,
121
+ newestEvent: newest?.timestamp ?? null,
122
+ };
123
+ }
124
+ getLatestEvents(limit = 50) {
125
+ const rows = this.db
126
+ .prepare('SELECT * FROM events ORDER BY created_at DESC LIMIT ?')
127
+ .all(limit);
128
+ return rows.map(rowToEvent);
129
+ }
130
+ close() {
131
+ this.db.close();
132
+ }
133
+ inferStatus(lastEventType) {
134
+ if (lastEventType.includes('COMPLETED'))
135
+ return 'completed';
136
+ if (lastEventType.includes('FAILED'))
137
+ return 'failed';
138
+ if (lastEventType.includes('ESCALATION'))
139
+ return 'escalated';
140
+ return 'in_progress';
141
+ }
142
+ }
143
+ //# sourceMappingURL=event-store-reader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-store-reader.js","sourceRoot":"","sources":["../../../../src/tui/hooks/event-store-reader.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ import type { DomainEvent } from '../../core/types.js';
2
+ import { type SessionSummary, type EventStats } from './event-store-reader.js';
3
+ export interface PollerState {
4
+ events: DomainEvent[];
5
+ sessions: SessionSummary[];
6
+ stats: EventStats;
7
+ isConnected: boolean;
8
+ lastEventId: string | null;
9
+ error: string | null;
10
+ }
11
+ export declare function useEventStorePoller(dbPath: string, pollInterval?: number): PollerState;
12
+ //# sourceMappingURL=useEventStorePoller.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEventStorePoller.d.ts","sourceRoot":"","sources":["../../../../src/tui/hooks/useEventStorePoller.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvD,OAAO,EAAoB,KAAK,cAAc,EAAE,KAAK,UAAU,EAAE,MAAM,yBAAyB,CAAC;AAEjG,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,KAAK,EAAE,UAAU,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;IACrB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CACtB;AAUD,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,MAAM,EACd,YAAY,SAAO,GAClB,WAAW,CAmFb"}
@@ -0,0 +1,86 @@
1
+ import { useState, useEffect, useRef, useCallback } from 'react';
2
+ import { EventStoreReader } from './event-store-reader.js';
3
+ const EMPTY_STATS = {
4
+ totalEvents: 0,
5
+ byType: {},
6
+ byAggregate: {},
7
+ oldestEvent: null,
8
+ newestEvent: null,
9
+ };
10
+ export function useEventStorePoller(dbPath, pollInterval = 1000) {
11
+ const [state, setState] = useState({
12
+ events: [],
13
+ sessions: [],
14
+ stats: EMPTY_STATS,
15
+ isConnected: false,
16
+ lastEventId: null,
17
+ error: null,
18
+ });
19
+ const readerRef = useRef(null);
20
+ const timerRef = useRef(null);
21
+ const lastEventIdRef = useRef(null);
22
+ const poll = useCallback(() => {
23
+ const reader = readerRef.current;
24
+ if (!reader)
25
+ return;
26
+ try {
27
+ const newEvents = reader.getEventsSince(lastEventIdRef.current);
28
+ const sessions = reader.getSessions();
29
+ const stats = reader.getStats();
30
+ if (newEvents.length > 0) {
31
+ const lastEvent = newEvents[newEvents.length - 1];
32
+ if (lastEvent) {
33
+ lastEventIdRef.current = lastEvent.id;
34
+ }
35
+ }
36
+ setState((prev) => {
37
+ const allEvents = newEvents.length > 0
38
+ ? [...prev.events, ...newEvents]
39
+ : prev.events;
40
+ return {
41
+ events: allEvents,
42
+ sessions,
43
+ stats,
44
+ isConnected: true,
45
+ lastEventId: lastEventIdRef.current,
46
+ error: null,
47
+ };
48
+ });
49
+ }
50
+ catch (err) {
51
+ setState((prev) => ({
52
+ ...prev,
53
+ isConnected: false,
54
+ error: err instanceof Error ? err.message : String(err),
55
+ }));
56
+ }
57
+ }, []);
58
+ useEffect(() => {
59
+ try {
60
+ readerRef.current = new EventStoreReader(dbPath);
61
+ setState((prev) => ({ ...prev, isConnected: true, error: null }));
62
+ poll();
63
+ }
64
+ catch (err) {
65
+ setState((prev) => ({
66
+ ...prev,
67
+ isConnected: false,
68
+ error: err instanceof Error ? err.message : String(err),
69
+ }));
70
+ return;
71
+ }
72
+ timerRef.current = setInterval(poll, pollInterval);
73
+ return () => {
74
+ if (timerRef.current) {
75
+ clearInterval(timerRef.current);
76
+ timerRef.current = null;
77
+ }
78
+ if (readerRef.current) {
79
+ readerRef.current.close();
80
+ readerRef.current = null;
81
+ }
82
+ };
83
+ }, [dbPath, pollInterval, poll]);
84
+ return state;
85
+ }
86
+ //# sourceMappingURL=useEventStorePoller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useEventStorePoller.js","sourceRoot":"","sources":["../../../../src/tui/hooks/useEventStorePoller.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import type { ScreenProps } from '../components/TUIApp.js';
3
+ export declare function DashboardScreen({ events, selectedSessionId, }: ScreenProps): React.ReactElement;
4
+ //# sourceMappingURL=DashboardScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardScreen.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/DashboardScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAuJ3D,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,iBAAiB,GAClB,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAwFlC"}
@@ -0,0 +1,132 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ import { GestaltPrincipleBar } from '../widgets/GestaltPrincipleBar.js';
5
+ import { TaskDAGTree } from '../widgets/TaskDAGTree.js';
6
+ import { DriftMeter } from '../widgets/DriftMeter.js';
7
+ const PLANNING_PRINCIPLES = [
8
+ 'figure_ground',
9
+ 'closure',
10
+ 'proximity',
11
+ 'continuity',
12
+ ];
13
+ function parseDashboardEvents(events, sessionId) {
14
+ const sessionEvents = sessionId
15
+ ? events.filter((e) => e.aggregateId === sessionId)
16
+ : [];
17
+ const completedPhases = [];
18
+ let currentPhase = null;
19
+ const tasks = [];
20
+ const taskStatusMap = new Map();
21
+ let driftOverall = 0;
22
+ const driftDimensions = [];
23
+ let sessionType = '';
24
+ for (const ev of sessionEvents) {
25
+ const payload = ev.payload;
26
+ if (ev.eventType.includes('session.started')) {
27
+ sessionType = ev.aggregateType;
28
+ }
29
+ // Planning phase tracking
30
+ if (ev.eventType === 'execute.planning.step.completed') {
31
+ const principle = payload.principle;
32
+ if (principle) {
33
+ const phase = principle;
34
+ if (!completedPhases.includes(phase)) {
35
+ completedPhases.push(phase);
36
+ }
37
+ }
38
+ }
39
+ // Determine current planning phase
40
+ if (ev.eventType === 'execute.session.started') {
41
+ currentPhase = 'figure_ground';
42
+ }
43
+ // Task extraction from plan completion
44
+ if (ev.eventType === 'execute.plan.completed') {
45
+ const atomicTasks = payload.atomicTasks;
46
+ if (atomicTasks) {
47
+ for (const t of atomicTasks) {
48
+ tasks.push({
49
+ id: t.taskId,
50
+ title: t.title,
51
+ status: 'pending',
52
+ dependsOn: t.dependsOn ?? [],
53
+ });
54
+ }
55
+ }
56
+ }
57
+ // Task status updates
58
+ if (ev.eventType === 'execute.task.completed' ||
59
+ ev.eventType === 'evolve.task.completed') {
60
+ const taskId = payload.taskId;
61
+ const status = payload.status;
62
+ if (taskId && status) {
63
+ taskStatusMap.set(taskId, status);
64
+ }
65
+ }
66
+ // Drift measurements
67
+ if (ev.eventType === 'execute.drift.measured') {
68
+ const overall = payload.overall;
69
+ const dimensions = payload.dimensions;
70
+ if (overall !== undefined) {
71
+ driftOverall = overall;
72
+ }
73
+ if (dimensions) {
74
+ driftDimensions.length = 0;
75
+ for (const dim of dimensions) {
76
+ driftDimensions.push({
77
+ name: dim.name,
78
+ score: dim.score,
79
+ weight: dim.weight ?? 0.33,
80
+ });
81
+ }
82
+ }
83
+ }
84
+ }
85
+ // Apply task status updates
86
+ for (const task of tasks) {
87
+ const status = taskStatusMap.get(task.id);
88
+ if (status === 'completed')
89
+ task.status = 'completed';
90
+ else if (status === 'failed')
91
+ task.status = 'failed';
92
+ else if (status === 'in_progress')
93
+ task.status = 'in_progress';
94
+ else if (status === 'skipped')
95
+ task.status = 'skipped';
96
+ }
97
+ // Determine current phase based on completed phases
98
+ if (completedPhases.length > 0 && completedPhases.length < PLANNING_PRINCIPLES.length) {
99
+ currentPhase = PLANNING_PRINCIPLES[completedPhases.length] ?? null;
100
+ }
101
+ else if (completedPhases.length >= PLANNING_PRINCIPLES.length) {
102
+ currentPhase = null;
103
+ }
104
+ // Build active tasks list
105
+ const activeTasks = tasks
106
+ .filter((t) => t.status === 'in_progress' || t.status === 'pending')
107
+ .slice(0, 10)
108
+ .map((t) => ({ taskId: t.id, title: t.title, status: t.status }));
109
+ return {
110
+ currentPhase,
111
+ completedPhases,
112
+ tasks,
113
+ driftDimensions,
114
+ driftOverall,
115
+ driftThreshold: 0.3,
116
+ activeTasks,
117
+ sessionType,
118
+ };
119
+ }
120
+ export function DashboardScreen({ events, selectedSessionId, }) {
121
+ const data = useMemo(() => parseDashboardEvents(events, selectedSessionId), [events, selectedSessionId]);
122
+ if (!selectedSessionId) {
123
+ return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", minHeight: 10, children: [_jsx(Text, { bold: true, color: "yellow", children: "No session selected" }), _jsx(Text, { dimColor: true, children: "Press 1 to go to Sessions and select one." })] }));
124
+ }
125
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, gap: 1, children: [_jsx(Text, { bold: true, children: "Dashboard" }), _jsx(Text, { dimColor: true, children: "|" }), _jsx(Text, { color: "cyan", children: truncate(selectedSessionId, 24) }), data.sessionType && (_jsxs(Text, { dimColor: true, children: ["(", data.sessionType, ")"] }))] }), _jsx(Box, { marginBottom: 1, children: _jsx(GestaltPrincipleBar, { currentPhase: data.currentPhase, completedPhases: data.completedPhases }) }), _jsxs(Box, { gap: 2, marginBottom: 1, children: [_jsx(Box, { flexDirection: "column", flexGrow: 1, flexBasis: 0, children: data.tasks.length > 0 ? (_jsx(TaskDAGTree, { tasks: data.tasks, maxHeight: 15 })) : (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Task DAG" }), _jsx(Text, { dimColor: true, children: "No tasks yet (planning not complete)" })] })) }), _jsx(Box, { flexDirection: "column", flexGrow: 1, flexBasis: 0, children: data.driftDimensions.length > 0 ? (_jsx(DriftMeter, { dimensions: data.driftDimensions, overall: data.driftOverall, threshold: data.driftThreshold })) : (_jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, children: "Drift" }), _jsx(Text, { dimColor: true, children: "No drift data yet" })] })) })] }), _jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Active Tasks" }), _jsxs(Text, { dimColor: true, children: ["(", data.activeTasks.length, ")"] })] }), data.activeTasks.length === 0 ? (_jsx(Text, { dimColor: true, children: " No active tasks" })) : (data.activeTasks.map((task) => (_jsxs(Box, { paddingLeft: 1, gap: 1, children: [_jsx(Text, { color: task.status === 'in_progress' ? 'cyan' : 'gray', children: task.status === 'in_progress' ? '>' : 'o' }), _jsx(Text, { color: task.status === 'in_progress' ? 'cyan' : 'gray', bold: task.status === 'in_progress', children: task.taskId }), _jsx(Text, { dimColor: true, children: truncate(task.title, 50) })] }, task.taskId))))] })] }));
126
+ }
127
+ function truncate(str, max) {
128
+ if (str.length <= max)
129
+ return str;
130
+ return str.slice(0, max - 3) + '...';
131
+ }
132
+ //# sourceMappingURL=DashboardScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DashboardScreen.js","sourceRoot":"","sources":["../../../../src/tui/screens/DashboardScreen.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import type { ScreenProps } from '../components/TUIApp.js';
3
+ export declare function DebugScreen({ events, stats, isConnected, }: ScreenProps): React.ReactElement;
4
+ //# sourceMappingURL=DebugScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugScreen.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/DebugScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,wBAAgB,WAAW,CAAC,EAC1B,MAAM,EACN,KAAK,EACL,WAAW,GACZ,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CA8HlC"}
@@ -0,0 +1,40 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { Box, Text } from 'ink';
3
+ export function DebugScreen({ events, stats, isConnected, }) {
4
+ const latestEvent = events.length > 0 ? events[events.length - 1] : null;
5
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsx(Box, { marginBottom: 1, children: _jsx(Text, { bold: true, children: "Debug Info" }) }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Connection" }), _jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsx(Text, { children: "Status:" }), _jsx(Text, { color: isConnected ? 'green' : 'red', bold: true, children: isConnected ? 'Connected' : 'Disconnected' })] })] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Event Stats" }), _jsxs(Text, { dimColor: true, children: ["(total: ", stats.totalEvents, ")"] })] }), stats.oldestEvent && (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsx(Text, { dimColor: true, children: "oldest:" }), _jsx(Text, { children: formatTimestamp(stats.oldestEvent) })] })), stats.newestEvent && (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsx(Text, { dimColor: true, children: "newest:" }), _jsx(Text, { children: formatTimestamp(stats.newestEvent) })] }))] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: "By Event Type" }), Object.keys(stats.byType).length === 0 ? (_jsx(Box, { paddingLeft: 2, children: _jsx(Text, { dimColor: true, children: "(no events)" }) })) : (Object.entries(stats.byType)
6
+ .sort(([, a], [, b]) => b - a)
7
+ .map(([type, count]) => (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsx(Box, { width: 40, children: _jsx(Text, { children: type }) }), _jsx(Text, { color: "yellow", children: count }), _jsx(Text, { dimColor: true, children: renderMiniBar(count, stats.totalEvents, 15) })] }, type))))] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "magenta", children: "By Aggregate Type" }), Object.keys(stats.byAggregate).length === 0 ? (_jsx(Box, { paddingLeft: 2, children: _jsx(Text, { dimColor: true, children: "(no events)" }) })) : (Object.entries(stats.byAggregate)
8
+ .sort(([, a], [, b]) => b - a)
9
+ .map(([agg, count]) => (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsx(Box, { width: 20, children: _jsx(Text, { children: agg }) }), _jsx(Text, { color: "magenta", children: count }), _jsx(Text, { dimColor: true, children: renderMiniBar(count, stats.totalEvents, 15) })] }, agg))))] }), _jsxs(Box, { flexDirection: "column", children: [_jsx(Text, { bold: true, color: "green", children: "Latest Event (raw)" }), latestEvent ? (_jsxs(Box, { paddingLeft: 2, flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "id:" }), _jsx(Text, { children: latestEvent.id })] }), _jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "type:" }), _jsx(Text, { children: latestEvent.eventType })] }), _jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "aggregate:" }), _jsxs(Text, { children: [latestEvent.aggregateType, "/", truncate(latestEvent.aggregateId, 24)] })] }), _jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "time:" }), _jsx(Text, { children: latestEvent.timestamp })] }), _jsxs(Box, { marginTop: 1, flexDirection: "column", children: [_jsx(Text, { dimColor: true, children: "payload:" }), _jsx(Box, { paddingLeft: 2, children: _jsx(Text, { color: "green", children: truncate(JSON.stringify(latestEvent.payload, null, 2), 200) }) })] })] })) : (_jsx(Box, { paddingLeft: 2, children: _jsx(Text, { dimColor: true, children: "(no events)" }) }))] })] }));
10
+ }
11
+ function renderMiniBar(count, total, width) {
12
+ if (total === 0)
13
+ return '[' + ' '.repeat(width) + ']';
14
+ const ratio = count / total;
15
+ const filled = Math.round(ratio * width);
16
+ const empty = width - filled;
17
+ return '[' + '='.repeat(filled) + ' '.repeat(empty) + ']';
18
+ }
19
+ function truncate(str, max) {
20
+ if (str.length <= max)
21
+ return str;
22
+ return str.slice(0, max - 3) + '...';
23
+ }
24
+ function formatTimestamp(ts) {
25
+ try {
26
+ const d = new Date(ts);
27
+ return d.toLocaleString('en-US', {
28
+ month: 'short',
29
+ day: '2-digit',
30
+ hour: '2-digit',
31
+ minute: '2-digit',
32
+ second: '2-digit',
33
+ hour12: false,
34
+ });
35
+ }
36
+ catch {
37
+ return ts.slice(0, 19);
38
+ }
39
+ }
40
+ //# sourceMappingURL=DebugScreen.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"DebugScreen.js","sourceRoot":"","sources":["../../../../src/tui/screens/DebugScreen.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ import type { ScreenProps } from '../components/TUIApp.js';
3
+ export declare function EvolutionScreen({ events, selectedSessionId, }: ScreenProps): React.ReactElement;
4
+ //# sourceMappingURL=EvolutionScreen.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvolutionScreen.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/EvolutionScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAwI3D,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,iBAAiB,GAClB,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAkIlC"}
@@ -0,0 +1,136 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useMemo } from 'react';
3
+ import { Box, Text } from 'ink';
4
+ function parseEvolutionEvents(events, sessionId) {
5
+ const sessionEvents = sessionId
6
+ ? events.filter((e) => e.aggregateId === sessionId)
7
+ : [];
8
+ const generations = [];
9
+ const laterals = [];
10
+ let terminationReason = null;
11
+ let fixAttempts = 0;
12
+ let isEscalated = false;
13
+ let currentStage = 'none';
14
+ for (const ev of sessionEvents) {
15
+ const payload = ev.payload;
16
+ // Evaluation results → score tracking per generation
17
+ if (ev.eventType === 'evaluate.contextual.completed' || ev.eventType === 'execute.evaluation.completed') {
18
+ const overallScore = payload.overallScore ?? 0;
19
+ const goalAlignment = payload.goalAlignment ?? 0;
20
+ generations.push({
21
+ generation: generations.length + 1,
22
+ overallScore,
23
+ goalAlignment,
24
+ patchFields: [],
25
+ timestamp: ev.timestamp,
26
+ });
27
+ }
28
+ // Spec patches
29
+ if (ev.eventType === 'evolve.spec.patched') {
30
+ const fieldsChanged = payload.fieldsChanged ?? [];
31
+ const lastGen = generations[generations.length - 1];
32
+ if (lastGen) {
33
+ lastGen.patchFields = fieldsChanged;
34
+ }
35
+ currentStage = 'patch';
36
+ }
37
+ // Structural fixes
38
+ if (ev.eventType === 'evolve.structural.fix.started') {
39
+ fixAttempts++;
40
+ currentStage = 'fix';
41
+ }
42
+ if (ev.eventType === 'evolve.structural.fix.completed') {
43
+ currentStage = 'fix_done';
44
+ }
45
+ // Lateral thinking
46
+ if (ev.eventType === 'evolve.lateral.started') {
47
+ const persona = payload.persona ?? '';
48
+ const pattern = payload.pattern ?? '';
49
+ laterals.push({ persona, pattern, status: 'started', timestamp: ev.timestamp });
50
+ currentStage = 'lateral';
51
+ }
52
+ if (ev.eventType === 'evolve.lateral.completed') {
53
+ const persona = payload.persona ?? '';
54
+ const matching = laterals.find((l) => l.persona === persona && l.status === 'started');
55
+ if (matching) {
56
+ matching.status = 'completed';
57
+ }
58
+ currentStage = 'lateral_done';
59
+ }
60
+ // Termination
61
+ if (ev.eventType === 'evolve.terminated') {
62
+ terminationReason = payload.reason ?? 'unknown';
63
+ }
64
+ // Human escalation
65
+ if (ev.eventType === 'evolve.human.escalation') {
66
+ isEscalated = true;
67
+ terminationReason = 'human_escalation';
68
+ }
69
+ // Re-execution
70
+ if (ev.eventType === 'evolve.re.execution.started') {
71
+ currentStage = 're_executing';
72
+ }
73
+ }
74
+ return {
75
+ generations,
76
+ laterals,
77
+ terminationReason,
78
+ fixAttempts,
79
+ isEscalated,
80
+ currentStage,
81
+ };
82
+ }
83
+ const PERSONA_ICONS = {
84
+ multistability: '~',
85
+ simplicity: '-',
86
+ reification: '+',
87
+ invariance: '=',
88
+ };
89
+ const PERSONA_COLORS = {
90
+ multistability: 'magenta',
91
+ simplicity: 'green',
92
+ reification: 'yellow',
93
+ invariance: 'cyan',
94
+ };
95
+ export function EvolutionScreen({ events, selectedSessionId, }) {
96
+ const data = useMemo(() => parseEvolutionEvents(events, selectedSessionId), [events, selectedSessionId]);
97
+ if (!selectedSessionId) {
98
+ return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", minHeight: 10, children: [_jsx(Text, { bold: true, color: "yellow", children: "No session selected" }), _jsx(Text, { dimColor: true, children: "Press 1 to go to Sessions and select one." })] }));
99
+ }
100
+ if (data.generations.length === 0 && data.laterals.length === 0) {
101
+ return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", minHeight: 10, children: [_jsx(Text, { bold: true, color: "yellow", children: "No evolution data" }), _jsx(Text, { dimColor: true, children: "No evolution events found for this session." })] }));
102
+ }
103
+ return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, gap: 1, children: [_jsx(Text, { bold: true, children: "Evolution" }), _jsx(Text, { dimColor: true, children: "|" }), _jsx(Text, { color: "cyan", children: truncate(selectedSessionId, 24) }), _jsx(Text, { dimColor: true, children: "|" }), _jsxs(Text, { dimColor: true, children: ["gens: ", data.generations.length] }), _jsxs(Text, { dimColor: true, children: ["fixes: ", data.fixAttempts] }), _jsxs(Text, { dimColor: true, children: ["stage: ", data.currentStage] }), data.terminationReason && (_jsxs(Text, { color: data.terminationReason === 'success' ? 'green' : 'red', children: ["[", data.terminationReason, "]"] }))] }), data.generations.length > 0 && (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Score Progression" }), _jsxs(Box, { paddingLeft: 2, flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Box, { width: 12, children: _jsx(Text, { dimColor: true, children: "overall:" }) }), _jsx(Text, { children: renderSparkline(data.generations.map((g) => g.overallScore)) })] }), _jsxs(Box, { gap: 1, children: [_jsx(Box, { width: 12, children: _jsx(Text, { dimColor: true, children: "goalAlign:" }) }), _jsx(Text, { children: renderSparkline(data.generations.map((g) => g.goalAlignment)) })] })] })] })), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, children: "Generations" }), _jsxs(Text, { dimColor: true, children: ["(", data.generations.length, ")"] })] }), data.generations.map((gen) => {
104
+ const scoreColor = gen.overallScore >= 0.85 ? 'green' : gen.overallScore >= 0.5 ? 'yellow' : 'red';
105
+ const goalColor = gen.goalAlignment >= 0.80 ? 'green' : gen.goalAlignment >= 0.5 ? 'yellow' : 'red';
106
+ return (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsxs(Text, { bold: true, children: ["G", gen.generation] }), _jsxs(Text, { color: scoreColor, children: ["score:", (gen.overallScore * 100).toFixed(0), "%"] }), _jsxs(Text, { color: goalColor, children: ["goal:", (gen.goalAlignment * 100).toFixed(0), "%"] }), renderScoreBar(gen.overallScore, 15), gen.patchFields.length > 0 && (_jsxs(Text, { dimColor: true, children: ["patch:[", gen.patchFields.join(','), "]"] }))] }, gen.generation));
107
+ })] }), data.laterals.length > 0 && (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, children: "Lateral Thinking" }), _jsxs(Text, { dimColor: true, children: ["(", data.laterals.length, " attempts)"] })] }), data.laterals.map((lat, i) => {
108
+ const icon = PERSONA_ICONS[lat.persona] ?? '?';
109
+ const color = PERSONA_COLORS[lat.persona] ?? 'gray';
110
+ return (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsx(Text, { color: color, children: icon }), _jsx(Text, { color: color, bold: true, children: lat.persona }), _jsxs(Text, { dimColor: true, children: ["(", lat.pattern, ")"] }), _jsx(Text, { color: lat.status === 'completed' ? 'green' : 'cyan', children: lat.status === 'completed' ? 'done' : 'active' })] }, i));
111
+ })] })), data.isEscalated && (_jsx(Box, { marginTop: 1, paddingX: 1, borderStyle: "single", borderColor: "red", children: _jsx(Text, { color: "red", bold: true, children: "HUMAN ESCALATION \u2014 All lateral personas exhausted. Manual intervention required." }) }))] }));
112
+ }
113
+ function renderSparkline(values) {
114
+ if (values.length === 0)
115
+ return '';
116
+ const blocks = [' ', '\u2581', '\u2582', '\u2583', '\u2584', '\u2585', '\u2586', '\u2587', '\u2588'];
117
+ return values
118
+ .map((v) => {
119
+ const clamped = Math.max(0, Math.min(1, v));
120
+ const idx = Math.round(clamped * (blocks.length - 1));
121
+ return blocks[idx] ?? ' ';
122
+ })
123
+ .join('');
124
+ }
125
+ function renderScoreBar(score, width) {
126
+ const filled = Math.round(score * width);
127
+ const empty = width - filled;
128
+ const color = score >= 0.85 ? 'green' : score >= 0.5 ? 'yellow' : 'red';
129
+ return (_jsx(Text, { color: color, children: '[' + '='.repeat(filled) + ' '.repeat(empty) + ']' }));
130
+ }
131
+ function truncate(str, max) {
132
+ if (str.length <= max)
133
+ return str;
134
+ return str.slice(0, max - 3) + '...';
135
+ }
136
+ //# sourceMappingURL=EvolutionScreen.js.map