agent-working-memory 0.17.0 → 0.19.0

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 (165) hide show
  1. package/README.md +8 -5
  2. package/dist/adapters/common.d.ts +34 -0
  3. package/dist/adapters/common.d.ts.map +1 -1
  4. package/dist/adapters/common.js +528 -446
  5. package/dist/adapters/common.js.map +1 -1
  6. package/dist/api/routes.d.ts.map +1 -1
  7. package/dist/api/routes.js +19 -0
  8. package/dist/api/routes.js.map +1 -1
  9. package/dist/cli/migrate.d.ts.map +1 -1
  10. package/dist/cli/migrate.js +31 -29
  11. package/dist/cli/migrate.js.map +1 -1
  12. package/dist/core/asked-value.d.ts +37 -0
  13. package/dist/core/asked-value.d.ts.map +1 -0
  14. package/dist/core/asked-value.js +77 -0
  15. package/dist/core/asked-value.js.map +1 -0
  16. package/dist/core/conflicts.d.ts +89 -0
  17. package/dist/core/conflicts.d.ts.map +1 -0
  18. package/dist/core/conflicts.js +267 -0
  19. package/dist/core/conflicts.js.map +1 -0
  20. package/dist/core/embeddings.d.ts +14 -2
  21. package/dist/core/embeddings.d.ts.map +1 -1
  22. package/dist/core/embeddings.js +32 -10
  23. package/dist/core/embeddings.js.map +1 -1
  24. package/dist/core/format-recall.d.ts +21 -1
  25. package/dist/core/format-recall.d.ts.map +1 -1
  26. package/dist/core/format-recall.js +60 -5
  27. package/dist/core/format-recall.js.map +1 -1
  28. package/dist/core/ml-worker.d.ts +24 -1
  29. package/dist/core/ml-worker.d.ts.map +1 -1
  30. package/dist/core/ml-worker.js +165 -4
  31. package/dist/core/ml-worker.js.map +1 -1
  32. package/dist/core/model-daemon-client.d.ts +77 -0
  33. package/dist/core/model-daemon-client.d.ts.map +1 -0
  34. package/dist/core/model-daemon-client.js +383 -0
  35. package/dist/core/model-daemon-client.js.map +1 -0
  36. package/dist/core/model-daemon-server.d.ts +71 -0
  37. package/dist/core/model-daemon-server.d.ts.map +1 -0
  38. package/dist/core/model-daemon-server.js +363 -0
  39. package/dist/core/model-daemon-server.js.map +1 -0
  40. package/dist/core/model-daemon.d.ts +137 -0
  41. package/dist/core/model-daemon.d.ts.map +1 -0
  42. package/dist/core/model-daemon.js +231 -0
  43. package/dist/core/model-daemon.js.map +1 -0
  44. package/dist/core/query-expander.d.ts +5 -0
  45. package/dist/core/query-expander.d.ts.map +1 -1
  46. package/dist/core/query-expander.js +3 -2
  47. package/dist/core/query-expander.js.map +1 -1
  48. package/dist/core/recall-config.d.ts +1 -1
  49. package/dist/core/recall-config.d.ts.map +1 -1
  50. package/dist/core/recall-config.js +5 -0
  51. package/dist/core/recall-config.js.map +1 -1
  52. package/dist/core/rerank-window.d.ts +7 -2
  53. package/dist/core/rerank-window.d.ts.map +1 -1
  54. package/dist/core/rerank-window.js +9 -4
  55. package/dist/core/rerank-window.js.map +1 -1
  56. package/dist/core/rerank2.d.ts +52 -2
  57. package/dist/core/rerank2.d.ts.map +1 -1
  58. package/dist/core/rerank2.js +60 -3
  59. package/dist/core/rerank2.js.map +1 -1
  60. package/dist/core/reranker.d.ts +19 -0
  61. package/dist/core/reranker.d.ts.map +1 -1
  62. package/dist/core/reranker.js +90 -13
  63. package/dist/core/reranker.js.map +1 -1
  64. package/dist/core/trust.d.ts +32 -0
  65. package/dist/core/trust.d.ts.map +1 -0
  66. package/dist/core/trust.js +66 -0
  67. package/dist/core/trust.js.map +1 -0
  68. package/dist/core/validity.d.ts +21 -0
  69. package/dist/core/validity.d.ts.map +1 -0
  70. package/dist/core/validity.js +41 -0
  71. package/dist/core/validity.js.map +1 -0
  72. package/dist/core/whoami.d.ts +3 -0
  73. package/dist/core/whoami.d.ts.map +1 -1
  74. package/dist/core/whoami.js +14 -0
  75. package/dist/core/whoami.js.map +1 -1
  76. package/dist/core/write-pipeline.d.ts +48 -0
  77. package/dist/core/write-pipeline.d.ts.map +1 -1
  78. package/dist/core/write-pipeline.js +80 -3
  79. package/dist/core/write-pipeline.js.map +1 -1
  80. package/dist/engine/activation.d.ts.map +1 -1
  81. package/dist/engine/activation.js +27 -4
  82. package/dist/engine/activation.js.map +1 -1
  83. package/dist/engine/consolidation.d.ts.map +1 -1
  84. package/dist/engine/consolidation.js +53 -4
  85. package/dist/engine/consolidation.js.map +1 -1
  86. package/dist/hooks/prime-query.d.ts +57 -0
  87. package/dist/hooks/prime-query.d.ts.map +1 -0
  88. package/dist/hooks/prime-query.js +388 -0
  89. package/dist/hooks/prime-query.js.map +1 -0
  90. package/dist/hooks/prime.d.ts +8 -0
  91. package/dist/hooks/prime.d.ts.map +1 -1
  92. package/dist/hooks/prime.js +21 -2
  93. package/dist/hooks/prime.js.map +1 -1
  94. package/dist/hooks/sidecar.d.ts +18 -0
  95. package/dist/hooks/sidecar.d.ts.map +1 -1
  96. package/dist/hooks/sidecar.js +58 -2
  97. package/dist/hooks/sidecar.js.map +1 -1
  98. package/dist/index.js +15 -3
  99. package/dist/index.js.map +1 -1
  100. package/dist/mcp.js +157 -104
  101. package/dist/mcp.js.map +1 -1
  102. package/dist/model-daemon.d.ts +8 -0
  103. package/dist/model-daemon.d.ts.map +1 -0
  104. package/dist/model-daemon.js +45 -0
  105. package/dist/model-daemon.js.map +1 -0
  106. package/dist/storage/factory.d.ts.map +1 -1
  107. package/dist/storage/factory.js +5 -0
  108. package/dist/storage/factory.js.map +1 -1
  109. package/dist/storage/pglite-schema.d.ts.map +1 -1
  110. package/dist/storage/pglite-schema.js +176 -170
  111. package/dist/storage/pglite-schema.js.map +1 -1
  112. package/dist/storage/pglite.d.ts +5 -0
  113. package/dist/storage/pglite.d.ts.map +1 -1
  114. package/dist/storage/pglite.js +165 -153
  115. package/dist/storage/pglite.js.map +1 -1
  116. package/dist/storage/postgres.d.ts +5 -0
  117. package/dist/storage/postgres.d.ts.map +1 -1
  118. package/dist/storage/postgres.js +165 -153
  119. package/dist/storage/postgres.js.map +1 -1
  120. package/dist/storage/sqlite.d.ts +22 -0
  121. package/dist/storage/sqlite.d.ts.map +1 -1
  122. package/dist/storage/sqlite.js +415 -363
  123. package/dist/storage/sqlite.js.map +1 -1
  124. package/dist/types/engram.d.ts +33 -0
  125. package/dist/types/engram.d.ts.map +1 -1
  126. package/dist/types/engram.js.map +1 -1
  127. package/package.json +1 -1
  128. package/plugin/.claude-plugin/plugin.json +1 -1
  129. package/plugin/README.md +1 -1
  130. package/plugin/bin/awm-mcp-launcher.cjs +2 -2
  131. package/plugin/skills/awm-memory/SKILL.md +11 -2
  132. package/src/adapters/common.ts +881 -802
  133. package/src/api/routes.ts +20 -0
  134. package/src/cli/migrate.ts +309 -307
  135. package/src/core/asked-value.ts +74 -0
  136. package/src/core/conflicts.ts +280 -0
  137. package/src/core/embeddings.ts +35 -10
  138. package/src/core/format-recall.ts +83 -25
  139. package/src/core/ml-worker.ts +458 -281
  140. package/src/core/model-daemon-client.ts +374 -0
  141. package/src/core/model-daemon-server.ts +344 -0
  142. package/src/core/model-daemon.ts +243 -0
  143. package/src/core/query-expander.ts +127 -126
  144. package/src/core/recall-config.ts +5 -0
  145. package/src/core/rerank-window.ts +164 -159
  146. package/src/core/rerank2.ts +143 -82
  147. package/src/core/reranker.ts +92 -12
  148. package/src/core/trust.ts +65 -0
  149. package/src/core/validity.ts +47 -0
  150. package/src/core/whoami.ts +136 -120
  151. package/src/core/write-pipeline.ts +119 -3
  152. package/src/engine/activation.ts +27 -4
  153. package/src/engine/consolidation.ts +950 -899
  154. package/src/hooks/prime-query.ts +375 -0
  155. package/src/hooks/prime.ts +25 -2
  156. package/src/hooks/sidecar.ts +57 -3
  157. package/src/index.ts +258 -248
  158. package/src/mcp.ts +1529 -1475
  159. package/src/model-daemon.ts +48 -0
  160. package/src/storage/factory.ts +25 -19
  161. package/src/storage/pglite-schema.ts +199 -193
  162. package/src/storage/pglite.ts +1513 -1498
  163. package/src/storage/postgres.ts +1613 -1598
  164. package/src/storage/sqlite.ts +2069 -2019
  165. package/src/types/engram.ts +30 -0
