@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,12 +1,13 @@
1
1
  import z from 'zod';
2
2
  import { DEFAULT_DB_PATH } from '../constants.js';
3
- import { Database } from '../database/index.js';
3
+ import { createEchoesRAG } from '../rag/index.js';
4
+ import { ENTITY_TYPES, RELATION_TYPES } from '../rag/schema.js';
4
5
  export const graphExportConfig = {
5
6
  name: 'graph-export',
6
- description: 'Export knowledge graph in various formats (Mermaid, JSON, DOT).',
7
+ description: 'Export knowledge graph in JSON or DOT format.',
7
8
  arguments: {
8
9
  arc: 'Arc name to export.',
9
- format: 'Output format: mermaid, json, or dot.',
10
+ format: 'Output format: json or dot.',
10
11
  entityTypes: 'Filter by entity types (comma-separated).',
11
12
  relationTypes: 'Filter by relation types (comma-separated).',
12
13
  characters: 'Filter by specific character names (comma-separated).',
@@ -15,138 +16,70 @@ export const graphExportConfig = {
15
16
  };
16
17
  export const graphExportSchema = z.object({
17
18
  arc: z.string().describe(graphExportConfig.arguments.arc),
18
- format: z.enum(['mermaid', 'json', 'dot']).describe(graphExportConfig.arguments.format),
19
+ format: z.enum(['json', 'dot']).describe(graphExportConfig.arguments.format),
19
20
  entityTypes: z
20
- .array(z.enum(['CHARACTER', 'LOCATION', 'EVENT', 'OBJECT', 'EMOTION']))
21
+ .array(z.enum(ENTITY_TYPES))
21
22
  .optional()
22
23
  .describe(graphExportConfig.arguments.entityTypes),
23
24
  relationTypes: z
24
- .array(z.enum([
25
- 'LOVES',
26
- 'HATES',
27
- 'KNOWS',
28
- 'RELATED_TO',
29
- 'FRIENDS_WITH',
30
- 'ENEMIES_WITH',
31
- 'LOCATED_IN',
32
- 'LIVES_IN',
33
- 'TRAVELS_TO',
34
- 'HAPPENS_BEFORE',
35
- 'HAPPENS_AFTER',
36
- 'CAUSES',
37
- 'OWNS',
38
- 'USES',
39
- 'SEEKS',
40
- ]))
25
+ .array(z.enum(RELATION_TYPES))
41
26
  .optional()
42
27
  .describe(graphExportConfig.arguments.relationTypes),
43
28
  characters: z.array(z.string()).optional().describe(graphExportConfig.arguments.characters),
44
29
  dbPath: z.string().default(DEFAULT_DB_PATH).describe(graphExportConfig.arguments.dbPath),
45
30
  });
46
- async function buildGraph(dbPath, arc) {
47
- const db = new Database(dbPath);
48
- await db.connect();
49
- const entities = await db.getEntities(arc);
50
- const relations = await db.getRelations(arc);
51
- db.close();
52
- const nodes = entities.map((entity) => ({
53
- id: entity.name,
54
- name: entity.name,
55
- type: entity.type,
56
- }));
57
- const edges = relations.map((relation) => ({
58
- source: relation.source_entity.split(':').pop() || '',
59
- target: relation.target_entity.split(':').pop() || '',
60
- type: relation.type,
61
- weight: relation.weight,
62
- }));
63
- return { nodes, edges };
64
- }
65
- function filterGraph(graph, filters) {
66
- let { nodes, edges } = graph;
67
- // Filter nodes by entity types
68
- if (filters.entityTypes) {
69
- nodes = nodes.filter((node) => filters.entityTypes?.includes(node.type));
70
- }
71
- // Filter nodes by character names
72
- if (filters.characters) {
73
- nodes = nodes.filter((node) => filters.characters?.includes(node.name));
74
- }
75
- // Filter edges by relation types
76
- if (filters.relationTypes) {
77
- edges = edges.filter((edge) => filters.relationTypes?.includes(edge.type));
78
- }
79
- // Remove edges that reference filtered-out nodes
80
- const nodeIds = new Set(nodes.map((node) => node.id));
81
- edges = edges.filter((edge) => nodeIds.has(edge.source) && nodeIds.has(edge.target));
82
- return { nodes, edges };
83
- }
84
- function toMermaid(graph) {
85
- const lines = ['graph LR'];
86
- for (const edge of graph.edges) {
87
- const source = edge.source.replace(/[^a-zA-Z0-9]/g, '_');
88
- const target = edge.target.replace(/[^a-zA-Z0-9]/g, '_');
89
- lines.push(` ${source} -->|${edge.type}| ${target}`);
31
+ export async function graphExport(input) {
32
+ const { arc, format, entityTypes, relationTypes, characters, dbPath } = graphExportSchema.parse(input);
33
+ const { storage } = createEchoesRAG({ dbPath, arc });
34
+ // Build graph from storage
35
+ const entities = await storage.graph.getEntities();
36
+ let nodes = entities.map((e) => ({ id: e.name, name: e.name, type: e.type }));
37
+ const allRelations = [];
38
+ for (const entity of entities) {
39
+ const rels = await storage.graph.getRelations(entity.id, 'out');
40
+ for (const r of rels) {
41
+ const source = entities.find((e) => e.id === r.sourceId);
42
+ const target = entities.find((e) => e.id === r.targetId);
43
+ if (source && target) {
44
+ allRelations.push({ source: source.name, target: target.name, type: r.type });
45
+ }
46
+ }
90
47
  }
91
- return lines.join('\n');
48
+ let edges = allRelations;
49
+ // Apply filters
50
+ if (entityTypes)
51
+ nodes = nodes.filter((n) => entityTypes.includes(n.type));
52
+ if (characters)
53
+ nodes = nodes.filter((n) => characters.includes(n.name));
54
+ if (relationTypes)
55
+ edges = edges.filter((e) => relationTypes.includes(e.type));
56
+ const nodeIds = new Set(nodes.map((n) => n.id));
57
+ edges = edges.filter((e) => nodeIds.has(e.source) && nodeIds.has(e.target));
58
+ const graph = { nodes, edges };
59
+ const content = format === 'json' ? toJSON(graph) : toDOT(graph);
60
+ return { format, content, stats: { nodes: graph.nodes.length, edges: graph.edges.length } };
92
61
  }
93
62
  function toJSON(graph) {
94
- const result = {
95
- nodes: graph.nodes.map((node) => ({
96
- id: node.id,
97
- name: node.name,
98
- type: node.type,
99
- group: node.type === 'CHARACTER' ? 1 : node.type === 'LOCATION' ? 2 : 3,
100
- })),
101
- links: graph.edges.map((edge) => ({
102
- source: edge.source,
103
- target: edge.target,
104
- type: edge.type,
105
- weight: edge.weight,
63
+ return JSON.stringify({
64
+ nodes: graph.nodes.map((n) => ({
65
+ id: n.id,
66
+ name: n.name,
67
+ type: n.type,
68
+ group: n.type === 'CHARACTER' ? 1 : n.type === 'LOCATION' ? 2 : 3,
106
69
  })),
107
- };
108
- return JSON.stringify(result, null, 2);
70
+ links: graph.edges.map((e) => ({ source: e.source, target: e.target, type: e.type })),
71
+ }, null, 2);
109
72
  }
110
73
  function toDOT(graph) {
111
74
  const lines = ['digraph G {'];
112
- // Add node definitions with types
113
- for (const node of graph.nodes) {
114
- const shape = node.type === 'CHARACTER' ? 'ellipse' : node.type === 'LOCATION' ? 'box' : 'diamond';
115
- lines.push(` "${node.name}" [shape=${shape}];`);
75
+ for (const n of graph.nodes) {
76
+ const shape = n.type === 'CHARACTER' ? 'ellipse' : n.type === 'LOCATION' ? 'box' : 'diamond';
77
+ lines.push(` "${n.name}" [shape=${shape}];`);
116
78
  }
117
- // Add edges
118
- for (const edge of graph.edges) {
119
- lines.push(` "${edge.source}" -> "${edge.target}" [label="${edge.type}"];`);
79
+ for (const e of graph.edges) {
80
+ lines.push(` "${e.source}" -> "${e.target}" [label="${e.type}"];`);
120
81
  }
121
82
  lines.push('}');
122
83
  return lines.join('\n');
123
84
  }
124
- export async function graphExport(input) {
125
- const { arc, format, entityTypes, relationTypes, characters, dbPath } = graphExportSchema.parse(input);
126
- // Build graph from database
127
- let graph = await buildGraph(dbPath, arc);
128
- // Apply filters
129
- graph = filterGraph(graph, { entityTypes, relationTypes, characters });
130
- // Generate output based on format
131
- let content;
132
- switch (format) {
133
- case 'mermaid':
134
- content = toMermaid(graph);
135
- break;
136
- case 'json':
137
- content = toJSON(graph);
138
- break;
139
- case 'dot':
140
- content = toDOT(graph);
141
- break;
142
- }
143
- return {
144
- format,
145
- content,
146
- stats: {
147
- nodes: graph.nodes.length,
148
- edges: graph.edges.length,
149
- },
150
- };
151
- }
152
85
  //# sourceMappingURL=graph-export.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"graph-export.js","sourceRoot":"","sources":["graph-export.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"graph-export.js","sourceRoot":"","sources":["graph-export.ts"],"names":[],"mappings":"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"}
@@ -5,10 +5,10 @@ export declare const historySchema: z.ZodObject<{
5
5
  arc: z.ZodString;
6
6
  character: z.ZodOptional<z.ZodString>;
7
7
  only: z.ZodOptional<z.ZodEnum<{
8
- relations: "relations";
9
8
  kinks: "kinks";
10
9
  outfits: "outfits";
11
10
  locations: "locations";
11
+ relations: "relations";
12
12
  }>>;
13
13
  search: z.ZodOptional<z.ZodString>;
14
14
  dbPath: z.ZodDefault<z.ZodString>;
@@ -1 +1 @@
1
- {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["history.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAIpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,aAAa,EAAE,UAU3B,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;mBASxB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEzD,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AAED,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,SAAS,EAAE,aAAa,EAAE,CAAC;CAC5B;AAwBD,wBAAsB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAwGzE"}
1
+ {"version":3,"file":"history.d.ts","sourceRoot":"","sources":["history.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAIpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,aAAa,EAAE,UAU3B,CAAC;AAEF,eAAO,MAAM,aAAa;;;;;;;;;;;mBASxB,CAAC;AAEH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC;AAEzD,UAAU,SAAS;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,OAAO,CAAC;CAClB;AACD,UAAU,WAAW;IACnB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,CAAC;CAChB;AACD,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,UAAU,aAAa;IACrB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;CACd;AAED,UAAU,aAAa;IACrB,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,EAAE,SAAS,EAAE,CAAC;IACnB,OAAO,EAAE,WAAW,EAAE,CAAC;IACvB,SAAS,EAAE,aAAa,EAAE,CAAC;IAC3B,SAAS,EAAE,aAAa,EAAE,CAAC;CAC5B;AAqBD,wBAAsB,OAAO,CAAC,KAAK,EAAE,YAAY,GAAG,OAAO,CAAC,aAAa,CAAC,CAuFzE"}
@@ -1,6 +1,6 @@
1
1
  import z from 'zod';
2
2
  import { DEFAULT_DB_PATH } from '../constants.js';
3
- import { Database } from '../database/index.js';
3
+ import { createEchoesRAG } from '../rag/index.js';
4
4
  export const historyConfig = {
5
5
  name: 'history',
6
6
  description: 'Query character/arc history (kinks, outfits, locations, relations).',
@@ -25,7 +25,6 @@ export const historySchema = z.object({
25
25
  function parseOutfitField(outfitField) {
26
26
  if (!outfitField)
27
27
  return [];
28
- // Parse "Nic: Business casual | Vi: Outfit professionale"
29
28
  return outfitField
30
29
  .split('|')
31
30
  .map((part) => {
@@ -35,21 +34,14 @@ function parseOutfitField(outfitField) {
35
34
  .filter((entry) => entry.character && entry.outfit);
36
35
  }
37
36
  function isFirstTimeKink(kink) {
38
- const firstPatterns = /\b(primo|prima|first)\b/i;
39
- return firstPatterns.test(kink);
37
+ return /\b(primo|prima|first)\b/i.test(kink);
40
38
  }
41
39
  function matchesSearch(text, search) {
42
40
  return text.toLowerCase().includes(search.toLowerCase());
43
41
  }
44
42
  export async function history(input) {
45
43
  const { arc, character, only, search, dbPath } = historySchema.parse(input);
46
- const db = new Database(dbPath);
47
- await db.connect();
48
- // Get all chapters for the arc
49
- const chapters = await db.getChapters(arc);
50
- // Get relations for the arc
51
- const relations = await db.getRelations(arc);
52
- db.close();
44
+ const { storage } = createEchoesRAG({ dbPath, arc });
53
45
  const result = {
54
46
  arc,
55
47
  character,
@@ -58,72 +50,68 @@ export async function history(input) {
58
50
  locations: [],
59
51
  relations: [],
60
52
  };
61
- // Process chapters for kinks, outfits, and locations
62
- for (const chapter of chapters) {
63
- // Filter by character if specified
64
- if (character && chapter.pov !== character)
53
+ // Get chapter data from KV
54
+ const docKeys = await storage.kv.list('doc:');
55
+ for (const key of docKeys) {
56
+ const doc = await storage.kv.get(key);
57
+ const f = doc?.metadata?.fields;
58
+ if (!f)
65
59
  continue;
66
- const chapterKey = `ep${chapter.episode.toString().padStart(2, '0')}:ch${chapter.chapter.toString().padStart(3, '0')}`;
67
- // Process kinks (from chapter.kink field if available, otherwise skip)
68
- if (chapter.kink && (!only || only === 'kinks')) {
69
- const kinks = chapter.kink
60
+ if (character && String(f.pov ?? '') !== character)
61
+ continue;
62
+ const chapterKey = `ep${String(f.episode ?? '0').padStart(2, '0')}:ch${String(f.chapter ?? '0').padStart(3, '0')}`;
63
+ if (f.kink && (!only || only === 'kinks')) {
64
+ const kinks = String(f.kink)
70
65
  .split(',')
71
66
  .map((k) => k.trim())
72
- .filter((k) => k);
67
+ .filter(Boolean);
73
68
  for (const kink of kinks) {
74
69
  if (!search || matchesSearch(kink, search)) {
75
- result.kinks.push({
76
- chapter: chapterKey,
77
- kink,
78
- isFirst: isFirstTimeKink(kink),
79
- });
70
+ result.kinks.push({ chapter: chapterKey, kink, isFirst: isFirstTimeKink(kink) });
80
71
  }
81
72
  }
82
73
  }
83
- // Process outfits (from chapter.outfit field if available, otherwise skip)
84
- if (chapter.outfit && (!only || only === 'outfits')) {
85
- const outfits = parseOutfitField(chapter.outfit);
86
- for (const { character: outfitChar, outfit } of outfits) {
87
- if (!search || matchesSearch(`${outfitChar}: ${outfit}`, search)) {
88
- result.outfits.push({
89
- chapter: chapterKey,
90
- character: outfitChar,
91
- outfit,
92
- });
74
+ if (f.outfit && (!only || only === 'outfits')) {
75
+ for (const { character: c, outfit } of parseOutfitField(String(f.outfit))) {
76
+ if (!search || matchesSearch(`${c}: ${outfit}`, search)) {
77
+ result.outfits.push({ chapter: chapterKey, character: c, outfit });
93
78
  }
94
79
  }
95
80
  }
96
- // Process locations
97
- if (chapter.location && (!only || only === 'locations')) {
98
- if (!search || matchesSearch(chapter.location, search)) {
99
- result.locations.push({
100
- chapter: chapterKey,
101
- location: chapter.location,
102
- });
81
+ if (f.location && (!only || only === 'locations')) {
82
+ const loc = String(f.location);
83
+ if (!search || matchesSearch(loc, search)) {
84
+ result.locations.push({ chapter: chapterKey, location: loc });
103
85
  }
104
86
  }
105
87
  }
106
- // Process relations
88
+ // Get relations from graph
107
89
  if (!only || only === 'relations') {
108
- for (const relation of relations) {
109
- const relationText = `${relation.source_entity} ${relation.type} ${relation.target_entity}`;
110
- if (!search || matchesSearch(relationText, search)) {
111
- // Find first chapter where this relation appears
112
- const firstChapter = relation.chapters[0];
113
- if (firstChapter) {
114
- const [, episode, chapter] = firstChapter.split(':');
115
- const chapterKey = `ep${episode}:ch${chapter}`;
90
+ const entities = await storage.graph.getEntities();
91
+ const seen = new Set();
92
+ for (const entity of entities) {
93
+ const rels = await storage.graph.getRelations(entity.id, 'out');
94
+ for (const rel of rels) {
95
+ if (seen.has(rel.id))
96
+ continue;
97
+ seen.add(rel.id);
98
+ const text = `${rel.sourceId} ${rel.type} ${rel.targetId}`;
99
+ if (search && !matchesSearch(text, search))
100
+ continue;
101
+ const firstChunk = rel.sourceChunkIds[0];
102
+ if (firstChunk) {
103
+ const parts = firstChunk.split(':');
104
+ const chapterKey = `ep${parts[1] ?? '0'}:ch${parts[2] ?? '0'}`;
116
105
  result.relations.push({
117
106
  chapter: chapterKey,
118
- source: relation.source_entity.split(':').pop() || '',
119
- target: relation.target_entity.split(':').pop() || '',
120
- type: relation.type,
107
+ source: rel.sourceId,
108
+ target: rel.targetId,
109
+ type: rel.type,
121
110
  });
122
111
  }
123
112
  }
124
113
  }
125
114
  }
126
- // Sort all entries by chapter
127
115
  const sortByChapter = (a, b) => a.chapter.localeCompare(b.chapter);
128
116
  result.kinks.sort(sortByChapter);
129
117
  result.outfits.sort(sortByChapter);
@@ -1 +1 @@
1
- {"version":3,"file":"history.js","sourceRoot":"","sources":["history.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"history.js","sourceRoot":"","sources":["history.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,4 @@
1
1
  import z from 'zod';
2
- import { type IndexTasksOutput } from '../indexer/tasks.js';
3
2
  import type { ToolConfig } from '../types.js';
4
3
  export declare const indexConfig: ToolConfig;
5
4
  export declare const indexSchema: z.ZodObject<{
@@ -9,6 +8,12 @@ export declare const indexSchema: z.ZodObject<{
9
8
  dbPath: z.ZodDefault<z.ZodString>;
10
9
  }, z.z.core.$strip>;
11
10
  export type IndexInput = z.infer<typeof indexSchema>;
12
- export type IndexOutput = IndexTasksOutput;
11
+ export interface IndexOutput {
12
+ indexed: number;
13
+ skipped: number;
14
+ deleted: number;
15
+ entities: number;
16
+ relations: number;
17
+ }
13
18
  export declare function index(input: IndexInput): Promise<IndexOutput>;
14
19
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAGpB,OAAO,EAAE,KAAK,gBAAgB,EAAiB,MAAM,qBAAqB,CAAC;AAC3E,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,WAAW,EAAE,UASzB,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;mBAKtB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AACrD,MAAM,MAAM,WAAW,GAAG,gBAAgB,CAAC;AAE3C,wBAAsB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAKnE"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAGA,OAAO,CAAC,MAAM,KAAK,CAAC;AAIpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,WAAW,EAAE,UASzB,CAAC;AAEF,eAAO,MAAM,WAAW;;;;;mBAKtB,CAAC;AAEH,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC;AAErD,MAAM,WAAW,WAAW;IAC1B,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;AAED,wBAAsB,KAAK,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CA6BnE"}
@@ -1,6 +1,8 @@
1
+ import { readdirSync } from 'node:fs';
2
+ import { join } from 'node:path';
1
3
  import z from 'zod';
2
4
  import { DEFAULT_DB_PATH } from '../constants.js';
3
- import { runIndexTasks } from '../indexer/tasks.js';
5
+ import { createEchoesRAG } from '../rag/index.js';
4
6
  export const indexConfig = {
5
7
  name: 'index',
6
8
  description: 'Index timeline content into the database for semantic search.',
@@ -18,8 +20,30 @@ export const indexSchema = z.object({
18
20
  dbPath: z.string().default(DEFAULT_DB_PATH).describe(indexConfig.arguments.dbPath),
19
21
  });
20
22
  export async function index(input) {
21
- const parsed = indexSchema.parse(input);
22
- // Use silent renderer for MCP (no stdout output)
23
- return runIndexTasks(parsed, true);
23
+ const { contentPath, arc, force, dbPath } = indexSchema.parse(input);
24
+ const arcs = arc
25
+ ? [arc]
26
+ : readdirSync(contentPath, { withFileTypes: true })
27
+ .filter((d) => d.isDirectory())
28
+ .map((d) => d.name);
29
+ const totals = { indexed: 0, skipped: 0, deleted: 0, entities: 0, relations: 0 };
30
+ for (const arcName of arcs) {
31
+ const { rag } = createEchoesRAG({ dbPath, arc: arcName, contentPath });
32
+ await rag.index(join(contentPath, arcName), {
33
+ force,
34
+ onProgress: (event) => {
35
+ if (event.type === 'document:done')
36
+ totals.indexed++;
37
+ if (event.type === 'document:skip')
38
+ totals.skipped++;
39
+ if (event.type === 'document:delete')
40
+ totals.deleted++;
41
+ },
42
+ });
43
+ const stats = await rag.stats();
44
+ totals.entities += stats.entities;
45
+ totals.relations += stats.relations;
46
+ }
47
+ return totals;
24
48
  }
25
49
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAClD,OAAO,EAAyB,aAAa,EAAE,MAAM,qBAAqB,CAAC;AAG3E,MAAM,CAAC,MAAM,WAAW,GAAe;IACrC,IAAI,EAAE,OAAO;IACb,WAAW,EAAE,+DAA+D;IAC5E,SAAS,EAAE;QACT,WAAW,EAAE,gCAAgC;QAC7C,GAAG,EAAE,gCAAgC;QACrC,KAAK,EAAE,oCAAoC;QAC3C,MAAM,EAAE,2BAA2B,eAAe,IAAI;KACvD;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,WAAW,GAAG,CAAC,CAAC,MAAM,CAAC;IAClC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,WAAW,CAAC;IACnE,GAAG,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,GAAG,CAAC;IAC9D,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,KAAK,CAAC;IACnE,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,QAAQ,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC;CACnF,CAAC,CAAC;AAKH,MAAM,CAAC,KAAK,UAAU,KAAK,CAAC,KAAiB;IAC3C,MAAM,MAAM,GAAG,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAExC,iDAAiD;IACjD,OAAO,aAAa,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;AACrC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
@@ -3,8 +3,8 @@ import type { ToolConfig } from '../types.js';
3
3
  export declare const listConfig: ToolConfig;
4
4
  export declare const listSchema: z.ZodObject<{
5
5
  type: z.ZodEnum<{
6
- entities: "entities";
7
6
  relations: "relations";
7
+ entities: "entities";
8
8
  }>;
9
9
  arc: z.ZodOptional<z.ZodString>;
10
10
  entityType: z.ZodOptional<z.ZodEnum<{
@@ -1 +1 @@
1
- {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["list.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAKpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,UAAU,EAAE,UAUxB,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAMrB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEnD,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAsB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAqChE"}
1
+ {"version":3,"file":"list.d.ts","sourceRoot":"","sources":["list.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAKpB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE9C,eAAO,MAAM,UAAU,EAAE,UAUxB,CAAC;AAEF,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;mBAMrB,CAAC;AAEH,MAAM,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,UAAU,CAAC,CAAC;AAEnD,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,OAAO,EAAE,YAAY,EAAE,CAAA;CAAE,GAC7C;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,OAAO,EAAE,cAAc,EAAE,CAAA;CAAE,CAAC;AAErD,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,EAAE,CAAC;CACpB;AAED,wBAAsB,IAAI,CAAC,KAAK,EAAE,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CA2ChE"}
package/lib/tools/list.js CHANGED
@@ -1,7 +1,7 @@
1
1
  import z from 'zod';
2
2
  import { DEFAULT_DB_PATH } from '../constants.js';
3
- import { Database } from '../database/index.js';
4
- import { ENTITY_TYPES, RELATION_TYPES } from '../database/schemas.js';
3
+ import { createEchoesRAG } from '../rag/index.js';
4
+ import { ENTITY_TYPES, RELATION_TYPES } from '../rag/schema.js';
5
5
  export const listConfig = {
6
6
  name: 'list',
7
7
  description: 'List all entities or relations from the database.',
@@ -22,38 +22,43 @@ export const listSchema = z.object({
22
22
  });
23
23
  export async function list(input) {
24
24
  const { type, arc, entityType, relationType, dbPath } = listSchema.parse(input);
25
- const db = new Database(dbPath);
26
- await db.connect();
27
- try {
28
- if (type === 'entities') {
29
- const entities = await db.getEntities(arc, entityType);
30
- return {
31
- type: 'entities',
32
- results: entities.map((e) => ({
33
- id: e.id,
34
- name: e.name,
35
- type: e.type,
36
- description: e.description,
37
- aliases: e.aliases,
38
- chapter_count: e.chapter_count,
39
- })),
40
- };
41
- }
42
- const relations = await db.getRelations(arc, relationType);
25
+ const { storage } = createEchoesRAG({ dbPath, arc });
26
+ if (type === 'entities') {
27
+ const entities = await storage.graph.getEntities(entityType ? { type: entityType } : undefined);
43
28
  return {
44
- type: 'relations',
45
- results: relations.map((r) => ({
46
- id: r.id,
47
- source_entity: r.source_entity,
48
- target_entity: r.target_entity,
49
- type: r.type,
50
- description: r.description,
51
- chapters: r.chapters,
29
+ type: 'entities',
30
+ results: entities.map((e) => ({
31
+ id: e.id,
32
+ name: e.name,
33
+ type: e.type,
34
+ description: e.description,
35
+ aliases: e.fields?.aliases ?? [],
36
+ chapter_count: e.sourceChunkIds.length,
52
37
  })),
53
38
  };
54
39
  }
55
- finally {
56
- db.close();
40
+ // type === 'relations'
41
+ const entities = await storage.graph.getEntities();
42
+ const seen = new Set();
43
+ const results = [];
44
+ for (const entity of entities) {
45
+ const rels = await storage.graph.getRelations(entity.id, 'out');
46
+ for (const r of rels) {
47
+ if (seen.has(r.id))
48
+ continue;
49
+ seen.add(r.id);
50
+ if (relationType && r.type !== relationType)
51
+ continue;
52
+ results.push({
53
+ id: r.id,
54
+ source_entity: r.sourceId,
55
+ target_entity: r.targetId,
56
+ type: r.type,
57
+ description: r.description,
58
+ chapters: r.sourceChunkIds ?? [],
59
+ });
60
+ }
57
61
  }
62
+ return { type: 'relations', results };
58
63
  }
59
64
  //# sourceMappingURL=list.js.map