@echoes-io/mcp-server 4.1.1 → 6.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 (108) hide show
  1. package/README.md +120 -185
  2. package/cli/index.d.ts +1 -0
  3. package/cli/index.d.ts.map +1 -0
  4. package/cli/index.js +3 -185
  5. package/cli/index.js.map +1 -0
  6. package/cli/program.d.ts +3 -0
  7. package/cli/program.d.ts.map +1 -0
  8. package/cli/program.js +150 -0
  9. package/cli/program.js.map +1 -0
  10. package/lib/constants.d.ts +8 -0
  11. package/lib/constants.d.ts.map +1 -0
  12. package/lib/constants.js +12 -0
  13. package/lib/constants.js.map +1 -0
  14. package/lib/database/index.d.ts +34 -0
  15. package/lib/database/index.d.ts.map +1 -0
  16. package/lib/database/index.js +266 -0
  17. package/lib/database/index.js.map +1 -0
  18. package/lib/database/schemas.d.ts +55 -0
  19. package/lib/database/schemas.d.ts.map +1 -0
  20. package/lib/database/schemas.js +70 -0
  21. package/lib/database/schemas.js.map +1 -0
  22. package/lib/indexer/embeddings.d.ts +6 -0
  23. package/lib/indexer/embeddings.d.ts.map +1 -0
  24. package/lib/indexer/embeddings.js +51 -0
  25. package/lib/indexer/embeddings.js.map +1 -0
  26. package/lib/indexer/extractor.d.ts +81 -0
  27. package/lib/indexer/extractor.d.ts.map +1 -0
  28. package/lib/indexer/extractor.js +68 -0
  29. package/lib/indexer/extractor.js.map +1 -0
  30. package/lib/indexer/scanner.d.ts +8 -0
  31. package/lib/indexer/scanner.d.ts.map +1 -0
  32. package/lib/indexer/scanner.js +73 -0
  33. package/lib/indexer/scanner.js.map +1 -0
  34. package/lib/prompts/index.d.ts +13 -0
  35. package/lib/prompts/index.d.ts.map +1 -0
  36. package/lib/prompts/index.js +153 -0
  37. package/lib/prompts/index.js.map +1 -0
  38. package/lib/server.d.ts +13 -0
  39. package/lib/server.d.ts.map +1 -0
  40. package/lib/server.js +90 -0
  41. package/lib/server.js.map +1 -0
  42. package/lib/tools/index.d.ts +19 -0
  43. package/lib/tools/index.d.ts.map +1 -0
  44. package/lib/tools/index.js +128 -0
  45. package/lib/tools/index.js.map +1 -0
  46. package/lib/tools/search.d.ts +86 -0
  47. package/lib/tools/search.d.ts.map +1 -0
  48. package/lib/tools/search.js +95 -0
  49. package/lib/tools/search.js.map +1 -0
  50. package/lib/tools/stats.d.ts +18 -0
  51. package/lib/tools/stats.d.ts.map +1 -0
  52. package/lib/tools/stats.js +62 -0
  53. package/lib/tools/stats.js.map +1 -0
  54. package/{src → lib}/tools/words-count.d.ts +6 -3
  55. package/lib/tools/words-count.d.ts.map +1 -0
  56. package/lib/tools/words-count.js +31 -0
  57. package/lib/tools/words-count.js.map +1 -0
  58. package/{src/types/frontmatter.d.ts → lib/types.d.ts} +11 -17
  59. package/lib/types.d.ts.map +1 -0
  60. package/lib/types.js +2 -0
  61. package/lib/types.js.map +1 -0
  62. package/lib/utils.d.ts +19 -0
  63. package/lib/utils.d.ts.map +1 -0
  64. package/lib/utils.js +40 -0
  65. package/lib/utils.js.map +1 -0
  66. package/package.json +59 -62
  67. package/src/database/index.d.ts +0 -6
  68. package/src/database/index.js +0 -26
  69. package/src/database/relations.d.ts +0 -744
  70. package/src/database/relations.js +0 -52
  71. package/src/database/schema.d.ts +0 -733
  72. package/src/database/schema.js +0 -69
  73. package/src/database/vector.d.ts +0 -25
  74. package/src/database/vector.js +0 -98
  75. package/src/index.d.ts +0 -5
  76. package/src/index.js +0 -5
  77. package/src/rag/character-ner.d.ts +0 -36
  78. package/src/rag/character-ner.js +0 -416
  79. package/src/rag/database-sync.d.ts +0 -38
  80. package/src/rag/database-sync.js +0 -158
  81. package/src/rag/embeddings.d.ts +0 -74
  82. package/src/rag/embeddings.js +0 -164
  83. package/src/rag/graph-rag.d.ts +0 -69
  84. package/src/rag/graph-rag.js +0 -311
  85. package/src/rag/hybrid-rag.d.ts +0 -109
  86. package/src/rag/hybrid-rag.js +0 -255
  87. package/src/rag/index.d.ts +0 -16
  88. package/src/rag/index.js +0 -33
  89. package/src/server.d.ts +0 -43
  90. package/src/server.js +0 -177
  91. package/src/tools/index-rag.d.ts +0 -19
  92. package/src/tools/index-rag.js +0 -85
  93. package/src/tools/index-tracker.d.ts +0 -17
  94. package/src/tools/index-tracker.js +0 -89
  95. package/src/tools/index.d.ts +0 -5
  96. package/src/tools/index.js +0 -5
  97. package/src/tools/rag-context.d.ts +0 -34
  98. package/src/tools/rag-context.js +0 -51
  99. package/src/tools/rag-search.d.ts +0 -35
  100. package/src/tools/rag-search.js +0 -60
  101. package/src/tools/words-count.js +0 -28
  102. package/src/types/frontmatter.js +0 -1
  103. package/src/utils/index.d.ts +0 -1
  104. package/src/utils/index.js +0 -1
  105. package/src/utils/markdown.d.ts +0 -6
  106. package/src/utils/markdown.js +0 -36
  107. package/src/utils/timeline-detection.d.ts +0 -13
  108. package/src/utils/timeline-detection.js +0 -76
