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
|
@@ -0,0 +1,200 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QNCE Engine React Integration
|
|
3
|
+
*
|
|
4
|
+
* React hooks and utilities for integrating QNCE Engine with React applications.
|
|
5
|
+
* Provides convenient hooks for managing narrative state, undo/redo operations,
|
|
6
|
+
* and autosave functionality.
|
|
7
|
+
*/
|
|
8
|
+
import { QNCEEngine, type Choice, type NarrativeNode } from '../engine/core.js';
|
|
9
|
+
import { type AutosaveConfig, type SerializedState } from '../engine/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Result type for undo/redo operations
|
|
12
|
+
*/
|
|
13
|
+
export interface UndoRedoResult {
|
|
14
|
+
success: boolean;
|
|
15
|
+
description?: string;
|
|
16
|
+
error?: string;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* History summary for undo/redo state
|
|
20
|
+
*/
|
|
21
|
+
export interface HistorySummary {
|
|
22
|
+
undoCount: number;
|
|
23
|
+
redoCount: number;
|
|
24
|
+
canUndo: boolean;
|
|
25
|
+
canRedo: boolean;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* Configuration for the useQNCE hook
|
|
29
|
+
*/
|
|
30
|
+
export interface UseQNCEConfig {
|
|
31
|
+
/** Enable automatic re-renders when state changes */
|
|
32
|
+
autoUpdate?: boolean;
|
|
33
|
+
/** Enable undo/redo functionality */
|
|
34
|
+
enableUndoRedo?: boolean;
|
|
35
|
+
/** Maximum number of undo operations to track */
|
|
36
|
+
maxUndoEntries?: number;
|
|
37
|
+
/** Maximum number of redo operations to track */
|
|
38
|
+
maxRedoEntries?: number;
|
|
39
|
+
/** Enable autosave functionality */
|
|
40
|
+
enableAutosave?: boolean;
|
|
41
|
+
/** Autosave throttle time in milliseconds */
|
|
42
|
+
autosaveThrottleMs?: number;
|
|
43
|
+
}
|
|
44
|
+
/**
|
|
45
|
+
* Return type for the useQNCE hook
|
|
46
|
+
*/
|
|
47
|
+
export interface UseQNCEReturn {
|
|
48
|
+
engine: QNCEEngine;
|
|
49
|
+
currentNode: NarrativeNode | null;
|
|
50
|
+
availableChoices: Choice[];
|
|
51
|
+
flags: Record<string, any>;
|
|
52
|
+
selectChoice: (choice: Choice | string) => Promise<void>;
|
|
53
|
+
setFlag: (key: string, value: any) => void;
|
|
54
|
+
resetNarrative: () => void;
|
|
55
|
+
undo: () => UndoRedoResult;
|
|
56
|
+
redo: () => UndoRedoResult;
|
|
57
|
+
canUndo: boolean;
|
|
58
|
+
canRedo: boolean;
|
|
59
|
+
undoCount: number;
|
|
60
|
+
redoCount: number;
|
|
61
|
+
clearHistory: () => void;
|
|
62
|
+
autosave: () => Promise<void>;
|
|
63
|
+
configureAutosave: (config: Partial<AutosaveConfig>) => void;
|
|
64
|
+
saveState: () => Promise<SerializedState>;
|
|
65
|
+
loadState: (serializedState: SerializedState) => Promise<void>;
|
|
66
|
+
refresh: () => void;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* React hook for QNCE Engine integration
|
|
70
|
+
*
|
|
71
|
+
* Provides a complete interface for managing QNCE Engine state in React applications,
|
|
72
|
+
* including undo/redo functionality, autosave, and automatic re-renders.
|
|
73
|
+
*
|
|
74
|
+
* @param engine - The QNCE Engine instance
|
|
75
|
+
* @param config - Configuration options for the hook
|
|
76
|
+
* @returns Hook return object with state and actions
|
|
77
|
+
*
|
|
78
|
+
* @example
|
|
79
|
+
* ```tsx
|
|
80
|
+
* function NarrativeComponent() {
|
|
81
|
+
* const engine = useMemo(() => createQNCEEngine(DEMO_STORY), []);
|
|
82
|
+
* const {
|
|
83
|
+
* currentNode,
|
|
84
|
+
* availableChoices,
|
|
85
|
+
* selectChoice,
|
|
86
|
+
* undo,
|
|
87
|
+
* redo,
|
|
88
|
+
* canUndo,
|
|
89
|
+
* canRedo
|
|
90
|
+
* } = useQNCE(engine, {
|
|
91
|
+
* enableUndoRedo: true,
|
|
92
|
+
* enableAutosave: true,
|
|
93
|
+
* maxUndoEntries: 50
|
|
94
|
+
* });
|
|
95
|
+
*
|
|
96
|
+
* return (
|
|
97
|
+
* <div>
|
|
98
|
+
* <p>{currentNode?.text}</p>
|
|
99
|
+
*
|
|
100
|
+
* <div>
|
|
101
|
+
* {availableChoices.map(choice => (
|
|
102
|
+
* <button key={choice.text} onClick={() => selectChoice(choice)}>
|
|
103
|
+
* {choice.text}
|
|
104
|
+
* </button>
|
|
105
|
+
* ))}
|
|
106
|
+
* </div>
|
|
107
|
+
*
|
|
108
|
+
* <div>
|
|
109
|
+
* <button onClick={undo} disabled={!canUndo}>
|
|
110
|
+
* Undo
|
|
111
|
+
* </button>
|
|
112
|
+
* <button onClick={redo} disabled={!canRedo}>
|
|
113
|
+
* Redo
|
|
114
|
+
* </button>
|
|
115
|
+
* </div>
|
|
116
|
+
* </div>
|
|
117
|
+
* );
|
|
118
|
+
* }
|
|
119
|
+
* ```
|
|
120
|
+
*/
|
|
121
|
+
export declare function useQNCE(engine: QNCEEngine, config?: UseQNCEConfig): UseQNCEReturn;
|
|
122
|
+
/**
|
|
123
|
+
* Hook for managing just undo/redo functionality
|
|
124
|
+
*
|
|
125
|
+
* A lightweight hook focused specifically on undo/redo operations.
|
|
126
|
+
* Useful when you want to add undo/redo to an existing QNCE integration.
|
|
127
|
+
*
|
|
128
|
+
* @param engine - The QNCE Engine instance
|
|
129
|
+
* @param config - Undo/redo configuration
|
|
130
|
+
* @returns Undo/redo state and actions
|
|
131
|
+
*
|
|
132
|
+
* @example
|
|
133
|
+
* ```tsx
|
|
134
|
+
* function UndoRedoControls({ engine }: { engine: QNCEEngine }) {
|
|
135
|
+
* const { undo, redo, canUndo, canRedo, undoCount, redoCount } = useUndoRedo(engine);
|
|
136
|
+
*
|
|
137
|
+
* return (
|
|
138
|
+
* <div className="undo-redo-controls">
|
|
139
|
+
* <button onClick={undo} disabled={!canUndo}>
|
|
140
|
+
* ← Undo ({undoCount})
|
|
141
|
+
* </button>
|
|
142
|
+
* <button onClick={redo} disabled={!canRedo}>
|
|
143
|
+
* Redo ({redoCount}) →
|
|
144
|
+
* </button>
|
|
145
|
+
* </div>
|
|
146
|
+
* );
|
|
147
|
+
* }
|
|
148
|
+
* ```
|
|
149
|
+
*/
|
|
150
|
+
export declare function useUndoRedo(engine: QNCEEngine, config?: {
|
|
151
|
+
maxUndoEntries?: number;
|
|
152
|
+
maxRedoEntries?: number;
|
|
153
|
+
}): {
|
|
154
|
+
undo: () => UndoRedoResult;
|
|
155
|
+
redo: () => UndoRedoResult;
|
|
156
|
+
canUndo: boolean;
|
|
157
|
+
canRedo: boolean;
|
|
158
|
+
undoCount: number;
|
|
159
|
+
redoCount: number;
|
|
160
|
+
clearHistory: () => void;
|
|
161
|
+
historySummary: HistorySummary;
|
|
162
|
+
};
|
|
163
|
+
/**
|
|
164
|
+
* Hook for managing autosave functionality
|
|
165
|
+
*
|
|
166
|
+
* Provides control over the autosave system for fine-grained management.
|
|
167
|
+
*
|
|
168
|
+
* @param engine - The QNCE Engine instance
|
|
169
|
+
* @param config - Autosave configuration
|
|
170
|
+
* @returns Autosave state and actions
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```tsx
|
|
174
|
+
* function AutosaveIndicator({ engine }: { engine: QNCEEngine }) {
|
|
175
|
+
* const { autosave, configure, isEnabled } = useAutosave(engine, {
|
|
176
|
+
* throttleMs: 200,
|
|
177
|
+
* triggers: ['choice', 'flag-change']
|
|
178
|
+
* });
|
|
179
|
+
*
|
|
180
|
+
* return (
|
|
181
|
+
* <div>
|
|
182
|
+
* <span>Autosave: {isEnabled ? 'ON' : 'OFF'}</span>
|
|
183
|
+
* <button onClick={autosave}>Save Now</button>
|
|
184
|
+
* </div>
|
|
185
|
+
* );
|
|
186
|
+
* }
|
|
187
|
+
* ```
|
|
188
|
+
*/
|
|
189
|
+
export declare function useAutosave(engine: QNCEEngine, config?: {
|
|
190
|
+
throttleMs?: number;
|
|
191
|
+
triggers?: string[];
|
|
192
|
+
enabled?: boolean;
|
|
193
|
+
}): {
|
|
194
|
+
autosave: () => Promise<void>;
|
|
195
|
+
configure: (config: Partial<AutosaveConfig>) => void;
|
|
196
|
+
isEnabled: boolean;
|
|
197
|
+
lastAutosave: Date | null;
|
|
198
|
+
isSaving: boolean;
|
|
199
|
+
};
|
|
200
|
+
//# sourceMappingURL=react.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/integrations/react.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,365 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* QNCE Engine React Integration
|
|
4
|
+
*
|
|
5
|
+
* React hooks and utilities for integrating QNCE Engine with React applications.
|
|
6
|
+
* Provides convenient hooks for managing narrative state, undo/redo operations,
|
|
7
|
+
* and autosave functionality.
|
|
8
|
+
*/
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.useQNCE = useQNCE;
|
|
11
|
+
exports.useUndoRedo = useUndoRedo;
|
|
12
|
+
exports.useAutosave = useAutosave;
|
|
13
|
+
const react_1 = require("react");
|
|
14
|
+
/**
|
|
15
|
+
* React hook for QNCE Engine integration
|
|
16
|
+
*
|
|
17
|
+
* Provides a complete interface for managing QNCE Engine state in React applications,
|
|
18
|
+
* including undo/redo functionality, autosave, and automatic re-renders.
|
|
19
|
+
*
|
|
20
|
+
* @param engine - The QNCE Engine instance
|
|
21
|
+
* @param config - Configuration options for the hook
|
|
22
|
+
* @returns Hook return object with state and actions
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* ```tsx
|
|
26
|
+
* function NarrativeComponent() {
|
|
27
|
+
* const engine = useMemo(() => createQNCEEngine(DEMO_STORY), []);
|
|
28
|
+
* const {
|
|
29
|
+
* currentNode,
|
|
30
|
+
* availableChoices,
|
|
31
|
+
* selectChoice,
|
|
32
|
+
* undo,
|
|
33
|
+
* redo,
|
|
34
|
+
* canUndo,
|
|
35
|
+
* canRedo
|
|
36
|
+
* } = useQNCE(engine, {
|
|
37
|
+
* enableUndoRedo: true,
|
|
38
|
+
* enableAutosave: true,
|
|
39
|
+
* maxUndoEntries: 50
|
|
40
|
+
* });
|
|
41
|
+
*
|
|
42
|
+
* return (
|
|
43
|
+
* <div>
|
|
44
|
+
* <p>{currentNode?.text}</p>
|
|
45
|
+
*
|
|
46
|
+
* <div>
|
|
47
|
+
* {availableChoices.map(choice => (
|
|
48
|
+
* <button key={choice.text} onClick={() => selectChoice(choice)}>
|
|
49
|
+
* {choice.text}
|
|
50
|
+
* </button>
|
|
51
|
+
* ))}
|
|
52
|
+
* </div>
|
|
53
|
+
*
|
|
54
|
+
* <div>
|
|
55
|
+
* <button onClick={undo} disabled={!canUndo}>
|
|
56
|
+
* Undo
|
|
57
|
+
* </button>
|
|
58
|
+
* <button onClick={redo} disabled={!canRedo}>
|
|
59
|
+
* Redo
|
|
60
|
+
* </button>
|
|
61
|
+
* </div>
|
|
62
|
+
* </div>
|
|
63
|
+
* );
|
|
64
|
+
* }
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
function useQNCE(engine, config = {}) {
|
|
68
|
+
const { autoUpdate = true, enableUndoRedo = true, maxUndoEntries = 50, maxRedoEntries = 25, enableAutosave = true, autosaveThrottleMs = 100 } = config;
|
|
69
|
+
// Force re-render counter
|
|
70
|
+
const [, setUpdateCounter] = (0, react_1.useState)(0);
|
|
71
|
+
// Initialize engine configuration
|
|
72
|
+
(0, react_1.useEffect)(() => {
|
|
73
|
+
if (enableUndoRedo) {
|
|
74
|
+
engine.configureUndoRedo({
|
|
75
|
+
enabled: true,
|
|
76
|
+
maxUndoEntries,
|
|
77
|
+
maxRedoEntries
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
if (enableAutosave) {
|
|
81
|
+
engine.configureAutosave({
|
|
82
|
+
enabled: true,
|
|
83
|
+
throttleMs: autosaveThrottleMs,
|
|
84
|
+
triggers: ['choice', 'flag-change', 'state-load']
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
}, [engine, enableUndoRedo, maxUndoEntries, maxRedoEntries, enableAutosave, autosaveThrottleMs]);
|
|
88
|
+
// Force re-render when autoUpdate is enabled
|
|
89
|
+
const refresh = (0, react_1.useCallback)(() => {
|
|
90
|
+
if (autoUpdate) {
|
|
91
|
+
setUpdateCounter(prev => prev + 1);
|
|
92
|
+
}
|
|
93
|
+
}, [autoUpdate]);
|
|
94
|
+
// Memoized state getters
|
|
95
|
+
const currentNode = (0, react_1.useMemo)(() => {
|
|
96
|
+
try {
|
|
97
|
+
return engine.getCurrentNode();
|
|
98
|
+
}
|
|
99
|
+
catch {
|
|
100
|
+
return null;
|
|
101
|
+
}
|
|
102
|
+
}, [engine, autoUpdate]);
|
|
103
|
+
const availableChoices = (0, react_1.useMemo)(() => {
|
|
104
|
+
try {
|
|
105
|
+
return engine.getAvailableChoices();
|
|
106
|
+
}
|
|
107
|
+
catch {
|
|
108
|
+
return [];
|
|
109
|
+
}
|
|
110
|
+
}, [engine, autoUpdate]);
|
|
111
|
+
const flags = (0, react_1.useMemo)(() => {
|
|
112
|
+
return engine.getState().flags;
|
|
113
|
+
}, [engine, autoUpdate]);
|
|
114
|
+
// Undo/Redo state
|
|
115
|
+
const canUndo = (0, react_1.useMemo)(() => engine.canUndo(), [engine, autoUpdate]);
|
|
116
|
+
const canRedo = (0, react_1.useMemo)(() => engine.canRedo(), [engine, autoUpdate]);
|
|
117
|
+
const undoCount = (0, react_1.useMemo)(() => engine.getUndoCount(), [engine, autoUpdate]);
|
|
118
|
+
const redoCount = (0, react_1.useMemo)(() => engine.getRedoCount(), [engine, autoUpdate]);
|
|
119
|
+
// Actions with automatic refresh
|
|
120
|
+
const selectChoice = (0, react_1.useCallback)(async (choice) => {
|
|
121
|
+
let choiceToSelect;
|
|
122
|
+
if (typeof choice === 'string') {
|
|
123
|
+
// Find choice by text
|
|
124
|
+
const foundChoice = availableChoices.find(c => c.text === choice);
|
|
125
|
+
if (!foundChoice) {
|
|
126
|
+
throw new Error(`Choice not found: ${choice}`);
|
|
127
|
+
}
|
|
128
|
+
choiceToSelect = foundChoice;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
choiceToSelect = choice;
|
|
132
|
+
}
|
|
133
|
+
engine.selectChoice(choiceToSelect);
|
|
134
|
+
refresh();
|
|
135
|
+
}, [engine, refresh, availableChoices]);
|
|
136
|
+
const setFlag = (0, react_1.useCallback)((key, value) => {
|
|
137
|
+
engine.setFlag(key, value);
|
|
138
|
+
refresh();
|
|
139
|
+
}, [engine, refresh]);
|
|
140
|
+
const resetNarrative = (0, react_1.useCallback)(() => {
|
|
141
|
+
engine.resetNarrative();
|
|
142
|
+
refresh();
|
|
143
|
+
}, [engine, refresh]);
|
|
144
|
+
const undo = (0, react_1.useCallback)(() => {
|
|
145
|
+
const result = engine.undo();
|
|
146
|
+
refresh();
|
|
147
|
+
return result;
|
|
148
|
+
}, [engine, refresh]);
|
|
149
|
+
const redo = (0, react_1.useCallback)(() => {
|
|
150
|
+
const result = engine.redo();
|
|
151
|
+
refresh();
|
|
152
|
+
return result;
|
|
153
|
+
}, [engine, refresh]);
|
|
154
|
+
const clearHistory = (0, react_1.useCallback)(() => {
|
|
155
|
+
engine.clearHistory();
|
|
156
|
+
refresh();
|
|
157
|
+
}, [engine, refresh]);
|
|
158
|
+
const autosave = (0, react_1.useCallback)(async () => {
|
|
159
|
+
await engine.manualAutosave();
|
|
160
|
+
}, [engine]);
|
|
161
|
+
const configureAutosave = (0, react_1.useCallback)((config) => {
|
|
162
|
+
engine.configureAutosave(config);
|
|
163
|
+
}, [engine]);
|
|
164
|
+
const saveState = (0, react_1.useCallback)(async () => {
|
|
165
|
+
return await engine.saveState();
|
|
166
|
+
}, [engine]);
|
|
167
|
+
const loadState = (0, react_1.useCallback)(async (serializedState) => {
|
|
168
|
+
await engine.loadState(serializedState);
|
|
169
|
+
refresh();
|
|
170
|
+
}, [engine, refresh]);
|
|
171
|
+
return {
|
|
172
|
+
// Core state
|
|
173
|
+
engine,
|
|
174
|
+
currentNode,
|
|
175
|
+
availableChoices,
|
|
176
|
+
flags,
|
|
177
|
+
// Actions
|
|
178
|
+
selectChoice,
|
|
179
|
+
setFlag,
|
|
180
|
+
resetNarrative,
|
|
181
|
+
// Undo/Redo
|
|
182
|
+
undo,
|
|
183
|
+
redo,
|
|
184
|
+
canUndo,
|
|
185
|
+
canRedo,
|
|
186
|
+
undoCount,
|
|
187
|
+
redoCount,
|
|
188
|
+
clearHistory,
|
|
189
|
+
// Autosave
|
|
190
|
+
autosave,
|
|
191
|
+
configureAutosave,
|
|
192
|
+
// State management
|
|
193
|
+
saveState,
|
|
194
|
+
loadState,
|
|
195
|
+
// Utility
|
|
196
|
+
refresh
|
|
197
|
+
};
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Hook for managing just undo/redo functionality
|
|
201
|
+
*
|
|
202
|
+
* A lightweight hook focused specifically on undo/redo operations.
|
|
203
|
+
* Useful when you want to add undo/redo to an existing QNCE integration.
|
|
204
|
+
*
|
|
205
|
+
* @param engine - The QNCE Engine instance
|
|
206
|
+
* @param config - Undo/redo configuration
|
|
207
|
+
* @returns Undo/redo state and actions
|
|
208
|
+
*
|
|
209
|
+
* @example
|
|
210
|
+
* ```tsx
|
|
211
|
+
* function UndoRedoControls({ engine }: { engine: QNCEEngine }) {
|
|
212
|
+
* const { undo, redo, canUndo, canRedo, undoCount, redoCount } = useUndoRedo(engine);
|
|
213
|
+
*
|
|
214
|
+
* return (
|
|
215
|
+
* <div className="undo-redo-controls">
|
|
216
|
+
* <button onClick={undo} disabled={!canUndo}>
|
|
217
|
+
* ← Undo ({undoCount})
|
|
218
|
+
* </button>
|
|
219
|
+
* <button onClick={redo} disabled={!canRedo}>
|
|
220
|
+
* Redo ({redoCount}) →
|
|
221
|
+
* </button>
|
|
222
|
+
* </div>
|
|
223
|
+
* );
|
|
224
|
+
* }
|
|
225
|
+
* ```
|
|
226
|
+
*/
|
|
227
|
+
function useUndoRedo(engine, config = {}) {
|
|
228
|
+
const { maxUndoEntries = 50, maxRedoEntries = 25 } = config;
|
|
229
|
+
const [, setUpdateCounter] = (0, react_1.useState)(0);
|
|
230
|
+
// Configure undo/redo on mount
|
|
231
|
+
(0, react_1.useEffect)(() => {
|
|
232
|
+
engine.configureUndoRedo({
|
|
233
|
+
enabled: true,
|
|
234
|
+
maxUndoEntries,
|
|
235
|
+
maxRedoEntries
|
|
236
|
+
});
|
|
237
|
+
}, [engine, maxUndoEntries, maxRedoEntries]);
|
|
238
|
+
const refresh = (0, react_1.useCallback)(() => {
|
|
239
|
+
setUpdateCounter(prev => prev + 1);
|
|
240
|
+
}, []);
|
|
241
|
+
const undo = (0, react_1.useCallback)(() => {
|
|
242
|
+
const result = engine.undo();
|
|
243
|
+
refresh();
|
|
244
|
+
return result;
|
|
245
|
+
}, [engine, refresh]);
|
|
246
|
+
const redo = (0, react_1.useCallback)(() => {
|
|
247
|
+
const result = engine.redo();
|
|
248
|
+
refresh();
|
|
249
|
+
return result;
|
|
250
|
+
}, [engine, refresh]);
|
|
251
|
+
const clearHistory = (0, react_1.useCallback)(() => {
|
|
252
|
+
engine.clearHistory();
|
|
253
|
+
refresh();
|
|
254
|
+
}, [engine, refresh]);
|
|
255
|
+
const canUndo = (0, react_1.useMemo)(() => engine.canUndo(), [engine]);
|
|
256
|
+
const canRedo = (0, react_1.useMemo)(() => engine.canRedo(), [engine]);
|
|
257
|
+
const undoCount = (0, react_1.useMemo)(() => engine.getUndoCount(), [engine]);
|
|
258
|
+
const redoCount = (0, react_1.useMemo)(() => engine.getRedoCount(), [engine]);
|
|
259
|
+
const historySummary = (0, react_1.useMemo)(() => ({
|
|
260
|
+
undoCount,
|
|
261
|
+
redoCount,
|
|
262
|
+
canUndo,
|
|
263
|
+
canRedo
|
|
264
|
+
}), [undoCount, redoCount, canUndo, canRedo]);
|
|
265
|
+
return {
|
|
266
|
+
undo,
|
|
267
|
+
redo,
|
|
268
|
+
canUndo,
|
|
269
|
+
canRedo,
|
|
270
|
+
undoCount,
|
|
271
|
+
redoCount,
|
|
272
|
+
clearHistory,
|
|
273
|
+
historySummary
|
|
274
|
+
};
|
|
275
|
+
}
|
|
276
|
+
/**
|
|
277
|
+
* Hook for managing autosave functionality
|
|
278
|
+
*
|
|
279
|
+
* Provides control over the autosave system for fine-grained management.
|
|
280
|
+
*
|
|
281
|
+
* @param engine - The QNCE Engine instance
|
|
282
|
+
* @param config - Autosave configuration
|
|
283
|
+
* @returns Autosave state and actions
|
|
284
|
+
*
|
|
285
|
+
* @example
|
|
286
|
+
* ```tsx
|
|
287
|
+
* function AutosaveIndicator({ engine }: { engine: QNCEEngine }) {
|
|
288
|
+
* const { autosave, configure, isEnabled } = useAutosave(engine, {
|
|
289
|
+
* throttleMs: 200,
|
|
290
|
+
* triggers: ['choice', 'flag-change']
|
|
291
|
+
* });
|
|
292
|
+
*
|
|
293
|
+
* return (
|
|
294
|
+
* <div>
|
|
295
|
+
* <span>Autosave: {isEnabled ? 'ON' : 'OFF'}</span>
|
|
296
|
+
* <button onClick={autosave}>Save Now</button>
|
|
297
|
+
* </div>
|
|
298
|
+
* );
|
|
299
|
+
* }
|
|
300
|
+
* ```
|
|
301
|
+
*/
|
|
302
|
+
function useAutosave(engine, config = {}) {
|
|
303
|
+
const { throttleMs = 100, triggers = ['choice', 'flag-change', 'state-load'], enabled = true } = config;
|
|
304
|
+
const [lastAutosave, setLastAutosave] = (0, react_1.useState)(null);
|
|
305
|
+
const [isSaving, setIsSaving] = (0, react_1.useState)(false);
|
|
306
|
+
(0, react_1.useEffect)(() => {
|
|
307
|
+
engine.configureAutosave({
|
|
308
|
+
enabled,
|
|
309
|
+
throttleMs,
|
|
310
|
+
triggers: triggers
|
|
311
|
+
});
|
|
312
|
+
}, [engine, enabled, throttleMs, triggers]);
|
|
313
|
+
// Monitor autosave events by wrapping engine methods
|
|
314
|
+
(0, react_1.useEffect)(() => {
|
|
315
|
+
if (!engine)
|
|
316
|
+
return;
|
|
317
|
+
const originalSelectChoice = engine.selectChoice.bind(engine);
|
|
318
|
+
const originalSetFlag = engine.setFlag.bind(engine);
|
|
319
|
+
// Track autosave calls
|
|
320
|
+
const trackAutosave = async (originalMethod, ...args) => {
|
|
321
|
+
const result = originalMethod(...args);
|
|
322
|
+
if (enabled) {
|
|
323
|
+
setIsSaving(true);
|
|
324
|
+
try {
|
|
325
|
+
// Wait for potential autosave to complete
|
|
326
|
+
await new Promise(resolve => setTimeout(resolve, throttleMs + 50));
|
|
327
|
+
setLastAutosave(new Date());
|
|
328
|
+
}
|
|
329
|
+
finally {
|
|
330
|
+
setIsSaving(false);
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
return result;
|
|
334
|
+
};
|
|
335
|
+
// Override methods to track autosave
|
|
336
|
+
engine.selectChoice = (...args) => trackAutosave(originalSelectChoice, ...args);
|
|
337
|
+
engine.setFlag = (...args) => trackAutosave(originalSetFlag, ...args);
|
|
338
|
+
return () => {
|
|
339
|
+
// Restore original methods
|
|
340
|
+
engine.selectChoice = originalSelectChoice;
|
|
341
|
+
engine.setFlag = originalSetFlag;
|
|
342
|
+
};
|
|
343
|
+
}, [engine, enabled, throttleMs]);
|
|
344
|
+
const autosave = (0, react_1.useCallback)(async () => {
|
|
345
|
+
setIsSaving(true);
|
|
346
|
+
try {
|
|
347
|
+
await engine.manualAutosave();
|
|
348
|
+
setLastAutosave(new Date());
|
|
349
|
+
}
|
|
350
|
+
finally {
|
|
351
|
+
setIsSaving(false);
|
|
352
|
+
}
|
|
353
|
+
}, [engine]);
|
|
354
|
+
const configure = (0, react_1.useCallback)((config) => {
|
|
355
|
+
engine.configureAutosave(config);
|
|
356
|
+
}, [engine]);
|
|
357
|
+
return {
|
|
358
|
+
autosave,
|
|
359
|
+
configure,
|
|
360
|
+
isEnabled: enabled,
|
|
361
|
+
lastAutosave,
|
|
362
|
+
isSaving
|
|
363
|
+
};
|
|
364
|
+
}
|
|
365
|
+
//# sourceMappingURL=react.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/integrations/react.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import { QNCEStory, BranchOption, DynamicBranchOperation, BranchHistoryEntry, AIBranchingContext } from './models';
|
|
2
|
+
import { QNCEState } from '../../engine/core';
|
|
3
|
+
/**
|
|
4
|
+
* QNCE Branching Engine - Core API for dynamic narrative branching
|
|
5
|
+
* Simplified implementation focusing on core functionality
|
|
6
|
+
*/
|
|
7
|
+
export declare class QNCEBranchingEngine {
|
|
8
|
+
private story;
|
|
9
|
+
private context;
|
|
10
|
+
private aiContext?;
|
|
11
|
+
constructor(story: QNCEStory, initialState: QNCEState);
|
|
12
|
+
/**
|
|
13
|
+
* Evaluate available branches from current position
|
|
14
|
+
*/
|
|
15
|
+
evaluateAvailableBranches(): Promise<BranchOption[]>;
|
|
16
|
+
/**
|
|
17
|
+
* Execute a branch transition
|
|
18
|
+
*/
|
|
19
|
+
executeBranch(optionId: string): Promise<boolean>;
|
|
20
|
+
/**
|
|
21
|
+
* Dynamic branch insertion at runtime
|
|
22
|
+
*/
|
|
23
|
+
insertDynamicBranch(operation: DynamicBranchOperation): Promise<boolean>;
|
|
24
|
+
/**
|
|
25
|
+
* Remove dynamic branch
|
|
26
|
+
*/
|
|
27
|
+
removeDynamicBranch(branchId: string): Promise<boolean>;
|
|
28
|
+
/**
|
|
29
|
+
* Set AI context for enhanced branching decisions
|
|
30
|
+
*/
|
|
31
|
+
setAIContext(aiContext: AIBranchingContext): void;
|
|
32
|
+
/**
|
|
33
|
+
* Generate AI-driven branch options
|
|
34
|
+
*/
|
|
35
|
+
generateAIBranches(maxOptions?: number): Promise<BranchOption[]>;
|
|
36
|
+
/**
|
|
37
|
+
* Get current branching analytics
|
|
38
|
+
*/
|
|
39
|
+
getBranchingAnalytics(): {
|
|
40
|
+
currentChapter: string;
|
|
41
|
+
currentFlow: string;
|
|
42
|
+
historyLength: number;
|
|
43
|
+
pendingBranches: number;
|
|
44
|
+
totalBranchesTraversed: number;
|
|
45
|
+
avgBranchDecisionTime: number;
|
|
46
|
+
mostPopularBranches: string[];
|
|
47
|
+
abandonmentPoints: string[];
|
|
48
|
+
completionRate: number;
|
|
49
|
+
sessionStartTime: Date;
|
|
50
|
+
};
|
|
51
|
+
/**
|
|
52
|
+
* Export branching data for external analysis
|
|
53
|
+
*/
|
|
54
|
+
exportBranchingData(): {
|
|
55
|
+
story: {
|
|
56
|
+
id: string;
|
|
57
|
+
title: string;
|
|
58
|
+
version: string;
|
|
59
|
+
};
|
|
60
|
+
session: {
|
|
61
|
+
startTime: Date;
|
|
62
|
+
currentState: QNCEState;
|
|
63
|
+
branchHistory: BranchHistoryEntry[];
|
|
64
|
+
analytics: import("./models").BranchAnalytics;
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
private createBranchContext;
|
|
68
|
+
private getCurrentNode;
|
|
69
|
+
private findBranchPointsForNode;
|
|
70
|
+
private evaluateConditions;
|
|
71
|
+
private evaluateCondition;
|
|
72
|
+
private findBranchOption;
|
|
73
|
+
private findFlow;
|
|
74
|
+
private findChapter;
|
|
75
|
+
private transitionToFlow;
|
|
76
|
+
private recordBranchHistory;
|
|
77
|
+
private updateBranchAnalytics;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Factory function for creating branching engines
|
|
81
|
+
*/
|
|
82
|
+
export declare function createBranchingEngine(story: QNCEStory, initialState: QNCEState): QNCEBranchingEngine;
|
|
83
|
+
export { QNCEBranchingEngine as default };
|
|
84
|
+
//# sourceMappingURL=engine-simple.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine-simple.d.ts","sourceRoot":"","sources":["../../../src/narrative/branching/engine-simple.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,SAAS,EAKT,YAAY,EAEZ,sBAAsB,EACtB,kBAAkB,EAClB,kBAAkB,EACnB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAE,SAAS,EAAiB,MAAM,mBAAmB,CAAC;AAE7D;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,KAAK,CAAY;IACzB,OAAO,CAAC,OAAO,CAAgB;IAC/B,OAAO,CAAC,SAAS,CAAC,CAAqB;gBAE3B,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,SAAS;IASrD;;OAEG;IACG,yBAAyB,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;IAwB1D;;OAEG;IACG,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA8BvD;;OAEG;IACG,mBAAmB,CAAC,SAAS,EAAE,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC;IAkC9E;;OAEG;IACG,mBAAmB,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAe7D;;OAEG;IACH,YAAY,CAAC,SAAS,EAAE,kBAAkB,GAAG,IAAI;IAIjD;;OAEG;IACG,kBAAkB,CAAC,UAAU,SAAI,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC;IAkCjE;;OAEG;IACH,qBAAqB;;;;;;;;;;;;IAUrB;;OAEG;IACH,mBAAmB;;;;;;;;;;;;;IAoBnB,OAAO,CAAC,mBAAmB;IAsB3B,OAAO,CAAC,cAAc;IAStB,OAAO,CAAC,uBAAuB;YAMjB,kBAAkB;YASlB,iBAAiB;YA6BjB,gBAAgB;IAY9B,OAAO,CAAC,QAAQ;IAUhB,OAAO,CAAC,WAAW;YAIL,gBAAgB;IAiC9B,OAAO,CAAC,mBAAmB;IAqB3B,OAAO,CAAC,qBAAqB;CAmB9B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,SAAS,EAChB,YAAY,EAAE,SAAS,GACtB,mBAAmB,CAErB;AAGD,OAAO,EAAE,mBAAmB,IAAI,OAAO,EAAE,CAAC"}
|