Skip to content

Keep Claude CLI sessions warm#69679

Merged
obviyus merged 16 commits into
openclaw:mainfrom
obviyus:feat/claude-live-session
Apr 22, 2026
Merged

Keep Claude CLI sessions warm#69679
obviyus merged 16 commits into
openclaw:mainfrom
obviyus:feat/claude-live-session

Conversation

@obviyus

@obviyus obviyus commented Apr 21, 2026

Copy link
Copy Markdown
Contributor

Summary

  • Keep one Claude stdio process warm per OpenClaw session.
  • Close idle Claude processes after 10 minutes, then resume with the stored Claude session id.
  • Add config/schema/docs plus regression coverage for reuse and idle cleanup.

Tests

  • pnpm test src/agents/cli-runner.spawn.test.ts src/agents/cli-output.test.ts
  • pnpm check:changed
  • Live smoke: prepared OpenClaw Claude stdio path reused one Claude session id across two turns.

@aisle-research-bot

aisle-research-bot Bot commented Apr 21, 2026

Copy link
Copy Markdown

🔒 Aisle Security Analysis

We found 3 potential security issue(s) in this PR:

# Severity Title
1 🟡 Medium CLI session reuse ignores OpenClaw MCP loopback port, enabling session binding confusion
2 🟡 Medium Unbounded stdout/stderr buffering after Claude live session is marked closing (memory DoS)
3 🟡 Medium Global Claude live-session cap allows cross-tenant denial of service
1. 🟡 CLI session reuse ignores OpenClaw MCP loopback port, enabling session binding confusion
Property Value
Severity Medium
CWE CWE-346
Location src/agents/cli-runner/bundle-mcp.ts:273-280

Description

mcpResumeHash intentionally canonicalizes the OpenClaw MCP URL by replacing the loopback port with a constant placeholder. resolveCliSessionReuse() then prefers this resume hash over the full mcpConfigHash.

This is a session-binding weakening/regression:

  • Input: MCP endpoint URL is part of the MCP config (mcpServers.openclaw.url).
  • Canonicalization: normalizeOpenClawLoopbackUrl() strips the port for http://127.0.0.1|localhost|[::1]:<port>/mcp.
  • Decision: resolveCliSessionReuse() will reuse a stored Claude session ID as long as mcpResumeHash matches, even if the actual MCP endpoint port changed.

Impact:

  • If the OpenClaw MCP server restarts on a different port and that port is (accidentally or maliciously) bound by a different local process speaking MCP, the CLI may resume a prior Claude session (with prior conversation/tool expectations) against a meaningfully different tool backend.
  • Previously, the raw config hash would invalidate the session on any URL change (including port), reducing the chance of resuming across endpoint changes.

Vulnerable code:

/^(http:\/\/(?:127\.0\.0\.1|localhost|\[::1\])):\d+(\/mcp)$/.exec(value.trim())
...
return `${match[1]}:<openclaw-loopback>${match[2]}`;

Recommendation

Do not treat the MCP port as non-semantic for session reuse unless you can cryptographically bind the resumed Claude session to the same local MCP server instance.

Safer options:

  1. Keep the port in the resume hash (revert this normalization) and instead persist the originally chosen port for OpenClaw so subsequent runs reuse the same port when possible.

  2. Bind to server identity: include a stable server identifier in the resume hash (e.g., a generated instance ID or public key fingerprint) and require the MCP server to prove possession during handshake.

Example (simple mitigation: include port):

function canonicalizeBundleMcpConfigForResume(config: BundleMcpConfig): BundleMcpConfig {
  return { mcpServers: sortJsonValue(config.mcpServers) as BundleMcpConfig["mcpServers"] };
}

If you must ignore ephemeral ports, add an explicit allowlist flag (e.g., allowSessionReuseAcrossPortChanges: true) and default it to false so users must opt in.