@@ -0,0 +1,6 @@
1
+ export declare function getEmbeddingModel(): string;
2
+ export declare function getEmbeddingDimension(model?: string): Promise<number>;
3
+ export declare function generateEmbedding(text: string, model?: string): Promise<number[]>;
4
+ export declare function generateEmbeddings(texts: string[], model?: string): Promise<number[][]>;
5
+ export declare function resetExtractor(): void;
6
+ //# sourceMappingURL=embeddings.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["embeddings.ts"],"names":[],"mappings":"AAaA,wBAAgB,iBAAiB,IAAI,MAAM,CAE1C;AAED,wBAAsB,qBAAqB,CAAC,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU3E;AAkBD,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAKvF;AAED,wBAAsB,kBAAkB,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAU7F;AAED,wBAAgB,cAAc,IAAI,IAAI,CAIrC"}
@@ -0,0 +1,51 @@
1
+ import { AutoConfig, pipeline, } from '@huggingface/transformers';
2
+ import { DEFAULT_EMBEDDING_MODEL } from '../constants.js';
3
+ let extractor = null;
4
+ let currentModel = null;
5
+ let cachedDimension = null;
6
+ export function getEmbeddingModel() {
7
+ return process.env.ECHOES_EMBEDDING_MODEL ?? DEFAULT_EMBEDDING_MODEL;
8
+ }
9
+ export async function getEmbeddingDimension(model) {
10
+ const m = model ?? getEmbeddingModel();
11
+ if (cachedDimension && currentModel === m) {
12
+ return cachedDimension;
13
+ }
14
+ const config = await AutoConfig.from_pretrained(m);
15
+ // @ts-expect-error hidden_size exists on transformer configs
16
+ return config.hidden_size;
17
+ }
18
+ async function getExtractor(model) {
19
+ if (extractor && currentModel === model) {
20
+ return extractor;
21
+ }
22
+ extractor = await pipeline('feature-extraction', model);
23
+ currentModel = model;
24
+ // Cache dimension when loading model
25
+ const config = await AutoConfig.from_pretrained(model);
26
+ // @ts-expect-error hidden_size exists on transformer configs
27
+ cachedDimension = config.hidden_size;
28
+ return extractor;
29
+ }
30
+ export async function generateEmbedding(text, model) {
31
+ const m = model ?? getEmbeddingModel();
32
+ const ext = await getExtractor(m);
33
+ const output = (await ext(text, { pooling: 'mean', normalize: true }));
34
+ return Array.from(output.data);
35
+ }
36
+ export async function generateEmbeddings(texts, model) {
37
+ if (texts.length === 0)
38
+ return [];
39
+ const m = model ?? getEmbeddingModel();
40
+ const ext = await getExtractor(m);
41
+ const output = (await ext(texts, { pooling: 'mean', normalize: true }));
42
+ const data = output.data;
43
+ const dim = output.dims[1];
44
+ return texts.map((_, i) => Array.from(data.slice(i * dim, (i + 1) * dim)));
45
+ }
46
+ export function resetExtractor() {
47
+ extractor = null;
48
+ currentModel = null;
49
+ cachedDimension = null;
50
+ }
51
+ //# sourceMappingURL=embeddings.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["embeddings.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,UAAU,EAEV,QAAQ,GAET,MAAM,2BAA2B,CAAC;AAEnC,OAAO,EAAE,uBAAuB,EAAE,MAAM,iBAAiB,CAAC;AAE1D,IAAI,SAAS,GAAqC,IAAI,CAAC;AACvD,IAAI,YAAY,GAAkB,IAAI,CAAC;AACvC,IAAI,eAAe,GAAkB,IAAI,CAAC;AAE1C,MAAM,UAAU,iBAAiB;IAC/B,OAAO,OAAO,CAAC,GAAG,CAAC,sBAAsB,IAAI,uBAAuB,CAAC;AACvE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAAC,KAAc;IACxD,MAAM,CAAC,GAAG,KAAK,IAAI,iBAAiB,EAAE,CAAC;IAEvC,IAAI,eAAe,IAAI,YAAY,KAAK,CAAC,EAAE,CAAC;QAC1C,OAAO,eAAe,CAAC;IACzB,CAAC;IAED,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;IACnD,6DAA6D;IAC7D,OAAO,MAAM,CAAC,WAAqB,CAAC;AACtC,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,KAAa;IACvC,IAAI,SAAS,IAAI,YAAY,KAAK,KAAK,EAAE,CAAC;QACxC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,SAAS,GAAG,MAAM,QAAQ,CAAC,oBAAoB,EAAE,KAAK,CAAC,CAAC;IACxD,YAAY,GAAG,KAAK,CAAC;IAErB,qCAAqC;IACrC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC;IACvD,6DAA6D;IAC7D,eAAe,GAAG,MAAM,CAAC,WAAqB,CAAC;IAE/C,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAY,EAAE,KAAc;IAClE,MAAM,CAAC,GAAG,KAAK,IAAI,iBAAiB,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,IAAI,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAW,CAAC;IACjF,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,IAAoB,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,KAAe,EAAE,KAAc;IACtE,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,EAAE,CAAC;IAElC,MAAM,CAAC,GAAG,KAAK,IAAI,iBAAiB,EAAE,CAAC;IACvC,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC,CAAC,CAAC,CAAC;IAClC,MAAM,MAAM,GAAG,CAAC,MAAM,GAAG,CAAC,KAAK,EAAE,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAW,CAAC;IAClF,MAAM,IAAI,GAAG,MAAM,CAAC,IAAoB,CAAC;IACzC,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAE3B,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,cAAc;IAC5B,SAAS,GAAG,IAAI,CAAC;IACjB,YAAY,GAAG,IAAI,CAAC;IACpB,eAAe,GAAG,IAAI,CAAC;AACzB,CAAC"}
@@ -0,0 +1,81 @@
1
+ import { z } from 'zod';
2
+ declare const ExtractedEntitySchema: z.ZodObject<{
3
+ name: z.ZodString;
4
+ type: z.ZodEnum<{
5
+ CHARACTER: "CHARACTER";
6
+ LOCATION: "LOCATION";
7
+ EVENT: "EVENT";
8
+ OBJECT: "OBJECT";
9
+ EMOTION: "EMOTION";
10
+ }>;
11
+ description: z.ZodString;
12
+ aliases: z.ZodArray<z.ZodString>;
13
+ }, z.core.$strip>;
14
+ declare const ExtractedRelationSchema: z.ZodObject<{
15
+ source: z.ZodString;
16
+ target: z.ZodString;
17
+ type: z.ZodEnum<{
18
+ LOVES: "LOVES";
19
+ HATES: "HATES";
20
+ KNOWS: "KNOWS";
21
+ RELATED_TO: "RELATED_TO";
22
+ FRIENDS_WITH: "FRIENDS_WITH";
23
+ ENEMIES_WITH: "ENEMIES_WITH";
24
+ LOCATED_IN: "LOCATED_IN";
25
+ LIVES_IN: "LIVES_IN";
26
+ TRAVELS_TO: "TRAVELS_TO";
27
+ HAPPENS_BEFORE: "HAPPENS_BEFORE";
28
+ HAPPENS_AFTER: "HAPPENS_AFTER";
29
+ CAUSES: "CAUSES";
30
+ OWNS: "OWNS";
31
+ USES: "USES";
32
+ SEEKS: "SEEKS";
33
+ }>;
34
+ description: z.ZodString;
35
+ }, z.core.$strip>;
36
+ declare const ExtractionResultSchema: z.ZodObject<{
37
+ entities: z.ZodArray<z.ZodObject<{
38
+ name: z.ZodString;
39
+ type: z.ZodEnum<{
40
+ CHARACTER: "CHARACTER";
41
+ LOCATION: "LOCATION";
42
+ EVENT: "EVENT";
43
+ OBJECT: "OBJECT";
44
+ EMOTION: "EMOTION";
45
+ }>;
46
+ description: z.ZodString;
47
+ aliases: z.ZodArray<z.ZodString>;
48
+ }, z.core.$strip>>;
49
+ relations: z.ZodArray<z.ZodObject<{
50
+ source: z.ZodString;
51
+ target: z.ZodString;
52
+ type: z.ZodEnum<{
53
+ LOVES: "LOVES";
54
+ HATES: "HATES";
55
+ KNOWS: "KNOWS";
56
+ RELATED_TO: "RELATED_TO";
57
+ FRIENDS_WITH: "FRIENDS_WITH";
58
+ ENEMIES_WITH: "ENEMIES_WITH";
59
+ LOCATED_IN: "LOCATED_IN";
60
+ LIVES_IN: "LIVES_IN";
61
+ TRAVELS_TO: "TRAVELS_TO";
62
+ HAPPENS_BEFORE: "HAPPENS_BEFORE";
63
+ HAPPENS_AFTER: "HAPPENS_AFTER";
64
+ CAUSES: "CAUSES";
65
+ OWNS: "OWNS";
66
+ USES: "USES";
67
+ SEEKS: "SEEKS";
68
+ }>;
69
+ description: z.ZodString;
70
+ }, z.core.$strip>>;
71
+ }, z.core.$strip>;
72
+ export type ExtractedEntity = z.infer<typeof ExtractedEntitySchema>;
73
+ export type ExtractedRelation = z.infer<typeof ExtractedRelationSchema>;
74
+ export type ExtractionResult = z.infer<typeof ExtractionResultSchema>;
75
+ export interface ExtractorConfig {
76
+ model?: string;
77
+ }
78
+ export declare function extractEntities(content: string, config?: ExtractorConfig): Promise<ExtractionResult>;
79
+ export declare function resetClient(): void;
80
+ export {};
81
+ //# sourceMappingURL=extractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.d.ts","sourceRoot":"","sources":["extractor.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAKxB,QAAA,MAAM,qBAAqB;;;;;;;;;;;iBAKzB,CAAC;AAEH,QAAA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;iBAK3B,CAAC;AAEH,QAAA,MAAM,sBAAsB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;iBAG1B,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AACpE,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,uBAAuB,CAAC,CAAC;AACxE,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,sBAAsB,CAAC,CAAC;AAgCtE,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAID,wBAAsB,eAAe,CACnC,OAAO,EAAE,MAAM,EACf,MAAM,CAAC,EAAE,eAAe,GACvB,OAAO,CAAC,gBAAgB,CAAC,CAmB3B;AAED,wBAAgB,WAAW,IAAI,IAAI,CAElC"}
@@ -0,0 +1,68 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["extractor.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
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
@@ -0,0 +1 @@
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"}
@@ -0,0 +1,73 @@
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
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scanner.js","sourceRoot":"","sources":["scanner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import z from 'zod';
2
+ export interface PromptConfig {
3
+ name: string;
4
+ description: string;
5
+ args: z.ZodRawShape;
6
+ }
7
+ export declare const PROMPTS: PromptConfig[];
8
+ export interface GetPromptOptions {
9
+ timeline?: string;
10
+ contentPath?: string;
11
+ }
12
+ export declare function getPrompt(name: string, args: Record<string, string>, options?: GetPromptOptions): string;
13
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAGA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,CAAC,CAAC,WAAW,CAAC;CACrB;AAED,eAAO,MAAM,OAAO,EAAE,YAAY,EAuDjC,CAAC;AA6EF,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,wBAAgB,SAAS,CACvB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,EAC5B,OAAO,GAAE,gBAAqB,GAC7B,MAAM,CAoCR"}
@@ -0,0 +1,153 @@
1
+ import { existsSync, readdirSync, readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ import z from 'zod';
4
+ export const PROMPTS = [
5
+ {
6
+ name: 'new-chapter',
7
+ description: 'Create a new chapter for a timeline arc',
8
+ args: {
9
+ arc: z.string().describe("Arc name (e.g., 'work', 'anima')"),
10
+ chapter: z.string().describe("Chapter number (e.g., '1', '12')"),
11
+ },
12
+ },
13
+ {
14
+ name: 'revise-chapter',
15
+ description: 'Revise an existing chapter with specific improvements',
16
+ args: {
17
+ arc: z.string().describe('Arc name'),
18
+ chapter: z.string().describe('Chapter number'),
19
+ },
20
+ },
21
+ {
22
+ name: 'expand-chapter',
23
+ description: 'Expand a chapter to reach target word count',
24
+ args: {
25
+ arc: z.string().describe('Arc name'),
26
+ chapter: z.string().describe('Chapter number'),
27
+ target: z.string().describe("Target word count (e.g., '4000')"),
28
+ },
29
+ },
30
+ {
31
+ name: 'new-character',
32
+ description: 'Create a new character sheet',
33
+ args: {
34
+ name: z.string().describe('Character name'),
35
+ },
36
+ },
37
+ {
38
+ name: 'new-episode',
39
+ description: 'Create a new episode outline',
40
+ args: {
41
+ arc: z.string().describe('Arc name'),
42
+ episode: z.string().describe('Episode number'),
43
+ },
44
+ },
45
+ {
46
+ name: 'new-arc',
47
+ description: 'Create a new story arc',
48
+ args: {
49
+ name: z.string().describe('Arc name (lowercase, no spaces)'),
50
+ },
51
+ },
52
+ {
53
+ name: 'revise-arc',
54
+ description: 'Review and fix an entire arc',
55
+ args: {
56
+ arc: z.string().describe('Arc name to revise'),
57
+ },
58
+ },
59
+ ];
60
+ function getGithubPromptsPath() {
61
+ const path = join(process.cwd(), '..', '.github', '.kiro', 'prompts');
62
+ return existsSync(path) ? path : null;
63
+ }
64
+ function getLocalPromptsPath() {
65
+ const path = join(process.cwd(), '.kiro', 'prompts');
66
+ return existsSync(path) ? path : null;
67
+ }
68
+ function getAvailableArcs(contentPath) {
69
+ if (!existsSync(contentPath))
70
+ return [];
71
+ return readdirSync(contentPath, { withFileTypes: true })
72
+ .filter((d) => d.isDirectory() && !d.name.startsWith('.'))
73
+ .map((d) => d.name)
74
+ .sort();
75
+ }
76
+ function validateArgs(promptName, args, contentPath) {
77
+ const arcs = getAvailableArcs(contentPath);
78
+ const requireArcExists = (arc) => {
79
+ if (!arcs.includes(arc)) {
80
+ throw new Error(`Arc "${arc}" not found. Available: ${arcs.join(', ') || 'none'}`);
81
+ }
82
+ };
83
+ const requireNumber = (value, name) => {
84
+ if (!/^\d+$/.test(value)) {
85
+ throw new Error(`${name} must be a number, got: "${value}"`);
86
+ }
87
+ };
88
+ switch (promptName) {
89
+ case 'new-chapter':
90
+ case 'revise-chapter':
91
+ case 'expand-chapter':
92
+ requireArcExists(args.arc);
93
+ requireNumber(args.chapter, 'Chapter');
94
+ if (promptName === 'expand-chapter') {
95
+ requireNumber(args.target, 'Target');
96
+ }
97
+ break;
98
+ case 'new-episode':
99
+ requireArcExists(args.arc);
100
+ requireNumber(args.episode, 'Episode');
101
+ break;
102
+ case 'new-arc':
103
+ if (arcs.includes(args.name)) {
104
+ throw new Error(`Arc "${args.name}" already exists.`);
105
+ }
106
+ break;
107
+ case 'revise-arc':
108
+ requireArcExists(args.arc);
109
+ break;
110
+ }
111
+ }
112
+ function substitutePlaceholders(template, args, timeline) {
113
+ const replacements = {
114
+ TIMELINE: timeline,
115
+ ...Object.fromEntries(Object.entries(args).map(([k, v]) => [k.toUpperCase(), v])),
116
+ };
117
+ let result = template;
118
+ for (const [key, value] of Object.entries(replacements)) {
119
+ result = result.replace(new RegExp(`\\{${key}\\}`, 'gi'), value);
120
+ }
121
+ return result;
122
+ }
123
+ export function getPrompt(name, args, options = {}) {
124
+ const timeline = options.timeline ?? 'timeline';
125
+ const contentPath = options.contentPath ?? 'content';
126
+ // Validate .github repo
127
+ const githubPath = getGithubPromptsPath();
128
+ if (!githubPath) {
129
+ throw new Error('.github repository not found.\n' +
130
+ 'Clone it as sibling: git clone https://github.com/echoes-io/.github ../.github');
131
+ }
132
+ // Read base template
133
+ const basePath = join(githubPath, `${name}.md`);
134
+ if (!existsSync(basePath)) {
135
+ throw new Error(`Prompt template not found: ${name}.md\nExpected: ${basePath}`);
136
+ }
137
+ const basePrompt = readFileSync(basePath, 'utf-8');
138
+ // Read optional local override
139
+ const localPath = getLocalPromptsPath();
140
+ let overridePrompt = '';
141
+ if (localPath) {
142
+ const overridePath = join(localPath, `${name}.md`);
143
+ if (existsSync(overridePath)) {
144
+ overridePrompt = readFileSync(overridePath, 'utf-8');
145
+ }
146
+ }
147
+ // Validate args
148
+ validateArgs(name, args, contentPath);
149
+ // Combine and substitute
150
+ const combined = overridePrompt ? `${basePrompt}\n\n---\n\n${overridePrompt}` : basePrompt;
151
+ return substitutePlaceholders(combined, args, timeline);
152
+ }
153
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ type ToolResult = {
3
+ content: Array<{
4
+ type: 'text';
5
+ text: string;
6
+ }>;
7
+ isError?: boolean;
8
+ };
9
+ export declare function formatError(err: unknown): ToolResult;
10
+ export declare function createServer(): McpServer;
11
+ export declare function startServer(): Promise<void>;
12
+ export {};
13
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAUpE,KAAK,UAAU,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;IAAC,OAAO,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAMxF,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,GAAG,UAAU,CAGpD;AAED,wBAAgB,YAAY,IAAI,SAAS,CAoFxC;AAGD,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAIjD"}
package/lib/server.js ADDED
@@ -0,0 +1,90 @@
1
+ import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
2
+ import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
3
+ import { getPrompt, PROMPTS } from './prompts/index.js';
4
+ import { index, indexConfig, indexSchema } from './tools/index.js';
5
+ import { search, searchConfig, searchSchema } from './tools/search.js';
6
+ import { stats, statsConfig, statsSchema } from './tools/stats.js';
7
+ import { wordsCount, wordsCountConfig, wordsCountSchema } from './tools/words-count.js';
8
+ import { getPackageConfig } from './utils.js';
9
+ function success(data) {
10
+ return { content: [{ type: 'text', text: JSON.stringify(data, null, 2) }] };
11
+ }
12
+ export function formatError(err) {
13
+ const message = err instanceof Error ? err.message : String(err);
14
+ return { content: [{ type: 'text', text: `Error: ${message}` }], isError: true };
15
+ }
16
+ export function createServer() {
17
+ const { description, name, version } = getPackageConfig();
18
+ const server = new McpServer({ name, description, version });
19
+ // Register tools
20
+ server.registerTool(wordsCountConfig.name, {
21
+ description: wordsCountConfig.description,
22
+ inputSchema: wordsCountSchema,
23
+ }, async (args) => {
24
+ try {
25
+ return success(wordsCount(args));
26
+ }
27
+ catch (err) {
28
+ return formatError(err);
29
+ }
30
+ });
31
+ server.registerTool(statsConfig.name, {
32
+ description: statsConfig.description,
33
+ inputSchema: statsSchema,
34
+ }, async (args) => {
35
+ try {
36
+ return success(await stats(args));
37
+ }
38
+ catch (err) {
39
+ return formatError(err);
40
+ }
41
+ });
42
+ server.registerTool(indexConfig.name, {
43
+ description: indexConfig.description,
44
+ inputSchema: indexSchema,
45
+ }, async (args) => {
46
+ try {
47
+ return success(await index(args));
48
+ }
49
+ catch (err) {
50
+ return formatError(err);
51
+ }
52
+ });
53
+ server.registerTool(searchConfig.name, {
54
+ description: searchConfig.description,
55
+ inputSchema: searchSchema,
56
+ /* v8 ignore start */
57
+ }, async (args) => {
58
+ try {
59
+ return success(await search(args));
60
+ }
61
+ catch (err) {
62
+ return formatError(err);
63
+ }
64
+ });
65
+ /* v8 ignore stop */
66
+ // Register prompts
67
+ for (const prompt of PROMPTS) {
68
+ server.prompt(prompt.name, prompt.description, prompt.args, (args) => {
69
+ try {
70
+ const text = getPrompt(prompt.name, args);
71
+ return { messages: [{ role: 'user', content: { type: 'text', text } }] };
72
+ }
73
+ catch (err) {
74
+ const message = err instanceof Error ? err.message : /* v8 ignore next */ String(err);
75
+ return {
76
+ messages: [{ role: 'user', content: { type: 'text', text: `Error: ${message}` } }],
77
+ };
78
+ }
79
+ });
80
+ }
81
+ return server;
82
+ }
83
+ /* v8 ignore start */
84
+ export async function startServer() {
85
+ const server = createServer();
86
+ const transport = new StdioServerTransport();
87
+ await server.connect(transport);
88
+ }
89
+ /* v8 ignore stop */
90
+ //# sourceMappingURL=server.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["server.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ import z from 'zod';
2
+ import type { ToolConfig } from '../types.js';
3
+ export declare const indexConfig: ToolConfig;
4
+ export declare const indexSchema: z.ZodObject<{
5
+ contentPath: z.ZodString;
6
+ arc: z.ZodOptional<z.ZodString>;
7
+ force: z.ZodOptional<z.ZodBoolean>;
8
+ dbPath: z.ZodDefault<z.ZodString>;
9
+ }, z.z.core.$strip>;
10
+ export type IndexInput = z.infer<typeof indexSchema>;
11
+ export interface IndexOutput {
12
+ indexed: number;
13
+ skipped: number;
14
+ deleted: number;
15
+ entities: number;
16
+ relations: number;
17
+ }
18
+ export declare function index(input: IndexInput): Promise<IndexOutput>;
19
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAQpB,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,CA8HnE"}