Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion kiloclaw/.dev.vars.example
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
2 changes: 1 addition & 1 deletion kiloclaw/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
14 changes: 9 additions & 5 deletions kiloclaw/controller/src/config-writer.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 <server>.<tool>`. This bypasses openclaw.json's strict schema
* validation, which does not yet support `mcp.servers` (requires OpenClaw >= 2026.3.14).
* via `mcporter call <server>.<tool>`.
*
* 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,
Expand Down
13 changes: 5 additions & 8 deletions kiloclaw/controller/src/pairing-cache.ts
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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;
}

Expand Down
2 changes: 1 addition & 1 deletion kiloclaw/e2e/docker-image-testing.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
Loading