@alisio/plugin-semantic 0.0.0-stage → 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.
Files changed (114) hide show
  1. package/LICENSE +21 -0
  2. package/README.es.md +152 -0
  3. package/README.md +144 -2
  4. package/THIRD_PARTY_NOTICES.md +42 -0
  5. package/assets/architecture.svg +1 -0
  6. package/assets/ask-flow.svg +1 -0
  7. package/cover.svg +53 -0
  8. package/dist/apps.d.ts +26 -0
  9. package/dist/apps.d.ts.map +1 -0
  10. package/dist/apps.js +135 -0
  11. package/dist/apps.js.map +1 -0
  12. package/dist/embedded.html +2194 -0
  13. package/dist/engine/download.d.ts +77 -0
  14. package/dist/engine/download.d.ts.map +1 -0
  15. package/dist/engine/download.js +213 -0
  16. package/dist/engine/download.js.map +1 -0
  17. package/dist/engine/embedder.d.ts +55 -0
  18. package/dist/engine/embedder.d.ts.map +1 -0
  19. package/dist/engine/embedder.js +182 -0
  20. package/dist/engine/embedder.js.map +1 -0
  21. package/dist/engine/infer.d.ts +22 -0
  22. package/dist/engine/infer.d.ts.map +1 -0
  23. package/dist/engine/infer.js +53 -0
  24. package/dist/engine/infer.js.map +1 -0
  25. package/dist/engine/models.d.ts +45 -0
  26. package/dist/engine/models.d.ts.map +1 -0
  27. package/dist/engine/models.js +132 -0
  28. package/dist/engine/models.js.map +1 -0
  29. package/dist/engine/runtime.d.ts +46 -0
  30. package/dist/engine/runtime.d.ts.map +1 -0
  31. package/dist/engine/runtime.js +172 -0
  32. package/dist/engine/runtime.js.map +1 -0
  33. package/dist/engine/setup.d.ts +82 -0
  34. package/dist/engine/setup.d.ts.map +1 -0
  35. package/dist/engine/setup.js +183 -0
  36. package/dist/engine/setup.js.map +1 -0
  37. package/dist/engine/store.d.ts +46 -0
  38. package/dist/engine/store.d.ts.map +1 -0
  39. package/dist/engine/store.js +280 -0
  40. package/dist/engine/store.js.map +1 -0
  41. package/dist/engine/tar.d.ts +18 -0
  42. package/dist/engine/tar.d.ts.map +1 -0
  43. package/dist/engine/tar.js +198 -0
  44. package/dist/engine/tar.js.map +1 -0
  45. package/dist/engine/worker.d.ts +2 -0
  46. package/dist/engine/worker.d.ts.map +1 -0
  47. package/dist/engine/worker.js +64 -0
  48. package/dist/engine/worker.js.map +1 -0
  49. package/dist/errors.d.ts +15 -0
  50. package/dist/errors.d.ts.map +1 -0
  51. package/dist/errors.js +58 -0
  52. package/dist/errors.js.map +1 -0
  53. package/dist/index.d.ts +14 -0
  54. package/dist/index.d.ts.map +1 -0
  55. package/dist/index.js +258 -0
  56. package/dist/index.js.map +1 -0
  57. package/dist/messages.d.ts +53 -0
  58. package/dist/messages.d.ts.map +1 -0
  59. package/dist/messages.js +118 -0
  60. package/dist/messages.js.map +1 -0
  61. package/dist/notebook/answer.d.ts +33 -0
  62. package/dist/notebook/answer.d.ts.map +1 -0
  63. package/dist/notebook/answer.js +77 -0
  64. package/dist/notebook/answer.js.map +1 -0
  65. package/dist/notebook/chunk.d.ts +23 -0
  66. package/dist/notebook/chunk.d.ts.map +1 -0
  67. package/dist/notebook/chunk.js +124 -0
  68. package/dist/notebook/chunk.js.map +1 -0
  69. package/dist/notebook/db.d.ts +98 -0
  70. package/dist/notebook/db.d.ts.map +1 -0
  71. package/dist/notebook/db.js +328 -0
  72. package/dist/notebook/db.js.map +1 -0
  73. package/dist/notebook/docx.d.ts +3 -0
  74. package/dist/notebook/docx.d.ts.map +1 -0
  75. package/dist/notebook/docx.js +16 -0
  76. package/dist/notebook/docx.js.map +1 -0
  77. package/dist/notebook/extract.d.ts +11 -0
  78. package/dist/notebook/extract.d.ts.map +1 -0
  79. package/dist/notebook/extract.js +99 -0
  80. package/dist/notebook/extract.js.map +1 -0
  81. package/dist/notebook/jobs.d.ts +31 -0
  82. package/dist/notebook/jobs.d.ts.map +1 -0
  83. package/dist/notebook/jobs.js +84 -0
  84. package/dist/notebook/jobs.js.map +1 -0
  85. package/dist/notebook/ooxml.d.ts +6 -0
  86. package/dist/notebook/ooxml.d.ts.map +1 -0
  87. package/dist/notebook/ooxml.js +131 -0
  88. package/dist/notebook/ooxml.js.map +1 -0
  89. package/dist/notebook/retrieve.d.ts +14 -0
  90. package/dist/notebook/retrieve.d.ts.map +1 -0
  91. package/dist/notebook/retrieve.js +37 -0
  92. package/dist/notebook/retrieve.js.map +1 -0
  93. package/dist/notebook/service.d.ts +72 -0
  94. package/dist/notebook/service.d.ts.map +1 -0
  95. package/dist/notebook/service.js +620 -0
  96. package/dist/notebook/service.js.map +1 -0
  97. package/dist/notebook/workspace.d.ts +17 -0
  98. package/dist/notebook/workspace.d.ts.map +1 -0
  99. package/dist/notebook/workspace.js +75 -0
  100. package/dist/notebook/workspace.js.map +1 -0
  101. package/dist/notebook/zip.d.ts +33 -0
  102. package/dist/notebook/zip.d.ts.map +1 -0
  103. package/dist/notebook/zip.js +154 -0
  104. package/dist/notebook/zip.js.map +1 -0
  105. package/dist/paths.d.ts +17 -0
  106. package/dist/paths.d.ts.map +1 -0
  107. package/dist/paths.js +28 -0
  108. package/dist/paths.js.map +1 -0
  109. package/dist/version.d.ts +2 -0
  110. package/dist/version.d.ts.map +1 -0
  111. package/dist/version.js +3 -0
  112. package/dist/version.js.map +1 -0
  113. package/icon.svg +16 -0
  114. package/package.json +62 -3