2. 🟡 Unbounded stdout/stderr buffering after Claude live session is marked closing (memory DoS)
Property Value
Severity Medium
CWE CWE-400
Location src/agents/cli-runner/claude-live-session.ts:324-349

Description

The Claude CLI live session continues to append to stdoutBuffer/stderr even after the session has been closed (session.closing=true).

  • closeLiveSession() returns immediately when session.closing is already true.
  • handleClaudeStdout()/onStderr keep appending data and rely on closeLiveSession() to abort when limits are exceeded.
  • Once session.closing is true, further limit checks still call closeLiveSession(), but it becomes a no-op, so buffers can grow without bound until the child process actually exits.

This allows a misbehaving/compromised claude CLI process (or a local wrapper script invoked as the CLI) to stream unlimited output after cancellation/abort and cause memory exhaustion (denial of service).

Recommendation

Stop processing output once a session is closing, and/or hard-cap buffers even in the closing state.

Suggested fix (minimal):

function handleClaudeStdout(session: ClaudeLiveSession, chunk: string) {
  if (session.closing) return;
  ...
}// in onStderr
if (session.closing) return;

Additionally, consider:

  • Clearing buffers on close to release memory: session.stdoutBuffer = ""; session.stderr = "";
  • Detaching stdout/stderr handlers (if supported by the supervisor) or ensuring managedRun.cancel() promptly destroys the streams.
  • Keeping the limit enforcement independent of closeLiveSession() (e.g., truncate buffers) so it still works when already closing.
3. 🟡 Global Claude live-session cap allows cross-tenant denial of service
Property Value
Severity Medium
CWE CWE-400
Location src/agents/cli-runner/claude-live-session.ts:54-756

Description

The Claude CLI live-session implementation enforces a single, process-wide cap (CLAUDE_LIVE_MAX_SESSIONS = 16) across all live sessions and pending session creations.

  • Session entries are stored in global in-memory maps (liveSessions, liveSessionCreates).
  • ensureLiveSessionCapacity() rejects new sessions once liveSessions.size + liveSessionCreates.size reaches the global cap.
  • The session key is per agent/account/session (buildClaudeLiveKey() includes agentAccountId, agentId, authProfileId, sessionId, sessionKey), but the capacity control is not scoped by tenant/account.

In a multi-tenant deployment (e.g., a shared gateway/service process handling multiple users/accounts), a single tenant can create/hold 16 sessions (or keep 16 creates pending) and cause other tenants to receive a FailoverError with reason rate_limit (“Too many Claude CLI live sessions are active.”), effectively producing a cross-user denial-of-service.

Vulnerable code:

const CLAUDE_LIVE_MAX_SESSIONS = 16;
...
if (
  liveSessions.has(key) ||
  liveSessionCreates.has(key) ||
  liveSessions.size + liveSessionCreates.size < CLAUDE_LIVE_MAX_SESSIONS
) {
  return;
}
...
throw new FailoverError("Too many Claude CLI live sessions are active.", { reason: "rate_limit", ... });

Recommendation

Scope capacity controls to the resource owner and add fair eviction:

  • Enforce caps per tenant/account (e.g., per agentAccountId and/or authProfileId) rather than globally.
  • Optionally keep a small global cap as a final safety limit, but ensure per-tenant fairness.
  • Implement true LRU/idle eviction (track lastUsedAtMs and evict the least-recently-used idle session), and consider closing sessions that exceed a maximum lifetime.
  • Consider admission control: refuse/queue additional sessions per tenant instead of failing other tenants.

Example approach (sketch):

type TenantKey = string; // e.g. sha256(agentAccountId + authProfileId)
const tenantSessions = new Map<TenantKey, Set<string>>();
const MAX_SESSIONS_PER_TENANT = 4;

function ensureTenantCapacity(tenant: TenantKey) {
  const set = tenantSessions.get(tenant) ?? new Set();
  if (set.size >= MAX_SESSIONS_PER_TENANT) {
    throw new FailoverError("Too many live sessions for this account.", { reason: "rate_limit", ... });
  }
}

