diff --git a/kiloclaw/.dev.vars.example b/kiloclaw/.dev.vars.example index a0c6398a9d..29b2ea388a 100644 --- a/kiloclaw/.dev.vars.example +++ b/kiloclaw/.dev.vars.example @@ -54,7 +54,7 @@ FLY_IMAGE_TAG=latest # Used by the worker to self-register the version → image tag mapping in KV, # enabling per-user version tracking. Without this, version tracking fields # will be null and instances fall back to FLY_IMAGE_TAG directly. -OPENCLAW_VERSION=2026.2.9 +OPENCLAW_VERSION=2026.3.22 # Legacy fallback for existing instances without per-user apps. # New instances get per-user apps (acct-{hash}) created automatically. diff --git a/kiloclaw/Dockerfile b/kiloclaw/Dockerfile index 929cdcac17..013a11d9f1 100644 --- a/kiloclaw/Dockerfile +++ b/kiloclaw/Dockerfile @@ -42,7 +42,7 @@ RUN npm install -g pnpm # Install OpenClaw # Pin to specific version for reproducible builds -RUN npm install -g openclaw@2026.3.13 \ +RUN npm install -g openclaw@2026.3.22 \ && openclaw --version # Install ClawHub CLI diff --git a/kiloclaw/controller/src/config-writer.ts b/kiloclaw/controller/src/config-writer.ts index 5f8d3aaa3c..e109055f5e 100644 --- a/kiloclaw/controller/src/config-writer.ts +++ b/kiloclaw/controller/src/config-writer.ts @@ -375,12 +375,16 @@ export const DEFAULT_MCPORTER_CONFIG_PATH = '/root/.openclaw/workspace/config/mc /** * Write mcporter.json with MCP server definitions derived from environment variables. * MCPorter is the middleware layer that lets OpenClaw agents call MCP server tools - * via `mcporter call .`. This bypasses openclaw.json's strict schema - * validation, which does not yet support `mcp.servers` (requires OpenClaw >= 2026.3.14). + * via `mcporter call .`. * - * TODO: When the Dockerfile pins OpenClaw >= 2026.3.14, migrate MCP server config - * into generateBaseConfig() using `config.mcp.servers` in openclaw.json instead. - * The mcporter approach can then be removed. See PR #48611 in openclaw/openclaw. + * The `config.mcp.servers` schema exists in openclaw.json (since v2026.3.14), but + * OpenClaw's embedded Pi MCP runtime only supports StdioClientTransport — it has no + * HTTP/SSE transport. Since our MCP servers (AgentCard, Linear) are remote HTTP + * endpoints, mcporter must stay until OpenClaw adds HTTP transport support. + * + * TODO: When OpenClaw's Pi MCP bridge gains HTTP/SSE transport, migrate these + * definitions into generateBaseConfig() using `config.mcp.servers` and remove + * mcporter. See PR #48611 in openclaw/openclaw. */ export function writeMcporterConfig( env: EnvLike, diff --git a/kiloclaw/controller/src/pairing-cache.ts b/kiloclaw/controller/src/pairing-cache.ts index 6a068a5b5b..c5fd649fd9 100644 --- a/kiloclaw/controller/src/pairing-cache.ts +++ b/kiloclaw/controller/src/pairing-cache.ts @@ -93,16 +93,11 @@ function approveFail(message: string, statusHint: 400 | 500): ApproveResult { export const OPENCLAW_BIN = '/usr/local/bin/openclaw'; // Mirrors resolveStateDir() / resolveOAuthDir() in openclaw/src/config/paths.ts -// Includes legacy CLAWDBOT_STATE_DIR fallback (openclaw paths.ts:65) // Note: openclaw's full resolveStateDir() also does filesystem-existence checks for -// legacy .clawdbot dirs — those are omitted here because the container Dockerfile -// always creates /root/.openclaw, making the existence check unreachable in practice. +// legacy dirs — those are omitted here because the container Dockerfile always +// creates /root/.openclaw, making the existence check unreachable in practice. export function resolveOpenClawStateDir(): string { - return ( - process.env.OPENCLAW_STATE_DIR?.trim() || - process.env.CLAWDBOT_STATE_DIR?.trim() || - '/root/.openclaw' - ); + return process.env.OPENCLAW_STATE_DIR?.trim() || '/root/.openclaw'; } export function resolveCredentialsDir(): string { @@ -195,10 +190,12 @@ export function detectChannels(config: unknown): string[] { const tg = isRecord(ch.telegram) ? ch.telegram : {}; const dc = isRecord(ch.discord) ? ch.discord : {}; const sl = isRecord(ch.slack) ? ch.slack : {}; + const sc = isRecord(ch.streamchat) ? ch.streamchat : {}; const channels: string[] = []; if (tg.enabled && tg.botToken) channels.push('telegram'); if (dc.enabled && dc.token) channels.push('discord'); if (sl.enabled && (sl.botToken || sl.appToken)) channels.push('slack'); + if (sc.enabled && sc.apiKey) channels.push('streamchat'); return channels; } diff --git a/kiloclaw/e2e/docker-image-testing.md b/kiloclaw/e2e/docker-image-testing.md index f21594469c..f757ca22ec 100644 --- a/kiloclaw/e2e/docker-image-testing.md +++ b/kiloclaw/e2e/docker-image-testing.md @@ -141,7 +141,7 @@ docker rm kiloclaw-gateway ```bash # Check versions docker run --rm kiloclaw:test node --version # v22.13.1 -docker run --rm kiloclaw:test openclaw --version # 2026.2.9 +docker run --rm kiloclaw:test openclaw --version # 2026.3.22 # Check directories docker run --rm kiloclaw:test ls -la /root/.openclaw