agent-working-memory 0.7.16 → 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.
- package/README.md +156 -15
- package/dist/adapters/claude-code.d.ts.map +1 -1
- package/dist/adapters/claude-code.js +2 -16
- package/dist/adapters/claude-code.js.map +1 -1
- package/dist/adapters/codex.d.ts.map +1 -1
- package/dist/adapters/codex.js +2 -11
- package/dist/adapters/codex.js.map +1 -1
- package/dist/adapters/common.d.ts +18 -0
- package/dist/adapters/common.d.ts.map +1 -1
- package/dist/adapters/common.js +254 -141
- package/dist/adapters/common.js.map +1 -1
- package/dist/adapters/cursor.d.ts.map +1 -1
- package/dist/adapters/cursor.js +2 -15
- package/dist/adapters/cursor.js.map +1 -1
- package/dist/adapters/http.d.ts.map +1 -1
- package/dist/adapters/http.js +28 -34
- package/dist/adapters/http.js.map +1 -1
- package/dist/api/routes.d.ts +1 -1
- package/dist/api/routes.d.ts.map +1 -1
- package/dist/api/routes.js +280 -113
- package/dist/api/routes.js.map +1 -1
- package/dist/cli/migrate.d.ts +42 -0
- package/dist/cli/migrate.d.ts.map +1 -0
- package/dist/cli/migrate.js +268 -0
- package/dist/cli/migrate.js.map +1 -0
- package/dist/cli.js +45 -1
- package/dist/cli.js.map +1 -1
- package/dist/coordination/circuit-breaker.d.ts +24 -0
- package/dist/coordination/circuit-breaker.d.ts.map +1 -0
- package/dist/coordination/circuit-breaker.js +70 -0
- package/dist/coordination/circuit-breaker.js.map +1 -0
- package/dist/coordination/failure-modes.d.ts +21 -0
- package/dist/coordination/failure-modes.d.ts.map +1 -0
- package/dist/coordination/failure-modes.js +49 -0
- package/dist/coordination/failure-modes.js.map +1 -0
- package/dist/coordination/peer-decisions.js +7 -7
- package/dist/coordination/routes.d.ts.map +1 -1
- package/dist/coordination/routes.js +44 -1
- package/dist/coordination/routes.js.map +1 -1
- package/dist/coordination/schema.d.ts.map +1 -1
- package/dist/coordination/schema.js +18 -0
- package/dist/coordination/schema.js.map +1 -1
- package/dist/coordination/schemas.d.ts +9 -9
- package/dist/coordination/stale.d.ts +9 -1
- package/dist/coordination/stale.d.ts.map +1 -1
- package/dist/coordination/stale.js +53 -9
- package/dist/coordination/stale.js.map +1 -1
- package/dist/core/embeddings.d.ts +16 -10
- package/dist/core/embeddings.d.ts.map +1 -1
- package/dist/core/embeddings.js +54 -38
- package/dist/core/embeddings.js.map +1 -1
- package/dist/core/ml-worker-entry.d.ts +17 -0
- package/dist/core/ml-worker-entry.d.ts.map +1 -0
- package/dist/core/ml-worker-entry.js +193 -0
- package/dist/core/ml-worker-entry.js.map +1 -0
- package/dist/core/ml-worker.d.ts +59 -0
- package/dist/core/ml-worker.d.ts.map +1 -0
- package/dist/core/ml-worker.js +253 -0
- package/dist/core/ml-worker.js.map +1 -0
- package/dist/core/query-expander.d.ts +13 -15
- package/dist/core/query-expander.d.ts.map +1 -1
- package/dist/core/query-expander.js +48 -54
- package/dist/core/query-expander.js.map +1 -1
- package/dist/core/reranker.d.ts +9 -19
- package/dist/core/reranker.d.ts.map +1 -1
- package/dist/core/reranker.js +33 -35
- package/dist/core/reranker.js.map +1 -1
- package/dist/core/salience.d.ts +32 -5
- package/dist/core/salience.d.ts.map +1 -1
- package/dist/core/salience.js +201 -28
- package/dist/core/salience.js.map +1 -1
- package/dist/core/write-pipeline.d.ts +128 -0
- package/dist/core/write-pipeline.d.ts.map +1 -0
- package/dist/core/write-pipeline.js +405 -0
- package/dist/core/write-pipeline.js.map +1 -0
- package/dist/engine/activation.d.ts +2 -2
- package/dist/engine/activation.d.ts.map +1 -1
- package/dist/engine/activation.js +238 -115
- package/dist/engine/activation.js.map +1 -1
- package/dist/engine/confidence.d.ts +62 -0
- package/dist/engine/confidence.d.ts.map +1 -0
- package/dist/engine/confidence.js +100 -0
- package/dist/engine/confidence.js.map +1 -0
- package/dist/engine/connections.d.ts +47 -8
- package/dist/engine/connections.d.ts.map +1 -1
- package/dist/engine/connections.js +83 -22
- package/dist/engine/connections.js.map +1 -1
- package/dist/engine/consolidation-scheduler.d.ts +46 -10
- package/dist/engine/consolidation-scheduler.d.ts.map +1 -1
- package/dist/engine/consolidation-scheduler.js +170 -50
- package/dist/engine/consolidation-scheduler.js.map +1 -1
- package/dist/engine/consolidation.d.ts +16 -2
- package/dist/engine/consolidation.d.ts.map +1 -1
- package/dist/engine/consolidation.js +143 -44
- package/dist/engine/consolidation.js.map +1 -1
- package/dist/engine/eval.d.ts +2 -2
- package/dist/engine/eval.d.ts.map +1 -1
- package/dist/engine/eval.js +9 -9
- package/dist/engine/eval.js.map +1 -1
- package/dist/engine/eviction.d.ts +4 -4
- package/dist/engine/eviction.d.ts.map +1 -1
- package/dist/engine/eviction.js +15 -15
- package/dist/engine/eviction.js.map +1 -1
- package/dist/engine/retraction.d.ts +93 -5
- package/dist/engine/retraction.d.ts.map +1 -1
- package/dist/engine/retraction.js +238 -19
- package/dist/engine/retraction.js.map +1 -1
- package/dist/engine/staging.d.ts +1 -1
- package/dist/engine/staging.d.ts.map +1 -1
- package/dist/engine/staging.js +3 -3
- package/dist/engine/staging.js.map +1 -1
- package/dist/hooks/sidecar.d.ts +1 -1
- package/dist/hooks/sidecar.d.ts.map +1 -1
- package/dist/hooks/sidecar.js +4 -4
- package/dist/hooks/sidecar.js.map +1 -1
- package/dist/index.js +48 -31
- package/dist/index.js.map +1 -1
- package/dist/mcp.js +110 -155
- package/dist/mcp.js.map +1 -1
- package/dist/storage/factory.d.ts +55 -0
- package/dist/storage/factory.d.ts.map +1 -0
- package/dist/storage/factory.js +135 -0
- package/dist/storage/factory.js.map +1 -0
- package/dist/storage/pglite-schema.d.ts +20 -0
- package/dist/storage/pglite-schema.d.ts.map +1 -0
- package/dist/storage/pglite-schema.js +165 -0
- package/dist/storage/pglite-schema.js.map +1 -0
- package/dist/storage/pglite.d.ts +187 -0
- package/dist/storage/pglite.d.ts.map +1 -0
- package/dist/storage/pglite.js +1114 -0
- package/dist/storage/pglite.js.map +1 -0
- package/dist/storage/sqlite.d.ts +117 -0
- package/dist/storage/sqlite.d.ts.map +1 -1
- package/dist/storage/sqlite.js +357 -8
- package/dist/storage/sqlite.js.map +1 -1
- package/dist/storage/store.d.ts +63 -0
- package/dist/storage/store.d.ts.map +1 -0
- package/dist/storage/store.js +27 -0
- package/dist/storage/store.js.map +1 -0
- package/dist/types/engram.d.ts +92 -2
- package/dist/types/engram.d.ts.map +1 -1
- package/dist/types/engram.js.map +1 -1
- package/package.json +3 -1
- package/src/adapters/claude-code.ts +218 -234
- package/src/adapters/codex.ts +252 -262
- package/src/adapters/common.ts +411 -284
- package/src/adapters/cursor.ts +135 -150
- package/src/adapters/http.ts +93 -100
- package/src/adapters/index.ts +31 -31
- package/src/adapters/types.ts +75 -75
- package/src/api/index.ts +3 -3
- package/src/api/routes.ts +367 -120
- package/src/cli/migrate.ts +307 -0
- package/src/cli.ts +37 -1
- package/src/coordination/circuit-breaker.ts +83 -0
- package/src/coordination/events.ts +90 -90
- package/src/coordination/failure-modes.ts +50 -0
- package/src/coordination/peer-decisions.ts +105 -105
- package/src/coordination/plugin-loader.ts +60 -60
- package/src/coordination/plugin.ts +44 -44
- package/src/coordination/routes.ts +56 -1
- package/src/coordination/schema.ts +13 -0
- package/src/coordination/stale.ts +80 -11
- package/src/coordination/types.ts +311 -311
- package/src/coordination/write-mutex.ts +69 -69
- package/src/core/auto-tagger.ts +168 -168
- package/src/core/decay.ts +63 -63
- package/src/core/embeddings.ts +110 -93
- package/src/core/index.ts +5 -5
- package/src/core/logger.ts +36 -36
- package/src/core/ml-worker-entry.ts +194 -0
- package/src/core/ml-worker.ts +281 -0
- package/src/core/query-expander.ts +122 -128
- package/src/core/reranker.ts +119 -125
- package/src/core/salience.ts +200 -33
- package/src/core/write-pipeline.ts +521 -0
- package/src/engine/activation.ts +235 -109
- package/src/engine/confidence.ts +120 -0
- package/src/engine/connections.ts +162 -103
- package/src/engine/consolidation-scheduler.ts +242 -125
- package/src/engine/consolidation.ts +138 -45
- package/src/engine/eval.ts +102 -102
- package/src/engine/eviction.ts +101 -101
- package/src/engine/index.ts +8 -8
- package/src/engine/retraction.ts +366 -116
- package/src/engine/staging.ts +74 -74
- package/src/hooks/sidecar.ts +5 -5
- package/src/index.ts +42 -28
- package/src/mcp.ts +105 -152
- package/src/storage/factory.ts +147 -0
- package/src/storage/index.ts +3 -3
- package/src/storage/pglite-schema.ts +166 -0
- package/src/storage/pglite.ts +1363 -0
- package/src/storage/sqlite.ts +402 -7
- package/src/storage/store.ts +80 -0
- package/src/types/agent.ts +67 -67
- package/src/types/checkpoint.ts +46 -46
- package/src/types/engram.ts +101 -3
- package/src/types/eval.ts +100 -100
- package/src/types/index.ts +6 -6
package/dist/core/reranker.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
// Copyright 2026 Robert Winter / Complete Ideas
|
|
2
2
|
// SPDX-License-Identifier: Apache-2.0
|
|
3
3
|
/**
|
|
4
|
-
* Cross-Encoder Re-Ranker
|
|
4
|
+
* Cross-Encoder Re-Ranker - scores (query, passage) pairs for relevance.
|
|
5
5
|
*
|
|
6
|
-
* Uses Xenova/ms-marco-MiniLM-L-6-v2 (~22MB ONNX)
|
|
7
|
-
*
|
|
8
|
-
*
|
|
9
|
-
*
|
|
6
|
+
* Uses Xenova/ms-marco-MiniLM-L-6-v2 (~22MB ONNX) trained on MS-MARCO
|
|
7
|
+
* passage ranking. Unlike bi-encoders, cross-encoders see both query and
|
|
8
|
+
* passage together via full attention - much better at judging if a
|
|
9
|
+
* passage actually answers a question.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
* Singleton pattern — call getReranker() to get the shared instance.
|
|
11
|
+
* AWM 0.8.x: inference dispatches through ml-worker.ts (currently in-process
|
|
12
|
+
* — see ml-worker.ts for the worker_threads → in-process revert rationale).
|
|
15
13
|
*/
|
|
16
14
|
import { AutoTokenizer, AutoModelForSequenceClassification, } from '@huggingface/transformers';
|
|
15
|
+
import { dispatchRerank, registerInProcessHandlers } from './ml-worker.js';
|
|
17
16
|
const DEFAULT_MODEL = 'Xenova/ms-marco-MiniLM-L-6-v2';
|
|
18
17
|
const MODEL_ID = process.env.AWM_RERANKER_MODEL || DEFAULT_MODEL;
|
|
18
|
+
// --- In-process fallback ---
|
|
19
19
|
let tokenizer = null;
|
|
20
20
|
let model = null;
|
|
21
21
|
let initPromise = null;
|
|
@@ -26,39 +26,20 @@ async function ensureLoaded() {
|
|
|
26
26
|
return initPromise;
|
|
27
27
|
initPromise = (async () => {
|
|
28
28
|
tokenizer = await AutoTokenizer.from_pretrained(MODEL_ID);
|
|
29
|
-
model = await AutoModelForSequenceClassification.from_pretrained(MODEL_ID, {
|
|
30
|
-
|
|
31
|
-
});
|
|
32
|
-
console.log(`Re-ranker model loaded: ${MODEL_ID}`);
|
|
29
|
+
model = await AutoModelForSequenceClassification.from_pretrained(MODEL_ID, { dtype: 'fp32' });
|
|
30
|
+
console.log(`Re-ranker model loaded in-process: ${MODEL_ID}`);
|
|
33
31
|
})();
|
|
34
32
|
return initPromise;
|
|
35
33
|
}
|
|
36
|
-
/** Kept for backwards compat — returns the model (unused externally). */
|
|
37
|
-
export async function getReranker() {
|
|
38
|
-
await ensureLoaded();
|
|
39
|
-
return model;
|
|
40
|
-
}
|
|
41
34
|
function sigmoid(x) {
|
|
42
35
|
return 1 / (1 + Math.exp(-x));
|
|
43
36
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
* Returns results sorted by relevance score (descending).
|
|
47
|
-
*
|
|
48
|
-
* Batch inference (0.7.14+): tokenizes all query-passage pairs in one call
|
|
49
|
-
* and runs a single model forward pass. Previously the loop tokenized + ran
|
|
50
|
-
* the model once per passage, which serialized 15-30 inference calls.
|
|
51
|
-
* Batching is roughly 3-5× faster on transformers.js because the
|
|
52
|
-
* tokenizer/model overhead amortizes.
|
|
53
|
-
*
|
|
54
|
-
* Falls back to per-passage scoring if the batch path errors (e.g. model
|
|
55
|
-
* doesn't support batched text_pair).
|
|
56
|
-
*/
|
|
57
|
-
export async function rerank(query, passages) {
|
|
37
|
+
async function inProcessRerank(args) {
|
|
38
|
+
const { query, passages } = args;
|
|
58
39
|
if (passages.length === 0)
|
|
59
40
|
return [];
|
|
60
41
|
await ensureLoaded();
|
|
61
|
-
//
|
|
42
|
+
// Batch path
|
|
62
43
|
try {
|
|
63
44
|
const queries = passages.map(() => query);
|
|
64
45
|
const inputs = tokenizer(queries, {
|
|
@@ -70,7 +51,6 @@ export async function rerank(query, passages) {
|
|
|
70
51
|
const output = await model(inputs);
|
|
71
52
|
const logits = output.logits ?? output.last_hidden_state;
|
|
72
53
|
const data = logits.data;
|
|
73
|
-
// logits.data is [batch_size] when there's a single output dim
|
|
74
54
|
const results = [];
|
|
75
55
|
for (let i = 0; i < passages.length; i++) {
|
|
76
56
|
const rawLogit = Number(data[i] ?? 0);
|
|
@@ -80,7 +60,7 @@ export async function rerank(query, passages) {
|
|
|
80
60
|
return results;
|
|
81
61
|
}
|
|
82
62
|
catch {
|
|
83
|
-
//
|
|
63
|
+
// Per-passage fallback (the original 0.7.13 path)
|
|
84
64
|
const results = [];
|
|
85
65
|
for (let i = 0; i < passages.length; i++) {
|
|
86
66
|
try {
|
|
@@ -103,4 +83,22 @@ export async function rerank(query, passages) {
|
|
|
103
83
|
return results;
|
|
104
84
|
}
|
|
105
85
|
}
|
|
86
|
+
// Register the in-process handler with the pool
|
|
87
|
+
registerInProcessHandlers({ rerank: inProcessRerank });
|
|
88
|
+
// --- Public API ---
|
|
89
|
+
/** Kept for backwards compat. */
|
|
90
|
+
export async function getReranker() {
|
|
91
|
+
await ensureLoaded();
|
|
92
|
+
return model;
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* Re-rank candidate passages against a query using the cross-encoder.
|
|
96
|
+
* Returns results sorted by relevance score (descending).
|
|
97
|
+
* Dispatches to the worker pool (or in-process fallback).
|
|
98
|
+
*/
|
|
99
|
+
export async function rerank(query, passages) {
|
|
100
|
+
if (passages.length === 0)
|
|
101
|
+
return [];
|
|
102
|
+
return dispatchRerank({ query, passages });
|
|
103
|
+
}
|
|
106
104
|
//# sourceMappingURL=reranker.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"reranker.js","sourceRoot":"","sources":["../../src/core/reranker.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,sCAAsC;AACtC
|
|
1
|
+
{"version":3,"file":"reranker.js","sourceRoot":"","sources":["../../src/core/reranker.ts"],"names":[],"mappings":"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"}
|
package/dist/core/salience.d.ts
CHANGED
|
@@ -8,12 +8,14 @@
|
|
|
8
8
|
* - Deterministic heuristics first, LLM augmentation optional
|
|
9
9
|
*/
|
|
10
10
|
import type { SalienceFeatures, MemoryClass } from '../types/index.js';
|
|
11
|
-
import type { EngramStore } from '../storage/
|
|
11
|
+
import type { IEngramStore as EngramStore } from '../storage/store.js';
|
|
12
12
|
export type SalienceEventType = 'decision' | 'friction' | 'surprise' | 'causal' | 'observation' | 'user_feedback';
|
|
13
13
|
/** Returns true if the content looks like direct user feedback that should auto-promote to canonical. */
|
|
14
14
|
export declare function detectUserFeedback(content: string): boolean;
|
|
15
15
|
/** Returns true if the content looks like a verified operational/batch record that should auto-bump salience. */
|
|
16
16
|
export declare function detectVerifiedFinding(content: string): boolean;
|
|
17
|
+
/** Returns true if the content looks like a routine operational ping that adds no learning value. */
|
|
18
|
+
export declare function detectTrivialOperation(content: string): boolean;
|
|
17
19
|
export interface SalienceInput {
|
|
18
20
|
content: string;
|
|
19
21
|
eventType?: SalienceEventType;
|
|
@@ -46,7 +48,7 @@ export declare function evaluateSalience(input: SalienceInput, activeThreshold?:
|
|
|
46
48
|
*
|
|
47
49
|
* The check is cheap (~1ms) because BM25 is synchronous SQLite FTS5.
|
|
48
50
|
*/
|
|
49
|
-
export declare function computeNovelty(store: EngramStore, agentId: string, concept: string, content: string): number
|
|
51
|
+
export declare function computeNovelty(store: EngramStore, agentId: string, concept: string, content: string): Promise<number>;
|
|
50
52
|
/**
|
|
51
53
|
* Result from novelty computation with match info for reinforcement.
|
|
52
54
|
*/
|
|
@@ -56,9 +58,34 @@ export interface NoveltyResult {
|
|
|
56
58
|
matchScore: number;
|
|
57
59
|
}
|
|
58
60
|
/**
|
|
59
|
-
* Compute novelty score AND return the best matching engram (for
|
|
60
|
-
*
|
|
61
|
+
* Compute novelty score AND return the best matching engram (for
|
|
62
|
+
* reinforcement-on-duplicate).
|
|
63
|
+
*
|
|
64
|
+
* **v0.8.5+: dual-signal novelty (BM25 ∨ cosine, max).**
|
|
65
|
+
*
|
|
66
|
+
* When `embedding` is provided, computes both:
|
|
67
|
+
* - BM25 lexical match (existing path) — catches verbatim duplicates,
|
|
68
|
+
* identifier-driven matches, recall-output reingestion attempts.
|
|
69
|
+
* - Cosine semantic match (new) — catches paraphrased duplicates,
|
|
70
|
+
* vocabulary-drifted restatements of the same fact, cross-role
|
|
71
|
+
* rephrasings (user question → assistant answer about same fact).
|
|
72
|
+
*
|
|
73
|
+
* Takes `max(bm25Score, cosineSimilarity)` and returns the engram from
|
|
74
|
+
* whichever signal won. Why both?
|
|
75
|
+
* - BM25 is *backend-dependent* — Postgres ts_rank_cd and SQLite FTS5
|
|
76
|
+
* BM25 are different algorithms producing different rankings for
|
|
77
|
+
* short-text matches (verified empirically 2026-05-26). Cosine is
|
|
78
|
+
* *backend-agnostic* — same embedding model produces identical
|
|
79
|
+
* similarity scores on either backend.
|
|
80
|
+
* - Cosine alone misses the exact-text cases BM25 catches (recall
|
|
81
|
+
* output leakage, identifier matching). BM25 alone misses the
|
|
82
|
+
* semantic cases cosine catches (paraphrase, vocabulary drift —
|
|
83
|
+
* the LoCoMo pattern of "user said X" across conversations).
|
|
84
|
+
*
|
|
85
|
+
* When `embedding` is null/omitted, falls back to BM25-only (preserves
|
|
86
|
+
* backward compat with v0.8.4 and earlier callers).
|
|
87
|
+
*
|
|
61
88
|
* Optionally checks workspace-scoped memories too (cross-agent dedup).
|
|
62
89
|
*/
|
|
63
|
-
export declare function computeNoveltyWithMatch(store: EngramStore, agentId: string, concept: string, content: string, workspace?: string | null): NoveltyResult
|
|
90
|
+
export declare function computeNoveltyWithMatch(store: EngramStore, agentId: string, concept: string, content: string, workspace?: string | null, embedding?: number[] | null): Promise<NoveltyResult>;
|
|
64
91
|
//# sourceMappingURL=salience.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"salience.d.ts","sourceRoot":"","sources":["../../src/core/salience.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"salience.d.ts","sourceRoot":"","sources":["../../src/core/salience.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,gBAAgB,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AACvE,OAAO,KAAK,EAAE,YAAY,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvE,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,QAAQ,GAAG,aAAa,GAAG,eAAe,CAAC;AAsBlH,yGAAyG;AACzG,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAG3D;AA2BD,iHAAiH;AACjH,wBAAgB,qBAAqB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAO9D;AA6BD,qGAAqG;AACrG,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAU/D;AAED,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,iBAAiB,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,sGAAsG;IACtG,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,mFAAmF;IACnF,WAAW,CAAC,EAAE,WAAW,CAAC;CAC3B;AAED,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,QAAQ,GAAG,SAAS,GAAG,SAAS,CAAC;IAC9C,QAAQ,EAAE,gBAAgB,CAAC;IAC3B,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAeD;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,aAAa,EACpB,eAAe,GAAE,MAAY,EAC7B,gBAAgB,GAAE,MAAY,GAC7B,cAAc,CA4JhB;AAED;;;;;;;;;GASG;AACH,wBAAsB,cAAc,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CA+C3H;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,eAAe,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,UAAU,EAAE,MAAM,CAAC;CACpB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,wBAAsB,uBAAuB,CAC3C,KAAK,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EACrE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,EACzB,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,IAAI,GAC1B,OAAO,CAAC,aAAa,CAAC,CAsFxB"}
|
package/dist/core/salience.js
CHANGED
|
@@ -69,6 +69,49 @@ export function detectVerifiedFinding(content) {
|
|
|
69
69
|
const idCount = (text.match(CONCRETE_ID_PATTERN) || []).length;
|
|
70
70
|
return dateCount + idCount >= 2;
|
|
71
71
|
}
|
|
72
|
+
/**
|
|
73
|
+
* Auto-detect trivial routine operations: file reads, status pings, log-line
|
|
74
|
+
* completions. These have high BM25 novelty (each one has different filenames,
|
|
75
|
+
* timestamps, attempt counts) but represent NO learning value — they're the
|
|
76
|
+
* sort of background chatter a working agent generates by the thousand.
|
|
77
|
+
*
|
|
78
|
+
* Why this exists: the novelty weight (0.45) puts a floor at ~0.45 for every
|
|
79
|
+
* write on a fresh agent, which prevents trivial observations from ever
|
|
80
|
+
* routing to 'discard'. self-test 1.2 ("File read completed successfully for
|
|
81
|
+
* file 0") explicitly asks for trivial → discard. We can't detect triviality
|
|
82
|
+
* from features alone — the caller passes surprise=0, effort=0 but novelty
|
|
83
|
+
* computes to 1.0 — so we need a content shape check.
|
|
84
|
+
*
|
|
85
|
+
* Pattern requires:
|
|
86
|
+
* - A routine verb phrase: "completed", "succeeded", "finished", "returned",
|
|
87
|
+
* "loaded", "saved", "read", "wrote", "synced", "pinged", "checked",
|
|
88
|
+
* "started", "stopped", "rotated", "flushed"
|
|
89
|
+
* - Generic operational noun: file/log/request/response/status/job/connection
|
|
90
|
+
* - Total length under ~150 chars (trivial events are short)
|
|
91
|
+
*
|
|
92
|
+
* Matched memories get a salience CAP at 0.10 (below the 0.2 stagingThreshold,
|
|
93
|
+
* so they route to 'discard'). Caller can still force-store via
|
|
94
|
+
* memory_class=canonical or memory_class=structural.
|
|
95
|
+
*/
|
|
96
|
+
const TRIVIAL_VERB_PATTERN = /\b(completed|succeeded|finished|returned|loaded|saved|read|wrote|synced|pinged|checked|started|stopped|rotated|flushed)\b/i;
|
|
97
|
+
const TRIVIAL_NOUN_PATTERN = /\b(file|log|request|response|status|job|connection|task|cron|sync|tick|batch)\b/i;
|
|
98
|
+
/** Returns true if the content looks like a routine operational ping that adds no learning value. */
|
|
99
|
+
export function detectTrivialOperation(content) {
|
|
100
|
+
if (typeof content !== 'string' || content.length === 0)
|
|
101
|
+
return false;
|
|
102
|
+
const text = content.trim();
|
|
103
|
+
if (text.length > 150)
|
|
104
|
+
return false;
|
|
105
|
+
if (!TRIVIAL_VERB_PATTERN.test(text))
|
|
106
|
+
return false;
|
|
107
|
+
if (!TRIVIAL_NOUN_PATTERN.test(text))
|
|
108
|
+
return false;
|
|
109
|
+
// Don't trip on verified findings — they share some verbs (Completed) but
|
|
110
|
+
// have concrete identifiers. detectVerifiedFinding has priority.
|
|
111
|
+
if (detectVerifiedFinding(text))
|
|
112
|
+
return false;
|
|
113
|
+
return true;
|
|
114
|
+
}
|
|
72
115
|
/**
|
|
73
116
|
* Weights for the salience scoring formula.
|
|
74
117
|
* Novelty is the strongest signal — new information should always be stored.
|
|
@@ -92,6 +135,7 @@ export function evaluateSalience(input, activeThreshold = 0.4, stagingThreshold
|
|
|
92
135
|
let resolvedMemoryClass = input.memoryClass ?? 'working';
|
|
93
136
|
let autoPromoted = false;
|
|
94
137
|
let verifiedFindingFloor = false;
|
|
138
|
+
let trivialOperationCap = false;
|
|
95
139
|
if (detectUserFeedback(input.content)) {
|
|
96
140
|
resolvedEventType = 'user_feedback';
|
|
97
141
|
resolvedMemoryClass = 'canonical';
|
|
@@ -106,6 +150,11 @@ export function evaluateSalience(input, activeThreshold = 0.4, stagingThreshold
|
|
|
106
150
|
}
|
|
107
151
|
verifiedFindingFloor = true;
|
|
108
152
|
}
|
|
153
|
+
else if (detectTrivialOperation(input.content)) {
|
|
154
|
+
// Trivial routine operation — cap salience below stagingThreshold so it
|
|
155
|
+
// routes to 'discard'. Caller can still force-keep via canonical/structural.
|
|
156
|
+
trivialOperationCap = true;
|
|
157
|
+
}
|
|
109
158
|
const features = {
|
|
110
159
|
surprise: input.surprise ?? 0,
|
|
111
160
|
decisionMade: input.decisionMade ?? false,
|
|
@@ -118,6 +167,8 @@ export function evaluateSalience(input, activeThreshold = 0.4, stagingThreshold
|
|
|
118
167
|
reasonCodes.push('auto:user_feedback');
|
|
119
168
|
if (verifiedFindingFloor)
|
|
120
169
|
reasonCodes.push('auto:verified_finding');
|
|
170
|
+
if (trivialOperationCap)
|
|
171
|
+
reasonCodes.push('auto:trivial_operation');
|
|
121
172
|
// Novelty: 1.0 = completely new info, 0 = exact duplicate exists
|
|
122
173
|
// Default to 0.8 (assume mostly novel) when caller doesn't check
|
|
123
174
|
const novelty = input.novelty ?? 0.8;
|
|
@@ -139,32 +190,74 @@ export function evaluateSalience(input, activeThreshold = 0.4, stagingThreshold
|
|
|
139
190
|
reasonCodes.push('novel_information');
|
|
140
191
|
if (novelty < 0.3)
|
|
141
192
|
reasonCodes.push('redundant_information');
|
|
142
|
-
// Event type bonus
|
|
193
|
+
// Event type bonus — gated by signal strength. The bonus represents the
|
|
194
|
+
// confidence that an event of this type warrants the type-specific boost.
|
|
195
|
+
// If the caller labels something `friction` but every signal is near zero,
|
|
196
|
+
// they're telling the system the friction was minor — the typeBonus is
|
|
197
|
+
// attenuated to reflect that. Without this gate, any labeled friction
|
|
198
|
+
// event clears the active threshold on novelty alone (self-test 1.4).
|
|
143
199
|
let typeBonus = 0;
|
|
200
|
+
let typeReason = '';
|
|
144
201
|
switch (features.eventType) {
|
|
145
202
|
case 'decision':
|
|
146
203
|
typeBonus = 0.15;
|
|
147
|
-
|
|
204
|
+
typeReason = 'event:decision';
|
|
148
205
|
break;
|
|
149
206
|
case 'friction':
|
|
150
207
|
typeBonus = 0.2;
|
|
151
|
-
|
|
208
|
+
typeReason = 'event:friction';
|
|
152
209
|
break;
|
|
153
210
|
case 'surprise':
|
|
154
211
|
typeBonus = 0.25;
|
|
155
|
-
|
|
212
|
+
typeReason = 'event:surprise';
|
|
156
213
|
break;
|
|
157
214
|
case 'causal':
|
|
158
215
|
typeBonus = 0.2;
|
|
159
|
-
|
|
216
|
+
typeReason = 'event:causal';
|
|
160
217
|
break;
|
|
161
218
|
case 'user_feedback':
|
|
162
219
|
typeBonus = 0.3;
|
|
163
|
-
|
|
220
|
+
typeReason = 'event:user_feedback';
|
|
164
221
|
break;
|
|
165
222
|
case 'observation': break;
|
|
166
223
|
}
|
|
167
|
-
|
|
224
|
+
// Signal-weakness gate. The novelty score alone (~0.45 for fresh content)
|
|
225
|
+
// would clear the active threshold (0.4), so any labelled event with no
|
|
226
|
+
// backing numerical signals lands as 'active' regardless of the label's
|
|
227
|
+
// semantics. That's wrong for friction/causal: those types describe events
|
|
228
|
+
// that *happened to the agent* and benefit from explicit intensity signals.
|
|
229
|
+
// surprise / user_feedback / decision-with-decisionMade are exempt: their
|
|
230
|
+
// label alone is the signal.
|
|
231
|
+
const exemptFromAttenuation = features.eventType === 'user_feedback'
|
|
232
|
+
|| features.eventType === 'surprise'
|
|
233
|
+
|| (features.eventType === 'decision' && features.decisionMade);
|
|
234
|
+
const signalStrength = features.surprise + features.causalDepth + features.resolutionEffort + (features.decisionMade ? 0.5 : 0);
|
|
235
|
+
const signalsAreWeak = !exemptFromAttenuation && signalStrength < 0.5;
|
|
236
|
+
if (typeBonus > 0 && signalsAreWeak) {
|
|
237
|
+
typeBonus *= 0.25; // weak-signal event: keep a hint, not the full bonus
|
|
238
|
+
typeReason += ':attenuated';
|
|
239
|
+
}
|
|
240
|
+
if (typeReason)
|
|
241
|
+
reasonCodes.push(typeReason);
|
|
242
|
+
// Cap the novelty contribution when signals are weak AND the eventType
|
|
243
|
+
// claims a typeBonus (friction/causal). Without this, novelty=1.0 alone
|
|
244
|
+
// (0.45 noveltyScore) clears the active threshold (0.4), making any
|
|
245
|
+
// weakly-signalled non-exempt write 'active' regardless of intent.
|
|
246
|
+
// Plain observations (typeBonus=0) are NOT capped — a novel observation
|
|
247
|
+
// is still default-active even without explicit signals.
|
|
248
|
+
let cappedNoveltyScore = noveltyScore;
|
|
249
|
+
if (signalsAreWeak && typeBonus > 0) {
|
|
250
|
+
cappedNoveltyScore = Math.min(noveltyScore, 0.30);
|
|
251
|
+
if (cappedNoveltyScore < noveltyScore)
|
|
252
|
+
reasonCodes.push('novelty:capped');
|
|
253
|
+
}
|
|
254
|
+
let score = Math.min(surpriseScore + decisionScore + causalScore + effortScore + cappedNoveltyScore + typeBonus, 1.0);
|
|
255
|
+
// Apply triviality cap BEFORE memoryClass floor — the floor still wins for
|
|
256
|
+
// canonical/structural writes (covered below). Trivial cap forces routine
|
|
257
|
+
// operational chatter below stagingThreshold.
|
|
258
|
+
if (trivialOperationCap) {
|
|
259
|
+
score = Math.min(score, 0.1);
|
|
260
|
+
}
|
|
168
261
|
// Memory class overrides
|
|
169
262
|
const memoryClass = resolvedMemoryClass;
|
|
170
263
|
if (memoryClass === 'canonical') {
|
|
@@ -172,6 +265,16 @@ export function evaluateSalience(input, activeThreshold = 0.4, stagingThreshold
|
|
|
172
265
|
score = Math.max(score, 0.7);
|
|
173
266
|
reasonCodes.push('class:canonical');
|
|
174
267
|
}
|
|
268
|
+
else if (memoryClass === 'structural') {
|
|
269
|
+
// Structural memories (0.8): system-written event-log records — chapter
|
|
270
|
+
// analyses, promise advancements, materialized-view feeds. Floor 0.7 like
|
|
271
|
+
// canonical (always preserved by construction) but distinct reasonCode
|
|
272
|
+
// so retrieval paths can filter them out of cognitive `/activate` by
|
|
273
|
+
// default. Caller controls embedding + temporal-edge skipping in the
|
|
274
|
+
// write pipeline.
|
|
275
|
+
score = Math.max(score, 0.7);
|
|
276
|
+
reasonCodes.push('class:structural');
|
|
277
|
+
}
|
|
175
278
|
else if (memoryClass === 'ephemeral') {
|
|
176
279
|
reasonCodes.push('class:ephemeral');
|
|
177
280
|
}
|
|
@@ -180,8 +283,9 @@ export function evaluateSalience(input, activeThreshold = 0.4, stagingThreshold
|
|
|
180
283
|
score = Math.max(score, 0.45);
|
|
181
284
|
}
|
|
182
285
|
let disposition;
|
|
183
|
-
if (memoryClass === 'canonical') {
|
|
184
|
-
// Canonical
|
|
286
|
+
if (memoryClass === 'canonical' || memoryClass === 'structural') {
|
|
287
|
+
// Canonical = source-of-truth; structural = system-written record.
|
|
288
|
+
// Both always go active — they represent intentional permanent state.
|
|
185
289
|
disposition = 'active';
|
|
186
290
|
reasonCodes.push('disposition:active');
|
|
187
291
|
}
|
|
@@ -209,13 +313,13 @@ export function evaluateSalience(input, activeThreshold = 0.4, stagingThreshold
|
|
|
209
313
|
*
|
|
210
314
|
* The check is cheap (~1ms) because BM25 is synchronous SQLite FTS5.
|
|
211
315
|
*/
|
|
212
|
-
export function computeNovelty(store, agentId, concept, content) {
|
|
316
|
+
export async function computeNovelty(store, agentId, concept, content) {
|
|
213
317
|
try {
|
|
214
318
|
// Search using concept + first 100 chars of content (enough to detect duplicates, fast)
|
|
215
319
|
const contentStr = typeof content === 'string' ? content : '';
|
|
216
320
|
const conceptStr = typeof concept === 'string' ? concept : '';
|
|
217
321
|
const searchText = `${conceptStr} ${contentStr.slice(0, 100)}`;
|
|
218
|
-
const results = store.searchBM25WithRank(agentId, searchText, 5);
|
|
322
|
+
const results = await store.searchBM25WithRank(agentId, searchText, 5);
|
|
219
323
|
if (results.length === 0)
|
|
220
324
|
return 1.0; // Nothing similar — fully novel
|
|
221
325
|
// searchBM25WithRank normalizes scores to 0..1 via |rank|/(1+|rank|).
|
|
@@ -257,35 +361,102 @@ export function computeNovelty(store, agentId, concept, content) {
|
|
|
257
361
|
}
|
|
258
362
|
}
|
|
259
363
|
/**
|
|
260
|
-
* Compute novelty score AND return the best matching engram (for
|
|
261
|
-
*
|
|
364
|
+
* Compute novelty score AND return the best matching engram (for
|
|
365
|
+
* reinforcement-on-duplicate).
|
|
366
|
+
*
|
|
367
|
+
* **v0.8.5+: dual-signal novelty (BM25 ∨ cosine, max).**
|
|
368
|
+
*
|
|
369
|
+
* When `embedding` is provided, computes both:
|
|
370
|
+
* - BM25 lexical match (existing path) — catches verbatim duplicates,
|
|
371
|
+
* identifier-driven matches, recall-output reingestion attempts.
|
|
372
|
+
* - Cosine semantic match (new) — catches paraphrased duplicates,
|
|
373
|
+
* vocabulary-drifted restatements of the same fact, cross-role
|
|
374
|
+
* rephrasings (user question → assistant answer about same fact).
|
|
375
|
+
*
|
|
376
|
+
* Takes `max(bm25Score, cosineSimilarity)` and returns the engram from
|
|
377
|
+
* whichever signal won. Why both?
|
|
378
|
+
* - BM25 is *backend-dependent* — Postgres ts_rank_cd and SQLite FTS5
|
|
379
|
+
* BM25 are different algorithms producing different rankings for
|
|
380
|
+
* short-text matches (verified empirically 2026-05-26). Cosine is
|
|
381
|
+
* *backend-agnostic* — same embedding model produces identical
|
|
382
|
+
* similarity scores on either backend.
|
|
383
|
+
* - Cosine alone misses the exact-text cases BM25 catches (recall
|
|
384
|
+
* output leakage, identifier matching). BM25 alone misses the
|
|
385
|
+
* semantic cases cosine catches (paraphrase, vocabulary drift —
|
|
386
|
+
* the LoCoMo pattern of "user said X" across conversations).
|
|
387
|
+
*
|
|
388
|
+
* When `embedding` is null/omitted, falls back to BM25-only (preserves
|
|
389
|
+
* backward compat with v0.8.4 and earlier callers).
|
|
390
|
+
*
|
|
262
391
|
* Optionally checks workspace-scoped memories too (cross-agent dedup).
|
|
263
392
|
*/
|
|
264
|
-
export function computeNoveltyWithMatch(store, agentId, concept, content, workspace) {
|
|
393
|
+
export async function computeNoveltyWithMatch(store, agentId, concept, content, workspace, embedding) {
|
|
265
394
|
try {
|
|
266
395
|
const contentStr = typeof content === 'string' ? content : '';
|
|
267
396
|
const conceptStr = typeof concept === 'string' ? concept : '';
|
|
268
397
|
const searchText = `${conceptStr} ${contentStr.slice(0, 100)}`;
|
|
269
|
-
//
|
|
270
|
-
const
|
|
271
|
-
// Workspace search — only if the store supports it (v0.5.4+)
|
|
398
|
+
// BM25 channel (existing) — agent-scoped + optional workspace.
|
|
399
|
+
const bm25Results = await store.searchBM25WithRank(agentId, searchText, 3);
|
|
272
400
|
let wsResults = [];
|
|
273
401
|
if (workspace && typeof store.searchBM25WithRankWorkspace === 'function') {
|
|
274
|
-
wsResults = store.searchBM25WithRankWorkspace(agentId, searchText, 3, workspace);
|
|
402
|
+
wsResults = await store.searchBM25WithRankWorkspace(agentId, searchText, 3, workspace);
|
|
403
|
+
}
|
|
404
|
+
const allBm25 = [...bm25Results, ...wsResults];
|
|
405
|
+
allBm25.sort((a, b) => b.bm25Score - a.bm25Score);
|
|
406
|
+
const topBm25 = allBm25[0]
|
|
407
|
+
? { engramId: allBm25[0].engram.id, score: allBm25[0].bm25Score, engram: allBm25[0].engram }
|
|
408
|
+
: null;
|
|
409
|
+
// Cosine channel (v0.8.5) — only when caller supplies an embedding.
|
|
410
|
+
// The embed cost is paid once in the write-pipeline pre-novelty and
|
|
411
|
+
// re-used for the engram's stored vector, so we don't double-embed.
|
|
412
|
+
let topCosine = null;
|
|
413
|
+
if (embedding && embedding.length > 0) {
|
|
414
|
+
try {
|
|
415
|
+
const hits = await store.searchByVector(agentId, embedding, 3);
|
|
416
|
+
if (hits.length > 0) {
|
|
417
|
+
const h = hits[0];
|
|
418
|
+
// pgvector distance ≈ 1 - cosineSimilarity for unit-norm BGE vectors.
|
|
419
|
+
// SQLite searchByVector returns distance = 1 - sim in the same form.
|
|
420
|
+
// Clamp into [0, 1] to be safe with floating-point drift.
|
|
421
|
+
const sim = Math.max(0, Math.min(1, 1 - h.distance));
|
|
422
|
+
topCosine = { engramId: h.engram.id, score: sim, engram: h.engram };
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
catch { /* cosine channel optional — fall back to BM25 alone */ }
|
|
426
|
+
}
|
|
427
|
+
// Combine: take the higher-confidence signal. If both fired and they
|
|
428
|
+
// identify the same engram, scores reinforce each other (we still take
|
|
429
|
+
// max, but the matched engram is the same). If they identify *different*
|
|
430
|
+
// engrams (one semantic match, one lexical), the higher score wins —
|
|
431
|
+
// typically the more discriminating signal for that particular content.
|
|
432
|
+
//
|
|
433
|
+
// Tested MIN and cosine-primary on 2026-05-26 to address PGlite token
|
|
434
|
+
// bloat; both dropped accuracy 7–20pp across backends. The bloat is a
|
|
435
|
+
// recall-output problem (returning full merged engram content when only
|
|
436
|
+
// a slice matches the query), not a novelty problem. Keeping MAX
|
|
437
|
+
// preserves the 100% / 97.5% accuracy we had on PGlite / SQLite.
|
|
438
|
+
let combinedTop;
|
|
439
|
+
if (topCosine && topBm25) {
|
|
440
|
+
combinedTop = topCosine.score >= topBm25.score ? topCosine : topBm25;
|
|
275
441
|
}
|
|
276
|
-
|
|
277
|
-
|
|
442
|
+
else if (topCosine) {
|
|
443
|
+
combinedTop = topCosine;
|
|
444
|
+
}
|
|
445
|
+
else if (topBm25) {
|
|
446
|
+
combinedTop = topBm25;
|
|
447
|
+
}
|
|
448
|
+
else {
|
|
278
449
|
return { novelty: 1.0, matchedEngramId: null, matchScore: 0 };
|
|
279
|
-
|
|
280
|
-
const
|
|
281
|
-
const topScore = top.bm25Score;
|
|
450
|
+
}
|
|
451
|
+
const topScore = combinedTop.score;
|
|
282
452
|
// Quadratic dampening — see computeNovelty for curve rationale
|
|
283
453
|
const baseNovelty = 1.0 - topScore * topScore;
|
|
284
|
-
// Recent-only concept penalty (30d window)
|
|
454
|
+
// Recent-only concept penalty (30d window). Check across all matches we
|
|
455
|
+
// saw on EITHER channel — exact-concept repeat counts as a near-duplicate
|
|
456
|
+
// regardless of which signal noticed it.
|
|
285
457
|
const conceptLower = conceptStr.toLowerCase().trim();
|
|
286
458
|
const cutoffMs = Date.now() - 30 * 24 * 60 * 60 * 1000;
|
|
287
|
-
const
|
|
288
|
-
const eng = r.engram;
|
|
459
|
+
const checkExactConcept = (eng) => {
|
|
289
460
|
if (eng?.concept?.toLowerCase().trim() !== conceptLower)
|
|
290
461
|
return false;
|
|
291
462
|
const created = eng?.createdAt;
|
|
@@ -295,10 +466,12 @@ export function computeNoveltyWithMatch(store, agentId, concept, content, worksp
|
|
|
295
466
|
? created.getTime()
|
|
296
467
|
: typeof created === 'number' ? created : Date.parse(created);
|
|
297
468
|
return Number.isFinite(createdMs) && createdMs >= cutoffMs;
|
|
298
|
-
}
|
|
469
|
+
};
|
|
470
|
+
const exactConceptRecent = allBm25.some(r => checkExactConcept(r.engram))
|
|
471
|
+
|| (topCosine ? checkExactConcept(topCosine.engram) : false);
|
|
299
472
|
const conceptPenalty = exactConceptRecent ? 0.3 : 0;
|
|
300
473
|
const novelty = Math.max(0.05, Math.min(0.95, baseNovelty - conceptPenalty));
|
|
301
|
-
return { novelty, matchedEngramId:
|
|
474
|
+
return { novelty, matchedEngramId: combinedTop.engramId, matchScore: topScore };
|
|
302
475
|
}
|
|
303
476
|
catch {
|
|
304
477
|
return { novelty: 0.8, matchedEngramId: null, matchScore: 0 };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"salience.js","sourceRoot":"","sources":["../../src/core/salience.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"salience.js","sourceRoot":"","sources":["../../src/core/salience.ts"],"names":[],"mappings":"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"}
|