This prevents one tenant from exhausting shared process resources and causing cross-tenant service degradation.


Analyzed PR: #69679 at commit e23d9d2

Last updated on: 2026-04-22T08:13:12Z

@openclaw-barnacle openclaw-barnacle Bot added docs Improvements or additions to documentation gateway Gateway runtime agents Agent runtime and tooling extensions: anthropic size: L maintainer Maintainer-authored PR labels Apr 21, 2026
@greptile-apps

greptile-apps Bot commented Apr 21, 2026

Copy link
Copy Markdown
Contributor

Greptile Summary

This PR introduces a warm-process optimization for the claude-cli backend: one Claude stdio process is kept alive per OpenClaw session, follow-up turns are sent as stream-json stdin messages, and the process is cancelled after 10 minutes of idle (with the stored Claude session id used to reconnect on next use). The implementation adds claude-live-session.ts for process lifecycle management, updates execute.ts to dispatch into the new path, extends config schema/types, and ships two regression tests verifying session reuse and idle cleanup.

Confidence Score: 5/5

Safe to merge; all remaining findings are P2 style/minor correctness notes that don't block the primary user path.

No P0 or P1 issues. The two logic comments (stale noOutputTimeoutMs and accumulated stderr) are P2 because noOutputTimeoutMs stays constant within a session in practice (same backend fingerprint), and the stderr mixing only matters on unexpected process exit after multiple turns. The unused streamingParser allocation is a style issue only.

src/agents/cli-runner/claude-live-session.ts — see noOutputTimeoutMs and stderr comments.

Comments Outside Diff (1)

  1. src/agents/cli-runner/execute.ts, line 334-360 (link)

    P2 streamingParser allocated but never used on the live-session path

    streamingParser is constructed unconditionally when backend.output === "jsonl", then its truthiness gates entry into the live-session branch, but the object itself is never pushed to or finished — runClaudeLiveSessionTurn creates its own internal parser. The null-check pattern is clear as a guard, but consider gating the allocation (const hasJsonlOutput = backend.output === "jsonl") to avoid the dead object, or at least a short comment noting the intentional discard.

    Prompt To Fix With AI
    This is a comment left during a code review.
    Path: src/agents/cli-runner/execute.ts
    Line: 334-360
    
    Comment:
    **`streamingParser` allocated but never used on the live-session path**
    
    `streamingParser` is constructed unconditionally when `backend.output === "jsonl"`, then its truthiness gates entry into the live-session branch, but the object itself is never pushed to or finished — `runClaudeLiveSessionTurn` creates its own internal parser. The null-check pattern is clear as a guard, but consider gating the allocation (`const hasJsonlOutput = backend.output === "jsonl"`) to avoid the dead object, or at least a short comment noting the intentional discard.
    
    How can I resolve this? If you propose a fix, please make it concise.
Prompt To Fix All With AI
This is a comment left during a code review.
Path: src/agents/cli-runner/claude-live-session.ts
Line: 411-433

Comment:
**Stale `noOutputTimeoutMs` in reused sessions**

The `onStdout` and `onStderr` handlers closed over `params.noOutputTimeoutMs` at session-creation time. When a second turn arrives with a different `timeoutMs` (and thus a different computed `noOutputTimeoutMs`), the per-turn timer created in `createTurn` uses the correct value — but every subsequent stdout/stderr chunk resets that timer back to the first turn's timeout via `resetNoOutputTimer(session, params.noOutputTimeoutMs)`.

In practice, the fingerprint check guarantees the backend config is identical across turns in the same session, so the watchdog config rarely differs. However, `params.timeoutMs` (from `context.params.timeoutMs`) is per-request and could legitimately vary, causing the watchdog to fire too early or too late for later turns.

A clean fix is to store `noOutputTimeoutMs` on `ClaudeLiveSession` and update it at the start of each turn in `runClaudeLiveSessionTurn`.

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/agents/cli-runner/claude-live-session.ts
Line: 333-370

