@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,17 @@
1
+ export declare const MAX_FILE_BYTES: number;
2
+ /**
3
+ * Resolves a frame-supplied relative path inside the workspace (§7.2): absolute paths and `..`
4
+ * are rejected, and the real path (symlinks resolved) must stay under the real workspace root.
5
+ */
6
+ export declare function resolveInside(root: string, path: string): Promise<string>;
7
+ export interface WorkspaceEntry {
8
+ name: string;
9
+ path: string;
10
+ kind: "file" | "dir";
11
+ bytes: number;
12
+ }
13
+ /** Visible entries of a workspace directory: folders first, then files, at most 500. */
14
+ export declare function listDirectory(root: string, dir?: string): Promise<WorkspaceEntry[]>;
15
+ /** Reads a workspace file after containment and size checks. */
16
+ export declare function readInside(root: string, path: string): Promise<Buffer>;
17
+ //# sourceMappingURL=workspace.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.d.ts","sourceRoot":"","sources":["../../src/notebook/workspace.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,cAAc,QAAmB,CAAC;AAO/C;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAgB/E;AAED,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,GAAG,KAAK,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,wFAAwF;AACxF,wBAAsB,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAK,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAoBrF;AAED,gEAAgE;AAChE,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAW5E"}
@@ -0,0 +1,75 @@
1
+ import { open, readdir, realpath, stat } from "node:fs/promises";
2
+ import { isAbsolute, join, relative, resolve, sep, win32 } from "node:path";
3
+ import { SemanticPluginError } from "../errors.js";
4
+ export const MAX_FILE_BYTES = 25 * 1024 * 1024;
5
+ const MAX_ENTRIES = 500;
6
+ const outside = () => {
7
+ throw new SemanticPluginError("path_outside_workspace");
8
+ };
9
+ /**
10
+ * Resolves a frame-supplied relative path inside the workspace (§7.2): absolute paths and `..`
11
+ * are rejected, and the real path (symlinks resolved) must stay under the real workspace root.
12
+ */
13
+ export async function resolveInside(root, path) {
14
+ if (typeof path !== "string" || path.includes("\0"))
15
+ outside();
16
+ if (isAbsolute(path) || win32.isAbsolute(path))
17
+ outside();
18
+ if (path.split(/[\\/]+/).some((part) => part === ".."))
19
+ outside();
20
+ const realRoot = await realpath(root).catch(() => outside());
21
+ const target = resolve(realRoot, path);
22
+ let real;
23
+ try {
24
+ real = await realpath(target);
25
+ }
26
+ catch {
27
+ throw new SemanticPluginError("not_found");
28
+ }
29
+ const rel = relative(realRoot, real);
30
+ if (rel !== "" && (rel.startsWith("..") || isAbsolute(rel) || rel.split(sep)[0] === ".."))
31
+ outside();
32
+ return real;
33
+ }
34
+ /** Visible entries of a workspace directory: folders first, then files, at most 500. */
35
+ export async function listDirectory(root, dir = "") {
36
+ const real = await resolveInside(root, dir || ".");
37
+ const realRoot = await realpath(root);
38
+ const entries = [];
39
+ for (const entry of await readdir(real, { withFileTypes: true })) {
40
+ if (entry.name.startsWith(".") || entry.name === "node_modules")
41
+ continue;
42
+ const full = join(real, entry.name);
43
+ const info = await stat(full).catch(() => undefined);
44
+ if (!info)
45
+ continue;
46
+ const resolved = await realpath(full).catch(() => undefined);
47
+ if (!resolved || relative(realRoot, resolved).startsWith(".."))
48
+ continue;
49
+ const path = relative(realRoot, full).split(sep).join("/");
50
+ if (info.isDirectory())
51
+ entries.push({ name: entry.name, path, kind: "dir", bytes: 0 });
52
+ else if (info.isFile())
53
+ entries.push({ name: entry.name, path, kind: "file", bytes: info.size });
54
+ if (entries.length >= MAX_ENTRIES)
55
+ break;
56
+ }
57
+ return entries.sort((a, b) => a.kind === b.kind ? a.name.localeCompare(b.name) : a.kind === "dir" ? -1 : 1);
58
+ }
59
+ /** Reads a workspace file after containment and size checks. */
60
+ export async function readInside(root, path) {
61
+ const real = await resolveInside(root, path);
62
+ const handle = await open(real, "r");
63
+ try {
64
+ const info = await handle.stat();
65
+ if (!info.isFile())
66
+ throw new SemanticPluginError("not_found");
67
+ if (info.size > MAX_FILE_BYTES)
68
+ throw new SemanticPluginError("file_too_large");
69
+ return await handle.readFile();
70
+ }
71
+ finally {
72
+ await handle.close();
73
+ }
74
+ }
75
+ //# sourceMappingURL=workspace.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"workspace.js","sourceRoot":"","sources":["../../src/notebook/workspace.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ export interface ZipLimits {
2
+ maxEntries: number;
3
+ maxTotal: number;
4
+ maxEntry: number;
5
+ /** Uncompressed/compressed ratio allowed for entries larger than 1 MiB. */
6
+ maxRatio: number;
7
+ }
8
+ /** §7.3: at most 1 000 entries and 50 MiB uncompressed (spec numbers, kept for .docx). */
9
+ export declare const DOCX_LIMITS: ZipLimits;
10
+ /** Presentations and workbooks hold more parts (slides, notes, media): wider count and total. */
11
+ export declare const OFFICE_LIMITS: ZipLimits;
12
+ export declare class ZipArchive {
13
+ private readonly entries;
14
+ private readonly zip;
15
+ private readonly limits;
16
+ constructor(zip: Buffer, limits: ZipLimits);
17
+ has(name: string): boolean;
18
+ /** Entry bytes, or `zip_invalid` for anything malformed, encrypted or oversized. */
19
+ read(name: string): Buffer;
20
+ /** UTF-8 XML of an entry; a DTD (never used by Office files) is rejected, so no entity expansion. */
21
+ xml(name: string): string;
22
+ }
23
+ /** The five XML entities and numeric references only. */
24
+ export declare const decodeXml: (text: string) => string;
25
+ /** `Target` of every relationship in a `.rels` part, by `Id`, with its `Type`. */
26
+ export declare function relationships(xml: string): Map<string, {
27
+ target: string;
28
+ type: string;
29
+ }>;
30
+ export declare function attributes(text: string): Record<string, string>;
31
+ /** Resolves a relationship target against the folder of its source part; never leaves the zip root. */
32
+ export declare function resolvePart(baseFolder: string, target: string): string;
33
+ //# sourceMappingURL=zip.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.d.ts","sourceRoot":"","sources":["../../src/notebook/zip.ts"],"names":[],"mappings":"AAMA,MAAM,WAAW,SAAS;IACxB,UAAU,EAAE,MAAM,CAAC;IACnB,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,2EAA2E;IAC3E,QAAQ,EAAE,MAAM,CAAC;CAClB;AACD,0FAA0F;AAC1F,eAAO,MAAM,WAAW,EAAE,SAKzB,CAAC;AACF,iGAAiG;AACjG,eAAO,MAAM,aAAa,EAAE,SAK3B,CAAC;AAcF,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAA4B;IACpD,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAS;IAC7B,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IAEnC,YAAY,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAiCzC;IAED,GAAG,CAAC,IAAI,EAAE,MAAM,WAEf;IAED,oFAAoF;IACpF,IAAI,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CA2BzB;IAED,qGAAqG;IACrG,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAIxB;CACF;AAGD,yDAAyD;AACzD,eAAO,MAAM,SAAS,SAAU,MAAM,WAYlC,CAAC;AAEL,kFAAkF;AAClF,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAAC,CAQxF;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAK/D;AAED,uGAAuG;AACvG,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,MAAM,CAUtE"}
@@ -0,0 +1,154 @@
1
+ // Minimal ZIP reader for Office files (.docx, .pptx, .xlsx): central directory + `node:zlib`
2
+ // inflateRaw. Zip-bomb guards: entry count, total declared size, per-entry size (the inflate itself
3
+ // is capped at the declared size) and compression ratio. No ZIP64, no encryption.
4
+ import { inflateRawSync } from "node:zlib";
5
+ import { SemanticPluginError } from "../errors.js";
6
+ /** §7.3: at most 1 000 entries and 50 MiB uncompressed (spec numbers, kept for .docx). */
7
+ export const DOCX_LIMITS = {
8
+ maxEntries: 1000,
9
+ maxTotal: 50 * 1024 * 1024,
10
+ maxEntry: 50 * 1024 * 1024,
11
+ maxRatio: 200,
12
+ };
13
+ /** Presentations and workbooks hold more parts (slides, notes, media): wider count and total. */
14
+ export const OFFICE_LIMITS = {
15
+ maxEntries: 5000,
16
+ maxTotal: 200 * 1024 * 1024,
17
+ maxEntry: 50 * 1024 * 1024,
18
+ maxRatio: 200,
19
+ };
20
+ const bad = () => {
21
+ throw new SemanticPluginError("zip_invalid");
22
+ };
23
+ export class ZipArchive {
24
+ entries = new Map();
25
+ zip;
26
+ limits;
27
+ constructor(zip, limits) {
28
+ this.zip = zip;
29
+ this.limits = limits;
30
+ if (zip.length < 22)
31
+ bad();
32
+ const searchFrom = Math.max(0, zip.length - 65_557);
33
+ let end = -1;
34
+ for (let i = zip.length - 22; i >= searchFrom; i--)
35
+ if (zip.readUInt32LE(i) === 0x06054b50) {
36
+ end = i;
37
+ break;
38
+ }
39
+ if (end < 0)
40
+ bad();
41
+ const count = zip.readUInt16LE(end + 10);
42
+ const size = zip.readUInt32LE(end + 12);
43
+ let at = zip.readUInt32LE(end + 16);
44
+ if (count > limits.maxEntries || count === 0xffff || at === 0xffffffff || at + size > end)
45
+ bad();
46
+ let total = 0;
47
+ for (let n = 0; n < count; n++) {
48
+ if (at + 46 > zip.length || zip.readUInt32LE(at) !== 0x02014b50)
49
+ bad();
50
+ const nameLength = zip.readUInt16LE(at + 28);
51
+ const entry = {
52
+ flags: zip.readUInt16LE(at + 8),
53
+ method: zip.readUInt16LE(at + 10),
54
+ compressed: zip.readUInt32LE(at + 20),
55
+ uncompressed: zip.readUInt32LE(at + 24),
56
+ local: zip.readUInt32LE(at + 42),
57
+ };
58
+ total += entry.uncompressed;
59
+ if (total > limits.maxTotal || entry.uncompressed === 0xffffffff)
60
+ bad();
61
+ this.entries.set(zip.toString("utf8", at + 46, at + 46 + nameLength), entry);
62
+ at += 46 + nameLength + zip.readUInt16LE(at + 30) + zip.readUInt16LE(at + 32);
63
+ }
64
+ }
65
+ has(name) {
66
+ return this.entries.has(name);
67
+ }
68
+ /** Entry bytes, or `zip_invalid` for anything malformed, encrypted or oversized. */
69
+ read(name) {
70
+ const entry = this.entries.get(name) ?? bad();
71
+ const { zip, limits } = this;
72
+ if (entry.flags & 1 || (entry.method !== 0 && entry.method !== 8))
73
+ bad();
74
+ if (entry.uncompressed > limits.maxEntry)
75
+ bad();
76
+ if (entry.uncompressed > 1024 * 1024 &&
77
+ entry.uncompressed / Math.max(1, entry.compressed) > limits.maxRatio)
78
+ bad();
79
+ const local = entry.local;
80
+ if (local + 30 > zip.length || zip.readUInt32LE(local) !== 0x04034b50)
81
+ bad();
82
+ const start = local + 30 + zip.readUInt16LE(local + 26) + zip.readUInt16LE(local + 28);
83
+ if (start + entry.compressed > zip.length)
84
+ bad();
85
+ const data = zip.subarray(start, start + entry.compressed);
86
+ let out;
87
+ try {
88
+ // The declared size is not trusted: the inflate is capped at it.
89
+ out =
90
+ entry.method === 0
91
+ ? Buffer.from(data)
92
+ : inflateRawSync(data, { maxOutputLength: Math.max(1, entry.uncompressed) });
93
+ }
94
+ catch {
95
+ return bad();
96
+ }
97
+ if (out.length !== entry.uncompressed)
98
+ bad();
99
+ return out;
100
+ }
101
+ /** UTF-8 XML of an entry; a DTD (never used by Office files) is rejected, so no entity expansion. */
102
+ xml(name) {
103
+ const text = this.read(name).toString("utf8");
104
+ if (/<!DOCTYPE|<!ENTITY/i.test(text))
105
+ bad();
106
+ return text;
107
+ }
108
+ }
109
+ const ENTITIES = { amp: "&", lt: "<", gt: ">", quot: '"', apos: "'" };
110
+ /** The five XML entities and numeric references only. */
111
+ export const decodeXml = (text) => text.replace(/&(#x[0-9a-f]+|#\d+|[a-z]+);/gi, (match, body) => {
112
+ if (body[0] === "#") {
113
+ const code = body[1] === "x" || body[1] === "X"
114
+ ? Number.parseInt(body.slice(2), 16)
115
+ : Number(body.slice(1));
116
+ return Number.isFinite(code) && code > 0 && code <= 0x10ffff
117
+ ? String.fromCodePoint(code)
118
+ : match;
119
+ }
120
+ return ENTITIES[body.toLowerCase()] ?? match;
121
+ });
122
+ /** `Target` of every relationship in a `.rels` part, by `Id`, with its `Type`. */
123
+ export function relationships(xml) {
124
+ const out = new Map();
125
+ for (const match of xml.matchAll(/<Relationship\b([^>]*)\/?>/g)) {
126
+ const attrs = attributes(match[1]);
127
+ if (attrs.Id && attrs.Target && attrs.TargetMode !== "External")
128
+ out.set(attrs.Id, { target: attrs.Target, type: attrs.Type ?? "" });
129
+ }
130
+ return out;
131
+ }
132
+ export function attributes(text) {
133
+ const out = {};
134
+ for (const m of text.matchAll(/([\w:.-]+)\s*=\s*("([^"]*)"|'([^']*)')/g))
135
+ out[m[1]] = decodeXml(m[3] ?? m[4] ?? "");
136
+ return out;
137
+ }
138
+ /** Resolves a relationship target against the folder of its source part; never leaves the zip root. */
139
+ export function resolvePart(baseFolder, target) {
140
+ const parts = target.startsWith("/") ? [] : baseFolder.split("/").filter(Boolean);
141
+ for (const piece of target.replace(/^\//, "").split("/")) {
142
+ if (piece === "" || piece === ".")
143
+ continue;
144
+ if (piece === "..") {
145
+ if (parts.length === 0)
146
+ bad();
147
+ parts.pop();
148
+ }
149
+ else
150
+ parts.push(piece);
151
+ }
152
+ return parts.join("/");
153
+ }
154
+ //# sourceMappingURL=zip.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zip.js","sourceRoot":"","sources":["../../src/notebook/zip.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ export interface PluginPaths {
2
+ state: string;
3
+ /** Root of model snapshots: `<cache>/models`, else `<state>/models` (D3). */
4
+ models: string;
5
+ /** LanceDB directory (§6.2). */
6
+ lance: string;
7
+ /** Notebook SQLite file (§7.1). */
8
+ notebook: string;
9
+ }
10
+ /** Host paths (Alisio >= 0.11.5); a host without them gets `$XDG_STATE_HOME/alisio/semantic`. */
11
+ export declare function resolvePaths(host: {
12
+ state: string;
13
+ cache: string;
14
+ } | undefined, env?: NodeJS.ProcessEnv): PluginPaths;
15
+ /** Bytes under `dir` (0 when missing); for `/semantic:status` only. */
16
+ export declare function diskUse(dir: string): Promise<number>;
17
+ //# sourceMappingURL=paths.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.d.ts","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAIA,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,6EAA6E;IAC7E,MAAM,EAAE,MAAM,CAAC;IACf,gCAAgC;IAChC,KAAK,EAAE,MAAM,CAAC;IACd,mCAAmC;IACnC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,iGAAiG;AACjG,wBAAgB,YAAY,CAC1B,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,EAClD,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,WAAW,CAUb;AAED,uEAAuE;AACvE,wBAAsB,OAAO,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAU1D"}
package/dist/paths.js ADDED
@@ -0,0 +1,28 @@
1
+ import { readdir, stat } from "node:fs/promises";
2
+ import { homedir } from "node:os";
3
+ import { join } from "node:path";
4
+ /** Host paths (Alisio >= 0.11.5); a host without them gets `$XDG_STATE_HOME/alisio/semantic`. */
5
+ export function resolvePaths(host, env = process.env) {
6
+ const state = host?.state ??
7
+ join(env.XDG_STATE_HOME || join(homedir(), ".local", "state"), "alisio", "semantic");
8
+ return {
9
+ state,
10
+ models: host?.cache ? join(host.cache, "models") : join(state, "models"),
11
+ lance: join(state, "lance"),
12
+ notebook: join(state, "notebook.db"),
13
+ };
14
+ }
15
+ /** Bytes under `dir` (0 when missing); for `/semantic:status` only. */
16
+ export async function diskUse(dir) {
17
+ let total = 0;
18
+ try {
19
+ for (const entry of await readdir(dir, { withFileTypes: true, recursive: true }))
20
+ if (entry.isFile())
21
+ total += (await stat(join(entry.parentPath, entry.name)).catch(() => undefined))?.size ?? 0;
22
+ }
23
+ catch {
24
+ return 0;
25
+ }
26
+ return total;
27
+ }
28
+ //# sourceMappingURL=paths.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"paths.js","sourceRoot":"","sources":["../src/paths.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,kBAAkB,CAAC;AACjD,OAAO,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAYjC,iGAAiG;AACjG,MAAM,UAAU,YAAY,CAC1B,IAAkD,EAClD,GAAG,GAAsB,OAAO,CAAC,GAAG;IAEpC,MAAM,KAAK,GACT,IAAI,EAAE,KAAK;QACX,IAAI,CAAC,GAAG,CAAC,cAAc,IAAI,IAAI,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACvF,OAAO;QACL,KAAK;QACL,MAAM,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,CAAC;QACxE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC;QAC3B,QAAQ,EAAE,IAAI,CAAC,KAAK,EAAE,aAAa,CAAC;KACrC,CAAC;AACJ,CAAC;AAED,uEAAuE;AACvE,MAAM,CAAC,KAAK,UAAU,OAAO,CAAC,GAAW;IACvC,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,IAAI,CAAC;QACH,KAAK,MAAM,KAAK,IAAI,MAAM,OAAO,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC;YAC9E,IAAI,KAAK,CAAC,MAAM,EAAE;gBAChB,KAAK,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,IAAI,IAAI,CAAC,CAAC;IAClG,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,CAAC;IACX,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const VERSION = "0.1.0";
2
+ //# sourceMappingURL=version.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.d.ts","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,OAAO,UAAU,CAAC"}
@@ -0,0 +1,3 @@
1
+ // Updated by scripts/sync-versions.mjs.
2
+ export const VERSION = "0.1.0";
3
+ //# sourceMappingURL=version.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"version.js","sourceRoot":"","sources":["../src/version.ts"],"names":[],"mappings":"AAAA,wCAAwC;AACxC,MAAM,CAAC,MAAM,OAAO,GAAG,OAAO,CAAC"}
package/icon.svg ADDED
@@ -0,0 +1,16 @@
1
+ <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 512 512" width="512" height="512" role="img" aria-label="Semantic">
2
+ <defs>
3
+ <linearGradient id="semantic-icon-bg" x1="0" y1="0" x2="1" y2="1">
4
+ <stop offset="0" stop-color="#0f0b24"/>
5
+ <stop offset="1" stop-color="#3a2384"/>
6
+ </linearGradient>
7
+ </defs>
8
+ <rect width="512" height="512" rx="112" fill="url(#semantic-icon-bg)"/>
9
+ <path d="M96 140 h130 a26 26 0 0 1 26 26 v220 h-130 a26 26 0 0 1 -26 -26 z" fill="#f4f1ff"/>
10
+ <path d="M416 140 h-130 a26 26 0 0 0 -26 26 v220 h130 a26 26 0 0 0 26 -26 z" fill="#e4ddff"/>
11
+ <path d="M128 196 h92 M128 298 h72" stroke="#a79fd0" stroke-width="22" stroke-linecap="round"/>
12
+ <path d="M128 247 h92" stroke="#f5b84a" stroke-width="30" stroke-linecap="round"/>
13
+ <path d="M292 196 h92 M292 298 h92" stroke="#a79fd0" stroke-width="22" stroke-linecap="round"/>
14
+ <path d="M292 247 h70" stroke="#f5b84a" stroke-width="30" stroke-linecap="round"/>
15
+ <circle cx="400" cy="100" r="34" fill="#f5b84a"/>
16
+ </svg>
package/package.json CHANGED
@@ -1,6 +1,65 @@
1
1
  {
2
2
  "name": "@alisio/plugin-semantic",
3
- "version": "0.0.0-stage",
4
- "stub": true,
5
- "description": "Temporary package placeholder for staged publishing"
3
+ "version": "0.1.0",
4
+ "description": "Local semantic search engine for Alisio (LanceDB + multilingual-e5-small on ONNX) plus a Notebook app that answers only from your sources, with citations.",
5
+ "keywords": [
6
+ "alisio-plugin",
7
+ "semantic-search",
8
+ "rag",
9
+ "embeddings",
10
+ "lancedb"
11
+ ],
12
+ "license": "MIT",
13
+ "type": "module",
14
+ "engines": {
15
+ "node": ">=22.16"
16
+ },
17
+ "repository": {
18
+ "type": "git",
19
+ "url": "https://github.com/GustavoGutierrez/alisio-plugins.git",
20
+ "directory": "packages/plugin-semantic"
21
+ },
22
+ "homepage": "https://github.com/GustavoGutierrez/alisio-plugins/tree/main/packages/plugin-semantic",
23
+ "bugs": {
24
+ "url": "https://github.com/GustavoGutierrez/alisio-plugins/issues"
25
+ },
26
+ "exports": {
27
+ ".": {
28
+ "types": "./dist/index.d.ts",
29
+ "import": "./dist/index.js"
30
+ }
31
+ },
32
+ "files": [
33
+ "dist",
34
+ "assets",
35
+ "README.md",
36
+ "README.es.md",
37
+ "LICENSE",
38
+ "THIRD_PARTY_NOTICES.md",
39
+ "cover.svg",
40
+ "icon.svg"
41
+ ],
42
+ "alisio": {
43
+ "icon": "icon.svg"
44
+ },
45
+ "peerDependencies": {
46
+ "@alisio/sdk": ">=0.11.7 <0.12.0"
47
+ },
48
+ "dependencies": {
49
+ "@huggingface/tokenizers": "0.2.0",
50
+ "@lancedb/lancedb": "0.30.0"
51
+ },
52
+ "devDependencies": {
53
+ "@alisio/sdk": "0.11.7",
54
+ "esbuild": "0.28.2",
55
+ "jsdom": "31.0.0",
56
+ "pdfjs-dist": "6.5.438",
57
+ "typescript": "7.0.2",
58
+ "vitest": "5.0.4"
59
+ },
60
+ "scripts": {
61
+ "build": "tsc -p tsconfig.json && node scripts/build-ui.mjs",
62
+ "typecheck": "tsc -p tsconfig.json --noEmit",
63
+ "test": "vitest run"
64
+ }
6
65
  }