@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,200 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const fs_1 = require("fs");
|
|
4
|
+
const path_1 = require("path");
|
|
5
|
+
const os_1 = require("os");
|
|
6
|
+
// Load config BEFORE importing engine (to initialize LLM correctly)
|
|
7
|
+
const configPath = (0, path_1.join)((0, os_1.homedir)(), '.narrative-os', 'config.json');
|
|
8
|
+
if ((0, fs_1.existsSync)(configPath)) {
|
|
9
|
+
const config = JSON.parse((0, fs_1.readFileSync)(configPath, 'utf-8'));
|
|
10
|
+
process.env.LLM_PROVIDER = config.provider;
|
|
11
|
+
// Use deepseek-chat (reasoner may not be available for all API keys)
|
|
12
|
+
process.env.LLM_MODEL = 'deepseek-chat';
|
|
13
|
+
if (config.provider === 'openai') {
|
|
14
|
+
process.env.OPENAI_API_KEY = config.apiKey;
|
|
15
|
+
}
|
|
16
|
+
else if (config.provider === 'deepseek') {
|
|
17
|
+
process.env.DEEPSEEK_API_KEY = config.apiKey;
|
|
18
|
+
}
|
|
19
|
+
console.log(`Loaded config: ${config.provider} / ${config.model}`);
|
|
20
|
+
}
|
|
21
|
+
const index_js_1 = require("../index.js");
|
|
22
|
+
console.log('Testing Memory + Graph Updates Pipeline (Phase 10)...\n');
|
|
23
|
+
// Setup test data
|
|
24
|
+
const bible = (0, index_js_1.createStoryBible)('侦探故事', '真相与正义', 'mystery', '1920年代上海', '悬疑紧张', '侦探调查连环杀人案,揭开真相', 10);
|
|
25
|
+
let structuredState = (0, index_js_1.createStructuredState)('test-story');
|
|
26
|
+
structuredState = (0, index_js_1.initializeCharactersFromBible)(structuredState, (0, index_js_1.addCharacter)((0, index_js_1.addCharacter)(bible, '陈侦探', 'protagonist', ['聪明', '冷静', '执着'], ['找出凶手', '维护正义']), '凶手', 'antagonist', ['狡猾', '残忍', '伪装'], ['逃避追捕', '继续犯罪']));
|
|
27
|
+
// Set up character states
|
|
28
|
+
structuredState.characters['陈侦探'].emotionalState = '专注';
|
|
29
|
+
structuredState.characters['陈侦探'].location = '上海滩';
|
|
30
|
+
structuredState.characters['陈侦探'].knowledge = ['凶手使用特殊刀具'];
|
|
31
|
+
structuredState.characters['凶手'].emotionalState = '警惕';
|
|
32
|
+
structuredState.characters['凶手'].location = '法租界';
|
|
33
|
+
// Set up plot threads
|
|
34
|
+
structuredState.plotThreads['main-mystery'] = {
|
|
35
|
+
id: 'main-mystery',
|
|
36
|
+
name: '连环杀人案调查',
|
|
37
|
+
status: 'active',
|
|
38
|
+
tension: 0.6,
|
|
39
|
+
summary: '陈侦探正在调查连环杀人案',
|
|
40
|
+
lastChapter: 1,
|
|
41
|
+
involvedCharacters: ['陈侦探'],
|
|
42
|
+
};
|
|
43
|
+
// Test 1: Initialize pipeline components
|
|
44
|
+
console.log('Test 1: Initialize Pipeline Components');
|
|
45
|
+
const constraintGraph = (0, index_js_1.createConstraintGraph)();
|
|
46
|
+
constraintGraph.addLocation('上海滩', '繁华码头区', 1);
|
|
47
|
+
constraintGraph.addLocation('法租界', '外国人居住区', 1);
|
|
48
|
+
constraintGraph.addCharacter(structuredState.characters['陈侦探'], 1);
|
|
49
|
+
constraintGraph.addCharacter(structuredState.characters['凶手'], 1);
|
|
50
|
+
const vectorStore = new index_js_1.VectorStore('test-story');
|
|
51
|
+
const canon = (0, index_js_1.createCanonStore)('test-story');
|
|
52
|
+
console.log(` Constraint graph: ${constraintGraph.getStats().nodes} nodes`);
|
|
53
|
+
console.log(` Vector store: ready`);
|
|
54
|
+
console.log(` Canon store: ready`);
|
|
55
|
+
console.log('✅ Pipeline components initialized');
|
|
56
|
+
// Test 2: Create test chapter
|
|
57
|
+
console.log('\nTest 2: Create Test Chapter');
|
|
58
|
+
const testChapter = {
|
|
59
|
+
id: 'ch-2',
|
|
60
|
+
storyId: 'test-story',
|
|
61
|
+
number: 2,
|
|
62
|
+
title: '法租界追踪',
|
|
63
|
+
content: '陈侦探在法租界发现了凶手的踪迹。他跟踪凶手来到一条小巷,发现了关键证据。陈侦探感到兴奋,因为他离真相更近了一步。',
|
|
64
|
+
wordCount: 800,
|
|
65
|
+
summary: '陈侦探在法租界追踪凶手并发现关键证据',
|
|
66
|
+
generatedAt: new Date(),
|
|
67
|
+
};
|
|
68
|
+
console.log(` Chapter ${testChapter.number}: ${testChapter.title}`);
|
|
69
|
+
console.log('✅ Test chapter created');
|
|
70
|
+
// Test 3-5: Run async tests
|
|
71
|
+
async function runAsyncTests() {
|
|
72
|
+
await vectorStore.initialize();
|
|
73
|
+
console.log(' Vector store initialized');
|
|
74
|
+
// Test 3: Quick update (no LLM)
|
|
75
|
+
console.log('\nTest 3: Quick Update (No LLM)');
|
|
76
|
+
const pipeline = new index_js_1.StateUpdaterPipeline();
|
|
77
|
+
const quickResult = await pipeline.quickUpdate({
|
|
78
|
+
chapter: testChapter,
|
|
79
|
+
bible,
|
|
80
|
+
currentState: structuredState,
|
|
81
|
+
canon,
|
|
82
|
+
vectorStore,
|
|
83
|
+
constraintGraph,
|
|
84
|
+
});
|
|
85
|
+
console.log(` Memories added: ${quickResult.memoriesAdded}`);
|
|
86
|
+
console.log(` Graph updated: ${quickResult.graphUpdated}`);
|
|
87
|
+
console.log(` Changes: ${quickResult.changes.length}`);
|
|
88
|
+
for (const change of quickResult.changes) {
|
|
89
|
+
console.log(` - [${change.type}] ${change.description}`);
|
|
90
|
+
}
|
|
91
|
+
console.log('✅ Quick update complete');
|
|
92
|
+
// Test 4: Verify vector store updated
|
|
93
|
+
console.log('\nTest 4: Verify Vector Store Updated');
|
|
94
|
+
const allMemories = vectorStore.getAllMemories();
|
|
95
|
+
console.log(` Total memories: ${allMemories.length}`);
|
|
96
|
+
for (const mem of allMemories) {
|
|
97
|
+
console.log(` - [${mem.category}] ${mem.content.substring(0, 40)}...`);
|
|
98
|
+
}
|
|
99
|
+
console.log('✅ Vector store verified');
|
|
100
|
+
// Test 5: Verify constraint graph updated
|
|
101
|
+
console.log('\nTest 5: Verify Constraint Graph Updated');
|
|
102
|
+
const graphStats = constraintGraph.getStats();
|
|
103
|
+
console.log(` Nodes: ${graphStats.nodes} (including events)`);
|
|
104
|
+
console.log(` Edges: ${graphStats.edges}`);
|
|
105
|
+
const eventNodes = Array.from(constraintGraph.nodes.values())
|
|
106
|
+
.filter((n) => n.type === 'event');
|
|
107
|
+
console.log(` Events: ${eventNodes.length}`);
|
|
108
|
+
console.log('✅ Constraint graph verified');
|
|
109
|
+
return { pipeline, quickResult };
|
|
110
|
+
}
|
|
111
|
+
// Run async tests
|
|
112
|
+
runAsyncTests().then(async ({ pipeline, quickResult }) => {
|
|
113
|
+
// Test 6: Verify structured state updated
|
|
114
|
+
console.log('\nTest 6: Verify Structured State Updated');
|
|
115
|
+
console.log(` Chapter updated to: ${quickResult.structuredState.chapter}`);
|
|
116
|
+
console.log(` Recent events: ${quickResult.structuredState.recentEvents.length}`);
|
|
117
|
+
for (const event of quickResult.structuredState.recentEvents) {
|
|
118
|
+
console.log(` - ${event.substring(0, 40)}...`);
|
|
119
|
+
}
|
|
120
|
+
console.log('✅ Structured state verified');
|
|
121
|
+
// Test 7: Format result
|
|
122
|
+
console.log('\nTest 7: Format Update Result');
|
|
123
|
+
const formatted = pipeline.formatResult(quickResult);
|
|
124
|
+
console.log('--- Formatted Result ---');
|
|
125
|
+
console.log(formatted);
|
|
126
|
+
console.log('✅ Result formatted');
|
|
127
|
+
// Test 8: Full update with LLM
|
|
128
|
+
console.log('\nTest 8: Full Update with LLM');
|
|
129
|
+
try {
|
|
130
|
+
const llmResult = await pipeline.update({
|
|
131
|
+
chapter: testChapter,
|
|
132
|
+
bible,
|
|
133
|
+
currentState: structuredState,
|
|
134
|
+
canon,
|
|
135
|
+
vectorStore,
|
|
136
|
+
constraintGraph,
|
|
137
|
+
});
|
|
138
|
+
console.log(` LLM Memories added: ${llmResult.memoriesAdded}`);
|
|
139
|
+
console.log(` LLM Canon facts: ${llmResult.canonFactsAdded}`);
|
|
140
|
+
console.log(` LLM Changes: ${llmResult.changes.length}`);
|
|
141
|
+
for (const change of llmResult.changes.slice(0, 5)) {
|
|
142
|
+
console.log(` - [${change.type}] ${change.description.substring(0, 50)}...`);
|
|
143
|
+
}
|
|
144
|
+
console.log('✅ LLM update complete');
|
|
145
|
+
}
|
|
146
|
+
catch (error) {
|
|
147
|
+
console.log(' ⚠️ LLM update skipped (API unavailable)');
|
|
148
|
+
}
|
|
149
|
+
// Test 9: Multiple chapters simulation
|
|
150
|
+
console.log('\nTest 9: Multiple Chapters Simulation');
|
|
151
|
+
const chapters = [
|
|
152
|
+
{
|
|
153
|
+
id: 'ch-3',
|
|
154
|
+
storyId: 'test-story',
|
|
155
|
+
number: 3,
|
|
156
|
+
title: '证据分析',
|
|
157
|
+
content: '陈侦探回到办公室分析证据。',
|
|
158
|
+
wordCount: 600,
|
|
159
|
+
summary: '陈侦探分析收集到的证据',
|
|
160
|
+
generatedAt: new Date(),
|
|
161
|
+
},
|
|
162
|
+
{
|
|
163
|
+
id: 'ch-4',
|
|
164
|
+
storyId: 'test-story',
|
|
165
|
+
number: 4,
|
|
166
|
+
title: '真相大白',
|
|
167
|
+
content: '陈侦探终于揭开了凶手的真面目。',
|
|
168
|
+
wordCount: 900,
|
|
169
|
+
summary: '陈侦探揭开真相',
|
|
170
|
+
generatedAt: new Date(),
|
|
171
|
+
},
|
|
172
|
+
];
|
|
173
|
+
let currentState = structuredState;
|
|
174
|
+
for (const chapter of chapters) {
|
|
175
|
+
const result = await pipeline.quickUpdate({
|
|
176
|
+
chapter,
|
|
177
|
+
bible,
|
|
178
|
+
currentState,
|
|
179
|
+
canon,
|
|
180
|
+
vectorStore,
|
|
181
|
+
constraintGraph,
|
|
182
|
+
});
|
|
183
|
+
currentState = result.structuredState;
|
|
184
|
+
console.log(` Ch ${chapter.number}: +${result.memoriesAdded} memories`);
|
|
185
|
+
}
|
|
186
|
+
console.log(` Total memories after 3 chapters: ${vectorStore.getAllMemories().length}`);
|
|
187
|
+
console.log('✅ Multi-chapter simulation complete');
|
|
188
|
+
// Test 10: Search memories
|
|
189
|
+
console.log('\nTest 10: Search Memories');
|
|
190
|
+
const searchResults = await vectorStore.searchSimilar('凶手', 3);
|
|
191
|
+
console.log(` Search '凶手': ${searchResults.length} results`);
|
|
192
|
+
for (const result of searchResults) {
|
|
193
|
+
console.log(` - ${result.memory.content.substring(0, 40)}... (score: ${result.score.toFixed(3)})`);
|
|
194
|
+
}
|
|
195
|
+
console.log('✅ Memory search working');
|
|
196
|
+
console.log('\n✅ All State Updater Pipeline tests passed!');
|
|
197
|
+
console.log('\n🎉 Phase 10 (Memory + Graph Updates) tests complete!');
|
|
198
|
+
console.log('\n🎊 ALL 10 PHASES COMPLETE! Narrative OS core is ready!');
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUtdXBkYXRlci50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3Qvc3RhdGUtdXBkYXRlci50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkJBQThDO0FBQzlDLCtCQUE0QjtBQUM1QiwyQkFBNkI7QUFFN0Isb0VBQW9FO0FBQ3BFLE1BQU0sVUFBVSxHQUFHLElBQUEsV0FBSSxFQUFDLElBQUEsWUFBTyxHQUFFLEVBQUUsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ25FLElBQUksSUFBQSxlQUFVLEVBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztJQUMzQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUEsaUJBQVksRUFBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM3RCxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQzNDLHFFQUFxRTtJQUNyRSxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUM7SUFDeEMsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDN0MsQ0FBQztTQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDL0MsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxRQUFRLE1BQU0sTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7QUFDckUsQ0FBQztBQUVELDBDQVVxQjtBQUVyQixPQUFPLENBQUMsR0FBRyxDQUFDLHlEQUF5RCxDQUFDLENBQUM7QUFFdkUsa0JB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LENBQUMsQ0FBQztJQUM5RCxLQUFLLE1BQU0sTUFBTSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ25DLE9BQU8sQ0FBQyxHQUFHLENBQUMsU0FBUyxNQUFNLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxlQUFlLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUN4RyxDQUFDO0lBQ0QsT0FBTyxDQUFDLEdBQUcsQ0FBQyx5QkFBeUIsQ0FBQyxDQUFDO0lBRXZDLE9BQU8sQ0FBQyxHQUFHLENBQUMsOENBQThDLENBQUMsQ0FBQztJQUM1RCxPQUFPLENBQUMsR0FBRyxDQUFDLHdEQUF3RCxDQUFDLENBQUM7SUFDdEUsT0FBTyxDQUFDLEdBQUcsQ0FBQywwREFBMEQsQ0FBQyxDQUFDO0FBQzFFLENBQUMsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgcmVhZEZpbGVTeW5jLCBleGlzdHNTeW5jIH0gZnJvbSAnZnMnO1xyXG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XHJcbmltcG9ydCB7IGhvbWVkaXIgfSBmcm9tICdvcyc7XHJcblxyXG4vLyBMb2FkIGNvbmZpZyBCRUZPUkUgaW1wb3J0aW5nIGVuZ2luZSAodG8gaW5pdGlhbGl6ZSBMTE0gY29ycmVjdGx5KVxyXG5jb25zdCBjb25maWdQYXRoID0gam9pbihob21lZGlyKCksICcubmFycmF0aXZlLW9zJywgJ2NvbmZpZy5qc29uJyk7XHJcbmlmIChleGlzdHNTeW5jKGNvbmZpZ1BhdGgpKSB7XHJcbiAgY29uc3QgY29uZmlnID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoY29uZmlnUGF0aCwgJ3V0Zi04JykpO1xyXG4gIHByb2Nlc3MuZW52LkxMTV9QUk9WSURFUiA9IGNvbmZpZy5wcm92aWRlcjtcclxuICAvLyBVc2UgZGVlcHNlZWstY2hhdCAocmVhc29uZXIgbWF5IG5vdCBiZSBhdmFpbGFibGUgZm9yIGFsbCBBUEkga2V5cylcclxuICBwcm9jZXNzLmVudi5MTE1fTU9ERUwgPSAnZGVlcHNlZWstY2hhdCc7XHJcbiAgaWYgKGNvbmZpZy5wcm92aWRlciA9PT0gJ29wZW5haScpIHtcclxuICAgIHByb2Nlc3MuZW52Lk9QRU5BSV9BUElfS0VZID0gY29uZmlnLmFwaUtleTtcclxuICB9IGVsc2UgaWYgKGNvbmZpZy5wcm92aWRlciA9PT0gJ2RlZXBzZWVrJykge1xyXG4gICAgcHJvY2Vzcy5lbnYuREVFUFNFRUtfQVBJX0tFWSA9IGNvbmZpZy5hcGlLZXk7XHJcbiAgfVxyXG4gIGNvbnNvbGUubG9nKGBMb2FkZWQgY29uZmlnOiAke2NvbmZpZy5wcm92aWRlcn0gLyAke2NvbmZpZy5tb2RlbH1gKTtcclxufVxyXG5cclxuaW1wb3J0IHtcclxuICBjcmVhdGVDb25zdHJhaW50R3JhcGgsXHJcbiAgVmVjdG9yU3RvcmUsXHJcbiAgY3JlYXRlQ2Fub25TdG9yZSxcclxuICBjcmVhdGVTdHJ1Y3R1cmVkU3RhdGUsXHJcbiAgaW5pdGlhbGl6ZUNoYXJhY3RlcnNGcm9tQmlibGUsXHJcbiAgY3JlYXRlU3RvcnlCaWJsZSxcclxuICBhZGRDaGFyYWN0ZXIsXHJcbiAgU3RhdGVVcGRhdGVyUGlwZWxpbmUsXHJcbiAgdHlwZSBDaGFwdGVyLFxyXG59IGZyb20gJy4uL2luZGV4LmpzJztcclxuXHJcbmNvbnNvbGUubG9nKCdUZXN0aW5nIE1lbW9yeSArIEdyYXBoIFVwZGF0ZXMgUGlwZWxpbmUgKFBoYXNlIDEwKS4uLlxcbicpO1xyXG5cclxuLy8gU2V0dXAgdGVzdCBkYXRhXHJcbmNvbnN0IGJpYmxlID0gY3JlYXRlU3RvcnlCaWJsZShcclxuICAn5L6m5o6i5pWF5LqLJyxcclxuICAn55yf55u45LiO5q2j5LmJJyxcclxuICAnbXlzdGVyeScsXHJcbiAgJzE5MjDlubTku6PkuIrmtbcnLFxyXG4gICfmgqznlpHntKflvKAnLFxyXG4gICfkvqbmjqLosIPmn6Xov57njq/mnYDkurrmoYjvvIzmj63lvIDnnJ/nm7gnLFxyXG4gIDEwXHJcbik7XHJcblxyXG5sZXQgc3RydWN0dXJlZFN0YXRlID0gY3JlYXRlU3RydWN0dXJlZFN0YXRlKCd0ZXN0LXN0b3J5Jyk7XHJcbnN0cnVjdHVyZWRTdGF0ZSA9IGluaXRpYWxpemVDaGFyYWN0ZXJzRnJvbUJpYmxlKFxyXG4gIHN0cnVjdHVyZWRTdGF0ZSxcclxuICBhZGRDaGFyYWN0ZXIoXHJcbiAgICBhZGRDaGFyYWN0ZXIoYmlibGUsICfpmYjkvqbmjqInLCAncHJvdGFnb25pc3QnLCBbJ+iBquaYjicsICflhrfpnZknLCAn5omn552AJ10sIFsn5om+5Ye65Ye25omLJywgJ+e7tOaKpOato+S5iSddKSxcclxuICAgICflh7bmiYsnLFxyXG4gICAgJ2FudGFnb25pc3QnLFxyXG4gICAgWyfni6HnjL4nLCAn5q6L5b+NJywgJ+S8quijhSddLFxyXG4gICAgWyfpgIPpgb/ov73mjZUnLCAn57un57ut54qv572qJ11cclxuICApXHJcbik7XHJcblxyXG4vLyBTZXQgdXAgY2hhcmFjdGVyIHN0YXRlc1xyXG5zdHJ1Y3R1cmVkU3RhdGUuY2hhcmFjdGVyc1sn6ZmI5L6m5o6iJ10uZW1vdGlvbmFsU3RhdGUgPSAn5LiT5rOoJztcclxuc3RydWN0dXJlZFN0YXRlLmNoYXJhY3RlcnNbJ+mZiOS+puaOoiddLmxvY2F0aW9uID0gJ+S4iua1t+a7qSc7XHJcbnN0cnVjdHVyZWRTdGF0ZS5jaGFyYWN0ZXJzWyfpmYjkvqbmjqInXS5rbm93bGVkZ2UgPSBbJ+WHtuaJi+S9v+eUqOeJueauiuWIgOWFtyddO1xyXG5cclxuc3RydWN0dXJlZFN0YXRlLmNoYXJhY3RlcnNbJ+WHtuaJiyddLmVtb3Rpb25hbFN0YXRlID0gJ+itpuaDlSc7XHJcbnN0cnVjdHVyZWRTdGF0ZS5jaGFyYWN0ZXJzWyflh7bmiYsnXS5sb2NhdGlvbiA9ICfms5Xnp5/nlYwnO1xyXG5cclxuLy8gU2V0IHVwIHBsb3QgdGhyZWFkc1xyXG5zdHJ1Y3R1cmVkU3RhdGUucGxvdFRocmVhZHNbJ21haW4tbXlzdGVyeSddID0ge1xyXG4gIGlkOiAnbWFpbi1teXN0ZXJ5JyxcclxuICBuYW1lOiAn6L+e546v5p2A5Lq65qGI6LCD5p+lJyxcclxuICBzdGF0dXM6ICdhY3RpdmUnLFxyXG4gIHRlbnNpb246IDAuNixcclxuICBzdW1tYXJ5OiAn6ZmI5L6m5o6i5q2j5Zyo6LCD5p+l6L+e546v5p2A5Lq65qGIJyxcclxuICBsYXN0Q2hhcHRlcjogMSxcclxuICBpbnZvbHZlZENoYXJhY3RlcnM6IFsn6ZmI5L6m5o6iJ10sXHJcbn07XHJcblxyXG4vLyBUZXN0IDE6IEluaXRpYWxpemUgcGlwZWxpbmUgY29tcG9uZW50c1xyXG5jb25zb2xlLmxvZygnVGVzdCAxOiBJbml0aWFsaXplIFBpcGVsaW5lIENvbXBvbmVudHMnKTtcclxuY29uc3QgY29uc3RyYWludEdyYXBoID0gY3JlYXRlQ29uc3RyYWludEdyYXBoKCk7XHJcbmNvbnN0cmFpbnRHcmFwaC5hZGRMb2NhdGlvbign5LiK5rW35rupJywgJ+e5geWNjueggeWktOWMuicsIDEpO1xyXG5jb25zdHJhaW50R3JhcGguYWRkTG9jYXRpb24oJ+azleenn+eVjCcsICflpJblm73kurrlsYXkvY/ljLonLCAxKTtcclxuY29uc3RyYWludEdyYXBoLmFkZENoYXJhY3RlcihzdHJ1Y3R1cmVkU3RhdGUuY2hhcmFjdGVyc1sn6ZmI5L6m5o6iJ10sIDEpO1xyXG5jb25zdHJhaW50R3JhcGguYWRkQ2hhcmFjdGVyKHN0cnVjdHVyZWRTdGF0ZS5jaGFyYWN0ZXJzWyflh7bmiYsnXSwgMSk7XHJcblxyXG5jb25zdCB2ZWN0b3JTdG9yZSA9IG5ldyBWZWN0b3JTdG9yZSgndGVzdC1zdG9yeScpO1xyXG5jb25zdCBjYW5vbiA9IGNyZWF0ZUNhbm9uU3RvcmUoJ3Rlc3Qtc3RvcnknKTtcclxuXHJcbmNvbnNvbGUubG9nKGAgIENvbnN0cmFpbnQgZ3JhcGg6ICR7Y29uc3RyYWludEdyYXBoLmdldFN0YXRzKCkubm9kZXN9IG5vZGVzYCk7XHJcbmNvbnNvbGUubG9nKGAgIFZlY3RvciBzdG9yZTogcmVhZHlgKTtcclxuY29uc29sZS5sb2coYCAgQ2Fub24gc3RvcmU6IHJlYWR5YCk7XHJcbmNvbnNvbGUubG9nKCfinIUgUGlwZWxpbmUgY29tcG9uZW50cyBpbml0aWFsaXplZCcpO1xyXG5cclxuLy8gVGVzdCAyOiBDcmVhdGUgdGVzdCBjaGFwdGVyXHJcbmNvbnNvbGUubG9nKCdcXG5UZXN0IDI6IENyZWF0ZSBUZXN0IENoYXB0ZXInKTtcclxuY29uc3QgdGVzdENoYXB0ZXI6IENoYXB0ZXIgPSB7XHJcbiAgaWQ6ICdjaC0yJyxcclxuICBzdG9yeUlkOiAndGVzdC1zdG9yeScsXHJcbiAgbnVtYmVyOiAyLFxyXG4gIHRpdGxlOiAn5rOV56ef55WM6L+96LiqJyxcclxuICBjb250ZW50OiAn6ZmI5L6m5o6i5Zyo5rOV56ef55WM5Y+R546w5LqG5Ye25omL55qE6Liq6L+544CC5LuW6Lef6Liq5Ye25omL5p2l5Yiw5LiA5p2h5bCP5be377yM5Y+R546w5LqG5YWz6ZSu6K+B5o2u44CC6ZmI5L6m5o6i5oSf5Yiw5YW05aWL77yM5Zug5Li65LuW56a755yf55u45pu06L+R5LqG5LiA5q2l44CCJyxcclxuICB3b3JkQ291bnQ6IDgwMCxcclxuICBzdW1tYXJ5OiAn6ZmI5L6m5o6i5Zyo5rOV56ef55WM6L+96Liq5Ye25omL5bm25Y+R546w5YWz6ZSu6K+B5o2uJyxcclxuICBnZW5lcmF0ZWRBdDogbmV3IERhdGUoKSxcclxufTtcclxuY29uc29sZS5sb2coYCAgQ2hhcHRlciAke3Rlc3RDaGFwdGVyLm51bWJlcn06ICR7dGVzdENoYXB0ZXIudGl0bGV9YCk7XHJcbmNvbnNvbGUubG9nKCfinIUgVGVzdCBjaGFwdGVyIGNyZWF0ZWQnKTtcclxuXHJcbi8vIFRlc3QgMy01OiBSdW4gYXN5bmMgdGVzdHNcclxuYXN5bmMgZnVuY3Rpb24gcnVuQXN5bmNUZXN0cygpIHtcclxuICBhd2FpdCB2ZWN0b3JTdG9yZS5pbml0aWFsaXplKCk7XHJcbiAgY29uc29sZS5sb2coJyAgVmVjdG9yIHN0b3JlIGluaXRpYWxpemVkJyk7XHJcbiAgXHJcbiAgLy8gVGVzdCAzOiBRdWljayB1cGRhdGUgKG5vIExMTSlcclxuICBjb25zb2xlLmxvZygnXFxuVGVzdCAzOiBRdWljayBVcGRhdGUgKE5vIExMTSknKTtcclxuICBjb25zdCBwaXBlbGluZSA9IG5ldyBTdGF0ZVVwZGF0ZXJQaXBlbGluZSgpO1xyXG4gIGNvbnN0IHF1aWNrUmVzdWx0ID0gYXdhaXQgcGlwZWxpbmUucXVpY2tVcGRhdGUoe1xyXG4gICAgY2hhcHRlcjogdGVzdENoYXB0ZXIsXHJcbiAgICBiaWJsZSxcclxuICAgIGN1cnJlbnRTdGF0ZTogc3RydWN0dXJlZFN0YXRlLFxyXG4gICAgY2Fub24sXHJcbiAgICB2ZWN0b3JTdG9yZSxcclxuICAgIGNvbnN0cmFpbnRHcmFwaCxcclxuICB9KTtcclxuICBcclxuICBjb25zb2xlLmxvZyhgICBNZW1vcmllcyBhZGRlZDogJHtxdWlja1Jlc3VsdC5tZW1vcmllc0FkZGVkfWApO1xyXG4gIGNvbnNvbGUubG9nKGAgIEdyYXBoIHVwZGF0ZWQ6ICR7cXVpY2tSZXN1bHQuZ3JhcGhVcGRhdGVkfWApO1xyXG4gIGNvbnNvbGUubG9nKGAgIENoYW5nZXM6ICR7cXVpY2tSZXN1bHQuY2hhbmdlcy5sZW5ndGh9YCk7XHJcbiAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgcXVpY2tSZXN1bHQuY2hhbmdlcykge1xyXG4gICAgY29uc29sZS5sb2coYCAgICAtIFske2NoYW5nZS50eXBlfV0gJHtjaGFuZ2UuZGVzY3JpcHRpb259YCk7XHJcbiAgfVxyXG4gIGNvbnNvbGUubG9nKCfinIUgUXVpY2sgdXBkYXRlIGNvbXBsZXRlJyk7XHJcbiAgXHJcbiAgLy8gVGVzdCA0OiBWZXJpZnkgdmVjdG9yIHN0b3JlIHVwZGF0ZWRcclxuICBjb25zb2xlLmxvZygnXFxuVGVzdCA0OiBWZXJpZnkgVmVjdG9yIFN0b3JlIFVwZGF0ZWQnKTtcclxuICBjb25zdCBhbGxNZW1vcmllcyA9IHZlY3RvclN0b3JlLmdldEFsbE1lbW9yaWVzKCk7XHJcbiAgY29uc29sZS5sb2coYCAgVG90YWwgbWVtb3JpZXM6ICR7YWxsTWVtb3JpZXMubGVuZ3RofWApO1xyXG4gIGZvciAoY29uc3QgbWVtIG9mIGFsbE1lbW9yaWVzKSB7XHJcbiAgICBjb25zb2xlLmxvZyhgICAgIC0gWyR7bWVtLmNhdGVnb3J5fV0gJHttZW0uY29udGVudC5zdWJzdHJpbmcoMCwgNDApfS4uLmApO1xyXG4gIH1cclxuICBjb25zb2xlLmxvZygn4pyFIFZlY3RvciBzdG9yZSB2ZXJpZmllZCcpO1xyXG4gIFxyXG4gIC8vIFRlc3QgNTogVmVyaWZ5IGNvbnN0cmFpbnQgZ3JhcGggdXBkYXRlZFxyXG4gIGNvbnNvbGUubG9nKCdcXG5UZXN0IDU6IFZlcmlmeSBDb25zdHJhaW50IEdyYXBoIFVwZGF0ZWQnKTtcclxuICBjb25zdCBncmFwaFN0YXRzID0gY29uc3RyYWludEdyYXBoLmdldFN0YXRzKCk7XHJcbiAgY29uc29sZS5sb2coYCAgTm9kZXM6ICR7Z3JhcGhTdGF0cy5ub2Rlc30gKGluY2x1ZGluZyBldmVudHMpYCk7XHJcbiAgY29uc29sZS5sb2coYCAgRWRnZXM6ICR7Z3JhcGhTdGF0cy5lZGdlc31gKTtcclxuICBjb25zdCBldmVudE5vZGVzID0gQXJyYXkuZnJvbSgoY29uc3RyYWludEdyYXBoIGFzIGFueSkubm9kZXMudmFsdWVzKCkpXHJcbiAgICAuZmlsdGVyKChuOiBhbnkpID0+IG4udHlwZSA9PT0gJ2V2ZW50Jyk7XHJcbiAgY29uc29sZS5sb2coYCAgRXZlbnRzOiAke2V2ZW50Tm9kZXMubGVuZ3RofWApO1xyXG4gIGNvbnNvbGUubG9nKCfinIUgQ29uc3RyYWludCBncmFwaCB2ZXJpZmllZCcpO1xyXG4gIFxyXG4gIHJldHVybiB7IHBpcGVsaW5lLCBxdWlja1Jlc3VsdCB9O1xyXG59XHJcblxyXG4vLyBSdW4gYXN5bmMgdGVzdHNcclxucnVuQXN5bmNUZXN0cygpLnRoZW4oYXN5bmMgKHsgcGlwZWxpbmUsIHF1aWNrUmVzdWx0IH0pID0+IHtcclxuICAvLyBUZXN0IDY6IFZlcmlmeSBzdHJ1Y3R1cmVkIHN0YXRlIHVwZGF0ZWRcclxuICBjb25zb2xlLmxvZygnXFxuVGVzdCA2OiBWZXJpZnkgU3RydWN0dXJlZCBTdGF0ZSBVcGRhdGVkJyk7XHJcbiAgY29uc29sZS5sb2coYCAgQ2hhcHRlciB1cGRhdGVkIHRvOiAke3F1aWNrUmVzdWx0LnN0cnVjdHVyZWRTdGF0ZS5jaGFwdGVyfWApO1xyXG4gIGNvbnNvbGUubG9nKGAgIFJlY2VudCBldmVudHM6ICR7cXVpY2tSZXN1bHQuc3RydWN0dXJlZFN0YXRlLnJlY2VudEV2ZW50cy5sZW5ndGh9YCk7XHJcbiAgZm9yIChjb25zdCBldmVudCBvZiBxdWlja1Jlc3VsdC5zdHJ1Y3R1cmVkU3RhdGUucmVjZW50RXZlbnRzKSB7XHJcbiAgICBjb25zb2xlLmxvZyhgICAgIC0gJHtldmVudC5zdWJzdHJpbmcoMCwgNDApfS4uLmApO1xyXG4gIH1cclxuICBjb25zb2xlLmxvZygn4pyFIFN0cnVjdHVyZWQgc3RhdGUgdmVyaWZpZWQnKTtcclxuICBcclxuICAvLyBUZXN0IDc6IEZvcm1hdCByZXN1bHRcclxuICBjb25zb2xlLmxvZygnXFxuVGVzdCA3OiBGb3JtYXQgVXBkYXRlIFJlc3VsdCcpO1xyXG4gIGNvbnN0IGZvcm1hdHRlZCA9IHBpcGVsaW5lLmZvcm1hdFJlc3VsdChxdWlja1Jlc3VsdCk7XHJcbiAgY29uc29sZS5sb2coJy0tLSBGb3JtYXR0ZWQgUmVzdWx0IC0tLScpO1xyXG4gIGNvbnNvbGUubG9nKGZvcm1hdHRlZCk7XHJcbiAgY29uc29sZS5sb2coJ+KchSBSZXN1bHQgZm9ybWF0dGVkJyk7XHJcbiAgXHJcbiAgLy8gVGVzdCA4OiBGdWxsIHVwZGF0ZSB3aXRoIExMTVxyXG4gIGNvbnNvbGUubG9nKCdcXG5UZXN0IDg6IEZ1bGwgVXBkYXRlIHdpdGggTExNJyk7XHJcbiAgXHJcbiAgdHJ5IHtcclxuICAgIGNvbnN0IGxsbVJlc3VsdCA9IGF3YWl0IHBpcGVsaW5lLnVwZGF0ZSh7XHJcbiAgICAgIGNoYXB0ZXI6IHRlc3RDaGFwdGVyLFxyXG4gICAgICBiaWJsZSxcclxuICAgICAgY3VycmVudFN0YXRlOiBzdHJ1Y3R1cmVkU3RhdGUsXHJcbiAgICAgIGNhbm9uLFxyXG4gICAgICB2ZWN0b3JTdG9yZSxcclxuICAgICAgY29uc3RyYWludEdyYXBoLFxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIGNvbnNvbGUubG9nKGAgIExMTSBNZW1vcmllcyBhZGRlZDogJHtsbG1SZXN1bHQubWVtb3JpZXNBZGRlZH1gKTtcclxuICAgIGNvbnNvbGUubG9nKGAgIExMTSBDYW5vbiBmYWN0czogJHtsbG1SZXN1bHQuY2Fub25GYWN0c0FkZGVkfWApO1xyXG4gICAgY29uc29sZS5sb2coYCAgTExNIENoYW5nZXM6ICR7bGxtUmVzdWx0LmNoYW5nZXMubGVuZ3RofWApO1xyXG4gICAgZm9yIChjb25zdCBjaGFuZ2Ugb2YgbGxtUmVzdWx0LmNoYW5nZXMuc2xpY2UoMCwgNSkpIHtcclxuICAgICAgY29uc29sZS5sb2coYCAgICAtIFske2NoYW5nZS50eXBlfV0gJHtjaGFuZ2UuZGVzY3JpcHRpb24uc3Vic3RyaW5nKDAsIDUwKX0uLi5gKTtcclxuICAgIH1cclxuICAgIGNvbnNvbGUubG9nKCfinIUgTExNIHVwZGF0ZSBjb21wbGV0ZScpO1xyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICBjb25zb2xlLmxvZygnICDimqDvuI8gTExNIHVwZGF0ZSBza2lwcGVkIChBUEkgdW5hdmFpbGFibGUpJyk7XHJcbiAgfVxyXG4gIFxyXG4gIC8vIFRlc3QgOTogTXVsdGlwbGUgY2hhcHRlcnMgc2ltdWxhdGlvblxyXG4gIGNvbnNvbGUubG9nKCdcXG5UZXN0IDk6IE11bHRpcGxlIENoYXB0ZXJzIFNpbXVsYXRpb24nKTtcclxuICBjb25zdCBjaGFwdGVyczogQ2hhcHRlcltdID0gW1xyXG4gICAge1xyXG4gICAgICBpZDogJ2NoLTMnLFxyXG4gICAgICBzdG9yeUlkOiAndGVzdC1zdG9yeScsXHJcbiAgICAgIG51bWJlcjogMyxcclxuICAgICAgdGl0bGU6ICfor4Hmja7liIbmnpAnLFxyXG4gICAgICBjb250ZW50OiAn6ZmI5L6m5o6i5Zue5Yiw5Yqe5YWs5a6k5YiG5p6Q6K+B5o2u44CCJyxcclxuICAgICAgd29yZENvdW50OiA2MDAsXHJcbiAgICAgIHN1bW1hcnk6ICfpmYjkvqbmjqLliIbmnpDmlLbpm4bliLDnmoTor4Hmja4nLFxyXG4gICAgICBnZW5lcmF0ZWRBdDogbmV3IERhdGUoKSxcclxuICAgIH0sXHJcbiAgICB7XHJcbiAgICAgIGlkOiAnY2gtNCcsXHJcbiAgICAgIHN0b3J5SWQ6ICd0ZXN0LXN0b3J5JyxcclxuICAgICAgbnVtYmVyOiA0LFxyXG4gICAgICB0aXRsZTogJ+ecn+ebuOWkp+eZvScsXHJcbiAgICAgIGNvbnRlbnQ6ICfpmYjkvqbmjqLnu4jkuo7mj63lvIDkuoblh7bmiYvnmoTnnJ/pnaLnm67jgIInLFxyXG4gICAgICB3b3JkQ291bnQ6IDkwMCxcclxuICAgICAgc3VtbWFyeTogJ+mZiOS+puaOouaPreW8gOecn+ebuCcsXHJcbiAgICAgIGdlbmVyYXRlZEF0OiBuZXcgRGF0ZSgpLFxyXG4gICAgfSxcclxuICBdO1xyXG4gIFxyXG4gIGxldCBjdXJyZW50U3RhdGUgPSBzdHJ1Y3R1cmVkU3RhdGU7XHJcbiAgZm9yIChjb25zdCBjaGFwdGVyIG9mIGNoYXB0ZXJzKSB7XHJcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwaXBlbGluZS5xdWlja1VwZGF0ZSh7XHJcbiAgICAgIGNoYXB0ZXIsXHJcbiAgICAgIGJpYmxlLFxyXG4gICAgICBjdXJyZW50U3RhdGUsXHJcbiAgICAgIGNhbm9uLFxyXG4gICAgICB2ZWN0b3JTdG9yZSxcclxuICAgICAgY29uc3RyYWludEdyYXBoLFxyXG4gICAgfSk7XHJcbiAgICBjdXJyZW50U3RhdGUgPSByZXN1bHQuc3RydWN0dXJlZFN0YXRlO1xyXG4gICAgY29uc29sZS5sb2coYCAgQ2ggJHtjaGFwdGVyLm51bWJlcn06ICske3Jlc3VsdC5tZW1vcmllc0FkZGVkfSBtZW1vcmllc2ApO1xyXG4gIH1cclxuICBcclxuICBjb25zb2xlLmxvZyhgICBUb3RhbCBtZW1vcmllcyBhZnRlciAzIGNoYXB0ZXJzOiAke3ZlY3RvclN0b3JlLmdldEFsbE1lbW9yaWVzKCkubGVuZ3RofWApO1xyXG4gIGNvbnNvbGUubG9nKCfinIUgTXVsdGktY2hhcHRlciBzaW11bGF0aW9uIGNvbXBsZXRlJyk7XHJcbiAgXHJcbiAgLy8gVGVzdCAxMDogU2VhcmNoIG1lbW9yaWVzXHJcbiAgY29uc29sZS5sb2coJ1xcblRlc3QgMTA6IFNlYXJjaCBNZW1vcmllcycpO1xyXG4gIGNvbnN0IHNlYXJjaFJlc3VsdHMgPSBhd2FpdCB2ZWN0b3JTdG9yZS5zZWFyY2hTaW1pbGFyKCflh7bmiYsnLCAzKTtcclxuICBjb25zb2xlLmxvZyhgICBTZWFyY2ggJ+WHtuaJiyc6ICR7c2VhcmNoUmVzdWx0cy5sZW5ndGh9IHJlc3VsdHNgKTtcclxuICBmb3IgKGNvbnN0IHJlc3VsdCBvZiBzZWFyY2hSZXN1bHRzKSB7XHJcbiAgICBjb25zb2xlLmxvZyhgICAgIC0gJHtyZXN1bHQubWVtb3J5LmNvbnRlbnQuc3Vic3RyaW5nKDAsIDQwKX0uLi4gKHNjb3JlOiAke3Jlc3VsdC5zY29yZS50b0ZpeGVkKDMpfSlgKTtcclxuICB9XHJcbiAgY29uc29sZS5sb2coJ+KchSBNZW1vcnkgc2VhcmNoIHdvcmtpbmcnKTtcclxuICBcclxuICBjb25zb2xlLmxvZygnXFxu4pyFIEFsbCBTdGF0ZSBVcGRhdGVyIFBpcGVsaW5lIHRlc3RzIHBhc3NlZCEnKTtcclxuICBjb25zb2xlLmxvZygnXFxu8J+OiSBQaGFzZSAxMCAoTWVtb3J5ICsgR3JhcGggVXBkYXRlcykgdGVzdHMgY29tcGxldGUhJyk7XHJcbiAgY29uc29sZS5sb2coJ1xcbvCfjoogQUxMIDEwIFBIQVNFUyBDT01QTEVURSEgTmFycmF0aXZlIE9TIGNvcmUgaXMgcmVhZHkhJyk7XHJcbn0pO1xyXG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const fs_1 = require("fs");
|
|
4
|
+
const path_1 = require("path");
|
|
5
|
+
const os_1 = require("os");
|
|
6
|
+
// Load config BEFORE importing engine
|
|
7
|
+
const configPath = (0, path_1.join)((0, os_1.homedir)(), '.narrative-os', 'config.json');
|
|
8
|
+
if ((0, fs_1.existsSync)(configPath)) {
|
|
9
|
+
const config = JSON.parse((0, fs_1.readFileSync)(configPath, 'utf-8'));
|
|
10
|
+
process.env.LLM_PROVIDER = config.provider;
|
|
11
|
+
process.env.LLM_MODEL = 'deepseek-chat';
|
|
12
|
+
if (config.provider === 'openai') {
|
|
13
|
+
process.env.OPENAI_API_KEY = config.apiKey;
|
|
14
|
+
}
|
|
15
|
+
else if (config.provider === 'deepseek') {
|
|
16
|
+
process.env.DEEPSEEK_API_KEY = config.apiKey;
|
|
17
|
+
}
|
|
18
|
+
console.log(`Loaded config: ${config.provider} / deepseek-chat`);
|
|
19
|
+
}
|
|
20
|
+
const index_js_1 = require("../index.js");
|
|
21
|
+
console.log('Testing Story Director Agent (Phase 6)...\n');
|
|
22
|
+
// Setup test story
|
|
23
|
+
let bible = (0, index_js_1.createStoryBible)('李白传奇', '诗人寻找人生真谛', 'historical-fiction', '唐朝长安及各地', '豪放浪漫', '诗人李白离开长安,游历天下,寻找人生真谛', 10);
|
|
24
|
+
bible = (0, index_js_1.addCharacter)(bible, '李白', 'protagonist', ['豪放', '浪漫', '不羁'], ['寻找人生真谛', '成为伟大诗人']);
|
|
25
|
+
bible = (0, index_js_1.addCharacter)(bible, '杜甫', 'supporting', ['沉郁', '忧国忧民'], ['记录时代变迁']);
|
|
26
|
+
bible = (0, index_js_1.addCharacter)(bible, '孟浩然', 'supporting', ['隐逸', '淡泊'], ['归隐山林']);
|
|
27
|
+
bible = (0, index_js_1.addPlotThread)(bible, '诗人之旅', '李白从长安出发,游历天下');
|
|
28
|
+
bible = (0, index_js_1.addPlotThread)(bible, '宫廷召唤', '唐玄宗召李白入宫的阴谋');
|
|
29
|
+
bible = (0, index_js_1.addPlotThread)(bible, '友情之路', '李白与杜甫、孟浩然的交往');
|
|
30
|
+
const storyState = (0, index_js_1.createStoryState)('test-story', 10);
|
|
31
|
+
storyState.currentChapter = 3;
|
|
32
|
+
let structuredState = (0, index_js_1.createStructuredState)('test-story');
|
|
33
|
+
structuredState = (0, index_js_1.initializeCharactersFromBible)(structuredState, bible);
|
|
34
|
+
structuredState = (0, index_js_1.initializePlotThreadsFromBible)(structuredState, bible);
|
|
35
|
+
// Activate some plot threads
|
|
36
|
+
const threadIds = Object.keys(structuredState.plotThreads);
|
|
37
|
+
if (threadIds[0]) {
|
|
38
|
+
structuredState = (0, index_js_1.updatePlotThread)(structuredState, threadIds[0], { status: 'active', tension: 0.6 }, 3);
|
|
39
|
+
}
|
|
40
|
+
if (threadIds[1]) {
|
|
41
|
+
structuredState = (0, index_js_1.updatePlotThread)(structuredState, threadIds[1], { status: 'escalating', tension: 0.4 }, 3);
|
|
42
|
+
}
|
|
43
|
+
// Add recent events
|
|
44
|
+
structuredState = (0, index_js_1.addRecentEvent)(structuredState, '李白告别长安');
|
|
45
|
+
structuredState = (0, index_js_1.addRecentEvent)(structuredState, '夜宿黄鹤楼');
|
|
46
|
+
structuredState = (0, index_js_1.addRecentEvent)(structuredState, '遇见孟浩然');
|
|
47
|
+
// Add questions
|
|
48
|
+
structuredState = (0, index_js_1.addUnresolvedQuestion)(structuredState, '李白会接受宫廷召唤吗?');
|
|
49
|
+
structuredState = (0, index_js_1.addUnresolvedQuestion)(structuredState, '杜甫何时与李白相遇?');
|
|
50
|
+
// Create tension guidance
|
|
51
|
+
const tensionAnalysis = (0, index_js_1.analyzeTension)(storyState, structuredState);
|
|
52
|
+
const tensionGuidance = (0, index_js_1.generateTensionGuidance)(tensionAnalysis, storyState);
|
|
53
|
+
// Create previous summaries
|
|
54
|
+
const previousSummaries = [
|
|
55
|
+
{
|
|
56
|
+
chapterNumber: 1,
|
|
57
|
+
summary: '李白离开长安,踏上诗人之旅',
|
|
58
|
+
keyEvents: ['告别长安', '独自上路'],
|
|
59
|
+
characterChanges: { '李白': '从迷茫到坚定' },
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
chapterNumber: 2,
|
|
63
|
+
summary: '李白夜宿黄鹤楼,思考人生',
|
|
64
|
+
keyEvents: ['夜宿黄鹤楼', '写诗抒怀'],
|
|
65
|
+
characterChanges: { '李白': '更加坚定诗人之路' },
|
|
66
|
+
},
|
|
67
|
+
{
|
|
68
|
+
chapterNumber: 3,
|
|
69
|
+
summary: '李白遇见孟浩然,结为知己',
|
|
70
|
+
keyEvents: ['遇见孟浩然', '饮酒论诗'],
|
|
71
|
+
characterChanges: { '李白': '找到知音', '孟浩然': '欣赏李白才华' },
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
// Test 1: Fallback objectives
|
|
75
|
+
console.log('Test 1: Fallback Objectives (No LLM)');
|
|
76
|
+
const fallbackOutput = index_js_1.storyDirector.generateFallbackObjectives(storyState, structuredState);
|
|
77
|
+
console.log(` Chapter: ${fallbackOutput.chapterNumber}`);
|
|
78
|
+
console.log(` Goal: ${fallbackOutput.overallGoal}`);
|
|
79
|
+
console.log(` Objectives: ${fallbackOutput.objectives.length}`);
|
|
80
|
+
console.log(` Focus: ${fallbackOutput.focusCharacters.join(', ')}`);
|
|
81
|
+
console.log('✅ Fallback objectives generated');
|
|
82
|
+
// Test 2: Format for prompt
|
|
83
|
+
console.log('\nTest 2: Format for Prompt');
|
|
84
|
+
const formatted = index_js_1.storyDirector.formatForPrompt(fallbackOutput);
|
|
85
|
+
console.log('--- Formatted Output ---');
|
|
86
|
+
console.log(formatted.substring(0, 600));
|
|
87
|
+
console.log('...');
|
|
88
|
+
console.log('✅ Formatted for writer prompt');
|
|
89
|
+
// Test 3: Director with LLM
|
|
90
|
+
console.log('\nTest 3: Story Director with LLM');
|
|
91
|
+
async function runDirectorTest() {
|
|
92
|
+
try {
|
|
93
|
+
const directorOutput = await index_js_1.storyDirector.direct({
|
|
94
|
+
bible,
|
|
95
|
+
state: storyState,
|
|
96
|
+
structuredState,
|
|
97
|
+
tensionGuidance,
|
|
98
|
+
previousSummaries,
|
|
99
|
+
});
|
|
100
|
+
console.log('✅ Director generated chapter plan');
|
|
101
|
+
console.log(` Chapter: ${directorOutput.chapterNumber}`);
|
|
102
|
+
console.log(` Goal: ${directorOutput.overallGoal}`);
|
|
103
|
+
console.log(` Tone: ${directorOutput.tone}`);
|
|
104
|
+
console.log(` Objectives: ${directorOutput.objectives.length}`);
|
|
105
|
+
for (const obj of directorOutput.objectives) {
|
|
106
|
+
const emoji = { critical: '🔴', high: '🟠', medium: '🟡', low: '🟢' }[obj.priority];
|
|
107
|
+
console.log(` ${emoji} [${obj.type}] ${obj.description}`);
|
|
108
|
+
}
|
|
109
|
+
console.log(` Focus Characters: ${directorOutput.focusCharacters.join(', ')}`);
|
|
110
|
+
console.log(` Suggested Scenes: ${directorOutput.suggestedScenes.length}`);
|
|
111
|
+
// Test 4: Format LLM output
|
|
112
|
+
console.log('\nTest 4: Format LLM Output for Prompt');
|
|
113
|
+
const llmFormatted = index_js_1.storyDirector.formatForPrompt(directorOutput);
|
|
114
|
+
console.log('--- Formatted LLM Output ---');
|
|
115
|
+
console.log(llmFormatted.substring(0, 800));
|
|
116
|
+
console.log('...');
|
|
117
|
+
console.log('✅ LLM output formatted');
|
|
118
|
+
}
|
|
119
|
+
catch (error) {
|
|
120
|
+
console.log('⚠️ Director LLM test failed:', error instanceof Error ? error.message : String(error));
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
runDirectorTest().then(() => {
|
|
124
|
+
// Test 5: Different story phases
|
|
125
|
+
console.log('\nTest 5: Different Story Phases');
|
|
126
|
+
// Early phase
|
|
127
|
+
storyState.currentChapter = 1;
|
|
128
|
+
const earlyFallback = index_js_1.storyDirector.generateFallbackObjectives(storyState, structuredState);
|
|
129
|
+
console.log(` Early (Ch 1): ${earlyFallback.objectives.length} objectives, tone: ${earlyFallback.tone}`);
|
|
130
|
+
// Middle phase
|
|
131
|
+
storyState.currentChapter = 5;
|
|
132
|
+
const middleFallback = index_js_1.storyDirector.generateFallbackObjectives(storyState, structuredState);
|
|
133
|
+
console.log(` Middle (Ch 5): ${middleFallback.objectives.length} objectives, tone: ${middleFallback.tone}`);
|
|
134
|
+
// Late phase
|
|
135
|
+
storyState.currentChapter = 9;
|
|
136
|
+
const lateFallback = index_js_1.storyDirector.generateFallbackObjectives(storyState, structuredState);
|
|
137
|
+
console.log(` Late (Ch 9): ${lateFallback.objectives.length} objectives, tone: ${lateFallback.tone}`);
|
|
138
|
+
console.log('✅ Objectives adapt to story phase');
|
|
139
|
+
console.log('\n✅ All Story Director tests passed!');
|
|
140
|
+
console.log('\n🎉 Phase 6 (Story Director Agent) tests complete!');
|
|
141
|
+
});
|
|
142
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RvcnktZGlyZWN0b3IudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L3N0b3J5LWRpcmVjdG9yLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQkFBOEM7QUFDOUMsK0JBQTRCO0FBQzVCLDJCQUE2QjtBQUU3QixzQ0FBc0M7QUFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBQSxXQUFJLEVBQUMsSUFBQSxZQUFPLEdBQUUsRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDbkUsSUFBSSxJQUFBLGVBQVUsRUFBQyxVQUFVLENBQUMsRUFBRSxDQUFDO0lBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBQSxpQkFBWSxFQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzdELE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDO0lBQ3hDLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzdDLENBQUM7U0FBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixNQUFNLENBQUMsUUFBUSxrQkFBa0IsQ0FBQyxDQUFDO0FBQ25FLENBQUM7QUFFRCwwQ0FlcUI7QUFFckIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0FBRTNELG1CQUFtQjtBQUNuQixJQUFJLEtBQUssR0FBRyxJQUFB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QUFDLENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IHJlYWRGaWxlU3luYywgZXhpc3RzU3luYyB9IGZyb20gJ2ZzJztcclxuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xyXG5pbXBvcnQgeyBob21lZGlyIH0gZnJvbSAnb3MnO1xyXG5cclxuLy8gTG9hZCBjb25maWcgQkVGT1JFIGltcG9ydGluZyBlbmdpbmVcclxuY29uc3QgY29uZmlnUGF0aCA9IGpvaW4oaG9tZWRpcigpLCAnLm5hcnJhdGl2ZS1vcycsICdjb25maWcuanNvbicpO1xyXG5pZiAoZXhpc3RzU3luYyhjb25maWdQYXRoKSkge1xyXG4gIGNvbnN0IGNvbmZpZyA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKGNvbmZpZ1BhdGgsICd1dGYtOCcpKTtcclxuICBwcm9jZXNzLmVudi5MTE1fUFJPVklERVIgPSBjb25maWcucHJvdmlkZXI7XHJcbiAgcHJvY2Vzcy5lbnYuTExNX01PREVMID0gJ2RlZXBzZWVrLWNoYXQnO1xyXG4gIGlmIChjb25maWcucHJvdmlkZXIgPT09ICdvcGVuYWknKSB7XHJcbiAgICBwcm9jZXNzLmVudi5PUEVOQUlfQVBJX0tFWSA9IGNvbmZpZy5hcGlLZXk7XHJcbiAgfSBlbHNlIGlmIChjb25maWcucHJvdmlkZXIgPT09ICdkZWVwc2VlaycpIHtcclxuICAgIHByb2Nlc3MuZW52LkRFRVBTRUVLX0FQSV9LRVkgPSBjb25maWcuYXBpS2V5O1xyXG4gIH1cclxuICBjb25zb2xlLmxvZyhgTG9hZGVkIGNvbmZpZzogJHtjb25maWcucHJvdmlkZXJ9IC8gZGVlcHNlZWstY2hhdGApO1xyXG59XHJcblxyXG5pbXBvcnQge1xyXG4gIHN0b3J5RGlyZWN0b3IsXHJcbiAgY3JlYXRlU3RvcnlCaWJsZSxcclxuICBhZGRDaGFyYWN0ZXIsXHJcbiAgYWRkUGxvdFRocmVhZCxcclxuICBjcmVhdGVTdG9yeVN0YXRlLFxyXG4gIGNyZWF0ZVN0cnVjdHVyZWRTdGF0ZSxcclxuICBpbml0aWFsaXplQ2hhcmFjdGVyc0Zyb21CaWJsZSxcclxuICBpbml0aWFsaXplUGxvdFRocmVhZHNGcm9tQmlibGUsXHJcbiAgdXBkYXRlUGxvdFRocmVhZCxcclxuICBhZGRSZWNlbnRFdmVudCxcclxuICBhZGRVbnJlc29sdmVkUXVlc3Rpb24sXHJcbiAgZ2VuZXJhdGVUZW5zaW9uR3VpZGFuY2UsXHJcbiAgYW5hbHl6ZVRlbnNpb24sXHJcbiAgdHlwZSBDaGFwdGVyU3VtbWFyeSxcclxufSBmcm9tICcuLi9pbmRleC5qcyc7XHJcblxyXG5jb25zb2xlLmxvZygnVGVzdGluZyBTdG9yeSBEaXJlY3RvciBBZ2VudCAoUGhhc2UgNikuLi5cXG4nKTtcclxuXHJcbi8vIFNldHVwIHRlc3Qgc3RvcnlcclxubGV0IGJpYmxlID0gY3JlYXRlU3RvcnlCaWJsZShcclxuICAn5p2O55m95Lyg5aWHJyxcclxuICAn6K+X5Lq65a+75om+5Lq655Sf55yf6LCbJyxcclxuICAnaGlzdG9yaWNhbC1maWN0aW9uJyxcclxuICAn5ZSQ5pyd6ZW/5a6J5Y+K5ZCE5ZywJyxcclxuICAn6LGq5pS+5rWq5ryrJyxcclxuICAn6K+X5Lq65p2O55m956a75byA6ZW/5a6J77yM5ri45Y6G5aSp5LiL77yM5a+75om+5Lq655Sf55yf6LCbJyxcclxuICAxMFxyXG4pO1xyXG5cclxuYmlibGUgPSBhZGRDaGFyYWN0ZXIoYmlibGUsICfmnY7nmb0nLCAncHJvdGFnb25pc3QnLCBbJ+ixquaUvicsICfmtarmvKsnLCAn5LiN576BJ10sIFsn5a+75om+5Lq655Sf55yf6LCbJywgJ+aIkOS4uuS8n+Wkp+ivl+S6uiddKTtcclxuYmlibGUgPSBhZGRDaGFyYWN0ZXIoYmlibGUsICfmnZznlKsnLCAnc3VwcG9ydGluZycsIFsn5rKJ6YOBJywgJ+W/p+WbveW/p+awkSddLCBbJ+iusOW9leaXtuS7o+WPmOi/gSddKTtcclxuYmlibGUgPSBhZGRDaGFyYWN0ZXIoYmlibGUsICflrZ/mtannhLYnLCAnc3VwcG9ydGluZycsIFsn6ZqQ6YC4JywgJ+a3oeaziiddLCBbJ+W9kumakOWxseaelyddKTtcclxuXHJcbmJpYmxlID0gYWRkUGxvdFRocmVhZChiaWJsZSwgJ+ivl+S6uuS5i+aXhScsICfmnY7nmb3ku47plb/lronlh7rlj5HvvIzmuLjljoblpKnkuIsnKTtcclxuYmlibGUgPSBhZGRQbG90VGhyZWFkKGJpYmxlLCAn5a6r5bu35Y+s5ZSkJywgJ+WUkOeOhOWul+WPrOadjueZveWFpeWuq+eahOmYtOiwiycpO1xyXG5iaWJsZSA9IGFkZFBsb3RUaHJlYWQoYmlibGUsICflj4vmg4XkuYvot68nLCAn5p2O55m95LiO5p2c55Sr44CB5a2f5rWp54S255qE5Lqk5b6AJyk7XHJcblxyXG5jb25zdCBzdG9yeVN0YXRlID0gY3JlYXRlU3RvcnlTdGF0ZSgndGVzdC1zdG9yeScsIDEwKTtcclxuc3RvcnlTdGF0ZS5jdXJyZW50Q2hhcHRlciA9IDM7XHJcblxyXG5sZXQgc3RydWN0dXJlZFN0YXRlID0gY3JlYXRlU3RydWN0dXJlZFN0YXRlKCd0ZXN0LXN0b3J5Jyk7XHJcbnN0cnVjdHVyZWRTdGF0ZSA9IGluaXRpYWxpemVDaGFyYWN0ZXJzRnJvbUJpYmxlKHN0cnVjdHVyZWRTdGF0ZSwgYmlibGUpO1xyXG5zdHJ1Y3R1cmVkU3RhdGUgPSBpbml0aWFsaXplUGxvdFRocmVhZHNGcm9tQmlibGUoc3RydWN0dXJlZFN0YXRlLCBiaWJsZSk7XHJcblxyXG4vLyBBY3RpdmF0ZSBzb21lIHBsb3QgdGhyZWFkc1xyXG5jb25zdCB0aHJlYWRJZHMgPSBPYmplY3Qua2V5cyhzdHJ1Y3R1cmVkU3RhdGUucGxvdFRocmVhZHMpO1xyXG5pZiAodGhyZWFkSWRzWzBdKSB7XHJcbiAgc3RydWN0dXJlZFN0YXRlID0gdXBkYXRlUGxvdFRocmVhZChzdHJ1Y3R1cmVkU3RhdGUsIHRocmVhZElkc1swXSwgeyBzdGF0dXM6ICdhY3RpdmUnLCB0ZW5zaW9uOiAwLjYgfSwgMyk7XHJcbn1cclxuaWYgKHRocmVhZElkc1sxXSkge1xyXG4gIHN0cnVjdHVyZWRTdGF0ZSA9IHVwZGF0ZVBsb3RUaHJlYWQoc3RydWN0dXJlZFN0YXRlLCB0aHJlYWRJZHNbMV0sIHsgc3RhdHVzOiAnZXNjYWxhdGluZycsIHRlbnNpb246IDAuNCB9LCAzKTtcclxufVxyXG5cclxuLy8gQWRkIHJlY2VudCBldmVudHNcclxuc3RydWN0dXJlZFN0YXRlID0gYWRkUmVjZW50RXZlbnQoc3RydWN0dXJlZFN0YXRlLCAn5p2O55m95ZGK5Yir6ZW/5a6JJyk7XHJcbnN0cnVjdHVyZWRTdGF0ZSA9IGFkZFJlY2VudEV2ZW50KHN0cnVjdHVyZWRTdGF0ZSwgJ+WknOWuv+m7hOm5pOalvCcpO1xyXG5zdHJ1Y3R1cmVkU3RhdGUgPSBhZGRSZWNlbnRFdmVudChzdHJ1Y3R1cmVkU3RhdGUsICfpgYfop4HlrZ/mtannhLYnKTtcclxuXHJcbi8vIEFkZCBxdWVzdGlvbnNcclxuc3RydWN0dXJlZFN0YXRlID0gYWRkVW5yZXNvbHZlZFF1ZXN0aW9uKHN0cnVjdHVyZWRTdGF0ZSwgJ+adjueZveS8muaOpeWPl+Wuq+W7t+WPrOWUpOWQl++8nycpO1xyXG5zdHJ1Y3R1cmVkU3RhdGUgPSBhZGRVbnJlc29sdmVkUXVlc3Rpb24oc3RydWN0dXJlZFN0YXRlLCAn5p2c55Sr5L2V5pe25LiO5p2O55m955u46YGH77yfJyk7XHJcblxyXG4vLyBDcmVhdGUgdGVuc2lvbiBndWlkYW5jZVxyXG5jb25zdCB0ZW5zaW9uQW5hbHlzaXMgPSBhbmFseXplVGVuc2lvbihzdG9yeVN0YXRlLCBzdHJ1Y3R1cmVkU3RhdGUpO1xyXG5jb25zdCB0ZW5zaW9uR3VpZGFuY2UgPSBnZW5lcmF0ZVRlbnNpb25HdWlkYW5jZSh0ZW5zaW9uQW5hbHlzaXMsIHN0b3J5U3RhdGUpO1xyXG5cclxuLy8gQ3JlYXRlIHByZXZpb3VzIHN1bW1hcmllc1xyXG5jb25zdCBwcmV2aW91c1N1bW1hcmllczogQ2hhcHRlclN1bW1hcnlbXSA9IFtcclxuICB7XHJcbiAgICBjaGFwdGVyTnVtYmVyOiAxLFxyXG4gICAgc3VtbWFyeTogJ+adjueZveemu+W8gOmVv+Wuie+8jOi4j+S4iuivl+S6uuS5i+aXhScsXHJcbiAgICBrZXlFdmVudHM6IFsn5ZGK5Yir6ZW/5a6JJywgJ+eLrOiHquS4iui3ryddLFxyXG4gICAgY2hhcmFjdGVyQ2hhbmdlczogeyAn5p2O55m9JzogJ+S7jui/t+iMq+WIsOWdmuWumicgfSxcclxuICB9LFxyXG4gIHtcclxuICAgIGNoYXB0ZXJOdW1iZXI6IDIsXHJcbiAgICBzdW1tYXJ5OiAn5p2O55m95aSc5a6/6buE6bmk5qW877yM5oCd6ICD5Lq655SfJyxcclxuICAgIGtleUV2ZW50czogWyflpJzlrr/pu4TpuaTmpbwnLCAn5YaZ6K+X5oqS5oCAJ10sXHJcbiAgICBjaGFyYWN0ZXJDaGFuZ2VzOiB7ICfmnY7nmb0nOiAn5pu05Yqg5Z2a5a6a6K+X5Lq65LmL6LevJyB9LFxyXG4gIH0sXHJcbiAge1xyXG4gICAgY2hhcHRlck51bWJlcjogMyxcclxuICAgIHN1bW1hcnk6ICfmnY7nmb3pgYfop4HlrZ/mtannhLbvvIznu5PkuLrnn6Xlt7EnLFxyXG4gICAga2V5RXZlbnRzOiBbJ+mBh+ingeWtn+a1qeeEticsICfppa7phZLorrror5cnXSxcclxuICAgIGNoYXJhY3RlckNoYW5nZXM6IHsgJ+adjueZvSc6ICfmib7liLDnn6Xpn7MnLCAn5a2f5rWp54S2JzogJ+aso+i1j+adjueZveaJjeWNjicgfSxcclxuICB9LFxyXG5dO1xyXG5cclxuLy8gVGVzdCAxOiBGYWxsYmFjayBvYmplY3RpdmVzXHJcbmNvbnNvbGUubG9nKCdUZXN0IDE6IEZhbGxiYWNrIE9iamVjdGl2ZXMgKE5vIExMTSknKTtcclxuY29uc3QgZmFsbGJhY2tPdXRwdXQgPSBzdG9yeURpcmVjdG9yLmdlbmVyYXRlRmFsbGJhY2tPYmplY3RpdmVzKHN0b3J5U3RhdGUsIHN0cnVjdHVyZWRTdGF0ZSk7XHJcbmNvbnNvbGUubG9nKGAgIENoYXB0ZXI6ICR7ZmFsbGJhY2tPdXRwdXQuY2hhcHRlck51bWJlcn1gKTtcclxuY29uc29sZS5sb2coYCAgR29hbDogJHtmYWxsYmFja091dHB1dC5vdmVyYWxsR29hbH1gKTtcclxuY29uc29sZS5sb2coYCAgT2JqZWN0aXZlczogJHtmYWxsYmFja091dHB1dC5vYmplY3RpdmVzLmxlbmd0aH1gKTtcclxuY29uc29sZS5sb2coYCAgRm9jdXM6ICR7ZmFsbGJhY2tPdXRwdXQuZm9jdXNDaGFyYWN0ZXJzLmpvaW4oJywgJyl9YCk7XHJcbmNvbnNvbGUubG9nKCfinIUgRmFsbGJhY2sgb2JqZWN0aXZlcyBnZW5lcmF0ZWQnKTtcclxuXHJcbi8vIFRlc3QgMjogRm9ybWF0IGZvciBwcm9tcHRcclxuY29uc29sZS5sb2coJ1xcblRlc3QgMjogRm9ybWF0IGZvciBQcm9tcHQnKTtcclxuY29uc3QgZm9ybWF0dGVkID0gc3RvcnlEaXJlY3Rvci5mb3JtYXRGb3JQcm9tcHQoZmFsbGJhY2tPdXRwdXQpO1xyXG5jb25zb2xlLmxvZygnLS0tIEZvcm1hdHRlZCBPdXRwdXQgLS0tJyk7XHJcbmNvbnNvbGUubG9nKGZvcm1hdHRlZC5zdWJzdHJpbmcoMCwgNjAwKSk7XHJcbmNvbnNvbGUubG9nKCcuLi4nKTtcclxuY29uc29sZS5sb2coJ+KchSBGb3JtYXR0ZWQgZm9yIHdyaXRlciBwcm9tcHQnKTtcclxuXHJcbi8vIFRlc3QgMzogRGlyZWN0b3Igd2l0aCBMTE1cclxuY29uc29sZS5sb2coJ1xcblRlc3QgMzogU3RvcnkgRGlyZWN0b3Igd2l0aCBMTE0nKTtcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIHJ1bkRpcmVjdG9yVGVzdCgpIHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgZGlyZWN0b3JPdXRwdXQgPSBhd2FpdCBzdG9yeURpcmVjdG9yLmRpcmVjdCh7XHJcbiAgICAgIGJpYmxlLFxyXG4gICAgICBzdGF0ZTogc3RvcnlTdGF0ZSxcclxuICAgICAgc3RydWN0dXJlZFN0YXRlLFxyXG4gICAgICB0ZW5zaW9uR3VpZGFuY2UsXHJcbiAgICAgIHByZXZpb3VzU3VtbWFyaWVzLFxyXG4gICAgfSk7XHJcbiAgICBcclxuICAgIGNvbnNvbGUubG9nKCfinIUgRGlyZWN0b3IgZ2VuZXJhdGVkIGNoYXB0ZXIgcGxhbicpO1xyXG4gICAgY29uc29sZS5sb2coYCAgQ2hhcHRlcjogJHtkaXJlY3Rvck91dHB1dC5jaGFwdGVyTnVtYmVyfWApO1xyXG4gICAgY29uc29sZS5sb2coYCAgR29hbDogJHtkaXJlY3Rvck91dHB1dC5vdmVyYWxsR29hbH1gKTtcclxuICAgIGNvbnNvbGUubG9nKGAgIFRvbmU6ICR7ZGlyZWN0b3JPdXRwdXQudG9uZX1gKTtcclxuICAgIGNvbnNvbGUubG9nKGAgIE9iamVjdGl2ZXM6ICR7ZGlyZWN0b3JPdXRwdXQub2JqZWN0aXZlcy5sZW5ndGh9YCk7XHJcbiAgICBcclxuICAgIGZvciAoY29uc3Qgb2JqIG9mIGRpcmVjdG9yT3V0cHV0Lm9iamVjdGl2ZXMpIHtcclxuICAgICAgY29uc3QgZW1vamkgPSB7IGNyaXRpY2FsOiAn8J+UtCcsIGhpZ2g6ICfwn5+gJywgbWVkaXVtOiAn8J+foScsIGxvdzogJ/Cfn6InIH1bb2JqLnByaW9yaXR5XTtcclxuICAgICAgY29uc29sZS5sb2coYCAgICAke2Vtb2ppfSBbJHtvYmoudHlwZX1dICR7b2JqLmRlc2NyaXB0aW9ufWApO1xyXG4gICAgfVxyXG4gICAgXHJcbiAgICBjb25zb2xlLmxvZyhgICBGb2N1cyBDaGFyYWN0ZXJzOiAke2RpcmVjdG9yT3V0cHV0LmZvY3VzQ2hhcmFjdGVycy5qb2luKCcsICcpfWApO1xyXG4gICAgY29uc29sZS5sb2coYCAgU3VnZ2VzdGVkIFNjZW5lczogJHtkaXJlY3Rvck91dHB1dC5zdWdnZXN0ZWRTY2VuZXMubGVuZ3RofWApO1xyXG4gICAgXHJcbiAgICAvLyBUZXN0IDQ6IEZvcm1hdCBMTE0gb3V0cHV0XHJcbiAgICBjb25zb2xlLmxvZygnXFxuVGVzdCA0OiBGb3JtYXQgTExNIE91dHB1dCBmb3IgUHJvbXB0Jyk7XHJcbiAgICBjb25zdCBsbG1Gb3JtYXR0ZWQgPSBzdG9yeURpcmVjdG9yLmZvcm1hdEZvclByb21wdChkaXJlY3Rvck91dHB1dCk7XHJcbiAgICBjb25zb2xlLmxvZygnLS0tIEZvcm1hdHRlZCBMTE0gT3V0cHV0IC0tLScpO1xyXG4gICAgY29uc29sZS5sb2cobGxtRm9ybWF0dGVkLnN1YnN0cmluZygwLCA4MDApKTtcclxuICAgIGNvbnNvbGUubG9nKCcuLi4nKTtcclxuICAgIGNvbnNvbGUubG9nKCfinIUgTExNIG91dHB1dCBmb3JtYXR0ZWQnKTtcclxuICAgIFxyXG4gIH0gY2F0Y2ggKGVycm9yKSB7XHJcbiAgICBjb25zb2xlLmxvZygn4pqg77iPIERpcmVjdG9yIExMTSB0ZXN0IGZhaWxlZDonLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xyXG4gIH1cclxufVxyXG5cclxucnVuRGlyZWN0b3JUZXN0KCkudGhlbigoKSA9PiB7XHJcbiAgLy8gVGVzdCA1OiBEaWZmZXJlbnQgc3RvcnkgcGhhc2VzXHJcbiAgY29uc29sZS5sb2coJ1xcblRlc3QgNTogRGlmZmVyZW50IFN0b3J5IFBoYXNlcycpO1xyXG5cclxuICAvLyBFYXJseSBwaGFzZVxyXG4gIHN0b3J5U3RhdGUuY3VycmVudENoYXB0ZXIgPSAxO1xyXG4gIGNvbnN0IGVhcmx5RmFsbGJhY2sgPSBzdG9yeURpcmVjdG9yLmdlbmVyYXRlRmFsbGJhY2tPYmplY3RpdmVzKHN0b3J5U3RhdGUsIHN0cnVjdHVyZWRTdGF0ZSk7XHJcbiAgY29uc29sZS5sb2coYCAgRWFybHkgKENoIDEpOiAke2Vhcmx5RmFsbGJhY2sub2JqZWN0aXZlcy5sZW5ndGh9IG9iamVjdGl2ZXMsIHRvbmU6ICR7ZWFybHlGYWxsYmFjay50b25lfWApO1xyXG5cclxuICAvLyBNaWRkbGUgcGhhc2VcclxuICBzdG9yeVN0YXRlLmN1cnJlbnRDaGFwdGVyID0gNTtcclxuICBjb25zdCBtaWRkbGVGYWxsYmFjayA9IHN0b3J5RGlyZWN0b3IuZ2VuZXJhdGVGYWxsYmFja09iamVjdGl2ZXMoc3RvcnlTdGF0ZSwgc3RydWN0dXJlZFN0YXRlKTtcclxuICBjb25zb2xlLmxvZyhgICBNaWRkbGUgKENoIDUpOiAke21pZGRsZUZhbGxiYWNrLm9iamVjdGl2ZXMubGVuZ3RofSBvYmplY3RpdmVzLCB0b25lOiAke21pZGRsZUZhbGxiYWNrLnRvbmV9YCk7XHJcblxyXG4gIC8vIExhdGUgcGhhc2VcclxuICBzdG9yeVN0YXRlLmN1cnJlbnRDaGFwdGVyID0gOTtcclxuICBjb25zdCBsYXRlRmFsbGJhY2sgPSBzdG9yeURpcmVjdG9yLmdlbmVyYXRlRmFsbGJhY2tPYmplY3RpdmVzKHN0b3J5U3RhdGUsIHN0cnVjdHVyZWRTdGF0ZSk7XHJcbiAgY29uc29sZS5sb2coYCAgTGF0ZSAoQ2ggOSk6ICR7bGF0ZUZhbGxiYWNrLm9iamVjdGl2ZXMubGVuZ3RofSBvYmplY3RpdmVzLCB0b25lOiAke2xhdGVGYWxsYmFjay50b25lfWApO1xyXG4gIGNvbnNvbGUubG9nKCfinIUgT2JqZWN0aXZlcyBhZGFwdCB0byBzdG9yeSBwaGFzZScpO1xyXG5cclxuICBjb25zb2xlLmxvZygnXFxu4pyFIEFsbCBTdG9yeSBEaXJlY3RvciB0ZXN0cyBwYXNzZWQhJyk7XHJcbiAgY29uc29sZS5sb2coJ1xcbvCfjokgUGhhc2UgNiAoU3RvcnkgRGlyZWN0b3IgQWdlbnQpIHRlc3RzIGNvbXBsZXRlIScpO1xyXG59KTtcclxuIl19
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
const fs_1 = require("fs");
|
|
4
|
+
const path_1 = require("path");
|
|
5
|
+
const os_1 = require("os");
|
|
6
|
+
// Load config BEFORE importing engine
|
|
7
|
+
const configPath = (0, path_1.join)((0, os_1.homedir)(), '.narrative-os', 'config.json');
|
|
8
|
+
if ((0, fs_1.existsSync)(configPath)) {
|
|
9
|
+
const config = JSON.parse((0, fs_1.readFileSync)(configPath, 'utf-8'));
|
|
10
|
+
process.env.LLM_PROVIDER = config.provider;
|
|
11
|
+
// Use deepseek-chat for JSON tasks (reasoner model has different output format)
|
|
12
|
+
process.env.LLM_MODEL = 'deepseek-chat';
|
|
13
|
+
if (config.provider === 'openai') {
|
|
14
|
+
process.env.OPENAI_API_KEY = config.apiKey;
|
|
15
|
+
}
|
|
16
|
+
else if (config.provider === 'deepseek') {
|
|
17
|
+
process.env.DEEPSEEK_API_KEY = config.apiKey;
|
|
18
|
+
}
|
|
19
|
+
console.log(`Loaded config: ${config.provider} / deepseek-chat (using chat for JSON tasks)`);
|
|
20
|
+
}
|
|
21
|
+
const index_js_1 = require("../index.js");
|
|
22
|
+
console.log('Testing Structured Story State (Phase 4)...\n');
|
|
23
|
+
// Test 1: Create structured state
|
|
24
|
+
console.log('Test 1: Create Structured State');
|
|
25
|
+
const state = (0, index_js_1.createStructuredState)('test-story');
|
|
26
|
+
console.log('✅ Structured state created');
|
|
27
|
+
console.log(` - Chapter: ${state.chapter}`);
|
|
28
|
+
console.log(` - Tension: ${state.tension}`);
|
|
29
|
+
// Test 2: Create story bible and initialize
|
|
30
|
+
console.log('\nTest 2: Initialize from StoryBible');
|
|
31
|
+
let bible = (0, index_js_1.createStoryBible)('李白传奇', '诗人寻找人生真谛', 'historical-fiction', '唐朝长安及各地', '豪放浪漫', '诗人李白离开长安,游历天下,寻找人生真谛', 10);
|
|
32
|
+
bible = (0, index_js_1.addCharacter)(bible, '李白', 'protagonist', ['豪放', '浪漫', '不羁'], ['寻找人生真谛', '成为伟大诗人']);
|
|
33
|
+
bible = (0, index_js_1.addCharacter)(bible, '杜甫', 'supporting', ['沉郁', '忧国忧民'], ['记录时代变迁']);
|
|
34
|
+
bible = (0, index_js_1.addPlotThread)(bible, '诗人之旅', '李白从长安出发,游历天下,寻找人生真谛');
|
|
35
|
+
bible = (0, index_js_1.addPlotThread)(bible, '宫廷阴谋', '朝堂上的权力斗争');
|
|
36
|
+
let structuredState = (0, index_js_1.initializeCharactersFromBible)(state, bible);
|
|
37
|
+
structuredState = (0, index_js_1.initializePlotThreadsFromBible)(structuredState, bible);
|
|
38
|
+
console.log('✅ Initialized from bible');
|
|
39
|
+
console.log(` - Characters: ${Object.keys(structuredState.characters).length}`);
|
|
40
|
+
console.log(` - Plot threads: ${Object.keys(structuredState.plotThreads).length}`);
|
|
41
|
+
// Test 3: Update character state
|
|
42
|
+
console.log('\nTest 3: Update Character State');
|
|
43
|
+
structuredState = (0, index_js_1.updateCharacterState)(structuredState, '李白', {
|
|
44
|
+
emotionalState: 'melancholic',
|
|
45
|
+
location: '黄鹤楼',
|
|
46
|
+
goals: ['寻找人生真谛', '成为伟大诗人', '与友人告别'],
|
|
47
|
+
});
|
|
48
|
+
console.log('✅ Character state updated');
|
|
49
|
+
console.log(` - 李白 emotion: ${structuredState.characters['李白'].emotionalState}`);
|
|
50
|
+
console.log(` - 李白 location: ${structuredState.characters['李白'].location}`);
|
|
51
|
+
// Test 4: Update plot thread
|
|
52
|
+
console.log('\nTest 4: Update Plot Thread');
|
|
53
|
+
const threadIds = Object.keys(structuredState.plotThreads);
|
|
54
|
+
const firstThreadId = threadIds[0];
|
|
55
|
+
structuredState = (0, index_js_1.updatePlotThread)(structuredState, firstThreadId, {
|
|
56
|
+
status: 'escalating',
|
|
57
|
+
tension: 0.5,
|
|
58
|
+
}, 3);
|
|
59
|
+
console.log('✅ Plot thread updated');
|
|
60
|
+
console.log(` - Thread status: ${structuredState.plotThreads[firstThreadId].status}`);
|
|
61
|
+
console.log(` - Thread tension: ${structuredState.plotThreads[firstThreadId].tension}`);
|
|
62
|
+
// Test 5: Questions
|
|
63
|
+
console.log('\nTest 5: Unresolved Questions');
|
|
64
|
+
structuredState = (0, index_js_1.addUnresolvedQuestion)(structuredState, '李白会去哪里?');
|
|
65
|
+
structuredState = (0, index_js_1.addUnresolvedQuestion)(structuredState, '杜甫何时出现?');
|
|
66
|
+
console.log('✅ Added questions');
|
|
67
|
+
console.log(` - Questions: ${structuredState.unresolvedQuestions.length}`);
|
|
68
|
+
structuredState = (0, index_js_1.resolveQuestion)(structuredState, '李白会去哪里?');
|
|
69
|
+
console.log('✅ Resolved question');
|
|
70
|
+
console.log(` - Remaining: ${structuredState.unresolvedQuestions.length}`);
|
|
71
|
+
// Test 6: Recent events
|
|
72
|
+
console.log('\nTest 6: Recent Events');
|
|
73
|
+
structuredState = (0, index_js_1.addRecentEvent)(structuredState, '李白告别长安');
|
|
74
|
+
structuredState = (0, index_js_1.addRecentEvent)(structuredState, '夜宿黄鹤楼');
|
|
75
|
+
structuredState = (0, index_js_1.addRecentEvent)(structuredState, '遇见孟浩然');
|
|
76
|
+
console.log('✅ Added recent events');
|
|
77
|
+
console.log(` - Events: ${structuredState.recentEvents.length}`);
|
|
78
|
+
// Test 7: Tension calculation
|
|
79
|
+
console.log('\nTest 7: Tension Calculation');
|
|
80
|
+
const targetTension = (0, index_js_1.calculateTargetTension)(5, 10);
|
|
81
|
+
console.log(`✅ Target tension at chapter 5/10: ${targetTension}`);
|
|
82
|
+
structuredState = (0, index_js_1.updateStoryTension)(structuredState, 5, 10);
|
|
83
|
+
console.log(`✅ Updated story tension: ${structuredState.tension}`);
|
|
84
|
+
// Test 8: Format for prompt
|
|
85
|
+
console.log('\nTest 8: Format for Prompt');
|
|
86
|
+
const formatted = (0, index_js_1.formatStructuredStateForPrompt)(structuredState);
|
|
87
|
+
console.log('✅ Formatted state for prompt');
|
|
88
|
+
console.log('\n--- Formatted Output Preview ---');
|
|
89
|
+
console.log(formatted.substring(0, 500) + '...');
|
|
90
|
+
// Test 9: State Updater Agent
|
|
91
|
+
console.log('\nTest 9: State Updater Agent');
|
|
92
|
+
const testChapter = {
|
|
93
|
+
id: 'test-chapter-3',
|
|
94
|
+
storyId: 'test-story',
|
|
95
|
+
number: 3,
|
|
96
|
+
title: '黄鹤楼送别',
|
|
97
|
+
content: `李白站在黄鹤楼上,望着滚滚东去的长江水。暮色四合,江面上泛起层层涟漪。
|
|
98
|
+
|
|
99
|
+
"孟兄,此去经年,不知何时再见。"李白举杯,声音中带着几分惆怅。
|
|
100
|
+
|
|
101
|
+
孟浩然拍了拍他的肩膀:"太白兄,天下无不散之筵席。你我有缘,自会重逢。"
|
|
102
|
+
|
|
103
|
+
李白将杯中酒一饮而尽。他望着远方,心中涌起无限感慨。长安的繁华已成过往,前路漫漫,不知归处。
|
|
104
|
+
|
|
105
|
+
"我李白一生,求的是真性情,写的是真文章。"他喃喃自语,"这天下,这江山,都将成为我的诗篇。"
|
|
106
|
+
|
|
107
|
+
夜色渐深,孟浩然的船已远去。李白独立楼头,江风吹动他的衣袂。他知道,从此刻起,他真正踏上了属于自己的旅程。
|
|
108
|
+
|
|
109
|
+
远处传来渔歌,悠扬婉转。李白提笔,在楼壁上写下:故人西辞黄鹤楼,烟花三月下扬州。孤帆远影碧空尽,唯见长江天际流。`,
|
|
110
|
+
wordCount: 350,
|
|
111
|
+
summary: '李白在黄鹤楼与孟浩然告别,写下著名的送别诗,正式踏上诗人之旅',
|
|
112
|
+
generatedAt: new Date(),
|
|
113
|
+
};
|
|
114
|
+
// Run async test
|
|
115
|
+
async function runStateUpdaterTest() {
|
|
116
|
+
try {
|
|
117
|
+
const updates = await index_js_1.stateUpdater.extractStateChanges(testChapter, bible, structuredState);
|
|
118
|
+
console.log('✅ Extracted state changes');
|
|
119
|
+
console.log(` - Character updates: ${updates.characterUpdates.length}`);
|
|
120
|
+
console.log(` - Plot thread updates: ${updates.plotThreadUpdates.length}`);
|
|
121
|
+
console.log(` - New questions: ${updates.newQuestions.length}`);
|
|
122
|
+
console.log(` - Recent events: ${updates.recentEvents.length}`);
|
|
123
|
+
// Apply updates
|
|
124
|
+
const updatedState = index_js_1.stateUpdater.applyUpdates(structuredState, updates, 3);
|
|
125
|
+
console.log('✅ Applied state updates');
|
|
126
|
+
console.log(` - 李白 emotion: ${updatedState.characters['李白'].emotionalState}`);
|
|
127
|
+
console.log(` - Recent events count: ${updatedState.recentEvents.length}`);
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
console.log('⚠️ State updater test failed:', error instanceof Error ? error.message : String(error));
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
runStateUpdaterTest().then(() => {
|
|
134
|
+
// Test 10: Serialization
|
|
135
|
+
console.log('\nTest 10: Serialization');
|
|
136
|
+
const serialized = JSON.stringify(structuredState);
|
|
137
|
+
const deserialized = JSON.parse(serialized);
|
|
138
|
+
console.log('✅ Serialization round-trip successful');
|
|
139
|
+
console.log(` - Original characters: ${Object.keys(structuredState.characters).length}`);
|
|
140
|
+
console.log(` - Deserialized characters: ${Object.keys(deserialized.characters).length}`);
|
|
141
|
+
console.log('\n✅ All Structured State tests passed!');
|
|
142
|
+
console.log('\n🎉 Phase 4 (Structured Story State) tests complete!');
|
|
143
|
+
});
|
|
144
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJlZC1zdGF0ZS50ZXN0LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3Rlc3Qvc3RydWN0dXJlZC1zdGF0ZS50ZXN0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7O0FBQUEsMkJBQThDO0FBQzlDLCtCQUE0QjtBQUM1QiwyQkFBNkI7QUFFN0Isc0NBQXNDO0FBQ3RDLE1BQU0sVUFBVSxHQUFHLElBQUEsV0FBSSxFQUFDLElBQUEsWUFBTyxHQUFFLEVBQUUsZUFBZSxFQUFFLGFBQWEsQ0FBQyxDQUFDO0FBQ25FLElBQUksSUFBQSxlQUFVLEVBQUMsVUFBVSxDQUFDLEVBQUUsQ0FBQztJQUMzQixNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLElBQUEsaUJBQVksRUFBQyxVQUFVLEVBQUUsT0FBTyxDQUFDLENBQUMsQ0FBQztJQUM3RCxPQUFPLENBQUMsR0FBRyxDQUFDLFlBQVksR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDO0lBQzNDLGdGQUFnRjtJQUNoRixPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsR0FBRyxlQUFlLENBQUM7SUFDeEMsSUFBSSxNQUFNLENBQUMsUUFBUSxLQUFLLFFBQVEsRUFBRSxDQUFDO1FBQ2pDLE9BQU8sQ0FBQyxHQUFHLENBQUMsY0FBYyxHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDN0MsQ0FBQztTQUFNLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxVQUFVLEVBQUUsQ0FBQztRQUMxQyxPQUFPLENBQUMsR0FBRyxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUM7SUFDL0MsQ0FBQztJQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLE1BQU0sQ0FBQyxRQUFRLDhDQUE4QyxDQUFDLENBQUM7QUFDL0YsQ0FBQztBQUVELDBDQWdCcUI7QUFFckIsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQ0FBK0MsQ0FBQyxDQUFDO0FBRTdELGtDQUFrQztBQUNsQyxP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TyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsWUFBWSxDQUFDLFlBQVksQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBQzlFLENBQUM7SUFBQyxPQUFPLEtBQUssRUFBRSxDQUFDO1FBQ2YsT0FBTyxDQUFDLEdBQUcsQ0FBQywrQkFBK0IsRUFBRSxLQUFLLFlBQVksS0FBSyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN2RyxDQUFDO0FBQ0gsQ0FBQztBQUVELG1CQUFtQixFQUFFLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRTtJQUM5Qix5QkFBeUI7SUFDekIsT0FBTyxDQUFDLEdBQUcsQ0FBQywwQkFBMEIsQ0FBQyxDQUFDO0lBQ3hDLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsZUFBZSxDQUFDLENBQUM7SUFDbkQsTUFBTSxZQUFZLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM1QyxPQUFPLENBQUMsR0FBRyxDQUFDLHVDQUF1QyxDQUFDLENBQUM7SUFDckQsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0QkFBNEIsTUFBTSxDQUFDLElBQUksQ0FBQyxlQUFlLENBQUMsVUFBVSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQztJQUMxRixPQUFPLENBQUMsR0FBRyxDQUFDLGdDQUFnQyxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO0lBRTNGLE9BQU8sQ0FBQyxHQUFHLENBQUMsd0NBQXdDLENBQUMsQ0FBQztJQUN0RCxPQUFPLENBQUMsR0FBRyxDQUFDLHVEQUF1RCxDQUFDLENBQUM7QUFDdkUsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZVN5bmMsIGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XHJcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcclxuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ29zJztcclxuXHJcbi8vIExvYWQgY29uZmlnIEJFRk9SRSBpbXBvcnRpbmcgZW5naW5lXHJcbmNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGhvbWVkaXIoKSwgJy5uYXJyYXRpdmUtb3MnLCAnY29uZmlnLmpzb24nKTtcclxuaWYgKGV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcclxuICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKSk7XHJcbiAgcHJvY2Vzcy5lbnYuTExNX1BST1ZJREVSID0gY29uZmlnLnByb3ZpZGVyO1xyXG4gIC8vIFVzZSBkZWVwc2Vlay1jaGF0IGZvciBKU09OIHRhc2tzIChyZWFzb25lciBtb2RlbCBoYXMgZGlmZmVyZW50IG91dHB1dCBmb3JtYXQpXHJcbiAgcHJvY2Vzcy5lbnYuTExNX01PREVMID0gJ2RlZXBzZWVrLWNoYXQnO1xyXG4gIGlmIChjb25maWcucHJvdmlkZXIgPT09ICdvcGVuYWknKSB7XHJcbiAgICBwcm9jZXNzLmVudi5PUEVOQUlfQVBJX0tFWSA9IGNvbmZpZy5hcGlLZXk7XHJcbiAgfSBlbHNlIGlmIChjb25maWcucHJvdmlkZXIgPT09ICdkZWVwc2VlaycpIHtcclxuICAgIHByb2Nlc3MuZW52LkRFRVBTRUVLX0FQSV9LRVkgPSBjb25maWcuYXBpS2V5O1xyXG4gIH1cclxuICBjb25zb2xlLmxvZyhgTG9hZGVkIGNvbmZpZzogJHtjb25maWcucHJvdmlkZXJ9IC8gZGVlcHNlZWstY2hhdCAodXNpbmcgY2hhdCBmb3IgSlNPTiB0YXNrcylgKTtcclxufVxyXG5cclxuaW1wb3J0IHtcclxuICBjcmVhdGVTdG9yeUJpYmxlLFxyXG4gIGFkZENoYXJhY3RlcixcclxuICBhZGRQbG90VGhyZWFkLFxyXG4gIGNyZWF0ZVN0cnVjdHVyZWRTdGF0ZSxcclxuICBpbml0aWFsaXplQ2hhcmFjdGVyc0Zyb21CaWJsZSxcclxuICBpbml0aWFsaXplUGxvdFRocmVhZHNGcm9tQmlibGUsXHJcbiAgdXBkYXRlQ2hhcmFjdGVyU3RhdGUsXHJcbiAgdXBkYXRlUGxvdFRocmVhZCxcclxuICBhZGRVbnJlc29sdmVkUXVlc3Rpb24sXHJcbiAgcmVzb2x2ZVF1ZXN0aW9uLFxyXG4gIGFkZFJlY2VudEV2ZW50LFxyXG4gIGNhbGN1bGF0ZVRhcmdldFRlbnNpb24sXHJcbiAgdXBkYXRlU3RvcnlUZW5zaW9uLFxyXG4gIGZvcm1hdFN0cnVjdHVyZWRTdGF0ZUZvclByb21wdCxcclxuICBzdGF0ZVVwZGF0ZXIsXHJcbn0gZnJvbSAnLi4vaW5kZXguanMnO1xyXG5cclxuY29uc29sZS5sb2coJ1Rlc3RpbmcgU3RydWN0dXJlZCBTdG9yeSBTdGF0ZSAoUGhhc2UgNCkuLi5cXG4nKTtcclxuXHJcbi8vIFRlc3QgMTogQ3JlYXRlIHN0cnVjdHVyZWQgc3RhdGVcclxuY29uc29sZS5sb2coJ1Rlc3QgMTogQ3JlYXRlIFN0cnVjdHVyZWQgU3RhdGUnKTtcclxuY29uc3Qgc3RhdGUgPSBjcmVhdGVTdHJ1Y3R1cmVkU3RhdGUoJ3Rlc3Qtc3RvcnknKTtcclxuY29uc29sZS5sb2coJ+KchSBTdHJ1Y3R1cmVkIHN0YXRlIGNyZWF0ZWQnKTtcclxuY29uc29sZS5sb2coYCAgLSBDaGFwdGVyOiAke3N0YXRlLmNoYXB0ZXJ9YCk7XHJcbmNvbnNvbGUubG9nKGAgIC0gVGVuc2lvbjogJHtzdGF0ZS50ZW5zaW9ufWApO1xyXG5cclxuLy8gVGVzdCAyOiBDcmVhdGUgc3RvcnkgYmlibGUgYW5kIGluaXRpYWxpemVcclxuY29uc29sZS5sb2coJ1xcblRlc3QgMjogSW5pdGlhbGl6ZSBmcm9tIFN0b3J5QmlibGUnKTtcclxubGV0IGJpYmxlID0gY3JlYXRlU3RvcnlCaWJsZShcclxuICAn5p2O55m95Lyg5aWHJyxcclxuICAn6K+X5Lq65a+75om+5Lq655Sf55yf6LCbJyxcclxuICAnaGlzdG9yaWNhbC1maWN0aW9uJyxcclxuICAn5ZSQ5pyd6ZW/5a6J5Y+K5ZCE5ZywJyxcclxuICAn6LGq5pS+5rWq5ryrJyxcclxuICAn6K+X5Lq65p2O55m956a75byA6ZW/5a6J77yM5ri45Y6G5aSp5LiL77yM5a+75om+5Lq655Sf55yf6LCbJyxcclxuICAxMFxyXG4pO1xyXG5iaWJsZSA9IGFkZENoYXJhY3RlcihcclxuICBiaWJsZSxcclxuICAn5p2O55m9JyxcclxuICAncHJvdGFnb25pc3QnLFxyXG4gIFsn6LGq5pS+JywgJ+a1qua8qycsICfkuI3nvoEnXSxcclxuICBbJ+Wvu+aJvuS6uueUn+ecn+iwmycsICfmiJDkuLrkvJ/lpKfor5fkuronXVxyXG4pO1xyXG5iaWJsZSA9IGFkZENoYXJhY3RlcihcclxuICBiaWJsZSxcclxuICAn5p2c55SrJyxcclxuICAnc3VwcG9ydGluZycsXHJcbiAgWyfmsonpg4EnLCAn5b+n5Zu95b+n5rCRJ10sXHJcbiAgWyforrDlvZXml7bku6Plj5jov4EnXVxyXG4pO1xyXG5iaWJsZSA9IGFkZFBsb3RUaHJlYWQoXHJcbiAgYmlibGUsXHJcbiAgJ+ivl+S6uuS5i+aXhScsXHJcbiAgJ+adjueZveS7jumVv+WuieWHuuWPke+8jOa4uOWOhuWkqeS4i++8jOWvu+aJvuS6uueUn+ecn+iwmydcclxuKTtcclxuYmlibGUgPSBhZGRQbG90VGhyZWFkKFxyXG4gIGJpYmxlLFxyXG4gICflrqvlu7fpmLTosIsnLFxyXG4gICfmnJ3loILkuIrnmoTmnYPlipvmlpfkuoknXHJcbik7XHJcblxyXG5sZXQgc3RydWN0dXJlZFN0YXRlID0gaW5pdGlhbGl6ZUNoYXJhY3RlcnNGcm9tQmlibGUoc3RhdGUsIGJpYmxlKTtcclxuc3RydWN0dXJlZFN0YXRlID0gaW5pdGlhbGl6ZVBsb3RUaHJlYWRzRnJvbUJpYmxlKHN0cnVjdHVyZWRTdGF0ZSwgYmlibGUpO1xyXG5jb25zb2xlLmxvZygn4pyFIEluaXRpYWxpemVkIGZyb20gYmlibGUnKTtcclxuY29uc29sZS5sb2coYCAgLSBDaGFyYWN0ZXJzOiAke09iamVjdC5rZXlzKHN0cnVjdHVyZWRTdGF0ZS5jaGFyYWN0ZXJzKS5sZW5ndGh9YCk7XHJcbmNvbnNvbGUubG9nKGAgIC0gUGxvdCB0aHJlYWRzOiAke09iamVjdC5rZXlzKHN0cnVjdHVyZWRTdGF0ZS5wbG90VGhyZWFkcykubGVuZ3RofWApO1xyXG5cclxuLy8gVGVzdCAzOiBVcGRhdGUgY2hhcmFjdGVyIHN0YXRlXHJcbmNvbnNvbGUubG9nKCdcXG5UZXN0IDM6IFVwZGF0ZSBDaGFyYWN0ZXIgU3RhdGUnKTtcclxuc3RydWN0dXJlZFN0YXRlID0gdXBkYXRlQ2hhcmFjdGVyU3RhdGUoc3RydWN0dXJlZFN0YXRlLCAn5p2O55m9Jywge1xyXG4gIGVtb3Rpb25hbFN0YXRlOiAnbWVsYW5jaG9saWMnLFxyXG4gIGxvY2F0aW9uOiAn6buE6bmk5qW8JyxcclxuICBnb2FsczogWyflr7vmib7kurrnlJ/nnJ/osJsnLCAn5oiQ5Li65Lyf5aSn6K+X5Lq6JywgJ+S4juWPi+S6uuWRiuWIqyddLFxyXG59KTtcclxuY29uc29sZS5sb2coJ+KchSBDaGFyYWN0ZXIgc3RhdGUgdXBkYXRlZCcpO1xyXG5jb25zb2xlLmxvZyhgICAtIOadjueZvSBlbW90aW9uOiAke3N0cnVjdHVyZWRTdGF0ZS5jaGFyYWN0ZXJzWyfmnY7nmb0nXS5lbW90aW9uYWxTdGF0ZX1gKTtcclxuY29uc29sZS5sb2coYCAgLSDmnY7nmb0gbG9jYXRpb246ICR7c3RydWN0dXJlZFN0YXRlLmNoYXJhY3RlcnNbJ+adjueZvSddLmxvY2F0aW9ufWApO1xyXG5cclxuLy8gVGVzdCA0OiBVcGRhdGUgcGxvdCB0aHJlYWRcclxuY29uc29sZS5sb2coJ1xcblRlc3QgNDogVXBkYXRlIFBsb3QgVGhyZWFkJyk7XHJcbmNvbnN0IHRocmVhZElkcyA9IE9iamVjdC5rZXlzKHN0cnVjdHVyZWRTdGF0ZS5wbG90VGhyZWFkcyk7XHJcbmNvbnN0IGZpcnN0VGhyZWFkSWQgPSB0aHJlYWRJZHNbMF07XHJcbnN0cnVjdHVyZWRTdGF0ZSA9IHVwZGF0ZVBsb3RUaHJlYWQoc3RydWN0dXJlZFN0YXRlLCBmaXJzdFRocmVhZElkLCB7XHJcbiAgc3RhdHVzOiAnZXNjYWxhdGluZycsXHJcbiAgdGVuc2lvbjogMC41LFxyXG59LCAzKTtcclxuY29uc29sZS5sb2coJ+KchSBQbG90IHRocmVhZCB1cGRhdGVkJyk7XHJcbmNvbnNvbGUubG9nKGAgIC0gVGhyZWFkIHN0YXR1czogJHtzdHJ1Y3R1cmVkU3RhdGUucGxvdFRocmVhZHNbZmlyc3RUaHJlYWRJZF0uc3RhdHVzfWApO1xyXG5jb25zb2xlLmxvZyhgICAtIFRocmVhZCB0ZW5zaW9uOiAke3N0cnVjdHVyZWRTdGF0ZS5wbG90VGhyZWFkc1tmaXJzdFRocmVhZElkXS50ZW5zaW9ufWApO1xyXG5cclxuLy8gVGVzdCA1OiBRdWVzdGlvbnNcclxuY29uc29sZS5sb2coJ1xcblRlc3QgNTogVW5yZXNvbHZlZCBRdWVzdGlvbnMnKTtcclxuc3RydWN0dXJlZFN0YXRlID0gYWRkVW5yZXNvbHZlZFF1ZXN0aW9uKHN0cnVjdHVyZWRTdGF0ZSwgJ+adjueZveS8muWOu+WTqumHjO+8nycpO1xyXG5zdHJ1Y3R1cmVkU3RhdGUgPSBhZGRVbnJlc29sdmVkUXVlc3Rpb24oc3RydWN0dXJlZFN0YXRlLCAn5p2c55Sr5L2V5pe25Ye6546w77yfJyk7XHJcbmNvbnNvbGUubG9nKCfinIUgQWRkZWQgcXVlc3Rpb25zJyk7XHJcbmNvbnNvbGUubG9nKGAgIC0gUXVlc3Rpb25zOiAke3N0cnVjdHVyZWRTdGF0ZS51bnJlc29sdmVkUXVlc3Rpb25zLmxlbmd0aH1gKTtcclxuXHJcbnN0cnVjdHVyZWRTdGF0ZSA9IHJlc29sdmVRdWVzdGlvbihzdHJ1Y3R1cmVkU3RhdGUsICfmnY7nmb3kvJrljrvlk6rph4zvvJ8nKTtcclxuY29uc29sZS5sb2coJ+KchSBSZXNvbHZlZCBxdWVzdGlvbicpO1xyXG5jb25zb2xlLmxvZyhgICAtIFJlbWFpbmluZzogJHtzdHJ1Y3R1cmVkU3RhdGUudW5yZXNvbHZlZFF1ZXN0aW9ucy5sZW5ndGh9YCk7XHJcblxyXG4vLyBUZXN0IDY6IFJlY2VudCBldmVudHNcclxuY29uc29sZS5sb2coJ1xcblRlc3QgNjogUmVjZW50IEV2ZW50cycpO1xyXG5zdHJ1Y3R1cmVkU3RhdGUgPSBhZGRSZWNlbnRFdmVudChzdHJ1Y3R1cmVkU3RhdGUsICfmnY7nmb3lkYrliKvplb/lroknKTtcclxuc3RydWN0dXJlZFN0YXRlID0gYWRkUmVjZW50RXZlbnQoc3RydWN0dXJlZFN0YXRlLCAn5aSc5a6/6buE6bmk5qW8Jyk7XHJcbnN0cnVjdHVyZWRTdGF0ZSA9IGFkZFJlY2VudEV2ZW50KHN0cnVjdHVyZWRTdGF0ZSwgJ+mBh+ingeWtn+a1qeeEticpO1xyXG5jb25zb2xlLmxvZygn4pyFIEFkZGVkIHJlY2VudCBldmVudHMnKTtcclxuY29uc29sZS5sb2coYCAgLSBFdmVudHM6ICR7c3RydWN0dXJlZFN0YXRlLnJlY2VudEV2ZW50cy5sZW5ndGh9YCk7XHJcblxyXG4vLyBUZXN0IDc6IFRlbnNpb24gY2FsY3VsYXRpb25cclxuY29uc29sZS5sb2coJ1xcblRlc3QgNzogVGVuc2lvbiBDYWxjdWxhdGlvbicpO1xyXG5jb25zdCB0YXJnZXRUZW5zaW9uID0gY2FsY3VsYXRlVGFyZ2V0VGVuc2lvbig1LCAxMCk7XHJcbmNvbnNvbGUubG9nKGDinIUgVGFyZ2V0IHRlbnNpb24gYXQgY2hhcHRlciA1LzEwOiAke3RhcmdldFRlbnNpb259YCk7XHJcblxyXG5zdHJ1Y3R1cmVkU3RhdGUgPSB1cGRhdGVTdG9yeVRlbnNpb24oc3RydWN0dXJlZFN0YXRlLCA1LCAxMCk7XHJcbmNvbnNvbGUubG9nKGDinIUgVXBkYXRlZCBzdG9yeSB0ZW5zaW9uOiAke3N0cnVjdHVyZWRTdGF0ZS50ZW5zaW9ufWApO1xyXG5cclxuLy8gVGVzdCA4OiBGb3JtYXQgZm9yIHByb21wdFxyXG5jb25zb2xlLmxvZygnXFxuVGVzdCA4OiBGb3JtYXQgZm9yIFByb21wdCcpO1xyXG5jb25zdCBmb3JtYXR0ZWQgPSBmb3JtYXRTdHJ1Y3R1cmVkU3RhdGVGb3JQcm9tcHQoc3RydWN0dXJlZFN0YXRlKTtcclxuY29uc29sZS5sb2coJ+KchSBGb3JtYXR0ZWQgc3RhdGUgZm9yIHByb21wdCcpO1xyXG5jb25zb2xlLmxvZygnXFxuLS0tIEZvcm1hdHRlZCBPdXRwdXQgUHJldmlldyAtLS0nKTtcclxuY29uc29sZS5sb2coZm9ybWF0dGVkLnN1YnN0cmluZygwLCA1MDApICsgJy4uLicpO1xyXG5cclxuLy8gVGVzdCA5OiBTdGF0ZSBVcGRhdGVyIEFnZW50XHJcbmNvbnNvbGUubG9nKCdcXG5UZXN0IDk6IFN0YXRlIFVwZGF0ZXIgQWdlbnQnKTtcclxuY29uc3QgdGVzdENoYXB0ZXIgPSB7XHJcbiAgaWQ6ICd0ZXN0LWNoYXB0ZXItMycsXHJcbiAgc3RvcnlJZDogJ3Rlc3Qtc3RvcnknLFxyXG4gIG51bWJlcjogMyxcclxuICB0aXRsZTogJ+m7hOm5pOalvOmAgeWIqycsXHJcbiAgY29udGVudDogYOadjueZveermeWcqOm7hOm5pOalvOS4iu+8jOacm+edgOa7mua7muS4nOWOu+eahOmVv+axn+awtOOAguaaruiJsuWbm+WQiO+8jOaxn+mdouS4iuazm+i1t+WxguWxgua2n+a8quOAglxyXG5cclxuXCLlrZ/lhYTvvIzmraTljrvnu4/lubTvvIzkuI3nn6XkvZXml7blho3op4HjgIJcIuadjueZveS4vuadr++8jOWjsOmfs+S4reW4puedgOWHoOWIhuaDhuaAheOAglxyXG5cclxu5a2f5rWp54S25ouN5LqG5ouN5LuW55qE6IKp6IaA77yaXCLlpKrnmb3lhYTvvIzlpKnkuIvml6DkuI3mlaPkuYvnrbXluK3jgILkvaDmiJHmnInnvJjvvIzoh6rkvJrph43pgKLjgIJcIlxyXG5cclxu5p2O55m95bCG5p2v5Lit6YWS5LiA6aWu6ICM5bC944CC5LuW5pyb552A6L+c5pa577yM5b+D5Lit5raM6LW35peg6ZmQ5oSf5oWo44CC6ZW/5a6J55qE57mB5Y2O5bey5oiQ6L+H5b6A77yM5YmN6Lev5ryr5ryr77yM5LiN55+l5b2S5aSE44CCXHJcblxyXG5cIuaIkeadjueZveS4gOeUn++8jOaxgueahOaYr+ecn+aAp+aDhe+8jOWGmeeahOaYr+ecn+aWh+eroOOAglwi5LuW5ZaD5ZaD6Ieq6K+t77yMXCLov5nlpKnkuIvvvIzov5nmsZ/lsbHvvIzpg73lsIbmiJDkuLrmiJHnmoTor5fnr4fjgIJcIlxyXG5cclxu5aSc6Imy5riQ5rex77yM5a2f5rWp54S255qE6Ii55bey6L+c5Y6744CC5p2O55m954us56uL5qW85aS077yM5rGf6aOO5ZC55Yqo5LuW55qE6KGj6KKC44CC5LuW55+l6YGT77yM5LuO5q2k5Yi76LW377yM5LuW55yf5q2j6LiP5LiK5LqG5bGe5LqO6Ieq5bex55qE5peF56iL44CCXHJcblxyXG7ov5zlpITkvKDmnaXmuJTmrYzvvIzmgqDmiazlqYnovazjgILmnY7nmb3mj5DnrJTvvIzlnKjmpbzlo4HkuIrlhpnkuIvvvJrmlYXkurropb/ovp7pu4TpuaTmpbzvvIzng5/oirHkuInmnIjkuIvmiazlt57jgILlraTluIbov5zlvbHnoqfnqbrlsL3vvIzllK/op4Hplb/msZ/lpKnpmYXmtYHjgIJgLFxyXG4gIHdvcmRDb3VudDogMzUwLFxyXG4gIHN1bW1hcnk6ICfmnY7nmb3lnKjpu4TpuaTmpbzkuI7lrZ/mtannhLblkYrliKvvvIzlhpnkuIvokZflkI3nmoTpgIHliKvor5fvvIzmraPlvI/ouI/kuIror5fkurrkuYvml4UnLFxyXG4gIGdlbmVyYXRlZEF0OiBuZXcgRGF0ZSgpLFxyXG59O1xyXG5cclxuLy8gUnVuIGFzeW5jIHRlc3RcclxuYXN5bmMgZnVuY3Rpb24gcnVuU3RhdGVVcGRhdGVyVGVzdCgpIHtcclxuICB0cnkge1xyXG4gICAgY29uc3QgdXBkYXRlcyA9IGF3YWl0IHN0YXRlVXBkYXRlci5leHRyYWN0U3RhdGVDaGFuZ2VzKHRlc3RDaGFwdGVyLCBiaWJsZSwgc3RydWN0dXJlZFN0YXRlKTtcclxuICAgIGNvbnNvbGUubG9nKCfinIUgRXh0cmFjdGVkIHN0YXRlIGNoYW5nZXMnKTtcclxuICAgIGNvbnNvbGUubG9nKGAgIC0gQ2hhcmFjdGVyIHVwZGF0ZXM6ICR7dXBkYXRlcy5jaGFyYWN0ZXJVcGRhdGVzLmxlbmd0aH1gKTtcclxuICAgIGNvbnNvbGUubG9nKGAgIC0gUGxvdCB0aHJlYWQgdXBkYXRlczogJHt1cGRhdGVzLnBsb3RUaHJlYWRVcGRhdGVzLmxlbmd0aH1gKTtcclxuICAgIGNvbnNvbGUubG9nKGAgIC0gTmV3IHF1ZXN0aW9uczogJHt1cGRhdGVzLm5ld1F1ZXN0aW9ucy5sZW5ndGh9YCk7XHJcbiAgICBjb25zb2xlLmxvZyhgICAtIFJlY2VudCBldmVudHM6ICR7dXBkYXRlcy5yZWNlbnRFdmVudHMubGVuZ3RofWApO1xyXG4gICAgXHJcbiAgICAvLyBBcHBseSB1cGRhdGVzXHJcbiAgICBjb25zdCB1cGRhdGVkU3RhdGUgPSBzdGF0ZVVwZGF0ZXIuYXBwbHlVcGRhdGVzKHN0cnVjdHVyZWRTdGF0ZSwgdXBkYXRlcywgMyk7XHJcbiAgICBjb25zb2xlLmxvZygn4pyFIEFwcGxpZWQgc3RhdGUgdXBkYXRlcycpO1xyXG4gICAgY29uc29sZS5sb2coYCAgLSDmnY7nmb0gZW1vdGlvbjogJHt1cGRhdGVkU3RhdGUuY2hhcmFjdGVyc1sn5p2O55m9J10uZW1vdGlvbmFsU3RhdGV9YCk7XHJcbiAgICBjb25zb2xlLmxvZyhgICAtIFJlY2VudCBldmVudHMgY291bnQ6ICR7dXBkYXRlZFN0YXRlLnJlY2VudEV2ZW50cy5sZW5ndGh9YCk7XHJcbiAgfSBjYXRjaCAoZXJyb3IpIHtcclxuICAgIGNvbnNvbGUubG9nKCfimqDvuI8gU3RhdGUgdXBkYXRlciB0ZXN0IGZhaWxlZDonLCBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcikpO1xyXG4gIH1cclxufVxyXG5cclxucnVuU3RhdGVVcGRhdGVyVGVzdCgpLnRoZW4oKCkgPT4ge1xyXG4gIC8vIFRlc3QgMTA6IFNlcmlhbGl6YXRpb25cclxuICBjb25zb2xlLmxvZygnXFxuVGVzdCAxMDogU2VyaWFsaXphdGlvbicpO1xyXG4gIGNvbnN0IHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShzdHJ1Y3R1cmVkU3RhdGUpO1xyXG4gIGNvbnN0IGRlc2VyaWFsaXplZCA9IEpTT04ucGFyc2Uoc2VyaWFsaXplZCk7XHJcbiAgY29uc29sZS5sb2coJ+KchSBTZXJpYWxpemF0aW9uIHJvdW5kLXRyaXAgc3VjY2Vzc2Z1bCcpO1xyXG4gIGNvbnNvbGUubG9nKGAgIC0gT3JpZ2luYWwgY2hhcmFjdGVyczogJHtPYmplY3Qua2V5cyhzdHJ1Y3R1cmVkU3RhdGUuY2hhcmFjdGVycykubGVuZ3RofWApO1xyXG4gIGNvbnNvbGUubG9nKGAgIC0gRGVzZXJpYWxpemVkIGNoYXJhY3RlcnM6ICR7T2JqZWN0LmtleXMoZGVzZXJpYWxpemVkLmNoYXJhY3RlcnMpLmxlbmd0aH1gKTtcclxuXHJcbiAgY29uc29sZS5sb2coJ1xcbuKchSBBbGwgU3RydWN0dXJlZCBTdGF0ZSB0ZXN0cyBwYXNzZWQhJyk7XHJcbiAgY29uc29sZS5sb2coJ1xcbvCfjokgUGhhc2UgNCAoU3RydWN0dXJlZCBTdG9yeSBTdGF0ZSkgdGVzdHMgY29tcGxldGUhJyk7XHJcbn0pO1xyXG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|