@joshuaswarren/openclaw-engram 9.7.15 → 9.9.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.
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "openclaw-engram",
3
3
  "name": "Remnic OpenClaw Plugin",
4
- "version": "9.7.15",
4
+ "version": "9.9.0",
5
5
  "kind": "memory",
6
6
  "description": "Local semantic memory for OpenClaw with bundled Remnic core runtime. Requires plugins.slots.memory set to this plugin id for hooks to fire.",
7
7
  "setup": {
@@ -225,6 +225,14 @@
225
225
  "type": "string",
226
226
  "description": "Optional additional guidance for the active-recall builder."
227
227
  },
228
+ "activeRecallPromptOverride": {
229
+ "type": "string",
230
+ "description": "Legacy optional custom instruction for the active-recall builder."
231
+ },
232
+ "activeRecallPromptReplacement": {
233
+ "type": "string",
234
+ "description": "Optional complete replacement prompt for the active-recall builder."
235
+ },
228
236
  "activeRecallPromptStyle": {
229
237
  "type": "string",
230
238
  "enum": [
@@ -585,6 +593,13 @@
585
593
  "default": 5,
586
594
  "description": "Max turns before forced extraction"
587
595
  },
596
+ "bufferSaveDebounceMs": {
597
+ "type": "integer",
598
+ "default": 3000,
599
+ "minimum": 0,
600
+ "maximum": 2147483647,
601
+ "description": "Debounce window (ms) for persisting the smart buffer to state/buffer.json. Steady-state buffering coalesces the whole-state write onto a trailing-edge timer instead of rewriting every turn; extraction trigger/clear and shutdown force an immediate flush. 0 restores save-every-turn. Capped at 2147483647 (Node's 32-bit setTimeout limit)."
602
+ },
588
603
  "bufferSurpriseK": {
589
604
  "type": "number",
590
605
  "default": 5,
@@ -1496,6 +1511,68 @@
1496
1511
  "default": "off",
1497
1512
  "description": "Passive correction capture (#1581) — detects corrections expressed in conversation during extraction and routes them to the Correction Contract (#1580). \"off\" disables detection (default, rule 48); \"queue\" plans corrections for human review in the review list; \"auto\" applies immediately when all safety guards pass (confidence floor, blast-radius cap, allowed action/classification), otherwise falls back to queue. Invalid values are rejected (rule 51)."
1498
1513
  },
1514
+ "correction": {
1515
+ "type": "object",
1516
+ "description": "Memory-correction contract (issue #1580) — nested form; nested keys win over the flat legacy correction* keys.",
1517
+ "properties": {
1518
+ "enabled": {
1519
+ "type": "boolean",
1520
+ "description": "Enable the correction contract (plan/apply). Default true."
1521
+ },
1522
+ "applyRequiresConfirm": {
1523
+ "type": "boolean",
1524
+ "description": "Require confirm: true on memory_correct_apply. Default true."
1525
+ },
1526
+ "maxAffected": {
1527
+ "type": "integer",
1528
+ "minimum": 1,
1529
+ "description": "Maximum memories one correction plan may touch. Default 10."
1530
+ },
1531
+ "planTtlHours": {
1532
+ "type": "number",
1533
+ "minimum": 1,
1534
+ "description": "Hours a planned correction stays applicable. Default 24."
1535
+ }
1536
+ }
1537
+ },
1538
+ "correctionCapture": {
1539
+ "type": "object",
1540
+ "description": "Implicit correction capture (nested form; nested keys win over the flat legacy correctionCapture* keys).",
1541
+ "properties": {
1542
+ "mode": {
1543
+ "type": "string",
1544
+ "enum": [
1545
+ "off",
1546
+ "queue",
1547
+ "auto"
1548
+ ],
1549
+ "description": "Implicit capture mode. Default off."
1550
+ },
1551
+ "confidenceFloor": {
1552
+ "type": "number",
1553
+ "minimum": 0,
1554
+ "maximum": 1,
1555
+ "description": "Minimum detector confidence to act on. Default 0.85."
1556
+ },
1557
+ "autoApplyMaxAffected": {
1558
+ "type": "integer",
1559
+ "minimum": 1,
1560
+ "description": "Auto-apply ceiling on affected memories. Default 2."
1561
+ }
1562
+ }
1563
+ },
1564
+ "openclawHostEmbeddingProviderEnabled": {
1565
+ "type": "boolean",
1566
+ "description": "Legacy alias for hostEmbeddingProviderEnabled (OpenClaw host embedding provider). Default true."
1567
+ },
1568
+ "openclawHostEmbeddingProviderId": {
1569
+ "type": "string",
1570
+ "description": "Legacy alias for hostEmbeddingProviderId."
1571
+ },
1572
+ "openclawHostEmbeddingProviderModel": {
1573
+ "type": "string",
1574
+ "description": "Legacy alias for hostEmbeddingProviderModel."
1575
+ },
1499
1576
  "correctionEnabled": {
1500
1577
  "type": "boolean",
1501
1578
  "default": true,
@@ -3163,6 +3240,18 @@
3163
3240
  "default": "",
3164
3241
  "description": "Root directory for memory extensions. Empty string derives from memoryDir (go up to Remnic home and append memory_extensions)."
3165
3242
  },
3243
+ "memoryLifecycleLedgerCompactBytes": {
3244
+ "type": "integer",
3245
+ "default": 67108864,
3246
+ "minimum": 0,
3247
+ "description": "Auto-compact state/memory-lifecycle-ledger.jsonl when it exceeds this many bytes, triggered off the debounced maintenance path (issue #1910). Set 0 to disable. Default 64MB."
3248
+ },
3249
+ "memoryLifecycleLedgerCompactMinIntervalMs": {
3250
+ "type": "integer",
3251
+ "default": 21600000,
3252
+ "minimum": 60000,
3253
+ "description": "Minimum interval between auto-compactions of the lifecycle ledger (issue #1910). Default 6 hours."
3254
+ },
3166
3255
  "memoryLinkingEnabled": {
3167
3256
  "type": "boolean",
3168
3257
  "default": false,
@@ -3771,6 +3860,11 @@
3771
3860
  "default": 900,
3772
3861
  "description": "Token budget for each proactive extraction sub-call (0 disables the proactive second pass)."
3773
3862
  },
3863
+ "proactiveExtractionSkipWhenLocalLlmBusy": {
3864
+ "type": "boolean",
3865
+ "default": true,
3866
+ "description": "Skip the optional proactive extraction second pass when the local LLM background lane is already busy, instead of queueing behind an in-flight extraction and losing its shorter deadline (issue #2011). Set false to always attempt the second pass."
3867
+ },
3774
3868
  "proactiveExtractionTimeoutMs": {
3775
3869
  "type": "number",
3776
3870
  "default": 2500,
@@ -4015,6 +4109,12 @@
4015
4109
  "default": true,
4016
4110
  "description": "Enable debounced background QMD maintenance instead of immediate updates on extraction."
4017
4111
  },
4112
+ "qmdEmbeddingBacklogThreshold": {
4113
+ "type": "integer",
4114
+ "minimum": 0,
4115
+ "default": 1000,
4116
+ "description": "Pending-embedding count above which QMD health reports degraded. Set to 0 to disable backlog degradation."
4117
+ },
4018
4118
  "qmdMaxResults": {
4019
4119
  "type": "number",
4020
4120
  "default": 8,
@@ -4197,6 +4297,13 @@
4197
4297
  "type": "number",
4198
4298
  "description": "Hard character cap for total recall context. Defaults to maxMemoryTokens * 4."
4199
4299
  },
4300
+ "recallProfileMaxRatio": {
4301
+ "type": "number",
4302
+ "minimum": 0,
4303
+ "maximum": 1,
4304
+ "default": 0.3,
4305
+ "description": "Maximum fraction of the total recall budget available to the behavioral profile. Set to 1 to disable the share cap."
4306
+ },
4200
4307
  "recallConfidenceGateEnabled": {
4201
4308
  "type": "boolean",
4202
4309
  "default": false,
@@ -4329,6 +4436,25 @@
4329
4436
  "default": 5,
4330
4437
  "description": "Issue #1582 — number of recent per-session recall snapshots searched when resolving a `[m:xxxx]` handle to a memory id. Older-than-N snapshots are not searched; a miss is tagged rather than widening the window."
4331
4438
  },
4439
+ "recallImpressionsRotateBytes": {
4440
+ "type": "integer",
4441
+ "default": 33554432,
4442
+ "minimum": 0,
4443
+ "description": "Rotate state/recall_impressions.jsonl to .1..N when it exceeds this many bytes (issue #1910). Set 0 to disable. Default 32MB."
4444
+ },
4445
+ "recallImpressionsRotateKeep": {
4446
+ "type": "integer",
4447
+ "default": 5,
4448
+ "minimum": 1,
4449
+ "maximum": 1000,
4450
+ "description": "Number of rotated recall-impression archives to keep (.1 .. .N) (issue #1910). Default 5. Max 1000: each retained slot costs one rename under the held impressions lock per rotation, so a larger value is rejected at config-parse time before it can stall recall recording."
4451
+ },
4452
+ "recallMaxConcurrentPerPrincipal": {
4453
+ "type": "integer",
4454
+ "minimum": 0,
4455
+ "default": 4,
4456
+ "description": "Maximum concurrent recalls executed per principal (issue #1906). Recalls beyond this cap queue FIFO; an aborted waiter leaves the queue immediately. 0 = unlimited (no cap). Replaces the former width-1 budget-lock serialization; budget accounting stays correct because peek/record are synchronous. Set 1 to restore exact serialization."
4457
+ },
4332
4458
  "recallMemoryHandles": {
4333
4459
  "type": "boolean",
4334
4460
  "default": false,
@@ -4339,6 +4465,11 @@
4339
4465
  "default": true,
4340
4466
  "description": "When true, recall multiplies candidate scores by the Memory Worth factor (mw_success / mw_fail counters, see issue #560). Memories with a history of failed sessions sink; neutral/uninstrumented memories are untouched. PR 5 bench: +0.60 precision@5 vs baseline on all 50 seeded cases. Operators can opt out with false."
4341
4467
  },
4468
+ "recallTrustStageCorpusFallbackEnabled": {
4469
+ "type": "boolean",
4470
+ "default": true,
4471
+ "description": "When true (default), the Memory-Worth/TrustScore recall rerank stage probes a per-namespace corpus counter/signal map for candidates whose frontmatter was NOT already loaded on the hot path (cold-tier / embedding-fallback / archive rows). The map is version-keyed (invalidated on corpus mutation) and age-bounded for trust signals, so it hits in steady state without the old 30s-TTL permanent-miss. Set false to disable the corpus fallback entirely (only preloaded-candidate + direct-read paths run) — max performance when every candidate is hot, at the cost of neutral treatment for cold candidates."
4472
+ },
4342
4473
  "hotMemoriesCacheEnabled": {
4343
4474
  "type": "boolean",
4344
4475
  "default": true,
@@ -4433,6 +4564,26 @@
4433
4564
  },
4434
4565
  "forceGeneric": {
4435
4566
  "type": "boolean"
4567
+ },
4568
+ "maxHints": {
4569
+ "type": "number",
4570
+ "description": "Per-section cap on injected hint lines."
4571
+ },
4572
+ "maxSupportingFacts": {
4573
+ "type": "number",
4574
+ "description": "Per-section cap on supporting facts."
4575
+ },
4576
+ "maxRelatedEntities": {
4577
+ "type": "number",
4578
+ "description": "Per-section cap on related entities."
4579
+ },
4580
+ "recentTurns": {
4581
+ "type": "number",
4582
+ "description": "Per-section recent-turn scan window."
4583
+ },
4584
+ "maxRubrics": {
4585
+ "type": "number",
4586
+ "description": "Per-section cap on injected rubrics."
4436
4587
  }
4437
4588
  },
