qnce-engine 0.1.0 → 1.2.1
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/README.md +959 -5
- package/dist/cli/audit.js +6 -4
- package/dist/cli/audit.js.map +1 -1
- package/dist/cli/init.js +11 -9
- package/dist/cli/init.js.map +1 -1
- package/dist/cli/perf.d.ts +30 -0
- package/dist/cli/perf.d.ts.map +1 -0
- package/dist/cli/perf.js +220 -0
- package/dist/cli/perf.js.map +1 -0
- package/dist/cli/play.d.ts +4 -0
- package/dist/cli/play.d.ts.map +1 -0
- package/dist/cli/play.js +259 -0
- package/dist/cli/play.js.map +1 -0
- package/dist/engine/condition.d.ts +69 -0
- package/dist/engine/condition.d.ts.map +1 -0
- package/dist/engine/condition.js +195 -0
- package/dist/engine/condition.js.map +1 -0
- package/dist/engine/core.d.ts +378 -11
- package/dist/engine/core.d.ts.map +1 -1
- package/dist/engine/core.js +1433 -13
- package/dist/engine/core.js.map +1 -1
- package/dist/engine/demo-story.d.ts.map +1 -1
- package/dist/engine/demo-story.js +103 -14
- package/dist/engine/demo-story.js.map +1 -1
- package/dist/engine/errors.d.ts +76 -0
- package/dist/engine/errors.d.ts.map +1 -0
- package/dist/engine/errors.js +178 -0
- package/dist/engine/errors.js.map +1 -0
- package/dist/engine/types.d.ts +445 -0
- package/dist/engine/types.d.ts.map +1 -0
- package/dist/engine/types.js +9 -0
- package/dist/engine/types.js.map +1 -0
- package/dist/engine/validation.d.ts +110 -0
- package/dist/engine/validation.d.ts.map +1 -0
- package/dist/engine/validation.js +261 -0
- package/dist/engine/validation.js.map +1 -0
- package/dist/examples/examples/autosave-undo-demo.js +248 -0
- package/dist/examples/examples/persistence-demo.js +63 -0
- package/dist/examples/src/engine/condition.js +194 -0
- package/dist/examples/src/engine/core.js +1382 -0
- package/dist/examples/src/engine/demo-story.js +200 -0
- package/dist/examples/src/engine/types.js +8 -0
- package/dist/examples/src/index.js +35 -0
- package/dist/examples/src/integrations/react.js +322 -0
- package/dist/examples/src/narrative/branching/engine-simple.js +348 -0
- package/dist/examples/src/narrative/branching/index.js +55 -0
- package/dist/examples/src/narrative/branching/models.js +5 -0
- package/dist/examples/src/performance/ObjectPool.js +296 -0
- package/dist/examples/src/performance/PerfReporter.js +280 -0
- package/dist/examples/src/performance/ThreadPool.js +347 -0
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +35 -3
- package/dist/index.js.map +1 -1
- package/dist/integrations/react.d.ts +200 -0
- package/dist/integrations/react.d.ts.map +1 -0
- package/dist/integrations/react.js +365 -0
- package/dist/integrations/react.js.map +1 -0
- package/dist/narrative/branching/engine-simple.d.ts +84 -0
- package/dist/narrative/branching/engine-simple.d.ts.map +1 -0
- package/dist/narrative/branching/engine-simple.js +349 -0
- package/dist/narrative/branching/engine-simple.js.map +1 -0
- package/dist/narrative/branching/engine.d.ts +1 -0
- package/dist/narrative/branching/engine.d.ts.map +1 -0
- package/dist/narrative/branching/engine.js +2 -0
- package/dist/narrative/branching/engine.js.map +1 -0
- package/dist/narrative/branching/index.d.ts +12 -0
- package/dist/narrative/branching/index.d.ts.map +1 -0
- package/dist/narrative/branching/index.js +56 -0
- package/dist/narrative/branching/index.js.map +1 -0
- package/dist/narrative/branching/models.d.ts +223 -0
- package/dist/narrative/branching/models.d.ts.map +1 -0
- package/dist/narrative/branching/models.js +6 -0
- package/dist/narrative/branching/models.js.map +1 -0
- package/dist/performance/HotReloadDelta.d.ts +124 -0
- package/dist/performance/HotReloadDelta.d.ts.map +1 -0
- package/dist/performance/HotReloadDelta.js +328 -0
- package/dist/performance/HotReloadDelta.js.map +1 -0
- package/dist/performance/ObjectPool.d.ts +150 -0
- package/dist/performance/ObjectPool.d.ts.map +1 -0
- package/dist/performance/ObjectPool.js +297 -0
- package/dist/performance/ObjectPool.js.map +1 -0
- package/dist/performance/PerfReporter.d.ts +123 -0
- package/dist/performance/PerfReporter.d.ts.map +1 -0
- package/dist/performance/PerfReporter.js +281 -0
- package/dist/performance/PerfReporter.js.map +1 -0
- package/dist/performance/ThreadPool.d.ts +107 -0
- package/dist/performance/ThreadPool.d.ts.map +1 -0
- package/dist/performance/ThreadPool.js +348 -0
- package/dist/performance/ThreadPool.js.map +1 -0
- package/dist/ui/__tests__/AutosaveIndicator.test.d.ts +2 -0
- package/dist/ui/__tests__/AutosaveIndicator.test.d.ts.map +1 -0
- package/dist/ui/__tests__/AutosaveIndicator.test.js +329 -0
- package/dist/ui/__tests__/AutosaveIndicator.test.js.map +1 -0
- package/dist/ui/__tests__/UndoRedoControls.test.d.ts +2 -0
- package/dist/ui/__tests__/UndoRedoControls.test.d.ts.map +1 -0
- package/dist/ui/__tests__/UndoRedoControls.test.js +245 -0
- package/dist/ui/__tests__/UndoRedoControls.test.js.map +1 -0
- package/dist/ui/__tests__/autosave-simple.test.d.ts +2 -0
- package/dist/ui/__tests__/autosave-simple.test.d.ts.map +1 -0
- package/dist/ui/__tests__/autosave-simple.test.js +29 -0
- package/dist/ui/__tests__/autosave-simple.test.js.map +1 -0
- package/dist/ui/__tests__/setup.d.ts +2 -0
- package/dist/ui/__tests__/setup.d.ts.map +1 -0
- package/dist/ui/__tests__/setup.js +40 -0
- package/dist/ui/__tests__/setup.js.map +1 -0
- package/dist/ui/__tests__/smoke-test.d.ts +2 -0
- package/dist/ui/__tests__/smoke-test.d.ts.map +1 -0
- package/dist/ui/__tests__/smoke-test.js +18 -0
- package/dist/ui/__tests__/smoke-test.js.map +1 -0
- package/dist/ui/__tests__/smoke-test.test.d.ts +2 -0
- package/dist/ui/__tests__/smoke-test.test.d.ts.map +1 -0
- package/dist/ui/__tests__/smoke-test.test.js +18 -0
- package/dist/ui/__tests__/smoke-test.test.js.map +1 -0
- package/dist/ui/__tests__/useKeyboardShortcuts.test.d.ts +2 -0
- package/dist/ui/__tests__/useKeyboardShortcuts.test.d.ts.map +1 -0
- package/dist/ui/__tests__/useKeyboardShortcuts.test.js +374 -0
- package/dist/ui/__tests__/useKeyboardShortcuts.test.js.map +1 -0
- package/dist/ui/components/AutosaveIndicator.d.ts +18 -0
- package/dist/ui/components/AutosaveIndicator.d.ts.map +1 -0
- package/dist/ui/components/AutosaveIndicator.js +175 -0
- package/dist/ui/components/AutosaveIndicator.js.map +1 -0
- package/dist/ui/components/UndoRedoControls.d.ts +16 -0
- package/dist/ui/components/UndoRedoControls.d.ts.map +1 -0
- package/dist/ui/components/UndoRedoControls.js +144 -0
- package/dist/ui/components/UndoRedoControls.js.map +1 -0
- package/dist/ui/hooks/useKeyboardShortcuts.d.ts +22 -0
- package/dist/ui/hooks/useKeyboardShortcuts.d.ts.map +1 -0
- package/dist/ui/hooks/useKeyboardShortcuts.js +162 -0
- package/dist/ui/hooks/useKeyboardShortcuts.js.map +1 -0
- package/dist/ui/index.d.ts +9 -0
- package/dist/ui/index.d.ts.map +1 -0
- package/dist/ui/index.js +14 -0
- package/dist/ui/index.js.map +1 -0
- package/dist/ui/types.d.ts +141 -0
- package/dist/ui/types.d.ts.map +1 -0
- package/dist/ui/types.js +51 -0
- package/dist/ui/types.js.map +1 -0
- package/docs/PERFORMANCE.md +355 -0
- package/docs/branching/ERD.md +214 -0
- package/docs/branching/PDM.md +443 -0
- package/docs/branching/RELEASE-v1.2.0.md +169 -0
- package/examples/autosave-undo-demo.ts +306 -0
- package/examples/branching-advanced-demo.ts +339 -0
- package/examples/branching-demo-simple.ts +0 -0
- package/examples/branching-demo.ts +0 -0
- package/examples/branching-quickstart.ts +314 -0
- package/examples/persistence-demo.ts +84 -0
- package/examples/quickstart-demo.js +82 -0
- package/examples/tsconfig.json +13 -0
- package/examples/ui-components-demo.tsx +320 -0
- package/examples/validation-demo-story.json +177 -0
- package/examples/validation-demo.js +163 -0
- package/package.json +41 -8
package/dist/cli/audit.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const core_js_1 = require("../engine/core.js");
|
|
4
6
|
/**
|
|
5
7
|
* QNCE Audit CLI Tool
|
|
6
8
|
* Validates narrative structure and checks for loops, dead ends, etc.
|
|
@@ -8,8 +10,8 @@ import { loadStoryData } from '../engine/core.js';
|
|
|
8
10
|
function auditStory(filePath) {
|
|
9
11
|
try {
|
|
10
12
|
console.log(`🔍 Auditing QNCE story: ${filePath}`);
|
|
11
|
-
const jsonData = JSON.parse(readFileSync(filePath, 'utf-8'));
|
|
12
|
-
const storyData = loadStoryData(jsonData);
|
|
13
|
+
const jsonData = JSON.parse((0, fs_1.readFileSync)(filePath, 'utf-8'));
|
|
14
|
+
const storyData = (0, core_js_1.loadStoryData)(jsonData);
|
|
13
15
|
// Basic validation
|
|
14
16
|
console.log(`📖 Story contains ${storyData.nodes.length} nodes`);
|
|
15
17
|
console.log(`🚀 Initial node: ${storyData.initialNodeId}`);
|
package/dist/cli/audit.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/cli/audit.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"audit.js","sourceRoot":"","sources":["../../src/cli/audit.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/init.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
|
-
|
|
3
|
-
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
const fs_1 = require("fs");
|
|
5
|
+
const path_1 = require("path");
|
|
4
6
|
/**
|
|
5
7
|
* QNCE Init CLI Tool
|
|
6
8
|
* Scaffolds a new QNCE story project
|
|
@@ -9,7 +11,7 @@ function initProject(projectName) {
|
|
|
9
11
|
try {
|
|
10
12
|
console.log(`🚀 Initializing QNCE project: ${projectName}`);
|
|
11
13
|
// Create project directory
|
|
12
|
-
mkdirSync(projectName, { recursive: true });
|
|
14
|
+
(0, fs_1.mkdirSync)(projectName, { recursive: true });
|
|
13
15
|
// Create basic story template
|
|
14
16
|
const storyTemplate = {
|
|
15
17
|
initialNodeId: 'start',
|
|
@@ -49,8 +51,8 @@ function initProject(projectName) {
|
|
|
49
51
|
]
|
|
50
52
|
};
|
|
51
53
|
// Write story file
|
|
52
|
-
const storyPath = join(projectName, 'story.json');
|
|
53
|
-
writeFileSync(storyPath, JSON.stringify(storyTemplate, null, 2));
|
|
54
|
+
const storyPath = (0, path_1.join)(projectName, 'story.json');
|
|
55
|
+
(0, fs_1.writeFileSync)(storyPath, JSON.stringify(storyTemplate, null, 2));
|
|
54
56
|
// Create package.json
|
|
55
57
|
const packageJson = {
|
|
56
58
|
name: projectName,
|
|
@@ -64,8 +66,8 @@ function initProject(projectName) {
|
|
|
64
66
|
'qnce-engine': '^0.1.0'
|
|
65
67
|
}
|
|
66
68
|
};
|
|
67
|
-
const packagePath = join(projectName, 'package.json');
|
|
68
|
-
writeFileSync(packagePath, JSON.stringify(packageJson, null, 2));
|
|
69
|
+
const packagePath = (0, path_1.join)(projectName, 'package.json');
|
|
70
|
+
(0, fs_1.writeFileSync)(packagePath, JSON.stringify(packageJson, null, 2));
|
|
69
71
|
// Create README
|
|
70
72
|
const readme = `# ${projectName}
|
|
71
73
|
|
|
@@ -108,8 +110,8 @@ console.log(currentNode.text);
|
|
|
108
110
|
|
|
109
111
|
Happy storytelling!
|
|
110
112
|
`;
|
|
111
|
-
const readmePath = join(projectName, 'README.md');
|
|
112
|
-
writeFileSync(readmePath, readme);
|
|
113
|
+
const readmePath = (0, path_1.join)(projectName, 'README.md');
|
|
114
|
+
(0, fs_1.writeFileSync)(readmePath, readme);
|
|
113
115
|
console.log(`✅ Project created successfully!`);
|
|
114
116
|
console.log(`📁 Files created:`);
|
|
115
117
|
console.log(` - ${storyPath}`);
|
package/dist/cli/init.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"init.js","sourceRoot":"","sources":["../../src/cli/init.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* S2-T5: CLI Performance Dashboard
|
|
4
|
+
* QNCE Performance Monitor CLI Tool - Real-time profiler metrics and threshold alerts
|
|
5
|
+
*/
|
|
6
|
+
interface PerformanceThresholds {
|
|
7
|
+
maxCacheHitTime: number;
|
|
8
|
+
minCacheHitRate: number;
|
|
9
|
+
maxHotReloadTime: number;
|
|
10
|
+
maxStateTransitionTime: number;
|
|
11
|
+
maxEventBacklog: number;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Display comprehensive performance dashboard
|
|
15
|
+
*/
|
|
16
|
+
declare function displayDashboard(thresholds?: PerformanceThresholds): void;
|
|
17
|
+
/**
|
|
18
|
+
* Live monitor mode - continuously update performance metrics
|
|
19
|
+
*/
|
|
20
|
+
declare function startLiveMonitor(intervalMs?: number, thresholds?: PerformanceThresholds): void;
|
|
21
|
+
/**
|
|
22
|
+
* Export performance summary as JSON
|
|
23
|
+
*/
|
|
24
|
+
declare function exportSummary(): void;
|
|
25
|
+
/**
|
|
26
|
+
* Reset performance counters
|
|
27
|
+
*/
|
|
28
|
+
declare function resetCounters(): void;
|
|
29
|
+
export { displayDashboard, startLiveMonitor, exportSummary, resetCounters };
|
|
30
|
+
//# sourceMappingURL=perf.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf.d.ts","sourceRoot":"","sources":["../../src/cli/perf.ts"],"names":[],"mappings":";AAKA;;;GAGG;AAEH,UAAU,qBAAqB;IAC7B,eAAe,EAAE,MAAM,CAAC;IACxB,eAAe,EAAE,MAAM,CAAC;IACxB,gBAAgB,EAAE,MAAM,CAAC;IACzB,sBAAsB,EAAE,MAAM,CAAC;IAC/B,eAAe,EAAE,MAAM,CAAC;CACzB;AAoCD;;GAEG;AACH,iBAAS,gBAAgB,CAAC,UAAU,GAAE,qBAA0C,GAAG,IAAI,CA4DtF;AAiDD;;GAEG;AACH,iBAAS,gBAAgB,CAAC,UAAU,GAAE,MAAa,EAAE,UAAU,GAAE,qBAA0C,GAAG,IAAI,CAmBjH;AAED;;GAEG;AACH,iBAAS,aAAa,IAAI,IAAI,CAY7B;AAED;;GAEG;AACH,iBAAS,aAAa,IAAI,IAAI,CAG7B;AA8ED,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/cli/perf.js
ADDED
|
@@ -0,0 +1,220 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.displayDashboard = displayDashboard;
|
|
5
|
+
exports.startLiveMonitor = startLiveMonitor;
|
|
6
|
+
exports.exportSummary = exportSummary;
|
|
7
|
+
exports.resetCounters = resetCounters;
|
|
8
|
+
const PerfReporter_js_1 = require("../performance/PerfReporter.js");
|
|
9
|
+
const ThreadPool_js_1 = require("../performance/ThreadPool.js");
|
|
10
|
+
const DEFAULT_THRESHOLDS = {
|
|
11
|
+
maxCacheHitTime: 50, // 50ms max for cache operations
|
|
12
|
+
minCacheHitRate: 80, // 80% minimum cache hit rate
|
|
13
|
+
maxHotReloadTime: 2, // 2ms max for hot-reload (S2-T3 target)
|
|
14
|
+
maxStateTransitionTime: 10, // 10ms max for state transitions
|
|
15
|
+
maxEventBacklog: 1000 // Max 1000 events in backlog
|
|
16
|
+
};
|
|
17
|
+
/**
|
|
18
|
+
* Display comprehensive performance dashboard
|
|
19
|
+
*/
|
|
20
|
+
function displayDashboard(thresholds = DEFAULT_THRESHOLDS) {
|
|
21
|
+
console.log('\n🚀 QNCE Performance Dashboard');
|
|
22
|
+
console.log('=====================================');
|
|
23
|
+
const summary = PerfReporter_js_1.perf.summary();
|
|
24
|
+
const threadPool = (0, ThreadPool_js_1.getThreadPool)();
|
|
25
|
+
// Header with time range
|
|
26
|
+
const durationSeconds = (summary.timeRange.duration / 1000).toFixed(2);
|
|
27
|
+
console.log(`📊 Session Duration: ${durationSeconds}s`);
|
|
28
|
+
console.log(`🔢 Total Events: ${summary.totalEvents}`);
|
|
29
|
+
console.log('');
|
|
30
|
+
// Event breakdown
|
|
31
|
+
console.log('📈 Event Breakdown:');
|
|
32
|
+
for (const [type, count] of Object.entries(summary.eventsByType)) {
|
|
33
|
+
const avg = summary.avgDurations[type]?.toFixed(2) || 'N/A';
|
|
34
|
+
const max = summary.maxDurations[type]?.toFixed(2) || 'N/A';
|
|
35
|
+
console.log(` ${type.padEnd(20)} ${count.toString().padStart(6)} events (avg: ${avg}ms, max: ${max}ms)`);
|
|
36
|
+
}
|
|
37
|
+
console.log('');
|
|
38
|
+
// Cache Performance
|
|
39
|
+
console.log('💾 Cache Performance:');
|
|
40
|
+
const cacheStatus = summary.cacheHitRate >= thresholds.minCacheHitRate ? '✅' : '⚠️';
|
|
41
|
+
console.log(` ${cacheStatus} Hit Rate: ${summary.cacheHitRate.toFixed(1)}% (threshold: ${thresholds.minCacheHitRate}%)`);
|
|
42
|
+
const cacheTime = summary.avgDurations['cache-hit'] || 0;
|
|
43
|
+
const cacheTimeStatus = cacheTime <= thresholds.maxCacheHitTime ? '✅' : '⚠️';
|
|
44
|
+
console.log(` ${cacheTimeStatus} Avg Cache Time: ${cacheTime.toFixed(2)}ms (threshold: ${thresholds.maxCacheHitTime}ms)`);
|
|
45
|
+
console.log('');
|
|
46
|
+
// Hot-Reload Performance (S2-T3 metrics)
|
|
47
|
+
console.log('🔥 Hot-Reload Performance:');
|
|
48
|
+
const { avgTime, maxTime, totalReloads } = summary.hotReloadPerformance;
|
|
49
|
+
const hotReloadStatus = avgTime <= thresholds.maxHotReloadTime ? '✅' : '⚠️';
|
|
50
|
+
console.log(` ${hotReloadStatus} Avg Time: ${avgTime.toFixed(2)}ms (threshold: ${thresholds.maxHotReloadTime}ms)`);
|
|
51
|
+
console.log(` 📊 Max Time: ${maxTime.toFixed(2)}ms`);
|
|
52
|
+
console.log(` 🔄 Total Reloads: ${totalReloads}`);
|
|
53
|
+
console.log('');
|
|
54
|
+
// State Transition Performance
|
|
55
|
+
console.log('🔄 State Transitions:');
|
|
56
|
+
const stateTime = summary.avgDurations['state-transition'] || 0;
|
|
57
|
+
const stateStatus = stateTime <= thresholds.maxStateTransitionTime ? '✅' : '⚠️';
|
|
58
|
+
console.log(` ${stateStatus} Avg Time: ${stateTime.toFixed(2)}ms (threshold: ${thresholds.maxStateTransitionTime}ms)`);
|
|
59
|
+
console.log('');
|
|
60
|
+
// ThreadPool Status (S2-T2 metrics)
|
|
61
|
+
console.log('🧵 ThreadPool Status:');
|
|
62
|
+
const stats = threadPool.getStats();
|
|
63
|
+
console.log(` 📊 Completed Jobs: ${stats.completedJobs}`);
|
|
64
|
+
console.log(` ⏳ Queued Jobs: ${stats.queuedJobs}`);
|
|
65
|
+
console.log(` 🏃 Active Workers: ${stats.activeWorkers}`);
|
|
66
|
+
console.log(` 🕒 Avg Execution Time: ${stats.avgExecutionTime.toFixed(2)}ms`);
|
|
67
|
+
console.log(` 📈 Worker Utilization: ${stats.workerUtilization.toFixed(1)}%`);
|
|
68
|
+
console.log('');
|
|
69
|
+
// Performance Alerts
|
|
70
|
+
displayAlerts(summary, thresholds, stats);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Display performance threshold alerts
|
|
74
|
+
*/
|
|
75
|
+
function displayAlerts(summary, thresholds, threadStats) {
|
|
76
|
+
console.log('🚨 Performance Alerts:');
|
|
77
|
+
const alerts = [];
|
|
78
|
+
// Cache alerts
|
|
79
|
+
if (summary.cacheHitRate < thresholds.minCacheHitRate) {
|
|
80
|
+
alerts.push(`Low cache hit rate: ${summary.cacheHitRate.toFixed(1)}% < ${thresholds.minCacheHitRate}%`);
|
|
81
|
+
}
|
|
82
|
+
const cacheTime = summary.avgDurations['cache-hit'] || 0;
|
|
83
|
+
if (cacheTime > thresholds.maxCacheHitTime) {
|
|
84
|
+
alerts.push(`Slow cache operations: ${cacheTime.toFixed(2)}ms > ${thresholds.maxCacheHitTime}ms`);
|
|
85
|
+
}
|
|
86
|
+
// Hot-reload alerts (S2-T3 compliance)
|
|
87
|
+
if (summary.hotReloadPerformance.avgTime > thresholds.maxHotReloadTime) {
|
|
88
|
+
alerts.push(`Hot-reload exceeds target: ${summary.hotReloadPerformance.avgTime.toFixed(2)}ms > ${thresholds.maxHotReloadTime}ms`);
|
|
89
|
+
}
|
|
90
|
+
// State transition alerts
|
|
91
|
+
const stateTime = summary.avgDurations['state-transition'] || 0;
|
|
92
|
+
if (stateTime > thresholds.maxStateTransitionTime) {
|
|
93
|
+
alerts.push(`Slow state transitions: ${stateTime.toFixed(2)}ms > ${thresholds.maxStateTransitionTime}ms`);
|
|
94
|
+
}
|
|
95
|
+
// Event backlog alerts
|
|
96
|
+
if (summary.totalEvents > thresholds.maxEventBacklog) {
|
|
97
|
+
alerts.push(`High event backlog: ${summary.totalEvents} > ${thresholds.maxEventBacklog}`);
|
|
98
|
+
}
|
|
99
|
+
// ThreadPool alerts
|
|
100
|
+
if (threadStats.queuedJobs > 10) {
|
|
101
|
+
alerts.push(`High queued job count: ${threadStats.queuedJobs} jobs`);
|
|
102
|
+
}
|
|
103
|
+
if (alerts.length === 0) {
|
|
104
|
+
console.log(' ✅ All systems performing within thresholds');
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
alerts.forEach(alert => console.log(` ⚠️ ${alert}`));
|
|
108
|
+
}
|
|
109
|
+
console.log('');
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Live monitor mode - continuously update performance metrics
|
|
113
|
+
*/
|
|
114
|
+
function startLiveMonitor(intervalMs = 2000, thresholds = DEFAULT_THRESHOLDS) {
|
|
115
|
+
console.log(`🔴 Starting live performance monitor (${intervalMs}ms interval)`);
|
|
116
|
+
console.log('Press Ctrl+C to stop');
|
|
117
|
+
const interval = setInterval(() => {
|
|
118
|
+
// Clear screen
|
|
119
|
+
console.clear();
|
|
120
|
+
displayDashboard(thresholds);
|
|
121
|
+
// Show live timestamp
|
|
122
|
+
console.log(`🕒 Last updated: ${new Date().toLocaleTimeString()}`);
|
|
123
|
+
}, intervalMs);
|
|
124
|
+
// Handle graceful shutdown
|
|
125
|
+
process.on('SIGINT', () => {
|
|
126
|
+
clearInterval(interval);
|
|
127
|
+
console.log('\n👋 Live monitor stopped');
|
|
128
|
+
process.exit(0);
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Export performance summary as JSON
|
|
133
|
+
*/
|
|
134
|
+
function exportSummary() {
|
|
135
|
+
const summary = PerfReporter_js_1.perf.summary();
|
|
136
|
+
const threadStats = (0, ThreadPool_js_1.getThreadPool)().getStats();
|
|
137
|
+
const report = {
|
|
138
|
+
timestamp: new Date().toISOString(),
|
|
139
|
+
performanceSummary: summary,
|
|
140
|
+
threadPoolStats: threadStats,
|
|
141
|
+
thresholds: DEFAULT_THRESHOLDS
|
|
142
|
+
};
|
|
143
|
+
console.log(JSON.stringify(report, null, 2));
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Reset performance counters
|
|
147
|
+
*/
|
|
148
|
+
function resetCounters() {
|
|
149
|
+
(0, PerfReporter_js_1.getPerfReporter)().clear();
|
|
150
|
+
console.log('✅ Performance counters reset');
|
|
151
|
+
}
|
|
152
|
+
/**
|
|
153
|
+
* Main CLI entry point
|
|
154
|
+
*/
|
|
155
|
+
function main() {
|
|
156
|
+
const args = process.argv.slice(2);
|
|
157
|
+
const command = args[0] || 'dashboard';
|
|
158
|
+
switch (command) {
|
|
159
|
+
case 'dashboard':
|
|
160
|
+
case 'dash':
|
|
161
|
+
displayDashboard();
|
|
162
|
+
break;
|
|
163
|
+
case 'live':
|
|
164
|
+
case 'monitor': {
|
|
165
|
+
const interval = parseInt(args[1]) || 2000;
|
|
166
|
+
startLiveMonitor(interval);
|
|
167
|
+
break;
|
|
168
|
+
}
|
|
169
|
+
case 'export':
|
|
170
|
+
case 'json':
|
|
171
|
+
exportSummary();
|
|
172
|
+
break;
|
|
173
|
+
case 'reset':
|
|
174
|
+
case 'clear':
|
|
175
|
+
resetCounters();
|
|
176
|
+
break;
|
|
177
|
+
case 'help':
|
|
178
|
+
case '--help':
|
|
179
|
+
case '-h':
|
|
180
|
+
console.log(`
|
|
181
|
+
🚀 QNCE Performance CLI
|
|
182
|
+
|
|
183
|
+
Usage: qnce-perf [command] [options]
|
|
184
|
+
|
|
185
|
+
Commands:
|
|
186
|
+
dashboard, dash Show performance dashboard (default)
|
|
187
|
+
live, monitor Start live monitoring mode
|
|
188
|
+
export, json Export performance data as JSON
|
|
189
|
+
reset, clear Reset performance counters
|
|
190
|
+
help Show this help
|
|
191
|
+
|
|
192
|
+
Options:
|
|
193
|
+
--interval <ms> Monitoring interval for live mode (default: 2000ms)
|
|
194
|
+
|
|
195
|
+
Examples:
|
|
196
|
+
qnce-perf dashboard
|
|
197
|
+
qnce-perf live 1000
|
|
198
|
+
qnce-perf export > performance-report.json
|
|
199
|
+
qnce-perf reset
|
|
200
|
+
|
|
201
|
+
Performance Thresholds:
|
|
202
|
+
Cache Hit Time: < 50ms
|
|
203
|
+
Cache Hit Rate: > 80%
|
|
204
|
+
Hot-Reload Time: < 2ms (S2-T3 target)
|
|
205
|
+
State Transition: < 10ms
|
|
206
|
+
Event Backlog: < 1000 events
|
|
207
|
+
`);
|
|
208
|
+
break;
|
|
209
|
+
default:
|
|
210
|
+
console.error(`❌ Unknown command: ${command}`);
|
|
211
|
+
console.log('Run "qnce-perf help" for usage information');
|
|
212
|
+
process.exit(1);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
// Run if called directly (ES module compatible)
|
|
216
|
+
const isMainModule = require.main === module;
|
|
217
|
+
if (isMainModule) {
|
|
218
|
+
main();
|
|
219
|
+
}
|
|
220
|
+
//# sourceMappingURL=perf.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"perf.js","sourceRoot":"","sources":["../../src/cli/perf.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"play.d.ts","sourceRoot":"","sources":["../../src/cli/play.ts"],"names":[],"mappings":";AAgQA,iBAAS,IAAI,IAAI,IAAI,CA2CpB;AAOD,OAAO,EAAE,IAAI,IAAI,eAAe,EAAE,CAAC"}
|
package/dist/cli/play.js
ADDED
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
"use strict";
|
|
3
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
|
+
exports.playInteractive = main;
|
|
5
|
+
const fs_1 = require("fs");
|
|
6
|
+
const readline_1 = require("readline");
|
|
7
|
+
const core_js_1 = require("../engine/core.js");
|
|
8
|
+
const demo_story_js_1 = require("../engine/demo-story.js");
|
|
9
|
+
function displayNode(session) {
|
|
10
|
+
const { engine } = session;
|
|
11
|
+
const currentNode = engine.getCurrentNode();
|
|
12
|
+
const choices = engine.getAvailableChoices();
|
|
13
|
+
console.log('\n' + '='.repeat(60));
|
|
14
|
+
console.log(currentNode.text);
|
|
15
|
+
console.log('='.repeat(60));
|
|
16
|
+
if (choices.length > 0) {
|
|
17
|
+
console.log('\nChoices:');
|
|
18
|
+
choices.forEach((choice, index) => {
|
|
19
|
+
console.log(`${index + 1}. ${choice.text}`);
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
console.log('\n[Story Complete]');
|
|
24
|
+
}
|
|
25
|
+
// Show undo/redo status
|
|
26
|
+
const undoCount = engine.getUndoCount();
|
|
27
|
+
const redoCount = engine.getRedoCount();
|
|
28
|
+
console.log(`\nUndo: ${undoCount} available | Redo: ${redoCount} available`);
|
|
29
|
+
}
|
|
30
|
+
function displayHelp() {
|
|
31
|
+
console.log('\nCommands:');
|
|
32
|
+
console.log(' 1-9 : Select choice by number');
|
|
33
|
+
console.log(' u, undo : Undo last action');
|
|
34
|
+
console.log(' r, redo : Redo last undone action');
|
|
35
|
+
console.log(' h, help : Show this help');
|
|
36
|
+
console.log(' s, save : Save current state');
|
|
37
|
+
console.log(' l, load : Load saved state');
|
|
38
|
+
console.log(' f, flags: Show current flags');
|
|
39
|
+
console.log(' hist : Show history summary');
|
|
40
|
+
console.log(' q, quit : Exit the session');
|
|
41
|
+
}
|
|
42
|
+
function displayFlags(session) {
|
|
43
|
+
const { engine } = session;
|
|
44
|
+
const flags = engine.getState().flags;
|
|
45
|
+
console.log('\n--- Current Flags ---');
|
|
46
|
+
if (Object.keys(flags).length === 0) {
|
|
47
|
+
console.log('No flags set');
|
|
48
|
+
}
|
|
49
|
+
else {
|
|
50
|
+
Object.entries(flags).forEach(([key, value]) => {
|
|
51
|
+
console.log(`${key}: ${JSON.stringify(value)}`);
|
|
52
|
+
});
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function displayHistory(session) {
|
|
56
|
+
const { engine } = session;
|
|
57
|
+
const summary = engine.getHistorySummary();
|
|
58
|
+
console.log('\n--- History Summary ---');
|
|
59
|
+
console.log(`Undo entries: ${summary.undoEntries.length}`);
|
|
60
|
+
console.log(`Redo entries: ${summary.redoEntries.length}`);
|
|
61
|
+
if (summary.undoEntries.length > 0) {
|
|
62
|
+
console.log('\nRecent undo history:');
|
|
63
|
+
summary.undoEntries.slice(-5).forEach((entry, index) => {
|
|
64
|
+
console.log(` ${index + 1}. ${entry.action || 'Action'} (${entry.timestamp})`);
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
async function saveState(session) {
|
|
69
|
+
const { engine, rl } = session;
|
|
70
|
+
return new Promise((resolve) => {
|
|
71
|
+
rl.question('Enter filename to save (or press Enter for default): ', async (filename) => {
|
|
72
|
+
const saveFile = filename || 'qnce-save.json';
|
|
73
|
+
try {
|
|
74
|
+
const serializedState = await engine.saveState({
|
|
75
|
+
includeFlowEvents: true
|
|
76
|
+
});
|
|
77
|
+
require('fs').writeFileSync(saveFile, JSON.stringify(serializedState, null, 2));
|
|
78
|
+
console.log(`✅ State saved to ${saveFile}`);
|
|
79
|
+
}
|
|
80
|
+
catch (error) {
|
|
81
|
+
console.error('❌ Failed to save state:', error?.message || error);
|
|
82
|
+
}
|
|
83
|
+
resolve();
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
async function loadState(session) {
|
|
88
|
+
const { engine, rl } = session;
|
|
89
|
+
return new Promise((resolve) => {
|
|
90
|
+
rl.question('Enter filename to load (or press Enter for default): ', async (filename) => {
|
|
91
|
+
const loadFile = filename || 'qnce-save.json';
|
|
92
|
+
try {
|
|
93
|
+
const data = (0, fs_1.readFileSync)(loadFile, 'utf-8');
|
|
94
|
+
const serializedState = JSON.parse(data);
|
|
95
|
+
await engine.loadState(serializedState);
|
|
96
|
+
console.log(`✅ State loaded from ${loadFile}`);
|
|
97
|
+
displayNode(session);
|
|
98
|
+
}
|
|
99
|
+
catch (error) {
|
|
100
|
+
console.error('❌ Failed to load state:', error?.message || error);
|
|
101
|
+
}
|
|
102
|
+
resolve();
|
|
103
|
+
});
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
function handleCommand(session, input) {
|
|
107
|
+
const { engine } = session;
|
|
108
|
+
const choices = engine.getAvailableChoices();
|
|
109
|
+
return new Promise((resolve) => {
|
|
110
|
+
const command = input.trim().toLowerCase();
|
|
111
|
+
// Handle numeric choices
|
|
112
|
+
const choiceNumber = parseInt(command);
|
|
113
|
+
if (!isNaN(choiceNumber) && choiceNumber >= 1 && choiceNumber <= choices.length) {
|
|
114
|
+
const selectedChoice = choices[choiceNumber - 1];
|
|
115
|
+
engine.selectChoice(selectedChoice);
|
|
116
|
+
displayNode(session);
|
|
117
|
+
resolve(false);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
// Handle text commands
|
|
121
|
+
switch (command) {
|
|
122
|
+
case 'u':
|
|
123
|
+
case 'undo':
|
|
124
|
+
const undoResult = engine.undo();
|
|
125
|
+
if (undoResult.success) {
|
|
126
|
+
console.log(`✅ Undid: ${undoResult.entry?.action || 'action'}`);
|
|
127
|
+
displayNode(session);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
console.log('❌ Nothing to undo');
|
|
131
|
+
}
|
|
132
|
+
resolve(false);
|
|
133
|
+
break;
|
|
134
|
+
case 'r':
|
|
135
|
+
case 'redo':
|
|
136
|
+
const redoResult = engine.redo();
|
|
137
|
+
if (redoResult.success) {
|
|
138
|
+
console.log(`✅ Redid: ${redoResult.entry?.action || 'action'}`);
|
|
139
|
+
displayNode(session);
|
|
140
|
+
}
|
|
141
|
+
else {
|
|
142
|
+
console.log('❌ Nothing to redo');
|
|
143
|
+
}
|
|
144
|
+
resolve(false);
|
|
145
|
+
break;
|
|
146
|
+
case 'h':
|
|
147
|
+
case 'help':
|
|
148
|
+
displayHelp();
|
|
149
|
+
resolve(false);
|
|
150
|
+
break;
|
|
151
|
+
case 'f':
|
|
152
|
+
case 'flags':
|
|
153
|
+
displayFlags(session);
|
|
154
|
+
resolve(false);
|
|
155
|
+
break;
|
|
156
|
+
case 'hist':
|
|
157
|
+
displayHistory(session);
|
|
158
|
+
resolve(false);
|
|
159
|
+
break;
|
|
160
|
+
case 's':
|
|
161
|
+
case 'save':
|
|
162
|
+
saveState(session).then(() => resolve(false));
|
|
163
|
+
break;
|
|
164
|
+
case 'l':
|
|
165
|
+
case 'load':
|
|
166
|
+
loadState(session).then(() => resolve(false));
|
|
167
|
+
break;
|
|
168
|
+
case 'q':
|
|
169
|
+
case 'quit':
|
|
170
|
+
console.log('👋 Thanks for playing!');
|
|
171
|
+
resolve(true);
|
|
172
|
+
break;
|
|
173
|
+
default:
|
|
174
|
+
console.log('❓ Unknown command. Type "help" for available commands.');
|
|
175
|
+
resolve(false);
|
|
176
|
+
break;
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
async function startInteractiveSession(session) {
|
|
181
|
+
const { rl } = session;
|
|
182
|
+
console.log('🎮 QNCE Interactive Session Started');
|
|
183
|
+
console.log('Type "help" for available commands');
|
|
184
|
+
// Configure undo/redo and autosave
|
|
185
|
+
session.engine.configureUndoRedo({
|
|
186
|
+
enabled: true,
|
|
187
|
+
maxUndoEntries: 100,
|
|
188
|
+
maxRedoEntries: 50
|
|
189
|
+
});
|
|
190
|
+
session.engine.configureAutosave({
|
|
191
|
+
enabled: true,
|
|
192
|
+
triggers: ['choice', 'flag-change'],
|
|
193
|
+
throttleMs: 100,
|
|
194
|
+
maxEntries: 20,
|
|
195
|
+
includeMetadata: true
|
|
196
|
+
});
|
|
197
|
+
displayNode(session);
|
|
198
|
+
const promptUser = async () => {
|
|
199
|
+
return new Promise((resolve) => {
|
|
200
|
+
rl.question('\n> ', async (input) => {
|
|
201
|
+
const shouldQuit = await handleCommand(session, input);
|
|
202
|
+
if (shouldQuit) {
|
|
203
|
+
rl.close();
|
|
204
|
+
resolve();
|
|
205
|
+
}
|
|
206
|
+
else {
|
|
207
|
+
await promptUser();
|
|
208
|
+
resolve();
|
|
209
|
+
}
|
|
210
|
+
});
|
|
211
|
+
});
|
|
212
|
+
};
|
|
213
|
+
await promptUser();
|
|
214
|
+
}
|
|
215
|
+
function main() {
|
|
216
|
+
const args = process.argv.slice(2);
|
|
217
|
+
if (args.includes('--help') || args.includes('-h')) {
|
|
218
|
+
console.log('QNCE Interactive CLI');
|
|
219
|
+
console.log('Usage: qnce-play [story-file.json]');
|
|
220
|
+
console.log('');
|
|
221
|
+
console.log('If no story file is provided, the demo story will be used.');
|
|
222
|
+
console.log('');
|
|
223
|
+
console.log('Commands during play:');
|
|
224
|
+
displayHelp();
|
|
225
|
+
return;
|
|
226
|
+
}
|
|
227
|
+
let storyData;
|
|
228
|
+
const storyFile = args[0];
|
|
229
|
+
if (storyFile) {
|
|
230
|
+
try {
|
|
231
|
+
console.log(`📖 Loading story: ${storyFile}`);
|
|
232
|
+
const jsonData = JSON.parse((0, fs_1.readFileSync)(storyFile, 'utf-8'));
|
|
233
|
+
storyData = (0, core_js_1.loadStoryData)(jsonData);
|
|
234
|
+
}
|
|
235
|
+
catch (error) {
|
|
236
|
+
console.error(`❌ Failed to load story file: ${error?.message || error}`);
|
|
237
|
+
process.exit(1);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
else {
|
|
241
|
+
console.log('📖 Using demo story');
|
|
242
|
+
storyData = demo_story_js_1.DEMO_STORY;
|
|
243
|
+
}
|
|
244
|
+
const engine = (0, core_js_1.createQNCEEngine)(storyData);
|
|
245
|
+
const rl = (0, readline_1.createInterface)({
|
|
246
|
+
input: process.stdin,
|
|
247
|
+
output: process.stdout
|
|
248
|
+
});
|
|
249
|
+
const session = { engine, rl };
|
|
250
|
+
startInteractiveSession(session).catch((error) => {
|
|
251
|
+
console.error('❌ Session error:', error.message);
|
|
252
|
+
process.exit(1);
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
// Run if called directly
|
|
256
|
+
if (process.argv[1] && process.argv[1].endsWith('play.js')) {
|
|
257
|
+
main();
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=play.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"play.js","sourceRoot":"","sources":["../../src/cli/play.ts"],"names":[],"mappings":";;;AAkTiB,+BAAe;AAhThC,2BAAkC;AAClC,uCAA2C;AAC3C,+CAAoE;AACpE,2DAAqD;AAarD,SAAS,WAAW,CAAC,OAA2B;IAC9C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,WAAW,GAAG,MAAM,CAAC,cAAc,EAAE,CAAC;IAC5C,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAE7C,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IACnC,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC,CAAC;IAE5B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC,CAAC;QAC1B,OAAO,CAAC,OAAO,CAAC,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;YAChC,OAAO,CAAC,GAAG,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;QAC9C,CAAC,CAAC,CAAC;IACL,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,CAAC;IACpC,CAAC;IAED,wBAAwB;IACxB,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;IACxC,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,EAAE,CAAC;IACxC,OAAO,CAAC,GAAG,CAAC,WAAW,SAAS,sBAAsB,SAAS,YAAY,CAAC,CAAC;AAC/E,CAAC;AAED,SAAS,WAAW;IAClB,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;IAC3B,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,4BAA4B,CAAC,CAAC;IAC1C,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;IAC5C,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;IAC9C,OAAO,CAAC,GAAG,CAAC,kCAAkC,CAAC,CAAC;IAChD,OAAO,CAAC,GAAG,CAAC,8BAA8B,CAAC,CAAC;AAC9C,CAAC;AAED,SAAS,YAAY,CAAC,OAA2B;IAC/C,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,KAAK,GAAG,MAAM,CAAC,QAAQ,EAAE,CAAC,KAAK,CAAC;IAEtC,OAAO,CAAC,GAAG,CAAC,yBAAyB,CAAC,CAAC;IACvC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;IAC9B,CAAC;SAAM,CAAC;QACN,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE;YAC7C,OAAO,CAAC,GAAG,CAAC,GAAG,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAClD,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,OAA2B;IACjD,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,iBAAiB,EAAE,CAAC;IAE3C,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;IACzC,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAC3D,OAAO,CAAC,GAAG,CAAC,iBAAiB,OAAO,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;IAE3D,IAAI,OAAO,CAAC,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACnC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QACtC,OAAO,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;YACrD,OAAO,CAAC,GAAG,CAAC,KAAK,KAAK,GAAG,CAAC,KAAK,KAAK,CAAC,MAAM,IAAI,QAAQ,KAAK,KAAK,CAAC,SAAS,GAAG,CAAC,CAAC;QAClF,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAA2B;IAClD,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAE/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,uDAAuD,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YACtF,MAAM,QAAQ,GAAG,QAAQ,IAAI,gBAAgB,CAAC;YAE9C,IAAI,CAAC;gBACH,MAAM,eAAe,GAAG,MAAM,MAAM,CAAC,SAAS,CAAC;oBAC7C,iBAAiB,EAAE,IAAI;iBACxB,CAAC,CAAC;gBAEH,OAAO,CAAC,IAAI,CAAC,CAAC,aAAa,CAAC,QAAQ,EAAE,IAAI,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;gBAChF,OAAO,CAAC,GAAG,CAAC,oBAAoB,QAAQ,EAAE,CAAC,CAAC;YAC9C,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;YACpE,CAAC;YAED,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,SAAS,CAAC,OAA2B;IAClD,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAE/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,EAAE,CAAC,QAAQ,CAAC,uDAAuD,EAAE,KAAK,EAAE,QAAQ,EAAE,EAAE;YACtF,MAAM,QAAQ,GAAG,QAAQ,IAAI,gBAAgB,CAAC;YAE9C,IAAI,CAAC;gBACH,MAAM,IAAI,GAAG,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;gBAC7C,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;gBAEzC,MAAM,MAAM,CAAC,SAAS,CAAC,eAAe,CAAC,CAAC;gBACxC,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,EAAE,CAAC,CAAC;gBAC/C,WAAW,CAAC,OAAO,CAAC,CAAC;YACvB,CAAC;YAAC,OAAO,KAAU,EAAE,CAAC;gBACpB,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,EAAE,OAAO,IAAI,KAAK,CAAC,CAAC;YACpE,CAAC;YAED,OAAO,EAAE,CAAC;QACZ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC;AAED,SAAS,aAAa,CAAC,OAA2B,EAAE,KAAa;IAC/D,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC;IAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,mBAAmB,EAAE,CAAC;IAE7C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QAE3C,yBAAyB;QACzB,MAAM,YAAY,GAAG,QAAQ,CAAC,OAAO,CAAC,CAAC;QACvC,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,YAAY,IAAI,CAAC,IAAI,YAAY,IAAI,OAAO,CAAC,MAAM,EAAE,CAAC;YAChF,MAAM,cAAc,GAAG,OAAO,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;YACjD,MAAM,CAAC,YAAY,CAAC,cAAc,CAAC,CAAC;YACpC,WAAW,CAAC,OAAO,CAAC,CAAC;YACrB,OAAO,CAAC,KAAK,CAAC,CAAC;YACf,OAAO;QACT,CAAC;QAED,uBAAuB;QACvB,QAAQ,OAAO,EAAE,CAAC;YAChB,KAAK,GAAG,CAAC;YACT,KAAK,MAAM;gBACT,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;oBACvB,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,CAAC,KAAK,EAAE,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;oBAChE,WAAW,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;gBACnC,CAAC;gBACD,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,MAAM;YAER,KAAK,GAAG,CAAC;YACT,KAAK,MAAM;gBACT,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC;gBACjC,IAAI,UAAU,CAAC,OAAO,EAAE,CAAC;oBACvB,OAAO,CAAC,GAAG,CAAC,YAAY,UAAU,CAAC,KAAK,EAAE,MAAM,IAAI,QAAQ,EAAE,CAAC,CAAC;oBAChE,WAAW,CAAC,OAAO,CAAC,CAAC;gBACvB,CAAC;qBAAM,CAAC;oBACN,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;gBACnC,CAAC;gBACD,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,MAAM;YAER,KAAK,GAAG,CAAC;YACT,KAAK,MAAM;gBACT,WAAW,EAAE,CAAC;gBACd,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,MAAM;YAER,KAAK,GAAG,CAAC;YACT,KAAK,OAAO;gBACV,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,MAAM;YAER,KAAK,MAAM;gBACT,cAAc,CAAC,OAAO,CAAC,CAAC;gBACxB,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,MAAM;YAER,KAAK,GAAG,CAAC;YACT,KAAK,MAAM;gBACT,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC9C,MAAM;YAER,KAAK,GAAG,CAAC;YACT,KAAK,MAAM;gBACT,SAAS,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC;gBAC9C,MAAM;YAER,KAAK,GAAG,CAAC;YACT,KAAK,MAAM;gBACT,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;gBACtC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACd,MAAM;YAER;gBACE,OAAO,CAAC,GAAG,CAAC,wDAAwD,CAAC,CAAC;gBACtE,OAAO,CAAC,KAAK,CAAC,CAAC;gBACf,MAAM;QACV,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC;AAED,KAAK,UAAU,uBAAuB,CAAC,OAA2B;IAChE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC;IAEvB,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;IAElD,mCAAmC;IACnC,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAC/B,OAAO,EAAE,IAAI;QACb,cAAc,EAAE,GAAG;QACnB,cAAc,EAAE,EAAE;KACnB,CAAC,CAAC;IAEH,OAAO,CAAC,MAAM,CAAC,iBAAiB,CAAC;QAC/B,OAAO,EAAE,IAAI;QACb,QAAQ,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC;QACnC,UAAU,EAAE,GAAG;QACf,UAAU,EAAE,EAAE;QACd,eAAe,EAAE,IAAI;KACtB,CAAC,CAAC;IAEH,WAAW,CAAC,OAAO,CAAC,CAAC;IAErB,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;QAC3C,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,EAAE;gBAClC,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBACvD,IAAI,UAAU,EAAE,CAAC;oBACf,EAAE,CAAC,KAAK,EAAE,CAAC;oBACX,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,CAAC;oBACN,MAAM,UAAU,EAAE,CAAC;oBACnB,OAAO,EAAE,CAAC;gBACZ,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,UAAU,EAAE,CAAC;AACrB,CAAC;AAED,SAAS,IAAI;IACX,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IAEnC,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACnD,OAAO,CAAC,GAAG,CAAC,sBAAsB,CAAC,CAAC;QACpC,OAAO,CAAC,GAAG,CAAC,oCAAoC,CAAC,CAAC;QAClD,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,4DAA4D,CAAC,CAAC;QAC1E,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAChB,OAAO,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAC;QACrC,WAAW,EAAE,CAAC;QACd,OAAO;IACT,CAAC;IAED,IAAI,SAAS,CAAC;IACd,MAAM,SAAS,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;IAE1B,IAAI,SAAS,EAAE,CAAC;QACd,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,qBAAqB,SAAS,EAAE,CAAC,CAAC;YAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC;YAC9D,SAAS,GAAG,IAAA,uBAAa,EAAC,QAAQ,CAAC,CAAC;QACtC,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,gCAAgC,KAAK,EAAE,OAAO,IAAI,KAAK,EAAE,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;SAAM,CAAC;QACN,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,CAAC;QACnC,SAAS,GAAG,0BAAU,CAAC;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,IAAA,0BAAgB,EAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,EAAE,GAAG,IAAA,0BAAe,EAAC;QACzB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,MAAM,EAAE,OAAO,CAAC,MAAM;KACvB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAuB,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;IAEnD,uBAAuB,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QAC/C,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;QACjD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yBAAyB;AACzB,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;IAC3D,IAAI,EAAE,CAAC;AACT,CAAC"}
|