fix(tui): normalize session key to lowercase to match gateway canonicalization (#34013)

Merged via squash.

Prepared head SHA: cfe06ca131
Co-authored-by: lynnzc <6257996+lynnzc@users.noreply.github.com>
Co-authored-by: altaywtf <9790196+altaywtf@users.noreply.github.com>
Reviewed-by: @altaywtf
This commit is contained in:
Lynn 2026-03-04 14:53:38 +08:00 committed by GitHub
parent 26e014311f
commit 9d941949c9
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 24 additions and 2 deletions

View File

@ -16,6 +16,7 @@ Docs: https://docs.openclaw.ai
### Fixes
- TUI/session-key canonicalization: normalize `openclaw tui --session` values to lowercase so uppercase session names no longer drop real-time streaming updates due to gateway/TUI key mismatches. (#33866, #34013) thanks @lynnzc.
- Outbound/send config threading: pass resolved SecretRef config through outbound adapters and helper send paths so send flows do not reload unresolved runtime config. (#33987) Thanks @joshavant.
- Sessions/subagent attachments: remove `attachments[].content.maxLength` from `sessions_spawn` schema to avoid llama.cpp GBNF repetition overflow, and preflight UTF-8 byte size before buffer allocation while keeping runtime file-size enforcement unchanged. (#33648) Thanks @anisoptera.
- Runtime/tool-state stability: recover from dangling Anthropic `tool_use` after compaction, serialize long-running Discord handler runs without blocking new inbound events, and prevent stale busy snapshots from suppressing stuck-channel recovery. (from #33630, #33583) Thanks @kevinWangSheng and @theotarr.

View File

@ -74,6 +74,27 @@ describe("resolveTuiSessionKey", () => {
}),
).toBe("agent:ops:incident");
});
it("lowercases session keys with uppercase characters", () => {
// Uppercase in agent-prefixed form
expect(
resolveTuiSessionKey({
raw: "agent:main:Test1",
sessionScope: "global",
currentAgentId: "main",
sessionMainKey: "agent:main:main",
}),
).toBe("agent:main:test1");
// Uppercase in bare form (prefixed by currentAgentId)
expect(
resolveTuiSessionKey({
raw: "Test1",
sessionScope: "global",
currentAgentId: "main",
sessionMainKey: "agent:main:main",
}),
).toBe("agent:main:test1");
});
});
describe("resolveGatewayDisconnectState", () => {

View File

@ -203,9 +203,9 @@ export function resolveTuiSessionKey(params: {
return trimmed;
}
if (trimmed.startsWith("agent:")) {
return trimmed;
return trimmed.toLowerCase();
}
return `agent:${params.currentAgentId}:${trimmed}`;
return `agent:${params.currentAgentId}:${trimmed.toLowerCase()}`;
}
export function resolveGatewayDisconnectState(reason?: string): {