@alexkroman1/aai 0.10.2 → 0.10.3

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 (46) hide show
  1. package/dist/_embeddings.d.ts +31 -0
  2. package/dist/_internal-types-IfPcaJd5.js +61 -0
  3. package/dist/_internal-types.js +1 -60
  4. package/dist/_ssrf-DCp_27V4.js +123 -0
  5. package/dist/_ssrf.js +1 -122
  6. package/dist/_utils-DgzpOMSV.js +61 -0
  7. package/dist/_utils.js +1 -60
  8. package/dist/{direct-executor-Ca0wt5H0.js → direct-executor-B-5mq3cu.js} +15 -17
  9. package/dist/index.js +1 -1
  10. package/dist/kv-iXtikQmR.js +32 -0
  11. package/dist/kv.js +1 -31
  12. package/dist/matchers.js +1 -1
  13. package/dist/middleware-core-BwyBIPed.js +107 -0
  14. package/dist/middleware-core.js +1 -106
  15. package/dist/protocol-B-H2Q4ox.js +162 -0
  16. package/dist/protocol.js +1 -161
  17. package/dist/runtime-CxcwaK68.js +58 -0
  18. package/dist/runtime.js +1 -52
  19. package/dist/s2s-M7JqtgFw.js +272 -0
  20. package/dist/s2s.js +1 -271
  21. package/dist/server.d.ts +6 -6
  22. package/dist/server.js +47 -43
  23. package/dist/{session-BkN9u0ni.js → session-BYlwcrya.js} +6 -6
  24. package/dist/session.js +1 -1
  25. package/dist/telemetry-CJlaDFNc.js +95 -0
  26. package/dist/telemetry.js +1 -94
  27. package/dist/{testing-MRl3SXsI.js → testing-BbitshLb.js} +7 -9
  28. package/dist/testing.js +1 -1
  29. package/dist/types-D8ZBxTL_.js +192 -0
  30. package/dist/types.js +1 -191
  31. package/dist/unstorage-kv-CDgP-frt.js +64 -0
  32. package/dist/unstorage-kv.d.ts +33 -0
  33. package/dist/unstorage-kv.js +2 -0
  34. package/dist/unstorage-vector-Cj5llNhg.js +172 -0
  35. package/dist/unstorage-vector.d.ts +47 -0
  36. package/dist/unstorage-vector.js +2 -0
  37. package/dist/vector.d.ts +3 -2
  38. package/dist/worker-entry-2jaiqIj0.js +70 -0
  39. package/dist/worker-entry.js +1 -69
  40. package/dist/ws-handler-C0Q6eSay.js +207 -0
  41. package/dist/ws-handler.js +1 -206
  42. package/package.json +14 -9
  43. package/dist/sqlite-kv.d.ts +0 -34
  44. package/dist/sqlite-kv.js +0 -133
  45. package/dist/sqlite-vector.d.ts +0 -58
  46. package/dist/sqlite-vector.js +0 -149
