@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,328 @@
1
+ /** Numbered migrations (§7.1); `PRAGMA user_version` records the last one applied. */
2
+ const MIGRATIONS = [
3
+ `CREATE TABLE notebooks (
4
+ id TEXT PRIMARY KEY,
5
+ title TEXT NOT NULL,
6
+ created_at INTEGER NOT NULL,
7
+ updated_at INTEGER NOT NULL,
8
+ remote_notice_ack INTEGER NOT NULL DEFAULT 0
9
+ );
10
+ CREATE TABLE sources (
11
+ id TEXT PRIMARY KEY,
12
+ notebook_id TEXT NOT NULL,
13
+ name TEXT NOT NULL,
14
+ kind TEXT NOT NULL,
15
+ mime TEXT NOT NULL,
16
+ sha256 TEXT NOT NULL,
17
+ bytes INTEGER NOT NULL,
18
+ status TEXT NOT NULL,
19
+ error TEXT,
20
+ chunk_count INTEGER NOT NULL DEFAULT 0,
21
+ created_at INTEGER NOT NULL
22
+ );
23
+ CREATE INDEX sources_notebook ON sources(notebook_id);
24
+ CREATE TABLE chunks (
25
+ id INTEGER PRIMARY KEY,
26
+ source_id TEXT NOT NULL,
27
+ ordinal INTEGER NOT NULL,
28
+ text TEXT NOT NULL,
29
+ page INTEGER,
30
+ char_start INTEGER NOT NULL,
31
+ char_end INTEGER NOT NULL,
32
+ UNIQUE (source_id, ordinal)
33
+ );
34
+ CREATE VIRTUAL TABLE chunks_fts USING fts5(
35
+ text, content='chunks', content_rowid='id', tokenize='unicode61 remove_diacritics 2'
36
+ );
37
+ CREATE TRIGGER chunks_ai AFTER INSERT ON chunks BEGIN
38
+ INSERT INTO chunks_fts(rowid, text) VALUES (new.id, new.text);
39
+ END;
40
+ CREATE TRIGGER chunks_ad AFTER DELETE ON chunks BEGIN
41
+ INSERT INTO chunks_fts(chunks_fts, rowid, text) VALUES ('delete', old.id, old.text);
42
+ END;
43
+ CREATE TABLE messages (
44
+ id INTEGER PRIMARY KEY AUTOINCREMENT,
45
+ notebook_id TEXT NOT NULL,
46
+ role TEXT NOT NULL,
47
+ text TEXT NOT NULL,
48
+ citations_json TEXT,
49
+ created_at INTEGER NOT NULL
50
+ );
51
+ CREATE INDEX messages_notebook ON messages(notebook_id, id);
52
+ CREATE TABLE jobs (
53
+ id TEXT PRIMARY KEY,
54
+ notebook_id TEXT NOT NULL,
55
+ kind TEXT NOT NULL,
56
+ state TEXT NOT NULL,
57
+ progress REAL NOT NULL DEFAULT 0,
58
+ error TEXT,
59
+ result_json TEXT,
60
+ source_id TEXT,
61
+ created_at INTEGER NOT NULL,
62
+ updated_at INTEGER NOT NULL
63
+ );`,
64
+ ];
65
+ const notebook = (r) => ({
66
+ id: r.id,
67
+ title: r.title,
68
+ createdAt: Number(r.created_at),
69
+ updatedAt: Number(r.updated_at),
70
+ remoteNoticeAck: Number(r.remote_notice_ack) === 1,
71
+ });
72
+ const source = (r) => ({
73
+ id: r.id,
74
+ notebookId: r.notebook_id,
75
+ name: r.name,
76
+ kind: r.kind,
77
+ mime: r.mime,
78
+ sha256: r.sha256,
79
+ bytes: Number(r.bytes),
80
+ status: r.status,
81
+ error: r.error ?? null,
82
+ chunkCount: Number(r.chunk_count),
83
+ createdAt: Number(r.created_at),
84
+ });
85
+ const chunk = (r) => ({
86
+ id: Number(r.id),
87
+ sourceId: r.source_id,
88
+ ordinal: Number(r.ordinal),
89
+ text: r.text,
90
+ page: r.page === null || r.page === undefined ? null : Number(r.page),
91
+ charStart: Number(r.char_start),
92
+ charEnd: Number(r.char_end),
93
+ });
94
+ const parse = (text) => {
95
+ if (typeof text !== "string")
96
+ return undefined;
97
+ try {
98
+ return JSON.parse(text);
99
+ }
100
+ catch {
101
+ return undefined;
102
+ }
103
+ };
104
+ const job = (r) => ({
105
+ id: r.id,
106
+ notebookId: r.notebook_id,
107
+ kind: r.kind,
108
+ state: r.state,
109
+ progress: Number(r.progress),
110
+ error: r.error ?? null,
111
+ result: parse(r.result_json) ?? null,
112
+ sourceId: r.source_id ?? null,
113
+ createdAt: Number(r.created_at),
114
+ updatedAt: Number(r.updated_at),
115
+ });
116
+ /** The Notebook's own SQLite store (D10): sources, chunks + FTS5, chat and jobs. */
117
+ export class NotebookDb {
118
+ sql;
119
+ now;
120
+ constructor(sql, now = Date.now) {
121
+ this.sql = sql;
122
+ this.now = now;
123
+ this.migrate();
124
+ // Jobs that were running when the process stopped cannot resume.
125
+ this.sql
126
+ .prepare("UPDATE jobs SET state = 'failed', error = 'operation_failed', updated_at = ? WHERE state IN ('queued', 'running')")
127
+ .run(this.now());
128
+ this.sql
129
+ .prepare("UPDATE sources SET status = 'failed', error = 'operation_failed' WHERE status = 'indexing'")
130
+ .run();
131
+ }
132
+ migrate() {
133
+ const version = Number(this.sql.prepare("PRAGMA user_version").get()?.user_version ?? 0);
134
+ for (let v = version; v < MIGRATIONS.length; v++)
135
+ this.sql.transaction(() => {
136
+ this.sql.exec(MIGRATIONS[v]);
137
+ this.sql.exec(`PRAGMA user_version = ${v + 1}`);
138
+ });
139
+ }
140
+ close() {
141
+ this.sql.close();
142
+ }
143
+ // Notebooks
144
+ createNotebook(id, title) {
145
+ const at = this.now();
146
+ this.sql
147
+ .prepare("INSERT INTO notebooks (id, title, created_at, updated_at) VALUES (?, ?, ?, ?)")
148
+ .run(id, title, at, at);
149
+ }
150
+ notebook(id) {
151
+ const row = this.sql.prepare("SELECT * FROM notebooks WHERE id = ?").get(id);
152
+ return row ? notebook(row) : undefined;
153
+ }
154
+ notebooks() {
155
+ return this.sql
156
+ .prepare("SELECT n.*, (SELECT COUNT(*) FROM sources s WHERE s.notebook_id = n.id) AS source_count FROM notebooks n ORDER BY n.updated_at DESC, n.id")
157
+ .all()
158
+ .map((r) => ({ ...notebook(r), sourceCount: Number(r.source_count) }));
159
+ }
160
+ findNotebook(reference) {
161
+ const byId = this.notebook(reference);
162
+ if (byId)
163
+ return byId;
164
+ const row = this.sql
165
+ .prepare("SELECT * FROM notebooks WHERE title = ? COLLATE NOCASE ORDER BY updated_at DESC LIMIT 1")
166
+ .get(reference);
167
+ return row ? notebook(row) : undefined;
168
+ }
169
+ renameNotebook(id, title) {
170
+ this.sql
171
+ .prepare("UPDATE notebooks SET title = ?, updated_at = ? WHERE id = ?")
172
+ .run(title, this.now(), id);
173
+ }
174
+ touchNotebook(id) {
175
+ this.sql.prepare("UPDATE notebooks SET updated_at = ? WHERE id = ?").run(this.now(), id);
176
+ }
177
+ ackNotice(id) {
178
+ this.sql.prepare("UPDATE notebooks SET remote_notice_ack = 1 WHERE id = ?").run(id);
179
+ }
180
+ deleteNotebook(id) {
181
+ this.sql.transaction(() => {
182
+ this.sql
183
+ .prepare("DELETE FROM chunks WHERE source_id IN (SELECT id FROM sources WHERE notebook_id = ?)")
184
+ .run(id);
185
+ this.sql.prepare("DELETE FROM sources WHERE notebook_id = ?").run(id);
186
+ this.sql.prepare("DELETE FROM messages WHERE notebook_id = ?").run(id);
187
+ this.sql.prepare("DELETE FROM jobs WHERE notebook_id = ?").run(id);
188
+ this.sql.prepare("DELETE FROM notebooks WHERE id = ?").run(id);
189
+ });
190
+ }
191
+ countNotebooks() {
192
+ return Number(this.sql.prepare("SELECT COUNT(*) AS n FROM notebooks").get()?.n ?? 0);
193
+ }
194
+ // Sources
195
+ insertSource(row) {
196
+ this.sql
197
+ .prepare("INSERT INTO sources (id, notebook_id, name, kind, mime, sha256, bytes, status, created_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)")
198
+ .run(row.id, row.notebookId, row.name, row.kind, row.mime, row.sha256, row.bytes, row.status, this.now());
199
+ }
200
+ source(id) {
201
+ const row = this.sql.prepare("SELECT * FROM sources WHERE id = ?").get(id);
202
+ return row ? source(row) : undefined;
203
+ }
204
+ sources(notebookId) {
205
+ return this.sql
206
+ .prepare("SELECT * FROM sources WHERE notebook_id = ? ORDER BY created_at, id")
207
+ .all(notebookId)
208
+ .map(source);
209
+ }
210
+ sourceBySha(notebookId, sha256) {
211
+ const row = this.sql
212
+ .prepare("SELECT * FROM sources WHERE notebook_id = ? AND sha256 = ?")
213
+ .get(notebookId, sha256);
214
+ return row ? source(row) : undefined;
215
+ }
216
+ setSourceStatus(id, status, error = null) {
217
+ this.sql
218
+ .prepare("UPDATE sources SET status = ?, error = ? WHERE id = ?")
219
+ .run(status, error, id);
220
+ }
221
+ deleteSource(id) {
222
+ this.sql.transaction(() => {
223
+ this.sql.prepare("DELETE FROM chunks WHERE source_id = ?").run(id);
224
+ this.sql.prepare("DELETE FROM sources WHERE id = ?").run(id);
225
+ });
226
+ }
227
+ // Chunks (one transaction per source, D10)
228
+ replaceChunks(sourceId, chunks) {
229
+ this.sql.transaction(() => {
230
+ this.sql.prepare("DELETE FROM chunks WHERE source_id = ?").run(sourceId);
231
+ const insert = this.sql.prepare("INSERT INTO chunks (source_id, ordinal, text, page, char_start, char_end) VALUES (?, ?, ?, ?, ?, ?)");
232
+ for (const c of chunks)
233
+ insert.run(sourceId, c.ordinal, c.text, c.page, c.charStart, c.charEnd);
234
+ this.sql
235
+ .prepare("UPDATE sources SET chunk_count = ? WHERE id = ?")
236
+ .run(chunks.length, sourceId);
237
+ });
238
+ }
239
+ clearChunks(sourceId) {
240
+ this.replaceChunks(sourceId, []);
241
+ }
242
+ chunks(sourceId) {
243
+ return this.sql
244
+ .prepare("SELECT * FROM chunks WHERE source_id = ? ORDER BY ordinal")
245
+ .all(sourceId)
246
+ .map(chunk);
247
+ }
248
+ chunk(sourceId, ordinal) {
249
+ const row = this.sql
250
+ .prepare("SELECT * FROM chunks WHERE source_id = ? AND ordinal = ?")
251
+ .get(sourceId, ordinal);
252
+ return row ? chunk(row) : undefined;
253
+ }
254
+ notebookChunkCount(notebookId) {
255
+ return Number(this.sql
256
+ .prepare("SELECT COUNT(*) AS n FROM chunks c JOIN sources s ON s.id = c.source_id WHERE s.notebook_id = ?")
257
+ .get(notebookId)?.n ?? 0);
258
+ }
259
+ /** BM25 ranking over the notebook's chunks, as `<sourceId>:<ordinal>` keys. */
260
+ keywordSearch(notebookId, match, limit, sourceIds) {
261
+ if (!match)
262
+ return [];
263
+ const scope = sourceIds?.length
264
+ ? ` AND c.source_id IN (${sourceIds.map(() => "?").join(", ")})`
265
+ : "";
266
+ try {
267
+ return this.sql
268
+ .prepare(`SELECT c.source_id, c.ordinal FROM chunks_fts f JOIN chunks c ON c.id = f.rowid
269
+ JOIN sources s ON s.id = c.source_id
270
+ WHERE chunks_fts MATCH ? AND s.notebook_id = ?${scope}
271
+ ORDER BY bm25(chunks_fts), c.id LIMIT ?`)
272
+ .all(match, notebookId, ...(sourceIds ?? []), limit)
273
+ .map((r) => `${r.source_id}:${Number(r.ordinal)}`);
274
+ }
275
+ catch {
276
+ return [];
277
+ }
278
+ }
279
+ // Messages
280
+ addMessage(notebookId, role, text, meta = {}) {
281
+ const result = this.sql
282
+ .prepare("INSERT INTO messages (notebook_id, role, text, citations_json, created_at) VALUES (?, ?, ?, ?, ?)")
283
+ .run(notebookId, role, text, JSON.stringify(meta), this.now());
284
+ return Number(result.lastInsertRowid);
285
+ }
286
+ messages(notebookId, limit, before) {
287
+ const rows = this.sql
288
+ .prepare(`SELECT * FROM messages WHERE notebook_id = ?${before ? " AND id < ?" : ""} ORDER BY id DESC LIMIT ?`)
289
+ .all(...(before ? [notebookId, before, limit] : [notebookId, limit]));
290
+ return rows.reverse().map((r) => ({
291
+ id: Number(r.id),
292
+ notebookId: r.notebook_id,
293
+ role: r.role,
294
+ text: r.text,
295
+ meta: parse(r.citations_json) ?? {},
296
+ createdAt: Number(r.created_at),
297
+ }));
298
+ }
299
+ clearMessages(notebookId) {
300
+ this.sql.prepare("DELETE FROM messages WHERE notebook_id = ?").run(notebookId);
301
+ }
302
+ // Jobs
303
+ insertJob(id, notebookId, kind, sourceId) {
304
+ const at = this.now();
305
+ this.sql
306
+ .prepare("INSERT INTO jobs (id, notebook_id, kind, state, source_id, created_at, updated_at) VALUES (?, ?, ?, 'queued', ?, ?, ?)")
307
+ .run(id, notebookId, kind, sourceId, at, at);
308
+ }
309
+ updateJob(id, patch) {
310
+ const current = this.job(id);
311
+ if (!current)
312
+ return;
313
+ this.sql
314
+ .prepare("UPDATE jobs SET state = ?, progress = ?, error = ?, result_json = ?, updated_at = ? WHERE id = ?")
315
+ .run(patch.state ?? current.state, patch.progress ?? current.progress, patch.error === undefined ? current.error : patch.error, JSON.stringify(patch.result === undefined ? current.result : patch.result), this.now(), id);
316
+ }
317
+ job(id) {
318
+ const row = this.sql.prepare("SELECT * FROM jobs WHERE id = ?").get(id);
319
+ return row ? job(row) : undefined;
320
+ }
321
+ activeJobs(notebookId) {
322
+ return this.sql
323
+ .prepare("SELECT * FROM jobs WHERE notebook_id = ? AND state IN ('queued', 'running') ORDER BY created_at")
324
+ .all(notebookId)
325
+ .map(job);
326
+ }
327
+ }
328
+ //# sourceMappingURL=db.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"db.js","sourceRoot":"","sources":["../../src/notebook/db.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export { decodeXml } from "./zip.js";
2
+ export declare function docxText(bytes: Buffer): string;
3
+ //# sourceMappingURL=docx.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx.d.ts","sourceRoot":"","sources":["../../src/notebook/docx.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAU9C"}
@@ -0,0 +1,16 @@
1
+ // .docx text (§7.3): `word/document.xml`, `<w:p>` per paragraph, `<w:t>` runs, tabs and breaks.
2
+ import { DOCX_LIMITS, decodeXml, ZipArchive } from "./zip.js";
3
+ export { decodeXml } from "./zip.js";
4
+ export function docxText(bytes) {
5
+ const xml = new ZipArchive(bytes, DOCX_LIMITS).xml("word/document.xml");
6
+ const paragraphs = [];
7
+ for (const match of xml.matchAll(/<w:p[\s>][\s\S]*?<\/w:p>|<w:p\/>/g)) {
8
+ let text = "";
9
+ for (const token of match[0].matchAll(/<w:t(?:\s[^>]*)?>([\s\S]*?)<\/w:t>|<w:tab\/>|<w:br\/>/g))
10
+ text += token[1] !== undefined ? decodeXml(token[1]) : token[0] === "<w:tab/>" ? "\t" : "\n";
11
+ if (text.trim())
12
+ paragraphs.push(text);
13
+ }
14
+ return paragraphs.join("\n\n");
15
+ }
16
+ //# sourceMappingURL=docx.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"docx.js","sourceRoot":"","sources":["../../src/notebook/docx.ts"],"names":[],"mappings":"AAAA,gGAAgG;AAChG,OAAO,EAAE,WAAW,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE9D,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,GAAG,CAAC,mBAAmB,CAAC,CAAC;IACxE,MAAM,UAAU,GAAa,EAAE,CAAC;IAChC,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EAAE,CAAC;QACtE,IAAI,IAAI,GAAG,EAAE,CAAC;QACd,KAAK,MAAM,KAAK,IAAI,KAAK,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,wDAAwD,CAAC;YAC7F,IAAI,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/F,IAAI,IAAI,CAAC,IAAI,EAAE;YAAE,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACzC,CAAC;IACD,OAAO,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,11 @@
1
+ import type { Segment } from "./chunk.js";
2
+ export type SourceFormat = "text" | "html" | "docx" | "pptx" | "xlsx" | "pdf";
3
+ /** Format by file extension (case-insensitive), or undefined when unsupported. */
4
+ export declare function formatOf(name: string): SourceFormat | undefined;
5
+ export declare function htmlText(html: string): string;
6
+ /** Text segments of an uploaded file (PDF text comes from the frame, see `extractPdfPages`). */
7
+ export declare function extractBytes(name: string, bytes: Buffer): Promise<Segment[]>;
8
+ export declare const PDF_MIN_CHARS_PER_PAGE = 20;
9
+ /** One segment per PDF page; fewer than 20 characters per page on average is `no_text`. */
10
+ export declare function extractPdfPages(pages: string[]): Segment[];
11
+ //# sourceMappingURL=extract.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.d.ts","sourceRoot":"","sources":["../../src/notebook/extract.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AAI1C,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,GAAG,KAAK,CAAC;AAgB9E,kFAAkF;AAClF,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,YAAY,GAAG,SAAS,CAG/D;AAcD,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAU7C;AAiCD,gGAAgG;AAChG,wBAAsB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC,CAiBlF;AAED,eAAO,MAAM,sBAAsB,KAAK,CAAC;AAEzC,2FAA2F;AAC3F,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,EAAE,CAK1D"}
@@ -0,0 +1,99 @@
1
+ import { SemanticPluginError } from "../errors.js";
2
+ import { decodeXml, docxText } from "./docx.js";
3
+ import { pptxSegments, xlsxSegments } from "./ooxml.js";
4
+ const FORMATS = {
5
+ txt: "text",
6
+ md: "text",
7
+ markdown: "text",
8
+ csv: "text",
9
+ json: "text",
10
+ html: "html",
11
+ htm: "html",
12
+ docx: "docx",
13
+ pptx: "pptx",
14
+ xlsx: "xlsx",
15
+ pdf: "pdf",
16
+ };
17
+ /** Format by file extension (case-insensitive), or undefined when unsupported. */
18
+ export function formatOf(name) {
19
+ const ext = /\.([A-Za-z0-9]+)$/.exec(name)?.[1]?.toLowerCase();
20
+ return ext ? FORMATS[ext] : undefined;
21
+ }
22
+ function utf8(bytes) {
23
+ try {
24
+ // The decoder strips a leading BOM by default.
25
+ return new TextDecoder("utf-8", { fatal: true }).decode(bytes);
26
+ }
27
+ catch {
28
+ throw new SemanticPluginError("invalid_encoding");
29
+ }
30
+ }
31
+ const BLOCK = /<\/?(?:p|div|br|h[1-6]|li|ul|ol|tr|table|section|article|header|footer|blockquote|pre)\b[^>]*>/gi;
32
+ export function htmlText(html) {
33
+ const text = html
34
+ .replace(/<!--[\s\S]*?-->/g, "")
35
+ .replace(/<(script|style|noscript|template)\b[\s\S]*?<\/\1\s*>/gi, "")
36
+ .replace(BLOCK, "\n")
37
+ .replace(/<[^>]*>/g, "");
38
+ return decodeXml(decodeHtmlNamed(text))
39
+ .replace(/[ \t]+\n/g, "\n")
40
+ .replace(/\n{3,}/g, "\n\n")
41
+ .trim();
42
+ }
43
+ const NAMED = {
44
+ nbsp: " ",
45
+ eacute: "é",
46
+ aacute: "á",
47
+ iacute: "í",
48
+ oacute: "ó",
49
+ uacute: "ú",
50
+ ntilde: "ñ",
51
+ Eacute: "É",
52
+ Aacute: "Á",
53
+ Iacute: "Í",
54
+ Oacute: "Ó",
55
+ Uacute: "Ú",
56
+ Ntilde: "Ñ",
57
+ uuml: "ü",
58
+ copy: "©",
59
+ reg: "®",
60
+ hellip: "…",
61
+ mdash: "—",
62
+ ndash: "–",
63
+ laquo: "«",
64
+ raquo: "»",
65
+ iquest: "¿",
66
+ iexcl: "¡",
67
+ ccedil: "ç",
68
+ agrave: "à",
69
+ egrave: "è",
70
+ };
71
+ const decodeHtmlNamed = (text) => text.replace(/&([A-Za-z]+);/g, (match, name) => NAMED[name] ?? match);
72
+ /** Text segments of an uploaded file (PDF text comes from the frame, see `extractPdfPages`). */
73
+ export async function extractBytes(name, bytes) {
74
+ const format = formatOf(name);
75
+ switch (format) {
76
+ case "text":
77
+ return [{ text: utf8(bytes), page: null }];
78
+ case "html":
79
+ return [{ text: htmlText(utf8(bytes)), page: null }];
80
+ case "docx":
81
+ return [{ text: docxText(bytes), page: null }];
82
+ case "pptx":
83
+ return pptxSegments(bytes);
84
+ case "xlsx":
85
+ return xlsxSegments(bytes);
86
+ default:
87
+ // PDF text is extracted in the frame with PDF.js (§7.3); anything else is unsupported.
88
+ throw new SemanticPluginError("unsupported_format");
89
+ }
90
+ }
91
+ export const PDF_MIN_CHARS_PER_PAGE = 20;
92
+ /** One segment per PDF page; fewer than 20 characters per page on average is `no_text`. */
93
+ export function extractPdfPages(pages) {
94
+ const characters = pages.reduce((sum, page) => sum + page.trim().length, 0);
95
+ if (pages.length === 0 || characters / pages.length < PDF_MIN_CHARS_PER_PAGE)
96
+ throw new SemanticPluginError("no_text");
97
+ return pages.map((text, index) => ({ text, page: index + 1 }));
98
+ }
99
+ //# sourceMappingURL=extract.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract.js","sourceRoot":"","sources":["../../src/notebook/extract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAChD,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAIxD,MAAM,OAAO,GAAiC;IAC5C,GAAG,EAAE,MAAM;IACX,EAAE,EAAE,MAAM;IACV,QAAQ,EAAE,MAAM;IAChB,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,IAAI,EAAE,MAAM;IACZ,GAAG,EAAE,KAAK;CACX,CAAC;AAEF,kFAAkF;AAClF,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,GAAG,GAAG,mBAAmB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;IAC/D,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;AACxC,CAAC;AAED,SAAS,IAAI,CAAC,KAAiB;IAC7B,IAAI,CAAC;QACH,+CAA+C;QAC/C,OAAO,IAAI,WAAW,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACjE,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,mBAAmB,CAAC,kBAAkB,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,MAAM,KAAK,GACT,kGAAkG,CAAC;AAErG,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,IAAI,GAAG,IAAI;SACd,OAAO,CAAC,kBAAkB,EAAE,EAAE,CAAC;SAC/B,OAAO,CAAC,wDAAwD,EAAE,EAAE,CAAC;SACrE,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;SACpB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAC3B,OAAO,SAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;SACpC,OAAO,CAAC,WAAW,EAAE,IAAI,CAAC;SAC1B,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC;SAC1B,IAAI,EAAE,CAAC;AACZ,CAAC;AAED,MAAM,KAAK,GAA2B;IACpC,IAAI,EAAE,GAAG;IACT,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,IAAI,EAAE,GAAG;IACT,IAAI,EAAE,GAAG;IACT,GAAG,EAAE,GAAG;IACR,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,GAAG;IACX,KAAK,EAAE,GAAG;IACV,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;IACX,MAAM,EAAE,GAAG;CACZ,CAAC;AACF,MAAM,eAAe,GAAG,CAAC,IAAY,EAAE,EAAE,CACvC,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,KAAK,EAAE,IAAY,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,CAAC;AAEhF,gGAAgG;AAChG,MAAM,CAAC,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,KAAa;IAC5D,MAAM,MAAM,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC9B,QAAQ,MAAM,EAAE,CAAC;QACf,KAAK,MAAM;YACT,OAAO,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7C,KAAK,MAAM;YACT,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACvD,KAAK,MAAM;YACT,OAAO,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,KAAK,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7B,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,KAAK,CAAC,CAAC;QAC7B;YACE,uFAAuF;YACvF,MAAM,IAAI,mBAAmB,CAAC,oBAAoB,CAAC,CAAC;IACxD,CAAC;AACH,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG,EAAE,CAAC;AAEzC,2FAA2F;AAC3F,MAAM,UAAU,eAAe,CAAC,KAAe;IAC7C,MAAM,UAAU,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;IAC5E,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,GAAG,KAAK,CAAC,MAAM,GAAG,sBAAsB;QAC1E,MAAM,IAAI,mBAAmB,CAAC,SAAS,CAAC,CAAC;IAC3C,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC;AACjE,CAAC"}
@@ -0,0 +1,31 @@
1
+ import type { NotebookDb } from "./db.js";
2
+ export interface JobContext {
3
+ signal: AbortSignal;
4
+ progress(value: number): void;
5
+ }
6
+ export type JobWork = (context: JobContext) => Promise<unknown>;
7
+ export interface JobOptions {
8
+ /** Runs after a cancellation, before the job is marked `cancelled` (cleanup of partial work). */
9
+ onCancel?: () => Promise<void> | void;
10
+ /** Runs after a failure with its code (for example to mark a source as failed). */
11
+ onFail?: (code: string) => Promise<void> | void;
12
+ }
13
+ /**
14
+ * Long work as jobs (D11): the action returns a job id at once and the frame polls `jobs.get`.
15
+ * Jobs of one notebook run one after another; each has its own `AbortController`.
16
+ */
17
+ export declare class JobRunner {
18
+ private readonly db;
19
+ private readonly controllers;
20
+ private readonly chains;
21
+ constructor(db: NotebookDb);
22
+ start(notebookId: string, kind: string, sourceId: string | null, work: JobWork, options?: JobOptions): `${string}-${string}-${string}-${string}-${string}`;
23
+ cancel(id: string): boolean;
24
+ busy(): boolean;
25
+ /** Cancels every job (plugin dispose). */
26
+ dispose(): void;
27
+ /** Resolves when every job queued so far has settled (tests and dispose). */
28
+ idle(): Promise<void>;
29
+ private execute;
30
+ }
31
+ //# sourceMappingURL=jobs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.d.ts","sourceRoot":"","sources":["../../src/notebook/jobs.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C,MAAM,WAAW,UAAU;IACzB,MAAM,EAAE,WAAW,CAAC;IACpB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;CAC/B;AACD,MAAM,MAAM,OAAO,GAAG,CAAC,OAAO,EAAE,UAAU,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;AAChE,MAAM,WAAW,UAAU;IACzB,iGAAiG;IACjG,QAAQ,CAAC,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IACtC,mFAAmF;IACnF,MAAM,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACjD;AAED;;;GAGG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAa;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAsC;IAClE,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAoC;IAE3D,YAAY,EAAE,EAAE,UAAU,EAEzB;IAED,KAAK,CACH,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,MAAM,GAAG,IAAI,EACvB,IAAI,EAAE,OAAO,EACb,OAAO,GAAE,UAAe,uDAazB;IAED,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAK1B;IAED,IAAI,IAAI,OAAO,CAEd;IAED,0CAA0C;IAC1C,OAAO,SAEN;IAED,6EAA6E;IACvE,IAAI,kBAET;YAEa,OAAO;CAoCtB"}
@@ -0,0 +1,84 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import { errorCode, SemanticPluginError } from "../errors.js";
3
+ /**
4
+ * Long work as jobs (D11): the action returns a job id at once and the frame polls `jobs.get`.
5
+ * Jobs of one notebook run one after another; each has its own `AbortController`.
6
+ */
7
+ export class JobRunner {
8
+ db;
9
+ controllers = new Map();
10
+ chains = new Map();
11
+ constructor(db) {
12
+ this.db = db;
13
+ }
14
+ start(notebookId, kind, sourceId, work, options = {}) {
15
+ const id = randomUUID();
16
+ this.db.insertJob(id, notebookId, kind, sourceId);
17
+ const controller = new AbortController();
18
+ this.controllers.set(id, controller);
19
+ const previous = this.chains.get(notebookId) ?? Promise.resolve();
20
+ const run = previous.then(() => this.execute(id, work, controller, options));
21
+ const tail = run.finally(() => {
22
+ if (this.chains.get(notebookId) === tail)
23
+ this.chains.delete(notebookId);
24
+ });
25
+ this.chains.set(notebookId, tail);
26
+ return id;
27
+ }
28
+ cancel(id) {
29
+ const controller = this.controllers.get(id);
30
+ if (!controller)
31
+ return false;
32
+ controller.abort();
33
+ return true;
34
+ }
35
+ busy() {
36
+ return this.controllers.size > 0;
37
+ }
38
+ /** Cancels every job (plugin dispose). */
39
+ dispose() {
40
+ for (const controller of this.controllers.values())
41
+ controller.abort();
42
+ }
43
+ /** Resolves when every job queued so far has settled (tests and dispose). */
44
+ async idle() {
45
+ await Promise.all([...this.chains.values()]);
46
+ }
47
+ async execute(id, work, controller, options) {
48
+ const signal = controller.signal;
49
+ try {
50
+ if (signal.aborted)
51
+ throw new SemanticPluginError("cancelled");
52
+ this.db.updateJob(id, { state: "running" });
53
+ let last = 0;
54
+ const result = await work({
55
+ signal,
56
+ progress: (value) => {
57
+ const next = Math.max(last, Math.min(1, value));
58
+ if (next - last >= 0.01 || next === 1) {
59
+ last = next;
60
+ this.db.updateJob(id, { progress: next });
61
+ }
62
+ },
63
+ });
64
+ if (signal.aborted)
65
+ throw new SemanticPluginError("cancelled");
66
+ this.db.updateJob(id, { state: "done", progress: 1, result: result ?? null });
67
+ }
68
+ catch (error) {
69
+ const code = signal.aborted ? "cancelled" : errorCode(error);
70
+ if (code === "cancelled") {
71
+ await Promise.resolve(options.onCancel?.()).catch(() => { });
72
+ this.db.updateJob(id, { state: "cancelled", error: "cancelled" });
73
+ }
74
+ else {
75
+ await Promise.resolve(options.onFail?.(code)).catch(() => { });
76
+ this.db.updateJob(id, { state: "failed", error: code });
77
+ }
78
+ }
79
+ finally {
80
+ this.controllers.delete(id);
81
+ }
82
+ }
83
+ }
84
+ //# sourceMappingURL=jobs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jobs.js","sourceRoot":"","sources":["../../src/notebook/jobs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Segment } from "./chunk.js";
2
+ /** One segment per slide, in presentation order; notes follow the slide text after a blank line. */
3
+ export declare function pptxSegments(bytes: Buffer): Segment[];
4
+ /** One segment per sheet, in workbook order: "Sheet: <name>" then tab-separated rows. */
5
+ export declare function xlsxSegments(bytes: Buffer): Segment[];
6
+ //# sourceMappingURL=ooxml.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ooxml.d.ts","sourceRoot":"","sources":["../../src/notebook/ooxml.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAC;AA2C1C,oGAAoG;AACpG,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CAwBrD;AAeD,yFAAyF;AACzF,wBAAgB,YAAY,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,EAAE,CA2CrD"}