@remnic/plugin-openclaw 9.3.672 → 9.3.674

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
@@ -124,7 +124,7 @@ This plugin hooks into the OpenClaw gateway lifecycle:
124
124
  - **`session_start`** / **`session_end`** -- session lifecycle tracking
125
125
  - **`before_tool_call`** / **`after_tool_call`** -- tool usage observation for analytics
126
126
  - **`llm_output`** -- LLM token usage tracking
127
- - **`subagent_spawning`** / **`subagent_ended`** -- subagent lifecycle observation
127
+ - **`subagent_spawned`** / **`subagent_ended`** -- subagent lifecycle observation (replaced the deprecated `subagent_spawning` hook in issue #1550; core handles thread-bound subagent bindings)
128
128
  - **Tools** -- registers `memory_search`, `memory_get`, `memory_stats`, and other agent tools
129
129
  - **Commands** -- provides CLI commands for memory management
130
130
 
@@ -441,7 +441,7 @@ and can optionally persist JSONL recall transcripts under
441
441
  |---------|--------|-------|
442
442
  | `before_tool_call` / `after_tool_call` | Supported | 2026.3.22 |
443
443
  | `llm_output` (token tracking) | Supported | 2026.3.22 |
444
- | `subagent_spawning` / `subagent_ended` | Supported | 2026.3.22 |
444
+ | `subagent_spawned` / `subagent_ended` | Supported (replaced `subagent_spawning`) | 2026.3.22 |
445
445
 
446
446
  ### Dreaming
447
447
 
package/dist/index.js CHANGED
@@ -5364,6 +5364,7 @@ function hasEnabledLiveConnectorConfig(config) {
5364
5364
  var ENGRAM_MIGRATION_PROMISE = "__openclawEngramMigrationPromise";
5365
5365
  var CLI_REGISTERED_GUARD = "__openclawEngramCliRegistered";
5366
5366
  var SESSION_COMMANDS_REGISTERED_GUARD = "__openclawEngramSessionCommandsRegistered";
5367
+ var ACTIVE_RECALL_OVERLAP_WARNED = "__openclawEngramActiveRecallOverlapWarned";
5367
5368
  var CLI_ACTIVE_SERVICE_COUNT = "__openclawEngramCliActiveServiceCount";
5368
5369
  var SECRET_REF_RESOLVER_TEST_KEY = "__openclawEngramSecretRefResolverForTest";
5369
5370
  var NODE_FS_MODULE_ID = ["node", "fs"].join(":");
@@ -5656,7 +5657,11 @@ function loadPluginEntryFromFile(pluginId) {
5656
5657
  }
5657
5658
  }
5658
5659
  function loadPluginConfigFromFile(pluginId) {
5659
- return loadPluginEntryFromFile(pluginId)?.config;
5660
+ const entry = loadPluginEntryFromFile(pluginId);
5661
+ const cfg = entry?.config;
5662
+ if (cfg === null || cfg === void 0) return void 0;
5663
+ if (typeof cfg !== "object" || Array.isArray(cfg)) return void 0;
5664
+ return cfg;
5660
5665
  }
5661
5666
  function loadRawConfigFromFile() {
5662
5667
  try {
@@ -6066,14 +6071,30 @@ var pluginDefinition = {
6066
6071
  }
6067
6072
  const fileConfig = loadPluginConfigFromFile(serviceId);
6068
6073
  const openclawFlushPlanProcessingEnabled = resolveOpenClawFlushPlanProcessingEnabledFromConfig(fileConfig, api.pluginConfig);
6069
- const cfg = (0, config_exports.parseConfig)({
6070
- ...fileConfig,
6071
- // File-backed fallback for runtimes that omit pluginConfig
6072
- ...api.pluginConfig,
6073
- // Runtime/plugin-supplied config must win
6074
- gatewayConfig: api.config
6075
- // Pass gateway config for fallback AI
6076
- });
6074
+ const runtimeSet = /* @__PURE__ */ new Set();
6075
+ const cfg = (0, config_exports.parseConfig)(
6076
+ {
6077
+ ...fileConfig,
6078
+ // File-backed fallback for runtimes that omit pluginConfig
6079
+ ...api.pluginConfig,
6080
+ // Runtime/plugin-supplied config must win
6081
+ gatewayConfig: api.config
6082
+ // Pass gateway config for fallback AI
6083
+ },
6084
+ // `rawOperatorConfig` distinguishes "operator wrote this key in
6085
+ // openclaw.json" from "OpenClaw materialized a schema default into
6086
+ // api.pluginConfig" — the resolvers use it to keep the sticky-legacy
6087
+ // `emitLegacyTools` default reachable on upgraded installs where no
6088
+ // operator override exists (#1550, Cursor Bugbot PR #1593).
6089
+ //
6090
+ // When `fileConfig` is missing entirely (no openclaw.json on disk),
6091
+ // pass \`{}\` rather than undefined so the resolver treats the
6092
+ // absence the same as "file layer present but authored nothing" —
6093
+ // i.e. fall through to env / sticky-legacy instead of trusting a
6094
+ // materialized schema default (Cursor Bugbot PR #1593 round 3).
6095
+ fileConfig ?? {},
6096
+ runtimeSet
6097
+ );
6077
6098
  cfg.providerApiKeyResolver = resolveOpenClawProviderCredential;
6078
6099
  cfg.runtimeAuthForModelResolver = getOpenClawRuntimeAuthForModel;
6079
6100
  (0, logger_exports.initLogger)(api.logger, cfg.debug);
@@ -7444,6 +7465,12 @@ Keep the reflection grounded in the evidence below.
7444
7465
  }
7445
7466
  let memoryPromptBuilder;
7446
7467
  if (useMemoryPromptSection && api.registerMemoryPromptSection) {
7468
+ if (cfg.activeRecallEnabled && !globalThis[ACTIVE_RECALL_OVERLAP_WARNED]) {
7469
+ globalThis[ACTIVE_RECALL_OVERLAP_WARNED] = true;
7470
+ logger_exports.log.warn(
7471
+ "activeRecallEnabled=true while memory-slot prompt injection is active (registerMemoryPromptSection). Prompt injection does NOT require active recall; this runs a second blocking retrieval per turn. Disable activeRecallEnabled unless the secondary pre-reply summary block is intentional (issue #1550)."
7472
+ );
7473
+ }
7447
7474
  api.on(
7448
7475
  "before_prompt_build",
7449
7476
  async (event, ctx) => {
@@ -8343,10 +8370,10 @@ Keep the reflection grounded in the evidence below.
8343
8370
  }
8344
8371
  );
8345
8372
  api.on(
8346
- "subagent_spawning",
8373
+ "subagent_spawned",
8347
8374
  async (event, _ctx) => {
8348
8375
  logger_exports.log.debug(
8349
- `subagent_spawning: ${event.subagentId ?? "?"} purpose=${event.purpose ?? "?"}`
8376
+ `subagent_spawned: ${event.subagentId ?? "?"} purpose=${event.purpose ?? "?"} parent=${event.parentSessionKey ?? "?"}`
8350
8377
  );
8351
8378
  }
8352
8379
  );
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "id": "openclaw-remnic",
3
3
  "name": "Remnic OpenClaw Plugin",
4
- "version": "9.3.672",
4
+ "version": "9.3.674",
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": {
@@ -1171,12 +1171,12 @@
1171
1171
  "respectBundledActiveMemoryToggle": {
1172
1172
  "type": "boolean",
1173
1173
  "default": true,
1174
- "description": "Honor the bundled active-memory session toggle file when resolving Remnic recall toggles."
1174
+ "description": "Compat-only (issue #1550): honor the bundled active-memory session toggle file when resolving Remnic recall toggles. Modern OpenClaw memory-slot mode + registerMemoryPromptSection is the primary prompt-injection path; this knob only matters when explicitly chaining Remnic active recall into the bundled `active-memory` plugin."
1175
1175
  },
1176
1176
  "activeRecallEnabled": {
1177
1177
  "type": "boolean",
1178
1178
  "default": false,
1179
- "description": "Enable the OpenClaw active-recall context surface."
1179
+ "description": "Compat-only (issue #1550): enables the Remnic-native active-recall pre-reply summary block. NOT required for OpenClaw prompt injection — when Remnic is the memory slot, prompt injection runs through registerMemoryPromptSection / memory capability promptBuilder. Enable only to layer a second blocking pre-reply retrieval; a startup warning is logged when both this and memory-slot prompt injection are on."
1180
1180
  },
1181
1181
  "activeRecallAgents": {
1182
1182
  "type": "array",
@@ -1343,7 +1343,7 @@
1343
1343
  "activeRecallAllowChainedActiveMemory": {
1344
1344
  "type": "boolean",
1345
1345
  "default": false,
1346
- "description": "Allow active recall to chain into the bundled active-memory surface."
1346
+ "description": "Compat-only (issue #1550): allow the Remnic active-recall block to chain into the bundled active-memory surface. Redundant in modern OpenClaw memory-slot mode; only set true when intentionally layering Remnic + bundled active-memory for the same agent."
1347
1347
  },
1348
1348
  "codex": {
1349
1349
  "type": "object",
@@ -1602,8 +1602,8 @@
1602
1602
  },
1603
1603
  "emitLegacyTools": {
1604
1604
  "type": "boolean",
1605
- "default": true,
1606
- "description": "Advertise legacy engram_* / engram.* MCP tool aliases alongside the canonical remnic_* names (issue #1427). Default true for backward compatibility. Set false to halve the advertised tools/list surface (only remnic_* names); tools remain callable under both names. Also settable via REMNIC_EMIT_LEGACY_TOOLS."
1605
+ "default": false,
1606
+ "description": "Advertise legacy engram_* / engram.* MCP tool aliases alongside the canonical remnic_* names. Issue #1550: defaults to false on fresh installs (halving the advertised tools/list surface); when existing legacy connector entries are present on disk the default stays true so upgrades never silently break a configured legacy client. An explicit value always wins."
1607
1607
  },
1608
1608
  "citationsEnabled": {
1609
1609
  "type": "boolean",
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnic/plugin-openclaw",
3
- "version": "9.3.672",
3
+ "version": "9.3.674",
4
4
  "description": "OpenClaw adapter for Remnic memory with bundled @remnic/core runtime",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -72,7 +72,7 @@
72
72
  "dependencies": {
73
73
  "@sinclair/typebox": "^0.34.0",
74
74
  "openai": "^6.0.0",
75
- "@remnic/core": "^9.3.672"
75
+ "@remnic/core": "^9.3.674"
76
76
  },
77
77
  "peerDependencies": {
78
78
  "openclaw": ">=2026.4.1 || 2026.4.7-1 || 2026.4.9-beta.1 || 2026.4.11-beta.1 || 2026.4.12-beta.1 || 2026.4.14-beta.1 || 2026.4.15-beta.1 || 2026.4.15-beta.2 || 2026.4.19-beta.1 || 2026.4.19-beta.2 || 2026.4.20-beta.1 || 2026.4.20-beta.2 || 2026.4.22-beta.1 || 2026.4.23-beta.1 || 2026.4.23-beta.2 || 2026.4.23-beta.3 || 2026.4.23-beta.4 || 2026.4.23-beta.5 || 2026.4.23-beta.6 || 2026.4.24-beta.1 || 2026.4.24-beta.2 || 2026.4.24-beta.3 || 2026.4.24-beta.4 || 2026.4.24-beta.5 || 2026.4.24-beta.6 || 2026.4.25-beta.1 || 2026.4.25-beta.2 || 2026.4.25-beta.3 || 2026.4.25-beta.4 || 2026.4.25-beta.5 || 2026.4.25-beta.6 || 2026.4.25-beta.7 || 2026.4.25-beta.8 || 2026.4.25-beta.9 || 2026.4.25-beta.10 || 2026.4.25-beta.11 || 2026.4.26-beta.1 || 2026.4.27-beta.1 || 2026.4.29-beta.1 || 2026.4.29-beta.2 || 2026.4.29-beta.3 || 2026.4.29-beta.4 || 2026.4.30-beta.1 || 2026.5.2-beta.1 || 2026.5.2-beta.2 || 2026.5.2-beta.3 || 2026.5.3-beta.1 || 2026.5.3-beta.2 || 2026.5.3-beta.3 || 2026.5.3-beta.4 || 2026.5.3-1 || 2026.5.4-beta.1 || 2026.5.4-beta.2 || 2026.5.4-beta.3 || 2026.5.5-beta.1 || 2026.5.5-beta.2 || 2026.5.6-beta.1 || 2026.5.7-beta.1 || 2026.5.9-beta.1 || 2026.5.10-beta.1 || 2026.5.10-beta.2 || 2026.5.10-beta.3 || 2026.5.10-beta.4 || 2026.5.10-beta.5 || 2026.5.10-beta.6 || 2026.5.12-beta.1 || 2026.5.12-beta.2 || 2026.5.12-beta.3 || 2026.5.12-beta.4 || 2026.5.12-beta.5 || 2026.5.12-beta.6 || 2026.5.12-beta.7 || 2026.5.12-beta.8 || 2026.5.14-beta.1 || 2026.5.14-beta.2 || 2026.5.16-beta.1 || 2026.5.16-beta.2 || 2026.5.16-beta.3 || 2026.5.16-beta.4 || 2026.5.16-beta.5 || 2026.5.16-beta.6 || 2026.5.16-beta.7 || 2026.5.18-beta.1 || 2026.5.19-alpha.1 || 2026.5.19-beta.1 || 2026.5.19-beta.2 || 2026.5.20-beta.1 || 2026.5.20-beta.2 || 2026.5.21-alpha.1 || 2026.5.21-beta.1 || 2026.5.22-beta.1 || 2026.5.23-alpha.1 || 2026.5.24-alpha.1 || 2026.5.24-beta.1 || 2026.5.24-beta.2 || 2026.5.25-alpha.1 || 2026.5.25-alpha.2 || 2026.5.25-beta.1 || 2026.5.26-beta.1 || 2026.5.26-beta.2 || 2026.5.27-alpha.1 || 2026.5.27-beta.1 || 2026.5.28-alpha.1 || 2026.5.28-beta.1 || 2026.5.28-beta.2 || 2026.5.28-beta.3 || 2026.5.28-beta.4 || 2026.5.29-alpha.1 || 2026.5.30-beta.1 || 2026.5.30-beta.2 || 2026.5.31-alpha.1 || 2026.5.31-beta.1 || 2026.5.31-beta.2 || 2026.5.31-beta.3 || 2026.5.31-beta.4 || 2026.6.1-alpha.1 || 2026.6.1-alpha.2 || 2026.6.1-alpha.3 || 2026.6.1-beta.1 || 2026.6.1-beta.2 || 2026.6.1-beta.3 || 2026.6.2-alpha.1 || 2026.6.2-alpha.2 || 2026.6.2-beta.1 || 2026.6.3-alpha.1 || 2026.6.4-alpha.1 || 2026.6.5-alpha.1 || 2026.6.5-alpha.2 || 2026.6.5-beta.1 || 2026.6.5-beta.2 || 2026.6.5-beta.3 || 2026.6.5-beta.5 || 2026.6.5-beta.6 || 2026.6.6-alpha.1 || 2026.6.6-beta.2 || 2026.6.6 || 2026.6.7-beta.1 || 2026.6.8-beta.1 || 2026.6.8-beta.2 || 2026.6.9-beta.1 || 2026.6.10-beta.1 || 2026.6.10-beta.2 || 2026.6.11-beta.1"
@@ -82,7 +82,7 @@
82
82
  "acorn": "^8.16.0",
83
83
  "tsup": "^8.5.1",
84
84
  "typescript": "^5.9.3",
85
- "@remnic/core": "^9.3.672"
85
+ "@remnic/core": "^9.3.674"
86
86
  },
87
87
  "license": "MIT",
88
88
  "repository": {