@narrative-os/engine 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (71) hide show
  1. package/dist/agents/canonValidator.d.ts +9 -0
  2. package/dist/agents/canonValidator.js +51 -0
  3. package/dist/agents/chapterPlanner.d.ts +50 -0
  4. package/dist/agents/chapterPlanner.js +250 -0
  5. package/dist/agents/completeness.d.ts +7 -0
  6. package/dist/agents/completeness.js +51 -0
  7. package/dist/agents/memoryExtractor.d.ts +12 -0
  8. package/dist/agents/memoryExtractor.js +82 -0
  9. package/dist/agents/stateUpdater.d.ts +30 -0
  10. package/dist/agents/stateUpdater.js +150 -0
  11. package/dist/agents/storyDirector.d.ts +40 -0
  12. package/dist/agents/storyDirector.js +213 -0
  13. package/dist/agents/summarizer.d.ts +8 -0
  14. package/dist/agents/summarizer.js +56 -0
  15. package/dist/agents/tensionController.d.ts +68 -0
  16. package/dist/agents/tensionController.js +197 -0
  17. package/dist/agents/writer.d.ts +12 -0
  18. package/dist/agents/writer.js +148 -0
  19. package/dist/constraints/constraintGraph.d.ts +117 -0
  20. package/dist/constraints/constraintGraph.js +381 -0
  21. package/dist/constraints/validator.d.ts +58 -0
  22. package/dist/constraints/validator.js +236 -0
  23. package/dist/index.d.ts +25 -0
  24. package/dist/index.js +115 -0
  25. package/dist/llm/client.d.ts +14 -0
  26. package/dist/llm/client.js +108 -0
  27. package/dist/memory/canonStore.d.ts +20 -0
  28. package/dist/memory/canonStore.js +110 -0
  29. package/dist/memory/memoryRetriever.d.ts +28 -0
  30. package/dist/memory/memoryRetriever.js +126 -0
  31. package/dist/memory/stateUpdater.d.ts +49 -0
  32. package/dist/memory/stateUpdater.js +315 -0
  33. package/dist/memory/vectorStore.d.ts +41 -0
  34. package/dist/memory/vectorStore.js +166 -0
  35. package/dist/pipeline/generateChapter.d.ts +17 -0
  36. package/dist/pipeline/generateChapter.js +75 -0
  37. package/dist/story/bible.d.ts +4 -0
  38. package/dist/story/bible.js +53 -0
  39. package/dist/story/state.d.ts +3 -0
  40. package/dist/story/state.js +27 -0
  41. package/dist/story/structuredState.d.ts +39 -0
  42. package/dist/story/structuredState.js +159 -0
  43. package/dist/test/canon.test.d.ts +1 -0
  44. package/dist/test/canon.test.js +104 -0
  45. package/dist/test/chapter-planner.test.d.ts +1 -0
  46. package/dist/test/chapter-planner.test.js +171 -0
  47. package/dist/test/constraints.test.d.ts +1 -0
  48. package/dist/test/constraints.test.js +210 -0
  49. package/dist/test/simple.test.d.ts +1 -0
  50. package/dist/test/simple.test.js +51 -0
  51. package/dist/test/state-updater.test.d.ts +1 -0
  52. package/dist/test/state-updater.test.js +200 -0
  53. package/dist/test/story-director.test.d.ts +1 -0
  54. package/dist/test/story-director.test.js +142 -0
  55. package/dist/test/structured-state.test.d.ts +1 -0
  56. package/dist/test/structured-state.test.js +144 -0
  57. package/dist/test/tension-controller.test.d.ts +1 -0
  58. package/dist/test/tension-controller.test.js +116 -0
  59. package/dist/test/vector-memory.test.d.ts +1 -0
  60. package/dist/test/vector-memory.test.js +153 -0
  61. package/dist/test/world-simulation.test.d.ts +1 -0
  62. package/dist/test/world-simulation.test.js +152 -0
  63. package/dist/types/index.d.ts +79 -0
  64. package/dist/types/index.js +3 -0
  65. package/dist/world/characterAgent.d.ts +73 -0
  66. package/dist/world/characterAgent.js +232 -0
  67. package/dist/world/eventResolver.d.ts +52 -0
  68. package/dist/world/eventResolver.js +205 -0
  69. package/dist/world/worldState.d.ts +93 -0
  70. package/dist/world/worldState.js +258 -0
  71. package/package.json +43 -0
