createSession method
Creates a new Copilot session.
Implementation
Future<CopilotSession> createSession({
required SessionConfig config,
}) async {
await _autoStartIfNeeded();
// Build payload with merged tools and sdkProtocolVersion
final payload = config.toJson();
if (options.tools.isNotEmpty) {
final seen = <String>{};
final merged = <Map<String, dynamic>>[];
// Client tools first (matching upstream dedup order)
for (final t in options.tools) {
if (seen.add(t.name)) merged.add(t.toRegistrationJson());
}
for (final t in config.tools) {
if (seen.add(t.name)) merged.add(t.toRegistrationJson());
}
payload['tools'] = merged;
}
final result = await _connection!.sendRequest(
'session.create',
payload,
const Duration(seconds: 30),
);
final resultMap = result as Map<String, dynamic>;
final sessionId = resultMap['sessionId'] as String;
final workspacePath = resultMap['workspacePath'] as String?;
// Resolve effective handlers (session config > client options)
final effectiveConfig = SessionConfig(
sessionId: config.sessionId,
clientName: config.clientName,
model: config.model,
systemMessage: config.systemMessage,
infiniteSessions: config.infiniteSessions,
streaming: config.streaming,
tools: config.tools,
availableTools: config.availableTools,
excludedTools: config.excludedTools,
mcpServers: config.mcpServers,
customAgents: config.customAgents,
skillDirectories: config.skillDirectories,
disabledSkills: config.disabledSkills,
hooks: config.hooks ?? options.hooks,
provider: config.provider,
reasoningEffort: config.reasoningEffort,
mode: config.mode,
attachments: config.attachments,
configDir: config.configDir,
workingDirectory: config.workingDirectory,
onPermissionRequest: config.onPermissionRequest,
onUserInputRequest:
config.onUserInputRequest ?? options.onUserInputRequest,
);
final session = CopilotSession(
sessionId: sessionId,
connection: _connection!,
config: effectiveConfig,
workspacePath: workspacePath,
);
_sessions[sessionId] = session;
session.onDestroyed = () => _sessions.remove(sessionId);
return session;
}