Files
kamidso-back/kamidso/native_connectors/resolve.py
T
javadandCursor edbaa2acec Add native Didar connectors so chats can query CRM data reliably.
Connector calls, semantic rules, and DuckDB memory keep long runs stable, and stream retry stops chats from stalling.

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-10-12 19:26:47 +03:30

72 lines
2.3 KiB
Python

"""Resolve attached connector ids into MCP ids and public native instances."""
from __future__ import annotations
import logging
from typing import Any, Dict, List, Optional, Tuple
from kamidso.native_connectors.executor import default_row_loader
from kamidso.native_connectors.flags import native_connectors_v1_enabled
from kamidso.native_connectors.registry import get_registry
logger = logging.getLogger(__name__)
def load_public_instance(connector_id: str) -> Optional[Dict[str, Any]]:
row = default_row_loader(connector_id)
if row is None:
return None
return {
"connector_id": row.get("connector_id"),
"connector_type": row.get("connector_type"),
"display_name": row.get("display_name") or "",
"status": row.get("status") or "",
"user_name": row.get("user_name"),
"sys_code": row.get("sys_code"),
}
def partition_connector_ids(
connector_ids: List[str],
) -> Tuple[List[str], List[Dict[str, Any]]]:
"""Split selected ids. Native ids never go to the MCP tool selector."""
if not connector_ids:
return [], []
if not native_connectors_v1_enabled():
return list(connector_ids), []
registry = get_registry()
mcp_ids: List[str] = []
native: List[Dict[str, Any]] = []
for connector_id in connector_ids:
row = load_public_instance(connector_id)
if row is None or not registry.contains(str(row.get("connector_type") or "")):
mcp_ids.append(connector_id)
continue
if str(row.get("status") or "") != "active":
logger.warning(
"Skipping inactive native connector '%s'", connector_id
)
continue
native.append(
{
"connector_id": row["connector_id"],
"connector_type": row["connector_type"],
"display_name": row["display_name"],
}
)
return mcp_ids, native
def install_native_connectors(
react_state: Dict[str, Any],
instances: List[Dict[str, Any]],
) -> None:
react_state["native_connectors"] = {
str(item["connector_id"]): {
"connector_id": item["connector_id"],
"connector_type": item["connector_type"],
"display_name": item.get("display_name") or item["connector_id"],
}
for item in instances
}