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,100 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Validate that a path is not a sensitive system directory.
|
|
3
|
+
* Delegates to the shared `checkSensitivePath` helper so the CLI and the
|
|
4
|
+
* MCP server entry point share one policy implementation.
|
|
5
|
+
*
|
|
6
|
+
* Returns an error message if invalid, or undefined if valid.
|
|
7
|
+
*/
|
|
8
|
+
export declare function validatePath(value: string, flagName: string): string | undefined;
|
|
9
|
+
/**
|
|
10
|
+
* Validate model name against allowed pattern.
|
|
11
|
+
* Returns an error message if invalid, or undefined if valid.
|
|
12
|
+
*/
|
|
13
|
+
export declare function validateModelName(value: string): string | undefined;
|
|
14
|
+
/**
|
|
15
|
+
* Validate max file size is within acceptable range.
|
|
16
|
+
* Returns an error message if invalid, or undefined if valid.
|
|
17
|
+
*/
|
|
18
|
+
export declare function validateMaxFileSize(value: number): string | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Validate chunk minimum length is within acceptable range.
|
|
21
|
+
* Returns an error message if invalid, or undefined if valid.
|
|
22
|
+
*/
|
|
23
|
+
export declare function validateChunkMinLength(value: number): string | undefined;
|
|
24
|
+
/**
|
|
25
|
+
* Consume the value that follows a `--base-dir` flag and append it to
|
|
26
|
+
* `collected`. Designed to be called from each subcommand's argv loop so
|
|
27
|
+
* `--base-dir <path>` can be provided one or more times, with the order
|
|
28
|
+
* preserved.
|
|
29
|
+
*
|
|
30
|
+
* `argv` is the full argv slice the loop is iterating; `flagIndex` is the
|
|
31
|
+
* index of the `--base-dir` token itself. On success returns the index of
|
|
32
|
+
* the value (so the caller can advance past it). On failure prints
|
|
33
|
+
* `Missing value for --base-dir` to stderr and calls `process.exit(1)` —
|
|
34
|
+
* matching the existing single-value error path so callers don't have to
|
|
35
|
+
* special-case the new shape.
|
|
36
|
+
*
|
|
37
|
+
* Why a shared helper: `ingest`, `list`, and `sync` parse `--base-dir` in
|
|
38
|
+
* identical fashion, so centralizing the accumulate-and-validate step keeps
|
|
39
|
+
* their argv loops in lockstep when the contract evolves.
|
|
40
|
+
*/
|
|
41
|
+
export declare function consumeBaseDirArg(argv: string[], flagIndex: number, collected: string[]): number;
|
|
42
|
+
/**
|
|
43
|
+
* Read the required value that follows a value-taking flag at `argv[flagIndex]`.
|
|
44
|
+
* Centralizes the identical "missing value" guard every value flag used to
|
|
45
|
+
* inline (`--db-path`, `--cache-dir`, `--model-name`, `--max-file-size`,
|
|
46
|
+
* `--chunk-min-length`, `--limit`): when the next token is absent or is itself
|
|
47
|
+
* a flag, prints `Missing value for <flag>` and exits 1. The caller advances
|
|
48
|
+
* its index by 2 (flag + value). Numeric flags apply their own format/range
|
|
49
|
+
* validation to the returned string.
|
|
50
|
+
*/
|
|
51
|
+
export declare function requireFlagValue(argv: string[], flagIndex: number, flag: string): string;
|
|
52
|
+
export interface GlobalOptions {
|
|
53
|
+
dbPath?: string | undefined;
|
|
54
|
+
cacheDir?: string | undefined;
|
|
55
|
+
modelName?: string | undefined;
|
|
56
|
+
}
|
|
57
|
+
export interface ParsedGlobalResult {
|
|
58
|
+
globalOptions: GlobalOptions;
|
|
59
|
+
remainingArgs: string[];
|
|
60
|
+
}
|
|
61
|
+
export interface ResolvedGlobalConfig {
|
|
62
|
+
dbPath: string;
|
|
63
|
+
cacheDir: string;
|
|
64
|
+
modelName: string;
|
|
65
|
+
}
|
|
66
|
+
export declare const GLOBAL_DEFAULTS: {
|
|
67
|
+
readonly dbPath: './lancedb/';
|
|
68
|
+
readonly cacheDir: './models/';
|
|
69
|
+
readonly modelName: 'Xenova/all-MiniLM-L6-v2';
|
|
70
|
+
};
|
|
71
|
+
export declare const ROOT_HELP_TEXT: string;
|
|
72
|
+
/**
|
|
73
|
+
* Extract global options (--db-path, --cache-dir, --model-name, -h/--help)
|
|
74
|
+
* from the argument list and return them along with the remaining args.
|
|
75
|
+
*
|
|
76
|
+
* Global options are only recognized BEFORE the first non-flag argument
|
|
77
|
+
* (the subcommand). After the subcommand, everything is forwarded as-is.
|
|
78
|
+
*/
|
|
79
|
+
export declare function parseGlobalOptions(args: string[]): ParsedGlobalResult;
|
|
80
|
+
/**
|
|
81
|
+
* Resolve global config with priority: CLI flags > environment variables > defaults.
|
|
82
|
+
* Validates all resolved values before returning.
|
|
83
|
+
*/
|
|
84
|
+
export declare function resolveGlobalConfig(options: GlobalOptions): ResolvedGlobalConfig;
|
|
85
|
+
/**
|
|
86
|
+
* Resolve RAG_DEVICE. The value is passed through to transformers.js — no
|
|
87
|
+
* allowlist is maintained here. Whitespace-only is treated as unset.
|
|
88
|
+
*/
|
|
89
|
+
export declare function resolveDevice(value: string | undefined): string;
|
|
90
|
+
/**
|
|
91
|
+
* Resolve RAG_DTYPE. Like resolveDevice, the value is passed through to
|
|
92
|
+
* transformers.js with no allowlist. Unlike resolveDevice, unset/whitespace-only
|
|
93
|
+
* resolves to `undefined` (NOT a default dtype): the fp32 default literal lives
|
|
94
|
+
* solely in Embedder.initialize(), and `undefined` is the only signal that
|
|
95
|
+
* distinguishes "RAG_DTYPE unset" from an explicit "RAG_DTYPE=fp32". That
|
|
96
|
+
* distinction gates failure-path error enrichment, so it must not be collapsed
|
|
97
|
+
* into a default here.
|
|
98
|
+
*/
|
|
99
|
+
export declare function resolveDtype(value: string | undefined): string | undefined;
|
|
100
|
+
//# sourceMappingURL=options.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.d.ts","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"AASA;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEhF;AAED;;;GAGG;AACH,wBAAgB,iBAAiB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASnE;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKrE;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAKxE;AAMD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,EAAE,GAAG,MAAM,CAShG;AAED;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAOxF;AAMD,MAAM,WAAW,aAAa;IAC5B,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC3B,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;CAC/B;AAED,MAAM,WAAW,kBAAkB;IACjC,aAAa,EAAE,aAAa,CAAA;IAC5B,aAAa,EAAE,MAAM,EAAE,CAAA;CACxB;AAED,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,MAAM,CAAA;IACd,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,CAAA;CAClB;AAMD,eAAO,MAAM,eAAe;aAC1B,MAAM,EAAE,YAAY;aACpB,QAAQ,EAAE,WAAW;aACrB,SAAS,EAAE,yBAAyB;CAC5B,CAAA;AAMV,eAAO,MAAM,cAAc,QAgBiC,CAAA;AAM5D;;;;;;GAMG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,kBAAkB,CAsDrE;AAMD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,aAAa,GAAG,oBAAoB,CA0BhF;AAED;;;GAGG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAG/D;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAG1E"}
|
|
@@ -0,0 +1,241 @@
|
|
|
1
|
+
// Shared CLI global options — parsed before subcommand routing
|
|
2
|
+
import { MAX_CHUNK_MIN_LENGTH, MAX_FILE_SIZE_LIMIT } from '../utils/limits.js';
|
|
3
|
+
import { checkSensitivePath } from '../utils/sensitive-path.js';
|
|
4
|
+
// ============================================
|
|
5
|
+
// Validation Helpers
|
|
6
|
+
// ============================================
|
|
7
|
+
/**
|
|
8
|
+
* Validate that a path is not a sensitive system directory.
|
|
9
|
+
* Delegates to the shared `checkSensitivePath` helper so the CLI and the
|
|
10
|
+
* MCP server entry point share one policy implementation.
|
|
11
|
+
*
|
|
12
|
+
* Returns an error message if invalid, or undefined if valid.
|
|
13
|
+
*/
|
|
14
|
+
export function validatePath(value, flagName) {
|
|
15
|
+
return checkSensitivePath(value, flagName);
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Validate model name against allowed pattern.
|
|
19
|
+
* Returns an error message if invalid, or undefined if valid.
|
|
20
|
+
*/
|
|
21
|
+
export function validateModelName(value) {
|
|
22
|
+
const pattern = /^[a-zA-Z0-9_\-./]+$/;
|
|
23
|
+
if (!pattern.test(value)) {
|
|
24
|
+
return `Invalid model name: ${value}. Only alphanumeric, '_', '-', '.', '/' allowed.`;
|
|
25
|
+
}
|
|
26
|
+
if (value.includes('..')) {
|
|
27
|
+
return `Invalid model name: ${value}. Path traversal ('..') is not allowed.`;
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Validate max file size is within acceptable range.
|
|
33
|
+
* Returns an error message if invalid, or undefined if valid.
|
|
34
|
+
*/
|
|
35
|
+
export function validateMaxFileSize(value) {
|
|
36
|
+
if (!Number.isFinite(value) || value < 1 || value > MAX_FILE_SIZE_LIMIT) {
|
|
37
|
+
return `--max-file-size must be between 1 and ${MAX_FILE_SIZE_LIMIT} (500MB)`;
|
|
38
|
+
}
|
|
39
|
+
return undefined;
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Validate chunk minimum length is within acceptable range.
|
|
43
|
+
* Returns an error message if invalid, or undefined if valid.
|
|
44
|
+
*/
|
|
45
|
+
export function validateChunkMinLength(value) {
|
|
46
|
+
if (!Number.isFinite(value) || value < 1 || value > MAX_CHUNK_MIN_LENGTH) {
|
|
47
|
+
return `--chunk-min-length must be between 1 and ${MAX_CHUNK_MIN_LENGTH}`;
|
|
48
|
+
}
|
|
49
|
+
return undefined;
|
|
50
|
+
}
|
|
51
|
+
// ============================================
|
|
52
|
+
// Repeatable --base-dir parsing
|
|
53
|
+
// ============================================
|
|
54
|
+
/**
|
|
55
|
+
* Consume the value that follows a `--base-dir` flag and append it to
|
|
56
|
+
* `collected`. Designed to be called from each subcommand's argv loop so
|
|
57
|
+
* `--base-dir <path>` can be provided one or more times, with the order
|
|
58
|
+
* preserved.
|
|
59
|
+
*
|
|
60
|
+
* `argv` is the full argv slice the loop is iterating; `flagIndex` is the
|
|
61
|
+
* index of the `--base-dir` token itself. On success returns the index of
|
|
62
|
+
* the value (so the caller can advance past it). On failure prints
|
|
63
|
+
* `Missing value for --base-dir` to stderr and calls `process.exit(1)` —
|
|
64
|
+
* matching the existing single-value error path so callers don't have to
|
|
65
|
+
* special-case the new shape.
|
|
66
|
+
*
|
|
67
|
+
* Why a shared helper: `ingest`, `list`, and `sync` parse `--base-dir` in
|
|
68
|
+
* identical fashion, so centralizing the accumulate-and-validate step keeps
|
|
69
|
+
* their argv loops in lockstep when the contract evolves.
|
|
70
|
+
*/
|
|
71
|
+
export function consumeBaseDirArg(argv, flagIndex, collected) {
|
|
72
|
+
const valueIndex = flagIndex + 1;
|
|
73
|
+
const value = argv[valueIndex];
|
|
74
|
+
if (value === undefined || value.startsWith('-')) {
|
|
75
|
+
console.error('Missing value for --base-dir');
|
|
76
|
+
process.exit(1);
|
|
77
|
+
}
|
|
78
|
+
collected.push(value);
|
|
79
|
+
return valueIndex;
|
|
80
|
+
}
|
|
81
|
+
/**
|
|
82
|
+
* Read the required value that follows a value-taking flag at `argv[flagIndex]`.
|
|
83
|
+
* Centralizes the identical "missing value" guard every value flag used to
|
|
84
|
+
* inline (`--db-path`, `--cache-dir`, `--model-name`, `--max-file-size`,
|
|
85
|
+
* `--chunk-min-length`, `--limit`): when the next token is absent or is itself
|
|
86
|
+
* a flag, prints `Missing value for <flag>` and exits 1. The caller advances
|
|
87
|
+
* its index by 2 (flag + value). Numeric flags apply their own format/range
|
|
88
|
+
* validation to the returned string.
|
|
89
|
+
*/
|
|
90
|
+
export function requireFlagValue(argv, flagIndex, flag) {
|
|
91
|
+
const value = argv[flagIndex + 1];
|
|
92
|
+
if (value === undefined || value.startsWith('-')) {
|
|
93
|
+
console.error(`Missing value for ${flag}`);
|
|
94
|
+
process.exit(1);
|
|
95
|
+
}
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
// ============================================
|
|
99
|
+
// Defaults
|
|
100
|
+
// ============================================
|
|
101
|
+
export const GLOBAL_DEFAULTS = {
|
|
102
|
+
dbPath: './lancedb/',
|
|
103
|
+
cacheDir: './models/',
|
|
104
|
+
modelName: 'Xenova/all-MiniLM-L6-v2',
|
|
105
|
+
};
|
|
106
|
+
// ============================================
|
|
107
|
+
// Help
|
|
108
|
+
// ============================================
|
|
109
|
+
export const ROOT_HELP_TEXT = `Usage: mcp-local-rag [options] <command>
|
|
110
|
+
|
|
111
|
+
Options:
|
|
112
|
+
--db-path <path> LanceDB database path (default: ${GLOBAL_DEFAULTS.dbPath})
|
|
113
|
+
--cache-dir <path> Model cache directory (default: ${GLOBAL_DEFAULTS.cacheDir})
|
|
114
|
+
--model-name <name> Embedding model (default: ${GLOBAL_DEFAULTS.modelName})
|
|
115
|
+
-h, --help Show this help
|
|
116
|
+
|
|
117
|
+
Commands:
|
|
118
|
+
ingest <path> Ingest files into the vector database
|
|
119
|
+
sync [path] Incrementally synchronize indexed files with disk
|
|
120
|
+
query <text> Search ingested documents
|
|
121
|
+
read-neighbors Read N chunks before and after a target chunk within the same document
|
|
122
|
+
list List files and ingestion status
|
|
123
|
+
status Show database status
|
|
124
|
+
delete <path> Delete ingested content
|
|
125
|
+
skills install Install Claude Code / Codex skills`;
|
|
126
|
+
// ============================================
|
|
127
|
+
// Global Option Parsing
|
|
128
|
+
// ============================================
|
|
129
|
+
/**
|
|
130
|
+
* Extract global options (--db-path, --cache-dir, --model-name, -h/--help)
|
|
131
|
+
* from the argument list and return them along with the remaining args.
|
|
132
|
+
*
|
|
133
|
+
* Global options are only recognized BEFORE the first non-flag argument
|
|
134
|
+
* (the subcommand). After the subcommand, everything is forwarded as-is.
|
|
135
|
+
*/
|
|
136
|
+
export function parseGlobalOptions(args) {
|
|
137
|
+
const globalOptions = {};
|
|
138
|
+
let help = false;
|
|
139
|
+
let i = 0;
|
|
140
|
+
// Parse global flags until we hit a non-flag (subcommand) or end of args
|
|
141
|
+
while (i < args.length) {
|
|
142
|
+
const arg = args[i];
|
|
143
|
+
switch (arg) {
|
|
144
|
+
case '-h':
|
|
145
|
+
case '--help':
|
|
146
|
+
help = true;
|
|
147
|
+
i++;
|
|
148
|
+
break;
|
|
149
|
+
case '--db-path': {
|
|
150
|
+
globalOptions.dbPath = requireFlagValue(args, i, '--db-path');
|
|
151
|
+
i += 2;
|
|
152
|
+
break;
|
|
153
|
+
}
|
|
154
|
+
case '--cache-dir': {
|
|
155
|
+
globalOptions.cacheDir = requireFlagValue(args, i, '--cache-dir');
|
|
156
|
+
i += 2;
|
|
157
|
+
break;
|
|
158
|
+
}
|
|
159
|
+
case '--model-name': {
|
|
160
|
+
globalOptions.modelName = requireFlagValue(args, i, '--model-name');
|
|
161
|
+
i += 2;
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
164
|
+
default:
|
|
165
|
+
// If arg starts with -, it's an unknown global flag
|
|
166
|
+
if (arg.startsWith('-')) {
|
|
167
|
+
console.error(`Unknown global option: ${arg}`);
|
|
168
|
+
console.error('Run "mcp-local-rag --help" for available options.');
|
|
169
|
+
process.exit(1);
|
|
170
|
+
}
|
|
171
|
+
// First non-global-flag token: treat as subcommand boundary.
|
|
172
|
+
// Everything from here onward is returned as remainingArgs.
|
|
173
|
+
if (help) {
|
|
174
|
+
// If --help was seen before subcommand, show root help
|
|
175
|
+
console.error(ROOT_HELP_TEXT);
|
|
176
|
+
process.exit(0);
|
|
177
|
+
}
|
|
178
|
+
return { globalOptions, remainingArgs: args.slice(i) };
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
// All args consumed (no subcommand found)
|
|
182
|
+
if (help) {
|
|
183
|
+
console.error(ROOT_HELP_TEXT);
|
|
184
|
+
process.exit(0);
|
|
185
|
+
}
|
|
186
|
+
return { globalOptions, remainingArgs: [] };
|
|
187
|
+
}
|
|
188
|
+
// ============================================
|
|
189
|
+
// Config Resolution
|
|
190
|
+
// ============================================
|
|
191
|
+
/**
|
|
192
|
+
* Resolve global config with priority: CLI flags > environment variables > defaults.
|
|
193
|
+
* Validates all resolved values before returning.
|
|
194
|
+
*/
|
|
195
|
+
export function resolveGlobalConfig(options) {
|
|
196
|
+
const dbPath = options.dbPath ?? process.env['DB_PATH'] ?? GLOBAL_DEFAULTS.dbPath;
|
|
197
|
+
const cacheDir = options.cacheDir ?? process.env['CACHE_DIR'] ?? GLOBAL_DEFAULTS.cacheDir;
|
|
198
|
+
const modelName = options.modelName ?? process.env['MODEL_NAME'] ?? GLOBAL_DEFAULTS.modelName;
|
|
199
|
+
// Validate paths
|
|
200
|
+
const dbPathError = validatePath(dbPath, '--db-path');
|
|
201
|
+
if (dbPathError) {
|
|
202
|
+
console.error(dbPathError);
|
|
203
|
+
process.exit(1);
|
|
204
|
+
}
|
|
205
|
+
const cacheDirError = validatePath(cacheDir, '--cache-dir');
|
|
206
|
+
if (cacheDirError) {
|
|
207
|
+
console.error(cacheDirError);
|
|
208
|
+
process.exit(1);
|
|
209
|
+
}
|
|
210
|
+
// Validate model name
|
|
211
|
+
const modelNameError = validateModelName(modelName);
|
|
212
|
+
if (modelNameError) {
|
|
213
|
+
console.error(modelNameError);
|
|
214
|
+
process.exit(1);
|
|
215
|
+
}
|
|
216
|
+
return { dbPath, cacheDir, modelName };
|
|
217
|
+
}
|
|
218
|
+
/**
|
|
219
|
+
* Resolve RAG_DEVICE. The value is passed through to transformers.js — no
|
|
220
|
+
* allowlist is maintained here. Whitespace-only is treated as unset.
|
|
221
|
+
*/
|
|
222
|
+
export function resolveDevice(value) {
|
|
223
|
+
if (!value || value.trim() === '')
|
|
224
|
+
return 'cpu';
|
|
225
|
+
return value.trim();
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Resolve RAG_DTYPE. Like resolveDevice, the value is passed through to
|
|
229
|
+
* transformers.js with no allowlist. Unlike resolveDevice, unset/whitespace-only
|
|
230
|
+
* resolves to `undefined` (NOT a default dtype): the fp32 default literal lives
|
|
231
|
+
* solely in Embedder.initialize(), and `undefined` is the only signal that
|
|
232
|
+
* distinguishes "RAG_DTYPE unset" from an explicit "RAG_DTYPE=fp32". That
|
|
233
|
+
* distinction gates failure-path error enrichment, so it must not be collapsed
|
|
234
|
+
* into a default here.
|
|
235
|
+
*/
|
|
236
|
+
export function resolveDtype(value) {
|
|
237
|
+
if (!value || value.trim() === '')
|
|
238
|
+
return undefined;
|
|
239
|
+
return value.trim();
|
|
240
|
+
}
|
|
241
|
+
//# sourceMappingURL=options.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"options.js","sourceRoot":"","sources":["../../src/cli/options.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import type { GlobalOptions } from './options.js';
|
|
2
|
+
interface QueryCliOptions {
|
|
3
|
+
limit?: number | undefined;
|
|
4
|
+
scope?: string[] | undefined;
|
|
5
|
+
}
|
|
6
|
+
interface ParsedArgs {
|
|
7
|
+
queryText: string | undefined;
|
|
8
|
+
options: QueryCliOptions;
|
|
9
|
+
help: boolean;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Parse query-specific CLI arguments into options and a positional query text.
|
|
13
|
+
* Flags: --limit, --scope (repeatable), -h/--help
|
|
14
|
+
* Unknown flags (including global flags passed after subcommand) cause an error.
|
|
15
|
+
*/
|
|
16
|
+
export declare function parseArgs(args: string[]): ParsedArgs;
|
|
17
|
+
/**
|
|
18
|
+
* Run the query CLI subcommand.
|
|
19
|
+
* @param args - Arguments after "query" (e.g., option flags and query text)
|
|
20
|
+
* @param globalOptions - Global options parsed before the subcommand
|
|
21
|
+
*/
|
|
22
|
+
export declare function runQuery(args: string[], globalOptions?: GlobalOptions): Promise<void>;
|
|
23
|
+
export {};
|
|
24
|
+
//# sourceMappingURL=query.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/cli/query.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAOjD,UAAU,eAAe;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;IAC1B,KAAK,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;CAC7B;AAED,UAAU,UAAU;IAClB,SAAS,EAAE,MAAM,GAAG,SAAS,CAAA;IAC7B,OAAO,EAAE,eAAe,CAAA;IACxB,IAAI,EAAE,OAAO,CAAA;CACd;AA8CD;;;;GAIG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,UAAU,CAsDpD;AAuBD;;;;GAIG;AACH,wBAAsB,QAAQ,CAAC,IAAI,EAAE,MAAM,EAAE,EAAE,aAAa,GAAE,aAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA8F/F"}
|
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
// CLI query subcommand — search ingested documents
|
|
2
|
+
import { MAX_QUERY_LIMIT, MIN_QUERY_LIMIT } from '../utils/limits.js';
|
|
3
|
+
import { extractSourceFromPath, isManagedRawDataPath } from '../utils/raw-data-utils.js';
|
|
4
|
+
import { createEmbedder, createVectorStore, formatCliError } from './common.js';
|
|
5
|
+
import { requireFlagValue, resolveGlobalConfig } from './options.js';
|
|
6
|
+
// ============================================
|
|
7
|
+
// Defaults
|
|
8
|
+
// ============================================
|
|
9
|
+
const QUERY_DEFAULTS = {
|
|
10
|
+
limit: 10,
|
|
11
|
+
};
|
|
12
|
+
// ============================================
|
|
13
|
+
// Help
|
|
14
|
+
// ============================================
|
|
15
|
+
const HELP_TEXT = `Usage: mcp-local-rag [global-options] query [options] <query-text>
|
|
16
|
+
|
|
17
|
+
Search ingested documents using hybrid vector + keyword matching.
|
|
18
|
+
|
|
19
|
+
Options:
|
|
20
|
+
--limit <n> Max results (default: ${QUERY_DEFAULTS.limit}, range: ${MIN_QUERY_LIMIT}-${MAX_QUERY_LIMIT})
|
|
21
|
+
--scope <prefix> Restrict results to a path prefix (repeatable for multiple prefixes)
|
|
22
|
+
-h, --help Show this help
|
|
23
|
+
|
|
24
|
+
Global options (must appear before "query"):
|
|
25
|
+
--db-path <path> LanceDB database path
|
|
26
|
+
--cache-dir <path> Model cache directory
|
|
27
|
+
--model-name <name> Embedding model`;
|
|
28
|
+
// ============================================
|
|
29
|
+
// Arg Parsing
|
|
30
|
+
// ============================================
|
|
31
|
+
/**
|
|
32
|
+
* Parse query-specific CLI arguments into options and a positional query text.
|
|
33
|
+
* Flags: --limit, --scope (repeatable), -h/--help
|
|
34
|
+
* Unknown flags (including global flags passed after subcommand) cause an error.
|
|
35
|
+
*/
|
|
36
|
+
export function parseArgs(args) {
|
|
37
|
+
const options = {};
|
|
38
|
+
let queryText;
|
|
39
|
+
let help = false;
|
|
40
|
+
let i = 0;
|
|
41
|
+
while (i < args.length) {
|
|
42
|
+
const arg = args[i];
|
|
43
|
+
switch (arg) {
|
|
44
|
+
case '-h':
|
|
45
|
+
case '--help':
|
|
46
|
+
help = true;
|
|
47
|
+
i++;
|
|
48
|
+
break;
|
|
49
|
+
case '--limit': {
|
|
50
|
+
const value = requireFlagValue(args, i, '--limit');
|
|
51
|
+
if (!/^\d+$/.test(value)) {
|
|
52
|
+
console.error(`--limit must be between ${MIN_QUERY_LIMIT} and ${MAX_QUERY_LIMIT}`);
|
|
53
|
+
process.exit(1);
|
|
54
|
+
}
|
|
55
|
+
options.limit = Number.parseInt(value, 10);
|
|
56
|
+
i += 2;
|
|
57
|
+
break;
|
|
58
|
+
}
|
|
59
|
+
case '--scope': {
|
|
60
|
+
const value = requireFlagValue(args, i, '--scope').trim();
|
|
61
|
+
if (value.length === 0) {
|
|
62
|
+
console.error('--scope value must not be empty');
|
|
63
|
+
process.exit(1);
|
|
64
|
+
}
|
|
65
|
+
const scope = options.scope ?? [];
|
|
66
|
+
scope.push(value);
|
|
67
|
+
options.scope = scope;
|
|
68
|
+
i += 2;
|
|
69
|
+
break;
|
|
70
|
+
}
|
|
71
|
+
default:
|
|
72
|
+
if (arg.startsWith('-')) {
|
|
73
|
+
console.error(`Unknown option: ${arg}`);
|
|
74
|
+
console.error(HELP_TEXT);
|
|
75
|
+
process.exit(1);
|
|
76
|
+
}
|
|
77
|
+
if (queryText !== undefined) {
|
|
78
|
+
console.error(`Unexpected argument: ${arg}`);
|
|
79
|
+
console.error('Only one query text argument is accepted.');
|
|
80
|
+
process.exit(1);
|
|
81
|
+
}
|
|
82
|
+
queryText = arg;
|
|
83
|
+
i++;
|
|
84
|
+
break;
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return { queryText, options, help };
|
|
88
|
+
}
|
|
89
|
+
// ============================================
|
|
90
|
+
// Limit Validation
|
|
91
|
+
// ============================================
|
|
92
|
+
/**
|
|
93
|
+
* Validate and resolve the limit value.
|
|
94
|
+
* Returns the validated limit or exits with error.
|
|
95
|
+
*/
|
|
96
|
+
function resolveLimit(rawLimit) {
|
|
97
|
+
const limit = rawLimit ?? QUERY_DEFAULTS.limit;
|
|
98
|
+
if (!Number.isFinite(limit) || limit < MIN_QUERY_LIMIT || limit > MAX_QUERY_LIMIT) {
|
|
99
|
+
console.error(`--limit must be between ${MIN_QUERY_LIMIT} and ${MAX_QUERY_LIMIT}`);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
102
|
+
return limit;
|
|
103
|
+
}
|
|
104
|
+
// ============================================
|
|
105
|
+
// Main Entry Point
|
|
106
|
+
// ============================================
|
|
107
|
+
/**
|
|
108
|
+
* Run the query CLI subcommand.
|
|
109
|
+
* @param args - Arguments after "query" (e.g., option flags and query text)
|
|
110
|
+
* @param globalOptions - Global options parsed before the subcommand
|
|
111
|
+
*/
|
|
112
|
+
export async function runQuery(args, globalOptions = {}) {
|
|
113
|
+
// Parse CLI options
|
|
114
|
+
const { queryText, options, help } = parseArgs(args);
|
|
115
|
+
// Handle --help
|
|
116
|
+
if (help) {
|
|
117
|
+
console.error(HELP_TEXT);
|
|
118
|
+
process.exit(0);
|
|
119
|
+
}
|
|
120
|
+
// Validate positional argument
|
|
121
|
+
if (!queryText) {
|
|
122
|
+
console.error('Usage: mcp-local-rag query [options] <query-text>');
|
|
123
|
+
console.error(' Search ingested documents.');
|
|
124
|
+
console.error(' Run with --help for all options.');
|
|
125
|
+
process.exit(1);
|
|
126
|
+
}
|
|
127
|
+
// Validate limit
|
|
128
|
+
const limit = resolveLimit(options.limit);
|
|
129
|
+
// Resolve global config
|
|
130
|
+
const globalConfig = resolveGlobalConfig(globalOptions);
|
|
131
|
+
// Initialize components
|
|
132
|
+
const vectorStore = createVectorStore(globalConfig);
|
|
133
|
+
const embedder = createEmbedder(globalConfig);
|
|
134
|
+
await vectorStore.initialize();
|
|
135
|
+
try {
|
|
136
|
+
// Generate query embedding
|
|
137
|
+
const embeddings = await embedder.embedBatch([queryText]);
|
|
138
|
+
const queryVector = embeddings[0];
|
|
139
|
+
if (!queryVector) {
|
|
140
|
+
throw new Error('Failed to generate query embedding');
|
|
141
|
+
}
|
|
142
|
+
// Hybrid search (vector + BM25). Thread scope only when present so the
|
|
143
|
+
// scope-absent call shape stays identical to the pre-flag behavior.
|
|
144
|
+
const searchResults = await vectorStore.search(queryVector, {
|
|
145
|
+
queryText,
|
|
146
|
+
limit,
|
|
147
|
+
...(options.scope ? { scope: options.scope } : {}),
|
|
148
|
+
});
|
|
149
|
+
let attachmentsByIdentity = new Map();
|
|
150
|
+
try {
|
|
151
|
+
const hydration = await vectorStore.hydrateVisualAttachments(searchResults);
|
|
152
|
+
attachmentsByIdentity = new Map(hydration.rows.map((row) => [row.id, row.attachments]));
|
|
153
|
+
if (hydration.omittedCount > 0) {
|
|
154
|
+
console.error(`Warning: omitted ${hydration.omittedCount} unavailable or malformed image attachment(s) from query results`);
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
console.error('Warning: image attachments could not be loaded; returning text results only');
|
|
159
|
+
}
|
|
160
|
+
// Format results with source restoration for raw-data files
|
|
161
|
+
const results = searchResults.map((result) => {
|
|
162
|
+
const output = {
|
|
163
|
+
filePath: result.filePath,
|
|
164
|
+
chunkIndex: result.chunkIndex,
|
|
165
|
+
text: result.text,
|
|
166
|
+
score: result.score,
|
|
167
|
+
fileTitle: result.fileTitle ?? null,
|
|
168
|
+
images: attachmentsByIdentity.get(result.id) ?? [],
|
|
169
|
+
};
|
|
170
|
+
if (isManagedRawDataPath(result.filePath, globalConfig.dbPath)) {
|
|
171
|
+
const source = extractSourceFromPath(result.filePath);
|
|
172
|
+
if (source) {
|
|
173
|
+
output.source = source;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
return output;
|
|
177
|
+
});
|
|
178
|
+
// Output JSON to stdout
|
|
179
|
+
process.stdout.write(JSON.stringify(results, null, 2));
|
|
180
|
+
}
|
|
181
|
+
catch (error) {
|
|
182
|
+
const reason = formatCliError(error);
|
|
183
|
+
console.error(`Error: ${reason}`);
|
|
184
|
+
process.exit(1);
|
|
185
|
+
}
|
|
186
|
+
finally {
|
|
187
|
+
await embedder.dispose();
|
|
188
|
+
await vectorStore.close();
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
//# sourceMappingURL=query.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/cli/query.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { GlobalOptions } from './options.js';
|
|
2
|
+
/**
|
|
3
|
+
* Run the read-neighbors CLI subcommand.
|
|
4
|
+
* Reads chunks adjacent to a target chunkIndex within a single document.
|
|
5
|
+
* Does NOT perform any search; this is an index-adjacent retrieval utility.
|
|
6
|
+
*
|
|
7
|
+
* @param args - Arguments after "read-neighbors"
|
|
8
|
+
* @param globalOptions - Global options parsed before the subcommand
|
|
9
|
+
*/
|
|
10
|
+
export declare function runReadNeighbors(args: string[], globalOptions?: GlobalOptions): Promise<void>;
|
|
11
|
+
//# sourceMappingURL=read-neighbors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read-neighbors.d.ts","sourceRoot":"","sources":["../../src/cli/read-neighbors.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AAqIjD;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,IAAI,EAAE,MAAM,EAAE,EACd,aAAa,GAAE,aAAkB,GAChC,OAAO,CAAC,IAAI,CAAC,CAqGf"}
|