qnce-engine 1.2.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 +713 -7
- package/dist/cli/audit.js +0 -0
- package/dist/cli/init.js +0 -0
- package/dist/cli/perf.d.ts.map +1 -1
- package/dist/cli/perf.js +2 -1
- package/dist/cli/perf.js.map +1 -1
- 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 +274 -3
- package/dist/engine/core.d.ts.map +1 -1
- package/dist/engine/core.js +1148 -9
- package/dist/engine/core.js.map +1 -1
- package/dist/engine/demo-story.d.ts.map +1 -1
- package/dist/engine/demo-story.js +99 -13
- 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 +12 -1
- 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.js +3 -3
- package/dist/narrative/branching/engine-simple.js.map +1 -1
- 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/models.d.ts.map +1 -1
- package/dist/performance/HotReloadDelta.d.ts +25 -8
- package/dist/performance/HotReloadDelta.d.ts.map +1 -1
- package/dist/performance/HotReloadDelta.js +10 -15
- package/dist/performance/HotReloadDelta.js.map +1 -1
- 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/examples/autosave-undo-demo.ts +306 -0
- package/examples/branching-demo-simple.ts +0 -0
- package/examples/branching-demo.ts +0 -0
- package/examples/persistence-demo.ts +84 -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 +23 -3
package/dist/cli/audit.js
CHANGED
|
File without changes
|
package/dist/cli/init.js
CHANGED
|
File without changes
|
package/dist/cli/perf.d.ts.map
CHANGED
|
@@ -1 +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;
|
|
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
CHANGED
|
@@ -161,10 +161,11 @@ function main() {
|
|
|
161
161
|
displayDashboard();
|
|
162
162
|
break;
|
|
163
163
|
case 'live':
|
|
164
|
-
case 'monitor':
|
|
164
|
+
case 'monitor': {
|
|
165
165
|
const interval = parseInt(args[1]) || 2000;
|
|
166
166
|
startLiveMonitor(interval);
|
|
167
167
|
break;
|
|
168
|
+
}
|
|
168
169
|
case 'export':
|
|
169
170
|
case 'json':
|
|
170
171
|
exportSummary();
|
package/dist/cli/perf.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"perf.js","sourceRoot":"","sources":["../../src/cli/perf.ts"],"names":[],"mappings":";;;
|
|
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"}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import { QNCEState } from './core';
|
|
2
|
+
/**
|
|
3
|
+
* Error thrown when condition evaluation fails
|
|
4
|
+
*/
|
|
5
|
+
export declare class ConditionEvaluationError extends Error {
|
|
6
|
+
readonly expression?: string | undefined;
|
|
7
|
+
readonly cause?: Error | undefined;
|
|
8
|
+
constructor(message: string, expression?: string | undefined, cause?: Error | undefined);
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* Context object passed to condition evaluators
|
|
12
|
+
*/
|
|
13
|
+
export interface ConditionContext {
|
|
14
|
+
/** Current engine state */
|
|
15
|
+
state: QNCEState;
|
|
16
|
+
/** Current timestamp for time-based conditions */
|
|
17
|
+
timestamp: number;
|
|
18
|
+
/** Additional custom context data */
|
|
19
|
+
customData?: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* Custom evaluator function signature
|
|
23
|
+
*/
|
|
24
|
+
export type CustomEvaluatorFunction = (expression: string, context: ConditionContext) => boolean;
|
|
25
|
+
/**
|
|
26
|
+
* Condition evaluator service for parsing and executing conditional expressions
|
|
27
|
+
*/
|
|
28
|
+
export declare class ConditionEvaluator {
|
|
29
|
+
private customEvaluator?;
|
|
30
|
+
private functionCache;
|
|
31
|
+
private maxCacheSize;
|
|
32
|
+
/**
|
|
33
|
+
* Set a custom evaluator function for handling complex conditions
|
|
34
|
+
*/
|
|
35
|
+
setCustomEvaluator(evaluator: CustomEvaluatorFunction): void;
|
|
36
|
+
/**
|
|
37
|
+
* Clear the custom evaluator
|
|
38
|
+
*/
|
|
39
|
+
clearCustomEvaluator(): void;
|
|
40
|
+
/**
|
|
41
|
+
* Evaluate a condition expression against the provided context
|
|
42
|
+
*/
|
|
43
|
+
evaluate(expression: string, context: ConditionContext): boolean;
|
|
44
|
+
/**
|
|
45
|
+
* Built-in expression evaluator with support for common patterns
|
|
46
|
+
*/
|
|
47
|
+
private evaluateBuiltIn;
|
|
48
|
+
/**
|
|
49
|
+
* Sanitize expression to prevent code injection
|
|
50
|
+
*/
|
|
51
|
+
private sanitizeExpression;
|
|
52
|
+
/**
|
|
53
|
+
* Create a safe evaluation context from the condition context
|
|
54
|
+
*/
|
|
55
|
+
private createEvaluationContext;
|
|
56
|
+
/**
|
|
57
|
+
* Validate that an expression is syntactically correct without evaluating it
|
|
58
|
+
*/
|
|
59
|
+
validateExpression(expression: string): {
|
|
60
|
+
valid: boolean;
|
|
61
|
+
error?: string;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Get list of flag names referenced in an expression
|
|
65
|
+
*/
|
|
66
|
+
getReferencedFlags(expression: string): string[];
|
|
67
|
+
}
|
|
68
|
+
export declare const conditionEvaluator: ConditionEvaluator;
|
|
69
|
+
//# sourceMappingURL=condition.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"condition.d.ts","sourceRoot":"","sources":["../../src/engine/condition.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,QAAQ,CAAC;AAEnC;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,KAAK;aACJ,UAAU,CAAC,EAAE,MAAM;aAAkB,KAAK,CAAC,EAAE,KAAK;gBAAnF,OAAO,EAAE,MAAM,EAAkB,UAAU,CAAC,EAAE,MAAM,YAAA,EAAkB,KAAK,CAAC,EAAE,KAAK,YAAA;CAIhG;AAED;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAC/B,2BAA2B;IAC3B,KAAK,EAAE,SAAS,CAAC;IACjB,kDAAkD;IAClD,SAAS,EAAE,MAAM,CAAC;IAClB,qCAAqC;IACrC,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACtC;AAED;;GAEG;AACH,MAAM,MAAM,uBAAuB,GAAG,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,KAAK,OAAO,CAAC;AAkBjG;;GAEG;AACH,qBAAa,kBAAkB;IAC7B,OAAO,CAAC,eAAe,CAAC,CAA0B;IAGlD,OAAO,CAAC,aAAa,CAAoC;IACzD,OAAO,CAAC,YAAY,CAAe;IAEnC;;OAEG;IACH,kBAAkB,CAAC,SAAS,EAAE,uBAAuB,GAAG,IAAI;IAI5D;;OAEG;IACH,oBAAoB,IAAI,IAAI;IAI5B;;OAEG;IACH,QAAQ,CAAC,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,gBAAgB,GAAG,OAAO;IAkBhE;;OAEG;IACH,OAAO,CAAC,eAAe;IA+DvB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA8B1B;;OAEG;IACH,OAAO,CAAC,uBAAuB;IAa/B;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG;QAAE,KAAK,EAAE,OAAO,CAAC;QAAC,KAAK,CAAC,EAAE,MAAM,CAAA;KAAE;IAmB1E;;OAEG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,EAAE;CAWjD;AAGD,eAAO,MAAM,kBAAkB,oBAA2B,CAAC"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// QNCE Condition Evaluator - Sprint 3.4
|
|
3
|
+
// Parses and evaluates conditional expressions for choice visibility
|
|
4
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
5
|
+
exports.conditionEvaluator = exports.ConditionEvaluator = exports.ConditionEvaluationError = void 0;
|
|
6
|
+
/**
|
|
7
|
+
* Error thrown when condition evaluation fails
|
|
8
|
+
*/
|
|
9
|
+
class ConditionEvaluationError extends Error {
|
|
10
|
+
expression;
|
|
11
|
+
cause;
|
|
12
|
+
constructor(message, expression, cause) {
|
|
13
|
+
super(message);
|
|
14
|
+
this.expression = expression;
|
|
15
|
+
this.cause = cause;
|
|
16
|
+
this.name = 'ConditionEvaluationError';
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
exports.ConditionEvaluationError = ConditionEvaluationError;
|
|
20
|
+
/**
|
|
21
|
+
* Built-in expression operators
|
|
22
|
+
*/
|
|
23
|
+
const OPERATORS = {
|
|
24
|
+
'>=': (a, b) => a >= b,
|
|
25
|
+
'<=': (a, b) => a <= b,
|
|
26
|
+
'>': (a, b) => a > b,
|
|
27
|
+
'<': (a, b) => a < b,
|
|
28
|
+
'==': (a, b) => a == b,
|
|
29
|
+
'===': (a, b) => a === b,
|
|
30
|
+
'!=': (a, b) => a != b,
|
|
31
|
+
'!==': (a, b) => a !== b,
|
|
32
|
+
'&&': (a, b) => a && b,
|
|
33
|
+
'||': (a, b) => a || b,
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Condition evaluator service for parsing and executing conditional expressions
|
|
37
|
+
*/
|
|
38
|
+
class ConditionEvaluator {
|
|
39
|
+
customEvaluator;
|
|
40
|
+
// Cache compiled functions for better performance
|
|
41
|
+
functionCache = new Map();
|
|
42
|
+
maxCacheSize = 100;
|
|
43
|
+
/**
|
|
44
|
+
* Set a custom evaluator function for handling complex conditions
|
|
45
|
+
*/
|
|
46
|
+
setCustomEvaluator(evaluator) {
|
|
47
|
+
this.customEvaluator = evaluator;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Clear the custom evaluator
|
|
51
|
+
*/
|
|
52
|
+
clearCustomEvaluator() {
|
|
53
|
+
this.customEvaluator = undefined;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Evaluate a condition expression against the provided context
|
|
57
|
+
*/
|
|
58
|
+
evaluate(expression, context) {
|
|
59
|
+
try {
|
|
60
|
+
// If custom evaluator is set, use it first
|
|
61
|
+
if (this.customEvaluator) {
|
|
62
|
+
return this.customEvaluator(expression, context);
|
|
63
|
+
}
|
|
64
|
+
// Use built-in evaluator
|
|
65
|
+
return this.evaluateBuiltIn(expression, context);
|
|
66
|
+
}
|
|
67
|
+
catch (error) {
|
|
68
|
+
throw new ConditionEvaluationError(`Failed to evaluate condition: ${expression}`, expression, error instanceof Error ? error : new Error(String(error)));
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* Built-in expression evaluator with support for common patterns
|
|
73
|
+
*/
|
|
74
|
+
evaluateBuiltIn(expression, context) {
|
|
75
|
+
// Handle empty expressions
|
|
76
|
+
if (!expression || expression.trim() === '') {
|
|
77
|
+
throw new ConditionEvaluationError('Empty or whitespace-only condition expression', expression);
|
|
78
|
+
}
|
|
79
|
+
// Sanitize and prepare expression
|
|
80
|
+
const sanitizedExpression = this.sanitizeExpression(expression);
|
|
81
|
+
// Handle simple cases first
|
|
82
|
+
if (sanitizedExpression === 'true')
|
|
83
|
+
return true;
|
|
84
|
+
if (sanitizedExpression === 'false')
|
|
85
|
+
return false;
|
|
86
|
+
// Create safe evaluation context
|
|
87
|
+
const evalContext = this.createEvaluationContext(context);
|
|
88
|
+
// Check function cache for performance
|
|
89
|
+
let func = this.functionCache.get(sanitizedExpression);
|
|
90
|
+
if (!func) {
|
|
91
|
+
try {
|
|
92
|
+
// Use Function constructor for safe evaluation (better than eval)
|
|
93
|
+
func = new Function('flags', 'state', 'timestamp', 'customData', `
|
|
94
|
+
"use strict";
|
|
95
|
+
return ${sanitizedExpression};
|
|
96
|
+
`);
|
|
97
|
+
// Cache the function for future use
|
|
98
|
+
if (this.functionCache.size >= this.maxCacheSize) {
|
|
99
|
+
// Remove oldest entry when cache is full
|
|
100
|
+
const firstKey = this.functionCache.keys().next().value;
|
|
101
|
+
if (firstKey) {
|
|
102
|
+
this.functionCache.delete(firstKey);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
this.functionCache.set(sanitizedExpression, func);
|
|
106
|
+
}
|
|
107
|
+
catch (error) {
|
|
108
|
+
throw new ConditionEvaluationError(`Invalid expression syntax: ${expression}`, expression, error instanceof Error ? error : new Error(String(error)));
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
try {
|
|
112
|
+
return !!func(evalContext.flags, evalContext.state, evalContext.timestamp, evalContext.customData);
|
|
113
|
+
}
|
|
114
|
+
catch (error) {
|
|
115
|
+
throw new ConditionEvaluationError(`Runtime error evaluating: ${expression}`, expression, error instanceof Error ? error : new Error(String(error)));
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Sanitize expression to prevent code injection
|
|
120
|
+
*/
|
|
121
|
+
sanitizeExpression(expression) {
|
|
122
|
+
// Remove potentially dangerous patterns
|
|
123
|
+
const dangerous = [
|
|
124
|
+
/\beval\b/g,
|
|
125
|
+
/\bFunction\b/g,
|
|
126
|
+
/\bconstructor\b/g,
|
|
127
|
+
/\bprototype\b/g,
|
|
128
|
+
/\b__proto__\b/g,
|
|
129
|
+
/\bimport\b/g,
|
|
130
|
+
/\brequire\b/g,
|
|
131
|
+
/\bprocess\b/g,
|
|
132
|
+
/\bglobal\b/g,
|
|
133
|
+
/\bwindow\b/g,
|
|
134
|
+
/\bdocument\b/g,
|
|
135
|
+
];
|
|
136
|
+
let sanitized = expression.trim();
|
|
137
|
+
for (const pattern of dangerous) {
|
|
138
|
+
if (pattern.test(sanitized)) {
|
|
139
|
+
throw new ConditionEvaluationError(`Potentially unsafe expression detected: ${expression}`, expression);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
return sanitized;
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Create a safe evaluation context from the condition context
|
|
146
|
+
*/
|
|
147
|
+
createEvaluationContext(context) {
|
|
148
|
+
return {
|
|
149
|
+
flags: { ...context.state.flags },
|
|
150
|
+
state: {
|
|
151
|
+
currentNodeId: context.state.currentNodeId,
|
|
152
|
+
flags: { ...context.state.flags },
|
|
153
|
+
history: [...context.state.history],
|
|
154
|
+
},
|
|
155
|
+
timestamp: context.timestamp,
|
|
156
|
+
customData: context.customData ? { ...context.customData } : {},
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* Validate that an expression is syntactically correct without evaluating it
|
|
161
|
+
*/
|
|
162
|
+
validateExpression(expression) {
|
|
163
|
+
try {
|
|
164
|
+
this.sanitizeExpression(expression);
|
|
165
|
+
// Try to create the function without executing it
|
|
166
|
+
new Function('flags', 'state', 'timestamp', 'customData', `
|
|
167
|
+
"use strict";
|
|
168
|
+
return ${expression};
|
|
169
|
+
`);
|
|
170
|
+
return { valid: true };
|
|
171
|
+
}
|
|
172
|
+
catch (error) {
|
|
173
|
+
return {
|
|
174
|
+
valid: false,
|
|
175
|
+
error: error instanceof Error ? error.message : String(error)
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Get list of flag names referenced in an expression
|
|
181
|
+
*/
|
|
182
|
+
getReferencedFlags(expression) {
|
|
183
|
+
const flagPattern = /flags\.([a-zA-Z_$][a-zA-Z0-9_$]*)/g;
|
|
184
|
+
const matches = [];
|
|
185
|
+
let match;
|
|
186
|
+
while ((match = flagPattern.exec(expression)) !== null) {
|
|
187
|
+
matches.push(match[1]);
|
|
188
|
+
}
|
|
189
|
+
return Array.from(new Set(matches)); // Remove duplicates
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
exports.ConditionEvaluator = ConditionEvaluator;
|
|
193
|
+
// Create a global instance for the engine to use
|
|
194
|
+
exports.conditionEvaluator = new ConditionEvaluator();
|
|
195
|
+
//# sourceMappingURL=condition.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"condition.js","sourceRoot":"","sources":["../../src/engine/condition.ts"],"names":[],"mappings":"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"}
|