@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,236 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.validator = exports.Validator = void 0;
4
+ const client_js_1 = require("../llm/client.js");
5
+ const constraintGraph_js_1 = require("./constraintGraph.js");
6
+ const VALIDATOR_PROMPT = `You are a narrative validator. Check this chapter for consistency issues.
7
+
8
+ ## Story Bible
9
+
10
+ **Title:** {{title}}
11
+ **Setting:** {{setting}}
12
+
13
+ ## Canon Facts (must never be violated)
14
+ {{canon}}
15
+
16
+ ## Current Story State
17
+
18
+ **Chapter:** {{chapterNumber}}
19
+
20
+ ### Character States
21
+ {{characters}}
22
+
23
+ ### Plot Threads
24
+ {{plotThreads}}
25
+
26
+ ## Chapter to Validate
27
+
28
+ **Title:** {{chapterTitle}}
29
+
30
+ {{chapterContent}}
31
+
32
+ ## Your Task
33
+
34
+ Check for these types of errors:
35
+
36
+ 1. **Canon Violations**: Does the chapter contradict any established facts?
37
+ 2. **Character Consistency**: Do characters act according to their established personality?
38
+ 3. **Location Errors**: Are characters in places they couldn't be? Is travel time realistic?
39
+ 4. **Knowledge Leaks**: Do characters know things they shouldn't know yet?
40
+ 5. **Timeline Errors**: Are events in the right order?
41
+ 6. **Logic Errors**: Any impossible or contradictory situations?
42
+
43
+ Output JSON:
44
+ {
45
+ "valid": true/false,
46
+ "violations": [
47
+ {
48
+ "type": "canon|character|location|knowledge|timeline|logic",
49
+ "severity": "error|warning",
50
+ "description": "Detailed description of the issue",
51
+ "suggestedFix": "How to fix this issue"
52
+ }
53
+ ],
54
+ "summary": "Overall assessment of chapter consistency"
55
+ }`;
56
+ class Validator {
57
+ constraintGraph;
58
+ constructor(constraintGraph) {
59
+ this.constraintGraph = constraintGraph || new constraintGraph_js_1.ConstraintGraph();
60
+ }
61
+ /**
62
+ * Validate a chapter using both graph-based and LLM-based checks
63
+ */
64
+ async validateChapter(context) {
65
+ const { chapter, bible, structuredState, canon, constraintGraph } = context;
66
+ // Graph-based validation
67
+ const graphViolations = constraintGraph.checkConstraints(chapter.number);
68
+ // LLM-based validation
69
+ let llmViolations = [];
70
+ try {
71
+ llmViolations = await this.llmValidate(context);
72
+ }
73
+ catch (error) {
74
+ // If LLM fails, rely on graph validation only
75
+ console.log('LLM validation failed, using graph validation only');
76
+ }
77
+ // Combine violations
78
+ const allViolations = [...graphViolations, ...llmViolations];
79
+ // Remove duplicates (same description)
80
+ const uniqueViolations = allViolations.filter((v, i, a) => a.findIndex(t => t.description === v.description) === i);
81
+ // Generate summary
82
+ const errorCount = uniqueViolations.filter(v => v.severity === 'error').length;
83
+ const warningCount = uniqueViolations.filter(v => v.severity === 'warning').length;
84
+ let summary;
85
+ if (errorCount === 0 && warningCount === 0) {
86
+ summary = 'Chapter is consistent with story canon and state.';
87
+ }
88
+ else if (errorCount === 0) {
89
+ summary = `Chapter has ${warningCount} warning(s) but no critical errors.`;
90
+ }
91
+ else {
92
+ summary = `Chapter has ${errorCount} error(s) and ${warningCount} warning(s) that need attention.`;
93
+ }
94
+ return {
95
+ valid: errorCount === 0,
96
+ violations: uniqueViolations,
97
+ summary,
98
+ };
99
+ }
100
+ /**
101
+ * LLM-based validation
102
+ */
103
+ async llmValidate(context) {
104
+ const { chapter, bible, structuredState, canon } = context;
105
+ const prompt = VALIDATOR_PROMPT
106
+ .replace('{{title}}', bible.title)
107
+ .replace('{{setting}}', bible.setting)
108
+ .replace('{{canon}}', this.formatCanon(canon))
109
+ .replace('{{chapterNumber}}', chapter.number.toString())
110
+ .replace('{{characters}}', this.formatCharacters(structuredState))
111
+ .replace('{{plotThreads}}', this.formatPlotThreads(structuredState))
112
+ .replace('{{chapterTitle}}', chapter.title)
113
+ .replace('{{chapterContent}}', chapter.content.substring(0, 4000));
114
+ const result = await (0, client_js_1.getLLM)().completeJSON(prompt, {
115
+ temperature: 0.3,
116
+ maxTokens: 1500,
117
+ });
118
+ return result.violations;
119
+ }
120
+ /**
121
+ * Quick validation without LLM (for testing/fallback)
122
+ */
123
+ quickValidate(context) {
124
+ const { chapter, canon, constraintGraph } = context;
125
+ // Graph-based validation only
126
+ const violations = constraintGraph.checkConstraints(chapter.number);
127
+ // Basic canon check
128
+ const canonViolations = this.checkCanonBasic(chapter, canon);
129
+ const allViolations = [...violations, ...canonViolations];
130
+ const errorCount = allViolations.filter(v => v.severity === 'error').length;
131
+ return {
132
+ valid: errorCount === 0,
133
+ violations: allViolations,
134
+ summary: errorCount === 0
135
+ ? 'Chapter passes basic validation.'
136
+ : `Found ${errorCount} error(s) in basic validation.`,
137
+ };
138
+ }
139
+ /**
140
+ * Basic canon check (keyword matching)
141
+ */
142
+ checkCanonBasic(chapter, canon) {
143
+ const violations = [];
144
+ const content = chapter.content.toLowerCase();
145
+ for (const fact of canon.facts) {
146
+ // Check for contradictions (simplified)
147
+ // If fact says "X is Y", check for "X is not Y" or "X was never Y"
148
+ const subject = fact.subject.toLowerCase();
149
+ const value = fact.value.toLowerCase();
150
+ // Look for negations
151
+ const negationPatterns = [
152
+ `${subject}.*不是.*${value}`,
153
+ `${subject}.*从未.*${value}`,
154
+ `${subject}.*不再.*${value}`,
155
+ ];
156
+ for (const pattern of negationPatterns) {
157
+ const regex = new RegExp(pattern);
158
+ if (regex.test(content)) {
159
+ violations.push({
160
+ type: 'canon',
161
+ severity: 'error',
162
+ description: `Canon violation: "${fact.subject} ${fact.attribute} = ${fact.value}" is contradicted`,
163
+ nodes: [],
164
+ suggestedFix: `Ensure ${fact.subject} remains ${fact.value} as established in chapter ${fact.chapterEstablished}`,
165
+ });
166
+ }
167
+ }
168
+ }
169
+ return violations;
170
+ }
171
+ /**
172
+ * Format canon for prompt
173
+ */
174
+ formatCanon(canon) {
175
+ if (canon.facts.length === 0)
176
+ return 'No canon facts established.';
177
+ return canon.facts
178
+ .map(f => `- ${f.subject} ${f.attribute} = ${f.value} (est. Ch ${f.chapterEstablished})`)
179
+ .join('\n');
180
+ }
181
+ /**
182
+ * Format characters for prompt
183
+ */
184
+ formatCharacters(state) {
185
+ return Object.values(state.characters)
186
+ .map(c => `- ${c.name}: ${c.emotionalState}, at ${c.location}`)
187
+ .join('\n') || 'No characters.';
188
+ }
189
+ /**
190
+ * Format plot threads for prompt
191
+ */
192
+ formatPlotThreads(state) {
193
+ return Object.values(state.plotThreads)
194
+ .filter(t => t.status !== 'resolved')
195
+ .map(t => `- ${t.name} (${t.status}, ${Math.round(t.tension * 100)}% tension)`)
196
+ .join('\n') || 'No active plot threads.';
197
+ }
198
+ /**
199
+ * Format validation result for display
200
+ */
201
+ formatResult(result) {
202
+ const lines = [];
203
+ lines.push(`**Validation Result:** ${result.valid ? '✅ VALID' : '❌ INVALID'}`);
204
+ lines.push(`**Summary:** ${result.summary}`);
205
+ if (result.violations.length > 0) {
206
+ lines.push('\n**Violations:**');
207
+ const errors = result.violations.filter(v => v.severity === 'error');
208
+ const warnings = result.violations.filter(v => v.severity === 'warning');
209
+ if (errors.length > 0) {
210
+ lines.push('\n*Errors:*');
211
+ for (const v of errors) {
212
+ lines.push(`❌ [${v.type.toUpperCase()}] ${v.description}`);
213
+ if (v.suggestedFix) {
214
+ lines.push(` 💡 Fix: ${v.suggestedFix}`);
215
+ }
216
+ }
217
+ }
218
+ if (warnings.length > 0) {
219
+ lines.push('\n*Warnings:*');
220
+ for (const v of warnings) {
221
+ lines.push(`⚠️ [${v.type.toUpperCase()}] ${v.description}`);
222
+ }
223
+ }
224
+ }
225
+ return lines.join('\n');
226
+ }
227
+ /**
228
+ * Get the constraint graph
229
+ */
230
+ getConstraintGraph() {
231
+ return this.constraintGraph;
232
+ }
233
+ }
234
+ exports.Validator = Validator;
235
+ exports.validator = new Validator();
236
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdG9yLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbnN0cmFpbnRzL3ZhbGlkYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7QUFBQSxnREFBMEM7QUFJMUMsNkRBQWlGO0FBaUJqRixNQUFNLGdCQUFnQixHQUFHOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBaUR2QixDQUFDO0FBRUgsTUFBYSxTQUFTO0lBQ1osZUFBZSxDQUFrQjtJQUV6QyxZQUFZLGVBQWlDO1FBQzNDLElBQUksQ0FBQyxlQUFlLEdBQUcsZUFBZSxJQUFJLElBQUksb0NBQWUsRUFBRSxDQUFDO0lBQ2xFLENBQUM7SUFFRDs7T0FFRztJQUNILEtBQUssQ0FBQyxlQUFlLENBQUMsT0FBaUM7UUFDckQsTUFBTSxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsZUFBZSxFQUFFLEtBQUssRUFBRSxlQUFlLEVBQUUsR0FBRyxPQUFPLENBQUM7UUFFNUUseUJBQXlCO1FBQ3pCLE1BQU0sZUFBZSxHQUFHLGVBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUM7UUFFekUsdUJBQXVCO1FBQ3ZCLElBQUksYUFBYSxHQUEwQixFQUFFLENBQUM7UUFDOUMsSUFBSSxDQUFDO1lBQ0gsYUFBYSxHQUFHLE1BQU0sSUFBSSxDQUFDLFdBQVcsQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUNsRCxDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLDhDQUE4QztZQUM5QyxPQUFPLENBQUMsR0FBRyxDQUFDLG9EQUFvRCxDQUFDLENBQUM7UUFDcEUsQ0FBQztRQUVELHFCQUFxQjtRQUNyQixNQUFNLGFBQWEsR0FBRyxDQUFDLEdBQUcsZUFBZSxFQUFFLEdBQUcsYUFBYSxDQUFDLENBQUM7UUFFN0QsdUNBQXVDO1FBQ3ZDLE1BQU0sZ0JBQWdCLEdBQUcsYUFBYSxDQUFDLE1BQU0sQ0FB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QUV6RSxJQUFJLE1BQU0sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7Z0JBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7Z0JBQzFCLEtBQUssTUFBTSxDQUFDLElBQUksTUFBTSxFQUFFLENBQUM7b0JBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsRUFBRSxLQUFLLENBQUMsQ0FBQyxXQUFXLEVBQUUsQ0FBQyxDQUFDO29CQUMzRCxJQUFJLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQzt3QkFDbkIsS0FBSyxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxZQUFZLEVBQUUsQ0FBQyxDQUFDO29CQUM3QyxDQUFDO2dCQUNILENBQUM7WUFDSCxDQUFDO1lBRUQsSUFBSSxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO2dCQUN4QixLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO2dCQUM1QixLQUFLLE1BQU0sQ0FBQyxJQUFJLFFBQVEsRUFBRSxDQUFDO29CQUN6QixLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUMsQ0FBQztnQkFDOUQsQ0FBQztZQUNILENBQUM7UUFDSCxDQUFDO1FBRUQsT0FBTyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzFCLENBQUM7SUFFRDs7T0FFRztJQUNILGtCQUFrQjtRQUNoQixPQUFPLElBQUksQ0FBQyxlQUFlLENBQUM7SUFDOUIsQ0FBQztDQUNGO0FBbE5ELDhCQWtOQztBQUVZLFFBQUEsU0FBUyxHQUFHLElBQUksU0FBUyxFQUFFLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBnZXRMTE0gfSBmcm9tICcuLi9sbG0vY2xpZW50LmpzJztcclxuaW1wb3J0IHR5cGUgeyBDaGFwdGVyLCBTdG9yeUJpYmxlIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xyXG5pbXBvcnQgdHlwZSB7IFN0b3J5U3RydWN0dXJlZFN0YXRlIH0gZnJvbSAnLi4vc3Rvcnkvc3RydWN0dXJlZFN0YXRlLmpzJztcclxuaW1wb3J0IHR5cGUgeyBDYW5vblN0b3JlLCBDYW5vbkZhY3QgfSBmcm9tICcuLi9tZW1vcnkvY2Fub25TdG9yZS5qcyc7XHJcbmltcG9ydCB7IENvbnN0cmFpbnRHcmFwaCwgdHlwZSBDb25zdHJhaW50VmlvbGF0aW9uIH0gZnJvbSAnLi9jb25zdHJhaW50R3JhcGguanMnO1xyXG5cclxuZXhwb3J0IGludGVyZmFjZSBWYWxpZGF0aW9uUmVzdWx0IHtcclxuICB2YWxpZDogYm9vbGVhbjtcclxuICB2aW9sYXRpb25zOiBDb25zdHJhaW50VmlvbGF0aW9uW107XHJcbiAgc3VtbWFyeTogc3RyaW5nO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIENoYXB0ZXJWYWxpZGF0aW9uQ29udGV4dCB7XHJcbiAgY2hhcHRlcjogQ2hhcHRlcjtcclxuICBiaWJsZTogU3RvcnlCaWJsZTtcclxuICBzdHJ1Y3R1cmVkU3RhdGU6IFN0b3J5U3RydWN0dXJlZFN0YXRlO1xyXG4gIGNhbm9uOiBDYW5vblN0b3JlO1xyXG4gIHByZXZpb3VzQ2hhcHRlcnM6IENoYXB0ZXJbXTtcclxuICBjb25zdHJhaW50R3JhcGg6IENvbnN0cmFpbnRHcmFwaDtcclxufVxyXG5cclxuY29uc3QgVkFMSURBVE9SX1BST01QVCA9IGBZb3UgYXJlIGEgbmFycmF0aXZlIHZhbGlkYXRvci4gQ2hlY2sgdGhpcyBjaGFwdGVyIGZvciBjb25zaXN0ZW5jeSBpc3N1ZXMuXHJcblxyXG4jIyBTdG9yeSBCaWJsZVxyXG5cclxuKipUaXRsZToqKiB7e3RpdGxlfX1cclxuKipTZXR0aW5nOioqIHt7c2V0dGluZ319XHJcblxyXG4jIyBDYW5vbiBGYWN0cyAobXVzdCBuZXZlciBiZSB2aW9sYXRlZClcclxue3tjYW5vbn19XHJcblxyXG4jIyBDdXJyZW50IFN0b3J5IFN0YXRlXHJcblxyXG4qKkNoYXB0ZXI6Kioge3tjaGFwdGVyTnVtYmVyfX1cclxuXHJcbiMjIyBDaGFyYWN0ZXIgU3RhdGVzXHJcbnt7Y2hhcmFjdGVyc319XHJcblxyXG4jIyMgUGxvdCBUaHJlYWRzXHJcbnt7cGxvdFRocmVhZHN9fVxyXG5cclxuIyMgQ2hhcHRlciB0byBWYWxpZGF0ZVxyXG5cclxuKipUaXRsZToqKiB7e2NoYXB0ZXJUaXRsZX19XHJcblxyXG57e2NoYXB0ZXJDb250ZW50fX1cclxuXHJcbiMjIFlvdXIgVGFza1xyXG5cclxuQ2hlY2sgZm9yIHRoZXNlIHR5cGVzIG9mIGVycm9yczpcclxuXHJcbjEuICoqQ2Fub24gVmlvbGF0aW9ucyoqOiBEb2VzIHRoZSBjaGFwdGVyIGNvbnRyYWRpY3QgYW55IGVzdGFibGlzaGVkIGZhY3RzP1xyXG4yLiAqKkNoYXJhY3RlciBDb25zaXN0ZW5jeSoqOiBEbyBjaGFyYWN0ZXJzIGFjdCBhY2NvcmRpbmcgdG8gdGhlaXIgZXN0YWJsaXNoZWQgcGVyc29uYWxpdHk/XHJcbjMuICoqTG9jYXRpb24gRXJyb3JzKio6IEFyZSBjaGFyYWN0ZXJzIGluIHBsYWNlcyB0aGV5IGNvdWxkbid0IGJlPyBJcyB0cmF2ZWwgdGltZSByZWFsaXN0aWM/XHJcbjQuICoqS25vd2xlZGdlIExlYWtzKio6IERvIGNoYXJhY3RlcnMga25vdyB0aGluZ3MgdGhleSBzaG91bGRuJ3Qga25vdyB5ZXQ/XHJcbjUuICoqVGltZWxpbmUgRXJyb3JzKio6IEFyZSBldmVudHMgaW4gdGhlIHJpZ2h0IG9yZGVyP1xyXG42LiAqKkxvZ2ljIEVycm9ycyoqOiBBbnkgaW1wb3NzaWJsZSBvciBjb250cmFkaWN0b3J5IHNpdHVhdGlvbnM/XHJcblxyXG5PdXRwdXQgSlNPTjpcclxue1xyXG4gIFwidmFsaWRcIjogdHJ1ZS9mYWxzZSxcclxuICBcInZpb2xhdGlvbnNcIjogW1xyXG4gICAge1xyXG4gICAgICBcInR5cGVcIjogXCJjYW5vbnxjaGFyYWN0ZXJ8bG9jYXRpb258a25vd2xlZGdlfHRpbWVsaW5lfGxvZ2ljXCIsXHJcbiAgICAgIFwic2V2ZXJpdHlcIjogXCJlcnJvcnx3YXJuaW5nXCIsXHJcbiAgICAgIFwiZGVzY3JpcHRpb25cIjogXCJEZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGUgaXNzdWVcIixcclxuICAgICAgXCJzdWdnZXN0ZWRGaXhcIjogXCJIb3cgdG8gZml4IHRoaXMgaXNzdWVcIlxyXG4gICAgfVxyXG4gIF0sXHJcbiAgXCJzdW1tYXJ5XCI6IFwiT3ZlcmFsbCBhc3Nlc3NtZW50IG9mIGNoYXB0ZXIgY29uc2lzdGVuY3lcIlxyXG59YDtcclxuXHJcbmV4cG9ydCBjbGFzcyBWYWxpZGF0b3Ige1xyXG4gIHByaXZhdGUgY29uc3RyYWludEdyYXBoOiBDb25zdHJhaW50R3JhcGg7XHJcbiAgXHJcbiAgY29uc3RydWN0b3IoY29uc3RyYWludEdyYXBoPzogQ29uc3RyYWludEdyYXBoKSB7XHJcbiAgICB0aGlzLmNvbnN0cmFpbnRHcmFwaCA9IGNvbnN0cmFpbnRHcmFwaCB8fCBuZXcgQ29uc3RyYWludEdyYXBoKCk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFZhbGlkYXRlIGEgY2hhcHRlciB1c2luZyBib3RoIGdyYXBoLWJhc2VkIGFuZCBMTE0tYmFzZWQgY2hlY2tzXHJcbiAgICovXHJcbiAgYXN5bmMgdmFsaWRhdGVDaGFwdGVyKGNvbnRleHQ6IENoYXB0ZXJWYWxpZGF0aW9uQ29udGV4dCk6IFByb21pc2U8VmFsaWRhdGlvblJlc3VsdD4ge1xyXG4gICAgY29uc3QgeyBjaGFwdGVyLCBiaWJsZSwgc3RydWN0dXJlZFN0YXRlLCBjYW5vbiwgY29uc3RyYWludEdyYXBoIH0gPSBjb250ZXh0O1xyXG4gICAgXHJcbiAgICAvLyBHcmFwaC1iYXNlZCB2YWxpZGF0aW9uXHJcbiAgICBjb25zdCBncmFwaFZpb2xhdGlvbnMgPSBjb25zdHJhaW50R3JhcGguY2hlY2tDb25zdHJhaW50cyhjaGFwdGVyLm51bWJlcik7XHJcbiAgICBcclxuICAgIC8vIExMTS1iYXNlZCB2YWxpZGF0aW9uXHJcbiAgICBsZXQgbGxtVmlvbGF0aW9uczogQ29uc3RyYWludFZpb2xhdGlvbltdID0gW107XHJcbiAgICB0cnkge1xyXG4gICAgICBsbG1WaW9sYXRpb25zID0gYXdhaXQgdGhpcy5sbG1WYWxpZGF0ZShjb250ZXh0KTtcclxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICAgIC8vIElmIExMTSBmYWlscywgcmVseSBvbiBncmFwaCB2YWxpZGF0aW9uIG9ubHlcclxuICAgICAgY29uc29sZS5sb2coJ0xMTSB2YWxpZGF0aW9uIGZhaWxlZCwgdXNpbmcgZ3JhcGggdmFsaWRhdGlvbiBvbmx5Jyk7XHJcbiAgICB9XHJcbiAgICBcclxuICAgIC8vIENvbWJpbmUgdmlvbGF0aW9uc1xyXG4gICAgY29uc3QgYWxsVmlvbGF0aW9ucyA9IFsuLi5ncmFwaFZpb2xhdGlvbnMsIC4uLmxsbVZpb2xhdGlvbnNdO1xyXG4gICAgXHJcbiAgICAvLyBSZW1vdmUgZHVwbGljYXRlcyAoc2FtZSBkZXNjcmlwdGlvbilcclxuICAgIGNvbnN0IHVuaXF1ZVZpb2xhdGlvbnMgPSBhbGxWaW9sYXRpb25zLmZpbHRlcigodiwgaSwgYSkgPT4gXHJcbiAgICAgIGEuZmluZEluZGV4KHQgPT4gdC5kZXNjcmlwdGlvbiA9PT0gdi5kZXNjcmlwdGlvbikgPT09IGlcclxuICAgICk7XHJcbiAgICBcclxuICAgIC8vIEdlbmVyYXRlIHN1bW1hcnlcclxuICAgIGNvbnN0IGVycm9yQ291bnQgPSB1bmlxdWVWaW9sYXRpb25zLmZpbHRlcih2ID0+IHYuc2V2ZXJpdHkgPT09ICdlcnJvcicpLmxlbmd0aDtcclxuICAgIGNvbnN0IHdhcm5pbmdDb3VudCA9IHVuaXF1ZVZpb2xhdGlvbnMuZmlsdGVyKHYgPT4gdi5zZXZlcml0eSA9PT0gJ3dhcm5pbmcnKS5sZW5ndGg7XHJcbiAgICBcclxuICAgIGxldCBzdW1tYXJ5OiBzdHJpbmc7XHJcbiAgICBpZiAoZXJyb3JDb3VudCA9PT0gMCAmJiB3YXJuaW5nQ291bnQgPT09IDApIHtcclxuICAgICAgc3VtbWFyeSA9ICdDaGFwdGVyIGlzIGNvbnNpc3RlbnQgd2l0aCBzdG9yeSBjYW5vbiBhbmQgc3RhdGUuJztcclxuICAgIH0gZWxzZSBpZiAoZXJyb3JDb3VudCA9PT0gMCkge1xyXG4gICAgICBzdW1tYXJ5ID0gYENoYXB0ZXIgaGFzICR7d2FybmluZ0NvdW50fSB3YXJuaW5nKHMpIGJ1dCBubyBjcml0aWNhbCBlcnJvcnMuYDtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHN1bW1hcnkgPSBgQ2hhcHRlciBoYXMgJHtlcnJvckNvdW50fSBlcnJvcihzKSBhbmQgJHt3YXJuaW5nQ291bnR9IHdhcm5pbmcocykgdGhhdCBuZWVkIGF0dGVudGlvbi5gO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB2YWxpZDogZXJyb3JDb3VudCA9PT0gMCxcclxuICAgICAgdmlvbGF0aW9uczogdW5pcXVlVmlvbGF0aW9ucyxcclxuICAgICAgc3VtbWFyeSxcclxuICAgIH07XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIExMTS1iYXNlZCB2YWxpZGF0aW9uXHJcbiAgICovXHJcbiAgcHJpdmF0ZSBhc3luYyBsbG1WYWxpZGF0ZShjb250ZXh0OiBDaGFwdGVyVmFsaWRhdGlvbkNvbnRleHQpOiBQcm9taXNlPENvbnN0cmFpbnRWaW9sYXRpb25bXT4ge1xyXG4gICAgY29uc3QgeyBjaGFwdGVyLCBiaWJsZSwgc3RydWN0dXJlZFN0YXRlLCBjYW5vbiB9ID0gY29udGV4dDtcclxuICAgIFxyXG4gICAgY29uc3QgcHJvbXB0ID0gVkFMSURBVE9SX1BST01QVFxyXG4gICAgICAucmVwbGFjZSgne3t0aXRsZX19JywgYmlibGUudGl0bGUpXHJcbiAgICAgIC5yZXBsYWNlKCd7e3NldHRpbmd9fScsIGJpYmxlLnNldHRpbmcpXHJcbiAgICAgIC5yZXBsYWNlKCd7e2Nhbm9ufX0nLCB0aGlzLmZvcm1hdENhbm9uKGNhbm9uKSlcclxuICAgICAgLnJlcGxhY2UoJ3t7Y2hhcHRlck51bWJlcn19JywgY2hhcHRlci5udW1iZXIudG9TdHJpbmcoKSlcclxuICAgICAgLnJlcGxhY2UoJ3t7Y2hhcmFjdGVyc319JywgdGhpcy5mb3JtYXRDaGFyYWN0ZXJzKHN0cnVjdHVyZWRTdGF0ZSkpXHJcbiAgICAgIC5yZXBsYWNlKCd7e3Bsb3RUaHJlYWRzfX0nLCB0aGlzLmZvcm1hdFBsb3RUaHJlYWRzKHN0cnVjdHVyZWRTdGF0ZSkpXHJcbiAgICAgIC5yZXBsYWNlKCd7e2NoYXB0ZXJUaXRsZX19JywgY2hhcHRlci50aXRsZSlcclxuICAgICAgLnJlcGxhY2UoJ3t7Y2hhcHRlckNvbnRlbnR9fScsIGNoYXB0ZXIuY29udGVudC5zdWJzdHJpbmcoMCwgNDAwMCkpO1xyXG4gICAgXHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRMTE0oKS5jb21wbGV0ZUpTT048VmFsaWRhdGlvblJlc3VsdD4ocHJvbXB0LCB7XHJcbiAgICAgIHRlbXBlcmF0dXJlOiAwLjMsXHJcbiAgICAgIG1heFRva2VuczogMTUwMCxcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICByZXR1cm4gcmVzdWx0LnZpb2xhdGlvbnM7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIFF1aWNrIHZhbGlkYXRpb24gd2l0aG91dCBMTE0gKGZvciB0ZXN0aW5nL2ZhbGxiYWNrKVxyXG4gICAqL1xyXG4gIHF1aWNrVmFsaWRhdGUoY29udGV4dDogQ2hhcHRlclZhbGlkYXRpb25Db250ZXh0KTogVmFsaWRhdGlvblJlc3VsdCB7XHJcbiAgICBjb25zdCB7IGNoYXB0ZXIsIGNhbm9uLCBjb25zdHJhaW50R3JhcGggfSA9IGNvbnRleHQ7XHJcbiAgICBcclxuICAgIC8vIEdyYXBoLWJhc2VkIHZhbGlkYXRpb24gb25seVxyXG4gICAgY29uc3QgdmlvbGF0aW9ucyA9IGNvbnN0cmFpbnRHcmFwaC5jaGVja0NvbnN0cmFpbnRzKGNoYXB0ZXIubnVtYmVyKTtcclxuICAgIFxyXG4gICAgLy8gQmFzaWMgY2Fub24gY2hlY2tcclxuICAgIGNvbnN0IGNhbm9uVmlvbGF0aW9ucyA9IHRoaXMuY2hlY2tDYW5vbkJhc2ljKGNoYXB0ZXIsIGNhbm9uKTtcclxuICAgIFxyXG4gICAgY29uc3QgYWxsVmlvbGF0aW9ucyA9IFsuLi52aW9sYXRpb25zLCAuLi5jYW5vblZpb2xhdGlvbnNdO1xyXG4gICAgY29uc3QgZXJyb3JDb3VudCA9IGFsbFZpb2xhdGlvbnMuZmlsdGVyKHYgPT4gdi5zZXZlcml0eSA9PT0gJ2Vycm9yJykubGVuZ3RoO1xyXG4gICAgXHJcbiAgICByZXR1cm4ge1xyXG4gICAgICB2YWxpZDogZXJyb3JDb3VudCA9PT0gMCxcclxuICAgICAgdmlvbGF0aW9uczogYWxsVmlvbGF0aW9ucyxcclxuICAgICAgc3VtbWFyeTogZXJyb3JDb3VudCA9PT0gMCBcclxuICAgICAgICA/ICdDaGFwdGVyIHBhc3NlcyBiYXNpYyB2YWxpZGF0aW9uLicgXHJcbiAgICAgICAgOiBgRm91bmQgJHtlcnJvckNvdW50fSBlcnJvcihzKSBpbiBiYXNpYyB2YWxpZGF0aW9uLmAsXHJcbiAgICB9O1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBCYXNpYyBjYW5vbiBjaGVjayAoa2V5d29yZCBtYXRjaGluZylcclxuICAgKi9cclxuICBwcml2YXRlIGNoZWNrQ2Fub25CYXNpYyhjaGFwdGVyOiBDaGFwdGVyLCBjYW5vbjogQ2Fub25TdG9yZSk6IENvbnN0cmFpbnRWaW9sYXRpb25bXSB7XHJcbiAgICBjb25zdCB2aW9sYXRpb25zOiBDb25zdHJhaW50VmlvbGF0aW9uW10gPSBbXTtcclxuICAgIGNvbnN0IGNvbnRlbnQgPSBjaGFwdGVyLmNvbnRlbnQudG9Mb3dlckNhc2UoKTtcclxuICAgIFxyXG4gICAgZm9yIChjb25zdCBmYWN0IG9mIGNhbm9uLmZhY3RzKSB7XHJcbiAgICAgIC8vIENoZWNrIGZvciBjb250cmFkaWN0aW9ucyAoc2ltcGxpZmllZClcclxuICAgICAgLy8gSWYgZmFjdCBzYXlzIFwiWCBpcyBZXCIsIGNoZWNrIGZvciBcIlggaXMgbm90IFlcIiBvciBcIlggd2FzIG5ldmVyIFlcIlxyXG4gICAgICBjb25zdCBzdWJqZWN0ID0gZmFjdC5zdWJqZWN0LnRvTG93ZXJDYXNlKCk7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gZmFjdC52YWx1ZS50b0xvd2VyQ2FzZSgpO1xyXG4gICAgICBcclxuICAgICAgLy8gTG9vayBmb3IgbmVnYXRpb25zXHJcbiAgICAgIGNvbnN0IG5lZ2F0aW9uUGF0dGVybnMgPSBbXHJcbiAgICAgICAgYCR7c3ViamVjdH0uKuS4jeaYry4qJHt2YWx1ZX1gLFxyXG4gICAgICAgIGAke3N1YmplY3R9Lirku47mnKouKiR7dmFsdWV9YCxcclxuICAgICAgICBgJHtzdWJqZWN0fS4q5LiN5YaNLioke3ZhbHVlfWAsXHJcbiAgICAgIF07XHJcbiAgICAgIFxyXG4gICAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgbmVnYXRpb25QYXR0ZXJucykge1xyXG4gICAgICAgIGNvbnN0IHJlZ2V4ID0gbmV3IFJlZ0V4cChwYXR0ZXJuKTtcclxuICAgICAgICBpZiAocmVnZXgudGVzdChjb250ZW50KSkge1xyXG4gICAgICAgICAgdmlvbGF0aW9ucy5wdXNoKHtcclxuICAgICAgICAgICAgdHlwZTogJ2Nhbm9uJyxcclxuICAgICAgICAgICAgc2V2ZXJpdHk6ICdlcnJvcicsXHJcbiAgICAgICAgICAgIGRlc2NyaXB0aW9uOiBgQ2Fub24gdmlvbGF0aW9uOiBcIiR7ZmFjdC5zdWJqZWN0fSAke2ZhY3QuYXR0cmlidXRlfSA9ICR7ZmFjdC52YWx1ZX1cIiBpcyBjb250cmFkaWN0ZWRgLFxyXG4gICAgICAgICAgICBub2RlczogW10sXHJcbiAgICAgICAgICAgIHN1Z2dlc3RlZEZpeDogYEVuc3VyZSAke2ZhY3Quc3ViamVjdH0gcmVtYWlucyAke2ZhY3QudmFsdWV9IGFzIGVzdGFibGlzaGVkIGluIGNoYXB0ZXIgJHtmYWN0LmNoYXB0ZXJFc3RhYmxpc2hlZH1gLFxyXG4gICAgICAgICAgfSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICBcclxuICAgIHJldHVybiB2aW9sYXRpb25zO1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBGb3JtYXQgY2Fub24gZm9yIHByb21wdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZm9ybWF0Q2Fub24oY2Fub246IENhbm9uU3RvcmUpOiBzdHJpbmcge1xyXG4gICAgaWYgKGNhbm9uLmZhY3RzLmxlbmd0aCA9PT0gMCkgcmV0dXJuICdObyBjYW5vbiBmYWN0cyBlc3RhYmxpc2hlZC4nO1xyXG4gICAgXHJcbiAgICByZXR1cm4gY2Fub24uZmFjdHNcclxuICAgICAgLm1hcChmID0+IGAtICR7Zi5zdWJqZWN0fSAke2YuYXR0cmlidXRlfSA9ICR7Zi52YWx1ZX0gKGVzdC4gQ2ggJHtmLmNoYXB0ZXJFc3RhYmxpc2hlZH0pYClcclxuICAgICAgLmpvaW4oJ1xcbicpO1xyXG4gIH1cclxuICBcclxuICAvKipcclxuICAgKiBGb3JtYXQgY2hhcmFjdGVycyBmb3IgcHJvbXB0XHJcbiAgICovXHJcbiAgcHJpdmF0ZSBmb3JtYXRDaGFyYWN0ZXJzKHN0YXRlOiBTdG9yeVN0cnVjdHVyZWRTdGF0ZSk6IHN0cmluZyB7XHJcbiAgICByZXR1cm4gT2JqZWN0LnZhbHVlcyhzdGF0ZS5jaGFyYWN0ZXJzKVxyXG4gICAgICAubWFwKGMgPT4gYC0gJHtjLm5hbWV9OiAke2MuZW1vdGlvbmFsU3RhdGV9LCBhdCAke2MubG9jYXRpb259YClcclxuICAgICAgLmpvaW4oJ1xcbicpIHx8ICdObyBjaGFyYWN0ZXJzLic7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEZvcm1hdCBwbG90IHRocmVhZHMgZm9yIHByb21wdFxyXG4gICAqL1xyXG4gIHByaXZhdGUgZm9ybWF0UGxvdFRocmVhZHMoc3RhdGU6IFN0b3J5U3RydWN0dXJlZFN0YXRlKTogc3RyaW5nIHtcclxuICAgIHJldHVybiBPYmplY3QudmFsdWVzKHN0YXRlLnBsb3RUaHJlYWRzKVxyXG4gICAgICAuZmlsdGVyKHQgPT4gdC5zdGF0dXMgIT09ICdyZXNvbHZlZCcpXHJcbiAgICAgIC5tYXAodCA9PiBgLSAke3QubmFtZX0gKCR7dC5zdGF0dXN9LCAke01hdGgucm91bmQodC50ZW5zaW9uICogMTAwKX0lIHRlbnNpb24pYClcclxuICAgICAgLmpvaW4oJ1xcbicpIHx8ICdObyBhY3RpdmUgcGxvdCB0aHJlYWRzLic7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEZvcm1hdCB2YWxpZGF0aW9uIHJlc3VsdCBmb3IgZGlzcGxheVxyXG4gICAqL1xyXG4gIGZvcm1hdFJlc3VsdChyZXN1bHQ6IFZhbGlkYXRpb25SZXN1bHQpOiBzdHJpbmcge1xyXG4gICAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW107XHJcbiAgICBcclxuICAgIGxpbmVzLnB1c2goYCoqVmFsaWRhdGlvbiBSZXN1bHQ6KiogJHtyZXN1bHQudmFsaWQgPyAn4pyFIFZBTElEJyA6ICfinYwgSU5WQUxJRCd9YCk7XHJcbiAgICBsaW5lcy5wdXNoKGAqKlN1bW1hcnk6KiogJHtyZXN1bHQuc3VtbWFyeX1gKTtcclxuICAgIFxyXG4gICAgaWYgKHJlc3VsdC52aW9sYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgICAgbGluZXMucHVzaCgnXFxuKipWaW9sYXRpb25zOioqJyk7XHJcbiAgICAgIFxyXG4gICAgICBjb25zdCBlcnJvcnMgPSByZXN1bHQudmlvbGF0aW9ucy5maWx0ZXIodiA9PiB2LnNldmVyaXR5ID09PSAnZXJyb3InKTtcclxuICAgICAgY29uc3Qgd2FybmluZ3MgPSByZXN1bHQudmlvbGF0aW9ucy5maWx0ZXIodiA9PiB2LnNldmVyaXR5ID09PSAnd2FybmluZycpO1xyXG4gICAgICBcclxuICAgICAgaWYgKGVycm9ycy5sZW5ndGggPiAwKSB7XHJcbiAgICAgICAgbGluZXMucHVzaCgnXFxuKkVycm9yczoqJyk7XHJcbiAgICAgICAgZm9yIChjb25zdCB2IG9mIGVycm9ycykge1xyXG4gICAgICAgICAgbGluZXMucHVzaChg4p2MIFske3YudHlwZS50b1VwcGVyQ2FzZSgpfV0gJHt2LmRlc2NyaXB0aW9ufWApO1xyXG4gICAgICAgICAgaWYgKHYuc3VnZ2VzdGVkRml4KSB7XHJcbiAgICAgICAgICAgIGxpbmVzLnB1c2goYCAgIPCfkqEgRml4OiAke3Yuc3VnZ2VzdGVkRml4fWApO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgICBcclxuICAgICAgaWYgKHdhcm5pbmdzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBsaW5lcy5wdXNoKCdcXG4qV2FybmluZ3M6KicpO1xyXG4gICAgICAgIGZvciAoY29uc3QgdiBvZiB3YXJuaW5ncykge1xyXG4gICAgICAgICAgbGluZXMucHVzaChg4pqg77iPIFske3YudHlwZS50b1VwcGVyQ2FzZSgpfV0gJHt2LmRlc2NyaXB0aW9ufWApO1xyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gICAgXHJcbiAgICByZXR1cm4gbGluZXMuam9pbignXFxuJyk7XHJcbiAgfVxyXG4gIFxyXG4gIC8qKlxyXG4gICAqIEdldCB0aGUgY29uc3RyYWludCBncmFwaFxyXG4gICAqL1xyXG4gIGdldENvbnN0cmFpbnRHcmFwaCgpOiBDb25zdHJhaW50R3JhcGgge1xyXG4gICAgcmV0dXJuIHRoaXMuY29uc3RyYWludEdyYXBoO1xyXG4gIH1cclxufVxyXG5cclxuZXhwb3J0IGNvbnN0IHZhbGlkYXRvciA9IG5ldyBWYWxpZGF0b3IoKTtcclxuIl19
@@ -0,0 +1,25 @@
1
+ export * from './types/index.js';
2
+ export type { LLMProviderConfig } from './types/index.js';
3
+ export { LLMClient, getLLM } from './llm/client.js';
4
+ export { ChapterWriter, writer } from './agents/writer.js';
5
+ export { CompletenessChecker, completenessChecker } from './agents/completeness.js';
6
+ export { ChapterSummarizer, summarizer } from './agents/summarizer.js';
7
+ export { CanonValidator, canonValidator } from './agents/canonValidator.js';
8
+ export { MemoryExtractor, memoryExtractor } from './agents/memoryExtractor.js';
9
+ export { StateUpdater, stateUpdater } from './agents/stateUpdater.js';
10
+ export { TensionController, tensionController, calculateTargetTension, calculateNextChapterTension, analyzeTension, generateTensionGuidance, formatTensionForPrompt, estimateTensionFromChapter, type TensionAnalysis, type TensionGuidance, } from './agents/tensionController.js';
11
+ export { StoryDirector, storyDirector, type ChapterObjective, type DirectorOutput, type DirectorContext, } from './agents/storyDirector.js';
12
+ export { ChapterPlanner, chapterPlanner, type Scene, type ChapterOutline, type PlannerContext, } from './agents/chapterPlanner.js';
13
+ export { CharacterAgentSystem, characterAgentSystem, type CharacterAgent, type AgendaItem, type CharacterDecision, type CharacterAgentContext, } from './world/characterAgent.js';
14
+ export { EventResolver, eventResolver, type WorldEvent, type EventResolution, type ConflictResolution, } from './world/eventResolver.js';
15
+ export { WorldStateManager, createWorldStateManager, type Location, type WorldState, } from './world/worldState.js';
16
+ export { ConstraintGraph, createConstraintGraph, type ConstraintNode, type ConstraintEdge, type ConstraintViolation, type NodeType, } from './constraints/constraintGraph.js';
17
+ export { Validator, validator, type ValidationResult, type ChapterValidationContext, } from './constraints/validator.js';
18
+ export { StateUpdaterPipeline, stateUpdaterPipeline, type StateUpdateResult, type StateChange, type UpdateContext, } from './memory/stateUpdater.js';
19
+ export { generateChapter, type GenerateChapterResult, type GenerateChapterOptions } from './pipeline/generateChapter.js';
20
+ export { createStoryBible, addCharacter, addPlotThread } from './story/bible.js';
21
+ export { createStoryState, updateStoryState } from './story/state.js';
22
+ export { createStructuredState, initializeCharactersFromBible, initializePlotThreadsFromBible, updateCharacterState, updatePlotThread, addUnresolvedQuestion, resolveQuestion, addRecentEvent, updateStoryTension, formatStructuredStateForPrompt, type StoryStructuredState, type CharacterState, type PlotThreadState, } from './story/structuredState.js';
23
+ export { createCanonStore, extractCanonFromBible, addFact, formatCanonForPrompt, type CanonStore, type CanonFact } from './memory/canonStore.js';
24
+ export { VectorStore, getVectorStore, clearVectorStore, type NarrativeMemory, type MemorySearchResult } from './memory/vectorStore.js';
25
+ export { MemoryRetriever, createMemoryRetriever, type RetrievalContext, type RetrievedMemory } from './memory/memoryRetriever.js';
package/dist/index.js ADDED
@@ -0,0 +1,115 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.addUnresolvedQuestion = exports.updatePlotThread = exports.updateCharacterState = exports.initializePlotThreadsFromBible = exports.initializeCharactersFromBible = exports.createStructuredState = exports.updateStoryState = exports.createStoryState = exports.addPlotThread = exports.addCharacter = exports.createStoryBible = exports.generateChapter = exports.stateUpdaterPipeline = exports.StateUpdaterPipeline = exports.validator = exports.Validator = exports.createConstraintGraph = exports.ConstraintGraph = exports.createWorldStateManager = exports.WorldStateManager = exports.eventResolver = exports.EventResolver = exports.characterAgentSystem = exports.CharacterAgentSystem = exports.chapterPlanner = exports.ChapterPlanner = exports.storyDirector = exports.StoryDirector = exports.estimateTensionFromChapter = exports.formatTensionForPrompt = exports.generateTensionGuidance = exports.analyzeTension = exports.calculateNextChapterTension = exports.calculateTargetTension = exports.tensionController = exports.TensionController = exports.stateUpdater = exports.StateUpdater = exports.memoryExtractor = exports.MemoryExtractor = exports.canonValidator = exports.CanonValidator = exports.summarizer = exports.ChapterSummarizer = exports.completenessChecker = exports.CompletenessChecker = exports.writer = exports.ChapterWriter = exports.getLLM = exports.LLMClient = void 0;
18
+ exports.createMemoryRetriever = exports.MemoryRetriever = exports.clearVectorStore = exports.getVectorStore = exports.VectorStore = exports.formatCanonForPrompt = exports.addFact = exports.extractCanonFromBible = exports.createCanonStore = exports.formatStructuredStateForPrompt = exports.updateStoryTension = exports.addRecentEvent = exports.resolveQuestion = void 0;
19
+ // Types
20
+ __exportStar(require("./types/index.js"), exports);
21
+ // LLM
22
+ var client_js_1 = require("./llm/client.js");
23
+ Object.defineProperty(exports, "LLMClient", { enumerable: true, get: function () { return client_js_1.LLMClient; } });
24
+ Object.defineProperty(exports, "getLLM", { enumerable: true, get: function () { return client_js_1.getLLM; } });
25
+ // Agents
26
+ var writer_js_1 = require("./agents/writer.js");
27
+ Object.defineProperty(exports, "ChapterWriter", { enumerable: true, get: function () { return writer_js_1.ChapterWriter; } });
28
+ Object.defineProperty(exports, "writer", { enumerable: true, get: function () { return writer_js_1.writer; } });
29
+ var completeness_js_1 = require("./agents/completeness.js");
30
+ Object.defineProperty(exports, "CompletenessChecker", { enumerable: true, get: function () { return completeness_js_1.CompletenessChecker; } });
31
+ Object.defineProperty(exports, "completenessChecker", { enumerable: true, get: function () { return completeness_js_1.completenessChecker; } });
32
+ var summarizer_js_1 = require("./agents/summarizer.js");
33
+ Object.defineProperty(exports, "ChapterSummarizer", { enumerable: true, get: function () { return summarizer_js_1.ChapterSummarizer; } });
34
+ Object.defineProperty(exports, "summarizer", { enumerable: true, get: function () { return summarizer_js_1.summarizer; } });
35
+ var canonValidator_js_1 = require("./agents/canonValidator.js");
36
+ Object.defineProperty(exports, "CanonValidator", { enumerable: true, get: function () { return canonValidator_js_1.CanonValidator; } });
37
+ Object.defineProperty(exports, "canonValidator", { enumerable: true, get: function () { return canonValidator_js_1.canonValidator; } });
38
+ var memoryExtractor_js_1 = require("./agents/memoryExtractor.js");
39
+ Object.defineProperty(exports, "MemoryExtractor", { enumerable: true, get: function () { return memoryExtractor_js_1.MemoryExtractor; } });
40
+ Object.defineProperty(exports, "memoryExtractor", { enumerable: true, get: function () { return memoryExtractor_js_1.memoryExtractor; } });
41
+ var stateUpdater_js_1 = require("./agents/stateUpdater.js");
42
+ Object.defineProperty(exports, "StateUpdater", { enumerable: true, get: function () { return stateUpdater_js_1.StateUpdater; } });
43
+ Object.defineProperty(exports, "stateUpdater", { enumerable: true, get: function () { return stateUpdater_js_1.stateUpdater; } });
44
+ var tensionController_js_1 = require("./agents/tensionController.js");
45
+ Object.defineProperty(exports, "TensionController", { enumerable: true, get: function () { return tensionController_js_1.TensionController; } });
46
+ Object.defineProperty(exports, "tensionController", { enumerable: true, get: function () { return tensionController_js_1.tensionController; } });
47
+ Object.defineProperty(exports, "calculateTargetTension", { enumerable: true, get: function () { return tensionController_js_1.calculateTargetTension; } });
48
+ Object.defineProperty(exports, "calculateNextChapterTension", { enumerable: true, get: function () { return tensionController_js_1.calculateNextChapterTension; } });
49
+ Object.defineProperty(exports, "analyzeTension", { enumerable: true, get: function () { return tensionController_js_1.analyzeTension; } });
50
+ Object.defineProperty(exports, "generateTensionGuidance", { enumerable: true, get: function () { return tensionController_js_1.generateTensionGuidance; } });
51
+ Object.defineProperty(exports, "formatTensionForPrompt", { enumerable: true, get: function () { return tensionController_js_1.formatTensionForPrompt; } });
52
+ Object.defineProperty(exports, "estimateTensionFromChapter", { enumerable: true, get: function () { return tensionController_js_1.estimateTensionFromChapter; } });
53
+ var storyDirector_js_1 = require("./agents/storyDirector.js");
54
+ Object.defineProperty(exports, "StoryDirector", { enumerable: true, get: function () { return storyDirector_js_1.StoryDirector; } });
55
+ Object.defineProperty(exports, "storyDirector", { enumerable: true, get: function () { return storyDirector_js_1.storyDirector; } });
56
+ var chapterPlanner_js_1 = require("./agents/chapterPlanner.js");
57
+ Object.defineProperty(exports, "ChapterPlanner", { enumerable: true, get: function () { return chapterPlanner_js_1.ChapterPlanner; } });
58
+ Object.defineProperty(exports, "chapterPlanner", { enumerable: true, get: function () { return chapterPlanner_js_1.chapterPlanner; } });
59
+ // World Simulation
60
+ var characterAgent_js_1 = require("./world/characterAgent.js");
61
+ Object.defineProperty(exports, "CharacterAgentSystem", { enumerable: true, get: function () { return characterAgent_js_1.CharacterAgentSystem; } });
62
+ Object.defineProperty(exports, "characterAgentSystem", { enumerable: true, get: function () { return characterAgent_js_1.characterAgentSystem; } });
63
+ var eventResolver_js_1 = require("./world/eventResolver.js");
64
+ Object.defineProperty(exports, "EventResolver", { enumerable: true, get: function () { return eventResolver_js_1.EventResolver; } });
65
+ Object.defineProperty(exports, "eventResolver", { enumerable: true, get: function () { return eventResolver_js_1.eventResolver; } });
66
+ var worldState_js_1 = require("./world/worldState.js");
67
+ Object.defineProperty(exports, "WorldStateManager", { enumerable: true, get: function () { return worldState_js_1.WorldStateManager; } });
68
+ Object.defineProperty(exports, "createWorldStateManager", { enumerable: true, get: function () { return worldState_js_1.createWorldStateManager; } });
69
+ // Constraints
70
+ var constraintGraph_js_1 = require("./constraints/constraintGraph.js");
71
+ Object.defineProperty(exports, "ConstraintGraph", { enumerable: true, get: function () { return constraintGraph_js_1.ConstraintGraph; } });
72
+ Object.defineProperty(exports, "createConstraintGraph", { enumerable: true, get: function () { return constraintGraph_js_1.createConstraintGraph; } });
73
+ var validator_js_1 = require("./constraints/validator.js");
74
+ Object.defineProperty(exports, "Validator", { enumerable: true, get: function () { return validator_js_1.Validator; } });
75
+ Object.defineProperty(exports, "validator", { enumerable: true, get: function () { return validator_js_1.validator; } });
76
+ // State Update Pipeline
77
+ var stateUpdater_js_2 = require("./memory/stateUpdater.js");
78
+ Object.defineProperty(exports, "StateUpdaterPipeline", { enumerable: true, get: function () { return stateUpdater_js_2.StateUpdaterPipeline; } });
79
+ Object.defineProperty(exports, "stateUpdaterPipeline", { enumerable: true, get: function () { return stateUpdater_js_2.stateUpdaterPipeline; } });
80
+ // Pipeline
81
+ var generateChapter_js_1 = require("./pipeline/generateChapter.js");
82
+ Object.defineProperty(exports, "generateChapter", { enumerable: true, get: function () { return generateChapter_js_1.generateChapter; } });
83
+ // Story
84
+ var bible_js_1 = require("./story/bible.js");
85
+ Object.defineProperty(exports, "createStoryBible", { enumerable: true, get: function () { return bible_js_1.createStoryBible; } });
86
+ Object.defineProperty(exports, "addCharacter", { enumerable: true, get: function () { return bible_js_1.addCharacter; } });
87
+ Object.defineProperty(exports, "addPlotThread", { enumerable: true, get: function () { return bible_js_1.addPlotThread; } });
88
+ var state_js_1 = require("./story/state.js");
89
+ Object.defineProperty(exports, "createStoryState", { enumerable: true, get: function () { return state_js_1.createStoryState; } });
90
+ Object.defineProperty(exports, "updateStoryState", { enumerable: true, get: function () { return state_js_1.updateStoryState; } });
91
+ var structuredState_js_1 = require("./story/structuredState.js");
92
+ Object.defineProperty(exports, "createStructuredState", { enumerable: true, get: function () { return structuredState_js_1.createStructuredState; } });
93
+ Object.defineProperty(exports, "initializeCharactersFromBible", { enumerable: true, get: function () { return structuredState_js_1.initializeCharactersFromBible; } });
94
+ Object.defineProperty(exports, "initializePlotThreadsFromBible", { enumerable: true, get: function () { return structuredState_js_1.initializePlotThreadsFromBible; } });
95
+ Object.defineProperty(exports, "updateCharacterState", { enumerable: true, get: function () { return structuredState_js_1.updateCharacterState; } });
96
+ Object.defineProperty(exports, "updatePlotThread", { enumerable: true, get: function () { return structuredState_js_1.updatePlotThread; } });
97
+ Object.defineProperty(exports, "addUnresolvedQuestion", { enumerable: true, get: function () { return structuredState_js_1.addUnresolvedQuestion; } });
98
+ Object.defineProperty(exports, "resolveQuestion", { enumerable: true, get: function () { return structuredState_js_1.resolveQuestion; } });
99
+ Object.defineProperty(exports, "addRecentEvent", { enumerable: true, get: function () { return structuredState_js_1.addRecentEvent; } });
100
+ Object.defineProperty(exports, "updateStoryTension", { enumerable: true, get: function () { return structuredState_js_1.updateStoryTension; } });
101
+ Object.defineProperty(exports, "formatStructuredStateForPrompt", { enumerable: true, get: function () { return structuredState_js_1.formatStructuredStateForPrompt; } });
102
+ // Memory
103
+ var canonStore_js_1 = require("./memory/canonStore.js");
104
+ Object.defineProperty(exports, "createCanonStore", { enumerable: true, get: function () { return canonStore_js_1.createCanonStore; } });
105
+ Object.defineProperty(exports, "extractCanonFromBible", { enumerable: true, get: function () { return canonStore_js_1.extractCanonFromBible; } });
106
+ Object.defineProperty(exports, "addFact", { enumerable: true, get: function () { return canonStore_js_1.addFact; } });
107
+ Object.defineProperty(exports, "formatCanonForPrompt", { enumerable: true, get: function () { return canonStore_js_1.formatCanonForPrompt; } });
108
+ var vectorStore_js_1 = require("./memory/vectorStore.js");
109
+ Object.defineProperty(exports, "VectorStore", { enumerable: true, get: function () { return vectorStore_js_1.VectorStore; } });
110
+ Object.defineProperty(exports, "getVectorStore", { enumerable: true, get: function () { return vectorStore_js_1.getVectorStore; } });
111
+ Object.defineProperty(exports, "clearVectorStore", { enumerable: true, get: function () { return vectorStore_js_1.clearVectorStore; } });
112
+ var memoryRetriever_js_1 = require("./memory/memoryRetriever.js");
113
+ Object.defineProperty(exports, "MemoryRetriever", { enumerable: true, get: function () { return memoryRetriever_js_1.MemoryRetriever; } });
114
+ Object.defineProperty(exports, "createMemoryRetriever", { enumerable: true, get: function () { return memoryRetriever_js_1.createMemoryRetriever; } });
115
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUEsUUFBUTtBQUNSLG1EQUFpQztBQUdqQyxNQUFNO0FBQ04sNkNBQW9EO0FBQTNDLHNHQUFBLFNBQVMsT0FBQTtBQUFFLG1HQUFBLE1BQU0sT0FBQTtBQUUxQixTQUFTO0FBQ1QsZ0RBQTJEO0FBQWxELDBHQUFBLGFBQWEsT0FBQTtBQUFFLG1HQUFBLE1BQU0sT0FBQTtBQUM5Qiw0REFBb0Y7QUFBM0Usc0hBQUEsbUJBQW1CLE9BQUE7QUFBRSxzSEFBQSxtQkFBbUIsT0FBQTtBQUNqRCx3REFBdUU7QUFBOUQsa0hBQUEsaUJBQWlCLE9BQUE7QUFBRSwyR0FBQSxVQUFVLE9BQUE7QUFDdEMsZ0VBQTRFO0FBQW5FLG1IQUFBLGNBQWMsT0FBQTtBQUFFLG1IQUFBLGNBQWMsT0FBQTtBQUN2QyxrRUFBK0U7QUFBdEUscUhBQUEsZUFBZSxPQUFBO0FBQUUscUhBQUEsZUFBZSxPQUFBO0FBQ3pDLDREQUFzRTtBQUE3RCwrR0FBQSxZQUFZLE9BQUE7QUFBRSwrR0FBQSxZQUFZLE9BQUE7QUFDbkMsc0VBV3VDO0FBVnJDLHlIQUFBLGlCQUFpQixPQUFBO0FBQ2pCLHlIQUFBLGlCQUFpQixPQUFBO0FBQ2pCLDhIQUFBLHNCQUFzQixPQUFBO0FBQ3RCLG1JQUFBLDJCQUEyQixPQUFBO0FBQzNCLHNIQUFBLGNBQWMsT0FBQTtBQUNkLCtIQUFBLHVCQUF1QixPQUFBO0FBQ3ZCLDhIQUFBLHNCQUFzQixPQUFBO0FBQ3RCLGtJQUFBLDBCQUEwQixPQUFBO0FBSTVCLDhEQU1tQztBQUxqQyxpSEFBQSxhQUFhLE9BQUE7QUFDYixpSEFBQSxhQUFhLE9BQUE7QUFLZixnRUFNb0M7QUFMbEMsbUhBQUEsY0FBYyxPQUFBO0FBQ2QsbUhBQUEsY0FBYyxPQUFBO0FBTWhCLG1CQUFtQjtBQUNuQiwrREFPbUM7QUFOakMseUhBQUEsb0JBQW9CLE9BQUE7QUFDcEIseUhBQUEsb0JBQW9CLE9BQUE7QUFNdEIsNkRBTWtDO0FBTGhDLGlIQUFBLGFBQWEsT0FBQTtBQUNiLGlIQUFBLGFBQWEsT0FBQTtBQUtmLHVEQUsrQjtBQUo3QixrSEFBQSxpQkFBaUIsT0FBQTtBQUNqQix3SEFBQSx1QkFBdUIsT0FBQTtBQUt6QixjQUFjO0FBQ2QsdUVBTzBDO0FBTnhDLHFIQUFBLGVBQWUsT0FBQTtBQUNmLDJIQUFBLHFCQUFxQixPQUFBO0FBTXZCLDJEQUtvQztBQUpsQyx5R0FBQSxTQUFTLE9BQUE7QUFDVCx5R0FBQSxTQUFTLE9BQUE7QUFLWCx3QkFBd0I7QUFDeEIsNERBTWtDO0FBTGhDLHVIQUFBLG9CQUFvQixPQUFBO0FBQ3BCLHVIQUFBLG9CQUFvQixPQUFBO0FBTXRCLFdBQVc7QUFDWCxvRUFBeUg7QUFBaEgscUhBQUEsZUFBZSxPQUFBO0FBRXhCLFFBQVE7QUFDUiw2Q0FBaUY7QUFBeEUsNEdBQUEsZ0JBQWdCLE9BQUE7QUFBRSx3R0FBQSxZQUFZLE9BQUE7QUFBRSx5R0FBQSxhQUFhLE9BQUE7QUFDdEQsNkNBQXNFO0FBQTdELDRHQUFBLGdCQUFnQixPQUFBO0FBQUUsNEdBQUEsZ0JBQWdCLE9BQUE7QUFDM0MsaUVBY29DO0FBYmxDLDJIQUFBLHFCQUFxQixPQUFBO0FBQ3JCLG1JQUFBLDZCQUE2QixPQUFBO0FBQzdCLG9JQUFBLDhCQUE4QixPQUFBO0FBQzlCLDBIQUFBLG9CQUFvQixPQUFBO0FBQ3BCLHNIQUFBLGdCQUFnQixPQUFBO0FBQ2hCLDJIQUFBLHFCQUFxQixPQUFBO0FBQ3JCLHFIQUFBLGVBQWUsT0FBQTtBQUNmLG9IQUFBLGNBQWMsT0FBQTtBQUNkLHdIQUFBLGtCQUFrQixPQUFBO0FBQ2xCLG9JQUFBLDhCQUE4QixPQUFBO0FBTWhDLFNBQVM7QUFDVCx3REFBaUo7QUFBeEksaUhBQUEsZ0JBQWdCLE9BQUE7QUFBRSxzSEFBQSxxQkFBcUIsT0FBQTtBQUFFLHdHQUFBLE9BQU8sT0FBQTtBQUFFLHFIQUFBLG9CQUFvQixPQUFBO0FBQy9FLDBEQUF1STtBQUE5SCw2R0FBQSxXQUFXLE9BQUE7QUFBRSxnSEFBQSxjQUFjLE9BQUE7QUFBRSxrSEFBQSxnQkFBZ0IsT0FBQTtBQUN0RCxrRUFBa0k7QUFBekgscUhBQUEsZUFBZSxPQUFBO0FBQUUsMkhBQUEscUJBQXFCLE9BQUEiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBUeXBlc1xyXG5leHBvcnQgKiBmcm9tICcuL3R5cGVzL2luZGV4LmpzJztcclxuZXhwb3J0IHR5cGUgeyBMTE1Qcm92aWRlckNvbmZpZyB9IGZyb20gJy4vdHlwZXMvaW5kZXguanMnO1xyXG5cclxuLy8gTExNXHJcbmV4cG9ydCB7IExMTUNsaWVudCwgZ2V0TExNIH0gZnJvbSAnLi9sbG0vY2xpZW50LmpzJztcclxuXHJcbi8vIEFnZW50c1xyXG5leHBvcnQgeyBDaGFwdGVyV3JpdGVyLCB3cml0ZXIgfSBmcm9tICcuL2FnZW50cy93cml0ZXIuanMnO1xyXG5leHBvcnQgeyBDb21wbGV0ZW5lc3NDaGVja2VyLCBjb21wbGV0ZW5lc3NDaGVja2VyIH0gZnJvbSAnLi9hZ2VudHMvY29tcGxldGVuZXNzLmpzJztcclxuZXhwb3J0IHsgQ2hhcHRlclN1bW1hcml6ZXIsIHN1bW1hcml6ZXIgfSBmcm9tICcuL2FnZW50cy9zdW1tYXJpemVyLmpzJztcclxuZXhwb3J0IHsgQ2Fub25WYWxpZGF0b3IsIGNhbm9uVmFsaWRhdG9yIH0gZnJvbSAnLi9hZ2VudHMvY2Fub25WYWxpZGF0b3IuanMnO1xyXG5leHBvcnQgeyBNZW1vcnlFeHRyYWN0b3IsIG1lbW9yeUV4dHJhY3RvciB9IGZyb20gJy4vYWdlbnRzL21lbW9yeUV4dHJhY3Rvci5qcyc7XHJcbmV4cG9ydCB7IFN0YXRlVXBkYXRlciwgc3RhdGVVcGRhdGVyIH0gZnJvbSAnLi9hZ2VudHMvc3RhdGVVcGRhdGVyLmpzJztcclxuZXhwb3J0IHtcclxuICBUZW5zaW9uQ29udHJvbGxlcixcclxuICB0ZW5zaW9uQ29udHJvbGxlcixcclxuICBjYWxjdWxhdGVUYXJnZXRUZW5zaW9uLFxyXG4gIGNhbGN1bGF0ZU5leHRDaGFwdGVyVGVuc2lvbixcclxuICBhbmFseXplVGVuc2lvbixcclxuICBnZW5lcmF0ZVRlbnNpb25HdWlkYW5jZSxcclxuICBmb3JtYXRUZW5zaW9uRm9yUHJvbXB0LFxyXG4gIGVzdGltYXRlVGVuc2lvbkZyb21DaGFwdGVyLFxyXG4gIHR5cGUgVGVuc2lvbkFuYWx5c2lzLFxyXG4gIHR5cGUgVGVuc2lvbkd1aWRhbmNlLFxyXG59IGZyb20gJy4vYWdlbnRzL3RlbnNpb25Db250cm9sbGVyLmpzJztcclxuZXhwb3J0IHtcclxuICBTdG9yeURpcmVjdG9yLFxyXG4gIHN0b3J5RGlyZWN0b3IsXHJcbiAgdHlwZSBDaGFwdGVyT2JqZWN0aXZlLFxyXG4gIHR5cGUgRGlyZWN0b3JPdXRwdXQsXHJcbiAgdHlwZSBEaXJlY3RvckNvbnRleHQsXHJcbn0gZnJvbSAnLi9hZ2VudHMvc3RvcnlEaXJlY3Rvci5qcyc7XHJcbmV4cG9ydCB7XHJcbiAgQ2hhcHRlclBsYW5uZXIsXHJcbiAgY2hhcHRlclBsYW5uZXIsXHJcbiAgdHlwZSBTY2VuZSxcclxuICB0eXBlIENoYXB0ZXJPdXRsaW5lLFxyXG4gIHR5cGUgUGxhbm5lckNvbnRleHQsXHJcbn0gZnJvbSAnLi9hZ2VudHMvY2hhcHRlclBsYW5uZXIuanMnO1xyXG5cclxuLy8gV29ybGQgU2ltdWxhdGlvblxyXG5leHBvcnQge1xyXG4gIENoYXJhY3RlckFnZW50U3lzdGVtLFxyXG4gIGNoYXJhY3RlckFnZW50U3lzdGVtLFxyXG4gIHR5cGUgQ2hhcmFjdGVyQWdlbnQsXHJcbiAgdHlwZSBBZ2VuZGFJdGVtLFxyXG4gIHR5cGUgQ2hhcmFjdGVyRGVjaXNpb24sXHJcbiAgdHlwZSBDaGFyYWN0ZXJBZ2VudENvbnRleHQsXHJcbn0gZnJvbSAnLi93b3JsZC9jaGFyYWN0ZXJBZ2VudC5qcyc7XHJcbmV4cG9ydCB7XHJcbiAgRXZlbnRSZXNvbHZlcixcclxuICBldmVudFJlc29sdmVyLFxyXG4gIHR5cGUgV29ybGRFdmVudCxcclxuICB0eXBlIEV2ZW50UmVzb2x1dGlvbixcclxuICB0eXBlIENvbmZsaWN0UmVzb2x1dGlvbixcclxufSBmcm9tICcuL3dvcmxkL2V2ZW50UmVzb2x2ZXIuanMnO1xyXG5leHBvcnQge1xyXG4gIFdvcmxkU3RhdGVNYW5hZ2VyLFxyXG4gIGNyZWF0ZVdvcmxkU3RhdGVNYW5hZ2VyLFxyXG4gIHR5cGUgTG9jYXRpb24sXHJcbiAgdHlwZSBXb3JsZFN0YXRlLFxyXG59IGZyb20gJy4vd29ybGQvd29ybGRTdGF0ZS5qcyc7XHJcblxyXG4vLyBDb25zdHJhaW50c1xyXG5leHBvcnQge1xyXG4gIENvbnN0cmFpbnRHcmFwaCxcclxuICBjcmVhdGVDb25zdHJhaW50R3JhcGgsXHJcbiAgdHlwZSBDb25zdHJhaW50Tm9kZSxcclxuICB0eXBlIENvbnN0cmFpbnRFZGdlLFxyXG4gIHR5cGUgQ29uc3RyYWludFZpb2xhdGlvbixcclxuICB0eXBlIE5vZGVUeXBlLFxyXG59IGZyb20gJy4vY29uc3RyYWludHMvY29uc3RyYWludEdyYXBoLmpzJztcclxuZXhwb3J0IHtcclxuICBWYWxpZGF0b3IsXHJcbiAgdmFsaWRhdG9yLFxyXG4gIHR5cGUgVmFsaWRhdGlvblJlc3VsdCxcclxuICB0eXBlIENoYXB0ZXJWYWxpZGF0aW9uQ29udGV4dCxcclxufSBmcm9tICcuL2NvbnN0cmFpbnRzL3ZhbGlkYXRvci5qcyc7XHJcblxyXG4vLyBTdGF0ZSBVcGRhdGUgUGlwZWxpbmVcclxuZXhwb3J0IHtcclxuICBTdGF0ZVVwZGF0ZXJQaXBlbGluZSxcclxuICBzdGF0ZVVwZGF0ZXJQaXBlbGluZSxcclxuICB0eXBlIFN0YXRlVXBkYXRlUmVzdWx0LFxyXG4gIHR5cGUgU3RhdGVDaGFuZ2UsXHJcbiAgdHlwZSBVcGRhdGVDb250ZXh0LFxyXG59IGZyb20gJy4vbWVtb3J5L3N0YXRlVXBkYXRlci5qcyc7XHJcblxyXG4vLyBQaXBlbGluZVxyXG5leHBvcnQgeyBnZW5lcmF0ZUNoYXB0ZXIsIHR5cGUgR2VuZXJhdGVDaGFwdGVyUmVzdWx0LCB0eXBlIEdlbmVyYXRlQ2hhcHRlck9wdGlvbnMgfSBmcm9tICcuL3BpcGVsaW5lL2dlbmVyYXRlQ2hhcHRlci5qcyc7XHJcblxyXG4vLyBTdG9yeVxyXG5leHBvcnQgeyBjcmVhdGVTdG9yeUJpYmxlLCBhZGRDaGFyYWN0ZXIsIGFkZFBsb3RUaHJlYWQgfSBmcm9tICcuL3N0b3J5L2JpYmxlLmpzJztcclxuZXhwb3J0IHsgY3JlYXRlU3RvcnlTdGF0ZSwgdXBkYXRlU3RvcnlTdGF0ZSB9IGZyb20gJy4vc3Rvcnkvc3RhdGUuanMnO1xyXG5leHBvcnQge1xyXG4gIGNyZWF0ZVN0cnVjdHVyZWRTdGF0ZSxcclxuICBpbml0aWFsaXplQ2hhcmFjdGVyc0Zyb21CaWJsZSxcclxuICBpbml0aWFsaXplUGxvdFRocmVhZHNGcm9tQmlibGUsXHJcbiAgdXBkYXRlQ2hhcmFjdGVyU3RhdGUsXHJcbiAgdXBkYXRlUGxvdFRocmVhZCxcclxuICBhZGRVbnJlc29sdmVkUXVlc3Rpb24sXHJcbiAgcmVzb2x2ZVF1ZXN0aW9uLFxyXG4gIGFkZFJlY2VudEV2ZW50LFxyXG4gIHVwZGF0ZVN0b3J5VGVuc2lvbixcclxuICBmb3JtYXRTdHJ1Y3R1cmVkU3RhdGVGb3JQcm9tcHQsXHJcbiAgdHlwZSBTdG9yeVN0cnVjdHVyZWRTdGF0ZSxcclxuICB0eXBlIENoYXJhY3RlclN0YXRlLFxyXG4gIHR5cGUgUGxvdFRocmVhZFN0YXRlLFxyXG59IGZyb20gJy4vc3Rvcnkvc3RydWN0dXJlZFN0YXRlLmpzJztcclxuXHJcbi8vIE1lbW9yeVxyXG5leHBvcnQgeyBjcmVhdGVDYW5vblN0b3JlLCBleHRyYWN0Q2Fub25Gcm9tQmlibGUsIGFkZEZhY3QsIGZvcm1hdENhbm9uRm9yUHJvbXB0LCB0eXBlIENhbm9uU3RvcmUsIHR5cGUgQ2Fub25GYWN0IH0gZnJvbSAnLi9tZW1vcnkvY2Fub25TdG9yZS5qcyc7XHJcbmV4cG9ydCB7IFZlY3RvclN0b3JlLCBnZXRWZWN0b3JTdG9yZSwgY2xlYXJWZWN0b3JTdG9yZSwgdHlwZSBOYXJyYXRpdmVNZW1vcnksIHR5cGUgTWVtb3J5U2VhcmNoUmVzdWx0IH0gZnJvbSAnLi9tZW1vcnkvdmVjdG9yU3RvcmUuanMnO1xyXG5leHBvcnQgeyBNZW1vcnlSZXRyaWV2ZXIsIGNyZWF0ZU1lbW9yeVJldHJpZXZlciwgdHlwZSBSZXRyaWV2YWxDb250ZXh0LCB0eXBlIFJldHJpZXZlZE1lbW9yeSB9IGZyb20gJy4vbWVtb3J5L21lbW9yeVJldHJpZXZlci5qcyc7XHJcbiJdfQ==
@@ -0,0 +1,14 @@
1
+ import type { LLMConfig, LLMProviderConfig } from '../types/index.js';
2
+ export interface LLMProvider {
3
+ complete(prompt: string, config?: Partial<LLMConfig>): Promise<string>;
4
+ }
5
+ export declare class LLMClient {
6
+ private provider;
7
+ private defaultConfig;
8
+ constructor(providerConfig?: LLMProviderConfig);
9
+ private loadConfig;
10
+ private createProvider;
11
+ complete(prompt: string, config?: Partial<LLMConfig>): Promise<string>;
12
+ completeJSON<T>(prompt: string, config?: Partial<LLMConfig>): Promise<T>;
13
+ }
14
+ export declare function getLLM(): LLMClient;
@@ -0,0 +1,108 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.LLMClient = void 0;
7
+ exports.getLLM = getLLM;
8
+ const openai_1 = __importDefault(require("openai"));
9
+ class OpenAIProvider {
10
+ client;
11
+ constructor(config) {
12
+ this.client = new openai_1.default({
13
+ apiKey: config.apiKey,
14
+ baseURL: config.baseURL,
15
+ });
16
+ }
17
+ async complete(prompt, config) {
18
+ const model = config?.model || 'gpt-4o-mini';
19
+ console.log(`[LLM] Using model: ${model}`);
20
+ const response = await this.client.chat.completions.create({
21
+ model,
22
+ messages: [{ role: 'user', content: prompt }],
23
+ temperature: config?.temperature ?? 0.7,
24
+ max_tokens: config?.maxTokens ?? 4000,
25
+ });
26
+ // Handle DeepSeek reasoning models which may have reasoning_content
27
+ const message = response.choices[0]?.message;
28
+ if (!message)
29
+ return '';
30
+ // For DeepSeek reasoning models, content may be in reasoning_content field
31
+ const content = message.reasoning_content || message.content || '';
32
+ return content;
33
+ }
34
+ }
35
+ class LLMClient {
36
+ provider;
37
+ defaultConfig;
38
+ constructor(providerConfig) {
39
+ const config = providerConfig || this.loadConfig();
40
+ this.provider = this.createProvider(config);
41
+ this.defaultConfig = {
42
+ model: config.model || 'gpt-4o-mini',
43
+ temperature: 0.7,
44
+ maxTokens: 4000,
45
+ };
46
+ }
47
+ loadConfig() {
48
+ const provider = process.env.LLM_PROVIDER || 'openai';
49
+ switch (provider) {
50
+ case 'openai':
51
+ return {
52
+ provider: 'openai',
53
+ apiKey: process.env.OPENAI_API_KEY || '',
54
+ model: process.env.LLM_MODEL || 'gpt-4o-mini',
55
+ };
56
+ case 'deepseek':
57
+ return {
58
+ provider: 'deepseek',
59
+ apiKey: process.env.DEEPSEEK_API_KEY || '',
60
+ baseURL: 'https://api.deepseek.com',
61
+ model: process.env.LLM_MODEL || 'deepseek-chat',
62
+ };
63
+ default:
64
+ throw new Error(`Unknown provider: ${provider}`);
65
+ }
66
+ }
67
+ createProvider(config) {
68
+ switch (config.provider) {
69
+ case 'openai':
70
+ case 'deepseek':
71
+ return new OpenAIProvider(config);
72
+ default:
73
+ throw new Error(`Unknown provider: ${config.provider}`);
74
+ }
75
+ }
76
+ async complete(prompt, config) {
77
+ const finalConfig = { ...this.defaultConfig, ...config };
78
+ return this.provider.complete(prompt, finalConfig);
79
+ }
80
+ async completeJSON(prompt, config) {
81
+ const jsonPrompt = `${prompt}\n\nYou must respond with valid JSON only. No markdown, no explanations. Wrap your JSON response in triple backticks if needed.`;
82
+ const response = await this.complete(jsonPrompt, {
83
+ ...config,
84
+ temperature: config?.temperature ?? 0.3,
85
+ });
86
+ // Try to extract JSON from markdown code blocks if present
87
+ let jsonText = response.trim();
88
+ const codeBlockMatch = jsonText.match(/```(?:json)?\s*([\s\S]*?)```/);
89
+ if (codeBlockMatch) {
90
+ jsonText = codeBlockMatch[1].trim();
91
+ }
92
+ try {
93
+ return JSON.parse(jsonText);
94
+ }
95
+ catch (error) {
96
+ throw new Error(`Failed to parse JSON response: ${jsonText.substring(0, 200)}`);
97
+ }
98
+ }
99
+ }
100
+ exports.LLMClient = LLMClient;
101
+ let _llm = null;
102
+ function getLLM() {
103
+ if (!_llm) {
104
+ _llm = new LLMClient();
105
+ }
106
+ return _llm;
107
+ }
108
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2xsbS9jbGllbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7O0FBaUhBLHdCQUtDO0FBdEhELG9EQUE0QjtBQU81QixNQUFNLGNBQWM7SUFDVixNQUFNLENBQVM7SUFFdkIsWUFBWSxNQUF5QjtRQUNuQyxJQUFJLENBQUMsTUFBTSxHQUFHLElBQUksZ0JBQU0sQ0FBQztZQUN2QixNQUFNLEVBQUUsTUFBTSxDQUFDLE1BQU07WUFDckIsT0FBTyxFQUFFLE1BQU0sQ0FBQyxPQUFPO1NBQ3hCLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFRCxLQUFLLENBQUMsUUFBUSxDQUFDLE1BQWMsRUFBRSxNQUEyQjtRQUN4RCxNQUFNLEtBQUssR0FBRyxNQUFNLEVBQUUsS0FBSyxJQUFJLGFBQWEsQ0FBQztRQUM3QyxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixLQUFLLEVBQUUsQ0FBQyxDQUFDO1FBQzNDLE1BQU0sUUFBUSxHQUFHLE1BQU0sSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQztZQUN6RCxLQUFLO1lBQ0wsUUFBUSxFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM3QyxXQUFXLEVBQUUsTUFBTSxFQUFFLFdBQVcsSUFBSSxHQUFHO1lBQ3ZDLFVBQVUsRUFBRSxNQUFNLEVBQUUsU0FBUyxJQUFJLElBQUk7U0FDdEMsQ0FBQyxDQUFDO1FBRUgsb0VBQW9FO1FBQ3BFLE1BQU0sT0FBTyxHQUFHLFFBQVEsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsT0FBTyxDQUFDO1FBQzdDLElBQUksQ0FBQyxPQUFPO1lBQUUsT0FBTyxFQUFFLENBQUM7UUFFeEIsMkVBQTJFO1FBQzNFLE1BQU0sT0FBTyxHQUFJLE9BQWUsQ0FBQyxpQkFBaUIsSUFBSSxPQUFPLENB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QUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sSUFBSSxLQUFLLENBQUMsa0NBQWtDLFFBQVEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEdBQUcsQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUNsRixDQUFDO0lBQ0gsQ0FBQztDQUNGO0FBeEVELDhCQXdFQztBQUVELElBQUksSUFBSSxHQUFxQixJQUFJLENBQUM7QUFFbEMsU0FBZ0IsTUFBTTtJQUNwQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDVixJQUFJLEdBQUcsSUFBSSxTQUFTLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBQ0QsT0FBTyxJQUFJLENBQUM7QUFDZCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IE9wZW5BSSBmcm9tICdvcGVuYWknO1xyXG5pbXBvcnQgdHlwZSB7IExMTUNvbmZpZywgTExNUHJvdmlkZXJDb25maWcgfSBmcm9tICcuLi90eXBlcy9pbmRleC5qcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIExMTVByb3ZpZGVyIHtcclxuICBjb21wbGV0ZShwcm9tcHQ6IHN0cmluZywgY29uZmlnPzogUGFydGlhbDxMTE1Db25maWc+KTogUHJvbWlzZTxzdHJpbmc+O1xyXG59XHJcblxyXG5jbGFzcyBPcGVuQUlQcm92aWRlciBpbXBsZW1lbnRzIExMTVByb3ZpZGVyIHtcclxuICBwcml2YXRlIGNsaWVudDogT3BlbkFJO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihjb25maWc6IExMTVByb3ZpZGVyQ29uZmlnKSB7XHJcbiAgICB0aGlzLmNsaWVudCA9IG5ldyBPcGVuQUkoe1xyXG4gICAgICBhcGlLZXk6IGNvbmZpZy5hcGlLZXksXHJcbiAgICAgIGJhc2VVUkw6IGNvbmZpZy5iYXNlVVJMLFxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb21wbGV0ZShwcm9tcHQ6IHN0cmluZywgY29uZmlnPzogUGFydGlhbDxMTE1Db25maWc+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IG1vZGVsID0gY29uZmlnPy5tb2RlbCB8fCAnZ3B0LTRvLW1pbmknO1xyXG4gICAgY29uc29sZS5sb2coYFtMTE1dIFVzaW5nIG1vZGVsOiAke21vZGVsfWApO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNsaWVudC5jaGF0LmNvbXBsZXRpb25zLmNyZWF0ZSh7XHJcbiAgICAgIG1vZGVsLFxyXG4gICAgICBtZXNzYWdlczogW3sgcm9sZTogJ3VzZXInLCBjb250ZW50OiBwcm9tcHQgfV0sXHJcbiAgICAgIHRlbXBlcmF0dXJlOiBjb25maWc/LnRlbXBlcmF0dXJlID8/IDAuNyxcclxuICAgICAgbWF4X3Rva2VuczogY29uZmlnPy5tYXhUb2tlbnMgPz8gNDAwMCxcclxuICAgIH0pO1xyXG4gICAgXHJcbiAgICAvLyBIYW5kbGUgRGVlcFNlZWsgcmVhc29uaW5nIG1vZGVscyB3aGljaCBtYXkgaGF2ZSByZWFzb25pbmdfY29udGVudFxyXG4gICAgY29uc3QgbWVzc2FnZSA9IHJlc3BvbnNlLmNob2ljZXNbMF0/Lm1lc3NhZ2U7XHJcbiAgICBpZiAoIW1lc3NhZ2UpIHJldHVybiAnJztcclxuICAgIFxyXG4gICAgLy8gRm9yIERlZXBTZWVrIHJlYXNvbmluZyBtb2RlbHMsIGNvbnRlbnQgbWF5IGJlIGluIHJlYXNvbmluZ19jb250ZW50IGZpZWxkXHJcbiAgICBjb25zdCBjb250ZW50ID0gKG1lc3NhZ2UgYXMgYW55KS5yZWFzb25pbmdfY29udGVudCB8fCBtZXNzYWdlLmNvbnRlbnQgfHwgJyc7XHJcbiAgICByZXR1cm4gY29udGVudDtcclxuICB9XHJcbn1cclxuXHJcbmV4cG9ydCBjbGFzcyBMTE1DbGllbnQge1xyXG4gIHByaXZhdGUgcHJvdmlkZXI6IExMTVByb3ZpZGVyO1xyXG4gIHByaXZhdGUgZGVmYXVsdENvbmZpZzogTExNQ29uZmlnO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcm92aWRlckNvbmZpZz86IExMTVByb3ZpZGVyQ29uZmlnKSB7XHJcbiAgICBjb25zdCBjb25maWcgPSBwcm92aWRlckNvbmZpZyB8fCB0aGlzLmxvYWRDb25maWcoKTtcclxuICAgIHRoaXMucHJvdmlkZXIgPSB0aGlzLmNyZWF0ZVByb3ZpZGVyKGNvbmZpZyk7XHJcbiAgICBcclxuICAgIHRoaXMuZGVmYXVsdENvbmZpZyA9IHtcclxuICAgICAgbW9kZWw6IGNvbmZpZy5tb2RlbCB8fCAnZ3B0LTRvLW1pbmknLFxyXG4gICAgICB0ZW1wZXJhdHVyZTogMC43LFxyXG4gICAgICBtYXhUb2tlbnM6IDQwMDAsXHJcbiAgICB9O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBsb2FkQ29uZmlnKCk6IExMTVByb3ZpZGVyQ29uZmlnIHtcclxuICAgIGNvbnN0IHByb3ZpZGVyID0gcHJvY2Vzcy5lbnYuTExNX1BST1ZJREVSIHx8ICdvcGVuYWknO1xyXG4gICAgXHJcbiAgICBzd2l0Y2ggKHByb3ZpZGVyKSB7XHJcbiAgICAgIGNhc2UgJ29wZW5haSc6XHJcbiAgICAgICAgcmV0dXJuIHtcclxuICAgICAgICAgIHByb3ZpZGVyOiAnb3BlbmFpJyxcclxuICAgICAgICAgIGFwaUtleTogcHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVkgfHwgJycsXHJcbiAgICAgICAgICBtb2RlbDogcHJvY2Vzcy5lbnYuTExNX01PREVMIHx8ICdncHQtNG8tbWluaScsXHJcbiAgICAgICAgfTtcclxuICAgICAgY2FzZSAnZGVlcHNlZWsnOlxyXG4gICAgICAgIHJldHVybiB7XHJcbiAgICAgICAgICBwcm92aWRlcjogJ2RlZXBzZWVrJyxcclxuICAgICAgICAgIGFwaUtleTogcHJvY2Vzcy5lbnYuREVFUFNFRUtfQVBJX0tFWSB8fCAnJyxcclxuICAgICAgICAgIGJhc2VVUkw6ICdodHRwczovL2FwaS5kZWVwc2Vlay5jb20nLFxyXG4gICAgICAgICAgbW9kZWw6IHByb2Nlc3MuZW52LkxMTV9NT0RFTCB8fCAnZGVlcHNlZWstY2hhdCcsXHJcbiAgICAgICAgfTtcclxuICAgICAgZGVmYXVsdDpcclxuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gcHJvdmlkZXI6ICR7cHJvdmlkZXJ9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIGNyZWF0ZVByb3ZpZGVyKGNvbmZpZzogTExNUHJvdmlkZXJDb25maWcpOiBMTE1Qcm92aWRlciB7XHJcbiAgICBzd2l0Y2ggKGNvbmZpZy5wcm92aWRlcikge1xyXG4gICAgICBjYXNlICdvcGVuYWknOlxyXG4gICAgICBjYXNlICdkZWVwc2Vlayc6XHJcbiAgICAgICAgcmV0dXJuIG5ldyBPcGVuQUlQcm92aWRlcihjb25maWcpO1xyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwcm92aWRlcjogJHtjb25maWcucHJvdmlkZXJ9YCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb21wbGV0ZShwcm9tcHQ6IHN0cmluZywgY29uZmlnPzogUGFydGlhbDxMTE1Db25maWc+KTogUHJvbWlzZTxzdHJpbmc+IHtcclxuICAgIGNvbnN0IGZpbmFsQ29uZmlnID0geyAuLi50aGlzLmRlZmF1bHRDb25maWcsIC4uLmNvbmZpZyB9O1xyXG4gICAgcmV0dXJuIHRoaXMucHJvdmlkZXIuY29tcGxldGUocHJvbXB0LCBmaW5hbENvbmZpZyk7XHJcbiAgfVxyXG5cclxuICBhc3luYyBjb21wbGV0ZUpTT048VD4ocHJvbXB0OiBzdHJpbmcsIGNvbmZpZz86IFBhcnRpYWw8TExNQ29uZmlnPik6IFByb21pc2U8VD4ge1xyXG4gICAgY29uc3QganNvblByb21wdCA9IGAke3Byb21wdH1cXG5cXG5Zb3UgbXVzdCByZXNwb25kIHdpdGggdmFsaWQgSlNPTiBvbmx5LiBObyBtYXJrZG93biwgbm8gZXhwbGFuYXRpb25zLiBXcmFwIHlvdXIgSlNPTiByZXNwb25zZSBpbiB0cmlwbGUgYmFja3RpY2tzIGlmIG5lZWRlZC5gO1xyXG4gICAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCB0aGlzLmNvbXBsZXRlKGpzb25Qcm9tcHQsIHtcclxuICAgICAgLi4uY29uZmlnLFxyXG4gICAgICB0ZW1wZXJhdHVyZTogY29uZmlnPy50ZW1wZXJhdHVyZSA/PyAwLjMsXHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgLy8gVHJ5IHRvIGV4dHJhY3QgSlNPTiBmcm9tIG1hcmtkb3duIGNvZGUgYmxvY2tzIGlmIHByZXNlbnRcclxuICAgIGxldCBqc29uVGV4dCA9IHJlc3BvbnNlLnRyaW0oKTtcclxuICAgIGNvbnN0IGNvZGVCbG9ja01hdGNoID0ganNvblRleHQubWF0Y2goL2BgYCg/Ompzb24pP1xccyooW1xcc1xcU10qPylgYGAvKTtcclxuICAgIGlmIChjb2RlQmxvY2tNYXRjaCkge1xyXG4gICAgICBqc29uVGV4dCA9IGNvZGVCbG9ja01hdGNoWzFdLnRyaW0oKTtcclxuICAgIH1cclxuICAgIFxyXG4gICAgdHJ5IHtcclxuICAgICAgcmV0dXJuIEpTT04ucGFyc2UoanNvblRleHQpIGFzIFQ7XHJcbiAgICB9IGNhdGNoIChlcnJvcikge1xyXG4gICAgICB0aHJvdyBuZXcgRXJyb3IoYEZhaWxlZCB0byBwYXJzZSBKU09OIHJlc3BvbnNlOiAke2pzb25UZXh0LnN1YnN0cmluZygwLCAyMDApfWApO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG5cclxubGV0IF9sbG06IExMTUNsaWVudCB8IG51bGwgPSBudWxsO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGdldExMTSgpOiBMTE1DbGllbnQge1xyXG4gIGlmICghX2xsbSkge1xyXG4gICAgX2xsbSA9IG5ldyBMTE1DbGllbnQoKTtcclxuICB9XHJcbiAgcmV0dXJuIF9sbG07XHJcbn1cclxuIl19
@@ -0,0 +1,20 @@
1
+ import type { StoryBible } from '../types/index.js';
2
+ export interface CanonFact {
3
+ id: string;
4
+ category: 'character' | 'world' | 'plot' | 'timeline';
5
+ subject: string;
6
+ attribute: string;
7
+ value: string;
8
+ chapterEstablished: number;
9
+ }
10
+ export interface CanonStore {
11
+ storyId: string;
12
+ facts: CanonFact[];
13
+ }
14
+ export declare function createCanonStore(storyId: string): CanonStore;
15
+ export declare function extractCanonFromBible(bible: StoryBible): CanonStore;
16
+ export declare function addFact(store: CanonStore, fact: Omit<CanonFact, 'id'>): CanonStore;
17
+ export declare function getFactsByCategory(store: CanonStore, category: CanonFact['category']): CanonFact[];
18
+ export declare function getFact(store: CanonStore, subject: string, attribute: string): CanonFact | undefined;
19
+ export declare function updateFact(store: CanonStore, subject: string, attribute: string, value: string, chapter: number): CanonStore;
20
+ export declare function formatCanonForPrompt(store: CanonStore): string;