@joshuaswarren/openclaw-engram 9.0.105 → 9.0.107

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 CHANGED
@@ -207,6 +207,7 @@ Start with zero config. Enable features as your needs grow:
207
207
  | **+ Capture control** | `implicit`, `explicit`, or `hybrid` capture modes for memory write policy |
208
208
  | **+ Memory OS** | Memory boxes, graph reasoning, compounding, shared context, identity continuity |
209
209
  | **+ LCM** | Lossless Context Management — never lose conversation context to compaction |
210
+ | **+ Parallel retrieval** | Three specialized agents (DirectFact, Contextual, Temporal) run in parallel — same latency, broader coverage |
210
211
  | **+ Advanced** | Trust zones, causal trajectories, harmonic retrieval, evaluation harness, poisoning defense |
211
212
 
212
213
  Use a preset to jump to a recommended level: `conservative`, `balanced`, `research-max`, or `local-llm-heavy`.
@@ -298,6 +299,41 @@ Enable it in your `openclaw.json`:
298
299
 
299
300
  See the [LCM Guide](docs/guides/lossless-context-management.md) for architecture details, configuration options, and how it complements native compaction.
300
301
 
302
+ ### Parallel Specialized Retrieval (opt-in)
303
+
304
+ Engram's default retrieval runs a single hybrid search pass. Parallel Specialized Retrieval (inspired by [Supermemory's ASMR technique](https://blog.supermemory.ai/we-broke-the-frontier-in-agent-memory-introducing-99-sota-memory-system/)) runs three specialized agents in parallel so total latency equals `max(agents)` not `sum(agents)`.
305
+
306
+ | Agent | What It Does | Cost |
307
+ |-------|-------------|------|
308
+ | **DirectFact** | Scans entity filenames for keyword overlap with the query | File I/O only, <5ms |
309
+ | **Contextual** | Existing hybrid BM25+vector search (unchanged) | Same as current |
310
+ | **Temporal** | Reads the temporal date index, returns recent memories with recency decay scoring | File I/O + math, <10ms |
311
+
312
+ **Zero additional LLM cost.** The DirectFact and Temporal agents reuse existing indexes with no new embeddings or inference. The Contextual agent is the same hybrid search already running.
313
+
314
+ Results from all three agents are merged by path, deduplicated, and weighted (`direct=1.0×, temporal=0.85×, contextual=0.7×`) before returning the top N results. Any agent error degrades gracefully without blocking the others.
315
+
316
+ Enable it in your `openclaw.json`:
317
+
318
+ ```jsonc
319
+ {
320
+ "plugins": {
321
+ "entries": {
322
+ "openclaw-engram": {
323
+ "config": {
324
+ "parallelRetrievalEnabled": true
325
+ // Optional tuning:
326
+ // "parallelMaxResultsPerAgent": 20,
327
+ // "parallelAgentWeights": { "direct": 1.0, "contextual": 0.7, "temporal": 0.85 }
328
+ }
329
+ }
330
+ }
331
+ }
332
+ }
333
+ ```
334
+
335
+ Set `parallelMaxResultsPerAgent: 0` to disable an individual agent's results without disabling the feature entirely.
336
+
301
337
  ### Advanced (opt-in)
302
338
 
303
339
  - **Objective-State Recall** — Surfaces file/process/tool state snapshots alongside semantic memory
@@ -3,10 +3,10 @@ import {
3
3
  EngramAccessService,
4
4
  Orchestrator,
5
5
  parseConfig
6
- } from "./chunk-6ZL6J6ZZ.js";
7
- import "./chunk-LTELW5MZ.js";
6
+ } from "./chunk-TVZ2RTQZ.js";
7
+ import "./chunk-4E3TGUFK.js";
8
8
  import "./chunk-WSXU2GHQ.js";
9
- import "./chunk-H7LMMCVZ.js";
9
+ import "./chunk-GCQN37AR.js";
10
10
  import "./chunk-BNBG2XP6.js";
