@tienne/gestalt 0.1.1 → 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.
- package/CLAUDE.md +175 -6
- package/README.md +381 -14
- package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts +94 -0
- package/dist/benchmarks/runners/passthrough-benchmark-runner.d.ts.map +1 -0
- package/dist/benchmarks/runners/passthrough-benchmark-runner.js +454 -0
- package/dist/benchmarks/runners/passthrough-benchmark-runner.js.map +1 -0
- package/dist/benchmarks/scenarios/api-gateway.scenario.d.ts +3 -0
- package/dist/benchmarks/scenarios/api-gateway.scenario.d.ts.map +1 -0
- package/dist/benchmarks/scenarios/api-gateway.scenario.js +115 -0
- package/dist/benchmarks/scenarios/api-gateway.scenario.js.map +1 -0
- package/dist/benchmarks/scenarios/auth-system.scenario.d.ts +3 -0
- package/dist/benchmarks/scenarios/auth-system.scenario.d.ts.map +1 -0
- package/dist/benchmarks/scenarios/auth-system.scenario.js +114 -0
- package/dist/benchmarks/scenarios/auth-system.scenario.js.map +1 -0
- package/dist/benchmarks/scenarios/dashboard.scenario.d.ts +3 -0
- package/dist/benchmarks/scenarios/dashboard.scenario.d.ts.map +1 -0
- package/dist/benchmarks/scenarios/dashboard.scenario.js +110 -0
- package/dist/benchmarks/scenarios/dashboard.scenario.js.map +1 -0
- package/dist/benchmarks/types.d.ts +148 -0
- package/dist/benchmarks/types.d.ts.map +1 -0
- package/dist/benchmarks/types.js +2 -0
- package/dist/benchmarks/types.js.map +1 -0
- package/dist/package.json +61 -0
- package/dist/schemas/gestalt.schema.json +98 -0
- package/dist/src/agent/parser.d.ts.map +1 -1
- package/dist/src/agent/parser.js +2 -0
- package/dist/src/agent/parser.js.map +1 -1
- package/dist/src/agent/passthrough-generator.d.ts +27 -0
- package/dist/src/agent/passthrough-generator.d.ts.map +1 -0
- package/dist/src/agent/passthrough-generator.js +133 -0
- package/dist/src/agent/passthrough-generator.js.map +1 -0
- package/dist/src/agent/registry.d.ts +1 -0
- package/dist/src/agent/registry.d.ts.map +1 -1
- package/dist/src/agent/registry.js +4 -1
- package/dist/src/agent/registry.js.map +1 -1
- package/dist/src/agent/role-agent-registry.d.ts +18 -0
- package/dist/src/agent/role-agent-registry.d.ts.map +1 -0
- package/dist/src/agent/role-agent-registry.js +62 -0
- package/dist/src/agent/role-agent-registry.js.map +1 -0
- package/dist/src/agent/role-consensus-engine.d.ts +9 -0
- package/dist/src/agent/role-consensus-engine.d.ts.map +1 -0
- package/dist/src/agent/role-consensus-engine.js +35 -0
- package/dist/src/agent/role-consensus-engine.js.map +1 -0
- package/dist/src/agent/role-match-engine.d.ts +14 -0
- package/dist/src/agent/role-match-engine.d.ts.map +1 -0
- package/dist/src/agent/role-match-engine.js +46 -0
- package/dist/src/agent/role-match-engine.js.map +1 -0
- package/dist/src/agent/role-prompt-generator.d.ts +10 -0
- package/dist/src/agent/role-prompt-generator.d.ts.map +1 -0
- package/dist/src/agent/role-prompt-generator.js +22 -0
- package/dist/src/agent/role-prompt-generator.js.map +1 -0
- package/dist/src/cli/commands/interview.js +2 -2
- package/dist/src/cli/commands/interview.js.map +1 -1
- package/dist/src/cli/commands/monitor.d.ts +2 -0
- package/dist/src/cli/commands/monitor.d.ts.map +1 -0
- package/dist/src/cli/commands/monitor.js +13 -0
- package/dist/src/cli/commands/monitor.js.map +1 -0
- package/dist/src/cli/commands/setup.d.ts +2 -0
- package/dist/src/cli/commands/setup.d.ts.map +1 -0
- package/dist/src/cli/commands/setup.js +20 -0
- package/dist/src/cli/commands/setup.js.map +1 -0
- package/dist/src/cli/commands/spec.js +2 -2
- package/dist/src/cli/commands/spec.js.map +1 -1
- package/dist/src/cli/commands/status.d.ts.map +1 -1
- package/dist/src/cli/commands/status.js +3 -3
- package/dist/src/cli/commands/status.js.map +1 -1
- package/dist/src/cli/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +16 -1
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/config.d.ts +80 -17
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +141 -31
- package/dist/src/core/config.js.map +1 -1
- package/dist/src/core/constants.d.ts +2 -2
- package/dist/src/core/constants.d.ts.map +1 -1
- package/dist/src/core/constants.js +2 -2
- package/dist/src/core/constants.js.map +1 -1
- package/dist/src/core/errors.d.ts +3 -0
- package/dist/src/core/errors.d.ts.map +1 -1
- package/dist/src/core/errors.js +6 -0
- package/dist/src/core/errors.js.map +1 -1
- package/dist/src/core/types.d.ts +83 -3
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/core/version.d.ts +10 -0
- package/dist/src/core/version.d.ts.map +1 -0
- package/dist/src/core/version.js +89 -0
- package/dist/src/core/version.js.map +1 -0
- package/dist/src/events/types.d.ts +16 -1
- package/dist/src/events/types.d.ts.map +1 -1
- package/dist/src/events/types.js +19 -0
- package/dist/src/events/types.js.map +1 -1
- package/dist/src/execute/passthrough-engine.d.ts +44 -2
- package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
- package/dist/src/execute/passthrough-engine.js +245 -10
- package/dist/src/execute/passthrough-engine.js.map +1 -1
- package/dist/src/execute/repository.d.ts.map +1 -1
- package/dist/src/execute/repository.js +24 -0
- package/dist/src/execute/repository.js.map +1 -1
- package/dist/src/execute/session.d.ts +6 -1
- package/dist/src/execute/session.d.ts.map +1 -1
- package/dist/src/execute/session.js +60 -0
- package/dist/src/execute/session.js.map +1 -1
- package/dist/src/mcp/schemas.d.ts +513 -9
- package/dist/src/mcp/schemas.d.ts.map +1 -1
- package/dist/src/mcp/schemas.js +102 -0
- package/dist/src/mcp/schemas.js.map +1 -1
- package/dist/src/mcp/server.d.ts.map +1 -1
- package/dist/src/mcp/server.js +253 -38
- package/dist/src/mcp/server.js.map +1 -1
- package/dist/src/mcp/tools/benchmark-passthrough.d.ts +3 -0
- package/dist/src/mcp/tools/benchmark-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/benchmark-passthrough.js +95 -0
- package/dist/src/mcp/tools/benchmark-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/create-agent-passthrough.d.ts +5 -0
- package/dist/src/mcp/tools/create-agent-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/create-agent-passthrough.js +59 -0
- package/dist/src/mcp/tools/create-agent-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/execute-passthrough.d.ts.map +1 -1
- package/dist/src/mcp/tools/execute-passthrough.js +126 -0
- package/dist/src/mcp/tools/execute-passthrough.js.map +1 -1
- package/dist/src/mcp/tools/review-passthrough.d.ts +6 -0
- package/dist/src/mcp/tools/review-passthrough.d.ts.map +1 -0
- package/dist/src/mcp/tools/review-passthrough.js +134 -0
- package/dist/src/mcp/tools/review-passthrough.js.map +1 -0
- package/dist/src/mcp/tools/status.d.ts +2 -1
- package/dist/src/mcp/tools/status.d.ts.map +1 -1
- package/dist/src/mcp/tools/status.js +81 -26
- package/dist/src/mcp/tools/status.js.map +1 -1
- package/dist/src/resilience/lateral.d.ts +17 -0
- package/dist/src/resilience/lateral.d.ts.map +1 -0
- package/dist/src/resilience/lateral.js +62 -0
- package/dist/src/resilience/lateral.js.map +1 -0
- package/dist/src/resilience/prompts.d.ts +5 -0
- package/dist/src/resilience/prompts.d.ts.map +1 -0
- package/dist/src/resilience/prompts.js +130 -0
- package/dist/src/resilience/prompts.js.map +1 -0
- package/dist/src/resilience/stagnation-detector.d.ts +19 -0
- package/dist/src/resilience/stagnation-detector.d.ts.map +1 -0
- package/dist/src/resilience/stagnation-detector.js +38 -0
- package/dist/src/resilience/stagnation-detector.js.map +1 -0
- package/dist/src/resilience/types.d.ts +39 -0
- package/dist/src/resilience/types.d.ts.map +1 -0
- package/dist/src/resilience/types.js +17 -0
- package/dist/src/resilience/types.js.map +1 -0
- package/dist/src/review/agent-matcher.d.ts +15 -0
- package/dist/src/review/agent-matcher.d.ts.map +1 -0
- package/dist/src/review/agent-matcher.js +61 -0
- package/dist/src/review/agent-matcher.js.map +1 -0
- package/dist/src/review/context-collector.d.ts +7 -0
- package/dist/src/review/context-collector.d.ts.map +1 -0
- package/dist/src/review/context-collector.js +44 -0
- package/dist/src/review/context-collector.js.map +1 -0
- package/dist/src/review/passthrough-engine.d.ts +53 -0
- package/dist/src/review/passthrough-engine.d.ts.map +1 -0
- package/dist/src/review/passthrough-engine.js +257 -0
- package/dist/src/review/passthrough-engine.js.map +1 -0
- package/dist/src/review/report-generator.d.ts +7 -0
- package/dist/src/review/report-generator.d.ts.map +1 -0
- package/dist/src/review/report-generator.js +82 -0
- package/dist/src/review/report-generator.js.map +1 -0
- package/dist/src/tui/components/TUIApp.d.ts +20 -0
- package/dist/src/tui/components/TUIApp.d.ts.map +1 -0
- package/dist/src/tui/components/TUIApp.js +84 -0
- package/dist/src/tui/components/TUIApp.js.map +1 -0
- package/dist/src/tui/hooks/event-store-reader.d.ts +28 -0
- package/dist/src/tui/hooks/event-store-reader.d.ts.map +1 -0
- package/dist/src/tui/hooks/event-store-reader.js +143 -0
- package/dist/src/tui/hooks/event-store-reader.js.map +1 -0
- package/dist/src/tui/hooks/useEventStorePoller.d.ts +12 -0
- package/dist/src/tui/hooks/useEventStorePoller.d.ts.map +1 -0
- package/dist/src/tui/hooks/useEventStorePoller.js +86 -0
- package/dist/src/tui/hooks/useEventStorePoller.js.map +1 -0
- package/dist/src/tui/screens/DashboardScreen.d.ts +4 -0
- package/dist/src/tui/screens/DashboardScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/DashboardScreen.js +132 -0
- package/dist/src/tui/screens/DashboardScreen.js.map +1 -0
- package/dist/src/tui/screens/DebugScreen.d.ts +4 -0
- package/dist/src/tui/screens/DebugScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/DebugScreen.js +40 -0
- package/dist/src/tui/screens/DebugScreen.js.map +1 -0
- package/dist/src/tui/screens/EvolutionScreen.d.ts +4 -0
- package/dist/src/tui/screens/EvolutionScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/EvolutionScreen.js +136 -0
- package/dist/src/tui/screens/EvolutionScreen.js.map +1 -0
- package/dist/src/tui/screens/HUDPanel.d.ts +4 -0
- package/dist/src/tui/screens/HUDPanel.d.ts.map +1 -0
- package/dist/src/tui/screens/HUDPanel.js +13 -0
- package/dist/src/tui/screens/HUDPanel.js.map +1 -0
- package/dist/src/tui/screens/InterviewScreen.d.ts +4 -0
- package/dist/src/tui/screens/InterviewScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/InterviewScreen.js +103 -0
- package/dist/src/tui/screens/InterviewScreen.js.map +1 -0
- package/dist/src/tui/screens/LogScreen.d.ts +4 -0
- package/dist/src/tui/screens/LogScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/LogScreen.js +83 -0
- package/dist/src/tui/screens/LogScreen.js.map +1 -0
- package/dist/src/tui/screens/SessionListScreen.d.ts +4 -0
- package/dist/src/tui/screens/SessionListScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/SessionListScreen.js +71 -0
- package/dist/src/tui/screens/SessionListScreen.js.map +1 -0
- package/dist/src/tui/screens/SpecViewerScreen.d.ts +4 -0
- package/dist/src/tui/screens/SpecViewerScreen.d.ts.map +1 -0
- package/dist/src/tui/screens/SpecViewerScreen.js +73 -0
- package/dist/src/tui/screens/SpecViewerScreen.js.map +1 -0
- package/dist/src/tui/widgets/DriftMeter.d.ts +15 -0
- package/dist/src/tui/widgets/DriftMeter.d.ts.map +1 -0
- package/dist/src/tui/widgets/DriftMeter.js +27 -0
- package/dist/src/tui/widgets/DriftMeter.js.map +1 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts +9 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.d.ts.map +1 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.js +35 -0
- package/dist/src/tui/widgets/GestaltPrincipleBar.js.map +1 -0
- package/dist/src/tui/widgets/TaskDAGTree.d.ts +15 -0
- package/dist/src/tui/widgets/TaskDAGTree.d.ts.map +1 -0
- package/dist/src/tui/widgets/TaskDAGTree.js +54 -0
- package/dist/src/tui/widgets/TaskDAGTree.js.map +1 -0
- package/package.json +11 -3
- package/schemas/gestalt.schema.json +98 -0
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
import type { DomainEvent } from '../../core/types.js';
|
|
3
|
+
import type { SessionSummary, EventStats } from '../hooks/event-store-reader.js';
|
|
4
|
+
export type ScreenName = 'sessions' | 'dashboard' | 'interview' | 'spec' | 'evolution' | 'log' | 'debug';
|
|
5
|
+
export interface ScreenProps {
|
|
6
|
+
events: DomainEvent[];
|
|
7
|
+
sessions: SessionSummary[];
|
|
8
|
+
stats: EventStats;
|
|
9
|
+
isConnected: boolean;
|
|
10
|
+
selectedSessionId: string | null;
|
|
11
|
+
onSelectSession: (id: string) => void;
|
|
12
|
+
}
|
|
13
|
+
interface TUIAppProps {
|
|
14
|
+
dbPath: string;
|
|
15
|
+
initialSessionId?: string;
|
|
16
|
+
pollInterval?: number;
|
|
17
|
+
}
|
|
18
|
+
export declare function TUIApp({ dbPath, initialSessionId, pollInterval }: TUIAppProps): React.ReactElement;
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=TUIApp.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TUIApp.d.ts","sourceRoot":"","sources":["../../../../src/tui/components/TUIApp.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvD,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,gCAAgC,CAAC;AAUjF,MAAM,MAAM,UAAU,GAClB,UAAU,GACV,WAAW,GACX,WAAW,GACX,MAAM,GACN,WAAW,GACX,KAAK,GACL,OAAO,CAAC;AAEZ,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,iBAAiB,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,eAAe,EAAE,CAAC,EAAE,EAAE,MAAM,KAAK,IAAI,CAAC;CACvC;AAgCD,UAAU,WAAW;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,wBAAgB,MAAM,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAE,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAoElG"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState, useMemo } from 'react';
|
|
3
|
+
import { Box, Text, useInput, useApp } from 'ink';
|
|
4
|
+
import { useEventStorePoller } from '../hooks/useEventStorePoller.js';
|
|
5
|
+
import { SessionListScreen } from '../screens/SessionListScreen.js';
|
|
6
|
+
import { DashboardScreen } from '../screens/DashboardScreen.js';
|
|
7
|
+
import { InterviewScreen } from '../screens/InterviewScreen.js';
|
|
8
|
+
import { SpecViewerScreen } from '../screens/SpecViewerScreen.js';
|
|
9
|
+
import { EvolutionScreen } from '../screens/EvolutionScreen.js';
|
|
10
|
+
import { LogScreen } from '../screens/LogScreen.js';
|
|
11
|
+
import { DebugScreen } from '../screens/DebugScreen.js';
|
|
12
|
+
import { HUDPanel } from '../screens/HUDPanel.js';
|
|
13
|
+
const SCREEN_KEYS = {
|
|
14
|
+
'1': 'sessions',
|
|
15
|
+
'2': 'dashboard',
|
|
16
|
+
'3': 'interview',
|
|
17
|
+
'4': 'spec',
|
|
18
|
+
'5': 'evolution',
|
|
19
|
+
l: 'log',
|
|
20
|
+
d: 'debug',
|
|
21
|
+
};
|
|
22
|
+
const SCREEN_LABELS = {
|
|
23
|
+
sessions: '1:Sessions',
|
|
24
|
+
dashboard: '2:Dashboard',
|
|
25
|
+
interview: '3:Interview',
|
|
26
|
+
spec: '4:Spec',
|
|
27
|
+
evolution: '5:Evolution',
|
|
28
|
+
log: 'L:Log',
|
|
29
|
+
debug: 'D:Debug',
|
|
30
|
+
};
|
|
31
|
+
const SCREEN_COMPONENTS = {
|
|
32
|
+
sessions: SessionListScreen,
|
|
33
|
+
dashboard: DashboardScreen,
|
|
34
|
+
interview: InterviewScreen,
|
|
35
|
+
spec: SpecViewerScreen,
|
|
36
|
+
evolution: EvolutionScreen,
|
|
37
|
+
log: LogScreen,
|
|
38
|
+
debug: DebugScreen,
|
|
39
|
+
};
|
|
40
|
+
export function TUIApp({ dbPath, initialSessionId, pollInterval }) {
|
|
41
|
+
const { exit } = useApp();
|
|
42
|
+
const [activeScreen, setActiveScreen] = useState(initialSessionId ? 'dashboard' : 'sessions');
|
|
43
|
+
const [selectedSessionId, setSelectedSessionId] = useState(initialSessionId ?? null);
|
|
44
|
+
const [hudVisible, setHudVisible] = useState(false);
|
|
45
|
+
const poller = useEventStorePoller(dbPath, pollInterval);
|
|
46
|
+
useInput((input, key) => {
|
|
47
|
+
if (input === 'q') {
|
|
48
|
+
exit();
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
if (input === 'h') {
|
|
52
|
+
setHudVisible((prev) => !prev);
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const screen = SCREEN_KEYS[input];
|
|
56
|
+
if (screen) {
|
|
57
|
+
setActiveScreen(screen);
|
|
58
|
+
}
|
|
59
|
+
if (key.escape) {
|
|
60
|
+
setActiveScreen('sessions');
|
|
61
|
+
}
|
|
62
|
+
});
|
|
63
|
+
const screenProps = useMemo(() => ({
|
|
64
|
+
events: poller.events,
|
|
65
|
+
sessions: poller.sessions,
|
|
66
|
+
stats: poller.stats,
|
|
67
|
+
isConnected: poller.isConnected,
|
|
68
|
+
selectedSessionId,
|
|
69
|
+
onSelectSession: (id) => {
|
|
70
|
+
setSelectedSessionId(id);
|
|
71
|
+
setActiveScreen('dashboard');
|
|
72
|
+
},
|
|
73
|
+
}), [poller.events, poller.sessions, poller.stats, poller.isConnected, selectedSessionId]);
|
|
74
|
+
const ScreenComponent = SCREEN_COMPONENTS[activeScreen];
|
|
75
|
+
return (_jsxs(Box, { flexDirection: "column", width: "100%", children: [_jsx(StatusBar, { activeScreen: activeScreen, isConnected: poller.isConnected, hudVisible: hudVisible, error: poller.error }), _jsx(Box, { flexDirection: "column", flexGrow: 1, paddingX: 1, children: _jsx(ScreenComponent, { ...screenProps }) }), hudVisible && _jsx(HUDPanel, { ...screenProps }), _jsx(NavBar, { activeScreen: activeScreen })] }));
|
|
76
|
+
}
|
|
77
|
+
function StatusBar({ activeScreen, isConnected, hudVisible, error, }) {
|
|
78
|
+
return (_jsxs(Box, { paddingX: 1, justifyContent: "space-between", children: [_jsx(Text, { bold: true, color: "cyan", children: "Gestalt Monitor" }), _jsxs(Box, { gap: 2, children: [_jsx(Text, { color: isConnected ? 'green' : 'red', children: isConnected ? 'Connected' : 'Disconnected' }), hudVisible && _jsx(Text, { color: "yellow", children: "[HUD]" }), error && _jsx(Text, { color: "red", children: error }), _jsx(Text, { dimColor: true, children: activeScreen })] })] }));
|
|
79
|
+
}
|
|
80
|
+
function NavBar({ activeScreen }) {
|
|
81
|
+
const screens = Object.entries(SCREEN_LABELS);
|
|
82
|
+
return (_jsxs(Box, { paddingX: 1, gap: 1, borderStyle: "single", borderColor: "gray", children: [screens.map(([name, label]) => (_jsx(Text, { color: name === activeScreen ? 'cyan' : 'gray', bold: name === activeScreen, children: label }, name))), _jsx(Text, { color: "gray", children: "H:HUD" }), _jsx(Text, { color: "gray", children: "Q:Quit" })] }));
|
|
83
|
+
}
|
|
84
|
+
//# sourceMappingURL=TUIApp.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TUIApp.js","sourceRoot":"","sources":["../../../../src/tui/components/TUIApp.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,QAAQ,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAElD,OAAO,EAAE,mBAAmB,EAAE,MAAM,iCAAiC,CAAC;AAEtE,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,gCAAgC,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACpD,OAAO,EAAE,WAAW,EAAE,MAAM,2BAA2B,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,MAAM,wBAAwB,CAAC;AAoBlD,MAAM,WAAW,GAA+B;IAC9C,GAAG,EAAE,UAAU;IACf,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,WAAW;IAChB,GAAG,EAAE,MAAM;IACX,GAAG,EAAE,WAAW;IAChB,CAAC,EAAE,KAAK;IACR,CAAC,EAAE,OAAO;CACX,CAAC;AAEF,MAAM,aAAa,GAA+B;IAChD,QAAQ,EAAE,YAAY;IACtB,SAAS,EAAE,aAAa;IACxB,SAAS,EAAE,aAAa;IACxB,IAAI,EAAE,QAAQ;IACd,SAAS,EAAE,aAAa;IACxB,GAAG,EAAE,OAAO;IACZ,KAAK,EAAE,SAAS;CACjB,CAAC;AAEF,MAAM,iBAAiB,GAAyD;IAC9E,QAAQ,EAAE,iBAAiB;IAC3B,SAAS,EAAE,eAAe;IAC1B,SAAS,EAAE,eAAe;IAC1B,IAAI,EAAE,gBAAgB;IACtB,SAAS,EAAE,eAAe;IAC1B,GAAG,EAAE,SAAS;IACd,KAAK,EAAE,WAAW;CACnB,CAAC;AAQF,MAAM,UAAU,MAAM,CAAC,EAAE,MAAM,EAAE,gBAAgB,EAAE,YAAY,EAAe;IAC5E,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,EAAE,CAAC;IAC1B,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAC9C,gBAAgB,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,UAAU,CAC5C,CAAC;IACF,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAAC,GAAG,QAAQ,CACxD,gBAAgB,IAAI,IAAI,CACzB,CAAC;IACF,MAAM,CAAC,UAAU,EAAE,aAAa,CAAC,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEpD,MAAM,MAAM,GAAG,mBAAmB,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IAEzD,QAAQ,CAAC,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACtB,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,IAAI,EAAE,CAAC;YACP,OAAO;QACT,CAAC;QAED,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAClB,aAAa,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/B,OAAO;QACT,CAAC;QAED,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QAClC,IAAI,MAAM,EAAE,CAAC;YACX,eAAe,CAAC,MAAM,CAAC,CAAC;QAC1B,CAAC;QAED,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,eAAe,CAAC,UAAU,CAAC,CAAC;QAC9B,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,WAAW,GAAgB,OAAO,CACtC,GAAG,EAAE,CAAC,CAAC;QACL,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,WAAW,EAAE,MAAM,CAAC,WAAW;QAC/B,iBAAiB;QACjB,eAAe,EAAE,CAAC,EAAU,EAAE,EAAE;YAC9B,oBAAoB,CAAC,EAAE,CAAC,CAAC;YACzB,eAAe,CAAC,WAAW,CAAC,CAAC;QAC/B,CAAC;KACF,CAAC,EACF,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,WAAW,EAAE,iBAAiB,CAAC,CACtF,CAAC;IAEF,MAAM,eAAe,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAC;IAExD,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,KAAK,EAAC,MAAM,aACtC,KAAC,SAAS,IACR,YAAY,EAAE,YAAY,EAC1B,WAAW,EAAE,MAAM,CAAC,WAAW,EAC/B,UAAU,EAAE,UAAU,EACtB,KAAK,EAAE,MAAM,CAAC,KAAK,GACnB,EAEF,KAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,YAClD,KAAC,eAAe,OAAK,WAAW,GAAI,GAChC,EAEL,UAAU,IAAI,KAAC,QAAQ,OAAK,WAAW,GAAI,EAE5C,KAAC,MAAM,IAAC,YAAY,EAAE,YAAY,GAAI,IAClC,CACP,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,EACjB,YAAY,EACZ,WAAW,EACX,UAAU,EACV,KAAK,GAMN;IACC,OAAO,CACL,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,cAAc,EAAC,eAAe,aAC9C,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,MAAM,gCAEhB,EACP,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,YACvC,WAAW,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,cAAc,GACtC,EACN,UAAU,IAAI,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,sBAAa,EAC/C,KAAK,IAAI,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,YAAE,KAAK,GAAQ,EAC1C,KAAC,IAAI,IAAC,QAAQ,kBAAE,YAAY,GAAQ,IAChC,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,MAAM,CAAC,EAAE,YAAY,EAAgC;IAC5D,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC,aAAa,CAA2B,CAAC;IACxE,OAAO,CACL,MAAC,GAAG,IAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,MAAM,aAC9D,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAC9B,KAAC,IAAI,IAAY,KAAK,EAAE,IAAI,KAAK,YAAY,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,KAAK,YAAY,YACzF,KAAK,IADG,IAAI,CAER,CACR,CAAC,EACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,sBAAa,EAC/B,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,uBAAc,IAC5B,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import type { DomainEvent } from '../../core/types.js';
|
|
2
|
+
export interface SessionSummary {
|
|
3
|
+
sessionId: string;
|
|
4
|
+
type: string;
|
|
5
|
+
status: string;
|
|
6
|
+
topic: string;
|
|
7
|
+
createdAt: string;
|
|
8
|
+
eventCount: number;
|
|
9
|
+
}
|
|
10
|
+
export interface EventStats {
|
|
11
|
+
totalEvents: number;
|
|
12
|
+
byType: Record<string, number>;
|
|
13
|
+
byAggregate: Record<string, number>;
|
|
14
|
+
oldestEvent: string | null;
|
|
15
|
+
newestEvent: string | null;
|
|
16
|
+
}
|
|
17
|
+
export declare class EventStoreReader {
|
|
18
|
+
private db;
|
|
19
|
+
constructor(dbPath: string);
|
|
20
|
+
getEventsSince(lastEventId: string | null, limit?: number): DomainEvent[];
|
|
21
|
+
getSessions(): SessionSummary[];
|
|
22
|
+
getSessionEvents(sessionId: string): DomainEvent[];
|
|
23
|
+
getStats(): EventStats;
|
|
24
|
+
getLatestEvents(limit?: number): DomainEvent[];
|
|
25
|
+
close(): void;
|
|
26
|
+
private inferStatus;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=event-store-reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-store-reader.d.ts","sourceRoot":"","sources":["../../../../src/tui/hooks/event-store-reader.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAwBvD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,WAAW,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC5B;AAED,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,EAAE,CAAoB;gBAElB,MAAM,EAAE,MAAM;IAK1B,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,EAAE,KAAK,SAAM,GAAG,WAAW,EAAE;IA6BtE,WAAW,IAAI,cAAc,EAAE;IA4D/B,gBAAgB,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,EAAE;IASlD,QAAQ,IAAI,UAAU;IA4CtB,eAAe,CAAC,KAAK,SAAK,GAAG,WAAW,EAAE;IAO1C,KAAK,IAAI,IAAI;IAIb,OAAO,CAAC,WAAW;CAMpB"}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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
|