@alisio/plugin-semantic 0.0.0-stage → 0.1.1
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 +168 -0
- package/README.md +160 -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 +141 -0
- package/dist/apps.js.map +1 -0
- package/dist/embedded.html +3043 -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 +288 -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 +59 -0
- package/dist/errors.js.map +1 -0
- package/dist/index.d.ts +20 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +269 -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 +35 -0
- package/dist/notebook/answer.d.ts.map +1 -0
- package/dist/notebook/answer.js +88 -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 +107 -0
- package/dist/notebook/db.d.ts.map +1 -0
- package/dist/notebook/db.js +356 -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 +92 -0
- package/dist/notebook/service.d.ts.map +1 -0
- package/dist/notebook/service.js +752 -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,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":"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"}
|
|
@@ -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"}
|
|
@@ -0,0 +1,131 @@
|
|
|
1
|
+
// .pptx and .xlsx text (owner O10). Reads only XML parts reached through the package's own
|
|
2
|
+
// relationships; never formulas (cached values only), macros, external links or embedded objects.
|
|
3
|
+
import { SemanticPluginError } from "../errors.js";
|
|
4
|
+
import { attributes, decodeXml, OFFICE_LIMITS, relationships, resolvePart, ZipArchive, } from "./zip.js";
|
|
5
|
+
/** Same rule as any source (§7.2): more extracted text than this is `limit_exceeded`. */
|
|
6
|
+
const MAX_CHARS = 2_000_000;
|
|
7
|
+
const MAX_CELLS = 2_000_000;
|
|
8
|
+
const bad = () => {
|
|
9
|
+
throw new SemanticPluginError("zip_invalid");
|
|
10
|
+
};
|
|
11
|
+
const folderOf = (part) => part.slice(0, part.lastIndexOf("/") + 1);
|
|
12
|
+
const relsOf = (part) => `${folderOf(part)}_rels/${part.slice(part.lastIndexOf("/") + 1)}.rels`;
|
|
13
|
+
function budget() {
|
|
14
|
+
let used = 0;
|
|
15
|
+
return (text) => {
|
|
16
|
+
used += text.length;
|
|
17
|
+
if (used > MAX_CHARS)
|
|
18
|
+
throw new SemanticPluginError("limit_exceeded");
|
|
19
|
+
return text;
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
/** Text of `<a:p>` paragraphs (`<a:t>` runs, `<a:br/>` breaks); slide-number fields are skipped. */
|
|
23
|
+
function drawingParagraphs(xml) {
|
|
24
|
+
const out = [];
|
|
25
|
+
for (const match of xml.matchAll(/<a:p[\s>][\s\S]*?<\/a:p>/g)) {
|
|
26
|
+
const body = match[0].replace(/<a:fld\b[^>]*type="slidenum"[\s\S]*?<\/a:fld>/g, "");
|
|
27
|
+
let text = "";
|
|
28
|
+
for (const token of body.matchAll(/<a:t(?:\s[^>]*)?>([\s\S]*?)<\/a:t>|<a:br\b[^>]*\/>/g))
|
|
29
|
+
text += token[1] !== undefined ? decodeXml(token[1]) : "\n";
|
|
30
|
+
if (text.trim())
|
|
31
|
+
out.push(text.trim());
|
|
32
|
+
}
|
|
33
|
+
return out;
|
|
34
|
+
}
|
|
35
|
+
/** One segment per slide, in presentation order; notes follow the slide text after a blank line. */
|
|
36
|
+
export function pptxSegments(bytes) {
|
|
37
|
+
const zip = new ZipArchive(bytes, OFFICE_LIMITS);
|
|
38
|
+
const presentation = zip.xml("ppt/presentation.xml");
|
|
39
|
+
const rels = relationships(zip.xml("ppt/_rels/presentation.xml.rels"));
|
|
40
|
+
const take = budget();
|
|
41
|
+
const segments = [];
|
|
42
|
+
for (const match of presentation.matchAll(/<p:sldId\b([^>]*)\/?>/g)) {
|
|
43
|
+
const id = attributes(match[1])["r:id"];
|
|
44
|
+
const rel = id ? rels.get(id) : undefined;
|
|
45
|
+
if (!rel || !/\/slide$/.test(rel.type))
|
|
46
|
+
continue;
|
|
47
|
+
const part = resolvePart("ppt/", rel.target);
|
|
48
|
+
if (!part.startsWith("ppt/"))
|
|
49
|
+
bad();
|
|
50
|
+
const slideXml = zip.xml(part);
|
|
51
|
+
const blocks = [drawingParagraphs(slideXml).join("\n")];
|
|
52
|
+
const slideRels = zip.has(relsOf(part)) ? relationships(zip.xml(relsOf(part))) : new Map();
|
|
53
|
+
for (const r of slideRels.values())
|
|
54
|
+
if (/\/notesSlide$/.test(r.type)) {
|
|
55
|
+
const notesPart = resolvePart(folderOf(part), r.target);
|
|
56
|
+
if (zip.has(notesPart))
|
|
57
|
+
blocks.push(drawingParagraphs(zip.xml(notesPart)).join("\n"));
|
|
58
|
+
}
|
|
59
|
+
segments.push({ text: take(blocks.filter(Boolean).join("\n\n")), page: segments.length + 1 });
|
|
60
|
+
}
|
|
61
|
+
if (segments.length === 0)
|
|
62
|
+
bad();
|
|
63
|
+
return segments;
|
|
64
|
+
}
|
|
65
|
+
const columnIndex = (ref) => {
|
|
66
|
+
const letters = /^[A-Z]+/.exec(ref)?.[0] ?? "";
|
|
67
|
+
let n = 0;
|
|
68
|
+
for (const c of letters)
|
|
69
|
+
n = n * 26 + (c.charCodeAt(0) - 64);
|
|
70
|
+
return n - 1;
|
|
71
|
+
};
|
|
72
|
+
/** Text of every `<t>` in a string item, without phonetic runs. */
|
|
73
|
+
const itemText = (xml) => [...xml.replace(/<rPh\b[\s\S]*?<\/rPh>/g, "").matchAll(/<t(?:\s[^>]*)?>([\s\S]*?)<\/t>/g)]
|
|
74
|
+
.map((m) => decodeXml(m[1]))
|
|
75
|
+
.join("");
|
|
76
|
+
/** One segment per sheet, in workbook order: "Sheet: <name>" then tab-separated rows. */
|
|
77
|
+
export function xlsxSegments(bytes) {
|
|
78
|
+
const zip = new ZipArchive(bytes, OFFICE_LIMITS);
|
|
79
|
+
const workbook = zip.xml("xl/workbook.xml");
|
|
80
|
+
const rels = relationships(zip.xml("xl/_rels/workbook.xml.rels"));
|
|
81
|
+
const shared = zip.has("xl/sharedStrings.xml")
|
|
82
|
+
? [...zip.xml("xl/sharedStrings.xml").matchAll(/<si>([\s\S]*?)<\/si>/g)].map((m) => itemText(m[1]))
|
|
83
|
+
: [];
|
|
84
|
+
const take = budget();
|
|
85
|
+
let cells = 0;
|
|
86
|
+
const segments = [];
|
|
87
|
+
for (const match of workbook.matchAll(/<sheet\b([^>]*)\/?>/g)) {
|
|
88
|
+
const attrs = attributes(match[1]);
|
|
89
|
+
const rel = attrs["r:id"] ? rels.get(attrs["r:id"]) : undefined;
|
|
90
|
+
if (!rel || !/\/worksheet$/.test(rel.type))
|
|
91
|
+
continue;
|
|
92
|
+
const part = resolvePart("xl/", rel.target);
|
|
93
|
+
if (!part.startsWith("xl/"))
|
|
94
|
+
bad();
|
|
95
|
+
const lines = [take(`Sheet: ${attrs.name ?? ""}`)];
|
|
96
|
+
for (const row of zip.xml(part).matchAll(/<row\b[^>]*>([\s\S]*?)<\/row>/g)) {
|
|
97
|
+
const values = [];
|
|
98
|
+
for (const cell of row[1].matchAll(/<c\b([^>]*?)(?:\/>|>([\s\S]*?)<\/c>)/g)) {
|
|
99
|
+
if (++cells > MAX_CELLS)
|
|
100
|
+
throw new SemanticPluginError("limit_exceeded");
|
|
101
|
+
const a = attributes(cell[1]);
|
|
102
|
+
const body = cell[2] ?? "";
|
|
103
|
+
const raw = /<v>([\s\S]*?)<\/v>/.exec(body)?.[1];
|
|
104
|
+
let value;
|
|
105
|
+
if (a.t === "inlineStr")
|
|
106
|
+
value = itemText(/<is>([\s\S]*?)<\/is>/.exec(body)?.[1] ?? "");
|
|
107
|
+
else if (raw === undefined)
|
|
108
|
+
value = undefined;
|
|
109
|
+
else if (a.t === "s")
|
|
110
|
+
value = shared[Number(raw)] ?? "";
|
|
111
|
+
else if (a.t === "b")
|
|
112
|
+
value = raw.trim() === "1" ? "TRUE" : "FALSE";
|
|
113
|
+
else
|
|
114
|
+
value = decodeXml(raw); // numbers as written, cached formula results, errors
|
|
115
|
+
if (value === undefined || value === "")
|
|
116
|
+
continue;
|
|
117
|
+
const col = a.r ? columnIndex(a.r) : values.length;
|
|
118
|
+
while (values.length < col)
|
|
119
|
+
values.push("");
|
|
120
|
+
values[col] = value.replace(/[\t\r\n]+/g, " ");
|
|
121
|
+
}
|
|
122
|
+
if (values.some((v) => v))
|
|
123
|
+
lines.push(take(values.join("\t")));
|
|
124
|
+
}
|
|
125
|
+
segments.push({ text: lines.join("\n"), page: segments.length + 1 });
|
|
126
|
+
}
|
|
127
|
+
if (segments.length === 0)
|
|
128
|
+
bad();
|
|
129
|
+
return segments;
|
|
130
|
+
}
|
|
131
|
+
//# sourceMappingURL=ooxml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ooxml.js","sourceRoot":"","sources":["../../src/notebook/ooxml.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const RRF_K = 60;
|
|
2
|
+
export declare const RETRIEVE_EACH = 20;
|
|
3
|
+
export declare const RETRIEVE_KEEP = 8;
|
|
4
|
+
/**
|
|
5
|
+
* Sum of `1 / (k + rank)` over the lists an id appears in (1-based rank, first occurrence per
|
|
6
|
+
* list). Ties keep first-seen order (list order, then rank), so the fusion is deterministic.
|
|
7
|
+
*/
|
|
8
|
+
export declare function reciprocalRankFusion(lists: string[][], options?: {
|
|
9
|
+
k?: number;
|
|
10
|
+
top?: number;
|
|
11
|
+
}): string[];
|
|
12
|
+
/** A safe FTS5 MATCH expression: every word quoted, joined by OR (operators become words). */
|
|
13
|
+
export declare function ftsQuery(text: string): string;
|
|
14
|
+
//# sourceMappingURL=retrieve.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrieve.d.ts","sourceRoot":"","sources":["../../src/notebook/retrieve.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,KAAK,KAAK,CAAC;AACxB,eAAO,MAAM,aAAa,KAAK,CAAC;AAChC,eAAO,MAAM,aAAa,IAAI,CAAC;AAE/B;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,MAAM,EAAE,EAAE,EACjB,OAAO,GAAE;IAAE,CAAC,CAAC,EAAE,MAAM,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAA;CAAO,GACzC,MAAM,EAAE,CAkBV;AAED,8FAA8F;AAC9F,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM7C"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
// Hybrid retrieval (D9): vector top 20 + FTS5 BM25 top 20, fused with Reciprocal Rank Fusion.
|
|
2
|
+
export const RRF_K = 60;
|
|
3
|
+
export const RETRIEVE_EACH = 20;
|
|
4
|
+
export const RETRIEVE_KEEP = 8;
|
|
5
|
+
/**
|
|
6
|
+
* Sum of `1 / (k + rank)` over the lists an id appears in (1-based rank, first occurrence per
|
|
7
|
+
* list). Ties keep first-seen order (list order, then rank), so the fusion is deterministic.
|
|
8
|
+
*/
|
|
9
|
+
export function reciprocalRankFusion(lists, options = {}) {
|
|
10
|
+
const k = options.k ?? RRF_K;
|
|
11
|
+
const scores = new Map();
|
|
12
|
+
let seen = 0;
|
|
13
|
+
for (const list of lists) {
|
|
14
|
+
const counted = new Set();
|
|
15
|
+
list.forEach((id, index) => {
|
|
16
|
+
if (counted.has(id))
|
|
17
|
+
return;
|
|
18
|
+
counted.add(id);
|
|
19
|
+
const entry = scores.get(id) ?? { score: 0, seen: seen++ };
|
|
20
|
+
entry.score += 1 / (k + index + 1);
|
|
21
|
+
scores.set(id, entry);
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
return [...scores.entries()]
|
|
25
|
+
.sort((a, b) => b[1].score - a[1].score || a[1].seen - b[1].seen)
|
|
26
|
+
.slice(0, options.top ?? RETRIEVE_KEEP)
|
|
27
|
+
.map(([id]) => id);
|
|
28
|
+
}
|
|
29
|
+
/** A safe FTS5 MATCH expression: every word quoted, joined by OR (operators become words). */
|
|
30
|
+
export function ftsQuery(text) {
|
|
31
|
+
const words = text.match(/[\p{L}\p{N}]+/gu) ?? [];
|
|
32
|
+
return words
|
|
33
|
+
.slice(0, 64)
|
|
34
|
+
.map((word) => `"${word}"`)
|
|
35
|
+
.join(" OR ");
|
|
36
|
+
}
|
|
37
|
+
//# sourceMappingURL=retrieve.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"retrieve.js","sourceRoot":"","sources":["../../src/notebook/retrieve.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAE9F,MAAM,CAAC,MAAM,KAAK,GAAG,EAAE,CAAC;AACxB,MAAM,CAAC,MAAM,aAAa,GAAG,EAAE,CAAC;AAChC,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC,CAAC;AAE/B;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAClC,KAAiB,EACjB,OAAO,GAAiC,EAAE;IAE1C,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC;IAC7B,MAAM,MAAM,GAAG,IAAI,GAAG,EAA2C,CAAC;IAClE,IAAI,IAAI,GAAG,CAAC,CAAC;IACb,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,OAAO,GAAG,IAAI,GAAG,EAAU,CAAC;QAClC,IAAI,CAAC,OAAO,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE;YACzB,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;gBAAE,OAAO;YAC5B,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAChB,MAAM,KAAK,GAAG,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC;YAC3D,KAAK,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,CAAC,CAAC;YACnC,MAAM,CAAC,GAAG,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC;QACxB,CAAC,CAAC,CAAC;IACL,CAAC;IACD,OAAO,CAAC,GAAG,MAAM,CAAC,OAAO,EAAE,CAAC;SACzB,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;SAChE,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,GAAG,IAAI,aAAa,CAAC;SACtC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC,CAAC;AACvB,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,QAAQ,CAAC,IAAY;IACnC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,iBAAiB,CAAC,IAAI,EAAE,CAAC;IAClD,OAAO,KAAK;SACT,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC;SACZ,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,GAAG,CAAC;SAC1B,IAAI,CAAC,MAAM,CAAC,CAAC;AAClB,CAAC"}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import type { AvailableProviderModel, CompletionRequest, ToolSemantic } from "@alisio/sdk";
|
|
2
|
+
import { type Passage } from "./answer.js";
|
|
3
|
+
import type { NotebookDb } from "./db.js";
|
|
4
|
+
export declare const LIMITS: {
|
|
5
|
+
readonly sourcesPerNotebook: 50;
|
|
6
|
+
readonly charsPerSource: 2000000;
|
|
7
|
+
readonly chunksPerNotebook: 20000;
|
|
8
|
+
readonly questionChars: 4000;
|
|
9
|
+
readonly titleChars: 200;
|
|
10
|
+
readonly fileBytes: number;
|
|
11
|
+
readonly historyMessages: 50;
|
|
12
|
+
readonly indexBatch: 64;
|
|
13
|
+
};
|
|
14
|
+
export interface ActionContext {
|
|
15
|
+
sessionId: string;
|
|
16
|
+
workspace: string;
|
|
17
|
+
signal: AbortSignal;
|
|
18
|
+
idempotencyKey?: string;
|
|
19
|
+
}
|
|
20
|
+
export interface ServiceDeps {
|
|
21
|
+
db: NotebookDb;
|
|
22
|
+
/** The consumer side of `api.semantic` (absent on an older host). */
|
|
23
|
+
semantic: () => ToolSemantic | undefined;
|
|
24
|
+
complete: (request: CompletionRequest) => Promise<string>;
|
|
25
|
+
/** `api.models` (credential-free list of the user's configured models). */
|
|
26
|
+
models?: {
|
|
27
|
+
list(signal?: AbortSignal): Promise<AvailableProviderModel[]>;
|
|
28
|
+
resolve(reference: string, signal?: AbortSignal): Promise<unknown>;
|
|
29
|
+
};
|
|
30
|
+
/** Model a new child of this session would use: Alisio's active model. */
|
|
31
|
+
activeModel?: (sessionId: string) => string | undefined;
|
|
32
|
+
}
|
|
33
|
+
/** 12 lowercase base32 characters (D16). */
|
|
34
|
+
export declare function newId(): string;
|
|
35
|
+
export declare const collectionOf: (notebookId: string) => string;
|
|
36
|
+
type Input = Record<string, unknown>;
|
|
37
|
+
/** The Notebook app's actions, testable without a host (§7.7). */
|
|
38
|
+
export declare class NotebookService {
|
|
39
|
+
readonly db: NotebookDb;
|
|
40
|
+
private readonly deps;
|
|
41
|
+
private readonly jobs;
|
|
42
|
+
private readonly idempotent;
|
|
43
|
+
constructor(deps: ServiceDeps);
|
|
44
|
+
busy(): boolean;
|
|
45
|
+
dispose(): void;
|
|
46
|
+
idle(): Promise<void>;
|
|
47
|
+
private semantic;
|
|
48
|
+
invoke(action: string, input: Input, ctx: ActionContext): Promise<unknown>;
|
|
49
|
+
private notebook;
|
|
50
|
+
private source;
|
|
51
|
+
private dispatch;
|
|
52
|
+
/** How the frame labels `page`: a PDF page, a slide, or a sheet with its name (O10). */
|
|
53
|
+
private pageLabel;
|
|
54
|
+
private checkSourceLimit;
|
|
55
|
+
private upload;
|
|
56
|
+
private addFromWorkspace;
|
|
57
|
+
private addSource;
|
|
58
|
+
/** Embeds a source's stored chunks (D10: text lives in SQLite, `keepText: false`). */
|
|
59
|
+
private indexSource;
|
|
60
|
+
private removeVectors;
|
|
61
|
+
private rebuild;
|
|
62
|
+
/** Hybrid retrieval (D9): vector + FTS5, RRF, top 8; keyword-only when vectors are unavailable. */
|
|
63
|
+
retrieve(notebookId: string, query: string, options: {
|
|
64
|
+
sourceIds?: string[] | undefined;
|
|
65
|
+
signal: AbortSignal;
|
|
66
|
+
keep?: number;
|
|
67
|
+
}): Promise<{
|
|
68
|
+
passages: Passage[];
|
|
69
|
+
keywordOnly: boolean;
|
|
70
|
+
}>;
|
|
71
|
+
/** Configured models (credential-free) and Alisio's active one; empty when none is connected. */
|
|
72
|
+
private modelList;
|
|
73
|
+
/** Identity of the indexed sources a guide was built from: a new or removed source outdates it. */
|
|
74
|
+
private sourceSet;
|
|
75
|
+
/** The model that actually answers: the notebook's choice, else Alisio's active model. */
|
|
76
|
+
private modelName;
|
|
77
|
+
/** WHEN no model is configured, asking is refused before any job starts (O12). */
|
|
78
|
+
private requireModel;
|
|
79
|
+
/**
|
|
80
|
+
* The notebook's chosen model, resolved before each call. A model that no longer exists falls
|
|
81
|
+
* back to Alisio's active model (the choice is cleared) and the answer says so.
|
|
82
|
+
*/
|
|
83
|
+
private modelFor;
|
|
84
|
+
private ask;
|
|
85
|
+
/** Round-robin first passages of each source: an overview needs breadth, not one query. */
|
|
86
|
+
private overviewPassages;
|
|
87
|
+
private completeWith;
|
|
88
|
+
private guide;
|
|
89
|
+
private summary;
|
|
90
|
+
}
|
|
91
|
+
export {};
|
|
92
|
+
//# sourceMappingURL=service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"service.d.ts","sourceRoot":"","sources":["../../src/notebook/service.ts"],"names":[],"mappings":"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"}
|