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.
- package/README.md +71 -297
- package/dist/adapters/claude-code.d.ts.map +1 -1
- package/dist/adapters/claude-code.js +63 -3
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/adapters/common.d.ts.map +1 -1
- package/dist/adapters/common.js +358 -306
- package/dist/adapters/common.js.map +1 -1
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +29 -7
- package/dist/api/routes.js.map +1 -1
- package/dist/coordination/routes.d.ts.map +1 -1
- package/dist/coordination/routes.js +174 -170
- package/dist/coordination/routes.js.map +1 -1
- package/dist/core/embeddings.d.ts.map +1 -1
- package/dist/core/embeddings.js +4 -1
- package/dist/core/embeddings.js.map +1 -1
- package/dist/core/entity-extract.d.ts +3 -0
- package/dist/core/entity-extract.d.ts.map +1 -0
- package/dist/core/entity-extract.js +47 -0
- package/dist/core/entity-extract.js.map +1 -0
- package/dist/core/format-recall.d.ts +16 -0
- package/dist/core/format-recall.d.ts.map +1 -0
- package/dist/core/format-recall.js +24 -0
- package/dist/core/format-recall.js.map +1 -0
- package/dist/core/query-expander.js +1 -1
- package/dist/core/query-expander.js.map +1 -1
- package/dist/core/reranker.js +1 -1
- package/dist/core/reranker.js.map +1 -1
- package/dist/core/salience.d.ts.map +1 -1
- package/dist/core/salience.js +14 -2
- package/dist/core/salience.js.map +1 -1
- package/dist/core/whoami.d.ts +24 -0
- package/dist/core/whoami.d.ts.map +1 -0
- package/dist/core/whoami.js +66 -0
- package/dist/core/whoami.js.map +1 -0
- package/dist/core/write-pipeline.d.ts +9 -0
- package/dist/core/write-pipeline.d.ts.map +1 -1
- package/dist/core/write-pipeline.js +109 -68
- package/dist/core/write-pipeline.js.map +1 -1
- package/dist/core/write-telemetry.d.ts +33 -0
- package/dist/core/write-telemetry.d.ts.map +1 -0
- package/dist/core/write-telemetry.js +110 -0
- package/dist/core/write-telemetry.js.map +1 -0
- package/dist/engine/activation.d.ts +22 -12
- package/dist/engine/activation.d.ts.map +1 -1
- package/dist/engine/activation.js +133 -17
- package/dist/engine/activation.js.map +1 -1
- package/dist/engine/consolidation-scheduler.d.ts +1 -1
- package/dist/engine/consolidation-scheduler.js +1 -1
- package/dist/engine/consolidation.d.ts +1 -0
- package/dist/engine/consolidation.d.ts.map +1 -1
- package/dist/engine/consolidation.js +18 -0
- package/dist/engine/consolidation.js.map +1 -1
- package/dist/engine/eval.d.ts.map +1 -1
- package/dist/engine/eval.js +5 -1
- package/dist/engine/eval.js.map +1 -1
- package/dist/hooks/sidecar.d.ts +26 -0
- package/dist/hooks/sidecar.d.ts.map +1 -1
- package/dist/hooks/sidecar.js +30 -0
- package/dist/hooks/sidecar.js.map +1 -1
- package/dist/index.js +20 -2
- package/dist/index.js.map +1 -1
- package/dist/mcp.d.ts +2 -1
- package/dist/mcp.d.ts.map +1 -1
- package/dist/mcp.js +222 -108
- package/dist/mcp.js.map +1 -1
- package/dist/recipes/index.d.ts +57 -0
- package/dist/recipes/index.d.ts.map +1 -0
- package/dist/recipes/index.js +81 -0
- package/dist/recipes/index.js.map +1 -0
- package/dist/storage/pglite-schema.d.ts.map +1 -1
- package/dist/storage/pglite-schema.js +27 -0
- package/dist/storage/pglite-schema.js.map +1 -1
- package/dist/storage/pglite.d.ts +5 -0
- package/dist/storage/pglite.d.ts.map +1 -1
- package/dist/storage/pglite.js +180 -138
- package/dist/storage/pglite.js.map +1 -1
- package/dist/storage/postgres.d.ts +5 -0
- package/dist/storage/postgres.d.ts.map +1 -1
- package/dist/storage/postgres.js +180 -138
- package/dist/storage/postgres.js.map +1 -1
- package/dist/storage/sqlite.d.ts +9 -0
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +394 -326
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/types/engram.d.ts +14 -0
- package/dist/types/engram.d.ts.map +1 -1
- package/dist/types/engram.js.map +1 -1
- package/package.json +1 -1
- package/src/adapters/claude-code.ts +66 -3
- package/src/adapters/common.ts +567 -515
- package/src/api/routes.ts +999 -971
- package/src/coordination/routes.ts +2155 -2150
- package/src/core/embeddings.ts +4 -1
- package/src/core/entity-extract.ts +47 -0
- package/src/core/format-recall.ts +25 -0
- package/src/core/query-expander.ts +1 -1
- package/src/core/reranker.ts +1 -1
- package/src/core/salience.ts +529 -514
- package/src/core/whoami.ts +92 -0
- package/src/core/write-pipeline.ts +60 -8
- package/src/core/write-telemetry.ts +131 -0
- package/src/engine/activation.ts +1468 -1369
- package/src/engine/consolidation-scheduler.ts +1 -1
- package/src/engine/consolidation.ts +887 -869
- package/src/engine/eval.ts +6 -1
- package/src/hooks/sidecar.ts +55 -0
- package/src/index.ts +248 -227
- package/src/mcp.ts +1387 -1270
- package/src/recipes/index.ts +125 -0
- package/src/storage/pglite-schema.ts +27 -0
- package/src/storage/pglite.ts +1420 -1372
- package/src/storage/postgres.ts +1523 -1475
- package/src/storage/sqlite.ts +1936 -1861
- package/src/types/engram.ts +22 -0
package/src/core/embeddings.ts
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
33
|
+
console.error(`Query expander loaded in-process: ${MODEL_ID}`);
|
|
34
34
|
return inProcessInstance;
|
|
35
35
|
});
|
|
36
36
|
return inProcessInitPromise;
|
package/src/core/reranker.ts
CHANGED
|
@@ -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.
|
|
38
|
+
console.error(`Re-ranker model loaded in-process: ${MODEL_ID}`);
|
|
39
39
|
})();
|
|
40
40
|
return initPromise;
|
|
41
41
|
}
|