Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .gitattributes
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/codegen-check.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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/**'
Expand Down
26 changes: 13 additions & 13 deletions python/copilot/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,19 @@

# Register the public ``copilot.session_events`` namespace.
from . import session_events as session_events # noqa: F401
from ._generated.rpc import (
CurrentToolMetadata,
GitHubTelemetryClientInfo,
GitHubTelemetryEvent,
GitHubTelemetryNotification,
ModelBillingTokenPrices,
ModelBillingTokenPricesLongContext,
)
from ._generated.session_events import (
PermissionRequest,
SessionEvent,
SessionEventType,
)
from ._mode import (
BUILTIN_TOOLS_ISOLATED,
CopilotClientMode,
Expand Down Expand Up @@ -78,19 +91,6 @@
CopilotWebSocketHandler,
LlmInferenceHeaders,
)
from .generated.rpc import (
CurrentToolMetadata,
GitHubTelemetryClientInfo,
GitHubTelemetryEvent,
GitHubTelemetryNotification,
ModelBillingTokenPrices,
ModelBillingTokenPricesLongContext,
)
from .generated.session_events import (
PermissionRequest,
SessionEvent,
SessionEventType,
)
from .session import (
AgentStopHandler,
AgentStopHookInput,
Expand Down
File renamed without changes.
2 changes: 1 addition & 1 deletion python/copilot/canvas.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@
from dataclasses import dataclass
from typing import Any

from .generated.rpc import (
from ._generated.rpc import (
CanvasAction,
CanvasHostContext,
CanvasHostContextCapabilities,
Expand Down
42 changes: 21 additions & 21 deletions python/copilot/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,26 @@

from ._diagnostics import log_timing
from ._ffi_runtime_host import FfiRuntimeHost
from ._generated.rpc import (
ClientGlobalApiHandlers,
ClientSessionApiHandlers,
GitHubTelemetryNotification,
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,
Expand Down Expand Up @@ -64,26 +84,6 @@
ExtensionInfo,
)
from .copilot_request_handler import CopilotRequestHandler, create_copilot_request_adapter
from .generated.rpc import (
ClientGlobalApiHandlers,
ClientSessionApiHandlers,
GitHubTelemetryNotification,
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,
Expand Down Expand Up @@ -4356,7 +4356,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,
Expand Down
4 changes: 2 additions & 2 deletions python/copilot/copilot_request_handler.py
Original file line number Diff line number Diff line change
Expand Up @@ -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.rpc.LlmInferenceHandler` shape so the RPC dispatcher
can route inbound ``httpRequestStart`` / ``httpRequestChunk`` frames through it.
"""

Expand All @@ -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,
Expand Down
8 changes: 4 additions & 4 deletions python/copilot/rpc.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,11 @@
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 (
SessionFsReaddirWithTypesEntryType as SessionFSReaddirWithTypesEntryType, # noqa: F401
)
from .generated.rpc import __all__ # noqa: F401
from ._generated.rpc import __all__ # noqa: F401
18 changes: 9 additions & 9 deletions python/copilot/session.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,13 +23,10 @@
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 (
CanvasHandler as RpcCanvasHandler,
)
from .generated.rpc import (
from ._generated.rpc import (
CanvasProviderCloseRequest,
CanvasProviderInvokeActionRequest,
CanvasProviderOpenRequest,
Expand Down Expand Up @@ -59,11 +56,11 @@
UIElicitationSchemaType,
UIHandlePendingElicitationRequest,
)
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,
Expand All @@ -79,9 +76,12 @@
SessionIdleData,
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,
Expand Down
6 changes: 3 additions & 3 deletions python/copilot/session_events.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
8 changes: 4 additions & 4 deletions python/copilot/session_fs_provider.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,7 +23,7 @@
from datetime import UTC, datetime
from typing import Any

from .generated.rpc import (
from ._generated.rpc import (
SessionFSError,
SessionFSErrorCode,
SessionFSExistsResult,
Expand All @@ -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,
)

Expand Down
4 changes: 2 additions & 2 deletions python/copilot/tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,9 +16,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,
Expand Down
2 changes: 1 addition & 1 deletion python/e2e/_copilot_request_helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
2 changes: 1 addition & 1 deletion python/e2e/test_mcp_oauth_e2e.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@
import httpx
import pytest

from copilot.generated.rpc import (
from copilot.rpc import (
MCPAppsCallToolRequest,
MCPListToolsRequest,
MCPOauthHandlePendingRequest,
Expand Down
2 changes: 1 addition & 1 deletion python/e2e/test_provider_endpoint_e2e.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
4 changes: 2 additions & 2 deletions python/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ line-length = 100
target-version = "py311"
exclude = [
"generated",
"copilot/generated",
"copilot/_generated",
]

[tool.ruff.lint]
Expand All @@ -82,7 +82,7 @@ invalid-argument-type = "warn"
[tool.ty.src]
exclude = [
"generated",
"copilot/generated",
"copilot/_generated",
"copilot/test_*.py",
]

Expand Down
4 changes: 2 additions & 2 deletions python/test_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -2630,7 +2630,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 = []

Expand Down Expand Up @@ -2689,7 +2689,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()
Expand Down
2 changes: 1 addition & 1 deletion python/test_codegen_type_names.py
Original file line number Diff line number Diff line change
@@ -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():
Expand Down
6 changes: 3 additions & 3 deletions python/test_event_forward_compatibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,7 +177,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,
)
Expand Down Expand Up @@ -224,13 +224,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)
Expand Down
17 changes: 17 additions & 0 deletions python/test_public_api.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
"""Tests for the Python SDK's public module boundary."""

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__
2 changes: 1 addition & 1 deletion python/test_tools.py
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
Loading