agent-working-memory 0.7.17 → 0.8.5

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 (186) hide show
  1. package/README.md +156 -15
  2. package/dist/adapters/common.js +202 -202
  3. package/dist/adapters/http.js +22 -22
  4. package/dist/api/routes.d.ts +1 -1
  5. package/dist/api/routes.d.ts.map +1 -1
  6. package/dist/api/routes.js +258 -79
  7. package/dist/api/routes.js.map +1 -1
  8. package/dist/cli/migrate.d.ts +42 -0
  9. package/dist/cli/migrate.d.ts.map +1 -0
  10. package/dist/cli/migrate.js +268 -0
  11. package/dist/cli/migrate.js.map +1 -0
  12. package/dist/cli.js +147 -103
  13. package/dist/cli.js.map +1 -1
  14. package/dist/coordination/circuit-breaker.d.ts +24 -0
  15. package/dist/coordination/circuit-breaker.d.ts.map +1 -0
  16. package/dist/coordination/circuit-breaker.js +70 -0
  17. package/dist/coordination/circuit-breaker.js.map +1 -0
  18. package/dist/coordination/failure-modes.d.ts +21 -0
  19. package/dist/coordination/failure-modes.d.ts.map +1 -0
  20. package/dist/coordination/failure-modes.js +49 -0
  21. package/dist/coordination/failure-modes.js.map +1 -0
  22. package/dist/coordination/peer-decisions.js +7 -7
  23. package/dist/coordination/routes.d.ts.map +1 -1
  24. package/dist/coordination/routes.js +44 -1
  25. package/dist/coordination/routes.js.map +1 -1
  26. package/dist/coordination/schema.d.ts.map +1 -1
  27. package/dist/coordination/schema.js +18 -0
  28. package/dist/coordination/schema.js.map +1 -1
  29. package/dist/coordination/schemas.d.ts +9 -9
  30. package/dist/coordination/stale.d.ts +9 -1
  31. package/dist/coordination/stale.d.ts.map +1 -1
  32. package/dist/coordination/stale.js +53 -9
  33. package/dist/coordination/stale.js.map +1 -1
  34. package/dist/core/embeddings.d.ts +16 -10
  35. package/dist/core/embeddings.d.ts.map +1 -1
  36. package/dist/core/embeddings.js +54 -38
  37. package/dist/core/embeddings.js.map +1 -1
  38. package/dist/core/ml-worker-entry.d.ts +17 -0
  39. package/dist/core/ml-worker-entry.d.ts.map +1 -0
  40. package/dist/core/ml-worker-entry.js +193 -0
  41. package/dist/core/ml-worker-entry.js.map +1 -0
  42. package/dist/core/ml-worker.d.ts +59 -0
  43. package/dist/core/ml-worker.d.ts.map +1 -0
  44. package/dist/core/ml-worker.js +253 -0
  45. package/dist/core/ml-worker.js.map +1 -0
  46. package/dist/core/query-expander.d.ts +13 -15
  47. package/dist/core/query-expander.d.ts.map +1 -1
  48. package/dist/core/query-expander.js +48 -54
  49. package/dist/core/query-expander.js.map +1 -1
  50. package/dist/core/reranker.d.ts +9 -19
  51. package/dist/core/reranker.d.ts.map +1 -1
  52. package/dist/core/reranker.js +33 -35
  53. package/dist/core/reranker.js.map +1 -1
  54. package/dist/core/salience.d.ts +32 -5
  55. package/dist/core/salience.d.ts.map +1 -1
  56. package/dist/core/salience.js +201 -28
  57. package/dist/core/salience.js.map +1 -1
  58. package/dist/core/write-pipeline.d.ts +10 -2
  59. package/dist/core/write-pipeline.d.ts.map +1 -1
  60. package/dist/core/write-pipeline.js +218 -49
  61. package/dist/core/write-pipeline.js.map +1 -1
  62. package/dist/engine/activation.d.ts +2 -2
  63. package/dist/engine/activation.d.ts.map +1 -1
  64. package/dist/engine/activation.js +238 -115
  65. package/dist/engine/activation.js.map +1 -1
  66. package/dist/engine/confidence.d.ts +62 -0
  67. package/dist/engine/confidence.d.ts.map +1 -0
  68. package/dist/engine/confidence.js +100 -0
  69. package/dist/engine/confidence.js.map +1 -0
  70. package/dist/engine/connections.d.ts +47 -8
  71. package/dist/engine/connections.d.ts.map +1 -1
  72. package/dist/engine/connections.js +83 -22
  73. package/dist/engine/connections.js.map +1 -1
  74. package/dist/engine/consolidation-scheduler.d.ts +46 -10
  75. package/dist/engine/consolidation-scheduler.d.ts.map +1 -1
  76. package/dist/engine/consolidation-scheduler.js +170 -50
  77. package/dist/engine/consolidation-scheduler.js.map +1 -1
  78. package/dist/engine/consolidation.d.ts +16 -2
  79. package/dist/engine/consolidation.d.ts.map +1 -1
  80. package/dist/engine/consolidation.js +143 -44
  81. package/dist/engine/consolidation.js.map +1 -1
  82. package/dist/engine/eval.d.ts +2 -2
  83. package/dist/engine/eval.d.ts.map +1 -1
  84. package/dist/engine/eval.js +9 -9
  85. package/dist/engine/eval.js.map +1 -1
  86. package/dist/engine/eviction.d.ts +4 -4
  87. package/dist/engine/eviction.d.ts.map +1 -1
  88. package/dist/engine/eviction.js +15 -15
  89. package/dist/engine/eviction.js.map +1 -1
  90. package/dist/engine/retraction.d.ts +93 -5
  91. package/dist/engine/retraction.d.ts.map +1 -1
  92. package/dist/engine/retraction.js +238 -19
  93. package/dist/engine/retraction.js.map +1 -1
  94. package/dist/engine/staging.d.ts +1 -1
  95. package/dist/engine/staging.d.ts.map +1 -1
  96. package/dist/engine/staging.js +3 -3
  97. package/dist/engine/staging.js.map +1 -1
  98. package/dist/hooks/sidecar.d.ts +1 -1
  99. package/dist/hooks/sidecar.d.ts.map +1 -1
  100. package/dist/hooks/sidecar.js +4 -4
  101. package/dist/hooks/sidecar.js.map +1 -1
  102. package/dist/index.js +48 -31
  103. package/dist/index.js.map +1 -1
  104. package/dist/mcp.js +167 -141
  105. package/dist/mcp.js.map +1 -1
  106. package/dist/storage/factory.d.ts +55 -0
  107. package/dist/storage/factory.d.ts.map +1 -0
  108. package/dist/storage/factory.js +135 -0
  109. package/dist/storage/factory.js.map +1 -0
  110. package/dist/storage/pglite-schema.d.ts +20 -0
  111. package/dist/storage/pglite-schema.d.ts.map +1 -0
  112. package/dist/storage/pglite-schema.js +165 -0
  113. package/dist/storage/pglite-schema.js.map +1 -0
  114. package/dist/storage/pglite.d.ts +187 -0
  115. package/dist/storage/pglite.d.ts.map +1 -0
  116. package/dist/storage/pglite.js +1114 -0
  117. package/dist/storage/pglite.js.map +1 -0
  118. package/dist/storage/sqlite.d.ts +117 -0
  119. package/dist/storage/sqlite.d.ts.map +1 -1
  120. package/dist/storage/sqlite.js +357 -8
  121. package/dist/storage/sqlite.js.map +1 -1
  122. package/dist/storage/store.d.ts +63 -0
  123. package/dist/storage/store.d.ts.map +1 -0
  124. package/dist/storage/store.js +27 -0
  125. package/dist/storage/store.js.map +1 -0
  126. package/dist/types/engram.d.ts +92 -2
  127. package/dist/types/engram.d.ts.map +1 -1
  128. package/dist/types/engram.js.map +1 -1
  129. package/package.json +3 -1
  130. package/src/adapters/claude-code.ts +218 -218
  131. package/src/adapters/codex.ts +252 -252
  132. package/src/adapters/common.ts +411 -411
  133. package/src/adapters/cursor.ts +135 -135
  134. package/src/adapters/http.ts +93 -93
  135. package/src/adapters/index.ts +31 -31
  136. package/src/adapters/types.ts +75 -75
  137. package/src/api/index.ts +3 -3
  138. package/src/api/routes.ts +970 -714
  139. package/src/cli/migrate.ts +307 -0
  140. package/src/cli.ts +755 -719
  141. package/src/coordination/circuit-breaker.ts +83 -0
  142. package/src/coordination/events.ts +90 -90
  143. package/src/coordination/failure-modes.ts +50 -0
  144. package/src/coordination/peer-decisions.ts +105 -105
  145. package/src/coordination/plugin-loader.ts +60 -60
  146. package/src/coordination/plugin.ts +44 -44
  147. package/src/coordination/routes.ts +56 -1
  148. package/src/coordination/schema.ts +13 -0
  149. package/src/coordination/stale.ts +80 -11
  150. package/src/coordination/types.ts +311 -311
  151. package/src/coordination/write-mutex.ts +69 -69
  152. package/src/core/auto-tagger.ts +168 -168
  153. package/src/core/decay.ts +63 -63
  154. package/src/core/embeddings.ts +110 -93
  155. package/src/core/index.ts +5 -5
  156. package/src/core/logger.ts +36 -36
  157. package/src/core/ml-worker-entry.ts +194 -0
  158. package/src/core/ml-worker.ts +281 -0
  159. package/src/core/query-expander.ts +122 -128
  160. package/src/core/reranker.ts +119 -125
  161. package/src/core/salience.ts +200 -33
  162. package/src/core/write-pipeline.ts +521 -343
  163. package/src/engine/activation.ts +235 -109
  164. package/src/engine/confidence.ts +120 -0
  165. package/src/engine/connections.ts +162 -103
  166. package/src/engine/consolidation-scheduler.ts +242 -125
  167. package/src/engine/consolidation.ts +138 -45
  168. package/src/engine/eval.ts +102 -102
  169. package/src/engine/eviction.ts +101 -101
  170. package/src/engine/index.ts +8 -8
  171. package/src/engine/retraction.ts +366 -116
  172. package/src/engine/staging.ts +74 -74
  173. package/src/hooks/sidecar.ts +5 -5
  174. package/src/index.ts +226 -212
  175. package/src/mcp.ts +1145 -1121
  176. package/src/storage/factory.ts +147 -0
  177. package/src/storage/index.ts +3 -3
  178. package/src/storage/pglite-schema.ts +166 -0
  179. package/src/storage/pglite.ts +1363 -0
  180. package/src/storage/sqlite.ts +402 -7
  181. package/src/storage/store.ts +80 -0
  182. package/src/types/agent.ts +67 -67
  183. package/src/types/checkpoint.ts +46 -46
  184. package/src/types/engram.ts +101 -3
  185. package/src/types/eval.ts +100 -100
  186. package/src/types/index.ts +6 -6
