@remnic/plugin-openclaw 1.0.6 → 1.0.8

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.
@@ -0,0 +1,100 @@
1
+ import {
2
+ readPair,
3
+ resolvePair
4
+ } from "./chunk-DIZW6H5J.js";
5
+ import {
6
+ log
7
+ } from "./chunk-UFU5GGGA.js";
8
+ import "./chunk-MLKGABMK.js";
9
+
10
+ // ../remnic-core/src/contradiction/resolution.ts
11
+ var VALID_VERBS = ["keep-a", "keep-b", "merge", "both-valid", "needs-more-context"];
12
+ function isValidResolutionVerb(value) {
13
+ return VALID_VERBS.includes(value);
14
+ }
15
+ async function executeResolution(memoryDir, storage, pairId, verb) {
16
+ const pair = readPair(memoryDir, pairId);
17
+ if (!pair) {
18
+ return { pairId, verb, affectedIds: [], message: `Pair ${pairId} not found` };
19
+ }
20
+ if (pair.resolution) {
21
+ return { pairId, verb, affectedIds: [], message: `Pair already resolved with verb "${pair.resolution}"` };
22
+ }
23
+ const [idA, idB] = pair.memoryIds;
24
+ const affectedIds = [];
25
+ let message = "";
26
+ let supersedeFailed = false;
27
+ switch (verb) {
28
+ case "keep-a": {
29
+ const ok = await supersedeSafe(storage, idB, idA, "contradiction-resolution:keep-a");
30
+ if (ok) {
31
+ affectedIds.push(idB);
32
+ message = `Kept ${idA}, superseded ${idB}`;
33
+ } else {
34
+ supersedeFailed = true;
35
+ message = `Supersede failed for ${idB}; not resolving`;
36
+ }
37
+ break;
38
+ }
39
+ case "keep-b": {
40
+ const ok = await supersedeSafe(storage, idA, idB, "contradiction-resolution:keep-b");
41
+ if (ok) {
42
+ affectedIds.push(idA);
43
+ message = `Kept ${idB}, superseded ${idA}`;
44
+ } else {
45
+ supersedeFailed = true;
46
+ message = `Supersede failed for ${idA}; not resolving`;
47
+ }
48
+ break;
49
+ }
50
+ case "merge": {
51
+ const mergedId = `merged-${pairId}`;
52
+ const okA = await supersedeSafe(storage, idA, mergedId, "contradiction-resolution:merge");
53
+ const okB = await supersedeSafe(storage, idB, mergedId, "contradiction-resolution:merge");
54
+ if (okA) affectedIds.push(idA);
55
+ if (okB) affectedIds.push(idB);
56
+ if (!okA || !okB) {
57
+ supersedeFailed = true;
58
+ message = `Merge incomplete: ${affectedIds.length}/2 superseded; not resolving to allow retry`;
59
+ } else {
60
+ message = `Both memories superseded by merged ${mergedId}`;
61
+ }
62
+ break;
63
+ }
64
+ case "both-valid": {
65
+ message = "Pair marked as both-valid; cooldown applied";
66
+ break;
67
+ }
68
+ case "needs-more-context": {
69
+ message = "Deferred; no action taken, short cooldown applied";
70
+ break;
71
+ }
72
+ }
73
+ if (!supersedeFailed) {
74
+ resolvePair(memoryDir, pairId, verb);
75
+ }
76
+ log.info("[contradiction-resolution] pair=%s verb=%s affected=%d", pairId, verb, affectedIds.length);
77
+ return { pairId, verb, affectedIds, message };
78
+ }
79
+ async function supersedeSafe(storage, oldId, newId, reason) {
80
+ try {
81
+ const result = await storage.supersedeMemory(oldId, newId, reason);
82
+ if (result === false) {
83
+ log.warn("[contradiction-resolution] supersede returned false for %s \u2192 %s", oldId, newId);
84
+ return false;
85
+ }
86
+ return true;
87
+ } catch (err) {
88
+ log.warn(
89
+ "[contradiction-resolution] supersede failed %s \u2192 %s: %s",
90
+ oldId,
91
+ newId,
92
+ err instanceof Error ? err.message : err
93
+ );
94
+ return false;
95
+ }
96
+ }
97
+ export {
98
+ executeResolution,
99
+ isValidResolutionVerb
100
+ };
@@ -8,7 +8,8 @@ import {
8
8
  normalizeEntityName,
9
9
  parseEntityFile,
10
10
  serializeEntityFile
11
- } from "./chunk-KPMXWORS.js";
11
+ } from "./chunk-JJSNPSCD.js";
12
+ import "./chunk-6OJAU466.js";
12
13
  import "./chunk-UFU5GGGA.js";