11
11
  import "./chunk-AFMNQR7H.js";
12
12
  import "./chunk-V2E2ORE5.js";
@@ -4,7 +4,7 @@ import {
4
4
  parseContinuityImprovementLoops,
5
5
  parseContinuityIncident,
6
6
  sanitizeMemoryContent
7
- } from "./chunk-H7LMMCVZ.js";
7
+ } from "./chunk-GCQN37AR.js";
8
8
  import {
9
9
  log
10
10
  } from "./chunk-SSIIJJKA.js";
@@ -1837,4 +1837,4 @@ export {
1837
1837
  defaultTierMigrationCycleBudget,
1838
1838
  CompoundingEngine
1839
1839
  };
1840
- //# sourceMappingURL=chunk-LTELW5MZ.js.map
1840
+ //# sourceMappingURL=chunk-4E3TGUFK.js.map
@@ -4,7 +4,7 @@ import {
4
4
  } from "./chunk-SSIIJJKA.js";
5
5
 
6
6
  // src/storage.ts
7
- import { access, readdir, readFile as readFile2, writeFile as writeFile2, mkdir as mkdir2, unlink, rename, appendFile } from "fs/promises";
7
+ import { access, readdir, readFile as readFile2, stat as stat2, writeFile as writeFile2, mkdir as mkdir2, unlink, rename, appendFile } from "fs/promises";
8
8
  import { appendFileSync, mkdirSync, statSync } from "fs";
9
9
  import { createHash } from "crypto";
10
10
  import path4 from "path";
@@ -2186,15 +2186,38 @@ ${sanitized.text}
2186
2186
  try {
2187
2187
  const raw = await readFile2(filePath, "utf-8");
2188
2188
  const parsed = parseFrontmatter2(raw);
2189
- if (!parsed) return null;
2190
- return {
2191
- path: filePath,
2192
- frontmatter: normalizeFrontmatterForPath(
2193
- parsed.frontmatter,
2194
- toMemoryPathRel(this.baseDir, filePath)
2195
- ),
2196
- content: parsed.content
2197
- };
2189
+ if (parsed) {
2190
+ return {
2191
+ path: filePath,
2192
+ frontmatter: normalizeFrontmatterForPath(
2193
+ parsed.frontmatter,
2194
+ toMemoryPathRel(this.baseDir, filePath)
2195
+ ),
2196
+ content: parsed.content
2197
+ };
2198
+ }
2199
+ const normalizedPath = filePath.split(path4.sep).join("/");
2200
+ if (normalizedPath.includes("/entities/") && filePath.endsWith(".md")) {
2201
+ const entity = parseEntityFile(raw);
2202
+ if (!entity.name) return null;
2203
+ const nameWithoutExt = path4.basename(filePath, ".md");
2204
+ const fileMtime = entity.updated || await stat2(filePath).then((s) => s.mtime.toISOString()).catch(() => (/* @__PURE__ */ new Date(0)).toISOString());
2205
+ return {
2206
+ path: filePath,
2207
+ frontmatter: {
2208
+ id: nameWithoutExt,
2209
+ category: "entity",
2210
+ created: fileMtime,
2211
+ updated: fileMtime,
2212
+ source: "entity_extraction",
2213
+ confidence: 0.9,
2214
+ confidenceTier: confidenceTier(0.9),
2215
+ tags: entity.type ? [entity.type] : []
2216
+ },
2217
+ content: raw
2218
+ };
2219
+ }
2220
+ return null;
2198
2221
  } catch {
2199
2222
  return null;
2200
2223
  }
@@ -3888,4 +3911,4 @@ export {
3888
3911
  serializeEntityFile,
3889
3912
  StorageManager
3890
3913
  };
3891
- //# sourceMappingURL=chunk-H7LMMCVZ.js.map
3914
+ //# sourceMappingURL=chunk-GCQN37AR.js.map