agent-working-memory 0.7.17 → 0.8.6

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 (188) hide show
  1. package/README.md +156 -15
  2. package/dist/adapters/common.d.ts.map +1 -1
  3. package/dist/adapters/common.js +289 -202
  4. package/dist/adapters/common.js.map +1 -1
  5. package/dist/adapters/http.js +22 -22
  6. package/dist/api/routes.d.ts +1 -1
  7. package/dist/api/routes.d.ts.map +1 -1
  8. package/dist/api/routes.js +258 -79
  9. package/dist/api/routes.js.map +1 -1
  10. package/dist/cli/migrate.d.ts +42 -0
  11. package/dist/cli/migrate.d.ts.map +1 -0
  12. package/dist/cli/migrate.js +268 -0
  13. package/dist/cli/migrate.js.map +1 -0
  14. package/dist/cli.js +147 -103
  15. package/dist/cli.js.map +1 -1
  16. package/dist/coordination/circuit-breaker.d.ts +24 -0
  17. package/dist/coordination/circuit-breaker.d.ts.map +1 -0
  18. package/dist/coordination/circuit-breaker.js +70 -0
  19. package/dist/coordination/circuit-breaker.js.map +1 -0
  20. package/dist/coordination/failure-modes.d.ts +21 -0
  21. package/dist/coordination/failure-modes.d.ts.map +1 -0
  22. package/dist/coordination/failure-modes.js +49 -0
  23. package/dist/coordination/failure-modes.js.map +1 -0
  24. package/dist/coordination/peer-decisions.js +7 -7
  25. package/dist/coordination/routes.d.ts.map +1 -1
  26. package/dist/coordination/routes.js +44 -1
  27. package/dist/coordination/routes.js.map +1 -1
  28. package/dist/coordination/schema.d.ts.map +1 -1
  29. package/dist/coordination/schema.js +18 -0
  30. package/dist/coordination/schema.js.map +1 -1
  31. package/dist/coordination/schemas.d.ts +9 -9
  32. package/dist/coordination/stale.d.ts +9 -1
  33. package/dist/coordination/stale.d.ts.map +1 -1
  34. package/dist/coordination/stale.js +53 -9
  35. package/dist/coordination/stale.js.map +1 -1
  36. package/dist/core/embeddings.d.ts +16 -10
  37. package/dist/core/embeddings.d.ts.map +1 -1
  38. package/dist/core/embeddings.js +54 -38
  39. package/dist/core/embeddings.js.map +1 -1
  40. package/dist/core/ml-worker-entry.d.ts +17 -0
  41. package/dist/core/ml-worker-entry.d.ts.map +1 -0
  42. package/dist/core/ml-worker-entry.js +193 -0
  43. package/dist/core/ml-worker-entry.js.map +1 -0
  44. package/dist/core/ml-worker.d.ts +59 -0
  45. package/dist/core/ml-worker.d.ts.map +1 -0
  46. package/dist/core/ml-worker.js +253 -0
  47. package/dist/core/ml-worker.js.map +1 -0
  48. package/dist/core/query-expander.d.ts +13 -15
  49. package/dist/core/query-expander.d.ts.map +1 -1
  50. package/dist/core/query-expander.js +48 -54
  51. package/dist/core/query-expander.js.map +1 -1
  52. package/dist/core/reranker.d.ts +9 -19
  53. package/dist/core/reranker.d.ts.map +1 -1
  54. package/dist/core/reranker.js +33 -35
  55. package/dist/core/reranker.js.map +1 -1
  56. package/dist/core/salience.d.ts +32 -5
  57. package/dist/core/salience.d.ts.map +1 -1
  58. package/dist/core/salience.js +201 -28
  59. package/dist/core/salience.js.map +1 -1
  60. package/dist/core/write-pipeline.d.ts +10 -2
  61. package/dist/core/write-pipeline.d.ts.map +1 -1
  62. package/dist/core/write-pipeline.js +218 -49
  63. package/dist/core/write-pipeline.js.map +1 -1
  64. package/dist/engine/activation.d.ts +2 -2
  65. package/dist/engine/activation.d.ts.map +1 -1
  66. package/dist/engine/activation.js +238 -115
  67. package/dist/engine/activation.js.map +1 -1
  68. package/dist/engine/confidence.d.ts +62 -0
  69. package/dist/engine/confidence.d.ts.map +1 -0
  70. package/dist/engine/confidence.js +100 -0
  71. package/dist/engine/confidence.js.map +1 -0
  72. package/dist/engine/connections.d.ts +47 -8
  73. package/dist/engine/connections.d.ts.map +1 -1
  74. package/dist/engine/connections.js +83 -22
  75. package/dist/engine/connections.js.map +1 -1
  76. package/dist/engine/consolidation-scheduler.d.ts +46 -10
  77. package/dist/engine/consolidation-scheduler.d.ts.map +1 -1
  78. package/dist/engine/consolidation-scheduler.js +170 -50
  79. package/dist/engine/consolidation-scheduler.js.map +1 -1
  80. package/dist/engine/consolidation.d.ts +16 -2
  81. package/dist/engine/consolidation.d.ts.map +1 -1
  82. package/dist/engine/consolidation.js +143 -44
  83. package/dist/engine/consolidation.js.map +1 -1
  84. package/dist/engine/eval.d.ts +2 -2
  85. package/dist/engine/eval.d.ts.map +1 -1
  86. package/dist/engine/eval.js +9 -9
  87. package/dist/engine/eval.js.map +1 -1
  88. package/dist/engine/eviction.d.ts +4 -4
  89. package/dist/engine/eviction.d.ts.map +1 -1
  90. package/dist/engine/eviction.js +15 -15
  91. package/dist/engine/eviction.js.map +1 -1
  92. package/dist/engine/retraction.d.ts +93 -5
  93. package/dist/engine/retraction.d.ts.map +1 -1
  94. package/dist/engine/retraction.js +238 -19
  95. package/dist/engine/retraction.js.map +1 -1
  96. package/dist/engine/staging.d.ts +1 -1
  97. package/dist/engine/staging.d.ts.map +1 -1
  98. package/dist/engine/staging.js +3 -3
  99. package/dist/engine/staging.js.map +1 -1
  100. package/dist/hooks/sidecar.d.ts +1 -1
  101. package/dist/hooks/sidecar.d.ts.map +1 -1
  102. package/dist/hooks/sidecar.js +4 -4
  103. package/dist/hooks/sidecar.js.map +1 -1
  104. package/dist/index.js +48 -31
  105. package/dist/index.js.map +1 -1
  106. package/dist/mcp.js +167 -141
  107. package/dist/mcp.js.map +1 -1
  108. package/dist/storage/factory.d.ts +55 -0
  109. package/dist/storage/factory.d.ts.map +1 -0
  110. package/dist/storage/factory.js +135 -0
  111. package/dist/storage/factory.js.map +1 -0
  112. package/dist/storage/pglite-schema.d.ts +20 -0
  113. package/dist/storage/pglite-schema.d.ts.map +1 -0
  114. package/dist/storage/pglite-schema.js +165 -0
  115. package/dist/storage/pglite-schema.js.map +1 -0
  116. package/dist/storage/pglite.d.ts +187 -0
  117. package/dist/storage/pglite.d.ts.map +1 -0
  118. package/dist/storage/pglite.js +1114 -0
  119. package/dist/storage/pglite.js.map +1 -0
  120. package/dist/storage/sqlite.d.ts +117 -0
  121. package/dist/storage/sqlite.d.ts.map +1 -1
  122. package/dist/storage/sqlite.js +357 -8
  123. package/dist/storage/sqlite.js.map +1 -1
  124. package/dist/storage/store.d.ts +63 -0
  125. package/dist/storage/store.d.ts.map +1 -0
  126. package/dist/storage/store.js +27 -0
  127. package/dist/storage/store.js.map +1 -0
  128. package/dist/types/engram.d.ts +92 -2
  129. package/dist/types/engram.d.ts.map +1 -1
  130. package/dist/types/engram.js.map +1 -1
  131. package/package.json +3 -1
  132. package/src/adapters/claude-code.ts +218 -218
  133. package/src/adapters/codex.ts +252 -252
  134. package/src/adapters/common.ts +498 -411
  135. package/src/adapters/cursor.ts +135 -135
  136. package/src/adapters/http.ts +93 -93
  137. package/src/adapters/index.ts +31 -31
  138. package/src/adapters/types.ts +75 -75
  139. package/src/api/index.ts +3 -3
  140. package/src/api/routes.ts +970 -714
  141. package/src/cli/migrate.ts +307 -0
  142. package/src/cli.ts +755 -719
  143. package/src/coordination/circuit-breaker.ts +83 -0
  144. package/src/coordination/events.ts +90 -90
  145. package/src/coordination/failure-modes.ts +50 -0
  146. package/src/coordination/peer-decisions.ts +105 -105
  147. package/src/coordination/plugin-loader.ts +60 -60
  148. package/src/coordination/plugin.ts +44 -44
  149. package/src/coordination/routes.ts +56 -1
  150. package/src/coordination/schema.ts +13 -0
  151. package/src/coordination/stale.ts +80 -11
  152. package/src/coordination/types.ts +311 -311
  153. package/src/coordination/write-mutex.ts +69 -69
  154. package/src/core/auto-tagger.ts +168 -168
  155. package/src/core/decay.ts +63 -63
  156. package/src/core/embeddings.ts +110 -93
  157. package/src/core/index.ts +5 -5
  158. package/src/core/logger.ts +36 -36
  159. package/src/core/ml-worker-entry.ts +194 -0
  160. package/src/core/ml-worker.ts +281 -0
  161. package/src/core/query-expander.ts +122 -128
  162. package/src/core/reranker.ts +119 -125
  163. package/src/core/salience.ts +200 -33
  164. package/src/core/write-pipeline.ts +521 -343
  165. package/src/engine/activation.ts +235 -109
  166. package/src/engine/confidence.ts +120 -0
  167. package/src/engine/connections.ts +162 -103
  168. package/src/engine/consolidation-scheduler.ts +242 -125
  169. package/src/engine/consolidation.ts +138 -45
  170. package/src/engine/eval.ts +102 -102
  171. package/src/engine/eviction.ts +101 -101
  172. package/src/engine/index.ts +8 -8
  173. package/src/engine/retraction.ts +366 -116
  174. package/src/engine/staging.ts +74 -74
  175. package/src/hooks/sidecar.ts +5 -5
  176. package/src/index.ts +226 -212
  177. package/src/mcp.ts +1145 -1121
  178. package/src/storage/factory.ts +147 -0
  179. package/src/storage/index.ts +3 -3
  180. package/src/storage/pglite-schema.ts +166 -0
  181. package/src/storage/pglite.ts +1363 -0
  182. package/src/storage/sqlite.ts +402 -7
  183. package/src/storage/store.ts +80 -0
  184. package/src/types/agent.ts +67 -67
  185. package/src/types/checkpoint.ts +46 -46
  186. package/src/types/engram.ts +101 -3
  187. package/src/types/eval.ts +100 -100
  188. package/src/types/index.ts +6 -6