13
14
  import "./chunk-MLKGABMK.js";
14
15
  export {
@@ -58,6 +58,36 @@
58
58
  "default": 15,
59
59
  "description": "Max minutes before forced extraction"
60
60
  },
61
+ "bufferSurpriseTriggerEnabled": {
62
+ "type": "boolean",
63
+ "default": false,
64
+ "description": "Issue #563 (D-MEM). When true, the smart buffer flushes immediately on turns whose embedding-based surprise score exceeds bufferSurpriseThreshold, in addition to the existing turn-count / signal / time triggers. Additive only — never suppresses existing flushes. Off by default."
65
+ },
66
+ "bufferSurpriseThreshold": {
67
+ "type": "number",
68
+ "default": 0.35,
69
+ "minimum": 0,
70
+ "maximum": 1,
71
+ "description": "Threshold in [0, 1] above which a surprise score flushes the buffer. Higher = require more novelty to flush. Ignored when bufferSurpriseTriggerEnabled is false."
72
+ },
73
+ "bufferSurpriseK": {
74
+ "type": "number",
75
+ "default": 5,
76
+ "minimum": 1,
77
+ "description": "Number of nearest-neighbor memories to average over when computing the surprise score. Clamped to the recent-memory window size."
78
+ },
79
+ "bufferSurpriseRecentMemoryCount": {
80
+ "type": "number",
81
+ "default": 20,
82
+ "minimum": 0,
83
+ "description": "Maximum number of recent memories sampled for surprise scoring. Bounds embedding cost per turn. Set to 0 to effectively disable the trigger even when the flag is on."
84
+ },
85
+ "bufferSurpriseProbeTimeoutMs": {
86
+ "type": "number",
87
+ "default": 2000,
88
+ "minimum": 1,
89
+ "description": "Hard timeout (ms) for the surprise probe. If the probe does not resolve within this window the buffer treats it as failed and falls through to the existing triggers — a slow or hung embedder cannot stall the turn-append path."
90
+ },
61
91
  "consolidateEveryN": {
62
92
  "type": "number",
63
93
  "default": 3,
@@ -318,6 +348,24 @@
318
348
  }
319
349
  }
320
350
  },
