feat(connector): publish extraction seam contract

This commit is contained in:
rookiestar28
2026-04-24 00:38:19 +08:00
parent 62eea5fb35
commit a3df558797
12 changed files with 352 additions and 1 deletions
+25
View File
@@ -25,6 +25,9 @@ except ImportError: # pragma: no cover
if __package__ and "." in __package__:
from ..services.access_control import require_admin_token, resolve_token_info
from ..services.connector_extraction_contract import (
get_connector_extraction_contract,
)
from ..services.connector_installation_registry import (
get_connector_installation_registry,
)
@@ -33,6 +36,9 @@ if __package__ and "." in __package__:
else: # pragma: no cover
from services.access_control import require_admin_token # type: ignore
from services.access_control import resolve_token_info # type: ignore
from services.connector_extraction_contract import ( # type: ignore
get_connector_extraction_contract,
)
from services.connector_installation_registry import ( # type: ignore
get_connector_installation_registry,
)
@@ -241,3 +247,22 @@ async def connector_installation_audit_handler(request):
{"ok": False, "error": exc.code, "message": str(exc)},
status=403,
)
@endpoint_metadata(
auth=AuthTier.ADMIN,
risk=RiskTier.LOW,
summary="Connector extraction contract",
description="Returns the machine-readable connector extraction feasibility contract.",
audit="connector.extraction_contract.get",
plane=RoutePlane.ADMIN,
)
async def connector_extraction_contract_handler(request):
if (guard := _require_admin(request)) is not None:
return guard
return web.json_response(
{
"ok": True,
"contract": get_connector_extraction_contract(),
}
)
+5
View File
@@ -226,6 +226,11 @@ def build_connector_installation_route_specs(
f"{prefix}/connector/installations",
handlers["connector_installations_list_handler"],
),
RouteSpec(
"GET",
f"{prefix}/connector/extraction-contract",
handlers["connector_extraction_contract_handler"],
),
RouteSpec(
"GET",
f"{prefix}/connector/installations/resolve",
+4
View File
@@ -67,6 +67,7 @@ remote_admin_page_handler = None # type: ignore # F61
security_doctor_handler = None # type: ignore # S30
connector_installations_list_handler = connector_installation_get_handler = None # type: ignore
connector_installation_resolve_handler = connector_installation_audit_handler = None # type: ignore
connector_extraction_contract_handler = None # type: ignore
templates_list_handler = None # type: ignore
rewrite_recipes_list_handler = rewrite_recipe_get_handler = None # type: ignore
rewrite_recipe_create_handler = rewrite_recipe_update_handler = None # type: ignore
@@ -96,6 +97,7 @@ if web is not None:
connector_installation_get_handler,
connector_installation_resolve_handler,
connector_installation_audit_handler,
connector_extraction_contract_handler,
) = import_attrs_dual(
__package__,
"..api.connector_contracts",
@@ -105,6 +107,7 @@ if web is not None:
"connector_installation_get_handler",
"connector_installation_resolve_handler",
"connector_installation_audit_handler",
"connector_extraction_contract_handler",
),
)
(
@@ -919,6 +922,7 @@ def register_routes(server) -> None:
if connector_installations_list_handler:
connector_installation_handlers = {
"connector_installations_list_handler": connector_installations_list_handler,
"connector_extraction_contract_handler": connector_extraction_contract_handler,
"connector_installation_resolve_handler": connector_installation_resolve_handler,
"connector_installation_audit_handler": connector_installation_audit_handler,
"connector_installation_get_handler": connector_installation_get_handler,