@remnic/plugin-openclaw 9.3.612 → 9.3.614
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 +11 -5
- package/dist/index.js +86 -35
- package/openclaw.plugin.json +88 -5
- package/package.json +7 -7
package/README.md
CHANGED
|
@@ -43,14 +43,15 @@ launchctl kickstart -k gui/501/ai.openclaw.gateway
|
|
|
43
43
|
|
|
44
44
|
## Compatibility Policy
|
|
45
45
|
|
|
46
|
-
Remnic supports OpenClaw releases from at least the previous 60 days.
|
|
47
|
-
June
|
|
46
|
+
Remnic supports OpenClaw releases from at least the previous 60 days. As of
|
|
47
|
+
June 7, 2026, that means releases back to April 8, 2026.
|
|
48
48
|
The package metadata keeps the installer compatibility floor at the single
|
|
49
49
|
`>=2026.4.1` shape OpenClaw setup expects because that older floor is still
|
|
50
50
|
more permissive than the active 60-day requirement. The peer and plugin-API
|
|
51
51
|
compatibility ranges explicitly include reviewed prerelease hosts in that
|
|
52
|
-
window. The adapter separately records `2026.6.
|
|
53
|
-
reviewed OpenClaw source-tag target
|
|
52
|
+
window. The adapter separately records `2026.6.6-alpha.1` as the latest
|
|
53
|
+
reviewed OpenClaw source-tag target (plugin SDK surface verified against the
|
|
54
|
+
newest npm-published build, `2026.6.5-beta.2`).
|
|
54
55
|
|
|
55
56
|
When adding newer OpenClaw manifest surfaces, keep older-compatible metadata in
|
|
56
57
|
place for hosts inside that 60-day window unless an upstream breaking change is
|
|
@@ -179,7 +180,12 @@ CI jobs that provision OpenClaw should use
|
|
|
179
180
|
`npm run check:openclaw-sdk-surface:required` or pass
|
|
180
181
|
`-- --require --package-root <path>` so a missing SDK fails instead of skipping.
|
|
181
182
|
|
|
182
|
-
Last compatibility sweep: June
|
|
183
|
+
Last compatibility sweep: June 6, 2026 (issues #1338, #1348, #1387, #1412,
|
|
184
|
+
#1423, #1424), with a June 7, 2026 follow-up adding `openclaw@2026.6.5-beta.2`.
|
|
185
|
+
The latest reviewed npm build is `openclaw@2026.6.5-beta.2`; its
|
|
186
|
+
plugin SDK surface is additive-only versus the recorded snapshot (no removals),
|
|
187
|
+
so no Remnic adapter change was required — see `docs/plugins/openclaw.md` for
|
|
188
|
+
the full sweep notes. Earlier sweeps: the SDK surface check passed against
|
|
183
189
|
`openclaw@2026.5.3`, `openclaw@2026.5.3-1`, `openclaw@2026.5.4-beta.1`,
|
|
184
190
|
`openclaw@2026.5.4-beta.2`, `openclaw@2026.5.4-beta.3`,
|
|
185
191
|
`openclaw@2026.5.4`, `openclaw@2026.5.5`, `openclaw@2026.5.6`,
|
package/dist/index.js
CHANGED
|
@@ -2902,6 +2902,7 @@ Returns: Performance trace data with timing breakdown`,
|
|
|
2902
2902
|
import { registerLcmTools } from "@remnic/core/lcm/index";
|
|
2903
2903
|
import { estimateTokens as estimateLcmTokens } from "@remnic/core/lcm/archive";
|
|
2904
2904
|
import { registerCli } from "@remnic/core/cli";
|
|
2905
|
+
import { FallbackLlmClient, fallbackLlmRuntimeContextFromConfig } from "@remnic/core/fallback-llm";
|
|
2905
2906
|
|
|
2906
2907
|
// ../../src/objective-state.ts
|
|
2907
2908
|
var objective_state_exports = {};
|
|
@@ -2998,7 +2999,7 @@ function escapeRegExp(value) {
|
|
|
2998
2999
|
}
|
|
2999
3000
|
|
|
3000
3001
|
// src/public-artifacts.ts
|
|
3001
|
-
import {
|
|
3002
|
+
import { access, lstat, readdir, realpath, stat } from "fs/promises";
|
|
3002
3003
|
import path from "path";
|
|
3003
3004
|
var PUBLIC_DIRS = [
|
|
3004
3005
|
{ dir: "facts", kind: "fact", contentType: "markdown" },
|
|
@@ -3006,16 +3007,20 @@ var PUBLIC_DIRS = [
|
|
|
3006
3007
|
{ dir: "corrections", kind: "correction", contentType: "markdown" },
|
|
3007
3008
|
{ dir: "artifacts", kind: "artifact", contentType: "markdown" }
|
|
3008
3009
|
];
|
|
3009
|
-
var PUBLIC_FILES = [
|
|
3010
|
-
{ relativePath: "profile.md", kind: "memory-root", contentType: "markdown" }
|
|
3011
|
-
];
|
|
3010
|
+
var PUBLIC_FILES = [{ relativePath: "profile.md", kind: "memory-root", contentType: "markdown" }];
|
|
3012
3011
|
async function isContainedWithin(target, boundary) {
|
|
3012
|
+
return await resolveContainedPath(target, boundary) !== void 0;
|
|
3013
|
+
}
|
|
3014
|
+
async function resolveContainedPath(target, boundary) {
|
|
3013
3015
|
try {
|
|
3014
3016
|
const resolvedTarget = await realpath(target);
|
|
3015
3017
|
const resolvedBoundary = await realpath(boundary);
|
|
3016
|
-
|
|
3018
|
+
if (resolvedTarget === resolvedBoundary || resolvedTarget.startsWith(resolvedBoundary + path.sep)) {
|
|
3019
|
+
return resolvedTarget;
|
|
3020
|
+
}
|
|
3021
|
+
return void 0;
|
|
3017
3022
|
} catch {
|
|
3018
|
-
return
|
|
3023
|
+
return void 0;
|
|
3019
3024
|
}
|
|
3020
3025
|
}
|
|
3021
3026
|
async function listMarkdownFilesRecursive(rootDir, boundary, ancestorRealPaths) {
|
|
@@ -3059,7 +3064,10 @@ async function listMarkdownFilesRecursive(rootDir, boundary, ancestorRealPaths)
|
|
|
3059
3064
|
continue;
|
|
3060
3065
|
}
|
|
3061
3066
|
if (isFile && String(entry.name).endsWith(".md")) {
|
|
3062
|
-
|
|
3067
|
+
const resolvedFilePath = await resolveContainedPath(fullPath, boundaryDir);
|
|
3068
|
+
if (resolvedFilePath !== void 0) {
|
|
3069
|
+
files.push(resolvedFilePath);
|
|
3070
|
+
}
|
|
3063
3071
|
}
|
|
3064
3072
|
}
|
|
3065
3073
|
return files.sort((a, b) => a.localeCompare(b));
|
|
@@ -3075,6 +3083,12 @@ async function pathExists(inputPath) {
|
|
|
3075
3083
|
async function listRemnicPublicArtifacts(params) {
|
|
3076
3084
|
const { memoryDir, workspaceDir, agentIds } = params;
|
|
3077
3085
|
const artifacts = [];
|
|
3086
|
+
let resolvedMemoryDir;
|
|
3087
|
+
try {
|
|
3088
|
+
resolvedMemoryDir = await realpath(memoryDir);
|
|
3089
|
+
} catch {
|
|
3090
|
+
return [];
|
|
3091
|
+
}
|
|
3078
3092
|
for (const spec of PUBLIC_DIRS) {
|
|
3079
3093
|
const dirPath = path.join(memoryDir, spec.dir);
|
|
3080
3094
|
if (!await pathExists(dirPath)) continue;
|
|
@@ -3090,7 +3104,7 @@ async function listRemnicPublicArtifacts(params) {
|
|
|
3090
3104
|
}
|
|
3091
3105
|
const files = await listMarkdownFilesRecursive(dirPath, dirPath);
|
|
3092
3106
|
for (const absolutePath of files) {
|
|
3093
|
-
const relativePath = path.relative(
|
|
3107
|
+
const relativePath = path.relative(resolvedMemoryDir, absolutePath).replace(/\\/g, "/");
|
|
3094
3108
|
artifacts.push({
|
|
3095
3109
|
kind: spec.kind,
|
|
3096
3110
|
workspaceDir,
|
|
@@ -3104,20 +3118,16 @@ async function listRemnicPublicArtifacts(params) {
|
|
|
3104
3118
|
for (const spec of PUBLIC_FILES) {
|
|
3105
3119
|
const absolutePath = path.join(memoryDir, spec.relativePath);
|
|
3106
3120
|
if (!await pathExists(absolutePath)) continue;
|
|
3107
|
-
|
|
3121
|
+
const resolvedPath = await resolveContainedPath(absolutePath, memoryDir);
|
|
3122
|
+
if (resolvedPath === void 0) continue;
|
|
3108
3123
|
try {
|
|
3109
3124
|
const linkStat = await lstat(absolutePath);
|
|
3110
|
-
if (linkStat.isSymbolicLink())
|
|
3111
|
-
const resolvedPath = await realpath(absolutePath);
|
|
3112
|
-
const expectedParent = await realpath(memoryDir);
|
|
3113
|
-
if (path.dirname(resolvedPath) !== expectedParent) continue;
|
|
3114
|
-
if (path.basename(resolvedPath) !== path.basename(spec.relativePath)) continue;
|
|
3115
|
-
}
|
|
3125
|
+
if (linkStat.isSymbolicLink()) continue;
|
|
3116
3126
|
} catch {
|
|
3117
3127
|
continue;
|
|
3118
3128
|
}
|
|
3119
3129
|
try {
|
|
3120
|
-
const fileStat = await stat(
|
|
3130
|
+
const fileStat = await stat(resolvedPath);
|
|
3121
3131
|
if (!fileStat.isFile()) continue;
|
|
3122
3132
|
} catch {
|
|
3123
3133
|
continue;
|
|
@@ -3126,16 +3136,14 @@ async function listRemnicPublicArtifacts(params) {
|
|
|
3126
3136
|
kind: spec.kind,
|
|
3127
3137
|
workspaceDir,
|
|
3128
3138
|
relativePath: spec.relativePath,
|
|
3129
|
-
absolutePath,
|
|
3139
|
+
absolutePath: resolvedPath,
|
|
3130
3140
|
agentIds: [...agentIds],
|
|
3131
3141
|
contentType: spec.contentType
|
|
3132
3142
|
});
|
|
3133
3143
|
}
|
|
3134
3144
|
const deduped = /* @__PURE__ */ new Map();
|
|
3135
3145
|
for (const artifact of artifacts) {
|
|
3136
|
-
const key = [artifact.workspaceDir, artifact.relativePath, artifact.kind].join(
|
|
3137
|
-
String.fromCharCode(0)
|
|
3138
|
-
);
|
|
3146
|
+
const key = [artifact.workspaceDir, artifact.relativePath, artifact.kind].join(String.fromCharCode(0));
|
|
3139
3147
|
deduped.set(key, artifact);
|
|
3140
3148
|
}
|
|
3141
3149
|
return [...deduped.values()];
|
|
@@ -3224,6 +3232,22 @@ function buildMemorySearchTool(orchestrator, options = {}) {
|
|
|
3224
3232
|
}
|
|
3225
3233
|
|
|
3226
3234
|
// src/runtime-surfaces.ts
|
|
3235
|
+
import { gatewayTaskChainOptions } from "@remnic/core/fallback-llm";
|
|
3236
|
+
function resolveDreamNarrativeRoute(config, directClientAvailable) {
|
|
3237
|
+
if (config.modelSource === "gateway") {
|
|
3238
|
+
const narrativeModel = typeof config.dreaming.narrativeModel === "string" ? config.dreaming.narrativeModel.trim() : "";
|
|
3239
|
+
const hasExplicitModel = narrativeModel.length > 0;
|
|
3240
|
+
return {
|
|
3241
|
+
kind: "gateway",
|
|
3242
|
+
hasExplicitModel,
|
|
3243
|
+
options: {
|
|
3244
|
+
...gatewayTaskChainOptions(config),
|
|
3245
|
+
...hasExplicitModel ? { model: narrativeModel } : {}
|
|
3246
|
+
}
|
|
3247
|
+
};
|
|
3248
|
+
}
|
|
3249
|
+
return directClientAvailable ? { kind: "direct" } : { kind: "skip" };
|
|
3250
|
+
}
|
|
3227
3251
|
var DREAM_SURFACE_TYPE = "dream";
|
|
3228
3252
|
var HEARTBEAT_SURFACE_TYPE = "heartbeat";
|
|
3229
3253
|
var DREAM_ENTRY_ID_KEY = "remnicDreamEntryId";
|
|
@@ -4963,7 +4987,8 @@ var pluginDefinition = {
|
|
|
4963
4987
|
principal: cfg.agentAccessHttp.principal,
|
|
4964
4988
|
maxBodyBytes: cfg.agentAccessHttp.maxBodyBytes,
|
|
4965
4989
|
citationsEnabled: cfg.citationsEnabled,
|
|
4966
|
-
citationsAutoDetect: cfg.citationsAutoDetect
|
|
4990
|
+
citationsAutoDetect: cfg.citationsAutoDetect,
|
|
4991
|
+
emitLegacyTools: cfg.emitLegacyTools
|
|
4967
4992
|
});
|
|
4968
4993
|
globalThis[keys.ACCESS_HTTP_SERVER] = accessHttpServer;
|
|
4969
4994
|
const pluginStateDir = path3.join(cfg.memoryDir, "state", "plugins", serviceId);
|
|
@@ -5066,8 +5091,11 @@ var pluginDefinition = {
|
|
|
5066
5091
|
}
|
|
5067
5092
|
async function maybeAppendDreamFromConsolidation(observation) {
|
|
5068
5093
|
if (!cfg.dreaming.enabled) return;
|
|
5069
|
-
|
|
5070
|
-
|
|
5094
|
+
const route = resolveDreamNarrativeRoute(cfg, !!dreamNarrativeClient);
|
|
5095
|
+
if (route.kind === "skip") {
|
|
5096
|
+
logger_exports.log.debug(
|
|
5097
|
+
"dreaming narrative skipped: no LLM available (set openaiApiKey or use modelSource=gateway)"
|
|
5098
|
+
);
|
|
5071
5099
|
return;
|
|
5072
5100
|
}
|
|
5073
5101
|
const journalPath = resolveDreamJournalPath();
|
|
@@ -5079,23 +5107,46 @@ var pluginDefinition = {
|
|
|
5079
5107
|
});
|
|
5080
5108
|
if (!plan) return;
|
|
5081
5109
|
const styleInstruction = cfg.dreaming.narrativePromptStyle === "diary" ? "Write like a compact private diary entry." : cfg.dreaming.narrativePromptStyle === "analytical" ? "Write like an analytical retrospective with explicit patterns." : "Write like a reflective narrative that notices patterns and emotional tone.";
|
|
5082
|
-
|
|
5083
|
-
try {
|
|
5084
|
-
const response = await dreamNarrativeClient.responses.create({
|
|
5085
|
-
model: cfg.dreaming.narrativeModel ?? cfg.model,
|
|
5086
|
-
instructions: `You write short reflective dream-journal entries for an AI memory system. ${styleInstruction} Return exactly this structure:
|
|
5110
|
+
const instructions = `You write short reflective dream-journal entries for an AI memory system. ${styleInstruction} Return exactly this structure:
|
|
5087
5111
|
Title: <short title>
|
|
5088
5112
|
Tags: #tag #tag
|
|
5089
5113
|
Body:
|
|
5090
|
-
<2-4 concise paragraphs
|
|
5091
|
-
|
|
5114
|
+
<2-4 concise paragraphs>`;
|
|
5115
|
+
const input = `The last consolidation spanned ${plan.sessionLikeCount} session-like windows.
|
|
5092
5116
|
Keep the reflection grounded in the evidence below.
|
|
5093
5117
|
|
|
5094
|
-
` + plan.memoryContext.join("\n")
|
|
5095
|
-
|
|
5096
|
-
|
|
5097
|
-
|
|
5098
|
-
|
|
5118
|
+
` + plan.memoryContext.join("\n");
|
|
5119
|
+
let rawNarrative = "";
|
|
5120
|
+
try {
|
|
5121
|
+
if (route.kind === "gateway") {
|
|
5122
|
+
const llm = new FallbackLlmClient(
|
|
5123
|
+
cfg.gatewayConfig,
|
|
5124
|
+
fallbackLlmRuntimeContextFromConfig(cfg)
|
|
5125
|
+
);
|
|
5126
|
+
if (!route.hasExplicitModel && !llm.isAvailable(route.options)) {
|
|
5127
|
+
logger_exports.log.debug(
|
|
5128
|
+
"dreaming narrative skipped: no gateway model configured (set dreaming.narrativeModel or taskModelChain)"
|
|
5129
|
+
);
|
|
5130
|
+
return;
|
|
5131
|
+
}
|
|
5132
|
+
const response = await llm.chatCompletion(
|
|
5133
|
+
[
|
|
5134
|
+
{ role: "system", content: instructions },
|
|
5135
|
+
{ role: "user", content: input }
|
|
5136
|
+
],
|
|
5137
|
+
{ temperature: 0.4, maxTokens: 400, ...route.options }
|
|
5138
|
+
);
|
|
5139
|
+
rawNarrative = response?.content ?? "";
|
|
5140
|
+
} else {
|
|
5141
|
+
const response = await dreamNarrativeClient.responses.create({
|
|
5142
|
+
model: cfg.dreaming.narrativeModel ?? cfg.model,
|
|
5143
|
+
instructions,
|
|
5144
|
+
input,
|
|
5145
|
+
temperature: 0.4,
|
|
5146
|
+
max_output_tokens: 400
|
|
5147
|
+
});
|
|
5148
|
+
rawNarrative = typeof response.output_text === "string" ? response.output_text : JSON.stringify(response.output_text ?? "");
|
|
5149
|
+
}
|
|
5099
5150
|
} catch (error) {
|
|
5100
5151
|
logger_exports.log.warn(`dreaming narrative generation failed: ${String(error)}`);
|
|
5101
5152
|
return;
|
package/openclaw.plugin.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"id": "openclaw-remnic",
|
|
3
3
|
"name": "Remnic OpenClaw Plugin",
|
|
4
|
-
"version": "9.3.
|
|
4
|
+
"version": "9.3.614",
|
|
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": {
|
|
@@ -314,6 +314,32 @@
|
|
|
314
314
|
"default": true,
|
|
315
315
|
"description": "When false, ask supported QMD versions to skip the built-in rerank step"
|
|
316
316
|
},
|
|
317
|
+
"qmdSearchStrategy": {
|
|
318
|
+
"type": "string",
|
|
319
|
+
"enum": [
|
|
320
|
+
"hybrid",
|
|
321
|
+
"lex-vec",
|
|
322
|
+
"lex"
|
|
323
|
+
],
|
|
324
|
+
"default": "hybrid",
|
|
325
|
+
"description": "Daemon search plan. 'hybrid' (default) runs lex+vec+hyde for best recall; 'lex-vec' drops the expensive HyDE generate leg; 'lex' is BM25-only (fastest). Lower tiers trade recall for latency on CPU-only models. Default preserves existing behavior (issue #1335)."
|
|
326
|
+
},
|
|
327
|
+
"qmdSubprocessStrategy": {
|
|
328
|
+
"type": "string",
|
|
329
|
+
"enum": [
|
|
330
|
+
"query",
|
|
331
|
+
"search"
|
|
332
|
+
],
|
|
333
|
+
"default": "query",
|
|
334
|
+
"description": "Command for the QMD CLI subprocess fallback, used only when the daemon is unavailable. 'query' (default) keeps LLM query expansion + rerank; 'search' is BM25-only and faster on very large collections but loses expansion/rerank. Default preserves existing behavior (issue #1335)."
|
|
335
|
+
},
|
|
336
|
+
"qmdDaemonTimeoutMs": {
|
|
337
|
+
"type": "number",
|
|
338
|
+
"minimum": 1000,
|
|
339
|
+
"maximum": 120000,
|
|
340
|
+
"default": 8000,
|
|
341
|
+
"description": "Per-call timeout (ms) for QMD daemon searches. Default 8000; raise (e.g. 20000) to give CPU-only HyDE queries more headroom before the daemon call times out (issue #1335)."
|
|
342
|
+
},
|
|
317
343
|
"qmdIndexName": {
|
|
318
344
|
"type": "string",
|
|
319
345
|
"description": "Optional QMD named index forwarded as qmd --index <name> when supported. Leave unset during upgrades unless existing QMD data already lives in that named index."
|
|
@@ -485,7 +511,8 @@
|
|
|
485
511
|
},
|
|
486
512
|
"narrativeModel": {
|
|
487
513
|
"type": "string",
|
|
488
|
-
"default": ""
|
|
514
|
+
"default": "",
|
|
515
|
+
"description": "Model used to write dream-journal narratives. Under modelSource=plugin this must be an OpenAI model id used with the direct OpenAI key. Under modelSource=gateway it accepts a provider-qualified id (e.g. zai/glm-4.7-flash) routed through gateway providers — no direct OpenAI key required; leave empty to fall back to taskModelChain / the gateway default chain."
|
|
489
516
|
},
|
|
490
517
|
"narrativePromptStyle": {
|
|
491
518
|
"type": "string",
|
|
@@ -1288,6 +1315,11 @@
|
|
|
1288
1315
|
"default": true,
|
|
1289
1316
|
"description": "Auto-regenerate RESOLVER.md when the taxonomy changes."
|
|
1290
1317
|
},
|
|
1318
|
+
"emitLegacyTools": {
|
|
1319
|
+
"type": "boolean",
|
|
1320
|
+
"default": true,
|
|
1321
|
+
"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."
|
|
1322
|
+
},
|
|
1291
1323
|
"citationsEnabled": {
|
|
1292
1324
|
"type": "boolean",
|
|
1293
1325
|
"default": false,
|
|
@@ -1878,10 +1910,15 @@
|
|
|
1878
1910
|
"default": true,
|
|
1879
1911
|
"description": "Use lightweight retrieve-vs-think planning to avoid unnecessary recall work."
|
|
1880
1912
|
},
|
|
1913
|
+
"recallPlannerLlmEnabled": {
|
|
1914
|
+
"type": "boolean",
|
|
1915
|
+
"default": false,
|
|
1916
|
+
"description": "Opt in to LLM-based recall planning (issue #1367). When false, recall mode is decided by the regex heuristic. When true, the configured recallPlannerModel classifies recall intent via the gateway/fallback LLM chain (provider-agnostic) and falls back to the heuristic on timeout/error. Requires recallPlannerEnabled."
|
|
1917
|
+
},
|
|
1881
1918
|
"recallPlannerModel": {
|
|
1882
1919
|
"type": "string",
|
|
1883
1920
|
"default": "gpt-5.5",
|
|
1884
|
-
"description": "Model
|
|
1921
|
+
"description": "Model for LLM-based recall planning (recallPlannerLlmEnabled). A 'provider/model' string resolved through the gateway providers/chain — any configured provider works (OpenAI, Anthropic, Ollama, Codex, gateway personas). Tried first, with taskModelChain / gateway defaults as fallback."
|
|
1885
1922
|
},
|
|
1886
1923
|
"recallPlannerTimeoutMs": {
|
|
1887
1924
|
"type": "number",
|
|
@@ -1891,7 +1928,7 @@
|
|
|
1891
1928
|
"recallPlannerUseResponsesApi": {
|
|
1892
1929
|
"type": "boolean",
|
|
1893
1930
|
"default": true,
|
|
1894
|
-
"description": "
|
|
1931
|
+
"description": "Reserved. The chat vs Responses API dialect is chosen per-provider by the gateway/fallback client based on each provider's api field, so this flag does not override routing; OpenAI providers already use Responses (gotcha #1)."
|
|
1895
1932
|
},
|
|
1896
1933
|
"recallPlannerMaxPromptChars": {
|
|
1897
1934
|
"type": "number",
|
|
@@ -1901,7 +1938,7 @@
|
|
|
1901
1938
|
"recallPlannerMaxMemoryHints": {
|
|
1902
1939
|
"type": "number",
|
|
1903
1940
|
"default": 24,
|
|
1904
|
-
"description": "
|
|
1941
|
+
"description": "Reserved. Caps recent-memory hints in the recall planner prompt when a caller supplies them; the default recall path does not populate hints (the LLM planner classifies on the prompt alone)."
|
|
1905
1942
|
},
|
|
1906
1943
|
"recallPlannerShadowMode": {
|
|
1907
1944
|
"type": "boolean",
|
|
@@ -3125,6 +3162,30 @@
|
|
|
3125
3162
|
"default": "",
|
|
3126
3163
|
"description": "Agent persona ID for fast-tier ops (rerank, entity summaries, compression guidelines). When modelSource is 'gateway' and this is empty, fast ops use the same chain as gatewayAgentId."
|
|
3127
3164
|
},
|
|
3165
|
+
"taskModelChain": {
|
|
3166
|
+
"type": "object",
|
|
3167
|
+
"description": "Optional task-specific gateway model chain for Remnic's background LLM work (extraction, fact/profile/identity consolidation, summarization, causal consolidation). When set, this chain is resolved through gateway providers instead of gatewayAgentId or agents.defaults.model. Only applies when modelSource is 'gateway'.",
|
|
3168
|
+
"required": [
|
|
3169
|
+
"primary"
|
|
3170
|
+
],
|
|
3171
|
+
"additionalProperties": false,
|
|
3172
|
+
"properties": {
|
|
3173
|
+
"primary": {
|
|
3174
|
+
"type": "string",
|
|
3175
|
+
"minLength": 1,
|
|
3176
|
+
"description": "Primary gateway model, e.g. zai/glm-4.7-flash"
|
|
3177
|
+
},
|
|
3178
|
+
"fallbacks": {
|
|
3179
|
+
"type": "array",
|
|
3180
|
+
"items": {
|
|
3181
|
+
"type": "string",
|
|
3182
|
+
"minLength": 1
|
|
3183
|
+
},
|
|
3184
|
+
"default": [],
|
|
3185
|
+
"description": "Fallback gateway models tried after primary"
|
|
3186
|
+
}
|
|
3187
|
+
}
|
|
3188
|
+
},
|
|
3128
3189
|
"localLlmEnabled": {
|
|
3129
3190
|
"type": "boolean",
|
|
3130
3191
|
"default": false,
|
|
@@ -5037,6 +5098,23 @@
|
|
|
5037
5098
|
"label": "QMD Query Rerank",
|
|
5038
5099
|
"advanced": true
|
|
5039
5100
|
},
|
|
5101
|
+
"qmdSearchStrategy": {
|
|
5102
|
+
"label": "QMD Search Strategy",
|
|
5103
|
+
"advanced": true,
|
|
5104
|
+
"placeholder": "hybrid",
|
|
5105
|
+
"help": "hybrid = lex+vec+hyde (default, best recall). lex-vec drops HyDE. lex = BM25-only (fastest). Lower tiers reduce CPU latency at the cost of recall."
|
|
5106
|
+
},
|
|
5107
|
+
"qmdSubprocessStrategy": {
|
|
5108
|
+
"label": "QMD Subprocess Strategy",
|
|
5109
|
+
"advanced": true,
|
|
5110
|
+
"placeholder": "query",
|
|
5111
|
+
"help": "query = qmd query with LLM expansion + rerank (default). search = BM25-only fallback, faster on huge collections but loses expansion/rerank."
|
|
5112
|
+
},
|
|
5113
|
+
"qmdDaemonTimeoutMs": {
|
|
5114
|
+
"label": "QMD Daemon Timeout (ms)",
|
|
5115
|
+
"advanced": true,
|
|
5116
|
+
"placeholder": "8000"
|
|
5117
|
+
},
|
|
5040
5118
|
"qmdIndexName": {
|
|
5041
5119
|
"label": "QMD Index Name",
|
|
5042
5120
|
"advanced": true,
|
|
@@ -5430,6 +5508,11 @@
|
|
|
5430
5508
|
"placeholder": "engram-llm-fast",
|
|
5431
5509
|
"help": "Agent persona ID for fast-tier ops. Leave empty to use the primary gatewayAgentId."
|
|
5432
5510
|
},
|
|
5511
|
+
"taskModelChain": {
|
|
5512
|
+
"label": "Task Model Chain",
|
|
5513
|
+
"advanced": true,
|
|
5514
|
+
"help": "Optional primary/fallback gateway model chain for Remnic background tasks (extraction, consolidation, summarization). Overrides gatewayAgentId/defaults for these tasks only. Requires modelSource: 'gateway'."
|
|
5515
|
+
},
|
|
5433
5516
|
"localLlmEnabled": {
|
|
5434
5517
|
"label": "Enable Local LLM",
|
|
5435
5518
|
"help": "Use local LLM (LM Studio, Ollama, etc.) for extraction and summaries. Falls back to OpenAI if unavailable."
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@remnic/plugin-openclaw",
|
|
3
|
-
"version": "9.3.
|
|
3
|
+
"version": "9.3.614",
|
|
4
4
|
"description": "OpenClaw adapter for Remnic memory with bundled @remnic/core runtime",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "dist/index.js",
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
"./dist/index.js"
|
|
29
29
|
],
|
|
30
30
|
"compat": {
|
|
31
|
-
"pluginApi": ">=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-1 || 2026.5.3-beta.1 || 2026.5.3-beta.2 || 2026.5.3-beta.3 || 2026.5.3-beta.4 || 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.3-alpha.1"
|
|
31
|
+
"pluginApi": ">=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-1 || 2026.5.3-beta.1 || 2026.5.3-beta.2 || 2026.5.3-beta.3 || 2026.5.3-beta.4 || 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.6-alpha.1"
|
|
32
32
|
},
|
|
33
33
|
"build": {
|
|
34
|
-
"openclawVersion": "2026.6.
|
|
35
|
-
"pluginSdkVersion": "2026.6.
|
|
34
|
+
"openclawVersion": "2026.6.6-alpha.1",
|
|
35
|
+
"pluginSdkVersion": "2026.6.6-alpha.1"
|
|
36
36
|
},
|
|
37
37
|
"install": {
|
|
38
38
|
"clawhubSpec": "clawhub:@remnic/plugin-openclaw",
|
|
@@ -72,17 +72,17 @@
|
|
|
72
72
|
"dependencies": {
|
|
73
73
|
"@sinclair/typebox": "^0.34.0",
|
|
74
74
|
"openai": "^6.0.0",
|
|
75
|
-
"@remnic/core": "^9.3.
|
|
75
|
+
"@remnic/core": "^9.3.614"
|
|
76
76
|
},
|
|
77
77
|
"peerDependencies": {
|
|
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-1 || 2026.5.3-beta.1 || 2026.5.3-beta.2 || 2026.5.3-beta.3 || 2026.5.3-beta.4 || 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.3-alpha.1"
|
|
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-1 || 2026.5.3-beta.1 || 2026.5.3-beta.2 || 2026.5.3-beta.3 || 2026.5.3-beta.4 || 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.6-alpha.1"
|
|
79
79
|
},
|
|
80
80
|
"devDependencies": {
|
|
81
81
|
"@openclaw/plugin-inspector": "0.3.10",
|
|
82
82
|
"acorn": "^8.16.0",
|
|
83
83
|
"tsup": "^8.5.1",
|
|
84
84
|
"typescript": "^5.9.3",
|
|
85
|
-
"@remnic/core": "^9.3.
|
|
85
|
+
"@remnic/core": "^9.3.614"
|
|
86
86
|
},
|
|
87
87
|
"license": "MIT",
|
|
88
88
|
"repository": {
|