openclaw - ✅(Solved) Fix Follow-up: voice-call canonical session-key fix for #80064 is still not on main [1 pull requests, 1 comments, 2 participants]

Official PRs (…)
ON THIS PAGE

Recommended Tools

×6

Utilities matched from this issue’s tags and category — try them while you read without losing context.

GitHub issue graph ai analysis

Paste a GitHub issue URL. We fetch that issue, discover linked issues from bodies/comments/timeline, collect linked pull requests, and produce a structured English report.

The report is written in English Markdown for sharing and archival.

Helpful · Quick feedback

Loading…
GitHub stats
openclaw/openclaw#83967Fetched 2026-05-20 03:45:48
View on GitHub
Comments
1
Participants
2
Timeline
8
Reactions
1
Timeline (top)
labeled ×6commented ×1cross-referenced ×1

Follow-up to #80064: the issue was closed as fixed on review/79987, specifically commit cb876030c22958a056d0bfe19055df09e84fc016, but that branch/commit still does not appear to have landed on the repository default branch (main).

This means the voice-call per-phone/per-call canonical session-key fix is still absent from the branch users receive from normal upstream updates.

Root Cause

The original bug remains present on main: the official voice-call plugin can still resolve sessions as raw voice:* keys while Gateway startup canonicalization migrates them to agent:<agentId>:voice:*. That keeps the per-phone/per-call session continuity bug alive for normal upstream users and downstream update automation.

Fix Action

Fixed

PR fix notes

PR #84199: fix(voice-call): emit canonical session keys

Description (problem / solution / changelog)

Summary

  • Scope generated voice-call session keys under the resolved agent id (agent:<agent>:voice:*).
  • Preserve explicit session keys supplied by routes or outbound requests.
  • Update voice-call tests and docs to reflect the canonical agent-scoped keys.

Fixes #83967.

Real behavior proof

Behavior or issue addressed: Generated voice-call session keys previously used unscoped voice:* keys, so calls could miss the canonical agent:<agent>:voice:* session namespace used by the rest of the agent runtime.

Real environment tested: Local OpenClaw checkout on macOS using the repository source module through tsx with the bundled Node runtime.

Exact steps or command run after this patch: PATH=/Users/andy/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/bin:$PATH node --import tsx /private/tmp/proof-83967.mjs

Evidence after fix:

openclaw-voice-call-session-key-proof=ok
default_per_phone=agent:main:voice:15550001111
configured_agent_per_phone=agent:cards:voice:15550001111
per_call=agent:main:voice:call:call-123
explicit_session_key=meet-room-1

Observed result after fix: Default per-phone, configured-agent per-phone, and per-call generated voice session keys are canonical agent-scoped keys, while an explicit session key is still preserved unchanged.

What was not tested: No live telephony provider was called; the proof exercises the real OpenClaw voice-call config/session-key code path locally.

Validation

  • NODE_OPTIONS=--max-old-space-size=8192 OPENCLAW_VITEST_MAX_WORKERS=1 PATH=/Users/andy/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/bin:$PATH node scripts/run-vitest.mjs extensions/voice-call/src/config.test.ts extensions/voice-call/src/response-generator.test.ts extensions/voice-call/src/manager/events.test.ts extensions/voice-call/src/manager/outbound.test.ts extensions/voice-call/src/runtime.test.ts --pool forks --maxWorkers 1 --vmMemoryLimit 8192MB
  • PATH=/Users/andy/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/bin:/Users/andy/openclaw-83967/node_modules/.bin:$PATH oxfmt --check docs/plugins/voice-call.md extensions/voice-call/src/config.ts extensions/voice-call/src/config.test.ts extensions/voice-call/src/manager/events.test.ts extensions/voice-call/src/manager/outbound.test.ts extensions/voice-call/src/response-generator.test.ts extensions/voice-call/src/runtime.test.ts
  • PATH=/Users/andy/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/bin:/Users/andy/openclaw-83967/node_modules/.bin:$PATH oxlint docs/plugins/voice-call.md extensions/voice-call/src/config.ts extensions/voice-call/src/config.test.ts extensions/voice-call/src/manager/events.test.ts extensions/voice-call/src/manager/outbound.test.ts extensions/voice-call/src/response-generator.test.ts extensions/voice-call/src/runtime.test.ts
  • git diff --check

Maintainer note

If this PR is squashed or reworked, please preserve author attribution or include:

Co-authored-by: Andy Ye <[email protected]>