4438
4589
  "required": [
@@ -4500,6 +4651,11 @@
4500
4651
  "default": false,
4501
4652
  "description": "Boost stored reasoning_trace memories in recall results when the incoming query reads like a problem-solving ask (e.g. 'how do I...', 'step by step', 'walk me through...'). Default false - opt in after benchmarking (issue #564)."
4502
4653
  },
4654
+ "recallSingleFlightEnabled": {
4655
+ "type": "boolean",
4656
+ "default": true,
4657
+ "description": "When true (default), identical concurrent recalls for the same principal share a single in-flight execution (single-flight coalescing, issue #1906); each caller still receives its own cloned response and records its own budget event. Set false to restore per-request execution."
4658
+ },
4503
4659
  "recallTranscriptRetentionDays": {
4504
4660
  "type": "integer",
4505
4661
  "minimum": 1,
@@ -6878,6 +7034,11 @@
6878
7034
  "advanced": true,
6879
7035
  "placeholder": "2500"
6880
7036
  },
7037
+ "proactiveExtractionSkipWhenLocalLlmBusy": {
7038
+ "label": "Skip Proactive When Local LLM Busy",
7039
+ "advanced": true,
7040
+ "help": "Skip the optional proactive extraction pass when the local LLM background lane is saturated, rather than queueing behind an in-flight extraction (issue #2011, default on)"
7041
+ },
6881
7042
  "proactiveExtractionMaxTokens": {
6882
7043
  "label": "Proactive Extraction Max Tokens",
6883
7044
  "advanced": true,
@@ -6997,6 +7158,12 @@
6997
7158
  "advanced": true,
6998
7159
  "placeholder": "8000"
6999
7160
  },
