@fgbg/mdocs 1.3.19 → 1.3.21

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.
Files changed (63) hide show
  1. package/README.md +1 -1
  2. package/agent-skills/changelog/SKILL.md +17 -0
  3. package/agent-skills/index.json +1 -1
  4. package/agent-skills/usage-my-documents/SKILL.md +2 -5
  5. package/agent-skills/usage-search/SKILL.md +34 -12
  6. package/agent-skills/usage-settings/SKILL.md +2 -1
  7. package/dist/server/agent/Agent/tools-documents.js +57 -5
  8. package/dist/server/agent/Agent/tools-documents.js.map +1 -1
  9. package/dist/server/agent/Agent/tools-registry.test.js +2 -0
  10. package/dist/server/agent/Agent/tools-registry.test.js.map +1 -1
  11. package/dist/server/agent/Agent/tools-template.js +3 -1
  12. package/dist/server/agent/Agent/tools-template.js.map +1 -1
  13. package/dist/server/app.js +3 -0
  14. package/dist/server/app.js.map +1 -1
  15. package/dist/server/db/schema.js +11 -0
  16. package/dist/server/db/schema.js.map +1 -1
  17. package/dist/server/documents/document.service.js +9 -1
  18. package/dist/server/documents/document.service.js.map +1 -1
  19. package/dist/server/routes/documents.routes.js +43 -5
  20. package/dist/server/routes/documents.routes.js.map +1 -1
  21. package/dist/server/search/document-index-manager.js +66 -22
  22. package/dist/server/search/document-index-manager.js.map +1 -1
  23. package/dist/server/search/document-index-manager.test.js +24 -17
  24. package/dist/server/search/document-index-manager.test.js.map +1 -1
  25. package/dist/server/search/embedding-admin.js +158 -0
  26. package/dist/server/search/embedding-admin.js.map +1 -0
  27. package/dist/server/search/embedding-model.js +209 -0
  28. package/dist/server/search/embedding-model.js.map +1 -0
  29. package/dist/server/search/embedding-store.js +146 -0
  30. package/dist/server/search/embedding-store.js.map +1 -0
  31. package/dist/server/search/embedding-store.test.js +293 -0
  32. package/dist/server/search/embedding-store.test.js.map +1 -0
  33. package/dist/server/search/search.service.js +126 -48
  34. package/dist/server/search/search.service.js.map +1 -1
  35. package/dist/web/assets/{AgentChatPanel-DTj8Nz0Z.js → AgentChatPanel-BZlAgyrV.js} +3 -3
  36. package/dist/web/assets/{AgentSkillFormCard-DTgxybJh.js → AgentSkillFormCard-CzJG8FK4.js} +3 -3
  37. package/dist/web/assets/AiWriteWorkbench-DiSDDAee.js +7 -0
  38. package/dist/web/assets/{DiagramEditor-NtNY3sZL-B2Aeu79R.js → DiagramEditor-NtNY3sZL-DfkpQX3P.js} +1 -1
  39. package/dist/web/assets/{DocChrome-4qmjr6wa.js → DocChrome-QTGER_Af.js} +1 -1
  40. package/dist/web/assets/{DocumentEditor-KEURMFDp.js → DocumentEditor-DYSRZnJa.js} +1 -1
  41. package/dist/web/assets/{HtmlEditor-jCKtKOCT.js → HtmlEditor-oDPrhq3o.js} +1 -1
  42. package/dist/web/assets/{MergeView-eRcs-x1s.js → MergeView-CbFSN3Bi.js} +4 -4
  43. package/dist/web/assets/{PlaygroundPage-M7fqYn4Z.js → PlaygroundPage-DuMH_V-7.js} +1 -1
  44. package/dist/web/assets/SettingsPage-C_RMO-5M.js +1 -0
  45. package/dist/web/assets/{Toolbar-F3tR5o7R.js → Toolbar-D9FcRwg3.js} +1 -1
  46. package/dist/web/assets/{VisitorPickerModal-CPjKg8ox.js → VisitorPickerModal-CM13Y6jQ.js} +1 -1
  47. package/dist/web/assets/{check-CQSGOkW1.js → check-Bf8YbzH7.js} +1 -1
  48. package/dist/web/assets/{copy-BMAJ--_Y.js → copy-SBghRY2T.js} +1 -1
  49. package/dist/web/assets/{diagram-Bk84WZto.js → diagram-CgEd0hrk.js} +3 -3
  50. package/dist/web/assets/index-CIgmAX2Q.css +1 -0
  51. package/dist/web/assets/index-Cwy87sZC.js +293 -0
  52. package/dist/web/assets/{meta2dEngine-BD2XbzaV-BAZUiXoN.js → meta2dEngine-BD2XbzaV-ulfRZEvk.js} +1 -1
  53. package/dist/web/assets/{motion-DFABYlwt.js → motion-Dyy8pB0Q.js} +1 -1
  54. package/dist/web/assets/{plus-C3uXIATM.js → plus-CEapsZwl.js} +1 -1
  55. package/dist/web/assets/{react-BXGUMaBS.js → react-BkX5Koku.js} +3 -3
  56. package/dist/web/assets/ui-ZPt_BNBg.js +3165 -0
  57. package/dist/web/index.html +5 -5
  58. package/package.json +4 -2
  59. package/dist/web/assets/AiWriteWorkbench-D2RzXzty.js +0 -7
  60. package/dist/web/assets/SettingsPage-mS3g_vBq.js +0 -1
  61. package/dist/web/assets/index-C8iEyMxp.css +0 -1
  62. package/dist/web/assets/index-DUu4Is5p.js +0 -293
  63. package/dist/web/assets/ui-CvA4pq3d.js +0 -3116
