Skip to content

Commit 6df70f2

Browse files
fix: use keyword params directly in create_session/resume_session bodies
Remove cfg dict intermediary and use keyword parameters directly, fixing ty type checker errors where cfg.get() returned Any | None and shadowed the typed parameter variables. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 7a8535f commit 6df70f2

1 file changed

Lines changed: 18 additions & 136 deletions

File tree

python/copilot/client.py

Lines changed: 18 additions & 136 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,33 +1106,7 @@ async def create_session(
11061106
else:
11071107
raise RuntimeError("Client not connected. Call start() first.")
11081108

1109-
cfg: dict[str, Any] = {
1110-
"on_permission_request": on_permission_request,
1111-
"model": model,
1112-
"session_id": session_id,
1113-
"client_name": client_name,
1114-
"reasoning_effort": reasoning_effort,
1115-
"tools": tools,
1116-
"system_message": system_message,
1117-
"available_tools": available_tools,
1118-
"excluded_tools": excluded_tools,
1119-
"on_user_input_request": on_user_input_request,
1120-
"hooks": hooks,
1121-
"working_directory": working_directory,
1122-
"provider": provider,
1123-
"streaming": streaming,
1124-
"mcp_servers": mcp_servers,
1125-
"custom_agents": custom_agents,
1126-
"agent": agent,
1127-
"config_dir": config_dir,
1128-
"skill_directories": skill_directories,
1129-
"disabled_skills": disabled_skills,
1130-
"infinite_sessions": infinite_sessions,
1131-
"on_event": on_event,
1132-
}
1133-
11341109
tool_defs = []
1135-
tools = cfg.get("tools")
11361110
if tools:
11371111
for tool in tools:
11381112
definition: dict[str, Any] = {
@@ -1148,92 +1122,74 @@ async def create_session(
11481122
tool_defs.append(definition)
11491123

11501124
payload: dict[str, Any] = {}
1151-
if cfg.get("model"):
1152-
payload["model"] = cfg["model"]
1153-
if cfg.get("client_name"):
1154-
payload["clientName"] = cfg["client_name"]
1155-
if cfg.get("reasoning_effort"):
1156-
payload["reasoningEffort"] = cfg["reasoning_effort"]
1125+
if model:
1126+
payload["model"] = model
1127+
if client_name:
1128+
payload["clientName"] = client_name
1129+
if reasoning_effort:
1130+
payload["reasoningEffort"] = reasoning_effort
11571131
if tool_defs:
11581132
payload["tools"] = tool_defs
11591133

1160-
# Add system message configuration if provided
1161-
system_message = cfg.get("system_message")
11621134
if system_message:
11631135
payload["systemMessage"] = system_message
11641136

1165-
# Add tool filtering options
1166-
available_tools = cfg.get("available_tools")
11671137
if available_tools is not None:
11681138
payload["availableTools"] = available_tools
1169-
excluded_tools = cfg.get("excluded_tools")
11701139
if excluded_tools is not None:
11711140
payload["excludedTools"] = excluded_tools
11721141

1173-
# Always enable permission request callback (deny by default if no handler provided)
1174-
on_permission_request = cfg.get("on_permission_request")
1142+
# Always enable permission request callback
11751143
payload["requestPermission"] = True
11761144

11771145
# Enable user input request callback if handler provided
1178-
on_user_input_request = cfg.get("on_user_input_request")
11791146
if on_user_input_request:
11801147
payload["requestUserInput"] = True
11811148

11821149
# Enable hooks callback if any hook handler provided
1183-
hooks = cfg.get("hooks")
11841150
if hooks and any(hooks.values()):
11851151
payload["hooks"] = True
11861152

11871153
# Add working directory if provided
1188-
working_directory = cfg.get("working_directory")
11891154
if working_directory:
11901155
payload["workingDirectory"] = working_directory
11911156

11921157
# Add streaming option if provided
1193-
streaming = cfg.get("streaming")
11941158
if streaming is not None:
11951159
payload["streaming"] = streaming
11961160

11971161
# Add provider configuration if provided
1198-
provider = cfg.get("provider")
11991162
if provider:
12001163
payload["provider"] = self._convert_provider_to_wire_format(provider)
12011164

12021165
# Add MCP servers configuration if provided
1203-
mcp_servers = cfg.get("mcp_servers")
12041166
if mcp_servers:
12051167
payload["mcpServers"] = mcp_servers
12061168
payload["envValueMode"] = "direct"
12071169

12081170
# Add custom agents configuration if provided
1209-
custom_agents = cfg.get("custom_agents")
12101171
if custom_agents:
12111172
payload["customAgents"] = [
12121173
self._convert_custom_agent_to_wire_format(agent) for agent in custom_agents
12131174
]
12141175

12151176
# Add agent selection if provided
1216-
agent = cfg.get("agent")
12171177
if agent:
12181178
payload["agent"] = agent
12191179

12201180
# Add config directory override if provided
1221-
config_dir = cfg.get("config_dir")
12221181
if config_dir:
12231182
payload["configDir"] = config_dir
12241183

12251184
# Add skill directories configuration if provided
1226-
skill_directories = cfg.get("skill_directories")
12271185
if skill_directories:
12281186
payload["skillDirectories"] = skill_directories
12291187

12301188
# Add disabled skills configuration if provided
1231-
disabled_skills = cfg.get("disabled_skills")
12321189
if disabled_skills:
12331190
payload["disabledSkills"] = disabled_skills
12341191

12351192
# Add infinite sessions configuration if provided
1236-
infinite_sessions = cfg.get("infinite_sessions")
12371193
if infinite_sessions:
12381194
wire_config: dict[str, Any] = {}
12391195
if "enabled" in infinite_sessions:
@@ -1251,34 +1207,33 @@ async def create_session(
12511207
if not self._client:
12521208
raise RuntimeError("Client not connected")
12531209

1254-
session_id = cfg.get("session_id") or str(uuid.uuid4())
1255-
payload["sessionId"] = session_id
1210+
actual_session_id = session_id or str(uuid.uuid4())
1211+
payload["sessionId"] = actual_session_id
12561212

12571213
# Propagate W3C Trace Context to CLI if OpenTelemetry is active
12581214
trace_ctx = get_trace_context()
12591215
payload.update(trace_ctx)
12601216

12611217
# Create and register the session before issuing the RPC so that
12621218
# events emitted by the CLI (e.g. session.start) are not dropped.
1263-
session = CopilotSession(session_id, self._client, None)
1219+
session = CopilotSession(actual_session_id, self._client, None)
12641220
session._register_tools(tools)
12651221
session._register_permission_handler(on_permission_request)
12661222
if on_user_input_request:
12671223
session._register_user_input_handler(on_user_input_request)
12681224
if hooks:
12691225
session._register_hooks(hooks)
1270-
on_event = cfg.get("on_event")
12711226
if on_event:
12721227
session.on(on_event)
12731228
with self._sessions_lock:
1274-
self._sessions[session_id] = session
1229+
self._sessions[actual_session_id] = session
12751230

12761231
try:
12771232
response = await self._client.request("session.create", payload)
12781233
session._workspace_path = response.get("workspacePath")
12791234
except BaseException:
12801235
with self._sessions_lock:
1281-
self._sessions.pop(session_id, None)
1236+
self._sessions.pop(actual_session_id, None)
12821237
raise
12831238

12841239
return session
@@ -1372,32 +1327,7 @@ async def resume_session(
13721327
else:
13731328
raise RuntimeError("Client not connected. Call start() first.")
13741329

1375-
cfg: dict[str, Any] = {
1376-
"on_permission_request": on_permission_request,
1377-
"model": model,
1378-
"client_name": client_name,
1379-
"reasoning_effort": reasoning_effort,
1380-
"tools": tools,
1381-
"system_message": system_message,
1382-
"available_tools": available_tools,
1383-
"excluded_tools": excluded_tools,
1384-
"on_user_input_request": on_user_input_request,
1385-
"hooks": hooks,
1386-
"working_directory": working_directory,
1387-
"provider": provider,
1388-
"streaming": streaming,
1389-
"mcp_servers": mcp_servers,
1390-
"custom_agents": custom_agents,
1391-
"agent": agent,
1392-
"config_dir": config_dir,
1393-
"skill_directories": skill_directories,
1394-
"disabled_skills": disabled_skills,
1395-
"infinite_sessions": infinite_sessions,
1396-
"on_event": on_event,
1397-
}
1398-
13991330
tool_defs = []
1400-
tools = cfg.get("tools")
14011331
if tools:
14021332
for tool in tools:
14031333
definition: dict[str, Any] = {
@@ -1414,103 +1344,56 @@ async def resume_session(
14141344

14151345
payload: dict[str, Any] = {"sessionId": session_id}
14161346

1417-
# Add client name if provided
1418-
client_name = cfg.get("client_name")
14191347
if client_name:
14201348
payload["clientName"] = client_name
1421-
1422-
# Add model if provided
1423-
model = cfg.get("model")
14241349
if model:
14251350
payload["model"] = model
1426-
1427-
if cfg.get("reasoning_effort"):
1428-
payload["reasoningEffort"] = cfg["reasoning_effort"]
1351+
if reasoning_effort:
1352+
payload["reasoningEffort"] = reasoning_effort
14291353
if tool_defs:
14301354
payload["tools"] = tool_defs
1431-
1432-
# Add system message configuration if provided
1433-
system_message = cfg.get("system_message")
14341355
if system_message:
14351356
payload["systemMessage"] = system_message
1436-
1437-
# Add available/excluded tools if provided
1438-
available_tools = cfg.get("available_tools")
14391357
if available_tools is not None:
14401358
payload["availableTools"] = available_tools
1441-
1442-
excluded_tools = cfg.get("excluded_tools")
14431359
if excluded_tools is not None:
14441360
payload["excludedTools"] = excluded_tools
1445-
1446-
provider = cfg.get("provider")
14471361
if provider:
14481362
payload["provider"] = self._convert_provider_to_wire_format(provider)
1449-
1450-
# Add streaming option if provided
1451-
streaming = cfg.get("streaming")
14521363
if streaming is not None:
14531364
payload["streaming"] = streaming
14541365

1455-
# Always enable permission request callback (deny by default if no handler provided)
1456-
on_permission_request = cfg.get("on_permission_request")
1366+
# Always enable permission request callback
14571367
payload["requestPermission"] = True
14581368

1459-
# Enable user input request callback if handler provided
1460-
on_user_input_request = cfg.get("on_user_input_request")
14611369
if on_user_input_request:
14621370
payload["requestUserInput"] = True
14631371

1464-
# Enable hooks callback if any hook handler provided
1465-
hooks = cfg.get("hooks")
14661372
if hooks and any(hooks.values()):
14671373
payload["hooks"] = True
14681374

1469-
# Add working directory if provided
1470-
working_directory = cfg.get("working_directory")
14711375
if working_directory:
14721376
payload["workingDirectory"] = working_directory
1473-
1474-
# Add config directory if provided
1475-
config_dir = cfg.get("config_dir")
14761377
if config_dir:
14771378
payload["configDir"] = config_dir
14781379

1479-
# Add disable resume flag if provided
1480-
disable_resume = cfg.get("disable_resume")
1481-
if disable_resume:
1482-
payload["disableResume"] = True
1483-
1484-
# Add MCP servers configuration if provided
1485-
mcp_servers = cfg.get("mcp_servers")
1380+
# TODO: disable_resume is not a keyword arg yet; keeping for future use
14861381
if mcp_servers:
14871382
payload["mcpServers"] = mcp_servers
14881383
payload["envValueMode"] = "direct"
14891384

1490-
# Add custom agents configuration if provided
1491-
custom_agents = cfg.get("custom_agents")
14921385
if custom_agents:
14931386
payload["customAgents"] = [
1494-
self._convert_custom_agent_to_wire_format(agent) for agent in custom_agents
1387+
self._convert_custom_agent_to_wire_format(a) for a in custom_agents
14951388
]
14961389

1497-
# Add agent selection if provided
1498-
agent = cfg.get("agent")
14991390
if agent:
15001391
payload["agent"] = agent
1501-
1502-
# Add skill directories configuration if provided
1503-
skill_directories = cfg.get("skill_directories")
15041392
if skill_directories:
15051393
payload["skillDirectories"] = skill_directories
1506-
1507-
# Add disabled skills configuration if provided
1508-
disabled_skills = cfg.get("disabled_skills")
15091394
if disabled_skills:
15101395
payload["disabledSkills"] = disabled_skills
15111396

1512-
# Add infinite sessions configuration if provided
1513-
infinite_sessions = cfg.get("infinite_sessions")
15141397
if infinite_sessions:
15151398
wire_config: dict[str, Any] = {}
15161399
if "enabled" in infinite_sessions:
@@ -1535,13 +1418,12 @@ async def resume_session(
15351418
# Create and register the session before issuing the RPC so that
15361419
# events emitted by the CLI (e.g. session.start) are not dropped.
15371420
session = CopilotSession(session_id, self._client, None)
1538-
session._register_tools(cfg.get("tools"))
1421+
session._register_tools(tools)
15391422
session._register_permission_handler(on_permission_request)
15401423
if on_user_input_request:
15411424
session._register_user_input_handler(on_user_input_request)
15421425
if hooks:
15431426
session._register_hooks(hooks)
1544-
on_event = cfg.get("on_event")
15451427
if on_event:
15461428
session.on(on_event)
15471429
with self._sessions_lock:

0 commit comments

Comments
 (0)