@echoes-io/mcp-server 4.1.1 → 6.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +120 -185
- package/cli/index.d.ts +1 -0
- package/cli/index.d.ts.map +1 -0
- package/cli/index.js +3 -185
- package/cli/index.js.map +1 -0
- package/cli/program.d.ts +3 -0
- package/cli/program.d.ts.map +1 -0
- package/cli/program.js +151 -0
- package/cli/program.js.map +1 -0
- package/lib/constants.d.ts +8 -0
- package/lib/constants.d.ts.map +1 -0
- package/lib/constants.js +12 -0
- package/lib/constants.js.map +1 -0
- package/lib/database/index.d.ts +34 -0
- package/lib/database/index.d.ts.map +1 -0
- package/lib/database/index.js +266 -0
- package/lib/database/index.js.map +1 -0
- package/lib/database/schemas.d.ts +55 -0
- package/lib/database/schemas.d.ts.map +1 -0
- package/lib/database/schemas.js +70 -0
- package/lib/database/schemas.js.map +1 -0
- package/lib/indexer/embeddings.d.ts +6 -0
- package/lib/indexer/embeddings.d.ts.map +1 -0
- package/lib/indexer/embeddings.js +51 -0
- package/lib/indexer/embeddings.js.map +1 -0
- package/lib/indexer/extractor.d.ts +81 -0
- package/lib/indexer/extractor.d.ts.map +1 -0
- package/lib/indexer/extractor.js +68 -0
- package/lib/indexer/extractor.js.map +1 -0
- package/lib/indexer/scanner.d.ts +8 -0
- package/lib/indexer/scanner.d.ts.map +1 -0
- package/lib/indexer/scanner.js +73 -0
- package/lib/indexer/scanner.js.map +1 -0
- package/lib/indexer/tasks.d.ts +32 -0
- package/lib/indexer/tasks.d.ts.map +1 -0
- package/lib/indexer/tasks.js +228 -0
- package/lib/indexer/tasks.js.map +1 -0
- package/lib/prompts/index.d.ts +13 -0
- package/lib/prompts/index.d.ts.map +1 -0
- package/lib/prompts/index.js +153 -0
- package/lib/prompts/index.js.map +1 -0
- package/lib/server.d.ts +13 -0
- package/lib/server.d.ts.map +1 -0
- package/lib/server.js +90 -0
- package/lib/server.js.map +1 -0
- package/lib/tools/index.d.ts +14 -0
- package/lib/tools/index.d.ts.map +1 -0
- package/lib/tools/index.js +25 -0
- package/lib/tools/index.js.map +1 -0
- package/lib/tools/search.d.ts +86 -0
- package/lib/tools/search.d.ts.map +1 -0
- package/lib/tools/search.js +95 -0
- package/lib/tools/search.js.map +1 -0
- package/lib/tools/stats.d.ts +18 -0
- package/lib/tools/stats.d.ts.map +1 -0
- package/lib/tools/stats.js +62 -0
- package/lib/tools/stats.js.map +1 -0
- package/{src → lib}/tools/words-count.d.ts +6 -3
- package/lib/tools/words-count.d.ts.map +1 -0
- package/lib/tools/words-count.js +31 -0
- package/lib/tools/words-count.js.map +1 -0
- package/{src/types/frontmatter.d.ts → lib/types.d.ts} +11 -17
- package/lib/types.d.ts.map +1 -0
- package/lib/types.js +2 -0
- package/lib/types.js.map +1 -0
- package/lib/utils.d.ts +19 -0
- package/lib/utils.d.ts.map +1 -0
- package/lib/utils.js +40 -0
- package/lib/utils.js.map +1 -0
- package/package.json +60 -62
- package/src/database/index.d.ts +0 -6
- package/src/database/index.js +0 -26
- package/src/database/relations.d.ts +0 -744
- package/src/database/relations.js +0 -52
- package/src/database/schema.d.ts +0 -733
- package/src/database/schema.js +0 -69
- package/src/database/vector.d.ts +0 -25
- package/src/database/vector.js +0 -98
- package/src/index.d.ts +0 -5
- package/src/index.js +0 -5
- package/src/rag/character-ner.d.ts +0 -36
- package/src/rag/character-ner.js +0 -416
- package/src/rag/database-sync.d.ts +0 -38
- package/src/rag/database-sync.js +0 -158
- package/src/rag/embeddings.d.ts +0 -74
- package/src/rag/embeddings.js +0 -164
- package/src/rag/graph-rag.d.ts +0 -69
- package/src/rag/graph-rag.js +0 -311
- package/src/rag/hybrid-rag.d.ts +0 -109
- package/src/rag/hybrid-rag.js +0 -255
- package/src/rag/index.d.ts +0 -16
- package/src/rag/index.js +0 -33
- package/src/server.d.ts +0 -43
- package/src/server.js +0 -177
- package/src/tools/index-rag.d.ts +0 -19
- package/src/tools/index-rag.js +0 -85
- package/src/tools/index-tracker.d.ts +0 -17
- package/src/tools/index-tracker.js +0 -89
- package/src/tools/index.d.ts +0 -5
- package/src/tools/index.js +0 -5
- package/src/tools/rag-context.d.ts +0 -34
- package/src/tools/rag-context.js +0 -51
- package/src/tools/rag-search.d.ts +0 -35
- package/src/tools/rag-search.js +0 -60
- package/src/tools/words-count.js +0 -28
- package/src/types/frontmatter.js +0 -1
- package/src/utils/index.d.ts +0 -1
- package/src/utils/index.js +0 -1
- package/src/utils/markdown.d.ts +0 -6
- package/src/utils/markdown.js +0 -36
- package/src/utils/timeline-detection.d.ts +0 -13
- 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,32 @@
|
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
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;AAiKD,wBAAsB,aAAa,CACjC,KAAK,EAAE,eAAe,EACtB,MAAM,UAAQ,GACb,OAAO,CAAC,gBAAgB,CAAC,CAsE3B"}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
import { Listr, PRESET_TIMER } from 'listr2';
|
|
2
|
+
import { Database } from '../database/index.js';
|
|
3
|
+
import { generateEmbedding } 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: 'Scanning filesystem',
|
|
29
|
+
task: async (ctx, task) => {
|
|
30
|
+
const { chapters } = scanTimeline(ctx.contentPath, ctx.arc);
|
|
31
|
+
ctx.scanned = chapters;
|
|
32
|
+
const existingHashes = await ctx.db.getChapterHashes();
|
|
33
|
+
ctx.toIndex = chapters.filter((ch) => ctx.force || existingHashes.get(ch.file_path) !== ch.file_hash);
|
|
34
|
+
const currentPaths = new Set(chapters.map((c) => c.file_path));
|
|
35
|
+
ctx.toDelete = [...existingHashes.keys()].filter((p) => !currentPaths.has(p));
|
|
36
|
+
task.title = `Scanning filesystem (${chapters.length} chapters, ${ctx.toIndex.length} to index)`;
|
|
37
|
+
},
|
|
38
|
+
},
|
|
39
|
+
{
|
|
40
|
+
title: 'Processing chapters',
|
|
41
|
+
skip: (ctx) => ctx.toIndex.length === 0,
|
|
42
|
+
task: async (ctx, task) => {
|
|
43
|
+
const startTime = Date.now();
|
|
44
|
+
for (let i = 0; i < ctx.toIndex.length; i++) {
|
|
45
|
+
const chapter = ctx.toIndex[i];
|
|
46
|
+
const bar = formatProgressBar(i + 1, ctx.toIndex.length);
|
|
47
|
+
const eta = formatEta(startTime, i + 1, ctx.toIndex.length);
|
|
48
|
+
// Embedding phase
|
|
49
|
+
task.output =
|
|
50
|
+
`${bar} | ETA: ${eta}\n` +
|
|
51
|
+
`${chapter.id} - Generating embedding...\n` +
|
|
52
|
+
`👤 ${ctx.entities.size} entities | 🔗 ${ctx.relations.size} relations`;
|
|
53
|
+
const vector = await generateEmbedding(chapter.content, ctx.db.embeddingModel);
|
|
54
|
+
// Extraction phase
|
|
55
|
+
task.output =
|
|
56
|
+
`${bar} | ETA: ${eta}\n` +
|
|
57
|
+
`${chapter.id} - Extracting entities...\n` +
|
|
58
|
+
`👤 ${ctx.entities.size} entities | 🔗 ${ctx.relations.size} relations`;
|
|
59
|
+
const { entities, relations } = await extractEntities(chapter.content);
|
|
60
|
+
// Build and save chapter record
|
|
61
|
+
const chapterRecord = {
|
|
62
|
+
...chapter,
|
|
63
|
+
vector,
|
|
64
|
+
entities: entities.map((e) => `${chapter.arc}:${e.type}:${e.name}`),
|
|
65
|
+
indexed_at: Date.now(),
|
|
66
|
+
};
|
|
67
|
+
await ctx.db.upsertChapters([chapterRecord]);
|
|
68
|
+
ctx.processedCount++;
|
|
69
|
+
// Aggregate entities
|
|
70
|
+
for (const entity of entities) {
|
|
71
|
+
const entityId = `${chapter.arc}:${entity.type}:${entity.name}`;
|
|
72
|
+
const existing = ctx.entities.get(entityId);
|
|
73
|
+
if (existing) {
|
|
74
|
+
existing.chapters.push(chapter.id);
|
|
75
|
+
existing.chapter_count++;
|
|
76
|
+
for (const alias of entity.aliases) {
|
|
77
|
+
if (!existing.aliases.includes(alias)) {
|
|
78
|
+
existing.aliases.push(alias);
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
ctx.entities.set(entityId, {
|
|
84
|
+
id: entityId,
|
|
85
|
+
arc: chapter.arc,
|
|
86
|
+
name: entity.name,
|
|
87
|
+
type: entity.type,
|
|
88
|
+
description: entity.description,
|
|
89
|
+
aliases: entity.aliases,
|
|
90
|
+
vector: [],
|
|
91
|
+
chapters: [chapter.id],
|
|
92
|
+
chapter_count: 1,
|
|
93
|
+
first_appearance: chapter.id,
|
|
94
|
+
indexed_at: Date.now(),
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
// Aggregate relations
|
|
99
|
+
for (const relation of relations) {
|
|
100
|
+
const relationId = `${chapter.arc}:${relation.source}:${relation.type}:${relation.target}`;
|
|
101
|
+
const existing = ctx.relations.get(relationId);
|
|
102
|
+
if (existing) {
|
|
103
|
+
if (!existing.chapters.includes(chapter.id)) {
|
|
104
|
+
existing.chapters.push(chapter.id);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
else {
|
|
108
|
+
ctx.relations.set(relationId, {
|
|
109
|
+
id: relationId,
|
|
110
|
+
arc: chapter.arc,
|
|
111
|
+
source_entity: `${chapter.arc}:CHARACTER:${relation.source}`,
|
|
112
|
+
target_entity: `${chapter.arc}:CHARACTER:${relation.target}`,
|
|
113
|
+
type: relation.type,
|
|
114
|
+
description: relation.description,
|
|
115
|
+
weight: 0.5,
|
|
116
|
+
chapters: [chapter.id],
|
|
117
|
+
indexed_at: Date.now(),
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
task.title = `Processing chapters (${ctx.toIndex.length} chapters)`;
|
|
123
|
+
task.output = `👤 ${ctx.entities.size} entities | 🔗 ${ctx.relations.size} relations`;
|
|
124
|
+
},
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
title: 'Generating entity embeddings',
|
|
128
|
+
skip: (ctx) => ctx.entities.size === 0,
|
|
129
|
+
task: async (ctx, task) => {
|
|
130
|
+
const entities = [...ctx.entities.values()];
|
|
131
|
+
const startTime = Date.now();
|
|
132
|
+
for (let i = 0; i < entities.length; i++) {
|
|
133
|
+
const entity = entities[i];
|
|
134
|
+
const bar = formatProgressBar(i + 1, entities.length);
|
|
135
|
+
const eta = formatEta(startTime, i + 1, entities.length);
|
|
136
|
+
task.output = `${bar} | ETA: ${eta}\n${entity.name}`;
|
|
137
|
+
entity.vector = await generateEmbedding(`${entity.name}: ${entity.description}`, ctx.db.embeddingModel);
|
|
138
|
+
}
|
|
139
|
+
task.title = `Generating entity embeddings (${entities.length} entities)`;
|
|
140
|
+
},
|
|
141
|
+
},
|
|
142
|
+
{
|
|
143
|
+
title: 'Saving to database',
|
|
144
|
+
skip: (ctx) => ctx.entities.size === 0 && ctx.relations.size === 0 && ctx.toDelete.length === 0,
|
|
145
|
+
task: async (ctx, task) => {
|
|
146
|
+
if (ctx.entities.size > 0) {
|
|
147
|
+
await ctx.db.upsertEntities([...ctx.entities.values()]);
|
|
148
|
+
}
|
|
149
|
+
if (ctx.relations.size > 0) {
|
|
150
|
+
await ctx.db.upsertRelations([...ctx.relations.values()]);
|
|
151
|
+
}
|
|
152
|
+
if (ctx.toDelete.length > 0) {
|
|
153
|
+
await ctx.db.deleteChaptersByPaths(ctx.toDelete);
|
|
154
|
+
}
|
|
155
|
+
task.title = `Saving to database (${ctx.entities.size} entities, ${ctx.relations.size} relations)`;
|
|
156
|
+
},
|
|
157
|
+
},
|
|
158
|
+
];
|
|
159
|
+
}
|
|
160
|
+
export async function runIndexTasks(input, silent = false) {
|
|
161
|
+
// Initialize database before creating tasks
|
|
162
|
+
const db = new Database(input.dbPath);
|
|
163
|
+
await db.connect();
|
|
164
|
+
const baseCtx = {
|
|
165
|
+
...input,
|
|
166
|
+
force: input.force ?? false,
|
|
167
|
+
db,
|
|
168
|
+
scanned: [],
|
|
169
|
+
toIndex: [],
|
|
170
|
+
toDelete: [],
|
|
171
|
+
entities: new Map(),
|
|
172
|
+
relations: new Map(),
|
|
173
|
+
processedCount: 0,
|
|
174
|
+
};
|
|
175
|
+
const tasks = silent
|
|
176
|
+
? new Listr(createTasks(), {
|
|
177
|
+
concurrent: false,
|
|
178
|
+
renderer: 'silent',
|
|
179
|
+
ctx: baseCtx,
|
|
180
|
+
})
|
|
181
|
+
: new Listr(createTasks(), {
|
|
182
|
+
concurrent: false,
|
|
183
|
+
renderer: 'default',
|
|
184
|
+
rendererOptions: {
|
|
185
|
+
collapseSubtasks: false,
|
|
186
|
+
timer: PRESET_TIMER,
|
|
187
|
+
},
|
|
188
|
+
ctx: baseCtx,
|
|
189
|
+
});
|
|
190
|
+
// Handle SIGINT for graceful shutdown
|
|
191
|
+
/* c8 ignore start */
|
|
192
|
+
let cancelled = false;
|
|
193
|
+
const sigintHandler = () => {
|
|
194
|
+
cancelled = true;
|
|
195
|
+
};
|
|
196
|
+
process.on('SIGINT', sigintHandler);
|
|
197
|
+
/* c8 ignore stop */
|
|
198
|
+
try {
|
|
199
|
+
const ctx = await tasks.run();
|
|
200
|
+
return {
|
|
201
|
+
indexed: ctx.toIndex.length,
|
|
202
|
+
skipped: ctx.scanned.length - ctx.toIndex.length,
|
|
203
|
+
deleted: ctx.toDelete.length,
|
|
204
|
+
entities: ctx.entities.size,
|
|
205
|
+
relations: ctx.relations.size,
|
|
206
|
+
};
|
|
207
|
+
}
|
|
208
|
+
catch (error) {
|
|
209
|
+
/* c8 ignore start */
|
|
210
|
+
if (cancelled) {
|
|
211
|
+
// Return partial results on cancellation
|
|
212
|
+
return {
|
|
213
|
+
indexed: baseCtx.processedCount,
|
|
214
|
+
skipped: baseCtx.scanned.length - baseCtx.toIndex.length,
|
|
215
|
+
deleted: 0,
|
|
216
|
+
entities: baseCtx.entities.size,
|
|
217
|
+
relations: baseCtx.relations.size,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
/* c8 ignore stop */
|
|
221
|
+
throw error;
|
|
222
|
+
}
|
|
223
|
+
finally {
|
|
224
|
+
process.off('SIGINT', sigintHandler);
|
|
225
|
+
db.close();
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
//# sourceMappingURL=tasks.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tasks.js","sourceRoot":"","sources":["tasks.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"}
|