@@ -0,0 +1,620 @@
1
+ import { createHash, randomBytes } from "node:crypto";
2
+ import { basename } from "node:path";
3
+ import { errorCode, SemanticPluginError } from "../errors.js";
4
+ import { buildPrompt, NOT_FOUND, parseCitations } from "./answer.js";
5
+ import { chunkSegments } from "./chunk.js";
6
+ import { extractBytes, extractPdfPages, formatOf } from "./extract.js";
7
+ import { JobRunner } from "./jobs.js";
8
+ import { ftsQuery, RETRIEVE_EACH, RETRIEVE_KEEP, reciprocalRankFusion } from "./retrieve.js";
9
+ import { listDirectory, MAX_FILE_BYTES, readInside, resolveInside } from "./workspace.js";
10
+ export const LIMITS = {
11
+ sourcesPerNotebook: 50,
12
+ charsPerSource: 2_000_000,
13
+ chunksPerNotebook: 20_000,
14
+ questionChars: 4000,
15
+ titleChars: 200,
16
+ fileBytes: MAX_FILE_BYTES,
17
+ historyMessages: 50,
18
+ indexBatch: 64,
19
+ };
20
+ const ID = /^[a-z2-7]{12}$/;
21
+ const READS = new Set([
22
+ "notebooks.list",
23
+ "notebooks.get",
24
+ "workspace.list",
25
+ "sources.read",
26
+ "sources.passage",
27
+ "chat.history",
28
+ "jobs.get",
29
+ ]);
30
+ const ALPHABET = "abcdefghijklmnopqrstuvwxyz234567";
31
+ /** 12 lowercase base32 characters (D16). */
32
+ export function newId() {
33
+ const bytes = randomBytes(12);
34
+ let id = "";
35
+ for (const byte of bytes)
36
+ id += ALPHABET[byte % 32];
37
+ return id;
38
+ }
39
+ export const collectionOf = (notebookId) => `nb-${notebookId}`;
40
+ const vectorId = (sourceId, ordinal) => `${sourceId}:${ordinal}`;
41
+ const invalid = () => {
42
+ throw new SemanticPluginError("invalid_input");
43
+ };
44
+ function text(input, key, max, optional = false) {
45
+ const value = input[key];
46
+ if (value === undefined && optional)
47
+ return "";
48
+ if (typeof value !== "string" || value.length > max)
49
+ return invalid();
50
+ return value;
51
+ }
52
+ function id(input, key) {
53
+ const value = input[key];
54
+ return typeof value === "string" && ID.test(value) ? value : invalid();
55
+ }
56
+ function ids(input, key) {
57
+ const value = input[key];
58
+ if (value === undefined)
59
+ return undefined;
60
+ if (!Array.isArray(value) || value.length > LIMITS.sourcesPerNotebook)
61
+ return invalid();
62
+ return value.map((v) => (typeof v === "string" && ID.test(v) ? v : invalid()));
63
+ }
64
+ const localeOf = (input) => (input.locale === "es" ? "es" : "en");
65
+ const GUIDE_INSTRUCTION = `Task: write a short overview of these sources for someone who has not read them (one paragraph, with [n] citations), then exactly three questions the sources can answer.
66
+ Format:
67
+ Summary: <overview>
68
+ Q: <question 1>
69
+ Q: <question 2>
70
+ Q: <question 3>`;
71
+ const SUMMARY_INSTRUCTION = "Task: summarize this source in one short paragraph of plain words, citing passages as [n].";
72
+ /** The Notebook app's actions, testable without a host (§7.7). */
73
+ export class NotebookService {
74
+ db;
75
+ deps;
76
+ jobs;
77
+ idempotent = new Map();
78
+ constructor(deps) {
79
+ this.deps = deps;
80
+ this.db = deps.db;
81
+ this.jobs = new JobRunner(deps.db);
82
+ }
83
+ busy() {
84
+ return this.jobs.busy();
85
+ }
86
+ dispose() {
87
+ this.jobs.dispose();
88
+ }
89
+ idle() {
90
+ return this.jobs.idle();
91
+ }
92
+ semantic() {
93
+ const semantic = this.deps.semantic();
94
+ try {
95
+ return semantic?.available() ? semantic : undefined;
96
+ }
97
+ catch {
98
+ return undefined;
99
+ }
100
+ }
101
+ async invoke(action, input, ctx) {
102
+ ctx.signal.throwIfAborted();
103
+ // Only mutations are deduplicated: a read must always see the current state.
104
+ const key = ctx.idempotencyKey && !READS.has(action) ? `${action}\0${ctx.idempotencyKey}` : undefined;
105
+ if (key && this.idempotent.has(key))
106
+ return this.idempotent.get(key);
107
+ const value = await this.dispatch(action, input ?? {}, ctx);
108
+ if (key) {
109
+ this.idempotent.set(key, value);
110
+ if (this.idempotent.size > 500)
111
+ this.idempotent.delete(this.idempotent.keys().next().value);
112
+ }
113
+ return value;
114
+ }
115
+ notebook(notebookId) {
116
+ const row = this.db.notebook(notebookId);
117
+ if (!row)
118
+ throw new SemanticPluginError("not_found");
119
+ return row;
120
+ }
121
+ source(sourceId) {
122
+ const row = this.db.source(sourceId);
123
+ if (!row)
124
+ throw new SemanticPluginError("not_found");
125
+ return row;
126
+ }
127
+ async dispatch(action, input, ctx) {
128
+ switch (action) {
129
+ case "notebooks.list":
130
+ return this.db.notebooks();
131
+ case "notebooks.get": {
132
+ const row = this.notebook(id(input, "id"));
133
+ return { ...row, sources: this.db.sources(row.id) };
134
+ }
135
+ case "notebooks.create": {
136
+ const title = text(input, "title", LIMITS.titleChars).trim() || "Untitled";
137
+ const notebookId = newId();
138
+ this.db.createNotebook(notebookId, title);
139
+ return { id: notebookId };
140
+ }
141
+ case "notebooks.rename": {
142
+ const row = this.notebook(id(input, "id"));
143
+ this.db.renameNotebook(row.id, text(input, "title", LIMITS.titleChars).trim() || row.title);
144
+ return { ok: true };
145
+ }
146
+ case "notebooks.delete": {
147
+ const row = this.notebook(id(input, "id"));
148
+ for (const job of this.db.activeJobs(row.id))
149
+ this.jobs.cancel(job.id);
150
+ await this.semantic()
151
+ ?.drop(collectionOf(row.id), { signal: ctx.signal })
152
+ .catch(() => { });
153
+ this.db.deleteNotebook(row.id);
154
+ return { ok: true };
155
+ }
156
+ case "notice.ack":
157
+ this.db.ackNotice(this.notebook(id(input, "notebookId")).id);
158
+ return { ok: true };
159
+ case "sources.upload":
160
+ return this.upload(input);
161
+ case "sources.addFromWorkspace":
162
+ return this.addFromWorkspace(input, ctx);
163
+ case "workspace.list":
164
+ return listDirectory(ctx.workspace, text(input, "dir", 1024, true));
165
+ case "sources.read": {
166
+ const path = text(input, "path", 1024);
167
+ await resolveInside(ctx.workspace, path);
168
+ if (formatOf(path) !== "pdf")
169
+ throw new SemanticPluginError("unsupported_format");
170
+ return { base64: (await readInside(ctx.workspace, path)).toString("base64") };
171
+ }
172
+ case "sources.delete": {
173
+ const source = this.source(id(input, "sourceId"));
174
+ await this.removeVectors(source).catch(() => { });
175
+ this.db.deleteSource(source.id);
176
+ return { ok: true };
177
+ }
178
+ case "sources.passage": {
179
+ const source = this.source(id(input, "sourceId"));
180
+ const ordinal = input.ordinal;
181
+ if (!Number.isInteger(ordinal) || ordinal < 0)
182
+ invalid();
183
+ const chunk = this.db.chunk(source.id, ordinal);
184
+ if (!chunk)
185
+ throw new SemanticPluginError("not_found");
186
+ return {
187
+ sourceId: source.id,
188
+ sourceName: source.name,
189
+ ordinal: chunk.ordinal,
190
+ text: chunk.text,
191
+ page: chunk.page,
192
+ ...this.pageLabel(source, chunk.page),
193
+ charStart: chunk.charStart,
194
+ charEnd: chunk.charEnd,
195
+ };
196
+ }
197
+ case "chat.ask":
198
+ return this.ask(input, ctx);
199
+ case "chat.history": {
200
+ const row = this.notebook(id(input, "notebookId"));
201
+ const before = input.before;
202
+ if (before !== undefined && !Number.isInteger(before))
203
+ invalid();
204
+ return this.db
205
+ .messages(row.id, LIMITS.historyMessages, before)
206
+ .map((m) => ({
207
+ id: m.id,
208
+ role: m.role,
209
+ text: m.text,
210
+ createdAt: m.createdAt,
211
+ citations: m.meta.citations ?? [],
212
+ grounded: m.meta.grounded ?? true,
213
+ keywordOnly: m.meta.keywordOnly ?? false,
214
+ notFound: m.meta.notFound ?? false,
215
+ }));
216
+ }
217
+ case "chat.clear":
218
+ this.db.clearMessages(this.notebook(id(input, "notebookId")).id);
219
+ return { ok: true };
220
+ case "notebook.guide":
221
+ return this.guide(input, ctx);
222
+ case "sources.summary":
223
+ return this.summary(input, ctx);
224
+ case "index.rebuild":
225
+ return this.rebuild(input);
226
+ case "jobs.get": {
227
+ const jobId = text(input, "jobId", 80);
228
+ const job = this.db.job(jobId);
229
+ if (!job)
230
+ throw new SemanticPluginError("not_found");
231
+ return {
232
+ id: job.id,
233
+ kind: job.kind,
234
+ state: job.state,
235
+ progress: job.progress,
236
+ error: job.error,
237
+ result: job.result,
238
+ };
239
+ }
240
+ case "jobs.cancel": {
241
+ const jobId = text(input, "jobId", 80);
242
+ if (!this.db.job(jobId))
243
+ throw new SemanticPluginError("not_found");
244
+ return { cancelled: this.jobs.cancel(jobId) };
245
+ }
246
+ default:
247
+ throw new SemanticPluginError("not_found");
248
+ }
249
+ }
250
+ /** How the frame labels `page`: a PDF page, a slide, or a sheet with its name (O10). */
251
+ pageLabel(source, page) {
252
+ if (page === null)
253
+ return { pageKind: null };
254
+ if (source.kind === "pptx")
255
+ return { pageKind: "slide" };
256
+ if (source.kind !== "xlsx")
257
+ return { pageKind: "page" };
258
+ // Each sheet's text starts with "Sheet: <name>", so its first chunk carries the name.
259
+ const first = this.db.chunks(source.id).find((c) => c.page === page);
260
+ return {
261
+ pageKind: "sheet",
262
+ pageName: /^Sheet: (.*)$/m.exec(first?.text ?? "")?.[1] ?? String(page),
263
+ };
264
+ }
265
+ // ---- Sources -------------------------------------------------------------------------------
266
+ checkSourceLimit(notebookId) {
267
+ if (this.db.sources(notebookId).length >= LIMITS.sourcesPerNotebook)
268
+ throw new SemanticPluginError("limit_exceeded");
269
+ }
270
+ upload(input) {
271
+ const notebook = this.notebook(id(input, "notebookId"));
272
+ const name = basename(text(input, "name", 255).replaceAll("\\", "/")).trim();
273
+ if (!name)
274
+ invalid();
275
+ let bytes;
276
+ let segments;
277
+ let kind;
278
+ let mime;
279
+ if (Array.isArray(input.pages)) {
280
+ const pages = input.pages;
281
+ if (pages.length > 5000 || !pages.every((p) => typeof p === "string"))
282
+ invalid();
283
+ if (formatOf(name) !== "pdf")
284
+ invalid();
285
+ const strings = pages;
286
+ bytes = Buffer.from(strings.join("\f"));
287
+ if (bytes.length > LIMITS.fileBytes * 2)
288
+ throw new SemanticPluginError("file_too_large");
289
+ kind = "pdf";
290
+ mime = "application/pdf";
291
+ segments = async () => extractPdfPages(strings);
292
+ }
293
+ else {
294
+ const raw = input.base64;
295
+ if (typeof raw === "string" && raw.length > Math.ceil(LIMITS.fileBytes / 3) * 4 + 4)
296
+ throw new SemanticPluginError("file_too_large");
297
+ const base64 = text(input, "base64", 36_000_000);
298
+ bytes = Buffer.from(base64, "base64");
299
+ if (bytes.length > LIMITS.fileBytes)
300
+ throw new SemanticPluginError("file_too_large");
301
+ const format = formatOf(name);
302
+ if (!format || format === "pdf")
303
+ throw new SemanticPluginError("unsupported_format");
304
+ kind = format;
305
+ mime = text(input, "mime", 120, true) || "application/octet-stream";
306
+ segments = () => extractBytes(name, bytes);
307
+ }
308
+ return this.addSource(notebook.id, name, kind, mime, bytes, segments);
309
+ }
310
+ async addFromWorkspace(input, ctx) {
311
+ const notebook = this.notebook(id(input, "notebookId"));
312
+ const path = text(input, "path", 1024);
313
+ const format = formatOf(path);
314
+ // Workspace PDFs go through the frame (sources.read + PDF.js + sources.upload with pages).
315
+ if (!format || format === "pdf") {
316
+ await resolveInside(ctx.workspace, path);
317
+ throw new SemanticPluginError("unsupported_format");
318
+ }
319
+ const bytes = await readInside(ctx.workspace, path);
320
+ const name = basename(path.replaceAll("\\", "/"));
321
+ return this.addSource(notebook.id, name, format, "application/octet-stream", bytes, () => extractBytes(name, bytes));
322
+ }
323
+ addSource(notebookId, name, kind, mime, bytes, segments) {
324
+ const sha256 = createHash("sha256").update(bytes).digest("hex");
325
+ const existing = this.db.sourceBySha(notebookId, sha256);
326
+ if (existing && existing.status !== "failed")
327
+ return { sourceId: existing.id, jobId: null, duplicate: true };
328
+ if (existing)
329
+ this.db.deleteSource(existing.id);
330
+ this.checkSourceLimit(notebookId);
331
+ const sourceId = newId();
332
+ this.db.insertSource({
333
+ id: sourceId,
334
+ notebookId,
335
+ name,
336
+ kind,
337
+ mime,
338
+ sha256,
339
+ bytes: bytes.length,
340
+ status: "indexing",
341
+ });
342
+ this.db.touchNotebook(notebookId);
343
+ const jobId = this.jobs.start(notebookId, "index", sourceId, async ({ signal, progress }) => {
344
+ const extracted = await segments();
345
+ const characters = extracted.reduce((sum, s) => sum + s.text.length, 0);
346
+ if (characters > LIMITS.charsPerSource)
347
+ throw new SemanticPluginError("limit_exceeded");
348
+ const { chunks } = chunkSegments(extracted);
349
+ if (chunks.length === 0)
350
+ throw new SemanticPluginError("no_text");
351
+ if (this.db.notebookChunkCount(notebookId) + chunks.length > LIMITS.chunksPerNotebook)
352
+ throw new SemanticPluginError("limit_exceeded");
353
+ signal.throwIfAborted();
354
+ this.db.replaceChunks(sourceId, chunks);
355
+ progress(0.2);
356
+ return this.indexSource(this.source(sourceId), signal, progress);
357
+ }, {
358
+ onCancel: async () => {
359
+ const source = this.db.source(sourceId);
360
+ if (!source)
361
+ return;
362
+ await this.removeVectors(source).catch(() => { });
363
+ this.db.clearChunks(sourceId);
364
+ this.db.setSourceStatus(sourceId, "failed", "cancelled");
365
+ },
366
+ onFail: (code) => {
367
+ if (!this.db.source(sourceId))
368
+ return;
369
+ this.db.clearChunks(sourceId);
370
+ this.db.setSourceStatus(sourceId, "failed", code);
371
+ },
372
+ });
373
+ return { sourceId, jobId };
374
+ }
375
+ /** Embeds a source's stored chunks (D10: text lives in SQLite, `keepText: false`). */
376
+ async indexSource(source, signal, progress) {
377
+ const semantic = this.semantic();
378
+ if (!semantic) {
379
+ this.db.setSourceStatus(source.id, "ready_keyword");
380
+ return { sourceId: source.id, status: "ready_keyword" };
381
+ }
382
+ const chunks = this.db.chunks(source.id);
383
+ try {
384
+ for (let i = 0; i < chunks.length; i += LIMITS.indexBatch) {
385
+ signal.throwIfAborted();
386
+ await semantic.index(collectionOf(source.notebookId), chunks.slice(i, i + LIMITS.indexBatch).map((c) => ({
387
+ id: vectorId(source.id, c.ordinal),
388
+ text: c.text,
389
+ metadata: { source: source.id, ordinal: c.ordinal },
390
+ keepText: false,
391
+ })), { signal });
392
+ progress(0.2 + (0.8 * Math.min(chunks.length, i + LIMITS.indexBatch)) / chunks.length);
393
+ }
394
+ }
395
+ catch (error) {
396
+ const code = errorCode(error);
397
+ if (code === "cancelled" || signal.aborted)
398
+ throw error;
399
+ // The keyword index is complete; vectors are missing (engine down or model changed).
400
+ this.db.setSourceStatus(source.id, "ready_keyword", code === "model_mismatch" ? "model_mismatch" : "engine_unavailable");
401
+ return { sourceId: source.id, status: "ready_keyword" };
402
+ }
403
+ this.db.setSourceStatus(source.id, "ready");
404
+ return { sourceId: source.id, status: "ready" };
405
+ }
406
+ async removeVectors(source) {
407
+ const semantic = this.semantic();
408
+ if (!semantic)
409
+ return;
410
+ const ids = this.db.chunks(source.id).map((c) => vectorId(source.id, c.ordinal));
411
+ for (let i = 0; i < ids.length; i += 500)
412
+ await semantic.remove(collectionOf(source.notebookId), ids.slice(i, i + 500));
413
+ }
414
+ rebuild(input) {
415
+ const notebook = this.notebook(id(input, "notebookId"));
416
+ if (!this.semantic())
417
+ throw new SemanticPluginError("engine_unavailable");
418
+ const jobId = this.jobs.start(notebook.id, "rebuild", null, async ({ signal, progress }) => {
419
+ const semantic = this.semantic();
420
+ if (!semantic)
421
+ throw new SemanticPluginError("engine_unavailable");
422
+ await semantic.drop(collectionOf(notebook.id), { signal });
423
+ const sources = this.db.sources(notebook.id).filter((s) => s.chunkCount > 0);
424
+ let done = 0;
425
+ for (const source of sources) {
426
+ const result = await this.indexSource(source, signal, () => { });
427
+ if (result.status !== "ready")
428
+ throw new SemanticPluginError("engine_unavailable");
429
+ progress(++done / Math.max(1, sources.length));
430
+ }
431
+ return { sources: sources.length };
432
+ });
433
+ return { jobId };
434
+ }
435
+ // ---- Retrieval and answers -----------------------------------------------------------------
436
+ /** Hybrid retrieval (D9): vector + FTS5, RRF, top 8; keyword-only when vectors are unavailable. */
437
+ async retrieve(notebookId, query, options) {
438
+ const scope = options.sourceIds?.length ? new Set(options.sourceIds) : undefined;
439
+ let vector = [];
440
+ let keywordOnly = true;
441
+ const semantic = this.semantic();
442
+ if (semantic) {
443
+ const single = scope?.size === 1 ? [...scope][0] : undefined;
444
+ const matches = await semantic.trySearch(collectionOf(notebookId), query.slice(0, 32_000), {
445
+ topK: scope && !single ? 100 : RETRIEVE_EACH,
446
+ ...(single ? { filter: { source: single } } : {}),
447
+ signal: options.signal,
448
+ });
449
+ if (matches) {
450
+ keywordOnly = false;
451
+ vector = matches
452
+ .map((m) => m.id)
453
+ .filter((key) => !scope || scope.has(key.split(":")[0]))
454
+ .slice(0, RETRIEVE_EACH);
455
+ }
456
+ }
457
+ const keyword = this.db.keywordSearch(notebookId, ftsQuery(query), RETRIEVE_EACH, options.sourceIds);
458
+ const fused = reciprocalRankFusion([vector, keyword], { top: options.keep ?? RETRIEVE_KEEP });
459
+ const names = new Map(this.db.sources(notebookId).map((s) => [s.id, s.name]));
460
+ const passages = [];
461
+ for (const key of fused) {
462
+ const [sourceId, ordinal] = key.split(":");
463
+ const chunk = sourceId ? this.db.chunk(sourceId, Number(ordinal)) : undefined;
464
+ if (!chunk || !names.has(chunk.sourceId))
465
+ continue;
466
+ passages.push({
467
+ n: passages.length + 1,
468
+ sourceId: chunk.sourceId,
469
+ sourceName: names.get(chunk.sourceId),
470
+ ordinal: chunk.ordinal,
471
+ page: chunk.page,
472
+ charStart: chunk.charStart,
473
+ charEnd: chunk.charEnd,
474
+ text: chunk.text,
475
+ });
476
+ }
477
+ return { passages, keywordOnly };
478
+ }
479
+ ask(input, ctx) {
480
+ const notebook = this.notebook(id(input, "notebookId"));
481
+ const question = text(input, "question", LIMITS.questionChars).trim();
482
+ if (!question)
483
+ invalid();
484
+ const sourceIds = ids(input, "sourceIds");
485
+ const locale = localeOf(input);
486
+ const jobId = this.jobs.start(notebook.id, "ask", null, async ({ signal, progress }) => {
487
+ const history = this.db
488
+ .messages(notebook.id, 6)
489
+ .map((m) => ({ role: m.role, text: m.text }));
490
+ const { passages, keywordOnly } = await this.retrieve(notebook.id, question, {
491
+ sourceIds,
492
+ signal,
493
+ });
494
+ progress(0.3);
495
+ this.db.addMessage(notebook.id, "user", question);
496
+ if (passages.length === 0) {
497
+ const messageId = this.db.addMessage(notebook.id, "assistant", NOT_FOUND[locale], {
498
+ citations: [],
499
+ grounded: false,
500
+ keywordOnly,
501
+ notFound: true,
502
+ });
503
+ return { messageId, keywordOnly, grounded: false, notFound: true };
504
+ }
505
+ const prompt = buildPrompt(question, passages, history, locale);
506
+ let answer;
507
+ try {
508
+ answer = await this.deps.complete({
509
+ ...prompt,
510
+ maxTokens: 1500,
511
+ sessionId: ctx.sessionId,
512
+ signal,
513
+ });
514
+ }
515
+ catch (error) {
516
+ if (signal.aborted)
517
+ throw error;
518
+ throw new SemanticPluginError("answer_failed");
519
+ }
520
+ const parsed = parseCitations(answer, passages);
521
+ const messageId = this.db.addMessage(notebook.id, "assistant", parsed.text, {
522
+ citations: parsed.citations,
523
+ grounded: parsed.grounded,
524
+ keywordOnly,
525
+ });
526
+ this.db.touchNotebook(notebook.id);
527
+ return { messageId, keywordOnly, grounded: parsed.grounded };
528
+ });
529
+ return { jobId };
530
+ }
531
+ /** Round-robin first passages of each source: an overview needs breadth, not one query. */
532
+ overviewPassages(sources, keep) {
533
+ const lists = sources.map((s) => this.db
534
+ .chunks(s.id)
535
+ .slice(0, keep)
536
+ .map((c) => ({ s, c })));
537
+ const picked = [];
538
+ for (let round = 0; picked.length < keep; round++) {
539
+ let any = false;
540
+ for (const list of lists) {
541
+ const item = list[round];
542
+ if (!item || picked.length >= keep)
543
+ continue;
544
+ any = true;
545
+ picked.push({
546
+ n: picked.length + 1,
547
+ sourceId: item.s.id,
548
+ sourceName: item.s.name,
549
+ ordinal: item.c.ordinal,
550
+ page: item.c.page,
551
+ charStart: item.c.charStart,
552
+ charEnd: item.c.charEnd,
553
+ text: item.c.text,
554
+ });
555
+ }
556
+ if (!any)
557
+ break;
558
+ }
559
+ return picked;
560
+ }
561
+ async completeWith(passages, instruction, ctx, signal, locale) {
562
+ const prompt = buildPrompt("", passages, [], locale, instruction);
563
+ try {
564
+ return await this.deps.complete({
565
+ ...prompt,
566
+ maxTokens: 1500,
567
+ sessionId: ctx.sessionId,
568
+ signal,
569
+ });
570
+ }
571
+ catch (error) {
572
+ if (signal.aborted)
573
+ throw error;
574
+ throw new SemanticPluginError("answer_failed");
575
+ }
576
+ }
577
+ guide(input, ctx) {
578
+ const notebook = this.notebook(id(input, "notebookId"));
579
+ const locale = localeOf(input);
580
+ const jobId = this.jobs.start(notebook.id, "guide", null, async ({ signal }) => {
581
+ const passages = this.overviewPassages(this.db.sources(notebook.id).filter((s) => s.chunkCount > 0), RETRIEVE_KEEP);
582
+ if (passages.length === 0)
583
+ return { summary: NOT_FOUND[locale], questions: [], citations: [], grounded: false };
584
+ const answer = await this.completeWith(passages, GUIDE_INSTRUCTION, ctx, signal, locale);
585
+ const questions = [...answer.matchAll(/^\s*Q:\s*(.+)$/gm)]
586
+ .map((m) => m[1].trim())
587
+ .slice(0, 3);
588
+ const summaryText = answer
589
+ .replace(/^\s*Q:.*$/gm, "")
590
+ .replace(/^\s*Summary:\s*/im, "")
591
+ .trim();
592
+ const parsed = parseCitations(summaryText, passages);
593
+ return {
594
+ summary: parsed.text,
595
+ questions,
596
+ citations: parsed.citations,
597
+ grounded: parsed.grounded,
598
+ };
599
+ });
600
+ return { jobId };
601
+ }
602
+ summary(input, ctx) {
603
+ const source = this.source(id(input, "sourceId"));
604
+ const locale = localeOf(input);
605
+ const jobId = this.jobs.start(source.notebookId, "summary", source.id, async ({ signal }) => {
606
+ const passages = this.overviewPassages([source], RETRIEVE_KEEP);
607
+ if (passages.length === 0)
608
+ throw new SemanticPluginError("no_text");
609
+ const parsed = parseCitations(await this.completeWith(passages, SUMMARY_INSTRUCTION, ctx, signal, locale), passages);
610
+ return {
611
+ sourceId: source.id,
612
+ summary: parsed.text,
613
+ citations: parsed.citations,
614
+ grounded: parsed.grounded,
615
+ };
616
+ });
617
+ return { jobId };
618
+ }
619
+ }
620
+ //# sourceMappingURL=service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"service.js","sourceRoot":"","sources":["../../src/notebook/service.ts"],"names":[],"mappings":"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"}