@@ -0,0 +1,253 @@
1
+ // Copyright 2026 Robert Winter / Complete Ideas
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * ML inference dispatch pool.
5
+ *
6
+ * STATUS (AWM 0.8.x P1 REVISE, 2026-05-25): worker_threads were the original
7
+ * plan, but @huggingface/transformers in Node only supports the `cpu`
8
+ * (native ONNX) and `dml` (Windows GPU) backends. Neither is safe inside
9
+ * a worker_thread — onnxruntime-node's native bindings store V8 handles
10
+ * that get invalidated when crossing isolate boundaries, causing
11
+ * `v8::HandleScope::CreateHandle()` crashes on first inference call.
12
+ * The browser-only `wasm` backend is not loaded in Node builds of
13
+ * transformers.js.
14
+ *
15
+ * The dispatch abstraction is preserved so a future child_process pool
16
+ * or HTTP sidecar (see AWM_ML_SIDECAR_URL design in docs/awm-architecture-history.md)
17
+ * can plug in. For now ALL inference runs in-process. The freeze fix from
18
+ * P0 (sleep-only consolidation) already eliminates the multi-second
19
+ * in-band blocks. Individual inference calls (~50ms each) on the main
20
+ * thread are accepted as-is.
21
+ *
22
+ * Test / dev mode: AWM_ML_INPROCESS=1 is honored but is now the default.
23
+ * The env var remains as a no-op for backwards compatibility.
24
+ */
25
+ import { Worker } from 'node:worker_threads';
26
+ import { fileURLToPath } from 'node:url';
27
+ import { dirname, join } from 'node:path';
28
+ import { existsSync } from 'node:fs';
29
+ let inProcessMode = false;
30
+ let workers = null;
31
+ let nextId = 1;
32
+ // In-process fallback handles (used in tests and as crash escape hatch).
33
+ let inProcessEmbed = null;
34
+ let inProcessRerank = null;
35
+ let inProcessExpand = null;
36
+ const REQUEST_TIMEOUT_MS = 60_000; // any single inference call > 60s is treated as failed
37
+ const MAX_RESTARTS_PER_MINUTE = 3;
38
+ function shouldUseInProcess() {
39
+ // AWM 0.8.x P1 REVISE: worker_threads were removed because @huggingface/transformers
40
+ // in Node is not worker_threads-safe (see file header). Always in-process for now.
41
+ // The dispatch abstraction is preserved for a future child_process pool or
42
+ // HTTP sidecar pivot.
43
+ return true;
44
+ }
45
+ function createWorker(role) {
46
+ const m = {
47
+ role,
48
+ worker: null,
49
+ ready: Promise.resolve(),
50
+ setReady: () => { },
51
+ setFailed: () => { },
52
+ pending: new Map(),
53
+ buffered: [],
54
+ isReady: false,
55
+ restartTimestamps: [],
56
+ };
57
+ m.ready = new Promise((resolve, reject) => {
58
+ m.setReady = () => { m.isReady = true; resolve(); };
59
+ m.setFailed = (err) => reject(err);
60
+ });
61
+ spawnWorker(m);
62
+ return m;
63
+ }
64
+ function workerEntryPath() {
65
+ // Resolve to the compiled .js. Two possible locations:
66
+ // 1. Same directory as this file (when running from dist/core/)
67
+ // 2. Sibling dist/core/ (when running from src/core/ via tsx)
68
+ // Always prefer the compiled file. If neither exists, shouldUseInProcess()
69
+ // will detect the missing entry and fall back to in-process mode.
70
+ const here = dirname(fileURLToPath(import.meta.url));
71
+ const samedir = join(here, 'ml-worker-entry.js');
72
+ if (existsSync(samedir))
73
+ return samedir;
74
+ // From src/core/ml-worker.ts, dist/core/ml-worker-entry.js is at ../../dist/core/
75
+ const distSibling = join(here, '..', '..', 'dist', 'core', 'ml-worker-entry.js');
76
+ if (existsSync(distSibling))
77
+ return distSibling;
78
+ // Fallback to the same-dir path (will fail existsSync in shouldUseInProcess
79
+ // and trigger in-process mode)
80
+ return samedir;
81
+ }
82
+ function spawnWorker(m) {
83
+ const w = new Worker(workerEntryPath(), { workerData: { role: m.role } });
84
+ m.worker = w;
85
+ w.on('message', (msg) => {
86
+ if (msg?.ready === true) {
87
+ m.setReady();
88
+ // Drain buffered messages
89
+ for (const buf of m.buffered)
90
+ w.postMessage(buf);
91
+ m.buffered = [];
92
+ return;
93
+ }
94
+ if (msg?.ready === false) {
95
+ m.setFailed(new Error(`worker ${m.role} failed to load model: ${msg.error}`));
96
+ return;
97
+ }
98
+ if (msg?.shutdown === 'done')
99
+ return;
100
+ if (typeof msg?.id !== 'number')
101
+ return;
102
+ const p = m.pending.get(msg.id);
103
+ if (!p)
104
+ return;
105
+ m.pending.delete(msg.id);
106
+ if (p.timeoutHandle)
107
+ clearTimeout(p.timeoutHandle);
108
+ if (msg.ok)
109
+ p.resolve(msg.result);
110
+ else
111
+ p.reject(new Error(msg.error ?? 'worker error'));
112
+ });
113
+ w.on('error', (err) => {
114
+ console.error(`[ml-worker:${m.role}] error:`, err);
115
+ });
116
+ w.on('exit', (code) => {
117
+ if (code === 0)
118
+ return; // graceful exit
119
+ console.warn(`[ml-worker:${m.role}] exited with code ${code} — recovering`);
120
+ // Reject all pending requests
121
+ for (const [, p] of m.pending) {
122
+ if (p.timeoutHandle)
123
+ clearTimeout(p.timeoutHandle);
124
+ p.reject(new Error(`worker ${m.role} crashed (exit ${code})`));
125
+ }
126
+ m.pending.clear();
127
+ // Restart-rate backoff
128
+ const now = Date.now();
129
+ m.restartTimestamps = m.restartTimestamps.filter(t => now - t < 60_000);
130
+ m.restartTimestamps.push(now);
131
+ if (m.restartTimestamps.length > MAX_RESTARTS_PER_MINUTE) {
132
+ console.error(`[ml-worker:${m.role}] crashed ${m.restartTimestamps.length} times in 60s — falling back to in-process`);
133
+ m.worker = null;
134
+ m.isReady = false;
135
+ inProcessMode = true;
136
+ return;
137
+ }
138
+ // Reset ready promise + respawn
139
+ m.isReady = false;
140
+ m.ready = new Promise((resolve, reject) => {
141
+ m.setReady = () => { m.isReady = true; resolve(); };
142
+ m.setFailed = (err) => reject(err);
143
+ });
144
+ spawnWorker(m);
145
+ });
146
+ }
147
+ /** Initialize the pool. Idempotent — safe to call multiple times. */
148
+ export function initMLPool() {
149
+ if (shouldUseInProcess()) {
150
+ inProcessMode = true;
151
+ return;
152
+ }
153
+ if (workers)
154
+ return;
155
+ workers = {
156
+ embed: createWorker('embed'),
157
+ rerank: createWorker('rerank'),
158
+ expand: createWorker('expand'),
159
+ };
160
+ }
161
+ /** Register in-process fallback handlers. Called once by the consumer modules. */
162
+ export function registerInProcessHandlers(handlers) {
163
+ if (handlers.embed)
164
+ inProcessEmbed = handlers.embed;
165
+ if (handlers.rerank)
166
+ inProcessRerank = handlers.rerank;
167
+ if (handlers.expand)
168
+ inProcessExpand = handlers.expand;
169
+ }
170
+ /** True if the pool is operating in in-process mode (no workers). */
171
+ export function isInProcessMode() {
172
+ return inProcessMode;
173
+ }
174
+ async function dispatchToWorker(role, args) {
175
+ if (!workers)
176
+ initMLPool();
177
+ if (inProcessMode) {
178
+ return dispatchInProcess(role, args);
179
+ }
180
+ const m = workers[role];
181
+ await m.ready;
182
+ if (inProcessMode) {
183
+ // Fallback flipped while we awaited ready
184
+ return dispatchInProcess(role, args);
185
+ }
186
+ const id = nextId++;
187
+ return new Promise((resolve, reject) => {
188
+ const req = {
189
+ resolve,
190
+ reject,
191
+ timeoutHandle: setTimeout(() => {
192
+ m.pending.delete(id);
193
+ reject(new Error(`ml-worker:${role} request ${id} timed out after ${REQUEST_TIMEOUT_MS}ms`));
194
+ }, REQUEST_TIMEOUT_MS),
195
+ };
196
+ m.pending.set(id, req);
197
+ const msg = { id, op: role, args };
198
+ if (m.isReady && m.worker) {
199
+ m.worker.postMessage(msg);
200
+ }
201
+ else {
202
+ m.buffered.push(msg);
203
+ }
204
+ });
205
+ }
206
+ async function dispatchInProcess(role, args) {
207
+ switch (role) {
208
+ case 'embed':
209
+ if (!inProcessEmbed)
210
+ throw new Error('in-process embed handler not registered');
211
+ return inProcessEmbed(args);
212
+ case 'rerank':
213
+ if (!inProcessRerank)
214
+ throw new Error('in-process rerank handler not registered');
215
+ return inProcessRerank(args);
216
+ case 'expand':
217
+ if (!inProcessExpand)
218
+ throw new Error('in-process expand handler not registered');
219
+ return inProcessExpand(args);
220
+ }
221
+ }
222
+ // --- Public API used by the consumer modules ---
223
+ export async function dispatchEmbed(args) {
224
+ return dispatchToWorker('embed', args);
225
+ }
226
+ export async function dispatchRerank(args) {
227
+ return dispatchToWorker('rerank', args);
228
+ }
229
+ export async function dispatchExpand(args) {
230
+ return dispatchToWorker('expand', args);
231
+ }
232
+ /** Graceful shutdown. Waits up to 2s for queue drain, then terminates. */
233
+ export async function shutdownMLPool() {
234
+ if (!workers)
235
+ return;
236
+ const promises = [];
237
+ for (const role of ['embed', 'rerank', 'expand']) {
238
+ const m = workers[role];
239
+ if (!m.worker)
240
+ continue;
241
+ const w = m.worker;
242
+ promises.push(new Promise((resolve) => {
243
+ const timeout = setTimeout(() => {
244
+ w.terminate().finally(() => resolve());
245
+ }, 2000);
246
+ w.once('exit', () => { clearTimeout(timeout); resolve(); });
247
+ w.postMessage({ shutdown: true });
248
+ }));
249
+ }
250
+ await Promise.all(promises);
251
+ workers = null;
252
+ }
253
+ //# sourceMappingURL=ml-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ml-worker.js","sourceRoot":"","sources":["../../src/core/ml-worker.ts"],"names":[],"mappings":"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"}
@@ -1,31 +1,29 @@
1
1
  /**
2
- * Query Expander rewrites queries with synonyms and related terms.
2
+ * Query Expander - rewrites queries with synonyms and related terms.
3
3
  *
4
- * Uses Xenova/flan-t5-small (~80MB ONNX) to expand search queries
5
- * with related terms that improve BM25 recall.
4
+ * Uses Xenova/flan-t5-small (~80MB ONNX) to expand search queries with
5
+ * related terms that improve BM25 recall.
6
6
  *
7
- * Example: "What is Caroline's identity?"
8
- * "What is Caroline's identity? Caroline personal gender transgender self"
7
+ * AWM 0.8.x: inference dispatches through ml-worker.ts (currently in-process
8
+ * worker_threads reverted because onnxruntime-node bindings cross isolate
9
+ * boundaries unsafely; see ml-worker.ts). The dispatch abstraction is
10
+ * preserved for a future child_process / HTTP sidecar pool.
9
11
  *
10
- * Singleton pattern call getExpander() to get the shared instance.
12
+ * The LRU cache + skip heuristic stay on the main thread — they're pure
13
+ * filter/lookup logic that shouldn't pay IPC cost.
11
14
  */