Comment:
**`session.stderr` accumulates across turns**

`session.stderr` is never reset between turns — stderr from turn 1 is still present when turn 2 fails. If the process exits unexpectedly mid-turn-2, `handleClaudeExit` will call `extractCliErrorMessage(session.stderr)` on the combined multi-turn stderr, which can surface stale or misleading error context. Consider clearing `session.stderr` at the beginning of each new turn (e.g., inside `runClaudeLiveSessionTurn` before `writeTurnInput`).

How can I resolve this? If you propose a fix, please make it concise.

---

This is a comment left during a code review.
Path: src/agents/cli-runner/execute.ts
Line: 334-360

Comment:
**`streamingParser` allocated but never used on the live-session path**

`streamingParser` is constructed unconditionally when `backend.output === "jsonl"`, then its truthiness gates entry into the live-session branch, but the object itself is never pushed to or finished — `runClaudeLiveSessionTurn` creates its own internal parser. The null-check pattern is clear as a guard, but consider gating the allocation (`const hasJsonlOutput = backend.output === "jsonl"`) to avoid the dead object, or at least a short comment noting the intentional discard.

How can I resolve this? If you propose a fix, please make it concise.

Reviews (1): Last reviewed commit: "test(cli): cover claude live session reu..." | Re-trigger Greptile

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ff45a2a337

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/cli-runner/claude-live-session.ts Outdated
Comment thread src/agents/cli-runner/claude-live-session.ts Outdated
Comment thread src/agents/cli-runner/claude-live-session.ts
Comment thread src/agents/cli-runner/claude-live-session.ts
@obviyus obviyus self-assigned this Apr 21, 2026

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: ea62254fb4

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/cli-runner/claude-live-session.ts
Comment thread src/agents/cli-runner/claude-live-session.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 4b0546dbab

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/cli-runner/claude-live-session.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 6dbc6bf198

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/cli-runner/claude-live-session.ts Outdated
Comment thread src/agents/cli-runner/execute.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 808675ec1a

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/cli-runner/claude-live-session.ts
Comment thread src/agents/cli-runner/claude-live-session.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 012f390901

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/cli-runner/claude-live-session.ts Outdated

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: f5b1959511

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/cli-runner/claude-live-session.ts Outdated
Comment thread src/agents/cli-runner/claude-live-session.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 40f769dfeb

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/cli-runner/claude-live-session.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: e6b40b2a7f

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread src/agents/cli-runner/claude-live-session.ts
Comment thread src/agents/cli-runner/claude-live-session.ts

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 704828f469

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

