@echoes-io/mcp-server 7.1.1 → 8.0.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/README.md +1 -1
- package/cli/program.d.ts.map +1 -1
- package/cli/program.js +5 -5
- package/cli/program.js.map +1 -1
- package/lib/constants.d.ts +0 -3
- package/lib/constants.d.ts.map +1 -1
- package/lib/constants.js +1 -7
- package/lib/constants.js.map +1 -1
- package/lib/rag/index.d.ts +13 -0
- package/lib/rag/index.d.ts.map +1 -0
- package/lib/rag/index.js +54 -0
- package/lib/rag/index.js.map +1 -0
- package/lib/rag/parser.d.ts +8 -0
- package/lib/rag/parser.d.ts.map +1 -0
- package/lib/rag/parser.js +39 -0
- package/lib/rag/parser.js.map +1 -0
- package/lib/rag/schema.d.ts +6 -0
- package/lib/rag/schema.d.ts.map +1 -0
- package/lib/rag/schema.js +49 -0
- package/lib/rag/schema.js.map +1 -0
- package/lib/tools/consistency/index.d.ts +1 -1
- package/lib/tools/consistency/rules/entity-duplicate.d.ts.map +1 -1
- package/lib/tools/consistency/rules/entity-duplicate.js +3 -5
- package/lib/tools/consistency/rules/entity-duplicate.js.map +1 -1
- package/lib/tools/consistency/rules/first-time-content.d.ts.map +1 -1
- package/lib/tools/consistency/rules/first-time-content.js +7 -2
- package/lib/tools/consistency/rules/first-time-content.js.map +1 -1
- package/lib/tools/consistency/rules/relation-jump.d.ts.map +1 -1
- package/lib/tools/consistency/rules/relation-jump.js +11 -8
- package/lib/tools/consistency/rules/relation-jump.js.map +1 -1
- package/lib/tools/consistency/types.d.ts.map +1 -1
- package/lib/tools/graph-export.d.ts +1 -2
- package/lib/tools/graph-export.d.ts.map +1 -1
- package/lib/tools/graph-export.js +49 -116
- package/lib/tools/graph-export.js.map +1 -1
- package/lib/tools/history.d.ts +1 -1
- package/lib/tools/history.d.ts.map +1 -1
- package/lib/tools/history.js +43 -55
- package/lib/tools/history.js.map +1 -1
- package/lib/tools/index.d.ts +7 -2
- package/lib/tools/index.d.ts.map +1 -1
- package/lib/tools/index.js +28 -4
- package/lib/tools/index.js.map +1 -1
- package/lib/tools/list.d.ts +1 -1
- package/lib/tools/list.d.ts.map +1 -1
- package/lib/tools/list.js +35 -30
- package/lib/tools/list.js.map +1 -1
- package/lib/tools/review-apply.d.ts.map +1 -1
- package/lib/tools/review-apply.js +49 -207
- package/lib/tools/review-apply.js.map +1 -1
- package/lib/tools/review-generate.d.ts.map +1 -1
- package/lib/tools/review-generate.js +44 -55
- package/lib/tools/review-generate.js.map +1 -1
- package/lib/tools/review-status.d.ts +12 -17
- package/lib/tools/review-status.d.ts.map +1 -1
- package/lib/tools/review-status.js +21 -33
- package/lib/tools/review-status.js.map +1 -1
- package/lib/tools/search.d.ts +1 -1
- package/lib/tools/search.d.ts.map +1 -1
- package/lib/tools/search.js +62 -44
- package/lib/tools/search.js.map +1 -1
- package/lib/tools/stats.d.ts.map +1 -1
- package/lib/tools/stats.js +43 -7
- package/lib/tools/stats.js.map +1 -1
- package/lib/types.d.ts.map +1 -1
- package/package.json +8 -6
- package/lib/database/index.d.ts +0 -36
- package/lib/database/index.d.ts.map +0 -1
- package/lib/database/index.js +0 -287
- package/lib/database/index.js.map +0 -1
- package/lib/database/schemas.d.ts +0 -55
- package/lib/database/schemas.d.ts.map +0 -1
- package/lib/database/schemas.js +0 -78
- package/lib/database/schemas.js.map +0 -1
- package/lib/indexer/embeddings.d.ts +0 -10
- package/lib/indexer/embeddings.d.ts.map +0 -1
- package/lib/indexer/embeddings.js +0 -64
- package/lib/indexer/embeddings.js.map +0 -1
- package/lib/indexer/extractor.d.ts +0 -81
- package/lib/indexer/extractor.d.ts.map +0 -1
- package/lib/indexer/extractor.js +0 -68
- package/lib/indexer/extractor.js.map +0 -1
- package/lib/indexer/scanner.d.ts +0 -8
- package/lib/indexer/scanner.d.ts.map +0 -1
- package/lib/indexer/scanner.js +0 -73
- package/lib/indexer/scanner.js.map +0 -1
- package/lib/indexer/tasks.d.ts +0 -32
- package/lib/indexer/tasks.d.ts.map +0 -1
- package/lib/indexer/tasks.js +0 -235
- package/lib/indexer/tasks.js.map +0 -1
package/lib/indexer/extractor.js
DELETED
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
import { GoogleGenAI } from '@google/genai';
|
|
2
|
-
import { z } from 'zod';
|
|
3
|
-
import { ENTITY_TYPES, RELATION_TYPES } from '../database/schemas.js';
|
|
4
|
-
// Zod schemas for extraction
|
|
5
|
-
const ExtractedEntitySchema = z.object({
|
|
6
|
-
name: z.string().describe('The canonical name of the entity'),
|
|
7
|
-
type: z.enum(ENTITY_TYPES).describe('The type of entity'),
|
|
8
|
-
description: z.string().describe('A brief description of the entity in context'),
|
|
9
|
-
aliases: z.array(z.string()).describe('Alternative names or nicknames'),
|
|
10
|
-
});
|
|
11
|
-
const ExtractedRelationSchema = z.object({
|
|
12
|
-
source: z.string().describe('Name of the source entity'),
|
|
13
|
-
target: z.string().describe('Name of the target entity'),
|
|
14
|
-
type: z.enum(RELATION_TYPES).describe('The type of relationship'),
|
|
15
|
-
description: z.string().describe('A brief description of the relationship'),
|
|
16
|
-
});
|
|
17
|
-
const ExtractionResultSchema = z.object({
|
|
18
|
-
entities: z.array(ExtractedEntitySchema),
|
|
19
|
-
relations: z.array(ExtractedRelationSchema),
|
|
20
|
-
});
|
|
21
|
-
const EXTRACTION_PROMPT = `Analyze the following narrative text and extract:
|
|
22
|
-
|
|
23
|
-
1. ENTITIES: Characters, locations, events, objects, and emotions that are significant to the story.
|
|
24
|
-
- Use the character's most common name as the canonical name
|
|
25
|
-
- Include nicknames and alternative names as aliases
|
|
26
|
-
- Provide a brief description based on what's revealed in this text
|
|
27
|
-
|
|
28
|
-
2. RELATIONS: Relationships between entities.
|
|
29
|
-
- Only include relationships that are explicitly shown or strongly implied
|
|
30
|
-
- Use the canonical entity names for source and target
|
|
31
|
-
|
|
32
|
-
Focus on narrative-relevant information. Be concise but accurate.
|
|
33
|
-
|
|
34
|
-
TEXT:
|
|
35
|
-
`;
|
|
36
|
-
let client = null;
|
|
37
|
-
function getClient() {
|
|
38
|
-
if (client)
|
|
39
|
-
return client;
|
|
40
|
-
const apiKey = process.env.GEMINI_API_KEY;
|
|
41
|
-
if (!apiKey) {
|
|
42
|
-
throw new Error('GEMINI_API_KEY environment variable is required');
|
|
43
|
-
}
|
|
44
|
-
client = new GoogleGenAI({ apiKey });
|
|
45
|
-
return client;
|
|
46
|
-
}
|
|
47
|
-
const DEFAULT_MODEL = 'gemini-2.5-flash';
|
|
48
|
-
export async function extractEntities(content, config) {
|
|
49
|
-
const ai = getClient();
|
|
50
|
-
const model = config?.model ?? process.env.ECHOES_GEMINI_MODEL ?? DEFAULT_MODEL;
|
|
51
|
-
const response = await ai.models.generateContent({
|
|
52
|
-
model,
|
|
53
|
-
contents: EXTRACTION_PROMPT + content,
|
|
54
|
-
config: {
|
|
55
|
-
responseMimeType: 'application/json',
|
|
56
|
-
responseJsonSchema: z.toJSONSchema(ExtractionResultSchema),
|
|
57
|
-
},
|
|
58
|
-
});
|
|
59
|
-
const text = response.text;
|
|
60
|
-
if (!text) {
|
|
61
|
-
return { entities: [], relations: [] };
|
|
62
|
-
}
|
|
63
|
-
return ExtractionResultSchema.parse(JSON.parse(text));
|
|
64
|
-
}
|
|
65
|
-
export function resetClient() {
|
|
66
|
-
client = null;
|
|
67
|
-
}
|
|
68
|
-
//# sourceMappingURL=extractor.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"extractor.js","sourceRoot":"","sources":["extractor.ts"],"names":[],"mappings":"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"}
|
package/lib/indexer/scanner.d.ts
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import type { ScannedChapter } from '../database/schemas.js';
|
|
2
|
-
export interface ScanResult {
|
|
3
|
-
chapters: ScannedChapter[];
|
|
4
|
-
arcs: string[];
|
|
5
|
-
}
|
|
6
|
-
export declare function scanChapter(filePath: string, basePath: string): ScannedChapter;
|
|
7
|
-
export declare function scanTimeline(contentPath: string, arcFilter?: string): ScanResult;
|
|
8
|
-
//# sourceMappingURL=scanner.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.d.ts","sourceRoot":"","sources":["scanner.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AAG7D,MAAM,WAAW,UAAU;IACzB,QAAQ,EAAE,cAAc,EAAE,CAAC;IAC3B,IAAI,EAAE,MAAM,EAAE,CAAC;CAChB;AAqBD,wBAAgB,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,cAAc,CAyB9E;AAED,wBAAgB,YAAY,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,CAAC,EAAE,MAAM,GAAG,UAAU,CA4BhF"}
|
package/lib/indexer/scanner.js
DELETED
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
import { createHash } from 'node:crypto';
|
|
2
|
-
import { readdirSync, readFileSync } from 'node:fs';
|
|
3
|
-
import { join, relative } from 'node:path';
|
|
4
|
-
import { parseChapter } from '../utils.js';
|
|
5
|
-
function computeHash(content) {
|
|
6
|
-
return createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
7
|
-
}
|
|
8
|
-
function scanDirectory(dir, pattern) {
|
|
9
|
-
const files = [];
|
|
10
|
-
for (const entry of readdirSync(dir, { withFileTypes: true })) {
|
|
11
|
-
const fullPath = join(dir, entry.name);
|
|
12
|
-
if (entry.isDirectory()) {
|
|
13
|
-
files.push(...scanDirectory(fullPath, pattern));
|
|
14
|
-
}
|
|
15
|
-
else if (entry.isFile() && pattern.test(entry.name)) {
|
|
16
|
-
files.push(fullPath);
|
|
17
|
-
}
|
|
18
|
-
}
|
|
19
|
-
return files;
|
|
20
|
-
}
|
|
21
|
-
export function scanChapter(filePath, basePath) {
|
|
22
|
-
const raw = readFileSync(filePath, 'utf-8');
|
|
23
|
-
const { metadata, content, stats } = parseChapter(raw);
|
|
24
|
-
if (!metadata.arc || !metadata.episode || !metadata.chapter || !metadata.pov || !metadata.title) {
|
|
25
|
-
throw new Error(`Missing required frontmatter in ${filePath}`);
|
|
26
|
-
}
|
|
27
|
-
return {
|
|
28
|
-
id: `${metadata.arc}:${metadata.episode}:${metadata.chapter}`,
|
|
29
|
-
file_path: relative(basePath, filePath),
|
|
30
|
-
file_hash: computeHash(raw),
|
|
31
|
-
arc: metadata.arc,
|
|
32
|
-
episode: metadata.episode,
|
|
33
|
-
chapter: metadata.chapter,
|
|
34
|
-
pov: metadata.pov,
|
|
35
|
-
title: metadata.title,
|
|
36
|
-
location: metadata.location ?? '',
|
|
37
|
-
date: metadata.date ?? '',
|
|
38
|
-
summary: metadata.summary ?? '',
|
|
39
|
-
content,
|
|
40
|
-
word_count: stats.wordCount,
|
|
41
|
-
char_count: stats.charCount,
|
|
42
|
-
paragraph_count: stats.paragraphCount,
|
|
43
|
-
};
|
|
44
|
-
}
|
|
45
|
-
export function scanTimeline(contentPath, arcFilter) {
|
|
46
|
-
const files = scanDirectory(contentPath, /\.md$/);
|
|
47
|
-
const chapters = [];
|
|
48
|
-
const arcsSet = new Set();
|
|
49
|
-
for (const file of files) {
|
|
50
|
-
try {
|
|
51
|
-
const chapter = scanChapter(file, contentPath);
|
|
52
|
-
if (arcFilter && chapter.arc !== arcFilter)
|
|
53
|
-
continue;
|
|
54
|
-
chapters.push(chapter);
|
|
55
|
-
arcsSet.add(chapter.arc);
|
|
56
|
-
}
|
|
57
|
-
catch {
|
|
58
|
-
// Skip files that fail to parse
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
chapters.sort((a, b) => {
|
|
62
|
-
if (a.arc !== b.arc)
|
|
63
|
-
return a.arc.localeCompare(b.arc);
|
|
64
|
-
if (a.episode !== b.episode)
|
|
65
|
-
return a.episode - b.episode;
|
|
66
|
-
return a.chapter - b.chapter;
|
|
67
|
-
});
|
|
68
|
-
return {
|
|
69
|
-
chapters,
|
|
70
|
-
arcs: [...arcsSet].sort(),
|
|
71
|
-
};
|
|
72
|
-
}
|
|
73
|
-
//# sourceMappingURL=scanner.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"scanner.js","sourceRoot":"","sources":["scanner.ts"],"names":[],"mappings":"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"}
|
package/lib/indexer/tasks.d.ts
DELETED
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { Database } from '../database/index.js';
|
|
2
|
-
import type { EntityRecord, RelationRecord, ScannedChapter } from '../database/schemas.js';
|
|
3
|
-
export interface IndexTasksInput {
|
|
4
|
-
contentPath: string;
|
|
5
|
-
arc?: string;
|
|
6
|
-
force?: boolean;
|
|
7
|
-
dbPath: string;
|
|
8
|
-
}
|
|
9
|
-
export interface IndexTasksContext {
|
|
10
|
-
contentPath: string;
|
|
11
|
-
arc?: string;
|
|
12
|
-
force: boolean;
|
|
13
|
-
dbPath: string;
|
|
14
|
-
db: Database;
|
|
15
|
-
scanned: ScannedChapter[];
|
|
16
|
-
toIndex: ScannedChapter[];
|
|
17
|
-
toDelete: string[];
|
|
18
|
-
entities: Map<string, EntityRecord>;
|
|
19
|
-
relations: Map<string, RelationRecord>;
|
|
20
|
-
processedCount: number;
|
|
21
|
-
}
|
|
22
|
-
export interface IndexTasksOutput {
|
|
23
|
-
indexed: number;
|
|
24
|
-
skipped: number;
|
|
25
|
-
deleted: number;
|
|
26
|
-
entities: number;
|
|
27
|
-
relations: number;
|
|
28
|
-
}
|
|
29
|
-
export declare function formatProgressBar(current: number, total: number, width?: number): string;
|
|
30
|
-
export declare function formatEta(startTime: number, current: number, total: number): string;
|
|
31
|
-
export declare function runIndexTasks(input: IndexTasksInput, silent?: boolean): Promise<IndexTasksOutput>;
|
|
32
|
-
//# sourceMappingURL=tasks.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.d.ts","sourceRoot":"","sources":["tasks.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,KAAK,EAEV,YAAY,EACZ,cAAc,EACd,cAAc,EACf,MAAM,wBAAwB,CAAC;AAKhC,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,iBAAiB;IAEhC,WAAW,EAAE,MAAM,CAAC;IACpB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IAEf,EAAE,EAAE,QAAQ,CAAC;IACb,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,GAAG,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC;IACpC,SAAS,EAAE,GAAG,CAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IACvC,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,EAAE,MAAM,CAAC;CACnB;AAGD,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,KAAK,SAAK,GAAG,MAAM,CAKpF;AAED,wBAAgB,SAAS,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUnF;AAwKD,wBAAsB,aAAa,CACjC,KAAK,EAAE,eAAe,EACtB,MAAM,UAAQ,GACb,OAAO,CAAC,gBAAgB,CAAC,CAsE3B"}
|
package/lib/indexer/tasks.js
DELETED
|
@@ -1,235 +0,0 @@
|
|
|
1
|
-
import { Listr, PRESET_TIMER } from 'listr2';
|
|
2
|
-
import { Database } from '../database/index.js';
|
|
3
|
-
import { generateEmbedding, preloadModel } from './embeddings.js';
|
|
4
|
-
import { extractEntities } from './extractor.js';
|
|
5
|
-
import { scanTimeline } from './scanner.js';
|
|
6
|
-
// Progress bar helpers
|
|
7
|
-
export function formatProgressBar(current, total, width = 30) {
|
|
8
|
-
const pct = total > 0 ? current / total : 0;
|
|
9
|
-
const filled = Math.round(pct * width);
|
|
10
|
-
const bar = '█'.repeat(filled) + '░'.repeat(width - filled);
|
|
11
|
-
return `[${bar}] ${current}/${total} (${Math.round(pct * 100)}%)`;
|
|
12
|
-
}
|
|
13
|
-
export function formatEta(startTime, current, total) {
|
|
14
|
-
if (current === 0)
|
|
15
|
-
return 'calculating...';
|
|
16
|
-
const elapsed = Date.now() - startTime;
|
|
17
|
-
const msPerItem = elapsed / current;
|
|
18
|
-
const remaining = msPerItem * (total - current);
|
|
19
|
-
const minutes = Math.ceil(remaining / 60000);
|
|
20
|
-
if (minutes > 60) {
|
|
21
|
-
return `${Math.floor(minutes / 60)}h ${minutes % 60}m`;
|
|
22
|
-
}
|
|
23
|
-
return `${minutes}m`;
|
|
24
|
-
}
|
|
25
|
-
function createTasks() {
|
|
26
|
-
return [
|
|
27
|
-
{
|
|
28
|
-
title: 'Loading embedding model',
|
|
29
|
-
task: async (ctx, task) => {
|
|
30
|
-
task.title = `Loading embedding model (${ctx.db.embeddingModel})`;
|
|
31
|
-
await preloadModel(ctx.db.embeddingModel);
|
|
32
|
-
},
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
title: 'Scanning filesystem',
|
|
36
|
-
task: async (ctx, task) => {
|
|
37
|
-
const { chapters } = scanTimeline(ctx.contentPath, ctx.arc);
|
|
38
|
-
ctx.scanned = chapters;
|
|
39
|
-
const existingHashes = await ctx.db.getChapterHashes();
|
|
40
|
-
ctx.toIndex = chapters.filter((ch) => ctx.force || existingHashes.get(ch.file_path) !== ch.file_hash);
|
|
41
|
-
const currentPaths = new Set(chapters.map((c) => c.file_path));
|
|
42
|
-
ctx.toDelete = [...existingHashes.keys()].filter((p) => !currentPaths.has(p));
|
|
43
|
-
task.title = `Scanning filesystem (${chapters.length} chapters, ${ctx.toIndex.length} to index)`;
|
|
44
|
-
},
|
|
45
|
-
},
|
|
46
|
-
{
|
|
47
|
-
title: 'Processing chapters',
|
|
48
|
-
skip: (ctx) => ctx.toIndex.length === 0,
|
|
49
|
-
task: async (ctx, task) => {
|
|
50
|
-
const startTime = Date.now();
|
|
51
|
-
for (let i = 0; i < ctx.toIndex.length; i++) {
|
|
52
|
-
const chapter = ctx.toIndex[i];
|
|
53
|
-
const bar = formatProgressBar(i + 1, ctx.toIndex.length);
|
|
54
|
-
const eta = formatEta(startTime, i + 1, ctx.toIndex.length);
|
|
55
|
-
// Embedding phase
|
|
56
|
-
task.output =
|
|
57
|
-
`${bar} | ETA: ${eta}\n` +
|
|
58
|
-
`${chapter.id} - Generating embedding...\n` +
|
|
59
|
-
`👤 ${ctx.entities.size} entities | 🔗 ${ctx.relations.size} relations`;
|
|
60
|
-
const vector = await generateEmbedding(chapter.content, ctx.db.embeddingModel);
|
|
61
|
-
// Extraction phase
|
|
62
|
-
task.output =
|
|
63
|
-
`${bar} | ETA: ${eta}\n` +
|
|
64
|
-
`${chapter.id} - Extracting entities...\n` +
|
|
65
|
-
`👤 ${ctx.entities.size} entities | 🔗 ${ctx.relations.size} relations`;
|
|
66
|
-
const { entities, relations } = await extractEntities(chapter.content);
|
|
67
|
-
// Build and save chapter record
|
|
68
|
-
const chapterRecord = {
|
|
69
|
-
...chapter,
|
|
70
|
-
vector,
|
|
71
|
-
entities: entities.map((e) => `${chapter.arc}:${e.type}:${e.name}`),
|
|
72
|
-
indexed_at: Date.now(),
|
|
73
|
-
};
|
|
74
|
-
await ctx.db.upsertChapters([chapterRecord]);
|
|
75
|
-
ctx.processedCount++;
|
|
76
|
-
// Aggregate entities
|
|
77
|
-
for (const entity of entities) {
|
|
78
|
-
const entityId = `${chapter.arc}:${entity.type}:${entity.name}`;
|
|
79
|
-
const existing = ctx.entities.get(entityId);
|
|
80
|
-
if (existing) {
|
|
81
|
-
existing.chapters.push(chapter.id);
|
|
82
|
-
existing.chapter_count++;
|
|
83
|
-
for (const alias of entity.aliases) {
|
|
84
|
-
if (!existing.aliases.includes(alias)) {
|
|
85
|
-
existing.aliases.push(alias);
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
|
-
}
|
|
89
|
-
else {
|
|
90
|
-
ctx.entities.set(entityId, {
|
|
91
|
-
id: entityId,
|
|
92
|
-
arc: chapter.arc,
|
|
93
|
-
name: entity.name,
|
|
94
|
-
type: entity.type,
|
|
95
|
-
description: entity.description,
|
|
96
|
-
aliases: entity.aliases,
|
|
97
|
-
vector: [],
|
|
98
|
-
chapters: [chapter.id],
|
|
99
|
-
chapter_count: 1,
|
|
100
|
-
first_appearance: chapter.id,
|
|
101
|
-
indexed_at: Date.now(),
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
|
-
}
|
|
105
|
-
// Aggregate relations
|
|
106
|
-
for (const relation of relations) {
|
|
107
|
-
const relationId = `${chapter.arc}:${relation.source}:${relation.type}:${relation.target}`;
|
|
108
|
-
const existing = ctx.relations.get(relationId);
|
|
109
|
-
if (existing) {
|
|
110
|
-
if (!existing.chapters.includes(chapter.id)) {
|
|
111
|
-
existing.chapters.push(chapter.id);
|
|
112
|
-
}
|
|
113
|
-
}
|
|
114
|
-
else {
|
|
115
|
-
ctx.relations.set(relationId, {
|
|
116
|
-
id: relationId,
|
|
117
|
-
arc: chapter.arc,
|
|
118
|
-
source_entity: `${chapter.arc}:CHARACTER:${relation.source}`,
|
|
119
|
-
target_entity: `${chapter.arc}:CHARACTER:${relation.target}`,
|
|
120
|
-
type: relation.type,
|
|
121
|
-
description: relation.description,
|
|
122
|
-
weight: 0.5,
|
|
123
|
-
chapters: [chapter.id],
|
|
124
|
-
indexed_at: Date.now(),
|
|
125
|
-
});
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
task.title = `Processing chapters (${ctx.toIndex.length} chapters)`;
|
|
130
|
-
task.output = `👤 ${ctx.entities.size} entities | 🔗 ${ctx.relations.size} relations`;
|
|
131
|
-
},
|
|
132
|
-
},
|
|
133
|
-
{
|
|
134
|
-
title: 'Generating entity embeddings',
|
|
135
|
-
skip: (ctx) => ctx.entities.size === 0,
|
|
136
|
-
task: async (ctx, task) => {
|
|
137
|
-
const entities = [...ctx.entities.values()];
|
|
138
|
-
const startTime = Date.now();
|
|
139
|
-
for (let i = 0; i < entities.length; i++) {
|
|
140
|
-
const entity = entities[i];
|
|
141
|
-
const bar = formatProgressBar(i + 1, entities.length);
|
|
142
|
-
const eta = formatEta(startTime, i + 1, entities.length);
|
|
143
|
-
task.output = `${bar} | ETA: ${eta}\n${entity.name}`;
|
|
144
|
-
entity.vector = await generateEmbedding(`${entity.name}: ${entity.description}`, ctx.db.embeddingModel);
|
|
145
|
-
}
|
|
146
|
-
task.title = `Generating entity embeddings (${entities.length} entities)`;
|
|
147
|
-
},
|
|
148
|
-
},
|
|
149
|
-
{
|
|
150
|
-
title: 'Saving to database',
|
|
151
|
-
skip: (ctx) => ctx.entities.size === 0 && ctx.relations.size === 0 && ctx.toDelete.length === 0,
|
|
152
|
-
task: async (ctx, task) => {
|
|
153
|
-
if (ctx.entities.size > 0) {
|
|
154
|
-
await ctx.db.upsertEntities([...ctx.entities.values()]);
|
|
155
|
-
}
|
|
156
|
-
if (ctx.relations.size > 0) {
|
|
157
|
-
await ctx.db.upsertRelations([...ctx.relations.values()]);
|
|
158
|
-
}
|
|
159
|
-
if (ctx.toDelete.length > 0) {
|
|
160
|
-
await ctx.db.deleteChaptersByPaths(ctx.toDelete);
|
|
161
|
-
}
|
|
162
|
-
task.title = `Saving to database (${ctx.entities.size} entities, ${ctx.relations.size} relations)`;
|
|
163
|
-
},
|
|
164
|
-
},
|
|
165
|
-
];
|
|
166
|
-
}
|
|
167
|
-
export async function runIndexTasks(input, silent = false) {
|
|
168
|
-
// Initialize database before creating tasks
|
|
169
|
-
const db = new Database(input.dbPath, input.force);
|
|
170
|
-
await db.connect();
|
|
171
|
-
const baseCtx = {
|
|
172
|
-
...input,
|
|
173
|
-
force: input.force ?? false,
|
|
174
|
-
db,
|
|
175
|
-
scanned: [],
|
|
176
|
-
toIndex: [],
|
|
177
|
-
toDelete: [],
|
|
178
|
-
entities: new Map(),
|
|
179
|
-
relations: new Map(),
|
|
180
|
-
processedCount: 0,
|
|
181
|
-
};
|
|
182
|
-
const tasks = silent
|
|
183
|
-
? new Listr(createTasks(), {
|
|
184
|
-
concurrent: false,
|
|
185
|
-
renderer: 'silent',
|
|
186
|
-
ctx: baseCtx,
|
|
187
|
-
})
|
|
188
|
-
: new Listr(createTasks(), {
|
|
189
|
-
concurrent: false,
|
|
190
|
-
renderer: 'default',
|
|
191
|
-
rendererOptions: {
|
|
192
|
-
collapseSubtasks: false,
|
|
193
|
-
timer: PRESET_TIMER,
|
|
194
|
-
},
|
|
195
|
-
ctx: baseCtx,
|
|
196
|
-
});
|
|
197
|
-
// Handle SIGINT for graceful shutdown
|
|
198
|
-
/* c8 ignore start */
|
|
199
|
-
let cancelled = false;
|
|
200
|
-
const sigintHandler = () => {
|
|
201
|
-
cancelled = true;
|
|
202
|
-
};
|
|
203
|
-
process.on('SIGINT', sigintHandler);
|
|
204
|
-
/* c8 ignore stop */
|
|
205
|
-
try {
|
|
206
|
-
const ctx = await tasks.run();
|
|
207
|
-
return {
|
|
208
|
-
indexed: ctx.toIndex.length,
|
|
209
|
-
skipped: ctx.scanned.length - ctx.toIndex.length,
|
|
210
|
-
deleted: ctx.toDelete.length,
|
|
211
|
-
entities: ctx.entities.size,
|
|
212
|
-
relations: ctx.relations.size,
|
|
213
|
-
};
|
|
214
|
-
}
|
|
215
|
-
catch (error) {
|
|
216
|
-
/* c8 ignore start */
|
|
217
|
-
if (cancelled) {
|
|
218
|
-
// Return partial results on cancellation
|
|
219
|
-
return {
|
|
220
|
-
indexed: baseCtx.processedCount,
|
|
221
|
-
skipped: baseCtx.scanned.length - baseCtx.toIndex.length,
|
|
222
|
-
deleted: 0,
|
|
223
|
-
entities: baseCtx.entities.size,
|
|
224
|
-
relations: baseCtx.relations.size,
|
|
225
|
-
};
|
|
226
|
-
}
|
|
227
|
-
/* c8 ignore stop */
|
|
228
|
-
throw error;
|
|
229
|
-
}
|
|
230
|
-
finally {
|
|
231
|
-
process.off('SIGINT', sigintHandler);
|
|
232
|
-
db.close();
|
|
233
|
-
}
|
|
234
|
-
}
|
|
235
|
-
//# sourceMappingURL=tasks.js.map
|
package/lib/indexer/tasks.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["tasks.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAkB,YAAY,EAAE,MAAM,QAAQ,CAAC;AAE7D,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAOhD,OAAO,EAAE,iBAAiB,EAAE,YAAY,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAiC5C,uBAAuB;AACvB,MAAM,UAAU,iBAAiB,CAAC,OAAe,EAAE,KAAa,EAAE,KAAK,GAAG,EAAE;IAC1E,MAAM,GAAG,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5C,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,KAAK,CAAC,CAAC;IACvC,MAAM,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,GAAG,CAAC,MAAM,CAAC,KAAK,GAAG,MAAM,CAAC,CAAC;IAC5D,OAAO,IAAI,GAAG,KAAK,OAAO,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,GAAG,GAAG,GAAG,CAAC,IAAI,CAAC;AACpE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,OAAe,EAAE,KAAa;IACzE,IAAI,OAAO,KAAK,CAAC;QAAE,OAAO,gBAAgB,CAAC;IAC3C,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;IACvC,MAAM,SAAS,GAAG,OAAO,GAAG,OAAO,CAAC;IACpC,MAAM,SAAS,GAAG,SAAS,GAAG,CAAC,KAAK,GAAG,OAAO,CAAC,CAAC;IAChD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC;IAC7C,IAAI,OAAO,GAAG,EAAE,EAAE,CAAC;QACjB,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,EAAE,CAAC,KAAK,OAAO,GAAG,EAAE,GAAG,CAAC;IACzD,CAAC;IACD,OAAO,GAAG,OAAO,GAAG,CAAC;AACvB,CAAC;AAED,SAAS,WAAW;IAClB,OAAO;QACL;YACE,KAAK,EAAE,yBAAyB;YAChC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxB,IAAI,CAAC,KAAK,GAAG,4BAA4B,GAAG,CAAC,EAAE,CAAC,cAAc,GAAG,CAAC;gBAClE,MAAM,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;YAC5C,CAAC;SACF;QACD;YACE,KAAK,EAAE,qBAAqB;YAC5B,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxB,MAAM,EAAE,QAAQ,EAAE,GAAG,YAAY,CAAC,GAAG,CAAC,WAAW,EAAE,GAAG,CAAC,GAAG,CAAC,CAAC;gBAC5D,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC;gBAEvB,MAAM,cAAc,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,gBAAgB,EAAE,CAAC;gBACvD,GAAG,CAAC,OAAO,GAAG,QAAQ,CAAC,MAAM,CAC3B,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,IAAI,cAAc,CAAC,GAAG,CAAC,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,SAAS,CACvE,CAAC;gBAEF,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC;gBAC/D,GAAG,CAAC,QAAQ,GAAG,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;gBAE9E,IAAI,CAAC,KAAK,GAAG,wBAAwB,QAAQ,CAAC,MAAM,cAAc,GAAG,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC;YACnG,CAAC;SACF;QACD;YACE,KAAK,EAAE,qBAAqB;YAC5B,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC;YACvC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxB,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBAC5C,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAC/B,MAAM,GAAG,GAAG,iBAAiB,CAAC,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBACzD,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;oBAE5D,kBAAkB;oBAClB,IAAI,CAAC,MAAM;wBACT,GAAG,GAAG,WAAW,GAAG,IAAI;4BACxB,GAAG,OAAO,CAAC,EAAE,8BAA8B;4BAC3C,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,kBAAkB,GAAG,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC;oBAE1E,MAAM,MAAM,GAAG,MAAM,iBAAiB,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC;oBAE/E,mBAAmB;oBACnB,IAAI,CAAC,MAAM;wBACT,GAAG,GAAG,WAAW,GAAG,IAAI;4BACxB,GAAG,OAAO,CAAC,EAAE,6BAA6B;4BAC1C,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,kBAAkB,GAAG,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC;oBAE1E,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,eAAe,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;oBAEvE,gCAAgC;oBAChC,MAAM,aAAa,GAAkB;wBACnC,GAAG,OAAO;wBACV,MAAM;wBACN,QAAQ,EAAE,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,OAAO,CAAC,GAAG,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,CAAC;wBACnE,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;qBACvB,CAAC;oBACF,MAAM,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC;oBAC7C,GAAG,CAAC,cAAc,EAAE,CAAC;oBAErB,qBAAqB;oBACrB,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;wBAC9B,MAAM,QAAQ,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE,CAAC;wBAChE,MAAM,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;wBAE5C,IAAI,QAAQ,EAAE,CAAC;4BACb,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;4BACnC,QAAQ,CAAC,aAAa,EAAE,CAAC;4BACzB,KAAK,MAAM,KAAK,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;gCACnC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;oCACtC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gCAC/B,CAAC;4BACH,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE;gCACzB,EAAE,EAAE,QAAQ;gCACZ,GAAG,EAAE,OAAO,CAAC,GAAG;gCAChB,IAAI,EAAE,MAAM,CAAC,IAAI;gCACjB,IAAI,EAAE,MAAM,CAAC,IAAI;gCACjB,WAAW,EAAE,MAAM,CAAC,WAAW;gCAC/B,OAAO,EAAE,MAAM,CAAC,OAAO;gCACvB,MAAM,EAAE,EAAE;gCACV,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;gCACtB,aAAa,EAAE,CAAC;gCAChB,gBAAgB,EAAE,OAAO,CAAC,EAAE;gCAC5B,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;6BACvB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;oBAED,sBAAsB;oBACtB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;wBACjC,MAAM,UAAU,GAAG,GAAG,OAAO,CAAC,GAAG,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,MAAM,EAAE,CAAC;wBAC3F,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;wBAE/C,IAAI,QAAQ,EAAE,CAAC;4BACb,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,CAAC;gCAC5C,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;4BACrC,CAAC;wBACH,CAAC;6BAAM,CAAC;4BACN,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,UAAU,EAAE;gCAC5B,EAAE,EAAE,UAAU;gCACd,GAAG,EAAE,OAAO,CAAC,GAAG;gCAChB,aAAa,EAAE,GAAG,OAAO,CAAC,GAAG,cAAc,QAAQ,CAAC,MAAM,EAAE;gCAC5D,aAAa,EAAE,GAAG,OAAO,CAAC,GAAG,cAAc,QAAQ,CAAC,MAAM,EAAE;gCAC5D,IAAI,EAAE,QAAQ,CAAC,IAAI;gCACnB,WAAW,EAAE,QAAQ,CAAC,WAAW;gCACjC,MAAM,EAAE,GAAG;gCACX,QAAQ,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;gCACtB,UAAU,EAAE,IAAI,CAAC,GAAG,EAAE;6BACvB,CAAC,CAAC;wBACL,CAAC;oBACH,CAAC;gBACH,CAAC;gBAED,IAAI,CAAC,KAAK,GAAG,wBAAwB,GAAG,CAAC,OAAO,CAAC,MAAM,YAAY,CAAC;gBACpE,IAAI,CAAC,MAAM,GAAG,MAAM,GAAG,CAAC,QAAQ,CAAC,IAAI,kBAAkB,GAAG,CAAC,SAAS,CAAC,IAAI,YAAY,CAAC;YACxF,CAAC;SACF;QACD;YACE,KAAK,EAAE,8BAA8B;YACrC,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC;YACtC,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxB,MAAM,QAAQ,GAAG,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;gBAC5C,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAE7B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;oBACzC,MAAM,MAAM,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;oBAC3B,MAAM,GAAG,GAAG,iBAAiB,CAAC,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;oBACtD,MAAM,GAAG,GAAG,SAAS,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,CAAC;oBAEzD,IAAI,CAAC,MAAM,GAAG,GAAG,GAAG,WAAW,GAAG,KAAK,MAAM,CAAC,IAAI,EAAE,CAAC;oBAErD,MAAM,CAAC,MAAM,GAAG,MAAM,iBAAiB,CACrC,GAAG,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,WAAW,EAAE,EACvC,GAAG,CAAC,EAAE,CAAC,cAAc,CACtB,CAAC;gBACJ,CAAC;gBAED,IAAI,CAAC,KAAK,GAAG,iCAAiC,QAAQ,CAAC,MAAM,YAAY,CAAC;YAC5E,CAAC;SACF;QACD;YACE,KAAK,EAAE,oBAAoB;YAC3B,IAAI,EAAE,CAAC,GAAG,EAAE,EAAE,CACZ,GAAG,CAAC,QAAQ,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,KAAK,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC;YAClF,IAAI,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;gBACxB,IAAI,GAAG,CAAC,QAAQ,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBAC1B,MAAM,GAAG,CAAC,EAAE,CAAC,cAAc,CAAC,CAAC,GAAG,GAAG,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC1D,CAAC;gBACD,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;oBAC3B,MAAM,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC,GAAG,GAAG,CAAC,SAAS,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;gBAC5D,CAAC;gBACD,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC5B,MAAM,GAAG,CAAC,EAAE,CAAC,qBAAqB,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;gBACnD,CAAC;gBAED,IAAI,CAAC,KAAK,GAAG,uBAAuB,GAAG,CAAC,QAAQ,CAAC,IAAI,cAAc,GAAG,CAAC,SAAS,CAAC,IAAI,aAAa,CAAC;YACrG,CAAC;SACF;KACF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,aAAa,CACjC,KAAsB,EACtB,MAAM,GAAG,KAAK;IAEd,4CAA4C;IAC5C,MAAM,EAAE,GAAG,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,EAAE,KAAK,CAAC,KAAK,CAAC,CAAC;IACnD,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;IAEnB,MAAM,OAAO,GAAsB;QACjC,GAAG,KAAK;QACR,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,KAAK;QAC3B,EAAE;QACF,OAAO,EAAE,EAAE;QACX,OAAO,EAAE,EAAE;QACX,QAAQ,EAAE,EAAE;QACZ,QAAQ,EAAE,IAAI,GAAG,EAAwB;QACzC,SAAS,EAAE,IAAI,GAAG,EAA0B;QAC5C,cAAc,EAAE,CAAC;KAClB,CAAC;IAEF,MAAM,KAAK,GAAG,MAAM;QAClB,CAAC,CAAC,IAAI,KAAK,CAA8B,WAAW,EAAE,EAAE;YACpD,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,QAAQ;YAClB,GAAG,EAAE,OAAO;SACb,CAAC;QACJ,CAAC,CAAC,IAAI,KAAK,CAA+B,WAAW,EAAE,EAAE;YACrD,UAAU,EAAE,KAAK;YACjB,QAAQ,EAAE,SAAS;YACnB,eAAe,EAAE;gBACf,gBAAgB,EAAE,KAAK;gBACvB,KAAK,EAAE,YAAY;aACpB;YACD,GAAG,EAAE,OAAO;SACb,CAAC,CAAC;IAEP,sCAAsC;IACtC,qBAAqB;IACrB,IAAI,SAAS,GAAG,KAAK,CAAC;IACtB,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,SAAS,GAAG,IAAI,CAAC;IACnB,CAAC,CAAC;IACF,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;IACpC,oBAAoB;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,GAAG,EAAE,CAAC;QAE9B,OAAO;YACL,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM;YAC3B,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,GAAG,CAAC,OAAO,CAAC,MAAM;YAChD,OAAO,EAAE,GAAG,CAAC,QAAQ,CAAC,MAAM;YAC5B,QAAQ,EAAE,GAAG,CAAC,QAAQ,CAAC,IAAI;YAC3B,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI;SAC9B,CAAC;IACJ,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,qBAAqB;QACrB,IAAI,SAAS,EAAE,CAAC;YACd,yCAAyC;YACzC,OAAO;gBACL,OAAO,EAAE,OAAO,CAAC,cAAc;gBAC/B,OAAO,EAAE,OAAO,CAAC,OAAO,CAAC,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC,MAAM;gBACxD,OAAO,EAAE,CAAC;gBACV,QAAQ,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI;gBAC/B,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI;aAClC,CAAC;QACJ,CAAC;QACD,oBAAoB;QACpB,MAAM,KAAK,CAAC;IACd,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QACrC,EAAE,CAAC,KAAK,EAAE,CAAC;IACb,CAAC;AACH,CAAC"}
|