@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,75 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.generateChapter = generateChapter;
4
+ const writer_js_1 = require("../agents/writer.js");
5
+ const completeness_js_1 = require("../agents/completeness.js");
6
+ const summarizer_js_1 = require("../agents/summarizer.js");
7
+ const canonValidator_js_1 = require("../agents/canonValidator.js");
8
+ const memoryExtractor_js_1 = require("../agents/memoryExtractor.js");
9
+ const memoryRetriever_js_1 = require("../memory/memoryRetriever.js");
10
+ async function generateChapter(context, options = {}) {
11
+ const { bible, state, chapterNumber } = context;
12
+ const { canon, vectorStore, validateCanon = true, maxContinuationAttempts = 3, retrieveMemories = true } = options;
13
+ console.log(`Generating Chapter ${chapterNumber}...`);
14
+ // Initialize memory retriever if vector store provided
15
+ let memoryRetriever;
16
+ if (vectorStore && retrieveMemories) {
17
+ await vectorStore.initialize();
18
+ memoryRetriever = (0, memoryRetriever_js_1.createMemoryRetriever)(vectorStore);
19
+ }
20
+ let output = await writer_js_1.writer.write(context, canon, memoryRetriever);
21
+ let attempts = 0;
22
+ while (attempts < maxContinuationAttempts) {
23
+ const check = await completeness_js_1.completenessChecker.check(output.content);
24
+ if (check.isComplete) {
25
+ break;
26
+ }
27
+ console.log(` Chapter incomplete, continuing... (attempt ${attempts + 1})`);
28
+ output.content = await writer_js_1.writer.continue(output.content, context);
29
+ output.wordCount = output.content.split(/\s+/).length;
30
+ attempts++;
31
+ }
32
+ let violations = [];
33
+ if (validateCanon && canon) {
34
+ console.log(' Validating canon...');
35
+ const validation = await canonValidator_js_1.canonValidator.validate(output.content, canon);
36
+ violations = validation.violations;
37
+ if (violations.length > 0) {
38
+ console.log(` ⚠️ Canon violations detected: ${violations.length}`);
39
+ }
40
+ }
41
+ const summary = await summarizer_js_1.summarizer.summarize(output.content, chapterNumber);
42
+ const chapter = {
43
+ id: generateId(),
44
+ storyId: bible.id,
45
+ number: chapterNumber,
46
+ title: output.title,
47
+ content: output.content,
48
+ summary: summary.summary,
49
+ wordCount: output.wordCount,
50
+ generatedAt: new Date(),
51
+ };
52
+ // Extract and store memories
53
+ let memoriesExtracted = 0;
54
+ if (vectorStore) {
55
+ console.log(' Extracting memories...');
56
+ const extracted = await memoryExtractor_js_1.memoryExtractor.extract(chapter, bible);
57
+ for (const memory of extracted) {
58
+ await vectorStore.addMemory({
59
+ storyId: bible.id,
60
+ chapterNumber,
61
+ content: memory.content,
62
+ category: memory.category,
63
+ timestamp: new Date(),
64
+ });
65
+ memoriesExtracted++;
66
+ }
67
+ console.log(` Stored ${memoriesExtracted} memories`);
68
+ }
69
+ console.log(` Generated: ${output.wordCount} words`);
70
+ return { chapter, summary, violations, memoriesExtracted };
71
+ }
72
+ function generateId() {
73
+ return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
74
+ }
75
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGVDaGFwdGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3BpcGVsaW5lL2dlbmVyYXRlQ2hhcHRlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQXlCQSwwQ0E2RUM7QUF0R0QsbURBQTZDO0FBQzdDLCtEQUFnRTtBQUNoRSwyREFBcUQ7QUFDckQsbUVBQTZEO0FBQzdELHFFQUErRDtBQUkvRCxxRUFBc0Y7QUFpQi9FLEtBQUssVUFBVSxlQUFlLENBQ25DLE9BQTBCLEVBQzFCLFVBQWtDLEVBQUU7SUFFcEMsTUFBTSxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLEdBQUcsT0FBTyxDQUFDO0lBQ2hELE1BQU0sRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLGFBQWEsR0FBRyxJQUFJLEVBQUUsdUJBQXVCLEdBQUcsQ0FBQyxFQUFFLGdCQUFnQixHQUFHLElBQUksRUFBRSxHQUFHLE9BQU8sQ0FBQztJQUVuSCxPQUFPLENBQUMsR0FBRyxDQUFDLHNCQUFzQixhQUFhLEtBQUssQ0FBQyxDQUFDO0lBRXRELHVEQUF1RDtJQUN2RCxJQUFJLGVBQTRDLENBQUM7SUFDakQsSUFBSSxXQUFXLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztRQUNwQyxNQUFNLFdBQVcsQ0FBQyxVQUFVLEVBQUUsQ0FBQztRQUMvQixlQUFlLEdBQUcsSUFBQSwwQ0FBcUIsRUFBQyxXQUFXLENBQUMsQ0FBQztJQUN2RCxDQUFDO0lBRUQsSUFBSSxNQUFNLEdBQUcsTUFBTSxrQkFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLGVBQWUsQ0FBQyxDQUFDO0lBQ2pFLElBQUksUUFBUSxHQUFHLENBQUMsQ0FBQztJQUVqQixPQUFPLFFBQVEsR0FBRyx1QkFBdUIsRUFBRSxDQUFDO1FBQzFDLE1BQU0sS0FBSyxHQUFHLE1BQU0scUNBQW1CLENBQUMsS0FBSyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQztRQUU5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QUUsQ0FBQztBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgd3JpdGVyIH0gZnJvbSAnLi4vYWdlbnRzL3dyaXRlci5qcyc7XHJcbmltcG9ydCB7IGNvbXBsZXRlbmVzc0NoZWNrZXIgfSBmcm9tICcuLi9hZ2VudHMvY29tcGxldGVuZXNzLmpzJztcclxuaW1wb3J0IHsgc3VtbWFyaXplciB9IGZyb20gJy4uL2FnZW50cy9zdW1tYXJpemVyLmpzJztcclxuaW1wb3J0IHsgY2Fub25WYWxpZGF0b3IgfSBmcm9tICcuLi9hZ2VudHMvY2Fub25WYWxpZGF0b3IuanMnO1xyXG5pbXBvcnQgeyBtZW1vcnlFeHRyYWN0b3IgfSBmcm9tICcuLi9hZ2VudHMvbWVtb3J5RXh0cmFjdG9yLmpzJztcclxuaW1wb3J0IHR5cGUgeyBHZW5lcmF0aW9uQ29udGV4dCwgQ2hhcHRlciwgQ2hhcHRlclN1bW1hcnkgfSBmcm9tICcuLi90eXBlcy9pbmRleC5qcyc7XHJcbmltcG9ydCB0eXBlIHsgQ2Fub25TdG9yZSB9IGZyb20gJy4uL21lbW9yeS9jYW5vblN0b3JlLmpzJztcclxuaW1wb3J0IHR5cGUgeyBWZWN0b3JTdG9yZSB9IGZyb20gJy4uL21lbW9yeS92ZWN0b3JTdG9yZS5qcyc7XHJcbmltcG9ydCB7IGNyZWF0ZU1lbW9yeVJldHJpZXZlciwgTWVtb3J5UmV0cmlldmVyIH0gZnJvbSAnLi4vbWVtb3J5L21lbW9yeVJldHJpZXZlci5qcyc7XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlQ2hhcHRlclJlc3VsdCB7XHJcbiAgY2hhcHRlcjogQ2hhcHRlcjtcclxuICBzdW1tYXJ5OiBDaGFwdGVyU3VtbWFyeTtcclxuICB2aW9sYXRpb25zOiBzdHJpbmdbXTtcclxuICBtZW1vcmllc0V4dHJhY3RlZDogbnVtYmVyO1xyXG59XHJcblxyXG5leHBvcnQgaW50ZXJmYWNlIEdlbmVyYXRlQ2hhcHRlck9wdGlvbnMge1xyXG4gIGNhbm9uPzogQ2Fub25TdG9yZTtcclxuICB2ZWN0b3JTdG9yZT86IFZlY3RvclN0b3JlO1xyXG4gIHZhbGlkYXRlQ2Fub24/OiBib29sZWFuO1xyXG4gIG1heENvbnRpbnVhdGlvbkF0dGVtcHRzPzogbnVtYmVyO1xyXG4gIHJldHJpZXZlTWVtb3JpZXM/OiBib29sZWFuO1xyXG59XHJcblxyXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2VuZXJhdGVDaGFwdGVyKFxyXG4gIGNvbnRleHQ6IEdlbmVyYXRpb25Db250ZXh0LFxyXG4gIG9wdGlvbnM6IEdlbmVyYXRlQ2hhcHRlck9wdGlvbnMgPSB7fVxyXG4pOiBQcm9taXNlPEdlbmVyYXRlQ2hhcHRlclJlc3VsdD4ge1xyXG4gIGNvbnN0IHsgYmlibGUsIHN0YXRlLCBjaGFwdGVyTnVtYmVyIH0gPSBjb250ZXh0O1xyXG4gIGNvbnN0IHsgY2Fub24sIHZlY3RvclN0b3JlLCB2YWxpZGF0ZUNhbm9uID0gdHJ1ZSwgbWF4Q29udGludWF0aW9uQXR0ZW1wdHMgPSAzLCByZXRyaWV2ZU1lbW9yaWVzID0gdHJ1ZSB9ID0gb3B0aW9ucztcclxuXHJcbiAgY29uc29sZS5sb2coYEdlbmVyYXRpbmcgQ2hhcHRlciAke2NoYXB0ZXJOdW1iZXJ9Li4uYCk7XHJcblxyXG4gIC8vIEluaXRpYWxpemUgbWVtb3J5IHJldHJpZXZlciBpZiB2ZWN0b3Igc3RvcmUgcHJvdmlkZWRcclxuICBsZXQgbWVtb3J5UmV0cmlldmVyOiBNZW1vcnlSZXRyaWV2ZXIgfCB1bmRlZmluZWQ7XHJcbiAgaWYgKHZlY3RvclN0b3JlICYmIHJldHJpZXZlTWVtb3JpZXMpIHtcclxuICAgIGF3YWl0IHZlY3RvclN0b3JlLmluaXRpYWxpemUoKTtcclxuICAgIG1lbW9yeVJldHJpZXZlciA9IGNyZWF0ZU1lbW9yeVJldHJpZXZlcih2ZWN0b3JTdG9yZSk7XHJcbiAgfVxyXG5cclxuICBsZXQgb3V0cHV0ID0gYXdhaXQgd3JpdGVyLndyaXRlKGNvbnRleHQsIGNhbm9uLCBtZW1vcnlSZXRyaWV2ZXIpO1xyXG4gIGxldCBhdHRlbXB0cyA9IDA7XHJcblxyXG4gIHdoaWxlIChhdHRlbXB0cyA8IG1heENvbnRpbnVhdGlvbkF0dGVtcHRzKSB7XHJcbiAgICBjb25zdCBjaGVjayA9IGF3YWl0IGNvbXBsZXRlbmVzc0NoZWNrZXIuY2hlY2sob3V0cHV0LmNvbnRlbnQpO1xyXG4gICAgXHJcbiAgICBpZiAoY2hlY2suaXNDb21wbGV0ZSkge1xyXG4gICAgICBicmVhaztcclxuICAgIH1cclxuXHJcbiAgICBjb25zb2xlLmxvZyhgICBDaGFwdGVyIGluY29tcGxldGUsIGNvbnRpbnVpbmcuLi4gKGF0dGVtcHQgJHthdHRlbXB0cyArIDF9KWApO1xyXG4gICAgb3V0cHV0LmNvbnRlbnQgPSBhd2FpdCB3cml0ZXIuY29udGludWUob3V0cHV0LmNvbnRlbnQsIGNvbnRleHQpO1xyXG4gICAgb3V0cHV0LndvcmRDb3VudCA9IG91dHB1dC5jb250ZW50LnNwbGl0KC9cXHMrLykubGVuZ3RoO1xyXG4gICAgYXR0ZW1wdHMrKztcclxuICB9XHJcblxyXG4gIGxldCB2aW9sYXRpb25zOiBzdHJpbmdbXSA9IFtdO1xyXG4gIGlmICh2YWxpZGF0ZUNhbm9uICYmIGNhbm9uKSB7XHJcbiAgICBjb25zb2xlLmxvZygnICBWYWxpZGF0aW5nIGNhbm9uLi4uJyk7XHJcbiAgICBjb25zdCB2YWxpZGF0aW9uID0gYXdhaXQgY2Fub25WYWxpZGF0b3IudmFsaWRhdGUob3V0cHV0LmNvbnRlbnQsIGNhbm9uKTtcclxuICAgIHZpb2xhdGlvbnMgPSB2YWxpZGF0aW9uLnZpb2xhdGlvbnM7XHJcbiAgICBpZiAodmlvbGF0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICAgIGNvbnNvbGUubG9nKGAgIOKaoO+4jyAgQ2Fub24gdmlvbGF0aW9ucyBkZXRlY3RlZDogJHt2aW9sYXRpb25zLmxlbmd0aH1gKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNvbnN0IHN1bW1hcnkgPSBhd2FpdCBzdW1tYXJpemVyLnN1bW1hcml6ZShvdXRwdXQuY29udGVudCwgY2hhcHRlck51bWJlcik7XHJcblxyXG4gIGNvbnN0IGNoYXB0ZXI6IENoYXB0ZXIgPSB7XHJcbiAgICBpZDogZ2VuZXJhdGVJZCgpLFxyXG4gICAgc3RvcnlJZDogYmlibGUuaWQsXHJcbiAgICBudW1iZXI6IGNoYXB0ZXJOdW1iZXIsXHJcbiAgICB0aXRsZTogb3V0cHV0LnRpdGxlLFxyXG4gICAgY29udGVudDogb3V0cHV0LmNvbnRlbnQsXHJcbiAgICBzdW1tYXJ5OiBzdW1tYXJ5LnN1bW1hcnksXHJcbiAgICB3b3JkQ291bnQ6IG91dHB1dC53b3JkQ291bnQsXHJcbiAgICBnZW5lcmF0ZWRBdDogbmV3IERhdGUoKSxcclxuICB9O1xyXG5cclxuICAvLyBFeHRyYWN0IGFuZCBzdG9yZSBtZW1vcmllc1xyXG4gIGxldCBtZW1vcmllc0V4dHJhY3RlZCA9IDA7XHJcbiAgaWYgKHZlY3RvclN0b3JlKSB7XHJcbiAgICBjb25zb2xlLmxvZygnICBFeHRyYWN0aW5nIG1lbW9yaWVzLi4uJyk7XHJcbiAgICBjb25zdCBleHRyYWN0ZWQgPSBhd2FpdCBtZW1vcnlFeHRyYWN0b3IuZXh0cmFjdChjaGFwdGVyLCBiaWJsZSk7XHJcbiAgICBcclxuICAgIGZvciAoY29uc3QgbWVtb3J5IG9mIGV4dHJhY3RlZCkge1xyXG4gICAgICBhd2FpdCB2ZWN0b3JTdG9yZS5hZGRNZW1vcnkoe1xyXG4gICAgICAgIHN0b3J5SWQ6IGJpYmxlLmlkLFxyXG4gICAgICAgIGNoYXB0ZXJOdW1iZXIsXHJcbiAgICAgICAgY29udGVudDogbWVtb3J5LmNvbnRlbnQsXHJcbiAgICAgICAgY2F0ZWdvcnk6IG1lbW9yeS5jYXRlZ29yeSxcclxuICAgICAgICB0aW1lc3RhbXA6IG5ldyBEYXRlKCksXHJcbiAgICAgIH0pO1xyXG4gICAgICBtZW1vcmllc0V4dHJhY3RlZCsrO1xyXG4gICAgfVxyXG4gICAgY29uc29sZS5sb2coYCAgU3RvcmVkICR7bWVtb3JpZXNFeHRyYWN0ZWR9IG1lbW9yaWVzYCk7XHJcbiAgfVxyXG5cclxuICBjb25zb2xlLmxvZyhgICBHZW5lcmF0ZWQ6ICR7b3V0cHV0LndvcmRDb3VudH0gd29yZHNgKTtcclxuXHJcbiAgcmV0dXJuIHsgY2hhcHRlciwgc3VtbWFyeSwgdmlvbGF0aW9ucywgbWVtb3JpZXNFeHRyYWN0ZWQgfTtcclxufVxyXG5cclxuZnVuY3Rpb24gZ2VuZXJhdGVJZCgpOiBzdHJpbmcge1xyXG4gIHJldHVybiBgJHtEYXRlLm5vdygpfS0ke01hdGgucmFuZG9tKCkudG9TdHJpbmcoMzYpLnN1YnN0cmluZygyLCA5KX1gO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,4 @@
1
+ import type { StoryBible, CharacterProfile } from '../types/index.js';
2
+ export declare function createStoryBible(title: string, theme: string, genre: string, setting: string, tone: string, premise: string, targetChapters?: number): StoryBible;
3
+ export declare function addCharacter(bible: StoryBible, name: string, role: CharacterProfile['role'], personality: string[], goals: string[]): StoryBible;
4
+ export declare function addPlotThread(bible: StoryBible, name: string, description: string): StoryBible;
@@ -0,0 +1,53 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStoryBible = createStoryBible;
4
+ exports.addCharacter = addCharacter;
5
+ exports.addPlotThread = addPlotThread;
6
+ function createStoryBible(title, theme, genre, setting, tone, premise, targetChapters = 10) {
7
+ return {
8
+ id: generateId(),
9
+ title,
10
+ theme,
11
+ genre,
12
+ setting,
13
+ tone,
14
+ targetChapters,
15
+ premise,
16
+ characters: [],
17
+ plotThreads: [],
18
+ createdAt: new Date(),
19
+ updatedAt: new Date(),
20
+ };
21
+ }
22
+ function addCharacter(bible, name, role, personality, goals) {
23
+ const character = {
24
+ id: generateId(),
25
+ name,
26
+ role,
27
+ personality,
28
+ goals,
29
+ };
30
+ return {
31
+ ...bible,
32
+ characters: [...bible.characters, character],
33
+ updatedAt: new Date(),
34
+ };
35
+ }
36
+ function addPlotThread(bible, name, description) {
37
+ const thread = {
38
+ id: generateId(),
39
+ name,
40
+ description,
41
+ status: 'dormant',
42
+ tension: 0.1,
43
+ };
44
+ return {
45
+ ...bible,
46
+ plotThreads: [...bible.plotThreads, thread],
47
+ updatedAt: new Date(),
48
+ };
49
+ }
50
+ function generateId() {
51
+ return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;
52
+ }
53
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmlibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3RvcnkvYmlibGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSw0Q0F1QkM7QUFFRCxvQ0FvQkM7QUFFRCxzQ0FrQkM7QUFqRUQsU0FBZ0IsZ0JBQWdCLENBQzlCLEtBQWEsRUFDYixLQUFhLEVBQ2IsS0FBYSxFQUNiLE9BQWUsRUFDZixJQUFZLEVBQ1osT0FBZSxFQUNmLGlCQUF5QixFQUFFO0lBRTNCLE9BQU87UUFDTCxFQUFFLEVBQUUsVUFBVSxFQUFFO1FBQ2hCLEtBQUs7UUFDTCxLQUFLO1FBQ0wsS0FBSztRQUNMLE9BQU87UUFDUCxJQUFJO1FBQ0osY0FBYztRQUNkLE9BQU87UUFDUCxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxFQUFFO1FBQ2YsU0FBUyxFQUFFLElBQUksSUFBSSxFQUFFO1FBQ3JCLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTtLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLFlBQVksQ0FDMUIsS0FBaUIsRUFDakIsSUFBWSxFQUNaLElBQThCLEVBQzlCLFdBQXFCLEVBQ3JCLEtBQWU7SUFFZixNQUFNLFNBQVMsR0FBcUI7UUFDbEMsRUFBRSxFQUFFLFVBQVUsRUFBRTtRQUNoQixJQUFJO1FBQ0osSUFBSTtRQUNKLFdBQVc7UUFDWCxLQUFLO0tBQ04sQ0FBQztJQUVGLE9BQU87UUFDTCxHQUFHLEtBQUs7UUFDUixVQUFVLEVBQUUsQ0FBQyxHQUFHLEtBQUssQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDO1FBQzVDLFNBQVMsRUFBRSxJQUFJLElBQUksRUFBRTtLQUN0QixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLGFBQWEsQ0FDM0IsS0FBaUIsRUFDakIsSUFBWSxFQUNaLFdBQW1CO0lBRW5CLE1BQU0sTUFBTSxHQUFlO1FBQ3pCLEVBQUUsRUFBRSxVQUFVLEVBQUU7UUFDaEIsSUFBSTtRQUNKLFdBQVc7UUFDWCxNQUFNLEVBQUUsU0FBUztRQUNqQixPQUFPLEVBQUUsR0FBRztLQUNiLENBQUM7SUFFRixPQUFPO1FBQ0wsR0FBRyxLQUFLO1FBQ1IsV0FBVyxFQUFFLENBQUMsR0FBRyxLQUFLLENBQUMsV0FBVyxFQUFFLE1BQU0sQ0FBQztRQUMzQyxTQUFTLEVBQUUsSUFBSSxJQUFJLEVBQUU7S0FDdEIsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFTLFVBQVU7SUFDakIsT0FBTyxHQUFHLElBQUksQ0FBQyxHQUFHLEVBQUUsSUFBSSxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLEVBQUUsQ0FBQztBQUN2RSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBTdG9yeUJpYmxlLCBDaGFyYWN0ZXJQcm9maWxlLCBQbG90VGhyZWFkIH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0b3J5QmlibGUoXHJcbiAgdGl0bGU6IHN0cmluZyxcclxuICB0aGVtZTogc3RyaW5nLFxyXG4gIGdlbnJlOiBzdHJpbmcsXHJcbiAgc2V0dGluZzogc3RyaW5nLFxyXG4gIHRvbmU6IHN0cmluZyxcclxuICBwcmVtaXNlOiBzdHJpbmcsXHJcbiAgdGFyZ2V0Q2hhcHRlcnM6IG51bWJlciA9IDEwXHJcbik6IFN0b3J5QmlibGUge1xyXG4gIHJldHVybiB7XHJcbiAgICBpZDogZ2VuZXJhdGVJZCgpLFxyXG4gICAgdGl0bGUsXHJcbiAgICB0aGVtZSxcclxuICAgIGdlbnJlLFxyXG4gICAgc2V0dGluZyxcclxuICAgIHRvbmUsXHJcbiAgICB0YXJnZXRDaGFwdGVycyxcclxuICAgIHByZW1pc2UsXHJcbiAgICBjaGFyYWN0ZXJzOiBbXSxcclxuICAgIHBsb3RUaHJlYWRzOiBbXSxcclxuICAgIGNyZWF0ZWRBdDogbmV3IERhdGUoKSxcclxuICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gYWRkQ2hhcmFjdGVyKFxyXG4gIGJpYmxlOiBTdG9yeUJpYmxlLFxyXG4gIG5hbWU6IHN0cmluZyxcclxuICByb2xlOiBDaGFyYWN0ZXJQcm9maWxlWydyb2xlJ10sXHJcbiAgcGVyc29uYWxpdHk6IHN0cmluZ1tdLFxyXG4gIGdvYWxzOiBzdHJpbmdbXVxyXG4pOiBTdG9yeUJpYmxlIHtcclxuICBjb25zdCBjaGFyYWN0ZXI6IENoYXJhY3RlclByb2ZpbGUgPSB7XHJcbiAgICBpZDogZ2VuZXJhdGVJZCgpLFxyXG4gICAgbmFtZSxcclxuICAgIHJvbGUsXHJcbiAgICBwZXJzb25hbGl0eSxcclxuICAgIGdvYWxzLFxyXG4gIH07XHJcbiAgXHJcbiAgcmV0dXJuIHtcclxuICAgIC4uLmJpYmxlLFxyXG4gICAgY2hhcmFjdGVyczogWy4uLmJpYmxlLmNoYXJhY3RlcnMsIGNoYXJhY3Rlcl0sXHJcbiAgICB1cGRhdGVkQXQ6IG5ldyBEYXRlKCksXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFBsb3RUaHJlYWQoXHJcbiAgYmlibGU6IFN0b3J5QmlibGUsXHJcbiAgbmFtZTogc3RyaW5nLFxyXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmdcclxuKTogU3RvcnlCaWJsZSB7XHJcbiAgY29uc3QgdGhyZWFkOiBQbG90VGhyZWFkID0ge1xyXG4gICAgaWQ6IGdlbmVyYXRlSWQoKSxcclxuICAgIG5hbWUsXHJcbiAgICBkZXNjcmlwdGlvbixcclxuICAgIHN0YXR1czogJ2Rvcm1hbnQnLFxyXG4gICAgdGVuc2lvbjogMC4xLFxyXG4gIH07XHJcbiAgXHJcbiAgcmV0dXJuIHtcclxuICAgIC4uLmJpYmxlLFxyXG4gICAgcGxvdFRocmVhZHM6IFsuLi5iaWJsZS5wbG90VGhyZWFkcywgdGhyZWFkXSxcclxuICAgIHVwZGF0ZWRBdDogbmV3IERhdGUoKSxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBnZW5lcmF0ZUlkKCk6IHN0cmluZyB7XHJcbiAgcmV0dXJuIGAke0RhdGUubm93KCl9LSR7TWF0aC5yYW5kb20oKS50b1N0cmluZygzNikuc3Vic3RyaW5nKDIsIDkpfWA7XHJcbn1cclxuIl19
@@ -0,0 +1,3 @@
1
+ import type { StoryState, ChapterSummary } from '../types/index.js';
2
+ export declare function createStoryState(storyId: string, totalChapters: number): StoryState;
3
+ export declare function updateStoryState(state: StoryState, summary: ChapterSummary): StoryState;
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStoryState = createStoryState;
4
+ exports.updateStoryState = updateStoryState;
5
+ function createStoryState(storyId, totalChapters) {
6
+ return {
7
+ storyId,
8
+ currentChapter: 0,
9
+ totalChapters,
10
+ currentTension: 0.1,
11
+ activePlotThreads: [],
12
+ chapterSummaries: [],
13
+ };
14
+ }
15
+ function updateStoryState(state, summary) {
16
+ return {
17
+ ...state,
18
+ currentChapter: summary.chapterNumber,
19
+ chapterSummaries: [...state.chapterSummaries, summary],
20
+ currentTension: calculateTension(summary.chapterNumber, state.totalChapters),
21
+ };
22
+ }
23
+ function calculateTension(currentChapter, totalChapters) {
24
+ const progress = currentChapter / totalChapters;
25
+ return 4 * progress * (1 - progress);
26
+ }
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvc3Rvcnkvc3RhdGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFFQSw0Q0FTQztBQUVELDRDQVVDO0FBckJELFNBQWdCLGdCQUFnQixDQUFDLE9BQWUsRUFBRSxhQUFxQjtJQUNyRSxPQUFPO1FBQ0wsT0FBTztRQUNQLGNBQWMsRUFBRSxDQUFDO1FBQ2pCLGFBQWE7UUFDYixjQUFjLEVBQUUsR0FBRztRQUNuQixpQkFBaUIsRUFBRSxFQUFFO1FBQ3JCLGdCQUFnQixFQUFFLEVBQUU7S0FDckIsQ0FBQztBQUNKLENBQUM7QUFFRCxTQUFnQixnQkFBZ0IsQ0FDOUIsS0FBaUIsRUFDakIsT0FBdUI7SUFFdkIsT0FBTztRQUNMLEdBQUcsS0FBSztRQUNSLGNBQWMsRUFBRSxPQUFPLENBQUMsYUFBYTtRQUNyQyxnQkFBZ0IsRUFBRSxDQUFDLEdBQUcsS0FBSyxDQUFDLGdCQUFnQixFQUFFLE9BQU8sQ0FBQztRQUN0RCxjQUFjLEVBQUUsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxLQUFLLENBQUMsYUFBYSxDQUFDO0tBQzdFLENBQUM7QUFDSixDQUFDO0FBRUQsU0FBUyxnQkFBZ0IsQ0FBQyxjQUFzQixFQUFFLGFBQXFCO0lBQ3JFLE1BQU0sUUFBUSxHQUFHLGNBQWMsR0FBRyxhQUFhLENBQUM7SUFDaEQsT0FBTyxDQUFDLEdBQUcsUUFBUSxHQUFHLENBQUMsQ0FBQyxHQUFHLFFBQVEsQ0FBQyxDQUFDO0FBQ3ZDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IFN0b3J5U3RhdGUsIENoYXB0ZXJTdW1tYXJ5IH0gZnJvbSAnLi4vdHlwZXMvaW5kZXguanMnO1xyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVN0b3J5U3RhdGUoc3RvcnlJZDogc3RyaW5nLCB0b3RhbENoYXB0ZXJzOiBudW1iZXIpOiBTdG9yeVN0YXRlIHtcclxuICByZXR1cm4ge1xyXG4gICAgc3RvcnlJZCxcclxuICAgIGN1cnJlbnRDaGFwdGVyOiAwLFxyXG4gICAgdG90YWxDaGFwdGVycyxcclxuICAgIGN1cnJlbnRUZW5zaW9uOiAwLjEsXHJcbiAgICBhY3RpdmVQbG90VGhyZWFkczogW10sXHJcbiAgICBjaGFwdGVyU3VtbWFyaWVzOiBbXSxcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gdXBkYXRlU3RvcnlTdGF0ZShcclxuICBzdGF0ZTogU3RvcnlTdGF0ZSxcclxuICBzdW1tYXJ5OiBDaGFwdGVyU3VtbWFyeVxyXG4pOiBTdG9yeVN0YXRlIHtcclxuICByZXR1cm4ge1xyXG4gICAgLi4uc3RhdGUsXHJcbiAgICBjdXJyZW50Q2hhcHRlcjogc3VtbWFyeS5jaGFwdGVyTnVtYmVyLFxyXG4gICAgY2hhcHRlclN1bW1hcmllczogWy4uLnN0YXRlLmNoYXB0ZXJTdW1tYXJpZXMsIHN1bW1hcnldLFxyXG4gICAgY3VycmVudFRlbnNpb246IGNhbGN1bGF0ZVRlbnNpb24oc3VtbWFyeS5jaGFwdGVyTnVtYmVyLCBzdGF0ZS50b3RhbENoYXB0ZXJzKSxcclxuICB9O1xyXG59XHJcblxyXG5mdW5jdGlvbiBjYWxjdWxhdGVUZW5zaW9uKGN1cnJlbnRDaGFwdGVyOiBudW1iZXIsIHRvdGFsQ2hhcHRlcnM6IG51bWJlcik6IG51bWJlciB7XHJcbiAgY29uc3QgcHJvZ3Jlc3MgPSBjdXJyZW50Q2hhcHRlciAvIHRvdGFsQ2hhcHRlcnM7XHJcbiAgcmV0dXJuIDQgKiBwcm9ncmVzcyAqICgxIC0gcHJvZ3Jlc3MpO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1,39 @@
1
+ import type { StoryBible } from '../types/index.js';
2
+ export interface CharacterState {
3
+ name: string;
4
+ emotionalState: string;
5
+ location: string;
6
+ relationships: Record<string, string>;
7
+ goals: string[];
8
+ knowledge: string[];
9
+ development: string[];
10
+ }
11
+ export interface PlotThreadState {
12
+ id: string;
13
+ name: string;
14
+ status: 'dormant' | 'active' | 'escalating' | 'resolved';
15
+ tension: number;
16
+ lastChapter: number;
17
+ involvedCharacters: string[];
18
+ summary: string;
19
+ }
20
+ export interface StoryStructuredState {
21
+ storyId: string;
22
+ chapter: number;
23
+ tension: number;
24
+ characters: Record<string, CharacterState>;
25
+ plotThreads: Record<string, PlotThreadState>;
26
+ unresolvedQuestions: string[];
27
+ recentEvents: string[];
28
+ }
29
+ export declare function createStructuredState(storyId: string): StoryStructuredState;
30
+ export declare function initializeCharactersFromBible(state: StoryStructuredState, bible: StoryBible): StoryStructuredState;
31
+ export declare function initializePlotThreadsFromBible(state: StoryStructuredState, bible: StoryBible): StoryStructuredState;
32
+ export declare function updateCharacterState(state: StoryStructuredState, characterName: string, updates: Partial<CharacterState>): StoryStructuredState;
33
+ export declare function updatePlotThread(state: StoryStructuredState, threadId: string, updates: Partial<PlotThreadState>, currentChapter: number): StoryStructuredState;
34
+ export declare function addUnresolvedQuestion(state: StoryStructuredState, question: string): StoryStructuredState;
35
+ export declare function resolveQuestion(state: StoryStructuredState, question: string): StoryStructuredState;
36
+ export declare function addRecentEvent(state: StoryStructuredState, event: string): StoryStructuredState;
37
+ export declare function calculateTargetTension(currentChapter: number, totalChapters: number): number;
38
+ export declare function updateStoryTension(state: StoryStructuredState, currentChapter: number, totalChapters: number): StoryStructuredState;
39
+ export declare function formatStructuredStateForPrompt(state: StoryStructuredState): string;
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createStructuredState = createStructuredState;
4
+ exports.initializeCharactersFromBible = initializeCharactersFromBible;
5
+ exports.initializePlotThreadsFromBible = initializePlotThreadsFromBible;
6
+ exports.updateCharacterState = updateCharacterState;
7
+ exports.updatePlotThread = updatePlotThread;
8
+ exports.addUnresolvedQuestion = addUnresolvedQuestion;
9
+ exports.resolveQuestion = resolveQuestion;
10
+ exports.addRecentEvent = addRecentEvent;
11
+ exports.calculateTargetTension = calculateTargetTension;
12
+ exports.updateStoryTension = updateStoryTension;
13
+ exports.formatStructuredStateForPrompt = formatStructuredStateForPrompt;
14
+ function createStructuredState(storyId) {
15
+ return {
16
+ storyId,
17
+ chapter: 0,
18
+ tension: 0.1, // Start with low tension
19
+ characters: {},
20
+ plotThreads: {},
21
+ unresolvedQuestions: [],
22
+ recentEvents: [],
23
+ };
24
+ }
25
+ function initializeCharactersFromBible(state, bible) {
26
+ const newState = { ...state };
27
+ for (const char of bible.characters) {
28
+ newState.characters[char.name] = {
29
+ name: char.name,
30
+ emotionalState: 'neutral',
31
+ location: bible.setting,
32
+ relationships: {},
33
+ goals: [...char.goals],
34
+ knowledge: [],
35
+ development: [],
36
+ };
37
+ }
38
+ return newState;
39
+ }
40
+ function initializePlotThreadsFromBible(state, bible) {
41
+ const newState = { ...state };
42
+ for (const thread of bible.plotThreads) {
43
+ newState.plotThreads[thread.id] = {
44
+ id: thread.id,
45
+ name: thread.name,
46
+ status: thread.status,
47
+ tension: thread.tension,
48
+ lastChapter: 0,
49
+ involvedCharacters: [],
50
+ summary: thread.description,
51
+ };
52
+ }
53
+ return newState;
54
+ }
55
+ function updateCharacterState(state, characterName, updates) {
56
+ const newState = { ...state };
57
+ if (newState.characters[characterName]) {
58
+ newState.characters[characterName] = {
59
+ ...newState.characters[characterName],
60
+ ...updates,
61
+ };
62
+ }
63
+ return newState;
64
+ }
65
+ function updatePlotThread(state, threadId, updates, currentChapter) {
66
+ const newState = { ...state };
67
+ if (newState.plotThreads[threadId]) {
68
+ newState.plotThreads[threadId] = {
69
+ ...newState.plotThreads[threadId],
70
+ ...updates,
71
+ lastChapter: currentChapter,
72
+ };
73
+ }
74
+ return newState;
75
+ }
76
+ function addUnresolvedQuestion(state, question) {
77
+ return {
78
+ ...state,
79
+ unresolvedQuestions: [...state.unresolvedQuestions, question],
80
+ };
81
+ }
82
+ function resolveQuestion(state, question) {
83
+ return {
84
+ ...state,
85
+ unresolvedQuestions: state.unresolvedQuestions.filter(q => q !== question),
86
+ };
87
+ }
88
+ function addRecentEvent(state, event) {
89
+ // Keep only last 10 events
90
+ const recentEvents = [...state.recentEvents, event].slice(-10);
91
+ return {
92
+ ...state,
93
+ recentEvents,
94
+ };
95
+ }
96
+ function calculateTargetTension(currentChapter, totalChapters) {
97
+ // Parabolic tension curve: low at start, high in middle, resolution at end
98
+ const progress = currentChapter / totalChapters;
99
+ return 4 * progress * (1 - progress);
100
+ }
101
+ function updateStoryTension(state, currentChapter, totalChapters) {
102
+ const targetTension = calculateTargetTension(currentChapter, totalChapters);
103
+ // Blend current tension toward target (smooth transition)
104
+ const newTension = state.tension * 0.7 + targetTension * 0.3;
105
+ return {
106
+ ...state,
107
+ chapter: currentChapter,
108
+ tension: Math.round(newTension * 100) / 100, // Round to 2 decimals
109
+ };
110
+ }
111
+ function formatStructuredStateForPrompt(state) {
112
+ const lines = ['## Current Story State'];
113
+ // Overall tension
114
+ const tensionPercent = Math.round(state.tension * 100);
115
+ lines.push(`\n**Story Tension:** ${tensionPercent}%`);
116
+ // Active plot threads
117
+ const activeThreads = Object.values(state.plotThreads)
118
+ .filter(t => t.status !== 'resolved' && t.status !== 'dormant');
119
+ if (activeThreads.length > 0) {
120
+ lines.push('\n### Active Plot Threads');
121
+ for (const thread of activeThreads) {
122
+ const threadTension = Math.round(thread.tension * 100);
123
+ lines.push(`- **${thread.name}** (${thread.status}, tension: ${threadTension}%)`);
124
+ lines.push(` - ${thread.summary}`);
125
+ }
126
+ }
127
+ // Character states
128
+ const characters = Object.values(state.characters);
129
+ if (characters.length > 0) {
130
+ lines.push('\n### Character States');
131
+ for (const char of characters) {
132
+ lines.push(`- **${char.name}**: ${char.emotionalState}`);
133
+ if (char.location)
134
+ lines.push(` - Location: ${char.location}`);
135
+ if (Object.keys(char.relationships).length > 0) {
136
+ const rels = Object.entries(char.relationships)
137
+ .map(([name, status]) => `${name} (${status})`)
138
+ .join(', ');
139
+ lines.push(` - Relationships: ${rels}`);
140
+ }
141
+ }
142
+ }
143
+ // Unresolved questions
144
+ if (state.unresolvedQuestions.length > 0) {
145
+ lines.push('\n### Unresolved Questions');
146
+ for (const q of state.unresolvedQuestions) {
147
+ lines.push(`- ${q}`);
148
+ }
149
+ }
150
+ // Recent events
151
+ if (state.recentEvents.length > 0) {
152
+ lines.push('\n### Recent Events');
153
+ for (const event of state.recentEvents.slice(-5)) {
154
+ lines.push(`- ${event}`);
155
+ }
156
+ }
157
+ return lines.join('\n');
158
+ }
159
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3RydWN0dXJlZFN0YXRlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3N0b3J5L3N0cnVjdHVyZWRTdGF0ZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOztBQWdDQSxzREFVQztBQUVELHNFQW1CQztBQUVELHdFQW1CQztBQUVELG9EQWVDO0FBRUQsNENBaUJDO0FBRUQsc0RBUUM7QUFFRCwwQ0FRQztBQUVELHdDQVVDO0FBRUQsd0RBT0M7QUFFRCxnREFlQztBQUVELHdFQXFEQztBQXpNRCxTQUFnQixxQkFBcUIsQ0FBQyxPQUFlO0lBQ25ELE9BQU87UUFDTCxPQUFPO1FBQ1AsT0FBTyxFQUFFLENBQUM7UUFDVixPQUFPLEVBQUUsR0FBRyxFQUFFLHlCQUF5QjtRQUN2QyxVQUFVLEVBQUUsRUFBRTtRQUNkLFdBQVcsRUFBRSxFQUFFO1FBQ2YsbUJBQW1CLEVBQUUsRUFBRTtRQUN2QixZQUFZLEVBQUUsRUFBRTtLQUNqQixDQUFDO0FBQ0osQ0FBQztBQUVELFNBQWdCLDZCQUE2QixDQUMzQyxLQUEyQixFQUMzQixLQUFpQjtJQUVqQixNQUFNLFFBQVEsR0FBRyxFQUFFLEdBQUcsS0FBSyxFQUFFLENBQUM7SUFFOUIsS0FBSyxNQUFNLElBQUksSUFBSSxLQUFLLENBQUMsVUFBVSxFQUFFLENBQUM7UUFDcEMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUc7WUFDL0IsSUFBSSxFQUFFLElBQUksQ0FBQyxJQUFJO1lBQ2YsY0FBYyxFQUFFLFNBQVM7WUFDekIsUUFBUSxFQUFFLEtBQUssQ0FBQyxPQUFPO1lBQ3ZCLGFBQWEsRUFBRSxFQUFFO1lBQ2pCLEtBQUssRUFBRSxDQUFDLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQztZQUN0QixTQUFTLEVBQUUsRUFBRTtZQUNiLFdBQVcsRUFBRSxFQUFFO1NBQ2hCLENBQUM7SUFDSixDQUFDO0lBRUQsT0FBTyxRQUFRLENBQUM7QUFDbEIsQ0FBQztBQUVE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O0lBRUQsdUJBQXVCO0lBQ3ZCLElBQUksS0FBSyxDQUFDLG1CQUFtQixDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUUsQ0FBQztRQUN6QyxLQUFLLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUM7UUFDekMsS0FBSyxNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztZQUMxQyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsQ0FBQztRQUN2QixDQUFDO0lBQ0gsQ0FBQztJQUVELGdCQUFnQjtJQUNoQixJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNsQyxLQUFLLE1BQU0sS0FBSyxJQUFJLEtBQUssQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUNqRCxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssS0FBSyxFQUFFLENBQUMsQ0FBQztRQUMzQixDQUFDO0lBQ0gsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztBQUMxQixDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHR5cGUgeyBDaGFwdGVyLCBDaGFwdGVyU3VtbWFyeSwgU3RvcnlCaWJsZSB9IGZyb20gJy4uL3R5cGVzL2luZGV4LmpzJztcclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgQ2hhcmFjdGVyU3RhdGUge1xyXG4gIG5hbWU6IHN0cmluZztcclxuICBlbW90aW9uYWxTdGF0ZTogc3RyaW5nO1xyXG4gIGxvY2F0aW9uOiBzdHJpbmc7XHJcbiAgcmVsYXRpb25zaGlwczogUmVjb3JkPHN0cmluZywgc3RyaW5nPjsgLy8gY2hhcmFjdGVyIG5hbWUgLT4gcmVsYXRpb25zaGlwIHN0YXR1c1xyXG4gIGdvYWxzOiBzdHJpbmdbXTtcclxuICBrbm93bGVkZ2U6IHN0cmluZ1tdOyAvLyBXaGF0IHRoaXMgY2hhcmFjdGVyIGtub3dzXHJcbiAgZGV2ZWxvcG1lbnQ6IHN0cmluZ1tdOyAvLyBDaGFyYWN0ZXIgYXJjIGNoYW5nZXNcclxufVxyXG5cclxuZXhwb3J0IGludGVyZmFjZSBQbG90VGhyZWFkU3RhdGUge1xyXG4gIGlkOiBzdHJpbmc7XHJcbiAgbmFtZTogc3RyaW5nO1xyXG4gIHN0YXR1czogJ2Rvcm1hbnQnIHwgJ2FjdGl2ZScgfCAnZXNjYWxhdGluZycgfCAncmVzb2x2ZWQnO1xyXG4gIHRlbnNpb246IG51bWJlcjsgLy8gMC4wIHRvIDEuMFxyXG4gIGxhc3RDaGFwdGVyOiBudW1iZXI7XHJcbiAgaW52b2x2ZWRDaGFyYWN0ZXJzOiBzdHJpbmdbXTtcclxuICBzdW1tYXJ5OiBzdHJpbmc7XHJcbn1cclxuXHJcbmV4cG9ydCBpbnRlcmZhY2UgU3RvcnlTdHJ1Y3R1cmVkU3RhdGUge1xyXG4gIHN0b3J5SWQ6IHN0cmluZztcclxuICBjaGFwdGVyOiBudW1iZXI7XHJcbiAgdGVuc2lvbjogbnVtYmVyOyAvLyBPdmVyYWxsIHN0b3J5IHRlbnNpb24gMC4wIHRvIDEuMFxyXG4gIGNoYXJhY3RlcnM6IFJlY29yZDxzdHJpbmcsIENoYXJhY3RlclN0YXRlPjtcclxuICBwbG90VGhyZWFkczogUmVjb3JkPHN0cmluZywgUGxvdFRocmVhZFN0YXRlPjtcclxuICB1bnJlc29sdmVkUXVlc3Rpb25zOiBzdHJpbmdbXTtcclxuICByZWNlbnRFdmVudHM6IHN0cmluZ1tdO1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU3RydWN0dXJlZFN0YXRlKHN0b3J5SWQ6IHN0cmluZyk6IFN0b3J5U3RydWN0dXJlZFN0YXRlIHtcclxuICByZXR1cm4ge1xyXG4gICAgc3RvcnlJZCxcclxuICAgIGNoYXB0ZXI6IDAsXHJcbiAgICB0ZW5zaW9uOiAwLjEsIC8vIFN0YXJ0IHdpdGggbG93IHRlbnNpb25cclxuICAgIGNoYXJhY3RlcnM6IHt9LFxyXG4gICAgcGxvdFRocmVhZHM6IHt9LFxyXG4gICAgdW5yZXNvbHZlZFF1ZXN0aW9uczogW10sXHJcbiAgICByZWNlbnRFdmVudHM6IFtdLFxyXG4gIH07XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplQ2hhcmFjdGVyc0Zyb21CaWJsZShcclxuICBzdGF0ZTogU3RvcnlTdHJ1Y3R1cmVkU3RhdGUsXHJcbiAgYmlibGU6IFN0b3J5QmlibGVcclxuKTogU3RvcnlTdHJ1Y3R1cmVkU3RhdGUge1xyXG4gIGNvbnN0IG5ld1N0YXRlID0geyAuLi5zdGF0ZSB9O1xyXG4gIFxyXG4gIGZvciAoY29uc3QgY2hhciBvZiBiaWJsZS5jaGFyYWN0ZXJzKSB7XHJcbiAgICBuZXdTdGF0ZS5jaGFyYWN0ZXJzW2NoYXIubmFtZV0gPSB7XHJcbiAgICAgIG5hbWU6IGNoYXIubmFtZSxcclxuICAgICAgZW1vdGlvbmFsU3RhdGU6ICduZXV0cmFsJyxcclxuICAgICAgbG9jYXRpb246IGJpYmxlLnNldHRpbmcsXHJcbiAgICAgIHJlbGF0aW9uc2hpcHM6IHt9LFxyXG4gICAgICBnb2FsczogWy4uLmNoYXIuZ29hbHNdLFxyXG4gICAgICBrbm93bGVkZ2U6IFtdLFxyXG4gICAgICBkZXZlbG9wbWVudDogW10sXHJcbiAgICB9O1xyXG4gIH1cclxuICBcclxuICByZXR1cm4gbmV3U3RhdGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBpbml0aWFsaXplUGxvdFRocmVhZHNGcm9tQmlibGUoXHJcbiAgc3RhdGU6IFN0b3J5U3RydWN0dXJlZFN0YXRlLFxyXG4gIGJpYmxlOiBTdG9yeUJpYmxlXHJcbik6IFN0b3J5U3RydWN0dXJlZFN0YXRlIHtcclxuICBjb25zdCBuZXdTdGF0ZSA9IHsgLi4uc3RhdGUgfTtcclxuICBcclxuICBmb3IgKGNvbnN0IHRocmVhZCBvZiBiaWJsZS5wbG90VGhyZWFkcykge1xyXG4gICAgbmV3U3RhdGUucGxvdFRocmVhZHNbdGhyZWFkLmlkXSA9IHtcclxuICAgICAgaWQ6IHRocmVhZC5pZCxcclxuICAgICAgbmFtZTogdGhyZWFkLm5hbWUsXHJcbiAgICAgIHN0YXR1czogdGhyZWFkLnN0YXR1cyxcclxuICAgICAgdGVuc2lvbjogdGhyZWFkLnRlbnNpb24sXHJcbiAgICAgIGxhc3RDaGFwdGVyOiAwLFxyXG4gICAgICBpbnZvbHZlZENoYXJhY3RlcnM6IFtdLFxyXG4gICAgICBzdW1tYXJ5OiB0aHJlYWQuZGVzY3JpcHRpb24sXHJcbiAgICB9O1xyXG4gIH1cclxuICBcclxuICByZXR1cm4gbmV3U3RhdGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVDaGFyYWN0ZXJTdGF0ZShcclxuICBzdGF0ZTogU3RvcnlTdHJ1Y3R1cmVkU3RhdGUsXHJcbiAgY2hhcmFjdGVyTmFtZTogc3RyaW5nLFxyXG4gIHVwZGF0ZXM6IFBhcnRpYWw8Q2hhcmFjdGVyU3RhdGU+XHJcbik6IFN0b3J5U3RydWN0dXJlZFN0YXRlIHtcclxuICBjb25zdCBuZXdTdGF0ZSA9IHsgLi4uc3RhdGUgfTtcclxuICBcclxuICBpZiAobmV3U3RhdGUuY2hhcmFjdGVyc1tjaGFyYWN0ZXJOYW1lXSkge1xyXG4gICAgbmV3U3RhdGUuY2hhcmFjdGVyc1tjaGFyYWN0ZXJOYW1lXSA9IHtcclxuICAgICAgLi4ubmV3U3RhdGUuY2hhcmFjdGVyc1tjaGFyYWN0ZXJOYW1lXSxcclxuICAgICAgLi4udXBkYXRlcyxcclxuICAgIH07XHJcbiAgfVxyXG4gIFxyXG4gIHJldHVybiBuZXdTdGF0ZTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHVwZGF0ZVBsb3RUaHJlYWQoXHJcbiAgc3RhdGU6IFN0b3J5U3RydWN0dXJlZFN0YXRlLFxyXG4gIHRocmVhZElkOiBzdHJpbmcsXHJcbiAgdXBkYXRlczogUGFydGlhbDxQbG90VGhyZWFkU3RhdGU+LFxyXG4gIGN1cnJlbnRDaGFwdGVyOiBudW1iZXJcclxuKTogU3RvcnlTdHJ1Y3R1cmVkU3RhdGUge1xyXG4gIGNvbnN0IG5ld1N0YXRlID0geyAuLi5zdGF0ZSB9O1xyXG4gIFxyXG4gIGlmIChuZXdTdGF0ZS5wbG90VGhyZWFkc1t0aHJlYWRJZF0pIHtcclxuICAgIG5ld1N0YXRlLnBsb3RUaHJlYWRzW3RocmVhZElkXSA9IHtcclxuICAgICAgLi4ubmV3U3RhdGUucGxvdFRocmVhZHNbdGhyZWFkSWRdLFxyXG4gICAgICAuLi51cGRhdGVzLFxyXG4gICAgICBsYXN0Q2hhcHRlcjogY3VycmVudENoYXB0ZXIsXHJcbiAgICB9O1xyXG4gIH1cclxuICBcclxuICByZXR1cm4gbmV3U3RhdGU7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiBhZGRVbnJlc29sdmVkUXVlc3Rpb24oXHJcbiAgc3RhdGU6IFN0b3J5U3RydWN0dXJlZFN0YXRlLFxyXG4gIHF1ZXN0aW9uOiBzdHJpbmdcclxuKTogU3RvcnlTdHJ1Y3R1cmVkU3RhdGUge1xyXG4gIHJldHVybiB7XHJcbiAgICAuLi5zdGF0ZSxcclxuICAgIHVucmVzb2x2ZWRRdWVzdGlvbnM6IFsuLi5zdGF0ZS51bnJlc29sdmVkUXVlc3Rpb25zLCBxdWVzdGlvbl0sXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIHJlc29sdmVRdWVzdGlvbihcclxuICBzdGF0ZTogU3RvcnlTdHJ1Y3R1cmVkU3RhdGUsXHJcbiAgcXVlc3Rpb246IHN0cmluZ1xyXG4pOiBTdG9yeVN0cnVjdHVyZWRTdGF0ZSB7XHJcbiAgcmV0dXJuIHtcclxuICAgIC4uLnN0YXRlLFxyXG4gICAgdW5yZXNvbHZlZFF1ZXN0aW9uczogc3RhdGUudW5yZXNvbHZlZFF1ZXN0aW9ucy5maWx0ZXIocSA9PiBxICE9PSBxdWVzdGlvbiksXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGFkZFJlY2VudEV2ZW50KFxyXG4gIHN0YXRlOiBTdG9yeVN0cnVjdHVyZWRTdGF0ZSxcclxuICBldmVudDogc3RyaW5nXHJcbik6IFN0b3J5U3RydWN0dXJlZFN0YXRlIHtcclxuICAvLyBLZWVwIG9ubHkgbGFzdCAxMCBldmVudHNcclxuICBjb25zdCByZWNlbnRFdmVudHMgPSBbLi4uc3RhdGUucmVjZW50RXZlbnRzLCBldmVudF0uc2xpY2UoLTEwKTtcclxuICByZXR1cm4ge1xyXG4gICAgLi4uc3RhdGUsXHJcbiAgICByZWNlbnRFdmVudHMsXHJcbiAgfTtcclxufVxyXG5cclxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZVRhcmdldFRlbnNpb24oXHJcbiAgY3VycmVudENoYXB0ZXI6IG51bWJlcixcclxuICB0b3RhbENoYXB0ZXJzOiBudW1iZXJcclxuKTogbnVtYmVyIHtcclxuICAvLyBQYXJhYm9saWMgdGVuc2lvbiBjdXJ2ZTogbG93IGF0IHN0YXJ0LCBoaWdoIGluIG1pZGRsZSwgcmVzb2x1dGlvbiBhdCBlbmRcclxuICBjb25zdCBwcm9ncmVzcyA9IGN1cnJlbnRDaGFwdGVyIC8gdG90YWxDaGFwdGVycztcclxuICByZXR1cm4gNCAqIHByb2dyZXNzICogKDEgLSBwcm9ncmVzcyk7XHJcbn1cclxuXHJcbmV4cG9ydCBmdW5jdGlvbiB1cGRhdGVTdG9yeVRlbnNpb24oXHJcbiAgc3RhdGU6IFN0b3J5U3RydWN0dXJlZFN0YXRlLFxyXG4gIGN1cnJlbnRDaGFwdGVyOiBudW1iZXIsXHJcbiAgdG90YWxDaGFwdGVyczogbnVtYmVyXHJcbik6IFN0b3J5U3RydWN0dXJlZFN0YXRlIHtcclxuICBjb25zdCB0YXJnZXRUZW5zaW9uID0gY2FsY3VsYXRlVGFyZ2V0VGVuc2lvbihjdXJyZW50Q2hhcHRlciwgdG90YWxDaGFwdGVycyk7XHJcbiAgXHJcbiAgLy8gQmxlbmQgY3VycmVudCB0ZW5zaW9uIHRvd2FyZCB0YXJnZXQgKHNtb290aCB0cmFuc2l0aW9uKVxyXG4gIGNvbnN0IG5ld1RlbnNpb24gPSBzdGF0ZS50ZW5zaW9uICogMC43ICsgdGFyZ2V0VGVuc2lvbiAqIDAuMztcclxuICBcclxuICByZXR1cm4ge1xyXG4gICAgLi4uc3RhdGUsXHJcbiAgICBjaGFwdGVyOiBjdXJyZW50Q2hhcHRlcixcclxuICAgIHRlbnNpb246IE1hdGgucm91bmQobmV3VGVuc2lvbiAqIDEwMCkgLyAxMDAsIC8vIFJvdW5kIHRvIDIgZGVjaW1hbHNcclxuICB9O1xyXG59XHJcblxyXG5leHBvcnQgZnVuY3Rpb24gZm9ybWF0U3RydWN0dXJlZFN0YXRlRm9yUHJvbXB0KHN0YXRlOiBTdG9yeVN0cnVjdHVyZWRTdGF0ZSk6IHN0cmluZyB7XHJcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gWycjIyBDdXJyZW50IFN0b3J5IFN0YXRlJ107XHJcbiAgXHJcbiAgLy8gT3ZlcmFsbCB0ZW5zaW9uXHJcbiAgY29uc3QgdGVuc2lvblBlcmNlbnQgPSBNYXRoLnJvdW5kKHN0YXRlLnRlbnNpb24gKiAxMDApO1xyXG4gIGxpbmVzLnB1c2goYFxcbioqU3RvcnkgVGVuc2lvbjoqKiAke3RlbnNpb25QZXJjZW50fSVgKTtcclxuICBcclxuICAvLyBBY3RpdmUgcGxvdCB0aHJlYWRzXHJcbiAgY29uc3QgYWN0aXZlVGhyZWFkcyA9IE9iamVjdC52YWx1ZXMoc3RhdGUucGxvdFRocmVhZHMpXHJcbiAgICAuZmlsdGVyKHQgPT4gdC5zdGF0dXMgIT09ICdyZXNvbHZlZCcgJiYgdC5zdGF0dXMgIT09ICdkb3JtYW50Jyk7XHJcbiAgXHJcbiAgaWYgKGFjdGl2ZVRocmVhZHMubGVuZ3RoID4gMCkge1xyXG4gICAgbGluZXMucHVzaCgnXFxuIyMjIEFjdGl2ZSBQbG90IFRocmVhZHMnKTtcclxuICAgIGZvciAoY29uc3QgdGhyZWFkIG9mIGFjdGl2ZVRocmVhZHMpIHtcclxuICAgICAgY29uc3QgdGhyZWFkVGVuc2lvbiA9IE1hdGgucm91bmQodGhyZWFkLnRlbnNpb24gKiAxMDApO1xyXG4gICAgICBsaW5lcy5wdXNoKGAtICoqJHt0aHJlYWQubmFtZX0qKiAoJHt0aHJlYWQuc3RhdHVzfSwgdGVuc2lvbjogJHt0aHJlYWRUZW5zaW9ufSUpYCk7XHJcbiAgICAgIGxpbmVzLnB1c2goYCAgLSAke3RocmVhZC5zdW1tYXJ5fWApO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICAvLyBDaGFyYWN0ZXIgc3RhdGVzXHJcbiAgY29uc3QgY2hhcmFjdGVycyA9IE9iamVjdC52YWx1ZXMoc3RhdGUuY2hhcmFjdGVycyk7XHJcbiAgaWYgKGNoYXJhY3RlcnMubGVuZ3RoID4gMCkge1xyXG4gICAgbGluZXMucHVzaCgnXFxuIyMjIENoYXJhY3RlciBTdGF0ZXMnKTtcclxuICAgIGZvciAoY29uc3QgY2hhciBvZiBjaGFyYWN0ZXJzKSB7XHJcbiAgICAgIGxpbmVzLnB1c2goYC0gKioke2NoYXIubmFtZX0qKjogJHtjaGFyLmVtb3Rpb25hbFN0YXRlfWApO1xyXG4gICAgICBpZiAoY2hhci5sb2NhdGlvbikgbGluZXMucHVzaChgICAtIExvY2F0aW9uOiAke2NoYXIubG9jYXRpb259YCk7XHJcbiAgICAgIGlmIChPYmplY3Qua2V5cyhjaGFyLnJlbGF0aW9uc2hpcHMpLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBjb25zdCByZWxzID0gT2JqZWN0LmVudHJpZXMoY2hhci5yZWxhdGlvbnNoaXBzKVxyXG4gICAgICAgICAgLm1hcCgoW25hbWUsIHN0YXR1c10pID0+IGAke25hbWV9ICgke3N0YXR1c30pYClcclxuICAgICAgICAgIC5qb2luKCcsICcpO1xyXG4gICAgICAgIGxpbmVzLnB1c2goYCAgLSBSZWxhdGlvbnNoaXBzOiAke3JlbHN9YCk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgLy8gVW5yZXNvbHZlZCBxdWVzdGlvbnNcclxuICBpZiAoc3RhdGUudW5yZXNvbHZlZFF1ZXN0aW9ucy5sZW5ndGggPiAwKSB7XHJcbiAgICBsaW5lcy5wdXNoKCdcXG4jIyMgVW5yZXNvbHZlZCBRdWVzdGlvbnMnKTtcclxuICAgIGZvciAoY29uc3QgcSBvZiBzdGF0ZS51bnJlc29sdmVkUXVlc3Rpb25zKSB7XHJcbiAgICAgIGxpbmVzLnB1c2goYC0gJHtxfWApO1xyXG4gICAgfVxyXG4gIH1cclxuICBcclxuICAvLyBSZWNlbnQgZXZlbnRzXHJcbiAgaWYgKHN0YXRlLnJlY2VudEV2ZW50cy5sZW5ndGggPiAwKSB7XHJcbiAgICBsaW5lcy5wdXNoKCdcXG4jIyMgUmVjZW50IEV2ZW50cycpO1xyXG4gICAgZm9yIChjb25zdCBldmVudCBvZiBzdGF0ZS5yZWNlbnRFdmVudHMuc2xpY2UoLTUpKSB7XHJcbiAgICAgIGxpbmVzLnB1c2goYC0gJHtldmVudH1gKTtcclxuICAgIH1cclxuICB9XHJcbiAgXHJcbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpO1xyXG59XHJcbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,104 @@
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} / ${config.model}`);
19
+ }
20
+ const index_js_1 = require("../index.js");
21
+ async function testCanonMemory() {
22
+ console.log('Testing Canon Memory System (Phase 2)...\n');
23
+ // Test 1: Canon Store Creation
24
+ console.log('Test 1: Canon Store Creation');
25
+ const canon = (0, index_js_1.createCanonStore)('test-story-123');
26
+ console.log('✅ Canon store created');
27
+ // Test 2: Adding Facts
28
+ console.log('\nTest 2: Adding Facts');
29
+ let canonWithFacts = (0, index_js_1.addFact)(canon, { category: 'character', subject: '李白', attribute: '职业', value: '诗人', chapterEstablished: 1 });
30
+ canonWithFacts = (0, index_js_1.addFact)(canonWithFacts, { category: 'character', subject: '李白', attribute: '朝代', value: '唐朝', chapterEstablished: 1 });
31
+ canonWithFacts = (0, index_js_1.addFact)(canonWithFacts, { category: 'world', subject: '长安', attribute: '地位', value: '唐朝都城', chapterEstablished: 1 });
32
+ canonWithFacts = (0, index_js_1.addFact)(canonWithFacts, { category: 'plot', subject: '主线', attribute: '目标', value: '寻找人生真谛', chapterEstablished: 1 });
33
+ console.log(`✅ Added ${canonWithFacts.facts.length} facts`);
34
+ // Use the updated canon for subsequent tests
35
+ Object.assign(canon, canonWithFacts);
36
+ // Test 3: Format Canon for Prompt
37
+ console.log('\nTest 3: Format Canon for Prompt');
38
+ const formatted = (0, index_js_1.formatCanonForPrompt)(canon);
39
+ console.log('Formatted canon:');
40
+ console.log(formatted);
41
+ console.log('✅ Canon formatted successfully');
42
+ // Test 4: Extract Canon from Bible
43
+ console.log('\nTest 4: Extract Canon from StoryBible');
44
+ const bible = (0, index_js_1.createStoryBible)('测试故事', '测试主题', '测试类型', '测试背景', '测试基调', '测试前提', 5);
45
+ const bibleWithChar = (0, index_js_1.addCharacter)(bible, '杜甫', 'protagonist', ['忧国忧民', '诗圣'], ['记录时代', '关怀百姓']);
46
+ const bibleWithPlot = (0, index_js_1.addPlotThread)(bibleWithChar, '安史之乱', '唐朝由盛转衰的转折点');
47
+ const extractedCanon = (0, index_js_1.extractCanonFromBible)(bibleWithPlot);
48
+ console.log(`✅ Extracted ${extractedCanon.facts.length} facts from bible`);
49
+ console.log('Extracted facts:');
50
+ extractedCanon.facts.forEach(f => {
51
+ console.log(` - ${f.category}: ${f.subject} / ${f.attribute} = ${f.value}`);
52
+ });
53
+ // Test 5: Canon Validation
54
+ console.log('\nTest 5: Canon Validation');
55
+ const testContent = `
56
+ 杜甫是唐朝著名的诗人,被称为"诗圣"。
57
+ 他生活在安史之乱时期,目睹了唐朝的衰落。
58
+ 杜甫非常关心百姓疾苦,写下了许多反映社会现实的诗篇。
59
+ `;
60
+ const validation = await index_js_1.canonValidator.validate(testContent, extractedCanon);
61
+ console.log(`✅ Validation complete`);
62
+ console.log(`Violations found: ${validation.violations.length}`);
63
+ if (validation.violations.length > 0) {
64
+ console.log('Violations:');
65
+ validation.violations.forEach(v => console.log(` - ${v}`));
66
+ }
67
+ // Test 6: Canon Serialization
68
+ console.log('\nTest 6: Canon Serialization');
69
+ const serialized = JSON.stringify(canon, null, 2);
70
+ const deserialized = JSON.parse(serialized);
71
+ console.log(`✅ Serialization round-trip successful`);
72
+ console.log(`Original facts: ${canon.facts.length}, Deserialized: ${deserialized.facts.length}`);
73
+ console.log('\n✅ All Canon Memory tests passed!');
74
+ }
75
+ // Test 7: Detect Contradiction
76
+ async function testContradictionDetection() {
77
+ console.log('\n--- Testing Contradiction Detection ---\n');
78
+ let canon = (0, index_js_1.createCanonStore)('contradiction-test');
79
+ canon = (0, index_js_1.addFact)(canon, { category: 'character', subject: '李白', attribute: '状态', value: '活着', chapterEstablished: 1 });
80
+ canon = (0, index_js_1.addFact)(canon, { category: 'world', subject: '唐朝', attribute: '时期', value: '盛世', chapterEstablished: 1 });
81
+ // Content that contradicts canon
82
+ const contradictingContent = `
83
+ 李白已经去世多年,他的诗歌流传千古。
84
+ 唐朝正处于战乱之中,百姓流离失所。
85
+ `;
86
+ console.log('Canon facts:');
87
+ canon.facts.forEach(f => console.log(` - ${f.subject}: ${f.attribute} = ${f.value}`));
88
+ console.log('\nContent to validate:');
89
+ console.log(contradictingContent);
90
+ const validation = await index_js_1.canonValidator.validate(contradictingContent, canon);
91
+ console.log(`\nViolations detected: ${validation.violations.length}`);
92
+ validation.violations.forEach(v => console.log(` ⚠️ ${v}`));
93
+ }
94
+ testCanonMemory()
95
+ .then(() => testContradictionDetection())
96
+ .then(() => {
97
+ console.log('\n🎉 Phase 2 (Canon Memory) tests complete!');
98
+ process.exit(0);
99
+ })
100
+ .catch((error) => {
101
+ console.error('\n❌ Test failed:', error);
102
+ process.exit(1);
103
+ });
104
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2Fub24udGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy90ZXN0L2Nhbm9uLnRlc3QudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7QUFBQSwyQkFBOEM7QUFDOUMsK0JBQTRCO0FBQzVCLDJCQUE2QjtBQUU3QixzQ0FBc0M7QUFDdEMsTUFBTSxVQUFVLEdBQUcsSUFBQSxXQUFJLEVBQUMsSUFBQSxZQUFPLEdBQUUsRUFBRSxlQUFlLEVBQUUsYUFBYSxDQUFDLENBQUM7QUFDbkUsSUFBSSxJQUFBLGVBQVUsRUFBQyxVQUFVLENBQUMsRUFBRSxDQUFDO0lBQzNCLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBQSxpQkFBWSxFQUFDLFVBQVUsRUFBRSxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQzdELE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxHQUFHLE1BQU0sQ0FBQyxRQUFRLENBQUM7SUFDM0MsT0FBTyxDQUFDLEdBQUcsQ0FBQyxTQUFTLEdBQUcsZUFBZSxDQUFDO0lBQ3hDLElBQUksTUFBTSxDQUFDLFFBQVEsS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUNqQyxPQUFPLENBQUMsR0FBRyxDQUFDLGNBQWMsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQzdDLENBQUM7U0FBTSxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssVUFBVSxFQUFFLENBQUM7UUFDMUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxnQkFBZ0IsR0FBRyxNQUFNLENBQUMsTUFBTSxDQUFDO0lBQy9DLENBQUM7SUFDRCxPQUFPLENBQUMsR0FBRyxDQUFDLGtCQUFrQixNQUFNLENBQUMsUUFBUSxNQUFNLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0FBQ3JFLENBQUM7QUFFRCwwQ0FTcUI7QUFHckIsS0FBSyxVQUFVLGVBQWU7SUFDNUIsT0FBTyxDQUFDLEdBQUcsQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFDO0lBRTFELCtCQUErQjtJQUMv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QUM7SUFFbEMsTUFBTSxVQUFVLEdBQUcsTUFBTSx5QkFBYyxDQUFDLFFBQVEsQ0FBQyxvQkFBb0IsRUFBRSxLQUFLLENBQUMsQ0FBQztJQUM5RSxPQUFPLENBQUMsR0FBRyxDQUFDLDBCQUEwQixVQUFVLENBQUMsVUFBVSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUM7SUFDdEUsVUFBVSxDQUFDLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO0FBQ2hFLENBQUM7QUFFRCxlQUFlLEVBQUU7S0FDZCxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsMEJBQTBCLEVBQUUsQ0FBQztLQUN4QyxJQUFJLENBQUMsR0FBRyxFQUFFO0lBQ1QsT0FBTyxDQUFDLEdBQUcsQ0FBQyw2Q0FBNkMsQ0FBQyxDQUFDO0lBQzNELE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDO0tBQ0QsS0FBSyxDQUFDLENBQUMsS0FBSyxFQUFFLEVBQUU7SUFDZixPQUFPLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3pDLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7QUFDbEIsQ0FBQyxDQUFDLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyByZWFkRmlsZVN5bmMsIGV4aXN0c1N5bmMgfSBmcm9tICdmcyc7XHJcbmltcG9ydCB7IGpvaW4gfSBmcm9tICdwYXRoJztcclxuaW1wb3J0IHsgaG9tZWRpciB9IGZyb20gJ29zJztcclxuXHJcbi8vIExvYWQgY29uZmlnIEJFRk9SRSBpbXBvcnRpbmcgZW5naW5lXHJcbmNvbnN0IGNvbmZpZ1BhdGggPSBqb2luKGhvbWVkaXIoKSwgJy5uYXJyYXRpdmUtb3MnLCAnY29uZmlnLmpzb24nKTtcclxuaWYgKGV4aXN0c1N5bmMoY29uZmlnUGF0aCkpIHtcclxuICBjb25zdCBjb25maWcgPSBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhjb25maWdQYXRoLCAndXRmLTgnKSk7XHJcbiAgcHJvY2Vzcy5lbnYuTExNX1BST1ZJREVSID0gY29uZmlnLnByb3ZpZGVyO1xyXG4gIHByb2Nlc3MuZW52LkxMTV9NT0RFTCA9ICdkZWVwc2Vlay1jaGF0JztcclxuICBpZiAoY29uZmlnLnByb3ZpZGVyID09PSAnb3BlbmFpJykge1xyXG4gICAgcHJvY2Vzcy5lbnYuT1BFTkFJX0FQSV9LRVkgPSBjb25maWcuYXBpS2V5O1xyXG4gIH0gZWxzZSBpZiAoY29uZmlnLnByb3ZpZGVyID09PSAnZGVlcHNlZWsnKSB7XHJcbiAgICBwcm9jZXNzLmVudi5ERUVQU0VFS19BUElfS0VZID0gY29uZmlnLmFwaUtleTtcclxuICB9XHJcbiAgY29uc29sZS5sb2coYExvYWRlZCBjb25maWc6ICR7Y29uZmlnLnByb3ZpZGVyfSAvICR7Y29uZmlnLm1vZGVsfWApO1xyXG59XHJcblxyXG5pbXBvcnQge1xyXG4gIGNyZWF0ZUNhbm9uU3RvcmUsXHJcbiAgYWRkRmFjdCxcclxuICBmb3JtYXRDYW5vbkZvclByb21wdCxcclxuICBleHRyYWN0Q2Fub25Gcm9tQmlibGUsXHJcbiAgY3JlYXRlU3RvcnlCaWJsZSxcclxuICBhZGRDaGFyYWN0ZXIsXHJcbiAgYWRkUGxvdFRocmVhZCxcclxuICBjYW5vblZhbGlkYXRvcixcclxufSBmcm9tICcuLi9pbmRleC5qcyc7XHJcbmltcG9ydCB0eXBlIHsgQ2Fub25TdG9yZSwgU3RvcnlCaWJsZSB9IGZyb20gJy4uL2luZGV4LmpzJztcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIHRlc3RDYW5vbk1lbW9yeSgpIHtcclxuICBjb25zb2xlLmxvZygnVGVzdGluZyBDYW5vbiBNZW1vcnkgU3lzdGVtIChQaGFzZSAyKS4uLlxcbicpO1xyXG5cclxuICAvLyBUZXN0IDE6IENhbm9uIFN0b3JlIENyZWF0aW9uXHJcbiAgY29uc29sZS5sb2coJ1Rlc3QgMTogQ2Fub24gU3RvcmUgQ3JlYXRpb24nKTtcclxuICBjb25zdCBjYW5vbiA9IGNyZWF0ZUNhbm9uU3RvcmUoJ3Rlc3Qtc3RvcnktMTIzJyk7XHJcbiAgY29uc29sZS5sb2coJ+KchSBDYW5vbiBzdG9yZSBjcmVhdGVkJyk7XHJcblxyXG4gIC8vIFRlc3QgMjogQWRkaW5nIEZhY3RzXHJcbiAgY29uc29sZS5sb2coJ1xcblRlc3QgMjogQWRkaW5nIEZhY3RzJyk7XHJcbiAgbGV0IGNhbm9uV2l0aEZhY3RzID0gYWRkRmFjdChjYW5vbiwgeyBjYXRlZ29yeTogJ2NoYXJhY3RlcicsIHN1YmplY3Q6ICfmnY7nmb0nLCBhdHRyaWJ1dGU6ICfogYzkuJonLCB2YWx1ZTogJ+ivl+S6uicsIGNoYXB0ZXJFc3RhYmxpc2hlZDogMSB9KTtcclxuICBjYW5vbldpdGhGYWN0cyA9IGFkZEZhY3QoY2Fub25XaXRoRmFjdHMsIHsgY2F0ZWdvcnk6ICdjaGFyYWN0ZXInLCBzdWJqZWN0OiAn5p2O55m9JywgYXR0cmlidXRlOiAn5pyd5LujJywgdmFsdWU6ICfllJDmnJ0nLCBjaGFwdGVyRXN0YWJsaXNoZWQ6IDEgfSk7XHJcbiAgY2Fub25XaXRoRmFjdHMgPSBhZGRGYWN0KGNhbm9uV2l0aEZhY3RzLCB7IGNhdGVnb3J5OiAnd29ybGQnLCBzdWJqZWN0OiAn6ZW/5a6JJywgYXR0cmlidXRlOiAn5Zyw5L2NJywgdmFsdWU6ICfllJDmnJ3pg73ln44nLCBjaGFwdGVyRXN0YWJsaXNoZWQ6IDEgfSk7XHJcbiAgY2Fub25XaXRoRmFjdHMgPSBhZGRGYWN0KGNhbm9uV2l0aEZhY3RzLCB7IGNhdGVnb3J5OiAncGxvdCcsIHN1YmplY3Q6ICfkuLvnur8nLCBhdHRyaWJ1dGU6ICfnm67moIcnLCB2YWx1ZTogJ+Wvu+aJvuS6uueUn+ecn+iwmycsIGNoYXB0ZXJFc3RhYmxpc2hlZDogMSB9KTtcclxuICBjb25zb2xlLmxvZyhg4pyFIEFkZGVkICR7Y2Fub25XaXRoRmFjdHMuZmFjdHMubGVuZ3RofSBmYWN0c2ApO1xyXG4gIFxyXG4gIC8vIFVzZSB0aGUgdXBkYXRlZCBjYW5vbiBmb3Igc3Vic2VxdWVudCB0ZXN0c1xyXG4gIE9iamVjdC5hc3NpZ24oY2Fub24sIGNhbm9uV2l0aEZhY3RzKTtcclxuXHJcbiAgLy8gVGVzdCAzOiBGb3JtYXQgQ2Fub24gZm9yIFByb21wdFxyXG4gIGNvbnNvbGUubG9nKCdcXG5UZXN0IDM6IEZvcm1hdCBDYW5vbiBmb3IgUHJvbXB0Jyk7XHJcbiAgY29uc3QgZm9ybWF0dGVkID0gZm9ybWF0Q2Fub25Gb3JQcm9tcHQoY2Fub24pO1xyXG4gIGNvbnNvbGUubG9nKCdGb3JtYXR0ZWQgY2Fub246Jyk7XHJcbiAgY29uc29sZS5sb2coZm9ybWF0dGVkKTtcclxuICBjb25zb2xlLmxvZygn4pyFIENhbm9uIGZvcm1hdHRlZCBzdWNjZXNzZnVsbHknKTtcclxuXHJcbiAgLy8gVGVzdCA0OiBFeHRyYWN0IENhbm9uIGZyb20gQmlibGVcclxuICBjb25zb2xlLmxvZygnXFxuVGVzdCA0OiBFeHRyYWN0IENhbm9uIGZyb20gU3RvcnlCaWJsZScpO1xyXG4gIGNvbnN0IGJpYmxlID0gY3JlYXRlU3RvcnlCaWJsZShcclxuICAgICfmtYvor5XmlYXkuosnLFxyXG4gICAgJ+a1i+ivleS4u+mimCcsXHJcbiAgICAn5rWL6K+V57G75Z6LJyxcclxuICAgICfmtYvor5Xog4zmma8nLFxyXG4gICAgJ+a1i+ivleWfuuiwgycsXHJcbiAgICAn5rWL6K+V5YmN5o+QJyxcclxuICAgIDVcclxuICApO1xyXG5cclxuICBjb25zdCBiaWJsZVdpdGhDaGFyID0gYWRkQ2hhcmFjdGVyKFxyXG4gICAgYmlibGUsXHJcbiAgICAn5p2c55SrJyxcclxuICAgICdwcm90YWdvbmlzdCcsXHJcbiAgICBbJ+W/p+WbveW/p+awkScsICfor5flnKMnXSxcclxuICAgIFsn6K6w5b2V5pe25LujJywgJ+WFs+aAgOeZvuWnkyddXHJcbiAgKTtcclxuXHJcbiAgY29uc3QgYmlibGVXaXRoUGxvdCA9IGFkZFBsb3RUaHJlYWQoXHJcbiAgICBiaWJsZVdpdGhDaGFyLFxyXG4gICAgJ+WuieWPsuS5i+S5sScsXHJcbiAgICAn5ZSQ5pyd55Sx55ub6L2s6KGw55qE6L2s5oqY54K5J1xyXG4gICk7XHJcblxyXG4gIGNvbnN0IGV4dHJhY3RlZENhbm9uID0gZXh0cmFjdENhbm9uRnJvbUJpYmxlKGJpYmxlV2l0aFBsb3QpO1xyXG4gIGNvbnNvbGUubG9nKGDinIUgRXh0cmFjdGVkICR7ZXh0cmFjdGVkQ2Fub24uZmFjdHMubGVuZ3RofSBmYWN0cyBmcm9tIGJpYmxlYCk7XHJcbiAgY29uc29sZS5sb2coJ0V4dHJhY3RlZCBmYWN0czonKTtcclxuICBleHRyYWN0ZWRDYW5vbi5mYWN0cy5mb3JFYWNoKGYgPT4ge1xyXG4gICAgY29uc29sZS5sb2coYCAgLSAke2YuY2F0ZWdvcnl9OiAke2Yuc3ViamVjdH0gLyAke2YuYXR0cmlidXRlfSA9ICR7Zi52YWx1ZX1gKTtcclxuICB9KTtcclxuXHJcbiAgLy8gVGVzdCA1OiBDYW5vbiBWYWxpZGF0aW9uXHJcbiAgY29uc29sZS5sb2coJ1xcblRlc3QgNTogQ2Fub24gVmFsaWRhdGlvbicpO1xyXG4gIGNvbnN0IHRlc3RDb250ZW50ID0gYFxyXG7mnZznlKvmmK/llJDmnJ3okZflkI3nmoTor5fkurrvvIzooqvnp7DkuLpcIuivl+Wco1wi44CCXHJcbuS7lueUn+a0u+WcqOWuieWPsuS5i+S5seaXtuacn++8jOebruedueS6huWUkOacneeahOihsOiQveOAglxyXG7mnZznlKvpnZ7luLjlhbPlv4Pnmb7lp5Pnlr7oi6bvvIzlhpnkuIvkuoborrjlpJrlj43mmKDnpL7kvJrnjrDlrp7nmoTor5fnr4fjgIJcclxuYDtcclxuXHJcbiAgY29uc3QgdmFsaWRhdGlvbiA9IGF3YWl0IGNhbm9uVmFsaWRhdG9yLnZhbGlkYXRlKHRlc3RDb250ZW50LCBleHRyYWN0ZWRDYW5vbik7XHJcbiAgY29uc29sZS5sb2coYOKchSBWYWxpZGF0aW9uIGNvbXBsZXRlYCk7XHJcbiAgY29uc29sZS5sb2coYFZpb2xhdGlvbnMgZm91bmQ6ICR7dmFsaWRhdGlvbi52aW9sYXRpb25zLmxlbmd0aH1gKTtcclxuICBpZiAodmFsaWRhdGlvbi52aW9sYXRpb25zLmxlbmd0aCA+IDApIHtcclxuICAgIGNvbnNvbGUubG9nKCdWaW9sYXRpb25zOicpO1xyXG4gICAgdmFsaWRhdGlvbi52aW9sYXRpb25zLmZvckVhY2godiA9PiBjb25zb2xlLmxvZyhgICAtICR7dn1gKSk7XHJcbiAgfVxyXG5cclxuICAvLyBUZXN0IDY6IENhbm9uIFNlcmlhbGl6YXRpb25cclxuICBjb25zb2xlLmxvZygnXFxuVGVzdCA2OiBDYW5vbiBTZXJpYWxpemF0aW9uJyk7XHJcbiAgY29uc3Qgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KGNhbm9uLCBudWxsLCAyKTtcclxuICBjb25zdCBkZXNlcmlhbGl6ZWQ6IENhbm9uU3RvcmUgPSBKU09OLnBhcnNlKHNlcmlhbGl6ZWQpO1xyXG4gIGNvbnNvbGUubG9nKGDinIUgU2VyaWFsaXphdGlvbiByb3VuZC10cmlwIHN1Y2Nlc3NmdWxgKTtcclxuICBjb25zb2xlLmxvZyhgT3JpZ2luYWwgZmFjdHM6ICR7Y2Fub24uZmFjdHMubGVuZ3RofSwgRGVzZXJpYWxpemVkOiAke2Rlc2VyaWFsaXplZC5mYWN0cy5sZW5ndGh9YCk7XHJcblxyXG4gIGNvbnNvbGUubG9nKCdcXG7inIUgQWxsIENhbm9uIE1lbW9yeSB0ZXN0cyBwYXNzZWQhJyk7XHJcbn1cclxuXHJcbi8vIFRlc3QgNzogRGV0ZWN0IENvbnRyYWRpY3Rpb25cclxuYXN5bmMgZnVuY3Rpb24gdGVzdENvbnRyYWRpY3Rpb25EZXRlY3Rpb24oKSB7XHJcbiAgY29uc29sZS5sb2coJ1xcbi0tLSBUZXN0aW5nIENvbnRyYWRpY3Rpb24gRGV0ZWN0aW9uIC0tLVxcbicpO1xyXG5cclxuICBsZXQgY2Fub24gPSBjcmVhdGVDYW5vblN0b3JlKCdjb250cmFkaWN0aW9uLXRlc3QnKTtcclxuICBjYW5vbiA9IGFkZEZhY3QoY2Fub24sIHsgY2F0ZWdvcnk6ICdjaGFyYWN0ZXInLCBzdWJqZWN0OiAn5p2O55m9JywgYXR0cmlidXRlOiAn54q25oCBJywgdmFsdWU6ICfmtLvnnYAnLCBjaGFwdGVyRXN0YWJsaXNoZWQ6IDEgfSk7XHJcbiAgY2Fub24gPSBhZGRGYWN0KGNhbm9uLCB7IGNhdGVnb3J5OiAnd29ybGQnLCBzdWJqZWN0OiAn5ZSQ5pydJywgYXR0cmlidXRlOiAn5pe25pyfJywgdmFsdWU6ICfnm5vkuJYnLCBjaGFwdGVyRXN0YWJsaXNoZWQ6IDEgfSk7XHJcblxyXG4gIC8vIENvbnRlbnQgdGhhdCBjb250cmFkaWN0cyBjYW5vblxyXG4gIGNvbnN0IGNvbnRyYWRpY3RpbmdDb250ZW50ID0gYFxyXG7mnY7nmb3lt7Lnu4/ljrvkuJblpJrlubTvvIzku5bnmoTor5fmrYzmtYHkvKDljYPlj6TjgIJcclxu5ZSQ5pyd5q2j5aSE5LqO5oiY5Lmx5LmL5Lit77yM55m+5aeT5rWB56a75aSx5omA44CCXHJcbmA7XHJcblxyXG4gIGNvbnNvbGUubG9nKCdDYW5vbiBmYWN0czonKTtcclxuICBjYW5vbi5mYWN0cy5mb3JFYWNoKGYgPT4gY29uc29sZS5sb2coYCAgLSAke2Yuc3ViamVjdH06ICR7Zi5hdHRyaWJ1dGV9ID0gJHtmLnZhbHVlfWApKTtcclxuXHJcbiAgY29uc29sZS5sb2coJ1xcbkNvbnRlbnQgdG8gdmFsaWRhdGU6Jyk7XHJcbiAgY29uc29sZS5sb2coY29udHJhZGljdGluZ0NvbnRlbnQpO1xyXG5cclxuICBjb25zdCB2YWxpZGF0aW9uID0gYXdhaXQgY2Fub25WYWxpZGF0b3IudmFsaWRhdGUoY29udHJhZGljdGluZ0NvbnRlbnQsIGNhbm9uKTtcclxuICBjb25zb2xlLmxvZyhgXFxuVmlvbGF0aW9ucyBkZXRlY3RlZDogJHt2YWxpZGF0aW9uLnZpb2xhdGlvbnMubGVuZ3RofWApO1xyXG4gIHZhbGlkYXRpb24udmlvbGF0aW9ucy5mb3JFYWNoKHYgPT4gY29uc29sZS5sb2coYCAg4pqg77iPICAke3Z9YCkpO1xyXG59XHJcblxyXG50ZXN0Q2Fub25NZW1vcnkoKVxyXG4gIC50aGVuKCgpID0+IHRlc3RDb250cmFkaWN0aW9uRGV0ZWN0aW9uKCkpXHJcbiAgLnRoZW4oKCkgPT4ge1xyXG4gICAgY29uc29sZS5sb2coJ1xcbvCfjokgUGhhc2UgMiAoQ2Fub24gTWVtb3J5KSB0ZXN0cyBjb21wbGV0ZSEnKTtcclxuICAgIHByb2Nlc3MuZXhpdCgwKTtcclxuICB9KVxyXG4gIC5jYXRjaCgoZXJyb3IpID0+IHtcclxuICAgIGNvbnNvbGUuZXJyb3IoJ1xcbuKdjCBUZXN0IGZhaWxlZDonLCBlcnJvcik7XHJcbiAgICBwcm9jZXNzLmV4aXQoMSk7XHJcbiAgfSk7XHJcbiJdfQ==
@@ -0,0 +1 @@
1
+ export {};