diff --git a/.gitattributes b/.gitattributes index 8d991b1183..33cefe1469 100644 --- a/.gitattributes +++ b/.gitattributes @@ -6,7 +6,7 @@ java/**/*.java text eol=lf # Generated files — keep LF line endings so codegen output is deterministic across platforms. nodejs/src/generated/* eol=lf linguist-generated=true dotnet/src/Generated/* eol=lf linguist-generated=true -python/copilot/generated/* eol=lf linguist-generated=true +python/copilot/_generated/* eol=lf linguist-generated=true go/zsession_events.go eol=lf linguist-generated=true go/zsession_encoding.go eol=lf linguist-generated=true go/rpc/zrpc.go eol=lf linguist-generated=true diff --git a/.github/workflows/codegen-check.yml b/.github/workflows/codegen-check.yml index f37a71e45e..7c9ccdea00 100644 --- a/.github/workflows/codegen-check.yml +++ b/.github/workflows/codegen-check.yml @@ -10,7 +10,7 @@ on: - 'scripts/codegen/**' - 'nodejs/src/generated/**' - 'dotnet/src/Generated/**' - - 'python/copilot/generated/**' + - 'python/copilot/_generated/**' - 'go/generated_*.go' - 'go/rpc/**' - 'rust/src/generated/**' diff --git a/python/copilot/__init__.py b/python/copilot/__init__.py index 5d9e3f9500..5bf8faae85 100644 --- a/python/copilot/__init__.py +++ b/python/copilot/__init__.py @@ -11,6 +11,27 @@ # Register the public ``copilot.session_events`` namespace. from . import session_events as session_events # noqa: F401 +from ._generated.rpc import ( + CurrentToolMetadata, + GitHubTelemetryClientInfo, + GitHubTelemetryEvent, + GitHubTelemetryNotification, + GitHubTokenAcquireReason, + GitHubTokenAcquireResult, + GitHubTokenAcquireResultKind, + ModelBillingTokenPrices, + ModelBillingTokenPricesLongContext, + PermissionDecisionContext, + PermissionDecisionOutcome, + PermissionDecisionSource, + PermissionDecisionSurface, + PermissionResponseCapability, +) +from ._generated.session_events import ( + PermissionRequest, + SessionEvent, + SessionEventType, +) from ._mode import ( BUILTIN_TOOLS_ISOLATED, CopilotClientMode, @@ -89,27 +110,6 @@ CopilotWebSocketHandler, LlmInferenceHeaders, ) -from .generated.rpc import ( - CurrentToolMetadata, - GitHubTelemetryClientInfo, - GitHubTelemetryEvent, - GitHubTelemetryNotification, - GitHubTokenAcquireReason, - GitHubTokenAcquireResult, - GitHubTokenAcquireResultKind, - ModelBillingTokenPrices, - ModelBillingTokenPricesLongContext, - PermissionDecisionContext, - PermissionDecisionOutcome, - PermissionDecisionSource, - PermissionDecisionSurface, - PermissionResponseCapability, -) -from .generated.session_events import ( - PermissionRequest, - SessionEvent, - SessionEventType, -) from .session import ( AgentStopHandler, AgentStopHookInput, diff --git a/python/copilot/generated/__init__.py b/python/copilot/_generated/__init__.py similarity index 100% rename from python/copilot/generated/__init__.py rename to python/copilot/_generated/__init__.py diff --git a/python/copilot/generated/rpc.py b/python/copilot/_generated/rpc.py similarity index 99% rename from python/copilot/generated/rpc.py rename to python/copilot/_generated/rpc.py index ac4cc5441d..73338d7f2a 100644 --- a/python/copilot/generated/rpc.py +++ b/python/copilot/_generated/rpc.py @@ -5168,7 +5168,7 @@ def to_dict(self) -> dict: # Experimental: this type is part of an experimental API and may change or be removed. # Internal: this type is an internal SDK API and is not part of the public surface. @dataclass -class MCPConfigureGitHubRequest: +class _MCPConfigureGitHubRequest: """Credential-free authentication identity used to configure GitHub MCP.""" auth_info: Any = None @@ -5177,10 +5177,10 @@ class MCPConfigureGitHubRequest: """ @staticmethod - def from_dict(obj: Any) -> 'MCPConfigureGitHubRequest': + def from_dict(obj: Any) -> '_MCPConfigureGitHubRequest': assert isinstance(obj, dict) auth_info = obj.get("authInfo") - return MCPConfigureGitHubRequest(auth_info) + return _MCPConfigureGitHubRequest(auth_info) def to_dict(self) -> dict: result: dict = {} @@ -5973,7 +5973,7 @@ class MCPServerConfigType(Enum): # Experimental: this type is part of an experimental API and may change or be removed. # Internal: this type is an internal SDK API and is not part of the public surface. @dataclass -class MCPReloadWithConfigRequest: +class _MCPReloadWithConfigRequest: """Opaque MCP reload configuration.""" config: Any = None @@ -5982,10 +5982,10 @@ class MCPReloadWithConfigRequest: """ @staticmethod - def from_dict(obj: Any) -> 'MCPReloadWithConfigRequest': + def from_dict(obj: Any) -> '_MCPReloadWithConfigRequest': assert isinstance(obj, dict) config = obj.get("config") - return MCPReloadWithConfigRequest(config) + return _MCPReloadWithConfigRequest(config) def to_dict(self) -> dict: result: dict = {} @@ -6152,7 +6152,7 @@ class MCPServerConfigHTTPType(Enum): # Experimental: this type is part of an experimental API and may change or be removed. # Internal: this type is an internal SDK API and is not part of the public surface. -class MCPServerConfigMemoryType(Enum): +class _MCPServerConfigMemoryType(Enum): """In-process MCP transport type.""" MEMORY = "memory" @@ -6228,17 +6228,17 @@ def to_dict(self) -> dict: # Experimental: this type is part of an experimental API and may change or be removed. # Internal: this type is an internal SDK API and is not part of the public surface. @dataclass -class MCPUnregisterExternalClientRequest: +class _MCPUnregisterExternalClientRequest: """Server name identifying the external client to remove.""" server_name: str """Server name of the external client to unregister""" @staticmethod - def from_dict(obj: Any) -> 'MCPUnregisterExternalClientRequest': + def from_dict(obj: Any) -> '_MCPUnregisterExternalClientRequest': assert isinstance(obj, dict) server_name = from_str(obj.get("serverName")) - return MCPUnregisterExternalClientRequest(server_name) + return _MCPUnregisterExternalClientRequest(server_name) def to_dict(self) -> dict: result: dict = {} @@ -34457,7 +34457,7 @@ def to_dict(self) -> dict: # Experimental: this type is part of an experimental API and may change or be removed. # Internal: this type is an internal SDK API and is not part of the public surface. @dataclass -class MCPRegisterExternalClientRequest: +class _MCPRegisterExternalClientRequest: """Registration parameters for an external MCP client.""" server_name: str @@ -34477,13 +34477,13 @@ class MCPRegisterExternalClientRequest: """ @staticmethod - def from_dict(obj: Any) -> 'MCPRegisterExternalClientRequest': + def from_dict(obj: Any) -> '_MCPRegisterExternalClientRequest': assert isinstance(obj, dict) client = obj.get("client") config = obj.get("config") server_name = from_str(obj.get("serverName")) transport = obj.get("transport") - return MCPRegisterExternalClientRequest(client, config, server_name, transport) + return _MCPRegisterExternalClientRequest(client, config, server_name, transport) def to_dict(self) -> dict: result: dict = {} @@ -34725,7 +34725,7 @@ def to_dict(self) -> dict: # Experimental: this type is part of an experimental API and may change or be removed. # Internal: this type is an internal SDK API and is not part of the public surface. @dataclass -class MCPReloadConfig: +class _MCPReloadConfig: """In-process MCP reload configuration.""" mcp_servers: dict[str, MCPServerConfig] @@ -34745,7 +34745,7 @@ class MCPReloadConfig: use_cached_tool_snapshots: bool | None = None @staticmethod - def from_dict(obj: Any) -> 'MCPReloadConfig': + def from_dict(obj: Any) -> '_MCPReloadConfig': assert isinstance(obj, dict) mcp_servers = from_dict(MCPServerConfig.from_dict, obj.get("mcpServers")) active_git_hub_token = from_union([from_str, from_none], obj.get("activeGitHubToken")) @@ -34760,7 +34760,7 @@ def from_dict(obj: Any) -> 'MCPReloadConfig': mcp3_p_enabled = from_union([from_bool, from_none], obj.get("mcp3pEnabled")) secret_store = obj.get("secretStore") use_cached_tool_snapshots = from_union([from_bool, from_none], obj.get("useCachedToolSnapshots")) - return MCPReloadConfig(mcp_servers, active_git_hub_token, cli_enabled_servers, config_filter, disabled_servers, enabled_servers, force_restart, github_mcp_tool_options, github_mcp_user_override, include_workspace_sources, mcp3_p_enabled, secret_store, use_cached_tool_snapshots) + return _MCPReloadConfig(mcp_servers, active_git_hub_token, cli_enabled_servers, config_filter, disabled_servers, enabled_servers, force_restart, github_mcp_tool_options, github_mcp_user_override, include_workspace_sources, mcp3_p_enabled, secret_store, use_cached_tool_snapshots) def to_dict(self) -> dict: result: dict = {} @@ -35029,10 +35029,10 @@ def to_dict(self) -> dict: # Experimental: this type is part of an experimental API and may change or be removed. # Internal: this type is an internal SDK API and is not part of the public surface. @dataclass -class MCPServerConfigMemory: +class _MCPServerConfigMemory: """In-process MCP server configuration used by embedded SDK clients.""" - type: MCPServerConfigMemoryType + type: _MCPServerConfigMemoryType server_instance: Any = None """In-process MCP server instance. This value cannot cross a JSON-RPC boundary.""" @@ -35094,10 +35094,10 @@ class MCPServerConfigMemory: """Tools to include. Defaults to all tools if not specified.""" @staticmethod - def from_dict(obj: Any) -> 'MCPServerConfigMemory': + def from_dict(obj: Any) -> '_MCPServerConfigMemory': assert isinstance(obj, dict) server_instance = obj.get("serverInstance") - type = MCPServerConfigMemoryType(obj.get("type")) + type = _MCPServerConfigMemoryType(obj.get("type")) config_warnings = from_union([lambda x: from_list(from_str, x), from_none], obj.get("configWarnings")) defer_tools = from_union([MCPServerConfigDeferTools, from_none], obj.get("deferTools")) disable_secret_masking = from_union([from_bool, from_none], obj.get("disableSecretMasking")) @@ -35117,12 +35117,12 @@ def from_dict(obj: Any) -> 'MCPServerConfigMemory': source_plugin_version = from_union([from_str, from_none], obj.get("sourcePluginVersion")) timeout = from_union([from_int, from_none], obj.get("timeout")) tools = from_union([lambda x: from_list(from_str, x), from_none], obj.get("tools")) - return MCPServerConfigMemory(server_instance, type, config_warnings, defer_tools, disable_secret_masking, disable_tool_cache, display_name, events, exclude_tools, filter_mapping, is_default_server, notifications, oidc, safe_for_telemetry, source, source_path, source_plugin, source_plugin_spec, source_plugin_version, timeout, tools) + return _MCPServerConfigMemory(server_instance, type, config_warnings, defer_tools, disable_secret_masking, disable_tool_cache, display_name, events, exclude_tools, filter_mapping, is_default_server, notifications, oidc, safe_for_telemetry, source, source_path, source_plugin, source_plugin_spec, source_plugin_version, timeout, tools) def to_dict(self) -> dict: result: dict = {} result["serverInstance"] = self.server_instance - result["type"] = to_enum(MCPServerConfigMemoryType, self.type) + result["type"] = to_enum(_MCPServerConfigMemoryType, self.type) if self.config_warnings is not None: result["configWarnings"] = from_union([lambda x: from_list(from_str, x), from_none], self.config_warnings) if self.defer_tools is not None: @@ -36874,7 +36874,7 @@ class RPC: mcp_config_list: MCPConfigList mcp_config_remove_request: MCPConfigRemoveRequest mcp_config_update_request: MCPConfigUpdateRequest - mcp_configure_git_hub_request: MCPConfigureGitHubRequest + mcp_configure_git_hub_request: _MCPConfigureGitHubRequest mcp_configure_git_hub_result: MCPConfigureGitHubResult mcp_disable_request: MCPDisableRequest mcp_discover_request: MCPDiscoverRequest @@ -36941,9 +36941,9 @@ class RPC: mcp_plan_transport_choice_package: MCPPlanTransportChoicePackage mcp_plan_transport_choice_remote: MCPPlanTransportChoiceRemote mcp_plan_value_category: MCPPlanValueCategory - mcp_register_external_client_request: MCPRegisterExternalClientRequest - mcp_reload_config: MCPReloadConfig - mcp_reload_with_config_request: MCPReloadWithConfigRequest + mcp_register_external_client_request: _MCPRegisterExternalClientRequest + mcp_reload_config: _MCPReloadConfig + mcp_reload_with_config_request: _MCPReloadWithConfigRequest mcp_remove_git_hub_result: MCPRemoveGitHubResult mcp_resource: MCPResource mcp_resource_annotations: MCPResourceAnnotations @@ -36976,8 +36976,8 @@ class RPC: mcp_server_config_http: MCPServerConfigHTTP mcp_server_config_http_oauth_grant_type: MCPGrantType mcp_server_config_http_type: MCPServerConfigHTTPType - mcp_server_config_memory: MCPServerConfigMemory - mcp_server_config_memory_type: MCPServerConfigMemoryType + mcp_server_config_memory: _MCPServerConfigMemory + mcp_server_config_memory_type: _MCPServerConfigMemoryType mcp_server_config_stdio: MCPServerConfigStdio mcp_server_config_stdio_type: MCPServerConfigStdioType mcp_server_failure_info: MCPServerFailureInfo @@ -36993,7 +36993,7 @@ class RPC: mcp_tools: MCPTools mcp_tool_ui: MCPToolUI mcp_tool_ui_visibility: MCPToolUIVisibility - mcp_unregister_external_client_request: MCPUnregisterExternalClientRequest + mcp_unregister_external_client_request: _MCPUnregisterExternalClientRequest memory_configuration: MemoryConfiguration metadata_context_attribution_result: MetadataContextAttributionResult metadata_context_heaviest_messages_request: MetadataContextHeaviestMessagesRequest @@ -38094,7 +38094,7 @@ def from_dict(obj: Any) -> 'RPC': mcp_config_list = MCPConfigList.from_dict(obj.get("McpConfigList")) mcp_config_remove_request = MCPConfigRemoveRequest.from_dict(obj.get("McpConfigRemoveRequest")) mcp_config_update_request = MCPConfigUpdateRequest.from_dict(obj.get("McpConfigUpdateRequest")) - mcp_configure_git_hub_request = MCPConfigureGitHubRequest.from_dict(obj.get("McpConfigureGitHubRequest")) + mcp_configure_git_hub_request = _MCPConfigureGitHubRequest.from_dict(obj.get("McpConfigureGitHubRequest")) mcp_configure_git_hub_result = MCPConfigureGitHubResult.from_dict(obj.get("McpConfigureGitHubResult")) mcp_disable_request = MCPDisableRequest.from_dict(obj.get("McpDisableRequest")) mcp_discover_request = MCPDiscoverRequest.from_dict(obj.get("McpDiscoverRequest")) @@ -38161,9 +38161,9 @@ def from_dict(obj: Any) -> 'RPC': mcp_plan_transport_choice_package = MCPPlanTransportChoicePackage.from_dict(obj.get("McpPlanTransportChoicePackage")) mcp_plan_transport_choice_remote = MCPPlanTransportChoiceRemote.from_dict(obj.get("McpPlanTransportChoiceRemote")) mcp_plan_value_category = MCPPlanValueCategory(obj.get("McpPlanValueCategory")) - mcp_register_external_client_request = MCPRegisterExternalClientRequest.from_dict(obj.get("McpRegisterExternalClientRequest")) - mcp_reload_config = MCPReloadConfig.from_dict(obj.get("McpReloadConfig")) - mcp_reload_with_config_request = MCPReloadWithConfigRequest.from_dict(obj.get("McpReloadWithConfigRequest")) + mcp_register_external_client_request = _MCPRegisterExternalClientRequest.from_dict(obj.get("McpRegisterExternalClientRequest")) + mcp_reload_config = _MCPReloadConfig.from_dict(obj.get("McpReloadConfig")) + mcp_reload_with_config_request = _MCPReloadWithConfigRequest.from_dict(obj.get("McpReloadWithConfigRequest")) mcp_remove_git_hub_result = MCPRemoveGitHubResult.from_dict(obj.get("McpRemoveGitHubResult")) mcp_resource = MCPResource.from_dict(obj.get("McpResource")) mcp_resource_annotations = MCPResourceAnnotations.from_dict(obj.get("McpResourceAnnotations")) @@ -38196,8 +38196,8 @@ def from_dict(obj: Any) -> 'RPC': mcp_server_config_http = MCPServerConfigHTTP.from_dict(obj.get("McpServerConfigHttp")) mcp_server_config_http_oauth_grant_type = MCPGrantType(obj.get("McpServerConfigHttpOauthGrantType")) mcp_server_config_http_type = MCPServerConfigHTTPType(obj.get("McpServerConfigHttpType")) - mcp_server_config_memory = MCPServerConfigMemory.from_dict(obj.get("McpServerConfigMemory")) - mcp_server_config_memory_type = MCPServerConfigMemoryType(obj.get("McpServerConfigMemoryType")) + mcp_server_config_memory = _MCPServerConfigMemory.from_dict(obj.get("McpServerConfigMemory")) + mcp_server_config_memory_type = _MCPServerConfigMemoryType(obj.get("McpServerConfigMemoryType")) mcp_server_config_stdio = MCPServerConfigStdio.from_dict(obj.get("McpServerConfigStdio")) mcp_server_config_stdio_type = MCPServerConfigStdioType(obj.get("McpServerConfigStdioType")) mcp_server_failure_info = MCPServerFailureInfo.from_dict(obj.get("McpServerFailureInfo")) @@ -38213,7 +38213,7 @@ def from_dict(obj: Any) -> 'RPC': mcp_tools = MCPTools.from_dict(obj.get("McpTools")) mcp_tool_ui = MCPToolUI.from_dict(obj.get("McpToolUi")) mcp_tool_ui_visibility = MCPToolUIVisibility(obj.get("McpToolUiVisibility")) - mcp_unregister_external_client_request = MCPUnregisterExternalClientRequest.from_dict(obj.get("McpUnregisterExternalClientRequest")) + mcp_unregister_external_client_request = _MCPUnregisterExternalClientRequest.from_dict(obj.get("McpUnregisterExternalClientRequest")) memory_configuration = MemoryConfiguration.from_dict(obj.get("MemoryConfiguration")) metadata_context_attribution_result = MetadataContextAttributionResult.from_dict(obj.get("MetadataContextAttributionResult")) metadata_context_heaviest_messages_request = MetadataContextHeaviestMessagesRequest.from_dict(obj.get("MetadataContextHeaviestMessagesRequest")) @@ -39314,7 +39314,7 @@ def to_dict(self) -> dict: result["McpConfigList"] = to_class(MCPConfigList, self.mcp_config_list) result["McpConfigRemoveRequest"] = to_class(MCPConfigRemoveRequest, self.mcp_config_remove_request) result["McpConfigUpdateRequest"] = to_class(MCPConfigUpdateRequest, self.mcp_config_update_request) - result["McpConfigureGitHubRequest"] = to_class(MCPConfigureGitHubRequest, self.mcp_configure_git_hub_request) + result["McpConfigureGitHubRequest"] = to_class(_MCPConfigureGitHubRequest, self.mcp_configure_git_hub_request) result["McpConfigureGitHubResult"] = to_class(MCPConfigureGitHubResult, self.mcp_configure_git_hub_result) result["McpDisableRequest"] = to_class(MCPDisableRequest, self.mcp_disable_request) result["McpDiscoverRequest"] = to_class(MCPDiscoverRequest, self.mcp_discover_request) @@ -39381,9 +39381,9 @@ def to_dict(self) -> dict: result["McpPlanTransportChoicePackage"] = to_class(MCPPlanTransportChoicePackage, self.mcp_plan_transport_choice_package) result["McpPlanTransportChoiceRemote"] = to_class(MCPPlanTransportChoiceRemote, self.mcp_plan_transport_choice_remote) result["McpPlanValueCategory"] = to_enum(MCPPlanValueCategory, self.mcp_plan_value_category) - result["McpRegisterExternalClientRequest"] = to_class(MCPRegisterExternalClientRequest, self.mcp_register_external_client_request) - result["McpReloadConfig"] = to_class(MCPReloadConfig, self.mcp_reload_config) - result["McpReloadWithConfigRequest"] = to_class(MCPReloadWithConfigRequest, self.mcp_reload_with_config_request) + result["McpRegisterExternalClientRequest"] = to_class(_MCPRegisterExternalClientRequest, self.mcp_register_external_client_request) + result["McpReloadConfig"] = to_class(_MCPReloadConfig, self.mcp_reload_config) + result["McpReloadWithConfigRequest"] = to_class(_MCPReloadWithConfigRequest, self.mcp_reload_with_config_request) result["McpRemoveGitHubResult"] = to_class(MCPRemoveGitHubResult, self.mcp_remove_git_hub_result) result["McpResource"] = to_class(MCPResource, self.mcp_resource) result["McpResourceAnnotations"] = to_class(MCPResourceAnnotations, self.mcp_resource_annotations) @@ -39416,8 +39416,8 @@ def to_dict(self) -> dict: result["McpServerConfigHttp"] = to_class(MCPServerConfigHTTP, self.mcp_server_config_http) result["McpServerConfigHttpOauthGrantType"] = to_enum(MCPGrantType, self.mcp_server_config_http_oauth_grant_type) result["McpServerConfigHttpType"] = to_enum(MCPServerConfigHTTPType, self.mcp_server_config_http_type) - result["McpServerConfigMemory"] = to_class(MCPServerConfigMemory, self.mcp_server_config_memory) - result["McpServerConfigMemoryType"] = to_enum(MCPServerConfigMemoryType, self.mcp_server_config_memory_type) + result["McpServerConfigMemory"] = to_class(_MCPServerConfigMemory, self.mcp_server_config_memory) + result["McpServerConfigMemoryType"] = to_enum(_MCPServerConfigMemoryType, self.mcp_server_config_memory_type) result["McpServerConfigStdio"] = to_class(MCPServerConfigStdio, self.mcp_server_config_stdio) result["McpServerConfigStdioType"] = to_enum(MCPServerConfigStdioType, self.mcp_server_config_stdio_type) result["McpServerFailureInfo"] = to_class(MCPServerFailureInfo, self.mcp_server_failure_info) @@ -39433,7 +39433,7 @@ def to_dict(self) -> dict: result["McpTools"] = to_class(MCPTools, self.mcp_tools) result["McpToolUi"] = to_class(MCPToolUI, self.mcp_tool_ui) result["McpToolUiVisibility"] = to_enum(MCPToolUIVisibility, self.mcp_tool_ui_visibility) - result["McpUnregisterExternalClientRequest"] = to_class(MCPUnregisterExternalClientRequest, self.mcp_unregister_external_client_request) + result["McpUnregisterExternalClientRequest"] = to_class(_MCPUnregisterExternalClientRequest, self.mcp_unregister_external_client_request) result["MemoryConfiguration"] = to_class(MemoryConfiguration, self.memory_configuration) result["MetadataContextAttributionResult"] = to_class(MetadataContextAttributionResult, self.metadata_context_attribution_result) result["MetadataContextHeaviestMessagesRequest"] = to_class(MetadataContextHeaviestMessagesRequest, self.metadata_context_heaviest_messages_request) @@ -42949,25 +42949,25 @@ def __init__(self, client: "JsonRpcClient", session_id: str): self._client = client self._session_id = session_id - async def _reload_with_config(self, params: MCPReloadWithConfigRequest, *, timeout: float | None = None) -> MCPStartServersResult: + async def _reload_with_config(self, params: _MCPReloadWithConfigRequest, *, timeout: float | None = None) -> MCPStartServersResult: "Reloads MCP server connections for the session with an explicit host-provided configuration.\n\nArgs:\n params: Opaque MCP reload configuration.\n\nReturns:\n MCP server startup filtering result.\n\n:meta private:\n\nInternal SDK API; not part of the public surface." params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} params_dict["sessionId"] = self._session_id return MCPStartServersResult.from_dict(await self._client.request("session.mcp.reloadWithConfig", params_dict, **_timeout_kwargs(timeout))) - async def _configure_git_hub(self, params: MCPConfigureGitHubRequest, *, timeout: float | None = None) -> MCPConfigureGitHubResult: + async def _configure_git_hub(self, params: _MCPConfigureGitHubRequest, *, timeout: float | None = None) -> MCPConfigureGitHubResult: "Configures the built-in GitHub MCP server for the session's current auth context.\n\nArgs:\n params: Credential-free authentication identity used to configure GitHub MCP.\n\nReturns:\n Result of configuring GitHub MCP.\n\n:meta private:\n\nInternal SDK API; not part of the public surface." params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} params_dict["sessionId"] = self._session_id return MCPConfigureGitHubResult.from_dict(await self._client.request("session.mcp.configureGitHub", params_dict, **_timeout_kwargs(timeout))) - async def _register_external_client(self, params: MCPRegisterExternalClientRequest, *, timeout: float | None = None) -> None: + async def _register_external_client(self, params: _MCPRegisterExternalClientRequest, *, timeout: float | None = None) -> None: "Registers a pre-connected external MCP client (e.g. IDE) on the session's host. The caller retains lifecycle ownership of the client and transport. Marked internal because the `client` and `transport` arguments are in-process MCP SDK instances that cannot be serialized across the JSON-RPC boundary; once the CLI moves on top of the SDK, external clients will be expressed as transport configs the runtime can construct itself.\n\nArgs:\n params: Registration parameters for an external MCP client.\n\n:meta private:\n\nInternal SDK API; not part of the public surface." params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} params_dict["sessionId"] = self._session_id await self._client.request("session.mcp.registerExternalClient", params_dict, **_timeout_kwargs(timeout)) - async def _unregister_external_client(self, params: MCPUnregisterExternalClientRequest, *, timeout: float | None = None) -> None: + async def _unregister_external_client(self, params: _MCPUnregisterExternalClientRequest, *, timeout: float | None = None) -> None: "Unregisters a previously registered external MCP client by server name. Marked internal as the paired companion of `registerExternalClient`: only in-process callers that registered a client this way can meaningfully unregister it. Disappears alongside `registerExternalClient`: once external clients are described to the runtime as config rather than handed in as instances, lifecycle (including deregistration) is owned entirely by the runtime.\n\nArgs:\n params: Server name identifying the external client to remove.\n\n:meta private:\n\nInternal SDK API; not part of the public surface." params_dict: dict[str, Any] = {k: v for k, v in params.to_dict().items() if v is not None} params_dict["sessionId"] = self._session_id @@ -43886,7 +43886,6 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "MCPConfigList", "MCPConfigRemoveRequest", "MCPConfigUpdateRequest", - "MCPConfigureGitHubRequest", "MCPConfigureGitHubResult", "MCPDisableRequest", "MCPDiscoverRequest", @@ -43957,9 +43956,6 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "MCPPlanTransportChoicePackage", "MCPPlanTransportChoiceRemote", "MCPPlanValueCategory", - "MCPRegisterExternalClientRequest", - "MCPReloadConfig", - "MCPReloadWithConfigRequest", "MCPRemoveGitHubResult", "MCPResource", "MCPResourceAnnotations", @@ -43990,8 +43986,6 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "MCPServerConfigDeferTools", "MCPServerConfigHTTP", "MCPServerConfigHTTPType", - "MCPServerConfigMemory", - "MCPServerConfigMemoryType", "MCPServerConfigStdio", "MCPServerConfigStdioType", "MCPServerConfigType", @@ -44008,7 +44002,6 @@ async def handle_git_hub_token_get_token(params: dict) -> dict | None: "MCPToolUI", "MCPToolUIVisibility", "MCPTools", - "MCPUnregisterExternalClientRequest", "ManagedSettingsReadResult", "MarketplaceAddResult", "MarketplaceBrowseResult", diff --git a/python/copilot/generated/session_events.py b/python/copilot/_generated/session_events.py similarity index 100% rename from python/copilot/generated/session_events.py rename to python/copilot/_generated/session_events.py diff --git a/python/copilot/canvas.py b/python/copilot/canvas.py index 9b8dec5258..3a6028f375 100644 --- a/python/copilot/canvas.py +++ b/python/copilot/canvas.py @@ -19,7 +19,7 @@ from dataclasses import dataclass from typing import Any -from .generated.rpc import ( +from ._generated.rpc import ( CanvasAction, CanvasHostContext, CanvasHostContextCapabilities, diff --git a/python/copilot/client.py b/python/copilot/client.py index ab3410a56c..00d1487737 100644 --- a/python/copilot/client.py +++ b/python/copilot/client.py @@ -35,6 +35,29 @@ from ._diagnostics import log_timing from ._ffi_runtime_host import FfiRuntimeHost +from ._generated.rpc import ( + ClientGlobalApiHandlers, + ClientSessionApiHandlers, + GitHubTelemetryNotification, + GitHubTokenAcquireReason, + GitHubTokenAcquireRequest, + GitHubTokenAcquireResult, + ModelBillingTokenPrices, + ModelBillingTokenPricesLongContext, # noqa: F401 + OpenCanvasInstance, + RemoteSessionMode, + ServerRpc, + _ConnectResult, + _HookInvokeRequest, + _HookInvokeResponse, + from_datetime, + register_client_global_api_handlers, + register_client_session_api_handlers, +) +from ._generated.session_events import ( + SessionEvent, + session_event_from_dict, +) from ._jsonrpc import JsonRpcClient, JsonRpcError, ProcessExitedError from ._mode import ( CopilotClientMode, @@ -67,29 +90,6 @@ ExtensionInfo, ) from .copilot_request_handler import CopilotRequestHandler, create_copilot_request_adapter -from .generated.rpc import ( - ClientGlobalApiHandlers, - ClientSessionApiHandlers, - GitHubTelemetryNotification, - GitHubTokenAcquireReason, - GitHubTokenAcquireRequest, - GitHubTokenAcquireResult, - ModelBillingTokenPrices, - ModelBillingTokenPricesLongContext, # noqa: F401 - OpenCanvasInstance, - RemoteSessionMode, - ServerRpc, - _ConnectResult, - _HookInvokeRequest, - _HookInvokeResponse, - from_datetime, - register_client_global_api_handlers, - register_client_session_api_handlers, -) -from .generated.session_events import ( - SessionEvent, - session_event_from_dict, -) from .session import ( AutoModeSwitchHandler, BearerTokenProvider, @@ -4764,7 +4764,7 @@ async def _apply_post_create_options_patch( If the patch is rejected, tear the session down so empty-mode callers never end up with a permissive session. """ - from .generated.rpc import SessionInstalledPlugin, SessionUpdateOptionsParams + from ._generated.rpc import SessionInstalledPlugin, SessionUpdateOptionsParams patch = _post_create_options_patch( mode, diff --git a/python/copilot/copilot_request_handler.py b/python/copilot/copilot_request_handler.py index 893309ca76..c519df4b88 100644 --- a/python/copilot/copilot_request_handler.py +++ b/python/copilot/copilot_request_handler.py @@ -15,7 +15,7 @@ transparent forwarding connection via the ``websockets`` library. :func:`create_copilot_request_adapter` converts a handler into the generated -:class:`~copilot.generated.rpc.LlmInferenceHandler` shape so the RPC dispatcher +:class:`~copilot._generated.rpc.LlmInferenceHandler` shape so the RPC dispatcher can route inbound ``httpRequestStart`` / ``httpRequestChunk`` frames through it. """ @@ -27,7 +27,7 @@ from dataclasses import dataclass, field from typing import TYPE_CHECKING, Any -from .generated.rpc import ( +from ._generated.rpc import ( LlmInferenceHTTPRequestChunkRequest, LlmInferenceHTTPRequestChunkResult, LlmInferenceHTTPRequestStartRequest, diff --git a/python/copilot/rpc.py b/python/copilot/rpc.py index 5585d8ce7a..d834155943 100644 --- a/python/copilot/rpc.py +++ b/python/copilot/rpc.py @@ -3,16 +3,16 @@ These types are auto-generated from the Copilot CLI protocol schemas. This module is the stable public access point so callers can write ``copilot.rpc.SessionUpdateOptionsParams`` without depending on the internal -``copilot.generated`` package layout. +``copilot._generated`` package layout. """ -from .generated.rpc import * # noqa: F401, F403 -from .generated.rpc import ( +from ._generated.rpc import * # noqa: F401, F403 +from ._generated.rpc import ( BuiltinToolInputSchemaType as UIElicitationSchemaType, # noqa: F401 ) -from .generated.rpc import ( +from ._generated.rpc import ( SessionFsReaddirWithTypesEntryType as SessionFSReaddirWithTypesEntryType, # noqa: F401 ) -from .generated.rpc import __all__ as _generated_all +from ._generated.rpc import __all__ as _generated_all __all__ = [*_generated_all, "UIElicitationSchemaType"] diff --git a/python/copilot/session.py b/python/copilot/session.py index 3c6d3d54a4..7ebdf5009b 100644 --- a/python/copilot/session.py +++ b/python/copilot/session.py @@ -23,10 +23,7 @@ from typing import TYPE_CHECKING, Any, Literal, NotRequired, Required, TypedDict, cast from ._diagnostics import log_timing -from ._jsonrpc import JsonRpcError, ProcessExitedError -from ._telemetry import get_trace_context, trace_context -from .canvas import CanvasError, CanvasHandler, OpenCanvasInstance -from .generated.rpc import ( +from ._generated.rpc import ( BuiltinToolInputSchemaType, CanvasProviderCloseRequest, CanvasProviderInvokeActionRequest, @@ -57,14 +54,14 @@ UIElicitationSchemaPropertyType, UIHandlePendingElicitationRequest, ) -from .generated.rpc import ( +from ._generated.rpc import ( CanvasHandler as RpcCanvasHandler, ) -from .generated.rpc import ( +from ._generated.rpc import ( ContextTier as _RpcContextTier, ) -from .generated.rpc import ModelCapabilitiesOverride as _RpcModelCapabilitiesOverride -from .generated.session_events import ( +from ._generated.rpc import ModelCapabilitiesOverride as _RpcModelCapabilitiesOverride +from ._generated.session_events import ( AssistantMessageData, CapabilitiesChangedData, CommandExecuteData, @@ -81,9 +78,12 @@ SessionMode, session_event_from_dict, ) -from .generated.session_events import ( +from ._generated.session_events import ( ReasoningSummary as _RpcReasoningSummary, ) +from ._jsonrpc import JsonRpcError, ProcessExitedError +from ._telemetry import get_trace_context, trace_context +from .canvas import CanvasError, CanvasHandler, OpenCanvasInstance from .tools import ( Tool, ToolHandler, diff --git a/python/copilot/session_events.py b/python/copilot/session_events.py index 584ab47f8a..d182b57208 100644 --- a/python/copilot/session_events.py +++ b/python/copilot/session_events.py @@ -3,8 +3,8 @@ These types are auto-generated from the Copilot CLI session-events schema. This module is the stable public access point so callers can write ``copilot.session_events.AssistantMessageData`` without depending on the -internal ``copilot.generated`` package layout. +internal ``copilot._generated`` package layout. """ -from .generated.session_events import * # noqa: F401, F403 -from .generated.session_events import __all__ # noqa: F401 +from ._generated.session_events import * # noqa: F401, F403 +from ._generated.session_events import __all__ # noqa: F401 diff --git a/python/copilot/session_fs_provider.py b/python/copilot/session_fs_provider.py index c9e90a6442..c73955555c 100644 --- a/python/copilot/session_fs_provider.py +++ b/python/copilot/session_fs_provider.py @@ -23,7 +23,7 @@ from datetime import UTC, datetime from typing import Any -from .generated.rpc import ( +from ._generated.rpc import ( SessionFSError, SessionFSErrorCode, SessionFSExistsResult, @@ -38,13 +38,13 @@ SessionFSSqliteTransactionStatement, SessionFSStatResult, ) -from .generated.rpc import ( +from ._generated.rpc import ( SessionFSSqliteQueryResult as _GeneratedSqliteQueryResult, ) -from .generated.rpc import ( +from ._generated.rpc import ( SessionFSSqliteTransactionError as _GeneratedSqliteTransactionError, ) -from .generated.rpc import ( +from ._generated.rpc import ( SessionFSSqliteTransactionResult as _GeneratedSqliteTransactionResult, ) diff --git a/python/copilot/tools.py b/python/copilot/tools.py index ad0bcb41bd..11d2e799df 100644 --- a/python/copilot/tools.py +++ b/python/copilot/tools.py @@ -20,9 +20,9 @@ from pydantic import BaseModel, ValidationError if TYPE_CHECKING: - from .generated.rpc import CurrentToolMetadata + from ._generated.rpc import CurrentToolMetadata -from .generated.rpc import ( +from ._generated.rpc import ( ExternalToolTextResultForLlm, ExternalToolTextResultForLlmBinaryResultsForLlm, ExternalToolTextResultForLlmBinaryResultsForLlmType, diff --git a/python/e2e/_copilot_request_helpers.py b/python/e2e/_copilot_request_helpers.py index d4073dd197..57d92035f4 100644 --- a/python/e2e/_copilot_request_helpers.py +++ b/python/e2e/_copilot_request_helpers.py @@ -24,7 +24,7 @@ import pytest_asyncio from copilot import CopilotClient, CopilotRequestHandler, RuntimeConnection -from copilot.generated.session_events import AssistantMessageData +from copilot.session_events import AssistantMessageData from .testharness import E2ETestContext diff --git a/python/e2e/test_mcp_oauth_e2e.py b/python/e2e/test_mcp_oauth_e2e.py index 3502ccdf4a..bcec86e09b 100644 --- a/python/e2e/test_mcp_oauth_e2e.py +++ b/python/e2e/test_mcp_oauth_e2e.py @@ -7,7 +7,7 @@ import httpx import pytest -from copilot.generated.rpc import ( +from copilot.rpc import ( GitHubTokenAcquireResultKind, MCPAppsCallToolRequest, MCPListToolsRequest, diff --git a/python/e2e/test_provider_endpoint_e2e.py b/python/e2e/test_provider_endpoint_e2e.py index 875a95b91b..6a047cd035 100644 --- a/python/e2e/test_provider_endpoint_e2e.py +++ b/python/e2e/test_provider_endpoint_e2e.py @@ -8,7 +8,7 @@ import pytest from copilot.client import CopilotClient, RuntimeConnection -from copilot.generated.rpc import ProviderEndpointType, ProviderEndpointWireApi +from copilot.rpc import ProviderEndpointType, ProviderEndpointWireApi from copilot.session import PermissionHandler from .testharness import E2ETestContext diff --git a/python/pyproject.toml b/python/pyproject.toml index e96c587a64..de440adcf2 100644 --- a/python/pyproject.toml +++ b/python/pyproject.toml @@ -60,7 +60,7 @@ line-length = 100 target-version = "py311" exclude = [ "generated", - "copilot/generated", + "copilot/_generated", ] [tool.ruff.lint] @@ -83,7 +83,7 @@ invalid-argument-type = "warn" [tool.ty.src] exclude = [ "generated", - "copilot/generated", + "copilot/_generated", "copilot/test_*.py", ] diff --git a/python/test_client.py b/python/test_client.py index e62154e247..fb37b23031 100644 --- a/python/test_client.py +++ b/python/test_client.py @@ -3281,7 +3281,7 @@ async def request(self, method, params, **kwargs): @pytest.mark.asyncio async def test_event_routes_to_handler(self): - from copilot.generated.rpc import GitHubTelemetryNotification + from copilot.rpc import GitHubTelemetryNotification received: list = [] @@ -3340,7 +3340,7 @@ def on_telemetry(notification): @pytest.mark.asyncio async def test_event_routes_to_async_handler(self): - from copilot.generated.rpc import GitHubTelemetryNotification + from copilot.rpc import GitHubTelemetryNotification received: list = [] delivered = asyncio.Event() diff --git a/python/test_codegen_type_names.py b/python/test_codegen_type_names.py index 5242f1c786..b1b5bb25f4 100644 --- a/python/test_codegen_type_names.py +++ b/python/test_codegen_type_names.py @@ -1,7 +1,7 @@ import re import types -from copilot.generated import rpc +from copilot._generated import rpc def test_permission_approval_exports_are_union_aliases(): diff --git a/python/test_event_forward_compatibility.py b/python/test_event_forward_compatibility.py index a42b9994fc..c19df43faa 100644 --- a/python/test_event_forward_compatibility.py +++ b/python/test_event_forward_compatibility.py @@ -253,7 +253,7 @@ def test_missing_optional_fields_remain_none_after_parsing(self): the schema default instead of ``None`` and broke ``from_dict(to_dict(x))`` round-trips for instances where the field was ``None``. """ - from copilot.generated.session_events import ( + from copilot._generated.session_events import ( _load_PermissionPromptRequest, _load_PermissionRequest, ) @@ -300,13 +300,13 @@ def test_optional_fields_round_trip_none(self): # PermissionRequest is now a discriminated union; the dispatch loader # should round-trip via the correct variant class. - from copilot.generated.session_events import _load_PermissionRequest + from copilot._generated.session_events import _load_PermissionRequest round_tripped = _load_PermissionRequest(permission.to_dict()) assert isinstance(round_tripped, PermissionRequestMemory) assert round_tripped == permission # PermissionPromptRequest likewise. - from copilot.generated.session_events import _load_PermissionPromptRequest + from copilot._generated.session_events import _load_PermissionPromptRequest round_tripped_prompt = _load_PermissionPromptRequest(prompt.to_dict()) assert isinstance(round_tripped_prompt, PermissionPromptRequestMemory) diff --git a/python/test_message_identity_generated.py b/python/test_message_identity_generated.py index 024223ac96..11a6a3ae19 100644 --- a/python/test_message_identity_generated.py +++ b/python/test_message_identity_generated.py @@ -1,5 +1,5 @@ -from copilot.generated.rpc import QueuePendingItems -from copilot.generated.session_events import UserMessageData +from copilot.rpc import QueuePendingItems +from copilot.session_events import UserMessageData def test_queue_pending_message_id_uses_camel_case_and_is_optional(): diff --git a/python/test_public_api.py b/python/test_public_api.py new file mode 100644 index 0000000000..ee63b7fdc8 --- /dev/null +++ b/python/test_public_api.py @@ -0,0 +1,47 @@ +"""Tests for the Python SDK's public module boundary. + +These guard the intent documented in ``copilot/_generated/__init__.py``: +the code-generated implementation package is private, and the documented +``copilot.rpc`` / ``copilot.session_events`` shims are the supported access +points. See https://github.com/github/copilot-sdk/issues/2048. +""" + +from importlib.util import find_spec + +from copilot import rpc, session_events + + +def test_generated_implementation_package_is_private(): + """The implementation package follows Python's private-name convention.""" + assert find_spec("copilot._generated") is not None + assert find_spec("copilot.generated") is None + + +def test_generated_types_remain_available_from_public_modules(): + """Renaming the implementation package preserves the documented exports.""" + assert "SessionUpdateOptionsParams" in rpc.__all__ + assert "AssistantMessageData" in session_events.__all__ + + +def test_public_rpc_surface_excludes_internal_types(): + """Types annotated ``visibility: "internal"`` must not leak through + ``copilot.rpc``, even when the internal type is a synthesized RPC + method params/result type rather than a named schema definition. + """ + for name in rpc.__all__: + assert not name.startswith("_"), f"{name} should not be exported publicly" + + # Regression coverage for a codegen bug where internal-marked method + # params/result types (e.g. the internal MCP config RPCs) were annotated + # "# Internal" in the generated source but still leaked into `__all__` + # because the export-list builder didn't check the internal-type set. + from copilot._generated import rpc as _generated_rpc + + assert not hasattr(rpc, "MCPConfigureGitHubRequest") + assert "MCPConfigureGitHubRequest" not in rpc.__all__ + assert hasattr(_generated_rpc, "_MCPConfigureGitHubRequest") + + +def test_public_session_events_surface_excludes_internal_types(): + for name in session_events.__all__: + assert not name.startswith("_"), f"{name} should not be exported publicly" diff --git a/python/test_tools.py b/python/test_tools.py index 031f68c053..c8f4ac05b3 100644 --- a/python/test_tools.py +++ b/python/test_tools.py @@ -6,7 +6,7 @@ from pydantic import BaseModel, ConfigDict, Field, field_validator from copilot import define_tool -from copilot.generated.rpc import ExternalToolTextResultForLlm +from copilot.rpc import ExternalToolTextResultForLlm from copilot.tools import ( ToolBinaryResult, ToolInvocation, diff --git a/scripts/codegen/python.ts b/scripts/codegen/python.ts index b3bfcf8bc9..ae8448fc58 100644 --- a/scripts/codegen/python.ts +++ b/scripts/codegen/python.ts @@ -2977,7 +2977,7 @@ async function generateSessionEvents(schemaPath?: string): Promise { code = renameInternalPythonSymbols(code, typeNames); code = appendPythonSessionEventsAllList(code, processed, typeNames); - const outPath = await writeGeneratedFile("python/copilot/generated/session_events.py", code); + const outPath = await writeGeneratedFile("python/copilot/_generated/session_events.py", code); console.log(` ✓ ${outPath}`); } @@ -3284,6 +3284,12 @@ async function generateRpc(schemaPath?: string, sessionEventsSchema?: JSONSchema annotatePythonTypes(deprecatedTypeNames, "# Deprecated: this type is part of a deprecated API and will be removed in a future version."); annotatePythonTypes(internalTypeNames, "# Internal: this type is an internal SDK API and is not part of the public surface."); + // Resolve internal type names to the class identifiers quicktype actually + // emits (e.g. schema definition `McpConfigureGitHubRequest` is emitted as + // `MCPConfigureGitHubRequest`), so the `__all__` curation below matches on + // the same identifiers that appear in the generated source. + const resolvedInternalTypeNames = new Set([...internalTypeNames].map(resolveType)); + const lines: string[] = []; lines.push(`""" AUTO-GENERATED FILE - DO NOT EDIT @@ -3405,21 +3411,13 @@ def _patch_model_capabilities(data: dict) -> dict: // Apply `_`-prefix to type names of internal RPC types so the leading-underscore // Python convention signals "internal, no stability guarantees" to consumers. - { - const internalDefs = new Set(); - for (const [name, def] of Object.entries(rpcDefinitions.definitions)) { - if (def && typeof def === "object" && (def as Record).visibility === "internal") { - internalDefs.add(name); - } - } - for (const [name, def] of Object.entries(rpcDefinitions.$defs)) { - if (def && typeof def === "object" && (def as Record).visibility === "internal") { - internalDefs.add(name); - } - } - if (internalDefs.size > 0) { - finalCode = renameInternalPythonSymbols(finalCode, internalDefs); - } + // Uses the same `resolvedInternalTypeNames` set as the `__all__` curation + // below (derived from `allDefinitions`, which — unlike the raw schema-level + // `rpcDefinitions` — also covers internal-marked synthesized method + // params/result types such as `MCPConfigureGitHubRequest`) so both the + // rename and export-list signals stay consistent for every internal type. + if (resolvedInternalTypeNames.size > 0) { + finalCode = renameInternalPythonSymbols(finalCode, resolvedInternalTypeNames); } // Annotate internal fields on otherwise-public RPC types with a `# Internal:` @@ -3441,15 +3439,15 @@ def _patch_model_capabilities(data: dict) -> dict: } } - finalCode = appendPythonRpcAllList(finalCode, rpcDefinitions); + finalCode = appendPythonRpcAllList(finalCode, rpcDefinitions, resolvedInternalTypeNames); - const outPath = await writeGeneratedFile("python/copilot/generated/rpc.py", finalCode); + const outPath = await writeGeneratedFile("python/copilot/_generated/rpc.py", finalCode); console.log(` ✓ ${outPath}`); } /** * Appends an `__all__` list to the generated session-events module so that - * the public ``copilot.session_events`` shim can ``from .generated.session_events + * the public ``copilot.session_events`` shim can ``from ._generated.session_events * import *`` without leaking helper functions (``from_str``, ``from_int``, …) * or TypeVars (``T``, ``EnumT``). Internal-marked types are omitted so they * remain hidden from the SDK's public surface even though their renamed @@ -3499,9 +3497,14 @@ function appendPythonSessionEventsAllList(code: string, _schema: JSONSchema7, in /** * Appends an `__all__` list to the generated RPC module so that the public - * ``copilot.rpc`` shim can ``from .generated.rpc import *`` without leaking + * ``copilot.rpc`` shim can ``from ._generated.rpc import *`` without leaking * helper functions (``from_str``, ``from_int``, …) or TypeVars - * (``T``, ``EnumT``). + * (``T``, ``EnumT``). Internal-marked types are omitted so they remain + * hidden from the SDK's public surface, mirroring the session-events + * curation below — even when a type wasn't itself renamed with a `_` + * prefix (e.g. a `visibility: "internal"` RPC method's synthesized + * params/result type, which is only known once method schemas are merged + * into the combined definition set, after the rename pass has already run). * * Shared types pulled in from session-events (via ``from .session_events * import …``) are intentionally excluded so each protocol type has a single @@ -3510,7 +3513,11 @@ function appendPythonSessionEventsAllList(code: string, _schema: JSONSchema7, in * types only in ``GitHub.Copilot`` and references them from * ``GitHub.Copilot.Rpc`` by fully-qualified name. */ -function appendPythonRpcAllList(code: string, _definitions: { definitions: Record; $defs: Record }): string { +function appendPythonRpcAllList( + code: string, + _definitions: { definitions: Record; $defs: Record }, + internalTypeNames: Set +): string { const exported = new Set(); const classPattern = /^class\s+([A-Za-z_]\w*)\b/gm; @@ -3518,6 +3525,7 @@ function appendPythonRpcAllList(code: string, _definitions: { definitions: Recor while ((m = classPattern.exec(code)) !== null) { const name = m[1]; if (name.startsWith("_")) continue; + if (internalTypeNames.has(name)) continue; exported.add(name); } @@ -3525,6 +3533,7 @@ function appendPythonRpcAllList(code: string, _definitions: { definitions: Recor while ((m = assignPattern.exec(code)) !== null) { const name = m[1]; if (name === "T" || name === "EnumT") continue; + if (internalTypeNames.has(name)) continue; exported.add(name); }