@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.
- package/CLAUDE.md +56 -2
- package/README.md +301 -12
- 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 +5 -1
- 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/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/index.d.ts.map +1 -1
- package/dist/src/cli/index.js +7 -0
- package/dist/src/cli/index.js.map +1 -1
- package/dist/src/core/config.d.ts +3 -0
- package/dist/src/core/config.d.ts.map +1 -1
- package/dist/src/core/config.js +4 -0
- package/dist/src/core/config.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 +77 -1
- package/dist/src/core/types.d.ts.map +1 -1
- package/dist/src/events/types.d.ts +13 -1
- package/dist/src/events/types.d.ts.map +1 -1
- package/dist/src/events/types.js +15 -0
- package/dist/src/events/types.js.map +1 -1
- package/dist/src/execute/passthrough-engine.d.ts +31 -2
- package/dist/src/execute/passthrough-engine.d.ts.map +1 -1
- package/dist/src/execute/passthrough-engine.js +128 -8
- package/dist/src/execute/passthrough-engine.js.map +1 -1
- package/dist/src/execute/session.d.ts +4 -1
- package/dist/src/execute/session.d.ts.map +1 -1
- package/dist/src/execute/session.js +29 -0
- package/dist/src/execute/session.js.map +1 -1
- package/dist/src/mcp/schemas.d.ts +347 -9
- package/dist/src/mcp/schemas.d.ts.map +1 -1
- package/dist/src/mcp/schemas.js +81 -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 +214 -36
- 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 +50 -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 +74 -27
- package/dist/src/mcp/tools/status.js.map +1 -1
- 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 +5 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EvolutionScreen.js","sourceRoot":"","sources":["../../../../src/tui/screens/EvolutionScreen.tsx"],"names":[],"mappings":";AAAA,OAAc,EAAE,OAAO,EAAE,MAAM,OAAO,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AA4BhC,SAAS,oBAAoB,CAC3B,MAAqB,EACrB,SAAwB;IAExB,MAAM,aAAa,GAAG,SAAS;QAC7B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC;QACnD,CAAC,CAAC,EAAE,CAAC;IAEP,MAAM,WAAW,GAAuB,EAAE,CAAC;IAC3C,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,iBAAiB,GAAkB,IAAI,CAAC;IAC5C,IAAI,WAAW,GAAG,CAAC,CAAC;IACpB,IAAI,WAAW,GAAG,KAAK,CAAC;IACxB,IAAI,YAAY,GAAG,MAAM,CAAC;IAE1B,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAkC,CAAC;QAEtD,qDAAqD;QACrD,IAAI,EAAE,CAAC,SAAS,KAAK,+BAA+B,IAAI,EAAE,CAAC,SAAS,KAAK,8BAA8B,EAAE,CAAC;YACxG,MAAM,YAAY,GAAI,OAAO,CAAC,YAAuB,IAAI,CAAC,CAAC;YAC3D,MAAM,aAAa,GAAI,OAAO,CAAC,aAAwB,IAAI,CAAC,CAAC;YAC7D,WAAW,CAAC,IAAI,CAAC;gBACf,UAAU,EAAE,WAAW,CAAC,MAAM,GAAG,CAAC;gBAClC,YAAY;gBACZ,aAAa;gBACb,WAAW,EAAE,EAAE;gBACf,SAAS,EAAE,EAAE,CAAC,SAAS;aACxB,CAAC,CAAC;QACL,CAAC;QAED,eAAe;QACf,IAAI,EAAE,CAAC,SAAS,KAAK,qBAAqB,EAAE,CAAC;YAC3C,MAAM,aAAa,GAAI,OAAO,CAAC,aAA0B,IAAI,EAAE,CAAC;YAChE,MAAM,OAAO,GAAG,WAAW,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YACpD,IAAI,OAAO,EAAE,CAAC;gBACZ,OAAO,CAAC,WAAW,GAAG,aAAa,CAAC;YACtC,CAAC;YACD,YAAY,GAAG,OAAO,CAAC;QACzB,CAAC;QAED,mBAAmB;QACnB,IAAI,EAAE,CAAC,SAAS,KAAK,+BAA+B,EAAE,CAAC;YACrD,WAAW,EAAE,CAAC;YACd,YAAY,GAAG,KAAK,CAAC;QACvB,CAAC;QAED,IAAI,EAAE,CAAC,SAAS,KAAK,iCAAiC,EAAE,CAAC;YACvD,YAAY,GAAG,UAAU,CAAC;QAC5B,CAAC;QAED,mBAAmB;QACnB,IAAI,EAAE,CAAC,SAAS,KAAK,wBAAwB,EAAE,CAAC;YAC9C,MAAM,OAAO,GAAI,OAAO,CAAC,OAAkB,IAAI,EAAE,CAAC;YAClD,MAAM,OAAO,GAAI,OAAO,CAAC,OAAkB,IAAI,EAAE,CAAC;YAClD,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,CAAC,CAAC;YAChF,YAAY,GAAG,SAAS,CAAC;QAC3B,CAAC;QAED,IAAI,EAAE,CAAC,SAAS,KAAK,0BAA0B,EAAE,CAAC;YAChD,MAAM,OAAO,GAAI,OAAO,CAAC,OAAkB,IAAI,EAAE,CAAC;YAClD,MAAM,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,SAAS,CAAC,CAAC;YACvF,IAAI,QAAQ,EAAE,CAAC;gBACb,QAAQ,CAAC,MAAM,GAAG,WAAW,CAAC;YAChC,CAAC;YACD,YAAY,GAAG,cAAc,CAAC;QAChC,CAAC;QAED,cAAc;QACd,IAAI,EAAE,CAAC,SAAS,KAAK,mBAAmB,EAAE,CAAC;YACzC,iBAAiB,GAAI,OAAO,CAAC,MAAiB,IAAI,SAAS,CAAC;QAC9D,CAAC;QAED,mBAAmB;QACnB,IAAI,EAAE,CAAC,SAAS,KAAK,yBAAyB,EAAE,CAAC;YAC/C,WAAW,GAAG,IAAI,CAAC;YACnB,iBAAiB,GAAG,kBAAkB,CAAC;QACzC,CAAC;QAED,eAAe;QACf,IAAI,EAAE,CAAC,SAAS,KAAK,6BAA6B,EAAE,CAAC;YACnD,YAAY,GAAG,cAAc,CAAC;QAChC,CAAC;IACH,CAAC;IAED,OAAO;QACL,WAAW;QACX,QAAQ;QACR,iBAAiB;QACjB,WAAW;QACX,WAAW;QACX,YAAY;KACb,CAAC;AACJ,CAAC;AAED,MAAM,aAAa,GAA2B;IAC5C,cAAc,EAAE,GAAG;IACnB,UAAU,EAAE,GAAG;IACf,WAAW,EAAE,GAAG;IAChB,UAAU,EAAE,GAAG;CAChB,CAAC;AAEF,MAAM,cAAc,GAA2B;IAC7C,cAAc,EAAE,SAAS;IACzB,UAAU,EAAE,OAAO;IACnB,WAAW,EAAE,QAAQ;IACrB,UAAU,EAAE,MAAM;CACnB,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,EACN,iBAAiB,GACL;IACZ,MAAM,IAAI,GAAG,OAAO,CAClB,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACrD,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAC5B,CAAC;IAEF,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,cAAc,EAAC,QAAQ,EAAC,SAAS,EAAE,EAAE,aACnF,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,oCAA2B,EACpD,KAAC,IAAI,IAAC,QAAQ,gEAAiD,IAC3D,CACP,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChE,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,cAAc,EAAC,QAAQ,EAAC,SAAS,EAAE,EAAE,aACnF,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,kCAAyB,EAClD,KAAC,IAAI,IAAC,QAAQ,kEAAmD,IAC7D,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aAEzB,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,aAC1B,KAAC,IAAI,IAAC,IAAI,gCAAiB,EAC3B,KAAC,IAAI,IAAC,QAAQ,wBAAS,EACvB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,QAAQ,CAAC,iBAAiB,EAAE,EAAE,CAAC,GAAQ,EAC3D,KAAC,IAAI,IAAC,QAAQ,wBAAS,EACvB,MAAC,IAAI,IAAC,QAAQ,6BAAQ,IAAI,CAAC,WAAW,CAAC,MAAM,IAAQ,EACrD,MAAC,IAAI,IAAC,QAAQ,8BAAS,IAAI,CAAC,WAAW,IAAQ,EAC/C,MAAC,IAAI,IAAC,QAAQ,8BAAS,IAAI,CAAC,YAAY,IAAQ,EAC/C,IAAI,CAAC,iBAAiB,IAAI,CACzB,MAAC,IAAI,IAAC,KAAK,EAAE,IAAI,CAAC,iBAAiB,KAAK,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,kBAC/D,IAAI,CAAC,iBAAiB,SACnB,CACR,IACG,EAGL,IAAI,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAC9B,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,KAAC,IAAI,IAAC,IAAI,wCAAyB,EACnC,MAAC,GAAG,IAAC,WAAW,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACzC,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,GAAG,IAAC,KAAK,EAAE,EAAE,YACZ,KAAC,IAAI,IAAC,QAAQ,+BAAgB,GAC1B,EACN,KAAC,IAAI,cACF,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,GACxD,IACH,EACN,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,GAAG,IAAC,KAAK,EAAE,EAAE,YACZ,KAAC,IAAI,IAAC,QAAQ,iCAAkB,GAC5B,EACN,KAAC,IAAI,cACF,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,GACzD,IACH,IACF,IACF,CACP,EAGD,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,IAAI,IAAC,IAAI,kCAAmB,EAC7B,MAAC,IAAI,IAAC,QAAQ,wBAAG,IAAI,CAAC,WAAW,CAAC,MAAM,SAAS,IAC7C,EACL,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;wBAC5B,MAAM,UAAU,GAAG,GAAG,CAAC,YAAY,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,YAAY,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;wBACnG,MAAM,SAAS,GAAG,GAAG,CAAC,aAAa,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;wBACpG,OAAO,CACL,MAAC,GAAG,IAAsB,WAAW,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,aAC9C,MAAC,IAAI,IAAC,IAAI,wBAAG,GAAG,CAAC,UAAU,IAAQ,EACnC,MAAC,IAAI,IAAC,KAAK,EAAE,UAAU,uBACd,CAAC,GAAG,CAAC,YAAY,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SACrC,EACP,MAAC,IAAI,IAAC,KAAK,EAAE,SAAS,sBACd,CAAC,GAAG,CAAC,aAAa,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SACrC,EACN,cAAc,CAAC,GAAG,CAAC,YAAY,EAAE,EAAE,CAAC,EACpC,GAAG,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,IAAI,CAC7B,MAAC,IAAI,IAAC,QAAQ,8BAAS,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,GAAG,CAAC,SAAS,CAC1D,KAXO,GAAG,CAAC,UAAU,CAYlB,CACP,CAAC;oBACJ,CAAC,CAAC,IACE,EAGL,IAAI,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,IAAI,CAC3B,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACzC,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,IAAI,IAAC,IAAI,uCAAwB,EAClC,MAAC,IAAI,IAAC,QAAQ,wBAAG,IAAI,CAAC,QAAQ,CAAC,MAAM,kBAAkB,IACnD,EACL,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE;wBAC5B,MAAM,IAAI,GAAG,aAAa,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,GAAG,CAAC;wBAC/C,MAAM,KAAK,GAAG,cAAc,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,MAAM,CAAC;wBACpD,OAAO,CACL,MAAC,GAAG,IAAS,WAAW,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,aACjC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YAAG,IAAI,GAAQ,EACjC,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,EAAE,IAAI,kBACrB,GAAG,CAAC,OAAO,GACP,EACP,MAAC,IAAI,IAAC,QAAQ,wBAAG,GAAG,CAAC,OAAO,SAAS,EACrC,KAAC,IAAI,IAAC,KAAK,EAAE,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,YACvD,GAAG,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,GAC1C,KARC,CAAC,CASL,CACP,CAAC;oBACJ,CAAC,CAAC,IACE,CACP,EAGA,IAAI,CAAC,WAAW,IAAI,CACnB,KAAC,GAAG,IAAC,SAAS,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,KAAK,YACpE,KAAC,IAAI,IAAC,KAAK,EAAC,KAAK,EAAC,IAAI,4GAEf,GACH,CACP,IACG,CACP,CAAC;AACJ,CAAC;AAED,SAAS,eAAe,CAAC,MAAgB;IACvC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,CAAC,GAAG,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAC;IACrG,OAAO,MAAM;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QACT,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC5C,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;QACtD,OAAO,MAAM,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC;IAC5B,CAAC,CAAC;SACD,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,SAAS,cAAc,CAAC,KAAa,EAAE,KAAa;IAClD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC7B,MAAM,KAAK,GAAG,KAAK,IAAI,IAAI,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IACxE,OAAO,CACL,KAAC,IAAI,IAAC,KAAK,EAAE,KAAK,YACf,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,GAC9C,CACR,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,GAAW;IACxC,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAClC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HUDPanel.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/HUDPanel.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAE1B,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAE3D,wBAAgB,QAAQ,CAAC,EACvB,MAAM,EACN,QAAQ,EACR,KAAK,EACL,WAAW,GACZ,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CA6BlC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
export function HUDPanel({ events, sessions, stats, isConnected, }) {
|
|
4
|
+
const activeSessions = sessions.filter((s) => s.status === 'in_progress').length;
|
|
5
|
+
const latestEventType = events.length > 0 ? events[events.length - 1]?.eventType ?? '-' : '-';
|
|
6
|
+
return (_jsxs(Box, { borderStyle: "single", borderColor: "yellow", paddingX: 1, gap: 2, children: [_jsx(Box, { gap: 1, children: _jsx(Text, { color: "yellow", bold: true, children: "HUD" }) }), _jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "events:" }), _jsx(Text, { color: "white", children: stats.totalEvents })] }), _jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "sessions:" }), _jsx(Text, { color: "white", children: sessions.length }), _jsxs(Text, { dimColor: true, children: ["(", activeSessions, " active)"] })] }), _jsxs(Box, { gap: 1, children: [_jsx(Text, { dimColor: true, children: "latest:" }), _jsx(Text, { color: "cyan", children: truncate(latestEventType, 30) })] }), _jsx(Box, { gap: 1, children: _jsx(Text, { color: isConnected ? 'green' : 'red', children: isConnected ? 'OK' : 'ERR' }) })] }));
|
|
7
|
+
}
|
|
8
|
+
function truncate(str, max) {
|
|
9
|
+
if (str.length <= max)
|
|
10
|
+
return str;
|
|
11
|
+
return str.slice(0, max - 3) + '...';
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=HUDPanel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"HUDPanel.js","sourceRoot":"","sources":["../../../../src/tui/screens/HUDPanel.tsx"],"names":[],"mappings":";AACA,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAGhC,MAAM,UAAU,QAAQ,CAAC,EACvB,MAAM,EACN,QAAQ,EACR,KAAK,EACL,WAAW,GACC;IACZ,MAAM,cAAc,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,aAAa,CAAC,CAAC,MAAM,CAAC;IACjF,MAAM,eAAe,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,SAAS,IAAI,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;IAE9F,OAAO,CACL,MAAC,GAAG,IAAC,WAAW,EAAC,QAAQ,EAAC,WAAW,EAAC,QAAQ,EAAC,QAAQ,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,aAChE,KAAC,GAAG,IAAC,GAAG,EAAE,CAAC,YACT,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,EAAC,IAAI,0BAAW,GAChC,EACN,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,IAAI,IAAC,QAAQ,8BAAe,EAC7B,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,KAAK,CAAC,WAAW,GAAQ,IAC1C,EACN,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,IAAI,IAAC,QAAQ,gCAAiB,EAC/B,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,YAAE,QAAQ,CAAC,MAAM,GAAQ,EAC5C,MAAC,IAAI,IAAC,QAAQ,wBAAG,cAAc,gBAAgB,IAC3C,EACN,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,KAAC,IAAI,IAAC,QAAQ,8BAAe,EAC7B,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,QAAQ,CAAC,eAAe,EAAE,EAAE,CAAC,GAAQ,IACrD,EACN,KAAC,GAAG,IAAC,GAAG,EAAE,CAAC,YACT,KAAC,IAAI,IAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,KAAK,YACvC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GACtB,GACH,IACF,CACP,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,GAAW;IACxC,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAClC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InterviewScreen.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/InterviewScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAqG3D,wBAAgB,eAAe,CAAC,EAC9B,MAAM,EACN,iBAAiB,GAClB,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CA4GlC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React, { useMemo, useState } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
function parseInterviewEvents(events, sessionId) {
|
|
5
|
+
const sessionEvents = sessionId
|
|
6
|
+
? events.filter((e) => e.aggregateId === sessionId)
|
|
7
|
+
: [];
|
|
8
|
+
let topic = '';
|
|
9
|
+
let overallAmbiguity = null;
|
|
10
|
+
let status = 'unknown';
|
|
11
|
+
const rounds = [];
|
|
12
|
+
const questionMap = new Map();
|
|
13
|
+
for (const ev of sessionEvents) {
|
|
14
|
+
const payload = ev.payload;
|
|
15
|
+
if (ev.eventType === 'interview.session.started') {
|
|
16
|
+
topic = payload.topic ?? '';
|
|
17
|
+
status = 'in_progress';
|
|
18
|
+
}
|
|
19
|
+
if (ev.eventType === 'interview.question.asked') {
|
|
20
|
+
const roundNumber = payload.roundNumber ?? rounds.length + 1;
|
|
21
|
+
const question = payload.question ?? '';
|
|
22
|
+
const principle = payload.gestaltFocus ?? payload.principle ?? '';
|
|
23
|
+
const existing = questionMap.get(roundNumber) ?? { roundNumber };
|
|
24
|
+
existing.question = question;
|
|
25
|
+
existing.gestaltPrinciple = principle;
|
|
26
|
+
questionMap.set(roundNumber, existing);
|
|
27
|
+
}
|
|
28
|
+
if (ev.eventType === 'interview.response.recorded') {
|
|
29
|
+
const roundNumber = payload.roundNumber ?? rounds.length + 1;
|
|
30
|
+
const response = payload.response ?? payload.userResponse ?? '';
|
|
31
|
+
const existing = questionMap.get(roundNumber) ?? { roundNumber };
|
|
32
|
+
existing.response = response;
|
|
33
|
+
questionMap.set(roundNumber, existing);
|
|
34
|
+
}
|
|
35
|
+
if (ev.eventType === 'interview.ambiguity.scored') {
|
|
36
|
+
const overall = payload.overall;
|
|
37
|
+
const roundNumber = payload.roundNumber;
|
|
38
|
+
if (overall !== undefined) {
|
|
39
|
+
overallAmbiguity = overall;
|
|
40
|
+
}
|
|
41
|
+
if (roundNumber !== undefined) {
|
|
42
|
+
const existing = questionMap.get(roundNumber);
|
|
43
|
+
if (existing) {
|
|
44
|
+
existing.ambiguityScore = overall ?? null;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
if (ev.eventType === 'interview.session.completed') {
|
|
49
|
+
status = 'completed';
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
// Assemble rounds from map
|
|
53
|
+
for (const [roundNum, data] of questionMap.entries()) {
|
|
54
|
+
rounds.push({
|
|
55
|
+
roundNumber: roundNum,
|
|
56
|
+
question: data.question ?? '',
|
|
57
|
+
response: data.response ?? '',
|
|
58
|
+
ambiguityScore: data.ambiguityScore ?? null,
|
|
59
|
+
gestaltPrinciple: data.gestaltPrinciple ?? '',
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
rounds.sort((a, b) => a.roundNumber - b.roundNumber);
|
|
63
|
+
return { topic, rounds, overallAmbiguity, status };
|
|
64
|
+
}
|
|
65
|
+
const PRINCIPLE_COLORS = {
|
|
66
|
+
closure: 'magenta',
|
|
67
|
+
proximity: 'blue',
|
|
68
|
+
similarity: 'yellow',
|
|
69
|
+
figure_ground: 'green',
|
|
70
|
+
continuity: 'cyan',
|
|
71
|
+
};
|
|
72
|
+
export function InterviewScreen({ events, selectedSessionId, }) {
|
|
73
|
+
const data = useMemo(() => parseInterviewEvents(events, selectedSessionId), [events, selectedSessionId]);
|
|
74
|
+
const [scrollOffset, setScrollOffset] = useState(0);
|
|
75
|
+
const visibleRounds = 5;
|
|
76
|
+
useInput((_input, key) => {
|
|
77
|
+
if (key.upArrow) {
|
|
78
|
+
setScrollOffset((prev) => Math.max(0, prev - 1));
|
|
79
|
+
}
|
|
80
|
+
if (key.downArrow) {
|
|
81
|
+
setScrollOffset((prev) => Math.min(Math.max(0, data.rounds.length - visibleRounds), prev + 1));
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
if (!selectedSessionId) {
|
|
85
|
+
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." })] }));
|
|
86
|
+
}
|
|
87
|
+
if (data.rounds.length === 0) {
|
|
88
|
+
return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", minHeight: 10, children: [_jsx(Text, { bold: true, color: "yellow", children: "No interview data" }), _jsx(Text, { dimColor: true, children: "This session may not be an interview, or no Q&A rounds have been recorded." })] }));
|
|
89
|
+
}
|
|
90
|
+
const displayedRounds = data.rounds.slice(scrollOffset, scrollOffset + visibleRounds);
|
|
91
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, gap: 1, children: [_jsx(Text, { bold: true, children: "Interview" }), _jsx(Text, { dimColor: true, children: "|" }), _jsx(Text, { color: "cyan", children: truncate(data.topic || selectedSessionId, 40) }), _jsx(Text, { dimColor: true, children: "|" }), _jsx(Text, { color: data.status === 'completed' ? 'green' : 'cyan', children: data.status }), data.overallAmbiguity !== null && (_jsxs(React.Fragment, { children: [_jsx(Text, { dimColor: true, children: "| ambiguity:" }), _jsxs(Text, { color: data.overallAmbiguity <= 0.2 ? 'green' : data.overallAmbiguity <= 0.5 ? 'yellow' : 'red', children: [(data.overallAmbiguity * 100).toFixed(0), "%"] })] }))] }), _jsx(Box, { marginBottom: 1, children: _jsxs(Text, { dimColor: true, children: ["Rounds ", scrollOffset + 1, "-", Math.min(scrollOffset + visibleRounds, data.rounds.length), " of", ' ', data.rounds.length, " | Up/Down to scroll"] }) }), displayedRounds.map((round) => (_jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsxs(Text, { bold: true, color: "white", children: ["R", round.roundNumber] }), round.gestaltPrinciple && (_jsxs(Text, { color: PRINCIPLE_COLORS[round.gestaltPrinciple] ?? 'gray', children: ["[", round.gestaltPrinciple, "]"] })), round.ambiguityScore !== null && (_jsxs(Text, { dimColor: true, children: ["amb: ", renderMiniBar(round.ambiguityScore, 10), ' ', (round.ambiguityScore * 100).toFixed(0), "%"] }))] }), _jsxs(Box, { paddingLeft: 2, flexDirection: "column", children: [_jsxs(Box, { children: [_jsx(Text, { color: "yellow", children: "Q: " }), _jsx(Text, { children: truncate(round.question, 80) })] }), round.response ? (_jsxs(Box, { children: [_jsx(Text, { color: "green", children: "A: " }), _jsx(Text, { children: truncate(round.response, 80) })] })) : (_jsxs(Box, { children: [_jsx(Text, { color: "gray", children: "A: " }), _jsx(Text, { dimColor: true, children: "(awaiting response)" })] }))] })] }, round.roundNumber)))] }));
|
|
92
|
+
}
|
|
93
|
+
function renderMiniBar(score, width) {
|
|
94
|
+
const filled = Math.round(score * width);
|
|
95
|
+
const empty = width - filled;
|
|
96
|
+
return '[' + '#'.repeat(filled) + ' '.repeat(empty) + ']';
|
|
97
|
+
}
|
|
98
|
+
function truncate(str, max) {
|
|
99
|
+
if (str.length <= max)
|
|
100
|
+
return str;
|
|
101
|
+
return str.slice(0, max - 3) + '...';
|
|
102
|
+
}
|
|
103
|
+
//# sourceMappingURL=InterviewScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"InterviewScreen.js","sourceRoot":"","sources":["../../../../src/tui/screens/InterviewScreen.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,EAAE,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjD,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,KAAK,CAAC;AAmB1C,SAAS,oBAAoB,CAC3B,MAAqB,EACrB,SAAwB;IAExB,MAAM,aAAa,GAAG,SAAS;QAC7B,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,KAAK,SAAS,CAAC;QACnD,CAAC,CAAC,EAAE,CAAC;IAEP,IAAI,KAAK,GAAG,EAAE,CAAC;IACf,IAAI,gBAAgB,GAAkB,IAAI,CAAC;IAC3C,IAAI,MAAM,GAAG,SAAS,CAAC;IACvB,MAAM,MAAM,GAAqB,EAAE,CAAC;IACpC,MAAM,WAAW,GAAG,IAAI,GAAG,EAAmC,CAAC;IAE/D,KAAK,MAAM,EAAE,IAAI,aAAa,EAAE,CAAC;QAC/B,MAAM,OAAO,GAAG,EAAE,CAAC,OAAkC,CAAC;QAEtD,IAAI,EAAE,CAAC,SAAS,KAAK,2BAA2B,EAAE,CAAC;YACjD,KAAK,GAAI,OAAO,CAAC,KAAgB,IAAI,EAAE,CAAC;YACxC,MAAM,GAAG,aAAa,CAAC;QACzB,CAAC;QAED,IAAI,EAAE,CAAC,SAAS,KAAK,0BAA0B,EAAE,CAAC;YAChD,MAAM,WAAW,GAAI,OAAO,CAAC,WAAsB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAI,OAAO,CAAC,QAAmB,IAAI,EAAE,CAAC;YACpD,MAAM,SAAS,GAAI,OAAO,CAAC,YAAuB,IAAK,OAAO,CAAC,SAAoB,IAAI,EAAE,CAAC;YAC1F,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;YACjE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC7B,QAAQ,CAAC,gBAAgB,GAAG,SAAS,CAAC;YACtC,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,EAAE,CAAC,SAAS,KAAK,6BAA6B,EAAE,CAAC;YACnD,MAAM,WAAW,GAAI,OAAO,CAAC,WAAsB,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;YACzE,MAAM,QAAQ,GAAI,OAAO,CAAC,QAAmB,IAAK,OAAO,CAAC,YAAuB,IAAI,EAAE,CAAC;YACxF,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,WAAW,EAAE,CAAC;YACjE,QAAQ,CAAC,QAAQ,GAAG,QAAQ,CAAC;YAC7B,WAAW,CAAC,GAAG,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,EAAE,CAAC,SAAS,KAAK,4BAA4B,EAAE,CAAC;YAClD,MAAM,OAAO,GAAG,OAAO,CAAC,OAA6B,CAAC;YACtD,MAAM,WAAW,GAAG,OAAO,CAAC,WAAiC,CAAC;YAC9D,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC1B,gBAAgB,GAAG,OAAO,CAAC;YAC7B,CAAC;YACD,IAAI,WAAW,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,QAAQ,GAAG,WAAW,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;gBAC9C,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,cAAc,GAAG,OAAO,IAAI,IAAI,CAAC;gBAC5C,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,EAAE,CAAC,SAAS,KAAK,6BAA6B,EAAE,CAAC;YACnD,MAAM,GAAG,WAAW,CAAC;QACvB,CAAC;IACH,CAAC;IAED,2BAA2B;IAC3B,KAAK,MAAM,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QACrD,MAAM,CAAC,IAAI,CAAC;YACV,WAAW,EAAE,QAAQ;YACrB,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;YAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,EAAE;YAC7B,cAAc,EAAE,IAAI,CAAC,cAAc,IAAI,IAAI;YAC3C,gBAAgB,EAAE,IAAI,CAAC,gBAAgB,IAAI,EAAE;SAC9C,CAAC,CAAC;IACL,CAAC;IAED,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,GAAG,CAAC,CAAC,WAAW,CAAC,CAAC;IAErD,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,gBAAgB,EAAE,MAAM,EAAE,CAAC;AACrD,CAAC;AAED,MAAM,gBAAgB,GAA2B;IAC/C,OAAO,EAAE,SAAS;IAClB,SAAS,EAAE,MAAM;IACjB,UAAU,EAAE,QAAQ;IACpB,aAAa,EAAE,OAAO;IACtB,UAAU,EAAE,MAAM;CACnB,CAAC;AAEF,MAAM,UAAU,eAAe,CAAC,EAC9B,MAAM,EACN,iBAAiB,GACL;IACZ,MAAM,IAAI,GAAG,OAAO,CAClB,GAAG,EAAE,CAAC,oBAAoB,CAAC,MAAM,EAAE,iBAAiB,CAAC,EACrD,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAC5B,CAAC;IAEF,MAAM,CAAC,YAAY,EAAE,eAAe,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;IACpD,MAAM,aAAa,GAAG,CAAC,CAAC;IAExB,QAAQ,CAAC,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACvB,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAChB,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,GAAG,CAAC,SAAS,EAAE,CAAC;YAClB,eAAe,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,aAAa,CAAC,EAAE,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC;QACjG,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC,iBAAiB,EAAE,CAAC;QACvB,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,cAAc,EAAC,QAAQ,EAAC,SAAS,EAAE,EAAE,aACnF,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,oCAA2B,EACpD,KAAC,IAAI,IAAC,QAAQ,gEAAiD,IAC3D,CACP,CAAC;IACJ,CAAC;IAED,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,EAAC,UAAU,EAAC,QAAQ,EAAC,cAAc,EAAC,QAAQ,EAAC,SAAS,EAAE,EAAE,aACnF,KAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,QAAQ,kCAAyB,EAClD,KAAC,IAAI,IAAC,QAAQ,iGAAkF,IAC5F,CACP,CAAC;IACJ,CAAC;IAED,MAAM,eAAe,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,YAAY,EAAE,YAAY,GAAG,aAAa,CAAC,CAAC;IAEtF,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aAEzB,MAAC,GAAG,IAAC,YAAY,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,aAC1B,KAAC,IAAI,IAAC,IAAI,gCAAiB,EAC3B,KAAC,IAAI,IAAC,QAAQ,wBAAS,EACvB,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,YAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,iBAAiB,EAAE,EAAE,CAAC,GAAQ,EACzE,KAAC,IAAI,IAAC,QAAQ,wBAAS,EACvB,KAAC,IAAI,IAAC,KAAK,EAAE,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,YACxD,IAAI,CAAC,MAAM,GACP,EACN,IAAI,CAAC,gBAAgB,KAAK,IAAI,IAAI,CACjC,MAAC,KAAK,CAAC,QAAQ,eACb,KAAC,IAAI,IAAC,QAAQ,mCAAoB,EAClC,MAAC,IAAI,IAAC,KAAK,EAAE,IAAI,CAAC,gBAAgB,IAAI,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,gBAAgB,IAAI,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,aAClG,CAAC,IAAI,CAAC,gBAAgB,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SACpC,IACQ,CAClB,IACG,EAGN,KAAC,GAAG,IAAC,YAAY,EAAE,CAAC,YAClB,MAAC,IAAI,IAAC,QAAQ,8BACJ,YAAY,GAAG,CAAC,OAAG,IAAI,CAAC,GAAG,CAAC,YAAY,GAAG,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,SAAK,GAAG,EAC5F,IAAI,CAAC,MAAM,CAAC,MAAM,4BACd,GACH,EAGL,eAAe,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAC9B,MAAC,GAAG,IAAyB,aAAa,EAAC,QAAQ,EAAC,YAAY,EAAE,CAAC,aACjE,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,aACT,MAAC,IAAI,IAAC,IAAI,QAAC,KAAK,EAAC,OAAO,kBACpB,KAAK,CAAC,WAAW,IACd,EACN,KAAK,CAAC,gBAAgB,IAAI,CACzB,MAAC,IAAI,IAAC,KAAK,EAAE,gBAAgB,CAAC,KAAK,CAAC,gBAAgB,CAAC,IAAI,MAAM,kBAC3D,KAAK,CAAC,gBAAgB,SACnB,CACR,EACA,KAAK,CAAC,cAAc,KAAK,IAAI,IAAI,CAChC,MAAC,IAAI,IAAC,QAAQ,4BACN,aAAa,CAAC,KAAK,CAAC,cAAc,EAAE,EAAE,CAAC,EAC5C,GAAG,EAAE,CAAC,KAAK,CAAC,cAAc,GAAG,GAAG,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SACxC,CACR,IACG,EAEN,MAAC,GAAG,IAAC,WAAW,EAAE,CAAC,EAAE,aAAa,EAAC,QAAQ,aACzC,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,QAAQ,oBAAW,EAC/B,KAAC,IAAI,cAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAQ,IACvC,EACL,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAChB,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,OAAO,oBAAW,EAC9B,KAAC,IAAI,cAAE,QAAQ,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC,GAAQ,IACvC,CACP,CAAC,CAAC,CAAC,CACF,MAAC,GAAG,eACF,KAAC,IAAI,IAAC,KAAK,EAAC,MAAM,oBAAW,EAC7B,KAAC,IAAI,IAAC,QAAQ,0CAA2B,IACrC,CACP,IACG,KAlCE,KAAK,CAAC,WAAW,CAmCrB,CACP,CAAC,IACE,CACP,CAAC;AACJ,CAAC;AAED,SAAS,aAAa,CAAC,KAAa,EAAE,KAAa;IACjD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,KAAK,GAAG,MAAM,CAAC;IAC7B,OAAO,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,GAAG,CAAC;AAC5D,CAAC;AAED,SAAS,QAAQ,CAAC,GAAW,EAAE,GAAW;IACxC,IAAI,GAAG,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,GAAG,CAAC;IAClC,OAAO,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,KAAK,CAAC;AACvC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogScreen.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/LogScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAA4B,MAAM,OAAO,CAAC;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAgC3D,wBAAgB,SAAS,CAAC,EACxB,MAAM,GACP,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAkElC"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useMemo, useState } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
const EVENT_TYPE_COLORS = {
|
|
5
|
+
interview: 'cyan',
|
|
6
|
+
spec: 'magenta',
|
|
7
|
+
execute: 'green',
|
|
8
|
+
evaluate: 'yellow',
|
|
9
|
+
evolve: 'red',
|
|
10
|
+
gestalt: 'blue',
|
|
11
|
+
brownfield: 'gray',
|
|
12
|
+
};
|
|
13
|
+
function getEventColor(eventType) {
|
|
14
|
+
const prefix = eventType.split('.')[0] ?? '';
|
|
15
|
+
return EVENT_TYPE_COLORS[prefix] ?? 'white';
|
|
16
|
+
}
|
|
17
|
+
const FILTERS = [
|
|
18
|
+
{ label: 'ALL', prefix: '' },
|
|
19
|
+
{ label: 'INT', prefix: 'interview' },
|
|
20
|
+
{ label: 'SPC', prefix: 'spec' },
|
|
21
|
+
{ label: 'EXE', prefix: 'execute' },
|
|
22
|
+
{ label: 'EVL', prefix: 'evaluate' },
|
|
23
|
+
{ label: 'EVO', prefix: 'evolve' },
|
|
24
|
+
];
|
|
25
|
+
export function LogScreen({ events, }) {
|
|
26
|
+
const [maxLines, _setMaxLines] = useState(50);
|
|
27
|
+
const [filterIndex, setFilterIndex] = useState(0);
|
|
28
|
+
useInput((input, _key) => {
|
|
29
|
+
if (input === '\t' || input === 'f') {
|
|
30
|
+
setFilterIndex((prev) => (prev + 1) % FILTERS.length);
|
|
31
|
+
}
|
|
32
|
+
});
|
|
33
|
+
const currentFilter = FILTERS[filterIndex] ?? FILTERS[0];
|
|
34
|
+
const filteredEvents = useMemo(() => {
|
|
35
|
+
let result;
|
|
36
|
+
if (currentFilter.prefix) {
|
|
37
|
+
result = events.filter((e) => e.eventType.startsWith(currentFilter.prefix));
|
|
38
|
+
}
|
|
39
|
+
else {
|
|
40
|
+
result = events;
|
|
41
|
+
}
|
|
42
|
+
// Show newest at bottom, take last N
|
|
43
|
+
return result.slice(-maxLines);
|
|
44
|
+
}, [events, maxLines, currentFilter.prefix]);
|
|
45
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, gap: 1, children: [_jsx(Text, { bold: true, children: "Event Log" }), _jsx(Text, { dimColor: true, children: "|" }), _jsxs(Text, { dimColor: true, children: [filteredEvents.length, " events"] }), _jsx(Text, { dimColor: true, children: "| F/Tab: filter" }), _jsx(Text, { dimColor: true, children: "|" }), FILTERS.map((f, i) => (_jsx(Text, { color: i === filterIndex ? 'cyan' : 'gray', bold: i === filterIndex, children: f.label }, f.label)))] }), filteredEvents.length === 0 ? (_jsx(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", minHeight: 5, children: _jsxs(Text, { dimColor: true, children: ["No events matching filter \"", currentFilter.label, "\""] }) })) : (filteredEvents.map((ev) => (_jsxs(Box, { gap: 1, children: [_jsx(Box, { width: 12, children: _jsx(Text, { dimColor: true, children: formatTime(ev.timestamp) }) }), _jsx(Box, { width: 35, children: _jsx(Text, { color: getEventColor(ev.eventType), children: truncate(ev.eventType, 33) }) }), _jsx(Box, { width: 20, children: _jsx(Text, { dimColor: true, children: truncate(ev.aggregateId, 18) }) }), _jsx(Box, { children: _jsx(Text, { dimColor: true, children: extractSummary(ev) }) })] }, ev.id))))] }));
|
|
46
|
+
}
|
|
47
|
+
function formatTime(ts) {
|
|
48
|
+
try {
|
|
49
|
+
const d = new Date(ts);
|
|
50
|
+
return d.toLocaleTimeString('en-US', {
|
|
51
|
+
hour: '2-digit',
|
|
52
|
+
minute: '2-digit',
|
|
53
|
+
second: '2-digit',
|
|
54
|
+
hour12: false,
|
|
55
|
+
});
|
|
56
|
+
}
|
|
57
|
+
catch {
|
|
58
|
+
return ts.slice(11, 19);
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
function extractSummary(ev) {
|
|
62
|
+
const payload = ev.payload;
|
|
63
|
+
// Try to extract a short summary from common payload fields
|
|
64
|
+
if (payload.topic)
|
|
65
|
+
return truncate(String(payload.topic), 30);
|
|
66
|
+
if (payload.taskId)
|
|
67
|
+
return `task:${String(payload.taskId)}`;
|
|
68
|
+
if (payload.principle)
|
|
69
|
+
return `${String(payload.principle)}`;
|
|
70
|
+
if (payload.reason)
|
|
71
|
+
return `reason:${String(payload.reason)}`;
|
|
72
|
+
if (payload.overall !== undefined)
|
|
73
|
+
return `score:${String(payload.overall)}`;
|
|
74
|
+
if (payload.status)
|
|
75
|
+
return `${String(payload.status)}`;
|
|
76
|
+
return '';
|
|
77
|
+
}
|
|
78
|
+
function truncate(str, max) {
|
|
79
|
+
if (str.length <= max)
|
|
80
|
+
return str;
|
|
81
|
+
return str.slice(0, max - 3) + '...';
|
|
82
|
+
}
|
|
83
|
+
//# sourceMappingURL=LogScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"LogScreen.js","sourceRoot":"","sources":["../../../../src/tui/screens/LogScreen.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionListScreen.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/SessionListScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAmB,MAAM,OAAO,CAAC;AAExC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAsB3D,wBAAgB,iBAAiB,CAAC,EAChC,QAAQ,EACR,iBAAiB,EACjB,eAAe,GAChB,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAmGlC"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { useState } from 'react';
|
|
3
|
+
import { Box, Text, useInput } from 'ink';
|
|
4
|
+
const STATUS_ICONS = {
|
|
5
|
+
completed: 'v',
|
|
6
|
+
in_progress: '>',
|
|
7
|
+
failed: 'x',
|
|
8
|
+
escalated: '!',
|
|
9
|
+
};
|
|
10
|
+
const STATUS_COLORS = {
|
|
11
|
+
completed: 'green',
|
|
12
|
+
in_progress: 'cyan',
|
|
13
|
+
failed: 'red',
|
|
14
|
+
escalated: 'yellow',
|
|
15
|
+
};
|
|
16
|
+
const TYPE_LABELS = {
|
|
17
|
+
interview: 'INT',
|
|
18
|
+
execute: 'EXE',
|
|
19
|
+
spec: 'SPC',
|
|
20
|
+
};
|
|
21
|
+
export function SessionListScreen({ sessions, selectedSessionId, onSelectSession, }) {
|
|
22
|
+
const [selectedIndex, setSelectedIndex] = useState(0);
|
|
23
|
+
useInput((_input, key) => {
|
|
24
|
+
if (key.upArrow) {
|
|
25
|
+
setSelectedIndex((prev) => Math.max(0, prev - 1));
|
|
26
|
+
}
|
|
27
|
+
if (key.downArrow) {
|
|
28
|
+
setSelectedIndex((prev) => Math.min(sessions.length - 1, prev + 1));
|
|
29
|
+
}
|
|
30
|
+
if (key.return) {
|
|
31
|
+
const session = sessions[selectedIndex];
|
|
32
|
+
if (session) {
|
|
33
|
+
onSelectSession(session.sessionId);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
});
|
|
37
|
+
if (sessions.length === 0) {
|
|
38
|
+
return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", minHeight: 10, children: [_jsx(Text, { bold: true, color: "yellow", children: "No sessions found" }), _jsx(Text, { dimColor: true, children: "Start an interview or execute session to see them here." })] }));
|
|
39
|
+
}
|
|
40
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, gap: 1, children: [_jsx(Text, { bold: true, children: "Sessions" }), _jsxs(Text, { dimColor: true, children: ["(", sessions.length, " total)"] }), _jsx(Text, { dimColor: true, children: "| Up/Down: navigate | Enter: select" })] }), _jsxs(Box, { paddingLeft: 2, children: [_jsx(Box, { width: 5, children: _jsx(Text, { bold: true, dimColor: true, children: "ST" }) }), _jsx(Box, { width: 6, children: _jsx(Text, { bold: true, dimColor: true, children: "TYPE" }) }), _jsx(Box, { width: 40, children: _jsx(Text, { bold: true, dimColor: true, children: "TOPIC" }) }), _jsx(Box, { width: 8, children: _jsx(Text, { bold: true, dimColor: true, children: "EVENTS" }) }), _jsx(Box, { width: 22, children: _jsx(Text, { bold: true, dimColor: true, children: "CREATED" }) })] }), sessions.map((session, index) => {
|
|
41
|
+
const isSelected = index === selectedIndex;
|
|
42
|
+
const isActive = session.sessionId === selectedSessionId;
|
|
43
|
+
const status = session.status;
|
|
44
|
+
const icon = STATUS_ICONS[status] ?? '?';
|
|
45
|
+
const color = STATUS_COLORS[status] ?? 'white';
|
|
46
|
+
const typeLabel = TYPE_LABELS[session.type] ?? session.type.slice(0, 3).toUpperCase();
|
|
47
|
+
return (_jsxs(Box, { paddingLeft: isSelected ? 0 : 2, children: [isSelected && _jsx(Text, { color: "cyan", children: '\u25B6 ' }), _jsx(Box, { width: 5, children: _jsx(Text, { color: color, children: icon }) }), _jsx(Box, { width: 6, children: _jsx(Text, { color: isActive ? 'cyan' : 'white', bold: isActive, children: typeLabel }) }), _jsx(Box, { width: 40, children: _jsx(Text, { color: isSelected ? 'cyan' : isActive ? 'white' : 'gray', bold: isSelected, children: truncate(session.topic || '(no topic)', 38) }) }), _jsx(Box, { width: 8, children: _jsx(Text, { dimColor: true, children: session.eventCount }) }), _jsx(Box, { width: 22, children: _jsx(Text, { dimColor: true, children: formatTimestamp(session.createdAt) }) })] }, session.sessionId));
|
|
48
|
+
}), selectedSessionId && (_jsxs(Box, { marginTop: 1, children: [_jsx(Text, { dimColor: true, children: "Active: " }), _jsx(Text, { color: "cyan", children: truncate(selectedSessionId, 36) })] }))] }));
|
|
49
|
+
}
|
|
50
|
+
function truncate(str, max) {
|
|
51
|
+
if (str.length <= max)
|
|
52
|
+
return str;
|
|
53
|
+
return str.slice(0, max - 3) + '...';
|
|
54
|
+
}
|
|
55
|
+
function formatTimestamp(ts) {
|
|
56
|
+
try {
|
|
57
|
+
const d = new Date(ts);
|
|
58
|
+
return d.toLocaleString('en-US', {
|
|
59
|
+
month: 'short',
|
|
60
|
+
day: '2-digit',
|
|
61
|
+
hour: '2-digit',
|
|
62
|
+
minute: '2-digit',
|
|
63
|
+
second: '2-digit',
|
|
64
|
+
hour12: false,
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return ts.slice(0, 19);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=SessionListScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SessionListScreen.js","sourceRoot":"","sources":["../../../../src/tui/screens/SessionListScreen.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpecViewerScreen.d.ts","sourceRoot":"","sources":["../../../../src/tui/screens/SpecViewerScreen.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAkB,MAAM,OAAO,CAAC;AAEvC,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAmE3D,wBAAgB,gBAAgB,CAAC,EAC/B,MAAM,EACN,iBAAiB,GAClB,EAAE,WAAW,GAAG,KAAK,CAAC,YAAY,CAkIlC"}
|
|
@@ -0,0 +1,73 @@
|
|
|
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 parseSpecEvents(events, sessionId) {
|
|
5
|
+
if (!sessionId)
|
|
6
|
+
return null;
|
|
7
|
+
// Spec events may be tied to the interview session or an execute session
|
|
8
|
+
// Look for SPEC_GENERATED events across all events matching the session
|
|
9
|
+
const specEvents = events.filter((e) => e.eventType === 'spec.generated' &&
|
|
10
|
+
(e.aggregateId === sessionId || hasMatchingSessionId(e, sessionId)));
|
|
11
|
+
if (specEvents.length === 0)
|
|
12
|
+
return null;
|
|
13
|
+
// Use the latest spec event
|
|
14
|
+
const latestSpec = specEvents[specEvents.length - 1];
|
|
15
|
+
if (!latestSpec)
|
|
16
|
+
return null;
|
|
17
|
+
const payload = latestSpec.payload;
|
|
18
|
+
// The spec may be nested under "spec" or at the top level
|
|
19
|
+
const spec = payload.spec ?? payload;
|
|
20
|
+
const ontology = spec.ontologySchema ?? {};
|
|
21
|
+
return {
|
|
22
|
+
goal: spec.goal ?? '',
|
|
23
|
+
constraints: spec.constraints ?? [],
|
|
24
|
+
acceptanceCriteria: spec.acceptanceCriteria ?? [],
|
|
25
|
+
entities: ontology.entities ?? [],
|
|
26
|
+
relations: ontology.relations ?? [],
|
|
27
|
+
gestaltAnalysis: spec.gestaltAnalysis ?? [],
|
|
28
|
+
generatedAt: latestSpec.timestamp,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
function hasMatchingSessionId(event, sessionId) {
|
|
32
|
+
const payload = event.payload;
|
|
33
|
+
return (payload.interviewSessionId === sessionId ||
|
|
34
|
+
payload.sessionId === sessionId);
|
|
35
|
+
}
|
|
36
|
+
const PRINCIPLE_COLORS = {
|
|
37
|
+
closure: 'magenta',
|
|
38
|
+
proximity: 'blue',
|
|
39
|
+
similarity: 'yellow',
|
|
40
|
+
figure_ground: 'green',
|
|
41
|
+
continuity: 'cyan',
|
|
42
|
+
};
|
|
43
|
+
export function SpecViewerScreen({ events, selectedSessionId, }) {
|
|
44
|
+
const spec = useMemo(() => parseSpecEvents(events, selectedSessionId), [events, selectedSessionId]);
|
|
45
|
+
if (!selectedSessionId) {
|
|
46
|
+
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." })] }));
|
|
47
|
+
}
|
|
48
|
+
if (!spec) {
|
|
49
|
+
return (_jsxs(Box, { flexDirection: "column", alignItems: "center", justifyContent: "center", minHeight: 10, children: [_jsx(Text, { bold: true, color: "yellow", children: "No spec found" }), _jsx(Text, { dimColor: true, children: "No SPEC_GENERATED event found for this session." })] }));
|
|
50
|
+
}
|
|
51
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { marginBottom: 1, gap: 1, children: [_jsx(Text, { bold: true, children: "Spec Viewer" }), _jsxs(Text, { dimColor: true, children: ["| generated: ", formatTimestamp(spec.generatedAt)] })] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsx(Text, { bold: true, color: "cyan", children: "Goal" }), _jsx(Box, { paddingLeft: 2, children: _jsx(Text, { children: spec.goal }) })] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, color: "yellow", children: "Constraints" }), _jsxs(Text, { dimColor: true, children: ["(", spec.constraints.length, ")"] })] }), spec.constraints.map((c, i) => (_jsxs(Box, { paddingLeft: 2, children: [_jsx(Text, { color: "yellow", children: "- " }), _jsx(Text, { children: truncate(c, 80) })] }, i)))] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, color: "green", children: "Acceptance Criteria" }), _jsxs(Text, { dimColor: true, children: ["(", spec.acceptanceCriteria.length, ")"] })] }), spec.acceptanceCriteria.map((ac, i) => (_jsxs(Box, { paddingLeft: 2, children: [_jsxs(Text, { color: "green", children: [i + 1, ". "] }), _jsx(Text, { children: truncate(ac, 78) })] }, i)))] }), _jsxs(Box, { flexDirection: "column", marginBottom: 1, children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, color: "magenta", children: "Ontology" }), _jsxs(Text, { dimColor: true, children: ["(", spec.entities.length, " entities, ", spec.relations.length, " relations)"] })] }), spec.entities.length > 0 && (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, children: [_jsx(Text, { bold: true, dimColor: true, children: "Entities:" }), spec.entities.map((entity) => (_jsxs(Box, { paddingLeft: 2, flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { color: "magenta", children: entity.name }), _jsxs(Text, { dimColor: true, children: ["- ", truncate(entity.description, 50)] })] }), entity.attributes.length > 0 && (_jsx(Box, { paddingLeft: 2, children: _jsxs(Text, { dimColor: true, children: ["attrs: ", entity.attributes.join(', ')] }) }))] }, entity.name)))] })), spec.relations.length > 0 && (_jsxs(Box, { flexDirection: "column", paddingLeft: 2, marginTop: 1, children: [_jsx(Text, { bold: true, dimColor: true, children: "Relations:" }), spec.relations.map((rel, i) => (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsx(Text, { color: "magenta", children: rel.from }), _jsxs(Text, { dimColor: true, children: ["--[", rel.type, "]--", '>'] }), _jsx(Text, { color: "magenta", children: rel.to })] }, i)))] }))] }), spec.gestaltAnalysis.length > 0 && (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, children: [_jsx(Text, { bold: true, color: "blue", children: "Gestalt Analysis" }), _jsxs(Text, { dimColor: true, children: ["(", spec.gestaltAnalysis.length, ")"] })] }), spec.gestaltAnalysis.map((ga, i) => (_jsxs(Box, { paddingLeft: 2, gap: 1, children: [_jsxs(Text, { color: PRINCIPLE_COLORS[ga.principle] ?? 'gray', children: ["[", ga.principle, "]"] }), _jsx(Text, { children: truncate(ga.finding, 60) }), _jsxs(Text, { dimColor: true, children: ["(", (ga.confidence * 100).toFixed(0), "%)"] })] }, i)))] }))] }));
|
|
52
|
+
}
|
|
53
|
+
function truncate(str, max) {
|
|
54
|
+
if (str.length <= max)
|
|
55
|
+
return str;
|
|
56
|
+
return str.slice(0, max - 3) + '...';
|
|
57
|
+
}
|
|
58
|
+
function formatTimestamp(ts) {
|
|
59
|
+
try {
|
|
60
|
+
const d = new Date(ts);
|
|
61
|
+
return d.toLocaleString('en-US', {
|
|
62
|
+
month: 'short',
|
|
63
|
+
day: '2-digit',
|
|
64
|
+
hour: '2-digit',
|
|
65
|
+
minute: '2-digit',
|
|
66
|
+
hour12: false,
|
|
67
|
+
});
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
return ts.slice(0, 19);
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
//# sourceMappingURL=SpecViewerScreen.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"SpecViewerScreen.js","sourceRoot":"","sources":["../../../../src/tui/screens/SpecViewerScreen.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export interface DriftDimension {
|
|
3
|
+
name: string;
|
|
4
|
+
score: number;
|
|
5
|
+
weight: number;
|
|
6
|
+
}
|
|
7
|
+
interface DriftMeterProps {
|
|
8
|
+
dimensions: DriftDimension[];
|
|
9
|
+
overall: number;
|
|
10
|
+
threshold: number;
|
|
11
|
+
barWidth?: number;
|
|
12
|
+
}
|
|
13
|
+
export declare function DriftMeter({ dimensions, overall, threshold, barWidth, }: DriftMeterProps): React.ReactElement;
|
|
14
|
+
export {};
|
|
15
|
+
//# sourceMappingURL=DriftMeter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DriftMeter.d.ts","sourceRoot":"","sources":["../../../../src/tui/widgets/DriftMeter.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,eAAe;IACvB,UAAU,EAAE,cAAc,EAAE,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAQD,wBAAgB,UAAU,CAAC,EACzB,UAAU,EACV,OAAO,EACP,SAAS,EACT,QAAa,GACd,EAAE,eAAe,GAAG,KAAK,CAAC,YAAY,CAyCtC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import { Box, Text } from 'ink';
|
|
3
|
+
const DIMENSION_COLORS = {
|
|
4
|
+
goal: 'blue',
|
|
5
|
+
constraint: 'magenta',
|
|
6
|
+
ontology: 'yellow',
|
|
7
|
+
};
|
|
8
|
+
export function DriftMeter({ dimensions, overall, threshold, barWidth = 20, }) {
|
|
9
|
+
const overThreshold = overall > threshold;
|
|
10
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Drift" }), _jsxs(Text, { color: overThreshold ? 'red' : 'green', bold: true, children: [(overall * 100).toFixed(0), "%"] }), _jsxs(Text, { dimColor: true, children: ["threshold: ", (threshold * 100).toFixed(0), "%"] })] }), dimensions.map((dim) => {
|
|
11
|
+
const dimOver = dim.score > threshold;
|
|
12
|
+
const color = DIMENSION_COLORS[dim.name] ?? 'white';
|
|
13
|
+
return (_jsxs(Box, { gap: 1, children: [_jsx(Box, { width: 12, children: _jsx(Text, { color: color, children: padRight(dim.name, 11) }) }), _jsx(Text, { children: renderBar(dim.score, barWidth, dimOver) }), _jsxs(Text, { color: dimOver ? 'red' : 'green', children: [(dim.score * 100).toFixed(0), "%"] }), _jsxs(Text, { dimColor: true, children: ["(", (dim.weight * 100).toFixed(0), "%w)"] })] }, dim.name));
|
|
14
|
+
}), overThreshold && (_jsx(Box, { marginTop: 1, children: _jsx(Text, { color: "red", bold: true, children: "WARNING: Drift exceeds threshold!" }) }))] }));
|
|
15
|
+
}
|
|
16
|
+
function renderBar(score, width, over) {
|
|
17
|
+
const filled = Math.round(score * width);
|
|
18
|
+
const empty = width - filled;
|
|
19
|
+
const fillChar = over ? '#' : '=';
|
|
20
|
+
return '[' + fillChar.repeat(filled) + ' '.repeat(empty) + ']';
|
|
21
|
+
}
|
|
22
|
+
function padRight(str, len) {
|
|
23
|
+
if (str.length >= len)
|
|
24
|
+
return str;
|
|
25
|
+
return str + ' '.repeat(len - str.length);
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=DriftMeter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"DriftMeter.js","sourceRoot":"","sources":["../../../../src/tui/widgets/DriftMeter.tsx"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import React from 'react';
|
|
2
|
+
export type PrinciplePhase = 'figure_ground' | 'closure' | 'proximity' | 'continuity';
|
|
3
|
+
interface GestaltPrincipleBarProps {
|
|
4
|
+
currentPhase: PrinciplePhase | null;
|
|
5
|
+
completedPhases: PrinciplePhase[];
|
|
6
|
+
}
|
|
7
|
+
export declare function GestaltPrincipleBar({ currentPhase, completedPhases, }: GestaltPrincipleBarProps): React.ReactElement;
|
|
8
|
+
export {};
|
|
9
|
+
//# sourceMappingURL=GestaltPrincipleBar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GestaltPrincipleBar.d.ts","sourceRoot":"","sources":["../../../../src/tui/widgets/GestaltPrincipleBar.tsx"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAG1B,MAAM,MAAM,cAAc,GAAG,eAAe,GAAG,SAAS,GAAG,WAAW,GAAG,YAAY,CAAC;AA4BtF,UAAU,wBAAwB;IAChC,YAAY,EAAE,cAAc,GAAG,IAAI,CAAC;IACpC,eAAe,EAAE,cAAc,EAAE,CAAC;CACnC;AAED,wBAAgB,mBAAmB,CAAC,EAClC,YAAY,EACZ,eAAe,GAChB,EAAE,wBAAwB,GAAG,KAAK,CAAC,YAAY,CAuC/C"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
2
|
+
import React from 'react';
|
|
3
|
+
import { Box, Text } from 'ink';
|
|
4
|
+
const PHASES = [
|
|
5
|
+
{ key: 'figure_ground', label: 'Figure-Ground' },
|
|
6
|
+
{ key: 'closure', label: 'Closure' },
|
|
7
|
+
{ key: 'proximity', label: 'Proximity' },
|
|
8
|
+
{ key: 'continuity', label: 'Continuity' },
|
|
9
|
+
];
|
|
10
|
+
const STATUS_COLORS = {
|
|
11
|
+
completed: 'green',
|
|
12
|
+
active: 'cyan',
|
|
13
|
+
pending: 'gray',
|
|
14
|
+
};
|
|
15
|
+
const STATUS_ICONS = {
|
|
16
|
+
completed: '[x]',
|
|
17
|
+
active: '[>]',
|
|
18
|
+
pending: '[ ]',
|
|
19
|
+
};
|
|
20
|
+
export function GestaltPrincipleBar({ currentPhase, completedPhases, }) {
|
|
21
|
+
function getStatus(phase) {
|
|
22
|
+
if (completedPhases.includes(phase))
|
|
23
|
+
return 'completed';
|
|
24
|
+
if (phase === currentPhase)
|
|
25
|
+
return 'active';
|
|
26
|
+
return 'pending';
|
|
27
|
+
}
|
|
28
|
+
const completedCount = completedPhases.length;
|
|
29
|
+
const totalCount = PHASES.length;
|
|
30
|
+
return (_jsxs(Box, { flexDirection: "column", children: [_jsxs(Box, { gap: 1, marginBottom: 1, children: [_jsx(Text, { bold: true, children: "Gestalt Phases" }), _jsxs(Text, { dimColor: true, children: ["(", completedCount, "/", totalCount, ")"] })] }), _jsx(Box, { gap: 1, children: PHASES.map((phase, index) => {
|
|
31
|
+
const status = getStatus(phase.key);
|
|
32
|
+
return (_jsxs(React.Fragment, { children: [_jsx(Box, { children: _jsxs(Text, { color: STATUS_COLORS[status], bold: status === 'active', children: [STATUS_ICONS[status], " ", phase.label] }) }), index < PHASES.length - 1 && (_jsx(Text, { color: completedPhases.includes(phase.key) ? 'green' : 'gray', children: ' -> ' }))] }, phase.key));
|
|
33
|
+
}) })] }));
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=GestaltPrincipleBar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"GestaltPrincipleBar.js","sourceRoot":"","sources":["../../../../src/tui/widgets/GestaltPrincipleBar.tsx"],"names":[],"mappings":";AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,KAAK,CAAC;AAWhC,MAAM,MAAM,GAAgB;IAC1B,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE;IAChD,EAAE,GAAG,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE;IACpC,EAAE,GAAG,EAAE,WAAW,EAAE,KAAK,EAAE,WAAW,EAAE;IACxC,EAAE,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,YAAY,EAAE;CAC3C,CAAC;AAEF,MAAM,aAAa,GAAgC;IACjD,SAAS,EAAE,OAAO;IAClB,MAAM,EAAE,MAAM;IACd,OAAO,EAAE,MAAM;CAChB,CAAC;AAEF,MAAM,YAAY,GAAgC;IAChD,SAAS,EAAE,KAAK;IAChB,MAAM,EAAE,KAAK;IACb,OAAO,EAAE,KAAK;CACf,CAAC;AAOF,MAAM,UAAU,mBAAmB,CAAC,EAClC,YAAY,EACZ,eAAe,GACU;IACzB,SAAS,SAAS,CAAC,KAAqB;QACtC,IAAI,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC;YAAE,OAAO,WAAW,CAAC;QACxD,IAAI,KAAK,KAAK,YAAY;YAAE,OAAO,QAAQ,CAAC;QAC5C,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,cAAc,GAAG,eAAe,CAAC,MAAM,CAAC;IAC9C,MAAM,UAAU,GAAG,MAAM,CAAC,MAAM,CAAC;IAEjC,OAAO,CACL,MAAC,GAAG,IAAC,aAAa,EAAC,QAAQ,aACzB,MAAC,GAAG,IAAC,GAAG,EAAE,CAAC,EAAE,YAAY,EAAE,CAAC,aAC1B,KAAC,IAAI,IAAC,IAAI,qCAAsB,EAChC,MAAC,IAAI,IAAC,QAAQ,wBACV,cAAc,OAAG,UAAU,SACxB,IACH,EACN,KAAC,GAAG,IAAC,GAAG,EAAE,CAAC,YACR,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;oBAC3B,MAAM,MAAM,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBACpC,OAAO,CACL,MAAC,KAAK,CAAC,QAAQ,eACb,KAAC,GAAG,cACF,MAAC,IAAI,IAAC,KAAK,EAAE,aAAa,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,MAAM,KAAK,QAAQ,aAC1D,YAAY,CAAC,MAAM,CAAC,OAAG,KAAK,CAAC,KAAK,IAC9B,GACH,EACL,KAAK,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,CAC5B,KAAC,IAAI,IAAC,KAAK,EAAE,eAAe,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,YAChE,MAAM,GACF,CACR,KAVkB,KAAK,CAAC,GAAG,CAWb,CAClB,CAAC;gBACJ,CAAC,CAAC,GACE,IACF,CACP,CAAC;AACJ,CAAC"}
|