Skip to main content
AI/MLCrestApps

crestapps-core-external-relays

Skill for building persistent bidirectional relay connections to external live-agent platforms in CrestApps.Core using IExternalChatRelay and the relay manager, event handler, and notification pipeline.

Stars
13
Source
CrestApps/CrestApps.AgentSkills
Updated
2026-05-29
Slug
CrestApps--CrestApps.AgentSkills--crestapps-core-external-relays
View on GitHubRaw SKILL.md

// install — copy + paste into any project

mkdir -p .claude/skills && curl -fsSL https://raw.githubusercontent.com/CrestApps/CrestApps.AgentSkills/HEAD/plugins/crestapps-core/skills/crestapps-core-external-relays/SKILL.md -o .claude/skills/crestapps-core-external-relays.md

Drops the SKILL.md into .claude/skills/crestapps-core-external-relays.md. Works with Claude Code, Cursor, and any agent that loads SKILL.md files from .claude/skills/.

CrestApps.Core External Chat Relays

Scope

IExternalChatRelay is the contract for a persistent, bidirectional connection to a live-agent or other external chat platform. An implementation supplies connection, prompt, signal, disconnect, and async-disposal behavior; the transport is application-defined.

IExternalChatRelayManager is the only relay implementation shipped by the current core package. ExternalChatRelayConnectionManager is registered as a singleton and tracks relay instances by session ID.

Connect and Close a Relay

Create the relay in the factory passed to the manager. The manager connects it, disposes a failed connection attempt, and disposes an extra instance if a concurrent caller won the same session ID.

var relay = await relayManager.GetOrCreateAsync(
    sessionId,
    new ExternalChatRelayContext
    {
        SessionId = sessionId,
        ChatType = ChatContextType.AIChatSession,
    },
    () => new MyExternalChatRelay(),
    cancellationToken);

await relay.SendPromptAsync(prompt, cancellationToken);
await relayManager.CloseAsync(sessionId, cancellationToken);

MyExternalChatRelay must implement IExternalChatRelay. The manager does not construct relays or choose a platform.

Event and Notification Integration

The current packages ship no default IExternalChatRelayEventHandler, IExternalChatRelayNotificationHandler, or IExternalChatRelayNotificationBuilder implementation. Consequently, registering a relay alone does not route incoming external events into chat messages or notifications.

An integration that needs event routing must implement and register its own event handler and notification handler. It can register keyed IExternalChatRelayNotificationBuilder services keyed by ExternalChatRelayEvent.EventType. ExternalChatRelayEventTypes supplies string constants for common event names, while integrations may use custom strings.

Keep platform credentials and reconnection policy inside the relay implementation. Call CloseAsync when the corresponding session ends so the manager disconnects and disposes the relay.

Related skills

  • Use crestapps-core-response-handlers for the IChatResponseHandler contract that a deferred relay-backed handler typically pairs with.
  • Use orchardcore-ai-response-handlers for the Orchard Core module wrapper that consumes this relay contract in chat sessions and chat interactions.