diff --git a/.openclaw-sync/source.json b/.openclaw-sync/source.json index 12c196d42..47f2dac03 100644 --- a/.openclaw-sync/source.json +++ b/.openclaw-sync/source.json @@ -1,5 +1,5 @@ { "repository": "openclaw/openclaw", - "sha": "c19f322ff97412eaca6ed6b7e7ec2427181c7246", - "syncedAt": "2026-04-07T07:36:04.135Z" + "sha": "9e9730a55e2c81035a996cd1c925894c8e43ea2b", + "syncedAt": "2026-04-07T07:59:55.834Z" } diff --git a/docs/.generated/plugin-sdk-api-baseline.sha256 b/docs/.generated/plugin-sdk-api-baseline.sha256 index 258f9e38b..cb1b30753 100644 --- a/docs/.generated/plugin-sdk-api-baseline.sha256 +++ b/docs/.generated/plugin-sdk-api-baseline.sha256 @@ -1,2 +1,2 @@ -8592ce4554f44cd5325f44f86d37b3057548853cc9bc543b0611e5d9000f262e plugin-sdk-api-baseline.json -35393eceb6733d966430369c116511bb15a4b83eec93ebfd3b9a3e8f9ee29cec plugin-sdk-api-baseline.jsonl +bcf997afb562b69552d0bf772ccad85b48df14cc3f314fdd5265644702fdfd2d plugin-sdk-api-baseline.json +fcef1106262e6d0f53d67d1f1e968b34cd49ed45c89972364fe6c7d9ffcf1f5b plugin-sdk-api-baseline.jsonl diff --git a/docs/concepts/context-engine.md b/docs/concepts/context-engine.md index d24359c84..1e75e6e4e 100644 --- a/docs/concepts/context-engine.md +++ b/docs/concepts/context-engine.md @@ -115,6 +115,8 @@ engine is used automatically. A plugin can register a context engine using the plugin API: ```ts +import { buildMemorySystemPromptAddition } from "openclaw/plugin-sdk/core"; + export default function register(api) { api.registerContextEngine("my-engine", () => ({ info: { @@ -128,12 +130,15 @@ export default function register(api) { return { ingested: true }; }, - async assemble({ sessionId, messages, tokenBudget }) { + async assemble({ sessionId, messages, tokenBudget, availableTools, citationsMode }) { // Return messages that fit the budget return { messages: buildContext(messages, tokenBudget), estimatedTokens: countTokens(messages), - systemPromptAddition: "Use lcm_grep to search history...", + systemPromptAddition: buildMemorySystemPromptAddition({ + availableTools: availableTools ?? new Set(), + citationsMode, + }), }; }, @@ -248,7 +253,13 @@ OpenClaw resolves when it needs a context engine. - **Memory plugins** (`plugins.slots.memory`) are separate from context engines. Memory plugins provide search/retrieval; context engines control what the model sees. They can work together — a context engine might use memory - plugin data during assembly. + plugin data during assembly. Plugin engines that want the active memory + prompt path should prefer `buildMemorySystemPromptAddition(...)` from + `openclaw/plugin-sdk/core`, which converts the active memory prompt sections + into a ready-to-prepend `systemPromptAddition`. If an engine needs lower-level + control, it can still pull raw lines from + `openclaw/plugin-sdk/memory-host-core` via + `buildActiveMemoryPromptSection(...)`. - **Session pruning** (trimming old tool results in-memory) still runs regardless of which context engine is active. diff --git a/docs/plugins/architecture.md b/docs/plugins/architecture.md index 82923d97e..8ee58b42e 100644 --- a/docs/plugins/architecture.md +++ b/docs/plugins/architecture.md @@ -1494,14 +1494,23 @@ Use this when your plugin needs to replace or extend the default context pipeline rather than just add memory search or hooks. ```ts +import { buildMemorySystemPromptAddition } from "openclaw/plugin-sdk/core"; + export default function (api) { api.registerContextEngine("lossless-claw", () => ({ info: { id: "lossless-claw", name: "Lossless Claw", ownsCompaction: true }, async ingest() { return { ingested: true }; }, - async assemble({ messages }) { - return { messages, estimatedTokens: 0 }; + async assemble({ messages, availableTools, citationsMode }) { + return { + messages, + estimatedTokens: 0, + systemPromptAddition: buildMemorySystemPromptAddition({ + availableTools: availableTools ?? new Set(), + citationsMode, + }), + }; }, async compact() { return { ok: true, compacted: false }; @@ -1514,7 +1523,10 @@ If your engine does **not** own the compaction algorithm, keep `compact()` implemented and delegate it explicitly: ```ts -import { delegateCompactionToRuntime } from "openclaw/plugin-sdk/core"; +import { + buildMemorySystemPromptAddition, + delegateCompactionToRuntime, +} from "openclaw/plugin-sdk/core"; export default function (api) { api.registerContextEngine("my-memory-engine", () => ({ @@ -1526,8 +1538,15 @@ export default function (api) { async ingest() { return { ingested: true }; }, - async assemble({ messages }) { - return { messages, estimatedTokens: 0 }; + async assemble({ messages, availableTools, citationsMode }) { + return { + messages, + estimatedTokens: 0, + systemPromptAddition: buildMemorySystemPromptAddition({ + availableTools: availableTools ?? new Set(), + citationsMode, + }), + }; }, async compact(params) { return await delegateCompactionToRuntime(params); diff --git a/docs/plugins/sdk-overview.md b/docs/plugins/sdk-overview.md index 0ccaff887..cf8e0044f 100644 --- a/docs/plugins/sdk-overview.md +++ b/docs/plugins/sdk-overview.md @@ -386,6 +386,7 @@ AI CLI backend such as `codex-cli`. | Method | What it registers | | ------------------------------------------ | ------------------------------------- | | `api.registerContextEngine(id, factory)` | Context engine (one active at a time) | +| `api.registerMemoryCapability(capability)` | Unified memory capability | | `api.registerMemoryPromptSection(builder)` | Memory prompt section builder | | `api.registerMemoryFlushPlan(resolver)` | Memory flush plan resolver | | `api.registerMemoryRuntime(runtime)` | Memory runtime adapter | @@ -396,8 +397,13 @@ AI CLI backend such as `codex-cli`. | ---------------------------------------------- | ---------------------------------------------- | | `api.registerMemoryEmbeddingProvider(adapter)` | Memory embedding adapter for the active plugin | +- `registerMemoryCapability` is the preferred exclusive memory-plugin API. +- `registerMemoryCapability` may also expose `publicArtifacts.listArtifacts(...)` + so companion plugins can consume exported memory artifacts through + `openclaw/plugin-sdk/memory-host-core` instead of reaching into a specific + memory plugin's private layout. - `registerMemoryPromptSection`, `registerMemoryFlushPlan`, and - `registerMemoryRuntime` are exclusive to memory plugins. + `registerMemoryRuntime` are legacy-compatible exclusive memory-plugin APIs. - `registerMemoryEmbeddingProvider` lets the active memory plugin register one or more embedding adapter ids (for example `openai`, `gemini`, or a custom plugin-defined id).