@@ -0,0 +1,93 @@
1
+ import type { CharacterAgent } from './characterAgent.js';
2
+ import type { WorldEvent, EventResolution } from './eventResolver.js';
3
+ export interface Location {
4
+ id: string;
5
+ name: string;
6
+ description: string;
7
+ connectedTo: string[];
8
+ characters: string[];
9
+ items: string[];
10
+ events: string[];
11
+ }
12
+ export interface WorldState {
13
+ storyId: string;
14
+ currentChapter: number;
15
+ locations: Map<string, Location>;
16
+ characters: Map<string, CharacterAgent>;
17
+ events: WorldEvent[];
18
+ history: string[];
19
+ globalState: Record<string, any>;
20
+ }
21
+ export declare class WorldStateManager {
22
+ private state;
23
+ constructor(storyId: string);
24
+ /**
25
+ * Initialize world from story bible
26
+ */
27
+ initialize(setting: string, initialCharacters: CharacterAgent[]): void;
28
+ /**
29
+ * Add a new location
30
+ */
31
+ addLocation(id: string, name: string, description: string, connectedTo?: string[]): Location;
32
+ /**
33
+ * Connect two locations
34
+ */
35
+ connectLocations(locId1: string, locId2: string): void;
36
+ /**
37
+ * Move character between locations
38
+ */
39
+ moveCharacter(characterName: string, toLocationId: string): boolean;
40
+ /**
41
+ * Get character's current location
42
+ */
43
+ getCharacterLocation(characterName: string): Location | undefined;
44
+ /**
45
+ * Add character to world
46
+ */
47
+ addCharacter(character: CharacterAgent): void;
48
+ /**
49
+ * Get characters at a location
50
+ */
51
+ getCharactersAtLocation(locationId: string): CharacterAgent[];
52
+ /**
53
+ * Add event to world
54
+ */
55
+ addEvent(event: WorldEvent): void;
56
+ /**
57
+ * Process event resolutions and update world
58
+ */
59
+ applyResolutions(resolutions: EventResolution[]): void;
60
+ /**
61
+ * Advance to next chapter
62
+ */
63
+ advanceChapter(): void;
64
+ /**
65
+ * Set global state value
66
+ */
67
+ setGlobalState(key: string, value: any): void;
68
+ /**
69
+ * Get global state value
70
+ */
71
+ getGlobalState(key: string): any;
72
+ /**
73
+ * Add entry to world history
74
+ */
75
+ private addToHistory;
76
+ /**
77
+ * Get world state summary
78
+ */
79
+ getSummary(): string;
80
+ /**
81
+ * Get full world state
82
+ */
83
+ getState(): WorldState;
84
+ /**
85
+ * Serialize world state
86
+ */
87
+ serialize(): string;
88
+ /**
89
+ * Deserialize world state
90
+ */
91
+ load(data: string): void;
92
+ }
93
+ export declare function createWorldStateManager(storyId: string): WorldStateManager;
@@ -0,0 +1,258 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.WorldStateManager = void 0;
4
+ exports.createWorldStateManager = createWorldStateManager;
5
+ class WorldStateManager {
6
+ state;
7
+ constructor(storyId) {
8
+ this.state = {
9
+ storyId,
10
+ currentChapter: 0,
11
+ locations: new Map(),
12
+ characters: new Map(),
13
+ events: [],
14
+ history: [],
15
+ globalState: {},
16
+ };
17
+ }
18
+ /**
19
+ * Initialize world from story bible
20
+ */
21
+ initialize(setting, initialCharacters) {
22
+ // Create initial location from setting
23
+ const startingLocation = {
24
+ id: 'loc-start',
25
+ name: setting,
26
+ description: `The main setting of the story: ${setting}`,
27
+ connectedTo: [],
28
+ characters: initialCharacters.map(c => c.name),
29
+ items: [],
30
+ events: [],
31
+ };
32
+ this.state.locations.set(startingLocation.id, startingLocation);
33
+ // Add characters
34
+ for (const character of initialCharacters) {
35
+ this.state.characters.set(character.name, character);
36
+ }
37
+ this.addToHistory(`World initialized at ${setting} with ${initialCharacters.length} characters`);
38
+ }
39
+ /**
40
+ * Add a new location
41
+ */
42
+ addLocation(id, name, description, connectedTo = []) {
43
+ const location = {
44
+ id,
45
+ name,
46
+ description,
47
+ connectedTo,
48
+ characters: [],
49
+ items: [],
50
+ events: [],
51
+ };
52
+ this.state.locations.set(id, location);
53
+ this.addToHistory(`Location added: ${name}`);
54
+ return location;
55
+ }
56
+ /**
57
+ * Connect two locations
58
+ */
59
+ connectLocations(locId1, locId2) {
60
+ const loc1 = this.state.locations.get(locId1);
61
+ const loc2 = this.state.locations.get(locId2);
62
+ if (loc1 && loc2) {
63
+ if (!loc1.connectedTo.includes(locId2)) {
64
+ loc1.connectedTo.push(locId2);
65
+ }
66
+ if (!loc2.connectedTo.includes(locId1)) {
67
+ loc2.connectedTo.push(locId1);
68
+ }
69
+ }
70
+ }
71
+ /**
72
+ * Move character between locations
73
+ */
74
+ moveCharacter(characterName, toLocationId) {
75
+ const character = this.state.characters.get(characterName);
76
+ const fromLocation = this.getCharacterLocation(characterName);
77
+ const toLocation = this.state.locations.get(toLocationId);
78
+ if (!character || !toLocation)
79
+ return false;
80
+ // Remove from old location
81
+ if (fromLocation) {
82
+ fromLocation.characters = fromLocation.characters.filter(c => c !== characterName);
83
+ }
84
+ // Add to new location
85
+ if (!toLocation.characters.includes(characterName)) {
86
+ toLocation.characters.push(characterName);
87
+ }
88
+ // Update character location
89
+ character.location = toLocation.name;
90
+ this.addToHistory(`${characterName} moved to ${toLocation.name}`);
91
+ return true;
92
+ }
93
+ /**
94
+ * Get character's current location
95
+ */
96
+ getCharacterLocation(characterName) {
97
+ for (const location of this.state.locations.values()) {
98
+ if (location.characters.includes(characterName)) {
99
+ return location;
100
+ }
101
+ }
102
+ return undefined;
103
+ }
104
+ /**
105
+ * Add character to world
106
+ */
107
+ addCharacter(character) {
108
+ this.state.characters.set(character.name, character);
109
+ // Add to location
110
+ for (const location of this.state.locations.values()) {
111
+ if (location.name === character.location) {
112
+ if (!location.characters.includes(character.name)) {
113
+ location.characters.push(character.name);
114
+ }
115
+ break;
116
+ }
117
+ }
118
+ this.addToHistory(`Character added: ${character.name}`);
119
+ }
120
+ /**
121
+ * Get characters at a location
122
+ */
123
+ getCharactersAtLocation(locationId) {
124
+ const location = this.state.locations.get(locationId);
125
+ if (!location)
126
+ return [];
127
+ return location.characters
128
+ .map(name => this.state.characters.get(name))
129
+ .filter((c) => c !== undefined);
130
+ }
131
+ /**
132
+ * Add event to world
133
+ */
134
+ addEvent(event) {
135
+ this.state.events.push(event);
136
+ // Add to location
137
+ const location = Array.from(this.state.locations.values())
138
+ .find(l => l.name === event.location);
139
+ if (location) {
140
+ location.events.push(event.id);
141
+ }
142
+ this.addToHistory(`Event: ${event.description}`);
143
+ }
144
+ /**
145
+ * Process event resolutions and update world
146
+ */
147
+ applyResolutions(resolutions) {
148
+ for (const resolution of resolutions) {
149
+ // Update event
150
+ const eventIndex = this.state.events.findIndex(e => e.id === resolution.event.id);
151
+ if (eventIndex >= 0) {
152
+ this.state.events[eventIndex] = resolution.event;
153
+ }
154
+ // Add to history
155
+ this.addToHistory(`Resolved: ${resolution.outcome}`);
156
+ // Apply consequences to characters
157
+ for (const characterName of resolution.affectedCharacters) {
158
+ const character = this.state.characters.get(characterName);
159
+ if (character) {
160
+ // Could update emotional state, knowledge, etc. based on consequences
161
+ // For now, just log it
162
+ }
163
+ }
164
+ }
165
+ }
166
+ /**
167
+ * Advance to next chapter
168
+ */
169
+ advanceChapter() {
170
+ this.state.currentChapter++;
171
+ this.addToHistory(`Chapter ${this.state.currentChapter} begins`);
172
+ }
173
+ /**
174
+ * Set global state value
175
+ */
176
+ setGlobalState(key, value) {
177
+ this.state.globalState[key] = value;
178
+ }
179
+ /**
180
+ * Get global state value
181
+ */
182
+ getGlobalState(key) {
183
+ return this.state.globalState[key];
184
+ }
185
+ /**
186
+ * Add entry to world history
187
+ */
188
+ addToHistory(entry) {
189
+ const timestamp = `Ch${this.state.currentChapter}`;
190
+ this.state.history.push(`[${timestamp}] ${entry}`);
191
+ }
192
+ /**
193
+ * Get world state summary
194
+ */
195
+ getSummary() {
196
+ const lines = ['## World State'];
197
+ lines.push(`\n**Current Chapter:** ${this.state.currentChapter}`);
198
+ lines.push(`**Locations:** ${this.state.locations.size}`);
199
+ lines.push(`**Characters:** ${this.state.characters.size}`);
200
+ lines.push(`**Active Events:** ${this.state.events.filter(e => !e.resolved).length}`);
201
+ // Location summary
202
+ lines.push('\n### Locations');
203
+ for (const location of this.state.locations.values()) {
204
+ lines.push(`- **${location.name}**: ${location.characters.length} characters`);
205
+ }
206
+ // Character summary
207
+ lines.push('\n### Character Locations');
208
+ for (const character of this.state.characters.values()) {
209
+ lines.push(`- ${character.name}: ${character.location} (${character.emotionalState})`);
210
+ }
211
+ // Recent history
212
+ lines.push('\n### Recent History');
213
+ for (const entry of this.state.history.slice(-5)) {
214
+ lines.push(`- ${entry}`);
215
+ }
216
+ return lines.join('\n');
217
+ }
218
+ /**
219
+ * Get full world state
220
+ */
221
+ getState() {
222
+ return this.state;
223
+ }
224
+ /**
225
+ * Serialize world state
226
+ */
227
+ serialize() {
228
+ return JSON.stringify({
229
+ storyId: this.state.storyId,
230
+ currentChapter: this.state.currentChapter,
231
+ locations: Array.from(this.state.locations.entries()),
232
+ characters: Array.from(this.state.characters.entries()),
233
+ events: this.state.events,
234
+ history: this.state.history,
235
+ globalState: this.state.globalState,
236
+ });
237
+ }
238
+ /**
239
+ * Deserialize world state
240
+ */
241
+ load(data) {
242
+ const parsed = JSON.parse(data);
243
+ this.state = {
244
+ storyId: parsed.storyId,
245
+ currentChapter: parsed.currentChapter,
246
+ locations: new Map(parsed.locations),
247
+ characters: new Map(parsed.characters),
248
+ events: parsed.events,
249
+ history: parsed.history,
250
+ globalState: parsed.globalState,
251
+ };
252
+ }
253
+ }
254
+ exports.WorldStateManager = WorldStateManager;
255
+ function createWorldStateManager(storyId) {
256
+ return new WorldStateManager(storyId);
257
+ }
258
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ybGRTdGF0ZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy93b3JsZC93b3JsZFN0YXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7OztBQTZUQSwwREFFQztBQXhTRCxNQUFhLGlCQUFpQjtJQUNwQixLQUFLLENBQWE7SUFFMUIsWUFBWSxPQUFlO1FBQ3pCLElBQUksQ0FBQyxLQUFLLEdBQUc7WUFDWCxPQUFPO1lBQ1AsY0FBYyxFQUFFLENBQUM7WUFDakIsU0FBUyxFQUFFLElBQUksR0FBRyxFQUFFO1lBQ3BCLFVBQVUsRUFBRSxJQUFJLEdBQUcsRUFBRTtZQUNyQixNQUFNLEVBQUUsRUFBRTtZQUNWLE9BQU8sRUFBRSxFQUFFO1lBQ1gsV0FBVyxFQUFFLEVBQUU7U0FDaEIsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNILFVBQVUsQ0FBQyxPQUFlLEVBQUUsaUJBQW1DO1FBQzdELHVDQUF1QztRQUN2QyxNQUFNLGdCQUFnQixHQUFhO1lBQ2pDLEVBQUUsRUFBRSxXQUFXO1lBQ2YsSUFBSSxFQUFFLE9BQU87WUFDYixXQUFXLEVBQUUsa0NBQWtDLE9BQU8sRUFBRTtZQUN4RCxXQUFXLEVBQUUsRUFBRTtZQUNmLFVBQVUsRUFBRSxpQkFBaUIsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQzlDLEtBQUssRUFBRSxFQUFFO1lBQ1QsTUFBTSxFQUFFLEVBQUU7U0FDWCxDQUFDO1FBRUYsSUFBSSxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBRWhFLGlCQUFpQjtRQUNqQixLQUFLLE1BQU0sU0FBUyxJQUFJLGlCQUFpQixFQUFFLENBQUM7WUFDMUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsU0FBUyxDQUFD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LGNBQWMsRUFBRSxNQUFNLENBQUMsY0FBYztZQUNyQyxTQUFTLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQztZQUNwQyxVQUFVLEVBQUUsSUFBSSxHQUFHLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQztZQUN0QyxNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDckIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1lBQ3ZCLFdBQVcsRUFBRSxNQUFNLENBQUMsV0FBVztTQUNoQyxDQUFDO0lBQ0osQ0FBQztDQUNGO0FBcFNELDhDQW9TQztBQUVELFNBQWdCLHVCQUF1QixDQUFDLE9BQWU7SUFDckQsT0FBTyxJQUFJLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxDQUFDO0FBQ3hDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IENoYXJhY3RlckFnZW50IH0gZnJvbSAnLi9jaGFyYWN0ZXJBZ2VudC5qcyc7XHJcbmltcG9ydCB0eXBlIHsgV29ybGRFdmVudCwgRXZlbnRSZXNvbHV0aW9uIH0gZnJvbSAnLi9ldmVudFJlc29sdmVyLmpzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgTG9jYXRpb24ge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XHJcbiAgY29ubmVjdGVkVG86IHN0cmluZ1tdO1xyXG4gIGNoYXJhY3RlcnM6IHN0cmluZ1tdO1xyXG4gIGl0ZW1zOiBzdHJpbmdbXTtcclxuICBldmVudHM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFdvcmxkU3RhdGUge1xyXG4gIHN0b3J5SWQ6IHN0cmluZztcclxuICBjdXJyZW50Q2hhcHRlcjogbnVtYmVyO1xyXG4gIGxvY2F0aW9uczogTWFwPHN0cmluZywgTG9jYXRpb24+O1xyXG4gIGNoYXJhY3RlcnM6IE1hcDxzdHJpbmcsIENoYXJhY3RlckFnZW50PjtcclxuICBldmVudHM6IFdvcmxkRXZlbnRbXTtcclxuICBoaXN0b3J5OiBzdHJpbmdbXTtcclxuICBnbG9iYWxTdGF0ZTogUmVjb3JkPHN0cmluZywgYW55PjtcclxufVxyXG5cclxuZXhwb3J0IGNsYXNzIFdvcmxkU3RhdGVNYW5hZ2VyIHtcclxuICBwcml2YXRlIHN0YXRlOiBXb3JsZFN0YXRlO1xyXG4gIFxyXG4gIGNvbnN0cnVjdG9yKHN0b3J5SWQ6IHN0cmluZykge1xyXG4gICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgc3RvcnlJZCxcclxuICAgICAgY3VycmVudENoYXB0ZXI6IDAsXHJcbiAgICAgIGxvY2F0aW9uczogbmV3IE1hcCgpLFxyXG4gICAgICBjaGFyYWN0ZXJzOiBuZXcgTWFwKCksXHJcbiAgICAgIGV2ZW50czogW10sXHJcbiAgICAgIGhpc3Rvcnk6IFtdLFxyXG4gICAgICBnbG9iYWxTdGF0ZToge30sXHJcbiAgICB9O1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBJbml0aWFsaXplIHdvcmxkIGZyb20gc3RvcnkgYmlibGVcclxuICAgKi9cclxuICBpbml0aWFsaXplKHNldHRpbmc6IHN0cmluZywgaW5pdGlhbENoYXJhY3RlcnM6IENoYXJhY3RlckFnZW50W10pOiB2b2lkIHtcclxuICAgIC8vIENyZWF0ZSBpbml0aWFsIGxvY2F0aW9uIGZyb20gc2V0dGluZ1xyXG4gICAgY29uc3Qgc3RhcnRpbmdMb2NhdGlvbjogTG9jYXRpb24gPSB7XHJcbiAgICAgIGlkOiAnbG9jLXN0YXJ0JyxcclxuICAgICAgbmFtZTogc2V0dGluZyxcclxuICAgICAgZGVzY3JpcHRpb246IGBUaGUgbWFpbiBzZXR0aW5nIG9mIHRoZSBzdG9yeTogJHtzZXR0aW5nfWAsXHJcbiAgICAgIGNvbm5lY3RlZFRvOiBbXSxcclxuICAgICAgY2hhcmFjdGVyczogaW5pdGlhbENoYXJhY3RlcnMubWFwKGMgPT4gYy5uYW1lKSxcclxuICAgICAgaXRlbXM6IFtdLFxyXG4gICAgICBldmVudHM6IFtdLFxyXG4gICAgfTtcclxuICAgIFxyXG4gICAgdGhpcy5zdGF0ZS5sb2NhdGlvbnMuc2V0KHN0YXJ0aW5nTG9jYXRpb24uaWQsIHN0YXJ0aW5nTG9jYXRpb24pO1xyXG4gICAgXHJcbiAgICAvLyBBZGQgY2hhcmFjdGVyc1xyXG4gICAgZm9yIChjb25zdCBjaGFyYWN0ZXIgb2YgaW5pdGlhbENoYXJhY3RlcnMpIHtcclxuICAgICAgdGhpcy5zdGF0ZS5jaGFyYWN0ZXJzLnNldChjaGFyYWN0ZXIubmFtZSwgY2hhcmFjdGVyKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdGhpcy5hZGRUb0hpc3RvcnkoYFdvcmxkIGluaXRpYWxpemVkIGF0ICR7c2V0dGluZ30gd2l0aCAke2luaXRpYWxDaGFyYWN0ZXJzLmxlbmd0aH0gY2hhcmFjdGVyc2ApO1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBBZGQgYSBuZXcgbG9jYXRpb25cclxuICAgKi9cclxuICBhZGRMb2NhdGlvbihcclxuICAgIGlkOiBzdHJpbmcsXHJcbiAgICBuYW1lOiBzdHJpbmcsXHJcbiAgICBkZXNjcmlwdGlvbjogc3RyaW5nLFxyXG4gICAgY29ubmVjdGVkVG86IHN0cmluZ1tdID0gW11cclxuICApOiBMb2NhdGlvbiB7XHJcbiAgICBjb25zdCBsb2NhdGlvbjogTG9jYXRpb24gPSB7XHJcbiAgICAgIGlkLFxyXG4gICAgICBuYW1lLFxyXG4gICAgICBkZXNjcmlwdGlvbixcclxuICAgICAgY29ubmVjdGVkVG8sXHJcbiAgICAgIGNoYXJhY3RlcnM6IFtdLFxyXG4gICAgICBpdGVtczogW10sXHJcbiAgICAgIGV2ZW50czogW10sXHJcbiAgICB9O1xyXG4gICAgXHJcbiAgICB0aGlzLnN0YXRlLmxvY2F0aW9ucy5zZXQoaWQsIGxvY2F0aW9uKTtcclxuICAgIHRoaXMuYWRkVG9IaXN0b3J5KGBMb2NhdGlvbiBhZGRlZDogJHtuYW1lfWApO1xyXG4gICAgXHJcbiAgICByZXR1cm4gbG9jYXRpb247XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIENvbm5lY3QgdHdvIGxvY2F0aW9uc1xyXG4gICAqL1xyXG4gIGNvbm5lY3RMb2NhdGlvbnMobG9jSWQxOiBzdHJpbmcsIGxvY0lkMjogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBsb2MxID0gdGhpcy5zdGF0ZS5sb2NhdGlvbnMuZ2V0KGxvY0lkMSk7XHJcbiAgICBjb25zdCBsb2MyID0gdGhpcy5zdGF0ZS5sb2NhdGlvbnMuZ2V0KGxvY0lkMik7XHJcbiAgICBcclxuICAgIGlmIChsb2MxICYmIGxvYzIpIHtcclxuICAgICAgaWYgKCFsb2MxLmNvbm5lY3RlZFRvLmluY2x1ZGVzKGxvY0lkMikpIHtcclxuICAgICAgICBsb2MxLmNvbm5lY3RlZFRvLnB1c2gobG9jSWQyKTtcclxuICAgICAgfVxyXG4gICAgICBpZiAoIWxvYzIuY29ubmVjdGVkVG8uaW5jbHVkZXMobG9jSWQxKSkge1xyXG4gICAgICAgIGxvYzIuY29ubmVjdGVkVG8ucHVzaChsb2NJZDEpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIE1vdmUgY2hhcmFjdGVyIGJldHdlZW4gbG9jYXRpb25zXHJcbiAgICovXHJcbiAgbW92ZUNoYXJhY3RlcihjaGFyYWN0ZXJOYW1lOiBzdHJpbmcsIHRvTG9jYXRpb25JZDogc3RyaW5nKTogYm9vbGVhbiB7XHJcbiAgICBjb25zdCBjaGFyYWN0ZXIgPSB0aGlzLnN0YXRlLmNoYXJhY3RlcnMuZ2V0KGNoYXJhY3Rlck5hbWUpO1xyXG4gICAgY29uc3QgZnJvbUxvY2F0aW9uID0gdGhpcy5nZXRDaGFyYWN0ZXJMb2NhdGlvbihjaGFyYWN0ZXJOYW1lKTtcclxuICAgIGNvbnN0IHRvTG9jYXRpb24gPSB0aGlzLnN0YXRlLmxvY2F0aW9ucy5nZXQodG9Mb2NhdGlvbklkKTtcclxuICAgIFxyXG4gICAgaWYgKCFjaGFyYWN0ZXIgfHwgIXRvTG9jYXRpb24pIHJldHVybiBmYWxzZTtcclxuICAgIFxyXG4gICAgLy8gUmVtb3ZlIGZyb20gb2xkIGxvY2F0aW9uXHJcbiAgICBpZiAoZnJvbUxvY2F0aW9uKSB7XHJcbiAgICAgIGZyb21Mb2NhdGlvbi5jaGFyYWN0ZXJzID0gZnJvbUxvY2F0aW9uLmNoYXJhY3RlcnMuZmlsdGVyKGMgPT4gYyAhPT0gY2hhcmFjdGVyTmFtZSk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIEFkZCB0byBuZXcgbG9jYXRpb25cclxuICAgIGlmICghdG9Mb2NhdGlvbi5jaGFyYWN0ZXJzLmluY2x1ZGVzKGNoYXJhY3Rlck5hbWUpKSB7XHJcbiAgICAgIHRvTG9jYXRpb24uY2hhcmFjdGVycy5wdXNoKGNoYXJhY3Rlck5hbWUpO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBVcGRhdGUgY2hhcmFjdGVyIGxvY2F0aW9uXHJcbiAgICBjaGFyYWN0ZXIubG9jYXRpb24gPSB0b0xvY2F0aW9uLm5hbWU7XHJcbiAgICBcclxuICAgIHRoaXMuYWRkVG9IaXN0b3J5KGAke2NoYXJhY3Rlck5hbWV9IG1vdmVkIHRvICR7dG9Mb2NhdGlvbi5uYW1lfWApO1xyXG4gICAgcmV0dXJuIHRydWU7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEdldCBjaGFyYWN0ZXIncyBjdXJyZW50IGxvY2F0aW9uXHJcbiAgICovXHJcbiAgZ2V0Q2hhcmFjdGVyTG9jYXRpb24oY2hhcmFjdGVyTmFtZTogc3RyaW5nKTogTG9jYXRpb24gfCB1bmRlZmluZWQge1xyXG4gICAgZm9yIChjb25zdCBsb2NhdGlvbiBvZiB0aGlzLnN0YXRlLmxvY2F0aW9ucy52YWx1ZXMoKSkge1xyXG4gICAgICBpZiAobG9jYXRpb24uY2hhcmFjdGVycy5pbmNsdWRlcyhjaGFyYWN0ZXJOYW1lKSkge1xyXG4gICAgICAgIHJldHVybiBsb2NhdGlvbjtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgcmV0dXJuIHVuZGVmaW5lZDtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQWRkIGNoYXJhY3RlciB0byB3b3JsZFxyXG4gICAqL1xyXG4gIGFkZENoYXJhY3RlcihjaGFyYWN0ZXI6IENoYXJhY3RlckFnZW50KTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXRlLmNoYXJhY3RlcnMuc2V0KGNoYXJhY3Rlci5uYW1lLCBjaGFyYWN0ZXIpO1xyXG4gICAgXHJcbiAgICAvLyBBZGQgdG8gbG9jYXRpb25cclxuICAgIGZvciAoY29uc3QgbG9jYXRpb24gb2YgdGhpcy5zdGF0ZS5sb2NhdGlvbnMudmFsdWVzKCkpIHtcclxuICAgICAgaWYgKGxvY2F0aW9uLm5hbWUgPT09IGNoYXJhY3Rlci5sb2NhdGlvbikge1xyXG4gICAgICAgIGlmICghbG9jYXRpb24uY2hhcmFjdGVycy5pbmNsdWRlcyhjaGFyYWN0ZXIubmFtZSkpIHtcclxuICAgICAgICAgIGxvY2F0aW9uLmNoYXJhY3RlcnMucHVzaChjaGFyYWN0ZXIubmFtZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMuYWRkVG9IaXN0b3J5KGBDaGFyYWN0ZXIgYWRkZWQ6ICR7Y2hhcmFjdGVyLm5hbWV9YCk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEdldCBjaGFyYWN0ZXJzIGF0IGEgbG9jYXRpb25cclxuICAgKi9cclxuICBnZXRDaGFyYWN0ZXJzQXRMb2NhdGlvbihsb2NhdGlvbklkOiBzdHJpbmcpOiBDaGFyYWN0ZXJBZ2VudFtdIHtcclxuICAgIGNvbnN0IGxvY2F0aW9uID0gdGhpcy5zdGF0ZS5sb2NhdGlvbnMuZ2V0KGxvY2F0aW9uSWQpO1xyXG4gICAgaWYgKCFsb2NhdGlvbikgcmV0dXJuIFtdO1xyXG4gICAgXHJcbiAgICByZXR1cm4gbG9jYXRpb24uY2hhcmFjdGVyc1xyXG4gICAgICAubWFwKG5hbWUgPT4gdGhpcy5zdGF0ZS5jaGFyYWN0ZXJzLmdldChuYW1lKSlcclxuICAgICAgLmZpbHRlcigoYyk6IGMgaXMgQ2hhcmFjdGVyQWdlbnQgPT4gYyAhPT0gdW5kZWZpbmVkKTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogQWRkIGV2ZW50IHRvIHdvcmxkXHJcbiAgICovXHJcbiAgYWRkRXZlbnQoZXZlbnQ6IFdvcmxkRXZlbnQpOiB2b2lkIHtcclxuICAgIHRoaXMuc3RhdGUuZXZlbnRzLnB1c2goZXZlbnQpO1xyXG4gICAgXHJcbiAgICAvLyBBZGQgdG8gbG9jYXRpb25cclxuICAgIGNvbnN0IGxvY2F0aW9uID0gQXJyYXkuZnJvbSh0aGlzLnN0YXRlLmxvY2F0aW9ucy52YWx1ZXMoKSlcclxuICAgICAgLmZpbmQobCA9PiBsLm5hbWUgPT09IGV2ZW50LmxvY2F0aW9uKTtcclxuICAgIGlmIChsb2NhdGlvbikge1xyXG4gICAgICBsb2NhdGlvbi5ldmVudHMucHVzaChldmVudC5pZCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHRoaXMuYWRkVG9IaXN0b3J5KGBFdmVudDogJHtldmVudC5kZXNjcmlwdGlvbn1gKTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogUHJvY2VzcyBldmVudCByZXNvbHV0aW9ucyBhbmQgdXBkYXRlIHdvcmxkXHJcbiAgICovXHJcbiAgYXBwbHlSZXNvbHV0aW9ucyhyZXNvbHV0aW9uczogRXZlbnRSZXNvbHV0aW9uW10pOiB2b2lkIHtcclxuICAgIGZvciAoY29uc3QgcmVzb2x1dGlvbiBvZiByZXNvbHV0aW9ucykge1xyXG4gICAgICAvLyBVcGRhdGUgZXZlbnRcclxuICAgICAgY29uc3QgZXZlbnRJbmRleCA9IHRoaXMuc3RhdGUuZXZlbnRzLmZpbmRJbmRleChlID0+IGUuaWQgPT09IHJlc29sdXRpb24uZXZlbnQuaWQpO1xyXG4gICAgICBpZiAoZXZlbnRJbmRleCA+PSAwKSB7XHJcbiAgICAgICAgdGhpcy5zdGF0ZS5ldmVudHNbZXZlbnRJbmRleF0gPSByZXNvbHV0aW9uLmV2ZW50O1xyXG4gICAgICB9XHJcbiAgICAgIFxyXG4gICAgICAvLyBBZGQgdG8gaGlzdG9yeVxyXG4gICAgICB0aGlzLmFkZFRvSGlzdG9yeShgUmVzb2x2ZWQ6ICR7cmVzb2x1dGlvbi5vdXRjb21lfWApO1xyXG4gICAgICBcclxuICAgICAgLy8gQXBwbHkgY29uc2VxdWVuY2VzIHRvIGNoYXJhY3RlcnNcclxuICAgICAgZm9yIChjb25zdCBjaGFyYWN0ZXJOYW1lIG9mIHJlc29sdXRpb24uYWZmZWN0ZWRDaGFyYWN0ZXJzKSB7XHJcbiAgICAgICAgY29uc3QgY2hhcmFjdGVyID0gdGhpcy5zdGF0ZS5jaGFyYWN0ZXJzLmdldChjaGFyYWN0ZXJOYW1lKTtcclxuICAgICAgICBpZiAoY2hhcmFjdGVyKSB7XHJcbiAgICAgICAgICAvLyBDb3VsZCB1cGRhdGUgZW1vdGlvbmFsIHN0YXRlLCBrbm93bGVkZ2UsIGV0Yy4gYmFzZWQgb24gY29uc2VxdWVuY2VzXHJcbiAgICAgICAgICAvLyBGb3Igbm93LCBqdXN0IGxvZyBpdFxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBBZHZhbmNlIHRvIG5leHQgY2hhcHRlclxyXG4gICAqL1xyXG4gIGFkdmFuY2VDaGFwdGVyKCk6IHZvaWQge1xyXG4gICAgdGhpcy5zdGF0ZS5jdXJyZW50Q2hhcHRlcisrO1xyXG4gICAgdGhpcy5hZGRUb0hpc3RvcnkoYENoYXB0ZXIgJHt0aGlzLnN0YXRlLmN1cnJlbnRDaGFwdGVyfSBiZWdpbnNgKTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogU2V0IGdsb2JhbCBzdGF0ZSB2YWx1ZVxyXG4gICAqL1xyXG4gIHNldEdsb2JhbFN0YXRlKGtleTogc3RyaW5nLCB2YWx1ZTogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnN0YXRlLmdsb2JhbFN0YXRlW2tleV0gPSB2YWx1ZTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogR2V0IGdsb2JhbCBzdGF0ZSB2YWx1ZVxyXG4gICAqL1xyXG4gIGdldEdsb2JhbFN0YXRlKGtleTogc3RyaW5nKTogYW55IHtcclxuICAgIHJldHVybiB0aGlzLnN0YXRlLmdsb2JhbFN0YXRlW2tleV07XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEFkZCBlbnRyeSB0byB3b3JsZCBoaXN0b3J5XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhZGRUb0hpc3RvcnkoZW50cnk6IHN0cmluZyk6IHZvaWQge1xyXG4gICAgY29uc3QgdGltZXN0YW1wID0gYENoJHt0aGlzLnN0YXRlLmN1cnJlbnRDaGFwdGVyfWA7XHJcbiAgICB0aGlzLnN0YXRlLmhpc3RvcnkucHVzaChgWyR7dGltZXN0YW1wfV0gJHtlbnRyeX1gKTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogR2V0IHdvcmxkIHN0YXRlIHN1bW1hcnlcclxuICAgKi9cclxuICBnZXRTdW1tYXJ5KCk6IHN0cmluZyB7XHJcbiAgICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbJyMjIFdvcmxkIFN0YXRlJ107XHJcbiAgICBcclxuICAgIGxpbmVzLnB1c2goYFxcbioqQ3VycmVudCBDaGFwdGVyOioqICR7dGhpcy5zdGF0ZS5jdXJyZW50Q2hhcHRlcn1gKTtcclxuICAgIGxpbmVzLnB1c2goYCoqTG9jYXRpb25zOioqICR7dGhpcy5zdGF0ZS5sb2NhdGlvbnMuc2l6ZX1gKTtcclxuICAgIGxpbmVzLnB1c2goYCoqQ2hhcmFjdGVyczoqKiAke3RoaXMuc3RhdGUuY2hhcmFjdGVycy5zaXplfWApO1xyXG4gICAgbGluZXMucHVzaChgKipBY3RpdmUgRXZlbnRzOioqICR7dGhpcy5zdGF0ZS5ldmVudHMuZmlsdGVyKGUgPT4gIWUucmVzb2x2ZWQpLmxlbmd0aH1gKTtcclxuICAgIFxyXG4gICAgLy8gTG9jYXRpb24gc3VtbWFyeVxyXG4gICAgbGluZXMucHVzaCgnXFxuIyMjIExvY2F0aW9ucycpO1xyXG4gICAgZm9yIChjb25zdCBsb2NhdGlvbiBvZiB0aGlzLnN0YXRlLmxvY2F0aW9ucy52YWx1ZXMoKSkge1xyXG4gICAgICBsaW5lcy5wdXNoKGAtICoqJHtsb2NhdGlvbi5uYW1lfSoqOiAke2xvY2F0aW9uLmNoYXJhY3RlcnMubGVuZ3RofSBjaGFyYWN0ZXJzYCk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIENoYXJhY3RlciBzdW1tYXJ5XHJcbiAgICBsaW5lcy5wdXNoKCdcXG4jIyMgQ2hhcmFjdGVyIExvY2F0aW9ucycpO1xyXG4gICAgZm9yIChjb25zdCBjaGFyYWN0ZXIgb2YgdGhpcy5zdGF0ZS5jaGFyYWN0ZXJzLnZhbHVlcygpKSB7XHJcbiAgICAgIGxpbmVzLnB1c2goYC0gJHtjaGFyYWN0ZXIubmFtZX06ICR7Y2hhcmFjdGVyLmxvY2F0aW9ufSAoJHtjaGFyYWN0ZXIuZW1vdGlvbmFsU3RhdGV9KWApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICAvLyBSZWNlbnQgaGlzdG9yeVxyXG4gICAgbGluZXMucHVzaCgnXFxuIyMjIFJlY2VudCBIaXN0b3J5Jyk7XHJcbiAgICBmb3IgKGNvbnN0IGVudHJ5IG9mIHRoaXMuc3RhdGUuaGlzdG9yeS5zbGljZSgtNSkpIHtcclxuICAgICAgbGluZXMucHVzaChgLSAke2VudHJ5fWApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEdldCBmdWxsIHdvcmxkIHN0YXRlXHJcbiAgICovXHJcbiAgZ2V0U3RhdGUoKTogV29ybGRTdGF0ZSB7XHJcbiAgICByZXR1cm4gdGhpcy5zdGF0ZTtcclxuICB9XHJcbiAgXHJcbiAgLyoqXHJcbiAgICogU2VyaWFsaXplIHdvcmxkIHN0YXRlXHJcbiAgICovXHJcbiAgc2VyaWFsaXplKCk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoe1xyXG4gICAgICBzdG9yeUlkOiB0aGlzLnN0YXRlLnN0b3J5SWQsXHJcbiAgICAgIGN1cnJlbnRDaGFwdGVyOiB0aGlzLnN0YXRlLmN1cnJlbnRDaGFwdGVyLFxyXG4gICAgICBsb2NhdGlvbnM6IEFycmF5LmZyb20odGhpcy5zdGF0ZS5sb2NhdGlvbnMuZW50cmllcygpKSxcclxuICAgICAgY2hhcmFjdGVyczogQXJyYXkuZnJvbSh0aGlzLnN0YXRlLmNoYXJhY3RlcnMuZW50cmllcygpKSxcclxuICAgICAgZXZlbnRzOiB0aGlzLnN0YXRlLmV2ZW50cyxcclxuICAgICAgaGlzdG9yeTogdGhpcy5zdGF0ZS5oaXN0b3J5LFxyXG4gICAgICBnbG9iYWxTdGF0ZTogdGhpcy5zdGF0ZS5nbG9iYWxTdGF0ZSxcclxuICAgIH0pO1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBEZXNlcmlhbGl6ZSB3b3JsZCBzdGF0ZVxyXG4gICAqL1xyXG4gIGxvYWQoZGF0YTogc3RyaW5nKTogdm9pZCB7XHJcbiAgICBjb25zdCBwYXJzZWQgPSBKU09OLnBhcnNlKGRhdGEpO1xyXG4gICAgdGhpcy5zdGF0ZSA9IHtcclxuICAgICAgc3RvcnlJZDogcGFyc2VkLnN0b3J5SWQsXHJcbiAgICAgIGN1cnJlbnRDaGFwdGVyOiBwYXJzZWQuY3VycmVudENoYXB0ZXIsXHJcbiAgICAgIGxvY2F0aW9uczogbmV3IE1hcChwYXJzZWQubG9jYXRpb25zKSxcclxuICAgICAgY2hhcmFjdGVyczogbmV3IE1hcChwYXJzZWQuY2hhcmFjdGVycyksXHJcbiAgICAgIGV2ZW50czogcGFyc2VkLmV2ZW50cyxcclxuICAgICAgaGlzdG9yeTogcGFyc2VkLmhpc3RvcnksXHJcbiAgICAgIGdsb2JhbFN0YXRlOiBwYXJzZWQuZ2xvYmFsU3RhdGUsXHJcbiAgICB9O1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdvcmxkU3RhdGVNYW5hZ2VyKHN0b3J5SWQ6IHN0cmluZyk6IFdvcmxkU3RhdGVNYW5hZ2VyIHtcclxuICByZXR1cm4gbmV3IFdvcmxkU3RhdGVNYW5hZ2VyKHN0b3J5SWQpO1xyXG59XHJcbiJdfQ==
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "@narrative-os/engine",
3
+ "version": "0.1.0",
4
+ "description": "Core narrative engine for AI-powered story generation",
5
+ "main": "dist/index.js",
6
+ "types": "dist/index.d.ts",
7
+ "files": [
8
+ "dist"
9
+ ],
10
+ "scripts": {
11
+ "build": "tsc",
12
+ "dev": "tsc --watch",
13
+ "lint": "eslint src/**/*.ts",
14
+ "prepublishOnly": "npm run build"
15
+ },
16
+ "keywords": [
17
+ "ai",
18
+ "story",
19
+ "narrative",
20
+ "writing",
21
+ "llm",
22
+ "memory",
23
+ "hnsw"
24
+ ],
25
+ "author": "Your Name",
26
+ "license": "MIT",
27
+ "repository": {
28
+ "type": "git",
29
+ "url": "https://github.com/liwonder/NARRITIVE_OS.git"
30
+ },
31
+ "engines": {
32
+ "node": ">=20.0.0"
33
+ },
34
+ "dependencies": {
35
+ "hnswlib-node": "^3.0.0",
36
+ "openai": "^4.52.0",
37
+ "zod": "^3.23.0"
38
+ },
39
+ "devDependencies": {
40
+ "@types/node": "^20.0.0",
41
+ "typescript": "^5.4.0"
42
+ }
43
+ }