From 2276efbc4b1b99045a04ea187750f9ff7162d72f Mon Sep 17 00:00:00 2001 From: Willem Jiang Date: Sat, 2 May 2026 22:07:49 +0800 Subject: [PATCH] fix(channels): copy configurable dict before injecting run-scoped fields When configurable was already a plain dict, _resolve_run_params mutated it in place, leaking checkpoint_ns and thread_id back into the shared session config. Always copy via dict() before mutating to prevent cross-user or cross-channel config pollution. --- backend/app/channels/manager.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/backend/app/channels/manager.py b/backend/app/channels/manager.py index f200a7145..e08a443ee 100644 --- a/backend/app/channels/manager.py +++ b/backend/app/channels/manager.py @@ -590,9 +590,7 @@ class ChannelManager: ) configurable = run_config.get("configurable") - if isinstance(configurable, dict): - pass - elif isinstance(configurable, Mapping): + if isinstance(configurable, Mapping): configurable = dict(configurable) else: configurable = {}