@joshuaswarren/openclaw-engram 9.3.2 → 9.3.4
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/README.md +28 -0
- package/bin/engram-access.js +10 -1
- package/dist/index.js +7 -2
- package/openclaw.plugin.json +810 -9
- 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/README.md
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
# @joshuaswarren/openclaw-engram
|
|
2
|
+
|
|
3
|
+
> **Engram has been renamed to Remnic.** This package is a compatibility shim that re-exports [`@remnic/plugin-openclaw`](https://www.npmjs.com/package/@remnic/plugin-openclaw).
|
|
4
|
+
|
|
5
|
+
## Migrate
|
|
6
|
+
|
|
7
|
+
Replace this package with the canonical one:
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
openclaw plugins install @remnic/plugin-openclaw --pin
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
Your existing memories, configuration, and settings will continue to work. The rename only changes the package name -- all functionality is preserved.
|
|
14
|
+
|
|
15
|
+
For full migration details, see the [Rename Guide](https://github.com/joshuaswarren/remnic/blob/main/docs/RENAME.md).
|
|
16
|
+
|
|
17
|
+
## What is Remnic?
|
|
18
|
+
|
|
19
|
+
Remnic is persistent, private memory for AI agents. Your agents forget everything between sessions -- Remnic fixes that. All data stays on your machine as plain markdown files.
|
|
20
|
+
|
|
21
|
+
- **Repository**: [github.com/joshuaswarren/remnic](https://github.com/joshuaswarren/remnic)
|
|
22
|
+
- **Core package**: [`@remnic/core`](https://www.npmjs.com/package/@remnic/core)
|
|
23
|
+
- **OpenClaw plugin**: [`@remnic/plugin-openclaw`](https://www.npmjs.com/package/@remnic/plugin-openclaw)
|
|
24
|
+
- **Standalone CLI**: [`@remnic/cli`](https://www.npmjs.com/package/@remnic/cli)
|
|
25
|
+
|
|
26
|
+
## License
|
|
27
|
+
|
|
28
|
+
MIT
|
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,555 @@
|
|
|
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
|
+
"slotBehavior": {
|
|
322
|
+
"type": "object",
|
|
323
|
+
"additionalProperties": false,
|
|
324
|
+
"default": {},
|
|
325
|
+
"properties": {
|
|
326
|
+
"requireExclusiveMemorySlot": {
|
|
327
|
+
"type": "boolean",
|
|
328
|
+
"default": true
|
|
329
|
+
},
|
|
330
|
+
"onSlotMismatch": {
|
|
331
|
+
"type": "string",
|
|
332
|
+
"enum": [
|
|
333
|
+
"error",
|
|
334
|
+
"warn",
|
|
335
|
+
"silent"
|
|
336
|
+
],
|
|
337
|
+
"default": "error"
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
},
|
|
341
|
+
"beforeResetTimeoutMs": {
|
|
342
|
+
"type": "integer",
|
|
343
|
+
"minimum": 100,
|
|
344
|
+
"maximum": 30000,
|
|
345
|
+
"default": 2000,
|
|
346
|
+
"description": "Maximum time to wait for a reset-triggered flush before returning control to OpenClaw."
|
|
347
|
+
},
|
|
348
|
+
"flushOnResetEnabled": {
|
|
349
|
+
"type": "boolean",
|
|
350
|
+
"default": true,
|
|
351
|
+
"description": "Flush buffered turns through extraction when OpenClaw resets a session."
|
|
352
|
+
},
|
|
353
|
+
"commandsListEnabled": {
|
|
354
|
+
"type": "boolean",
|
|
355
|
+
"default": true,
|
|
356
|
+
"description": "Advertise Remnic slash-command descriptors through the commands.list runtime surface."
|
|
357
|
+
},
|
|
358
|
+
"openclawToolsEnabled": {
|
|
359
|
+
"type": "boolean",
|
|
360
|
+
"default": true,
|
|
361
|
+
"description": "Register the OpenClaw memory.search and memory.get tool adapters."
|
|
362
|
+
},
|
|
363
|
+
"openclawToolSnippetMaxChars": {
|
|
364
|
+
"type": "integer",
|
|
365
|
+
"minimum": 80,
|
|
366
|
+
"maximum": 4000,
|
|
367
|
+
"default": 600,
|
|
368
|
+
"description": "Maximum snippet size returned by the OpenClaw memory tool adapters."
|
|
369
|
+
},
|
|
370
|
+
"sessionTogglesEnabled": {
|
|
371
|
+
"type": "boolean",
|
|
372
|
+
"default": true,
|
|
373
|
+
"description": "Enable per-session recall toggle state for OpenClaw runtime surfaces."
|
|
374
|
+
},
|
|
375
|
+
"verboseRecallVisibility": {
|
|
376
|
+
"type": "boolean",
|
|
377
|
+
"default": true,
|
|
378
|
+
"description": "Allow verbose recall headers to surface runtime recall diagnostics in prompts."
|
|
379
|
+
},
|
|
380
|
+
"recallTranscriptsEnabled": {
|
|
381
|
+
"type": "boolean",
|
|
382
|
+
"default": false,
|
|
383
|
+
"description": "Write JSONL recall audit transcripts for runtime-surface injections."
|
|
384
|
+
},
|
|
385
|
+
"recallTranscriptRetentionDays": {
|
|
386
|
+
"type": "integer",
|
|
387
|
+
"minimum": 1,
|
|
388
|
+
"maximum": 365,
|
|
389
|
+
"default": 30,
|
|
390
|
+
"description": "Days of runtime recall audit transcripts to retain before pruning."
|
|
391
|
+
},
|
|
392
|
+
"respectBundledActiveMemoryToggle": {
|
|
393
|
+
"type": "boolean",
|
|
394
|
+
"default": true,
|
|
395
|
+
"description": "Honor the bundled active-memory session toggle file when resolving Remnic recall toggles."
|
|
396
|
+
},
|
|
397
|
+
"activeRecallEnabled": {
|
|
398
|
+
"type": "boolean",
|
|
399
|
+
"default": false,
|
|
400
|
+
"description": "Enable the OpenClaw active-recall prompt surface."
|
|
401
|
+
},
|
|
402
|
+
"activeRecallAgents": {
|
|
403
|
+
"type": "array",
|
|
404
|
+
"items": {
|
|
405
|
+
"type": "string"
|
|
406
|
+
},
|
|
407
|
+
"description": "Optional allowlist of OpenClaw agent ids that may use active recall."
|
|
408
|
+
},
|
|
409
|
+
"activeRecallAllowedChatTypes": {
|
|
410
|
+
"type": "array",
|
|
411
|
+
"items": {
|
|
412
|
+
"type": "string",
|
|
413
|
+
"enum": [
|
|
414
|
+
"direct",
|
|
415
|
+
"group",
|
|
416
|
+
"channel"
|
|
417
|
+
]
|
|
418
|
+
},
|
|
419
|
+
"default": [
|
|
420
|
+
"direct",
|
|
421
|
+
"group",
|
|
422
|
+
"channel"
|
|
423
|
+
],
|
|
424
|
+
"description": "OpenClaw chat types eligible for active recall."
|
|
425
|
+
},
|
|
426
|
+
"activeRecallQueryMode": {
|
|
427
|
+
"type": "string",
|
|
428
|
+
"enum": [
|
|
429
|
+
"recent",
|
|
430
|
+
"message",
|
|
431
|
+
"full"
|
|
432
|
+
],
|
|
433
|
+
"default": "recent",
|
|
434
|
+
"description": "How much recent OpenClaw conversation context is fed into the active-recall query builder."
|
|
435
|
+
},
|
|
436
|
+
"activeRecallPromptStyle": {
|
|
437
|
+
"type": "string",
|
|
438
|
+
"enum": [
|
|
439
|
+
"balanced",
|
|
440
|
+
"strict",
|
|
441
|
+
"contextual",
|
|
442
|
+
"recall-heavy",
|
|
443
|
+
"precision-heavy",
|
|
444
|
+
"preference-only"
|
|
445
|
+
],
|
|
446
|
+
"default": "balanced",
|
|
447
|
+
"description": "Prompt assembly style for the active-recall surface."
|
|
448
|
+
},
|
|
449
|
+
"activeRecallPromptOverride": {
|
|
450
|
+
"type": "string",
|
|
451
|
+
"description": "Optional full prompt override for the active-recall surface."
|
|
452
|
+
},
|
|
453
|
+
"activeRecallPromptAppend": {
|
|
454
|
+
"type": "string",
|
|
455
|
+
"description": "Optional prompt suffix appended to the active-recall system prompt."
|
|
456
|
+
},
|
|
457
|
+
"activeRecallMaxSummaryChars": {
|
|
458
|
+
"type": "integer",
|
|
459
|
+
"minimum": 40,
|
|
460
|
+
"maximum": 1000,
|
|
461
|
+
"default": 220,
|
|
462
|
+
"description": "Maximum summary size produced by the active-recall surface."
|
|
463
|
+
},
|
|
464
|
+
"activeRecallRecentUserTurns": {
|
|
465
|
+
"type": "integer",
|
|
466
|
+
"minimum": 0,
|
|
467
|
+
"maximum": 4,
|
|
468
|
+
"default": 2,
|
|
469
|
+
"description": "How many recent user turns to include in the active-recall query context."
|
|
470
|
+
},
|
|
471
|
+
"activeRecallRecentAssistantTurns": {
|
|
472
|
+
"type": "integer",
|
|
473
|
+
"minimum": 0,
|
|
474
|
+
"maximum": 3,
|
|
475
|
+
"default": 1,
|
|
476
|
+
"description": "How many recent assistant turns to include in the active-recall query context."
|
|
477
|
+
},
|
|
478
|
+
"activeRecallRecentUserChars": {
|
|
479
|
+
"type": "integer",
|
|
480
|
+
"minimum": 40,
|
|
481
|
+
"maximum": 1000,
|
|
482
|
+
"default": 600,
|
|
483
|
+
"description": "Per-user-turn character cap for active-recall context assembly."
|
|
484
|
+
},
|
|
485
|
+
"activeRecallRecentAssistantChars": {
|
|
486
|
+
"type": "integer",
|
|
487
|
+
"minimum": 40,
|
|
488
|
+
"maximum": 1000,
|
|
489
|
+
"default": 400,
|
|
490
|
+
"description": "Per-assistant-turn character cap for active-recall context assembly."
|
|
491
|
+
},
|
|
492
|
+
"activeRecallThinking": {
|
|
493
|
+
"type": "string",
|
|
494
|
+
"enum": [
|
|
495
|
+
"off",
|
|
496
|
+
"minimal",
|
|
497
|
+
"low",
|
|
498
|
+
"medium",
|
|
499
|
+
"high",
|
|
500
|
+
"xhigh",
|
|
501
|
+
"adaptive"
|
|
502
|
+
],
|
|
503
|
+
"default": "low",
|
|
504
|
+
"description": "Reasoning effort used by the active-recall engine."
|
|
505
|
+
},
|
|
506
|
+
"activeRecallTimeoutMs": {
|
|
507
|
+
"type": "integer",
|
|
508
|
+
"minimum": 250,
|
|
509
|
+
"default": 15000,
|
|
510
|
+
"description": "Timeout for an active-recall run."
|
|
511
|
+
},
|
|
512
|
+
"activeRecallCacheTtlMs": {
|
|
513
|
+
"type": "integer",
|
|
514
|
+
"minimum": 0,
|
|
515
|
+
"maximum": 120000,
|
|
516
|
+
"default": 15000,
|
|
517
|
+
"description": "Cache TTL for active-recall summaries; 0 disables the cache."
|
|
518
|
+
},
|
|
519
|
+
"activeRecallModel": {
|
|
520
|
+
"type": "string",
|
|
521
|
+
"description": "Optional model override for active recall."
|
|
522
|
+
},
|
|
523
|
+
"activeRecallModelFallbackPolicy": {
|
|
524
|
+
"type": "string",
|
|
525
|
+
"enum": [
|
|
526
|
+
"default-remote",
|
|
527
|
+
"resolved-only"
|
|
528
|
+
],
|
|
529
|
+
"default": "default-remote",
|
|
530
|
+
"description": "How active recall falls back when an explicit model cannot be resolved."
|
|
531
|
+
},
|
|
532
|
+
"activeRecallPersistTranscripts": {
|
|
533
|
+
"type": "boolean",
|
|
534
|
+
"default": false,
|
|
535
|
+
"description": "Persist full active-recall request and response transcripts."
|
|
536
|
+
},
|
|
537
|
+
"activeRecallTranscriptDir": {
|
|
538
|
+
"type": "string",
|
|
539
|
+
"default": "active-recall",
|
|
540
|
+
"description": "Memory-relative directory for active-recall transcripts."
|
|
541
|
+
},
|
|
542
|
+
"activeRecallEntityGraphDepth": {
|
|
543
|
+
"type": "integer",
|
|
544
|
+
"minimum": 0,
|
|
545
|
+
"maximum": 3,
|
|
546
|
+
"default": 1,
|
|
547
|
+
"description": "Entity-graph traversal depth used by active recall."
|
|
548
|
+
},
|
|
549
|
+
"activeRecallIncludeCausalTrajectories": {
|
|
550
|
+
"type": "boolean",
|
|
551
|
+
"default": false,
|
|
552
|
+
"description": "Include causal trajectory recall evidence in active-recall summaries."
|
|
553
|
+
},
|
|
554
|
+
"activeRecallIncludeDaySummary": {
|
|
555
|
+
"type": "boolean",
|
|
556
|
+
"default": false,
|
|
557
|
+
"description": "Include the latest day summary in active-recall context."
|
|
558
|
+
},
|
|
559
|
+
"activeRecallAttachRecallExplain": {
|
|
560
|
+
"type": "boolean",
|
|
561
|
+
"default": false,
|
|
562
|
+
"description": "Attach recall explain output to active-recall diagnostics."
|
|
563
|
+
},
|
|
564
|
+
"activeRecallAllowChainedActiveMemory": {
|
|
565
|
+
"type": "boolean",
|
|
566
|
+
"default": false,
|
|
567
|
+
"description": "Allow active recall to chain into the bundled active-memory surface."
|
|
568
|
+
},
|
|
569
|
+
"codex": {
|
|
570
|
+
"type": "object",
|
|
571
|
+
"additionalProperties": false,
|
|
572
|
+
"default": {},
|
|
573
|
+
"properties": {
|
|
574
|
+
"installExtension": {
|
|
575
|
+
"type": "boolean",
|
|
576
|
+
"default": true,
|
|
577
|
+
"description": "Install the Remnic Codex memory extension during Codex connector setup."
|
|
578
|
+
},
|
|
579
|
+
"codexHome": {
|
|
580
|
+
"type": [
|
|
581
|
+
"string",
|
|
582
|
+
"null"
|
|
583
|
+
],
|
|
584
|
+
"default": null,
|
|
585
|
+
"description": "Optional Codex home directory override used for connector install and materialization."
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
},
|
|
589
|
+
"codexMaterializeMemories": {
|
|
590
|
+
"type": "boolean",
|
|
591
|
+
"default": true,
|
|
592
|
+
"description": "Enable Codex native memory materialization into the Codex memories directory."
|
|
593
|
+
},
|
|
594
|
+
"codexMaterializeNamespace": {
|
|
595
|
+
"type": "string",
|
|
596
|
+
"default": "auto",
|
|
597
|
+
"description": "Namespace to materialize for Codex. \"auto\" derives the namespace from the active connector context."
|
|
598
|
+
},
|
|
599
|
+
"codexMaterializeMaxSummaryTokens": {
|
|
600
|
+
"type": "number",
|
|
601
|
+
"minimum": 0,
|
|
602
|
+
"default": 4500,
|
|
603
|
+
"description": "Whitespace-token cap for Codex memory summary materialization."
|
|
604
|
+
},
|
|
605
|
+
"codexMaterializeRolloutRetentionDays": {
|
|
606
|
+
"type": "number",
|
|
607
|
+
"minimum": 0,
|
|
608
|
+
"default": 30,
|
|
609
|
+
"description": "Retention window in days for Codex rollout materialization artifacts."
|
|
610
|
+
},
|
|
611
|
+
"codexMaterializeOnConsolidation": {
|
|
612
|
+
"type": "boolean",
|
|
613
|
+
"default": true,
|
|
614
|
+
"description": "Run Codex memory materialization after semantic or causal consolidation completes."
|
|
615
|
+
},
|
|
616
|
+
"codexMaterializeOnSessionEnd": {
|
|
617
|
+
"type": "boolean",
|
|
618
|
+
"default": true,
|
|
619
|
+
"description": "Run Codex memory materialization from the Codex session-end hook."
|
|
620
|
+
},
|
|
621
|
+
"codexMarketplaceEnabled": {
|
|
622
|
+
"type": "boolean",
|
|
623
|
+
"default": true,
|
|
624
|
+
"description": "Enable Codex marketplace integration for plugin discovery and installation."
|
|
625
|
+
},
|
|
626
|
+
"versioningEnabled": {
|
|
627
|
+
"type": "boolean",
|
|
628
|
+
"default": false,
|
|
629
|
+
"description": "Enable page-level versioning with sidecar snapshots."
|
|
630
|
+
},
|
|
631
|
+
"versioningMaxPerPage": {
|
|
632
|
+
"type": "integer",
|
|
633
|
+
"default": 50,
|
|
634
|
+
"minimum": 0,
|
|
635
|
+
"description": "Maximum number of version snapshots per page. Set to 0 to disable pruning."
|
|
636
|
+
},
|
|
637
|
+
"versioningSidecarDir": {
|
|
638
|
+
"type": "string",
|
|
639
|
+
"default": ".versions",
|
|
640
|
+
"description": "Name of the sidecar directory inside memoryDir for version snapshots."
|
|
641
|
+
},
|
|
642
|
+
"taxonomyEnabled": {
|
|
643
|
+
"type": "boolean",
|
|
644
|
+
"default": false,
|
|
645
|
+
"description": "Enable the MECE taxonomy knowledge directory for categorizing memories."
|
|
646
|
+
},
|
|
647
|
+
"taxonomyAutoGenResolver": {
|
|
648
|
+
"type": "boolean",
|
|
649
|
+
"default": true,
|
|
650
|
+
"description": "Auto-regenerate RESOLVER.md when the taxonomy changes."
|
|
651
|
+
},
|
|
652
|
+
"citationsEnabled": {
|
|
653
|
+
"type": "boolean",
|
|
654
|
+
"default": false,
|
|
655
|
+
"description": "Enable oai-mem-citation blocks in recall responses for Codex citation parity."
|
|
656
|
+
},
|
|
657
|
+
"citationsAutoDetect": {
|
|
658
|
+
"type": "boolean",
|
|
659
|
+
"default": true,
|
|
660
|
+
"description": "Auto-enable citations when the Codex adapter is detected."
|
|
661
|
+
},
|
|
662
|
+
"memoryExtensionsEnabled": {
|
|
663
|
+
"type": "boolean",
|
|
664
|
+
"default": true,
|
|
665
|
+
"description": "Whether third-party memory extensions are discovered and injected into consolidation prompts."
|
|
666
|
+
},
|
|
667
|
+
"memoryExtensionsRoot": {
|
|
668
|
+
"type": "string",
|
|
669
|
+
"default": "",
|
|
670
|
+
"description": "Root directory for memory extensions. Empty string derives from memoryDir (go up to Remnic home and append memory_extensions)."
|
|
671
|
+
},
|
|
672
|
+
"binaryLifecycleEnabled": {
|
|
673
|
+
"type": "boolean",
|
|
674
|
+
"default": false,
|
|
675
|
+
"description": "Enable binary file lifecycle management. When true, binary files in the memory directory are mirrored, redirected, and cleaned."
|
|
676
|
+
},
|
|
677
|
+
"binaryLifecycleGracePeriodDays": {
|
|
678
|
+
"type": "number",
|
|
679
|
+
"default": 7,
|
|
680
|
+
"minimum": 0,
|
|
681
|
+
"description": "Days to wait before cleaning local copies of mirrored binary files."
|
|
682
|
+
},
|
|
683
|
+
"binaryLifecycleBackendType": {
|
|
684
|
+
"type": "string",
|
|
685
|
+
"enum": [
|
|
686
|
+
"none",
|
|
687
|
+
"filesystem",
|
|
688
|
+
"s3"
|
|
689
|
+
],
|
|
690
|
+
"default": "none",
|
|
691
|
+
"description": "Storage backend for binary lifecycle mirror stage."
|
|
692
|
+
},
|
|
693
|
+
"binaryLifecycleBackendPath": {
|
|
694
|
+
"type": "string",
|
|
695
|
+
"default": "",
|
|
696
|
+
"description": "Base path for the filesystem storage backend."
|
|
697
|
+
},
|
|
698
|
+
"codexCompat": {
|
|
699
|
+
"type": "object",
|
|
700
|
+
"additionalProperties": false,
|
|
701
|
+
"default": {},
|
|
702
|
+
"properties": {
|
|
703
|
+
"enabled": {
|
|
704
|
+
"type": "boolean",
|
|
705
|
+
"default": false
|
|
706
|
+
},
|
|
707
|
+
"threadIdBufferKeying": {
|
|
708
|
+
"type": "boolean",
|
|
709
|
+
"default": true
|
|
710
|
+
},
|
|
711
|
+
"compactionFlushMode": {
|
|
712
|
+
"type": "string",
|
|
713
|
+
"enum": [
|
|
714
|
+
"signal",
|
|
715
|
+
"heuristic",
|
|
716
|
+
"auto"
|
|
717
|
+
],
|
|
718
|
+
"default": "auto"
|
|
719
|
+
},
|
|
720
|
+
"fingerprintDedup": {
|
|
721
|
+
"type": "boolean",
|
|
722
|
+
"default": true
|
|
723
|
+
}
|
|
724
|
+
}
|
|
725
|
+
},
|
|
168
726
|
"debug": {
|
|
169
727
|
"type": "boolean",
|
|
170
728
|
"default": false,
|
|
@@ -685,7 +1243,7 @@
|
|
|
685
1243
|
"recallPlannerShadowMode": {
|
|
686
1244
|
"type": "boolean",
|
|
687
1245
|
"default": false,
|
|
688
|
-
"description": "Run recall planner in shadow mode
|
|
1246
|
+
"description": "Run recall planner in shadow mode — evaluate but do not apply results."
|
|
689
1247
|
},
|
|
690
1248
|
"recallPlannerTelemetryEnabled": {
|
|
691
1249
|
"type": "boolean",
|
|
@@ -760,7 +1318,7 @@
|
|
|
760
1318
|
"boxTopicShiftThreshold": {
|
|
761
1319
|
"type": "number",
|
|
762
1320
|
"default": 0.35,
|
|
763
|
-
"description": "Jaccard overlap threshold below which a topic shift seals the current box (0
|
|
1321
|
+
"description": "Jaccard overlap threshold below which a topic shift seals the current box (0–1)."
|
|
764
1322
|
},
|
|
765
1323
|
"boxTimeGapMs": {
|
|
766
1324
|
"type": "number",
|
|
@@ -785,7 +1343,7 @@
|
|
|
785
1343
|
"traceWeaverOverlapThreshold": {
|
|
786
1344
|
"type": "number",
|
|
787
1345
|
"default": 0.4,
|
|
788
|
-
"description": "Minimum Jaccard topic overlap to assign the same traceId (0
|
|
1346
|
+
"description": "Minimum Jaccard topic overlap to assign the same traceId (0–1)."
|
|
789
1347
|
},
|
|
790
1348
|
"boxRecallDays": {
|
|
791
1349
|
"type": "number",
|
|
@@ -885,7 +1443,7 @@
|
|
|
885
1443
|
"graphRecallShadowEnabled": {
|
|
886
1444
|
"type": "boolean",
|
|
887
1445
|
"default": false,
|
|
888
|
-
"description": "Run graph recall in shadow mode
|
|
1446
|
+
"description": "Run graph recall in shadow mode — evaluate but do not inject results."
|
|
889
1447
|
},
|
|
890
1448
|
"graphRecallSnapshotEnabled": {
|
|
891
1449
|
"type": "boolean",
|
|
@@ -1239,6 +1797,53 @@
|
|
|
1239
1797
|
"default": 2,
|
|
1240
1798
|
"description": "Number of sentences to overlap between chunks"
|
|
1241
1799
|
},
|
|
1800
|
+
"semanticChunkingEnabled": {
|
|
1801
|
+
"type": "boolean",
|
|
1802
|
+
"default": false,
|
|
1803
|
+
"description": "Enable semantic chunking with embedding-based topic boundary detection (requires embedding provider)"
|
|
1804
|
+
},
|
|
1805
|
+
"semanticChunkingConfig": {
|
|
1806
|
+
"type": "object",
|
|
1807
|
+
"default": {},
|
|
1808
|
+
"description": "Optional overrides for the semantic chunking algorithm",
|
|
1809
|
+
"properties": {
|
|
1810
|
+
"targetTokens": {
|
|
1811
|
+
"type": "number",
|
|
1812
|
+
"default": 200,
|
|
1813
|
+
"description": "Target tokens per chunk"
|
|
1814
|
+
},
|
|
1815
|
+
"minTokens": {
|
|
1816
|
+
"type": "number",
|
|
1817
|
+
"default": 100,
|
|
1818
|
+
"description": "Minimum tokens for a segment before merging with neighbor"
|
|
1819
|
+
},
|
|
1820
|
+
"maxTokens": {
|
|
1821
|
+
"type": "number",
|
|
1822
|
+
"default": 400,
|
|
1823
|
+
"description": "Maximum tokens for a segment before recursive splitting"
|
|
1824
|
+
},
|
|
1825
|
+
"smoothingWindowSize": {
|
|
1826
|
+
"type": "number",
|
|
1827
|
+
"default": 3,
|
|
1828
|
+
"description": "Window size for the moving-average smoothing filter (auto-rounded to odd)"
|
|
1829
|
+
},
|
|
1830
|
+
"boundaryThresholdStdDevs": {
|
|
1831
|
+
"type": "number",
|
|
1832
|
+
"default": 1,
|
|
1833
|
+
"description": "Standard deviations below mean for boundary detection"
|
|
1834
|
+
},
|
|
1835
|
+
"embeddingBatchSize": {
|
|
1836
|
+
"type": "number",
|
|
1837
|
+
"default": 32,
|
|
1838
|
+
"description": "Batch size for embedding requests"
|
|
1839
|
+
},
|
|
1840
|
+
"fallbackToRecursive": {
|
|
1841
|
+
"type": "boolean",
|
|
1842
|
+
"default": true,
|
|
1843
|
+
"description": "Fall back to recursive chunking when embeddings are unavailable"
|
|
1844
|
+
}
|
|
1845
|
+
}
|
|
1846
|
+
},
|
|
1242
1847
|
"contradictionDetectionEnabled": {
|
|
1243
1848
|
"type": "boolean",
|
|
1244
1849
|
"default": false,
|
|
@@ -1259,6 +1864,16 @@
|
|
|
1259
1864
|
"default": true,
|
|
1260
1865
|
"description": "Automatically supersede contradicted memories"
|
|
1261
1866
|
},
|
|
1867
|
+
"temporalSupersessionEnabled": {
|
|
1868
|
+
"type": "boolean",
|
|
1869
|
+
"default": true,
|
|
1870
|
+
"description": "Mark older facts superseded when a new fact writes a conflicting value for the same entityRef + structuredAttribute key (issue #375)"
|
|
1871
|
+
},
|
|
1872
|
+
"temporalSupersessionIncludeInRecall": {
|
|
1873
|
+
"type": "boolean",
|
|
1874
|
+
"default": false,
|
|
1875
|
+
"description": "If true, include temporally-superseded facts in recall results (for audit/history). Default: exclude."
|
|
1876
|
+
},
|
|
1262
1877
|
"memoryLinkingEnabled": {
|
|
1263
1878
|
"type": "boolean",
|
|
1264
1879
|
"default": false,
|
|
@@ -1403,7 +2018,10 @@
|
|
|
1403
2018
|
},
|
|
1404
2019
|
"modelSource": {
|
|
1405
2020
|
"type": "string",
|
|
1406
|
-
"enum": [
|
|
2021
|
+
"enum": [
|
|
2022
|
+
"plugin",
|
|
2023
|
+
"gateway"
|
|
2024
|
+
],
|
|
1407
2025
|
"default": "plugin",
|
|
1408
2026
|
"description": "LLM source: 'plugin' uses Engram's own openai/localLlm config; 'gateway' delegates to a gateway agent's model chain (agents.list[])."
|
|
1409
2027
|
},
|
|
@@ -1483,7 +2101,7 @@
|
|
|
1483
2101
|
"traceRecallContent": {
|
|
1484
2102
|
"type": "boolean",
|
|
1485
2103
|
"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
|
|
2104
|
+
"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
2105
|
},
|
|
1488
2106
|
"profilingEnabled": {
|
|
1489
2107
|
"type": "boolean",
|
|
@@ -1515,6 +2133,49 @@
|
|
|
1515
2133
|
"default": 40,
|
|
1516
2134
|
"description": "Minimum combined user/assistant characters required before extraction runs."
|
|
1517
2135
|
},
|
|
2136
|
+
"extractionMinImportanceLevel": {
|
|
2137
|
+
"type": "string",
|
|
2138
|
+
"enum": [
|
|
2139
|
+
"trivial",
|
|
2140
|
+
"low",
|
|
2141
|
+
"normal",
|
|
2142
|
+
"high",
|
|
2143
|
+
"critical"
|
|
2144
|
+
],
|
|
2145
|
+
"default": "low",
|
|
2146
|
+
"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."
|
|
2147
|
+
},
|
|
2148
|
+
"extractionJudgeEnabled": {
|
|
2149
|
+
"type": "boolean",
|
|
2150
|
+
"default": false,
|
|
2151
|
+
"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)."
|
|
2152
|
+
},
|
|
2153
|
+
"extractionJudgeModel": {
|
|
2154
|
+
"type": "string",
|
|
2155
|
+
"default": "",
|
|
2156
|
+
"description": "Model override for the extraction judge LLM. Empty string uses the configured local model."
|
|
2157
|
+
},
|
|
2158
|
+
"extractionJudgeBatchSize": {
|
|
2159
|
+
"type": "number",
|
|
2160
|
+
"default": 20,
|
|
2161
|
+
"minimum": 1,
|
|
2162
|
+
"description": "Maximum number of candidate facts sent to the judge LLM in a single batch call."
|
|
2163
|
+
},
|
|
2164
|
+
"extractionJudgeShadow": {
|
|
2165
|
+
"type": "boolean",
|
|
2166
|
+
"default": false,
|
|
2167
|
+
"description": "Shadow mode for the extraction judge. When true, judge verdicts are logged but all facts are still persisted regardless of the verdict."
|
|
2168
|
+
},
|
|
2169
|
+
"inlineSourceAttributionEnabled": {
|
|
2170
|
+
"type": "boolean",
|
|
2171
|
+
"default": false,
|
|
2172
|
+
"description": "Enable inline source attribution markers on persisted facts for downstream provenance tracking."
|
|
2173
|
+
},
|
|
2174
|
+
"inlineSourceAttributionFormat": {
|
|
2175
|
+
"type": "string",
|
|
2176
|
+
"default": "[Source: agent={agent}, session={sessionId}, ts={ts}]",
|
|
2177
|
+
"description": "Template used when inline source attribution is enabled."
|
|
2178
|
+
},
|
|
1518
2179
|
"extractionMinUserTurns": {
|
|
1519
2180
|
"type": "number",
|
|
1520
2181
|
"default": 1,
|
|
@@ -1894,8 +2555,13 @@
|
|
|
1894
2555
|
},
|
|
1895
2556
|
"semanticConsolidationExcludeCategories": {
|
|
1896
2557
|
"type": "array",
|
|
1897
|
-
"items": {
|
|
1898
|
-
|
|
2558
|
+
"items": {
|
|
2559
|
+
"type": "string"
|
|
2560
|
+
},
|
|
2561
|
+
"default": [
|
|
2562
|
+
"correction",
|
|
2563
|
+
"commitment"
|
|
2564
|
+
],
|
|
1899
2565
|
"description": "Memory categories excluded from semantic consolidation."
|
|
1900
2566
|
},
|
|
1901
2567
|
"semanticConsolidationIntervalHours": {
|
|
@@ -2260,6 +2926,24 @@
|
|
|
2260
2926
|
"default": true,
|
|
2261
2927
|
"description": "Enable content-hash deduplication to prevent storing semantically identical facts."
|
|
2262
2928
|
},
|
|
2929
|
+
"semanticDedupEnabled": {
|
|
2930
|
+
"type": "boolean",
|
|
2931
|
+
"default": true,
|
|
2932
|
+
"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."
|
|
2933
|
+
},
|
|
2934
|
+
"semanticDedupThreshold": {
|
|
2935
|
+
"type": "number",
|
|
2936
|
+
"default": 0.92,
|
|
2937
|
+
"minimum": 0,
|
|
2938
|
+
"maximum": 1,
|
|
2939
|
+
"description": "Cosine similarity threshold in [0, 1]. Candidate facts whose nearest neighbor scores at or above this value are treated as duplicates and skipped."
|
|
2940
|
+
},
|
|
2941
|
+
"semanticDedupCandidates": {
|
|
2942
|
+
"type": "number",
|
|
2943
|
+
"default": 5,
|
|
2944
|
+
"minimum": 0,
|
|
2945
|
+
"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)."
|
|
2946
|
+
},
|
|
2263
2947
|
"factArchivalEnabled": {
|
|
2264
2948
|
"type": "boolean",
|
|
2265
2949
|
"default": false,
|
|
@@ -2615,6 +3299,20 @@
|
|
|
2615
3299
|
"default": true,
|
|
2616
3300
|
"description": "Generate LLM summaries for entities during consolidation"
|
|
2617
3301
|
},
|
|
3302
|
+
"entitySynthesisMaxTokens": {
|
|
3303
|
+
"anyOf": [
|
|
3304
|
+
{
|
|
3305
|
+
"type": "integer",
|
|
3306
|
+
"const": 0
|
|
3307
|
+
},
|
|
3308
|
+
{
|
|
3309
|
+
"type": "integer",
|
|
3310
|
+
"minimum": 10
|
|
3311
|
+
}
|
|
3312
|
+
],
|
|
3313
|
+
"default": 500,
|
|
3314
|
+
"description": "Max tokens used when refreshing an entity synthesis from its timeline."
|
|
3315
|
+
},
|
|
2618
3316
|
"recallBudgetChars": {
|
|
2619
3317
|
"type": "number",
|
|
2620
3318
|
"description": "Hard character cap for total recall injection. Defaults to maxMemoryTokens * 4."
|
|
@@ -2634,6 +3332,24 @@
|
|
|
2634
3332
|
"default": 25000,
|
|
2635
3333
|
"description": "Default deadline in ms recorded for enrichment recall sections."
|
|
2636
3334
|
},
|
|
3335
|
+
"recallMmrEnabled": {
|
|
3336
|
+
"type": "boolean",
|
|
3337
|
+
"default": true,
|
|
3338
|
+
"description": "Apply Maximal Marginal Relevance to the final recall selection per-section so one redundant cluster cannot dominate the injected context."
|
|
3339
|
+
},
|
|
3340
|
+
"recallMmrLambda": {
|
|
3341
|
+
"type": "number",
|
|
3342
|
+
"default": 0.7,
|
|
3343
|
+
"minimum": 0,
|
|
3344
|
+
"maximum": 1,
|
|
3345
|
+
"description": "MMR lambda parameter. 1.0 = pure relevance, 0.0 = pure diversity. Default 0.7 tilts toward relevance with meaningful diversity."
|
|
3346
|
+
},
|
|
3347
|
+
"recallMmrTopN": {
|
|
3348
|
+
"type": "number",
|
|
3349
|
+
"default": 40,
|
|
3350
|
+
"minimum": 0,
|
|
3351
|
+
"description": "Number of top candidates per section to run MMR over. Candidates past this remain in original order."
|
|
3352
|
+
},
|
|
2637
3353
|
"recallPipeline": {
|
|
2638
3354
|
"type": "array",
|
|
2639
3355
|
"description": "Ordered recall sections with per-section budgets and feature knobs.",
|
|
@@ -2860,7 +3576,7 @@
|
|
|
2860
3576
|
"parallelAgentWeights": {
|
|
2861
3577
|
"type": "object",
|
|
2862
3578
|
"default": {
|
|
2863
|
-
"direct": 1
|
|
3579
|
+
"direct": 1,
|
|
2864
3580
|
"contextual": 0.7,
|
|
2865
3581
|
"temporal": 0.85
|
|
2866
3582
|
},
|
|
@@ -2870,6 +3586,36 @@
|
|
|
2870
3586
|
"type": "number",
|
|
2871
3587
|
"default": 20,
|
|
2872
3588
|
"description": "Maximum results fetched per agent before merge."
|
|
3589
|
+
},
|
|
3590
|
+
"briefing": {
|
|
3591
|
+
"type": "object",
|
|
3592
|
+
"default": {
|
|
3593
|
+
"enabled": true,
|
|
3594
|
+
"defaultWindow": "yesterday",
|
|
3595
|
+
"defaultFormat": "markdown",
|
|
3596
|
+
"maxFollowups": 5,
|
|
3597
|
+
"calendarSource": null,
|
|
3598
|
+
"saveByDefault": false,
|
|
3599
|
+
"saveDir": null,
|
|
3600
|
+
"llmFollowups": true
|
|
3601
|
+
},
|
|
3602
|
+
"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)."
|
|
3603
|
+
},
|
|
3604
|
+
"enrichmentEnabled": {
|
|
3605
|
+
"type": "boolean",
|
|
3606
|
+
"default": false,
|
|
3607
|
+
"description": "Enable the external enrichment pipeline (#365). When true, entities can be enriched via registered providers."
|
|
3608
|
+
},
|
|
3609
|
+
"enrichmentAutoOnCreate": {
|
|
3610
|
+
"type": "boolean",
|
|
3611
|
+
"default": false,
|
|
3612
|
+
"description": "Automatically enrich newly created entities when the enrichment pipeline is enabled."
|
|
3613
|
+
},
|
|
3614
|
+
"enrichmentMaxCandidatesPerEntity": {
|
|
3615
|
+
"type": "integer",
|
|
3616
|
+
"default": 20,
|
|
3617
|
+
"minimum": 0,
|
|
3618
|
+
"description": "Maximum enrichment candidates accepted per entity per run. Set to 0 to accept none."
|
|
2873
3619
|
}
|
|
2874
3620
|
}
|
|
2875
3621
|
},
|
|
@@ -3128,6 +3874,15 @@
|
|
|
3128
3874
|
"advanced": true,
|
|
3129
3875
|
"placeholder": "2"
|
|
3130
3876
|
},
|
|
3877
|
+
"semanticChunkingEnabled": {
|
|
3878
|
+
"label": "Semantic Chunking",
|
|
3879
|
+
"help": "Use embedding-based topic detection for more coherent chunks (requires chunking enabled)"
|
|
3880
|
+
},
|
|
3881
|
+
"semanticChunkingConfig": {
|
|
3882
|
+
"label": "Semantic Chunking Config",
|
|
3883
|
+
"advanced": true,
|
|
3884
|
+
"help": "Override defaults for semantic chunking algorithm parameters"
|
|
3885
|
+
},
|
|
3131
3886
|
"contradictionDetectionEnabled": {
|
|
3132
3887
|
"label": "Contradiction Detection",
|
|
3133
3888
|
"help": "Detect and resolve conflicting memories using LLM verification"
|
|
@@ -3146,6 +3901,15 @@
|
|
|
3146
3901
|
"label": "Auto-Resolve Contradictions",
|
|
3147
3902
|
"help": "Automatically supersede old memories when contradiction is confirmed"
|
|
3148
3903
|
},
|
|
3904
|
+
"temporalSupersessionEnabled": {
|
|
3905
|
+
"label": "Temporal Supersession",
|
|
3906
|
+
"help": "Mark older facts superseded when a newer fact writes a conflicting value for the same entityRef + structured attribute (issue #375)"
|
|
3907
|
+
},
|
|
3908
|
+
"temporalSupersessionIncludeInRecall": {
|
|
3909
|
+
"label": "Include Superseded Facts In Recall",
|
|
3910
|
+
"advanced": true,
|
|
3911
|
+
"help": "If enabled, superseded facts still surface in recall (audit/history mode)."
|
|
3912
|
+
},
|
|
3149
3913
|
"memoryLinkingEnabled": {
|
|
3150
3914
|
"label": "Memory Linking",
|
|
3151
3915
|
"help": "Build knowledge graph by linking related memories"
|
|
@@ -3567,6 +4331,20 @@
|
|
|
3567
4331
|
"label": "Fact Deduplication",
|
|
3568
4332
|
"help": "Prevent storing semantically identical facts using content hashing"
|
|
3569
4333
|
},
|
|
4334
|
+
"semanticDedupEnabled": {
|
|
4335
|
+
"label": "Semantic Dedup (write-time)",
|
|
4336
|
+
"help": "Skip near-duplicate facts at write time by comparing embeddings to existing memories (issue #373)."
|
|
4337
|
+
},
|
|
4338
|
+
"semanticDedupThreshold": {
|
|
4339
|
+
"label": "Semantic Dedup Threshold",
|
|
4340
|
+
"advanced": true,
|
|
4341
|
+
"placeholder": "0.92"
|
|
4342
|
+
},
|
|
4343
|
+
"semanticDedupCandidates": {
|
|
4344
|
+
"label": "Semantic Dedup Candidates",
|
|
4345
|
+
"advanced": true,
|
|
4346
|
+
"placeholder": "5"
|
|
4347
|
+
},
|
|
3570
4348
|
"factArchivalEnabled": {
|
|
3571
4349
|
"label": "Fact Archival",
|
|
3572
4350
|
"help": "Automatically archive old, low-importance, rarely-accessed facts during consolidation"
|
|
@@ -3765,6 +4543,12 @@
|
|
|
3765
4543
|
"label": "Entity Summaries",
|
|
3766
4544
|
"help": "Generate LLM summaries for entities during consolidation"
|
|
3767
4545
|
},
|
|
4546
|
+
"entitySynthesisMaxTokens": {
|
|
4547
|
+
"label": "Entity Synthesis Max Tokens",
|
|
4548
|
+
"advanced": true,
|
|
4549
|
+
"placeholder": "500",
|
|
4550
|
+
"help": "Max tokens used when refreshing an entity synthesis from its timeline."
|
|
4551
|
+
},
|
|
3768
4552
|
"recallBudgetChars": {
|
|
3769
4553
|
"label": "Recall Budget (Chars)",
|
|
3770
4554
|
"advanced": true,
|
|
@@ -3774,6 +4558,23 @@
|
|
|
3774
4558
|
"label": "Recall Pipeline",
|
|
3775
4559
|
"advanced": true,
|
|
3776
4560
|
"help": "Ordered section configuration for recall assembly and per-section limits"
|
|
4561
|
+
},
|
|
4562
|
+
"recallMmrEnabled": {
|
|
4563
|
+
"label": "Recall MMR (Diversity)",
|
|
4564
|
+
"advanced": true,
|
|
4565
|
+
"help": "Apply Maximal Marginal Relevance per-section so duplicate clusters cannot dominate the recall budget"
|
|
4566
|
+
},
|
|
4567
|
+
"recallMmrLambda": {
|
|
4568
|
+
"label": "MMR Lambda",
|
|
4569
|
+
"advanced": true,
|
|
4570
|
+
"placeholder": "0.7",
|
|
4571
|
+
"help": "1.0 = pure relevance, 0.0 = pure diversity. Default 0.7."
|
|
4572
|
+
},
|
|
4573
|
+
"recallMmrTopN": {
|
|
4574
|
+
"label": "MMR Top-N",
|
|
4575
|
+
"advanced": true,
|
|
4576
|
+
"placeholder": "40",
|
|
4577
|
+
"help": "Number of top candidates per section over which MMR is applied"
|
|
3777
4578
|
}
|
|
3778
4579
|
}
|
|
3779
4580
|
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@joshuaswarren/openclaw-engram",
|
|
3
|
-
"version": "9.3.
|
|
3
|
+
"version": "9.3.4",
|
|
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/core": "
|
|
42
|
-
"@remnic/plugin-openclaw": "
|
|
34
|
+
"@remnic/core": "^1.0.2",
|
|
35
|
+
"@remnic/plugin-openclaw": "^1.0.5"
|
|
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
|
+
}
|