@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.
- package/dist/agents/canonValidator.d.ts +9 -0
- package/dist/agents/canonValidator.js +51 -0
- package/dist/agents/chapterPlanner.d.ts +50 -0
- package/dist/agents/chapterPlanner.js +250 -0
- package/dist/agents/completeness.d.ts +7 -0
- package/dist/agents/completeness.js +51 -0
- package/dist/agents/memoryExtractor.d.ts +12 -0
- package/dist/agents/memoryExtractor.js +82 -0
- package/dist/agents/stateUpdater.d.ts +30 -0
- package/dist/agents/stateUpdater.js +150 -0
- package/dist/agents/storyDirector.d.ts +40 -0
- package/dist/agents/storyDirector.js +213 -0
- package/dist/agents/summarizer.d.ts +8 -0
- package/dist/agents/summarizer.js +56 -0
- package/dist/agents/tensionController.d.ts +68 -0
- package/dist/agents/tensionController.js +197 -0
- package/dist/agents/writer.d.ts +12 -0
- package/dist/agents/writer.js +148 -0
- package/dist/constraints/constraintGraph.d.ts +117 -0
- package/dist/constraints/constraintGraph.js +381 -0
- package/dist/constraints/validator.d.ts +58 -0
- package/dist/constraints/validator.js +236 -0
- package/dist/index.d.ts +25 -0
- package/dist/index.js +115 -0
- package/dist/llm/client.d.ts +14 -0
- package/dist/llm/client.js +108 -0
- package/dist/memory/canonStore.d.ts +20 -0
- package/dist/memory/canonStore.js +110 -0
- package/dist/memory/memoryRetriever.d.ts +28 -0
- package/dist/memory/memoryRetriever.js +126 -0
- package/dist/memory/stateUpdater.d.ts +49 -0
- package/dist/memory/stateUpdater.js +315 -0
- package/dist/memory/vectorStore.d.ts +41 -0
- package/dist/memory/vectorStore.js +166 -0
- package/dist/pipeline/generateChapter.d.ts +17 -0
- package/dist/pipeline/generateChapter.js +75 -0
- package/dist/story/bible.d.ts +4 -0
- package/dist/story/bible.js +53 -0
- package/dist/story/state.d.ts +3 -0
- package/dist/story/state.js +27 -0
- package/dist/story/structuredState.d.ts +39 -0
- package/dist/story/structuredState.js +159 -0
- package/dist/test/canon.test.d.ts +1 -0
- package/dist/test/canon.test.js +104 -0
- package/dist/test/chapter-planner.test.d.ts +1 -0
- package/dist/test/chapter-planner.test.js +171 -0
- package/dist/test/constraints.test.d.ts +1 -0
- package/dist/test/constraints.test.js +210 -0
- package/dist/test/simple.test.d.ts +1 -0
- package/dist/test/simple.test.js +51 -0
- package/dist/test/state-updater.test.d.ts +1 -0
- package/dist/test/state-updater.test.js +200 -0
- package/dist/test/story-director.test.d.ts +1 -0
- package/dist/test/story-director.test.js +142 -0
- package/dist/test/structured-state.test.d.ts +1 -0
- package/dist/test/structured-state.test.js +144 -0
- package/dist/test/tension-controller.test.d.ts +1 -0
- package/dist/test/tension-controller.test.js +116 -0
- package/dist/test/vector-memory.test.d.ts +1 -0
- package/dist/test/vector-memory.test.js +153 -0
- package/dist/test/world-simulation.test.d.ts +1 -0
- package/dist/test/world-simulation.test.js +152 -0
- package/dist/types/index.d.ts +79 -0
- package/dist/types/index.js +3 -0
- package/dist/world/characterAgent.d.ts +73 -0
- package/dist/world/characterAgent.js +232 -0
- package/dist/world/eventResolver.d.ts +52 -0
- package/dist/world/eventResolver.js +205 -0
- package/dist/world/worldState.d.ts +93 -0
- package/dist/world/worldState.js +258 -0
- 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;
|