Changed files

  • docs/plugins/voice-call.md (modified, +6/-1)
  • extensions/voice-call/src/config.test.ts (modified, +18/-2)
  • extensions/voice-call/src/config.ts (modified, +7/-3)
  • extensions/voice-call/src/manager/events.test.ts (modified, +1/-1)
  • extensions/voice-call/src/manager/outbound.test.ts (modified, +3/-1)
  • extensions/voice-call/src/response-generator.test.ts (modified, +5/-5)
  • extensions/voice-call/src/runtime.test.ts (modified, +7/-5)

Code Example

export function resolveVoiceCallSessionKey(params: {
  config: Pick<VoiceCallConfig, "sessionScope">;
  callId: string;
  phone?: string;
  explicitSessionKey?: string;
}) {
  const explicit = params.explicitSessionKey?.trim();
  if (explicit) {
    return explicit;
  }
  if (params.config.sessionScope === "per-call") {
    return `voice:call:${params.callId}`;
  }
  const normalizedPhone = params.phone?.replace(/\D/g, "");
  return normalizedPhone ? `voice:${normalizedPhone}` : `voice:${params.callId}`;
}

---

const prefix = `agent:${normalizeAgentId(params.config.agentId)}:voice`;
if (params.config.sessionScope === "per-call") {
  return `${prefix}:call:${params.callId}`.toLowerCase();
}
const normalizedPhone = params.phone?.replace(/\D/g, "");
return (
  normalizedPhone ? `${prefix}:${normalizedPhone}` : `${prefix}:${params.callId}`
).toLowerCase();
RAW_BUFFERClick to expand / collapse

Summary

Follow-up to #80064: the issue was closed as fixed on review/79987, specifically commit cb876030c22958a056d0bfe19055df09e84fc016, but that branch/commit still does not appear to have landed on the repository default branch (main).

This means the voice-call per-phone/per-call canonical session-key fix is still absent from the branch users receive from normal upstream updates.

Current evidence

Checked live against openclaw/openclaw on 2026-05-19:

  • Repository default branch is main.
  • review/79987 is still diverged from main: GitHub compare main...review/79987 reports ahead_by: 5, including cb876030c22958a056d0bfe19055df09e84fc016, and behind_by: 6091.
  • cb876030c22958a056d0bfe19055df09e84fc016 is not an ancestor of origin/main.
  • GitHub reports PR #80069 as CLOSED with mergedAt: null and no merge commit.
  • branches-where-head for cb876030c22958a056d0bfe19055df09e84fc016 only returns review/79987.

Source check

Current main still has the raw resolver shape in extensions/voice-call/src/config.ts:

export function resolveVoiceCallSessionKey(params: {
  config: Pick<VoiceCallConfig, "sessionScope">;
  callId: string;
  phone?: string;
  explicitSessionKey?: string;
}) {
  const explicit = params.explicitSessionKey?.trim();
  if (explicit) {
    return explicit;
  }
  if (params.config.sessionScope === "per-call") {
    return `voice:call:${params.callId}`;
  }
  const normalizedPhone = params.phone?.replace(/\D/g, "");
  return normalizedPhone ? `voice:${normalizedPhone}` : `voice:${params.callId}`;
}

By contrast, review/79987 contains the expected canonical agent-scoped resolver:

const prefix = `agent:${normalizeAgentId(params.config.agentId)}:voice`;
if (params.config.sessionScope === "per-call") {
  return `${prefix}:call:${params.callId}`.toLowerCase();
}
const normalizedPhone = params.phone?.replace(/\D/g, "");
return (
  normalizedPhone ? `${prefix}:${normalizedPhone}` : `${prefix}:${params.callId}`
).toLowerCase();

Why this matters

The original bug remains present on main: the official voice-call plugin can still resolve sessions as raw voice:* keys while Gateway startup canonicalization migrates them to agent:<agentId>:voice:*. That keeps the per-phone/per-call session continuity bug alive for normal upstream users and downstream update automation.

Request

Please land review/79987 / cb876030c22958a056d0bfe19055df09e84fc016 on main, or land an equivalent fix, and then close this follow-up issue once the default branch contains the canonical agent:<agentId>:voice:* resolver.

Related:

Vote matrix · Quick signals

Works
Did the solution work? Tap to confirm.
Easy Fix
Was it a quick fix?
Time Saver
Did it save you time?
Blocking
Was it severely blocking?
Common Issue
Are others likely hitting this too?
Flaky / Intermittent
Is it intermittent?
Verified / Reproducible
Can you reproduce it reliably?
Loading…

Still need to ship something?

×6

Another batch ranked right after the header list — different links, same matching logic.

Back to top recommendations

TRENDING