@joshuaswarren/openclaw-engram 9.3.20 → 9.3.22

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/README.md CHANGED
@@ -16,7 +16,7 @@ For full migration details, see the [Rename Guide](https://github.com/joshuaswar
16
16
 
17
17
  ## What is Remnic?
18
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.
19
+ Remnic is open-source memory and context for user-aware agents. It helps agents understand preferences, projects, constraints, decisions, patterns, and definitions of good while keeping memory inspectable as plain markdown files.
20
20
 
21
21
  - **Repository**: [github.com/joshuaswarren/remnic](https://github.com/joshuaswarren/remnic)
22
22
  - **Core package**: [`@remnic/core`](https://www.npmjs.com/package/@remnic/core)
@@ -7,12 +7,19 @@
7
7
  // store during migration when both blocks exist with no plugins.slots.memory
8
8
  // override (#403). The id is hardcoded (not imported from @remnic/core)
9
9
  // because the shim *is* the legacy alias — the string is its identity.
10
- import("../dist/access-cli.js")
11
- .then(({ runCli }) =>
12
- runCli(process.argv.slice(2), { preferredId: "openclaw-engram" }),
13
- )
14
- .catch((error) => {
15
- const message = error instanceof Error ? error.message : "unknown load error";
16
- console.error(`access-cli failed to load dist/access-cli.js: ${message}`);
17
- process.exit(1);
18
- });
10
+ let accessCli;
11
+ try {
12
+ accessCli = await import("../dist/access-cli.js");
13
+ } catch (error) {
14
+ const message = error instanceof Error ? error.message : "unknown load error";
15
+ console.error(`access-cli failed to load dist/access-cli.js: ${message}`);
16
+ process.exit(1);
17
+ }
18
+
19
+ try {
20
+ await accessCli.runCli(process.argv.slice(2), { preferredId: "openclaw-engram" });
21
+ } catch (error) {
22
+ const message = error instanceof Error ? error.message : "unknown error";
23
+ console.error(`engram-access failed: ${message}`);
24
+ process.exit(1);
25
+ }
@@ -1,21 +1,10 @@
1
1
  {
2
2
  "id": "openclaw-engram",
3
3
  "name": "Remnic OpenClaw Plugin",
4
- "version": "9.3.20",
4
+ "version": "9.3.22",
5
5
  "kind": "memory",
6
6
  "description": "Local semantic memory for OpenClaw with bundled Remnic core runtime. Requires plugins.slots.memory set to this plugin id for hooks to fire.",
7
7
  "setup": {
8
- "providers": [
9
- {
10
- "id": "openai",
11
- "authMethods": [
12
- "api-key"
13
- ],
14
- "envVars": [
15
- "OPENAI_API_KEY"
16
- ]
17
- }
18
- ],
19
8
  "requiresRuntime": false
20
9
  },
21
10
  "providerAuthEnvVars": {
@@ -126,7 +115,14 @@
126
115
  "additionalProperties": false,
127
116
  "properties": {
128
117
  "openaiApiKey": {
129
- "type": "string",
118
+ "anyOf": [
119
+ {
120
+ "type": "string"
121
+ },
122
+ {
123
+ "const": false
124
+ }
125
+ ],
130
126
  "description": "Optional OpenAI API key for plugin mode (or set OPENAI_API_KEY env var). Ignored by default gateway-mode installs; in plugin mode, Remnic may send conversation and memory content to OpenAI or the configured OpenAI-compatible endpoint for extraction, consolidation, summarization, and embeddings."
131
127
  },
132
128
  "openaiBaseUrl": {
@@ -135,7 +131,7 @@
135
131
  },
136
132
  "model": {
137
133
  "type": "string",
138
- "default": "gpt-5.2",
134
+ "default": "gpt-5.5",
139
135
  "description": "OpenAI model for extraction/consolidation"
140
136
  },
141
137
  "reasoningEffort": {
@@ -719,7 +715,7 @@
719
715
  "commandsListEnabled": {
720
716
  "type": "boolean",
721
717
  "default": true,
722
- "description": "Advertise Remnic slash-command descriptors through the commands.list runtime surface."
718
+ "description": "Advertise Remnic slash-command descriptors through the registerCommand runtime surface."
723
719
  },
724
720
  "openclawToolsEnabled": {
725
721
  "type": "boolean",
@@ -1357,7 +1353,8 @@
1357
1353
  "description": "Include the most relevant open question in generated memory context"
1358
1354
  },
1359
1355
  "commitmentDecayDays": {
1360
- "type": "number",
1356
+ "type": "integer",
1357
+ "minimum": 1,
1361
1358
  "default": 90,
1362
1359
  "description": "Days before fulfilled/expired commitments are removed"
1363
1360
  },
@@ -1778,7 +1775,7 @@
1778
1775
  },
1779
1776
  "recallPlannerModel": {
1780
1777
  "type": "string",
1781
- "default": "gpt-5.2-mini",
1778
+ "default": "gpt-5.5",
1782
1779
  "description": "Model to use for the recall planner."
1783
1780
  },
1784
1781
  "recallPlannerTimeoutMs": {
@@ -2338,6 +2335,122 @@
2338
2335
  "minimum": 0,
2339
2336
  "description": "Maximum query-visible cues expanded by explicit cue recall."
2340
2337
  },
2338
+ "targetedFactRecallEnabled": {
2339
+ "type": "boolean",
2340
+ "default": false,
2341
+ "description": "Enable targeted fact evidence recall for direct answer questions."
2342
+ },
2343
+ "targetedFactRecallMaxChars": {
2344
+ "type": "integer",
2345
+ "default": 2400,
2346
+ "minimum": 0,
2347
+ "description": "Character budget for the targeted fact evidence recall section."
2348
+ },
2349
+ "targetedFactRecallMaxResults": {
2350
+ "type": "integer",
2351
+ "default": 48,
2352
+ "minimum": 0,
2353
+ "description": "Maximum recalled items for targeted fact evidence."
2354
+ },
2355
+ "targetedFactRecallScanWindowTurns": {
2356
+ "type": "integer",
2357
+ "default": 8,
2358
+ "minimum": 1,
2359
+ "description": "Recent-turn scan window for targeted fact evidence."
2360
+ },
2361
+ "targetedFactRecallScanWindowTokens": {
2362
+ "type": "integer",
2363
+ "default": 12000,
2364
+ "minimum": 1,
2365
+ "description": "Recent-token scan window for targeted fact evidence."
2366
+ },
2367
+ "focusedListRecallEnabled": {
2368
+ "type": "boolean",
2369
+ "default": false,
2370
+ "description": "Enable focused list evidence recall for count, relation, and recommendation questions."
2371
+ },
2372
+ "focusedListRecallMaxChars": {
2373
+ "type": "integer",
2374
+ "default": 2600,
2375
+ "minimum": 0,
2376
+ "description": "Character budget for the focused list evidence recall section."
2377
+ },
2378
+ "focusedListRecallMaxResults": {
2379
+ "type": "integer",
2380
+ "default": 40,
2381
+ "minimum": 0,
2382
+ "description": "Maximum recalled items for focused list evidence."
2383
+ },
2384
+ "focusedListRecallScanWindowTurns": {
2385
+ "type": "integer",
2386
+ "default": 64,
2387
+ "minimum": 1,
2388
+ "description": "Recent-turn scan window for focused list evidence."
2389
+ },
2390
+ "focusedListRecallScanWindowTokens": {
2391
+ "type": "integer",
2392
+ "default": 14000,
2393
+ "minimum": 1,
2394
+ "description": "Recent-token scan window for focused list evidence."
2395
+ },
2396
+ "responseGuidanceRecallEnabled": {
2397
+ "type": "boolean",
2398
+ "default": false,
2399
+ "description": "Enable response guidance recall for user answer-shape preferences."
2400
+ },
2401
+ "responseGuidanceRecallMaxChars": {
2402
+ "type": "integer",
2403
+ "default": 2400,
2404
+ "minimum": 0,
2405
+ "description": "Character budget for the response guidance recall section."
2406
+ },
2407
+ "responseGuidanceRecallMaxResults": {
2408
+ "type": "integer",
2409
+ "default": 48,
2410
+ "minimum": 0,
2411
+ "description": "Maximum recalled items for response guidance."
2412
+ },
2413
+ "responseGuidanceRecallScanWindowTurns": {
2414
+ "type": "integer",
2415
+ "default": 64,
2416
+ "minimum": 1,
2417
+ "description": "Recent-turn scan window for response guidance."
2418
+ },
2419
+ "responseGuidanceRecallScanWindowTokens": {
2420
+ "type": "integer",
2421
+ "default": 16000,
2422
+ "minimum": 1,
2423
+ "description": "Recent-token scan window for response guidance."
2424
+ },
2425
+ "eventOrderRecallEnabled": {
2426
+ "type": "boolean",
2427
+ "default": false,
2428
+ "description": "Enable event-order evidence recall for chronology questions."
2429
+ },
2430
+ "eventOrderRecallMaxChars": {
2431
+ "type": "integer",
2432
+ "default": 2400,
2433
+ "minimum": 0,
2434
+ "description": "Character budget for the event-order evidence recall section."
2435
+ },
2436
+ "eventOrderRecallMaxResults": {
2437
+ "type": "integer",
2438
+ "default": 24,
2439
+ "minimum": 0,
2440
+ "description": "Maximum recalled items for event-order evidence."
2441
+ },
2442
+ "eventOrderRecallScanWindowTurns": {
2443
+ "type": "integer",
2444
+ "default": 12,
2445
+ "minimum": 1,
2446
+ "description": "Recent-turn scan window for event-order evidence."
2447
+ },
2448
+ "eventOrderRecallScanWindowTokens": {
2449
+ "type": "integer",
2450
+ "default": 24000,
2451
+ "minimum": 1,
2452
+ "description": "Recent-token scan window for event-order evidence."
2453
+ },
2341
2454
  "queryExpansionEnabled": {
2342
2455
  "type": "boolean",
2343
2456
  "default": false,
@@ -3017,6 +3130,11 @@
3017
3130
  "default": "low",
3018
3131
  "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."
3019
3132
  },
3133
+ "extractionTelemetryPrefilterEnabled": {
3134
+ "type": "boolean",
3135
+ "default": true,
3136
+ "description": "Skip semantic durable-memory extraction for mechanical action/state telemetry transcripts that contain no durable-memory cue. Raw transcript storage and recall still run. Disable this if you intentionally want fact extraction from action logs."
3137
+ },
3020
3138
  "extractionScopeClassificationEnabled": {
3021
3139
  "type": "boolean",
3022
3140
  "default": true,
@@ -3269,7 +3387,7 @@
3269
3387
  "conversationIndexFaissModelId": {
3270
3388
  "type": "string",
3271
3389
  "default": "text-embedding-3-small",
3272
- "description": "Embedding model identifier passed to the FAISS sidecar. By default the sidecar aliases OpenAI embedding ids to a local sentence-transformers model when ENGRAM_FAISS_ENABLE_ST=1, and otherwise falls back to deterministic hash embeddings."
3390
+ "description": "Embedding model identifier passed to the FAISS sidecar. By default the sidecar aliases OpenAI embedding ids to a local sentence-transformers model when REMNIC_FAISS_ENABLE_ST=1 (or legacy ENGRAM_FAISS_ENABLE_ST=1), and otherwise falls back to deterministic hash embeddings."
3273
3391
  },
3274
3392
  "conversationIndexFaissIndexDir": {
3275
3393
  "type": "string",
@@ -4350,6 +4468,9 @@
4350
4468
  },
4351
4469
  "maxPatterns": {
4352
4470
  "type": "number"
4471
+ },
4472
+ "forceGeneric": {
4473
+ "type": "boolean"
4353
4474
  }
4354
4475
  },
4355
4476
  "required": [
@@ -4407,11 +4528,21 @@
4407
4528
  "default": 512,
4408
4529
  "description": "Max tokens for deterministic (non-LLM) summaries"
4409
4530
  },
4531
+ "lcmTelemetryPrefilterEnabled": {
4532
+ "type": "boolean",
4533
+ "default": true,
4534
+ "description": "Use deterministic LCM compression for mechanical action/state telemetry without durable-memory cues."
4535
+ },
4410
4536
  "lcmArchiveRetentionDays": {
4411
4537
  "type": "number",
4412
4538
  "default": 90,
4413
4539
  "description": "Days to retain archived LCM summaries"
4414
4540
  },
4541
+ "lcmObserveConcurrency": {
4542
+ "type": "number",
4543
+ "default": 1,
4544
+ "description": "Maximum independent LCM observe jobs to process concurrently."
4545
+ },
4415
4546
  "messagePartsEnabled": {
4416
4547
  "type": "boolean",
4417
4548
  "default": false,
@@ -4641,7 +4772,7 @@
4641
4772
  "model": {
4642
4773
  "label": "Extraction Model",
4643
4774
  "advanced": true,
4644
- "placeholder": "gpt-5.2"
4775
+ "placeholder": "gpt-5.5"
4645
4776
  },
4646
4777
  "reasoningEffort": {
4647
4778
  "label": "Reasoning Effort",
@@ -4813,7 +4944,8 @@
4813
4944
  "commitmentDecayDays": {
4814
4945
  "label": "Commitment Decay (days)",
4815
4946
  "advanced": true,
4816
- "placeholder": "90"
4947
+ "placeholder": "90",
4948
+ "help": "Positive integer days before fulfilled/expired commitments are removed."
4817
4949
  },
4818
4950
  "workspaceDir": {
4819
4951
  "label": "Workspace Directory",
@@ -5693,6 +5825,7 @@
5693
5825
  }
5694
5826
  ],
5695
5827
  "activation": {
5828
+ "onStartup": false,
5696
5829
  "onCommands": [
5697
5830
  "remnic"
5698
5831
  ],
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@joshuaswarren/openclaw-engram",
3
- "version": "9.3.20",
3
+ "version": "9.3.22",
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",
@@ -18,7 +18,8 @@
18
18
  "files": [
19
19
  "dist",
20
20
  "bin/engram-access.js",
21
- "openclaw.plugin.json"
21
+ "openclaw.plugin.json",
22
+ "scripts/postinstall-banner.mjs"
22
23
  ],
23
24
  "publishConfig": {
24
25
  "access": "public",
@@ -28,14 +29,30 @@
28
29
  "plugin": "./openclaw.plugin.json",
29
30
  "extensions": [
30
31
  "./dist/index.js"
31
- ]
32
+ ],
33
+ "runtimeExtensions": [
34
+ "./dist/index.js"
35
+ ],
36
+ "compat": {
37
+ "pluginApi": ">=2026.5.16-beta.1"
38
+ },
39
+ "build": {
40
+ "openclawVersion": "2026.5.19-beta.1",
41
+ "pluginSdkVersion": "2026.5.19-beta.1"
42
+ },
43
+ "install": {
44
+ "clawhubSpec": "clawhub:@remnic/plugin-openclaw",
45
+ "npmSpec": "@joshuaswarren/openclaw-engram",
46
+ "defaultChoice": "clawhub",
47
+ "minHostVersion": ">=2026.5.16-beta.1"
48
+ }
32
49
  },
33
50
  "dependencies": {
34
- "@remnic/core": "^1.1.11",
35
- "@remnic/plugin-openclaw": "^1.0.34"
51
+ "@remnic/plugin-openclaw": "^1.0.36",
52
+ "@remnic/core": "^1.1.12"
36
53
  },
37
54
  "peerDependencies": {
38
- "openclaw": ">=2026.4.8"
55
+ "openclaw": ">=2026.5.16-beta.1"
39
56
  },
40
57
  "devDependencies": {
41
58
  "tsup": "^8.5.1",
@@ -57,6 +74,7 @@
57
74
  ],
58
75
  "scripts": {
59
76
  "build": "node ./scripts/sync-openclaw-plugin.mjs && tsup --config tsup.config.ts",
77
+ "precheck-types": "node ../../scripts/ensure-bench-build-deps.mjs",
60
78
  "check-types": "tsc --noEmit",
61
79
  "postinstall": "node ./scripts/postinstall-banner.mjs"
62
80
  }
@@ -0,0 +1,19 @@
1
+ const lines = [
2
+ "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━",
3
+ " Engram is now Remnic",
4
+ "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━",
5
+ " Same product. New name. One-time auto-migration runs",
6
+ " on first use. Your memories, config, and tokens carry over.",
7
+ "",
8
+ " Why: namespace conflicts and a clearer identity for what",
9
+ " the product actually is — a Recall Engine for Memory",
10
+ " Networks powering Intelligent Collaboration across your",
11
+ " entire agent fleet.",
12
+ "",
13
+ " Next step: nothing. The plugin auto-migrates on first run.",
14
+ "",
15
+ " Learn more: https://remnic.ai/rename",
16
+ "━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━",
17
+ ];
18
+
19
+ process.stderr.write(`\n${lines.join("\n")}\n\n`);