@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,110 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createCanonStore = createCanonStore;
4
+ exports.extractCanonFromBible = extractCanonFromBible;
5
+ exports.addFact = addFact;
6
+ exports.getFactsByCategory = getFactsByCategory;
7
+ exports.getFact = getFact;
8
+ exports.updateFact = updateFact;
9
+ exports.formatCanonForPrompt = formatCanonForPrompt;
10
+ function createCanonStore(storyId) {
11
+ return {
12
+ storyId,
13
+ facts: [],
14
+ };
15
+ }
16
+ function extractCanonFromBible(bible) {
17
+ const store = createCanonStore(bible.id);
18
+ for (const char of bible.characters) {
19
+ addFact(store, {
20
+ category: 'character',
21
+ subject: char.name,
22
+ attribute: 'role',
23
+ value: char.role,
24
+ chapterEstablished: 0,
25
+ });
26
+ if (char.background) {
27
+ addFact(store, {
28
+ category: 'character',
29
+ subject: char.name,
30
+ attribute: 'background',
31
+ value: char.background,
32
+ chapterEstablished: 0,
33
+ });
34
+ }
35
+ }
36
+ for (const thread of bible.plotThreads) {
37
+ addFact(store, {
38
+ category: 'plot',
39
+ subject: thread.name,
40
+ attribute: 'status',
41
+ value: thread.status,
42
+ chapterEstablished: 0,
43
+ });
44
+ }
45
+ return store;
46
+ }
47
+ function addFact(store, fact) {
48
+ const newFact = {
49
+ ...fact,
50
+ id: generateId(),
51
+ };
52
+ return {
53
+ ...store,
54
+ facts: [...store.facts, newFact],
55
+ };
56
+ }
57
+ function getFactsByCategory(store, category) {
58
+ return store.facts.filter(f => f.category === category);
59
+ }
60
+ function getFact(store, subject, attribute) {
61
+ return store.facts.find(f => f.subject === subject && f.attribute === attribute);
62
+ }
63
+ function updateFact(store, subject, attribute, value, chapter) {
64
+ const existingIndex = store.facts.findIndex(f => f.subject === subject && f.attribute === attribute);
65
+ if (existingIndex >= 0) {
66
+ const updatedFacts = [...store.facts];
67
+ updatedFacts[existingIndex] = {
68
+ ...updatedFacts[existingIndex],
69
+ value,
70
+ chapterEstablished: chapter,
71
+ };
72
+ return { ...store, facts: updatedFacts };
73
+ }
74
+ return addFact(store, {
75
+ category: 'plot',
76
+ subject,
77
+ attribute,
78
+ value,
79
+ chapterEstablished: chapter,
80
+ });
81
+ }
82
+ function formatCanonForPrompt(store) {
83
+ const lines = ['## Story Canon (NEVER contradict these facts)'];
84
+ const characters = getFactsByCategory(store, 'character');
85
+ if (characters.length > 0) {
86
+ lines.push('\n### Characters');
87
+ for (const fact of characters) {
88
+ lines.push(`- ${fact.subject}: ${fact.attribute} = ${fact.value}`);
89
+ }
90
+ }
91
+ const world = getFactsByCategory(store, 'world');
92
+ if (world.length > 0) {
93
+ lines.push('\n### World');
94
+ for (const fact of world) {
95
+ lines.push(`- ${fact.subject}: ${fact.attribute} = ${fact.value}`);
96
+ }
97
+ }
98
+ const plot = getFactsByCategory(store, 'plot');
99
+ if (plot.length > 0) {
100
+ lines.push('\n### Plot');
101
+ for (const fact of plot) {
102
+ lines.push(`- ${fact.subject}: ${fact.attribute} = ${fact.value}`);
103
+ }
104
+ }
105
+ return lines.join('\n');
106
+ }
107
+ function generateId() {
108
+ return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
109
+ }
110
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fub25TdG9yZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tZW1vcnkvY2Fub25TdG9yZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWdCQSw0Q0FLQztBQUVELHNEQWtDQztBQUVELDBCQVNDO0FBRUQsZ0RBRUM7QUFFRCwwQkFFQztBQUVELGdDQW9CQztBQUVELG9EQTRCQztBQWhIRCxTQUFnQixnQkFBZ0IsQ0FBQyxPQUFlO0lBQzlDLE9BQU87UUFDTCxPQUFPO1FBQ1AsS0FBSyxFQUFFLEVBQUU7S0FDVixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLHFCQUFxQixDQUFDLEtBQWlCO0lBQ3JELE1BQU0sS0FBSyxHQUFHLGdCQUFnQixDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUV6QyxLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUNwQyxPQUFPLENBQUMsS0FBSyxFQUFFO1lBQ2IsUUFBUSxFQUFFLFdBQVc7WUFDckIsT0FBTyxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2xCLFNBQVMsRUFBRSxNQUFNO1lBQ2pCLEtBQUssRUFBRSxJQUFJLENBQUMsSUFBSTtZQUNoQixrQkFBa0IsRUFBRSxDQUFDO1NBQ3RCLENBQUMsQ0FBQztRQUVILElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDO1lBQ3BCLE9BQU8sQ0FBQyxLQUFLLEVBQUU7Z0JBQ2IsUUFBUSxFQUFFLFdBQVc7Z0JBQ3JCLE9BQU8sRUFBRSxJQUFJLENBQUMsSUFBSTtnQkFDbEIsU0FBUyxFQUFFLFlBQVk7Z0JBQ3ZCLEtBQUssRUFBRSxJQUFJLENBQUMsVUFBVTtnQkFDdEIsa0JBQWtCLEVBQUUsQ0FBQzthQUN0QixDQUFDLENBQUM7UUFDTCxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssTUFBTSxNQUFNLElBQUksS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ3ZDLE9BQU8sQ0FBQyxLQUFLLEVB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QyxFQUFFLENBQUM7UUFDckIsS0FBSyxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxQixLQUFLLE1BQU0sSUFBSSxJQUFJLEtBQUssRUFBRSxDQUFDO1lBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsT0FBTyxLQUFLLElBQUksQ0FBQyxTQUFTLE1BQU0sSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7UUFDckUsQ0FBQztJQUNILENBQUM7SUFFRCxNQUFNLElBQUksR0FBRyxrQkFBa0IsQ0FBQyxLQUFLLEVBQUUsTUFBTSxDQUFDLENBQUM7SUFDL0MsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3BCLEtBQUssQ0FBQyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUM7UUFDekIsS0FBSyxNQUFNLElBQUksSUFBSSxJQUFJLEVBQUUsQ0FBQztZQUN4QixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsU0FBUyxNQUFNLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQ3JFLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBQzFCLENBQUM7QUFFRCxTQUFTLFVBQVU7SUFDakIsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTdG9yeUJpYmxlIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBDYW5vbkZhY3Qge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgY2F0ZWdvcnk6ICdjaGFyYWN0ZXInIHwgJ3dvcmxkJyB8ICdwbG90JyB8ICd0aW1lbGluZSc7XHJcbiAgc3ViamVjdDogc3RyaW5nO1xyXG4gIGF0dHJpYnV0ZTogc3RyaW5nO1xyXG4gIHZhbHVlOiBzdHJpbmc7XHJcbiAgY2hhcHRlckVzdGFibGlzaGVkOiBudW1iZXI7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2Fub25TdG9yZSB7XHJcbiAgc3RvcnlJZDogc3RyaW5nO1xyXG4gIGZhY3RzOiBDYW5vbkZhY3RbXTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZUNhbm9uU3RvcmUoc3RvcnlJZDogc3RyaW5nKTogQ2Fub25TdG9yZSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIHN0b3J5SWQsXHJcbiAgICBmYWN0czogW10sXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGV4dHJhY3RDYW5vbkZyb21CaWJsZShiaWJsZTogU3RvcnlCaWJsZSk6IENhbm9uU3RvcmUge1xyXG4gIGNvbnN0IHN0b3JlID0gY3JlYXRlQ2Fub25TdG9yZShiaWJsZS5pZCk7XHJcblxyXG4gIGZvciAoY29uc3QgY2hhciBvZiBiaWJsZS5jaGFyYWN0ZXJzKSB7XHJcbiAgICBhZGRGYWN0KHN0b3JlLCB7XHJcbiAgICAgIGNhdGVnb3J5OiAnY2hhcmFjdGVyJyxcclxuICAgICAgc3ViamVjdDogY2hhci5uYW1lLFxyXG4gICAgICBhdHRyaWJ1dGU6ICdyb2xlJyxcclxuICAgICAgdmFsdWU6IGNoYXIucm9sZSxcclxuICAgICAgY2hhcHRlckVzdGFibGlzaGVkOiAwLFxyXG4gICAgfSk7XHJcblxyXG4gICAgaWYgKGNoYXIuYmFja2dyb3VuZCkge1xyXG4gICAgICBhZGRGYWN0KHN0b3JlLCB7XHJcbiAgICAgICAgY2F0ZWdvcnk6ICdjaGFyYWN0ZXInLFxyXG4gICAgICAgIHN1YmplY3Q6IGNoYXIubmFtZSxcclxuICAgICAgICBhdHRyaWJ1dGU6ICdiYWNrZ3JvdW5kJyxcclxuICAgICAgICB2YWx1ZTogY2hhci5iYWNrZ3JvdW5kLFxyXG4gICAgICAgIGNoYXB0ZXJFc3RhYmxpc2hlZDogMCxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBmb3IgKGNvbnN0IHRocmVhZCBvZiBiaWJsZS5wbG90VGhyZWFkcykge1xyXG4gICAgYWRkRmFjdChzdG9yZSwge1xyXG4gICAgICBjYXRlZ29yeTogJ3Bsb3QnLFxyXG4gICAgICBzdWJqZWN0OiB0aHJlYWQubmFtZSxcclxuICAgICAgYXR0cmlidXRlOiAnc3RhdHVzJyxcclxuICAgICAgdmFsdWU6IHRocmVhZC5zdGF0dXMsXHJcbiAgICAgIGNoYXB0ZXJFc3RhYmxpc2hlZDogMCxcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcmV0dXJuIHN0b3JlO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkRmFjdChzdG9yZTogQ2Fub25TdG9yZSwgZmFjdDogT21pdDxDYW5vbkZhY3QsICdpZCc+KTogQ2Fub25TdG9yZSB7XHJcbiAgY29uc3QgbmV3RmFjdDogQ2Fub25GYWN0ID0ge1xyXG4gICAgLi4uZmFjdCxcclxuICAgIGlkOiBnZW5lcmF0ZUlkKCksXHJcbiAgfTtcclxuICByZXR1cm4ge1xyXG4gICAgLi4uc3RvcmUsXHJcbiAgICBmYWN0czogWy4uLnN0b3JlLmZhY3RzLCBuZXdGYWN0XSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZ2V0RmFjdHNCeUNhdGVnb3J5KHN0b3JlOiBDYW5vblN0b3JlLCBjYXRlZ29yeTogQ2Fub25GYWN0WydjYXRlZ29yeSddKTogQ2Fub25GYWN0W10ge1xyXG4gIHJldHVybiBzdG9yZS5mYWN0cy5maWx0ZXIoZiA9PiBmLmNhdGVnb3J5ID09PSBjYXRlZ29yeSk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBnZXRGYWN0KHN0b3JlOiBDYW5vblN0b3JlLCBzdWJqZWN0OiBzdHJpbmcsIGF0dHJpYnV0ZTogc3RyaW5nKTogQ2Fub25GYWN0IHwgdW5kZWZpbmVkIHtcclxuICByZXR1cm4gc3RvcmUuZmFjdHMuZmluZChmID0+IGYuc3ViamVjdCA9PT0gc3ViamVjdCAmJiBmLmF0dHJpYnV0ZSA9PT0gYXR0cmlidXRlKTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZUZhY3Qoc3RvcmU6IENhbm9uU3RvcmUsIHN1YmplY3Q6IHN0cmluZywgYXR0cmlidXRlOiBzdHJpbmcsIHZhbHVlOiBzdHJpbmcsIGNoYXB0ZXI6IG51bWJlcik6IENhbm9uU3RvcmUge1xyXG4gIGNvbnN0IGV4aXN0aW5nSW5kZXggPSBzdG9yZS5mYWN0cy5maW5kSW5kZXgoZiA9PiBmLnN1YmplY3QgPT09IHN1YmplY3QgJiYgZi5hdHRyaWJ1dGUgPT09IGF0dHJpYnV0ZSk7XHJcbiAgXHJcbiAgaWYgKGV4aXN0aW5nSW5kZXggPj0gMCkge1xyXG4gICAgY29uc3QgdXBkYXRlZEZhY3RzID0gWy4uLnN0b3JlLmZhY3RzXTtcclxuICAgIHVwZGF0ZWRGYWN0c1tleGlzdGluZ0luZGV4XSA9IHtcclxuICAgICAgLi4udXBkYXRlZEZhY3RzW2V4aXN0aW5nSW5kZXhdLFxyXG4gICAgICB2YWx1ZSxcclxuICAgICAgY2hhcHRlckVzdGFibGlzaGVkOiBjaGFwdGVyLFxyXG4gICAgfTtcclxuICAgIHJldHVybiB7IC4uLnN0b3JlLCBmYWN0czogdXBkYXRlZEZhY3RzIH07XHJcbiAgfVxyXG4gIFxyXG4gIHJldHVybiBhZGRGYWN0KHN0b3JlLCB7XHJcbiAgICBjYXRlZ29yeTogJ3Bsb3QnLFxyXG4gICAgc3ViamVjdCxcclxuICAgIGF0dHJpYnV0ZSxcclxuICAgIHZhbHVlLFxyXG4gICAgY2hhcHRlckVzdGFibGlzaGVkOiBjaGFwdGVyLFxyXG4gIH0pO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0Q2Fub25Gb3JQcm9tcHQoc3RvcmU6IENhbm9uU3RvcmUpOiBzdHJpbmcge1xyXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFsnIyMgU3RvcnkgQ2Fub24gKE5FVkVSIGNvbnRyYWRpY3QgdGhlc2UgZmFjdHMpJ107XHJcbiAgXHJcbiAgY29uc3QgY2hhcmFjdGVycyA9IGdldEZhY3RzQnlDYXRlZ29yeShzdG9yZSwgJ2NoYXJhY3RlcicpO1xyXG4gIGlmIChjaGFyYWN0ZXJzLmxlbmd0aCA+IDApIHtcclxuICAgIGxpbmVzLnB1c2goJ1xcbiMjIyBDaGFyYWN0ZXJzJyk7XHJcbiAgICBmb3IgKGNvbnN0IGZhY3Qgb2YgY2hhcmFjdGVycykge1xyXG4gICAgICBsaW5lcy5wdXNoKGAtICR7ZmFjdC5zdWJqZWN0fTogJHtmYWN0LmF0dHJpYnV0ZX0gPSAke2ZhY3QudmFsdWV9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIGNvbnN0IHdvcmxkID0gZ2V0RmFjdHNCeUNhdGVnb3J5KHN0b3JlLCAnd29ybGQnKTtcclxuICBpZiAod29ybGQubGVuZ3RoID4gMCkge1xyXG4gICAgbGluZXMucHVzaCgnXFxuIyMjIFdvcmxkJyk7XHJcbiAgICBmb3IgKGNvbnN0IGZhY3Qgb2Ygd29ybGQpIHtcclxuICAgICAgbGluZXMucHVzaChgLSAke2ZhY3Quc3ViamVjdH06ICR7ZmFjdC5hdHRyaWJ1dGV9ID0gJHtmYWN0LnZhbHVlfWApO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICBjb25zdCBwbG90ID0gZ2V0RmFjdHNCeUNhdGVnb3J5KHN0b3JlLCAncGxvdCcpO1xyXG4gIGlmIChwbG90Lmxlbmd0aCA+IDApIHtcclxuICAgIGxpbmVzLnB1c2goJ1xcbiMjIyBQbG90Jyk7XHJcbiAgICBmb3IgKGNvbnN0IGZhY3Qgb2YgcGxvdCkge1xyXG4gICAgICBsaW5lcy5wdXNoKGAtICR7ZmFjdC5zdWJqZWN0fTogJHtmYWN0LmF0dHJpYnV0ZX0gPSAke2ZhY3QudmFsdWV9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG4gIFxyXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVJZCgpOiBzdHJpbmcge1xyXG4gIHJldHVybiBgJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,28 @@
1
+ import { VectorStore, NarrativeMemory } from './vectorStore.js';
2
+ import type { StoryBible, StoryState } from '../types/index.js';
3
+ export interface RetrievalContext {
4
+ bible: StoryBible;
5
+ state: StoryState;
6
+ currentChapter: number;
7
+ query?: string;
8
+ }
9
+ export interface RetrievedMemory {
10
+ memory: NarrativeMemory;
11
+ relevance: number;
12
+ reason: string;
13
+ }
14
+ export declare class MemoryRetriever {
15
+ private vectorStore;
16
+ constructor(vectorStore: VectorStore);
17
+ retrieveForChapter(context: RetrievalContext, k?: number): Promise<RetrievedMemory[]>;
18
+ retrieveForCharacter(characterName: string, context: string, k?: number): Promise<RetrievedMemory[]>;
19
+ retrieveForPlotThread(plotThreadId: string, bible: StoryBible, k?: number): Promise<RetrievedMemory[]>;
20
+ retrieveRelevantEvents(query: string, k?: number): Promise<RetrievedMemory[]>;
21
+ formatMemoriesForPrompt(memories: RetrievedMemory[]): string;
22
+ private generateContextualQuery;
23
+ private rerankMemories;
24
+ private inferRelevanceReason;
25
+ private groupByCategory;
26
+ private capitalize;
27
+ }
28
+ export declare function createMemoryRetriever(vectorStore: VectorStore): MemoryRetriever;
@@ -0,0 +1,126 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MemoryRetriever = void 0;
4
+ exports.createMemoryRetriever = createMemoryRetriever;
5
+ class MemoryRetriever {
6
+ vectorStore;
7
+ constructor(vectorStore) {
8
+ this.vectorStore = vectorStore;
9
+ }
10
+ async retrieveForChapter(context, k = 5) {
11
+ const { bible, state, currentChapter, query } = context;
12
+ // Generate a contextual query if none provided
13
+ const searchQuery = query || this.generateContextualQuery(bible, state, currentChapter);
14
+ // Search for similar memories
15
+ const results = await this.vectorStore.searchSimilar(searchQuery, k * 2);
16
+ // Filter out memories from the current chapter (can't recall what hasn't happened yet)
17
+ const pastMemories = results.filter(r => r.memory.chapterNumber < currentChapter);
18
+ // Re-rank and filter for relevance
19
+ const ranked = await this.rerankMemories(searchQuery, pastMemories, k);
20
+ return ranked;
21
+ }
22
+ async retrieveForCharacter(characterName, context, k = 3) {
23
+ const query = `Character ${characterName}: ${context}`;
24
+ const results = await this.vectorStore.searchByCategory(query, 'character', k * 2);
25
+ // Filter for memories actually about this character
26
+ const characterMemories = results.filter(r => r.memory.content.toLowerCase().includes(characterName.toLowerCase()));
27
+ return characterMemories.slice(0, k).map(r => ({
28
+ memory: r.memory,
29
+ relevance: r.score,
30
+ reason: 'Character-relevant memory',
31
+ }));
32
+ }
33
+ async retrieveForPlotThread(plotThreadId, bible, k = 3) {
34
+ const plotThread = bible.plotThreads.find(p => p.id === plotThreadId);
35
+ if (!plotThread)
36
+ return [];
37
+ const query = `Plot thread "${plotThread.name}": ${plotThread.description}`;
38
+ const results = await this.vectorStore.searchByCategory(query, 'plot', k * 2);
39
+ return results.slice(0, k).map(r => ({
40
+ memory: r.memory,
41
+ relevance: r.score,
42
+ reason: `Relevant to plot thread: ${plotThread.name}`,
43
+ }));
44
+ }
45
+ async retrieveRelevantEvents(query, k = 5) {
46
+ const results = await this.vectorStore.searchByCategory(query, 'event', k);
47
+ return results.map(r => ({
48
+ memory: r.memory,
49
+ relevance: r.score,
50
+ reason: 'Relevant past event',
51
+ }));
52
+ }
53
+ formatMemoriesForPrompt(memories) {
54
+ if (memories.length === 0) {
55
+ return '';
56
+ }
57
+ const sections = [];
58
+ // Group by category
59
+ const byCategory = this.groupByCategory(memories);
60
+ for (const [category, items] of Object.entries(byCategory)) {
61
+ if (items.length > 0) {
62
+ sections.push(`### ${this.capitalize(category)} Memories\n${items.map(m => `- ${m.memory.content} (Ch. ${m.memory.chapterNumber})`).join('\n')}`);
63
+ }
64
+ }
65
+ return `## Relevant Past Memories\n\n${sections.join('\n\n')}`;
66
+ }
67
+ generateContextualQuery(bible, state, currentChapter) {
68
+ const progress = currentChapter / bible.targetChapters;
69
+ const activeThreads = bible.plotThreads
70
+ .filter(p => state.activePlotThreads.includes(p.id))
71
+ .map(p => p.name)
72
+ .join(', ');
73
+ return `Chapter ${currentChapter} of ${bible.title}. Genre: ${bible.genre}. ` +
74
+ `Story progress: ${Math.round(progress * 100)}%. ` +
75
+ `Active plot threads: ${activeThreads}. ` +
76
+ `Premise: ${bible.premise.substring(0, 200)}`;
77
+ }
78
+ async rerankMemories(query, candidates, topK) {
79
+ // Simple re-ranking: use the vector similarity score directly
80
+ // In a more sophisticated version, we could use an LLM to judge relevance
81
+ return candidates
82
+ .slice(0, topK)
83
+ .map(r => ({
84
+ memory: r.memory,
85
+ relevance: r.score,
86
+ reason: this.inferRelevanceReason(r.memory),
87
+ }));
88
+ }
89
+ inferRelevanceReason(memory) {
90
+ switch (memory.category) {
91
+ case 'event':
92
+ return 'Relevant past event';
93
+ case 'character':
94
+ return 'Character background or development';
95
+ case 'world':
96
+ return 'World-building detail';
97
+ case 'plot':
98
+ return 'Plot-relevant information';
99
+ default:
100
+ return 'Relevant memory';
101
+ }
102
+ }
103
+ groupByCategory(memories) {
104
+ const grouped = {
105
+ event: [],
106
+ character: [],
107
+ world: [],
108
+ plot: [],
109
+ };
110
+ for (const memory of memories) {
111
+ const cat = memory.memory.category;
112
+ if (!grouped[cat])
113
+ grouped[cat] = [];
114
+ grouped[cat].push(memory);
115
+ }
116
+ return grouped;
117
+ }
118
+ capitalize(str) {
119
+ return str.charAt(0).toUpperCase() + str.slice(1);
120
+ }
121
+ }
122
+ exports.MemoryRetriever = MemoryRetriever;
123
+ function createMemoryRetriever(vectorStore) {
124
+ return new MemoryRetriever(vectorStore);
125
+ }
126
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWVtb3J5UmV0cmlldmVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL21lbW9yeS9tZW1vcnlSZXRyaWV2ZXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7O0FBMEtBLHNEQUVDO0FBM0pELE1BQWEsZUFBZTtJQUNsQixXQUFXLENBQWM7SUFFakMsWUFBWSxXQUF3QjtRQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLFdBQVcsQ0FBQztJQUNqQyxDQUFDO0lBRUQsS0FBSyxDQUFDLGtCQUFrQixDQUFDLE9BQXlCLEVBQUUsSUFBWSxDQUFDO1FBQy9ELE1BQU0sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLGNBQWMsRUFBRSxLQUFLLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFeEQsK0NBQStDO1FBQy9DLE1BQU0sV0FBVyxHQUFHLEtBQUssSUFBSSxJQUFJLENBQUMsdUJBQXVCLENBQUMsS0FBSyxFQUFFLEtBQUssRUFBRSxjQUFjLENBQUMsQ0FBQztRQUV4Riw4QkFBOEI7UUFDOUIsTUFBTSxPQUFPLEdBQUcsTUFBTSxJQUFJLENBQUMsV0FBVyxDQUFDLGFBQWEsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO1FBRXpFLHVGQUF1RjtRQUN2RixNQUFNLFlBQVksR0FBRyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxhQUFhLEdBQUcsY0FBYyxDQUFDLENBQUM7UUFFbEYsbUNBQW1DO1FBQ25DLE1BQU0sTUFBTSxHQUFHLE1BQU0sSUFBSSxDQUFDLGNBQWMsQ0FBQyxXQUFXLEVBQUUsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO1FBRXZFLE9BQU8sTUFBTSxDQUFDO0lBQ2hCLENBQUM7SUFFRCxLQUFLLENBQUMsb0JBQW9CLENBQUMsYUFBcUIsRUFBRSxPQUFlLEVBQUUsSUFBWSxDQUFDO1FBQzlFLE1BQU0sS0FBSyxHQUFHLGFBQWEsYUFBYSxL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UUFDNUIsT0FBTyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLFdBQVcsRUFBRSxHQUFHLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDcEQsQ0FBQztDQUNGO0FBdkpELDBDQXVKQztBQUVELFNBQWdCLHFCQUFxQixDQUFDLFdBQXdCO0lBQzVELE9BQU8sSUFBSSxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUM7QUFDMUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFZlY3RvclN0b3JlLCBOYXJyYXRpdmVNZW1vcnksIE1lbW9yeVNlYXJjaFJlc3VsdCB9IGZyb20gJy4vdmVjdG9yU3RvcmUuanMnO1xyXG5pbXBvcnQgeyBnZXRMTE0gfSBmcm9tICcuLi9sbG0vY2xpZW50LmpzJztcclxuaW1wb3J0IHR5cGUgeyBTdG9yeUJpYmxlLCBTdG9yeVN0YXRlIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBSZXRyaWV2YWxDb250ZXh0IHtcclxuICBiaWJsZTogU3RvcnlCaWJsZTtcclxuICBzdGF0ZTogU3RvcnlTdGF0ZTtcclxuICBjdXJyZW50Q2hhcHRlcjogbnVtYmVyO1xyXG4gIHF1ZXJ5Pzogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIFJldHJpZXZlZE1lbW9yeSB7XHJcbiAgbWVtb3J5OiBOYXJyYXRpdmVNZW1vcnk7XHJcbiAgcmVsZXZhbmNlOiBudW1iZXI7XHJcbiAgcmVhc29uOiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBNZW1vcnlSZXRyaWV2ZXIge1xyXG4gIHByaXZhdGUgdmVjdG9yU3RvcmU6IFZlY3RvclN0b3JlO1xyXG5cclxuICBjb25zdHJ1Y3Rvcih2ZWN0b3JTdG9yZTogVmVjdG9yU3RvcmUpIHtcclxuICAgIHRoaXMudmVjdG9yU3RvcmUgPSB2ZWN0b3JTdG9yZTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJldHJpZXZlRm9yQ2hhcHRlcihjb250ZXh0OiBSZXRyaWV2YWxDb250ZXh0LCBrOiBudW1iZXIgPSA1KTogUHJvbWlzZTxSZXRyaWV2ZWRNZW1vcnlbXT4ge1xyXG4gICAgY29uc3QgeyBiaWJsZSwgc3RhdGUsIGN1cnJlbnRDaGFwdGVyLCBxdWVyeSB9ID0gY29udGV4dDtcclxuXHJcbiAgICAvLyBHZW5lcmF0ZSBhIGNvbnRleHR1YWwgcXVlcnkgaWYgbm9uZSBwcm92aWRlZFxyXG4gICAgY29uc3Qgc2VhcmNoUXVlcnkgPSBxdWVyeSB8fCB0aGlzLmdlbmVyYXRlQ29udGV4dHVhbFF1ZXJ5KGJpYmxlLCBzdGF0ZSwgY3VycmVudENoYXB0ZXIpO1xyXG5cclxuICAgIC8vIFNlYXJjaCBmb3Igc2ltaWxhciBtZW1vcmllc1xyXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMudmVjdG9yU3RvcmUuc2VhcmNoU2ltaWxhcihzZWFyY2hRdWVyeSwgayAqIDIpO1xyXG5cclxuICAgIC8vIEZpbHRlciBvdXQgbWVtb3JpZXMgZnJvbSB0aGUgY3VycmVudCBjaGFwdGVyIChjYW4ndCByZWNhbGwgd2hhdCBoYXNuJ3QgaGFwcGVuZWQgeWV0KVxyXG4gICAgY29uc3QgcGFzdE1lbW9yaWVzID0gcmVzdWx0cy5maWx0ZXIociA9PiByLm1lbW9yeS5jaGFwdGVyTnVtYmVyIDwgY3VycmVudENoYXB0ZXIpO1xyXG5cclxuICAgIC8vIFJlLXJhbmsgYW5kIGZpbHRlciBmb3IgcmVsZXZhbmNlXHJcbiAgICBjb25zdCByYW5rZWQgPSBhd2FpdCB0aGlzLnJlcmFua01lbW9yaWVzKHNlYXJjaFF1ZXJ5LCBwYXN0TWVtb3JpZXMsIGspO1xyXG5cclxuICAgIHJldHVybiByYW5rZWQ7XHJcbiAgfVxyXG5cclxuICBhc3luYyByZXRyaWV2ZUZvckNoYXJhY3RlcihjaGFyYWN0ZXJOYW1lOiBzdHJpbmcsIGNvbnRleHQ6IHN0cmluZywgazogbnVtYmVyID0gMyk6IFByb21pc2U8UmV0cmlldmVkTWVtb3J5W10+IHtcclxuICAgIGNvbnN0IHF1ZXJ5ID0gYENoYXJhY3RlciAke2NoYXJhY3Rlck5hbWV9OiAke2NvbnRleHR9YDtcclxuICAgIFxyXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMudmVjdG9yU3RvcmUuc2VhcmNoQnlDYXRlZ29yeShxdWVyeSwgJ2NoYXJhY3RlcicsIGsgKiAyKTtcclxuICAgIFxyXG4gICAgLy8gRmlsdGVyIGZvciBtZW1vcmllcyBhY3R1YWxseSBhYm91dCB0aGlzIGNoYXJhY3RlclxyXG4gICAgY29uc3QgY2hhcmFjdGVyTWVtb3JpZXMgPSByZXN1bHRzLmZpbHRlcihyID0+IFxyXG4gICAgICByLm1lbW9yeS5jb250ZW50LnRvTG93ZXJDYXNlKCkuaW5jbHVkZXMoY2hhcmFjdGVyTmFtZS50b0xvd2VyQ2FzZSgpKVxyXG4gICAgKTtcclxuXHJcbiAgICByZXR1cm4gY2hhcmFjdGVyTWVtb3JpZXMuc2xpY2UoMCwgaykubWFwKHIgPT4gKHtcclxuICAgICAgbWVtb3J5OiByLm1lbW9yeSxcclxuICAgICAgcmVsZXZhbmNlOiByLnNjb3JlLFxyXG4gICAgICByZWFzb246ICdDaGFyYWN0ZXItcmVsZXZhbnQgbWVtb3J5JyxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJldHJpZXZlRm9yUGxvdFRocmVhZChwbG90VGhyZWFkSWQ6IHN0cmluZywgYmlibGU6IFN0b3J5QmlibGUsIGs6IG51bWJlciA9IDMpOiBQcm9taXNlPFJldHJpZXZlZE1lbW9yeVtdPiB7XHJcbiAgICBjb25zdCBwbG90VGhyZWFkID0gYmlibGUucGxvdFRocmVhZHMuZmluZChwID0+IHAuaWQgPT09IHBsb3RUaHJlYWRJZCk7XHJcbiAgICBpZiAoIXBsb3RUaHJlYWQpIHJldHVybiBbXTtcclxuXHJcbiAgICBjb25zdCBxdWVyeSA9IGBQbG90IHRocmVhZCBcIiR7cGxvdFRocmVhZC5uYW1lfVwiOiAke3Bsb3RUaHJlYWQuZGVzY3JpcHRpb259YDtcclxuICAgIFxyXG4gICAgY29uc3QgcmVzdWx0cyA9IGF3YWl0IHRoaXMudmVjdG9yU3RvcmUuc2VhcmNoQnlDYXRlZ29yeShxdWVyeSwgJ3Bsb3QnLCBrICogMik7XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdHMuc2xpY2UoMCwgaykubWFwKHIgPT4gKHtcclxuICAgICAgbWVtb3J5OiByLm1lbW9yeSxcclxuICAgICAgcmVsZXZhbmNlOiByLnNjb3JlLFxyXG4gICAgICByZWFzb246IGBSZWxldmFudCB0byBwbG90IHRocmVhZDogJHtwbG90VGhyZWFkLm5hbWV9YCxcclxuICAgIH0pKTtcclxuICB9XHJcblxyXG4gIGFzeW5jIHJldHJpZXZlUmVsZXZhbnRFdmVudHMocXVlcnk6IHN0cmluZywgazogbnVtYmVyID0gNSk6IFByb21pc2U8UmV0cmlldmVkTWVtb3J5W10+IHtcclxuICAgIGNvbnN0IHJlc3VsdHMgPSBhd2FpdCB0aGlzLnZlY3RvclN0b3JlLnNlYXJjaEJ5Q2F0ZWdvcnkocXVlcnksICdldmVudCcsIGspO1xyXG5cclxuICAgIHJldHVybiByZXN1bHRzLm1hcChyID0+ICh7XHJcbiAgICAgIG1lbW9yeTogci5tZW1vcnksXHJcbiAgICAgIHJlbGV2YW5jZTogci5zY29yZSxcclxuICAgICAgcmVhc29uOiAnUmVsZXZhbnQgcGFzdCBldmVudCcsXHJcbiAgICB9KSk7XHJcbiAgfVxyXG5cclxuICBmb3JtYXRNZW1vcmllc0ZvclByb21wdChtZW1vcmllczogUmV0cmlldmVkTWVtb3J5W10pOiBzdHJpbmcge1xyXG4gICAgaWYgKG1lbW9yaWVzLmxlbmd0aCA9PT0gMCkge1xyXG4gICAgICByZXR1cm4gJyc7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3Qgc2VjdGlvbnM6IHN0cmluZ1tdID0gW107XHJcbiAgICBcclxuICAgIC8vIEdyb3VwIGJ5IGNhdGVnb3J5XHJcbiAgICBjb25zdCBieUNhdGVnb3J5ID0gdGhpcy5ncm91cEJ5Q2F0ZWdvcnkobWVtb3JpZXMpO1xyXG5cclxuICAgIGZvciAoY29uc3QgW2NhdGVnb3J5LCBpdGVtc10gb2YgT2JqZWN0LmVudHJpZXMoYnlDYXRlZ29yeSkpIHtcclxuICAgICAgaWYgKGl0ZW1zLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBzZWN0aW9ucy5wdXNoKGAjIyMgJHt0aGlzLmNhcGl0YWxpemUoY2F0ZWdvcnkpfSBNZW1vcmllc1xcbiR7aXRlbXMubWFwKG0gPT4gYC0gJHttLm1lbW9yeS5jb250ZW50fSAoQ2guICR7bS5tZW1vcnkuY2hhcHRlck51bWJlcn0pYCkuam9pbignXFxuJyl9YCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYCMjIFJlbGV2YW50IFBhc3QgTWVtb3JpZXNcXG5cXG4ke3NlY3Rpb25zLmpvaW4oJ1xcblxcbicpfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGdlbmVyYXRlQ29udGV4dHVhbFF1ZXJ5KGJpYmxlOiBTdG9yeUJpYmxlLCBzdGF0ZTogU3RvcnlTdGF0ZSwgY3VycmVudENoYXB0ZXI6IG51bWJlcik6IHN0cmluZyB7XHJcbiAgICBjb25zdCBwcm9ncmVzcyA9IGN1cnJlbnRDaGFwdGVyIC8gYmlibGUudGFyZ2V0Q2hhcHRlcnM7XHJcbiAgICBjb25zdCBhY3RpdmVUaHJlYWRzID0gYmlibGUucGxvdFRocmVhZHNcclxuICAgICAgLmZpbHRlcihwID0+IHN0YXRlLmFjdGl2ZVBsb3RUaHJlYWRzLmluY2x1ZGVzKHAuaWQpKVxyXG4gICAgICAubWFwKHAgPT4gcC5uYW1lKVxyXG4gICAgICAuam9pbignLCAnKTtcclxuXHJcbiAgICByZXR1cm4gYENoYXB0ZXIgJHtjdXJyZW50Q2hhcHRlcn0gb2YgJHtiaWJsZS50aXRsZX0uIEdlbnJlOiAke2JpYmxlLmdlbnJlfS4gYCArXHJcbiAgICAgICAgICAgYFN0b3J5IHByb2dyZXNzOiAke01hdGgucm91bmQocHJvZ3Jlc3MgKiAxMDApfSUuIGAgK1xyXG4gICAgICAgICAgIGBBY3RpdmUgcGxvdCB0aHJlYWRzOiAke2FjdGl2ZVRocmVhZHN9LiBgICtcclxuICAgICAgICAgICBgUHJlbWlzZTogJHtiaWJsZS5wcmVtaXNlLnN1YnN0cmluZygwLCAyMDApfWA7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGFzeW5jIHJlcmFua01lbW9yaWVzKFxyXG4gICAgcXVlcnk6IHN0cmluZywgXHJcbiAgICBjYW5kaWRhdGVzOiBNZW1vcnlTZWFyY2hSZXN1bHRbXSwgXHJcbiAgICB0b3BLOiBudW1iZXJcclxuICApOiBQcm9taXNlPFJldHJpZXZlZE1lbW9yeVtdPiB7XHJcbiAgICAvLyBTaW1wbGUgcmUtcmFua2luZzogdXNlIHRoZSB2ZWN0b3Igc2ltaWxhcml0eSBzY29yZSBkaXJlY3RseVxyXG4gICAgLy8gSW4gYSBtb3JlIHNvcGhpc3RpY2F0ZWQgdmVyc2lvbiwgd2UgY291bGQgdXNlIGFuIExMTSB0byBqdWRnZSByZWxldmFuY2VcclxuICAgIFxyXG4gICAgcmV0dXJuIGNhbmRpZGF0ZXNcclxuICAgICAgLnNsaWNlKDAsIHRvcEspXHJcbiAgICAgIC5tYXAociA9PiAoe1xyXG4gICAgICAgIG1lbW9yeTogci5tZW1vcnksXHJcbiAgICAgICAgcmVsZXZhbmNlOiByLnNjb3JlLFxyXG4gICAgICAgIHJlYXNvbjogdGhpcy5pbmZlclJlbGV2YW5jZVJlYXNvbihyLm1lbW9yeSksXHJcbiAgICAgIH0pKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgaW5mZXJSZWxldmFuY2VSZWFzb24obWVtb3J5OiBOYXJyYXRpdmVNZW1vcnkpOiBzdHJpbmcge1xyXG4gICAgc3dpdGNoIChtZW1vcnkuY2F0ZWdvcnkpIHtcclxuICAgICAgY2FzZSAnZXZlbnQnOlxyXG4gICAgICAgIHJldHVybiAnUmVsZXZhbnQgcGFzdCBldmVudCc7XHJcbiAgICAgIGNhc2UgJ2NoYXJhY3Rlcic6XHJcbiAgICAgICAgcmV0dXJuICdDaGFyYWN0ZXIgYmFja2dyb3VuZCBvciBkZXZlbG9wbWVudCc7XHJcbiAgICAgIGNhc2UgJ3dvcmxkJzpcclxuICAgICAgICByZXR1cm4gJ1dvcmxkLWJ1aWxkaW5nIGRldGFpbCc7XHJcbiAgICAgIGNhc2UgJ3Bsb3QnOlxyXG4gICAgICAgIHJldHVybiAnUGxvdC1yZWxldmFudCBpbmZvcm1hdGlvbic7XHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdSZWxldmFudCBtZW1vcnknO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBncm91cEJ5Q2F0ZWdvcnkobWVtb3JpZXM6IFJldHJpZXZlZE1lbW9yeVtdKTogUmVjb3JkPHN0cmluZywgUmV0cmlldmVkTWVtb3J5W10+IHtcclxuICAgIGNvbnN0IGdyb3VwZWQ6IFJlY29yZDxzdHJpbmcsIFJldHJpZXZlZE1lbW9yeVtdPiA9IHtcclxuICAgICAgZXZlbnQ6IFtdLFxyXG4gICAgICBjaGFyYWN0ZXI6IFtdLFxyXG4gICAgICB3b3JsZDogW10sXHJcbiAgICAgIHBsb3Q6IFtdLFxyXG4gICAgfTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IG1lbW9yeSBvZiBtZW1vcmllcykge1xyXG4gICAgICBjb25zdCBjYXQgPSBtZW1vcnkubWVtb3J5LmNhdGVnb3J5O1xyXG4gICAgICBpZiAoIWdyb3VwZWRbY2F0XSkgZ3JvdXBlZFtjYXRdID0gW107XHJcbiAgICAgIGdyb3VwZWRbY2F0XS5wdXNoKG1lbW9yeSk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGdyb3VwZWQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNhcGl0YWxpemUoc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgcmV0dXJuIHN0ci5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHN0ci5zbGljZSgxKTtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVNZW1vcnlSZXRyaWV2ZXIodmVjdG9yU3RvcmU6IFZlY3RvclN0b3JlKTogTWVtb3J5UmV0cmlldmVyIHtcclxuICByZXR1cm4gbmV3IE1lbW9yeVJldHJpZXZlcih2ZWN0b3JTdG9yZSk7XHJcbn1cclxuIl19
@@ -0,0 +1,49 @@
1
+ import type { Chapter, StoryBible } from '../types/index.js';
2
+ import type { StoryStructuredState } from '../story/structuredState.js';
3
+ import type { VectorStore } from './vectorStore.js';
4
+ import type { CanonStore } from './canonStore.js';
5
+ import { ConstraintGraph } from '../constraints/constraintGraph.js';
6
+ export interface StateUpdateResult {
7
+ structuredState: StoryStructuredState;
8
+ memoriesAdded: number;
9
+ canonFactsAdded: number;
10
+ graphUpdated: boolean;
11
+ changes: StateChange[];
12
+ }
13
+ export interface StateChange {
14
+ type: 'character' | 'plot' | 'world' | 'canon' | 'memory';
15
+ description: string;
16
+ chapter: number;
17
+ }
18
+ export interface UpdateContext {
19
+ chapter: Chapter;
20
+ bible: StoryBible;
21
+ currentState: StoryStructuredState;
22
+ canon: CanonStore;
23
+ vectorStore: VectorStore;
24
+ constraintGraph: ConstraintGraph;
25
+ }
26
+ export declare class StateUpdaterPipeline {
27
+ /**
28
+ * Run the complete post-chapter update pipeline
29
+ */
30
+ update(context: UpdateContext): Promise<StateUpdateResult>;
31
+ /**
32
+ * Extract state changes from chapter
33
+ */
34
+ private extractChanges;
35
+ /**
36
+ * Extract narrative memories from chapter
37
+ */
38
+ private extractMemories;
39
+ /**
40
+ * Quick update without LLM (for testing)
41
+ */
42
+ quickUpdate(context: UpdateContext): Promise<StateUpdateResult>;
43
+ /**
44
+ * Format update result
45
+ */
46
+ formatResult(result: StateUpdateResult): string;
47
+ private sanitizeId;
48
+ }
49
+ export declare const stateUpdaterPipeline: StateUpdaterPipeline;