# SPDX-License-Identifier: Apache-2.0 # © 2026 Lutar, Stephen P. — SZL Holdings · ORCID 0009-0001-0110-4173 · Doctrine v11 # Authored by SZL Enterprise-Integration Team. Co-Authored-By: Perplexity Computer Agent. """szl_connectors.registry — the connector registry + the honest manifest. Adding a connector = one subclass file + one `@register` decorator. The UI, the MCP layer, and the governance layer all read the registry uniformly. The manifest reports every connector's HONEST state right now (cheap path: keyless → CONNECTED label verified on read; credentialed → READY/CONNECTED by env presence; no-free-tier → SAMPLE). NEVER fabricates a record. """ from __future__ import annotations from typing import Any from .base import Connector, State, _now REGISTRY: dict[str, type[Connector]] = {} # id -> class def register(cls: type[Connector]) -> type[Connector]: """@register decorator — one line per connector module.""" if not getattr(cls, "id", None) or cls.id == "base": raise ValueError("connector must define a unique non-base `id`") REGISTRY[cls.id] = cls return cls def get(cid: str) -> Connector | None: cls = REGISTRY.get(cid) return cls() if cls else None def all_ids() -> list[str]: return sorted(REGISTRY.keys()) def _entry(cid: str, cls: type[Connector], *, probe: bool = False) -> dict[str, Any]: c = cls() h = c.health(probe=probe) return { "id": cid, "label": c.label or cid, "category": c.category, "auth_kind": c.auth_kind, "state": h.state.value if isinstance(h.state, State) else h.state, "env_vars": list(c.env_vars), "missing_env": h.missing_env, "free_tier": c.free_tier, "writable": c.writable, "provider_base": c.provider_base, "mcp_tool": c.mcp_tool, "detail": h.detail, "sample_reason": h.sample_reason, "schema_preview": list(c.schema_preview), "docs_url": c.docs_url, "latency_ms": h.latency_ms, } def manifest(*, probe: bool = False, category: str | None = None) -> dict[str, Any]: """Every connector + its honest state, for the catalog UI + /healthz.""" items = [] for cid in sorted(REGISTRY): cls = REGISTRY[cid] try: e = _entry(cid, cls, probe=probe) except Exception as ex: # honest error, never crash the manifest e = {"id": cid, "category": getattr(cls, "category", "?"), "state": "error", "detail": f"manifest probe failed: {type(ex).__name__}"} if category and e.get("category") != category: continue items.append(e) # honest scoreboard counts = {"connected": 0, "ready": 0, "sample": 0, "error": 0} cats: dict[str, int] = {} for e in items: counts[e.get("state", "error")] = counts.get(e.get("state", "error"), 0) + 1 cats[e.get("category", "?")] = cats.get(e.get("category", "?"), 0) + 1 return { "doctrine": "v11 — honest CONNECTED/READY/SAMPLE only; no fabricated records; " "no committed keys; Λ-gate+DSSE on writes; trust never 100%", "fetched_at": _now(), "count": len(items), "scoreboard": counts, "categories": cats, "connectors": items, } def health(cid: str) -> dict[str, Any]: c = get(cid) if not c: return {"error": f"unknown connector '{cid}'", "known": all_ids()} return c.health(probe=True).to_dict() __all__ = ["REGISTRY", "register", "get", "all_ids", "manifest", "health"]