351
+ "codingMode": {
352
+ "type": "object",
353
+ "additionalProperties": false,
354
+ "default": {},
355
+ "description": "Coding-agent project/branch scoping (issue #569).",
356
+ "properties": {
357
+ "projectScope": {
358
+ "type": "boolean",
359
+ "default": true,
360
+ "description": "When true and the session has a resolved git context, memory routes to a project-scoped namespace (project:<id>). Set to false to restore pre-#569 behaviour exactly."
361
+ },
362
+ "branchScope": {
363
+ "type": "boolean",
364
+ "default": false,
365
+ "description": "When true, memory also overlays the current branch (project:<id>/branch:<name>). Opt-in — most development wants cross-branch recall. Wired in PR 3 of #569."
366
+ }
367
+ }
368
+ },
321
369
  "procedural": {
322
370
  "type": "object",
323
371
  "additionalProperties": false,
@@ -325,8 +373,8 @@
325
373
  "properties": {
326
374
  "enabled": {
327
375
  "type": "boolean",
328
- "default": false,
329
- "description": "Master gate for procedural memory: extraction, recall boost, and mining (issue #519)."
376
+ "default": true,
377
+ "description": "Master gate for procedural memory: extraction, recall boost, and mining (issue #519). Default-on since issue #567 PR 4/5; set to `false` to opt out."
330
378
  },
331
379
  "minOccurrences": {
332
380
  "type": "integer",
@@ -339,7 +387,7 @@
339
387
  "type": "number",
340
388
  "minimum": 0,
341
389
  "maximum": 1,
342
- "default": 0.7,
390
+ "default": 0.75,
343
391
  "description": "Minimum success-rate floor (from trajectory outcomes) for miner promotion."
344
392
  },
345
393
  "autoPromoteOccurrences": {
@@ -358,14 +406,14 @@
358
406
  "type": "integer",
359
407
  "minimum": 1,
360
408
  "maximum": 3650,
361
- "default": 30,
409
+ "default": 14,
362
410
  "description": "Trajectory lookback window for procedural mining."
363
411
  },
364
412
  "recallMaxProcedures": {
365
413
  "type": "integer",
366
414
  "minimum": 1,
367
415
  "maximum": 10,
368
- "default": 3,
416
+ "default": 2,
369
417
  "description": "Maximum procedure memories to inject on task-initiation recall."
370
418
  },
371
419
  "proceduralMiningCronAutoRegister": {
@@ -739,7 +787,11 @@
739
787
  },
740
788
  "binaryLifecycleBackendType": {
741
789
  "type": "string",
742
- "enum": ["none", "filesystem", "s3"],
790
+ "enum": [
791
+ "none",
792
+ "filesystem",
793
+ "s3"
794
+ ],
743
795
  "default": "none",
744
796
  "description": "Storage backend for binary lifecycle mirror stage."
745
797
  },
@@ -1918,6 +1970,48 @@
1918
1970
  "default": true,
1919
1971
  "description": "Automatically supersede contradicted memories"
1920
1972
  },
1973
+ "contradictionScan": {
1974
+ "type": "object",
1975
+ "description": "Configuration for the nightly contradiction-scan cron (issue #520)",
1976
+ "properties": {
1977
+ "enabled": {
1978
+ "type": "boolean",
1979
+ "default": false,
1980
+ "description": "Enable the nightly contradiction scan cron (disabled by default per rule 48)"
1981
+ },
1982
+ "similarityFloor": {
1983
+ "type": "number",
1984
+ "default": 0.82,
1985
+ "minimum": 0,
1986
+ "maximum": 1,
1987
+ "description": "Embedding cosine similarity floor for candidate pair generation"
1988
+ },
1989
+ "topicOverlapFloor": {
1990
+ "type": "number",
1991
+ "default": 0.4,
1992
+ "minimum": 0,
1993
+ "maximum": 1,
1994
+ "description": "Minimum topic-token Jaccard overlap for unstructured pairs"
1995
+ },
1996
+ "maxPairsPerRun": {
1997
+ "type": "integer",
1998
+ "default": 500,
1999
+ "minimum": 1,
2000
+ "description": "Cap on candidate pairs evaluated per cron run"
2001
+ },
2002
+ "cooldownDays": {
2003
+ "type": "integer",
2004
+ "default": 14,
2005
+ "minimum": 0,
2006
+ "description": "Cooldown in days. 0 = always re-evaluate."
2007
+ },
2008
+ "autoMergeDuplicates": {
2009
+ "type": "boolean",
2010
+ "default": false,
2011
+ "description": "Auto-flag pairs judged duplicates for dedup (still requires user approval)"
2012
+ }
2013
+ }
2014
+ },
1921
2015
  "temporalSupersessionEnabled": {
1922
2016
  "type": "boolean",
1923
2017
  "default": true,
@@ -1929,9 +2023,35 @@
1929
2023
  "description": "If true, include temporally-superseded facts in recall results (for audit/history). Default: exclude."
1930
2024
  },
1931
2025
  "recallDirectAnswerEnabled": {
2026
+ "type": "boolean",
2027
+ "default": true,
2028
+ "description": "When true, recall runs the direct-answer tier in observation mode: annotates LastRecallSnapshot.tierExplain with which tier would have served the query (issue #518). Does not short-circuit the QMD path in the current release."
2029
+ },
2030
+ "recallGraphEnabled": {
1932
2031
  "type": "boolean",
1933
2032
  "default": false,
1934
- "description": "When true, recall checks whether a single validated high-trust memory can answer the query before QMD runs (issue #518). Default off until bench validation."
2033
+ "description": "When true, recall builds a retrieval graph from memory frontmatter and runs Personalized PageRank, merging the result with QMD via MMR (issue #559 PR 4). Default false — ships off pending the retrieval-graph bench in PR 5."
2034
+ },
2035
+ "recallGraphDamping": {
2036
+ "type": "number",
2037
+ "minimum": 0,
2038
+ "maximum": 0.999999999,
2039
+ "default": 0.85,
2040
+ "description": "PPR damping factor used by the graph retrieval tier (issue #559)."
2041
+ },
2042
+ "recallGraphIterations": {
2043
+ "type": "integer",
2044
+ "minimum": 0,
2045
+ "maximum": 500,
2046
+ "default": 20,
2047
+ "description": "Maximum power-iteration rounds for PPR. Higher values trade latency for convergence."
2048
+ },
2049
+ "recallGraphTopK": {
2050
+ "type": "integer",
2051
+ "minimum": 0,
2052
+ "maximum": 10000,
2053
+ "default": 50,
2054
+ "description": "Maximum memories returned by the graph retrieval tier before the MMR diversifier runs."
1935
2055
  },
1936
2056
  "recallDirectAnswerTokenOverlapFloor": {
1937
2057
  "type": "number",
@@ -1956,10 +2076,87 @@
1956
2076
  },
1957
2077
  "recallDirectAnswerEligibleTaxonomyBuckets": {
1958
2078
  "type": "array",
1959
- "items": { "type": "string" },
1960
- "default": ["decisions", "principles", "conventions", "runbooks", "entities"],
2079
+ "items": {
2080
+ "type": "string"
2081
+ },
2082
+ "default": [
2083
+ "decisions",
2084
+ "principles",
2085
+ "conventions",
2086
+ "runbooks",
2087
+ "entities"
2088
+ ],
1961
2089
  "description": "Taxonomy category IDs eligible for direct-answer routing."
1962
2090
  },
2091
+ "recallCrossNamespaceBudgetEnabled": {
2092
+ "type": "boolean",
2093
+ "default": false,
2094
+ "description": "Cross-namespace query-budget limiter (issue #565). When true, a principal that issues a burst of recalls against namespaces other than their own is throttled once its per-window count crosses the hard limit. Ships disabled."
2095
+ },
2096
+ "recallCrossNamespaceBudgetWindowMs": {
2097
+ "type": "number",
2098
+ "minimum": 1,
2099
+ "default": 60000,
2100
+ "description": "Rolling window in ms over which cross-namespace reads are counted for the per-principal budget."
2101
+ },
2102
+ "recallCrossNamespaceBudgetSoftLimit": {
2103
+ "type": "number",
2104
+ "minimum": 0,
2105
+ "default": 10,
2106
+ "description": "Soft threshold for the cross-namespace budget: calls past this count are flagged but still allowed."
2107
+ },
2108
+ "recallCrossNamespaceBudgetHardLimit": {
2109
+ "type": "number",
2110
+ "minimum": 1,
2111
+ "default": 30,
2112
+ "description": "Hard threshold for the cross-namespace budget: calls past this count are denied until the window advances."
2113
+ },
2114
+ "recallAuditAnomalyDetectionEnabled": {
2115
+ "type": "boolean",
2116
+ "default": false,
2117
+ "description": "When true, access surfaces (MCP, HTTP) run the anomaly detector over a tail of the audit trail after each recall and surface flags via logs/metrics. Ships disabled — enable explicitly."
2118
+ },
2119
+ "recallAuditAnomalyWindowMs": {
2120
+ "type": "number",
2121
+ "minimum": 1,
2122
+ "default": 300000,
2123
+ "description": "Rolling window (ms) over which audit entries are analyzed by the anomaly detector. Default 5 minutes."
2124
+ },
2125
+ "recallAuditAnomalyRepeatQueryLimit": {
2126
+ "type": "number",
2127
+ "minimum": 1,
2128
+ "default": 5,
2129
+ "description": "Threshold for the repeat-query anomaly flag: number of identical queries within the window before flagging."
2130
+ },
2131
+ "recallAuditAnomalyNamespaceWalkLimit": {
2132
+ "type": "number",
2133
+ "minimum": 1,
2134
+ "default": 3,
2135
+ "description": "Threshold for the namespace-walk anomaly flag: number of distinct namespaces queried within the window before flagging."
2136
+ },
2137
+ "recallAuditAnomalyHighCardinalityLimit": {
2138
+ "type": "number",
2139
+ "minimum": 1,
2140
+ "default": 50,
2141
+ "description": "Threshold for the high-cardinality-return anomaly flag: number of distinct results returned within the window before flagging."
2142
+ },
2143
+ "recallAuditAnomalyRapidFireLimit": {
2144
+ "type": "number",
2145
+ "minimum": 1,
2146
+ "default": 30,
2147
+ "description": "Threshold for the rapid-fire anomaly flag: number of recall requests within the window before flagging."
2148
+ },
2149
+ "recallMemoryWorthFilterEnabled": {
2150
+ "type": "boolean",
2151
+ "default": true,
2152
+ "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."
2153
+ },
2154
+ "recallMemoryWorthHalfLifeMs": {
2155
+ "type": "number",
2156
+ "minimum": 0,
2157
+ "default": 0,
2158
+ "description": "Half-life (ms) for Memory Worth decay. Positive values exponentially decay older outcomes toward the neutral prior; 0 disables decay."
2159
+ },
1963
2160
  "memoryLinkingEnabled": {
1964
2161
  "type": "boolean",
1965
2162
  "default": false,
@@ -2252,6 +2449,27 @@
2252
2449
  "default": false,
2253
2450
  "description": "Shadow mode for the extraction judge. When true, judge verdicts are logged but all facts are still persisted regardless of the verdict."
2254
2451
  },
2452
+ "extractionJudgeMaxDeferrals": {
2453
+ "type": "number",
2454
+ "default": 2,
2455
+ "minimum": 1,
2456
+ "description": "Maximum number of times the same candidate text may be deferred by the extraction judge before the verdict is forcibly converted to 'reject'. Prevents pathological LLM responses from looping forever on ambiguous facts (issue #562)."
2457
+ },
2458
+ "extractionJudgeTelemetryEnabled": {
2459
+ "type": "boolean",
2460
+ "default": false,
2461
+ "description": "Emit structured telemetry rows to state/observation-ledger/extraction-judge-verdicts.jsonl on every judge verdict. Off by default; enable to collect defer-rate and latency metrics for operator dashboards (issue #562)."
2462
+ },
2463
+ "collectJudgeTrainingPairs": {
2464
+ "type": "boolean",
2465
+ "default": false,
2466
+ "description": "Opt-in collector for (candidate_text, verdict_kind, reason) tuples used to prep a future GRPO training pipeline. Rows land under ~/.remnic/judge-training/<date>.jsonl (NOT in the shared memory directory). Off by default (issue #562)."
2467
+ },
2468
+ "judgeTrainingDir": {
2469
+ "type": "string",
2470
+ "default": "",
2471
+ "description": "Override directory for judge training-pair collection. Empty string uses the default (~/.remnic/judge-training). Only consulted when collectJudgeTrainingPairs is true."
2472
+ },
2255
2473
  "inlineSourceAttributionEnabled": {
2256
2474
  "type": "boolean",
2257
2475
  "default": false,
@@ -2375,6 +2593,11 @@
2375
2593
  "default": 15000,
2376
2594
  "description": "Timeout for fast-tier local LLM requests (ms). Lower than primary since fast ops should complete quickly."
2377
2595
  },
2596
+ "localLlmDisableThinking": {
2597
+ "type": "boolean",
2598
+ "default": true,
2599
+ "description": "When true (default), request chain-of-thought / thinking-mode suppression on the main local LLM (issue #548). The `chat_template_kwargs: { enable_thinking: false }` field is only injected when the detected backend is known to support it (LM Studio, vLLM); strict OpenAI-compat backends fail open to avoid the 400-cooldown path. Structured-output tasks like extraction and consolidation gain nothing from reasoning tokens and thinking-capable models (Qwen 3.5, Gemma 4, DeepSeek) often blow the 60s timeout before emitting content. Set to false to restore thinking for narrative tasks. The fast-tier client always disables thinking and is not affected by this flag."
2600
+ },
2378
2601
  "hourlySummaryCronAutoRegister": {
2379
2602
  "type": "boolean",
2380
2603
  "default": false,
@@ -2661,6 +2884,11 @@
2661
2884
  "default": 100,
2662
2885
  "description": "Max memories to consolidate per run to limit LLM cost."
2663
2886
  },
2887
+ "operatorAwareConsolidationEnabled": {
2888
+ "type": "boolean",
2889
+ "default": false,
2890
+ "description": "Opt in to operator-aware consolidation prompts so the LLM returns structured {operator, output} JSON and SPLIT/MERGE/UPDATE is recorded on derived_via. When disabled (default), derived_via still populates via the cluster-shape heuristic."
2891
+ },
2664
2892
  "creationMemoryEnabled": {
2665
2893
  "type": "boolean",
2666
2894
  "default": false,
@@ -3439,6 +3667,11 @@
3439
3667
  "minimum": 0,
3440
3668
  "description": "Number of top candidates per section to run MMR over. Candidates past this remain in original order."
3441
3669
  },
3670
+ "recallReasoningTraceBoostEnabled": {
3671
+ "type": "boolean",
3672
+ "default": false,
3673
+ "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)."
3674
+ },
3442
3675
  "recallPipeline": {
3443
3676
  "type": "array",
3444
3677
  "description": "Ordered recall sections with per-section budgets and feature knobs.",
@@ -4037,6 +4270,10 @@
4037
4270
  "label": "Auto-Resolve Contradictions",
4038
4271
  "help": "Automatically supersede old memories when contradiction is confirmed"
4039
4272
  },
4273
+ "contradictionScan": {
4274
+ "label": "Contradiction Scan",
4275
+ "help": "Nightly cron that pairs similar memories and flags contradictions for review (issue #520)"
4276
+ },
4040
4277
  "temporalSupersessionEnabled": {
4041
4278
  "label": "Temporal Supersession",
4042
4279
  "help": "Mark older facts superseded when a newer fact writes a conflicting value for the same entityRef + structured attribute (issue #375)"
@@ -4050,6 +4287,25 @@
4050
4287
  "label": "Direct-Answer Retrieval Tier",
4051
4288
  "help": "Route validated high-trust queries to a fast direct-answer path before QMD (issue #518)."
4052
4289
  },
4290
+ "recallGraphEnabled": {
4291
+ "label": "Graph Retrieval (PPR)",
4292
+ "help": "Run Personalized PageRank on the retrieval graph and merge with QMD via MMR (issue #559)."
4293
+ },
4294
+ "recallGraphDamping": {
4295
+ "label": "Graph Recall Damping",
4296
+ "advanced": true,
4297
+ "placeholder": "0.85"
4298
+ },
4299
+ "recallGraphIterations": {
4300
+ "label": "Graph Recall Iterations",
4301
+ "advanced": true,
4302
+ "placeholder": "20"
4303
+ },
4304
+ "recallGraphTopK": {
4305
+ "label": "Graph Recall Top-K",
4306
+ "advanced": true,
4307
+ "placeholder": "50"
4308
+ },
4053
4309
  "recallDirectAnswerTokenOverlapFloor": {
4054
4310
  "label": "Direct-Answer Token Overlap Floor",
4055
4311
  "advanced": true,
@@ -4271,6 +4527,11 @@
4271
4527
  "advanced": true,
4272
4528
  "help": "Timeout for fast-tier requests. Lower than primary since fast ops should complete quickly."
4273
4529
  },
4530
+ "localLlmDisableThinking": {
4531
+ "label": "Disable Local LLM Thinking Mode",
4532
+ "advanced": true,
4533
+ "help": "Suppress chain-of-thought reasoning on the main local LLM. Default on — extraction / consolidation are structured-output tasks where thinking is pure latency tax and a common cause of 60s timeouts on Qwen 3.5 / Gemma 4 / DeepSeek. The suppression field (chat_template_kwargs) is only sent when the backend is known to support it (LM Studio, vLLM); strict OpenAI-compat backends fail open. Turn off if you want thinking on narrative tasks. Fast-tier client always disables thinking regardless."
4534
+ },
4274
4535
  "evalHarnessEnabled": {
4275
4536
  "label": "Evaluation Harness",
4276
4537
  "help": "Enable Engram's benchmark/evaluation harness foundation and benchmark-status diagnostics."
@@ -4425,6 +4686,11 @@
4425
4686
  "advanced": true,
4426
4687
  "help": "Max memories to consolidate per run to limit LLM cost."
4427
4688
  },
4689
+ "operatorAwareConsolidationEnabled": {
4690
+ "label": "Operator-Aware Consolidation Prompt",
4691
+ "advanced": true,
4692
+ "help": "Opt in to operator-aware consolidation prompts (default off). When enabled, the LLM returns structured {operator, output} JSON and we record SPLIT/MERGE/UPDATE on derived_via. When disabled (default), derived_via still populates via the cluster-shape heuristic."
4693
+ },
4428
4694
  "creationMemoryEnabled": {
4429
4695
  "label": "Creation Memory",
4430
4696
  "advanced": true,
@@ -4735,6 +5001,11 @@
4735
5001
  "advanced": true,
4736
5002
  "placeholder": "40",
4737
5003
  "help": "Number of top candidates per section over which MMR is applied"
5004
+ },
5005
+ "recallReasoningTraceBoostEnabled": {
5006
+ "label": "Boost Reasoning Traces on Problem-Solving Queries",
5007
+ "advanced": true,
5008
+ "help": "Promote stored reasoning_trace memories to the top of recall results when the incoming query reads like a problem-solving ask. Default off; enable after benchmarking (issue #564)."
4738
5009
  }
4739
5010
  }
4740
5011
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/plugin-openclaw",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "OpenClaw adapter for Remnic memory — thin wrapper delegating to @remnic/core",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -25,7 +25,7 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "openai": "^6.0.0",
28
- "@remnic/core": "^1.0.3"
28
+ "@remnic/core": "^1.1.1"
29
29
  },
30
30
  "peerDependencies": {
31
31
  "openclaw": ">=2026.4.8"