@@ -10,6 +10,25 @@
10
10
  * AWM 0.8.x: inference dispatches through ml-worker.ts (currently in-process
11
11
  * — see ml-worker.ts for the worker_threads → in-process revert rationale).
12
12
  */
13
+ import { type PreTrainedTokenizer } from '@huggingface/transformers';
14
+ /**
15
+ * The query the cross-encoder sees: unchanged when it fits the cap, else its first and
16
+ * last halves. Both ends, because a pasted prompt puts the question either before the
17
+ * paste or after it. Special tokens typed into a long query ([SEP], [UNK]) are dropped by
18
+ * the decode; a query under the cap passes through untouched.
19
+ */
20
+ export declare function capRerankQuery(tok: PreTrainedTokenizer, query: string, maxTokens?: number): string;
21
+ /** Exported with its caps as parameters so tests can compare settings in one process. */
22
+ export declare function inProcessRerank(args: {
23
+ query: string;
24
+ passages: string[];
25
+ }, caps?: {
26
+ batch?: number;
27
+ queryTokens?: number;
28
+ }): Promise<Array<{
29
+ index: number;
30
+ score: number;
31
+ }>>;
13
32
  /** Kept for backwards compat. */
14
33
  export declare function getReranker(): Promise<any>;
15
34
  export interface RerankResult {
@@ -1 +1 @@
1
- {"version":3,"file":"reranker.d.ts","sourceRoot":"","sources":["../../src/core/reranker.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAqHH,iCAAiC;AACjC,wBAAsB,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,CAGhD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAGvF"}
1
+ {"version":3,"file":"reranker.d.ts","sourceRoot":"","sources":["../../src/core/reranker.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;GAWG;AAEH,OAAO,EAGL,KAAK,mBAAmB,EAEzB,MAAM,2BAA2B,CAAC;AA+FnC;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,mBAAmB,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,SAAsB,GAAG,MAAM,CAY/G;AAoDD,yFAAyF;AACzF,wBAAsB,eAAe,CACnC,IAAI,EAAE;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,EAC3C,IAAI,GAAE;IAAE,KAAK,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAO,GAClD,OAAO,CAAC,KAAK,CAAC;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC,CAalD;AAQD,iCAAiC;AACjC,wBAAsB,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,CAGhD;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,MAAM,CAAC;IACd,KAAK,EAAE,MAAM,CAAC;CACf;AAED;;;;GAIG;AACH,wBAAsB,MAAM,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CAGvF"}
@@ -13,7 +13,7 @@
13
13
  * — see ml-worker.ts for the worker_threads → in-process revert rationale).
14
14
  */
15
15
  import { AutoTokenizer, AutoModelForSequenceClassification, } from '@huggingface/transformers';
16
- import { dispatchRerank, registerInProcessHandlers } from './ml-worker.js';
16
+ import { dispatchRerank, registerInferenceConfig, registerInProcessHandlers } from './ml-worker.js';
17
17
  import { ensureModelCacheDir } from './model-cache.js';
18
18
  const DEFAULT_MODEL = 'Xenova/ms-marco-MiniLM-L-6-v2';
19
19
  const MODEL_ID = process.env.AWM_RERANKER_MODEL || DEFAULT_MODEL;
@@ -35,7 +35,20 @@ const MODEL_ID = process.env.AWM_RERANKER_MODEL || DEFAULT_MODEL;
35
35
  * is untouched because it is a product decision, not because the cost is
36
36
  * unknown; see docs/recall-latency.md.
37
37
  */
38
- const DTYPE = (process.env.AWM_RERANKER_DTYPE || 'fp32');
38
+ // Default q8 since 0.19 (Robert's decision, 2026-10-19, after the speed review). The
39
+ // cross-encoder is ~80% of a warm recall; q8 cut its p50 by 35–45% in an interleaved
40
+ // in-process comparison (378–492 ms against 684–1,051 ms for fp32) and 29–34% of total
41
+ // recall in the 2026-10-08 sweep, for 0.0 pp on identifier queries and −0.9 pp on topic
42
+ // queries with success@5 and abstention unchanged. Batch size 4/8/16 made no consistent
43
+ // difference in the same comparison, so RERANK_BATCH stays at 8. `AWM_RERANKER_DTYPE=fp32`
44
+ // restores the 0.18 ranker; every number published before 0.19 stands at fp32.
45
+ // One property changes at q8: a pair's score depends slightly on the other pairs in its
46
+ // batch (dynamic quantisation scales activations per batch) — measured max 0.00105 over 80
47
+ // pairs, top-1 unchanged, the order of near-zero tail scores reshuffled. fp32 is exact to
48
+ // 1e-5. For a given query and store the pool and its chunks are deterministic, so results
49
+ // are reproducible; what is lost is batch-independence, which tests/core/onnx-shape-caps
50
+ // asserts exactly at fp32 and to 5e-3 at q8.
51
+ const DTYPE = (process.env.AWM_RERANKER_DTYPE || 'q8');
39
52
  // --- In-process fallback ---
40
53
  let tokenizer = null;
41
54
  let model = null;
@@ -56,11 +69,60 @@ async function ensureLoaded() {
56
69
  function sigmoid(x) {
57
70
  return 1 / (1 + Math.exp(-x));
58
71
  }
59
- async function inProcessRerank(args) {
60
- const { query, passages } = args;
61
- if (passages.length === 0)
62
- return [];
63
- await ensureLoaded();
72
+ /**
73
+ * Input-shape caps for the cross-encoder. They exist for MEMORY, and one of them also
74
+ * fixes RANKING.
75
+ *
76
+ * onnxruntime-node keeps a CPU memory arena per model that grows to the largest tensor
77
+ * it has ever run and never shrinks. A cross-encoder's attention tensor is
78
+ * batch x heads x seq x seq floats, so its size is quadratic in the padded pair length.
79
+ * Measured 2026-10-16 on AWM 0.17.0: six Claude Code sessions held 13.2 GB, JS heap flat
80
+ * at ~85 MB, and one process reranking 24 long pairs kept ~1.75 GB after going idle.
81
+ * The shapes come from the prime hook, which recalls with the WHOLE user prompt (pastes
82
+ * included), and from recall's 24-40 passage pool: 40 pairs at 512 tokens make one
83
+ * attention tensor of 40 x 12 x 512 x 512 x 4 B = ~500 MB.
84
+ *
85
+ * - AWM_RERANK_BATCH (default 8): passages are scored in chunks. A pair's score depends
86
+ * only on that pair (padding is masked), so this changes memory, not order.
87
+ * - AWM_RERANK_QUERY_TOKENS (default 128): a longer query keeps its first and last
88
+ * halves. transformers.js truncates a too-long pair by cutting tokens off the END,
89
+ * which is the passage: before this cap, a ~510-token query left the passage no tokens
90
+ * at all, and every memory was scored against the query alone. Passages are already
91
+ * capped at ~400 chars (rerank-window.ts), so a 128-token query typically keeps a
92
+ * pair under ~260 tokens (more for CJK text or a raised AWM_RERANK_TRUNC).
93
+ *
94
+ * An explicit 0 disables a cap. Anything else that is not a non-negative integer (empty,
95
+ * 'off', -1) falls back to the default, as AWM_RERANK_TRUNC does: a typo must not quietly
96
+ * bring back the unbounded shape.
97
+ */
98
+ function shapeCap(name, fallback) {
99
+ const v = Number(process.env[name]?.trim() || NaN);
100
+ return Number.isInteger(v) && v >= 0 ? v : fallback;
101
+ }
102
+ const RERANK_BATCH = shapeCap('AWM_RERANK_BATCH', 8);
103
+ const RERANK_QUERY_TOKENS = shapeCap('AWM_RERANK_QUERY_TOKENS', 128);
104
+ /**
105
+ * The query the cross-encoder sees: unchanged when it fits the cap, else its first and
106
+ * last halves. Both ends, because a pasted prompt puts the question either before the
107
+ * paste or after it. Special tokens typed into a long query ([SEP], [UNK]) are dropped by
108
+ * the decode; a query under the cap passes through untouched.
109
+ */
110
+ export function capRerankQuery(tok, query, maxTokens = RERANK_QUERY_TOKENS) {
111
+ if (maxTokens <= 0)
112
+ return query;
113
+ const ids = tok.encode(query, { add_special_tokens: false });
114
+ if (ids.length <= maxTokens)
115
+ return query;
116
+ const head = Math.ceil(maxTokens / 2);
117
+ const tail = maxTokens - head;
118
+ const decode = (part) => tok.decode(part, { skip_special_tokens: true, clean_up_tokenization_spaces: true });
119
+ // A tail that starts mid-word decodes with a leading '##' continuation marker, which
120
+ // would re-encode as two stray '#' tokens.
121
+ return tail > 0
122
+ ? `${decode(ids.slice(0, head))} ${decode(ids.slice(ids.length - tail)).replace(/^##/, '')}`
123
+ : decode(ids.slice(0, head));
124
+ }
125
+ async function scoreChunk(query, passages, offset) {
64
126
  // Batch path
65
127
  try {
66
128
  const queries = passages.map(() => query);
@@ -83,9 +145,8 @@ async function inProcessRerank(args) {
83
145
  const results = [];
84
146
  for (let i = 0; i < passages.length; i++) {
85
147
  const rawLogit = Number(data[i] ?? 0);
86
- results.push({ index: i, score: sigmoid(rawLogit) });
148
+ results.push({ index: offset + i, score: sigmoid(rawLogit) });
87
149
  }
88
- results.sort((a, b) => b.score - a.score);
89
150
  return results;
90
151
  }
91
152
  catch {
@@ -103,18 +164,34 @@ async function inProcessRerank(args) {
103
164
  const output = await model(inputs);
104
165
  const logits = output.logits ?? output.last_hidden_state;
105
166
  const rawLogit = logits.data[0];
106
- results.push({ index: i, score: sigmoid(rawLogit) });
167
+ results.push({ index: offset + i, score: sigmoid(rawLogit) });
107
168
  }
108
169
  catch {
109
- results.push({ index: i, score: 0 });
170
+ results.push({ index: offset + i, score: 0 });
110
171
  }
111
172
  }
112
- results.sort((a, b) => b.score - a.score);
113
173
  return results;
114
174
  }
115
175
  }
176
+ /** Exported with its caps as parameters so tests can compare settings in one process. */
177
+ export async function inProcessRerank(args, caps = {}) {
178
+ const { passages } = args;
179
+ if (passages.length === 0)
180
+ return [];
181
+ await ensureLoaded();
182
+ const query = capRerankQuery(tokenizer, args.query, caps.queryTokens ?? RERANK_QUERY_TOKENS);
183
+ const batch = caps.batch ?? RERANK_BATCH;
184
+ const size = batch > 0 ? batch : passages.length;
185
+ const results = [];
186
+ for (let b = 0; b < passages.length; b += size) {
187
+ results.push(...await scoreChunk(query, passages.slice(b, b + size), b));
188
+ }
189
+ results.sort((a, b) => b.score - a.score);
190
+ return results;
191
+ }
116
192
  // Register the in-process handler with the pool
117
- registerInProcessHandlers({ rerank: inProcessRerank });
193
+ registerInProcessHandlers({ rerank: (args) => inProcessRerank(args) });
194
+ registerInferenceConfig({ rerankModel: MODEL_ID, rerankDtype: DTYPE, rerankBatch: RERANK_BATCH, rerankQueryTokens: RERANK_QUERY_TOKENS });
118
195
  // --- Public API ---
119
196
  /** Kept for backwards compat. */
120
197
  export async function getReranker() {
@@ -1 +1 @@
1
- {"version":3,"file":"reranker.js","sourceRoot":"","sources":["../../src/core/reranker.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"reranker.js","sourceRoot":"","sources":["../../src/core/reranker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Trust tiers on writes and memories, and the one rule the write pipeline
3
+ * applies with them: a merge or a replacement must never RAISE the trust of
4
+ * text, and must never retire a more-trusted memory on the word of a
5
+ * less-trusted write.
6
+ *
7
+ * Found by MWA BL-17 (2026-10-14/15), five isolated-review rounds with
8
+ * probes: the pipeline merged a write into an existing memory on concept
9
+ * equality and the merged engram KEPT THE OLD ENGRAM'S TAGS — so a poisoned
10
+ * skill merged into a clean one came back trust=medium and primeable; a
11
+ * planted untrusted decoy under the same concept let a poisoned near-copy
12
+ * merge into the trusted fact; an archived trusted fact was revived with
13
+ * poisoned text merged in; and an R3 "correction" (eventType surprise) from
14
+ * untrusted text retired a trusted memory. MWA works around all of it in its
15
+ * own wrapper. Any other client writing mixed-trust content was exposed.
16
+ *
17
+ * AWM has no trust model of its own, and this does not add one. It reads the
18
+ * tag MWA's memory spine already writes (`trust=<tier>`) and refuses the
19
+ * dangerous direction. The write is still stored — as its own engram, with
20
+ * its own tags — so nothing is lost and the conflict mark can say the two
21
+ * disagree. Untagged writes and memories are unaffected: the rule only fires
22
+ * when the write is EXPLICITLY untrusted, or when both sides carry a tier and
23
+ * the write's is lower.
24
+ */
25
+ /** The tier a `trust=<tier>` tag declares, or null when there is none. */
26
+ export declare function trustTier(tags: readonly string[] | null | undefined): number | null;
27
+ /**
28
+ * True when `writeTags` must not merge into, supersede or revive a memory
29
+ * carrying `targetTags`.
30
+ */
31
+ export declare function mergeBlockedByTrust(writeTags: readonly string[] | null | undefined, targetTags: readonly string[] | null | undefined): boolean;
32
+ //# sourceMappingURL=trust.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust.d.ts","sourceRoot":"","sources":["../../src/core/trust.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAUH,0EAA0E;AAC1E,wBAAgB,SAAS,CAAC,IAAI,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,GAAG,MAAM,GAAG,IAAI,CAYnF;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,SAAS,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,EAC/C,UAAU,EAAE,SAAS,MAAM,EAAE,GAAG,IAAI,GAAG,SAAS,GAC/C,OAAO,CAOT"}
@@ -0,0 +1,66 @@
1
+ // Copyright 2026 Robert Winter / Complete Ideas
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Trust tiers on writes and memories, and the one rule the write pipeline
5
+ * applies with them: a merge or a replacement must never RAISE the trust of
6
+ * text, and must never retire a more-trusted memory on the word of a
7
+ * less-trusted write.
8
+ *
9
+ * Found by MWA BL-17 (2026-10-14/15), five isolated-review rounds with
10
+ * probes: the pipeline merged a write into an existing memory on concept
11
+ * equality and the merged engram KEPT THE OLD ENGRAM'S TAGS — so a poisoned
12
+ * skill merged into a clean one came back trust=medium and primeable; a
13
+ * planted untrusted decoy under the same concept let a poisoned near-copy
14
+ * merge into the trusted fact; an archived trusted fact was revived with
15
+ * poisoned text merged in; and an R3 "correction" (eventType surprise) from
16
+ * untrusted text retired a trusted memory. MWA works around all of it in its
17
+ * own wrapper. Any other client writing mixed-trust content was exposed.
18
+ *
19
+ * AWM has no trust model of its own, and this does not add one. It reads the
20
+ * tag MWA's memory spine already writes (`trust=<tier>`) and refuses the
21
+ * dangerous direction. The write is still stored — as its own engram, with
22
+ * its own tags — so nothing is lost and the conflict mark can say the two
23
+ * disagree. Untagged writes and memories are unaffected: the rule only fires
24
+ * when the write is EXPLICITLY untrusted, or when both sides carry a tier and
25
+ * the write's is lower.
26
+ */
27
+ /** Ordered tiers; higher is more trusted. */
28
+ const TIERS = {
29
+ untrusted: 0, none: 0, quarantine: 0,
30
+ low: 1,
31
+ medium: 2, med: 2,
32
+ high: 3, trusted: 3, verified: 3, owner: 3,
33
+ };
34
+ /** The tier a `trust=<tier>` tag declares, or null when there is none. */
35
+ export function trustTier(tags) {
36
+ if (!tags)
37
+ return null;
38
+ let found = null;
39
+ for (const t of tags) {
40
+ const m = /^trust=([a-z]+)$/i.exec(t.trim());
41
+ if (!m)
42
+ continue;
43
+ const v = TIERS[m[1].toLowerCase()];
44
+ if (v === undefined)
45
+ continue;
46
+ // Several tags: the lowest wins — a memory is as trusted as its least trusted label.
47
+ found = found === null ? v : Math.min(found, v);
48
+ }
49
+ return found;
50
+ }
51
+ /**
52
+ * True when `writeTags` must not merge into, supersede or revive a memory
53
+ * carrying `targetTags`.
54
+ */
55
+ export function mergeBlockedByTrust(writeTags, targetTags) {
56
+ const w = trustTier(writeTags);
57
+ if (w === null)
58
+ return false; // untagged write: no rule
59
+ const t = trustTier(targetTags);
60
+ if (w === 0)
61
+ return t === null || t > 0; // explicitly untrusted: only into untrusted
62
+ if (t === null)
63
+ return false; // tagged write, untagged target: no rule
64
+ return w < t;
65
+ }
66
+ //# sourceMappingURL=trust.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"trust.js","sourceRoot":"","sources":["../../src/core/trust.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,sCAAsC;AACtC;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,6CAA6C;AAC7C,MAAM,KAAK,GAA2B;IACpC,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,CAAC;IACpC,GAAG,EAAE,CAAC;IACN,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC;IACjB,IAAI,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,QAAQ,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC;CAC3C,CAAC;AAEF,0EAA0E;AAC1E,MAAM,UAAU,SAAS,CAAC,IAA0C;IAClE,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,KAAK,GAAkB,IAAI,CAAC;IAChC,KAAK,MAAM,CAAC,IAAI,IAAI,EAAE,CAAC;QACrB,MAAM,CAAC,GAAG,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;QAC7C,IAAI,CAAC,CAAC;YAAE,SAAS;QACjB,MAAM,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC,CAAC;QACpC,IAAI,CAAC,KAAK,SAAS;YAAE,SAAS;QAC9B,qFAAqF;QACrF,KAAK,GAAG,KAAK,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IAClD,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,SAA+C,EAC/C,UAAgD;IAEhD,MAAM,CAAC,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IAC/B,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,CAAkB,0BAA0B;IACzE,MAAM,CAAC,GAAG,SAAS,CAAC,UAAU,CAAC,CAAC;IAChC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAO,4CAA4C;IAC3F,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC,CAAkB,yCAAyC;IACxF,OAAO,CAAC,GAAG,CAAC,CAAC;AACf,CAAC"}
@@ -0,0 +1,21 @@
1
+ /**
2
+ * Temporal validity (D8) — the one place that decides whether a memory's
3
+ * `valid_from` / `valid_to` window holds at a given moment.
4
+ *
5
+ * Until 2026-10-19 nothing read these fields except the two recall formatters,
6
+ * which printed `[valid until …]` on expired memories exactly as on current
7
+ * ones. The live store was serving 482 memories past their `valid_to` as
8
+ * current (97 active, 385 archived). The guidance given to agents ("use
9
+ * `valid_to` … so the memory expires") promised behaviour the code did not have.
10
+ *
11
+ * Ranking (activation.ts Phase 8c), the MCP recall format and the prime hook
12
+ * all go through here so they cannot disagree about what "expired" means.
13
+ */
14
+ export type ValidityState = 'current' | 'expired' | 'not-yet-valid';
15
+ /** The fields this needs — any engram-shaped object qualifies. */
16
+ export interface TemporallyBounded {
17
+ validFrom?: string | null;
18
+ validTo?: string | null;
19
+ }
20
+ export declare function validityState(e: TemporallyBounded, now?: number): ValidityState;
21
+ //# sourceMappingURL=validity.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validity.d.ts","sourceRoot":"","sources":["../../src/core/validity.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;GAYG;AAEH,MAAM,MAAM,aAAa,GAAG,SAAS,GAAG,SAAS,GAAG,eAAe,CAAC;AAEpE,kEAAkE;AAClE,MAAM,WAAW,iBAAiB;IAChC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACzB;AAcD,wBAAgB,aAAa,CAAC,CAAC,EAAE,iBAAiB,EAAE,GAAG,GAAE,MAAmB,GAAG,aAAa,CAU3F"}
@@ -0,0 +1,41 @@
1
+ // Copyright 2026 Robert Winter / Complete Ideas
2
+ // SPDX-License-Identifier: Apache-2.0
3
+ /**
4
+ * Temporal validity (D8) — the one place that decides whether a memory's
5
+ * `valid_from` / `valid_to` window holds at a given moment.
6
+ *
7
+ * Until 2026-10-19 nothing read these fields except the two recall formatters,
8
+ * which printed `[valid until …]` on expired memories exactly as on current
9
+ * ones. The live store was serving 482 memories past their `valid_to` as
10
+ * current (97 active, 385 archived). The guidance given to agents ("use
11
+ * `valid_to` … so the memory expires") promised behaviour the code did not have.
12
+ *
13
+ * Ranking (activation.ts Phase 8c), the MCP recall format and the prime hook
14
+ * all go through here so they cannot disagree about what "expired" means.
15
+ */
16
+ /**
17
+ * A date-only `valid_to` ("2026-01-15") means "through that day", so it is
18
+ * compared against the END of that day in UTC. A full datetime is taken as
19
+ * written. An unparseable value is ignored: a bad bound must not hide a memory.
20
+ */
21
+ function boundMs(value, endOfDay) {
22
+ const t = Date.parse(value);
23
+ if (!Number.isFinite(t))
24
+ return NaN;
25
+ const dateOnly = /^\d{4}-\d{2}-\d{2}$/.test(value.trim());
26
+ return dateOnly && endOfDay ? t + 86_400_000 - 1 : t;
27
+ }
28
+ export function validityState(e, now = Date.now()) {
29
+ if (e.validTo) {
30
+ const until = boundMs(e.validTo, true);
31
+ if (Number.isFinite(until) && now > until)
32
+ return 'expired';
33
+ }
34
+ if (e.validFrom) {
35
+ const from = boundMs(e.validFrom, false);
36
+ if (Number.isFinite(from) && now < from)
37
+ return 'not-yet-valid';
38
+ }
39
+ return 'current';
40
+ }
41
+ //# sourceMappingURL=validity.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validity.js","sourceRoot":"","sources":["../../src/core/validity.ts"],"names":[],"mappings":"AAAA,gDAAgD;AAChD,sCAAsC;AACtC;;;;;;;;;;;;GAYG;AAUH;;;;GAIG;AACH,SAAS,OAAO,CAAC,KAAa,EAAE,QAAiB;IAC/C,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC5B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC;QAAE,OAAO,GAAG,CAAC;IACpC,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;IAC1D,OAAO,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACvD,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,CAAoB,EAAE,MAAc,IAAI,CAAC,GAAG,EAAE;IAC1E,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;QACd,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACvC,IAAI,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,GAAG,GAAG,KAAK;YAAE,OAAO,SAAS,CAAC;IAC9D,CAAC;IACD,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;QAChB,MAAM,IAAI,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACzC,IAAI,MAAM,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,GAAG,GAAG,IAAI;YAAE,OAAO,eAAe,CAAC;IAClE,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
@@ -1,3 +1,4 @@
1
+ import { modelDaemonStatus } from './ml-worker.js';
1
2
  export interface WhoamiInfo {
2
3
  agentId: string;
3
4
  workspace: string | null;
@@ -23,6 +24,8 @@ export interface WhoamiInfo {
23
24
  fingerprint: string;
24
25
  flags: Record<string, string>;
25
26
  };
27
+ /** Where inference runs: this process, or the shared model daemon (AWM_MODEL_DAEMON=1). */
28
+ models: ReturnType<typeof modelDaemonStatus>;
26
29
  siblingAgents: string[];
27
30
  }
28
31
  /** Store subset whoami needs — every backend implements listAgentIds. */
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/core/whoami.ts"],"names":[],"mappings":"AAuBA,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,YAAY,GAAG,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC3D;;;;;;OAMG;IACH,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAC/D,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,YAAY,IAAI,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9C;AASD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,GAAG,MAAM;AACvB;;;;;;GAMG;AACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC5B,OAAO,CAAC,UAAU,CAAC,CA4BrB;AAED,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAmBlD"}
1
+ {"version":3,"file":"whoami.d.ts","sourceRoot":"","sources":["../../src/core/whoami.ts"],"names":[],"mappings":"AAsBA,OAAO,EAAE,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAEnD,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,EAAE,KAAK,GAAG,MAAM,CAAC;IACxB,IAAI,EAAE,YAAY,GAAG,MAAM,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE;QAAE,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;QAAC,WAAW,EAAE,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;IAC3D;;;;;;OAMG;IACH,MAAM,EAAE;QAAE,WAAW,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;KAAE,CAAC;IAC/D,2FAA2F;IAC3F,MAAM,EAAE,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;IAC7C,aAAa,EAAE,MAAM,EAAE,CAAC;CACzB;AAED,yEAAyE;AACzE,MAAM,WAAW,WAAW;IAC1B,YAAY,IAAI,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;CAC9C;AASD,wBAAsB,WAAW,CAC/B,KAAK,EAAE,WAAW,EAClB,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,KAAK,GAAG,MAAM;AACvB;;;;;;GAMG;AACH,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,GAC5B,OAAO,CAAC,UAAU,CAAC,CA6BrB;AAaD,0DAA0D;AAC1D,wBAAgB,YAAY,CAAC,CAAC,EAAE,UAAU,GAAG,MAAM,CAoBlD"}
@@ -18,6 +18,7 @@ import { VERSION } from '../version.js';
18
18
  import { getConfiguredBackend, getConfiguredPath } from '../storage/factory.js';
19
19
  import { activeRecallConfig, recallConfigFingerprint } from './recall-config.js';
20
20
  import { embeddingHealth } from './embeddings.js';
21
+ import { modelDaemonStatus } from './ml-worker.js';
21
22
  function packageRoot() {
22
23
  // src/core/whoami.ts (dev) and dist/core/whoami.js (build) both sit two
23
24
  // levels below the package root.
@@ -59,9 +60,21 @@ boundHookPort) {
59
60
  : (Number.isFinite(hookPort) && hookPort > 0 ? hookPort : null),
60
61
  },
61
62
  recall: { fingerprint: recallConfigFingerprint(), flags: activeRecallConfig() },
63
+ models: modelDaemonStatus(),
62
64
  siblingAgents: siblings,
63
65
  };
64
66
  }
67
+ function formatModels(m) {
68
+ if (!m.enabled)
69
+ return 'in this process';
70
+ const fallback = m.fallbacks
71
+ ? ` · ${m.fallbacks} fallback(s) to in-process, last: ${m.lastFallbackReason} at ${m.lastFallbackAt}`
72
+ : '';
73
+ const where = m.mode === 'daemon' ? `shared daemon pid ${m.daemonPid}`
74
+ : m.mode === 'in-process-fallback' ? 'in this process (daemon unavailable)'
75
+ : 'shared daemon (not connected yet)';
76
+ return `${where} · fingerprint ${m.fingerprint} · ${m.requests} request(s)${fallback}`;
77
+ }
65
78
  /** Human-readable rendering for the MCP tool response. */
66
79
  export function formatWhoami(w) {
67
80
  return [
@@ -72,6 +85,7 @@ export function formatWhoami(w) {
72
85
  `Code: ${w.codePath} (pid ${w.pid})`,
73
86
  `Ports: http=${w.ports.http ?? 'off'} hookSidecar=${w.ports.hookSidecar ?? 'off'}`,
74
87
  `Recall config: ${w.recall.fingerprint}`,
88
+ `Models: ${formatModels(w.models)}`,
75
89
  ...(embeddingHealth().dimensionMismatches > 0
76
90
  ? [`\u26a0 EMBEDDING INTEGRITY: ${embeddingHealth().dimensionMismatches} dimension mismatches ` +
77
91
  `(expected ${embeddingHealth().expectedDimensions}d). Affected memories score 0 on the ` +
@@ -1 +1 @@
1
- {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/core/whoami.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"whoami.js","sourceRoot":"","sources":["../../src/core/whoami.ts"],"names":[],"mappings":"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"}
@@ -53,12 +53,41 @@ export interface WriteInput {
53
53
  eventType?: SalienceEventType;
54
54
  surprise?: number;
55
55
  decisionMade?: boolean;
56
+ /**
57
+ * Caller-declared purpose of the write: 'decision' | 'question' | 'todo' |
58
+ * 'finding' | 'context'. Stored as an `intent=` tag by the callers, and read HERE
59
+ * so a declared decision reaches the salience filter.
60
+ *
61
+ * It did not, before 2026-10-12: `intent` became a tag and nothing else, while the
62
+ * redundant `decisionMade` boolean was the only wired path, so a caller following
63
+ * the documented tagging discipline got no salience credit for saying this was a
64
+ * decision. Measured over all 496 discarded writes in the live store
65
+ * (`low-salience`, `work`+`personal`): those tagged `intent=decision` were later
66
+ * recalled at **77.3% against a 38.1% base rate**, +41pp — the strongest
67
+ * discriminator of any feature tested, discarded anyway.
68
+ *
69
+ * Mapped in the pipeline rather than at each call site so both write surfaces, and
70
+ * any future one, inherit it; widening the content-based operational-verb list was
71
+ * tested on the same population and rejected, because every candidate token scored
72
+ * at the base rate.
73
+ */
74
+ intent?: string;
56
75
  causalDepth?: number;
57
76
  resolutionEffort?: number;
58
77
  /** Confidence override. When unset, defaults from disposition + eventType priors. */
59
78
  confidence?: number;
60
79
  /** Explicit supersession requested by caller (independent of correction-on-match). */
61
80
  supersedes?: string;
81
+ /**
82
+ * This write corrects an existing memory whose id the caller does not have
83
+ * (2026-10-19). The closest active memory about the same thing — the same
84
+ * concept, else the novelty match when it is close enough — is superseded,
85
+ * the correction goes active at no less than that memory's confidence, and
86
+ * the result says what was replaced (`correctionOf`). Never reinforce-merges.
87
+ * With nothing close enough, the write is stored as new and `correctionOf`
88
+ * is null. An explicit `supersedes` outranks this.
89
+ */
90
+ correction?: boolean;
62
91
  /** Workspace scope for cross-agent novelty (v0.5.4+ stores only). */
63
92
  workspace?: string | null;
64
93
  /** Set to false to skip the reinforce/supersede branching and always create. */
@@ -103,6 +132,25 @@ export interface WriteResult {
103
132
  supersedeOf?: {
104
133
  id: string;
105
134
  };
135
+ /**
136
+ * Set when the write asked `correction: true`: the memory it replaced, or
137
+ * null when nothing close enough existed and the write was stored as new.
138
+ */
139
+ correctionOf?: {
140
+ id: string;
141
+ concept: string;
142
+ matchScore: number;
143
+ } | null;
144
+ /**
145
+ * Set when a merge, supersede, revive or correction was refused because the
146
+ * write is less trusted than the memory it matched (src/core/trust.ts). The
147
+ * write was stored as its own engram instead.
148
+ */
149
+ trustBlocked?: {
150
+ matchedId: string;
151
+ writeTrust: number | null;
152
+ matchedTrust: number | null;
153
+ };
106
154
  }
107
155
  export interface WritePipelineEngines {
108
156
  store: EngramStore;
@@ -1 +1 @@
1
- {"version":3,"file":"write-pipeline.d.ts","sourceRoot":"","sources":["../../src/core/write-pipeline.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAEH,OAAO,KAAK,EAAE,YAAY,IAAI,WAAW,EAAE,MAAM,qBAAqB,CAAC;AACvE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AACjE,OAAO,KAAK,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAC1E,OAAO,EAIL,KAAK,iBAAiB,EACtB,KAAK,cAAc,EACnB,KAAK,aAAa,EACnB,MAAM,eAAe,CAAC;AAQvB,kFAAkF;AAClF,eAAO,MAAM,wBAAwB,MAAM,CAAC;AAE5C,uFAAuF;AACvF,eAAO,MAAM,0BAA0B,OAAO,CAAC;AAC/C,eAAO,MAAM,yBAAyB,OAAO,CAAC;AAY9C,MAAM,MAAM,WAAW,GAAG,QAAQ,GAAG,WAAW,GAAG,WAAW,CAAC;AAE/D,MAAM,WAAW,UAAU;IACzB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,gEAAgE;IAChE,IAAI,CAAC,EAAE,MAAM,EAAE,CAAC;IAChB,WAAW,CAAC,EAAE,WAAW,CAAC;IAC1B,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,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,qFAAqF;IACrF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,sFAAsF;IACtF,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,qEAAqE;IACrE,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC1B,gFAAgF;IAChF,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,+DAA+D;IAC/D,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,8EAA8E;IAC9E,UAAU,CAAC,EAAE,OAAO,oBAAoB,EAAE,eAAe,EAAE,CAAC;IAC5D;;qEAEiE;IACjE,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,yFAAyF;IACzF,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,qEAAqE;IACrE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,iFAAiF;IACjF,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,iEAAiE;IACjE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,WAAW,WAAW;IAC1B,MAAM,EAAE,WAAW,CAAC;IACpB;;;;OAIG;IACH,MAAM,EAAE,MAAM,CAAC;IACf,uGAAuG;IACvG,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,uDAAuD;IACvD,aAAa,EAAE,aAAa,CAAC;IAC7B,kEAAkE;IAClE,SAAS,CAAC,EAAE;QACV,kBAAkB,EAAE,MAAM,CAAC;QAC3B,aAAa,EAAE,MAAM,CAAC;QACtB,mBAAmB,EAAE,MAAM,CAAC;KAC7B,CAAC;IACF,iEAAiE;IACjE,WAAW,CAAC,EAAE;QAAE,EAAE,EAAE,MAAM,CAAA;KAAE,CAAC;CAC9B;AAED,MAAM,WAAW,oBAAoB;IACnC,KAAK,EAAE,WAAW,CAAC;IACnB,gBAAgB,EAAE,gBAAgB,CAAC;CACpC;AAED;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,wBAAsB,YAAY,CAChC,OAAO,EAAE,oBAAoB,EAC7B,KAAK,EAAE,UAAU,GAChB,OAAO,CAAC,WAAW,CAAC,CAqNtB"}
1
+ {"version":3,"file":"write-pipeline.d.ts","sourceRoot":"","sources":["../../src/core/write-pipeline.ts"],"names":[],"mappings":"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"}