12
15
  import { type Text2TextGenerationPipeline } from '@huggingface/transformers';
13
- /**
14
- * Get or initialize the text generation pipeline (singleton).
15
- * First call downloads the model (~80MB), subsequent calls are instant.
16
- */
16
+ /** Kept for backwards compat. */
17
17
  export declare function getExpander(): Promise<Text2TextGenerationPipeline>;
18
18
  /**
19
19
  * Expand a query with related terms and synonyms.
20
20
  * Returns the original query + generated expansion terms.
21
21
  * Falls back to the original query on any error.
22
22
  *
23
- * Optimization (0.7.11+):
24
- * - Skip heuristic for long/specific queries (~30% of typical agent recalls)
25
- * - LRU cache for repeated queries (cache hit ≈ 0ms vs 164ms cold)
26
- * - Disable both via AWM_DISABLE_EXPANSION_CACHE=1
23
+ * Dispatches inference to the worker pool. Cache + skip heuristic stay
24
+ * on the main thread.
27
25
  */
28
26
  export declare function expandQuery(originalQuery: string): Promise<string>;
29
- /** Clear the expansion cache (used by tests + cache invalidation if needed). */
27
+ /** Clear the expansion cache (used by tests + cache invalidation). */
30
28
  export declare function clearExpansionCache(): void;