7161
+ "recallProfileMaxRatio": {
7162
+ "label": "Recall Profile Budget Share",
7163
+ "advanced": true,
7164
+ "placeholder": "0.3",
7165
+ "help": "Maximum fraction of the total recall budget available to the behavioral profile. Set to 1 to disable the share cap."
7166
+ },
7000
7167
  "recallPipeline": {
7001
7168
  "label": "Recall Pipeline",
7002
7169
  "advanced": true,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joshuaswarren/openclaw-engram",
3
- "version": "9.7.15",
3
+ "version": "9.9.0",
4
4
  "description": "Deprecated compatibility shim for Engram installs. Re-exports @remnic/plugin-openclaw and forwards engram-access to @remnic/core.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -51,8 +51,8 @@
51
51
  }
52
52
  },
53
53
  "dependencies": {
54
- "@remnic/plugin-openclaw": "^9.7.15",
55
- "@remnic/core": "^9.7.15"
54
+ "@remnic/plugin-openclaw": "^9.9.0",
55
+ "@remnic/core": "^9.9.0"
56
56
  },
57
57
  "peerDependencies": {
58
58
  "openclaw": ">=2026.4.1 || 2026.4.7-1 || 2026.4.9-beta.1 || 2026.4.11-beta.1 || 2026.4.12-beta.1 || 2026.4.14-beta.1 || 2026.4.15-beta.1 || 2026.4.15-beta.2 || 2026.4.19-beta.1 || 2026.4.19-beta.2 || 2026.4.20-beta.1 || 2026.4.20-beta.2 || 2026.4.22-beta.1 || 2026.4.23-beta.1 || 2026.4.23-beta.2 || 2026.4.23-beta.3 || 2026.4.23-beta.4 || 2026.4.23-beta.5 || 2026.4.23-beta.6 || 2026.4.24-beta.1 || 2026.4.24-beta.2 || 2026.4.24-beta.3 || 2026.4.24-beta.4 || 2026.4.24-beta.5 || 2026.4.24-beta.6 || 2026.4.25-beta.1 || 2026.4.25-beta.2 || 2026.4.25-beta.3 || 2026.4.25-beta.4 || 2026.4.25-beta.5 || 2026.4.25-beta.6 || 2026.4.25-beta.7 || 2026.4.25-beta.8 || 2026.4.25-beta.9 || 2026.4.25-beta.10 || 2026.4.25-beta.11 || 2026.4.26-beta.1 || 2026.4.27-beta.1 || 2026.4.29-beta.1 || 2026.4.29-beta.2 || 2026.4.29-beta.3 || 2026.4.29-beta.4 || 2026.4.30-beta.1 || 2026.5.2-beta.1 || 2026.5.2-beta.2 || 2026.5.2-beta.3 || 2026.5.3-beta.1 || 2026.5.3-beta.2 || 2026.5.3-beta.3 || 2026.5.3-beta.4 || 2026.5.3-1 || 2026.5.4-beta.1 || 2026.5.4-beta.2 || 2026.5.4-beta.3 || 2026.5.5-beta.1 || 2026.5.5-beta.2 || 2026.5.6-beta.1 || 2026.5.7-beta.1 || 2026.5.9-beta.1 || 2026.5.10-beta.1 || 2026.5.10-beta.2 || 2026.5.10-beta.3 || 2026.5.10-beta.4 || 2026.5.10-beta.5 || 2026.5.10-beta.6 || 2026.5.12-beta.1 || 2026.5.12-beta.2 || 2026.5.12-beta.3 || 2026.5.12-beta.4 || 2026.5.12-beta.5 || 2026.5.12-beta.6 || 2026.5.12-beta.7 || 2026.5.12-beta.8 || 2026.5.14-beta.1 || 2026.5.14-beta.2 || 2026.5.16-beta.1 || 2026.5.16-beta.2 || 2026.5.16-beta.3 || 2026.5.16-beta.4 || 2026.5.16-beta.5 || 2026.5.16-beta.6 || 2026.5.16-beta.7 || 2026.5.18-beta.1 || 2026.5.19-alpha.1 || 2026.5.19-beta.1 || 2026.5.19-beta.2 || 2026.5.20-beta.1 || 2026.5.20-beta.2 || 2026.5.21-alpha.1 || 2026.5.21-beta.1 || 2026.5.22-beta.1 || 2026.5.23-alpha.1 || 2026.5.24-alpha.1 || 2026.5.24-beta.1 || 2026.5.24-beta.2 || 2026.5.25-alpha.1 || 2026.5.25-alpha.2 || 2026.5.25-beta.1 || 2026.5.26-beta.1 || 2026.5.26-beta.2 || 2026.5.27-alpha.1 || 2026.5.27-beta.1 || 2026.5.28-alpha.1 || 2026.5.28-beta.1 || 2026.5.28-beta.2 || 2026.5.28-beta.3 || 2026.5.28-beta.4 || 2026.5.29-alpha.1 || 2026.5.30-beta.1 || 2026.5.30-beta.2 || 2026.5.31-alpha.1 || 2026.5.31-beta.1 || 2026.5.31-beta.2 || 2026.5.31-beta.3 || 2026.5.31-beta.4 || 2026.6.1-alpha.1 || 2026.6.1-alpha.2 || 2026.6.1-alpha.3 || 2026.6.1-beta.1 || 2026.6.1-beta.2 || 2026.6.1-beta.3 || 2026.6.2-alpha.1 || 2026.6.2-alpha.2 || 2026.6.2-beta.1 || 2026.6.3-alpha.1 || 2026.6.4-alpha.1 || 2026.6.5-alpha.1 || 2026.6.5-alpha.2 || 2026.6.5-beta.1 || 2026.6.5-beta.2 || 2026.6.5-beta.3 || 2026.6.5-beta.5 || 2026.6.5-beta.6 || 2026.6.6-alpha.1 || 2026.6.6-beta.2 || 2026.6.6 || 2026.6.7-beta.1 || 2026.6.8-beta.1 || 2026.6.8-beta.2 || 2026.6.9-beta.1 || 2026.6.10-beta.1 || 2026.6.10-beta.2 || 2026.6.11-beta.1"