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.
Files changed (154) hide show
  1. package/README.md +959 -5
  2. package/dist/cli/audit.js +6 -4
  3. package/dist/cli/audit.js.map +1 -1
  4. package/dist/cli/init.js +11 -9
  5. package/dist/cli/init.js.map +1 -1
  6. package/dist/cli/perf.d.ts +30 -0
  7. package/dist/cli/perf.d.ts.map +1 -0
  8. package/dist/cli/perf.js +220 -0
  9. package/dist/cli/perf.js.map +1 -0
  10. package/dist/cli/play.d.ts +4 -0
  11. package/dist/cli/play.d.ts.map +1 -0
  12. package/dist/cli/play.js +259 -0
  13. package/dist/cli/play.js.map +1 -0
  14. package/dist/engine/condition.d.ts +69 -0
  15. package/dist/engine/condition.d.ts.map +1 -0
  16. package/dist/engine/condition.js +195 -0
  17. package/dist/engine/condition.js.map +1 -0
  18. package/dist/engine/core.d.ts +378 -11
  19. package/dist/engine/core.d.ts.map +1 -1
  20. package/dist/engine/core.js +1433 -13
  21. package/dist/engine/core.js.map +1 -1
  22. package/dist/engine/demo-story.d.ts.map +1 -1
  23. package/dist/engine/demo-story.js +103 -14
  24. package/dist/engine/demo-story.js.map +1 -1
  25. package/dist/engine/errors.d.ts +76 -0
  26. package/dist/engine/errors.d.ts.map +1 -0
  27. package/dist/engine/errors.js +178 -0
  28. package/dist/engine/errors.js.map +1 -0
  29. package/dist/engine/types.d.ts +445 -0
  30. package/dist/engine/types.d.ts.map +1 -0
  31. package/dist/engine/types.js +9 -0
  32. package/dist/engine/types.js.map +1 -0
  33. package/dist/engine/validation.d.ts +110 -0
  34. package/dist/engine/validation.d.ts.map +1 -0
  35. package/dist/engine/validation.js +261 -0
  36. package/dist/engine/validation.js.map +1 -0
  37. package/dist/examples/examples/autosave-undo-demo.js +248 -0
  38. package/dist/examples/examples/persistence-demo.js +63 -0
  39. package/dist/examples/src/engine/condition.js +194 -0
  40. package/dist/examples/src/engine/core.js +1382 -0
  41. package/dist/examples/src/engine/demo-story.js +200 -0
  42. package/dist/examples/src/engine/types.js +8 -0
  43. package/dist/examples/src/index.js +35 -0
  44. package/dist/examples/src/integrations/react.js +322 -0
  45. package/dist/examples/src/narrative/branching/engine-simple.js +348 -0
  46. package/dist/examples/src/narrative/branching/index.js +55 -0
  47. package/dist/examples/src/narrative/branching/models.js +5 -0
  48. package/dist/examples/src/performance/ObjectPool.js +296 -0
  49. package/dist/examples/src/performance/PerfReporter.js +280 -0
  50. package/dist/examples/src/performance/ThreadPool.js +347 -0
  51. package/dist/index.d.ts +4 -0
  52. package/dist/index.d.ts.map +1 -1
  53. package/dist/index.js +35 -3
  54. package/dist/index.js.map +1 -1
  55. package/dist/integrations/react.d.ts +200 -0
  56. package/dist/integrations/react.d.ts.map +1 -0
  57. package/dist/integrations/react.js +365 -0
  58. package/dist/integrations/react.js.map +1 -0
  59. package/dist/narrative/branching/engine-simple.d.ts +84 -0
  60. package/dist/narrative/branching/engine-simple.d.ts.map +1 -0
  61. package/dist/narrative/branching/engine-simple.js +349 -0
  62. package/dist/narrative/branching/engine-simple.js.map +1 -0
  63. package/dist/narrative/branching/engine.d.ts +1 -0
  64. package/dist/narrative/branching/engine.d.ts.map +1 -0
  65. package/dist/narrative/branching/engine.js +2 -0
  66. package/dist/narrative/branching/engine.js.map +1 -0
  67. package/dist/narrative/branching/index.d.ts +12 -0
  68. package/dist/narrative/branching/index.d.ts.map +1 -0
  69. package/dist/narrative/branching/index.js +56 -0
  70. package/dist/narrative/branching/index.js.map +1 -0
  71. package/dist/narrative/branching/models.d.ts +223 -0
  72. package/dist/narrative/branching/models.d.ts.map +1 -0
  73. package/dist/narrative/branching/models.js +6 -0
  74. package/dist/narrative/branching/models.js.map +1 -0
  75. package/dist/performance/HotReloadDelta.d.ts +124 -0
  76. package/dist/performance/HotReloadDelta.d.ts.map +1 -0
  77. package/dist/performance/HotReloadDelta.js +328 -0
  78. package/dist/performance/HotReloadDelta.js.map +1 -0
  79. package/dist/performance/ObjectPool.d.ts +150 -0
  80. package/dist/performance/ObjectPool.d.ts.map +1 -0
  81. package/dist/performance/ObjectPool.js +297 -0
  82. package/dist/performance/ObjectPool.js.map +1 -0
  83. package/dist/performance/PerfReporter.d.ts +123 -0
  84. package/dist/performance/PerfReporter.d.ts.map +1 -0
  85. package/dist/performance/PerfReporter.js +281 -0
  86. package/dist/performance/PerfReporter.js.map +1 -0
  87. package/dist/performance/ThreadPool.d.ts +107 -0
  88. package/dist/performance/ThreadPool.d.ts.map +1 -0
  89. package/dist/performance/ThreadPool.js +348 -0
  90. package/dist/performance/ThreadPool.js.map +1 -0
  91. package/dist/ui/__tests__/AutosaveIndicator.test.d.ts +2 -0
  92. package/dist/ui/__tests__/AutosaveIndicator.test.d.ts.map +1 -0
  93. package/dist/ui/__tests__/AutosaveIndicator.test.js +329 -0
  94. package/dist/ui/__tests__/AutosaveIndicator.test.js.map +1 -0
  95. package/dist/ui/__tests__/UndoRedoControls.test.d.ts +2 -0
  96. package/dist/ui/__tests__/UndoRedoControls.test.d.ts.map +1 -0
  97. package/dist/ui/__tests__/UndoRedoControls.test.js +245 -0
  98. package/dist/ui/__tests__/UndoRedoControls.test.js.map +1 -0
  99. package/dist/ui/__tests__/autosave-simple.test.d.ts +2 -0
  100. package/dist/ui/__tests__/autosave-simple.test.d.ts.map +1 -0
  101. package/dist/ui/__tests__/autosave-simple.test.js +29 -0
  102. package/dist/ui/__tests__/autosave-simple.test.js.map +1 -0
  103. package/dist/ui/__tests__/setup.d.ts +2 -0
  104. package/dist/ui/__tests__/setup.d.ts.map +1 -0
  105. package/dist/ui/__tests__/setup.js +40 -0
  106. package/dist/ui/__tests__/setup.js.map +1 -0
  107. package/dist/ui/__tests__/smoke-test.d.ts +2 -0
  108. package/dist/ui/__tests__/smoke-test.d.ts.map +1 -0
  109. package/dist/ui/__tests__/smoke-test.js +18 -0
  110. package/dist/ui/__tests__/smoke-test.js.map +1 -0
  111. package/dist/ui/__tests__/smoke-test.test.d.ts +2 -0
  112. package/dist/ui/__tests__/smoke-test.test.d.ts.map +1 -0
  113. package/dist/ui/__tests__/smoke-test.test.js +18 -0
  114. package/dist/ui/__tests__/smoke-test.test.js.map +1 -0
  115. package/dist/ui/__tests__/useKeyboardShortcuts.test.d.ts +2 -0
  116. package/dist/ui/__tests__/useKeyboardShortcuts.test.d.ts.map +1 -0
  117. package/dist/ui/__tests__/useKeyboardShortcuts.test.js +374 -0
  118. package/dist/ui/__tests__/useKeyboardShortcuts.test.js.map +1 -0
  119. package/dist/ui/components/AutosaveIndicator.d.ts +18 -0
  120. package/dist/ui/components/AutosaveIndicator.d.ts.map +1 -0
  121. package/dist/ui/components/AutosaveIndicator.js +175 -0
  122. package/dist/ui/components/AutosaveIndicator.js.map +1 -0
  123. package/dist/ui/components/UndoRedoControls.d.ts +16 -0
  124. package/dist/ui/components/UndoRedoControls.d.ts.map +1 -0
  125. package/dist/ui/components/UndoRedoControls.js +144 -0
  126. package/dist/ui/components/UndoRedoControls.js.map +1 -0
  127. package/dist/ui/hooks/useKeyboardShortcuts.d.ts +22 -0
  128. package/dist/ui/hooks/useKeyboardShortcuts.d.ts.map +1 -0
  129. package/dist/ui/hooks/useKeyboardShortcuts.js +162 -0
  130. package/dist/ui/hooks/useKeyboardShortcuts.js.map +1 -0
  131. package/dist/ui/index.d.ts +9 -0
  132. package/dist/ui/index.d.ts.map +1 -0
  133. package/dist/ui/index.js +14 -0
  134. package/dist/ui/index.js.map +1 -0
  135. package/dist/ui/types.d.ts +141 -0
  136. package/dist/ui/types.d.ts.map +1 -0
  137. package/dist/ui/types.js +51 -0
  138. package/dist/ui/types.js.map +1 -0
  139. package/docs/PERFORMANCE.md +355 -0
  140. package/docs/branching/ERD.md +214 -0
  141. package/docs/branching/PDM.md +443 -0
  142. package/docs/branching/RELEASE-v1.2.0.md +169 -0
  143. package/examples/autosave-undo-demo.ts +306 -0
  144. package/examples/branching-advanced-demo.ts +339 -0
  145. package/examples/branching-demo-simple.ts +0 -0
  146. package/examples/branching-demo.ts +0 -0
  147. package/examples/branching-quickstart.ts +314 -0
  148. package/examples/persistence-demo.ts +84 -0
  149. package/examples/quickstart-demo.js +82 -0
  150. package/examples/tsconfig.json +13 -0
  151. package/examples/ui-components-demo.tsx +320 -0
  152. package/examples/validation-demo-story.json +177 -0
  153. package/examples/validation-demo.js +163 -0
  154. 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"}