createSession method

Future<CopilotSession> createSession({
  1. required SessionConfig config,
})

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;
}