@@ -62,6 +62,12 @@ vi.mock("../logger/logger.js", () => ({
62
62
  error: () => { },
63
63
  }),
64
64
  }));
65
+ /** 本文件测 FTS;语义路 no-op,避免拉 GGUF */
66
+ vi.mock("./embedding-store.js", () => ({
67
+ deleteEmbeddingChunks: () => { },
68
+ upsertDocumentEmbeddings: async () => { },
69
+ querySemanticNeighbors: async () => [],
70
+ }));
65
71
  function insertFtsDoc(opts) {
66
72
  const db = testDbRef.db;
67
73
  const now = new Date().toISOString();
@@ -97,6 +103,7 @@ describe("Search functionality", () => {
97
103
  db.exec("DELETE FROM documents_fts_rowid");
98
104
  db.exec("DELETE FROM documents_fts_title");
99
105
  db.exec("DELETE FROM documents_fts_title_rowid");
106
+ db.exec("DELETE FROM document_embedding_chunks");
100
107
  db.exec("DELETE FROM audit_logs");
101
108
  db.exec("DELETE FROM document_invites");
102
109
  contentByPath.clear();
@@ -111,7 +118,7 @@ describe("Search functionality", () => {
111
118
  parentId: null,
112
119
  });
113
120
  await rebuildAllDirty();
114
- const results = searchDocuments({
121
+ const results = await searchDocuments({
115
122
  query: "测试",
116
123
  visitorId: "test-actor",
117
124
  domainId: "default",
@@ -135,7 +142,7 @@ describe("Search functionality", () => {
135
142
  parentId: null,
136
143
  });
137
144
  await rebuildAllDirty();
138
- const results = searchDocuments({
145
+ const results = await searchDocuments({
139
146
  query: "不存在的术语",
140
147
  visitorId: "test-actor",
141
148
  domainId: "default",
@@ -143,7 +150,7 @@ describe("Search functionality", () => {
143
150
  });
144
151
  expect(results).toEqual([]);
145
152
  });
146
- it("title-only hit ranks and returns displayName snippet", () => {
153
+ it("title-only hit ranks and returns displayName snippet", async () => {
147
154
  insertFtsDoc({
148
155
  documentId: "title-only",
149
156
  domainId: "default",
@@ -154,7 +161,7 @@ describe("Search functionality", () => {
154
161
  title: "恢复码说明",
155
162
  body: "完全无关的正文内容",
156
163
  });
157
- const results = searchDocuments({
164
+ const results = await searchDocuments({
158
165
  query: "恢复码",
159
166
  visitorId: "anyone",
160
167
  domainId: "default",
@@ -163,7 +170,7 @@ describe("Search functionality", () => {
163
170
  expect(results[0].documentId).toBe("title-only");
164
171
  expect(results[0].snippet).toBe("恢复码说明");
165
172
  });
166
- it("body-only hit still works", () => {
173
+ it("body-only hit still works", async () => {
167
174
  insertFtsDoc({
168
175
  documentId: "body-only",
169
176
  domainId: "default",
@@ -174,14 +181,14 @@ describe("Search functionality", () => {
174
181
  title: "普通标题",
175
182
  body: "文中提到了向量检索算法",
176
183
  });
177
- const results = searchDocuments({
184
+ const results = await searchDocuments({
178
185
  query: "向量检索",
179
186
  visitorId: "anyone",
180
187
  domainId: "default",
181
188
  });
182
189
  expect(results.map((r) => r.documentId)).toEqual(["body-only"]);
183
190
  });
184
- it("title strong hit ranks above body weak hit", () => {
191
+ it("title strong hit ranks above body weak hit", async () => {
185
192
  insertFtsDoc({
186
193
  documentId: "by-title",
187
194
  domainId: "default",
@@ -202,7 +209,7 @@ describe("Search functionality", () => {
202
209
  title: "别的文档",
203
210
  body: "这里偶尔提到恢复码一次而已",
204
211
  });
205
- const results = searchDocuments({
212
+ const results = await searchDocuments({
206
213
  query: "恢复码",
207
214
  visitorId: "anyone",
208
215
  domainId: "default",
@@ -210,7 +217,7 @@ describe("Search functionality", () => {
210
217
  expect(results.map((r) => r.documentId)).toEqual(["by-title", "by-body"]);
211
218
  expect(results[0].bm25Score).toBeGreaterThan(results[1].bm25Score);
212
219
  });
213
- it("domainId filters both title and body paths", () => {
220
+ it("domainId filters both title and body paths", async () => {
214
221
  insertFtsDoc({
215
222
  documentId: "in-a",
216
223
  domainId: "default",
@@ -234,14 +241,14 @@ describe("Search functionality", () => {
234
241
  title: "共享词",
235
242
  body: "共享词正文",
236
243
  });
237
- const results = searchDocuments({
244
+ const results = await searchDocuments({
238
245
  query: "共享词",
239
246
  visitorId: "anyone",
240
247
  domainId: "default",
241
248
  });
242
249
  expect(results.map((r) => r.documentId)).toEqual(["in-a"]);
243
250
  });
244
- it("private docs are filtered by canReadDocument", () => {
251
+ it("private docs are filtered by canReadDocument", async () => {
245
252
  const now = new Date().toISOString();
246
253
  testDbRef.db.prepare(`INSERT INTO domains (domain_id, domain_name, creator_visitor_id, created_at, updated_at, permission)
247
254
  VALUES (?, ?, ?, ?, ?, ?)`).run("priv-domain", "Private", "owner-a", now, now, "private");
@@ -255,8 +262,8 @@ describe("Search functionality", () => {
255
262
  title: "机密恢复码",
256
263
  body: "机密正文",
257
264
  });
258
- expect(searchDocuments({ query: "恢复码", visitorId: "stranger", domainId: "priv-domain" })).toEqual([]);
259
- expect(searchDocuments({ query: "恢复码", visitorId: "owner-a", domainId: "priv-domain" }).map((r) => r.documentId)).toEqual(["secret"]);
265
+ expect(await searchDocuments({ query: "恢复码", visitorId: "stranger", domainId: "priv-domain" })).toEqual([]);
266
+ expect((await searchDocuments({ query: "恢复码", visitorId: "owner-a", domainId: "priv-domain" })).map((r) => r.documentId)).toEqual(["secret"]);
260
267
  });
261
268
  it("rename rebuild updates title index", async () => {
262
269
  contentByPath.set("rename.md", lexical("无关正文"));
@@ -269,11 +276,11 @@ describe("Search functionality", () => {
269
276
  parentId: null,
270
277
  });
271
278
  await rebuildAllDirty();
272
- expect(searchDocuments({ query: "旧标题词", visitorId: "test-actor", domainId: "default" })).toHaveLength(1);
279
+ expect(await searchDocuments({ query: "旧标题词", visitorId: "test-actor", domainId: "default" })).toHaveLength(1);
273
280
  testDbRef.db.prepare(`UPDATE documents SET display_name = ?, is_dirty = 1, updated_at = ? WHERE document_id = ?`).run("新标题词", new Date().toISOString(), created.documentId);
274
281
  rebuildDocument(created.documentId);
275
- expect(searchDocuments({ query: "旧标题词", visitorId: "test-actor", domainId: "default" })).toEqual([]);
276
- expect(searchDocuments({ query: "新标题词", visitorId: "test-actor", domainId: "default" }).map((r) => r.documentId)).toEqual([created.documentId]);
282
+ expect(await searchDocuments({ query: "旧标题词", visitorId: "test-actor", domainId: "default" })).toEqual([]);
283
+ expect((await searchDocuments({ query: "新标题词", visitorId: "test-actor", domainId: "default" })).map((r) => r.documentId)).toEqual([created.documentId]);
277
284
  });
278
285
  it("removeIndex clears both fts paths", async () => {
279
286
  contentByPath.set("gone.md", lexical("正文里有独有词xyzabc"));
@@ -290,7 +297,7 @@ describe("Search functionality", () => {
290
297
  await new Promise((resolve) => process.nextTick(resolve));
291
298
  removeIndex(created.documentId);
292
299
  testDbRef.db.prepare(`DELETE FROM documents WHERE document_id = ?`).run(created.documentId);
293
- expect(searchDocuments({ query: "xyzabc", visitorId: "test-actor", domainId: "default" })).toEqual([]);
300
+ expect(await searchDocuments({ query: "xyzabc", visitorId: "test-actor", domainId: "default" })).toEqual([]);
294
301
  });
295
302
  });
296
303
  //# sourceMappingURL=document-index-manager.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"document-index-manager.test.js","sourceRoot":"","sources":["../../../src/server/search/document-index-manager.test.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"document-index-manager.test.js","sourceRoot":"","sources":["../../../src/server/search/document-index-manager.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,158 @@
1
+ /**
2
+ * 语义索引管理:列表(含上次构建时间)+ 按文档勾选重建。
3
+ */
4
+ import { getDb } from "../db/connection.js";
5
+ import { findDomainById, isDomainMember, listDomains } from "../db/repositories/domain.repo.js";
6
+ import { canReadDocument } from "../access/access-control.js";
7
+ import { resolveDomainAccess } from "../access/domain-access.js";
8
+ import { readDocument } from "../storage/file-store.js";
9
+ import { listDomainIdsWithDocumentInviteForVisitor } from "../db/repositories/document.repo.js";
10
+ import { useLogger } from "../logger/logger.js";
11
+ import { isEmbeddingReady } from "./embedding-model.js";
12
+ import { upsertDocumentEmbeddings } from "./embedding-store.js";
13
+ import { extractLexicalPlainText } from "./document-index-manager.js";
14
+ const log = useLogger("embedding-admin");
15
+ const LIST_LIMIT = 500;
16
+ export function listEmbeddingIndex(params) {
17
+ const db = getDb();
18
+ const visitorId = params.visitorId;
19
+ const documentInviteDomainIds = visitorId ? new Set(listDomainIdsWithDocumentInviteForVisitor(db, visitorId)) : undefined;
20
+ const allDomains = listDomains(db);
21
+ const visibleDomains = allDomains.filter((r) => resolveDomainAccess(db, r, r.domain_id, visitorId, { documentInviteDomainIds }).kind !== "none");
22
+ const domainNameById = new Map(visibleDomains.map((d) => [d.domain_id, d.domain_name]));
23
+ let domainIds = visibleDomains.map((d) => d.domain_id);
24
+ if (params.domainId) {
25
+ if (!domainNameById.has(params.domainId)) {
26
+ return { modelReady: isEmbeddingReady(), items: [] };
27
+ }
28
+ domainIds = [params.domainId];
29
+ }
30
+ if (domainIds.length === 0) {
31
+ return { modelReady: isEmbeddingReady(), items: [] };
32
+ }
33
+ const placeholders = domainIds.map(() => "?").join(",");
34
+ const rows = db
35
+ .prepare(`SELECT d.document_id, d.display_name, d.relative_path, d.domain_id,
36
+ d.owner_visitor_id, d.permission, d.updated_at AS document_updated_at,
37
+ COUNT(c.chunk_index) AS chunk_count,
38
+ MAX(c.updated_at) AS embedding_updated_at
39
+ FROM documents d
40
+ LEFT JOIN document_embedding_chunks c ON c.document_id = d.document_id
41
+ WHERE d.file_type = 'md'
42
+ AND d.domain_id IN (${placeholders})
43
+ GROUP BY d.document_id
44
+ ORDER BY d.updated_at DESC
45
+ LIMIT ?`)
46
+ .all(...domainIds, LIST_LIMIT);
47
+ const domainCache = new Map();
48
+ const items = [];
49
+ for (const row of rows) {
50
+ let domainInfo = domainCache.get(row.domain_id);
51
+ if (!domainInfo) {
52
+ const domain = findDomainById(db, row.domain_id);
53
+ const domainPermission = domain?.permission ?? "public";
54
+ const isMember = !!(visitorId && domain && isDomainMember(db, row.domain_id, visitorId));
55
+ domainInfo = { domainPermission, isDomainMember: isMember };
56
+ domainCache.set(row.domain_id, domainInfo);
57
+ }
58
+ const docRow = {
59
+ document_id: row.document_id,
60
+ domain_id: row.domain_id,
61
+ relative_path: row.relative_path,
62
+ display_name: row.display_name,
63
+ owner_visitor_id: row.owner_visitor_id,
64
+ created_by: row.owner_visitor_id,
65
+ updated_by: row.owner_visitor_id,
66
+ content_hash: "",
67
+ head_commit_id: null,
68
+ created_at: "",
69
+ updated_at: row.document_updated_at,
70
+ permission: row.permission,
71
+ file_type: "md",
72
+ parent_id: null,
73
+ };
74
+ if (!canReadDocument(docRow, visitorId, domainInfo))
75
+ continue;
76
+ items.push({
77
+ documentId: row.document_id,
78
+ displayName: row.display_name,
79
+ relativePath: row.relative_path,
80
+ domainId: row.domain_id,
81
+ domainName: domainNameById.get(row.domain_id) ?? row.domain_id,
82
+ chunkCount: Number(row.chunk_count) || 0,
83
+ embeddingUpdatedAt: row.embedding_updated_at,
84
+ documentUpdatedAt: row.document_updated_at,
85
+ });
86
+ }
87
+ return { modelReady: isEmbeddingReady(), items };
88
+ }
89
+ /**
90
+ * 对勾选的文档尽力重建语义索引。无读权限的跳过。
91
+ */
92
+ export async function rebuildEmbeddingIndex(params) {
93
+ const modelReady = isEmbeddingReady();
94
+ const ok = [];
95
+ const skipped = [];
96
+ const failed = [];
97
+ if (!modelReady) {
98
+ for (const id of params.documentIds) {
99
+ failed.push({ documentId: id, reason: "embedding model not ready" });
100
+ }
101
+ return { modelReady, ok, skipped, failed };
102
+ }
103
+ const db = getDb();
104
+ const ids = Array.from(new Set(params.documentIds.filter(Boolean))).slice(0, 100);
105
+ for (const documentId of ids) {
106
+ try {
107
+ const row = db
108
+ .prepare(`SELECT document_id, domain_id, relative_path, display_name, owner_visitor_id, permission, updated_at, file_type
109
+ FROM documents WHERE document_id = ?`)
110
+ .get(documentId);
111
+ if (!row || row.file_type !== "md") {
112
+ skipped.push(documentId);
113
+ continue;
114
+ }
115
+ const domain = findDomainById(db, row.domain_id);
116
+ const domainPermission = domain?.permission ?? "public";
117
+ const isMember = !!(params.visitorId &&
118
+ domain &&
119
+ isDomainMember(db, row.domain_id, params.visitorId));
120
+ const domainInfo = { domainPermission, isDomainMember: isMember };
121
+ const docRow = {
122
+ document_id: row.document_id,
123
+ domain_id: row.domain_id,
124
+ relative_path: row.relative_path,
125
+ display_name: row.display_name,
126
+ owner_visitor_id: row.owner_visitor_id,
127
+ created_by: row.owner_visitor_id,
128
+ updated_by: row.owner_visitor_id,
129
+ content_hash: "",
130
+ head_commit_id: null,
131
+ created_at: "",
132
+ updated_at: row.updated_at,
133
+ permission: row.permission,
134
+ file_type: "md",
135
+ parent_id: null,
136
+ };
137
+ if (!canReadDocument(docRow, params.visitorId, domainInfo)) {
138
+ skipped.push(documentId);
139
+ continue;
140
+ }
141
+ const { content } = readDocument(row.domain_id, row.relative_path);
142
+ const plainText = extractLexicalPlainText(content);
143
+ await upsertDocumentEmbeddings({
144
+ documentId,
145
+ domainId: row.domain_id,
146
+ plainText,
147
+ });
148
+ ok.push(documentId);
149
+ }
150
+ catch (err) {
151
+ const reason = err instanceof Error ? err.message : String(err);
152
+ log.warn("rebuild embedding failed for %s: %s", documentId, reason);
153
+ failed.push({ documentId, reason });
154
+ }
155
+ }
156
+ return { modelReady, ok, skipped, failed };
157
+ }
158
+ //# sourceMappingURL=embedding-admin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-admin.js","sourceRoot":"","sources":["../../../src/server/search/embedding-admin.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,209 @@
1
+ /**
2
+ * 本地 nomic GGUF Embedding:异步确保模型文件、进程内单例 load、embed 文本。
3
+ * 任一步失败仅记日志;调用方应把 null / 抛错当作「跳过语义」。
4
+ */
5
+ import fs from "node:fs";
6
+ import fsp from "node:fs/promises";
7
+ import http from "node:http";
8
+ import https from "node:https";
9
+ import os from "node:os";
10
+ import path from "node:path";
11
+ import { useLogger } from "../logger/logger.js";
12
+ const log = useLogger("embedding-model");
13
+ /** 写死模型名与维数(契约) */
14
+ export const EMBEDDING_MODEL_FILENAME = "nomic-embed-text-v1.5.Q4_K_M.gguf";
15
+ export const EMBEDDING_DIM = 768;
16
+ /** HuggingFace 官方 resolve URL(契约:固定 URL,不绑可配置 CDN) */
17
+ const MODEL_DOWNLOAD_URL = "https://huggingface.co/nomic-ai/nomic-embed-text-v1.5-GGUF/resolve/main/nomic-embed-text-v1.5.Q4_K_M.gguf";
18
+ const DOC_PREFIX = "search_document: ";
19
+ const QUERY_PREFIX = "search_query: ";
20
+ let downloadLock = null;
21
+ let loadPromise = null;
22
+ let ready = false;
23
+ /** 已判定不可用(缺依赖 / load 失败),本进程内不再重试 load */
24
+ let disabled = false;
25
+ /** 模型目录:MDOCS_EMBEDDING_DIR 或 ~/.fgbg/shared/embedding */
26
+ export function getEmbeddingModelDir() {
27
+ const override = process.env.MDOCS_EMBEDDING_DIR?.trim();
28
+ if (override)
29
+ return path.resolve(override);
30
+ return path.join(os.homedir(), ".fgbg", "shared", "embedding");
31
+ }
32
+ export function getEmbeddingModelPath() {
33
+ return path.join(getEmbeddingModelDir(), EMBEDDING_MODEL_FILENAME);
34
+ }
35
+ export function isEmbeddingModelFilePresent() {
36
+ try {
37
+ const st = fs.statSync(getEmbeddingModelPath());
38
+ return st.isFile() && st.size > 0;
39
+ }
40
+ catch {
41
+ return false;
42
+ }
43
+ }
44
+ /** 进程内是否已成功 load 过模型 */
45
+ export function isEmbeddingReady() {
46
+ return ready && !disabled;
47
+ }
48
+ /**
49
+ * 启动旁挂:缺文件则后台下载,再尝试 load。绝不阻塞 listen。
50
+ * 就绪后补扫无向量块的文档。
51
+ */
52
+ export function ensureLocalEmbeddingModel() {
53
+ void (async () => {
54
+ try {
55
+ await ensureModelFileOnDisk();
56
+ const ctx = await getEmbeddingContext();
57
+ if (ctx) {
58
+ const { backfillMissingEmbeddings } = await import("./document-index-manager.js");
59
+ await backfillMissingEmbeddings();
60
+ }
61
+ }
62
+ catch (err) {
63
+ log.warn("embedding model ensure failed: %s", err instanceof Error ? err.message : String(err));
64
+ }
65
+ })();
66
+ }
67
+ async function ensureModelFileOnDisk() {
68
+ if (isEmbeddingModelFilePresent())
69
+ return;
70
+ if (downloadLock) {
71
+ await downloadLock;
72
+ return;
73
+ }
74
+ downloadLock = downloadModelFile().finally(() => {
75
+ downloadLock = null;
76
+ });
77
+ await downloadLock;
78
+ }
79
+ async function downloadModelFile() {
80
+ const dir = getEmbeddingModelDir();
81
+ await fsp.mkdir(dir, { recursive: true });
82
+ const dest = getEmbeddingModelPath();
83
+ const tmp = `${dest}.partial`;
84
+ log.info("embedding model missing; downloading %s → %s", MODEL_DOWNLOAD_URL, dest);
85
+ await new Promise((resolve, reject) => {
86
+ const file = fs.createWriteStream(tmp);
87
+ let settled = false;
88
+ const fail = (err) => {
89
+ if (settled)
90
+ return;
91
+ settled = true;
92
+ file.close(() => {
93
+ void fsp.unlink(tmp).catch(() => { });
94
+ });
95
+ reject(err);
96
+ };
97
+ const get = (url, redirectsLeft) => {
98
+ const lib = url.startsWith("https") ? https : http;
99
+ const req = lib.get(url, (res) => {
100
+ const code = res.statusCode ?? 0;
101
+ if (code >= 300 && code < 400 && res.headers.location && redirectsLeft > 0) {
102
+ res.resume();
103
+ get(res.headers.location, redirectsLeft - 1);
104
+ return;
105
+ }
106
+ if (code !== 200) {
107
+ fail(new Error(`download HTTP ${code}`));
108
+ res.resume();
109
+ return;
110
+ }
111
+ const total = Number(res.headers["content-length"] || 0);
112
+ let received = 0;
113
+ let lastPct = -1;
114
+ res.on("data", (chunk) => {
115
+ received += chunk.length;
116
+ if (total > 0) {
117
+ const pct = Math.floor((received / total) * 100);
118
+ if (pct >= lastPct + 5 || pct === 100) {
119
+ lastPct = pct;
120
+ log.info("embedding download progress %d%% (%d / %d bytes)", pct, received, total);
121
+ }
122
+ }
123
+ else if (received % (8 * 1024 * 1024) < chunk.length) {
124
+ log.info("embedding download progress %d bytes", received);
125
+ }
126
+ });
127
+ res.pipe(file);
128
+ file.on("finish", () => {
129
+ file.close(() => {
130
+ if (settled)
131
+ return;
132
+ settled = true;
133
+ resolve();
134
+ });
135
+ });
136
+ });
137
+ req.on("error", fail);
138
+ };
139
+ get(MODEL_DOWNLOAD_URL, 5);
140
+ });
141
+ await fsp.rename(tmp, dest);
142
+ log.info("embedding model downloaded: %s", dest);
143
+ }
144
+ async function getEmbeddingContext() {
145
+ if (disabled)
146
+ return null;
147
+ if (loadPromise)
148
+ return loadPromise;
149
+ loadPromise = (async () => {
150
+ if (!isEmbeddingModelFilePresent()) {
151
+ ready = false;
152
+ return null;
153
+ }
154
+ try {
155
+ const { getLlama } = await import("node-llama-cpp");
156
+ const llama = await getLlama();
157
+ const model = await llama.loadModel({ modelPath: getEmbeddingModelPath() });
158
+ const embeddingContext = await model.createEmbeddingContext();
159
+ ready = true;
160
+ log.info("embedding model loaded (%s, dim=%d)", EMBEDDING_MODEL_FILENAME, EMBEDDING_DIM);
161
+ return embeddingContext;
162
+ }
163
+ catch (err) {
164
+ disabled = true;
165
+ ready = false;
166
+ log.warn("embedding model load failed; semantic search disabled: %s", err instanceof Error ? err.message : String(err));
167
+ return null;
168
+ }
169
+ })();
170
+ return loadPromise;
171
+ }
172
+ /**
173
+ * 对文本做 embedding。kind 决定 nomic 任务前缀。
174
+ * 不可用时返回 null;不向外抛。
175
+ */
176
+ export async function embedText(text, kind) {
177
+ const trimmed = text.trim();
178
+ if (!trimmed)
179
+ return null;
180
+ try {
181
+ const ctx = await getEmbeddingContext();
182
+ if (!ctx)
183
+ return null;
184
+ const prefix = kind === "query" ? QUERY_PREFIX : DOC_PREFIX;
185
+ // 截断过长输入,避免撑爆 context
186
+ const input = prefix + trimmed.slice(0, 6000);
187
+ const emb = await ctx.getEmbeddingFor(input);
188
+ const vec = emb.vector;
189
+ if (!vec || vec.length === 0)
190
+ return null;
191
+ const out = Float32Array.from(vec);
192
+ if (out.length !== EMBEDDING_DIM) {
193
+ log.warn("unexpected embedding dim %d (expected %d)", out.length, EMBEDDING_DIM);
194
+ }
195
+ return out;
196
+ }
197
+ catch (err) {
198
+ log.warn("embedText failed: %s", err instanceof Error ? err.message : String(err));
199
+ return null;
200
+ }
201
+ }
202
+ /** 测试用:重置进程内状态 */
203
+ export function __resetEmbeddingModelStateForTests() {
204
+ downloadLock = null;
205
+ loadPromise = null;
206
+ ready = false;
207
+ disabled = false;
208
+ }
209
+ //# sourceMappingURL=embedding-model.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"embedding-model.js","sourceRoot":"","sources":["../../../src/server/search/embedding-model.ts"],"names":[],"mappings":"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"}