abb-opencode-local-rag 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/LICENSE +21 -0
- package/README.de.md +416 -0
- package/README.es.md +416 -0
- package/README.fr.md +416 -0
- package/README.md +491 -0
- package/README.pt-BR.md +416 -0
- package/README.zh-CN.md +416 -0
- package/dist/bin/install-skills.d.ts +20 -0
- package/dist/bin/install-skills.d.ts.map +1 -0
- package/dist/bin/install-skills.js +195 -0
- package/dist/bin/install-skills.js.map +1 -0
- package/dist/chunker/index.d.ts +24 -0
- package/dist/chunker/index.d.ts.map +1 -0
- package/dist/chunker/index.js +2 -0
- package/dist/chunker/index.js.map +1 -0
- package/dist/chunker/semantic-chunker.d.ts +97 -0
- package/dist/chunker/semantic-chunker.d.ts.map +1 -0
- package/dist/chunker/semantic-chunker.js +294 -0
- package/dist/chunker/semantic-chunker.js.map +1 -0
- package/dist/chunker/sentence-splitter.d.ts +28 -0
- package/dist/chunker/sentence-splitter.d.ts.map +1 -0
- package/dist/chunker/sentence-splitter.js +219 -0
- package/dist/chunker/sentence-splitter.js.map +1 -0
- package/dist/cli/common.d.ts +65 -0
- package/dist/cli/common.d.ts.map +1 -0
- package/dist/cli/common.js +138 -0
- package/dist/cli/common.js.map +1 -0
- package/dist/cli/delete.d.ts +8 -0
- package/dist/cli/delete.d.ts.map +1 -0
- package/dist/cli/delete.js +173 -0
- package/dist/cli/delete.js.map +1 -0
- package/dist/cli/file-collection.d.ts +2 -0
- package/dist/cli/file-collection.d.ts.map +1 -0
- package/dist/cli/file-collection.js +53 -0
- package/dist/cli/file-collection.js.map +1 -0
- package/dist/cli/ingest.d.ts +100 -0
- package/dist/cli/ingest.d.ts.map +1 -0
- package/dist/cli/ingest.js +363 -0
- package/dist/cli/ingest.js.map +1 -0
- package/dist/cli/list.d.ts +35 -0
- package/dist/cli/list.d.ts.map +1 -0
- package/dist/cli/list.js +210 -0
- package/dist/cli/list.js.map +1 -0
- package/dist/cli/options.d.ts +100 -0
- package/dist/cli/options.d.ts.map +1 -0
- package/dist/cli/options.js +241 -0
- package/dist/cli/options.js.map +1 -0
- package/dist/cli/query.d.ts +24 -0
- package/dist/cli/query.d.ts.map +1 -0
- package/dist/cli/query.js +191 -0
- package/dist/cli/query.js.map +1 -0
- package/dist/cli/read-neighbors.d.ts +11 -0
- package/dist/cli/read-neighbors.d.ts.map +1 -0
- package/dist/cli/read-neighbors.js +224 -0
- package/dist/cli/read-neighbors.js.map +1 -0
- package/dist/cli/status.d.ts +8 -0
- package/dist/cli/status.d.ts.map +1 -0
- package/dist/cli/status.js +80 -0
- package/dist/cli/status.js.map +1 -0
- package/dist/cli/sync.d.ts +8 -0
- package/dist/cli/sync.d.ts.map +1 -0
- package/dist/cli/sync.js +244 -0
- package/dist/cli/sync.js.map +1 -0
- package/dist/cli-main.d.ts +12 -0
- package/dist/cli-main.d.ts.map +1 -0
- package/dist/cli-main.js +63 -0
- package/dist/cli-main.js.map +1 -0
- package/dist/embedder/index.d.ts +85 -0
- package/dist/embedder/index.d.ts.map +1 -0
- package/dist/embedder/index.js +284 -0
- package/dist/embedder/index.js.map +1 -0
- package/dist/features/list.d.ts +37 -0
- package/dist/features/list.d.ts.map +1 -0
- package/dist/features/list.js +40 -0
- package/dist/features/list.js.map +1 -0
- package/dist/features/sync.d.ts +207 -0
- package/dist/features/sync.d.ts.map +1 -0
- package/dist/features/sync.js +380 -0
- package/dist/features/sync.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +53 -0
- package/dist/index.js.map +1 -0
- package/dist/ingest/compute.d.ts +86 -0
- package/dist/ingest/compute.d.ts.map +1 -0
- package/dist/ingest/compute.js +177 -0
- package/dist/ingest/compute.js.map +1 -0
- package/dist/ingest/file.d.ts +27 -0
- package/dist/ingest/file.d.ts.map +1 -0
- package/dist/ingest/file.js +67 -0
- package/dist/ingest/file.js.map +1 -0
- package/dist/ingest/visual.d.ts +45 -0
- package/dist/ingest/visual.d.ts.map +1 -0
- package/dist/ingest/visual.js +234 -0
- package/dist/ingest/visual.js.map +1 -0
- package/dist/parser/docx-parser.d.ts +12 -0
- package/dist/parser/docx-parser.d.ts.map +1 -0
- package/dist/parser/docx-parser.js +328 -0
- package/dist/parser/docx-parser.js.map +1 -0
- package/dist/parser/html-parser.d.ts +18 -0
- package/dist/parser/html-parser.d.ts.map +1 -0
- package/dist/parser/html-parser.js +102 -0
- package/dist/parser/html-parser.js.map +1 -0
- package/dist/parser/index.d.ts +214 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +454 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/parser/pdf-extract.d.ts +81 -0
- package/dist/parser/pdf-extract.d.ts.map +1 -0
- package/dist/parser/pdf-extract.js +112 -0
- package/dist/parser/pdf-extract.js.map +1 -0
- package/dist/parser/pdf-filter.d.ts +117 -0
- package/dist/parser/pdf-filter.d.ts.map +1 -0
- package/dist/parser/pdf-filter.js +528 -0
- package/dist/parser/pdf-filter.js.map +1 -0
- package/dist/parser/title-extractor.d.ts +69 -0
- package/dist/parser/title-extractor.d.ts.map +1 -0
- package/dist/parser/title-extractor.js +145 -0
- package/dist/parser/title-extractor.js.map +1 -0
- package/dist/pdf-visual/captioner.d.ts +16 -0
- package/dist/pdf-visual/captioner.d.ts.map +1 -0
- package/dist/pdf-visual/captioner.js +63 -0
- package/dist/pdf-visual/captioner.js.map +1 -0
- package/dist/pdf-visual/captioners/fast.d.ts +7 -0
- package/dist/pdf-visual/captioners/fast.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/fast.js +103 -0
- package/dist/pdf-visual/captioners/fast.js.map +1 -0
- package/dist/pdf-visual/captioners/quality.d.ts +7 -0
- package/dist/pdf-visual/captioners/quality.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/quality.js +127 -0
- package/dist/pdf-visual/captioners/quality.js.map +1 -0
- package/dist/pdf-visual/captioners/shared.d.ts +44 -0
- package/dist/pdf-visual/captioners/shared.d.ts.map +1 -0
- package/dist/pdf-visual/captioners/shared.js +104 -0
- package/dist/pdf-visual/captioners/shared.js.map +1 -0
- package/dist/pdf-visual/detector.d.ts +9 -0
- package/dist/pdf-visual/detector.d.ts.map +1 -0
- package/dist/pdf-visual/detector.js +234 -0
- package/dist/pdf-visual/detector.js.map +1 -0
- package/dist/pdf-visual/index.d.ts +13 -0
- package/dist/pdf-visual/index.d.ts.map +1 -0
- package/dist/pdf-visual/index.js +45 -0
- package/dist/pdf-visual/index.js.map +1 -0
- package/dist/pdf-visual/renderer.d.ts +9 -0
- package/dist/pdf-visual/renderer.d.ts.map +1 -0
- package/dist/pdf-visual/renderer.js +177 -0
- package/dist/pdf-visual/renderer.js.map +1 -0
- package/dist/pdf-visual/types.d.ts +62 -0
- package/dist/pdf-visual/types.d.ts.map +1 -0
- package/dist/pdf-visual/types.js +32 -0
- package/dist/pdf-visual/types.js.map +1 -0
- package/dist/server/error-utils.d.ts +79 -0
- package/dist/server/error-utils.d.ts.map +1 -0
- package/dist/server/error-utils.js +148 -0
- package/dist/server/error-utils.js.map +1 -0
- package/dist/server/index.d.ts +258 -0
- package/dist/server/index.d.ts.map +1 -0
- package/dist/server/index.js +1104 -0
- package/dist/server/index.js.map +1 -0
- package/dist/server/list-scanner.d.ts +52 -0
- package/dist/server/list-scanner.d.ts.map +1 -0
- package/dist/server/list-scanner.js +72 -0
- package/dist/server/list-scanner.js.map +1 -0
- package/dist/server/tool-definitions.d.ts +8 -0
- package/dist/server/tool-definitions.d.ts.map +1 -0
- package/dist/server/tool-definitions.js +181 -0
- package/dist/server/tool-definitions.js.map +1 -0
- package/dist/server/tool-input.d.ts +37 -0
- package/dist/server/tool-input.d.ts.map +1 -0
- package/dist/server/tool-input.js +216 -0
- package/dist/server/tool-input.js.map +1 -0
- package/dist/server/types.d.ts +331 -0
- package/dist/server/types.d.ts.map +1 -0
- package/dist/server/types.js +3 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server-main.d.ts +46 -0
- package/dist/server-main.d.ts.map +1 -0
- package/dist/server-main.js +242 -0
- package/dist/server-main.js.map +1 -0
- package/dist/utils/base-dirs.d.ts +212 -0
- package/dist/utils/base-dirs.d.ts.map +1 -0
- package/dist/utils/base-dirs.js +422 -0
- package/dist/utils/base-dirs.js.map +1 -0
- package/dist/utils/errors.d.ts +24 -0
- package/dist/utils/errors.d.ts.map +1 -0
- package/dist/utils/errors.js +53 -0
- package/dist/utils/errors.js.map +1 -0
- package/dist/utils/limits.d.ts +26 -0
- package/dist/utils/limits.d.ts.map +1 -0
- package/dist/utils/limits.js +28 -0
- package/dist/utils/limits.js.map +1 -0
- package/dist/utils/list-sources.d.ts +47 -0
- package/dist/utils/list-sources.d.ts.map +1 -0
- package/dist/utils/list-sources.js +50 -0
- package/dist/utils/list-sources.js.map +1 -0
- package/dist/utils/raw-data-utils.d.ts +131 -0
- package/dist/utils/raw-data-utils.d.ts.map +1 -0
- package/dist/utils/raw-data-utils.js +255 -0
- package/dist/utils/raw-data-utils.js.map +1 -0
- package/dist/utils/scan.d.ts +126 -0
- package/dist/utils/scan.d.ts.map +1 -0
- package/dist/utils/scan.js +221 -0
- package/dist/utils/scan.js.map +1 -0
- package/dist/utils/scope-match.d.ts +43 -0
- package/dist/utils/scope-match.d.ts.map +1 -0
- package/dist/utils/scope-match.js +87 -0
- package/dist/utils/scope-match.js.map +1 -0
- package/dist/utils/sensitive-path.d.ts +23 -0
- package/dist/utils/sensitive-path.d.ts.map +1 -0
- package/dist/utils/sensitive-path.js +91 -0
- package/dist/utils/sensitive-path.js.map +1 -0
- package/dist/utils/sync-path-key.d.ts +20 -0
- package/dist/utils/sync-path-key.d.ts.map +1 -0
- package/dist/utils/sync-path-key.js +33 -0
- package/dist/utils/sync-path-key.js.map +1 -0
- package/dist/vectordb/index.d.ts +168 -0
- package/dist/vectordb/index.d.ts.map +1 -0
- package/dist/vectordb/index.js +619 -0
- package/dist/vectordb/index.js.map +1 -0
- package/dist/vectordb/search-filters.d.ts +39 -0
- package/dist/vectordb/search-filters.d.ts.map +1 -0
- package/dist/vectordb/search-filters.js +136 -0
- package/dist/vectordb/search-filters.js.map +1 -0
- package/dist/vectordb/types.d.ts +196 -0
- package/dist/vectordb/types.d.ts.map +1 -0
- package/dist/vectordb/types.js +224 -0
- package/dist/vectordb/types.js.map +1 -0
- package/package.json +105 -0
- package/skills/mcp-local-rag/SKILL.md +308 -0
- package/skills/mcp-local-rag/references/cli-reference.md +175 -0
- package/skills/mcp-local-rag/references/html-ingestion.md +78 -0
- package/skills/mcp-local-rag/references/query-optimization.md +57 -0
- package/skills/mcp-local-rag/references/result-refinement.md +56 -0
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
// CLI read-neighbors subcommand — read N chunks before/after a target chunk within one document
|
|
2
|
+
import { resolve } from 'node:path';
|
|
3
|
+
import { MAX_NEIGHBOR_COUNT } from '../utils/limits.js';
|
|
4
|
+
import { extractSourceFromPath, generateRawDataPath, isManagedRawDataPath, } from '../utils/raw-data-utils.js';
|
|
5
|
+
import { createVectorStore, formatCliError } from './common.js';
|
|
6
|
+
import { resolveGlobalConfig, validatePath } from './options.js';
|
|
7
|
+
// ============================================
|
|
8
|
+
// Defaults
|
|
9
|
+
// ============================================
|
|
10
|
+
const READ_NEIGHBORS_DEFAULTS = {
|
|
11
|
+
before: 2,
|
|
12
|
+
after: 2,
|
|
13
|
+
};
|
|
14
|
+
// ============================================
|
|
15
|
+
// Help
|
|
16
|
+
// ============================================
|
|
17
|
+
const HELP_TEXT = `Usage: mcp-local-rag [global-options] read-neighbors [options]
|
|
18
|
+
|
|
19
|
+
Read N chunks before and after a target chunk within the same document.
|
|
20
|
+
|
|
21
|
+
Either --file-path or --source is required, not both.
|
|
22
|
+
|
|
23
|
+
Options:
|
|
24
|
+
--file-path <abs-path> File path of ingested content (absolute path)
|
|
25
|
+
--source <id> Source identifier (for content ingested via ingest_data)
|
|
26
|
+
--chunk-index <n> Target chunk index (zero-based, required, non-negative integer)
|
|
27
|
+
--before <n> Number of chunks before the target (default: ${READ_NEIGHBORS_DEFAULTS.before}, non-negative integer)
|
|
28
|
+
--after <n> Number of chunks after the target (default: ${READ_NEIGHBORS_DEFAULTS.after}, non-negative integer)
|
|
29
|
+
-h, --help Show this help
|
|
30
|
+
|
|
31
|
+
Defaults: before=${READ_NEIGHBORS_DEFAULTS.before}, after=${READ_NEIGHBORS_DEFAULTS.after} (grep -C 2 convention)
|
|
32
|
+
|
|
33
|
+
Example:
|
|
34
|
+
npx mcp-local-rag read-neighbors --file-path /abs/path/file.md --chunk-index 12 --before 3 --after 3
|
|
35
|
+
|
|
36
|
+
Global options (must appear before "read-neighbors"):
|
|
37
|
+
--db-path <path> LanceDB database path
|
|
38
|
+
--cache-dir <path> Model cache directory
|
|
39
|
+
--model-name <name> Embedding model`;
|
|
40
|
+
/**
|
|
41
|
+
* Parse a value expected to be a non-negative integer flag value.
|
|
42
|
+
* Throws a descriptive Error on malformed input; the outer runReadNeighbors
|
|
43
|
+
* try/catch converts this into `console.error` + `process.exit(1)`.
|
|
44
|
+
*/
|
|
45
|
+
function parseNonNegativeInteger(flag, rawValue) {
|
|
46
|
+
if (rawValue === undefined || rawValue.startsWith('-')) {
|
|
47
|
+
throw new Error(`Missing value for ${flag}`);
|
|
48
|
+
}
|
|
49
|
+
const parsed = Number.parseInt(rawValue, 10);
|
|
50
|
+
if (!Number.isInteger(parsed) || parsed < 0 || String(parsed) !== rawValue) {
|
|
51
|
+
throw new Error(`${flag} must be a non-negative integer`);
|
|
52
|
+
}
|
|
53
|
+
return parsed;
|
|
54
|
+
}
|
|
55
|
+
/**
|
|
56
|
+
* Parse read-neighbors CLI arguments.
|
|
57
|
+
* Flags: --file-path, --source, --chunk-index, --before, --after, -h/--help.
|
|
58
|
+
* Integer flags are validated syntactically (must be non-negative integer).
|
|
59
|
+
* Semantic validation (required-ness, XOR) is performed in runReadNeighbors.
|
|
60
|
+
*/
|
|
61
|
+
function parseArgs(args) {
|
|
62
|
+
let help = false;
|
|
63
|
+
let filePath;
|
|
64
|
+
let source;
|
|
65
|
+
let chunkIndex;
|
|
66
|
+
let before;
|
|
67
|
+
let after;
|
|
68
|
+
let i = 0;
|
|
69
|
+
while (i < args.length) {
|
|
70
|
+
const arg = args[i];
|
|
71
|
+
if (arg === '-h' || arg === '--help') {
|
|
72
|
+
help = true;
|
|
73
|
+
i++;
|
|
74
|
+
}
|
|
75
|
+
else if (arg === '--file-path') {
|
|
76
|
+
const value = args[++i];
|
|
77
|
+
if (value === undefined || value.startsWith('-')) {
|
|
78
|
+
throw new Error('Missing value for --file-path');
|
|
79
|
+
}
|
|
80
|
+
filePath = value;
|
|
81
|
+
i++;
|
|
82
|
+
}
|
|
83
|
+
else if (arg === '--source') {
|
|
84
|
+
const value = args[++i];
|
|
85
|
+
if (value === undefined || value.startsWith('-')) {
|
|
86
|
+
throw new Error('Missing value for --source');
|
|
87
|
+
}
|
|
88
|
+
source = value;
|
|
89
|
+
i++;
|
|
90
|
+
}
|
|
91
|
+
else if (arg === '--chunk-index') {
|
|
92
|
+
chunkIndex = parseNonNegativeInteger('--chunk-index', args[++i]);
|
|
93
|
+
i++;
|
|
94
|
+
}
|
|
95
|
+
else if (arg === '--before') {
|
|
96
|
+
before = parseNonNegativeInteger('--before', args[++i]);
|
|
97
|
+
i++;
|
|
98
|
+
}
|
|
99
|
+
else if (arg === '--after') {
|
|
100
|
+
after = parseNonNegativeInteger('--after', args[++i]);
|
|
101
|
+
i++;
|
|
102
|
+
}
|
|
103
|
+
else if (arg.startsWith('-')) {
|
|
104
|
+
throw new Error(`Unknown option: ${arg}`);
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
throw new Error(`Unexpected argument: ${arg}`);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
const result = { help };
|
|
111
|
+
if (filePath !== undefined)
|
|
112
|
+
result.filePath = filePath;
|
|
113
|
+
if (source !== undefined)
|
|
114
|
+
result.source = source;
|
|
115
|
+
if (chunkIndex !== undefined)
|
|
116
|
+
result.chunkIndex = chunkIndex;
|
|
117
|
+
if (before !== undefined)
|
|
118
|
+
result.before = before;
|
|
119
|
+
if (after !== undefined)
|
|
120
|
+
result.after = after;
|
|
121
|
+
return result;
|
|
122
|
+
}
|
|
123
|
+
// ============================================
|
|
124
|
+
// Main Entry Point
|
|
125
|
+
// ============================================
|
|
126
|
+
/**
|
|
127
|
+
* Run the read-neighbors CLI subcommand.
|
|
128
|
+
* Reads chunks adjacent to a target chunkIndex within a single document.
|
|
129
|
+
* Does NOT perform any search; this is an index-adjacent retrieval utility.
|
|
130
|
+
*
|
|
131
|
+
* @param args - Arguments after "read-neighbors"
|
|
132
|
+
* @param globalOptions - Global options parsed before the subcommand
|
|
133
|
+
*/
|
|
134
|
+
export async function runReadNeighbors(args, globalOptions = {}) {
|
|
135
|
+
// Parse CLI options (parse errors are caught and converted to exit(1) below).
|
|
136
|
+
let parsed;
|
|
137
|
+
try {
|
|
138
|
+
parsed = parseArgs(args);
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
const reason = formatCliError(error);
|
|
142
|
+
console.error(`Error: ${reason}`);
|
|
143
|
+
process.exit(1);
|
|
144
|
+
}
|
|
145
|
+
// Handle --help OUTSIDE the main try/catch so exit(0) is not converted to exit(1).
|
|
146
|
+
// Mirrors src/cli/delete.ts and src/cli/query.ts.
|
|
147
|
+
if (parsed.help) {
|
|
148
|
+
console.error(HELP_TEXT);
|
|
149
|
+
process.exit(0);
|
|
150
|
+
}
|
|
151
|
+
try {
|
|
152
|
+
// Validation order matches the MCP handler: chunkIndex → before → after → XOR.
|
|
153
|
+
if (parsed.chunkIndex === undefined) {
|
|
154
|
+
throw new Error('--chunk-index is required and must be a non-negative integer');
|
|
155
|
+
}
|
|
156
|
+
const chunkIndex = parsed.chunkIndex;
|
|
157
|
+
const before = parsed.before ?? READ_NEIGHBORS_DEFAULTS.before;
|
|
158
|
+
if (before > MAX_NEIGHBOR_COUNT) {
|
|
159
|
+
throw new Error(`before must be between 0 and ${MAX_NEIGHBOR_COUNT} (got ${before})`);
|
|
160
|
+
}
|
|
161
|
+
const after = parsed.after ?? READ_NEIGHBORS_DEFAULTS.after;
|
|
162
|
+
if (after > MAX_NEIGHBOR_COUNT) {
|
|
163
|
+
throw new Error(`after must be between 0 and ${MAX_NEIGHBOR_COUNT} (got ${after})`);
|
|
164
|
+
}
|
|
165
|
+
// XOR: exactly one of --file-path / --source
|
|
166
|
+
const hasFilePath = parsed.filePath !== undefined;
|
|
167
|
+
const hasSource = parsed.source !== undefined;
|
|
168
|
+
if (!hasFilePath && !hasSource) {
|
|
169
|
+
throw new Error('Either --file-path or --source is required');
|
|
170
|
+
}
|
|
171
|
+
if (hasFilePath && hasSource) {
|
|
172
|
+
throw new Error('Cannot specify both --file-path and --source');
|
|
173
|
+
}
|
|
174
|
+
// Resolve global config
|
|
175
|
+
const globalConfig = resolveGlobalConfig(globalOptions);
|
|
176
|
+
// Determine target file path (dual-input resolution).
|
|
177
|
+
let targetPath;
|
|
178
|
+
if (parsed.source !== undefined) {
|
|
179
|
+
// Generate raw-data path from source identifier.
|
|
180
|
+
targetPath = generateRawDataPath(globalConfig.dbPath, parsed.source);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
// DB key is the resolve()'d ingest path, so look up by resolve() (never
|
|
184
|
+
// realpath); validate below (mirrors runDelete; realpath stays there).
|
|
185
|
+
targetPath = resolve(parsed.filePath);
|
|
186
|
+
const pathError = validatePath(targetPath, '--file-path');
|
|
187
|
+
if (pathError) {
|
|
188
|
+
console.error(pathError);
|
|
189
|
+
process.exit(1);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
const vectorStore = createVectorStore(globalConfig);
|
|
193
|
+
try {
|
|
194
|
+
await vectorStore.initialize();
|
|
195
|
+
const minIdx = Math.max(0, chunkIndex - before);
|
|
196
|
+
const maxIdx = chunkIndex + after;
|
|
197
|
+
const rows = await vectorStore.getChunksByRange(targetPath, minIdx, maxIdx);
|
|
198
|
+
const isRaw = isManagedRawDataPath(targetPath, globalConfig.dbPath);
|
|
199
|
+
const sourceForAll = isRaw ? extractSourceFromPath(targetPath) : null;
|
|
200
|
+
const items = rows.map((row) => {
|
|
201
|
+
const item = {
|
|
202
|
+
filePath: row.filePath,
|
|
203
|
+
chunkIndex: row.chunkIndex,
|
|
204
|
+
text: row.text,
|
|
205
|
+
isTarget: row.chunkIndex === chunkIndex,
|
|
206
|
+
fileTitle: row.fileTitle ?? null,
|
|
207
|
+
};
|
|
208
|
+
if (sourceForAll)
|
|
209
|
+
item.source = sourceForAll;
|
|
210
|
+
return item;
|
|
211
|
+
});
|
|
212
|
+
process.stdout.write(`${JSON.stringify(items, null, 2)}\n`);
|
|
213
|
+
}
|
|
214
|
+
finally {
|
|
215
|
+
await vectorStore.close();
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
catch (error) {
|
|
219
|
+
const reason = formatCliError(error);
|
|
220
|
+
console.error(`Error: ${reason}`);
|
|
221
|
+
process.exitCode = 1;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=read-neighbors.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-neighbors.js","sourceRoot":"","sources":["../../src/cli/read-neighbors.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { GlobalOptions } from './options.js';
|
|
2
|
+
/**
|
|
3
|
+
* Run the status CLI subcommand.
|
|
4
|
+
* @param args - Arguments after "status" (should be empty or --help)
|
|
5
|
+
* @param globalOptions - Global options parsed before the subcommand
|
|
6
|
+
*/
|
|
7
|
+
export declare function runStatus(args: string[], globalOptions?: GlobalOptions): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.d.ts","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAoDjD;;;;GAIG;AACH,wBAAsB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6BhG"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// CLI status subcommand — show vector database status
|
|
2
|
+
import { createVectorStore, formatCliError } from './common.js';
|
|
3
|
+
import { resolveGlobalConfig } from './options.js';
|
|
4
|
+
// ============================================
|
|
5
|
+
// Help
|
|
6
|
+
// ============================================
|
|
7
|
+
const HELP_TEXT = `Usage: mcp-local-rag [global-options] status
|
|
8
|
+
|
|
9
|
+
Show vector database status (document count, chunk count, memory usage, etc.).
|
|
10
|
+
|
|
11
|
+
Options:
|
|
12
|
+
-h, --help Show this help
|
|
13
|
+
|
|
14
|
+
Global options (must appear before "status"):
|
|
15
|
+
--db-path <path> LanceDB database path
|
|
16
|
+
--cache-dir <path> Model cache directory
|
|
17
|
+
--model-name <name> Embedding model`;
|
|
18
|
+
// ============================================
|
|
19
|
+
// Arg Parsing
|
|
20
|
+
// ============================================
|
|
21
|
+
/**
|
|
22
|
+
* Parse status-specific CLI arguments.
|
|
23
|
+
* Status accepts no options or positional args — only -h/--help.
|
|
24
|
+
* Unknown flags or positional args cause an error.
|
|
25
|
+
*/
|
|
26
|
+
function parseArgs(args) {
|
|
27
|
+
let help = false;
|
|
28
|
+
for (const arg of args) {
|
|
29
|
+
if (arg === '-h' || arg === '--help') {
|
|
30
|
+
help = true;
|
|
31
|
+
}
|
|
32
|
+
else if (arg.startsWith('-')) {
|
|
33
|
+
console.error(`Unknown option: ${arg}`);
|
|
34
|
+
console.error(HELP_TEXT);
|
|
35
|
+
process.exit(1);
|
|
36
|
+
}
|
|
37
|
+
else {
|
|
38
|
+
console.error(`Unexpected argument: ${arg}`);
|
|
39
|
+
console.error(HELP_TEXT);
|
|
40
|
+
process.exit(1);
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
return { help };
|
|
44
|
+
}
|
|
45
|
+
// ============================================
|
|
46
|
+
// Main Entry Point
|
|
47
|
+
// ============================================
|
|
48
|
+
/**
|
|
49
|
+
* Run the status CLI subcommand.
|
|
50
|
+
* @param args - Arguments after "status" (should be empty or --help)
|
|
51
|
+
* @param globalOptions - Global options parsed before the subcommand
|
|
52
|
+
*/
|
|
53
|
+
export async function runStatus(args, globalOptions = {}) {
|
|
54
|
+
// Parse CLI options
|
|
55
|
+
const { help } = parseArgs(args);
|
|
56
|
+
// Handle --help
|
|
57
|
+
if (help) {
|
|
58
|
+
console.error(HELP_TEXT);
|
|
59
|
+
process.exit(0);
|
|
60
|
+
}
|
|
61
|
+
// Resolve global config
|
|
62
|
+
const globalConfig = resolveGlobalConfig(globalOptions);
|
|
63
|
+
const vectorStore = createVectorStore(globalConfig);
|
|
64
|
+
try {
|
|
65
|
+
await vectorStore.initialize();
|
|
66
|
+
// Get status
|
|
67
|
+
const status = await vectorStore.getStatus();
|
|
68
|
+
// Output JSON to stdout
|
|
69
|
+
process.stdout.write(JSON.stringify(status));
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
const reason = formatCliError(error);
|
|
73
|
+
console.error(`Error: ${reason}`);
|
|
74
|
+
process.exitCode = 1;
|
|
75
|
+
}
|
|
76
|
+
finally {
|
|
77
|
+
await vectorStore.close();
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
//# sourceMappingURL=status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.js","sourceRoot":"","sources":["../../src/cli/status.ts"],"names":[],"mappings":"AAAA,sDAAsD;AAEtD,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAE/D,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAA;AAElD,+CAA+C;AAC/C,OAAO;AACP,+CAA+C;AAE/C,MAAM,SAAS,GAAG;;;;;;;;;;yCAUuB,CAAA;AAEzC,+CAA+C;AAC/C,cAAc;AACd,+CAA+C;AAE/C;;;;GAIG;AACH,SAAS,SAAS,CAAC,IAAc;IAC/B,IAAI,IAAI,GAAG,KAAK,CAAA;IAEhB,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;YACrC,IAAI,GAAG,IAAI,CAAA;QACb,CAAC;aAAM,IAAI,GAAG,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;YAC/B,OAAO,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAA;YACvC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,KAAK,CAAC,wBAAwB,GAAG,EAAE,CAAC,CAAA;YAC5C,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;YACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,IAAI,EAAE,CAAA;AACjB,CAAC;AAED,+CAA+C;AAC/C,mBAAmB;AACnB,+CAA+C;AAE/C;;;;GAIG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,IAAc,EAAE,aAAa,GAAkB,EAAE;IAC/E,oBAAoB;IACpB,MAAM,EAAE,IAAI,EAAE,GAAG,SAAS,CAAC,IAAI,CAAC,CAAA;IAEhC,gBAAgB;IAChB,IAAI,IAAI,EAAE,CAAC;QACT,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,CAAA;QACxB,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;IACjB,CAAC;IAED,wBAAwB;IACxB,MAAM,YAAY,GAAG,mBAAmB,CAAC,aAAa,CAAC,CAAA;IACvD,MAAM,WAAW,GAAG,iBAAiB,CAAC,YAAY,CAAC,CAAA;IAEnD,IAAI,CAAC;QACH,MAAM,WAAW,CAAC,UAAU,EAAE,CAAA;QAE9B,aAAa;QACb,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,SAAS,EAAE,CAAA;QAE5C,wBAAwB;QACxB,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC,CAAA;IAC9C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,MAAM,GAAG,cAAc,CAAC,KAAK,CAAC,CAAA;QACpC,OAAO,CAAC,KAAK,CAAC,UAAU,MAAM,EAAE,CAAC,CAAA;QACjC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAA;IACtB,CAAC;YAAS,CAAC;QACT,MAAM,WAAW,CAAC,KAAK,EAAE,CAAA;IAC3B,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { GlobalOptions } from './options.js';
|
|
2
|
+
/**
|
|
3
|
+
* Run the sync CLI subcommand.
|
|
4
|
+
* @param args - Arguments after "sync"
|
|
5
|
+
* @param globalOptions - Global options parsed before the subcommand
|
|
6
|
+
*/
|
|
7
|
+
export declare function runSync(args: string[], globalOptions?: GlobalOptions): Promise<void>;
|
|
8
|
+
//# sourceMappingURL=sync.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.d.ts","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":"AAkCA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAgIjD;;;;GAIG;AACH,wBAAsB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA6I9F"}
|
package/dist/cli/sync.js
ADDED
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
// CLI sync subcommand — foreground incremental reconciliation of the index.
|
|
2
|
+
//
|
|
3
|
+
// Composition root for `src/features/sync.ts`: this file supplies the real
|
|
4
|
+
// collaborators (filesystem, scanner, hasher, store, ingestion) and renders the
|
|
5
|
+
// result. Planning, prune eligibility, execution order, and the stop-on-first-
|
|
6
|
+
// error policy all live in the core and are not reproduced here — including the
|
|
7
|
+
// "inside a configured root" check, which the core answers by composing
|
|
8
|
+
// `toSyncPathKey` with the unchanged `isUnderOrEqual`.
|
|
9
|
+
//
|
|
10
|
+
// The run stays attached to the process until it completes: backgrounding and
|
|
11
|
+
// polling belong to the caller (SYNC-005), so there is no daemon, poller, or
|
|
12
|
+
// watchdog here.
|
|
13
|
+
import { readFile, stat } from 'node:fs/promises';
|
|
14
|
+
import { resolve, sep } from 'node:path';
|
|
15
|
+
import { SemanticChunker } from '../chunker/index.js';
|
|
16
|
+
import { formatSyncError, runSync as runSyncCore, } from '../features/sync.js';
|
|
17
|
+
import { computeContentHash } from '../ingest/compute.js';
|
|
18
|
+
import { DocumentParser } from '../parser/index.js';
|
|
19
|
+
import { MAX_SCAN_DEPTH } from '../utils/limits.js';
|
|
20
|
+
import { bfsCollectSupportedFiles, canonicalizeRequestedPath, classifyRequestedPath, } from '../utils/scan.js';
|
|
21
|
+
import { createEmbedder, createVectorStore, formatCliError } from './common.js';
|
|
22
|
+
import { ingestSingleFile, resolveConfig } from './ingest.js';
|
|
23
|
+
import { consumeBaseDirArg, resolveGlobalConfig } from './options.js';
|
|
24
|
+
// ============================================
|
|
25
|
+
// Help
|
|
26
|
+
// ============================================
|
|
27
|
+
const HELP_TEXT = `Usage: mcp-local-rag [global-options] sync [options] [path]
|
|
28
|
+
|
|
29
|
+
Reconcile the index with the files on disk: ingest new and changed files, leave
|
|
30
|
+
unchanged files alone, and remove index entries for files that are gone.
|
|
31
|
+
|
|
32
|
+
Runs in the foreground until it finishes. Use your shell to run it in the
|
|
33
|
+
background.
|
|
34
|
+
|
|
35
|
+
Arguments:
|
|
36
|
+
<path> File or directory inside a configured base directory
|
|
37
|
+
(default: every configured base directory)
|
|
38
|
+
|
|
39
|
+
Options:
|
|
40
|
+
--base-dir <path> Document root (repeatable; overrides environment roots)
|
|
41
|
+
--images Store images for new/changed PDF and DOCX files
|
|
42
|
+
-h, --help Show this help
|
|
43
|
+
|
|
44
|
+
Without --base-dir, roots come from BASE_DIRS / BASE_DIR (default: current directory).
|
|
45
|
+
|
|
46
|
+
Global options (must appear before "sync"):
|
|
47
|
+
--db-path <path> LanceDB database path
|
|
48
|
+
--cache-dir <path> Model cache directory
|
|
49
|
+
--model-name <name> Embedding model`;
|
|
50
|
+
/**
|
|
51
|
+
* Parse sync-specific CLI arguments: repeatable roots, at most one positional
|
|
52
|
+
* path, and -h/--help. Unknown flags still print the usage and exit 1.
|
|
53
|
+
*/
|
|
54
|
+
function parseArgs(args) {
|
|
55
|
+
let help = false;
|
|
56
|
+
const baseDirs = [];
|
|
57
|
+
let path;
|
|
58
|
+
let images = false;
|
|
59
|
+
let index = 0;
|
|
60
|
+
while (index < args.length) {
|
|
61
|
+
const arg = args[index];
|
|
62
|
+
switch (arg) {
|
|
63
|
+
case '-h':
|
|
64
|
+
case '--help':
|
|
65
|
+
help = true;
|
|
66
|
+
index++;
|
|
67
|
+
break;
|
|
68
|
+
case '--base-dir': {
|
|
69
|
+
const valueIndex = consumeBaseDirArg(args, index, baseDirs);
|
|
70
|
+
index = valueIndex + 1;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
case '--images':
|
|
74
|
+
images = true;
|
|
75
|
+
index++;
|
|
76
|
+
break;
|
|
77
|
+
default:
|
|
78
|
+
if (arg.startsWith('-')) {
|
|
79
|
+
console.error(`Unknown option: ${arg}`);
|
|
80
|
+
console.error(HELP_TEXT);
|
|
81
|
+
process.exit(1);
|
|
82
|
+
}
|
|
83
|
+
if (path !== undefined) {
|
|
84
|
+
console.error(`Unexpected argument: ${arg}`);
|
|
85
|
+
console.error('Only one path is accepted. Omit it to sync every configured base directory.');
|
|
86
|
+
process.exit(1);
|
|
87
|
+
}
|
|
88
|
+
path = arg;
|
|
89
|
+
index++;
|
|
90
|
+
break;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
const parsed = { help, baseDirs, images };
|
|
94
|
+
if (path !== undefined)
|
|
95
|
+
parsed.path = path;
|
|
96
|
+
return parsed;
|
|
97
|
+
}
|
|
98
|
+
// ============================================
|
|
99
|
+
// Reporting
|
|
100
|
+
// ============================================
|
|
101
|
+
/**
|
|
102
|
+
* Render the scanner's coverage facts as operator warnings. Each unobserved
|
|
103
|
+
* region is why prune was withheld there, so the path is named; the wording
|
|
104
|
+
* itself is not a contract.
|
|
105
|
+
*/
|
|
106
|
+
function coverageWarnings(coverage, maxFileSize) {
|
|
107
|
+
return [
|
|
108
|
+
...coverage.unreadableDirs.map(({ dirPath, code }) => `Warning: cannot read directory (${code}), so its indexed files were kept: ${dirPath}`),
|
|
109
|
+
...coverage.depthLimitedDirs.map((dirPath) => `Warning: not scanned because it exceeds the maximum depth (${MAX_SCAN_DEPTH}), so its indexed files were kept: ${dirPath}`),
|
|
110
|
+
...coverage.skippedSymlinks.map((linkPath) => `Warning: symbolic link not followed, so its indexed files were kept: ${linkPath}`),
|
|
111
|
+
...coverage.oversizedFiles.map((filePath) => `Warning: not read because it exceeds the maximum file size (${maxFileSize} bytes), so its indexed chunks were kept: ${filePath}`),
|
|
112
|
+
];
|
|
113
|
+
}
|
|
114
|
+
// ============================================
|
|
115
|
+
// Main Entry Point
|
|
116
|
+
// ============================================
|
|
117
|
+
/**
|
|
118
|
+
* Run the sync CLI subcommand.
|
|
119
|
+
* @param args - Arguments after "sync"
|
|
120
|
+
* @param globalOptions - Global options parsed before the subcommand
|
|
121
|
+
*/
|
|
122
|
+
export async function runSync(args, globalOptions = {}) {
|
|
123
|
+
const parsed = parseArgs(args);
|
|
124
|
+
if (parsed.help) {
|
|
125
|
+
console.error(HELP_TEXT);
|
|
126
|
+
process.exit(0);
|
|
127
|
+
}
|
|
128
|
+
const globalConfig = resolveGlobalConfig(globalOptions);
|
|
129
|
+
// Shared with `ingest`: CLI roots replace BASE_DIRS / BASE_DIR / cwd; an empty
|
|
130
|
+
// array preserves that environment fallback. Size/chunk settings share the
|
|
131
|
+
// same resolution and validation path.
|
|
132
|
+
const config = await resolveConfig(globalConfig, { baseDirs: parsed.baseDirs });
|
|
133
|
+
for (const warning of config.baseDirsWarnings) {
|
|
134
|
+
console.error(warning.message);
|
|
135
|
+
}
|
|
136
|
+
const excludePaths = [`${resolve(config.dbPath)}${sep}`, `${resolve(config.cacheDir)}${sep}`];
|
|
137
|
+
const vectorStore = createVectorStore(globalConfig);
|
|
138
|
+
// The parser's realpath check is the security boundary, so it takes the
|
|
139
|
+
// realpath'd roots; scanning uses the resolve()-only `rawBaseDirs` so scanned
|
|
140
|
+
// paths match the resolve()-stored DB keys (same split as `list`).
|
|
141
|
+
const parser = new DocumentParser({
|
|
142
|
+
baseDirs: config.baseDirs.baseDirs,
|
|
143
|
+
maxFileSize: config.maxFileSize,
|
|
144
|
+
});
|
|
145
|
+
const chunker = new SemanticChunker(config.chunkMinLength !== undefined ? { minChunkLength: config.chunkMinLength } : {});
|
|
146
|
+
// Built on the first upsert only: a run with nothing to ingest must not pay
|
|
147
|
+
// for the embedding model.
|
|
148
|
+
let embedder;
|
|
149
|
+
const ensureEmbedder = () => {
|
|
150
|
+
embedder ??= createEmbedder(globalConfig);
|
|
151
|
+
return embedder;
|
|
152
|
+
};
|
|
153
|
+
const collaborators = {
|
|
154
|
+
// The containment boundary for a requested path: the core compares this
|
|
155
|
+
// canonical form against the realpath'd roots, which is the only way to see
|
|
156
|
+
// that an intermediate component is a symbolic link out of the root.
|
|
157
|
+
canonicalizeRequestedPath,
|
|
158
|
+
// The walker's own predicates, so an explicitly requested path is subject to
|
|
159
|
+
// the same rules as a discovered one and is refused before it is read.
|
|
160
|
+
classifyPath: async (path) => await classifyRequestedPath(path, excludePaths),
|
|
161
|
+
// No `scope` argument, on purpose: a scope-pruned directory appears in none
|
|
162
|
+
// of the coverage arrays, which would hide an unobserved region and make
|
|
163
|
+
// prune unsafe.
|
|
164
|
+
scanDir: async (rootPath) => await bfsCollectSupportedFiles(rootPath, excludePaths, MAX_SCAN_DEPTH),
|
|
165
|
+
// Size first, bytes second: `MAX_FILE_SIZE` is otherwise enforced inside the
|
|
166
|
+
// parser, which runs long after the whole file would already be in memory
|
|
167
|
+
// here. Declining (`null`) keeps the rest of the run usable instead of
|
|
168
|
+
// aborting every future sync of the whole root on one oversized file.
|
|
169
|
+
//
|
|
170
|
+
// The bound holds only against a non-racing filesystem: a writer that grows
|
|
171
|
+
// the file, or replaces it with a FIFO, between the `stat` and the `readFile`
|
|
172
|
+
// restores the unbounded read or an indefinite block. That actor needs local
|
|
173
|
+
// write access as this same user and can already reach the database directly,
|
|
174
|
+
// so this is a recorded limitation rather than a defended boundary — as with
|
|
175
|
+
// the watchdog limitation noted on `requestedPathRejection`.
|
|
176
|
+
hashFile: async (filePath) => {
|
|
177
|
+
if ((await stat(filePath)).size > config.maxFileSize)
|
|
178
|
+
return null;
|
|
179
|
+
return computeContentHash(await readFile(filePath));
|
|
180
|
+
},
|
|
181
|
+
loadDbManifest: async () => await vectorStore.listChunkHashes(),
|
|
182
|
+
// Named as it happens, so a long run shows which file it is on and the
|
|
183
|
+
// counters alone are not the only record of what changed. A zero-chunk file
|
|
184
|
+
// already reports itself from inside `ingestSingleFile`.
|
|
185
|
+
ingestFile: async (filePath, images) => {
|
|
186
|
+
const ingestOptions = images
|
|
187
|
+
? { visual: false, images: true }
|
|
188
|
+
: { visual: false, images: false };
|
|
189
|
+
const chunkCount = await ingestSingleFile(filePath, parser, chunker, ensureEmbedder(), vectorStore, ingestOptions);
|
|
190
|
+
if (chunkCount > 0)
|
|
191
|
+
console.error(`upserted ${filePath} (${chunkCount} chunks)`);
|
|
192
|
+
return chunkCount;
|
|
193
|
+
},
|
|
194
|
+
deleteExactPath: async (filePath) => await vectorStore.deleteChunks(filePath),
|
|
195
|
+
optimize: async () => {
|
|
196
|
+
await vectorStore.optimize();
|
|
197
|
+
},
|
|
198
|
+
};
|
|
199
|
+
try {
|
|
200
|
+
await vectorStore.initialize();
|
|
201
|
+
const result = await runSyncCore({
|
|
202
|
+
roots: config.baseDirs.rawBaseDirs,
|
|
203
|
+
// The realpath'd counterpart of the same roots, which is what the core
|
|
204
|
+
// decides requested-path containment in (the parser's boundary domain).
|
|
205
|
+
canonicalRoots: config.baseDirs.baseDirs,
|
|
206
|
+
dbPath: config.dbPath,
|
|
207
|
+
excludePaths,
|
|
208
|
+
platform: process.platform,
|
|
209
|
+
// resolve() (never realpath) so the requested path is spelled like the
|
|
210
|
+
// stored DB keys; the core validates it against the configured roots.
|
|
211
|
+
...(parsed.path === undefined ? {} : { requestedPath: resolve(parsed.path) }),
|
|
212
|
+
...(parsed.images ? { images: true } : {}),
|
|
213
|
+
collaborators,
|
|
214
|
+
});
|
|
215
|
+
for (const prunedPath of result.prunedPaths) {
|
|
216
|
+
console.error(`pruned ${prunedPath}`);
|
|
217
|
+
}
|
|
218
|
+
for (const warning of coverageWarnings(result.coverage, config.maxFileSize)) {
|
|
219
|
+
console.error(warning);
|
|
220
|
+
}
|
|
221
|
+
if (result.error !== null) {
|
|
222
|
+
console.error(`Error: ${formatSyncError(result.error)}`);
|
|
223
|
+
process.exitCode = 1;
|
|
224
|
+
return;
|
|
225
|
+
}
|
|
226
|
+
process.stdout.write(JSON.stringify({
|
|
227
|
+
upserted: result.upserted,
|
|
228
|
+
skipped: result.skipped,
|
|
229
|
+
empty: result.empty,
|
|
230
|
+
pruned: result.pruned,
|
|
231
|
+
}));
|
|
232
|
+
}
|
|
233
|
+
catch (error) {
|
|
234
|
+
console.error(`Error: ${formatCliError(error)}`);
|
|
235
|
+
process.exitCode = 1;
|
|
236
|
+
}
|
|
237
|
+
finally {
|
|
238
|
+
if (embedder !== undefined) {
|
|
239
|
+
await embedder.dispose();
|
|
240
|
+
}
|
|
241
|
+
await vectorStore.close();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
//# sourceMappingURL=sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sync.js","sourceRoot":"","sources":["../../src/cli/sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { GlobalOptions } from './cli/options.js';
|
|
2
|
+
export declare const SUBCOMMANDS: readonly ['skills', 'ingest', 'list', 'query', 'status', 'delete', 'read-neighbors', 'sync'];
|
|
3
|
+
export type Subcommand = (typeof SUBCOMMANDS)[number];
|
|
4
|
+
/**
|
|
5
|
+
* Handle CLI subcommands. The caller is expected to have already validated
|
|
6
|
+
* `subcommand` against `SUBCOMMANDS`; the union type makes the switch exhaustive.
|
|
7
|
+
* @param subcommand - The validated subcommand name
|
|
8
|
+
* @param args - Arguments following the subcommand (subcommand itself excluded)
|
|
9
|
+
* @param globalOptions - Global options parsed before the subcommand
|
|
10
|
+
*/
|
|
11
|
+
export declare function handleCli(subcommand: Subcommand, args: string[], globalOptions?: GlobalOptions): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=cli-main.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli-main.d.ts","sourceRoot":"","sources":["../src/cli-main.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAA;AAMrD,eAAO,MAAM,WAAW,YACtB,QAAQ,EACR,QAAQ,EACR,MAAM,EACN,OAAO,EACP,QAAQ,EACR,QAAQ,EACR,gBAAgB,EAChB,MAAM,CACE,CAAA;AAEV,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,CAAC,CAAA;AAErD;;;;;;GAMG;AACH,wBAAsB,SAAS,CAC7B,UAAU,EAAE,UAAU,EACtB,IAAI,EAAE,MAAM,EAAE,EACd,aAAa,GAAE,aAAkB,GAChC,OAAO,CAAC,IAAI,CAAC,CA2Cf"}
|