agent-working-memory 0.11.0 → 0.12.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 (115) hide show
  1. package/README.md +71 -297
  2. package/dist/adapters/claude-code.d.ts.map +1 -1
  3. package/dist/adapters/claude-code.js +63 -3
  4. package/dist/adapters/claude-code.js.map +1 -1
  5. package/dist/adapters/common.d.ts.map +1 -1
  6. package/dist/adapters/common.js +358 -306
  7. package/dist/adapters/common.js.map +1 -1
  8. package/dist/api/routes.d.ts.map +1 -1
  9. package/dist/api/routes.js +29 -7
  10. package/dist/api/routes.js.map +1 -1
  11. package/dist/coordination/routes.d.ts.map +1 -1
  12. package/dist/coordination/routes.js +174 -170
  13. package/dist/coordination/routes.js.map +1 -1
  14. package/dist/core/embeddings.d.ts.map +1 -1
  15. package/dist/core/embeddings.js +4 -1
  16. package/dist/core/embeddings.js.map +1 -1
  17. package/dist/core/entity-extract.d.ts +3 -0
  18. package/dist/core/entity-extract.d.ts.map +1 -0
  19. package/dist/core/entity-extract.js +47 -0
  20. package/dist/core/entity-extract.js.map +1 -0
  21. package/dist/core/format-recall.d.ts +16 -0
  22. package/dist/core/format-recall.d.ts.map +1 -0
  23. package/dist/core/format-recall.js +24 -0
  24. package/dist/core/format-recall.js.map +1 -0
  25. package/dist/core/query-expander.js +1 -1
  26. package/dist/core/query-expander.js.map +1 -1
  27. package/dist/core/reranker.js +1 -1
  28. package/dist/core/reranker.js.map +1 -1
  29. package/dist/core/salience.d.ts.map +1 -1
  30. package/dist/core/salience.js +14 -2
  31. package/dist/core/salience.js.map +1 -1
  32. package/dist/core/whoami.d.ts +24 -0
  33. package/dist/core/whoami.d.ts.map +1 -0
  34. package/dist/core/whoami.js +66 -0
  35. package/dist/core/whoami.js.map +1 -0
  36. package/dist/core/write-pipeline.d.ts +9 -0
  37. package/dist/core/write-pipeline.d.ts.map +1 -1
  38. package/dist/core/write-pipeline.js +109 -68
  39. package/dist/core/write-pipeline.js.map +1 -1
  40. package/dist/core/write-telemetry.d.ts +33 -0
  41. package/dist/core/write-telemetry.d.ts.map +1 -0
  42. package/dist/core/write-telemetry.js +110 -0
  43. package/dist/core/write-telemetry.js.map +1 -0
  44. package/dist/engine/activation.d.ts +22 -12
  45. package/dist/engine/activation.d.ts.map +1 -1
  46. package/dist/engine/activation.js +133 -17
  47. package/dist/engine/activation.js.map +1 -1
  48. package/dist/engine/consolidation-scheduler.d.ts +1 -1
  49. package/dist/engine/consolidation-scheduler.js +1 -1
  50. package/dist/engine/consolidation.d.ts +1 -0
  51. package/dist/engine/consolidation.d.ts.map +1 -1
  52. package/dist/engine/consolidation.js +18 -0
  53. package/dist/engine/consolidation.js.map +1 -1
  54. package/dist/engine/eval.d.ts.map +1 -1
  55. package/dist/engine/eval.js +5 -1
  56. package/dist/engine/eval.js.map +1 -1
  57. package/dist/hooks/sidecar.d.ts +26 -0
  58. package/dist/hooks/sidecar.d.ts.map +1 -1
  59. package/dist/hooks/sidecar.js +30 -0
  60. package/dist/hooks/sidecar.js.map +1 -1
  61. package/dist/index.js +20 -2
  62. package/dist/index.js.map +1 -1
  63. package/dist/mcp.d.ts +2 -1
  64. package/dist/mcp.d.ts.map +1 -1
  65. package/dist/mcp.js +222 -108
  66. package/dist/mcp.js.map +1 -1
  67. package/dist/recipes/index.d.ts +57 -0
  68. package/dist/recipes/index.d.ts.map +1 -0
  69. package/dist/recipes/index.js +81 -0
  70. package/dist/recipes/index.js.map +1 -0
  71. package/dist/storage/pglite-schema.d.ts.map +1 -1
  72. package/dist/storage/pglite-schema.js +27 -0
  73. package/dist/storage/pglite-schema.js.map +1 -1
  74. package/dist/storage/pglite.d.ts +5 -0
  75. package/dist/storage/pglite.d.ts.map +1 -1
  76. package/dist/storage/pglite.js +180 -138
  77. package/dist/storage/pglite.js.map +1 -1
  78. package/dist/storage/postgres.d.ts +5 -0
  79. package/dist/storage/postgres.d.ts.map +1 -1
  80. package/dist/storage/postgres.js +180 -138
  81. package/dist/storage/postgres.js.map +1 -1
  82. package/dist/storage/sqlite.d.ts +9 -0
  83. package/dist/storage/sqlite.d.ts.map +1 -1
  84. package/dist/storage/sqlite.js +394 -326
  85. package/dist/storage/sqlite.js.map +1 -1
  86. package/dist/types/engram.d.ts +14 -0
  87. package/dist/types/engram.d.ts.map +1 -1
  88. package/dist/types/engram.js.map +1 -1
  89. package/package.json +1 -1
  90. package/src/adapters/claude-code.ts +66 -3
  91. package/src/adapters/common.ts +567 -515
  92. package/src/api/routes.ts +999 -971
  93. package/src/coordination/routes.ts +2155 -2150
  94. package/src/core/embeddings.ts +4 -1
  95. package/src/core/entity-extract.ts +47 -0
  96. package/src/core/format-recall.ts +25 -0
  97. package/src/core/query-expander.ts +1 -1
  98. package/src/core/reranker.ts +1 -1
  99. package/src/core/salience.ts +529 -514
  100. package/src/core/whoami.ts +92 -0
  101. package/src/core/write-pipeline.ts +60 -8
  102. package/src/core/write-telemetry.ts +131 -0
  103. package/src/engine/activation.ts +1468 -1369
  104. package/src/engine/consolidation-scheduler.ts +1 -1
  105. package/src/engine/consolidation.ts +887 -869
  106. package/src/engine/eval.ts +6 -1
  107. package/src/hooks/sidecar.ts +55 -0
  108. package/src/index.ts +248 -227
  109. package/src/mcp.ts +1387 -1270
  110. package/src/recipes/index.ts +125 -0
  111. package/src/storage/pglite-schema.ts +27 -0
  112. package/src/storage/pglite.ts +1420 -1372
  113. package/src/storage/postgres.ts +1523 -1475
  114. package/src/storage/sqlite.ts +1936 -1861
  115. package/src/types/engram.ts +22 -0
