@joshuaswarren/openclaw-engram 7.2.1

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,1281 @@
1
+ {
2
+ "id": "openclaw-engram",
3
+ "kind": "memory",
4
+ "configSchema": {
5
+ "type": "object",
6
+ "additionalProperties": false,
7
+ "properties": {
8
+ "openaiApiKey": {
9
+ "type": "string",
10
+ "description": "OpenAI API key (or set OPENAI_API_KEY env var)"
11
+ },
12
+ "openaiBaseUrl": {
13
+ "type": "string",
14
+ "description": "Override the OpenAI API base URL for OpenAI-compatible providers (Scryr, Together, OpenRouter, etc.)"
15
+ },
16
+ "model": {
17
+ "type": "string",
18
+ "default": "gpt-5.2",
19
+ "description": "OpenAI model for extraction/consolidation"
20
+ },
21
+ "reasoningEffort": {
22
+ "type": "string",
23
+ "enum": ["none", "low", "medium", "high"],
24
+ "default": "low",
25
+ "description": "Reasoning effort for extraction"
26
+ },
27
+ "triggerMode": {
28
+ "type": "string",
29
+ "enum": ["smart", "every_n", "time_based"],
30
+ "default": "smart",
31
+ "description": "Buffer trigger mode"
32
+ },
33
+ "bufferMaxTurns": {
34
+ "type": "number",
35
+ "default": 5,
36
+ "description": "Max turns before forced extraction"
37
+ },
38
+ "bufferMaxMinutes": {
39
+ "type": "number",
40
+ "default": 15,
41
+ "description": "Max minutes before forced extraction"
42
+ },
43
+ "consolidateEveryN": {
44
+ "type": "number",
45
+ "default": 3,
46
+ "description": "Run consolidation every N extractions"
47
+ },
48
+ "highSignalPatterns": {
49
+ "type": "array",
50
+ "items": { "type": "string" },
51
+ "description": "Custom regex patterns for immediate extraction"
52
+ },
53
+ "maxMemoryTokens": {
54
+ "type": "number",
55
+ "default": 2000,
56
+ "description": "Max tokens injected per turn"
57
+ },
58
+ "qmdEnabled": {
59
+ "type": "boolean",
60
+ "default": true,
61
+ "description": "Use QMD for search"
62
+ },
63
+ "qmdCollection": {
64
+ "type": "string",
65
+ "default": "openclaw-engram",
66
+ "description": "QMD collection name"
67
+ },
68
+ "qmdMaxResults": {
69
+ "type": "number",
70
+ "default": 8,
71
+ "description": "Max QMD results per search"
72
+ },
73
+ "embeddingFallbackEnabled": {
74
+ "type": "boolean",
75
+ "default": true,
76
+ "description": "Enable embedding-based semantic recall fallback when QMD is unavailable or returns no matches"
77
+ },
78
+ "embeddingFallbackProvider": {
79
+ "type": "string",
80
+ "enum": ["auto", "openai", "local"],
81
+ "default": "auto",
82
+ "description": "Embedding provider selection for semantic fallback"
83
+ },
84
+ "qmdPath": {
85
+ "type": "string",
86
+ "description": "Optional absolute path to qmd binary (bypasses PATH/fallback discovery)"
87
+ },
88
+ "memoryDir": {
89
+ "type": "string",
90
+ "description": "Override memory storage directory"
91
+ },
92
+ "debug": {
93
+ "type": "boolean",
94
+ "default": false,
95
+ "description": "Enable debug logging"
96
+ },
97
+ "identityEnabled": {
98
+ "type": "boolean",
99
+ "default": true,
100
+ "description": "Enable agent identity reflections (appends to workspace IDENTITY.md)"
101
+ },
102
+ "injectQuestions": {
103
+ "type": "boolean",
104
+ "default": false,
105
+ "description": "Inject the most relevant open question into the system prompt"
106
+ },
107
+ "commitmentDecayDays": {
108
+ "type": "number",
109
+ "default": 90,
110
+ "description": "Days before fulfilled/expired commitments are removed"
111
+ },
112
+ "workspaceDir": {
113
+ "type": "string",
114
+ "description": "Override workspace directory path"
115
+ },
116
+ "fileHygiene": {
117
+ "type": "object",
118
+ "additionalProperties": false,
119
+ "description": "Optional: keep OpenClaw bootstrap workspace files small and warn before silent truncation risk.",
120
+ "properties": {
121
+ "enabled": {
122
+ "type": "boolean",
123
+ "default": false,
124
+ "description": "Master switch for file hygiene (default off)."
125
+ },
126
+ "lintEnabled": {
127
+ "type": "boolean",
128
+ "default": true,
129
+ "description": "If true, warn when bootstrap files approach budget."
130
+ },
131
+ "lintBudgetBytes": {
132
+ "type": "number",
133
+ "default": 20000,
134
+ "description": "Budget in bytes used for lint warnings (approx)."
135
+ },
136
+ "lintWarnRatio": {
137
+ "type": "number",
138
+ "default": 0.8,
139
+ "description": "Warn when file size >= budget * warnRatio."
140
+ },
141
+ "lintPaths": {
142
+ "type": "array",
143
+ "items": { "type": "string" },
144
+ "default": ["IDENTITY.md", "MEMORY.md"],
145
+ "description": "Workspace-relative paths to lint (or absolute paths)."
146
+ },
147
+ "rotateEnabled": {
148
+ "type": "boolean",
149
+ "default": false,
150
+ "description": "If true, rotate oversized markdown files into an archive and replace with a lean index."
151
+ },
152
+ "rotateMaxBytes": {
153
+ "type": "number",
154
+ "default": 18000,
155
+ "description": "Rotate when a target file exceeds this size (bytes)."
156
+ },
157
+ "rotateKeepTailChars": {
158
+ "type": "number",
159
+ "default": 2000,
160
+ "description": "How many characters of the old file to keep inline (tail) for continuity."
161
+ },
162
+ "rotatePaths": {
163
+ "type": "array",
164
+ "items": { "type": "string" },
165
+ "default": ["IDENTITY.md"],
166
+ "description": "Workspace-relative paths to rotate (or absolute paths)."
167
+ },
168
+ "archiveDir": {
169
+ "type": "string",
170
+ "default": ".engram-archive",
171
+ "description": "Workspace-relative archive directory where rotated files are stored."
172
+ },
173
+ "runMinIntervalMs": {
174
+ "type": "number",
175
+ "default": 300000,
176
+ "description": "Minimum interval between hygiene runs (ms)."
177
+ },
178
+ "warningsLogEnabled": {
179
+ "type": "boolean",
180
+ "default": false,
181
+ "description": "If true, append warnings to a log file under memoryDir."
182
+ },
183
+ "warningsLogPath": {
184
+ "type": "string",
185
+ "default": "hygiene/warnings.md",
186
+ "description": "memoryDir-relative path to write warnings to."
187
+ },
188
+ "indexEnabled": {
189
+ "type": "boolean",
190
+ "default": false,
191
+ "description": "Reserved: write an Engram index file in workspace (not required for rotation)."
192
+ },
193
+ "indexPath": {
194
+ "type": "string",
195
+ "default": "ENGRAM_INDEX.md",
196
+ "description": "Workspace-relative index path (if indexEnabled)."
197
+ }
198
+ },
199
+ "required": ["enabled"]
200
+ },
201
+ "accessTrackingEnabled": {
202
+ "type": "boolean",
203
+ "default": true,
204
+ "description": "Track memory access counts and recency"
205
+ },
206
+ "accessTrackingBufferMaxSize": {
207
+ "type": "number",
208
+ "default": 100,
209
+ "description": "Max entries in access tracking buffer before flush"
210
+ },
211
+ "recencyWeight": {
212
+ "type": "number",
213
+ "default": 0.2,
214
+ "description": "Weight for recency boosting in search (0-1)"
215
+ },
216
+ "boostAccessCount": {
217
+ "type": "boolean",
218
+ "default": true,
219
+ "description": "Boost frequently accessed memories in search results"
220
+ },
221
+ "queryExpansionEnabled": {
222
+ "type": "boolean",
223
+ "default": false,
224
+ "description": "Enable heuristic query expansion for retrieval (no LLM calls)."
225
+ },
226
+ "queryExpansionMaxQueries": {
227
+ "type": "number",
228
+ "default": 4,
229
+ "description": "Max expanded queries to run (including the original prompt)."
230
+ },
231
+ "queryExpansionMinTokenLen": {
232
+ "type": "number",
233
+ "default": 3,
234
+ "description": "Minimum token length to include in heuristic query expansion."
235
+ },
236
+ "rerankEnabled": {
237
+ "type": "boolean",
238
+ "default": false,
239
+ "description": "Enable LLM re-ranking of retrieved memories. Default off."
240
+ },
241
+ "rerankProvider": {
242
+ "type": "string",
243
+ "default": "local",
244
+ "description": "Re-ranking provider: 'local' uses local LLM only. 'cloud' is reserved/experimental (currently treated as no-op).",
245
+ "enum": ["local", "cloud"]
246
+ },
247
+ "rerankMaxCandidates": {
248
+ "type": "number",
249
+ "default": 20,
250
+ "description": "Max candidates to send to the re-ranker."
251
+ },
252
+ "rerankTimeoutMs": {
253
+ "type": "number",
254
+ "default": 8000,
255
+ "description": "Timeout for re-ranking requests (ms). Fail-open on timeout."
256
+ },
257
+ "rerankCacheEnabled": {
258
+ "type": "boolean",
259
+ "default": true,
260
+ "description": "Cache re-ranking results in-memory for repeated queries."
261
+ },
262
+ "rerankCacheTtlMs": {
263
+ "type": "number",
264
+ "default": 3600000,
265
+ "description": "TTL for in-memory re-ranking cache (ms)."
266
+ },
267
+ "feedbackEnabled": {
268
+ "type": "boolean",
269
+ "default": false,
270
+ "description": "Enable feedback capture tool for memory relevance (thumbs up/down)."
271
+ },
272
+ "negativeExamplesEnabled": {
273
+ "type": "boolean",
274
+ "default": false,
275
+ "description": "Enable negative examples (track retrieved-but-not-useful memories) and apply a small ranking penalty."
276
+ },
277
+ "negativeExamplesPenaltyPerHit": {
278
+ "type": "number",
279
+ "default": 0.05,
280
+ "description": "Ranking penalty per negative example hit (keep small; QMD scores are ~0-1)."
281
+ },
282
+ "negativeExamplesPenaltyCap": {
283
+ "type": "number",
284
+ "default": 0.25,
285
+ "description": "Maximum ranking penalty applied from negative examples."
286
+ },
287
+ "chunkingEnabled": {
288
+ "type": "boolean",
289
+ "default": false,
290
+ "description": "Enable automatic chunking of long memories"
291
+ },
292
+ "chunkingTargetTokens": {
293
+ "type": "number",
294
+ "default": 200,
295
+ "description": "Target tokens per chunk"
296
+ },
297
+ "chunkingMinTokens": {
298
+ "type": "number",
299
+ "default": 150,
300
+ "description": "Minimum tokens to trigger chunking"
301
+ },
302
+ "chunkingOverlapSentences": {
303
+ "type": "number",
304
+ "default": 2,
305
+ "description": "Number of sentences to overlap between chunks"
306
+ },
307
+ "contradictionDetectionEnabled": {
308
+ "type": "boolean",
309
+ "default": false,
310
+ "description": "Enable automatic contradiction detection with LLM verification"
311
+ },
312
+ "contradictionSimilarityThreshold": {
313
+ "type": "number",
314
+ "default": 0.7,
315
+ "description": "QMD similarity threshold to trigger contradiction check"
316
+ },
317
+ "contradictionMinConfidence": {
318
+ "type": "number",
319
+ "default": 0.9,
320
+ "description": "Minimum LLM confidence to auto-resolve contradictions"
321
+ },
322
+ "contradictionAutoResolve": {
323
+ "type": "boolean",
324
+ "default": true,
325
+ "description": "Automatically supersede contradicted memories"
326
+ },
327
+ "memoryLinkingEnabled": {
328
+ "type": "boolean",
329
+ "default": false,
330
+ "description": "Enable automatic memory linking to build knowledge graph"
331
+ },
332
+ "threadingEnabled": {
333
+ "type": "boolean",
334
+ "default": false,
335
+ "description": "Enable conversation threading"
336
+ },
337
+ "threadingGapMinutes": {
338
+ "type": "number",
339
+ "default": 30,
340
+ "description": "Minutes of gap to start a new thread"
341
+ },
342
+ "summarizationEnabled": {
343
+ "type": "boolean",
344
+ "default": false,
345
+ "description": "Enable automatic memory summarization/compression"
346
+ },
347
+ "summarizationTriggerCount": {
348
+ "type": "number",
349
+ "default": 1000,
350
+ "description": "Memory count threshold to trigger summarization"
351
+ },
352
+ "summarizationRecentToKeep": {
353
+ "type": "number",
354
+ "default": 300,
355
+ "description": "Number of recent memories to keep uncompressed"
356
+ },
357
+ "summarizationImportanceThreshold": {
358
+ "type": "number",
359
+ "default": 0.3,
360
+ "description": "Only compress memories with importance below this threshold"
361
+ },
362
+ "summarizationProtectedTags": {
363
+ "type": "array",
364
+ "items": { "type": "string" },
365
+ "default": ["commitment", "preference", "decision", "principle"],
366
+ "description": "Tags that protect memories from compression"
367
+ },
368
+ "topicExtractionEnabled": {
369
+ "type": "boolean",
370
+ "default": true,
371
+ "description": "Enable topic extraction during consolidation"
372
+ },
373
+ "topicExtractionTopN": {
374
+ "type": "number",
375
+ "default": 50,
376
+ "description": "Number of top topics to extract"
377
+ },
378
+ "transcriptEnabled": {
379
+ "type": "boolean",
380
+ "default": true,
381
+ "description": "Enable transcript archiving"
382
+ },
383
+ "transcriptRetentionDays": {
384
+ "type": "number",
385
+ "default": 7,
386
+ "description": "Days to retain transcript entries"
387
+ },
388
+ "transcriptSkipChannelTypes": {
389
+ "type": "array",
390
+ "items": { "type": "string" },
391
+ "default": ["cron"],
392
+ "description": "Channel types to skip from transcript logging (e.g., cron)"
393
+ },
394
+ "transcriptRecallHours": {
395
+ "type": "number",
396
+ "default": 12,
397
+ "description": "Hours of transcript history to recall"
398
+ },
399
+ "maxTranscriptTurns": {
400
+ "type": "number",
401
+ "default": 50,
402
+ "description": "Maximum transcript turns to inject"
403
+ },
404
+ "maxTranscriptTokens": {
405
+ "type": "number",
406
+ "default": 1000,
407
+ "description": "Maximum tokens for transcript injection"
408
+ },
409
+ "checkpointEnabled": {
410
+ "type": "boolean",
411
+ "default": true,
412
+ "description": "Enable conversation checkpoints"
413
+ },
414
+ "checkpointTurns": {
415
+ "type": "number",
416
+ "default": 15,
417
+ "description": "Number of turns per checkpoint"
418
+ },
419
+ "hourlySummariesEnabled": {
420
+ "type": "boolean",
421
+ "default": true,
422
+ "description": "Enable hourly conversation summaries"
423
+ },
424
+ "summaryRecallHours": {
425
+ "type": "number",
426
+ "default": 24,
427
+ "description": "Hours of summary history to recall"
428
+ },
429
+ "maxSummaryCount": {
430
+ "type": "number",
431
+ "default": 6,
432
+ "description": "Maximum number of summaries to inject"
433
+ },
434
+ "summaryModel": {
435
+ "type": "string",
436
+ "description": "Model for hourly summaries (defaults to main model)"
437
+ },
438
+ "localLlmEnabled": {
439
+ "type": "boolean",
440
+ "default": false,
441
+ "description": "Enable local LLM for extraction and summarization (e.g., LM Studio, Ollama)"
442
+ },
443
+ "localLlmUrl": {
444
+ "type": "string",
445
+ "default": "http://localhost:1234/v1",
446
+ "description": "URL for local LLM OpenAI-compatible endpoint"
447
+ },
448
+ "localLlmModel": {
449
+ "type": "string",
450
+ "default": "local-model",
451
+ "description": "Model name for local LLM requests"
452
+ },
453
+ "localLlmApiKey": {
454
+ "type": "string",
455
+ "description": "Optional API key for authenticated OpenAI-compatible local endpoints"
456
+ },
457
+ "localLlmHeaders": {
458
+ "type": "object",
459
+ "description": "Optional additional headers for local/compatible endpoint requests",
460
+ "additionalProperties": {
461
+ "type": "string"
462
+ }
463
+ },
464
+ "localLlmAuthHeader": {
465
+ "type": "boolean",
466
+ "default": true,
467
+ "description": "If false, do not send Authorization header even when localLlmApiKey is set"
468
+ },
469
+ "localLlmFallback": {
470
+ "type": "boolean",
471
+ "default": true,
472
+ "description": "Fall back to cloud OpenAI if local LLM is unavailable"
473
+ },
474
+ "localLlmHomeDir": {
475
+ "type": "string",
476
+ "description": "Optional home directory override for local LLM helpers (LM Studio settings + CLI PATH resolution)."
477
+ },
478
+ "localLmsCliPath": {
479
+ "type": "string",
480
+ "description": "Optional absolute path to LMS CLI binary. Preferred over auto-detected locations."
481
+ },
482
+ "localLmsBinDir": {
483
+ "type": "string",
484
+ "description": "Optional bin directory prepended to PATH for LMS CLI execution."
485
+ },
486
+ "localLlmTimeoutMs": {
487
+ "type": "number",
488
+ "default": 180000,
489
+ "description": "Hard timeout for local LLM requests (ms)"
490
+ },
491
+ "slowLogEnabled": {
492
+ "type": "boolean",
493
+ "default": false,
494
+ "description": "If enabled, log slow operations (durations + metadata; never logs content)"
495
+ },
496
+ "slowLogThresholdMs": {
497
+ "type": "number",
498
+ "default": 30000,
499
+ "description": "Threshold for slow operation logging (ms)"
500
+ },
501
+ "extractionDedupeEnabled": {
502
+ "type": "boolean",
503
+ "default": true,
504
+ "description": "Enable deduplication of near-identical extraction batches within a time window."
505
+ },
506
+ "extractionDedupeWindowMs": {
507
+ "type": "number",
508
+ "default": 300000,
509
+ "description": "Window for extraction dedupe fingerprints (ms)."
510
+ },
511
+ "extractionMinChars": {
512
+ "type": "number",
513
+ "default": 40,
514
+ "description": "Minimum combined user/assistant characters required before extraction runs."
515
+ },
516
+ "extractionMinUserTurns": {
517
+ "type": "number",
518
+ "default": 1,
519
+ "description": "Minimum number of user turns required before extraction runs."
520
+ },
521
+ "extractionMaxTurnChars": {
522
+ "type": "number",
523
+ "default": 4000,
524
+ "description": "Maximum characters per turn fed to extraction (long turns are truncated)."
525
+ },
526
+ "extractionMaxFactsPerRun": {
527
+ "type": "number",
528
+ "default": 12,
529
+ "description": "Maximum facts persisted from a single extraction run."
530
+ },
531
+ "extractionMaxEntitiesPerRun": {
532
+ "type": "number",
533
+ "default": 6,
534
+ "description": "Maximum entities persisted from a single extraction run."
535
+ },
536
+ "extractionMaxQuestionsPerRun": {
537
+ "type": "number",
538
+ "default": 3,
539
+ "description": "Maximum questions persisted from a single extraction run."
540
+ },
541
+ "extractionMaxProfileUpdatesPerRun": {
542
+ "type": "number",
543
+ "default": 4,
544
+ "description": "Maximum profile updates persisted from a single extraction run."
545
+ },
546
+ "consolidationRequireNonZeroExtraction": {
547
+ "type": "boolean",
548
+ "default": true,
549
+ "description": "Only schedule consolidation when the last extraction produced durable outputs."
550
+ },
551
+ "consolidationMinIntervalMs": {
552
+ "type": "number",
553
+ "default": 600000,
554
+ "description": "Minimum interval between consolidation runs (ms)."
555
+ },
556
+ "qmdMaintenanceEnabled": {
557
+ "type": "boolean",
558
+ "default": true,
559
+ "description": "Enable debounced background QMD maintenance instead of immediate updates on extraction."
560
+ },
561
+ "qmdMaintenanceDebounceMs": {
562
+ "type": "number",
563
+ "default": 30000,
564
+ "description": "Debounce window for background QMD maintenance updates (ms)."
565
+ },
566
+ "qmdAutoEmbedEnabled": {
567
+ "type": "boolean",
568
+ "default": false,
569
+ "description": "If true, background QMD maintenance also runs embed on a throttled cadence."
570
+ },
571
+ "qmdEmbedMinIntervalMs": {
572
+ "type": "number",
573
+ "default": 3600000,
574
+ "description": "Minimum interval between background QMD embed runs (ms)."
575
+ },
576
+ "qmdUpdateTimeoutMs": {
577
+ "type": "number",
578
+ "default": 90000,
579
+ "description": "Timeout for QMD update command (ms). Increase if your index grows and updates exceed 30s."
580
+ },
581
+ "localLlmRetry5xxCount": {
582
+ "type": "number",
583
+ "default": 1,
584
+ "description": "Number of retry attempts for local LLM 5xx responses."
585
+ },
586
+ "localLlmRetryBackoffMs": {
587
+ "type": "number",
588
+ "default": 400,
589
+ "description": "Base backoff delay between local LLM retries (ms)."
590
+ },
591
+ "localLlm400TripThreshold": {
592
+ "type": "number",
593
+ "default": 5,
594
+ "description": "Consecutive 400 responses before local LLM enters temporary cooldown."
595
+ },
596
+ "localLlm400CooldownMs": {
597
+ "type": "number",
598
+ "default": 120000,
599
+ "description": "Cooldown duration after tripping local LLM 400 threshold (ms)."
600
+ },
601
+ "localLlmMaxContext": {
602
+ "type": "number",
603
+ "description": "Override the detected context window for local LLM. Set to 32768 if your LLM server defaults to 32K context despite the model supporting 128K."
604
+ },
605
+ "hourlySummaryCronAutoRegister": {
606
+ "type": "boolean",
607
+ "default": false,
608
+ "description": "If true, Engram may attempt to auto-register an hourly summary cron job (default off)."
609
+ },
610
+ "hourlySummariesExtendedEnabled": {
611
+ "type": "boolean",
612
+ "default": false,
613
+ "description": "Enable structured hourly summaries (topics/decisions/action items/rejections). Default off."
614
+ },
615
+ "hourlySummariesIncludeToolStats": {
616
+ "type": "boolean",
617
+ "default": false,
618
+ "description": "Include tool usage counts in extended hourly summaries (requires tool usage capture)."
619
+ },
620
+ "hourlySummariesIncludeSystemMessages": {
621
+ "type": "boolean",
622
+ "default": false,
623
+ "description": "Include system messages in extended hourly summaries (use with care)."
624
+ },
625
+ "hourlySummariesMaxTurnsPerRun": {
626
+ "type": "number",
627
+ "default": 200,
628
+ "description": "Maximum transcript turns to consider per session per hourly summarizer run."
629
+ },
630
+ "conversationIndexEnabled": {
631
+ "type": "boolean",
632
+ "default": false,
633
+ "description": "Enable conversation chunk indexing + semantic recall hook (default off)."
634
+ },
635
+ "conversationIndexBackend": {
636
+ "type": "string",
637
+ "enum": ["qmd", "faiss"],
638
+ "default": "qmd",
639
+ "description": "Backend for conversation indexing. qmd indexes chunk docs; faiss reserved/experimental."
640
+ },
641
+ "conversationIndexQmdCollection": {
642
+ "type": "string",
643
+ "default": "openclaw-engram-conversations",
644
+ "description": "QMD collection to use for conversation chunk search (must be configured in ~/.config/qmd/index.yml)."
645
+ },
646
+ "conversationIndexRetentionDays": {
647
+ "type": "number",
648
+ "default": 30,
649
+ "description": "Days to retain conversation chunk docs."
650
+ },
651
+ "conversationIndexMinUpdateIntervalMs": {
652
+ "type": "number",
653
+ "default": 900000,
654
+ "description": "Minimum interval between conversation_index_update runs per session (ms). Prevents redundant reindex churn."
655
+ },
656
+ "conversationIndexEmbedOnUpdate": {
657
+ "type": "boolean",
658
+ "default": false,
659
+ "description": "If true, conversation_index_update also runs QMD embed by default. Keep false for lower load."
660
+ },
661
+ "conversationRecallTopK": {
662
+ "type": "number",
663
+ "default": 3,
664
+ "description": "Top-K conversation chunks to inject."
665
+ },
666
+ "conversationRecallMaxChars": {
667
+ "type": "number",
668
+ "default": 2500,
669
+ "description": "Max characters of semantic conversation recall to inject."
670
+ },
671
+ "conversationRecallTimeoutMs": {
672
+ "type": "number",
673
+ "default": 800,
674
+ "description": "Timeout for semantic conversation recall search (ms). Fail-open on timeout."
675
+ },
676
+ "namespacesEnabled": {
677
+ "type": "boolean",
678
+ "default": false,
679
+ "description": "Enable multi-agent namespaces (v3.0). Default off."
680
+ },
681
+ "defaultNamespace": {
682
+ "type": "string",
683
+ "default": "default",
684
+ "description": "Default namespace name."
685
+ },
686
+ "sharedNamespace": {
687
+ "type": "string",
688
+ "default": "shared",
689
+ "description": "Shared namespace name."
690
+ },
691
+ "principalFromSessionKeyMode": {
692
+ "type": "string",
693
+ "enum": ["map", "prefix", "regex"],
694
+ "default": "map",
695
+ "description": "How to derive principal identity from sessionKey."
696
+ },
697
+ "principalFromSessionKeyRules": {
698
+ "type": "array",
699
+ "description": "Rules for resolving principal from sessionKey (ordered).",
700
+ "items": {
701
+ "type": "object",
702
+ "additionalProperties": false,
703
+ "properties": {
704
+ "match": { "type": "string" },
705
+ "principal": { "type": "string" }
706
+ },
707
+ "required": ["match", "principal"]
708
+ }
709
+ },
710
+ "namespacePolicies": {
711
+ "type": "array",
712
+ "description": "Namespace access policies.",
713
+ "items": {
714
+ "type": "object",
715
+ "additionalProperties": false,
716
+ "properties": {
717
+ "name": { "type": "string" },
718
+ "readPrincipals": { "type": "array", "items": { "type": "string" } },
719
+ "writePrincipals": { "type": "array", "items": { "type": "string" } },
720
+ "includeInRecallByDefault": { "type": "boolean" }
721
+ },
722
+ "required": ["name", "readPrincipals", "writePrincipals"]
723
+ }
724
+ },
725
+ "defaultRecallNamespaces": {
726
+ "type": "array",
727
+ "description": "Which namespaces to include by default in recall.",
728
+ "items": { "type": "string", "enum": ["self", "shared"] },
729
+ "default": ["self", "shared"]
730
+ },
731
+ "autoPromoteToSharedEnabled": {
732
+ "type": "boolean",
733
+ "default": false,
734
+ "description": "If enabled, Engram may auto-promote selected categories to shared (reserved; conservative)."
735
+ },
736
+ "autoPromoteToSharedCategories": {
737
+ "type": "array",
738
+ "items": { "type": "string", "enum": ["correction", "decision", "preference"] },
739
+ "default": ["correction", "decision", "preference"],
740
+ "description": "Categories eligible for auto-promotion to shared."
741
+ },
742
+ "autoPromoteMinConfidenceTier": {
743
+ "type": "string",
744
+ "enum": ["explicit", "implied"],
745
+ "default": "explicit",
746
+ "description": "Minimum confidence tier for auto-promotion."
747
+ },
748
+ "sharedContextEnabled": {
749
+ "type": "boolean",
750
+ "default": false,
751
+ "description": "Enable shared-context injection + tools (v4.0). Default off."
752
+ },
753
+ "sharedContextDir": {
754
+ "type": "string",
755
+ "description": "Override shared-context directory (default: ~/.openclaw/workspace/shared-context)."
756
+ },
757
+ "sharedContextMaxInjectChars": {
758
+ "type": "number",
759
+ "default": 4000,
760
+ "description": "Max characters of shared-context to inject into each prompt."
761
+ },
762
+ "crossSignalsSemanticEnabled": {
763
+ "type": "boolean",
764
+ "default": false,
765
+ "description": "Enable semantic cross-signal grouping (reserved/experimental)."
766
+ },
767
+ "crossSignalsSemanticTimeoutMs": {
768
+ "type": "number",
769
+ "default": 4000,
770
+ "description": "Timeout for semantic cross-signal grouping (ms)."
771
+ },
772
+ "compoundingEnabled": {
773
+ "type": "boolean",
774
+ "default": false,
775
+ "description": "Enable compounding engine (v5.0). Default off."
776
+ },
777
+ "compoundingWeeklyCronEnabled": {
778
+ "type": "boolean",
779
+ "default": false,
780
+ "description": "If true, compounding weekly synthesis can be scheduled externally via cron."
781
+ },
782
+ "compoundingSemanticEnabled": {
783
+ "type": "boolean",
784
+ "default": false,
785
+ "description": "Enable semantic compounding synthesis (reserved/experimental)."
786
+ },
787
+ "compoundingSynthesisTimeoutMs": {
788
+ "type": "number",
789
+ "default": 15000,
790
+ "description": "Timeout for compounding synthesis (ms)."
791
+ },
792
+ "compoundingInjectEnabled": {
793
+ "type": "boolean",
794
+ "default": true,
795
+ "description": "Inject compounded mistakes/patterns into recall when compounding is enabled."
796
+ },
797
+ "factDeduplicationEnabled": {
798
+ "type": "boolean",
799
+ "default": true,
800
+ "description": "Enable content-hash deduplication to prevent storing semantically identical facts."
801
+ },
802
+ "factArchivalEnabled": {
803
+ "type": "boolean",
804
+ "default": false,
805
+ "description": "Enable automatic archival of old, low-importance, rarely-accessed facts during consolidation."
806
+ },
807
+ "factArchivalAgeDays": {
808
+ "type": "number",
809
+ "default": 90,
810
+ "description": "Minimum age in days before a fact is eligible for archival."
811
+ },
812
+ "factArchivalMaxImportance": {
813
+ "type": "number",
814
+ "default": 0.3,
815
+ "description": "Maximum importance score for archival eligibility (0-1). Only facts below this threshold are archived."
816
+ },
817
+ "factArchivalMaxAccessCount": {
818
+ "type": "number",
819
+ "default": 2,
820
+ "description": "Maximum access count for archival eligibility. Only rarely-accessed facts are archived."
821
+ },
822
+ "factArchivalProtectedCategories": {
823
+ "type": "array",
824
+ "items": { "type": "string" },
825
+ "default": ["commitment", "preference", "decision", "principle"],
826
+ "description": "Categories that protect a fact from archival regardless of other criteria."
827
+ },
828
+ "qmdDaemonEnabled": {
829
+ "type": "boolean",
830
+ "default": true,
831
+ "description": "Auto-detect and use QMD HTTP daemon for faster searches"
832
+ },
833
+ "qmdDaemonUrl": {
834
+ "type": "string",
835
+ "default": "http://localhost:8181/mcp",
836
+ "description": "QMD HTTP daemon MCP endpoint URL"
837
+ },
838
+ "qmdDaemonRecheckIntervalMs": {
839
+ "type": "number",
840
+ "default": 60000,
841
+ "description": "Re-probe interval when daemon is down (ms)"
842
+ },
843
+ "knowledgeIndexEnabled": {
844
+ "type": "boolean",
845
+ "default": true,
846
+ "description": "Inject a compact Knowledge Index of top entities into every recall"
847
+ },
848
+ "knowledgeIndexMaxEntities": {
849
+ "type": "number",
850
+ "default": 40,
851
+ "description": "Max entities included in the Knowledge Index"
852
+ },
853
+ "knowledgeIndexMaxChars": {
854
+ "type": "number",
855
+ "default": 4000,
856
+ "description": "Hard character cap for the Knowledge Index section"
857
+ },
858
+ "entityRelationshipsEnabled": {
859
+ "type": "boolean",
860
+ "default": true,
861
+ "description": "Track entity-to-entity relationships during extraction"
862
+ },
863
+ "entityActivityLogEnabled": {
864
+ "type": "boolean",
865
+ "default": true,
866
+ "description": "Log timestamped activity per entity"
867
+ },
868
+ "entityActivityLogMaxEntries": {
869
+ "type": "number",
870
+ "default": 20,
871
+ "description": "Max activity entries per entity before oldest are pruned"
872
+ },
873
+ "entityAliasesEnabled": {
874
+ "type": "boolean",
875
+ "default": true,
876
+ "description": "Store aliases per entity file"
877
+ },
878
+ "entitySummaryEnabled": {
879
+ "type": "boolean",
880
+ "default": true,
881
+ "description": "Generate LLM summaries for entities during consolidation"
882
+ }
883
+ }
884
+ },
885
+ "uiHints": {
886
+ "openaiApiKey": {
887
+ "label": "OpenAI API Key",
888
+ "sensitive": true,
889
+ "placeholder": "sk-...",
890
+ "help": "API key for OpenAI (or use ${OPENAI_API_KEY})"
891
+ },
892
+ "openaiBaseUrl": {
893
+ "label": "OpenAI Base URL",
894
+ "advanced": true,
895
+ "placeholder": "https://api.openai.com/v1",
896
+ "help": "Override for OpenAI-compatible providers (Scryr, Together, OpenRouter, etc.)"
897
+ },
898
+ "model": {
899
+ "label": "Extraction Model",
900
+ "advanced": true,
901
+ "placeholder": "gpt-5.2"
902
+ },
903
+ "reasoningEffort": {
904
+ "label": "Reasoning Effort",
905
+ "advanced": true
906
+ },
907
+ "triggerMode": {
908
+ "label": "Trigger Mode",
909
+ "advanced": true
910
+ },
911
+ "bufferMaxTurns": {
912
+ "label": "Buffer Max Turns",
913
+ "advanced": true,
914
+ "placeholder": "5"
915
+ },
916
+ "bufferMaxMinutes": {
917
+ "label": "Buffer Max Minutes",
918
+ "advanced": true,
919
+ "placeholder": "15"
920
+ },
921
+ "consolidateEveryN": {
922
+ "label": "Consolidation Frequency",
923
+ "advanced": true,
924
+ "placeholder": "3"
925
+ },
926
+ "maxMemoryTokens": {
927
+ "label": "Max Memory Tokens",
928
+ "advanced": true,
929
+ "placeholder": "2000"
930
+ },
931
+ "qmdEnabled": {
932
+ "label": "Enable QMD",
933
+ "help": "Enable QMD for memory search/indexing"
934
+ },
935
+ "qmdCollection": {
936
+ "label": "QMD Collection",
937
+ "advanced": true,
938
+ "placeholder": "openclaw-engram"
939
+ },
940
+ "qmdMaxResults": {
941
+ "label": "QMD Max Results",
942
+ "advanced": true,
943
+ "placeholder": "8"
944
+ },
945
+ "embeddingFallbackEnabled": {
946
+ "label": "Embedding Fallback",
947
+ "help": "Use semantic embeddings when QMD is unavailable or no results are found"
948
+ },
949
+ "embeddingFallbackProvider": {
950
+ "label": "Embedding Provider",
951
+ "advanced": true,
952
+ "placeholder": "auto"
953
+ },
954
+ "qmdPath": {
955
+ "label": "QMD Path",
956
+ "advanced": true,
957
+ "placeholder": "/opt/homebrew/bin/qmd",
958
+ "help": "Optional absolute path to qmd binary for environments with unstable PATH/bun shims"
959
+ },
960
+ "memoryDir": {
961
+ "label": "Memory Directory",
962
+ "advanced": true,
963
+ "placeholder": "~/.openclaw/workspace/memory/local"
964
+ },
965
+ "debug": {
966
+ "label": "Debug Mode",
967
+ "advanced": true
968
+ },
969
+ "identityEnabled": {
970
+ "label": "Identity Reflections",
971
+ "help": "Append self-reflections to workspace IDENTITY.md after each extraction"
972
+ },
973
+ "injectQuestions": {
974
+ "label": "Inject Questions",
975
+ "help": "Include the most relevant open question in the system prompt"
976
+ },
977
+ "commitmentDecayDays": {
978
+ "label": "Commitment Decay (days)",
979
+ "advanced": true,
980
+ "placeholder": "90"
981
+ },
982
+ "workspaceDir": {
983
+ "label": "Workspace Directory",
984
+ "advanced": true,
985
+ "placeholder": "~/.openclaw/workspace"
986
+ },
987
+ "accessTrackingEnabled": {
988
+ "label": "Access Tracking",
989
+ "help": "Track which memories are accessed most frequently"
990
+ },
991
+ "accessTrackingBufferMaxSize": {
992
+ "label": "Access Buffer Size",
993
+ "advanced": true,
994
+ "placeholder": "100"
995
+ },
996
+ "recencyWeight": {
997
+ "label": "Recency Weight",
998
+ "advanced": true,
999
+ "help": "How much to boost recent memories in search (0-1)",
1000
+ "placeholder": "0.2"
1001
+ },
1002
+ "boostAccessCount": {
1003
+ "label": "Boost Frequent Access",
1004
+ "help": "Rank frequently accessed memories higher in search"
1005
+ },
1006
+ "negativeExamplesEnabled": {
1007
+ "label": "Negative Examples",
1008
+ "help": "Track retrieved-but-not-useful memories and apply a small ranking penalty (optional)"
1009
+ },
1010
+ "negativeExamplesPenaltyPerHit": {
1011
+ "label": "Negative Penalty / Hit",
1012
+ "advanced": true,
1013
+ "placeholder": "0.05"
1014
+ },
1015
+ "negativeExamplesPenaltyCap": {
1016
+ "label": "Negative Penalty Cap",
1017
+ "advanced": true,
1018
+ "placeholder": "0.25"
1019
+ },
1020
+ "chunkingEnabled": {
1021
+ "label": "Enable Chunking",
1022
+ "help": "Automatically split long memories into overlapping chunks for better retrieval"
1023
+ },
1024
+ "chunkingTargetTokens": {
1025
+ "label": "Chunk Target Tokens",
1026
+ "advanced": true,
1027
+ "placeholder": "200"
1028
+ },
1029
+ "chunkingMinTokens": {
1030
+ "label": "Chunk Min Tokens",
1031
+ "advanced": true,
1032
+ "placeholder": "150"
1033
+ },
1034
+ "chunkingOverlapSentences": {
1035
+ "label": "Chunk Overlap Sentences",
1036
+ "advanced": true,
1037
+ "placeholder": "2"
1038
+ },
1039
+ "contradictionDetectionEnabled": {
1040
+ "label": "Contradiction Detection",
1041
+ "help": "Detect and resolve conflicting memories using LLM verification"
1042
+ },
1043
+ "contradictionSimilarityThreshold": {
1044
+ "label": "Contradiction Similarity Threshold",
1045
+ "advanced": true,
1046
+ "placeholder": "0.7"
1047
+ },
1048
+ "contradictionMinConfidence": {
1049
+ "label": "Contradiction Min Confidence",
1050
+ "advanced": true,
1051
+ "placeholder": "0.9"
1052
+ },
1053
+ "contradictionAutoResolve": {
1054
+ "label": "Auto-Resolve Contradictions",
1055
+ "help": "Automatically supersede old memories when contradiction is confirmed"
1056
+ },
1057
+ "memoryLinkingEnabled": {
1058
+ "label": "Memory Linking",
1059
+ "help": "Build knowledge graph by linking related memories"
1060
+ },
1061
+ "threadingEnabled": {
1062
+ "label": "Conversation Threading",
1063
+ "help": "Group memories into conversation threads with auto-titles"
1064
+ },
1065
+ "threadingGapMinutes": {
1066
+ "label": "Thread Gap (minutes)",
1067
+ "advanced": true,
1068
+ "placeholder": "30"
1069
+ },
1070
+ "summarizationEnabled": {
1071
+ "label": "Memory Summarization",
1072
+ "help": "Compress old, low-importance memories into summaries"
1073
+ },
1074
+ "summarizationTriggerCount": {
1075
+ "label": "Summarization Trigger",
1076
+ "advanced": true,
1077
+ "placeholder": "1000"
1078
+ },
1079
+ "summarizationRecentToKeep": {
1080
+ "label": "Recent to Keep",
1081
+ "advanced": true,
1082
+ "placeholder": "300"
1083
+ },
1084
+ "summarizationImportanceThreshold": {
1085
+ "label": "Importance Threshold",
1086
+ "advanced": true,
1087
+ "placeholder": "0.3"
1088
+ },
1089
+ "topicExtractionEnabled": {
1090
+ "label": "Topic Extraction",
1091
+ "help": "Extract key topics from memory corpus"
1092
+ },
1093
+ "topicExtractionTopN": {
1094
+ "label": "Top N Topics",
1095
+ "advanced": true,
1096
+ "placeholder": "50"
1097
+ },
1098
+ "transcriptEnabled": {
1099
+ "label": "Enable Transcript Archive",
1100
+ "help": "Archive conversation transcripts for context preservation"
1101
+ },
1102
+ "transcriptRetentionDays": {
1103
+ "label": "Transcript Retention (days)",
1104
+ "advanced": true,
1105
+ "placeholder": "7"
1106
+ },
1107
+ "transcriptSkipChannelTypes": {
1108
+ "label": "Skip Channel Types",
1109
+ "advanced": true,
1110
+ "help": "Channel types to exclude from transcript logging (default: cron)"
1111
+ },
1112
+ "transcriptRecallHours": {
1113
+ "label": "Transcript Recall (hours)",
1114
+ "advanced": true,
1115
+ "placeholder": "12"
1116
+ },
1117
+ "maxTranscriptTurns": {
1118
+ "label": "Max Transcript Turns",
1119
+ "advanced": true,
1120
+ "placeholder": "50"
1121
+ },
1122
+ "maxTranscriptTokens": {
1123
+ "label": "Max Transcript Tokens",
1124
+ "advanced": true,
1125
+ "placeholder": "1000"
1126
+ },
1127
+ "checkpointEnabled": {
1128
+ "label": "Enable Checkpoints",
1129
+ "help": "Capture conversation checkpoints for resuming context"
1130
+ },
1131
+ "checkpointTurns": {
1132
+ "label": "Checkpoint Turn Interval",
1133
+ "advanced": true,
1134
+ "placeholder": "15"
1135
+ },
1136
+ "hourlySummariesEnabled": {
1137
+ "label": "Enable Hourly Summaries",
1138
+ "help": "Generate hourly summaries of conversation activity"
1139
+ },
1140
+ "summaryRecallHours": {
1141
+ "label": "Summary Recall (hours)",
1142
+ "advanced": true,
1143
+ "placeholder": "24"
1144
+ },
1145
+ "maxSummaryCount": {
1146
+ "label": "Max Summary Count",
1147
+ "advanced": true,
1148
+ "placeholder": "6"
1149
+ },
1150
+ "summaryModel": {
1151
+ "label": "Summary Model",
1152
+ "advanced": true,
1153
+ "placeholder": "(same as extraction model)"
1154
+ },
1155
+ "localLlmEnabled": {
1156
+ "label": "Enable Local LLM",
1157
+ "help": "Use local LLM (LM Studio, Ollama, etc.) for extraction and summaries. Falls back to OpenAI if unavailable."
1158
+ },
1159
+ "localLlmUrl": {
1160
+ "label": "Local LLM URL",
1161
+ "advanced": true,
1162
+ "placeholder": "http://localhost:1234/v1",
1163
+ "help": "OpenAI-compatible endpoint URL for local LLM"
1164
+ },
1165
+ "localLlmModel": {
1166
+ "label": "Local LLM Model",
1167
+ "advanced": true,
1168
+ "placeholder": "local-model",
1169
+ "help": "Model identifier for local LLM requests"
1170
+ },
1171
+ "localLlmApiKey": {
1172
+ "label": "Local LLM API Key",
1173
+ "advanced": true,
1174
+ "sensitive": true,
1175
+ "placeholder": "sk-...",
1176
+ "help": "Optional API key for authenticated OpenAI-compatible endpoints"
1177
+ },
1178
+ "localLlmHeaders": {
1179
+ "label": "Local LLM Headers",
1180
+ "advanced": true,
1181
+ "help": "Optional extra headers for provider-specific routing/auth"
1182
+ },
1183
+ "localLlmAuthHeader": {
1184
+ "label": "Send Auth Header",
1185
+ "advanced": true,
1186
+ "help": "When false, do not send Authorization header even if localLlmApiKey is set"
1187
+ },
1188
+ "localLlmFallback": {
1189
+ "label": "Local LLM Fallback",
1190
+ "advanced": true,
1191
+ "help": "Fall back to cloud OpenAI if local LLM fails or is unavailable"
1192
+ },
1193
+ "localLlmHomeDir": {
1194
+ "label": "Local LLM Home Dir",
1195
+ "advanced": true,
1196
+ "placeholder": "(auto: HOME / os.homedir)",
1197
+ "help": "Optional home directory override for LM Studio settings and local helper paths."
1198
+ },
1199
+ "localLmsCliPath": {
1200
+ "label": "LMS CLI Path",
1201
+ "advanced": true,
1202
+ "placeholder": "/path/to/lms",
1203
+ "help": "Optional absolute path to LMS CLI. Overrides auto-detection."
1204
+ },
1205
+ "localLmsBinDir": {
1206
+ "label": "LMS Bin Dir",
1207
+ "advanced": true,
1208
+ "placeholder": "/path/to/bin",
1209
+ "help": "Optional bin directory prepended to PATH for LMS CLI execution."
1210
+ },
1211
+ "localLlmMaxContext": {
1212
+ "label": "Local LLM Max Context",
1213
+ "advanced": true,
1214
+ "placeholder": "(auto-detected from model)",
1215
+ "help": "Override context window if your LLM server uses smaller default (e.g., 32768 for LM Studio default)"
1216
+ },
1217
+ "factDeduplicationEnabled": {
1218
+ "label": "Fact Deduplication",
1219
+ "help": "Prevent storing semantically identical facts using content hashing"
1220
+ },
1221
+ "factArchivalEnabled": {
1222
+ "label": "Fact Archival",
1223
+ "help": "Automatically archive old, low-importance, rarely-accessed facts during consolidation"
1224
+ },
1225
+ "factArchivalAgeDays": {
1226
+ "label": "Archival Age (days)",
1227
+ "advanced": true,
1228
+ "placeholder": "90"
1229
+ },
1230
+ "factArchivalMaxImportance": {
1231
+ "label": "Archival Max Importance",
1232
+ "advanced": true,
1233
+ "placeholder": "0.3"
1234
+ },
1235
+ "factArchivalMaxAccessCount": {
1236
+ "label": "Archival Max Access Count",
1237
+ "advanced": true,
1238
+ "placeholder": "2"
1239
+ },
1240
+ "factArchivalProtectedCategories": {
1241
+ "label": "Archival Protected Categories",
1242
+ "advanced": true,
1243
+ "help": "Categories that are never archived regardless of age or importance"
1244
+ },
1245
+ "knowledgeIndexEnabled": {
1246
+ "label": "Knowledge Index",
1247
+ "help": "Inject a compact table of top entities into every recall"
1248
+ },
1249
+ "knowledgeIndexMaxEntities": {
1250
+ "label": "Knowledge Index Max Entities",
1251
+ "advanced": true,
1252
+ "placeholder": "40"
1253
+ },
1254
+ "knowledgeIndexMaxChars": {
1255
+ "label": "Knowledge Index Max Chars",
1256
+ "advanced": true,
1257
+ "placeholder": "4000"
1258
+ },
1259
+ "entityRelationshipsEnabled": {
1260
+ "label": "Entity Relationships",
1261
+ "help": "Track entity-to-entity relationships during extraction"
1262
+ },
1263
+ "entityActivityLogEnabled": {
1264
+ "label": "Entity Activity Log",
1265
+ "help": "Log timestamped activity per entity"
1266
+ },
1267
+ "entityActivityLogMaxEntries": {
1268
+ "label": "Activity Log Max Entries",
1269
+ "advanced": true,
1270
+ "placeholder": "20"
1271
+ },
1272
+ "entityAliasesEnabled": {
1273
+ "label": "Entity Aliases",
1274
+ "help": "Store aliases per entity file"
1275
+ },
1276
+ "entitySummaryEnabled": {
1277
+ "label": "Entity Summaries",
1278
+ "help": "Generate LLM summaries for entities during consolidation"
1279
+ }
1280
+ }
1281
+ }