@itkoren/sqmd 0.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/CHANGELOG.md +46 -0
- package/LICENSE +21 -0
- package/README.md +1052 -0
- package/dist/api/app.d.ts +14 -0
- package/dist/api/app.d.ts.map +1 -0
- package/dist/api/app.js +32 -0
- package/dist/api/app.js.map +1 -0
- package/dist/api/middleware.d.ts +5 -0
- package/dist/api/middleware.d.ts.map +1 -0
- package/dist/api/middleware.js +37 -0
- package/dist/api/middleware.js.map +1 -0
- package/dist/api/models.d.ts +178 -0
- package/dist/api/models.d.ts.map +1 -0
- package/dist/api/models.js +39 -0
- package/dist/api/models.js.map +1 -0
- package/dist/api/routes/documents.d.ts +4 -0
- package/dist/api/routes/documents.d.ts.map +1 -0
- package/dist/api/routes/documents.js +92 -0
- package/dist/api/routes/documents.js.map +1 -0
- package/dist/api/routes/health.d.ts +6 -0
- package/dist/api/routes/health.d.ts.map +1 -0
- package/dist/api/routes/health.js +38 -0
- package/dist/api/routes/health.js.map +1 -0
- package/dist/api/routes/index.d.ts +5 -0
- package/dist/api/routes/index.d.ts.map +1 -0
- package/dist/api/routes/index.js +83 -0
- package/dist/api/routes/index.js.map +1 -0
- package/dist/api/routes/search.d.ts +6 -0
- package/dist/api/routes/search.d.ts.map +1 -0
- package/dist/api/routes/search.js +104 -0
- package/dist/api/routes/search.js.map +1 -0
- package/dist/config/loader.d.ts +4 -0
- package/dist/config/loader.d.ts.map +1 -0
- package/dist/config/loader.js +144 -0
- package/dist/config/loader.js.map +1 -0
- package/dist/config/schema.d.ts +298 -0
- package/dist/config/schema.d.ts.map +1 -0
- package/dist/config/schema.js +50 -0
- package/dist/config/schema.js.map +1 -0
- package/dist/embeddings/ollama.d.ts +14 -0
- package/dist/embeddings/ollama.d.ts.map +1 -0
- package/dist/embeddings/ollama.js +46 -0
- package/dist/embeddings/ollama.js.map +1 -0
- package/dist/embeddings/transformers.d.ts +14 -0
- package/dist/embeddings/transformers.d.ts.map +1 -0
- package/dist/embeddings/transformers.js +64 -0
- package/dist/embeddings/transformers.js.map +1 -0
- package/dist/embeddings/types.d.ts +6 -0
- package/dist/embeddings/types.d.ts.map +1 -0
- package/dist/embeddings/types.js +2 -0
- package/dist/embeddings/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +233 -0
- package/dist/index.js.map +1 -0
- package/dist/ingestion/chunker.d.ts +21 -0
- package/dist/ingestion/chunker.d.ts.map +1 -0
- package/dist/ingestion/chunker.js +117 -0
- package/dist/ingestion/chunker.js.map +1 -0
- package/dist/ingestion/fingerprint.d.ts +6 -0
- package/dist/ingestion/fingerprint.d.ts.map +1 -0
- package/dist/ingestion/fingerprint.js +17 -0
- package/dist/ingestion/fingerprint.js.map +1 -0
- package/dist/ingestion/parser.d.ts +16 -0
- package/dist/ingestion/parser.d.ts.map +1 -0
- package/dist/ingestion/parser.js +98 -0
- package/dist/ingestion/parser.js.map +1 -0
- package/dist/ingestion/pipeline.d.ts +32 -0
- package/dist/ingestion/pipeline.d.ts.map +1 -0
- package/dist/ingestion/pipeline.js +191 -0
- package/dist/ingestion/pipeline.js.map +1 -0
- package/dist/ingestion/scanner.d.ts +2 -0
- package/dist/ingestion/scanner.d.ts.map +1 -0
- package/dist/ingestion/scanner.js +54 -0
- package/dist/ingestion/scanner.js.map +1 -0
- package/dist/mcp/server.d.ts +8 -0
- package/dist/mcp/server.d.ts.map +1 -0
- package/dist/mcp/server.js +73 -0
- package/dist/mcp/server.js.map +1 -0
- package/dist/mcp/tools.d.ts +6 -0
- package/dist/mcp/tools.d.ts.map +1 -0
- package/dist/mcp/tools.js +276 -0
- package/dist/mcp/tools.js.map +1 -0
- package/dist/rag/context-builder.d.ts +3 -0
- package/dist/rag/context-builder.d.ts.map +1 -0
- package/dist/rag/context-builder.js +27 -0
- package/dist/rag/context-builder.js.map +1 -0
- package/dist/rag/prompt-templates.d.ts +5 -0
- package/dist/rag/prompt-templates.d.ts.map +1 -0
- package/dist/rag/prompt-templates.js +41 -0
- package/dist/rag/prompt-templates.js.map +1 -0
- package/dist/search/hybrid.d.ts +14 -0
- package/dist/search/hybrid.d.ts.map +1 -0
- package/dist/search/hybrid.js +58 -0
- package/dist/search/hybrid.js.map +1 -0
- package/dist/search/query.d.ts +4 -0
- package/dist/search/query.d.ts.map +1 -0
- package/dist/search/query.js +23 -0
- package/dist/search/query.js.map +1 -0
- package/dist/search/reranker.d.ts +11 -0
- package/dist/search/reranker.d.ts.map +1 -0
- package/dist/search/reranker.js +44 -0
- package/dist/search/reranker.js.map +1 -0
- package/dist/store/db.d.ts +11 -0
- package/dist/store/db.d.ts.map +1 -0
- package/dist/store/db.js +75 -0
- package/dist/store/db.js.map +1 -0
- package/dist/store/reader.d.ts +8 -0
- package/dist/store/reader.d.ts.map +1 -0
- package/dist/store/reader.js +122 -0
- package/dist/store/reader.js.map +1 -0
- package/dist/store/schema.d.ts +39 -0
- package/dist/store/schema.d.ts.map +1 -0
- package/dist/store/schema.js +33 -0
- package/dist/store/schema.js.map +1 -0
- package/dist/store/writer.d.ts +6 -0
- package/dist/store/writer.d.ts.map +1 -0
- package/dist/store/writer.js +43 -0
- package/dist/store/writer.js.map +1 -0
- package/dist/watcher/daemon.d.ts +5 -0
- package/dist/watcher/daemon.d.ts.map +1 -0
- package/dist/watcher/daemon.js +43 -0
- package/dist/watcher/daemon.js.map +1 -0
- package/dist/watcher/handler.d.ts +14 -0
- package/dist/watcher/handler.d.ts.map +1 -0
- package/dist/watcher/handler.js +82 -0
- package/dist/watcher/handler.js.map +1 -0
- package/package.json +56 -0
package/dist/store/db.js
ADDED
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import * as lancedb from '@lancedb/lancedb';
|
|
3
|
+
import { CHUNKS_SCHEMA, FILES_SCHEMA } from './schema.js';
|
|
4
|
+
const CHUNKS_TABLE = 'chunks';
|
|
5
|
+
const FILES_TABLE = 'files';
|
|
6
|
+
const connectionCache = new Map();
|
|
7
|
+
export async function getDb(dbPath) {
|
|
8
|
+
if (connectionCache.has(dbPath)) {
|
|
9
|
+
return connectionCache.get(dbPath);
|
|
10
|
+
}
|
|
11
|
+
if (!fs.existsSync(dbPath)) {
|
|
12
|
+
fs.mkdirSync(dbPath, { recursive: true });
|
|
13
|
+
}
|
|
14
|
+
const db = await lancedb.connect(dbPath);
|
|
15
|
+
connectionCache.set(dbPath, db);
|
|
16
|
+
return db;
|
|
17
|
+
}
|
|
18
|
+
export function closeDb(dbPath) {
|
|
19
|
+
connectionCache.delete(dbPath);
|
|
20
|
+
}
|
|
21
|
+
export async function getChunksTable(db) {
|
|
22
|
+
const tableNames = await db.tableNames();
|
|
23
|
+
if (tableNames.includes(CHUNKS_TABLE)) {
|
|
24
|
+
return await db.openTable(CHUNKS_TABLE);
|
|
25
|
+
}
|
|
26
|
+
// Create table with schema using empty initial data
|
|
27
|
+
const table = await db.createEmptyTable(CHUNKS_TABLE, CHUNKS_SCHEMA);
|
|
28
|
+
return table;
|
|
29
|
+
}
|
|
30
|
+
export async function getFilesTable(db) {
|
|
31
|
+
const tableNames = await db.tableNames();
|
|
32
|
+
if (tableNames.includes(FILES_TABLE)) {
|
|
33
|
+
return await db.openTable(FILES_TABLE);
|
|
34
|
+
}
|
|
35
|
+
const table = await db.createEmptyTable(FILES_TABLE, FILES_SCHEMA);
|
|
36
|
+
return table;
|
|
37
|
+
}
|
|
38
|
+
export async function createIndexes(db) {
|
|
39
|
+
try {
|
|
40
|
+
const chunksTable = await getChunksTable(db);
|
|
41
|
+
// Check row count before creating index (need enough rows for IVF-PQ)
|
|
42
|
+
const stats = await chunksTable.countRows();
|
|
43
|
+
if (stats < 256) {
|
|
44
|
+
return; // Not enough data for index
|
|
45
|
+
}
|
|
46
|
+
// Create IVF-PQ vector index
|
|
47
|
+
await chunksTable.createIndex('vector', {
|
|
48
|
+
config: lancedb.Index.ivfPq({
|
|
49
|
+
numPartitions: Math.min(256, Math.floor(stats / 10)),
|
|
50
|
+
numSubVectors: 96,
|
|
51
|
+
}),
|
|
52
|
+
});
|
|
53
|
+
// Create FTS index on text field
|
|
54
|
+
await chunksTable.createIndex('text', {
|
|
55
|
+
config: lancedb.Index.fts(),
|
|
56
|
+
});
|
|
57
|
+
}
|
|
58
|
+
catch (err) {
|
|
59
|
+
// Index creation may fail if already exists or data is insufficient
|
|
60
|
+
console.warn('Index creation warning:', err instanceof Error ? err.message : String(err));
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
export async function getDbStats(db) {
|
|
64
|
+
try {
|
|
65
|
+
const chunksTable = await getChunksTable(db);
|
|
66
|
+
const filesTable = await getFilesTable(db);
|
|
67
|
+
const chunkCount = await chunksTable.countRows();
|
|
68
|
+
const fileCount = await filesTable.countRows();
|
|
69
|
+
return { fileCount, chunkCount };
|
|
70
|
+
}
|
|
71
|
+
catch {
|
|
72
|
+
return { fileCount: 0, chunkCount: 0 };
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
//# sourceMappingURL=db.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/store/db.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type * as lancedb from '@lancedb/lancedb';
|
|
2
|
+
import type { ChunkRecord, FileRecord, SearchResult } from './schema.js';
|
|
3
|
+
export declare function vectorSearch(table: lancedb.Table, vector: number[], topK: number, filter?: string): Promise<SearchResult[]>;
|
|
4
|
+
export declare function ftsSearch(table: lancedb.Table, query: string, topK: number, filter?: string): Promise<SearchResult[]>;
|
|
5
|
+
export declare function getFileChunks(table: lancedb.Table, fileId: string): Promise<ChunkRecord[]>;
|
|
6
|
+
export declare function getAllFiles(table: lancedb.Table): Promise<FileRecord[]>;
|
|
7
|
+
export declare function getFileById(table: lancedb.Table, fileId: string): Promise<FileRecord | null>;
|
|
8
|
+
//# sourceMappingURL=reader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.d.ts","sourceRoot":"","sources":["../../src/store/reader.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEzE,wBAAsB,YAAY,CAChC,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,MAAM,EAAE,MAAM,EAAE,EAChB,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,EAAE,CAAC,CAkBzB;AAED,wBAAsB,SAAS,CAC7B,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,KAAK,EAAE,MAAM,EACb,IAAI,EAAE,MAAM,EACZ,MAAM,CAAC,EAAE,MAAM,GACd,OAAO,CAAC,YAAY,EAAE,CAAC,CAkBzB;AAED,wBAAsB,aAAa,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,EAAE,CAAC,CAQhG;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,CAAC,CAO7E;AAED,wBAAsB,WAAW,CAC/B,KAAK,EAAE,OAAO,CAAC,KAAK,EACpB,MAAM,EAAE,MAAM,GACb,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,CAS5B"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
export async function vectorSearch(table, vector, topK, filter) {
|
|
2
|
+
try {
|
|
3
|
+
let query = table.vectorSearch(vector).limit(topK);
|
|
4
|
+
if (filter) {
|
|
5
|
+
query = query.where(filter);
|
|
6
|
+
}
|
|
7
|
+
const results = await query.toArray();
|
|
8
|
+
return results.map((row, idx) => ({
|
|
9
|
+
...rowToChunkRecord(row),
|
|
10
|
+
score: typeof row._distance === 'number' ? 1 - row._distance : 1 / (1 + idx),
|
|
11
|
+
rank: idx + 1,
|
|
12
|
+
}));
|
|
13
|
+
}
|
|
14
|
+
catch (err) {
|
|
15
|
+
console.warn('Vector search error:', err instanceof Error ? err.message : String(err));
|
|
16
|
+
return [];
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
export async function ftsSearch(table, query, topK, filter) {
|
|
20
|
+
try {
|
|
21
|
+
let searchQuery = table.search(query, 'text').limit(topK);
|
|
22
|
+
if (filter) {
|
|
23
|
+
searchQuery = searchQuery.where(filter);
|
|
24
|
+
}
|
|
25
|
+
const results = await searchQuery.toArray();
|
|
26
|
+
return results.map((row, idx) => ({
|
|
27
|
+
...rowToChunkRecord(row),
|
|
28
|
+
score: typeof row._score === 'number' ? row._score : 1 / (1 + idx),
|
|
29
|
+
rank: idx + 1,
|
|
30
|
+
}));
|
|
31
|
+
}
|
|
32
|
+
catch (err) {
|
|
33
|
+
console.warn('FTS search error:', err instanceof Error ? err.message : String(err));
|
|
34
|
+
return [];
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
export async function getFileChunks(table, fileId) {
|
|
38
|
+
try {
|
|
39
|
+
const results = await table.query().where(`file_id = '${fileId}'`).toArray();
|
|
40
|
+
return results.map(rowToChunkRecord);
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return [];
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
export async function getAllFiles(table) {
|
|
47
|
+
try {
|
|
48
|
+
const results = await table.query().toArray();
|
|
49
|
+
return results.map(rowToFileRecord);
|
|
50
|
+
}
|
|
51
|
+
catch {
|
|
52
|
+
return [];
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
export async function getFileById(table, fileId) {
|
|
56
|
+
try {
|
|
57
|
+
const results = await table.query().where(`file_id = '${fileId}'`).limit(1).toArray();
|
|
58
|
+
if (results.length === 0)
|
|
59
|
+
return null;
|
|
60
|
+
return rowToFileRecord(results[0]);
|
|
61
|
+
}
|
|
62
|
+
catch {
|
|
63
|
+
return null;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function rowToChunkRecord(row) {
|
|
67
|
+
let parentHeadings = [];
|
|
68
|
+
const ph = row.parent_headings;
|
|
69
|
+
if (Array.isArray(ph)) {
|
|
70
|
+
parentHeadings = ph.filter((x) => typeof x === 'string');
|
|
71
|
+
}
|
|
72
|
+
else if (ph && typeof ph === 'object' && 'toArray' in ph) {
|
|
73
|
+
parentHeadings = ph
|
|
74
|
+
.toArray()
|
|
75
|
+
.filter((x) => typeof x === 'string');
|
|
76
|
+
}
|
|
77
|
+
let vector = [];
|
|
78
|
+
const v = row.vector;
|
|
79
|
+
if (v instanceof Float32Array || v instanceof Float64Array) {
|
|
80
|
+
vector = Array.from(v);
|
|
81
|
+
}
|
|
82
|
+
else if (Array.isArray(v)) {
|
|
83
|
+
vector = v;
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
chunk_id: String(row.chunk_id ?? ''),
|
|
87
|
+
file_id: String(row.file_id ?? ''),
|
|
88
|
+
file_path: String(row.file_path ?? ''),
|
|
89
|
+
file_hash: String(row.file_hash ?? ''),
|
|
90
|
+
file_mtime: Number(row.file_mtime ?? 0),
|
|
91
|
+
heading_path: String(row.heading_path ?? ''),
|
|
92
|
+
heading_level: Number(row.heading_level ?? 0),
|
|
93
|
+
heading_text: String(row.heading_text ?? ''),
|
|
94
|
+
section_index: Number(row.section_index ?? 0),
|
|
95
|
+
chunk_index: Number(row.chunk_index ?? 0),
|
|
96
|
+
text: String(row.text ?? ''),
|
|
97
|
+
text_raw: String(row.text_raw ?? ''),
|
|
98
|
+
token_count: Number(row.token_count ?? 0),
|
|
99
|
+
parent_headings: parentHeadings,
|
|
100
|
+
depth: Number(row.depth ?? 0),
|
|
101
|
+
vector,
|
|
102
|
+
line_start: Number(row.line_start ?? 0),
|
|
103
|
+
line_end: Number(row.line_end ?? 0),
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
function rowToFileRecord(row) {
|
|
107
|
+
const status = String(row.status ?? 'skipped');
|
|
108
|
+
const validStatus = ['indexed', 'error', 'skipped'].includes(status)
|
|
109
|
+
? status
|
|
110
|
+
: 'skipped';
|
|
111
|
+
return {
|
|
112
|
+
file_id: String(row.file_id ?? ''),
|
|
113
|
+
file_path: String(row.file_path ?? ''),
|
|
114
|
+
file_hash: String(row.file_hash ?? ''),
|
|
115
|
+
file_mtime: Number(row.file_mtime ?? 0),
|
|
116
|
+
chunk_count: Number(row.chunk_count ?? 0),
|
|
117
|
+
indexed_at: Number(row.indexed_at ?? 0),
|
|
118
|
+
status: validStatus,
|
|
119
|
+
error_msg: String(row.error_msg ?? ''),
|
|
120
|
+
};
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=reader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reader.js","sourceRoot":"","sources":["../../src/store/reader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import * as arrow from 'apache-arrow';
|
|
2
|
+
export declare const VECTOR_DIM = 768;
|
|
3
|
+
export declare const CHUNKS_SCHEMA: arrow.Schema<any>;
|
|
4
|
+
export declare const FILES_SCHEMA: arrow.Schema<any>;
|
|
5
|
+
export interface ChunkRecord {
|
|
6
|
+
chunk_id: string;
|
|
7
|
+
file_id: string;
|
|
8
|
+
file_path: string;
|
|
9
|
+
file_hash: string;
|
|
10
|
+
file_mtime: number;
|
|
11
|
+
heading_path: string;
|
|
12
|
+
heading_level: number;
|
|
13
|
+
heading_text: string;
|
|
14
|
+
section_index: number;
|
|
15
|
+
chunk_index: number;
|
|
16
|
+
text: string;
|
|
17
|
+
text_raw: string;
|
|
18
|
+
token_count: number;
|
|
19
|
+
parent_headings: string[];
|
|
20
|
+
depth: number;
|
|
21
|
+
vector: number[];
|
|
22
|
+
line_start: number;
|
|
23
|
+
line_end: number;
|
|
24
|
+
}
|
|
25
|
+
export interface FileRecord {
|
|
26
|
+
file_id: string;
|
|
27
|
+
file_path: string;
|
|
28
|
+
file_hash: string;
|
|
29
|
+
file_mtime: number;
|
|
30
|
+
chunk_count: number;
|
|
31
|
+
indexed_at: number;
|
|
32
|
+
status: 'indexed' | 'error' | 'skipped';
|
|
33
|
+
error_msg: string;
|
|
34
|
+
}
|
|
35
|
+
export interface SearchResult extends ChunkRecord {
|
|
36
|
+
score: number;
|
|
37
|
+
rank?: number;
|
|
38
|
+
}
|
|
39
|
+
//# sourceMappingURL=schema.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/store/schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,MAAM,cAAc,CAAC;AAEtC,eAAO,MAAM,UAAU,MAAM,CAAC;AAE9B,eAAO,MAAM,aAAa,mBA2BxB,CAAC;AAEH,eAAO,MAAM,YAAY,mBASvB,CAAC;AAEH,MAAM,WAAW,WAAW;IAC1B,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,YAAY,EAAE,MAAM,CAAC;IACrB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,EAAE,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,SAAS,GAAG,OAAO,GAAG,SAAS,CAAC;IACxC,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,YAAa,SAAQ,WAAW;IAC/C,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import * as arrow from 'apache-arrow';
|
|
2
|
+
export const VECTOR_DIM = 768;
|
|
3
|
+
export const CHUNKS_SCHEMA = new arrow.Schema([
|
|
4
|
+
new arrow.Field('chunk_id', new arrow.Utf8(), false),
|
|
5
|
+
new arrow.Field('file_id', new arrow.Utf8(), false),
|
|
6
|
+
new arrow.Field('file_path', new arrow.Utf8(), false),
|
|
7
|
+
new arrow.Field('file_hash', new arrow.Utf8(), false),
|
|
8
|
+
new arrow.Field('file_mtime', new arrow.Float64(), false),
|
|
9
|
+
new arrow.Field('heading_path', new arrow.Utf8(), false),
|
|
10
|
+
new arrow.Field('heading_level', new arrow.Int8(), false),
|
|
11
|
+
new arrow.Field('heading_text', new arrow.Utf8(), false),
|
|
12
|
+
new arrow.Field('section_index', new arrow.Int32(), false),
|
|
13
|
+
new arrow.Field('chunk_index', new arrow.Int32(), false),
|
|
14
|
+
new arrow.Field('text', new arrow.Utf8(), false),
|
|
15
|
+
new arrow.Field('text_raw', new arrow.Utf8(), false),
|
|
16
|
+
new arrow.Field('token_count', new arrow.Int32(), false),
|
|
17
|
+
new arrow.Field('parent_headings', new arrow.List(new arrow.Field('item', new arrow.Utf8(), true)), false),
|
|
18
|
+
new arrow.Field('depth', new arrow.Int8(), false),
|
|
19
|
+
new arrow.Field('vector', new arrow.FixedSizeList(VECTOR_DIM, new arrow.Field('item', new arrow.Float32(), true)), false),
|
|
20
|
+
new arrow.Field('line_start', new arrow.Int32(), false),
|
|
21
|
+
new arrow.Field('line_end', new arrow.Int32(), false),
|
|
22
|
+
]);
|
|
23
|
+
export const FILES_SCHEMA = new arrow.Schema([
|
|
24
|
+
new arrow.Field('file_id', new arrow.Utf8(), false),
|
|
25
|
+
new arrow.Field('file_path', new arrow.Utf8(), false),
|
|
26
|
+
new arrow.Field('file_hash', new arrow.Utf8(), false),
|
|
27
|
+
new arrow.Field('file_mtime', new arrow.Float64(), false),
|
|
28
|
+
new arrow.Field('chunk_count', new arrow.Int32(), false),
|
|
29
|
+
new arrow.Field('indexed_at', new arrow.Float64(), false),
|
|
30
|
+
new arrow.Field('status', new arrow.Utf8(), false),
|
|
31
|
+
new arrow.Field('error_msg', new arrow.Utf8(), true),
|
|
32
|
+
]);
|
|
33
|
+
//# sourceMappingURL=schema.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/store/schema.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import type * as lancedb from '@lancedb/lancedb';
|
|
2
|
+
import type { ChunkRecord, FileRecord } from './schema.js';
|
|
3
|
+
export declare function upsertChunks(table: lancedb.Table, chunks: ChunkRecord[]): Promise<void>;
|
|
4
|
+
export declare function upsertFile(table: lancedb.Table, file: FileRecord): Promise<void>;
|
|
5
|
+
export declare function deleteFile(db: lancedb.Connection, fileId: string): Promise<void>;
|
|
6
|
+
//# sourceMappingURL=writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.d.ts","sourceRoot":"","sources":["../../src/store/writer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAE3D,wBAAsB,YAAY,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAc7F;AAED,wBAAsB,UAAU,CAAC,KAAK,EAAE,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE,UAAU,GAAG,OAAO,CAAC,IAAI,CAAC,CAUtF;AAED,wBAAsB,UAAU,CAAC,EAAE,EAAE,OAAO,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAetF"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import { getChunksTable, getFilesTable } from './db.js';
|
|
2
|
+
export async function upsertChunks(table, chunks) {
|
|
3
|
+
if (chunks.length === 0)
|
|
4
|
+
return;
|
|
5
|
+
const fileId = chunks[0].file_id;
|
|
6
|
+
// Delete existing chunks for this file
|
|
7
|
+
try {
|
|
8
|
+
await table.delete(`file_id = '${fileId}'`);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
// Table may be empty, ignore
|
|
12
|
+
}
|
|
13
|
+
// Insert new chunks
|
|
14
|
+
await table.add(chunks);
|
|
15
|
+
}
|
|
16
|
+
export async function upsertFile(table, file) {
|
|
17
|
+
// Delete existing record for this file
|
|
18
|
+
try {
|
|
19
|
+
await table.delete(`file_id = '${file.file_id}'`);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
// Table may be empty, ignore
|
|
23
|
+
}
|
|
24
|
+
// Insert updated record
|
|
25
|
+
await table.add([file]);
|
|
26
|
+
}
|
|
27
|
+
export async function deleteFile(db, fileId) {
|
|
28
|
+
const chunksTable = await getChunksTable(db);
|
|
29
|
+
const filesTable = await getFilesTable(db);
|
|
30
|
+
try {
|
|
31
|
+
await chunksTable.delete(`file_id = '${fileId}'`);
|
|
32
|
+
}
|
|
33
|
+
catch {
|
|
34
|
+
// May not exist
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
await filesTable.delete(`file_id = '${fileId}'`);
|
|
38
|
+
}
|
|
39
|
+
catch {
|
|
40
|
+
// May not exist
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"writer.js","sourceRoot":"","sources":["../../src/store/writer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAGxD,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,KAAoB,EAAE,MAAqB;IAC5E,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO;IAEhC,MAAM,MAAM,GAAG,MAAM,CAAC,CAAC,CAAE,CAAC,OAAO,CAAC;IAElC,uCAAuC;IACvC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,CAAC,cAAc,MAAM,GAAG,CAAC,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;IAED,oBAAoB;IACpB,MAAM,KAAK,CAAC,GAAG,CAAC,MAA8C,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,KAAoB,EAAE,IAAgB;IACrE,uCAAuC;IACvC,IAAI,CAAC;QACH,MAAM,KAAK,CAAC,MAAM,CAAC,cAAc,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;IAED,wBAAwB;IACxB,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAyC,CAAC,CAAC;AAClE,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,EAAsB,EAAE,MAAc;IACrE,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,EAAE,CAAC,CAAC;IAC7C,MAAM,UAAU,GAAG,MAAM,aAAa,CAAC,EAAE,CAAC,CAAC;IAE3C,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,MAAM,CAAC,cAAc,MAAM,GAAG,CAAC,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;IAED,IAAI,CAAC;QACH,MAAM,UAAU,CAAC,MAAM,CAAC,cAAc,MAAM,GAAG,CAAC,CAAC;IACnD,CAAC;IAAC,MAAM,CAAC;QACP,gBAAgB;IAClB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
import type * as lancedb from '@lancedb/lancedb';
|
|
2
|
+
import { type FSWatcher } from 'chokidar';
|
|
3
|
+
import type { Config } from '../config/schema.js';
|
|
4
|
+
export declare function startWatcher(config: Config, db: lancedb.Connection): FSWatcher;
|
|
5
|
+
//# sourceMappingURL=daemon.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.d.ts","sourceRoot":"","sources":["../../src/watcher/daemon.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACjD,OAAiB,EAAE,KAAK,SAAS,EAAE,MAAM,UAAU,CAAC;AACpD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAGlD,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,UAAU,GAAG,SAAS,CAiD9E"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
import chokidar from 'chokidar';
|
|
2
|
+
import { FileChangeHandler } from './handler.js';
|
|
3
|
+
export function startWatcher(config, db) {
|
|
4
|
+
const { watch_dirs } = config.paths;
|
|
5
|
+
const { extensions, ignore_patterns, debounce_ms } = config.watcher;
|
|
6
|
+
const handler = new FileChangeHandler(config, db);
|
|
7
|
+
// Build glob patterns for watched extensions
|
|
8
|
+
const globPatterns = watch_dirs.flatMap((dir) => extensions.map((ext) => {
|
|
9
|
+
// Remove leading dot for glob pattern
|
|
10
|
+
const extWithoutDot = ext.startsWith('.') ? ext.slice(1) : ext;
|
|
11
|
+
return `${dir}/**/*.${extWithoutDot}`;
|
|
12
|
+
}));
|
|
13
|
+
const watcher = chokidar.watch(globPatterns, {
|
|
14
|
+
ignored: ignore_patterns,
|
|
15
|
+
persistent: true,
|
|
16
|
+
ignoreInitial: true,
|
|
17
|
+
awaitWriteFinish: {
|
|
18
|
+
stabilityThreshold: debounce_ms,
|
|
19
|
+
pollInterval: 100,
|
|
20
|
+
},
|
|
21
|
+
followSymlinks: true,
|
|
22
|
+
});
|
|
23
|
+
watcher
|
|
24
|
+
.on('add', (filePath) => {
|
|
25
|
+
handler.onAdd(filePath);
|
|
26
|
+
})
|
|
27
|
+
.on('change', (filePath) => {
|
|
28
|
+
handler.onChange(filePath);
|
|
29
|
+
})
|
|
30
|
+
.on('unlink', (filePath) => {
|
|
31
|
+
handler.onUnlink(filePath).catch((err) => {
|
|
32
|
+
console.error('[watcher] Unlink handler error:', err instanceof Error ? err.message : String(err));
|
|
33
|
+
});
|
|
34
|
+
})
|
|
35
|
+
.on('error', (error) => {
|
|
36
|
+
console.error('[watcher] Error:', error.message);
|
|
37
|
+
})
|
|
38
|
+
.on('ready', () => {
|
|
39
|
+
console.log('[watcher] Ready, watching:', watch_dirs.join(', '));
|
|
40
|
+
});
|
|
41
|
+
return watcher;
|
|
42
|
+
}
|
|
43
|
+
//# sourceMappingURL=daemon.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"daemon.js","sourceRoot":"","sources":["../../src/watcher/daemon.ts"],"names":[],"mappings":"AACA,OAAO,QAA4B,MAAM,UAAU,CAAC;AAEpD,OAAO,EAAE,iBAAiB,EAAE,MAAM,cAAc,CAAC;AAEjD,MAAM,UAAU,YAAY,CAAC,MAAc,EAAE,EAAsB;IACjE,MAAM,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC;IACpC,MAAM,EAAE,UAAU,EAAE,eAAe,EAAE,WAAW,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC;IAEpE,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IAElD,6CAA6C;IAC7C,MAAM,YAAY,GAAG,UAAU,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAC9C,UAAU,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE;QACrB,sCAAsC;QACtC,MAAM,aAAa,GAAG,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QAC/D,OAAO,GAAG,GAAG,SAAS,aAAa,EAAE,CAAC;IACxC,CAAC,CAAC,CACH,CAAC;IAEF,MAAM,OAAO,GAAG,QAAQ,CAAC,KAAK,CAAC,YAAY,EAAE;QAC3C,OAAO,EAAE,eAAe;QACxB,UAAU,EAAE,IAAI;QAChB,aAAa,EAAE,IAAI;QACnB,gBAAgB,EAAE;YAChB,kBAAkB,EAAE,WAAW;YAC/B,YAAY,EAAE,GAAG;SAClB;QACD,cAAc,EAAE,IAAI;KACrB,CAAC,CAAC;IAEH,OAAO;SACJ,EAAE,CAAC,KAAK,EAAE,CAAC,QAAgB,EAAE,EAAE;QAC9B,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;IAC1B,CAAC,CAAC;SACD,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE;QACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC7B,CAAC,CAAC;SACD,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAgB,EAAE,EAAE;QACjC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,KAAK,CAAC,CAAC,GAAY,EAAE,EAAE;YAChD,OAAO,CAAC,KAAK,CACX,iCAAiC,EACjC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CACjD,CAAC;QACJ,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;SACD,EAAE,CAAC,OAAO,EAAE,CAAC,KAAY,EAAE,EAAE;QAC5B,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;IACnD,CAAC,CAAC;SACD,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;QAChB,OAAO,CAAC,GAAG,CAAC,4BAA4B,EAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IACnE,CAAC,CAAC,CAAC;IAEL,OAAO,OAAO,CAAC;AACjB,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type * as lancedb from '@lancedb/lancedb';
|
|
2
|
+
import type { Config } from '../config/schema.js';
|
|
3
|
+
export declare class FileChangeHandler {
|
|
4
|
+
private config;
|
|
5
|
+
private db;
|
|
6
|
+
private debounceState;
|
|
7
|
+
constructor(config: Config, db: lancedb.Connection);
|
|
8
|
+
onAdd(filePath: string): void;
|
|
9
|
+
onChange(filePath: string): void;
|
|
10
|
+
onUnlink(filePath: string): Promise<void>;
|
|
11
|
+
private scheduleProcess;
|
|
12
|
+
private processPending;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=handler.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../src/watcher/handler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,KAAK,OAAO,MAAM,kBAAkB,CAAC;AACjD,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAUlD,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,EAAE,CAAqB;IAC/B,OAAO,CAAC,aAAa,CAGnB;gBAEU,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,OAAO,CAAC,UAAU;IAKlD,KAAK,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI7B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI;IAI1B,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiB/C,OAAO,CAAC,eAAe;YAYT,cAAc;CAwC7B"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import * as fs from 'node:fs';
|
|
2
|
+
import { hashPath } from '../ingestion/fingerprint.js';
|
|
3
|
+
import { IndexPipeline } from '../ingestion/pipeline.js';
|
|
4
|
+
import { deleteFile } from '../store/writer.js';
|
|
5
|
+
export class FileChangeHandler {
|
|
6
|
+
config;
|
|
7
|
+
db;
|
|
8
|
+
debounceState = {
|
|
9
|
+
timer: null,
|
|
10
|
+
pending: new Set(),
|
|
11
|
+
};
|
|
12
|
+
constructor(config, db) {
|
|
13
|
+
this.config = config;
|
|
14
|
+
this.db = db;
|
|
15
|
+
}
|
|
16
|
+
onAdd(filePath) {
|
|
17
|
+
this.scheduleProcess(filePath);
|
|
18
|
+
}
|
|
19
|
+
onChange(filePath) {
|
|
20
|
+
this.scheduleProcess(filePath);
|
|
21
|
+
}
|
|
22
|
+
async onUnlink(filePath) {
|
|
23
|
+
// Remove any pending processing for this file
|
|
24
|
+
this.debounceState.pending.delete(filePath);
|
|
25
|
+
const fileId = hashPath(filePath);
|
|
26
|
+
try {
|
|
27
|
+
await deleteFile(this.db, fileId);
|
|
28
|
+
console.log(`[watcher] Deleted from index: ${filePath}`);
|
|
29
|
+
}
|
|
30
|
+
catch (err) {
|
|
31
|
+
console.error(`[watcher] Error deleting ${filePath}:`, err instanceof Error ? err.message : String(err));
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
scheduleProcess(filePath) {
|
|
35
|
+
this.debounceState.pending.add(filePath);
|
|
36
|
+
if (this.debounceState.timer) {
|
|
37
|
+
clearTimeout(this.debounceState.timer);
|
|
38
|
+
}
|
|
39
|
+
this.debounceState.timer = setTimeout(() => {
|
|
40
|
+
this.processPending();
|
|
41
|
+
}, this.config.watcher.debounce_ms);
|
|
42
|
+
}
|
|
43
|
+
async processPending() {
|
|
44
|
+
const filesToProcess = Array.from(this.debounceState.pending);
|
|
45
|
+
this.debounceState.pending.clear();
|
|
46
|
+
this.debounceState.timer = null;
|
|
47
|
+
if (filesToProcess.length === 0)
|
|
48
|
+
return;
|
|
49
|
+
console.log(`[watcher] Processing ${filesToProcess.length} changed file(s)`);
|
|
50
|
+
const pipeline = new IndexPipeline(this.config);
|
|
51
|
+
// Filter to only existing files
|
|
52
|
+
const existingFiles = filesToProcess.filter((f) => {
|
|
53
|
+
try {
|
|
54
|
+
return fs.existsSync(f) && fs.statSync(f).isFile();
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
return false;
|
|
58
|
+
}
|
|
59
|
+
});
|
|
60
|
+
if (existingFiles.length === 0)
|
|
61
|
+
return;
|
|
62
|
+
try {
|
|
63
|
+
const result = await pipeline.run({
|
|
64
|
+
paths: existingFiles,
|
|
65
|
+
force: true, // Always reindex changed files
|
|
66
|
+
onProgress: (event) => {
|
|
67
|
+
if (event.type === 'file_done') {
|
|
68
|
+
console.log(`[watcher] Indexed: ${event.filePath}`);
|
|
69
|
+
}
|
|
70
|
+
else if (event.type === 'file_error') {
|
|
71
|
+
console.error(`[watcher] Error indexing: ${event.filePath}`);
|
|
72
|
+
}
|
|
73
|
+
},
|
|
74
|
+
});
|
|
75
|
+
console.log(`[watcher] Done: ${result.indexed} indexed, ${result.errors.length} errors`);
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
console.error('[watcher] Pipeline error:', err instanceof Error ? err.message : String(err));
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=handler.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"handler.js","sourceRoot":"","sources":["../../src/watcher/handler.ts"],"names":[],"mappings":"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"}
|
package/package.json
ADDED
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@itkoren/sqmd",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"description": "Local semantic search engine over Markdown files",
|
|
5
|
+
"repository": {
|
|
6
|
+
"type": "git",
|
|
7
|
+
"url": "https://github.com/itkoren/sqmd.git"
|
|
8
|
+
},
|
|
9
|
+
"type": "module",
|
|
10
|
+
"engines": { "node": ">=22.0.0" },
|
|
11
|
+
"bin": { "sqmd": "dist/index.js" },
|
|
12
|
+
"files": ["dist", "README.md", "LICENSE", "CHANGELOG.md"],
|
|
13
|
+
"scripts": {
|
|
14
|
+
"build": "tsc",
|
|
15
|
+
"dev": "tsx src/index.ts",
|
|
16
|
+
"test": "vitest run",
|
|
17
|
+
"test:watch": "vitest",
|
|
18
|
+
"type-check": "tsc --noEmit",
|
|
19
|
+
"lint": "biome lint .",
|
|
20
|
+
"lint:fix": "biome lint --write .",
|
|
21
|
+
"format": "biome format --write .",
|
|
22
|
+
"format:check": "biome format .",
|
|
23
|
+
"check": "biome check .",
|
|
24
|
+
"check:fix": "biome check --write .",
|
|
25
|
+
"test:unit": "vitest run --project unit",
|
|
26
|
+
"test:integration": "vitest run --project integration",
|
|
27
|
+
"test:coverage": "vitest run --coverage",
|
|
28
|
+
"release:prepare": "bash scripts/prepare-release.sh"
|
|
29
|
+
},
|
|
30
|
+
"dependencies": {
|
|
31
|
+
"@lancedb/lancedb": "^0.10.0",
|
|
32
|
+
"apache-arrow": "^17.0.0",
|
|
33
|
+
"@huggingface/transformers": "^3.0.0",
|
|
34
|
+
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
35
|
+
"hono": "^4.0.0",
|
|
36
|
+
"@hono/node-server": "^1.13.7",
|
|
37
|
+
"remark": "^15.0.0",
|
|
38
|
+
"remark-parse": "^11.0.0",
|
|
39
|
+
"unist-util-visit": "^5.0.0",
|
|
40
|
+
"chokidar": "^3.6.0",
|
|
41
|
+
"commander": "^12.0.0",
|
|
42
|
+
"zod": "^3.22.0",
|
|
43
|
+
"js-yaml": "^4.1.0",
|
|
44
|
+
"chalk": "^5.0.0",
|
|
45
|
+
"p-limit": "^6.0.0"
|
|
46
|
+
},
|
|
47
|
+
"devDependencies": {
|
|
48
|
+
"typescript": "^5.5.0",
|
|
49
|
+
"@types/node": "^22.0.0",
|
|
50
|
+
"@types/js-yaml": "^4.0.0",
|
|
51
|
+
"vitest": "^2.0.0",
|
|
52
|
+
"tsx": "^4.0.0",
|
|
53
|
+
"@biomejs/biome": "^1.9.0",
|
|
54
|
+
"@vitest/coverage-v8": "^2.0.0"
|
|
55
|
+
}
|
|
56
|
+
}
|