@@ -19,6 +19,7 @@
19
19
 
20
20
  import { pipeline, type FeatureExtractionPipeline } from '@huggingface/transformers';
21
21
  import { dispatchEmbed, registerInProcessHandlers } from './ml-worker.js';
22
+ import { noteModelLoad } from './write-telemetry.js';
22
23
 
23
24
  const MODEL_ID = process.env.AWM_EMBED_MODEL ?? 'Xenova/bge-small-en-v1.5';
24
25
  const DIMENSIONS = parseInt(process.env.AWM_EMBED_DIMS ?? '384', 10);
@@ -32,9 +33,11 @@ let inProcessInitPromise: Promise<FeatureExtractionPipeline> | null = null;
32
33
  async function loadInProcess(): Promise<FeatureExtractionPipeline> {
33
34
  if (inProcessInstance) return inProcessInstance;
34
35
  if (inProcessInitPromise) return inProcessInitPromise;
36
+ const tLoadStart = performance.now();
35
37
  inProcessInitPromise = pipeline('feature-extraction', MODEL_ID, { dtype: 'fp32' }).then(pipe => {
36
38
  inProcessInstance = pipe;
37
- console.log(`Embedding model loaded in-process: ${MODEL_ID} (${DIMENSIONS}d)`);
39
+ noteModelLoad(performance.now() - tLoadStart);
40
+ console.error(`Embedding model loaded in-process: ${MODEL_ID} (${DIMENSIONS}d)`);
38
41
  return pipe;
39
42
  });
40
43
  return inProcessInitPromise;
@@ -0,0 +1,47 @@
1
+ // Copyright 2026 Robert Winter / Complete Ideas
2
+ // SPDX-License-Identifier: Apache-2.0
3
+
4
+ /**
5
+ * Entity extraction for the entity inverted index (D9, 2026-07-30).
6
+ *
7
+ * v1 is deliberately conservative for precision: entities come ONLY from
8
+ * structured sources — prefix tags (`person=Seetha`, `ticket=18999`) and
9
+ * auto-tagger `entity:` tags — never from free-text guessing. Each entity is
10
+ * normalized to `key:value` lowercase so lookups are exact.
11
+ *
12
+ * This is pure write-time bookkeeping. Retrieval behavior is unchanged until
13
+ * D11 re-tests the graph features against the index (per the 2026-06-16
14
+ * entity-centric retrieval roadmap).
15
+ */
16
+
17
+ /** Prefix-tag keys whose values denote entities worth indexing. */
18
+ const ENTITY_KEYS = new Set([
19
+ 'person', 'ticket', 'member', 'horse', 'usef', 'event', 'proj', 'project',
20
+ 'skill', 'about', 'file', 'sp', 'table', 'agent', 'version', 'org',
21
+ ]);
22
+
23
+ /** Extract normalized `key:value` entities from a tag list. Deduped, order-stable. */
24
+ export function extractEntitiesFromTags(tags: string[]): string[] {
25
+ const out: string[] = [];
26
+ const seen = new Set<string>();
27
+ for (const raw of tags ?? []) {
28
+ const tag = String(raw).trim();
29
+ let entity: string | null = null;
30
+ const eq = tag.indexOf('=');
31
+ if (eq > 0) {
32
+ const key = tag.slice(0, eq).toLowerCase();
33
+ const value = tag.slice(eq + 1).trim().toLowerCase();
34
+ if (ENTITY_KEYS.has(key) && value.length > 0 && value.length <= 120) {
35
+ entity = `${key === 'project' ? 'proj' : key}:${value}`;
36
+ }
37
+ } else if (tag.toLowerCase().startsWith('entity:')) {
38
+ const value = tag.slice('entity:'.length).trim().toLowerCase();
39
+ if (value.length > 0 && value.length <= 120) entity = `entity:${value}`;
40
+ }
41
+ if (entity && !seen.has(entity)) {
42
+ seen.add(entity);
43
+ out.push(entity);
44
+ }
45
+ }
46
+ return out;
47
+ }
@@ -0,0 +1,25 @@
1
+ import type { ActivationResult } from '../types/engram.js';
2
+
3
+ /**
4
+ * Formats one memory_recall result line for the MCP text response.
5
+ *
6
+ * Extracted out of the inline closure in mcp.ts (0.12.1) so the format itself
7
+ * — specifically, that every result carries its engram id — can be unit
8
+ * tested without booting the MCP server (mcp.ts has a top-level `await` and
9
+ * opens the store as a side effect of import, so it cannot be imported by a
10
+ * test directly).
11
+ *
12
+ * The id is placed right after the score, not at the end of the line: result
13
+ * bodies can be long, and a consumer scanning for `[id: ...]` shouldn't have
14
+ * to read past a paragraph of content to find it.
15
+ */
16
+ export function formatRecallResultLine(r: ActivationResult, index: number): string {
17
+ const body = r.summary ?? r.engram.content;
18
+ const chain = r.engram.supersededBy
19
+ ? ` ⚠ SUPERSEDED by ${r.engram.supersededBy} — treat as historical; recall/fetch the successor before relying on this.`
20
+ : '';
21
+ const validity = r.engram.validTo
22
+ ? ` [valid until ${r.engram.validTo}]`
23
+ : '';
24
+ return `${index + 1}. **${r.engram.concept}** (${r.score.toFixed(3)}) [id: ${r.engram.id}]${validity}: ${body}${chain}`;
25
+ }
@@ -30,7 +30,7 @@ async function loadInProcess(): Promise<Text2TextGenerationPipeline> {
30
30
  if (inProcessInitPromise) return inProcessInitPromise;
31
31
  inProcessInitPromise = pipeline('text2text-generation', MODEL_ID, { dtype: 'fp32' }).then(pipe => {
32
32
  inProcessInstance = pipe as Text2TextGenerationPipeline;
33
- console.log(`Query expander loaded in-process: ${MODEL_ID}`);
33
+ console.error(`Query expander loaded in-process: ${MODEL_ID}`);
34
34
  return inProcessInstance;
35
35
  });
36
36
  return inProcessInitPromise;
@@ -35,7 +35,7 @@ async function ensureLoaded(): Promise<void> {
35
35
  initPromise = (async () => {
36
36
  tokenizer = await AutoTokenizer.from_pretrained(MODEL_ID);
37
37
  model = await AutoModelForSequenceClassification.from_pretrained(MODEL_ID, { dtype: 'fp32' });
38
- console.log(`Re-ranker model loaded in-process: ${MODEL_ID}`);
38
+ console.error(`Re-ranker model loaded in-process: ${MODEL_ID}`);
39
39
  })();
40
40
  return initPromise;
41
41
  }