Connector System (services/connectors/)
Pluggable abstraction for agent communication protocols.
Key Files
types.ts: AgentConnector, ConnectorRequest, ConnectorResponse interfaces
registry.ts: Singleton connectorRegistry — get(), getForAgent()
base/BaseConnector.ts: Abstract base with auth header building
index.ts: Browser-safe exports (no Node.js deps)
server.ts: All connectors including Node.js-only (subprocess, claude-code)
Built-in Connectors
| Connector |
Protocol |
Use Case |
agui-streaming |
AG-UI SSE |
ML-Commons agents (default) |
rest |
HTTP POST |
Non-streaming REST APIs |
openai-compatible |
OpenAI Chat Completions |
LiteLLM, Ollama, vLLM |
langgraph |
LangGraph REST /invoke |
Non-AG-UI LangGraph instances |
strands |
Bedrock Agent Runtime |
Amazon Strands agents (server-only) |
subprocess |
CLI stdin/stdout |
Generic command-line tools |
claude-code |
Claude CLI |
Claude Code agent (extends subprocess) |
kiro |
Kiro CLI |
Kiro coding agent (extends subprocess; parses [tool] stderr markers) |
pi |
Pi CLI |
Pi coding agent (extends subprocess) |
mock |
In-memory |
Demo and testing |
Usage
import { connectorRegistry } from '@/services/connectors';
const connector = connectorRegistry.getForAgent(agentConfig);
const response = await connector.execute(endpoint, request, auth, onProgress);
Creating a Custom Connector
import { BaseConnector } from '@/services/connectors';
class CustomConnector extends BaseConnector {
readonly type = 'custom' as const;
readonly name = 'My Custom Agent';
readonly supportsStreaming = true;
async execute(endpoint, request, auth, onProgress) {
// Your protocol implementation
}
}
connectorRegistry.register(new CustomConnector());
Trace correlation & subprocess hooks
- Trace context propagation is handled by
BaseConnector — set
connectorConfig.traceContext so the agent's spans join the eval test_case
trace tree:
propagateEnv: true → inject TRACEPARENT env into subprocess agents (buildTraceparentEnv()).
propagateHeader: true → inject a traceparent HTTP header into HTTP/SSE agents (injectTraceparentHeaders()).
serviceName: '<otel-service-name>' → service-name + time-window fallback. Defaults: claude-code-agent, kiro-agent, pi-agent, observio-sample-agent. See the "Trace correlation conventions" section in AGENTS.md.
- Subprocess connectors (
SubprocessConnector subclasses) can override
parseStderrChunk(chunk, trajectory, onProgress, state) to turn stderr markers into trajectory steps (how
kiro surfaces [tool] Running: / [tool] status: as action +
tool_result steps). The base class persists stderr to rawOutput and
honors per-request connectorConfig overrides (args / inputMode / timeout).
Keep ALL streaming state (partial-line buffers, pending tool names, captured
ids) on the per-invocation state object (extend SubprocessExecutionState
via createExecutionState()), never on this — the registry shares one
connector instance across concurrent runs.
1---2name: add-connector3description: Use when adding, modifying, or debugging agent connectors. Provides connector architecture, built-in types, and custom connector template.4---56## Connector System (`services/connectors/`)78Pluggable abstraction for agent communication protocols.910### Key Files11- `types.ts`: `AgentConnector`, `ConnectorRequest`, `ConnectorResponse` interfaces12- `registry.ts`: Singleton `connectorRegistry` — `get()`, `getForAgent()`13- `base/BaseConnector.ts`: Abstract base with auth header building14- `index.ts`: Browser-safe exports (no Node.js deps)15- `server.ts`: All connectors including Node.js-only (subprocess, claude-code)1617### Built-in Connectors1819| Connector | Protocol | Use Case |20|-----------|----------|----------|21| `agui-streaming` | AG-UI SSE | ML-Commons agents (default) |22| `rest` | HTTP POST | Non-streaming REST APIs |23| `openai-compatible` | OpenAI Chat Completions | LiteLLM, Ollama, vLLM |24| `langgraph` | LangGraph REST `/invoke` | Non-AG-UI LangGraph instances |25| `strands` | Bedrock Agent Runtime | Amazon Strands agents (server-only) |26| `subprocess` | CLI stdin/stdout | Generic command-line tools |27| `claude-code` | Claude CLI | Claude Code agent (extends `subprocess`) |28| `kiro` | Kiro CLI | Kiro coding agent (extends `subprocess`; parses `[tool]` stderr markers) |29| `pi` | Pi CLI | Pi coding agent (extends `subprocess`) |30| `mock` | In-memory | Demo and testing |3132### Usage33```typescript34import { connectorRegistry } from '@/services/connectors';35const connector = connectorRegistry.getForAgent(agentConfig);36const response = await connector.execute(endpoint, request, auth, onProgress);37```3839### Creating a Custom Connector40```typescript41import { BaseConnector } from '@/services/connectors';4243class CustomConnector extends BaseConnector {44 readonly type = 'custom' as const;45 readonly name = 'My Custom Agent';46 readonly supportsStreaming = true;4748 async execute(endpoint, request, auth, onProgress) {49 // Your protocol implementation50 }51}5253connectorRegistry.register(new CustomConnector());54```5556### Trace correlation & subprocess hooks5758- **Trace context propagation** is handled by `BaseConnector` — set59 `connectorConfig.traceContext` so the agent's spans join the eval `test_case`60 trace tree:61 - `propagateEnv: true` → inject `TRACEPARENT` env into subprocess agents (`buildTraceparentEnv()`).62 - `propagateHeader: true` → inject a `traceparent` HTTP header into HTTP/SSE agents (`injectTraceparentHeaders()`).63 - `serviceName: '<otel-service-name>'` → service-name + time-window fallback. Defaults: `claude-code-agent`, `kiro-agent`, `pi-agent`, `observio-sample-agent`. See the "Trace correlation conventions" section in `AGENTS.md`.64- **Subprocess connectors** (`SubprocessConnector` subclasses) can override65 `parseStderrChunk(chunk, trajectory, onProgress, state)` to turn stderr markers into trajectory steps (how66 `kiro` surfaces `[tool] Running:` / `[tool] status:` as `action` +67 `tool_result` steps). The base class persists `stderr` to `rawOutput` and68 honors per-request `connectorConfig` overrides (`args` / `inputMode` / `timeout`).69 Keep ALL streaming state (partial-line buffers, pending tool names, captured70 ids) on the per-invocation `state` object (extend `SubprocessExecutionState`71 via `createExecutionState()`), never on `this` — the registry shares one72 connector instance across concurrent runs.