@joshuaswarren/openclaw-engram 9.3.3 → 9.3.5
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/LICENSE +21 -0
- package/bin/engram-access.js +10 -1
- package/dist/index.js +7 -2
- package/openclaw.plugin.json +985 -12
- package/package.json +10 -12
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Joshua Warren
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/bin/engram-access.js
CHANGED
|
@@ -1,7 +1,16 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
|
|
3
|
+
// The shim is the legacy alias — identify ourselves as "openclaw-engram" so
|
|
4
|
+
// runCli's resolveRemnicPluginEntry targets plugins.entries["openclaw-engram"]
|
|
5
|
+
// before falling through to the canonical "openclaw-remnic" entry. This
|
|
6
|
+
// prevents `engram-access` from silently reading/writing the wrong memory
|
|
7
|
+
// store during migration when both blocks exist with no plugins.slots.memory
|
|
8
|
+
// override (#403). The id is hardcoded (not imported from @remnic/core)
|
|
9
|
+
// because the shim *is* the legacy alias — the string is its identity.
|
|
3
10
|
import("../dist/access-cli.js")
|
|
4
|
-
.then(({ runCli }) =>
|
|
11
|
+
.then(({ runCli }) =>
|
|
12
|
+
runCli(process.argv.slice(2), { preferredId: "openclaw-engram" }),
|
|
13
|
+
)
|
|
5
14
|
.catch((error) => {
|
|
6
15
|
const message = error instanceof Error ? error.message : "unknown load error";
|
|
7
16
|
console.error(`access-cli failed to load dist/access-cli.js: ${message}`);
|
package/dist/index.js
CHANGED
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
// src/index.ts
|
|
2
2
|
export * from "@remnic/plugin-openclaw";
|
|
3
|
-
import
|
|
3
|
+
import remnicPluginDefinition from "@remnic/plugin-openclaw";
|
|
4
|
+
var shimPluginDefinition = {
|
|
5
|
+
...remnicPluginDefinition,
|
|
6
|
+
id: "openclaw-engram"
|
|
7
|
+
};
|
|
8
|
+
var index_default = shimPluginDefinition;
|
|
4
9
|
export {
|
|
5
|
-
|
|
10
|
+
index_default as default
|
|
6
11
|
};
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,6 +1,15 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "openclaw-engram",
|
|
3
3
|
"kind": "memory",
|
|
4
|
+
"description": "Local semantic memory for OpenClaw. Requires plugins.slots.memory set to this plugin id for hooks to fire.",
|
|
5
|
+
"supports": {
|
|
6
|
+
"memorySlot": true,
|
|
7
|
+
"dreamingSlot": true,
|
|
8
|
+
"activeMemory": true,
|
|
9
|
+
"heartbeat": true,
|
|
10
|
+
"commandsList": true,
|
|
11
|
+
"beforeReset": true
|
|
12
|
+
},
|
|
4
13
|
"configSchema": {
|
|
5
14
|
"type": "object",
|
|
6
15
|
"additionalProperties": false,
|
|
@@ -165,6 +174,612 @@
|
|
|
165
174
|
"type": "string",
|
|
166
175
|
"description": "Override memory storage directory"
|
|
167
176
|
},
|
|
177
|
+
"entitySchemas": {
|
|
178
|
+
"type": "object",
|
|
179
|
+
"description": "Optional per-entity-type structured section schema overrides.",
|
|
180
|
+
"additionalProperties": {
|
|
181
|
+
"type": "object",
|
|
182
|
+
"additionalProperties": false,
|
|
183
|
+
"properties": {
|
|
184
|
+
"sections": {
|
|
185
|
+
"type": "array",
|
|
186
|
+
"items": {
|
|
187
|
+
"type": "object",
|
|
188
|
+
"additionalProperties": false,
|
|
189
|
+
"properties": {
|
|
190
|
+
"key": {
|
|
191
|
+
"type": "string"
|
|
192
|
+
},
|
|
193
|
+
"title": {
|
|
194
|
+
"type": "string"
|
|
195
|
+
},
|
|
196
|
+
"description": {
|
|
197
|
+
"type": "string"
|
|
198
|
+
},
|
|
199
|
+
"aliases": {
|
|
200
|
+
"type": "array",
|
|
201
|
+
"items": {
|
|
202
|
+
"type": "string"
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
},
|
|
206
|
+
"anyOf": [
|
|
207
|
+
{
|
|
208
|
+
"required": [
|
|
209
|
+
"key"
|
|
210
|
+
]
|
|
211
|
+
},
|
|
212
|
+
{
|
|
213
|
+
"required": [
|
|
214
|
+
"title"
|
|
215
|
+
]
|
|
216
|
+
}
|
|
217
|
+
]
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
},
|
|
221
|
+
"required": [
|
|
222
|
+
"sections"
|
|
223
|
+
]
|
|
224
|
+
}
|
|
225
|
+
},
|
|
226
|
+
"dreaming": {
|
|
227
|
+
"type": "object",
|
|
228
|
+
"additionalProperties": false,
|
|
229
|
+
"default": {},
|
|
230
|
+
"properties": {
|
|
231
|
+
"enabled": {
|
|
232
|
+
"type": "boolean",
|
|
233
|
+
"default": false
|
|
234
|
+
},
|
|
235
|
+
"journalPath": {
|
|
236
|
+
"type": "string",
|
|
237
|
+
"default": "DREAMS.md"
|
|
238
|
+
},
|
|
239
|
+
"maxEntries": {
|
|
240
|
+
"anyOf": [
|
|
241
|
+
{
|
|
242
|
+
"type": "integer",
|
|
243
|
+
"const": 0
|
|
244
|
+
},
|
|
245
|
+
{
|
|
246
|
+
"type": "integer",
|
|
247
|
+
"minimum": 10,
|
|
248
|
+
"maximum": 10000
|
|
249
|
+
}
|
|
250
|
+
],
|
|
251
|
+
"default": 500
|
|
252
|
+
},
|
|
253
|
+
"injectRecentCount": {
|
|
254
|
+
"type": "integer",
|
|
255
|
+
"minimum": 0,
|
|
256
|
+
"maximum": 20,
|
|
257
|
+
"default": 3
|
|
258
|
+
},
|
|
259
|
+
"minIntervalMinutes": {
|
|
260
|
+
"type": "integer",
|
|
261
|
+
"minimum": 1,
|
|
262
|
+
"default": 120
|
|
263
|
+
},
|
|
264
|
+
"narrativeModel": {
|
|
265
|
+
"type": "string",
|
|
266
|
+
"default": ""
|
|
267
|
+
},
|
|
268
|
+
"narrativePromptStyle": {
|
|
269
|
+
"type": "string",
|
|
270
|
+
"enum": [
|
|
271
|
+
"reflective",
|
|
272
|
+
"diary",
|
|
273
|
+
"analytical"
|
|
274
|
+
],
|
|
275
|
+
"default": "reflective"
|
|
276
|
+
},
|
|
277
|
+
"watchFile": {
|
|
278
|
+
"type": "boolean",
|
|
279
|
+
"default": true
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
},
|
|
283
|
+
"heartbeat": {
|
|
284
|
+
"type": "object",
|
|
285
|
+
"additionalProperties": false,
|
|
286
|
+
"default": {},
|
|
287
|
+
"properties": {
|
|
288
|
+
"enabled": {
|
|
289
|
+
"type": "boolean",
|
|
290
|
+
"default": false
|
|
291
|
+
},
|
|
292
|
+
"journalPath": {
|
|
293
|
+
"type": "string",
|
|
294
|
+
"default": "HEARTBEAT.md"
|
|
295
|
+
},
|
|
296
|
+
"maxPreviousRuns": {
|
|
297
|
+
"type": "integer",
|
|
298
|
+
"minimum": 0,
|
|
299
|
+
"maximum": 20,
|
|
300
|
+
"default": 5
|
|
301
|
+
},
|
|
302
|
+
"watchFile": {
|
|
303
|
+
"type": "boolean",
|
|
304
|
+
"default": true
|
|
305
|
+
},
|
|
306
|
+
"detectionMode": {
|
|
307
|
+
"type": "string",
|
|
308
|
+
"enum": [
|
|
309
|
+
"runtime-signal",
|
|
310
|
+
"heuristic",
|
|
311
|
+
"auto"
|
|
312
|
+
],
|
|
313
|
+
"default": "auto"
|
|
314
|
+
},
|
|
315
|
+
"gateExtractionDuringHeartbeat": {
|
|
316
|
+
"type": "boolean",
|
|
317
|
+
"default": true
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
},
|
|
321
|
+
"procedural": {
|
|
322
|
+
"type": "object",
|
|
323
|
+
"additionalProperties": false,
|
|
324
|
+
"default": {},
|
|
325
|
+
"properties": {
|
|
326
|
+
"enabled": {
|
|
327
|
+
"type": "boolean",
|
|
328
|
+
"default": false,
|
|
329
|
+
"description": "Master gate for procedural memory: extraction, recall boost, and mining (issue #519)."
|
|
330
|
+
},
|
|
331
|
+
"minOccurrences": {
|
|
332
|
+
"type": "integer",
|
|
333
|
+
"minimum": 0,
|
|
334
|
+
"maximum": 1000,
|
|
335
|
+
"default": 3,
|
|
336
|
+
"description": "Minimum clustered trajectory occurrences before emitting a candidate procedure (0 disables mining)."
|
|
337
|
+
},
|
|
338
|
+
"successFloor": {
|
|
339
|
+
"type": "number",
|
|
340
|
+
"minimum": 0,
|
|
341
|
+
"maximum": 1,
|
|
342
|
+
"default": 0.7,
|
|
343
|
+
"description": "Minimum success-rate floor (from trajectory outcomes) for miner promotion."
|
|
344
|
+
},
|
|
345
|
+
"autoPromoteOccurrences": {
|
|
346
|
+
"type": "integer",
|
|
347
|
+
"minimum": 0,
|
|
348
|
+
"maximum": 10000,
|
|
349
|
+
"default": 8,
|
|
350
|
+
"description": "When auto-promotion is enabled, minimum occurrence count to move pending_review procedures to active (0 disables auto-promotion by count)."
|
|
351
|
+
},
|
|
352
|
+
"autoPromoteEnabled": {
|
|
353
|
+
"type": "boolean",
|
|
354
|
+
"default": false,
|
|
355
|
+
"description": "When true, miner may auto-promote trusted procedures to active after autoPromoteOccurrences."
|
|
356
|
+
},
|
|
357
|
+
"lookbackDays": {
|
|
358
|
+
"type": "integer",
|
|
359
|
+
"minimum": 1,
|
|
360
|
+
"maximum": 3650,
|
|
361
|
+
"default": 30,
|
|
362
|
+
"description": "Trajectory lookback window for procedural mining."
|
|
363
|
+
},
|
|
364
|
+
"recallMaxProcedures": {
|
|
365
|
+
"type": "integer",
|
|
366
|
+
"minimum": 1,
|
|
367
|
+
"maximum": 10,
|
|
368
|
+
"default": 3,
|
|
369
|
+
"description": "Maximum procedure memories to inject on task-initiation recall."
|
|
370
|
+
},
|
|
371
|
+
"proceduralMiningCronAutoRegister": {
|
|
372
|
+
"type": "boolean",
|
|
373
|
+
"default": false,
|
|
374
|
+
"description": "When true, installer may register the nightly procedural mining cron job."
|
|
375
|
+
}
|
|
376
|
+
}
|
|
377
|
+
},
|
|
378
|
+
"slotBehavior": {
|
|
379
|
+
"type": "object",
|
|
380
|
+
"additionalProperties": false,
|
|
381
|
+
"default": {},
|
|
382
|
+
"properties": {
|
|
383
|
+
"requireExclusiveMemorySlot": {
|
|
384
|
+
"type": "boolean",
|
|
385
|
+
"default": true
|
|
386
|
+
},
|
|
387
|
+
"onSlotMismatch": {
|
|
388
|
+
"type": "string",
|
|
389
|
+
"enum": [
|
|
390
|
+
"error",
|
|
391
|
+
"warn",
|
|
392
|
+
"silent"
|
|
393
|
+
],
|
|
394
|
+
"default": "error"
|
|
395
|
+
}
|
|
396
|
+
}
|
|
397
|
+
},
|
|
398
|
+
"beforeResetTimeoutMs": {
|
|
399
|
+
"type": "integer",
|
|
400
|
+
"minimum": 100,
|
|
401
|
+
"maximum": 30000,
|
|
402
|
+
"default": 2000,
|
|
403
|
+
"description": "Maximum time to wait for a reset-triggered flush before returning control to OpenClaw."
|
|
404
|
+
},
|
|
405
|
+
"flushOnResetEnabled": {
|
|
406
|
+
"type": "boolean",
|
|
407
|
+
"default": true,
|
|
408
|
+
"description": "Flush buffered turns through extraction when OpenClaw resets a session."
|
|
409
|
+
},
|
|
410
|
+
"commandsListEnabled": {
|
|
411
|
+
"type": "boolean",
|
|
412
|
+
"default": true,
|
|
413
|
+
"description": "Advertise Remnic slash-command descriptors through the commands.list runtime surface."
|
|
414
|
+
},
|
|
415
|
+
"openclawToolsEnabled": {
|
|
416
|
+
"type": "boolean",
|
|
417
|
+
"default": true,
|
|
418
|
+
"description": "Register the OpenClaw memory.search and memory.get tool adapters."
|
|
419
|
+
},
|
|
420
|
+
"openclawToolSnippetMaxChars": {
|
|
421
|
+
"type": "integer",
|
|
422
|
+
"minimum": 80,
|
|
423
|
+
"maximum": 4000,
|
|
424
|
+
"default": 600,
|
|
425
|
+
"description": "Maximum snippet size returned by the OpenClaw memory tool adapters."
|
|
426
|
+
},
|
|
427
|
+
"sessionTogglesEnabled": {
|
|
428
|
+
"type": "boolean",
|
|
429
|
+
"default": true,
|
|
430
|
+
"description": "Enable per-session recall toggle state for OpenClaw runtime surfaces."
|
|
431
|
+
},
|
|
432
|
+
"verboseRecallVisibility": {
|
|
433
|
+
"type": "boolean",
|
|
434
|
+
"default": true,
|
|
435
|
+
"description": "Allow verbose recall headers to surface runtime recall diagnostics in prompts."
|
|
436
|
+
},
|
|
437
|
+
"recallTranscriptsEnabled": {
|
|
438
|
+
"type": "boolean",
|
|
439
|
+
"default": false,
|
|
440
|
+
"description": "Write JSONL recall audit transcripts for runtime-surface injections."
|
|
441
|
+
},
|
|
442
|
+
"recallTranscriptRetentionDays": {
|
|
443
|
+
"type": "integer",
|
|
444
|
+
"minimum": 1,
|
|
445
|
+
"maximum": 365,
|
|
446
|
+
"default": 30,
|
|
447
|
+
"description": "Days of runtime recall audit transcripts to retain before pruning."
|
|
448
|
+
},
|
|
449
|
+
"respectBundledActiveMemoryToggle": {
|
|
450
|
+
"type": "boolean",
|
|
451
|
+
"default": true,
|
|
452
|
+
"description": "Honor the bundled active-memory session toggle file when resolving Remnic recall toggles."
|
|
453
|
+
},
|
|
454
|
+
"activeRecallEnabled": {
|
|
455
|
+
"type": "boolean",
|
|
456
|
+
"default": false,
|
|
457
|
+
"description": "Enable the OpenClaw active-recall prompt surface."
|
|
458
|
+
},
|
|
459
|
+
"activeRecallAgents": {
|
|
460
|
+
"type": "array",
|
|
461
|
+
"items": {
|
|
462
|
+
"type": "string"
|
|
463
|
+
},
|
|
464
|
+
"description": "Optional allowlist of OpenClaw agent ids that may use active recall."
|
|
465
|
+
},
|
|
466
|
+
"activeRecallAllowedChatTypes": {
|
|
467
|
+
"type": "array",
|
|
468
|
+
"items": {
|
|
469
|
+
"type": "string",
|
|
470
|
+
"enum": [
|
|
471
|
+
"direct",
|
|
472
|
+
"group",
|
|
473
|
+
"channel"
|
|
474
|
+
]
|
|
475
|
+
},
|
|
476
|
+
"default": [
|
|
477
|
+
"direct",
|
|
478
|
+
"group",
|
|
479
|
+
"channel"
|
|
480
|
+
],
|
|
481
|
+
"description": "OpenClaw chat types eligible for active recall."
|
|
482
|
+
},
|
|
483
|
+
"activeRecallQueryMode": {
|
|
484
|
+
"type": "string",
|
|
485
|
+
"enum": [
|
|
486
|
+
"recent",
|
|
487
|
+
"message",
|
|
488
|
+
"full"
|
|
489
|
+
],
|
|
490
|
+
"default": "recent",
|
|
491
|
+
"description": "How much recent OpenClaw conversation context is fed into the active-recall query builder."
|
|
492
|
+
},
|
|
493
|
+
"activeRecallPromptStyle": {
|
|
494
|
+
"type": "string",
|
|
495
|
+
"enum": [
|
|
496
|
+
"balanced",
|
|
497
|
+
"strict",
|
|
498
|
+
"contextual",
|
|
499
|
+
"recall-heavy",
|
|
500
|
+
"precision-heavy",
|
|
501
|
+
"preference-only"
|
|
502
|
+
],
|
|
503
|
+
"default": "balanced",
|
|
504
|
+
"description": "Prompt assembly style for the active-recall surface."
|
|
505
|
+
},
|
|
506
|
+
"activeRecallPromptOverride": {
|
|
507
|
+
"type": "string",
|
|
508
|
+
"description": "Optional full prompt override for the active-recall surface."
|
|
509
|
+
},
|
|
510
|
+
"activeRecallPromptAppend": {
|
|
511
|
+
"type": "string",
|
|
512
|
+
"description": "Optional prompt suffix appended to the active-recall system prompt."
|
|
513
|
+
},
|
|
514
|
+
"activeRecallMaxSummaryChars": {
|
|
515
|
+
"type": "integer",
|
|
516
|
+
"minimum": 40,
|
|
517
|
+
"maximum": 1000,
|
|
518
|
+
"default": 220,
|
|
519
|
+
"description": "Maximum summary size produced by the active-recall surface."
|
|
520
|
+
},
|
|
521
|
+
"activeRecallRecentUserTurns": {
|
|
522
|
+
"type": "integer",
|
|
523
|
+
"minimum": 0,
|
|
524
|
+
"maximum": 4,
|
|
525
|
+
"default": 2,
|
|
526
|
+
"description": "How many recent user turns to include in the active-recall query context."
|
|
527
|
+
},
|
|
528
|
+
"activeRecallRecentAssistantTurns": {
|
|
529
|
+
"type": "integer",
|
|
530
|
+
"minimum": 0,
|
|
531
|
+
"maximum": 3,
|
|
532
|
+
"default": 1,
|
|
533
|
+
"description": "How many recent assistant turns to include in the active-recall query context."
|
|
534
|
+
},
|
|
535
|
+
"activeRecallRecentUserChars": {
|
|
536
|
+
"type": "integer",
|
|
537
|
+
"minimum": 40,
|
|
538
|
+
"maximum": 1000,
|
|
539
|
+
"default": 600,
|
|
540
|
+
"description": "Per-user-turn character cap for active-recall context assembly."
|
|
541
|
+
},
|
|
542
|
+
"activeRecallRecentAssistantChars": {
|
|
543
|
+
"type": "integer",
|
|
544
|
+
"minimum": 40,
|
|
545
|
+
"maximum": 1000,
|
|
546
|
+
"default": 400,
|
|
547
|
+
"description": "Per-assistant-turn character cap for active-recall context assembly."
|
|
548
|
+
},
|
|
549
|
+
"activeRecallThinking": {
|
|
550
|
+
"type": "string",
|
|
551
|
+
"enum": [
|
|
552
|
+
"off",
|
|
553
|
+
"minimal",
|
|
554
|
+
"low",
|
|
555
|
+
"medium",
|
|
556
|
+
"high",
|
|
557
|
+
"xhigh",
|
|
558
|
+
"adaptive"
|
|
559
|
+
],
|
|
560
|
+
"default": "low",
|
|
561
|
+
"description": "Reasoning effort used by the active-recall engine."
|
|
562
|
+
},
|
|
563
|
+
"activeRecallTimeoutMs": {
|
|
564
|
+
"type": "integer",
|
|
565
|
+
"minimum": 250,
|
|
566
|
+
"default": 15000,
|
|
567
|
+
"description": "Timeout for an active-recall run."
|
|
568
|
+
},
|
|
569
|
+
"activeRecallCacheTtlMs": {
|
|
570
|
+
"type": "integer",
|
|
571
|
+
"minimum": 0,
|
|
572
|
+
"maximum": 120000,
|
|
573
|
+
"default": 15000,
|
|
574
|
+
"description": "Cache TTL for active-recall summaries; 0 disables the cache."
|
|
575
|
+
},
|
|
576
|
+
"activeRecallModel": {
|
|
577
|
+
"type": "string",
|
|
578
|
+
"description": "Optional model override for active recall."
|
|
579
|
+
},
|
|
580
|
+
"activeRecallModelFallbackPolicy": {
|
|
581
|
+
"type": "string",
|
|
582
|
+
"enum": [
|
|
583
|
+
"default-remote",
|
|
584
|
+
"resolved-only"
|
|
585
|
+
],
|
|
586
|
+
"default": "default-remote",
|
|
587
|
+
"description": "How active recall falls back when an explicit model cannot be resolved."
|
|
588
|
+
},
|
|
589
|
+
"activeRecallPersistTranscripts": {
|
|
590
|
+
"type": "boolean",
|
|
591
|
+
"default": false,
|
|
592
|
+
"description": "Persist full active-recall request and response transcripts."
|
|
593
|
+
},
|
|
594
|
+
"activeRecallTranscriptDir": {
|
|
595
|
+
"type": "string",
|
|
596
|
+
"default": "active-recall",
|
|
597
|
+
"description": "Memory-relative directory for active-recall transcripts."
|
|
598
|
+
},
|
|
599
|
+
"activeRecallEntityGraphDepth": {
|
|
600
|
+
"type": "integer",
|
|
601
|
+
"minimum": 0,
|
|
602
|
+
"maximum": 3,
|
|
603
|
+
"default": 1,
|
|
604
|
+
"description": "Entity-graph traversal depth used by active recall."
|
|
605
|
+
},
|
|
606
|
+
"activeRecallIncludeCausalTrajectories": {
|
|
607
|
+
"type": "boolean",
|
|
608
|
+
"default": false,
|
|
609
|
+
"description": "Include causal trajectory recall evidence in active-recall summaries."
|
|
610
|
+
},
|
|
611
|
+
"activeRecallIncludeDaySummary": {
|
|
612
|
+
"type": "boolean",
|
|
613
|
+
"default": false,
|
|
614
|
+
"description": "Include the latest day summary in active-recall context."
|
|
615
|
+
},
|
|
616
|
+
"activeRecallAttachRecallExplain": {
|
|
617
|
+
"type": "boolean",
|
|
618
|
+
"default": false,
|
|
619
|
+
"description": "Attach recall explain output to active-recall diagnostics."
|
|
620
|
+
},
|
|
621
|
+
"activeRecallAllowChainedActiveMemory": {
|
|
622
|
+
"type": "boolean",
|
|
623
|
+
"default": false,
|
|
624
|
+
"description": "Allow active recall to chain into the bundled active-memory surface."
|
|
625
|
+
},
|
|
626
|
+
"codex": {
|
|
627
|
+
"type": "object",
|
|
628
|
+
"additionalProperties": false,
|
|
629
|
+
"default": {},
|
|
630
|
+
"properties": {
|
|
631
|
+
"installExtension": {
|
|
632
|
+
"type": "boolean",
|
|
633
|
+
"default": true,
|
|
634
|
+
"description": "Install the Remnic Codex memory extension during Codex connector setup."
|
|
635
|
+
},
|
|
636
|
+
"codexHome": {
|
|
637
|
+
"type": [
|
|
638
|
+
"string",
|
|
639
|
+
"null"
|
|
640
|
+
],
|
|
641
|
+
"default": null,
|
|
642
|
+
"description": "Optional Codex home directory override used for connector install and materialization."
|
|
643
|
+
}
|
|
644
|
+
}
|
|
645
|
+
},
|
|
646
|
+
"codexMaterializeMemories": {
|
|
647
|
+
"type": "boolean",
|
|
648
|
+
"default": true,
|
|
649
|
+
"description": "Enable Codex native memory materialization into the Codex memories directory."
|
|
650
|
+
},
|
|
651
|
+
"codexMaterializeNamespace": {
|
|
652
|
+
"type": "string",
|
|
653
|
+
"default": "auto",
|
|
654
|
+
"description": "Namespace to materialize for Codex. \"auto\" derives the namespace from the active connector context."
|
|
655
|
+
},
|
|
656
|
+
"codexMaterializeMaxSummaryTokens": {
|
|
657
|
+
"type": "number",
|
|
658
|
+
"minimum": 0,
|
|
659
|
+
"default": 4500,
|
|
660
|
+
"description": "Whitespace-token cap for Codex memory summary materialization."
|
|
661
|
+
},
|
|
662
|
+
"codexMaterializeRolloutRetentionDays": {
|
|
663
|
+
"type": "number",
|
|
664
|
+
"minimum": 0,
|
|
665
|
+
"default": 30,
|
|
666
|
+
"description": "Retention window in days for Codex rollout materialization artifacts."
|
|
667
|
+
},
|
|
668
|
+
"codexMaterializeOnConsolidation": {
|
|
669
|
+
"type": "boolean",
|
|
670
|
+
"default": true,
|
|
671
|
+
"description": "Run Codex memory materialization after semantic or causal consolidation completes."
|
|
672
|
+
},
|
|
673
|
+
"codexMaterializeOnSessionEnd": {
|
|
674
|
+
"type": "boolean",
|
|
675
|
+
"default": true,
|
|
676
|
+
"description": "Run Codex memory materialization from the Codex session-end hook."
|
|
677
|
+
},
|
|
678
|
+
"codexMarketplaceEnabled": {
|
|
679
|
+
"type": "boolean",
|
|
680
|
+
"default": true,
|
|
681
|
+
"description": "Enable Codex marketplace integration for plugin discovery and installation."
|
|
682
|
+
},
|
|
683
|
+
"versioningEnabled": {
|
|
684
|
+
"type": "boolean",
|
|
685
|
+
"default": false,
|
|
686
|
+
"description": "Enable page-level versioning with sidecar snapshots."
|
|
687
|
+
},
|
|
688
|
+
"versioningMaxPerPage": {
|
|
689
|
+
"type": "integer",
|
|
690
|
+
"default": 50,
|
|
691
|
+
"minimum": 0,
|
|
692
|
+
"description": "Maximum number of version snapshots per page. Set to 0 to disable pruning."
|
|
693
|
+
},
|
|
694
|
+
"versioningSidecarDir": {
|
|
695
|
+
"type": "string",
|
|
696
|
+
"default": ".versions",
|
|
697
|
+
"description": "Name of the sidecar directory inside memoryDir for version snapshots."
|
|
698
|
+
},
|
|
699
|
+
"taxonomyEnabled": {
|
|
700
|
+
"type": "boolean",
|
|
701
|
+
"default": false,
|
|
702
|
+
"description": "Enable the MECE taxonomy knowledge directory for categorizing memories."
|
|
703
|
+
},
|
|
704
|
+
"taxonomyAutoGenResolver": {
|
|
705
|
+
"type": "boolean",
|
|
706
|
+
"default": true,
|
|
707
|
+
"description": "Auto-regenerate RESOLVER.md when the taxonomy changes."
|
|
708
|
+
},
|
|
709
|
+
"citationsEnabled": {
|
|
710
|
+
"type": "boolean",
|
|
711
|
+
"default": false,
|
|
712
|
+
"description": "Enable oai-mem-citation blocks in recall responses for Codex citation parity."
|
|
713
|
+
},
|
|
714
|
+
"citationsAutoDetect": {
|
|
715
|
+
"type": "boolean",
|
|
716
|
+
"default": true,
|
|
717
|
+
"description": "Auto-enable citations when the Codex adapter is detected."
|
|
718
|
+
},
|
|
719
|
+
"memoryExtensionsEnabled": {
|
|
720
|
+
"type": "boolean",
|
|
721
|
+
"default": true,
|
|
722
|
+
"description": "Whether third-party memory extensions are discovered and injected into consolidation prompts."
|
|
723
|
+
},
|
|
724
|
+
"memoryExtensionsRoot": {
|
|
725
|
+
"type": "string",
|
|
726
|
+
"default": "",
|
|
727
|
+
"description": "Root directory for memory extensions. Empty string derives from memoryDir (go up to Remnic home and append memory_extensions)."
|
|
728
|
+
},
|
|
729
|
+
"binaryLifecycleEnabled": {
|
|
730
|
+
"type": "boolean",
|
|
731
|
+
"default": false,
|
|
732
|
+
"description": "Enable binary file lifecycle management. When true, binary files in the memory directory are mirrored, redirected, and cleaned."
|
|
733
|
+
},
|
|
734
|
+
"binaryLifecycleGracePeriodDays": {
|
|
735
|
+
"type": "number",
|
|
736
|
+
"default": 7,
|
|
737
|
+
"minimum": 0,
|
|
738
|
+
"description": "Days to wait before cleaning local copies of mirrored binary files."
|
|
739
|
+
},
|
|
740
|
+
"binaryLifecycleBackendType": {
|
|
741
|
+
"type": "string",
|
|
742
|
+
"enum": [
|
|
743
|
+
"none",
|
|
744
|
+
"filesystem",
|
|
745
|
+
"s3"
|
|
746
|
+
],
|
|
747
|
+
"default": "none",
|
|
748
|
+
"description": "Storage backend for binary lifecycle mirror stage."
|
|
749
|
+
},
|
|
750
|
+
"binaryLifecycleBackendPath": {
|
|
751
|
+
"type": "string",
|
|
752
|
+
"default": "",
|
|
753
|
+
"description": "Base path for the filesystem storage backend."
|
|
754
|
+
},
|
|
755
|
+
"codexCompat": {
|
|
756
|
+
"type": "object",
|
|
757
|
+
"additionalProperties": false,
|
|
758
|
+
"default": {},
|
|
759
|
+
"properties": {
|
|
760
|
+
"enabled": {
|
|
761
|
+
"type": "boolean",
|
|
762
|
+
"default": false
|
|
763
|
+
},
|
|
764
|
+
"threadIdBufferKeying": {
|
|
765
|
+
"type": "boolean",
|
|
766
|
+
"default": true
|
|
767
|
+
},
|
|
768
|
+
"compactionFlushMode": {
|
|
769
|
+
"type": "string",
|
|
770
|
+
"enum": [
|
|
771
|
+
"signal",
|
|
772
|
+
"heuristic",
|
|
773
|
+
"auto"
|
|
774
|
+
],
|
|
775
|
+
"default": "auto"
|
|
776
|
+
},
|
|
777
|
+
"fingerprintDedup": {
|
|
778
|
+
"type": "boolean",
|
|
779
|
+
"default": true
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
},
|
|
168
783
|
"debug": {
|
|
169
784
|
"type": "boolean",
|
|
170
785
|
"default": false,
|
|
@@ -685,7 +1300,7 @@
|
|
|
685
1300
|
"recallPlannerShadowMode": {
|
|
686
1301
|
"type": "boolean",
|
|
687
1302
|
"default": false,
|
|
688
|
-
"description": "Run recall planner in shadow mode
|
|
1303
|
+
"description": "Run recall planner in shadow mode — evaluate but do not apply results."
|
|
689
1304
|
},
|
|
690
1305
|
"recallPlannerTelemetryEnabled": {
|
|
691
1306
|
"type": "boolean",
|
|
@@ -741,7 +1356,8 @@
|
|
|
741
1356
|
"principle",
|
|
742
1357
|
"commitment",
|
|
743
1358
|
"moment",
|
|
744
|
-
"skill"
|
|
1359
|
+
"skill",
|
|
1360
|
+
"procedure"
|
|
745
1361
|
]
|
|
746
1362
|
},
|
|
747
1363
|
"default": [
|
|
@@ -760,7 +1376,7 @@
|
|
|
760
1376
|
"boxTopicShiftThreshold": {
|
|
761
1377
|
"type": "number",
|
|
762
1378
|
"default": 0.35,
|
|
763
|
-
"description": "Jaccard overlap threshold below which a topic shift seals the current box (0
|
|
1379
|
+
"description": "Jaccard overlap threshold below which a topic shift seals the current box (0–1)."
|
|
764
1380
|
},
|
|
765
1381
|
"boxTimeGapMs": {
|
|
766
1382
|
"type": "number",
|
|
@@ -785,7 +1401,7 @@
|
|
|
785
1401
|
"traceWeaverOverlapThreshold": {
|
|
786
1402
|
"type": "number",
|
|
787
1403
|
"default": 0.4,
|
|
788
|
-
"description": "Minimum Jaccard topic overlap to assign the same traceId (0
|
|
1404
|
+
"description": "Minimum Jaccard topic overlap to assign the same traceId (0–1)."
|
|
789
1405
|
},
|
|
790
1406
|
"boxRecallDays": {
|
|
791
1407
|
"type": "number",
|
|
@@ -885,7 +1501,7 @@
|
|
|
885
1501
|
"graphRecallShadowEnabled": {
|
|
886
1502
|
"type": "boolean",
|
|
887
1503
|
"default": false,
|
|
888
|
-
"description": "Run graph recall in shadow mode
|
|
1504
|
+
"description": "Run graph recall in shadow mode — evaluate but do not inject results."
|
|
889
1505
|
},
|
|
890
1506
|
"graphRecallSnapshotEnabled": {
|
|
891
1507
|
"type": "boolean",
|
|
@@ -1239,6 +1855,53 @@
|
|
|
1239
1855
|
"default": 2,
|
|
1240
1856
|
"description": "Number of sentences to overlap between chunks"
|
|
1241
1857
|
},
|
|
1858
|
+
"semanticChunkingEnabled": {
|
|
1859
|
+
"type": "boolean",
|
|
1860
|
+
"default": false,
|
|
1861
|
+
"description": "Enable semantic chunking with embedding-based topic boundary detection (requires embedding provider)"
|
|
1862
|
+
},
|
|
1863
|
+
"semanticChunkingConfig": {
|
|
1864
|
+
"type": "object",
|
|
1865
|
+
"default": {},
|
|
1866
|
+
"description": "Optional overrides for the semantic chunking algorithm",
|
|
1867
|
+
"properties": {
|
|
1868
|
+
"targetTokens": {
|
|
1869
|
+
"type": "number",
|
|
1870
|
+
"default": 200,
|
|
1871
|
+
"description": "Target tokens per chunk"
|
|
1872
|
+
},
|
|
1873
|
+
"minTokens": {
|
|
1874
|
+
"type": "number",
|
|
1875
|
+
"default": 100,
|
|
1876
|
+
"description": "Minimum tokens for a segment before merging with neighbor"
|
|
1877
|
+
},
|
|
1878
|
+
"maxTokens": {
|
|
1879
|
+
"type": "number",
|
|
1880
|
+
"default": 400,
|
|
1881
|
+
"description": "Maximum tokens for a segment before recursive splitting"
|
|
1882
|
+
},
|
|
1883
|
+
"smoothingWindowSize": {
|
|
1884
|
+
"type": "number",
|
|
1885
|
+
"default": 3,
|
|
1886
|
+
"description": "Window size for the moving-average smoothing filter (auto-rounded to odd)"
|
|
1887
|
+
},
|
|
1888
|
+
"boundaryThresholdStdDevs": {
|
|
1889
|
+
"type": "number",
|
|
1890
|
+
"default": 1,
|
|
1891
|
+
"description": "Standard deviations below mean for boundary detection"
|
|
1892
|
+
},
|
|
1893
|
+
"embeddingBatchSize": {
|
|
1894
|
+
"type": "number",
|
|
1895
|
+
"default": 32,
|
|
1896
|
+
"description": "Batch size for embedding requests"
|
|
1897
|
+
},
|
|
1898
|
+
"fallbackToRecursive": {
|
|
1899
|
+
"type": "boolean",
|
|
1900
|
+
"default": true,
|
|
1901
|
+
"description": "Fall back to recursive chunking when embeddings are unavailable"
|
|
1902
|
+
}
|
|
1903
|
+
}
|
|
1904
|
+
},
|
|
1242
1905
|
"contradictionDetectionEnabled": {
|
|
1243
1906
|
"type": "boolean",
|
|
1244
1907
|
"default": false,
|
|
@@ -1259,6 +1922,56 @@
|
|
|
1259
1922
|
"default": true,
|
|
1260
1923
|
"description": "Automatically supersede contradicted memories"
|
|
1261
1924
|
},
|
|
1925
|
+
"temporalSupersessionEnabled": {
|
|
1926
|
+
"type": "boolean",
|
|
1927
|
+
"default": true,
|
|
1928
|
+
"description": "Mark older facts superseded when a new fact writes a conflicting value for the same entityRef + structuredAttribute key (issue #375)"
|
|
1929
|
+
},
|
|
1930
|
+
"temporalSupersessionIncludeInRecall": {
|
|
1931
|
+
"type": "boolean",
|
|
1932
|
+
"default": false,
|
|
1933
|
+
"description": "If true, include temporally-superseded facts in recall results (for audit/history). Default: exclude."
|
|
1934
|
+
},
|
|
1935
|
+
"recallDirectAnswerEnabled": {
|
|
1936
|
+
"type": "boolean",
|
|
1937
|
+
"default": false,
|
|
1938
|
+
"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."
|
|
1939
|
+
},
|
|
1940
|
+
"recallDirectAnswerTokenOverlapFloor": {
|
|
1941
|
+
"type": "number",
|
|
1942
|
+
"minimum": 0,
|
|
1943
|
+
"maximum": 1,
|
|
1944
|
+
"default": 0.55,
|
|
1945
|
+
"description": "Minimum query↔memory token-overlap ratio for direct-answer eligibility. Set to 0 to disable the gate."
|
|
1946
|
+
},
|
|
1947
|
+
"recallDirectAnswerImportanceFloor": {
|
|
1948
|
+
"type": "number",
|
|
1949
|
+
"minimum": 0,
|
|
1950
|
+
"maximum": 1,
|
|
1951
|
+
"default": 0.7,
|
|
1952
|
+
"description": "Minimum calibrated importance score for direct-answer eligibility. Set to 0 to disable the gate."
|
|
1953
|
+
},
|
|
1954
|
+
"recallDirectAnswerAmbiguityMargin": {
|
|
1955
|
+
"type": "number",
|
|
1956
|
+
"minimum": 0,
|
|
1957
|
+
"maximum": 1,
|
|
1958
|
+
"default": 0.15,
|
|
1959
|
+
"description": "If the second-best candidate scores within this ratio of the top, direct-answer defers to hybrid."
|
|
1960
|
+
},
|
|
1961
|
+
"recallDirectAnswerEligibleTaxonomyBuckets": {
|
|
1962
|
+
"type": "array",
|
|
1963
|
+
"items": {
|
|
1964
|
+
"type": "string"
|
|
1965
|
+
},
|
|
1966
|
+
"default": [
|
|
1967
|
+
"decisions",
|
|
1968
|
+
"principles",
|
|
1969
|
+
"conventions",
|
|
1970
|
+
"runbooks",
|
|
1971
|
+
"entities"
|
|
1972
|
+
],
|
|
1973
|
+
"description": "Taxonomy category IDs eligible for direct-answer routing."
|
|
1974
|
+
},
|
|
1262
1975
|
"memoryLinkingEnabled": {
|
|
1263
1976
|
"type": "boolean",
|
|
1264
1977
|
"default": false,
|
|
@@ -1403,7 +2116,10 @@
|
|
|
1403
2116
|
},
|
|
1404
2117
|
"modelSource": {
|
|
1405
2118
|
"type": "string",
|
|
1406
|
-
"enum": [
|
|
2119
|
+
"enum": [
|
|
2120
|
+
"plugin",
|
|
2121
|
+
"gateway"
|
|
2122
|
+
],
|
|
1407
2123
|
"default": "plugin",
|
|
1408
2124
|
"description": "LLM source: 'plugin' uses Engram's own openai/localLlm config; 'gateway' delegates to a gateway agent's model chain (agents.list[])."
|
|
1409
2125
|
},
|
|
@@ -1483,7 +2199,7 @@
|
|
|
1483
2199
|
"traceRecallContent": {
|
|
1484
2200
|
"type": "boolean",
|
|
1485
2201
|
"default": false,
|
|
1486
|
-
"description": "If true, include the full recalled memory text in RecallTraceEvent.recalledContent emitted to __openclawEngramTrace subscribers (e.g. Langfuse). Disabled by default
|
|
2202
|
+
"description": "If true, include the full recalled memory text in RecallTraceEvent.recalledContent emitted to __openclawEngramTrace subscribers (e.g. Langfuse). Disabled by default — only enable when you want external trace collectors to capture injected memory context."
|
|
1487
2203
|
},
|
|
1488
2204
|
"profilingEnabled": {
|
|
1489
2205
|
"type": "boolean",
|
|
@@ -1515,6 +2231,49 @@
|
|
|
1515
2231
|
"default": 40,
|
|
1516
2232
|
"description": "Minimum combined user/assistant characters required before extraction runs."
|
|
1517
2233
|
},
|
|
2234
|
+
"extractionMinImportanceLevel": {
|
|
2235
|
+
"type": "string",
|
|
2236
|
+
"enum": [
|
|
2237
|
+
"trivial",
|
|
2238
|
+
"low",
|
|
2239
|
+
"normal",
|
|
2240
|
+
"high",
|
|
2241
|
+
"critical"
|
|
2242
|
+
],
|
|
2243
|
+
"default": "low",
|
|
2244
|
+
"description": "Minimum locally-scored importance level required to persist an extracted fact. Facts below this level are dropped before write and counted toward the importance_gated metric. Default \"low\" drops only trivial turn-level chatter (greetings, single-word replies); raise to \"normal\" or higher for a stricter gate."
|
|
2245
|
+
},
|
|
2246
|
+
"extractionJudgeEnabled": {
|
|
2247
|
+
"type": "boolean",
|
|
2248
|
+
"default": false,
|
|
2249
|
+
"description": "Enable the LLM-as-judge fact-worthiness gate. When enabled, extracted facts are evaluated for durability before being persisted. Off by default (opt-in)."
|
|
2250
|
+
},
|
|
2251
|
+
"extractionJudgeModel": {
|
|
2252
|
+
"type": "string",
|
|
2253
|
+
"default": "",
|
|
2254
|
+
"description": "Model override for the extraction judge LLM. Empty string uses the configured local model."
|
|
2255
|
+
},
|
|
2256
|
+
"extractionJudgeBatchSize": {
|
|
2257
|
+
"type": "number",
|
|
2258
|
+
"default": 20,
|
|
2259
|
+
"minimum": 1,
|
|
2260
|
+
"description": "Maximum number of candidate facts sent to the judge LLM in a single batch call."
|
|
2261
|
+
},
|
|
2262
|
+
"extractionJudgeShadow": {
|
|
2263
|
+
"type": "boolean",
|
|
2264
|
+
"default": false,
|
|
2265
|
+
"description": "Shadow mode for the extraction judge. When true, judge verdicts are logged but all facts are still persisted regardless of the verdict."
|
|
2266
|
+
},
|
|
2267
|
+
"inlineSourceAttributionEnabled": {
|
|
2268
|
+
"type": "boolean",
|
|
2269
|
+
"default": false,
|
|
2270
|
+
"description": "Enable inline source attribution markers on persisted facts for downstream provenance tracking."
|
|
2271
|
+
},
|
|
2272
|
+
"inlineSourceAttributionFormat": {
|
|
2273
|
+
"type": "string",
|
|
2274
|
+
"default": "[Source: agent={agent}, session={sessionId}, ts={ts}]",
|
|
2275
|
+
"description": "Template used when inline source attribution is enabled."
|
|
2276
|
+
},
|
|
1518
2277
|
"extractionMinUserTurns": {
|
|
1519
2278
|
"type": "number",
|
|
1520
2279
|
"default": 1,
|
|
@@ -1894,8 +2653,14 @@
|
|
|
1894
2653
|
},
|
|
1895
2654
|
"semanticConsolidationExcludeCategories": {
|
|
1896
2655
|
"type": "array",
|
|
1897
|
-
"items": {
|
|
1898
|
-
|
|
2656
|
+
"items": {
|
|
2657
|
+
"type": "string"
|
|
2658
|
+
},
|
|
2659
|
+
"default": [
|
|
2660
|
+
"correction",
|
|
2661
|
+
"commitment",
|
|
2662
|
+
"procedure"
|
|
2663
|
+
],
|
|
1899
2664
|
"description": "Memory categories excluded from semantic consolidation."
|
|
1900
2665
|
},
|
|
1901
2666
|
"semanticConsolidationIntervalHours": {
|
|
@@ -2260,6 +3025,24 @@
|
|
|
2260
3025
|
"default": true,
|
|
2261
3026
|
"description": "Enable content-hash deduplication to prevent storing semantically identical facts."
|
|
2262
3027
|
},
|
|
3028
|
+
"semanticDedupEnabled": {
|
|
3029
|
+
"type": "boolean",
|
|
3030
|
+
"default": true,
|
|
3031
|
+
"description": "Issue #373 — enable write-time semantic similarity guard that skips near-duplicate facts by comparing embeddings to existing memories. Fails open when the embedding backend is unavailable."
|
|
3032
|
+
},
|
|
3033
|
+
"semanticDedupThreshold": {
|
|
3034
|
+
"type": "number",
|
|
3035
|
+
"default": 0.92,
|
|
3036
|
+
"minimum": 0,
|
|
3037
|
+
"maximum": 1,
|
|
3038
|
+
"description": "Cosine similarity threshold in [0, 1]. Candidate facts whose nearest neighbor scores at or above this value are treated as duplicates and skipped."
|
|
3039
|
+
},
|
|
3040
|
+
"semanticDedupCandidates": {
|
|
3041
|
+
"type": "number",
|
|
3042
|
+
"default": 5,
|
|
3043
|
+
"minimum": 0,
|
|
3044
|
+
"description": "Number of nearest-neighbor candidates to inspect during the write-time semantic dedup check. Set to 0 to disable the embedding lookup entirely (equivalent to semanticDedupEnabled=false)."
|
|
3045
|
+
},
|
|
2263
3046
|
"factArchivalEnabled": {
|
|
2264
3047
|
"type": "boolean",
|
|
2265
3048
|
"default": false,
|
|
@@ -2289,7 +3072,8 @@
|
|
|
2289
3072
|
"commitment",
|
|
2290
3073
|
"preference",
|
|
2291
3074
|
"decision",
|
|
2292
|
-
"principle"
|
|
3075
|
+
"principle",
|
|
3076
|
+
"procedure"
|
|
2293
3077
|
],
|
|
2294
3078
|
"description": "Categories that protect a fact from archival regardless of other criteria."
|
|
2295
3079
|
},
|
|
@@ -2327,7 +3111,8 @@
|
|
|
2327
3111
|
"decision",
|
|
2328
3112
|
"principle",
|
|
2329
3113
|
"commitment",
|
|
2330
|
-
"preference"
|
|
3114
|
+
"preference",
|
|
3115
|
+
"procedure"
|
|
2331
3116
|
],
|
|
2332
3117
|
"description": "Categories that lifecycle policy will not auto-archive."
|
|
2333
3118
|
},
|
|
@@ -2615,6 +3400,20 @@
|
|
|
2615
3400
|
"default": true,
|
|
2616
3401
|
"description": "Generate LLM summaries for entities during consolidation"
|
|
2617
3402
|
},
|
|
3403
|
+
"entitySynthesisMaxTokens": {
|
|
3404
|
+
"anyOf": [
|
|
3405
|
+
{
|
|
3406
|
+
"type": "integer",
|
|
3407
|
+
"const": 0
|
|
3408
|
+
},
|
|
3409
|
+
{
|
|
3410
|
+
"type": "integer",
|
|
3411
|
+
"minimum": 10
|
|
3412
|
+
}
|
|
3413
|
+
],
|
|
3414
|
+
"default": 500,
|
|
3415
|
+
"description": "Max tokens used when refreshing an entity synthesis from its timeline."
|
|
3416
|
+
},
|
|
2618
3417
|
"recallBudgetChars": {
|
|
2619
3418
|
"type": "number",
|
|
2620
3419
|
"description": "Hard character cap for total recall injection. Defaults to maxMemoryTokens * 4."
|
|
@@ -2634,6 +3433,24 @@
|
|
|
2634
3433
|
"default": 25000,
|
|
2635
3434
|
"description": "Default deadline in ms recorded for enrichment recall sections."
|
|
2636
3435
|
},
|
|
3436
|
+
"recallMmrEnabled": {
|
|
3437
|
+
"type": "boolean",
|
|
3438
|
+
"default": true,
|
|
3439
|
+
"description": "Apply Maximal Marginal Relevance to the final recall selection per-section so one redundant cluster cannot dominate the injected context."
|
|
3440
|
+
},
|
|
3441
|
+
"recallMmrLambda": {
|
|
3442
|
+
"type": "number",
|
|
3443
|
+
"default": 0.7,
|
|
3444
|
+
"minimum": 0,
|
|
3445
|
+
"maximum": 1,
|
|
3446
|
+
"description": "MMR lambda parameter. 1.0 = pure relevance, 0.0 = pure diversity. Default 0.7 tilts toward relevance with meaningful diversity."
|
|
3447
|
+
},
|
|
3448
|
+
"recallMmrTopN": {
|
|
3449
|
+
"type": "number",
|
|
3450
|
+
"default": 40,
|
|
3451
|
+
"minimum": 0,
|
|
3452
|
+
"description": "Number of top candidates per section to run MMR over. Candidates past this remain in original order."
|
|
3453
|
+
},
|
|
2637
3454
|
"recallPipeline": {
|
|
2638
3455
|
"type": "array",
|
|
2639
3456
|
"description": "Ordered recall sections with per-section budgets and feature knobs.",
|
|
@@ -2860,7 +3677,7 @@
|
|
|
2860
3677
|
"parallelAgentWeights": {
|
|
2861
3678
|
"type": "object",
|
|
2862
3679
|
"default": {
|
|
2863
|
-
"direct": 1
|
|
3680
|
+
"direct": 1,
|
|
2864
3681
|
"contextual": 0.7,
|
|
2865
3682
|
"temporal": 0.85
|
|
2866
3683
|
},
|
|
@@ -2870,6 +3687,83 @@
|
|
|
2870
3687
|
"type": "number",
|
|
2871
3688
|
"default": 20,
|
|
2872
3689
|
"description": "Maximum results fetched per agent before merge."
|
|
3690
|
+
},
|
|
3691
|
+
"briefing": {
|
|
3692
|
+
"type": "object",
|
|
3693
|
+
"additionalProperties": false,
|
|
3694
|
+
"default": {
|
|
3695
|
+
"enabled": true,
|
|
3696
|
+
"defaultWindow": "yesterday",
|
|
3697
|
+
"defaultFormat": "markdown",
|
|
3698
|
+
"maxFollowups": 5,
|
|
3699
|
+
"calendarSource": null,
|
|
3700
|
+
"saveByDefault": false,
|
|
3701
|
+
"saveDir": null,
|
|
3702
|
+
"llmFollowups": true
|
|
3703
|
+
},
|
|
3704
|
+
"properties": {
|
|
3705
|
+
"enabled": {
|
|
3706
|
+
"type": "boolean",
|
|
3707
|
+
"default": true
|
|
3708
|
+
},
|
|
3709
|
+
"defaultWindow": {
|
|
3710
|
+
"type": "string",
|
|
3711
|
+
"default": "yesterday"
|
|
3712
|
+
},
|
|
3713
|
+
"defaultFormat": {
|
|
3714
|
+
"type": "string",
|
|
3715
|
+
"enum": [
|
|
3716
|
+
"markdown",
|
|
3717
|
+
"json"
|
|
3718
|
+
],
|
|
3719
|
+
"default": "markdown"
|
|
3720
|
+
},
|
|
3721
|
+
"maxFollowups": {
|
|
3722
|
+
"type": "integer",
|
|
3723
|
+
"minimum": 0,
|
|
3724
|
+
"maximum": 10,
|
|
3725
|
+
"default": 5
|
|
3726
|
+
},
|
|
3727
|
+
"calendarSource": {
|
|
3728
|
+
"type": [
|
|
3729
|
+
"string",
|
|
3730
|
+
"null"
|
|
3731
|
+
],
|
|
3732
|
+
"default": null
|
|
3733
|
+
},
|
|
3734
|
+
"saveByDefault": {
|
|
3735
|
+
"type": "boolean",
|
|
3736
|
+
"default": false
|
|
3737
|
+
},
|
|
3738
|
+
"saveDir": {
|
|
3739
|
+
"type": [
|
|
3740
|
+
"string",
|
|
3741
|
+
"null"
|
|
3742
|
+
],
|
|
3743
|
+
"default": null
|
|
3744
|
+
},
|
|
3745
|
+
"llmFollowups": {
|
|
3746
|
+
"type": "boolean",
|
|
3747
|
+
"default": true
|
|
3748
|
+
}
|
|
3749
|
+
},
|
|
3750
|
+
"description": "Daily Context Briefing (#370). Knobs: enabled, defaultWindow ('yesterday', '3d', '1w', '24h', ...), defaultFormat (markdown|json), maxFollowups (0-10), calendarSource (path to ICS/JSON file, null = off), saveByDefault, saveDir (null = $REMNIC_HOME/briefings/), llmFollowups (disable to skip Responses API calls)."
|
|
3751
|
+
},
|
|
3752
|
+
"enrichmentEnabled": {
|
|
3753
|
+
"type": "boolean",
|
|
3754
|
+
"default": false,
|
|
3755
|
+
"description": "Enable the external enrichment pipeline (#365). When true, entities can be enriched via registered providers."
|
|
3756
|
+
},
|
|
3757
|
+
"enrichmentAutoOnCreate": {
|
|
3758
|
+
"type": "boolean",
|
|
3759
|
+
"default": false,
|
|
3760
|
+
"description": "Automatically enrich newly created entities when the enrichment pipeline is enabled."
|
|
3761
|
+
},
|
|
3762
|
+
"enrichmentMaxCandidatesPerEntity": {
|
|
3763
|
+
"type": "integer",
|
|
3764
|
+
"default": 20,
|
|
3765
|
+
"minimum": 0,
|
|
3766
|
+
"description": "Maximum enrichment candidates accepted per entity per run. Set to 0 to accept none."
|
|
2873
3767
|
}
|
|
2874
3768
|
}
|
|
2875
3769
|
},
|
|
@@ -3128,6 +4022,15 @@
|
|
|
3128
4022
|
"advanced": true,
|
|
3129
4023
|
"placeholder": "2"
|
|
3130
4024
|
},
|
|
4025
|
+
"semanticChunkingEnabled": {
|
|
4026
|
+
"label": "Semantic Chunking",
|
|
4027
|
+
"help": "Use embedding-based topic detection for more coherent chunks (requires chunking enabled)"
|
|
4028
|
+
},
|
|
4029
|
+
"semanticChunkingConfig": {
|
|
4030
|
+
"label": "Semantic Chunking Config",
|
|
4031
|
+
"advanced": true,
|
|
4032
|
+
"help": "Override defaults for semantic chunking algorithm parameters"
|
|
4033
|
+
},
|
|
3131
4034
|
"contradictionDetectionEnabled": {
|
|
3132
4035
|
"label": "Contradiction Detection",
|
|
3133
4036
|
"help": "Detect and resolve conflicting memories using LLM verification"
|
|
@@ -3146,6 +4049,39 @@
|
|
|
3146
4049
|
"label": "Auto-Resolve Contradictions",
|
|
3147
4050
|
"help": "Automatically supersede old memories when contradiction is confirmed"
|
|
3148
4051
|
},
|
|
4052
|
+
"temporalSupersessionEnabled": {
|
|
4053
|
+
"label": "Temporal Supersession",
|
|
4054
|
+
"help": "Mark older facts superseded when a newer fact writes a conflicting value for the same entityRef + structured attribute (issue #375)"
|
|
4055
|
+
},
|
|
4056
|
+
"temporalSupersessionIncludeInRecall": {
|
|
4057
|
+
"label": "Include Superseded Facts In Recall",
|
|
4058
|
+
"advanced": true,
|
|
4059
|
+
"help": "If enabled, superseded facts still surface in recall (audit/history mode)."
|
|
4060
|
+
},
|
|
4061
|
+
"recallDirectAnswerEnabled": {
|
|
4062
|
+
"label": "Direct-Answer Retrieval Tier",
|
|
4063
|
+
"help": "Route validated high-trust queries to a fast direct-answer path before QMD (issue #518)."
|
|
4064
|
+
},
|
|
4065
|
+
"recallDirectAnswerTokenOverlapFloor": {
|
|
4066
|
+
"label": "Direct-Answer Token Overlap Floor",
|
|
4067
|
+
"advanced": true,
|
|
4068
|
+
"placeholder": "0.55"
|
|
4069
|
+
},
|
|
4070
|
+
"recallDirectAnswerImportanceFloor": {
|
|
4071
|
+
"label": "Direct-Answer Importance Floor",
|
|
4072
|
+
"advanced": true,
|
|
4073
|
+
"placeholder": "0.7"
|
|
4074
|
+
},
|
|
4075
|
+
"recallDirectAnswerAmbiguityMargin": {
|
|
4076
|
+
"label": "Direct-Answer Ambiguity Margin",
|
|
4077
|
+
"advanced": true,
|
|
4078
|
+
"placeholder": "0.15"
|
|
4079
|
+
},
|
|
4080
|
+
"recallDirectAnswerEligibleTaxonomyBuckets": {
|
|
4081
|
+
"label": "Direct-Answer Eligible Taxonomy Buckets",
|
|
4082
|
+
"advanced": true,
|
|
4083
|
+
"help": "Taxonomy category IDs eligible for direct-answer routing."
|
|
4084
|
+
},
|
|
3149
4085
|
"memoryLinkingEnabled": {
|
|
3150
4086
|
"label": "Memory Linking",
|
|
3151
4087
|
"help": "Build knowledge graph by linking related memories"
|
|
@@ -3567,6 +4503,20 @@
|
|
|
3567
4503
|
"label": "Fact Deduplication",
|
|
3568
4504
|
"help": "Prevent storing semantically identical facts using content hashing"
|
|
3569
4505
|
},
|
|
4506
|
+
"semanticDedupEnabled": {
|
|
4507
|
+
"label": "Semantic Dedup (write-time)",
|
|
4508
|
+
"help": "Skip near-duplicate facts at write time by comparing embeddings to existing memories (issue #373)."
|
|
4509
|
+
},
|
|
4510
|
+
"semanticDedupThreshold": {
|
|
4511
|
+
"label": "Semantic Dedup Threshold",
|
|
4512
|
+
"advanced": true,
|
|
4513
|
+
"placeholder": "0.92"
|
|
4514
|
+
},
|
|
4515
|
+
"semanticDedupCandidates": {
|
|
4516
|
+
"label": "Semantic Dedup Candidates",
|
|
4517
|
+
"advanced": true,
|
|
4518
|
+
"placeholder": "5"
|
|
4519
|
+
},
|
|
3570
4520
|
"factArchivalEnabled": {
|
|
3571
4521
|
"label": "Fact Archival",
|
|
3572
4522
|
"help": "Automatically archive old, low-importance, rarely-accessed facts during consolidation"
|
|
@@ -3765,6 +4715,12 @@
|
|
|
3765
4715
|
"label": "Entity Summaries",
|
|
3766
4716
|
"help": "Generate LLM summaries for entities during consolidation"
|
|
3767
4717
|
},
|
|
4718
|
+
"entitySynthesisMaxTokens": {
|
|
4719
|
+
"label": "Entity Synthesis Max Tokens",
|
|
4720
|
+
"advanced": true,
|
|
4721
|
+
"placeholder": "500",
|
|
4722
|
+
"help": "Max tokens used when refreshing an entity synthesis from its timeline."
|
|
4723
|
+
},
|
|
3768
4724
|
"recallBudgetChars": {
|
|
3769
4725
|
"label": "Recall Budget (Chars)",
|
|
3770
4726
|
"advanced": true,
|
|
@@ -3774,6 +4730,23 @@
|
|
|
3774
4730
|
"label": "Recall Pipeline",
|
|
3775
4731
|
"advanced": true,
|
|
3776
4732
|
"help": "Ordered section configuration for recall assembly and per-section limits"
|
|
4733
|
+
},
|
|
4734
|
+
"recallMmrEnabled": {
|
|
4735
|
+
"label": "Recall MMR (Diversity)",
|
|
4736
|
+
"advanced": true,
|
|
4737
|
+
"help": "Apply Maximal Marginal Relevance per-section so duplicate clusters cannot dominate the recall budget"
|
|
4738
|
+
},
|
|
4739
|
+
"recallMmrLambda": {
|
|
4740
|
+
"label": "MMR Lambda",
|
|
4741
|
+
"advanced": true,
|
|
4742
|
+
"placeholder": "0.7",
|
|
4743
|
+
"help": "1.0 = pure relevance, 0.0 = pure diversity. Default 0.7."
|
|
4744
|
+
},
|
|
4745
|
+
"recallMmrTopN": {
|
|
4746
|
+
"label": "MMR Top-N",
|
|
4747
|
+
"advanced": true,
|
|
4748
|
+
"placeholder": "40",
|
|
4749
|
+
"help": "Number of top candidates per section over which MMR is applied"
|
|
3777
4750
|
}
|
|
3778
4751
|
}
|
|
3779
4752
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@joshuaswarren/openclaw-engram",
|
|
3
|
-
"version": "9.3.
|
|
3
|
+
"version": "9.3.5",
|
|
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",
|
|
@@ -30,16 +30,9 @@
|
|
|
30
30
|
"./dist/index.js"
|
|
31
31
|
]
|
|
32
32
|
},
|
|
33
|
-
"scripts": {
|
|
34
|
-
"build": "node ./scripts/sync-openclaw-plugin.mjs && tsup --config tsup.config.ts",
|
|
35
|
-
"check-types": "tsc --noEmit",
|
|
36
|
-
"postinstall": "node ./scripts/postinstall-banner.mjs",
|
|
37
|
-
"prepack": "npm run build",
|
|
38
|
-
"prepublishOnly": "npm run build"
|
|
39
|
-
},
|
|
40
33
|
"dependencies": {
|
|
41
|
-
"@remnic/
|
|
42
|
-
"@remnic/
|
|
34
|
+
"@remnic/plugin-openclaw": "^1.0.6",
|
|
35
|
+
"@remnic/core": "^1.0.3"
|
|
43
36
|
},
|
|
44
37
|
"peerDependencies": {
|
|
45
38
|
"openclaw": ">=2026.4.8"
|
|
@@ -61,5 +54,10 @@
|
|
|
61
54
|
"memory",
|
|
62
55
|
"compatibility",
|
|
63
56
|
"shim"
|
|
64
|
-
]
|
|
65
|
-
|
|
57
|
+
],
|
|
58
|
+
"scripts": {
|
|
59
|
+
"build": "node ./scripts/sync-openclaw-plugin.mjs && tsup --config tsup.config.ts",
|
|
60
|
+
"check-types": "tsc --noEmit",
|
|
61
|
+
"postinstall": "node ./scripts/postinstall-banner.mjs"
|
|
62
|
+
}
|
|
63
|
+
}
|