@@ -1,149 +0,0 @@
1
- import { DatabaseSync } from "node:sqlite";
2
- //#region sqlite-vector.ts
3
- /**
4
- * SQLite-backed vector store with local embeddings.
5
- *
6
- * Persists data across restarts using a local SQLite database file.
7
- * Uses brute-force cosine similarity over `node:sqlite` — no native
8
- * extensions required. Fast enough for local dev (sub-ms for <10k vectors).
9
- * Embeddings are computed locally via `all-MiniLM-L6-v2` (384 dims) —
10
- * no external API key required. The model is downloaded on first use
11
- * (~86 MB) and cached in `.aai/models/`.
12
- */
13
- const DEFAULT_DIMENSIONS = 384;
14
- const DEFAULT_MODEL = "Xenova/all-MiniLM-L6-v2";
15
- /**
16
- * Create a local embedding function using `all-MiniLM-L6-v2`.
17
- *
18
- * The model is downloaded on first use (~86 MB) and cached locally.
19
- * Subsequent calls load from cache in ~90ms. Each embedding takes <2ms.
20
- */
21
- function createLocalEmbedFn(cacheDir) {
22
- let pipelinePromise = null;
23
- async function getPipeline() {
24
- if (!pipelinePromise) pipelinePromise = (async () => {
25
- const { pipeline, env } = await import("@huggingface/transformers");
26
- env.cacheDir = cacheDir;
27
- return pipeline("feature-extraction", DEFAULT_MODEL);
28
- })();
29
- return pipelinePromise;
30
- }
31
- return async (text) => {
32
- const output = await (await getPipeline())(text, {
33
- pooling: "mean",
34
- normalize: true
35
- });
36
- return Array.from(output.data);
37
- };
38
- }
39
- /**
40
- * Create a deterministic hash-based embedding function for testing.
41
- *
42
- * Produces repeatable vectors where similar text yields similar embeddings.
43
- * Not suitable for production — use the default local model instead.
44
- *
45
- * @param dimensions - Vector dimensions (default: 384).
46
- */
47
- function createTestEmbedFn(dimensions = DEFAULT_DIMENSIONS) {
48
- return async (text) => {
49
- const vec = new Float32Array(dimensions);
50
- const words = text.toLowerCase().split(/\s+/).filter(Boolean);
51
- for (const word of words) {
52
- let hash = 0;
53
- for (let i = 0; i < word.length; i++) hash = (hash << 5) - hash + word.charCodeAt(i) | 0;
54
- for (let i = 0; i < 8; i++) {
55
- const idx = Math.abs((hash + i * 31337) % dimensions);
56
- vec[idx] = (vec[idx] ?? 0) + 1;
57
- }
58
- }
59
- let norm = 0;
60
- for (let i = 0; i < dimensions; i++) norm += (vec[i] ?? 0) * (vec[i] ?? 0);
61
- norm = Math.sqrt(norm) || 1;
62
- return Array.from(vec, (v) => v / norm);
63
- };
64
- }
65
- /** Cosine similarity between two vectors stored as Buffers of float32. */
66
- function cosineSimilarity(a, b) {
67
- const fa = new Float32Array(a.buffer, a.byteOffset, a.byteLength / 4);
68
- const fb = new Float32Array(b.buffer, b.byteOffset, b.byteLength / 4);
69
- let dot = 0;
70
- let normA = 0;
71
- let normB = 0;
72
- for (let i = 0; i < fa.length; i++) {
73
- const ai = fa[i] ?? 0;
74
- const bi = fb[i] ?? 0;
75
- dot += ai * bi;
76
- normA += ai * ai;
77
- normB += bi * bi;
78
- }
79
- const denom = Math.sqrt(normA) * Math.sqrt(normB);
80
- return denom === 0 ? 0 : dot / denom;
81
- }
82
- /**
83
- * Create a SQLite-backed vector store with local embeddings.
84
- *
85
- * Data persists to a local SQLite file (default: `.aai/vectors.db`).
86
- * Embeddings are computed locally using `all-MiniLM-L6-v2` by default —
87
- * no API key required. The model auto-downloads on first use (~86 MB).
88
- *
89
- * Vector search uses brute-force cosine similarity over all stored
90
- * embeddings. This is fast for local dev workloads (<10k vectors).
91
- *
92
- * @param options - See {@link SqliteVecVectorStoreOptions}.
93
- * @returns A {@link VectorStore} instance.
94
- *
95
- * @example
96
- * ```ts
97
- * import { createSqliteVectorStore } from "@alexkroman1/aai/sqlite-vector";
98
- *
99
- * const vector = createSqliteVectorStore();
100
- * await vector.upsert("doc-1", "The capital of France is Paris.");
101
- * const results = await vector.query("France capital");
102
- * ```
103
- */
104
- function createSqliteVectorStore(options) {
105
- const dbPath = options?.path ?? ".aai/vectors.db";
106
- const cacheDir = options?.modelCacheDir ?? ".aai/models";
107
- const embedFn = options?.embedFn ?? createLocalEmbedFn(cacheDir);
108
- const db = new DatabaseSync(dbPath);
109
- db.exec("PRAGMA journal_mode = WAL");
110
- db.exec(`
111
- CREATE TABLE IF NOT EXISTS vectors (
112
- id TEXT PRIMARY KEY,
113
- data TEXT NOT NULL,
114
- metadata TEXT NOT NULL DEFAULT '',
115
- embedding BLOB NOT NULL
116
- )
117
- `);
118
- const stmtUpsert = db.prepare("INSERT OR REPLACE INTO vectors (id, data, metadata, embedding) VALUES (?, ?, ?, ?)");
119
- const stmtDelete = db.prepare("DELETE FROM vectors WHERE id = ?");
120
- const stmtAll = db.prepare("SELECT id, data, metadata, embedding FROM vectors");
121
- return {
122
- async upsert(id, data, metadata) {
123
- const vector = await embedFn(data);
124
- const embedding = Buffer.from(new Float32Array(vector).buffer);
125
- const metaJson = metadata ? JSON.stringify(metadata) : "";
126
- stmtUpsert.run(id, data, metaJson, embedding);
127
- },
128
- async query(text, queryOptions) {
129
- const topK = queryOptions?.topK ?? 10;
130
- if (!text.trim()) return [];
131
- const queryVec = await embedFn(text);
132
- const queryBuf = Buffer.from(new Float32Array(queryVec).buffer);
133
- const scored = stmtAll.all().map((row) => ({
134
- id: row.id,
135
- score: cosineSimilarity(queryBuf, row.embedding),
136
- data: row.data,
137
- metadata: row.metadata && row.metadata !== "" ? JSON.parse(row.metadata) : void 0
138
- }));
139
- scored.sort((a, b) => b.score - a.score);
140
- return scored.slice(0, topK);
141
- },
142
- async delete(ids) {
143
- const idArray = Array.isArray(ids) ? ids : [ids];
144
- for (const id of idArray) stmtDelete.run(id);
145
- }
146
- };
147
- }
148
- //#endregion
149
- export { createSqliteVectorStore, createTestEmbedFn };