cleanup: () => Promise<void>;
}): Promise<ClaudeLiveRunResult> {
const key = buildClaudeLiveKey(params.context);
const useResume = params.args.includes("--resume") || params.args.includes("-r");

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Detect inline --resume values before deciding live reuse

runClaudeLiveSessionTurn only treats resume mode as active when args contains a standalone --resume/-r token. If a backend uses resumeArgs like "--resume={sessionId}" (single argv item, which is allowed by the {sessionId} placeholder contract), useResume is false here, so the turn is treated as a fresh run: buildClaudeLiveArgs re-adds first-turn system prompt behavior and the resumeCapable && !useResume restart path tears down warm sessions unnecessarily. That breaks resumed-session continuity for valid inline resume flag configurations.

Useful? React with 👍 / 👎.

@obviyus
obviyus force-pushed the feat/claude-live-session branch from 490041f to e23d9d2 Compare April 22, 2026 08:09
@obviyus
obviyus merged commit 81ca7bc into openclaw:main Apr 22, 2026
93 checks passed
@obviyus

obviyus commented Apr 22, 2026

Copy link
Copy Markdown
Contributor Author

Landed on main.

medikoo pushed a commit to medikoo/openclaw that referenced this pull request Apr 24, 2026
* feat(cli): keep claude cli sessions warm

* test(cli): cover claude live session reuse

* fix(cli): harden claude live session reuse

* fix(cli): redact mcp session key logs

* fix(cli): bound claude live session turns

* fix(cli): reuse claude live sessions on resume

* refactor(cli): canonicalize claude live argv

* fix(cli): preserve claude live resume state

* fix(cli): close dead claude live sessions

* fix(cli): serialize claude live session creates

* fix(cli): count pending claude live sessions

* fix(cli): tighten claude live resume abort

* fix(cli): reject closed claude live sessions

* fix(cli): refresh claude live fingerprints

* fix(cli): stabilize MCP resume hash

* fix: preserve claude live inline resume (openclaw#69679)

---------

Co-authored-by: Frank Yang <[email protected]>
Belugary added a commit to Belugary/boot-resume that referenced this pull request Apr 25, 2026
…resume

OpenClaw v2026.4.22 (released 2026-04-23) introduced native warm
claude-cli stdio sessions and automatic resume from the stored Claude
session id after Gateway restarts or idle exits, via
openclaw/openclaw#69679 "Keep Claude CLI sessions warm". This covers
the primary use case of boot-resume, so the standalone skill is no
longer needed.

This commit adds prominent deprecation banners to README.md (English
and Chinese sections) and SKILL.md, pointing readers to the upstream
PR. The repository will be archived after this commit.

Co-Authored-By: Claude Opus 4.7 (1M context) <[email protected]>
ogt-redknie pushed a commit to ogt-redknie/OPENX that referenced this pull request May 2, 2026
* feat(cli): keep claude cli sessions warm

* test(cli): cover claude live session reuse

* fix(cli): harden claude live session reuse

* fix(cli): redact mcp session key logs

* fix(cli): bound claude live session turns

* fix(cli): reuse claude live sessions on resume

* refactor(cli): canonicalize claude live argv

* fix(cli): preserve claude live resume state

* fix(cli): close dead claude live sessions

* fix(cli): serialize claude live session creates

* fix(cli): count pending claude live sessions

* fix(cli): tighten claude live resume abort

* fix(cli): reject closed claude live sessions

* fix(cli): refresh claude live fingerprints

* fix(cli): stabilize MCP resume hash

* fix: preserve claude live inline resume (openclaw#69679)

---------

Co-authored-by: Frank Yang <[email protected]>
zhonghe0615 pushed a commit to zhonghe0615/openclaw that referenced this pull request May 7, 2026
* feat(cli): keep claude cli sessions warm

* test(cli): cover claude live session reuse

* fix(cli): harden claude live session reuse

* fix(cli): redact mcp session key logs

* fix(cli): bound claude live session turns

* fix(cli): reuse claude live sessions on resume

* refactor(cli): canonicalize claude live argv

* fix(cli): preserve claude live resume state

* fix(cli): close dead claude live sessions

* fix(cli): serialize claude live session creates

* fix(cli): count pending claude live sessions

* fix(cli): tighten claude live resume abort

* fix(cli): reject closed claude live sessions

* fix(cli): refresh claude live fingerprints

* fix(cli): stabilize MCP resume hash

* fix: preserve claude live inline resume (openclaw#69679)

---------

Co-authored-by: Frank Yang <[email protected]>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 9, 2026
* feat(cli): keep claude cli sessions warm

* test(cli): cover claude live session reuse

* fix(cli): harden claude live session reuse

* fix(cli): redact mcp session key logs

* fix(cli): bound claude live session turns

* fix(cli): reuse claude live sessions on resume

* refactor(cli): canonicalize claude live argv

* fix(cli): preserve claude live resume state

* fix(cli): close dead claude live sessions

* fix(cli): serialize claude live session creates

* fix(cli): count pending claude live sessions

* fix(cli): tighten claude live resume abort

* fix(cli): reject closed claude live sessions

* fix(cli): refresh claude live fingerprints

* fix(cli): stabilize MCP resume hash

* fix: preserve claude live inline resume (openclaw#69679)

---------

Co-authored-by: Frank Yang <[email protected]>
globalcaos pushed a commit to globalcaos/tinkerclaw that referenced this pull request May 13, 2026
* feat(cli): keep claude cli sessions warm

* test(cli): cover claude live session reuse

* fix(cli): harden claude live session reuse

* fix(cli): redact mcp session key logs

* fix(cli): bound claude live session turns

* fix(cli): reuse claude live sessions on resume

* refactor(cli): canonicalize claude live argv

* fix(cli): preserve claude live resume state

* fix(cli): close dead claude live sessions

* fix(cli): serialize claude live session creates

* fix(cli): count pending claude live sessions

* fix(cli): tighten claude live resume abort

* fix(cli): reject closed claude live sessions

* fix(cli): refresh claude live fingerprints

* fix(cli): stabilize MCP resume hash

* fix: preserve claude live inline resume (openclaw#69679)

---------

Co-authored-by: Frank Yang <[email protected]>
github-actions Bot pushed a commit to Desicool/openclaw that referenced this pull request May 24, 2026
* feat(cli): keep claude cli sessions warm

* test(cli): cover claude live session reuse

* fix(cli): harden claude live session reuse

* fix(cli): redact mcp session key logs

* fix(cli): bound claude live session turns

* fix(cli): reuse claude live sessions on resume

* refactor(cli): canonicalize claude live argv

* fix(cli): preserve claude live resume state

* fix(cli): close dead claude live sessions

* fix(cli): serialize claude live session creates

* fix(cli): count pending claude live sessions

* fix(cli): tighten claude live resume abort

* fix(cli): reject closed claude live sessions

* fix(cli): refresh claude live fingerprints

* fix(cli): stabilize MCP resume hash

* fix: preserve claude live inline resume (openclaw#69679)

---------

Co-authored-by: Frank Yang <[email protected]>
jameslcowan pushed a commit to jameslcowan/openclaw that referenced this pull request Jun 2, 2026
* feat(cli): keep claude cli sessions warm

* test(cli): cover claude live session reuse

* fix(cli): harden claude live session reuse

* fix(cli): redact mcp session key logs

* fix(cli): bound claude live session turns

* fix(cli): reuse claude live sessions on resume

* refactor(cli): canonicalize claude live argv

* fix(cli): preserve claude live resume state

* fix(cli): close dead claude live sessions

* fix(cli): serialize claude live session creates

* fix(cli): count pending claude live sessions

* fix(cli): tighten claude live resume abort

* fix(cli): reject closed claude live sessions

* fix(cli): refresh claude live fingerprints

* fix(cli): stabilize MCP resume hash

* fix: preserve claude live inline resume (openclaw#69679)

---------

Co-authored-by: Frank Yang <[email protected]>
sablehead pushed a commit to sablehead/openclaw that referenced this pull request Jun 10, 2026
* feat(cli): keep claude cli sessions warm

* test(cli): cover claude live session reuse

* fix(cli): harden claude live session reuse

* fix(cli): redact mcp session key logs

* fix(cli): bound claude live session turns

* fix(cli): reuse claude live sessions on resume

* refactor(cli): canonicalize claude live argv

* fix(cli): preserve claude live resume state

* fix(cli): close dead claude live sessions

* fix(cli): serialize claude live session creates

* fix(cli): count pending claude live sessions

* fix(cli): tighten claude live resume abort

* fix(cli): reject closed claude live sessions

* fix(cli): refresh claude live fingerprints

* fix(cli): stabilize MCP resume hash

* fix: preserve claude live inline resume (openclaw#69679)

---------

Co-authored-by: Frank Yang <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

agents Agent runtime and tooling docs Improvements or additions to documentation extensions: anthropic gateway Gateway runtime maintainer Maintainer-authored PR size: XL

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants