@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.
- package/LICENSE +21 -0
- package/README.es.md +152 -0
- package/README.md +144 -2
- package/THIRD_PARTY_NOTICES.md +42 -0
- package/assets/architecture.svg +1 -0
- package/assets/ask-flow.svg +1 -0
- package/cover.svg +53 -0
- package/dist/apps.d.ts +26 -0
- package/dist/apps.d.ts.map +1 -0
- package/dist/apps.js +135 -0
- package/dist/apps.js.map +1 -0
- package/dist/embedded.html +2194 -0
- package/dist/engine/download.d.ts +77 -0
- package/dist/engine/download.d.ts.map +1 -0
- package/dist/engine/download.js +213 -0
- package/dist/engine/download.js.map +1 -0
- package/dist/engine/embedder.d.ts +55 -0
- package/dist/engine/embedder.d.ts.map +1 -0
- package/dist/engine/embedder.js +182 -0
- package/dist/engine/embedder.js.map +1 -0
- package/dist/engine/infer.d.ts +22 -0
- package/dist/engine/infer.d.ts.map +1 -0
- package/dist/engine/infer.js +53 -0
- package/dist/engine/infer.js.map +1 -0
- package/dist/engine/models.d.ts +45 -0
- package/dist/engine/models.d.ts.map +1 -0
- package/dist/engine/models.js +132 -0
- package/dist/engine/models.js.map +1 -0
- package/dist/engine/runtime.d.ts +46 -0
- package/dist/engine/runtime.d.ts.map +1 -0
- package/dist/engine/runtime.js +172 -0
- package/dist/engine/runtime.js.map +1 -0
- package/dist/engine/setup.d.ts +82 -0
- package/dist/engine/setup.d.ts.map +1 -0
- package/dist/engine/setup.js +183 -0
- package/dist/engine/setup.js.map +1 -0
- package/dist/engine/store.d.ts +46 -0
- package/dist/engine/store.d.ts.map +1 -0
- package/dist/engine/store.js +280 -0
- package/dist/engine/store.js.map +1 -0
- package/dist/engine/tar.d.ts +18 -0
- package/dist/engine/tar.d.ts.map +1 -0
- package/dist/engine/tar.js +198 -0
- package/dist/engine/tar.js.map +1 -0
- package/dist/engine/worker.d.ts +2 -0
- package/dist/engine/worker.d.ts.map +1 -0
- package/dist/engine/worker.js +64 -0
- package/dist/engine/worker.js.map +1 -0
- package/dist/errors.d.ts +15 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +58 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +258 -0
- package/dist/index.js.map +1 -0
- package/dist/messages.d.ts +53 -0
- package/dist/messages.d.ts.map +1 -0
- package/dist/messages.js +118 -0
- package/dist/messages.js.map +1 -0
- package/dist/notebook/answer.d.ts +33 -0
- package/dist/notebook/answer.d.ts.map +1 -0
- package/dist/notebook/answer.js +77 -0
- package/dist/notebook/answer.js.map +1 -0
- package/dist/notebook/chunk.d.ts +23 -0
- package/dist/notebook/chunk.d.ts.map +1 -0
- package/dist/notebook/chunk.js +124 -0
- package/dist/notebook/chunk.js.map +1 -0
- package/dist/notebook/db.d.ts +98 -0
- package/dist/notebook/db.d.ts.map +1 -0
- package/dist/notebook/db.js +328 -0
- package/dist/notebook/db.js.map +1 -0
- package/dist/notebook/docx.d.ts +3 -0
- package/dist/notebook/docx.d.ts.map +1 -0
- package/dist/notebook/docx.js +16 -0
- package/dist/notebook/docx.js.map +1 -0
- package/dist/notebook/extract.d.ts +11 -0
- package/dist/notebook/extract.d.ts.map +1 -0
- package/dist/notebook/extract.js +99 -0
- package/dist/notebook/extract.js.map +1 -0
- package/dist/notebook/jobs.d.ts +31 -0
- package/dist/notebook/jobs.d.ts.map +1 -0
- package/dist/notebook/jobs.js +84 -0
- package/dist/notebook/jobs.js.map +1 -0
- package/dist/notebook/ooxml.d.ts +6 -0
- package/dist/notebook/ooxml.d.ts.map +1 -0
- package/dist/notebook/ooxml.js +131 -0
- package/dist/notebook/ooxml.js.map +1 -0
- package/dist/notebook/retrieve.d.ts +14 -0
- package/dist/notebook/retrieve.d.ts.map +1 -0
- package/dist/notebook/retrieve.js +37 -0
- package/dist/notebook/retrieve.js.map +1 -0
- package/dist/notebook/service.d.ts +72 -0
- package/dist/notebook/service.d.ts.map +1 -0
- package/dist/notebook/service.js +620 -0
- package/dist/notebook/service.js.map +1 -0
- package/dist/notebook/workspace.d.ts +17 -0
- package/dist/notebook/workspace.d.ts.map +1 -0
- package/dist/notebook/workspace.js +75 -0
- package/dist/notebook/workspace.js.map +1 -0
- package/dist/notebook/zip.d.ts +33 -0
- package/dist/notebook/zip.d.ts.map +1 -0
- package/dist/notebook/zip.js +154 -0
- package/dist/notebook/zip.js.map +1 -0
- package/dist/paths.d.ts +17 -0
- package/dist/paths.d.ts.map +1 -0
- package/dist/paths.js +28 -0
- package/dist/paths.js.map +1 -0
- package/dist/version.d.ts +2 -0
- package/dist/version.d.ts.map +1 -0
- package/dist/version.js +3 -0
- package/dist/version.js.map +1 -0
- package/icon.svg +16 -0
- 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 @@
|
|
|
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"}
|