@@ -3,6 +3,8 @@
3
3
  /**
4
4
  * Stale agent detection and cleanup for the coordination module.
5
5
  */
6
+ import { classifyFailure, MUTATION_HINTS } from './failure-modes.js';
7
+ import { recordFailure as circuitRecordFailure } from './circuit-breaker.js';
6
8
  /** Detect agents that haven't checked in within the threshold. */
7
9
  export function detectStale(db, thresholdSeconds) {
8
10
  return db.prepare(`SELECT id, name, role, status, last_seen,
@@ -11,24 +13,66 @@ export function detectStale(db, thresholdSeconds) {
11
13
  WHERE status NOT IN ('dead')
12
14
  AND (julianday('now') - julianday(last_seen)) * 86400 > ?`).all(thresholdSeconds);
13
15
  }
14
- /** Clean up stale agents: fail assignments, release locks, mark dead. */
16
+ /** Maximum retry attempts before an assignment is permanently failed. */
17
+ const MAX_RETRY_ATTEMPTS = 3;
18
+ /**
19
+ * Retry or permanently fail a single assignment.
20
+ * Called from cleanupStale (stale path) and POST /assignment/:id/fail (voluntary path).
21
+ *
22
+ * @returns 'retried' | 'failed'
23
+ */
24
+ export function retryOrFailAssignment(db, assignmentId, agentId, failureResult, mode) {
25
+ const row = db.prepare(`SELECT attempt_count, description FROM coord_assignments WHERE id = ?`).get(assignmentId);
26
+ const attemptCount = row?.attempt_count ?? 0;
27
+ const failureMode = mode ?? classifyFailure(failureResult);
28
+ if (attemptCount < MAX_RETRY_ATTEMPTS) {
29
+ const hint = MUTATION_HINTS[failureMode];
30
+ const nextAttempt = attemptCount + 1;
31
+ const hintBlock = `\n\n--- RETRY HINT (attempt ${nextAttempt}) ---\n${hint}`;
32
+ const newDescription = (row?.description ?? '') + hintBlock;
33
+ db.prepare(`UPDATE coord_assignments
34
+ SET status = 'pending', agent_id = NULL, started_at = NULL, result = NULL,
35
+ attempt_count = ?, last_failure_mode = ?, description = ?
36
+ WHERE id = ?`).run(nextAttempt, failureMode, newDescription, assignmentId);
37
+ db.prepare(`INSERT INTO coord_events (agent_id, event_type, detail) VALUES (?, 'assignment_retry', ?)`).run(agentId, `attempt ${nextAttempt}: ${failureMode} — ${failureResult.slice(0, 200)}`);
38
+ return 'retried';
39
+ }
40
+ else {
41
+ db.prepare(`UPDATE coord_assignments
42
+ SET status = 'failed', result = ?, last_failure_mode = ?, completed_at = datetime('now')
43
+ WHERE id = ?`).run(failureResult, failureMode, assignmentId);
44
+ db.prepare(`INSERT INTO coord_events (agent_id, event_type, detail) VALUES (?, 'assignment_failed', ?)`).run(agentId, `permanently failed after ${attemptCount} attempt(s): ${failureResult.slice(0, 200)}`);
45
+ return 'failed';
46
+ }
47
+ }
48
+ /** Clean up stale agents: retry or fail assignments, release locks, mark dead. */
15
49
  export function cleanupStale(db, thresholdSeconds) {
16
50
  const stale = detectStale(db, thresholdSeconds);
17
51
  let cleaned = 0;
18
52
  for (const agent of stale) {
19
- // Fail active assignments
20
- const orphaned = db.prepare(`UPDATE coord_assignments SET status = 'failed', result = 'agent disconnected (stale)', completed_at = datetime('now')
21
- WHERE agent_id = ? AND status IN ('assigned', 'in_progress')`).run(agent.id);
22
- if (orphaned.changes > 0) {
23
- db.prepare(`INSERT INTO coord_events (agent_id, event_type, detail) VALUES (?, 'assignment_failed', ?)`).run(agent.id, `auto-failed ${orphaned.changes} orphaned assignment(s) — agent stale`);
53
+ // Handle each orphaned assignment with retry logic
54
+ const orphanedRows = db.prepare(`SELECT id FROM coord_assignments WHERE agent_id = ? AND status IN ('assigned', 'in_progress')`).all(agent.id);
55
+ let retried = 0;
56
+ let failed = 0;
57
+ for (const row of orphanedRows) {
58
+ const outcome = retryOrFailAssignment(db, row.id, agent.id, 'agent disconnected (stale)');
59
+ if (outcome === 'retried')
60
+ retried++;
61
+ else
62
+ failed++;
63
+ }
64
+ if (orphanedRows.length > 0) {
65
+ db.prepare(`INSERT INTO coord_events (agent_id, event_type, detail) VALUES (?, 'assignment_failed', ?)`).run(agent.id, `stale cleanup: retried ${retried}, permanently failed ${failed}`);
66
+ // Record failure in circuit breaker for each orphaned assignment
67
+ circuitRecordFailure(db, agent.id);
24
68
  }
25
69
  // Release locks
26
70
  const locks = db.prepare(`DELETE FROM coord_locks WHERE agent_id = ?`).run(agent.id);
27
71
  // Mark dead
28
72
  db.prepare(`UPDATE coord_agents SET status = 'dead', current_task = NULL WHERE id = ?`).run(agent.id);
29
- cleaned += orphaned.changes + locks.changes;
30
- if (orphaned.changes > 0 || locks.changes > 0) {
31
- db.prepare(`INSERT INTO coord_events (agent_id, event_type, detail) VALUES (?, 'stale_cleanup', ?)`).run(agent.id, `failed ${orphaned.changes} assignment(s), released ${locks.changes} lock(s)`);
73
+ cleaned += orphanedRows.length + locks.changes;
74
+ if (orphanedRows.length > 0 || locks.changes > 0) {
75
+ db.prepare(`INSERT INTO coord_events (agent_id, event_type, detail) VALUES (?, 'stale_cleanup', ?)`).run(agent.id, `failed ${orphanedRows.length} assignment(s), released ${locks.changes} lock(s)`);
32
76
  }
33
77
  }
34
78
  return { stale, cleaned };
@@ -1 +1 @@
1
- {"version":3,"file":"stale.js","sourceRoot":"","sources":["../../src/coordination/stale.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"stale.js","sourceRoot":"","sources":["../../src/coordination/stale.ts"],"names":[],"mappings":"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"}
@@ -1,12 +1,15 @@
1
1
  /**
2
- * Embedding Engine local vector embeddings via transformers.js
2
+ * Embedding Engine - vector embeddings via the ML worker pool.
3
3
  *
4
- * Default: bge-small-en-v1.5 (384 dimensions, ~90MB, MTEB retrieval-optimized).
5
- * Better short-text similarity than MiniLM for agent memory concepts.
4
+ * Default model: bge-small-en-v1.5 (384 dimensions, ~90MB, MTEB retrieval-optimized).
6
5
  * Configurable via AWM_EMBED_MODEL env var.
7
- * Model is downloaded once on first use and cached locally.
8
6
  *
9
- * Singleton pattern call getEmbedder() to get the shared instance.
7
+ * AWM 0.8.x: inference dispatches through ml-worker.ts. The worker_threads
8
+ * path was planned but reverted to in-process because onnxruntime-node's
9
+ * native bindings store V8 handles that don't cross isolate boundaries
10
+ * safely — see ml-worker.ts for the full status. The dispatch abstraction
11
+ * is preserved for a future child_process or HTTP sidecar pool.
12
+ * `AWM_ML_INPROCESS=1` is honored as a no-op (in-process is now the default).
10
13
  *
11
14
  * NOTE: Changing the model invalidates existing embeddings.
12
15
  * Set AWM_EMBED_MODEL=Xenova/all-MiniLM-L6-v2 for backward compatibility.
@@ -14,21 +17,24 @@
14
17
  import { type FeatureExtractionPipeline } from '@huggingface/transformers';
15
18
  /**
16
19
  * Get or initialize the embedding pipeline (singleton).
17
- * First call downloads the model (~22MB), subsequent calls are instant.
20
+ * Kept for backwards compat returns the in-process pipeline only.
21
+ * Most consumers should use embed() / embedBatch() which dispatch
22
+ * to the worker pool by default.
18
23
  */
19
24
  export declare function getEmbedder(): Promise<FeatureExtractionPipeline>;
20
25
  /**
21
26
  * Generate an embedding vector for a text string.
22
- * Returns a normalized float32 array of length DIMENSIONS.
27
+ * Dispatches to the worker pool (or in-process fallback).
23
28
  */
24
29
  export declare function embed(text: string): Promise<number[]>;
25
- /** Get the current embedding model ID (for version tracking in stored embeddings) */
26
- export declare function getModelId(): string;
27
30
  /**
28
31
  * Generate embeddings for multiple texts in a batch.
29
- * More efficient than calling embed() in a loop.
32
+ * More efficient than calling embed() in a loop — the worker batches the
33
+ * tokenization + forward pass.
30
34
  */
31
35
  export declare function embedBatch(texts: string[]): Promise<number[][]>;
36
+ /** Get the current embedding model ID (for version tracking in stored embeddings) */
37
+ export declare function getModelId(): string;
32
38
  /**
33
39
  * Cosine similarity between two normalized vectors.
34
40
  * Since vectors are pre-normalized, this is just the dot product.
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/core/embeddings.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAY,KAAK,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AASrF;;;GAGG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAatE;AAED;;;GAGG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAK3D;AAED,qFAAqF;AACrF,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;GAGG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAWrE;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAQjE;AAED,uCAAuC;AACvC,eAAO,MAAM,oBAAoB,QAAa,CAAC"}
1
+ {"version":3,"file":"embeddings.d.ts","sourceRoot":"","sources":["../../src/core/embeddings.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;GAeG;AAEH,OAAO,EAAY,KAAK,yBAAyB,EAAE,MAAM,2BAA2B,CAAC;AAyCrF;;;;;GAKG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,yBAAyB,CAAC,CAEtE;AAED;;;GAGG;AACH,wBAAsB,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAG3D;AAED;;;;GAIG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAGrE;AAED,qFAAqF;AACrF,wBAAgB,UAAU,IAAI,MAAM,CAEnC;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,CAQjE;AAED,uCAAuC;AACvC,eAAO,MAAM,oBAAoB,QAAa,CAAC"}
@@ -1,71 +1,87 @@
1
1
  // Copyright 2026 Robert Winter / Complete Ideas
2
2
  // SPDX-License-Identifier: Apache-2.0
3
3
  /**
4
- * Embedding Engine local vector embeddings via transformers.js
4
+ * Embedding Engine - vector embeddings via the ML worker pool.
5
5
  *
6
- * Default: bge-small-en-v1.5 (384 dimensions, ~90MB, MTEB retrieval-optimized).
7
- * Better short-text similarity than MiniLM for agent memory concepts.
6
+ * Default model: bge-small-en-v1.5 (384 dimensions, ~90MB, MTEB retrieval-optimized).
8
7
  * Configurable via AWM_EMBED_MODEL env var.
9
- * Model is downloaded once on first use and cached locally.
10
8
  *
11
- * Singleton pattern call getEmbedder() to get the shared instance.
9
+ * AWM 0.8.x: inference dispatches through ml-worker.ts. The worker_threads
10
+ * path was planned but reverted to in-process because onnxruntime-node's
11
+ * native bindings store V8 handles that don't cross isolate boundaries
12
+ * safely — see ml-worker.ts for the full status. The dispatch abstraction
13
+ * is preserved for a future child_process or HTTP sidecar pool.
14
+ * `AWM_ML_INPROCESS=1` is honored as a no-op (in-process is now the default).
12
15
  *
13
16
  * NOTE: Changing the model invalidates existing embeddings.
14
17
  * Set AWM_EMBED_MODEL=Xenova/all-MiniLM-L6-v2 for backward compatibility.
15
18
  */
16
19
  import { pipeline } from '@huggingface/transformers';
20
+ import { dispatchEmbed, registerInProcessHandlers } from './ml-worker.js';
17
21
  const MODEL_ID = process.env.AWM_EMBED_MODEL ?? 'Xenova/bge-small-en-v1.5';
18
22
  const DIMENSIONS = parseInt(process.env.AWM_EMBED_DIMS ?? '384', 10);
19
23
  const POOLING = (process.env.AWM_EMBED_POOLING ?? 'mean');
20
- let instance = null;
21
- let initPromise = null;
24
+ // --- In-process fallback (used by tests and crash recovery) ---
25
+ let inProcessInstance = null;
26
+ let inProcessInitPromise = null;
27
+ async function loadInProcess() {
28
+ if (inProcessInstance)
29
+ return inProcessInstance;
30
+ if (inProcessInitPromise)
31
+ return inProcessInitPromise;
32
+ inProcessInitPromise = pipeline('feature-extraction', MODEL_ID, { dtype: 'fp32' }).then(pipe => {
33
+ inProcessInstance = pipe;
34
+ console.log(`Embedding model loaded in-process: ${MODEL_ID} (${DIMENSIONS}d)`);
35
+ return pipe;
36
+ });
37
+ return inProcessInitPromise;
38
+ }
39
+ async function inProcessEmbed(args) {
40
+ const { texts, pooling, dimensions } = args;
41
+ if (texts.length === 0)
42
+ return [];
43
+ const embedder = await loadInProcess();
44
+ const result = await embedder(texts, { pooling, normalize: true });
45
+ const data = result.data;
46
+ const vectors = [];
47
+ for (let i = 0; i < texts.length; i++) {
48
+ vectors.push(Array.from(data.slice(i * dimensions, (i + 1) * dimensions)));
49
+ }
50
+ return vectors;
51
+ }
52
+ // Register the in-process handler with the pool (used in test mode and as fallback)
53
+ registerInProcessHandlers({ embed: inProcessEmbed });
54
+ // --- Public API ---
22
55
  /**
23
56
  * Get or initialize the embedding pipeline (singleton).
24
- * First call downloads the model (~22MB), subsequent calls are instant.
57
+ * Kept for backwards compat returns the in-process pipeline only.
58
+ * Most consumers should use embed() / embedBatch() which dispatch
59
+ * to the worker pool by default.
25
60
  */
26
61
  export async function getEmbedder() {
27
- if (instance)
28
- return instance;
29
- if (initPromise)
30
- return initPromise;
31
- initPromise = pipeline('feature-extraction', MODEL_ID, {
32
- dtype: 'fp32',
33
- }).then(pipe => {
34
- instance = pipe;
35
- console.log(`Embedding model loaded: ${MODEL_ID} (${DIMENSIONS}d)`);
36
- return pipe;
37
- });
38
- return initPromise;
62
+ return loadInProcess();
39
63
  }
40
64
  /**
41
65
  * Generate an embedding vector for a text string.
42
- * Returns a normalized float32 array of length DIMENSIONS.
66
+ * Dispatches to the worker pool (or in-process fallback).
43
67
  */
44
68
  export async function embed(text) {
45
- const embedder = await getEmbedder();
46
- const result = await embedder(text, { pooling: POOLING, normalize: true });
47
- // result is a Tensor — extract the data
48
- return Array.from(result.data).slice(0, DIMENSIONS);
49
- }
50
- /** Get the current embedding model ID (for version tracking in stored embeddings) */
51
- export function getModelId() {
52
- return MODEL_ID;
69
+ const vectors = await dispatchEmbed({ texts: [text], pooling: POOLING, dimensions: DIMENSIONS });
70
+ return vectors[0] ?? new Array(DIMENSIONS).fill(0);
53
71
  }
54
72
  /**
55
73
  * Generate embeddings for multiple texts in a batch.
56
- * More efficient than calling embed() in a loop.
74
+ * More efficient than calling embed() in a loop — the worker batches the
75
+ * tokenization + forward pass.
57
76
  */
58
77
  export async function embedBatch(texts) {
59
78
  if (texts.length === 0)
60
79
  return [];
61
- const embedder = await getEmbedder();
62
- const result = await embedder(texts, { pooling: POOLING, normalize: true });
63
- const data = result.data;
64
- const vectors = [];
65
- for (let i = 0; i < texts.length; i++) {
66
- vectors.push(Array.from(data.slice(i * DIMENSIONS, (i + 1) * DIMENSIONS)));
67
- }
68
- return vectors;
80
+ return dispatchEmbed({ texts, pooling: POOLING, dimensions: DIMENSIONS });
81
+ }
82
+ /** Get the current embedding model ID (for version tracking in stored embeddings) */
83
+ export function getModelId() {
84
+ return MODEL_ID;
69
85
  }
70
86
  /**
71
87
  * Cosine similarity between two normalized vectors.
@@ -1 +1 @@
1
- {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/core/embeddings.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"embeddings.js","sourceRoot":"","sources":["../../src/core/embeddings.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * ML worker entry — runs INSIDE a worker_thread.
3
+ *
4
+ * Loaded once per worker, sets up the model for the assigned role
5
+ * (embed | rerank | expand), then handles request messages from the
6
+ * main thread via the parentPort.
7
+ *
8
+ * Protocol:
9
+ * Main thread → worker: { id, op, args } (op matches the worker's role)
10
+ * Worker → main thread: { id, ok: true, result } or { id, ok: false, error }
11
+ * Worker → main thread: { ready: true } (one-time signal after model load)
12
+ * Main thread → worker: { shutdown: true } (drain queue, then terminate)
13
+ *
14
+ * The worker stays loaded — the model lives in memory for the worker's lifetime.
15
+ */
16
+ export {};
17
+ //# sourceMappingURL=ml-worker-entry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ml-worker-entry.d.ts","sourceRoot":"","sources":["../../src/core/ml-worker-entry.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;GAcG"}
@@ -0,0 +1,193 @@
1
+ // Copyright 2026 Robert Winter / Complete Ideas
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * ML worker entry — runs INSIDE a worker_thread.
5
+ *
6
+ * Loaded once per worker, sets up the model for the assigned role
7
+ * (embed | rerank | expand), then handles request messages from the
8
+ * main thread via the parentPort.
9
+ *
10
+ * Protocol:
11
+ * Main thread → worker: { id, op, args } (op matches the worker's role)
12
+ * Worker → main thread: { id, ok: true, result } or { id, ok: false, error }
13
+ * Worker → main thread: { ready: true } (one-time signal after model load)
14
+ * Main thread → worker: { shutdown: true } (drain queue, then terminate)
15
+ *
16
+ * The worker stays loaded — the model lives in memory for the worker's lifetime.
17
+ */
18
+ import { parentPort, workerData } from 'node:worker_threads';
19
+ if (!parentPort) {
20
+ throw new Error('ml-worker-entry: must be loaded as a worker_thread');
21
+ }
22
+ const role = workerData?.role;
23
+ if (role !== 'embed' && role !== 'rerank' && role !== 'expand') {
24
+ throw new Error(`ml-worker-entry: invalid role '${role}'`);
25
+ }
26
+ // --- Lazy model loaders (each worker loads only its own model) ---
27
+ let embedderPipeline = null;
28
+ let rerankerTokenizer = null;
29
+ let rerankerModel = null;
30
+ let expanderPipeline = null;
31
+ // Inside worker_threads we must use the WASM ONNX backend, not the native one.
32
+ // onnxruntime-node's native bindings store V8 handles that get invalidated when
33
+ // crossing isolate boundaries — calling from a worker crashes with
34
+ // `v8::HandleScope::CreateHandle()` failures. The WASM backend is V8-safe.
35
+ const WORKER_DEVICE = 'wasm';
36
+ async function loadEmbedder() {
37
+ const { pipeline } = await import('@huggingface/transformers');
38
+ const modelId = process.env.AWM_EMBED_MODEL ?? 'Xenova/bge-small-en-v1.5';
39
+ embedderPipeline = await pipeline('feature-extraction', modelId, { dtype: 'fp32', device: WORKER_DEVICE });
40
+ }
41
+ async function loadReranker() {
42
+ const { AutoTokenizer, AutoModelForSequenceClassification } = await import('@huggingface/transformers');
43
+ const modelId = process.env.AWM_RERANKER_MODEL || 'Xenova/ms-marco-MiniLM-L-6-v2';
44
+ rerankerTokenizer = await AutoTokenizer.from_pretrained(modelId);
45
+ rerankerModel = await AutoModelForSequenceClassification.from_pretrained(modelId, { dtype: 'fp32', device: WORKER_DEVICE });
46
+ }
47
+ async function loadExpander() {
48
+ const { pipeline } = await import('@huggingface/transformers');
49
+ expanderPipeline = await pipeline('text2text-generation', 'Xenova/flan-t5-small', { dtype: 'fp32', device: WORKER_DEVICE });
50
+ }
51
+ // --- Per-role inference handlers ---
52
+ function sigmoid(x) {
53
+ return 1 / (1 + Math.exp(-x));
54
+ }
55
+ async function handleEmbed(args) {
56
+ if (!embedderPipeline)
57
+ throw new Error('embedder not loaded');
58
+ const { texts, pooling, dimensions } = args;
59
+ if (texts.length === 0)
60
+ return [];
61
+ const result = await embedderPipeline(texts, { pooling, normalize: true });
62
+ const data = result.data;
63
+ const vectors = [];
64
+ for (let i = 0; i < texts.length; i++) {
65
+ vectors.push(Array.from(data.slice(i * dimensions, (i + 1) * dimensions)));
66
+ }
67
+ return vectors;
68
+ }
69
+ async function handleRerank(args) {
70
+ if (!rerankerTokenizer || !rerankerModel)
71
+ throw new Error('reranker not loaded');
72
+ const { query, passages } = args;
73
+ if (passages.length === 0)
74
+ return [];
75
+ // Batch path
76
+ try {
77
+ const queries = passages.map(() => query);
78
+ const inputs = rerankerTokenizer(queries, {
79
+ text_pair: passages,
80
+ padding: true,
81
+ truncation: true,
82
+ return_tensors: 'pt',
83
+ });
84
+ const output = await rerankerModel(inputs);
85
+ const logits = output.logits ?? output.last_hidden_state;
86
+ const data = logits.data;
87
+ const results = [];
88
+ for (let i = 0; i < passages.length; i++) {
89
+ const rawLogit = Number(data[i] ?? 0);
90
+ results.push({ index: i, score: sigmoid(rawLogit) });
91
+ }
92
+ results.sort((a, b) => b.score - a.score);
93
+ return results;
94
+ }
95
+ catch {
96
+ // Per-passage fallback
97
+ const results = [];
98
+ for (let i = 0; i < passages.length; i++) {
99
+ try {
100
+ const inputs = rerankerTokenizer(query, {
101
+ text_pair: passages[i],
102
+ padding: true,
103
+ truncation: true,
104
+ return_tensors: 'pt',
105
+ });
106
+ const output = await rerankerModel(inputs);
107
+ const logits = output.logits ?? output.last_hidden_state;
108
+ const rawLogit = logits.data[0];
109
+ results.push({ index: i, score: sigmoid(rawLogit) });
110
+ }
111
+ catch {
112
+ results.push({ index: i, score: 0 });
113
+ }
114
+ }
115
+ results.sort((a, b) => b.score - a.score);
116
+ return results;
117
+ }
118
+ }
119
+ async function handleExpand(args) {
120
+ if (!expanderPipeline)
121
+ throw new Error('expander not loaded');
122
+ const result = await expanderPipeline(args.prompt, {
123
+ max_new_tokens: args.maxNewTokens,
124
+ no_repeat_ngram_size: args.noRepeatNgramSize,
125
+ });
126
+ const text = Array.isArray(result) ? result[0]?.generated_text ?? '' : '';
127
+ return String(text).trim();
128
+ }
129
+ // --- Main loop ---
130
+ let shuttingDown = false;
131
+ const inflight = new Set();
132
+ async function loadModel() {
133
+ switch (role) {
134
+ case 'embed':
135
+ await loadEmbedder();
136
+ break;
137
+ case 'rerank':
138
+ await loadReranker();
139
+ break;
140
+ case 'expand':
141
+ await loadExpander();
142
+ break;
143
+ }
144
+ }
145
+ async function handleMessage(msg) {
146
+ try {
147
+ let result;
148
+ switch (msg.op) {
149
+ case 'embed':
150
+ result = await handleEmbed(msg.args);
151
+ break;
152
+ case 'rerank':
153
+ result = await handleRerank(msg.args);
154
+ break;
155
+ case 'expand':
156
+ result = await handleExpand(msg.args);
157
+ break;
158
+ }
159
+ parentPort.postMessage({ id: msg.id, ok: true, result });
160
+ }
161
+ catch (err) {
162
+ parentPort.postMessage({ id: msg.id, ok: false, error: String(err?.message ?? err) });
163
+ }
164
+ }
165
+ (async () => {
166
+ try {
167
+ await loadModel();
168
+ parentPort.postMessage({ ready: true, role });
169
+ }
170
+ catch (err) {
171
+ parentPort.postMessage({ ready: false, role, error: String(err?.message ?? err) });
172
+ process.exit(1);
173
+ }
174
+ })();
175
+ parentPort.on('message', (msg) => {
176
+ if (msg?.shutdown) {
177
+ shuttingDown = true;
178
+ // Wait for in-flight work, then exit
179
+ void Promise.allSettled([...inflight]).then(() => {
180
+ parentPort.postMessage({ shutdown: 'done' });
181
+ process.exit(0);
182
+ });
183
+ return;
184
+ }
185
+ if (shuttingDown)
186
+ return;
187
+ if (typeof msg?.id !== 'number' || typeof msg?.op !== 'string')
188
+ return;
189
+ const promise = handleMessage(msg);
190
+ inflight.add(promise);
191
+ void promise.finally(() => inflight.delete(promise));
192
+ });
193
+ //# sourceMappingURL=ml-worker-entry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ml-worker-entry.js","sourceRoot":"","sources":["../../src/core/ml-worker-entry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,59 @@
1
+ /**
2
+ * ML inference dispatch pool.
3
+ *
4
+ * STATUS (AWM 0.8.x P1 REVISE, 2026-05-25): worker_threads were the original
5
+ * plan, but @huggingface/transformers in Node only supports the `cpu`
6
+ * (native ONNX) and `dml` (Windows GPU) backends. Neither is safe inside
7
+ * a worker_thread — onnxruntime-node's native bindings store V8 handles
8
+ * that get invalidated when crossing isolate boundaries, causing
9
+ * `v8::HandleScope::CreateHandle()` crashes on first inference call.
10
+ * The browser-only `wasm` backend is not loaded in Node builds of
11
+ * transformers.js.
12
+ *
13
+ * The dispatch abstraction is preserved so a future child_process pool
14
+ * or HTTP sidecar (see AWM_ML_SIDECAR_URL design in docs/awm-architecture-history.md)
15
+ * can plug in. For now ALL inference runs in-process. The freeze fix from
16
+ * P0 (sleep-only consolidation) already eliminates the multi-second
17
+ * in-band blocks. Individual inference calls (~50ms each) on the main
18
+ * thread are accepted as-is.
19
+ *
20
+ * Test / dev mode: AWM_ML_INPROCESS=1 is honored but is now the default.
21
+ * The env var remains as a no-op for backwards compatibility.
22
+ */
23
+ declare let inProcessEmbed: ((args: any) => Promise<number[][]>) | null;
24
+ declare let inProcessRerank: ((args: any) => Promise<Array<{
25
+ index: number;
26
+ score: number;
27
+ }>>) | null;
28
+ declare let inProcessExpand: ((args: any) => Promise<string>) | null;
29
+ /** Initialize the pool. Idempotent — safe to call multiple times. */
30
+ export declare function initMLPool(): void;
31
+ /** Register in-process fallback handlers. Called once by the consumer modules. */
32
+ export declare function registerInProcessHandlers(handlers: {
33
+ embed?: typeof inProcessEmbed;
34
+ rerank?: typeof inProcessRerank;
35
+ expand?: typeof inProcessExpand;
36
+ }): void;
37
+ /** True if the pool is operating in in-process mode (no workers). */
38
+ export declare function isInProcessMode(): boolean;
39
+ export declare function dispatchEmbed(args: {
40
+ texts: string[];
41
+ pooling: 'cls' | 'mean';
42
+ dimensions: number;
43
+ }): Promise<number[][]>;
44
+ export declare function dispatchRerank(args: {
45
+ query: string;
46
+ passages: string[];
47
+ }): Promise<Array<{
48
+ index: number;
49
+ score: number;
50
+ }>>;
51
+ export declare function dispatchExpand(args: {
52
+ prompt: string;
53
+ maxNewTokens: number;
54
+ noRepeatNgramSize: number;
55
+ }): Promise<string>;
56
+ /** Graceful shutdown. Waits up to 2s for queue drain, then terminates. */
57
+ export declare function shutdownMLPool(): Promise<void>;
58
+ export {};
59
+ //# sourceMappingURL=ml-worker.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ml-worker.d.ts","sourceRoot":"","sources":["../../src/core/ml-worker.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;GAqBG;AAgCH,QAAA,IAAI,cAAc,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,IAAW,CAAC;AACvE,QAAA,IAAI,eAAe,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAAC,GAAG,IAAW,CAAC;AACrG,QAAA,IAAI,eAAe,EAAE,CAAC,CAAC,IAAI,EAAE,GAAG,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,IAAW,CAAC;AAkHpE,qEAAqE;AACrE,wBAAgB,UAAU,IAAI,IAAI,CAWjC;AAED,kFAAkF;AAClF,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE;IAClD,KAAK,CAAC,EAAE,OAAO,cAAc,CAAC;IAC9B,MAAM,CAAC,EAAE,OAAO,eAAe,CAAC;IAChC,MAAM,CAAC,EAAE,OAAO,eAAe,CAAC;CACjC,GAAG,IAAI,CAIP;AAED,qEAAqE;AACrE,wBAAgB,eAAe,IAAI,OAAO,CAEzC;AAmDD,wBAAsB,aAAa,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,EAAE,CAAC;IAAC,OAAO,EAAE,KAAK,GAAG,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAE/H;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,GAAG,OAAO,CAAC,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAElI;AAED,wBAAsB,cAAc,CAAC,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,iBAAiB,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,MAAM,CAAC,CAE/H;AAED,0EAA0E;AAC1E,wBAAsB,cAAc,IAAI,OAAO,CAAC,IAAI,CAAC,CAiBpD"}