@echoes-io/mcp-server 4.1.0 → 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.
- package/README.md +120 -185
- package/cli/index.d.ts +3 -0
- package/cli/index.d.ts.map +1 -0
- package/cli/index.js +4 -0
- 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 +150 -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/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 +19 -0
- package/lib/tools/index.d.ts.map +1 -0
- package/lib/tools/index.js +128 -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/lib/tools/words-count.d.ts +18 -0
- 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/lib/types.d.ts +29 -0
- 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 +59 -61
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import { existsSync, mkdirSync, readFileSync, writeFileSync } from 'node:fs';
|
|
2
|
+
import { join } from 'node:path';
|
|
3
|
+
import { connect } from '@lancedb/lancedb';
|
|
4
|
+
import { getEmbeddingDimension, getEmbeddingModel } from '../indexer/embeddings.js';
|
|
5
|
+
import { getPackageConfig } from '../utils.js';
|
|
6
|
+
import { createChapterSchema, createEntitySchema, RelationSchema, } from './schemas.js';
|
|
7
|
+
export class Database {
|
|
8
|
+
dbPath;
|
|
9
|
+
db = null;
|
|
10
|
+
tables = new Map();
|
|
11
|
+
migrationChecked = false;
|
|
12
|
+
metadata = null;
|
|
13
|
+
tableConfigs = null;
|
|
14
|
+
get metadataPath() {
|
|
15
|
+
return join(this.dbPath, 'metadata.json');
|
|
16
|
+
}
|
|
17
|
+
constructor(dbPath) {
|
|
18
|
+
this.dbPath = dbPath;
|
|
19
|
+
}
|
|
20
|
+
async getMetadata() {
|
|
21
|
+
if (this.metadata)
|
|
22
|
+
return this.metadata;
|
|
23
|
+
const model = getEmbeddingModel();
|
|
24
|
+
const dim = await getEmbeddingDimension(model);
|
|
25
|
+
this.metadata = {
|
|
26
|
+
version: getPackageConfig().version,
|
|
27
|
+
embeddingModel: model,
|
|
28
|
+
embeddingDim: dim,
|
|
29
|
+
};
|
|
30
|
+
return this.metadata;
|
|
31
|
+
}
|
|
32
|
+
async getTableConfigs() {
|
|
33
|
+
if (this.tableConfigs)
|
|
34
|
+
return this.tableConfigs;
|
|
35
|
+
const metadata = await this.getMetadata();
|
|
36
|
+
this.tableConfigs = {
|
|
37
|
+
chapters: { name: 'chapters', schema: createChapterSchema(metadata.embeddingDim) },
|
|
38
|
+
entities: { name: 'entities', schema: createEntitySchema(metadata.embeddingDim) },
|
|
39
|
+
relations: { name: 'relations', schema: RelationSchema },
|
|
40
|
+
};
|
|
41
|
+
return this.tableConfigs;
|
|
42
|
+
}
|
|
43
|
+
get embeddingModel() {
|
|
44
|
+
if (!this.metadata)
|
|
45
|
+
throw new Error('Database not connected');
|
|
46
|
+
return this.metadata.embeddingModel;
|
|
47
|
+
}
|
|
48
|
+
get embeddingDim() {
|
|
49
|
+
if (!this.metadata)
|
|
50
|
+
throw new Error('Database not connected');
|
|
51
|
+
return this.metadata.embeddingDim;
|
|
52
|
+
}
|
|
53
|
+
async getConnection() {
|
|
54
|
+
this.db ??= await connect(this.dbPath);
|
|
55
|
+
return this.db;
|
|
56
|
+
}
|
|
57
|
+
async checkMigration() {
|
|
58
|
+
if (this.migrationChecked)
|
|
59
|
+
return;
|
|
60
|
+
this.migrationChecked = true;
|
|
61
|
+
const current = await this.getMetadata();
|
|
62
|
+
if (!existsSync(this.metadataPath)) {
|
|
63
|
+
this.saveMetadata();
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
const stored = JSON.parse(readFileSync(this.metadataPath, 'utf-8'));
|
|
68
|
+
const reasons = [];
|
|
69
|
+
if (stored.version !== current.version) {
|
|
70
|
+
reasons.push(`version ${stored.version} → ${current.version}`);
|
|
71
|
+
}
|
|
72
|
+
if (stored.embeddingModel !== current.embeddingModel) {
|
|
73
|
+
reasons.push(`model ${stored.embeddingModel} → ${current.embeddingModel}`);
|
|
74
|
+
}
|
|
75
|
+
if (stored.embeddingDim !== current.embeddingDim) {
|
|
76
|
+
reasons.push(`dimension ${stored.embeddingDim} → ${current.embeddingDim}`);
|
|
77
|
+
}
|
|
78
|
+
if (reasons.length > 0) {
|
|
79
|
+
console.log(`🔄 Database config changed: ${reasons.join(', ')}`);
|
|
80
|
+
console.log('🗑️ Removing old database for re-indexing...');
|
|
81
|
+
const db = await this.getConnection();
|
|
82
|
+
const existingTables = await db.tableNames();
|
|
83
|
+
const configs = await this.getTableConfigs();
|
|
84
|
+
for (const config of Object.values(configs)) {
|
|
85
|
+
if (existingTables.includes(config.name)) {
|
|
86
|
+
await db.dropTable(config.name);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
this.tables.clear();
|
|
90
|
+
this.saveMetadata();
|
|
91
|
+
console.log('✅ Database ready for re-indexing');
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
this.saveMetadata();
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
saveMetadata() {
|
|
99
|
+
if (!existsSync(this.dbPath)) {
|
|
100
|
+
mkdirSync(this.dbPath, { recursive: true });
|
|
101
|
+
}
|
|
102
|
+
writeFileSync(this.metadataPath, JSON.stringify(this.metadata, null, 2));
|
|
103
|
+
}
|
|
104
|
+
async connect() {
|
|
105
|
+
await this.checkMigration();
|
|
106
|
+
return this.getConnection();
|
|
107
|
+
}
|
|
108
|
+
async getTable(config) {
|
|
109
|
+
const cached = this.tables.get(config.name);
|
|
110
|
+
if (cached)
|
|
111
|
+
return cached;
|
|
112
|
+
const db = await this.connect();
|
|
113
|
+
const existingTables = await db.tableNames();
|
|
114
|
+
const table = existingTables.includes(config.name)
|
|
115
|
+
? await db.openTable(config.name)
|
|
116
|
+
: await db.createEmptyTable(config.name, config.schema);
|
|
117
|
+
this.tables.set(config.name, table);
|
|
118
|
+
return table;
|
|
119
|
+
}
|
|
120
|
+
async upsert(config, records) {
|
|
121
|
+
if (records.length === 0)
|
|
122
|
+
return 0;
|
|
123
|
+
const table = await this.getTable(config);
|
|
124
|
+
await table.mergeInsert('id').whenMatchedUpdateAll().whenNotMatchedInsertAll().execute(records);
|
|
125
|
+
return records.length;
|
|
126
|
+
}
|
|
127
|
+
async upsertChapters(records) {
|
|
128
|
+
const configs = await this.getTableConfigs();
|
|
129
|
+
return this.upsert(configs.chapters, records);
|
|
130
|
+
}
|
|
131
|
+
async upsertEntities(records) {
|
|
132
|
+
const configs = await this.getTableConfigs();
|
|
133
|
+
return this.upsert(configs.entities, records);
|
|
134
|
+
}
|
|
135
|
+
async upsertRelations(records) {
|
|
136
|
+
const configs = await this.getTableConfigs();
|
|
137
|
+
return this.upsert(configs.relations, records);
|
|
138
|
+
}
|
|
139
|
+
async getChapters(arc) {
|
|
140
|
+
try {
|
|
141
|
+
const configs = await this.getTableConfigs();
|
|
142
|
+
const table = await this.getTable(configs.chapters);
|
|
143
|
+
let query = table.query();
|
|
144
|
+
if (arc) {
|
|
145
|
+
query = query.where(`arc = '${arc}'`);
|
|
146
|
+
}
|
|
147
|
+
return (await query.toArray());
|
|
148
|
+
/* v8 ignore start */
|
|
149
|
+
}
|
|
150
|
+
catch {
|
|
151
|
+
return [];
|
|
152
|
+
}
|
|
153
|
+
/* v8 ignore stop */
|
|
154
|
+
}
|
|
155
|
+
async getChapterHashes() {
|
|
156
|
+
try {
|
|
157
|
+
const configs = await this.getTableConfigs();
|
|
158
|
+
const table = await this.getTable(configs.chapters);
|
|
159
|
+
const results = await table.query().select(['file_path', 'file_hash']).toArray();
|
|
160
|
+
return new Map(results.map((r) => [r.file_path, r.file_hash]));
|
|
161
|
+
/* v8 ignore start */
|
|
162
|
+
}
|
|
163
|
+
catch {
|
|
164
|
+
return new Map();
|
|
165
|
+
}
|
|
166
|
+
/* v8 ignore stop */
|
|
167
|
+
}
|
|
168
|
+
async deleteChaptersByPaths(paths) {
|
|
169
|
+
if (paths.length === 0)
|
|
170
|
+
return 0;
|
|
171
|
+
try {
|
|
172
|
+
const configs = await this.getTableConfigs();
|
|
173
|
+
const table = await this.getTable(configs.chapters);
|
|
174
|
+
const filter = paths.map((p) => `file_path = '${p}'`).join(' OR ');
|
|
175
|
+
await table.delete(filter);
|
|
176
|
+
return paths.length;
|
|
177
|
+
/* v8 ignore start */
|
|
178
|
+
}
|
|
179
|
+
catch {
|
|
180
|
+
return 0;
|
|
181
|
+
}
|
|
182
|
+
/* v8 ignore stop */
|
|
183
|
+
}
|
|
184
|
+
async searchChapters(vector, limit, arc) {
|
|
185
|
+
try {
|
|
186
|
+
const configs = await this.getTableConfigs();
|
|
187
|
+
const table = await this.getTable(configs.chapters);
|
|
188
|
+
let query = table.search(vector).limit(limit);
|
|
189
|
+
if (arc) {
|
|
190
|
+
query = query.where(`arc = '${arc}'`);
|
|
191
|
+
}
|
|
192
|
+
return (await query.toArray());
|
|
193
|
+
/* v8 ignore start */
|
|
194
|
+
}
|
|
195
|
+
catch {
|
|
196
|
+
return [];
|
|
197
|
+
}
|
|
198
|
+
/* v8 ignore stop */
|
|
199
|
+
}
|
|
200
|
+
async searchEntities(vector, limit, arc, type) {
|
|
201
|
+
try {
|
|
202
|
+
const configs = await this.getTableConfigs();
|
|
203
|
+
const table = await this.getTable(configs.entities);
|
|
204
|
+
let query = table.search(vector).limit(limit);
|
|
205
|
+
if (arc) {
|
|
206
|
+
query = query.where(`arc = '${arc}'`);
|
|
207
|
+
}
|
|
208
|
+
if (type) {
|
|
209
|
+
query = query.where(`type = '${type}'`);
|
|
210
|
+
}
|
|
211
|
+
return (await query.toArray());
|
|
212
|
+
/* v8 ignore start */
|
|
213
|
+
}
|
|
214
|
+
catch {
|
|
215
|
+
return [];
|
|
216
|
+
}
|
|
217
|
+
/* v8 ignore stop */
|
|
218
|
+
}
|
|
219
|
+
async getEntities(arc, type) {
|
|
220
|
+
try {
|
|
221
|
+
const configs = await this.getTableConfigs();
|
|
222
|
+
const table = await this.getTable(configs.entities);
|
|
223
|
+
let query = table.query();
|
|
224
|
+
const filters = [];
|
|
225
|
+
if (arc)
|
|
226
|
+
filters.push(`arc = '${arc}'`);
|
|
227
|
+
if (type)
|
|
228
|
+
filters.push(`type = '${type}'`);
|
|
229
|
+
if (filters.length > 0) {
|
|
230
|
+
query = query.where(filters.join(' AND '));
|
|
231
|
+
}
|
|
232
|
+
return (await query.toArray());
|
|
233
|
+
/* v8 ignore start */
|
|
234
|
+
}
|
|
235
|
+
catch {
|
|
236
|
+
return [];
|
|
237
|
+
}
|
|
238
|
+
/* v8 ignore stop */
|
|
239
|
+
}
|
|
240
|
+
async getRelations(arc, type) {
|
|
241
|
+
try {
|
|
242
|
+
const configs = await this.getTableConfigs();
|
|
243
|
+
const table = await this.getTable(configs.relations);
|
|
244
|
+
let query = table.query();
|
|
245
|
+
const filters = [];
|
|
246
|
+
if (arc)
|
|
247
|
+
filters.push(`arc = '${arc}'`);
|
|
248
|
+
if (type)
|
|
249
|
+
filters.push(`type = '${type}'`);
|
|
250
|
+
if (filters.length > 0) {
|
|
251
|
+
query = query.where(filters.join(' AND '));
|
|
252
|
+
}
|
|
253
|
+
return (await query.toArray());
|
|
254
|
+
/* v8 ignore start */
|
|
255
|
+
}
|
|
256
|
+
catch {
|
|
257
|
+
return [];
|
|
258
|
+
}
|
|
259
|
+
/* v8 ignore stop */
|
|
260
|
+
}
|
|
261
|
+
close() {
|
|
262
|
+
this.db = null;
|
|
263
|
+
this.tables.clear();
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
//# 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,55 @@
|
|
|
1
|
+
import { Schema } from 'apache-arrow';
|
|
2
|
+
export declare const ENTITY_TYPES: readonly ["CHARACTER", "LOCATION", "EVENT", "OBJECT", "EMOTION"];
|
|
3
|
+
export type EntityType = (typeof ENTITY_TYPES)[number];
|
|
4
|
+
export declare const RELATION_TYPES: readonly ["LOVES", "HATES", "KNOWS", "RELATED_TO", "FRIENDS_WITH", "ENEMIES_WITH", "LOCATED_IN", "LIVES_IN", "TRAVELS_TO", "HAPPENS_BEFORE", "HAPPENS_AFTER", "CAUSES", "OWNS", "USES", "SEEKS"];
|
|
5
|
+
export type RelationType = (typeof RELATION_TYPES)[number];
|
|
6
|
+
export declare function createChapterSchema(embeddingDim: number): Schema;
|
|
7
|
+
export declare function createEntitySchema(embeddingDim: number): Schema;
|
|
8
|
+
export declare const RelationSchema: Schema<any>;
|
|
9
|
+
export interface ScannedChapter {
|
|
10
|
+
id: string;
|
|
11
|
+
file_path: string;
|
|
12
|
+
file_hash: string;
|
|
13
|
+
arc: string;
|
|
14
|
+
episode: number;
|
|
15
|
+
chapter: number;
|
|
16
|
+
pov: string;
|
|
17
|
+
title: string;
|
|
18
|
+
location: string;
|
|
19
|
+
date: string;
|
|
20
|
+
content: string;
|
|
21
|
+
summary: string;
|
|
22
|
+
word_count: number;
|
|
23
|
+
char_count: number;
|
|
24
|
+
paragraph_count: number;
|
|
25
|
+
}
|
|
26
|
+
export interface ChapterRecord extends ScannedChapter {
|
|
27
|
+
vector: number[];
|
|
28
|
+
entities: string[];
|
|
29
|
+
indexed_at: number;
|
|
30
|
+
}
|
|
31
|
+
export interface EntityRecord {
|
|
32
|
+
id: string;
|
|
33
|
+
arc: string;
|
|
34
|
+
name: string;
|
|
35
|
+
type: EntityType;
|
|
36
|
+
description: string;
|
|
37
|
+
aliases: string[];
|
|
38
|
+
vector: number[];
|
|
39
|
+
chapters: string[];
|
|
40
|
+
chapter_count: number;
|
|
41
|
+
first_appearance: string;
|
|
42
|
+
indexed_at: number;
|
|
43
|
+
}
|
|
44
|
+
export interface RelationRecord {
|
|
45
|
+
id: string;
|
|
46
|
+
arc: string;
|
|
47
|
+
source_entity: string;
|
|
48
|
+
target_entity: string;
|
|
49
|
+
type: RelationType;
|
|
50
|
+
description: string;
|
|
51
|
+
weight: number;
|
|
52
|
+
chapters: string[];
|
|
53
|
+
indexed_at: number;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=schemas.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.d.ts","sourceRoot":"","sources":["schemas.ts"],"names":[],"mappings":"AAAA,OAAO,EAAuD,MAAM,EAAQ,MAAM,cAAc,CAAC;AAGjG,eAAO,MAAM,YAAY,kEAAmE,CAAC;AAC7F,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAC;AAEvD,eAAO,MAAM,cAAc,kMAgBjB,CAAC;AACX,MAAM,MAAM,YAAY,GAAG,CAAC,OAAO,cAAc,CAAC,CAAC,MAAM,CAAC,CAAC;AAG3D,wBAAgB,mBAAmB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAqBhE;AAED,wBAAgB,kBAAkB,CAAC,YAAY,EAAE,MAAM,GAAG,MAAM,CAc/D;AAED,eAAO,MAAM,cAAc,aAUzB,CAAC;AAKH,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;IACZ,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,EAAE,MAAM,CAAC;CACzB;AAGD,MAAM,WAAW,aAAc,SAAQ,cAAc;IACnD,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,UAAU,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,aAAa,EAAE,MAAM,CAAC;IACtB,gBAAgB,EAAE,MAAM,CAAC;IACzB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,EAAE,MAAM,CAAC;IACtB,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,YAAY,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;CACpB"}
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { Field, FixedSizeList, Float32, Float64, Int32, List, Schema, Utf8 } from 'apache-arrow';
|
|
2
|
+
// Entity and Relation type constants
|
|
3
|
+
export const ENTITY_TYPES = ['CHARACTER', 'LOCATION', 'EVENT', 'OBJECT', 'EMOTION'];
|
|
4
|
+
export const RELATION_TYPES = [
|
|
5
|
+
'LOVES',
|
|
6
|
+
'HATES',
|
|
7
|
+
'KNOWS',
|
|
8
|
+
'RELATED_TO',
|
|
9
|
+
'FRIENDS_WITH',
|
|
10
|
+
'ENEMIES_WITH',
|
|
11
|
+
'LOCATED_IN',
|
|
12
|
+
'LIVES_IN',
|
|
13
|
+
'TRAVELS_TO',
|
|
14
|
+
'HAPPENS_BEFORE',
|
|
15
|
+
'HAPPENS_AFTER',
|
|
16
|
+
'CAUSES',
|
|
17
|
+
'OWNS',
|
|
18
|
+
'USES',
|
|
19
|
+
'SEEKS',
|
|
20
|
+
];
|
|
21
|
+
// Dynamic Arrow Schema factories
|
|
22
|
+
export function createChapterSchema(embeddingDim) {
|
|
23
|
+
return new Schema([
|
|
24
|
+
new Field('id', new Utf8(), false),
|
|
25
|
+
new Field('file_path', new Utf8(), false),
|
|
26
|
+
new Field('file_hash', new Utf8(), false),
|
|
27
|
+
new Field('arc', new Utf8(), false),
|
|
28
|
+
new Field('episode', new Int32(), false),
|
|
29
|
+
new Field('chapter', new Int32(), false),
|
|
30
|
+
new Field('pov', new Utf8(), false),
|
|
31
|
+
new Field('title', new Utf8(), false),
|
|
32
|
+
new Field('location', new Utf8(), false),
|
|
33
|
+
new Field('date', new Utf8(), false),
|
|
34
|
+
new Field('content', new Utf8(), false),
|
|
35
|
+
new Field('summary', new Utf8(), false),
|
|
36
|
+
new Field('word_count', new Int32(), false),
|
|
37
|
+
new Field('char_count', new Int32(), false),
|
|
38
|
+
new Field('paragraph_count', new Int32(), false),
|
|
39
|
+
new Field('vector', new FixedSizeList(embeddingDim, new Field('item', new Float32())), false),
|
|
40
|
+
new Field('entities', new List(new Field('item', new Utf8())), false),
|
|
41
|
+
new Field('indexed_at', new Float64(), false),
|
|
42
|
+
]);
|
|
43
|
+
}
|
|
44
|
+
export function createEntitySchema(embeddingDim) {
|
|
45
|
+
return new Schema([
|
|
46
|
+
new Field('id', new Utf8(), false),
|
|
47
|
+
new Field('arc', new Utf8(), false),
|
|
48
|
+
new Field('name', new Utf8(), false),
|
|
49
|
+
new Field('type', new Utf8(), false),
|
|
50
|
+
new Field('description', new Utf8(), false),
|
|
51
|
+
new Field('aliases', new List(new Field('item', new Utf8())), false),
|
|
52
|
+
new Field('vector', new FixedSizeList(embeddingDim, new Field('item', new Float32())), false),
|
|
53
|
+
new Field('chapters', new List(new Field('item', new Utf8())), false),
|
|
54
|
+
new Field('chapter_count', new Int32(), false),
|
|
55
|
+
new Field('first_appearance', new Utf8(), false),
|
|
56
|
+
new Field('indexed_at', new Float64(), false),
|
|
57
|
+
]);
|
|
58
|
+
}
|
|
59
|
+
export const RelationSchema = new Schema([
|
|
60
|
+
new Field('id', new Utf8(), false),
|
|
61
|
+
new Field('arc', new Utf8(), false),
|
|
62
|
+
new Field('source_entity', new Utf8(), false),
|
|
63
|
+
new Field('target_entity', new Utf8(), false),
|
|
64
|
+
new Field('type', new Utf8(), false),
|
|
65
|
+
new Field('description', new Utf8(), false),
|
|
66
|
+
new Field('weight', new Float64(), false),
|
|
67
|
+
new Field('chapters', new List(new Field('item', new Utf8())), false),
|
|
68
|
+
new Field('indexed_at', new Float64(), false),
|
|
69
|
+
]);
|
|
70
|
+
//# sourceMappingURL=schemas.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schemas.js","sourceRoot":"","sources":["schemas.ts"],"names":[],"mappings":"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"}
|
|
@@ -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
|