appium-mcp 1.73.0 → 1.74.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 +6 -0
- package/dist/scripts/generate-embeddings-cache.d.ts +13 -0
- package/dist/scripts/generate-embeddings-cache.d.ts.map +1 -0
- package/dist/scripts/generate-embeddings-cache.js +24 -0
- package/dist/scripts/generate-embeddings-cache.js.map +1 -0
- package/dist/tests/__mocks__/@appium/support.d.ts +32 -0
- package/dist/tests/__mocks__/@appium/support.d.ts.map +1 -1
- package/dist/tests/__mocks__/@appium/support.js +20 -0
- package/dist/tests/__mocks__/@appium/support.js.map +1 -1
- package/dist/tools/documentation/sentence-transformers-embeddings.d.ts +2 -0
- package/dist/tools/documentation/sentence-transformers-embeddings.d.ts.map +1 -1
- package/dist/tools/documentation/sentence-transformers-embeddings.js +4 -0
- package/dist/tools/documentation/sentence-transformers-embeddings.js.map +1 -1
- package/dist/tools/documentation/simple-pdf-indexer.d.ts.map +1 -1
- package/dist/tools/documentation/simple-pdf-indexer.js +183 -44
- package/dist/tools/documentation/simple-pdf-indexer.js.map +1 -1
- package/dist/tools/documentation/uploads/embeddings-Xenova-bge-small-en-v1.5.json +1 -0
- package/package.json +4 -2
- package/server.json +2 -2
- package/src/resources/submodules.zip +0 -0
- package/src/scripts/generate-embeddings-cache.ts +24 -0
- package/src/tools/documentation/sentence-transformers-embeddings.ts +5 -0
- package/src/tools/documentation/simple-pdf-indexer.ts +270 -55
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [1.74.0](https://github.com/appium/appium-mcp/compare/v1.73.0...v1.74.0) (2026-05-16)
|
|
2
|
+
|
|
3
|
+
### Features
|
|
4
|
+
|
|
5
|
+
* **embeddings:** cache vector embeddings and ship warm cache ([#335](https://github.com/appium/appium-mcp/issues/335)) ([52c8fd3](https://github.com/appium/appium-mcp/commit/52c8fd326a7e67f2769a10e00c9c5516bd86e0bf))
|
|
6
|
+
|
|
1
7
|
## [1.73.0](https://github.com/appium/appium-mcp/compare/v1.72.16...v1.73.0) (2026-05-14)
|
|
2
8
|
|
|
3
9
|
### Features
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate the embeddings cache for the currently configured model.
|
|
3
|
+
*
|
|
4
|
+
* Idempotent: if a valid cache already exists for the current model and the
|
|
5
|
+
* fingerprint matches documents.json, this exits quickly. Otherwise it
|
|
6
|
+
* embeds all chunks and writes the cache.
|
|
7
|
+
*
|
|
8
|
+
* Intended for the maintainer release flow:
|
|
9
|
+
* npm run build && npm run generate-cache
|
|
10
|
+
* to ensure the published tarball ships a warm cache for the default model.
|
|
11
|
+
*/
|
|
12
|
+
export {};
|
|
13
|
+
//# sourceMappingURL=generate-embeddings-cache.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-embeddings-cache.d.ts","sourceRoot":"","sources":["../../src/scripts/generate-embeddings-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Generate the embeddings cache for the currently configured model.
|
|
3
|
+
*
|
|
4
|
+
* Idempotent: if a valid cache already exists for the current model and the
|
|
5
|
+
* fingerprint matches documents.json, this exits quickly. Otherwise it
|
|
6
|
+
* embeds all chunks and writes the cache.
|
|
7
|
+
*
|
|
8
|
+
* Intended for the maintainer release flow:
|
|
9
|
+
* npm run build && npm run generate-cache
|
|
10
|
+
* to ensure the published tarball ships a warm cache for the default model.
|
|
11
|
+
*/
|
|
12
|
+
import { queryVectorStore } from '../tools/documentation/simple-pdf-indexer.js';
|
|
13
|
+
const start = Date.now();
|
|
14
|
+
try {
|
|
15
|
+
// A single query forces the cold-start path inside queryVectorStore, which
|
|
16
|
+
// checks the cache and embeds+saves on miss. We don't care about results.
|
|
17
|
+
await queryVectorStore('warmup', 1);
|
|
18
|
+
console.log(`Embeddings cache ready (${Date.now() - start}ms)`);
|
|
19
|
+
}
|
|
20
|
+
catch (err) {
|
|
21
|
+
console.error('Failed to generate embeddings cache:', err);
|
|
22
|
+
process.exit(1);
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=generate-embeddings-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"generate-embeddings-cache.js","sourceRoot":"","sources":["../../src/scripts/generate-embeddings-cache.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,8CAA8C,CAAC;AAEhF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;AACzB,IAAI,CAAC;IACH,2EAA2E;IAC3E,0EAA0E;IAC1E,MAAM,gBAAgB,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC;IACpC,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,KAAK,CAAC,CAAC;AAClE,CAAC;AAAC,OAAO,GAAG,EAAE,CAAC;IACb,OAAO,CAAC,KAAK,CAAC,sCAAsC,EAAE,GAAG,CAAC,CAAC;IAC3D,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -38,6 +38,24 @@ export declare const zip: {
|
|
|
38
38
|
readEntries: (_zipPath: string, _handler: unknown) => Promise<void>;
|
|
39
39
|
toArchive: (_dstPath: string, _src?: unknown, _opts?: unknown) => Promise<void>;
|
|
40
40
|
};
|
|
41
|
+
/**
|
|
42
|
+
* Minimal `fs` mock that delegates to node:fs/promises so test code touching
|
|
43
|
+
* the real filesystem continues to work.
|
|
44
|
+
*/
|
|
45
|
+
export declare const fs: {
|
|
46
|
+
exists: (p: string) => Promise<boolean>;
|
|
47
|
+
readdir: (p: string) => Promise<string[]>;
|
|
48
|
+
stat: (p: string) => Promise<import("node:fs").Stats>;
|
|
49
|
+
readFile: (p: string, encoding?: BufferEncoding) => Promise<string | NonSharedBuffer>;
|
|
50
|
+
writeFile: (p: string, data: string | Buffer) => Promise<void>;
|
|
51
|
+
unlink: (p: string) => Promise<void>;
|
|
52
|
+
rename: (from: string, to: string) => Promise<void>;
|
|
53
|
+
mkdir: (p: string, opts?: {
|
|
54
|
+
recursive?: boolean;
|
|
55
|
+
}) => Promise<string | undefined>;
|
|
56
|
+
mkdirp: (p: string) => Promise<string | undefined>;
|
|
57
|
+
mv: (from: string, to: string) => Promise<void>;
|
|
58
|
+
};
|
|
41
59
|
declare const _default: {
|
|
42
60
|
logger: {
|
|
43
61
|
getLogger: (_name: string) => {
|
|
@@ -62,6 +80,20 @@ declare const _default: {
|
|
|
62
80
|
readEntries: (_zipPath: string, _handler: unknown) => Promise<void>;
|
|
63
81
|
toArchive: (_dstPath: string, _src?: unknown, _opts?: unknown) => Promise<void>;
|
|
64
82
|
};
|
|
83
|
+
fs: {
|
|
84
|
+
exists: (p: string) => Promise<boolean>;
|
|
85
|
+
readdir: (p: string) => Promise<string[]>;
|
|
86
|
+
stat: (p: string) => Promise<import("node:fs").Stats>;
|
|
87
|
+
readFile: (p: string, encoding?: BufferEncoding) => Promise<string | NonSharedBuffer>;
|
|
88
|
+
writeFile: (p: string, data: string | Buffer) => Promise<void>;
|
|
89
|
+
unlink: (p: string) => Promise<void>;
|
|
90
|
+
rename: (from: string, to: string) => Promise<void>;
|
|
91
|
+
mkdir: (p: string, opts?: {
|
|
92
|
+
recursive?: boolean;
|
|
93
|
+
}) => Promise<string | undefined>;
|
|
94
|
+
mkdirp: (p: string) => Promise<string | undefined>;
|
|
95
|
+
mv: (from: string, to: string) => Promise<void>;
|
|
96
|
+
};
|
|
65
97
|
};
|
|
66
98
|
export default _default;
|
|
67
99
|
//# sourceMappingURL=support.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"support.d.ts","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,MAAM;uBACE,MAAM;0BAIH,MAAM,YAAY,GAAG,EAAE;yBAGxB,MAAM,YAAY,GAAG,EAAE;yBAGvB,MAAM,YAAY,GAAG,EAAE;0BAGtB,MAAM,YAAY,GAAG,EAAE;0BAGvB,MAAM,YAAY,GAAG,EAAE;;CAI9C,CAAC;AAEF;;;;;;GAMG;AAEH,MAAM,MAAM,iBAAiB,GAAG;IAC9B,WAAW,EAAE,KAAK,CAAC,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACrC,YAAY,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IACpC,MAAM,EAAE,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,KAAK,iBAAiB,CAAC;IACpD,IAAI,EAAE,CAAC,KAAK,CAAC,EAAE,OAAO,KAAK,iBAAiB,CAAC;IAC7C,QAAQ,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAChC,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB,CAAC;AAEF,6EAA6E;AAC7E,eAAO,MAAM,iBAAiB,EAAE,iBAkB/B,CAAC;AAEF,eAAO,MAAM,SAAS;yBACC,QAAQ,MAAM;CACpC,CAAC;AAEF,eAAO,MAAM,GAAG;+BAEA,MAAM,YACR,MAAM,UACR,OAAO;CAIlB,CAAC;AAEF,eAAO,MAAM,KAAK;iCACmB,MAAM;CAC1C,CAAC;AAEF,eAAO,MAAM,GAAG;6BACiB,MAAM,YAAY,MAAM,UAAU,OAAO;4BAG1C,MAAM,YAAY,OAAO;0BAG3B,MAAM,SAAS,OAAO,UAAU,OAAO;CAGpE,CAAC;AAEF;;;GAGG;AACH,eAAO,MAAM,EAAE;gBACK,MAAM;iBACX,MAAM;cACT,MAAM;kBACF,MAAM,aAAa,cAAc;mBAEhC,MAAM,QAAQ,MAAM,GAAG,MAAM;gBAEhC,MAAM;mBACH,MAAM,MAAM,MAAM;eACtB,MAAM,SAAS;QAAE,SAAS,CAAC,EAAE,OAAO,CAAA;KAAE;gBAErC,MAAM;eACD,MAAM,MAAM,MAAM;CAGpC,CAAC;;;2BA9GmB,MAAM;8BAIH,MAAM,YAAY,GAAG,EAAE;6BAGxB,MAAM,YAAY,GAAG,EAAE;6BAGvB,MAAM,YAAY,GAAG,EAAE;8BAGtB,MAAM,YAAY,GAAG,EAAE;8BAGvB,MAAM,YAAY,GAAG,EAAE;;;;6BA6CxB,QAAQ,MAAM;;;mCAKrB,MAAM,YACR,MAAM,UACR,OAAO;;;qCAOkB,MAAM;;;iCAIV,MAAM,YAAY,MAAM,UAAU,OAAO;gCAG1C,MAAM,YAAY,OAAO;8BAG3B,MAAM,SAAS,OAAO,UAAU,OAAO;;;oBAUjD,MAAM;qBACX,MAAM;kBACT,MAAM;sBACF,MAAM,aAAa,cAAc;uBAEhC,MAAM,QAAQ,MAAM,GAAG,MAAM;oBAEhC,MAAM;uBACH,MAAM,MAAM,MAAM;mBACtB,MAAM,SAAS;YAAE,SAAS,CAAC,EAAE,OAAO,CAAA;SAAE;oBAErC,MAAM;mBACD,MAAM,MAAM,MAAM;;;AAMrC,wBAOE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
// Mock @appium/support for Jest tests
|
|
2
2
|
// This avoids the ESM/CommonJS mismatch with uuid dependency
|
|
3
|
+
import { promises as fsPromises, existsSync } from 'node:fs';
|
|
3
4
|
export const logger = {
|
|
4
5
|
getLogger: (_name) =>
|
|
5
6
|
// Simple logger implementation for tests
|
|
@@ -63,6 +64,24 @@ export const zip = {
|
|
|
63
64
|
// Silent in tests by default
|
|
64
65
|
},
|
|
65
66
|
};
|
|
67
|
+
/**
|
|
68
|
+
* Minimal `fs` mock that delegates to node:fs/promises so test code touching
|
|
69
|
+
* the real filesystem continues to work.
|
|
70
|
+
*/
|
|
71
|
+
export const fs = {
|
|
72
|
+
exists: async (p) => existsSync(p),
|
|
73
|
+
readdir: (p) => fsPromises.readdir(p),
|
|
74
|
+
stat: (p) => fsPromises.stat(p),
|
|
75
|
+
readFile: (p, encoding) => fsPromises.readFile(p, encoding),
|
|
76
|
+
writeFile: (p, data) => fsPromises.writeFile(p, data),
|
|
77
|
+
unlink: (p) => fsPromises.unlink(p),
|
|
78
|
+
rename: (from, to) => fsPromises.rename(from, to),
|
|
79
|
+
mkdir: (p, opts) => fsPromises.mkdir(p, opts),
|
|
80
|
+
mkdirp: (p) => fsPromises.mkdir(p, { recursive: true }),
|
|
81
|
+
mv: async (from, to) => {
|
|
82
|
+
await fsPromises.rename(from, to);
|
|
83
|
+
},
|
|
84
|
+
};
|
|
66
85
|
// Export other commonly used utilities from @appium/support if needed
|
|
67
86
|
export default {
|
|
68
87
|
logger,
|
|
@@ -70,5 +89,6 @@ export default {
|
|
|
70
89
|
net,
|
|
71
90
|
plist,
|
|
72
91
|
zip,
|
|
92
|
+
fs,
|
|
73
93
|
};
|
|
74
94
|
//# sourceMappingURL=support.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"support.js","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,6DAA6D;AAE7D,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,SAAS,EAAE,CAAC,KAAa,EAAE,EAAE;IAC3B,yCAAyC;IACzC,kDAAkD;IAClD,CAAC;QACC,KAAK,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC3C,6BAA6B;QAC/B,CAAC;QACD,IAAI,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC1C,6BAA6B;QAC/B,CAAC;QACD,IAAI,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC1C,6BAA6B;QAC/B,CAAC;QACD,KAAK,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC3C,6BAA6B;QAC/B,CAAC;QACD,KAAK,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC3C,6BAA6B;QAC/B,CAAC;KACF,CAAC;CACL,CAAC;AAmBF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACzE,MAAM,CAAC,CAAS,EAAE,CAAS;QACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,KAAe;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,QAAQ;QACN,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IACD,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,GAAG,EAAE,CACvB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,MAAc,EAAE,EAAE,CAAC,iBAAiB;CAC1D,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,YAAY,EAAE,KAAK,EACjB,UAAkB,EAClB,QAAgB,EAChB,KAAe,EACf,EAAE;QACF,6BAA6B;IAC/B,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,cAAc,EAAE,KAAK,EAAE,UAAkB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,YAAY,EAAE,KAAK,EAAE,QAAgB,EAAE,QAAgB,EAAE,KAAe,EAAE,EAAE;QAC1E,6BAA6B;IAC/B,CAAC;IACD,WAAW,EAAE,KAAK,EAAE,QAAgB,EAAE,QAAiB,EAAE,EAAE;QACzD,6BAA6B;IAC/B,CAAC;IACD,SAAS,EAAE,KAAK,EAAE,QAAgB,EAAE,IAAc,EAAE,KAAe,EAAE,EAAE;QACrE,6BAA6B;IAC/B,CAAC;CACF,CAAC;AAEF,sEAAsE;AACtE,eAAe;IACb,MAAM;IACN,SAAS;IACT,GAAG;IACH,KAAK;IACL,GAAG;
|
|
1
|
+
{"version":3,"file":"support.js","sourceRoot":"","sources":["../../../../src/tests/__mocks__/@appium/support.ts"],"names":[],"mappings":"AAAA,sCAAsC;AACtC,6DAA6D;AAE7D,OAAO,EAAE,QAAQ,IAAI,UAAU,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE7D,MAAM,CAAC,MAAM,MAAM,GAAG;IACpB,SAAS,EAAE,CAAC,KAAa,EAAE,EAAE;IAC3B,yCAAyC;IACzC,kDAAkD;IAClD,CAAC;QACC,KAAK,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC3C,6BAA6B;QAC/B,CAAC;QACD,IAAI,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC1C,6BAA6B;QAC/B,CAAC;QACD,IAAI,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC1C,6BAA6B;QAC/B,CAAC;QACD,KAAK,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC3C,6BAA6B;QAC/B,CAAC;QACD,KAAK,EAAE,CAAC,QAAgB,EAAE,GAAG,KAAY,EAAE,EAAE;YAC3C,6BAA6B;QAC/B,CAAC;KACF,CAAC;CACL,CAAC;AAmBF,6EAA6E;AAC7E,MAAM,CAAC,MAAM,iBAAiB,GAAsB;IAClD,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACzE,MAAM,CAAC,CAAS,EAAE,CAAS;QACzB,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;QAC9B,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,KAAe;QAClB,OAAO,IAAI,CAAC;IACd,CAAC;IACD,QAAQ;QACN,OAAO,IAAI,CAAC,YAAY,EAAE,CAAC;IAC7B,CAAC;IACD,KAAK;QACH,IAAI,CAAC,WAAW,GAAG,EAAE,CAAC;QACtB,IAAI,CAAC,YAAY,GAAG,GAAG,EAAE,CACvB,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,CAAC;IAC1D,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,SAAS,GAAG;IACvB,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC,MAAc,EAAE,EAAE,CAAC,iBAAiB;CAC1D,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,YAAY,EAAE,KAAK,EACjB,UAAkB,EAClB,QAAgB,EAChB,KAAe,EACf,EAAE;QACF,6BAA6B;IAC/B,CAAC;CACF,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG;IACnB,cAAc,EAAE,KAAK,EAAE,UAAkB,EAAE,EAAE,CAAC,CAAC,EAAE,CAAC;CACnD,CAAC;AAEF,MAAM,CAAC,MAAM,GAAG,GAAG;IACjB,YAAY,EAAE,KAAK,EAAE,QAAgB,EAAE,QAAgB,EAAE,KAAe,EAAE,EAAE;QAC1E,6BAA6B;IAC/B,CAAC;IACD,WAAW,EAAE,KAAK,EAAE,QAAgB,EAAE,QAAiB,EAAE,EAAE;QACzD,6BAA6B;IAC/B,CAAC;IACD,SAAS,EAAE,KAAK,EAAE,QAAgB,EAAE,IAAc,EAAE,KAAe,EAAE,EAAE;QACrE,6BAA6B;IAC/B,CAAC;CACF,CAAC;AAEF;;;GAGG;AACH,MAAM,CAAC,MAAM,EAAE,GAAG;IAChB,MAAM,EAAE,KAAK,EAAE,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC;IAC1C,OAAO,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC;IAC7C,IAAI,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC;IACvC,QAAQ,EAAE,CAAC,CAAS,EAAE,QAAyB,EAAE,EAAE,CACjD,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,QAAQ,CAAC;IAClC,SAAS,EAAE,CAAC,CAAS,EAAE,IAAqB,EAAE,EAAE,CAC9C,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,CAAC;IAC/B,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC;IAC3C,MAAM,EAAE,CAAC,IAAY,EAAE,EAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC;IACjE,KAAK,EAAE,CAAC,CAAS,EAAE,IAA8B,EAAE,EAAE,CACnD,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;IAC3B,MAAM,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;IAC/D,EAAE,EAAE,KAAK,EAAE,IAAY,EAAE,EAAU,EAAE,EAAE;QACrC,MAAM,UAAU,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACpC,CAAC;CACF,CAAC;AAEF,sEAAsE;AACtE,eAAe;IACb,MAAM;IACN,SAAS;IACT,GAAG;IACH,KAAK;IACL,GAAG;IACH,EAAE;CACH,CAAC"}
|
|
@@ -17,6 +17,8 @@ export declare class SentenceTransformersEmbeddings {
|
|
|
17
17
|
modelName?: string;
|
|
18
18
|
queryInstruction?: string;
|
|
19
19
|
});
|
|
20
|
+
/** Name of the underlying model (used to namespace the embeddings cache file). */
|
|
21
|
+
getModelName(): string;
|
|
20
22
|
/**
|
|
21
23
|
* Generate embeddings for a single text (LangChain interface).
|
|
22
24
|
* Applies queryInstruction prefix when set.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentence-transformers-embeddings.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/sentence-transformers-embeddings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,qBAAa,8BAA8B;IACzC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,YAAY,CAAa;gBAErB,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAO;IAO3E;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA4BjD;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IA0C1D;;OAEG;YACW,sBAAsB;IAoBpC;;OAEG;YACW,eAAe;CAyB9B"}
|
|
1
|
+
{"version":3,"file":"sentence-transformers-embeddings.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/sentence-transformers-embeddings.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAIH;;GAEG;AACH,qBAAa,8BAA8B;IACzC,OAAO,CAAC,KAAK,CAAa;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,aAAa,CAAkB;IACvC,OAAO,CAAC,YAAY,CAAa;gBAErB,OAAO,GAAE;QAAE,SAAS,CAAC,EAAE,MAAM,CAAC;QAAC,gBAAgB,CAAC,EAAE,MAAM,CAAA;KAAO;IAO3E,kFAAkF;IAClF,YAAY,IAAI,MAAM;IAItB;;;OAGG;IACG,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC;IA4BjD;;OAEG;IACG,cAAc,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;IA0C1D;;OAEG;YACW,sBAAsB;IAoBpC;;OAEG;YACW,eAAe;CAyB9B"}
|
|
@@ -20,6 +20,10 @@ export class SentenceTransformersEmbeddings {
|
|
|
20
20
|
// BGE models use this to close the question/passage style gap.
|
|
21
21
|
this.queryInstruction = options.queryInstruction ?? '';
|
|
22
22
|
}
|
|
23
|
+
/** Name of the underlying model (used to namespace the embeddings cache file). */
|
|
24
|
+
getModelName() {
|
|
25
|
+
return this.modelName;
|
|
26
|
+
}
|
|
23
27
|
/**
|
|
24
28
|
* Generate embeddings for a single text (LangChain interface).
|
|
25
29
|
* Applies queryInstruction prefix when set.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sentence-transformers-embeddings.js","sourceRoot":"","sources":["../../../src/tools/documentation/sentence-transformers-embeddings.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"sentence-transformers-embeddings.js","sourceRoot":"","sources":["../../../src/tools/documentation/sentence-transformers-embeddings.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"simple-pdf-indexer.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/simple-pdf-indexer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;
|
|
1
|
+
{"version":3,"file":"simple-pdf-indexer.d.ts","sourceRoot":"","sources":["../../../src/tools/documentation/simple-pdf-indexer.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAGH,OAAO,EAAE,QAAQ,EAAE,MAAM,2BAA2B,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,wCAAwC,CAAC;AAwO3E;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,MAAa,EACxB,YAAY,GAAE,MAAY,GACzB,OAAO,CAAC,iBAAiB,CAAC,CAmD5B;AAED;;;;GAIG;AACH,wBAAsB,2BAA2B,CAC/C,OAAO,EAAE,MAAM,GACd,OAAO,CAAC,MAAM,EAAE,CAAC,CAwCnB;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CACjC,YAAY,EAAE,MAAM,EACpB,SAAS,GAAE,MAAa,EACxB,YAAY,GAAE,MAAY,GACzB,OAAO,CAAC,IAAI,CAAC,CAYf;AAED;;;;;;GAMG;AACH,wBAAsB,qBAAqB,CACzC,OAAO,EAAE,MAAM,EACf,SAAS,GAAE,MAAa,EACxB,YAAY,GAAE,MAAY,GACzB,OAAO,CAAC,MAAM,EAAE,CAAC,CAuGnB;AAED;;;;;GAKG;AACH,wBAAsB,gBAAgB,CACpC,KAAK,EAAE,MAAM,EACb,IAAI,GAAE,MAAW,GAChB,OAAO,CAAC,QAAQ,EAAE,CAAC,CA6CrB"}
|
|
@@ -8,9 +8,9 @@
|
|
|
8
8
|
import { RecursiveCharacterTextSplitter } from '@langchain/textsplitters';
|
|
9
9
|
import { Document } from '@langchain/core/documents';
|
|
10
10
|
import { MemoryVectorStore } from '@langchain/classic/vectorstores/memory';
|
|
11
|
-
import
|
|
11
|
+
import { fs } from '@appium/support';
|
|
12
|
+
import * as crypto from 'node:crypto';
|
|
12
13
|
import * as path from 'node:path';
|
|
13
|
-
import { promisify } from 'node:util';
|
|
14
14
|
import { fileURLToPath } from 'node:url';
|
|
15
15
|
// Initialize embeddings using sentence-transformers (no API key required)
|
|
16
16
|
import { SentenceTransformersEmbeddings } from './sentence-transformers-embeddings.js';
|
|
@@ -55,6 +55,121 @@ let memoryVectorStore = null;
|
|
|
55
55
|
* Exclude certain directories from being indexed to avoid irrelevant content and reduce noise in the vector store.
|
|
56
56
|
*/
|
|
57
57
|
const EXCLUDED_MARKDOWN_DIRECTORIES = new Set(['appium-skills']);
|
|
58
|
+
/**
|
|
59
|
+
* Embeddings cache: vectors persisted alongside documents.json so the
|
|
60
|
+
* server doesn't re-embed all chunks on every cold start.
|
|
61
|
+
*
|
|
62
|
+
* Invariants:
|
|
63
|
+
* - One cache file per model, so multiple models can coexist on disk.
|
|
64
|
+
* - Fingerprint embeds (modelName, chunkCount, contentHash of documents).
|
|
65
|
+
* Any drift in the corpus or model means the cache invalidates and gets
|
|
66
|
+
* re-embedded automatically.
|
|
67
|
+
*/
|
|
68
|
+
const CACHE_VERSION = 1;
|
|
69
|
+
function sanitizeForFilename(name) {
|
|
70
|
+
return name.replace(/[^a-zA-Z0-9._-]/g, '-');
|
|
71
|
+
}
|
|
72
|
+
function getEmbeddingsCachePath(modelName) {
|
|
73
|
+
return path.join(__dirname, 'uploads', `embeddings-${sanitizeForFilename(modelName)}.json`);
|
|
74
|
+
}
|
|
75
|
+
function computeContentHash(documents) {
|
|
76
|
+
const hash = crypto.createHash('sha256');
|
|
77
|
+
for (const doc of documents) {
|
|
78
|
+
hash.update(doc.pageContent);
|
|
79
|
+
hash.update('\x00'); // separator avoids concat collisions across chunks
|
|
80
|
+
}
|
|
81
|
+
return hash.digest('hex');
|
|
82
|
+
}
|
|
83
|
+
function makeFingerprint(documents, modelName) {
|
|
84
|
+
return {
|
|
85
|
+
modelName,
|
|
86
|
+
chunkCount: documents.length,
|
|
87
|
+
contentHash: computeContentHash(documents),
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function fingerprintsMatch(a, b) {
|
|
91
|
+
return (a.modelName === b.modelName &&
|
|
92
|
+
a.chunkCount === b.chunkCount &&
|
|
93
|
+
a.contentHash === b.contentHash);
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Try to load a valid embeddings cache for the given documents + model.
|
|
97
|
+
* Returns null if no cache file exists, the file is corrupt, or its
|
|
98
|
+
* fingerprint disagrees with what we'd compute now.
|
|
99
|
+
*/
|
|
100
|
+
async function loadEmbeddingsCache(documents, modelName) {
|
|
101
|
+
const cachePath = getEmbeddingsCachePath(modelName);
|
|
102
|
+
if (!(await fs.exists(cachePath))) {
|
|
103
|
+
log.info(`No embeddings cache found at ${cachePath}`);
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
try {
|
|
107
|
+
const raw = await fs.readFile(cachePath, 'utf-8');
|
|
108
|
+
const cache = JSON.parse(raw);
|
|
109
|
+
if (cache.version !== CACHE_VERSION) {
|
|
110
|
+
log.warn(`Embeddings cache version mismatch (got ${cache.version}, want ${CACHE_VERSION}). Invalidating.`);
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
const expected = makeFingerprint(documents, modelName);
|
|
114
|
+
if (!fingerprintsMatch(cache.fingerprint, expected)) {
|
|
115
|
+
log.info(`Embeddings cache fingerprint mismatch — will re-embed. ` +
|
|
116
|
+
`Cached: ${JSON.stringify(cache.fingerprint)}; expected: ${JSON.stringify(expected)}`);
|
|
117
|
+
return null;
|
|
118
|
+
}
|
|
119
|
+
if (!Array.isArray(cache.embeddings) ||
|
|
120
|
+
cache.embeddings.length !== documents.length) {
|
|
121
|
+
log.warn(`Embeddings cache length (${cache.embeddings?.length}) does not match documents length (${documents.length}). Invalidating.`);
|
|
122
|
+
return null;
|
|
123
|
+
}
|
|
124
|
+
log.info(`Embeddings cache hit: ${cache.embeddings.length} vectors loaded from ${cachePath}`);
|
|
125
|
+
return cache.embeddings;
|
|
126
|
+
}
|
|
127
|
+
catch (err) {
|
|
128
|
+
log.warn(`Failed to read embeddings cache (${err instanceof Error ? err.message : String(err)}). Will re-embed.`);
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Persist embedding vectors for the given documents under the given model name.
|
|
134
|
+
* Writes to a .tmp file then moves into place; the finally block sweeps the
|
|
135
|
+
* tmp file if anything between writeFile and mv throws. Uses fs.mv so the
|
|
136
|
+
* overwrite works across platforms (Windows rename-over-existing can be flaky
|
|
137
|
+
* in edge cases involving file locks).
|
|
138
|
+
*/
|
|
139
|
+
async function saveEmbeddingsCache(documents, vectors, modelName) {
|
|
140
|
+
if (vectors.length === 0) {
|
|
141
|
+
return;
|
|
142
|
+
}
|
|
143
|
+
if (vectors.length !== documents.length) {
|
|
144
|
+
log.warn(`Refusing to write embeddings cache: ${vectors.length} vectors vs ${documents.length} documents`);
|
|
145
|
+
return;
|
|
146
|
+
}
|
|
147
|
+
const cachePath = getEmbeddingsCachePath(modelName);
|
|
148
|
+
await fs.mkdirp(path.dirname(cachePath));
|
|
149
|
+
const cache = {
|
|
150
|
+
version: CACHE_VERSION,
|
|
151
|
+
fingerprint: makeFingerprint(documents, modelName),
|
|
152
|
+
embeddings: vectors,
|
|
153
|
+
};
|
|
154
|
+
const tmpPath = `${cachePath}.tmp`;
|
|
155
|
+
try {
|
|
156
|
+
await fs.writeFile(tmpPath, JSON.stringify(cache));
|
|
157
|
+
await fs.mv(tmpPath, cachePath, { clobber: true, mkdirp: true });
|
|
158
|
+
log.info(`Saved embeddings cache (${vectors.length} vectors) to ${cachePath}`);
|
|
159
|
+
}
|
|
160
|
+
finally {
|
|
161
|
+
if (await fs.exists(tmpPath)) {
|
|
162
|
+
try {
|
|
163
|
+
await fs.unlink(tmpPath);
|
|
164
|
+
}
|
|
165
|
+
catch (cleanupErr) {
|
|
166
|
+
log.warn(`Failed to clean up tmp cache file ${tmpPath}: ${cleanupErr instanceof Error
|
|
167
|
+
? cleanupErr.message
|
|
168
|
+
: String(cleanupErr)}`);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
}
|
|
172
|
+
}
|
|
58
173
|
/**
|
|
59
174
|
* Initialize the vector store with Markdown content
|
|
60
175
|
* @param markdownPath Path to the Markdown file
|
|
@@ -79,13 +194,19 @@ export async function initializeVectorStore(markdownPath, chunkSize = 1000, chun
|
|
|
79
194
|
log.info('Splitting text into chunks...');
|
|
80
195
|
const documents = await textSplitter.createDocuments([markdownText]);
|
|
81
196
|
log.info(`Created ${documents.length} document chunks`);
|
|
82
|
-
//
|
|
197
|
+
// Embed once; reuse the vectors for both the in-memory store and the cache.
|
|
198
|
+
log.info('Embedding chunks...');
|
|
199
|
+
const embeddingsProvider = getEmbeddings();
|
|
200
|
+
const vectors = await embeddingsProvider.embedDocuments(documents.map((d) => d.pageContent));
|
|
83
201
|
log.info('Storing documents in memory vector store...');
|
|
84
|
-
const vectorStore =
|
|
202
|
+
const vectorStore = new MemoryVectorStore(embeddingsProvider);
|
|
203
|
+
await vectorStore.addVectors(vectors, documents);
|
|
85
204
|
// Save the vector store in the global variable for later use
|
|
86
205
|
memoryVectorStore = vectorStore;
|
|
87
206
|
// Save documents to file for persistence
|
|
88
207
|
await saveDocuments(documents, false); // Don't append for single file indexing
|
|
208
|
+
// Persist the embeddings cache so the next cold start can skip embedding.
|
|
209
|
+
await saveEmbeddingsCache(documents, vectors, embeddingsProvider.getModelName());
|
|
89
210
|
log.info('Successfully stored documents in memory vector store');
|
|
90
211
|
return vectorStore;
|
|
91
212
|
}
|
|
@@ -101,19 +222,17 @@ export async function initializeVectorStore(markdownPath, chunkSize = 1000, chun
|
|
|
101
222
|
*/
|
|
102
223
|
export async function getMarkdownFilesInDirectory(dirPath) {
|
|
103
224
|
try {
|
|
104
|
-
const readdir = promisify(fs.readdir);
|
|
105
|
-
const stat = promisify(fs.stat);
|
|
106
225
|
// Check if directory exists
|
|
107
|
-
if (!fs.
|
|
226
|
+
if (!(await fs.exists(dirPath))) {
|
|
108
227
|
log.error(`Directory does not exist: ${dirPath}`);
|
|
109
228
|
return [];
|
|
110
229
|
}
|
|
111
230
|
const markdownFiles = [];
|
|
112
231
|
async function scanDirectory(currentPath) {
|
|
113
|
-
const files = await readdir(currentPath);
|
|
232
|
+
const files = await fs.readdir(currentPath);
|
|
114
233
|
for (const file of files) {
|
|
115
234
|
const filePath = path.join(currentPath, file);
|
|
116
|
-
const stats = await stat(filePath);
|
|
235
|
+
const stats = await fs.stat(filePath);
|
|
117
236
|
if (stats.isDirectory()) {
|
|
118
237
|
if (EXCLUDED_MARKDOWN_DIRECTORIES.has(file)) {
|
|
119
238
|
continue;
|
|
@@ -172,6 +291,14 @@ export async function indexAllMarkdownFiles(dirPath, chunkSize = 1000, chunkOver
|
|
|
172
291
|
}
|
|
173
292
|
// Clear the documents file before starting
|
|
174
293
|
await clearDocumentsFile();
|
|
294
|
+
// Accumulate vectors + documents across all files so we can write a single
|
|
295
|
+
// embeddings cache at the end, parallel-aligned with documents.json.
|
|
296
|
+
const embeddingsProvider = getEmbeddings();
|
|
297
|
+
const allVectors = [];
|
|
298
|
+
const allDocuments = [];
|
|
299
|
+
// Initialize the in-memory store up-front so a failure on the first file
|
|
300
|
+
// can't leave subsequent iterations with a null store.
|
|
301
|
+
memoryVectorStore = new MemoryVectorStore(embeddingsProvider);
|
|
175
302
|
// Index each Markdown file
|
|
176
303
|
const indexedFiles = [];
|
|
177
304
|
for (let i = 0; i < markdownFiles.length; i++) {
|
|
@@ -202,18 +329,16 @@ export async function indexAllMarkdownFiles(dirPath, chunkSize = 1000, chunkOver
|
|
|
202
329
|
relativePath,
|
|
203
330
|
};
|
|
204
331
|
});
|
|
205
|
-
//
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
}
|
|
211
|
-
else {
|
|
212
|
-
// For subsequent Markdown files, add to the existing vector store
|
|
213
|
-
await memoryVectorStore?.addDocuments(documents);
|
|
214
|
-
}
|
|
215
|
-
// Save documents to file (append for all Markdown files except the first one)
|
|
332
|
+
// Embed this file's chunks once; reuse the vectors for both the
|
|
333
|
+
// in-memory store and the on-disk cache.
|
|
334
|
+
log.info('Embedding chunks...');
|
|
335
|
+
const vectors = await embeddingsProvider.embedDocuments(documents.map((d) => d.pageContent));
|
|
336
|
+
// Persist documents.json first
|
|
216
337
|
await saveDocuments(documents, i > 0);
|
|
338
|
+
log.info('Storing documents in memory vector store...');
|
|
339
|
+
await memoryVectorStore.addVectors(vectors, documents);
|
|
340
|
+
allVectors.push(...vectors);
|
|
341
|
+
allDocuments.push(...documents);
|
|
217
342
|
indexedFiles.push(markdownFile);
|
|
218
343
|
log.info(`Successfully indexed Markdown: ${filename}`);
|
|
219
344
|
}
|
|
@@ -222,6 +347,9 @@ export async function indexAllMarkdownFiles(dirPath, chunkSize = 1000, chunkOver
|
|
|
222
347
|
// Continue with next file even if one fails
|
|
223
348
|
}
|
|
224
349
|
}
|
|
350
|
+
// Persist the embeddings cache once, after all files are indexed.
|
|
351
|
+
// The cache is keyed by model name and ordered to match documents.json.
|
|
352
|
+
await saveEmbeddingsCache(allDocuments, allVectors, embeddingsProvider.getModelName());
|
|
225
353
|
log.info(`Successfully indexed ${indexedFiles.length} out of ${markdownFiles.length} Markdown files`);
|
|
226
354
|
return indexedFiles;
|
|
227
355
|
}
|
|
@@ -238,22 +366,35 @@ export async function indexAllMarkdownFiles(dirPath, chunkSize = 1000, chunkOver
|
|
|
238
366
|
*/
|
|
239
367
|
export async function queryVectorStore(query, topK = 25) {
|
|
240
368
|
try {
|
|
241
|
-
// Check if the vector store has been initialized in memory
|
|
242
369
|
if (!memoryVectorStore) {
|
|
243
|
-
// Try to load documents from file
|
|
244
370
|
const documents = await loadDocuments();
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
371
|
+
if (!documents || documents.length === 0) {
|
|
372
|
+
throw new Error('Vector store has not been initialized. Please index docs first.');
|
|
373
|
+
}
|
|
374
|
+
const embeddingsProvider = getEmbeddings();
|
|
375
|
+
const modelName = embeddingsProvider.getModelName();
|
|
376
|
+
// Fast path: load pre-computed vectors and build the store via addVectors.
|
|
377
|
+
// Skips the ~30-60s document-embedding step entirely.
|
|
378
|
+
const cached = await loadEmbeddingsCache(documents, modelName);
|
|
379
|
+
if (cached) {
|
|
380
|
+
log.info('Building vector store from cached embeddings (fast path)');
|
|
381
|
+
memoryVectorStore = new MemoryVectorStore(embeddingsProvider);
|
|
382
|
+
await memoryVectorStore.addVectors(cached, documents);
|
|
249
383
|
}
|
|
250
384
|
else {
|
|
251
|
-
|
|
385
|
+
// Slow path: embed all documents now, then persist a cache so the
|
|
386
|
+
// next cold start is fast. Also covers model changes (different
|
|
387
|
+
// cache filename, no hit) and corpus changes (fingerprint mismatch).
|
|
388
|
+
log.info(`Embedding ${documents.length} documents for model ${modelName} (this may take a while)...`);
|
|
389
|
+
const start = Date.now();
|
|
390
|
+
const vectors = await embeddingsProvider.embedDocuments(documents.map((d) => d.pageContent));
|
|
391
|
+
log.info(`Embedding completed in ${Date.now() - start}ms`);
|
|
392
|
+
memoryVectorStore = new MemoryVectorStore(embeddingsProvider);
|
|
393
|
+
await memoryVectorStore.addVectors(vectors, documents);
|
|
394
|
+
await saveEmbeddingsCache(documents, vectors, modelName);
|
|
252
395
|
}
|
|
253
396
|
}
|
|
254
|
-
|
|
255
|
-
const results = await memoryVectorStore.similaritySearch(query, topK);
|
|
256
|
-
return results;
|
|
397
|
+
return await memoryVectorStore.similaritySearch(query, topK);
|
|
257
398
|
}
|
|
258
399
|
catch (error) {
|
|
259
400
|
log.error('Error querying vector store:', error);
|
|
@@ -268,10 +409,7 @@ export async function queryVectorStore(query, topK = 25) {
|
|
|
268
409
|
async function saveDocuments(documents, append = false) {
|
|
269
410
|
try {
|
|
270
411
|
// Create directory if it doesn't exist
|
|
271
|
-
|
|
272
|
-
if (!fs.existsSync(dir)) {
|
|
273
|
-
fs.mkdirSync(dir, { recursive: true });
|
|
274
|
-
}
|
|
412
|
+
await fs.mkdirp(path.dirname(DOCUMENTS_PATH));
|
|
275
413
|
// Serialize the new documents
|
|
276
414
|
const serializedNew = documents.map((doc) => ({
|
|
277
415
|
pageContent: doc.pageContent,
|
|
@@ -279,9 +417,9 @@ async function saveDocuments(documents, append = false) {
|
|
|
279
417
|
}));
|
|
280
418
|
let allSerialized = serializedNew;
|
|
281
419
|
// If appending and file exists, read existing documents and combine
|
|
282
|
-
if (append && fs.
|
|
420
|
+
if (append && (await fs.exists(DOCUMENTS_PATH))) {
|
|
283
421
|
try {
|
|
284
|
-
const existingContent = fs.
|
|
422
|
+
const existingContent = (await fs.readFile(DOCUMENTS_PATH, 'utf-8'));
|
|
285
423
|
if (existingContent) {
|
|
286
424
|
const existingSerialized = JSON.parse(existingContent);
|
|
287
425
|
allSerialized = [...existingSerialized, ...serializedNew];
|
|
@@ -293,7 +431,7 @@ async function saveDocuments(documents, append = false) {
|
|
|
293
431
|
}
|
|
294
432
|
}
|
|
295
433
|
// Write to file
|
|
296
|
-
fs.
|
|
434
|
+
await fs.writeFile(DOCUMENTS_PATH, JSON.stringify(allSerialized));
|
|
297
435
|
log.info(`${append ? 'Appended to' : 'Saved'} documents in ${DOCUMENTS_PATH} (total: ${allSerialized.length})`);
|
|
298
436
|
}
|
|
299
437
|
catch (error) {
|
|
@@ -306,8 +444,8 @@ async function saveDocuments(documents, append = false) {
|
|
|
306
444
|
*/
|
|
307
445
|
async function clearDocumentsFile() {
|
|
308
446
|
try {
|
|
309
|
-
if (fs.
|
|
310
|
-
fs.
|
|
447
|
+
if (await fs.exists(DOCUMENTS_PATH)) {
|
|
448
|
+
await fs.writeFile(DOCUMENTS_PATH, JSON.stringify([]));
|
|
311
449
|
log.info(`Cleared documents file at ${DOCUMENTS_PATH}`);
|
|
312
450
|
}
|
|
313
451
|
}
|
|
@@ -322,12 +460,13 @@ async function clearDocumentsFile() {
|
|
|
322
460
|
*/
|
|
323
461
|
async function loadDocuments() {
|
|
324
462
|
try {
|
|
325
|
-
if (!fs.
|
|
463
|
+
if (!(await fs.exists(DOCUMENTS_PATH))) {
|
|
326
464
|
log.info('No saved documents found');
|
|
327
465
|
return null;
|
|
328
466
|
}
|
|
329
467
|
// Read from file
|
|
330
|
-
const
|
|
468
|
+
const raw = (await fs.readFile(DOCUMENTS_PATH, 'utf-8'));
|
|
469
|
+
const serialized = JSON.parse(raw);
|
|
331
470
|
// Convert to Document objects
|
|
332
471
|
const documents = serialized.map((doc) => new Document({
|
|
333
472
|
pageContent: doc.pageContent,
|
|
@@ -348,8 +487,7 @@ async function loadDocuments() {
|
|
|
348
487
|
*/
|
|
349
488
|
async function extractTextFromMarkdown(markdownPath) {
|
|
350
489
|
try {
|
|
351
|
-
|
|
352
|
-
return text;
|
|
490
|
+
return (await fs.readFile(markdownPath, 'utf-8'));
|
|
353
491
|
}
|
|
354
492
|
catch (error) {
|
|
355
493
|
log.error('Error extracting text from Markdown:', error);
|
|
@@ -369,7 +507,8 @@ if (import.meta.url === `file://${process.argv[1]}`) {
|
|
|
369
507
|
// Use provided path
|
|
370
508
|
markdownPath = path.resolve(process.cwd(), args[0]);
|
|
371
509
|
// Check if the provided path is a file or directory
|
|
372
|
-
if (
|
|
510
|
+
if ((await fs.exists(markdownPath)) &&
|
|
511
|
+
(await fs.stat(markdownPath)).isFile()) {
|
|
373
512
|
indexSingleFile = true;
|
|
374
513
|
}
|
|
375
514
|
}
|