qnce-engine 0.1.0 โ 1.2.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/README.md +248 -0
- 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 +219 -0
- package/dist/cli/perf.js.map +1 -0
- package/dist/engine/core.d.ts +104 -8
- package/dist/engine/core.d.ts.map +1 -1
- package/dist/engine/core.js +288 -7
- package/dist/engine/core.js.map +1 -1
- package/dist/engine/demo-story.js +4 -1
- package/dist/engine/demo-story.js.map +1 -1
- package/dist/index.js +24 -3
- package/dist/index.js.map +1 -1
- 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/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 +107 -0
- package/dist/performance/HotReloadDelta.d.ts.map +1 -0
- package/dist/performance/HotReloadDelta.js +333 -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/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/branching-advanced-demo.ts +339 -0
- package/examples/branching-quickstart.ts +314 -0
- package/examples/quickstart-demo.js +82 -0
- package/package.json +21 -8
package/README.md
CHANGED
|
@@ -2,20 +2,56 @@
|
|
|
2
2
|
|
|
3
3
|
**Quantum Narrative Convergence Engine** - A framework-agnostic TypeScript library for creating interactive narrative experiences with quantum-inspired mechanics.
|
|
4
4
|
|
|
5
|
+
> **๐ NEW in v1.2.0:** Advanced Branching API with AI integration, dynamic content management, and comprehensive analytics. Plus enterprise-grade performance optimization.
|
|
6
|
+
|
|
5
7
|
## Core Concepts
|
|
6
8
|
|
|
7
9
|
- **Superposition:** Multiple narrative outcomes exist simultaneously until a choice is made
|
|
8
10
|
- **Collapse:** Player choices "collapse" the narrative to a specific path, updating state and flags
|
|
9
11
|
- **Entanglement:** Early decisions affect later outcomes, enabling complex, interconnected stories
|
|
10
12
|
|
|
13
|
+
## โจ Advanced Features (v1.2.0)
|
|
14
|
+
|
|
15
|
+
### ๐ฟ Advanced Branching System
|
|
16
|
+
- **Multi-path narratives** with conditional logic and flag-based branching
|
|
17
|
+
- **AI-driven content generation** for dynamic story expansion
|
|
18
|
+
- **Real-time branch insertion/removal** for live content updates
|
|
19
|
+
- **Comprehensive analytics** for narrative optimization
|
|
20
|
+
|
|
21
|
+
### โก Performance Infrastructure
|
|
22
|
+
- **๐โโ๏ธ Object Pooling:** 90%+ allocation reduction, eliminating GC pressure
|
|
23
|
+
- **๐งต Background Processing:** Non-blocking cache preloading and telemetry writes
|
|
24
|
+
- **๐ฅ Hot-Reload:** <3.5ms live story updates with delta patching
|
|
25
|
+
- **๐ Real-time Profiling:** Comprehensive event instrumentation and analysis
|
|
26
|
+
- **๐ฅ๏ธ Live Monitoring:** `qnce-perf` CLI dashboard with performance alerts
|
|
27
|
+
|
|
28
|
+
### Performance Dashboard
|
|
29
|
+
```bash
|
|
30
|
+
# Real-time performance monitoring
|
|
31
|
+
qnce-perf dashboard
|
|
32
|
+
|
|
33
|
+
# Live monitoring with updates
|
|
34
|
+
qnce-perf live 1000
|
|
35
|
+
|
|
36
|
+
# Export performance data
|
|
37
|
+
qnce-perf export > performance-report.json
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**[๐ Complete Performance Guide โ](docs/PERFORMANCE.md)**
|
|
41
|
+
|
|
11
42
|
## Installation
|
|
12
43
|
|
|
13
44
|
```bash
|
|
14
45
|
npm install qnce-engine
|
|
46
|
+
|
|
47
|
+
# Global CLI installation for performance monitoring
|
|
48
|
+
npm install -g qnce-engine
|
|
15
49
|
```
|
|
16
50
|
|
|
17
51
|
## Quick Start
|
|
18
52
|
|
|
53
|
+
### Basic Usage
|
|
54
|
+
|
|
19
55
|
```typescript
|
|
20
56
|
import { createQNCEEngine, DEMO_STORY } from 'qnce-engine';
|
|
21
57
|
|
|
@@ -40,6 +76,190 @@ const flags = engine.getFlags();
|
|
|
40
76
|
console.log('Current flags:', flags);
|
|
41
77
|
```
|
|
42
78
|
|
|
79
|
+
### Performance Mode (Recommended for Production)
|
|
80
|
+
|
|
81
|
+
```typescript
|
|
82
|
+
import { createQNCEEngine, DEMO_STORY } from 'qnce-engine';
|
|
83
|
+
|
|
84
|
+
// Enable performance optimizations
|
|
85
|
+
const engine = createQNCEEngine(DEMO_STORY, {}, true, {
|
|
86
|
+
maxWorkers: 4,
|
|
87
|
+
enableProfiling: true
|
|
88
|
+
});
|
|
89
|
+
|
|
90
|
+
// Background cache preloading happens automatically
|
|
91
|
+
// Object pooling reduces memory allocations by 90%+
|
|
92
|
+
// Performance events are collected for monitoring
|
|
93
|
+
|
|
94
|
+
// Get performance statistics
|
|
95
|
+
const poolStats = engine.getPoolStats();
|
|
96
|
+
console.log(`Pool efficiency: ${poolStats.flow.hitRate}%`);
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
### Live Performance Monitoring
|
|
100
|
+
|
|
101
|
+
```bash
|
|
102
|
+
# Real-time performance dashboard
|
|
103
|
+
qnce-perf dashboard
|
|
104
|
+
|
|
105
|
+
# Live monitoring with updates every 2 seconds
|
|
106
|
+
qnce-perf live
|
|
107
|
+
|
|
108
|
+
# Export performance data
|
|
109
|
+
qnce-perf export > performance-report.json
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## ๐ฟ Advanced Branching & AI Integration
|
|
113
|
+
|
|
114
|
+
### Basic Branching
|
|
115
|
+
|
|
116
|
+
```typescript
|
|
117
|
+
import { createQNCEEngine, createBranchingEngine } from 'qnce-engine';
|
|
118
|
+
|
|
119
|
+
// Create core engine
|
|
120
|
+
const engine = createQNCEEngine(storyData);
|
|
121
|
+
|
|
122
|
+
// Enable advanced branching
|
|
123
|
+
const branchingEngine = engine.enableBranching(advancedStoryData);
|
|
124
|
+
|
|
125
|
+
// Evaluate available branches
|
|
126
|
+
const branches = await branchingEngine.evaluateAvailableBranches();
|
|
127
|
+
console.log(`Available paths: ${branches.length}`);
|
|
128
|
+
|
|
129
|
+
// Execute a narrative branch
|
|
130
|
+
await branchingEngine.executeBranch(branches[0].id);
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
### AI-Driven Content Generation
|
|
134
|
+
|
|
135
|
+
```typescript
|
|
136
|
+
// Set AI context for personalized content
|
|
137
|
+
branchingEngine.setAIContext({
|
|
138
|
+
playerProfile: {
|
|
139
|
+
playStyle: 'explorer',
|
|
140
|
+
preferences: { adventure: 0.8, mystery: 0.6 },
|
|
141
|
+
historicalChoices: ['brave-path', 'investigate-clue']
|
|
142
|
+
},
|
|
143
|
+
narrativeContext: {
|
|
144
|
+
currentTone: 'mysterious',
|
|
145
|
+
thematicElements: ['exploration', 'discovery'],
|
|
146
|
+
plotTension: 0.7
|
|
147
|
+
}
|
|
148
|
+
});
|
|
149
|
+
|
|
150
|
+
// Generate AI-enhanced branches
|
|
151
|
+
const aiBranches = await branchingEngine.generateAIBranches(3);
|
|
152
|
+
console.log('AI-generated options:', aiBranches.map(b => b.displayText));
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
### Dynamic Content Management
|
|
156
|
+
|
|
157
|
+
```typescript
|
|
158
|
+
// Insert new branch at runtime
|
|
159
|
+
const dynamicBranch = {
|
|
160
|
+
type: 'insert',
|
|
161
|
+
branchId: 'special-event',
|
|
162
|
+
targetLocation: { chapterId: 'main', nodeId: 'crossroads' },
|
|
163
|
+
payload: {
|
|
164
|
+
name: 'Special Event',
|
|
165
|
+
branchOptions: [{
|
|
166
|
+
id: 'event-choice',
|
|
167
|
+
displayText: 'Investigate the mysterious sound',
|
|
168
|
+
flagEffects: { event_discovered: true }
|
|
169
|
+
}]
|
|
170
|
+
}
|
|
171
|
+
};
|
|
172
|
+
|
|
173
|
+
await branchingEngine.insertDynamicBranch(dynamicBranch);
|
|
174
|
+
|
|
175
|
+
// Remove branch when no longer needed
|
|
176
|
+
await branchingEngine.removeDynamicBranch('special-event');
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Analytics & Monitoring
|
|
180
|
+
|
|
181
|
+
```typescript
|
|
182
|
+
// Get branching analytics
|
|
183
|
+
const analytics = branchingEngine.getBranchingAnalytics();
|
|
184
|
+
console.log(`Branches traversed: ${analytics.totalBranchesTraversed}`);
|
|
185
|
+
console.log(`Popular choices: ${analytics.mostPopularBranches}`);
|
|
186
|
+
|
|
187
|
+
// Export comprehensive data
|
|
188
|
+
const exportData = branchingEngine.exportBranchingData();
|
|
189
|
+
// Contains: story structure, session data, player behavior, performance metrics
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
### Live Performance Monitoring
|
|
193
|
+
|
|
194
|
+
```bash
|
|
195
|
+
# Real-time performance dashboard
|
|
196
|
+
qnce-perf dashboard
|
|
197
|
+
|
|
198
|
+
# Live monitoring with updates every 2 seconds
|
|
199
|
+
qnce-perf live
|
|
200
|
+
|
|
201
|
+
# Export performance data
|
|
202
|
+
qnce-perf export > performance-report.json
|
|
203
|
+
```
|
|
204
|
+
|
|
205
|
+
## ๐ Performance Guide
|
|
206
|
+
|
|
207
|
+
QNCE v1.2.0-sprint2 includes advanced performance infrastructure for production applications.
|
|
208
|
+
|
|
209
|
+
### Performance Benchmarks
|
|
210
|
+
|
|
211
|
+
| Feature | Performance Gain | Impact |
|
|
212
|
+
|---------|-----------------|--------|
|
|
213
|
+
| Object Pooling | 90%+ allocation reduction | Eliminates GC hitches |
|
|
214
|
+
| Hot-Reload | 68% improvement (3.35ms) | Near-instant story updates |
|
|
215
|
+
| Background Processing | Non-blocking operations | Smooth user experience |
|
|
216
|
+
| Performance Monitoring | Real-time metrics | Production visibility |
|
|
217
|
+
|
|
218
|
+
### CLI Performance Dashboard
|
|
219
|
+
|
|
220
|
+
```bash
|
|
221
|
+
# Install CLI globally
|
|
222
|
+
npm install -g qnce-engine
|
|
223
|
+
|
|
224
|
+
# Real-time performance monitoring
|
|
225
|
+
qnce-perf live
|
|
226
|
+
|
|
227
|
+
# Performance dashboard output:
|
|
228
|
+
๐ QNCE Performance Dashboard
|
|
229
|
+
=====================================
|
|
230
|
+
๐ Session Duration: 45.2s
|
|
231
|
+
๐ข Total Events: 1,247
|
|
232
|
+
|
|
233
|
+
๐พ Cache Performance:
|
|
234
|
+
โ
Hit Rate: 92.3% (threshold: 80%)
|
|
235
|
+
โ
Avg Cache Time: 0.8ms (threshold: 50ms)
|
|
236
|
+
|
|
237
|
+
๐ฅ Hot-Reload Performance:
|
|
238
|
+
โ ๏ธ Avg Time: 3.35ms (threshold: 2ms)
|
|
239
|
+
๐ Max Time: 4.1ms
|
|
240
|
+
๐ Total Reloads: 12
|
|
241
|
+
|
|
242
|
+
๐งต ThreadPool Status:
|
|
243
|
+
๐ Completed Jobs: 445
|
|
244
|
+
โณ Queued Jobs: 3
|
|
245
|
+
๐ Active Workers: 2
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
### Performance Mode Usage
|
|
249
|
+
|
|
250
|
+
```typescript
|
|
251
|
+
// Enable all performance optimizations
|
|
252
|
+
const engine = createQNCEEngine(storyData, {}, true, {
|
|
253
|
+
maxWorkers: 4, // Background processing
|
|
254
|
+
enableProfiling: true // Performance monitoring
|
|
255
|
+
});
|
|
256
|
+
|
|
257
|
+
// Object pooling and background caching happen automatically
|
|
258
|
+
// Monitor performance in real-time with CLI dashboard
|
|
259
|
+
```
|
|
260
|
+
|
|
261
|
+
**๐ Complete Performance Guide:** [docs/PERFORMANCE_GUIDE.md](docs/PERFORMANCE_GUIDE.md)
|
|
262
|
+
|
|
43
263
|
## Core API
|
|
44
264
|
|
|
45
265
|
### QNCEEngine Class
|
|
@@ -190,6 +410,34 @@ async function playStory() {
|
|
|
190
410
|
}
|
|
191
411
|
```
|
|
192
412
|
|
|
413
|
+
## ๐ Examples & Demos
|
|
414
|
+
|
|
415
|
+
The repository includes comprehensive examples demonstrating all features:
|
|
416
|
+
|
|
417
|
+
### ๐ Quickstart Example
|
|
418
|
+
- **File:** `examples/branching-quickstart.ts`
|
|
419
|
+
- **Features:** Basic branching, AI integration, dynamic operations
|
|
420
|
+
- **Run:** `npm run build && node dist/examples/branching-quickstart.js`
|
|
421
|
+
|
|
422
|
+
### ๐ญ Advanced Demo
|
|
423
|
+
- **File:** `examples/branching-advanced-demo.ts`
|
|
424
|
+
- **Features:** Complex narrative flows, conditional branching, analytics
|
|
425
|
+
- **Story:** "The Mysterious Library" - Interactive mystery with multiple paths
|
|
426
|
+
|
|
427
|
+
### ๐งช Validation Scripts
|
|
428
|
+
- **Real-world testing:** `scripts/validation-real-world.ts`
|
|
429
|
+
- **Comprehensive testing:** `scripts/validation-comprehensive.ts`
|
|
430
|
+
|
|
431
|
+
```bash
|
|
432
|
+
# Run the quickstart example
|
|
433
|
+
npm run build
|
|
434
|
+
node dist/examples/branching-quickstart.js
|
|
435
|
+
|
|
436
|
+
# Run validation tests
|
|
437
|
+
npm run build
|
|
438
|
+
node dist/scripts/validation-real-world.js
|
|
439
|
+
```
|
|
440
|
+
|
|
193
441
|
## Development
|
|
194
442
|
|
|
195
443
|
```bash
|
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":";;;AAEA,2BAAkC;AAClC,+CAAkD;AAElD;;;GAGG;AAEH,SAAS,UAAU,CAAC,QAAgB;IAClC,IAAI,CAAC;QACH,OAAO,CAAC,GAAG,CAAC,2BAA2B,QAAQ,EAAE,CAAC,CAAC;QAEnD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAA,iBAAY,EAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,CAAC;QAC7D,MAAM,SAAS,GAAG,IAAA,uBAAa,EAAC,QAAQ,CAAC,CAAC;QAE1C,mBAAmB;QACnB,OAAO,CAAC,GAAG,CAAC,qBAAqB,SAAS,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC;QACjE,OAAO,CAAC,GAAG,CAAC,oBAAoB,SAAS,CAAC,aAAa,EAAE,CAAC,CAAC;QAE3D,0BAA0B;QAC1B,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACxD,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;QAExC,SAAS,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;YAC7B,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;gBAC5B,aAAa,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;QAEH,iBAAiB;QACjB,MAAM,QAAQ,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QAC3E,OAAO,CAAC,GAAG,CAAC,uBAAuB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QACtD,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,EAAE,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC;QAEzF,+BAA+B;QAC/B,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;QAC9E,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,OAAO,CAAC,GAAG,CAAC,6BAA6B,CAAC,CAAC;YAC3C,YAAY,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,CAAC;QACxD,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;QAED,yBAAyB;QACzB,MAAM,YAAY,GAAG,IAAI,GAAG,EAAU,CAAC;QACvC,MAAM,OAAO,GAAG,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC;QAE1C,OAAO,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC1B,MAAM,SAAS,GAAG,OAAO,CAAC,GAAG,EAAG,CAAC;YACjC,IAAI,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC;gBAAE,SAAS;YAE1C,YAAY,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;YAC5B,MAAM,IAAI,GAAG,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC;YAC3D,IAAI,IAAI,EAAE,CAAC;gBACT,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;oBAC5B,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,UAAU,CAAC,EAAE,CAAC;wBACzC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;oBAClC,CAAC;gBACH,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAED,MAAM,gBAAgB,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;QACpF,IAAI,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAChC,OAAO,CAAC,GAAG,CAAC,gCAAgC,gBAAgB,CAAC,MAAM,EAAE,CAAC,CAAC;YACvE,gBAAgB,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;QACnE,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,GAAG,CAAC,2BAA2B,CAAC,CAAC;QAC3C,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IAEnC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,yBAAyB,EAAE,KAAK,CAAC,CAAC;QAChD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;AACH,CAAC;AAED,kBAAkB;AAClB,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjC,IAAI,CAAC,QAAQ,EAAE,CAAC;IACd,OAAO,CAAC,GAAG,CAAC,qCAAqC,CAAC,CAAC;IACnD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC;AAED,UAAU,CAAC,QAAQ,CAAC,CAAC"}
|
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;AAUD;;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;AA6ED,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,aAAa,EAAE,aAAa,EAAE,CAAC"}
|
package/dist/cli/perf.js
ADDED
|
@@ -0,0 +1,219 @@
|
|
|
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
|
+
case 'export':
|
|
169
|
+
case 'json':
|
|
170
|
+
exportSummary();
|
|
171
|
+
break;
|
|
172
|
+
case 'reset':
|
|
173
|
+
case 'clear':
|
|
174
|
+
resetCounters();
|
|
175
|
+
break;
|
|
176
|
+
case 'help':
|
|
177
|
+
case '--help':
|
|
178
|
+
case '-h':
|
|
179
|
+
console.log(`
|
|
180
|
+
๐ QNCE Performance CLI
|
|
181
|
+
|
|
182
|
+
Usage: qnce-perf [command] [options]
|
|
183
|
+
|
|
184
|
+
Commands:
|
|
185
|
+
dashboard, dash Show performance dashboard (default)
|
|
186
|
+
live, monitor Start live monitoring mode
|
|
187
|
+
export, json Export performance data as JSON
|
|
188
|
+
reset, clear Reset performance counters
|
|
189
|
+
help Show this help
|
|
190
|
+
|
|
191
|
+
Options:
|
|
192
|
+
--interval <ms> Monitoring interval for live mode (default: 2000ms)
|
|
193
|
+
|
|
194
|
+
Examples:
|
|
195
|
+
qnce-perf dashboard
|
|
196
|
+
qnce-perf live 1000
|
|
197
|
+
qnce-perf export > performance-report.json
|
|
198
|
+
qnce-perf reset
|
|
199
|
+
|
|
200
|
+
Performance Thresholds:
|
|
201
|
+
Cache Hit Time: < 50ms
|
|
202
|
+
Cache Hit Rate: > 80%
|
|
203
|
+
Hot-Reload Time: < 2ms (S2-T3 target)
|
|
204
|
+
State Transition: < 10ms
|
|
205
|
+
Event Backlog: < 1000 events
|
|
206
|
+
`);
|
|
207
|
+
break;
|
|
208
|
+
default:
|
|
209
|
+
console.error(`โ Unknown command: ${command}`);
|
|
210
|
+
console.log('Run "qnce-perf help" for usage information');
|
|
211
|
+
process.exit(1);
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
// Run if called directly (ES module compatible)
|
|
215
|
+
const isMainModule = require.main === module;
|
|
216
|
+
if (isMainModule) {
|
|
217
|
+
main();
|
|
218
|
+
}
|
|
219
|
+
//# 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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"}
|