@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.
Files changed (90) hide show
  1. package/README.md +1 -1
  2. package/cli/program.d.ts.map +1 -1
  3. package/cli/program.js +5 -5
  4. package/cli/program.js.map +1 -1
  5. package/lib/constants.d.ts +0 -3
  6. package/lib/constants.d.ts.map +1 -1
  7. package/lib/constants.js +1 -7
  8. package/lib/constants.js.map +1 -1
  9. package/lib/rag/index.d.ts +13 -0
  10. package/lib/rag/index.d.ts.map +1 -0
  11. package/lib/rag/index.js +54 -0
  12. package/lib/rag/index.js.map +1 -0
  13. package/lib/rag/parser.d.ts +8 -0
  14. package/lib/rag/parser.d.ts.map +1 -0
  15. package/lib/rag/parser.js +39 -0
  16. package/lib/rag/parser.js.map +1 -0
  17. package/lib/rag/schema.d.ts +6 -0
  18. package/lib/rag/schema.d.ts.map +1 -0
  19. package/lib/rag/schema.js +49 -0
  20. package/lib/rag/schema.js.map +1 -0
  21. package/lib/tools/consistency/index.d.ts +1 -1
  22. package/lib/tools/consistency/rules/entity-duplicate.d.ts.map +1 -1
  23. package/lib/tools/consistency/rules/entity-duplicate.js +3 -5
  24. package/lib/tools/consistency/rules/entity-duplicate.js.map +1 -1
  25. package/lib/tools/consistency/rules/first-time-content.d.ts.map +1 -1
  26. package/lib/tools/consistency/rules/first-time-content.js +7 -2
  27. package/lib/tools/consistency/rules/first-time-content.js.map +1 -1
  28. package/lib/tools/consistency/rules/relation-jump.d.ts.map +1 -1
  29. package/lib/tools/consistency/rules/relation-jump.js +11 -8
  30. package/lib/tools/consistency/rules/relation-jump.js.map +1 -1
  31. package/lib/tools/consistency/types.d.ts.map +1 -1
  32. package/lib/tools/graph-export.d.ts +1 -2
  33. package/lib/tools/graph-export.d.ts.map +1 -1
  34. package/lib/tools/graph-export.js +49 -116
  35. package/lib/tools/graph-export.js.map +1 -1
  36. package/lib/tools/history.d.ts +1 -1
  37. package/lib/tools/history.d.ts.map +1 -1
  38. package/lib/tools/history.js +43 -55
  39. package/lib/tools/history.js.map +1 -1
  40. package/lib/tools/index.d.ts +7 -2
  41. package/lib/tools/index.d.ts.map +1 -1
  42. package/lib/tools/index.js +28 -4
  43. package/lib/tools/index.js.map +1 -1
  44. package/lib/tools/list.d.ts +1 -1
  45. package/lib/tools/list.d.ts.map +1 -1
  46. package/lib/tools/list.js +35 -30
  47. package/lib/tools/list.js.map +1 -1
  48. package/lib/tools/review-apply.d.ts.map +1 -1
  49. package/lib/tools/review-apply.js +49 -207
  50. package/lib/tools/review-apply.js.map +1 -1
  51. package/lib/tools/review-generate.d.ts.map +1 -1
  52. package/lib/tools/review-generate.js +44 -55
  53. package/lib/tools/review-generate.js.map +1 -1
  54. package/lib/tools/review-status.d.ts +12 -17
  55. package/lib/tools/review-status.d.ts.map +1 -1
  56. package/lib/tools/review-status.js +21 -33
  57. package/lib/tools/review-status.js.map +1 -1
  58. package/lib/tools/search.d.ts +1 -1
  59. package/lib/tools/search.d.ts.map +1 -1
  60. package/lib/tools/search.js +62 -44
  61. package/lib/tools/search.js.map +1 -1
  62. package/lib/tools/stats.d.ts.map +1 -1
  63. package/lib/tools/stats.js +43 -7
  64. package/lib/tools/stats.js.map +1 -1
  65. package/lib/types.d.ts.map +1 -1
  66. package/package.json +8 -6
  67. package/lib/database/index.d.ts +0 -36
  68. package/lib/database/index.d.ts.map +0 -1
  69. package/lib/database/index.js +0 -287
  70. package/lib/database/index.js.map +0 -1
  71. package/lib/database/schemas.d.ts +0 -55
  72. package/lib/database/schemas.d.ts.map +0 -1
  73. package/lib/database/schemas.js +0 -78
  74. package/lib/database/schemas.js.map +0 -1
  75. package/lib/indexer/embeddings.d.ts +0 -10
  76. package/lib/indexer/embeddings.d.ts.map +0 -1
  77. package/lib/indexer/embeddings.js +0 -64
  78. package/lib/indexer/embeddings.js.map +0 -1
  79. package/lib/indexer/extractor.d.ts +0 -81
  80. package/lib/indexer/extractor.d.ts.map +0 -1
  81. package/lib/indexer/extractor.js +0 -68
  82. package/lib/indexer/extractor.js.map +0 -1
  83. package/lib/indexer/scanner.d.ts +0 -8
  84. package/lib/indexer/scanner.d.ts.map +0 -1
  85. package/lib/indexer/scanner.js +0 -73
  86. package/lib/indexer/scanner.js.map +0 -1
  87. package/lib/indexer/tasks.d.ts +0 -32
  88. package/lib/indexer/tasks.d.ts.map +0 -1
  89. package/lib/indexer/tasks.js +0 -235
  90. package/lib/indexer/tasks.js.map +0 -1
@@ -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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"}
@@ -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"}
@@ -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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"}
@@ -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"}
@@ -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
@@ -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"}