Files
wehub-resource-sync 09e9f3545f
Test / Code Quality (push) Has been cancelled
Test / Test (macos-latest, Python 3.10) (push) Has been cancelled
Test / Test (macos-latest, Python 3.11) (push) Has been cancelled
Test / Test (macos-latest, Python 3.12) (push) Has been cancelled
Test / Test (macos-latest, Python 3.13) (push) Has been cancelled
Test / Test (macos-latest, Python 3.14) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.10) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.11) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.12) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.13) (push) Has been cancelled
Test / Test (ubuntu-latest, Python 3.14) (push) Has been cancelled
Test / Test (windows-latest, Python 3.10) (push) Has been cancelled
Test / Test (windows-latest, Python 3.11) (push) Has been cancelled
Test / Test (windows-latest, Python 3.12) (push) Has been cancelled
Test / Test (windows-latest, Python 3.13) (push) Has been cancelled
Test / Test (windows-latest, Python 3.14) (push) Has been cancelled
CodeQL / Analyze (push) Has been cancelled
dependency-audit / pip-audit (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:30:13 +08:00

100 lines
3.2 KiB
Python

"""Type-only contracts shared across feature APIs.
This module defines the narrow structural Protocols feature APIs depend
on. Per ADR-0013, a Protocol lives here only when **shared by ≥2
features**; single-consumer capabilities stay local to their owning
feature module (e.g. ``AuthMetadata`` lives in ``_source/upload.py`` and
``OperationScopeProvider`` lives in ``_artifact/polling.py``, each with a
single consumer).
Contents:
* :class:`Kernel` — pure transport surface consumed by the upload
pipeline (and structurally satisfied by the concrete ``Kernel``).
* :class:`RpcCaller` (~17 consumers) and :class:`LoopGuard` (2
consumers) — the surviving shared capability Protocols that meet the
ADR-0013 ≥2-feature bar.
Feature APIs that need more than one capability take their direct
collaborators by keyword-only constructor argument (``ChatAPI`` in
``_chat/api.py``, ``ArtifactsAPI`` in ``_artifacts.py``, and
``SourceUploadPipeline`` in ``_source/upload.py``). The feature-local
composite Protocols ``ArtifactsRuntime`` and ``UploadRuntime`` (and
their corresponding adapter dataclasses) that previously bundled three
capability Protocols apiece were retired once it was clear they only
hid three stable collaborators with exactly one production satisfier.
The single-consumer ``AuthMetadata`` / ``OperationScopeProvider`` and
the unused ``AsyncWorkRuntime`` composite were inlined / deleted in
issue #1327 for the same reason — a Protocol with fewer than two
production consumers is indirection that no production code varies.
"""
from __future__ import annotations
from collections.abc import Mapping
from typing import Any, Protocol
import httpx
from ..rpc.types import RPCMethod
class Kernel(Protocol):
"""Pure transport surface owned by the concrete Kernel in PR 13.2."""
async def post(
self,
url: str,
headers: Mapping[str, str],
body: bytes,
*,
read_timeout: float | None = None,
max_response_bytes: int | None = None,
) -> httpx.Response: ...
@property
def cookies(self) -> httpx.Cookies: ...
async def aclose(self) -> None: ...
class RpcCaller(Protocol):
"""Narrow RPC dispatch surface consumed by pure-RPC feature APIs.
Mirrors the ``NotebookLMClient.rpc_call`` signature exactly so feature
retypes do not change call semantics. The transitional
``_is_retry`` parameter and the keyword-only
``disable_internal_retries`` / ``operation_variant`` parameters are
preserved as-is.
``NotebookLMClient`` and ``RpcExecutor`` structurally satisfy this
Protocol; features that only need to issue RPC calls depend on this
narrow surface so they are not coupled to
transport, loop affinity, or close-time-hook concerns.
"""
async def rpc_call(
self,
method: RPCMethod,
params: list[Any],
source_path: str = "/",
allow_null: bool = False,
_is_retry: bool = False,
*,
disable_internal_retries: bool = False,
operation_variant: str | None = None,
) -> Any: ...
class LoopGuard(Protocol):
"""Loop-affinity assertion surface for features that own async work."""
def assert_bound_loop(self) -> None: ...
__all__ = [
"Kernel",
"LoopGuard",
"RpcCaller",
]