31
29
  //# sourceMappingURL=query-expander.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"query-expander.d.ts","sourceRoot":"","sources":["../../src/core/query-expander.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAEH,OAAO,EAAY,KAAK,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAMvF;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,2BAA2B,CAAC,CAaxE;AA6BD;;;;;;;;;GASG;AACH,wBAAsB,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA8CxE;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}
1
+ {"version":3,"file":"query-expander.d.ts","sourceRoot":"","sources":["../../src/core/query-expander.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAY,KAAK,2BAA2B,EAAE,MAAM,2BAA2B,CAAC;AAmCvF,iCAAiC;AACjC,wBAAsB,WAAW,IAAI,OAAO,CAAC,2BAA2B,CAAC,CAExE;AAmBD;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAAC,aAAa,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkCxE;AAED,sEAAsE;AACtE,wBAAgB,mBAAmB,IAAI,IAAI,CAE1C"}
@@ -1,62 +1,66 @@
1
1
  // Copyright 2026 Robert Winter / Complete Ideas
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  /**
4
- * Query Expander rewrites queries with synonyms and related terms.
4
+ * Query Expander - rewrites queries with synonyms and related terms.
5
5
  *
6
- * Uses Xenova/flan-t5-small (~80MB ONNX) to expand search queries
7
- * with related terms that improve BM25 recall.
6
+ * Uses Xenova/flan-t5-small (~80MB ONNX) to expand search queries with
7
+ * related terms that improve BM25 recall.
8
8
  *
9
- * Example: "What is Caroline's identity?"
10
- * "What is Caroline's identity? Caroline personal gender transgender self"
9
+ * AWM 0.8.x: inference dispatches through ml-worker.ts (currently in-process
10
+ * worker_threads reverted because onnxruntime-node bindings cross isolate
11
+ * boundaries unsafely; see ml-worker.ts). The dispatch abstraction is
12
+ * preserved for a future child_process / HTTP sidecar pool.
11
13
  *
12
- * Singleton pattern call getExpander() to get the shared instance.
14
+ * The LRU cache + skip heuristic stay on the main thread — they're pure
15
+ * filter/lookup logic that shouldn't pay IPC cost.
13
16
  */
14
17
  import { pipeline } from '@huggingface/transformers';
18
+ import { dispatchExpand, registerInProcessHandlers } from './ml-worker.js';
15
19
  const MODEL_ID = 'Xenova/flan-t5-small';
16
- let instance = null;
17
- let initPromise = null;
18
- /**
19
- * Get or initialize the text generation pipeline (singleton).
20
- * First call downloads the model (~80MB), subsequent calls are instant.
21
- */
22
- export async function getExpander() {
23
- if (instance)
24
- return instance;
25
- if (initPromise)
26
- return initPromise;
27
- initPromise = pipeline('text2text-generation', MODEL_ID, {
28
- dtype: 'fp32',
29
- }).then(pipe => {
30
- instance = pipe;
31
- console.log(`Query expander loaded: ${MODEL_ID}`);
32
- return instance;
20
+ // --- In-process fallback ---
21
+ let inProcessInstance = null;
22
+ let inProcessInitPromise = null;
23
+ async function loadInProcess() {
24
+ if (inProcessInstance)
25
+ return inProcessInstance;
26
+ if (inProcessInitPromise)
27
+ return inProcessInitPromise;
28
+ inProcessInitPromise = pipeline('text2text-generation', MODEL_ID, { dtype: 'fp32' }).then(pipe => {
29
+ inProcessInstance = pipe;
30
+ console.log(`Query expander loaded in-process: ${MODEL_ID}`);
31
+ return inProcessInstance;
32
+ });
33
+ return inProcessInitPromise;
34
+ }
35
+ async function inProcessExpand(args) {
36
+ const expander = await loadInProcess();
37
+ const result = await expander(args.prompt, {
38
+ max_new_tokens: args.maxNewTokens,
39
+ no_repeat_ngram_size: args.noRepeatNgramSize,
33
40
  });
34
- return initPromise;
41
+ const text = Array.isArray(result) ? result[0]?.generated_text ?? '' : '';
42
+ return String(text).trim();
43
+ }
44
+ registerInProcessHandlers({ expand: inProcessExpand });
45
+ // --- Public API ---
46
+ /** Kept for backwards compat. */
47
+ export async function getExpander() {
48
+ return loadInProcess();
35
49
  }
36
50
  /**
37
51
  * LRU cache of normalized-query → expanded-query mappings.
38
- * Map preserves insertion orderre-set on hit moves entry to the end (most-recent),
39
- * delete-first when over capacity drops the least-recent. ~500 entries × ~200 chars
40
- * each ≈ 100KB, negligible memory cost.
41
- *
42
- * Why: phase-breakdown spike (2026-05-08) showed expandQuery at ~164ms per call.
43
- * Agent recall patterns repeat — cache hits are common.
52
+ * Lives on the main thread cache hits skip the worker IPC entirely.
44
53
  */
45
54
  const expansionCache = new Map();
46
55
  const EXPANSION_CACHE_LIMIT = 500;
47
56
  /**
48
- * Heuristic: skip expansion when the query is already specific.
49
- * Long, multi-token queries don't benefit from synonyms — they're already
50
- * narrow enough that flan-t5's general-vocabulary expansion adds noise more
51
- * than recall. Exact thresholds are conservative; false-skips would only
52
- * affect candidates that BM25 catches anyway.
57
+ * Skip expansion when the query is already specific (long or many tokens).
53
58
  */
54
59
  function shouldSkipExpansion(normalized) {
55
60
  if (normalized.length === 0)
56
61
  return true;
57
62
  if (normalized.length > 50)
58
63
  return true;
59
- // ≥5 distinct meaningful tokens = already specific
60
64
  const tokens = new Set(normalized.split(/\s+/).filter(t => t.length > 2));
61
65
  return tokens.size >= 5;
62
66
  }
@@ -65,39 +69,29 @@ function shouldSkipExpansion(normalized) {
65
69
  * Returns the original query + generated expansion terms.
66
70
  * Falls back to the original query on any error.
67
71
  *
68
- * Optimization (0.7.11+):
69
- * - Skip heuristic for long/specific queries (~30% of typical agent recalls)
70
- * - LRU cache for repeated queries (cache hit ≈ 0ms vs 164ms cold)
71
- * - Disable both via AWM_DISABLE_EXPANSION_CACHE=1
72
+ * Dispatches inference to the worker pool. Cache + skip heuristic stay
73
+ * on the main thread.
72
74
  */
73
75
  export async function expandQuery(originalQuery) {
74
76
  const normalized = originalQuery.toLowerCase().trim();
75
77
  const optimizationsEnabled = process.env.AWM_DISABLE_EXPANSION_CACHE !== '1';
76
78
  if (optimizationsEnabled) {
77
- if (shouldSkipExpansion(normalized)) {
79
+ if (shouldSkipExpansion(normalized))
78
80
  return originalQuery;
79
- }
80
81
  const cached = expansionCache.get(normalized);
81
82
  if (cached !== undefined) {
82
- // Move to end (most-recent) for LRU semantics
83
+ // LRU touch
83
84
  expansionCache.delete(normalized);
84
85
  expansionCache.set(normalized, cached);
85
86
  return cached;
86
87
  }
87
88
  }
88
89
  try {
89
- const expander = await getExpander();
90
90
  const prompt = `Expand this search query with synonyms and related terms. Only output the additional terms, not the original query. Query: ${originalQuery}. Additional terms:`;
91
- const result = await expander(prompt, {
92
- max_new_tokens: 25,
93
- no_repeat_ngram_size: 2,
94
- });
95
- const expanded = Array.isArray(result) ? result[0]?.generated_text ?? '' : '';
96
- const cleanExpanded = expanded.trim();
97
- const finalQuery = cleanExpanded && cleanExpanded.length > 2
98
- ? `${originalQuery} ${cleanExpanded}`
91
+ const expansion = await dispatchExpand({ prompt, maxNewTokens: 25, noRepeatNgramSize: 2 });
92
+ const finalQuery = expansion && expansion.length > 2
93
+ ? `${originalQuery} ${expansion}`
99
94
  : originalQuery;
100
- // Cache the result (LRU eviction when over capacity)
101
95
  if (optimizationsEnabled) {
102
96
  if (expansionCache.size >= EXPANSION_CACHE_LIMIT) {
103
97
  const oldestKey = expansionCache.keys().next().value;
@@ -112,7 +106,7 @@ export async function expandQuery(originalQuery) {
112
106
  return originalQuery;
113
107
  }
114
108
  }
115
- /** Clear the expansion cache (used by tests + cache invalidation if needed). */
109
+ /** Clear the expansion cache (used by tests + cache invalidation). */
116
110
  export function clearExpansionCache() {
117
111
  expansionCache.clear();
118
112
  }
@@ -1 +1 @@
1
- {"version":3,"file":"query-expander.js","sourceRoot":"","sources":["../../src/core/query-expander.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"query-expander.js","sourceRoot":"","sources":["../../src/core/query-expander.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,15 @@
1
1
  /**
2
- * Cross-Encoder Re-Ranker scores (query, passage) pairs for relevance.
2
+ * Cross-Encoder Re-Ranker - scores (query, passage) pairs for relevance.
3
3
  *
4
- * Uses Xenova/ms-marco-MiniLM-L-6-v2 (~22MB ONNX) which is trained on
5
- * MS-MARCO passage ranking. Unlike bi-encoders, cross-encoders see both
6
- * query and passage together via full attention much better at judging
7
- * if a passage actually answers a question.
4
+ * Uses Xenova/ms-marco-MiniLM-L-6-v2 (~22MB ONNX) trained on MS-MARCO
5
+ * passage ranking. Unlike bi-encoders, cross-encoders see both query and
6
+ * passage together via full attention - much better at judging if a
7
+ * passage actually answers a question.
8
8
  *
9
- * Uses direct tokenizer + model inference (NOT the text-classification
10
- * pipeline, which doesn't support text_pair and returns identical scores).
11
- *
12
- * Singleton pattern — call getReranker() to get the shared instance.
9
+ * AWM 0.8.x: inference dispatches through ml-worker.ts (currently in-process
10
+ * see ml-worker.ts for the worker_threads in-process revert rationale).
13
11
  */
14
- /** Kept for backwards compat — returns the model (unused externally). */
12
+ /** Kept for backwards compat. */
15
13
  export declare function getReranker(): Promise<any>;
16
14
  export interface RerankResult {
17
15
  index: number;
@@ -20,15 +18,7 @@ export interface RerankResult {
20
18
  /**
21
19
  * Re-rank candidate passages against a query using the cross-encoder.
22
20
  * Returns results sorted by relevance score (descending).
23
- *
24
- * Batch inference (0.7.14+): tokenizes all query-passage pairs in one call
25
- * and runs a single model forward pass. Previously the loop tokenized + ran
26
- * the model once per passage, which serialized 15-30 inference calls.
27
- * Batching is roughly 3-5× faster on transformers.js because the
28
- * tokenizer/model overhead amortizes.
29
- *
30
- * Falls back to per-passage scoring if the batch path errors (e.g. model
31
- * doesn't support batched text_pair).
21
+ * Dispatches to the worker pool (or in-process fallback).
32
22
  */
33
23
  export declare function rerank(query: string, passages: string[]): Promise<RerankResult[]>;
34
24
  //# sourceMappingURL=reranker.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"reranker.d.ts","sourceRoot":"","sources":["../../src/core/reranker.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AA8BH,yEAAyE;AACzE,wBAAsB,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,CAGhD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAsB,MAAM,CAC1B,KAAK,EAAE,MAAM,EACb,QAAQ,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,YAAY,EAAE,CAAC,CAiDzB"}
1
+ {"version":3,"file":"reranker.d.ts","sourceRoot":"","sources":["../../src/core/reranker.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;GAUG;AAuFH,iCAAiC;AACjC,wBAAsB,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,CAGhD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAGvF"}